10 KiB
Web 版上线前验收清单
更新时间:2026-07-01
这份清单用于先上线 H5 Web 题库。Taro 仍然是前端工程,后端以 Supabase Auth/JWT、PostgreSQL/RLS、apps/api、worker 为主。前端视觉和交互可以参考 F:\project\参考\旧题库小程序前端文件 和旧 Web 版,但不能继承旧 PocketBase 直连、旧鉴权或旧字段模型。
前端接入原则
- H5 登录态优先使用 Supabase Auth access token。
- 复杂业务统一调用
apps/api,不要让页面直接写 Supabase 表。 runtime-config.json只能放portal、apiBaseUrl、supabaseUrl、supabasePublishableKey、tenantCode。- 前端禁止出现 service role key、secret key、数据库连接串、OSS/COS 密钥、支付私钥、短信密钥。
- 页面层禁止手写
x-user-id、Authorization、x-tenant-id,统一使用apps/taro/src/services/api.ts。 - 私有图片、PDF、视频只消费后端短签名和
content_assets权限结果,不能拼对象存储 URL。 - 学生头像只做男女预设,不做上传、裁剪或第三方头像同步。
- 排行榜默认不请求、不展示;只有租户购买/开启活动且完成专项压测后再接独立页面。
- H5 构建目录必须包含
index.html、js/、css/,并且每个上线目录根部必须由部署方放置对应runtime-config.json。
学生端验收旅程
用普通学生账号在 H5 走一遍:
- 进入域名后能解析租户品牌、主题、公开配置。
- 登录后
GET /api/profile/me返回当前用户,不能靠页面传 userId。 - 查看题库入口、地区、分类树、合集和练习蓝图。
- 开通或确认 SVIP 权益后创建顺序/随机/模考 session。
- 拉取 session detail,刷新页面后仍能按后端 session 续练。
- 提交答案、交卷、查看报告、逐题复盘。
- 收藏题目,在个人中心或复习页进入收藏练习。
- 产生错题后查看错题本、复习计划和错题复习 session。
- 背单词:今日计划、单元学习、收藏练习、发音、进度上报。
- 知识手册:章节、搜索、公式/图片/RichContent 安全渲染。
- 分数线:地区、院校、专业、年份和动态字段筛选。
- 资料下载:预览/下载前必须看到短签名、水印 traceId 或权限提示。
- 视频解析:未授权提示、授权后短签名播放、水印上下文、次数扣减。
- 订单:套餐、优惠券、下单、支付参数、订单详情、状态轮询、售后入口。
- 个人中心:权益、学习统计、勋章、积分任务、兑换、站内通知。
自动烟测命令:
npm run smoke:launch-persona
该命令会写入少量测试练习和收藏记录,生产只在灰度/演练租户执行。
租户后台验收旅程
用租户管理员账号在 H5 走一遍:
- 工作台模块按权限显示,学生账号访问后台必须 403。
- 数据看板能按 7/30/90 天、地区读取收益、注册、学习、内容、活跃、反馈、激活码。
- 学生运营:列表、状态、批量导入、分班、备注、跟进任务、督导规则、CRM 推送。
- 题库内容:入口、分类、题目集合、蓝图、题目/单词/手册/分数线/视频导入预览、异步 job、复检。
- 营销中心:激活码、优惠券规则、核销报表、积分任务、兑换、勋章、用户通知。
- CRM/分佣:CRM 配置、队列、失败池、日志脱敏、重试/忽略、结算、凭证复核、销售转化报表。
- 财务运营:退款、官方账单下载任务、对账异常、差错工单、人工调整凭证。
- 设置:品牌、主题模板/草稿/发布、域名、支付账户、登录 provider、角色模板、成员绑定。
- 跨租户访问必须拒绝,字段权限如手机号脱敏要按角色生效。
平台后台验收旅程
用平台管理员账号在 H5 走一遍:
- 工作台、租户列表、租户详情、状态变更、账务资料维护。
- SaaS 套餐、订阅、订阅账单候选、批量开票、收款、逾期催缴。
- 用量记录、用量超额候选、超额账单生成。
- 公共题库授权、租户可见范围、采纳/同步/冲突运营摘要。
- 平台员工、权限点、禁用/恢复、受限员工越权拒绝。
- 审计日志、CSV/JSON 导出、审计告警、外部通知渠道。
- 学生或租户管理员访问平台后台必须 403。
安全与配置门禁
上线前至少执行:
npm run test:readiness
npm run test:rls
npm run audit:runtime
npm run security:repo
npm run check:api
npm run check:worker
npm run check:taro
npm run readiness:production
npm run readiness:production:db
npm run smoke:taro:h5
npm run smoke:taro:h5:interaction
node scripts/taro-h5-release-guardrails-test.js --require-dist
npm run smoke:launch-persona -- --write docs/refactor/launch-artifacts/launch-persona-smoke.json --write-md docs/refactor/launch-artifacts/launch-persona-smoke.md
smoke:launch-persona 是真实 API 角色旅程烟测,必须进入生产上线证据;正式证据必须使用 LAUNCH_SMOKE_AUTH_MODE=app_session,通过 Bearer tk_ session 验证身份,不使用旧 x-user-id 或平台本地 key。普通学生要能在 SVIP 权益下创建练习、答题、收藏题目、进入收藏复习和错题复习入口;租户管理员要能读取看板/主题/学生/销售转化并拒绝学生或跨租户访问;平台管理员要能读取租户/套餐/审计入口并拒绝学生访问平台后台。生产证据命令必须带 --write docs/refactor/launch-artifacts/launch-persona-smoke.json,确保 production-launch-evidence.json 引用的 artifact 是稳定路径,不是只存在带时间戳的本地报告。
smoke:taro:h5 会启动临时静态服务器和 mock API,验证三套 H5 的 index.html、JS/CSS 资源、history fallback、公开 runtime config 和 /api/tenant/resolve 契约。smoke:taro:h5:interaction 会在真实 Chrome/Edge 中点击学生、租户后台、平台后台关键路径,覆盖静态烟测发现不了的 JS 运行时、直接 history 路由刷新和 Taro 点击事件问题;当前脚本覆盖 32 项检查,包括学生首页、题库、答题、收藏、错题/收藏复习、背单词、知识手册、资料短签名和水印、视频播放授权、分数线、AI 择校、消息中心、会员收银台下单/支付参数/订单状态,租户后台内容导入、公共题库采纳/同步/冲突处理、学生运营、营销/CRM/分佣、主题/角色/成员写操作,以及平台后台租户、账务、公共题库授权和员工写操作。taro-h5-release-guardrails-test 会扫描源码、三套 H5 产物和 runtime-config 边界,防止旧 PocketBase、x-user-id、x-platform-admin-key、数据库连接串和服务端密钥形态进入前端发布目录。若刚构建完但未放入真实 runtime-config.json,脚本允许 warning;正式部署目录必须补齐。
写入生产上线证据时,三套正式发布目录必须先放入真实公开 runtime-config.json,再运行严格模式:
npm --silent run smoke:taro:h5 -- --json > docs/refactor/launch-artifacts/taro-h5-static-smoke.json
npm --silent run smoke:taro:h5:interaction -- --json > docs/refactor/launch-artifacts/taro-h5-interaction-smoke.json
node scripts/taro-h5-release-guardrails-test.js --require-dist --require-runtime-config --json > docs/refactor/launch-artifacts/taro-h5-release-guardrails.json
npm run smoke:launch-persona -- --write docs/refactor/launch-artifacts/launch-persona-smoke.json --write-md docs/refactor/launch-artifacts/launch-persona-smoke.md > docs/refactor/launch-artifacts/launch-persona-smoke.log
PNVS 短信登录上线前要用真实手机号跑一次远程 smoke。脚本不会读取或输出密钥;它只调用公网 API,发送验证码后在终端输入收到的短信验证码,再确认 /api/auth/me 可用:
SMS_SMOKE_API_BASE_URL=https://api.tjszsb.com \
SMS_SMOKE_TENANT_ID=00000000-0000-0000-0000-000000000001 \
SMS_SMOKE_PHONE=13800138000 \
SMS_SMOKE_ORIGIN=https://admin.tjszsb.com \
npm run smoke:sms-login:remote
security:repo 是仓库自带的静态安全扫描,会拦截密钥形态、前端旧鉴权头、真实 runtime-config 和生产证据误入 Git。它不能替代真实 @codex-security;如插件在当前 Codex 环境暴露扫描工具,再补插件扫描结果。若工具不可用,不能把该项标记为已完成,只能在上线证据里标记为待补。
readiness:production 和 readiness:production:db 是生产阻断门禁:会拒绝 mock/未知短信 provider、弱密钥、CORS=*、旧身份头、local_dev 存储、非 HTTPS 对象存储公开 URL、阿里云 OSS 内网直签、未接外部资源扫描、localhost webhook,以及租户短信/OAuth/支付公开配置缺字段、OAuth redirectUri/支付 notifyUrl 非 HTTPS、公开配置混入密钥、active provider 缺私密 tenant_secrets 等问题。
生产 API 推荐:
ALLOW_LEGACY_AUTH_HEADERS=false
ALLOW_PLATFORM_ADMIN_KEY=false
CORS_ORIGIN=https://student.example.com,https://tenant-admin.example.com,https://platform-admin.example.com
AUTH_SMS_PROVIDER=aliyun-pnvs、aliyun 或 tencent
生产 worker 推荐:
WORKER_ASSET_SECURITY_SCANNER=metadata_rules,http
WORKER_ASSET_SECURITY_SCAN_FAIL_OPEN=false
STORAGE_DEFAULT_PROVIDER=aliyun_oss 或 tencent_cos 或 supabase_storage
STORAGE_REQUIRE_TENANT_PREFIX=true
ALIYUN_OSS_INTERNAL=false
性能与数据库
本地真实迁移库已能跑题库读写压测,但正式容量必须在目标 4 核 16G 云服务器复测。
推荐顺序:
npm run perf:postgres:evidence采集默认 PostgreSQL 参数。- 按
docs/refactor/postgresql-4c16g-tuning.md应用 shared-host 起步值。 - 重启 PostgreSQL 后执行
PG_TUNING_PROFILE=shared-host npm run perf:postgres:evidence -- --strict --json,确认 profile 达标、pending_restart=0、pg_stat_statements可用。 - 跑
npm run perf:api:local的 6/30/50/100 阶梯,只读和少量写入各一组。 - 把
postgres.tuning-evidence和 API 压测摘要写入本地production-launch-evidence.json,执行npm run launch:gate。
容量折算不要直接把压测 worker 当在线人数。真实学生有读题和思考时间,应结合 H5 埋点估算单人平均 RPS,再按成功 RPS 折算在线容量。