library-picturebook-activity/docs/project/04-feature-design.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

324 lines
10 KiB
Markdown
Raw Permalink 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.

# 功能模块设计
## 1. 模块总览
### 一期功能(三周内完成)
| 模块 | 优先级 | 说明 |
|------|--------|------|
| 公众端注册/登录 | P0 | 用户名+密码方式自主注册和登录 |
| 公众端活动大厅 | P0 | 浏览公开活动列表,查看活动详情 |
| 子女管理 | P0 | 添加/编辑/删除子女信息 |
| 活动报名 | P0 | 选择参与者(自己/子女)并报名 |
| 作品提交 | P0 | 上传绘本作品(图片/PDF |
| 个人中心 | P0 | 个人信息、报名记录、作品列表 |
| 租户类型字段 | P0 | 租户新增类型分类 |
| 活动可见范围 | P0 | 新增"公开"选项 |
| 管理端适配 | P0 | 报名记录展示参与者类型和子女信息 |
### 二期功能
| 模块 | 说明 |
|------|------|
| 手机号验证码登录 | 短信服务集成 |
| 微信扫码登录 | 微信开放平台 OAuth |
| 一号多身份切换 | 同一账号在公众端和管理端切换 |
| 多机构联合举办 | 主办+协办模式 |
---
## 2. 公众端注册与登录
> **实现说明**:登录与注册合并为同一页面 `/p/login`,通过 `isRegister` 标志切换表单。公众用户归属公众租户code='public', tenantId=8而非 tenant_id 为 NULL。
### 2.1 登录/注册页面(合一)
**路由**`/p/login`
**注册表单字段**
| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| 用户名 | 文本输入 | 是 | 4-20位字母数字下划线 |
| 密码 | 密码输入 | 是 | 6-20位至少包含字母和数字 |
| 确认密码 | 密码输入 | 是 | 与密码一致 |
| 昵称 | 文本输入 | 是 | 2-20位显示在界面上的名字 |
| 手机号 | 文本输入 | 否 | 预留字段,二期用于验证码登录 |
| 所在城市 | 文本输入 | 否 | 便于活动统计 |
**登录表单字段**
- 用户名 / 手机号
- 密码
**交互逻辑**
1. 页面底部有"切换到注册/切换到登录"链接,通过 `isRegister` 标志切换
2. 注册:前端校验 → 提交注册 → 后端创建用户user_source = 'self_registered', 归属 public 租户)→ 自动登录 → 跳转活动大厅
3. 登录:公众用户登录不需要填写租户编码 → 后端在公众租户中查找匹配用户 → 登录成功 → 跳转活动大厅
### 2.3 与现有登录的关系
```
登录入口:
├── /p/login → 公众端登录(无需租户编码)
└── /:tenantCode/login → 管理端登录(现有,需要租户编码)
两套登录页面独立,共用同一个 Auth API后端区分来源
```
---
## 3. 公众端活动大厅
### 3.1 活动列表页
**路由**`/p/activities`
**页面元素**
- 顶部:搜索框(按活动名称搜索)
- 筛选:活动状态(报名中/进行中/已结束)
- 列表:活动卡片网格展示
**活动卡片信息**
```
┌─────────────────────────┐
│ [活动封面图] │
│ ┌─报名中─┐ ┌个人参与┐ │
├─────────────────────────┤
│ 活动名称 │
│ 主办:广东省立中山图书馆 │
│ 报名时间xx - xx │
│ [查看详情] │
└─────────────────────────┘
```
**数据来源**
- 调用 `/api/public/activities` 接口
- 仅返回 `visibility = 'public'``contest_state = 'published'` 的活动
- 未登录用户也能浏览列表,但报名需要登录
### 3.2 活动详情页
**路由**`/p/activities/:id`
**页面结构**
```
┌─────────────────────────────────┐
│ 活动封面/海报 │
├─────────────────────────────────┤
│ 活动名称 │
│ 主办单位 | 活动类型 | 状态 │
├─────────────────────────────────┤
│ Tab: [活动详情] [活动公告] [成果] │
├─────────────────────────────────┤
│ 活动详情内容(富文本) │
│ 附件下载 │
├─────────────────────────────────┤
│ [立即报名] / [提交作品] 按钮 │
│ (根据活动阶段动态显示) │
└─────────────────────────────────┘
```
**按钮状态逻辑**
| 活动阶段 | 未登录 | 已登录未报名 | 已登录已报名 |
|---------|--------|------------|------------|
| 报名阶段 | 登录后报名 | 立即报名 | 已报名 |
| 提交阶段 | 登录查看 | - | 提交作品 |
| 评审阶段 | - | - | 评审中 |
| 已结束 | 查看成果 | 查看成果 | 查看成果 |
---
## 4. 子女管理
### 4.1 子女列表页
**路由**`/p/mine/children`
**页面元素**
- 子女卡片列表
- "添加子女"按钮
**子女卡片**
```
┌─────────────────────────┐
│ [头像] 小明 │
│ 8岁 | 三年级 | 广州 │
│ XX小学 │
│ [编辑] [删除] │
└─────────────────────────┘
```
### 4.2 添加/编辑子女
**弹窗表单字段**
| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| 姓名 | 文本 | 是 | 子女真实姓名 |
| 性别 | 选择 | 否 | 男/女 |
| 出生日期 | 日期选择 | 否 | 用于自动计算年龄 |
| 年级 | 文本/选择 | 否 | 如:大班、一年级 |
| 所在城市 | 文本 | 否 | |
| 学校/幼儿园 | 文本 | 否 | 手动填写 |
### 4.3 删除保护
- 如果子女有关联的报名记录,提示"该子女有 N 个活动报名记录,删除后历史数据中将显示为'已删除子女'"
- 使用软删除is_deleted = 1不物理删除
---
## 5. 活动报名
### 5.1 报名流程
```
步骤1选择参与者
├── 系统检测用户是否有子女
├── 无子女 → 跳过此步,以自己身份报名
└── 有子女 → 显示参与者选择页面
○ 我自己
○ 子女A姓名年龄
○ 子女B姓名年龄
添加新的子女
步骤2填写报名信息
├── 参与者基本信息(自动带入,可编辑)
│ ├── 自己报名:显示用户昵称、城市
│ └── 子女报名:显示子女姓名、年龄、学校
├── 活动要求的附加信息(由活动定义,如:创作主题选择)
└── 指导老师信息(可选)
步骤3确认提交
├── 确认报名信息
└── 提交 → 等待审核(如果活动开启了审核)/ 直接通过
```
### 5.2 报名数据存储
```
registrations 表记录:
├── user_id = 操作人(家长或独立参与者)
├── contest_id = 活动 ID
├── participant_type = 'self' 或 'child'
├── child_id = 子女 ID仅 child 类型)
├── status = 审核状态
└── 其他现有字段不变
```
### 5.3 重复报名检测
- 同一用户不能以"自己"身份重复报名同一活动
- 同一子女不能被重复报名同一活动(通过 child_id 去重)
- 不同子女可以分别报名同一活动
---
## 6. 作品提交
### 6.1 提交页面
**路由**`/p/activities/:id/submit`
**前置条件**
- 用户已登录
- 用户/子女已报名该活动且报名状态为"通过"
- 活动处于"提交阶段"
**表单字段**
| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| 作品名称 | 文本 | 是 | 绘本作品标题 |
| 作品描述 | 多行文本 | 否 | 创作说明 |
| 作品文件 | 文件上传 | 是 | 支持图片JPG/PNG和 PDF |
| 封面图 | 图片上传 | 否 | 作品封面,用于列表展示 |
### 6.2 与现有作品模块的关系
复用现有 works 表和上传逻辑,新增关联:
- 如果是子女报名,作品记录关联 child_id通过 registration 关联)
- 管理端查看作品时,能看到实际创作者(子女)的信息
---
## 7. 个人中心
### 7.1 个人中心首页
**路由**`/p/mine`
**页面结构**
```
┌─────────────────────────┐
│ [头像] 昵称 │
│ 手机号 | 城市 │
│ [编辑个人信息] │
├─────────────────────────┤
│ 📋 我的报名N
│ 🎨 我的作品N
│ 👶 子女管理N
└─────────────────────────┘
```
### 7.2 我的报名
**路由**`/p/mine/registrations`
**列表项信息**
```
┌─────────────────────────────────┐
│ [活动封面] │
│ 活动名称 │
│ 参与者:我自己 / 子女:小明 │
│ 报名时间2026-04-01 │
│ 状态:待审核 / 已通过 / 已拒绝 │
│ [查看详情] [提交作品] │
└─────────────────────────────────┘
```
### 7.3 我的作品
**路由**`/p/mine/works`
展示该用户提交的所有作品(包括代子女提交的)。
---
## 8. 管理端适配
### 8.1 活动创建改造
**活动创建表单新增字段**
```
活动可见范围:
○ 公开(所有注册用户可见)
○ 指定机构(选择机构列表)
○ 仅内部
```
当选择"公开"时,`contest_tenants` 字段不需要填写。
### 8.2 报名管理改造
**报名记录表格新增列**
| 列名 | 说明 |
|------|------|
| 报名人 | user.nickname操作人 |
| 参与者 | 自己报名显示用户名;子女报名显示"子女:小明" |
| 参与方式 | 自己 / 代子女报名 |
**筛选条件新增**
- 参与方式:全部 / 自己报名 / 代子女报名
### 8.3 租户管理改造
**租户列表新增列**
- 租户类型:图书馆 / 幼儿园 / 学校 / 社会机构 / 其他
**租户创建表单新增字段**
- 租户类型(下拉选择)