library-picturebook-activity/docs/project/05-development-plan.md

367 lines
17 KiB
Markdown
Raw Normal View History

# 开发计划
## 1. 总体时间线
- **项目启动**2026-03-24
- **目标上线**2026-04-14
- **总工期**3 周15 个工作日)
- **开发方式**Claude 辅助全栈开发
---
## 2. 一期开发计划(三周冲刺)
### 第一周03-24 ~ 03-28地基改造
| 日期 | 任务 | 产出 | 状态 |
|------|------|------|------|
| D1 (03-24) | 需求梳理、设计文档沉淀、UI 主题改造 | 设计文档、UI 新主题 | 已完成 |
| D2 (03-25) | 数据库改造users/tenants/registrations/contests 表变更,新建 children 表Prisma Schema 同步 | 数据库迁移脚本 | 已完成 |
| D3 (03-26) | 后端:公众注册/登录 API、子女 CRUD API | 公众端 Auth + Children API | 已完成 |
| D4 (03-27) | 后端:公众端活动列表/详情 API、报名 API、我的报名/作品 API | Public Activities + Registration API | 已完成 |
| D5 (03-28) | 前端公众端基础框架、路由、布局H5 响应式)、注册/登录页、活动大厅、个人中心 | 公众端框架 + 核心页面 | 已完成 |
### 第二周03-31 ~ 04-04核心业务流程
| 日期 | 任务 | 产出 | 状态 |
|------|------|------|------|
| D6-10 | 前端:活动详情页(含报名弹窗)、子女管理页、我的报名页、我的作品页 | 公众端全部页面 | 已完成 |
### 第三周04-07 ~ 04-11管理端适配 + 联调
| 日期 | 任务 | 产出 | 状态 |
|------|------|------|------|
| D11-12 | 管理端:活动创建增加可见范围、租户类型字段、报名记录展示参与者类型和子女信息 | 管理端改造 | 已完成 |
| D13 | 广东省图初始化:创建租户(gdlib)、管理员(admin/admin@gdlib)、权限、菜单 | 初始化数据 | 已完成 |
| D14 | 超管端菜单重构 + 公众用户管理 + 评委端修复 | 各端功能完善 | 已完成 |
| D15 (04-11) | Bug 修复、UI 微调、部署上线 | 生产环境上线 | |
**缓冲时间**04-12 ~ 04-14 留作紧急修复和优化。
---
## 3. 已完成工作详细记录
### 3.1 系统改名与 UI 改造D1
**文案替换:**
- "比赛/赛事" → "活动"(前后端 46 个文件 + 数据库)
- "个人赛/团队赛" → "个人参与/团队参与"25 个文件 + 数据库)
- "赛果" → "成果"25 个文件 + 数据库菜单/权限)
- 系统名称 → "乐绘世界创想活动乐园"
- Logo 替换为 LeSingle 品牌标志
**UI 主题全面改造6 个核心文件):**
- 主色调:`#0958d9` 蓝 → `#6366F1` Creative Indigo
- 强调色:`#EC4899` 玫瑰粉
- 字体:系统默认 → NunitoGoogle Fonts
- 圆角6-8px → 10-16px
- 阴影:灰色 → 靛蓝色调
- 页面背景:`#f5f7fa` → `#F8F7FC` 暖紫
- 侧边栏:纯白 → 暖白渐变
- 全局组件覆盖:按钮、卡片、表格、标签、输入框、模态框等
### 3.2 数据库改造D2
**Prisma Schema 变更:**
| 表 | 变更 | 默认值 |
|---|------|--------|
| `tenants` | +`tenant_type` | `'other'` |
| `users` | +`phone`(unique), `wx_openid`(unique), `wx_unionid`, `user_source`, `city`, `birthday` | `user_source='admin_created'` |
| `t_contest` | +`visibility` | `'designated'` |
| `t_contest_registration` | +`participant_type`, `child_id` | `participant_type='self'` |
| `children` | **新建表** | - |
**初始化数据:**
- 公众租户code=`public`, tenantId=8, type=`platform`
- 公众用户角色code=`public_user`, 4 个权限
- 广东省图租户code=`gdlib`, tenantId=9, type=`library`
- 广东省图管理员admin/admin@gdlib, 21 个权限, 角色 `tenant_admin`
- 超级租户类型更新:`platform`
- 学校端类型更新:`school`
### 3.3 公众端后端 APID3-D4
**新增模块 `backend/src/public/`**
| 文件 | 说明 |
|------|------|
| `public.module.ts` | 模块定义 |
| `public.controller.ts` | 16 个 API 端点 |
| `public.service.ts` | 完整业务逻辑 |
| `dto/register.dto.ts` | 注册/登录 DTO |
| `dto/child.dto.ts` | 子女 CRUD DTO |
| `dto/registration.dto.ts` | 活动报名 DTO |
**API 端点清单16 个):**
| 方法 | 路径 | 认证 | 说明 |
|------|------|------|------|
| POST | `/api/public/auth/register` | 公开 | 公众注册(自动登录) |
| POST | `/api/public/auth/login` | 公开 | 公众登录 |
| GET | `/api/public/mine/profile` | 需登录 | 个人信息+子女 |
| PUT | `/api/public/mine/profile` | 需登录 | 更新个人信息 |
| GET | `/api/public/mine/children` | 需登录 | 子女列表 |
| POST | `/api/public/mine/children` | 需登录 | 添加子女 |
| GET | `/api/public/mine/children/:id` | 需登录 | 子女详情 |
| PUT | `/api/public/mine/children/:id` | 需登录 | 编辑子女 |
| DELETE | `/api/public/mine/children/:id` | 需登录 | 删除子女(软删除) |
| POST | `/api/public/activities/:id/register` | 需登录 | 报名活动(选择参与者) |
| GET | `/api/public/mine/registrations` | 需登录 | 我的报名列表 |
| GET | `/api/public/mine/works` | 需登录 | 我的作品列表 |
| GET | `/api/public/activities` | 公开 | 公开活动列表 |
| GET | `/api/public/activities/:id` | 公开 | 活动详情 |
| GET | `/api/public/users` | 需登录 | 公众用户列表(超管用) |
| GET | `/api/public/users/:id` | 需登录 | 公众用户详情(超管用) |
**架构决策:** 创建 `public` 系统租户code=public承载公众用户避免修改现有认证链路JWT token 格式完全兼容。
### 3.4 公众端前端 H5D5-D10
**新增文件:**
| 文件 | 路由 | 说明 |
|------|------|------|
| `layouts/PublicLayout.vue` | `/p` | 公众端布局(顶部导航+底部TabBar+响应式) |
| `views/public/Login.vue` | `/p/login` | 登录/注册合一页面 |
| `views/public/Activities.vue` | `/p/activities` | 活动大厅(卡片网格+搜索+分页) |
| `views/public/ActivityDetail.vue` | `/p/activities/:id` | 活动详情(报名弹窗+选择参与者) |
| `views/public/mine/Index.vue` | `/p/mine` | 个人中心 |
| `views/public/mine/Registrations.vue` | `/p/mine/registrations` | 我的报名列表 |
| `views/public/mine/Works.vue` | `/p/mine/works` | 我的作品网格 |
| `views/public/mine/Children.vue` | `/p/mine/children` | 子女管理CRUD |
| `api/public.ts` | - | 公众端 API 封装 |
**路由守卫:** `/p/` 前缀路由直接放行,不走管理端认证逻辑。
### 3.5 管理端适配D11-D12
**活动创建页Create.vue**
- 新增"可见范围"字段:公开 / 指定机构 / 仅内部
- 后端 DTO 同步新增 `Visibility` 枚举
**租户管理页tenants/Index.vue**
- 新增"租户类型"下拉选择和表格列
- 类型标签:图书馆(紫)/幼儿园(绿)/学校(蓝)/社会机构(橙)/其他
**报名记录页registrations/Records.vue**
- 个人参与和团队参与表格新增"参与方式"列
- 显示"本人参与"(蓝色标签) 或 "代子女报名"(绿色标签)+子女姓名
- 后端查询 include child 关联数据
**机构管理端菜单清理(广东省图 gdlib**
- 移除不应有的平台级菜单:菜单管理、数据字典、系统配置、权限管理、租户管理
- 保留:用户管理、角色管理、日志记录
### 3.6 超管端菜单重构D14
**菜单结构从 2 个一级 → 4 个一级:**
| 重构前 | 重构后 |
|--------|--------|
| 活动管理8 项) | 活动管理8 项,不变) |
| 系统管理8 项混杂) | 拆分为 ↓ |
| └ 租户管理 | **机构管理** → 机构列表(改名) |
| └ 用户管理 + 角色管理 | **用户中心** → 公众用户(🆕) + 平台用户 + 角色管理 |
| └ 菜单/权限/字典/配置/日志 | **系统设置** → 5 个配置类功能 |
**新增公众用户管理页面(`system/public-users/Index.vue`**
- 自注册用户列表(搜索、分页)
- 用户信息列:头像+昵称+用户名
- 统计列:子女数、报名次数
- 详情抽屉:基本信息 + 子女列表 + 近期报名记录
### 3.7 评委端修复D14
**问题:** 评委端前后端代码完整但数据库菜单缺失,导致评委登录后看不到任何功能。
**修复内容:**
| 项目 | 改动 |
|------|------|
| 数据库菜单 | 创建"我的评审"一级菜单 + "评审任务""预设评语"子菜单,分配给评委租户 |
| 权限 | 添加 `review:score` 权限并分配给评委角色 |
| 路由 | 新增评审详情路由 `activities/review/:id``ReviewDetail.vue` |
| Bug 修复 | "活动活动" → "我的评审"6 个文件,原"赛事活动"批量替换导致的 bug |
| 登录页 | 开发模式快捷入口增加"评委端"标签 |
**评委端最终菜单:**
```
评委端 (/judge/login, admin/admin@judge)
└── 我的评审
├── 评审任务(活动列表+进度 → 进入评审工作台)
└── 预设评语(评语模板管理+跨活动同步)
```
### 3.8 登录页改造D14
- 快捷切换标签:从旧的 5 个学校端 → 新的 3 个(平台超管/广东省图/评委端)
- 副标题:显示当前机构名 + "管理端登录"
- 移除租户编码手动输入框
- 新增"参与活动?前往公众端"链接
---
## 4. 当前各端状态总览
| 端 | 入口 | 账号 | 功能状态 |
|----|------|------|---------|
| 公众端 | `/p/activities` | 自主注册 | ✅ 活动浏览、注册登录、子女管理、报名、个人中心 |
| 广东省图管理端 | `/gdlib/login` | admin/admin@gdlib | ✅ 活动管理 8 个功能 + 系统管理 3 个功能 |
| 超管端 | `/super/login` | admin/admin@super | ✅ 活动管理 + 机构管理 + 用户中心(含公众用户) + 系统设置 |
| 评委端 | `/judge/login` | admin/admin@judge | ✅ 评审任务 + 预设评语 + 评审工作台 |
---
## 5. 二期功能规划
| 功能 | 预估工期 | 负责人 | 依赖 |
|------|---------|--------|------|
| 手机号+验证码登录 | 3天 | 同事 | 腾讯云短信服务开通、签名模板审批 |
| 微信扫码登录Web | 3天 | 同事 | 微信开放平台网站应用审批 |
| 微信授权登录H5 | 2天 | 同事 | 微信公众号认证、授权域名配置 |
| 一号多身份切换 | 5天 | Claude | user_identities 表、身份切换 UI |
| 多机构联合举办 | 3天 | Claude | contest_co_organizers 表、权限配置 |
| 超管运营仪表盘 | 3天 | Claude | 活动/用户/报名统计图表 |
---
## 6. 外部依赖清单
### 一期需要(上线前)
| 依赖项 | 状态 | 说明 |
|--------|------|------|
| 域名和 HTTPS | 待确认 | H5 页面需要 HTTPS |
| 服务器部署环境 | 待确认 | 生产环境服务器配置 |
| 广东省图活动信息 | 待获取 | 活动名称、时间、规则、封面等 |
| 广东省图 Logo | 待获取 | 用于活动页面展示主办方标识 |
### 二期需要
| 依赖项 | 状态 | 说明 |
|--------|------|------|
| 腾讯云短信服务 | 待开通 | 短信签名、验证码模板审批约3-5天 |
| 微信开放平台账号 | 待注册 | 需要企业资质网站应用审批约7天 |
| 微信公众号 | 待确认 | H5 微信授权登录需要认证服务号 |
---
## 7. 技术风险
| 风险 | 等级 | 应对措施 |
|------|------|---------|
| 公众端性能(全国用户) | 中 | 活动列表接口加缓存、分页控制 |
| 少儿信息安全 | 高 | 子女姓名等敏感信息在数据库层面加密存储 |
| 文件上传(作品)并发 | 中 | 使用现有腾讯云 COS 直传方案 |
---
## 8. 验收标准
### 一期上线验收清单
- [x] 公众用户可以通过 H5 页面注册账号
- [x] 公众用户可以浏览公开活动列表和详情
- [x] 家长可以添加/管理子女信息
- [x] 用户可以为自己或子女报名活动
- [ ] 用户可以在提交阶段上传作品
- [x] 个人中心可以查看所有报名和作品记录
- [x] 广东省图管理员可以创建"公开"可见范围的活动
- [x] 广东省图管理员可以查看报名记录并区分参与者类型
- [ ] H5 页面在手机浏览器和微信内置浏览器中正常显示(待真机测试)
- [ ] 全流程走通:注册 → 浏览 → 报名 → 提交 → 审核 → 成果发布(待联调)
- [x] 超管端可以查看公众注册用户和子女信息
- [x] 评委端可以看到评审任务和预设评语功能
- [x] 定向推送活动按城市/年龄过滤
- [x] 超管端活动监管只读(无创建/编辑/删除按钮)
- [x] 年龄校验在报名时生效
---
## 9. Day 1 完整工作记录2026-03-24
### 9.1 完成的设计工作
| 项目 | 说明 |
|------|------|
| 需求分析 | 广东省图项目需求、用户角色、参与者模型(家长-子女)、一号多身份方案 |
| 系统架构 | 多端架构(公众端/机构端/评委端/超管端、公众租户方案、路由设计、API 设计 |
| 数据库设计 | 5 张表变更 + 1 张新表children含完整字段定义和 ER 关系 |
| 功能模块设计 | 9 个功能模块的详细交互设计 |
| 各端定位分析 | 超管端监管视角 vs 机构端操作视角、评委端工作流、公众端参与流程 |
| 术语对照 | 比赛→活动、个人赛→个人参与、赛果→成果 |
| 测试方案 | 188 条测试用例覆盖数据库/后端/前端/全链路 |
### 9.2 完成的开发工作
| 类别 | 工作量 | 说明 |
|------|--------|------|
| UI 主题改造 | 6 个核心文件 | Nunito 字体、Creative Indigo 主色、全组件圆角化 |
| 文案替换 | 71 个文件 + 数据库 | 比赛→活动、个人赛→个人参与、赛果→成果 |
| 数据库改造 | 5 张表 + 1 张新表 | Prisma Schema 同步、迁移执行 |
| 后端 API | 20 个端点 | 公众端完整 CRUD + 作品提交 + 公众用户管理 |
| 前端公众端 H5 | 9 个页面/组件 | 登录注册、活动大厅、详情、个人中心、子女管理、报名、作品 |
| 管理端适配 | 6 个页面修改 | 可见范围、租户类型、报名参与方式、主办机构列 |
| 超管端重构 | 菜单+页面+权限 | 4 级菜单重组、公众用户管理页、活动监管只读化 |
| 评委端修复 | 菜单+权限+路由 | 创建菜单、补齐权限、修复路由死循环 |
| 定向推送 | 全链路 | 数据库字段 + DTO + Service + 创建表单 + 公众端过滤 + 报名年龄校验 |
| 登录页改造 | 1 个文件重写 | 管理端登录页+公众端登录页双向跳转 |
| 机构管理页重写 | 1 个文件重写 | 去租户化、精简表格、搜索筛选、隐藏系统租户 |
| 初始化脚本 | 1 个脚本 | 广东省图租户初始化(权限/角色/菜单/管理员) |
### 9.3 测试执行结果
| 层级 | 测试项 | 通过 | Bug 数 |
|------|--------|------|--------|
| 数据库 | 23 | 23 | 0 |
| 后端 API | 37 | 37 | 4已修复 |
| 前端自动化 | 33 | 33 | 1已修复 |
| **合计** | **93** | **93** | **5全部已修复** |
### 9.4 发现并修复的 Bug
| 编号 | 严重度 | 问题 | 修复文件 |
|------|--------|------|---------|
| BUG-01 | 致命 | 创建活动时 visibility/targetCities/ageMin/ageMax 未写入数据库 | `contests.service.ts` |
| BUG-02 | 致命 | Visibility 枚举缺少 targeted 值 | `create-contest.dto.ts` |
| BUG-03 | 高 | @Public() 接口无法获取登录用户 JWT 信息 | `jwt-auth.guard.ts` |
| BUG-04 | 高 | 报名 targeted 活动查询条件硬编码 public | `public.service.ts` |
| BUG-05 | 中 | 超管端显示创建/编辑/删除按钮 | `contests/Index.vue` |
### 9.5 产出文件清单
**文档9 个):**
- `docs/guangdong-library-project/` 目录下 01-09 共 9 个文档
**后端新增文件7 个):**
- `backend/src/public/` 模块module + controller + service + 3 个 DTO
- `backend/scripts/init-guangdong-library.ts`
**前端新增文件11 个):**
- `frontend/src/layouts/PublicLayout.vue`
- `frontend/src/views/public/` 下 7 个页面
- `frontend/src/views/system/public-users/Index.vue`
- `frontend/src/api/public.ts`
**修改文件(约 30 个):**
- Prisma Schema、全局样式、主题、App.vue、路由、菜单映射
- 6 个管理端页面(活动列表/报名/作品/评审/成果/通知)
- 登录页、机构管理页
- JWT Guard、Contest Service/DTO
### 9.6 待完成工作Day 2 起)
| 优先级 | 工作 | 说明 |
|--------|------|------|
| P0 | 作品提交文件上传对接 COS | 当前作品提交表单已有,需对接腾讯云 COS 文件上传 |
| P0 | 全链路联调测试 | 4 条端到端流程走通 |
| P0 | 真机 H5 测试 | 微信内置浏览器兼容性 |
| P1 | 个人信息编辑完善 | 补充手机号字段 |
| P1 | 成果查看详情 | 活动成果发布后公众端展示评审结果 |
| P1 | 子女删除保护提示 | 有报名记录时给出警告 |
| P2 | 手机号+验证码登录 | 同事负责 |
| P2 | 微信扫码登录 | 同事负责 |
| P2 | 超管运营仪表盘 | 统计图表 |