7.1 KiB
7.1 KiB
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/nonechk_banner_audience_scope: 仅允许 all/onboarding/searching/getting_to_know/successfulchk_banner_status: 仅允许 draft/scheduled/active/inactive/expired- 查询索引:
idx_home_banners_displayWHERE 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
- V019 SQL 语法正确,IF NOT EXISTS 幂等
- home_banners 表字段与 V1.1 数据库设计文档一致
- service_locations 表支持坐标/开放时间/联系方式
- HomeApplicationService 编译通过
- HomeController 正确提取 JWT userId
- BannerMapper 使用 @Select 注解(非 XML)
- Miniapp index.ts 使用 commonjs require(与现有 stores 一致)
- 5种用户状态均有对应渲染分支
- navigationStyle=custom 隐藏原生导航栏
Permission & Security Verification
| 约束 | 实现方式 |
|---|---|
| Banner 不任意外链 | target_type 约束枚举,不含 arbitrary_url |
| 8核心入口顺序固定 | 前端硬编码数组,无 reorder API |
| Banner 仅运营可见 | Controller 使用 Bearer token 鉴权 |
| 未登录用户仍可访问 /home | 返回基础结构(userState=unknown, recommendations=[]) |
Known Issues
- Banner 图片 URL: image_file_id 需对接 PhotoService 生成 signed URL,当前前端展示原始 ID(非阻断问题,后续 Phase 19 完善)
- service_locations 无 seed 数据: 当前返回默认值,Phase 19 运营后台创建真实记录
- recommendations 为空: Phase 08 Like/Match 实现后推荐数据将填充
- 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,等待下一步指令。