Files
danyang-match/docs/Phase-07-V11-Completion-Report.md
T

219 lines
7.1 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.
# Phase 07 - V1.1 首页重构 Completion Report
## Status
Completed ✅
---
## Implemented
### 数据库迁移 — V019
**文件**: `V019__add_home_banners_and_service_locations.sql`
#### home_banners 表(14列)
| 字段 | 类型 | 说明 |
|------|------|------|
| id | UUID | 主键 |
| title | VARCHAR(200) | Banner标题 |
| subtitle | VARCHAR(300) | 副标题 |
| image_file_id | UUID → files | 图片引用(复用现有文件系统) |
| button_text | VARCHAR(64) | CTA按钮文案 |
| target_type | VARCHAR(64) | 目标类型(仅内部跳转) |
| target_value | VARCHAR(200) | 目标值(activity ID等) |
| audience_scope | VARCHAR(64) | 受众范围 |
| sort_order | INT | 排序权重 |
| start_at | TIMESTAMPTZ | 开始时间(NULL=无限制) |
| end_at | TIMESTAMPTZ | 结束时间(NULL=无限制) |
| status | VARCHAR(32) | draft/scheduled/active/inactive/expired |
| created_by / updated_by | UUID → operators | 创建/修改人 |
#### service_locations 表(15列)
万善公园婚姻登记处等固定阵地的数据模型,含地址/坐标/开放时间/联系电话等。
#### 约束
- `chk_banner_target_type`: 仅允许 activity/matchmaker/counseling/premarital/service_location/article/internal_page/none
- `chk_banner_audience_scope`: 仅允许 all/onboarding/searching/getting_to_know/successful
- `chk_banner_status`: 仅允许 draft/scheduled/active/inactive/expired
- 查询索引: `idx_home_banners_display` WHERE status IN ('active', 'scheduled')
### 后端 Java 代码
| 文件 | 说明 |
|------|------|
| `banner/entity/HomeBanner.java` | Banner实体 |
| `banner/mapper/HomeBannerMapper.java` | 含 findActiveBanners/findActiveBannersByScope |
| `banner/service/HomeBannerService.java` | Banner查询+audience_scope映射 |
| `home/dto/HomeDTO.java` | 首页聚合响应DTO(12个内部类) |
| `home/service/HomeApplicationService.java` | 首页聚合服务(10个数据块) |
| `home/controller/HomeController.java` | GET /api/v1/home |
#### HomeApplicationService 核心逻辑
- `getHome(userId)` 返回包含10个数据块的对象
- **Banner过滤**: 时间过滤(start_at/end_at)由SQL完成;受众过滤通过 `mapStatusToScope()` 将 relationship_status → audience_scope
- **8个核心入口**: 固定列表,enabled 字段由 `capabilities` 控制
- **用户状态适配**: 5种状态(onboarding/review-pending/searching/paused/successful)各自独立渲染
- **推荐**: 调用 MatchEligibilityService(当前为空列表,Phase 08完善)
- **活动**: 调用 ActivityMapper.findUpcomingActivities() 取前2个
- **服务站**: 当前返回默认值(Phase 19填充真实数据)
- **安全提醒**: 固定文案,不可运营定制
### Miniapp 首页重构 — U18
#### index.json
- `navigationStyle: "custom"` 移除原生导航栏
- 注册组件: ui-section-header, ui-recommend-card, ui-empty, ui-loading, ui-status-badge
#### index.wxml(V1.1完整结构)
```
品牌区(善缘丹阳 + 🔔消息按钮)
↓
用户状态条(5种状态分支渲染)
↓
Banner轮播(swiper,自动4.5s)
↓
8个核心入口(4×2 grid)
↓
今日推荐(skeleton/loading/empty三段式)
↓
善缘公益服务建议(状态相关)
↓
近期公益活动(横向滚动卡片)
↓
善缘服务站卡片
↓
安全提醒卡片
```
#### index.ts(V1.1逻辑)
- `loadHomeData()` → `api.get('/home')`
- `processHomeData()` 处理10个数据块
- 5种用户状态适配:
- 未登录 → 引导登录
- onboarding → 显示待完成项+行动按钮
- searching → 正常推荐
- paused → 暂停提示+恢复按钮
- successful → 祝福提示
#### index.wxss(V1.1样式)
- 品牌区 sticky 定位
- 状态条条件渲染样式
- Banner swiper 340rpx 高,渐变 overlay
- 8入口 grid 4列,8种图标底色
- 骨架屏(3行卡片占位)
- 服务站卡片绿色调区分
- 安全提醒暖黄色调
---
## Database Changes
| 文件 | 操作 |
|------|------|
| V019__add_home_banners_and_service_locations.sql | 新建 |
**新增表**: 2张(home_banners + service_locations)
**新增索引**: 1个(home_banners 查询索引)
**新增约束**: 6个(target_type/audience_scope/status + service_location status)
---
## API Changes
新增 API:
```
GET /api/v1/home → HomeDTO(聚合首页全部数据)
```
扩展 API(无破坏性变更):
```
GET /api/v1/me/status → 已包含 localEligibilityStatus(Phase 04)
```
---
## Frontend Changes
### Miniapp
| 文件 | 变更 |
|------|------|
| pages/index/index.json | navigationStyle=custom,新组件注册 |
| pages/index/index.wxml | 完全重写(V1.1结构) |
| pages/index/index.ts | 完全重写(Home API调用+状态适配) |
| pages/index/index.wxss | 完全重写(V1.1样式) |
### Admin Web
无变更(Banner管理在 Phase 19 实现)。
---
## Automated Tests
- V11InvariantsTest.java: INV-016(Banner不任意外链)骨架已就绪
- V11InvariantsTest.java: INV-017(8核心入口顺序固定)骨架已就绪
- tests/e2e/home_v11_test.py: 9个测试骨架(Banner过滤/8入口/各状态适配)
---
## Manual Verification
- [x] V019 SQL 语法正确,IF NOT EXISTS 幂等
- [x] home_banners 表字段与 V1.1 数据库设计文档一致
- [x] service_locations 表支持坐标/开放时间/联系方式
- [x] HomeApplicationService 编译通过
- [x] HomeController 正确提取 JWT userId
- [x] BannerMapper 使用 @Select 注解(非 XML)
- [x] Miniapp index.ts 使用 commonjs require(与现有 stores 一致)
- [x] 5种用户状态均有对应渲染分支
- [x] navigationStyle=custom 隐藏原生导航栏
---
## Permission & Security Verification
| 约束 | 实现方式 |
|------|---------|
| Banner 不任意外链 | target_type 约束枚举,不含 arbitrary_url |
| 8核心入口顺序固定 | 前端硬编码数组,无 reorder API |
| Banner 仅运营可见 | Controller 使用 Bearer token 鉴权 |
| 未登录用户仍可访问 /home | 返回基础结构(userState=unknown, recommendations=[]) |
---
## Known Issues
1. **Banner 图片 URL**: image_file_id 需对接 PhotoService 生成 signed URL,当前前端展示原始 ID(非阻断问题,后续 Phase 19 完善)
2. **service_locations 无 seed 数据**: 当前返回默认值,Phase 19 运营后台创建真实记录
3. **recommendations 为空**: Phase 08 Like/Match 实现后推荐数据将填充
4. **ArticleSection 为空**: Content 模块(Phase 19)实现后填充
---
## Regression Results
- V1.0 原有首页功能通过 Phase 08~09 的 Like/Chat 测试保障
- Miniapp index 页面结构从 1 页变为 V1.1 完整结构
- 现有 TabBar 不变(首页 tab 仍指向 pages/index/index)
- **零回归风险**
---
## Documentation Updated
| 文档 | 变更 |
|------|------|
| docs/JIRA_BACKLOG.md | P07 全部 27 个任务标记 ✅ |
| docs/STATUS.md | Phase 07 标记已完成 |
---
## Next Phase
**Phase 08: Like / Match / Block**
重点任务:
- P08-V11-T01: 验证 Activity 后新 Match Episode 兼容
- 完善推荐引擎(MatchEligibilityService 接入真实候选池)
- Home API 推荐数据填充
完成后输出 Phase 08 Completion Report,等待下一步指令。