library-picturebook-activity/docs/project/08-test-plan.md
aid 418aa57ea8 Day4: 超管端设计优化 + UGC绘本创作社区P0实现
一、超管端设计优化
- 文档管理SOP体系建立,docs目录重组
- 统一用户管理:跨租户全局视角,合并用户管理+公众用户
- 活动监管全模块重构:全部活动(统计卡片+阶段筛选+SuperDetail详情页)、报名数据/作品数据/评审进度(两层合一扁平列表)、成果发布(去Tab+统计+隐藏写操作)
- 菜单精简:移除评委管理/评审规则/通知管理
- Bug修复:租户编辑丢失隐藏菜单、pageSize限制、主色统一

二、UGC绘本创作社区P0
- 数据库:10张新表(user_works/user_work_pages/work_tags等)
- 子女账号独立化:Child升级为独立User,家长切换+独立登录
- 用户作品库:CRUD+发布审核,8个API
- AI创作流程:提交→生成→保存到作品库,4个API
- 作品广场:首页改造为推荐流,标签+搜索+排序
- 内容审核(超管端):作品审核+作品管理+标签管理
- 活动联动:WorkSelector作品选择器
- 布局改造:底部5Tab(发现/创作/活动/作品库/我的)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-27 22:20:25 +08:00

424 lines
24 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 全平台测试方案
## 测试范围
| 层级 | 覆盖内容 |
|------|---------|
| 数据库 | 表结构完整性、字段约束、外键关联、索引、数据一致性 |
| 后端 API | 全部 18 个公众端接口 + 核心管理端接口的功能和异常测试 |
| 前端 | 4 个端的页面渲染、交互逻辑、路由守卫、响应式适配 |
| 全链路 | 4 条核心业务流程端到端走通 |
---
## 一、数据库测试
### 1.1 新增/变更表结构验证
| 编号 | 测试项 | 验证方式 | 预期结果 |
|------|--------|---------|---------|
| DB-01 | children 表存在且字段完整 | `DESCRIBE children` | 12 个字段id, parent_id, name, gender, birthday, grade, city, school_name, avatar, is_deleted, create_time, modify_time |
| DB-02 | children.parent_id 外键关联 users.id | 插入不存在的 parent_id | 外键约束报错 |
| DB-03 | users.phone 唯一约束 | 插入两条相同 phone 的记录 | 唯一约束报错 |
| DB-04 | users.wx_openid 唯一约束 | 插入两条相同 wx_openid | 唯一约束报错 |
| DB-05 | users.user_source 默认值 | 插入不指定 user_source 的记录 | 默认 'admin_created' |
| DB-06 | tenants.tenant_type 默认值 | 插入不指定 tenant_type 的记录 | 默认 'other' |
| DB-07 | t_contest.visibility 默认值 | 插入不指定 visibility 的记录 | 默认 'designated' |
| DB-08 | t_contest.target_cities JSON 格式 | 存储 `["广州","深圳"]` | 正常读写 JSON 数组 |
| DB-09 | t_contest.age_min / age_max 可为 NULL | 插入 NULL 值 | 正常存储 |
| DB-10 | t_contest_registration.participant_type 默认值 | 插入不指定的记录 | 默认 'self' |
| DB-11 | t_contest_registration.child_id 可为 NULL | 自己报名时不传 child_id | 正常存储为 NULL |
| DB-12 | t_contest_registration.child_id 外键 | 关联 children.id | 删除 child 时 SetNull |
### 1.2 租户与角色数据完整性
| 编号 | 测试项 | SQL | 预期结果 |
|------|--------|-----|---------|
| DB-13 | 超级租户存在 | `SELECT * FROM tenants WHERE code='super'` | tenant_type='platform', is_super=1 |
| DB-14 | 公众租户存在 | `SELECT * FROM tenants WHERE code='public'` | tenant_type='platform', is_super=0 |
| DB-15 | 广东省图租户存在 | `SELECT * FROM tenants WHERE code='gdlib'` | tenant_type='library' |
| DB-16 | 评委租户存在 | `SELECT * FROM tenants WHERE code='judge'` | tenant_type='other' |
| DB-17 | 各角色权限数量 | 查询 role_permissions 聚合 | super_admin≥10, tenant_admin≥26, judge≥10, public_user=4 |
| DB-18 | 公众用户角色有正确权限 | 查询 public_user 角色权限 | 包含 activity:read, registration:create, work:create, child:manage |
### 1.3 菜单分配验证
| 编号 | 测试项 | 预期结果 |
|------|--------|---------|
| DB-19 | 超管端菜单 | 4 个一级菜单:活动监管(8子)、机构管理(1子)、用户中心(3子)、系统设置(5子) |
| DB-20 | 广东省图菜单 | 2 个一级菜单:活动管理(8子)、系统设置(3子用户/角色/日志) |
| DB-21 | 评委端菜单 | 1 个一级菜单:我的评审(2子评审任务/预设评语) |
| DB-22 | 公众租户无管理菜单 | 公众租户 tenant_menus 为空 |
| DB-23 | 广东省图不含平台级菜单 | 不含菜单管理、权限管理、数据字典、系统配置、租户管理 |
---
## 二、后端 API 测试
### 2.1 公众端认证 API
| 编号 | 接口 | 测试场景 | 方法 | 预期 |
|------|------|---------|------|------|
| API-01 | POST /public/auth/register | 正常注册 | `{"username":"test001","password":"test123456","nickname":"测试用户"}` | 200返回 token + user 信息user_source='self_registered' |
| API-02 | POST /public/auth/register | 用户名已存在 | 重复提交 test001 | 409"用户名已被注册" |
| API-03 | POST /public/auth/register | 用户名太短 | `{"username":"ab","password":"123456","nickname":"test"}` | 400校验错误 |
| API-04 | POST /public/auth/register | 密码太短 | `{"username":"test002","password":"123","nickname":"test"}` | 400 |
| API-05 | POST /public/auth/register | 缺少必填字段 | `{"username":"test003"}` | 400 |
| API-06 | POST /public/auth/register | 带手机号注册 | `{"username":"test004","password":"123456","nickname":"test","phone":"13800138001"}` | 200phone 正确存储 |
| API-07 | POST /public/auth/register | 手机号重复 | 再次提交 13800138001 | 409"该手机号已被注册" |
| API-08 | POST /public/auth/login | 正常登录 | `{"username":"test001","password":"test123456"}` | 200返回 token |
| API-09 | POST /public/auth/login | 密码错误 | `{"username":"test001","password":"wrong"}` | 401"用户名或密码错误" |
| API-10 | POST /public/auth/login | 用户不存在 | `{"username":"nonexist","password":"123456"}` | 401 |
### 2.2 子女管理 API
| 编号 | 接口 | 测试场景 | 预期 |
|------|------|---------|------|
| API-11 | POST /public/mine/children | 正常添加子女 | 200返回子女信息含 id |
| API-12 | POST /public/mine/children | 缺少姓名 | 400"子女姓名不能为空" |
| API-13 | POST /public/mine/children | 完整信息 | `{"name":"小明","gender":"male","birthday":"2018-05-15","grade":"二年级","city":"广州","schoolName":"实验小学"}` → 200 |
| API-14 | GET /public/mine/children | 获取列表 | 200返回数组按创建时间倒序 |
| API-15 | GET /public/mine/children/:id | 获取详情 | 200返回单个子女 |
| API-16 | GET /public/mine/children/:id | 非自己的子女 | 404"子女信息不存在" |
| API-17 | PUT /public/mine/children/:id | 更新信息 | 200字段更新成功 |
| API-18 | DELETE /public/mine/children/:id | 删除 | 200is_deleted 置为 1软删除 |
| API-19 | GET /public/mine/children | 删除后列表 | 200已删除的子女不出现 |
| API-20 | DELETE /public/mine/children/:id | 非自己的子女 | 404 |
### 2.3 活动浏览 API
| 编号 | 接口 | 测试场景 | 预期 |
|------|------|---------|------|
| API-21 | GET /public/activities | 无需登录获取列表 | 200仅返回 visibility=public 或 targeted 的已发布活动 |
| API-22 | GET /public/activities | 关键词搜索 | `?keyword=绘本` → 过滤结果 |
| API-23 | GET /public/activities | 分页 | `?page=1&pageSize=5` → 正确分页 |
| API-24 | GET /public/activities | 类型筛选 | `?contestType=individual` → 仅返回个人参与类型 |
| API-25 | GET /public/activities | 未发布活动不可见 | contestState='unpublished' 的活动不出现 |
| API-26 | GET /public/activities | visibility=internal 不可见 | 仅内部活动不出现在公众列表 |
| API-27 | GET /public/activities | visibility=designated 不可见 | 指定机构活动不出现 |
| API-28 | GET /public/activities/:id | 正常获取详情 | 200含 attachments 和 notices |
| API-29 | GET /public/activities/:id | 不存在的活动 | 404"活动不存在或未公开" |
| API-30 | GET /public/activities/:id | 未发布的活动 | 404 |
### 2.4 定向推送 API
| 编号 | 接口 | 测试场景 | 预期 |
|------|------|---------|------|
| API-31 | GET /public/activities | targeted+城市匹配 | 用户 city='广州',活动 target_cities=['广州','深圳'] → 可见 |
| API-32 | GET /public/activities | targeted+城市不匹配 | 用户 city='北京',活动 target_cities=['广州'] → 不可见 |
| API-33 | GET /public/activities | targeted+子女城市匹配 | 用户无城市但子女 city='广州' → 可见 |
| API-34 | GET /public/activities | targeted+未登录 | targeted 活动对未登录用户不可见 |
| API-35 | GET /public/activities | targeted+无城市限制 | target_cities 为空但有年龄限制 → 所有登录用户可见 |
### 2.5 活动报名 API
| 编号 | 接口 | 测试场景 | 预期 |
|------|------|---------|------|
| API-36 | POST /public/activities/:id/register | 自己报名 | `{"participantType":"self"}` → 200 |
| API-37 | POST /public/activities/:id/register | 代子女报名 | `{"participantType":"child","childId":1}` → 200 |
| API-38 | POST /public/activities/:id/register | 重复报名(自己) | 409"您已报名此活动" |
| API-39 | POST /public/activities/:id/register | 重复报名(同一子女) | 409"该子女已报名此活动" |
| API-40 | POST /public/activities/:id/register | 不同子女同一活动 | 200允许不同子女分别报名 |
| API-41 | POST /public/activities/:id/register | 代子女但不传 childId | 400"代子女报名时必须选择子女" |
| API-42 | POST /public/activities/:id/register | 非自己的子女 | 404"子女信息不存在" |
| API-43 | POST /public/activities/:id/register | 不在报名时间范围内 | 400"当前不在报名时间范围内" |
| API-44 | POST /public/activities/:id/register | 活动不存在或未公开 | 404 |
| API-45 | POST /public/activities/:id/register | 年龄不符合(太小) | 400"参与者年龄不符合要求(最低 X 岁)" |
| API-46 | POST /public/activities/:id/register | 年龄不符合(太大) | 400"参与者年龄不符合要求(最高 X 岁)" |
| API-47 | POST /public/activities/:id/register | 年龄符合 | 200正常报名 |
| API-48 | POST /public/activities/:id/register | 未登录 | 401 |
### 2.6 作品提交 API
| 编号 | 接口 | 测试场景 | 预期 |
|------|------|---------|------|
| API-49 | GET /public/activities/:id/my-registration | 已报名已通过 | 200返回报名记录含 contest 信息 |
| API-50 | GET /public/activities/:id/my-registration | 未报名 | 200返回 null |
| API-51 | POST /public/activities/:id/submit-work | 正常提交 | `{"registrationId":1,"title":"我的绘本"}` → 200生成 workNo |
| API-52 | POST /public/activities/:id/submit-work | 报名未通过 | 400"报名未通过审核" |
| API-53 | POST /public/activities/:id/submit-work | 不在提交时间 | 400"当前不在作品提交时间范围内" |
| API-54 | POST /public/activities/:id/submit-work | submitRule=once 重复提交 | 409"该活动只允许提交一次作品" |
| API-55 | POST /public/activities/:id/submit-work | 非自己的报名记录 | 404"报名记录不存在" |
| API-56 | POST /public/activities/:id/submit-work | 带附件提交 | attachments 数组正确创建 |
### 2.7 我的数据 API
| 编号 | 接口 | 测试场景 | 预期 |
|------|------|---------|------|
| API-57 | GET /public/mine/registrations | 正常获取 | 200含 contest 和 child 关联信息 |
| API-58 | GET /public/mine/registrations | 分页 | `?page=1&pageSize=5` → 正确分页 |
| API-59 | GET /public/mine/works | 正常获取 | 200含 contest、registration.child、attachments |
| API-60 | GET /public/mine/profile | 含子女信息 | 200包含 children 数组和 childrenCount |
### 2.8 公众用户管理 API超管端
| 编号 | 接口 | 测试场景 | 预期 |
|------|------|---------|------|
| API-61 | GET /public/users | 仅返回自注册用户 | user_source='self_registered' 的用户 |
| API-62 | GET /public/users | 关键词搜索 | 搜索用户名/昵称/手机号/城市 |
| API-63 | GET /public/users/:id | 详情含子女和报名 | 返回 children 数组 + contestRegistrations |
| API-64 | GET /public/users/:id | 非自注册用户 | 404"公众用户不存在" |
### 2.9 管理端认证 API
| 编号 | 接口 | 测试场景 | 预期 |
|------|------|---------|------|
| API-65 | POST /auth/login | 超管登录 | `{"username":"admin","password":"admin@super","tenantCode":"super"}` → 200 |
| API-66 | POST /auth/login | 广东省图登录 | `{"username":"admin","password":"admin@gdlib","tenantCode":"gdlib"}` → 200 |
| API-67 | POST /auth/login | 评委登录 | `{"username":"admin","password":"admin@judge","tenantCode":"judge"}` → 200 |
| API-68 | POST /auth/login | 错误租户编码 | `{"tenantCode":"nonexist"}` → 401"租户不存在" |
| API-69 | GET /auth/user-info | 获取用户信息 | 200含 roles 和 permissions |
---
## 三、前端测试
### 3.1 公众端(/p/
#### 3.1.1 登录/注册页
| 编号 | 测试场景 | 操作步骤 | 预期结果 |
|------|---------|---------|---------|
| FE-01 | 默认填充 | 打开 /p/login | 用户名 demo密码 demo123456 已填充 |
| FE-02 | 登录成功 | 点击登录 | 跳转到 /p/activities |
| FE-03 | 登录失败 | 输入错误密码 → 登录 | 提示"用户名或密码错误" |
| FE-04 | 切换注册 | 点击"立即注册" | 表单切换为注册模式,显示昵称和确认密码 |
| FE-05 | 注册成功 | 填写完整注册信息 → 提交 | 提示"注册成功",自动登录跳转 |
| FE-06 | 注册校验 | 用户名 2 位/密码 3 位 | 表单校验错误提示 |
| FE-07 | 管理端入口 | 点击底部"平台超管" | 跳转到 /super/login |
| FE-08 | 管理端入口 | 点击"广东省图" | 跳转到 /gdlib/login |
| FE-09 | 管理端入口 | 点击"评委端" | 跳转到 /judge/login |
#### 3.1.2 活动大厅
| 编号 | 测试场景 | 预期结果 |
|------|---------|---------|
| FE-10 | 无需登录访问 | /p/activities 正常打开,显示活动卡片 |
| FE-11 | 搜索功能 | 输入关键词 → 过滤活动 |
| FE-12 | 空状态 | 无公开活动时显示"暂无公开活动" |
| FE-13 | 卡片信息 | 显示封面/名称/时间/类型标签/阶段标签 |
| FE-14 | 年龄标签 | 有年龄限制的活动显示"3-12岁"标签 |
| FE-15 | 点击卡片 | 跳转到活动详情页 |
#### 3.1.3 活动详情页
| 编号 | 测试场景 | 预期结果 |
|------|---------|---------|
| FE-16 | 封面/Placeholder | 有封面显示图片,无封面显示渐变色+首字 |
| FE-17 | 阶段徽章 | 正确显示即将开始/报名中/提交中/评审中/已结束 |
| FE-18 | 报名中+未登录 | 显示"登录后报名"按钮 |
| FE-19 | 报名中+已登录+未报名 | 显示"立即报名"按钮 |
| FE-20 | 报名中+已报名 | 显示"已报名,等待提交阶段" |
| FE-21 | 提交中+已报名 | 显示"提交作品"按钮 |
| FE-22 | 提交中+已提交 | 显示"作品已提交" |
| FE-23 | 评审中 | 显示"评审中,请耐心等待" |
| FE-24 | 已结束 | 显示"查看成果"按钮 |
| FE-25 | 报名弹窗 | 点击报名 → 显示参与者选择(自己+子女列表) |
| FE-26 | 报名弹窗-无子女 | 只显示"我自己" |
| FE-27 | 报名弹窗-有子女 | 显示"我自己"+ 所有子女(姓名+年级) |
| FE-28 | 报名弹窗-添加子女链接 | 点击"添加新的子女"跳转到子女管理 |
| FE-29 | 作品提交弹窗 | 点击提交作品 → 显示标题+描述+文件上传表单 |
| FE-30 | 活动详情 Tab | 显示富文本内容 |
| FE-31 | 活动公告 Tab | 显示公告列表或"暂无公告" |
| FE-32 | 成果 Tab | 活动成果发布后显示此 Tab |
| FE-33 | 年龄要求展示 | 有年龄限制时显示"年龄要求X-Y 岁" |
| FE-34 | 目标城市展示 | targeted 活动显示"面向城市:广州、深圳" |
| FE-35 | 返回按钮 | 点击"返回"回到上一页 |
#### 3.1.4 个人中心
| 编号 | 测试场景 | 预期结果 |
|------|---------|---------|
| FE-36 | 用户卡片 | 显示头像(首字母)+昵称+城市 |
| FE-37 | 编辑按钮 | 点击"编辑"打开弹窗 |
| FE-38 | 编辑保存 | 修改昵称+城市 → 保存成功 → 卡片刷新 |
| FE-39 | 报名数量 | 显示"N 个活动"或"查看已报名的活动" |
| FE-40 | 作品数量 | 显示"N 个作品"或"管理提交的作品" |
| FE-41 | 子女数量 | 显示"已添加 N 个子女"或"添加子女信息" |
| FE-42 | 退出登录 | 点击退出 → 清除 token → 跳转登录页 |
#### 3.1.5 子女管理
| 编号 | 测试场景 | 预期结果 |
|------|---------|---------|
| FE-43 | 空状态 | 无子女时显示空状态+添加按钮 |
| FE-44 | 添加子女 | 点击添加 → 弹窗 → 填写信息 → 保存成功 |
| FE-45 | 子女卡片 | 显示姓名+年龄+年级+城市+学校(标签形式) |
| FE-46 | 编辑子女 | 点击编辑 → 弹窗回显数据 → 修改保存 |
| FE-47 | 删除子女 | 点击删除 → 确认弹窗 → 删除成功 |
| FE-48 | 年龄计算 | 根据生日自动计算并显示"X 岁" |
#### 3.1.6 我的报名
| 编号 | 测试场景 | 预期结果 |
|------|---------|---------|
| FE-49 | 报名列表 | 显示活动封面+名称+状态标签+参与者类型 |
| FE-50 | 参与者标识 | 自己报名显示"本人参与",子女显示"子女:小明" |
| FE-51 | 提交作品按钮 | 报名通过+提交阶段 → 显示"提交作品"按钮 |
| FE-52 | 点击跳转 | 点击卡片跳转到活动详情 |
#### 3.1.7 响应式适配
| 编号 | 测试场景 | 预期结果 |
|------|---------|---------|
| FE-53 | 手机宽度(375px) | 底部 Tab 显示,顶部导航精简 |
| FE-54 | 平板宽度(768px) | 底部 Tab 隐藏,顶部导航显示 |
| FE-55 | 活动卡片网格 | 手机 1 列,平板 2 列PC 3-4 列 |
| FE-56 | 作品网格 | 手机 2 列PC 自适应 |
### 3.2 管理端登录页
| 编号 | 测试场景 | 预期结果 |
|------|---------|---------|
| FE-57 | 快捷切换标签 | 显示 3 个:平台超管、广东省图、评委端 |
| FE-58 | 点击标签自动填充 | 点击"广东省图"自动填充 admin/admin@gdlib |
| FE-59 | URL 自动识别 | 访问 /gdlib/login → 自动绑定广东省图 |
| FE-60 | 副标题显示 | 显示"广东省立中山图书馆 — 管理端登录" |
| FE-61 | 公众端入口 | 底部显示"参与活动?前往公众端"链接 |
### 3.3 超管端(/super/
| 编号 | 测试场景 | 预期结果 |
|------|---------|---------|
| FE-62 | 菜单结构 | 4 个一级菜单:活动监管、机构管理、用户中心、系统设置 |
| FE-63 | 活动监管-全部活动 | 显示主办方、可见范围、报名数、作品数、评委数列 |
| FE-64 | 活动监管-可见范围筛选 | 筛选公开/定向推送/指定机构/仅内部 |
| FE-65 | 活动监管-定向推送标签 | 橙色标签hover 显示城市和年龄条件 |
| FE-66 | 活动监管-无创建按钮 | 超管端不显示"创建活动"按钮 |
| FE-67 | 报名数据 | 显示主办单位列 |
| FE-68 | 作品数据 | 显示主办机构列 |
| FE-69 | 评审进度 | 显示主办机构列 |
| FE-70 | 成果发布 | 显示主办机构列+发布状态列 |
| FE-71 | 通知管理 | 只读(无创建/编辑/删除按钮) |
| FE-72 | 机构管理 | 机构列表:名称+编码+类型(彩色标签)+用户角色数+状态+操作 |
| FE-73 | 机构管理-搜索 | 按名称/编码搜索,按类型筛选 |
| FE-74 | 机构管理-添加 | 弹窗:机构名称+编码+类型+描述,编码自动提示登录地址 |
| FE-75 | 机构管理-菜单分配 | 第二个 Tab "功能菜单",勾选分配 |
| FE-76 | 机构管理-隐藏 public | 列表中不显示"公众用户"租户 |
| FE-77 | 用户中心-公众用户 | 列表:头像+昵称+手机号+城市+子女数+报名数+状态 |
| FE-78 | 用户中心-公众用户详情 | 抽屉:基本信息+子女列表+报名记录 |
| FE-79 | 用户中心-平台用户 | 管理超管团队内部用户 |
| FE-80 | 用户中心-角色管理 | 管理超管端角色 |
### 3.4 广东省图管理端(/gdlib/
| 编号 | 测试场景 | 预期结果 |
|------|---------|---------|
| FE-81 | 菜单结构 | 2 个一级菜单:活动管理(8 子)、系统设置(3 子) |
| FE-82 | 创建活动 | 表单含可见范围(公开/定向推送/指定机构/仅内部) |
| FE-83 | 定向推送配置 | 选择"定向推送"→ 展开城市输入+年龄范围 |
| FE-84 | 年龄限制 | 公开和定向推送都可设置年龄范围 |
| FE-85 | 报名管理-参与方式列 | 显示"本人参与"或"代子女报名"+子女姓名 |
| FE-86 | 系统设置 | 仅含用户管理、角色管理、日志记录(无菜单/权限/字典/配置/租户) |
### 3.5 评委端(/judge/
| 编号 | 测试场景 | 预期结果 |
|------|---------|---------|
| FE-87 | 登录不卡死 | 登录后正确跳转到评审任务页(非死循环) |
| FE-88 | 菜单结构 | 1 个一级菜单:我的评审(评审任务+预设评语) |
| FE-89 | 评审任务 | 显示参与评审的活动列表+进度条+完成状态 |
| FE-90 | 进入评审 | 点击"进入评审"跳转到评审工作台 |
| FE-91 | 评审工作台 | 显示分配的作品列表+搜索+筛选(已评/未评) |
| FE-92 | 预设评语 | 管理评语模板列表 |
---
## 四、全链路端到端测试
### 4.1 流程一:公众用户完整参与流程
```
步骤 1: 公众端注册 → /p/login 注册新用户
步骤 2: 添加子女 → /p/mine/children 添加一个子女
步骤 3: 浏览活动 → /p/activities 看到广东省图的活动
步骤 4: 报名活动 → 选择"子女"作为参与者 → 确认报名
步骤 5: 等待审核 → 我的报名显示"待审核"
步骤 6: [切换到广东省图管理端] → 报名管理 → 看到该报名记录 → 显示"代子女报名"
步骤 7: [广东省图管理端] → 审核通过
步骤 8: [切回公众端] → 我的报名显示"已通过" → 出现"提交作品"按钮
步骤 9: 提交作品 → 填写标题+描述 → 提交成功
步骤 10: [广东省图管理端] → 作品管理 → 看到提交的作品
```
**验证点:** 跨端数据一致性、参与者类型传递、审核状态流转
### 4.2 流程二:定向推送活动
```
步骤 1: [广东省图管理端] 创建活动 → 可见范围=定向推送 → 城市=广州 → 年龄=6-12岁
步骤 2: [公众端-广州用户] 活动大厅能看到该活动
步骤 3: [公众端-北京用户] 活动大厅看不到该活动
步骤 4: [公众端-广州用户] 报名 → 选择 5 岁子女 → 报错"年龄不符合"
步骤 5: [公众端-广州用户] 报名 → 选择 8 岁子女 → 成功
```
**验证点:** 城市过滤、年龄校验、子女城市匹配
### 4.3 流程三:评审完整流程
```
步骤 1: [广东省图管理端] 创建活动+发布
步骤 2: [广东省图管理端] 评委管理 → 添加评委
步骤 3: [公众端] 报名+提交作品
步骤 4: [广东省图管理端] 审核报名通过
步骤 5: [广东省图管理端] 评审进度 → 分配作品给评委
步骤 6: [评委端] 评审任务 → 看到该活动 → 进入评审
步骤 7: [评委端] 给作品打分+写评语
步骤 8: [广东省图管理端] 评审进度 → 查看评审完成率
步骤 9: [广东省图管理端] 成果发布 → 发布成果
步骤 10: [公众端] 活动详情 → 看到"成果"Tab
```
**验证点:** 评委分配、评分数据流转、成果发布到公众端可见
### 4.4 流程四:超管监管视角
```
步骤 1: [超管端] 活动监管 → 全部活动 → 看到所有机构的活动
步骤 2: [超管端] 可见范围筛选 → 筛选"定向推送"类型
步骤 3: [超管端] 报名数据 → 看到各活动报名人数
步骤 4: [超管端] 用户中心 → 公众用户 → 看到自注册用户列表
步骤 5: [超管端] 公众用户详情 → 看到子女信息+报名记录
步骤 6: [超管端] 机构管理 → 看到广东省图(类型=图书馆)
```
**验证点:** 跨机构数据可见性、公众用户管理、机构类型展示
---
## 五、测试数据准备
### 5.1 必需的测试活动
在广东省图管理端创建以下活动:
| 活动名称 | 可见范围 | 城市 | 年龄 | 报名时间 | 提交时间 |
|---------|---------|------|------|---------|---------|
| 全国少儿绘本创作大赛 | 公开 | - | 3-16 | 当前时间内 | 报名后 |
| 广州绘本工作坊 | 定向推送 | 广州,深圳 | 6-12 | 当前时间内 | 报名后 |
| 内部测试活动 | 仅内部 | - | - | 当前时间内 | 报名后 |
### 5.2 必需的测试用户
| 用户 | 城市 | 子女 | 用途 |
|------|------|------|------|
| 广州家长 | 广州 | 8 岁+5 岁 | 测试定向推送+年龄校验 |
| 北京家长 | 北京 | 10 岁 | 测试城市不匹配 |
| 独立少年 | 广州 | 无 | 测试自己报名 |
---
## 六、执行优先级
| 优先级 | 类别 | 编号范围 | 说明 |
|--------|------|---------|------|
| P0 | 全链路 | 4.1-4.4 | 业务流程必须走通 |
| P0 | 认证 | API-01~10, FE-01~09 | 登录注册基础功能 |
| P0 | 报名 | API-36~48, FE-18~28 | 核心业务流程 |
| P1 | 定向推送 | API-31~35, FE-83~84 | 新功能验证 |
| P1 | 作品提交 | API-49~56, FE-29 | 核心流程完整性 |
| P1 | 数据库 | DB-01~23 | 数据完整性保障 |
| P2 | 管理端 | FE-62~86 | 管理端适配验证 |
| P2 | 响应式 | FE-53~56 | H5 适配 |