store-scope-phase-two-2026-10-15.md 5.5 KB

门店独立登录与数据隔离:第二阶段验收

已实现的范围

  • 现有有效门店账号可使用管理后台登录,服务端返回独立 store-admin 身份,进入「本店工作台/本店学生/本店排课/修改密码」。总部权限保持原有行为。
  • 门店可以管理本店学生资料、创建学生、开通课程、从本店额度向学生划拨或按原单退回额度,以及创建、修改、取消、恢复本店预约。新增学生的归属由服务端绑定,不能指定其他门店。
  • 门店只能选择本店有效老师;历史预约仍按学生当前归属查看。跨店共享老师授权不包含在本阶段。
  • 门店不能充值自身额度、授权运营人员、修改学生所属门店、操作其他门店、访问总部工资、技术通用数据、同步和批量导入接口。门店不能代替老师结课。
  • 总部仍可管理所有门店,门店额度由第一阶段的总部授权流程入账。

服务端约束

门店编号和帐套来自服务端会话用户,并重新读取停用、删除及首次改密状态,不信任浏览器角色、筛选条件、门店编号或帐套参数。操作名单默认拒绝新接口。学生对象 ID、学生业务编号、原预约、课程绑定以及老师均独立核对归属;原对象检查早于幂等重放。列表在分页前限制所属门店。

xs_store_scope_guard 在开课、额度划拨及排课写入的同一事务内再次检查门店、学生、老师和原对象;学生记录加锁,避免并发转店时使用旧归属写入。保持现有额度预览、课时预留、冲突检查和幂等凭据。

原有 Parse REST 类权限允许绕过网关访问账号与教学数据。本次关闭现有 30 个账号、教学、流水和工资相关类的直接查询、写入与加字段权限,保留原字段保护配置。云函数通过受保护服务器权限执行;/users/me 会话验证保持可用。门店旧移动端业务入口拒绝访问,只保留会话校验、改密、退出,防止旧代理上下级查询扩大门店范围。

本地验证

  • 门店权限、运营账号、开课排课、门店额度和学生流水回归:65 项通过,含真实 PGlite SQL 归属检查与事务失败阻断。
  • 管理端路由、菜单、登录、会话、学生、排课、额度组件:65 项通过。
  • 账号安全与移动教学回归:6 项通过。
  • 管理端生产构建成功;云函数 11 个定义语法校验通过。现有样式预算和 CommonJS 警告不影响构建。
  • Chrome 独立本地测试源使用门店短期会话连接线上后端:本店工作台、四项余额、学生列表、新增学生仅本店归属、课表和新增排课表单可用。代理主动拒绝业务写入,不创建真实学生、课程、预约或充值记录。

线上验证

使用两个现有门店的短期会话进行 35 项检查,结束后撤销测试会话;未重设任何真实密码:

  • 门店 287 返回 11 条本店学生,门店 100 共 243 条,查询第一页 100 条;不同门店结果无交叉,伪造门店筛选不生效。
  • 门店 100 的 2026 年 10 月课表返回 164 条本店预约、35 位本店有效老师;课程绑定也只关联本店学生。
  • 本店资料、开课选项、额度及流水读取成功。门店自身充值权限为 false。
  • 外店学生资料、额度、开课、创建预约,以及外店原预约的编辑、取消、恢复全部拒绝。非法写入请求不携带有效业务提交数据,不产生真实变更。
  • 工资、总部充值、授权、转店、身份修改、同步、未知接口及旧移动端越权路径全部拒绝。
  • 直接 REST 查询账号、会话、预约、课程、学习记录等返回 Parse 权限错误 119;自身用户空更新也被拒绝。正常 /users/me 验证成功。
  • 总部仍返回 628 条会员;老师和学生会话仍有效。另行回读双方首页/账户相关接口,不以构建代替实际请求。
  • 两个有效门店账号原本要求首次改密:57、73。该要求继续生效;287、100 不要求首次改密。未解除或代替用户修改密码。
  • 发现部分历史停用账号的 identityType 与旧用户组不一致;保留既有写入保护,不在本轮修改其身份或归属。

发布、边界与回滚

数据库新增守卫函数,以及两个运营网关、管理网关、移动网关已发布并回读校验。发布基于真实线上代码做局部替换,保留线上已有 SQL 类型兼容等修复,未覆盖整个服务。权限变更前保存类权限基线;账户业务数据摘要在发布前后相同。

真实基线、哈希和验证结果保存在本机受保护目录:/Users/mac/.local/state/xiaoshu/cloud-releases/2026-10-15-store-scope/。不将凭据、完整线上用户数据或私有函数快照提交到 Git。

正式前端已于 2026-10-15 发布到 https://admin.xiaoshu.pro/,前端提交为 817b561a537fab1b0411f0581aa61200bef125a6,发布编号 817b561a537f-20261015T124317689Z。后续发布及隔离测试结果见 正式前端发布验收。手机及微信 WebView 尚未验收。

回滚时先暂停门店业务访问,再基于实际发布基线恢复本次函数段,核对线上哈希以免覆盖后续发布。保留原有余额、凭据、审计和防重约束。直接 REST 权限保持关闭,不为兼容旧页面恢复公共写入。新增数据库守卫函数可保留;需要删除时先确认没有在线调用方。不得通过删交易或重写余额回滚。