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

24 KiB
Raw Blame History

全平台测试方案

测试范围

层级 覆盖内容
数据库 表结构完整性、字段约束、外键关联、索引、数据一致性
后端 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 适配