feat(leisure): 新增闲情逸致模块与多项功能优化

本次提交完成多项核心更新:
1. 新增闲情逸致功能模块,包含时间线、收藏标注、季节主题等基础框架
2. 替换hive为社区维护的hive_ce包,修复依赖兼容问题
3. 统一替换"开发中"提示为"当前设备不支持",优化用户提示文案
4. 新增多项功能开关与特性标志,统一管理不可用功能提示
5. 完善用户账户洞察系统,新增头像审核中状态检测
6. 优化TTS语音朗读服务,修复Android端引擎初始化问题
7. 重构知识图谱缩放手势逻辑,解决缩放不跟手问题
8. 新增精灵头像组件,替换默认聊天头像样式
9. 新增外部链接跳转确认弹窗,提升使用安全性
10. 升级后端API接口,新增签到配置获取与补签积分规则动态读取
11. 完善多语言翻译覆盖率限制,非中文语言仅显示最高50%进度
12. 新增HTTP缓存拦截器,优化网络请求性能
13. 新增恢复出厂设置选项,完善数据管理功能

同时修复了多处代码细节问题:简化字符串拼接、优化布局代码、移除多余代码等。
This commit is contained in:
Developer
2026-05-27 08:06:54 +08:00
parent c44457f94c
commit 355191aaf6
144 changed files with 23600 additions and 1464 deletions

View File

@@ -0,0 +1,371 @@
# 闲情逸致 — 设计文档
> 创建时间: 2026-05-27
> 状态: 待确认
---
## 一、功能概述
**名称**: 闲情逸致
**描述**: 闲时与你立黄昏,灶前笑问粥可温
**入口**: InspirationPage灵感页会话列表新增会话条目
**核心**: 时间线布局,每日节点,左吃右玩,季节性花期/美食/景点推荐
---
## 二、页面结构
### 2.1 入口 — InspirationPage 会话条目
`ChatSessionNotifier._buildSessions()` 中新增系统会话:
```
id: 'leisure'
type: ChatSessionType.custom
emoji: '🌸'
name: '闲情逸致'
lastMessage: '闲时与你立黄昏,灶前笑问粥可温'
tag: 'NEW'
route: '/leisure'
```
### 2.2 主页面 — LeisureTimelinePage
**路由**: `/leisure`
**布局**: CupertinoPageScaffold + CustomScrollView
```
┌─────────────────────────────┐
│ AppBar │
│ ← 🌸 闲情逸致 🔍 ⚙️ │
│ 闲时与你立黄昏... │
├─────────────────────────────┤
│ [⇄] 固定交换按钮 │
├─────────────────────────────┤
│ │ │
│ ●────┼────● │
│ 日期 │ 节点 │
│ │ │
│ ┌─────┼─────┐ │
│ │ 吃 │ 玩 │ │
│ │ 卡片 │ 卡片 │ │
│ └─────┼─────┘ │
│ │ │
│ ═══ 今天 · 5月27日 ═══ │
│ │ │
│ ●今日节点 │
│ ┌─────┼─────┐ │
│ │ 吃 │ 玩 │ │
│ └─────┼─────┘ │
│ ┌─────┼─────┐ │
│ │ 吃 │ 玩 │ │
│ └─────┼─────┘ │
│ │ │
├─────────────────────────────┤
│ 底部标注筛选栏 │
│ 🌸花期 🦞美食 🏔️高海拔 ... │
└─────────────────────────────┘
```
**组件拆分**:
- `LeisureTimelinePage` — 主页面
- `LeisureTimelineAppBar` — 顶部导航栏
- `LeisureSwapButton` — 固定交换按钮
- `LeisureDateNode` — 日期节点组件
- `LeisureTodayDivider` — 今日分割线
- `LeisureCardRow` — 卡片行(左吃右玩)
- `LeisureCard` — 单张卡片
- `LeisureBottomFilterBar` — 底部筛选栏
- `LeisureSearchFab` — 外部搜索浮动按钮
### 2.3 设置页面 — LeisureSettingsPage
**路由**: `/leisure/settings`
```
┌─────────────────────────────┐
│ ← ⚙️ 闲情逸致设置 │
├─────────────────────────────┤
│ 数据统计卡片 (3列) │
│ 总节点 | 卡片数 | 已收藏 │
├─────────────────────────────┤
│ 显示设置 │
│ · 卡片大小 │
│ · 卡片圆角 (Slider) │
│ · 卡片样式 │
│ · 显示季节标签 (Toggle) │
│ · 显示日出日落 (Toggle) │
│ · 风险提示 (Toggle) │
├─────────────────────────────┤
│ 数据管理 │
│ · 更新数据 │
│ · 清除缓存 │
│ · 导出数据 │
│ · 数据源管理 │
├─────────────────────────────┤
│ [📮 提交收录] │
│ 此功能后续开发 │
└─────────────────────────────┘
```
### 2.4 卡片详情 — LeisureCardDetailSheet
点击时间线卡片后弹出可拖拽Sheet:
- 初始1/3屏可上拖至90%
- 顶部拖拽手柄 + 毛玻璃背景
- Hero区: 渐变背景 + 大emoji + 标题 + 季节标签
- 信息网格: 地点、海拔、日出日落、价格类型
- 风险提示横幅
- 操作按钮: 收藏笔记、分享卡片、外部搜索、添加标注
- 多选标注区: checkbox勾选后显示在卡片上
- 外部搜索: 百度/高德/大众点评/小红书/抖音
- 相关推荐: 同季节/同地区的其他卡片
### 2.5 分享卡片 — LeisureShareSheet
点击卡片「分享」按钮后:
1. 生成精美卡片图片3种样式可选
2. 呼出系统分享面板
**卡片样式**:
- 方案A: 渐变头图卡片(默认)
- 方案B: 图片卡片
- 方案C: 极简诗意卡片
---
## 三、数据模型
### 3.1 时间线节点
```dart
class LeisureNode {
final String date; // "2026-05-27"
final int month;
final int day;
final String weekday; // "星期三"
final bool isWeekend;
final String season; // spring/summer/autumn/winter
final String? sunrise; // "05:12"
final String? sunset; // "19:12"
final LeisureCards cards;
}
class LeisureCards {
final List<LeisureCard> food;
final List<LeisureCard> play;
}
```
### 3.2 卡片
```dart
class LeisureCard {
final String id;
final String title;
final String emoji;
final String description;
final String location;
final String province;
final int? altitude; // 海拔(米)
final String priceType; // free/paid/commercial/unknown
final String? priceNote;
final List<String> tags;
final List<String> riskWarnings;
final bool isFood; // true=吃, false=玩
}
```
### 3.3 用户标注
```dart
class LeisureBookmark {
final String cardId;
final bool isBookmarked;
final List<String> checkedItems; // 多选标注
final String? noteId; // 关联笔记ID
}
```
### 3.4 设置
```dart
class LeisureSettings {
final String cardSize; // small/standard/large
final double cardRadius; // 4-24
final String cardStyle; // exquisite/flat/photo
final bool showSeasonLabel;
final bool showSunInfo;
final bool showRiskWarning;
final bool isSwapped; // 左右是否交换
final List<String> activeFilters; // 激活的筛选标签
final String shareCardStyle; // gradient/photo/minimal
final String defaultOpenPosition; // today/nearest/lastViewed
final String infoDensity; // compact/standard/spacious
final String riskLevel; // highOnly/all/off
final String updateFrequency; // always/daily/manual
}
```
---
## 四、状态管理
### Provider 设计
```dart
// 时间线数据
leisureTimelineProvider NotifierProvider<LeisureTimelineNotifier, LeisureTimelineState>
// 设置
leisureSettingsProvider NotifierProvider<LeisureSettingsNotifier, LeisureSettingsState>
// 收藏/标注
leisureBookmarkProvider NotifierProvider<LeisureBookmarkNotifier, LeisureBookmarkState>
```
### 数据流
```
JSON本地文件 → LeisureTimelineService.parse() → LeisureTimelineNotifier
LeisureTimelineState
LeisureTimelinePage (ConsumerWidget)
```
---
## 五、关键交互逻辑
### 5.1 打开页面定位今日
每次打开时间线页面,自动滚动到今日节点位置。使用 `ScrollController` + `GlobalKey` 定位。
### 5.2 交换左右位置
顶部固定按钮,点击后交换吃/玩卡片位置。通过 `isSwapped` 状态控制 `FlexDirection`
### 5.3 收藏到笔记
点击卡片「收藏」按钮 → 写入 `LeisureBookmark` → 可选关联到笔记模块。
### 5.4 分享卡片
点击「分享」→ 渲染 `RepaintBoundary` 生成图片 → 呼出 `Share.shareFiles()`
### 5.5 外部搜索
点击搜索按钮 → 弹出 BottomSheet → 列出可跳转的应用(百度/高德/大众点评/小红书等)。
### 5.6 底部多选标注
底部筛选栏勾选后,卡片内显示对应勾选项目。勾选状态持久化到本地。
### 5.7 风险提示
云南边境、西部新疆/西藏/内蒙古等地区自动标注:
- 高海拔 (>3000m): 🔴 高海拔·高原反应
- 边境地区: ⚠️ 边境地区·注意安全
- 极寒地区: ❄️ 极寒·防寒装备
---
## 六、主题适配
### 6.1 动态主题
所有颜色使用 `AppTheme.ext(context)` 令牌,不硬编码。
### 6.2 季节色
| 季节 | 颜色 | 使用场景 |
|------|------|---------|
| 春 | #4ECDC4 (teal) | 日期节点、季节标签 |
| 夏 | #FF6B6B (red) | 日期节点、季节标签 |
| 秋 | #F59E0B (amber) | 日期节点、季节标签 |
| 冬 | #3B82F6 (blue) | 日期节点、季节标签 |
### 6.3 周末强调色
周六/周日的星期文字使用 `ext.accent` 强调色。
### 6.4 动态圆角
卡片圆角跟随 `AppRadius.of(context)` 动态调整。
---
## 七、文件结构
```
features/tool_center/leisure/
├── models/
│ ├── leisure_node.dart # 时间线节点模型
│ ├── leisure_card.dart # 卡片模型
│ └── leisure_settings.dart # 设置模型
├── presentation/
│ ├── pages/
│ │ ├── leisure_timeline_page.dart # 主时间线页面
│ │ └── leisure_settings_page.dart # 设置页面
│ └── widgets/
│ ├── leisure_app_bar.dart # 顶部导航栏
│ ├── leisure_swap_button.dart # 交换按钮
│ ├── leisure_date_node.dart # 日期节点
│ ├── leisure_today_divider.dart # 今日分割线
│ ├── leisure_card_row.dart # 卡片行
│ ├── leisure_card.dart # 单张卡片
│ ├── leisure_bottom_filter.dart # 底部筛选栏
│ ├── leisure_search_fab.dart # 外部搜索FAB
│ └── leisure_share_sheet.dart # 分享卡片Sheet
├── providers/
│ ├── leisure_timeline_provider.dart # 时间线状态
│ ├── leisure_settings_provider.dart # 设置状态
│ └── leisure_bookmark_provider.dart # 收藏/标注状态
└── services/
└── leisure_data_service.dart # JSON解析+数据服务
```
---
## 八、路由注册
`app_routes.dart` 新增:
```dart
static const String leisure = '/leisure';
static const String leisureSettings = '/leisure/settings';
```
`content_routes.dart` 或新建 `leisure_routes.dart` 注册路由。
---
## 九、数据来源
数据架构: 按月拆分 + 增量合并 + Supabase服务器推送
本地数据:
- assets/data/leisure/index.json — 索引文件(可用年月、季节颜色、风险等级等)
- assets/data/leisure/2026_01.json ~ 2026_12.json — 12个月份数据文件
- assets/data/leisure/patch_*.json — 增量补丁文件
增量机制:
- patch文件支持 add新增节点和 update更新卡片字段操作
- 服务器通过Supabase推送增量JSON客户端合并到本地月度文件
- 支持多年复用2027年数据只需创建 2027_01.json ~ 2027_12.json
当前数据:
- 67个核心节点覆盖全年花期/美食/景点/观星/观鸥/温泉/冰雪
- 2个增量补丁示例文件
---
## 十、待确认事项
1. ✅ 时间线布局: 中轴线对称
2. ✅ 卡片风格: 精致卡片(圆角+阴影+毛玻璃)
3. ✅ 数据来源: 预置JSON
4. ❓ 分享卡片样式偏好: A渐变 / B图片 / C极简
5. ❓ 外部搜索支持哪些应用?
6. ❓ 是否需要离线缓存支持?

View File

@@ -0,0 +1,156 @@
# 闲情逸致 — 开发文档 & 归档清单
> 创建时间: 2026-05-27
> 状态: 开发中
> 负责人: AI Coder
> 审计要求: 每完成一项必须更新状态,禁止偷工减料
---
## 一、归档文件清单
### 1.1 HTML 原型文件4个
| 文件 | 路径 | 行数 | 状态 | 对应Flutter页面 |
|------|------|------|------|----------------|
| 主时间线 | `docs/mockups/leisure_timeline.html` | 1371 | ✅ 已确认 | LeisureTimelinePage |
| 设置页面 | `docs/mockups/leisure_settings.html` | 714 | ✅ 已确认 | LeisureSettingsPage |
| 分享卡片 | `docs/mockups/leisure_share_card.html` | 476 | ✅ 已确认 | LeisureShareSheet |
| 卡片详情Sheet | `docs/mockups/leisure_card_detail.html` | 1518 | ✅ 已确认 | LeisureCardDetailSheet |
### 1.2 JSON 数据文件15个
| 文件 | 路径 | 节点数 | 状态 |
|------|------|--------|------|
| 索引文件 | `assets/data/leisure/index.json` | - | ✅ |
| 1月数据 | `assets/data/leisure/2026_01.json` | 4 | ✅ |
| 2月数据 | `assets/data/leisure/2026_02.json` | 5 | ✅ |
| 3月数据 | `assets/data/leisure/2026_03.json` | 5 | ✅ |
| 4月数据 | `assets/data/leisure/2026_04.json` | 5 | ✅ |
| 5月数据 | `assets/data/leisure/2026_05.json` | 6 | ✅ |
| 6月数据 | `assets/data/leisure/2026_06.json` | 5 | ✅ |
| 7月数据 | `assets/data/leisure/2026_07.json` | 6 | ✅ |
| 8月数据 | `assets/data/leisure/2026_08.json` | 5 | ✅ |
| 9月数据 | `assets/data/leisure/2026_09.json` | 6 | ✅ |
| 10月数据 | `assets/data/leisure/2026_10.json` | 6 | ✅ |
| 11月数据 | `assets/data/leisure/2026_11.json` | 6 | ✅ |
| 12月数据 | `assets/data/leisure/2026_12.json` | 7 | ✅ |
| 增量补丁示例 | `assets/data/leisure/patch_2026_05_27.json` | - | ✅ |
| 服务器推送示例 | `assets/data/leisure/patch_2026_06_server.json` | - | ✅ |
### 1.3 设计文档1个
| 文件 | 路径 | 状态 |
|------|------|------|
| 设计文档 | `docs/superpowers/specs/2026-05-27-leisure-design.md` | ✅ |
---
## 二、开发任务清单
### Phase 1: 数据层
| # | 任务 | 文件 | 验收标准 | 状态 |
|---|------|------|---------|------|
| 1.1 | LeisureNode 模型 | `models/leisure_node.dart` | freezed模型含date/month/day/weekday/isWeekend/season/sunrise/sunset/cards | ⬜ |
| 1.2 | LeisureCard 模型 | `models/leisure_card.dart` | freezed模型含id/title/emoji/description/location/province/altitude/priceType/tags/riskWarnings/isFood | ⬜ |
| 1.3 | LeisureSettings 模型 | `models/leisure_settings.dart` | 含cardSize/cardRadius/cardStyle/showSeasonLabel/showSunInfo/showRiskWarning/isSwapped/activeFilters/shareCardStyle/defaultOpenPosition/infoDensity/riskLevel/updateFrequency | ⬜ |
| 1.4 | LeisureBookmark 模型 | `models/leisure_bookmark.dart` | 含cardId/isBookmarked/checkedItems/noteId | ⬜ |
| 1.5 | LeisureIndex 模型 | `models/leisure_index.dart` | 含availableYears/availableMonths/seasonColors/riskLevels/priceTypes/serverSync | ⬜ |
| 1.6 | LeisurePatch 模型 | `models/leisure_patch.dart` | 含type/operations(op=add/update)/targetYear/targetMonth | ⬜ |
| 1.7 | 数据服务 | `services/leisure_data_service.dart` | 加载index.json+月度JSON+增量合并+Supabase拉取 | ⬜ |
### Phase 2: 状态层
| # | 任务 | 文件 | 验收标准 | 状态 |
|---|------|------|---------|------|
| 2.1 | 时间线Provider | `providers/leisure_timeline_provider.dart` | NotifierProvider加载月度数据支持按月懒加载 | ⬜ |
| 2.2 | 设置Provider | `providers/leisure_settings_provider.dart` | NotifierProvider持久化到KvStorage | ⬜ |
| 2.3 | 收藏Provider | `providers/leisure_bookmark_provider.dart` | NotifierProvider持久化到Hive | ⬜ |
### Phase 3: 页面层
| # | 任务 | 文件 | 验收标准 | 状态 |
|---|------|------|---------|------|
| 3.1 | 主时间线页面 | `pages/leisure_timeline_page.dart` | CupertinoPageScaffold+CustomScrollView自动滚动到今日 | ⬜ |
| 3.2 | AppBar组件 | `widgets/leisure_app_bar.dart` | 返回按钮+标题+副标题+搜索按钮+设置按钮 | ⬜ |
| 3.3 | 交换按钮 | `widgets/leisure_swap_button.dart` | 固定位置,点击交换左右卡片 | ⬜ |
| 3.4 | 日期节点 | `widgets/leisure_date_node.dart` | 中轴线圆点+日期+星期+季节标签,今日高亮脉冲 | ⬜ |
| 3.5 | 今日分割线 | `widgets/leisure_today_divider.dart` | 渐变线+今日文字 | ⬜ |
| 3.6 | 卡片行 | `widgets/leisure_card_row.dart` | 左吃右玩双列,支持交换 | ⬜ |
| 3.7 | 单张卡片 | `widgets/leisure_card.dart` | 精致卡片风格,圆角+阴影+季节色+风险提示+价格标签+操作按钮 | ⬜ |
| 3.8 | 底部筛选栏 | `widgets/leisure_bottom_filter.dart` | 多选Chip筛选标注 | ⬜ |
| 3.9 | 外部搜索FAB | `widgets/leisure_search_fab.dart` | 浮动按钮,弹出搜索面板 | ⬜ |
| 3.10 | 卡片详情Sheet | `widgets/leisure_card_detail_sheet.dart` | 可拖拽Sheet1/3→90%Hero区+信息网格+操作按钮+标注+外部搜索+相关推荐 | ⬜ |
| 3.11 | 设置页面 | `pages/leisure_settings_page.dart` | 统计卡片+显示设置+数据管理+提交收录 | ⬜ |
| 3.12 | 分享卡片 | `widgets/leisure_share_sheet.dart` | 渐变头图卡片+系统分享 | ⬜ |
### Phase 4: 集成层
| # | 任务 | 文件 | 验收标准 | 状态 |
|---|------|------|---------|------|
| 4.1 | 路由注册 | `core/router/app_routes.dart` + `content_routes.dart` | /leisure + /leisure/settings | ⬜ |
| 4.2 | 入口会话 | `chat_session_provider.dart` | 新增leisure系统会话条目 | ⬜ |
| 4.3 | Asset注册 | `pubspec.yaml` | assets/data/leisure/ 目录 | ⬜ |
| 4.4 | CHANGELOG | `CHANGELOG.md` | 记录功能新增 | ⬜ |
---
## 三、验收标准
### 3.1 功能验收
| 功能 | 验收方法 | 状态 |
|------|---------|------|
| 灵感页新增"闲情逸致"会话条目 | 可见且可点击 | ⬜ |
| 点击跳转到时间线页面 | 路由正确跳转 | ⬜ |
| 时间线显示今日+明天+后天节点 | 自动定位到今日 | ⬜ |
| 今日分割线 | 可见且样式正确 | ⬜ |
| 左吃右玩双列卡片 | 布局正确 | ⬜ |
| 交换按钮切换左右位置 | 功能正常 | ⬜ |
| 周末星期显示强调色 | 颜色正确 | ⬜ |
| 季节色标签 | 每季不同颜色 | ⬜ |
| 风险提示 | 高海拔/边境/极寒正确标注 | ⬜ |
| 价格标签 | 免费/付费/商业化/未知 | ⬜ |
| 卡片点击弹出详情Sheet | 可拖拽Sheet | ⬜ |
| 收藏到笔记 | 功能正常 | ⬜ |
| 分享卡片 | 生成图片+系统分享 | ⬜ |
| 外部搜索 | 跳转百度/高德/大众点评等 | ⬜ |
| 底部多选标注 | 勾选后卡片内显示 | ⬜ |
| 设置页面 | 所有选项可用 | ⬜ |
| 动态主题 | 日间/夜间/AMOLED正确 | ⬜ |
| 动态圆角 | 跟随系统设置 | ⬜ |
| 增量数据合并 | patch文件正确合并 | ⬜ |
| 服务器数据拉取 | Supabase拉取+合并 | ⬜ |
### 3.2 代码质量验收
| 检查项 | 标准 | 状态 |
|--------|------|------|
| 空指针安全 | 所有可空字段做空判断 | ⬜ |
| 主题令牌 | 无硬编码颜色/圆角/间距 | ⬜ |
| 文件头注释 | 创建时间/更新时间/名称/作用 | ⬜ |
| 方法注释 | 关键方法有注释 | ⬜ |
| iOS风格 | 优先Cupertino组件 | ⬜ |
| 文件行数 | 不超过1000行 | ⬜ |
| flutter analyze | 无error | ⬜ |
---
## 四、开发日志
| 日期 | 任务 | 状态 | 备注 |
|------|------|------|------|
| 2026-05-27 | 设计阶段完成 | ✅ | HTML原型+JSON数据+设计文档 |
| 2026-05-27 | 开发文档创建 | ✅ | 本文档 |
| 2026-05-27 | Phase 1 数据层 | 🔄 | 进行中 |
---
## 五、审计检查点
- [ ] Phase 1 完成后审计: 模型是否完整服务是否可加载JSON
- [ ] Phase 2 完成后审计: Provider是否正确管理状态
- [ ] Phase 3 完成后审计: 页面是否与HTML原型一致
- [ ] Phase 4 完成后审计: 集成是否完整,路由是否正确
- [ ] 最终审计: 全部验收标准通过