# 开发计划

## 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` 玫瑰粉
- 字体：系统默认 → Nunito（Google 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 公众端后端 API（D3-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 公众端前端 H5（D5-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 | 超管运营仪表盘 | 统计图表 |
