# 简记 Memo - 项目重构规划文档
> 本文档面向前后端开发人员,统一规划「复盘、心情、待办、账单」四大核心模块的业务功能、接口定义与 UI 设计规范。
> 版本:v2.0
> 日期:2026-07-28
---
## 一、项目概述与现状分析
### 1.1 产品定位
「简记 Memo」是一款轻量级个人生活记录小程序,聚焦每日四大维度:**待办事项、账单收支、心情记录、每日复盘**。通过 AI 智能识别降低记录门槛,结合成长激励体系提升用户粘性。
### 1.2 现有架构问题
| 问题类别 | 具体表现 | 影响 |
|---------|---------|------|
| **数据层** | 复盘模块仅使用本地 `uni.setStorageSync`,未接入后端 | 数据无法跨设备同步,易丢失 |
| **接口层** | 首页需并发调用 3+ 接口获取当日数据 | 加载慢、代码冗余 |
| **UI 层** | 四个核心页面头部、卡片、按钮、弹窗样式均不统一 | 体验割裂,维护成本高 |
| **交互层** | 日历组件在首页/复盘/待办中重复实现 | 代码冗余,行为不一致 |
| **交互层** | 列表滑动操作在待办和账单中实现方式不同 | 用户学习成本高 |
### 1.3 重构目标
1. **数据统一**:复盘模块全面接入后端,四模块数据全部云端同步
2. **接口聚合**:提供首页聚合接口,减少请求次数
3. **UI 统一**:制定设计规范,四模块页面风格、布局、交互高度一致
4. **组件复用**:抽取公共组件(日历、列表项、筛选器、模态框、空状态)
5. **操作丝滑**:统一动画曲线、过渡时长、触摸反馈
---
## 二、四大模块业务功能定义
### 2.1 模块总览
```
┌─────────────────────────────────────────────────────────────┐
│ 首页 (Dashboard) │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ 待办 │ │ 账单 │ │ 心情 │ │ 复盘 │ 快捷入口 │
│ │ 3/5 │ │ +120 │ │ 😊 │ │ 已记录 │ │
│ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │
│ ───────────────────────────────────────────────────────── │
│ AI 智能输入框:"开会花了50块,下午要写周报,心情不错" │
│ ───────────────────────────────────────────────────────── │
│ 今日概览:完成进度环 + 最近待办 + 最近账单 │
└─────────────────────────────────────────────────────────────┘
│
┌─────────┬─────────┼─────────┬─────────┐
▼ ▼ ▼ ▼ ▼
┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐
│ 待办 │ │ 心情 │ │ 账单 │ │ 复盘 │ │ 我的 │
│ 列表 │ │ 记录 │ │ 明细 │ │ 编辑 │ │ 中心 │
└──────┘ └──────┘ └──────┘ └──────┘ └──────┘
```
### 2.2 待办模块(Todo)
**核心功能**:
- 按日期创建、编辑、删除待办事项
- 支持优先级(高/中/低)、分类(工作/生活/学习)、时间段设置
- 支持批量选择与批量操作(完成/删除)
- 按时间范围筛选(今日/本周/本月/自定义)
- 按状态筛选(全部/待办/已完成)
- 日历视图展示任务分布(有无任务、完成状态标记)
- 关键词搜索
**新增功能规划**:
- 待办重复规则(每日/每周/每月重复)
- 待办提醒推送(依赖服务端定时任务)
### 2.3 心情模块(Mood)
**核心功能**:
- 每日选择心情 emoji(20 种表情)
- 文字记录当日心情与感悟(200 字以内)
- AI 心语小笺:根据心情生成治愈文案并生成分享卡片
- 心情日历:按月查看心情分布(已有 `moodCalendar` 页面)
**新增功能规划**:
- 心情周报/月报统计(情绪趋势曲线 + 高频心情标签)
- 心情标签词云
### 2.4 账单模块(Bill)
**核心功能**:
- 记录支出/收入账单(金额、分类、渠道、备注、日期)
- 分类管理(预设 23 个分类 + 自定义分类)
- 月度预算设置与进度追踪
- 多维度筛选(时间:今日/本周/本月/上月/本年/自定义;类型:全部/支出/收入)
- 分类统计(支出/收入占比、横向滚动卡片)
- 账单导出
**新增功能规划**:
- 年度收支趋势图
- 自定义分类支持图标与颜色完整自定义
### 2.5 复盘模块(Review)
**核心功能**:
- 按日期进行每日复盘
- 采用 **KPT 复盘法**:Keep(保持)、Problem(问题)、Try(尝试)
- 复盘历史列表查看
- 复盘内容搜索
> **设计决策**:仅保留 KPT 一种复盘方法。理由:KPT 更简洁实用,3 个维度覆盖日常复盘需求,填写门槛低,适合小程序场景。GRAI 法(4 维度)更适合企业级项目复盘,个人日记场景偏重。
**重要改造点**:
- 当前复盘数据仅保存在本地 Storage,**已全面接入后端接口**
- 新增复盘历史列表页
- API 响应兼容嵌套格式 `{kpt: {keep, problem, try}}` 和扁平格式 `{keep, problem, try}`
---
## 三、接口文档
### 3.1 接口设计原则
1. 统一请求方式:`POST`
2. 统一响应格式:
```json
{
"code": 200,
"message": "success",
"data": { ... }
}
```
3. 日期格式:`YYYY-MM-DD`
4. 月份格式:`YYYY-MM`
### 3.2 现有接口保留清单
以下接口已稳定运行,本次规划**完全保留**,仅做部分参数优化建议:
#### 用户模块
| 接口 | 路径 | 说明 |
|-----|------|------|
| 微信登录 | `POST /user/login` | 保留 |
| 获取用户信息 | `POST /user/info` | 保留 |
| 更新用户信息 | `POST /user/edit` | 保留 |
| 退出登录 | `POST /user/logout` | 保留 |
| 获取用户配置 | `POST /user/config/info` | 保留 |
| 编辑用户配置 | `POST /user/config/edit` | 保留 |
| 获取头像列表 | `POST /user/avatar/list` | 保留 |
#### 待办模块
| 接口 | 路径 | 说明 |
|-----|------|------|
| 添加待办 | `POST /todo/add` | 保留 |
| 获取待办列表 | `POST /todo/list` | 保留,建议支持 `start_date` + `end_date` 范围查询 |
| 删除待办 | `POST /todo/delete` | 保留 |
| 完成/取消完成 | `POST /todo/done` | 保留 |
| 编辑待办 | `POST /todo/edit` | 保留 |
#### 账单模块
| 接口 | 路径 | 说明 |
|-----|------|------|
| 添加账单 | `POST /bill/add` | 保留 |
| 编辑账单 | `POST /bill/edit` | 保留 |
| 获取账单列表 | `POST /bill/list` | 保留,建议支持 `start_time` + `end_time` |
| 删除账单 | `POST /bill/delete` | 保留 |
| 获取月度统计 | `POST /bill/stat/month` | 保留 |
| 获取分类统计 | `POST /bill/stat/category` | 保留 |
| 导出账单 | `POST /bill/export` | 保留 |
#### 预算模块
| 接口 | 路径 | 说明 |
|-----|------|------|
| 获取月度预算 | `POST /budget/get` | 保留 |
| 设置月度预算 | `POST /budget/set` | 保留 |
| 删除月度预算 | `POST /budget/delete` | 保留 |
#### 分类管理模块
| 接口 | 路径 | 说明 |
|-----|------|------|
| 获取自定义分类 | `POST /category/list` | 保留 |
| 添加自定义分类 | `POST /category/add` | 保留 |
| 删除自定义分类 | `POST /category/delete` | 保留 |
#### 心情模块
| 接口 | 路径 | 说明 |
|-----|------|------|
| 获取某天心情 | `POST /mood/get` | 保留 |
| 保存心情 | `POST /mood/save` | 保留 |
| 获取心情列表 | `POST /mood/list` | 保留 |
| 删除心情 | `POST /mood/delete` | 保留 |
| 获取 AI 心情结果 | `POST /ai/mood/result` | 保留 |
| 重新生成 AI 心情 | `POST /ai/mood/regenerate` | 保留 |
#### 成长系统模块
| 接口 | 路径 | 说明 |
|-----|------|------|
| 获取成长信息 | `POST /growth/info` | 保留 |
| 获取成就列表 | `POST /growth/achievements` | 保留 |
| 获取成长规则 | `POST /growth/rules` | 保留 |
#### AI 模块
| 接口 | 路径 | 说明 |
|-----|------|------|
| AI 智能分类 | `POST /ai/classify` | 保留 |
#### 邮箱/安全模块
| 接口 | 路径 | 说明 |
|-----|------|------|
| 获取图形验证码 | `POST /captcha/digit` | 保留 |
| 发送邮箱验证码 | `POST /user/email/code` | 保留 |
| 设置/修改邮箱 | `POST /user/email/set` | 保留 |
| 邮箱登录 | `POST /user/email/login` | 保留 |
| 注册 | `POST /user/register` | 保留 |
| 重置密码 | `POST /user/reset-password` | 保留 |
| 修改密码 | `POST /user/change-password` | 保留 |
| 检查邮箱存在 | `POST /user/email/exists` | 保留 |
| 绑定微信 | `POST /user/bind-wechat` | 保留 |
| 检查微信绑定 | `POST /user/check-wechat` | 保留 |
---
### 3.3 复盘模块接口(已全面接入后端)
复盘模块已从本地 `uni.setStorageSync` 迁移至后端接口。前端同时兼容嵌套格式和扁平格式的响应数据。
#### 3.3.1 保存复盘
```http
POST /review/save
```
**请求参数**:
| 字段 | 类型 | 必填 | 说明 |
|-----|------|------|------|
| date | string | 是 | 日期 YYYY-MM-DD |
| method | string | 是 | 复盘方法:固定为 `kpt` |
| kpt | object | 是 | KPT 数据 |
| kpt.keep | string | 否 | 保持 |
| kpt.problem | string | 否 | 问题 |
| kpt.try | string | 否 | 尝试 |
> 注:GRAI 法已移除,method 固定传 `kpt`。后端保留 `grai` 字段兼容历史数据。
**响应数据**:
```json
{
"id": "review_123",
"date": "2026-07-28",
"method": "kpt",
"kpt": {
"keep": "今天按时完成了所有待办",
"problem": "下午注意力不集中",
"try": "明天尝试番茄工作法"
},
"created_at": "2026-07-28T22:00:00Z",
"updated_at": "2026-07-28T22:00:00Z"
}
```
> **兼容说明**:前端同时支持后端返回嵌套格式 `{kpt: {keep, problem, try}}` 和扁平格式 `{keep, problem, try}`,确保接口对接顺畅。
#### 3.3.2 获取单日复盘
```http
POST /review/get
```
**请求参数**:
| 字段 | 类型 | 必填 | 说明 |
|-----|------|------|------|
| date | string | 是 | 日期 YYYY-MM-DD |
**响应数据**:同保存复盘响应,无数据时返回 `null`
#### 3.3.3 获取复盘列表
```http
POST /review/list
```
**请求参数**:
| 字段 | 类型 | 必填 | 说明 |
|-----|------|------|------|
| startDate | string | 否 | 开始日期 YYYY-MM-DD |
| endDate | string | 否 | 结束日期 YYYY-MM-DD |
| method | string | 否 | 筛选方法:`kpt`(历史可能含 `grai` 数据) |
| keyword | string | 否 | 搜索关键词(搜索 keep/problem/try/goal 等字段) |
| page | number | 否 | 页码,默认 1 |
| pageSize | number | 否 | 每页条数,默认 20 |
**响应数据**:
```json
{
"list": [
{
"id": "review_123",
"date": "2026-07-28",
"method": "kpt",
"summary": "今天按时完成了所有待办...",
"created_at": "2026-07-28T22:00:00Z"
}
],
"total": 100,
"page": 1,
"pageSize": 20
}
```
#### 3.3.4 删除复盘
```http
POST /review/delete
```
**请求参数**:
| 字段 | 类型 | 必填 | 说明 |
|-----|------|------|------|
| id | string | 是 | 复盘 ID |
---
### 3.4 新增接口
#### 3.4.1 首页聚合数据接口(推荐优先实现)
**目的**:替代首页并发请求 `getTodoList` + `getBillList` + `getMoodByDate`,一接口返回当日全部概况。
```http
POST /dashboard/daily
```
**请求参数**:
| 字段 | 类型 | 必填 | 说明 |
|-----|------|------|------|
| date | string | 是 | 日期 YYYY-MM-DD,不传默认今天 |
**响应数据**:
```json
{
"date": "2026-07-28",
"todo": {
"total": 5,
"done": 3,
"undone": 2,
"list": [
{ "id": "1", "title": "写周报", "done": 0, "priority": 1, "category": "work" }
]
},
"bill": {
"expend": 128.5,
"income": 0,
"balance": -128.5,
"list": [
{ "id": "1", "type": 1, "money": 28.5, "cate": "food", "note": "午餐" }
]
},
"mood": {
"recorded": true,
"emoji": "😊",
"content": "今天心情不错,工作顺利",
"ai_generated": true,
"ai_text": "阳光正好,微风不燥..."
},
"review": {
"recorded": true,
"method": "kpt"
},
"growth": {
"todayExp": 45,
"maxDailyExp": 120,
"streakDays": 7
}
}
```
#### 3.4.2 待办统计接口
```http
POST /todo/stat
```
**请求参数**:
| 字段 | 类型 | 必填 | 说明 |
|-----|------|------|------|
| start_date | string | 是 | 开始日期 |
| end_date | string | 是 | 结束日期 |
**响应数据**:
```json
{
"total": 50,
"done": 42,
"undone": 8,
"completion_rate": 84.0,
"by_category": {
"work": { "total": 20, "done": 18 },
"life": { "total": 20, "done": 16 },
"study": { "total": 10, "done": 8 }
},
"by_priority": {
"1": { "total": 10, "done": 9 },
"2": { "total": 25, "done": 21 },
"3": { "total": 15, "done": 12 }
}
}
```
#### 3.4.3 心情统计接口
```http
POST /mood/stat
```
**请求参数**:
| 字段 | 类型 | 必填 | 说明 |
|-----|------|------|------|
| month | string | 是 | 月份 YYYY-MM |
**响应数据**:
```json
{
"month": "2026-07",
"total_days": 28,
"recorded_days": 25,
"mood_distribution": {
"😊": 10,
"😌": 8,
"😔": 4,
"😤": 2,
"😴": 1
},
"weekly_trend": [
{ "week": "W1", "avg_score": 4.2 },
{ "week": "W2", "avg_score": 3.8 },
{ "week": "W3", "avg_score": 4.5 },
{ "week": "W4", "avg_score": 4.0 }
],
"top_phrases": ["开心", "平静", "工作顺利"]
}
```
#### 3.4.4 账单聚合统计接口(整合现有接口)
**目的**:将 `getMonthStat` + `getCateStat` 整合为一个更灵活的统计接口。
```http
POST /bill/stat/aggregate
```
**请求参数**:
| 字段 | 类型 | 必填 | 说明 |
|-----|------|------|------|
| start_date | string | 是 | 开始日期 |
| end_date | string | 是 | 结束日期 |
| type | number | 否 | 类型筛选 1-支出 2-收入,不传则全部 |
**响应数据**:
```json
{
"total_expend": 3250.5,
"total_income": 8000.0,
"balance": 4749.5,
"budget": {
"amount": 5000,
"used": 3250.5,
"remaining": 1749.5,
"progress": 65.0
},
"by_category": [
{
"cate": "food",
"label": "餐饮",
"icon": "🍚",
"color": "#ff6b6b",
"expend": 1200,
"income": 0,
"expend_rate": 36.9,
"income_rate": 0
}
],
"by_channel": [
{ "channel": "wechat", "label": "微信", "amount": 2000 }
],
"daily_trend": [
{ "date": "2026-07-01", "expend": 100, "income": 0 },
{ "date": "2026-07-02", "expend": 50, "income": 8000 }
]
}
```
---
### 3.5 接口整合与废弃建议
| 现有接口 | 建议 | 说明 |
|---------|------|------|
| `POST /bill/stat/month` | **保留但标记为兼容** | 建议前端逐步迁移到 `/bill/stat/aggregate` |
| `POST /bill/stat/category` | **保留但标记为兼容** | 同上 |
| `POST /review/save` | **修复接入** | 后端需确保接口可用,前端需替换本地存储逻辑 |
| `POST /review/get` | **修复接入** | 同上 |
| `POST /review/list` | **修复接入** | 同上,前端需新增复盘列表页 |
| `POST /review/delete` | **修复接入** | 同上 |
---
## 四、统一 UI 设计规范
### 4.1 设计原则
1. **温暖自然**:沿用现有暖陶/抹茶/暮蓝等主题色系,保持低饱和度、手作感
2. **统一间距**:建立 4rpx 基栅格,所有间距为 4 的倍数
3. **统一圆角**:卡片 20rpx,按钮 14rpx,标签 12rpx,头像/图标 16rpx
4. **统一阴影**:仅卡片使用阴影 `0 8rpx 24rpx ${shadowLight}`,避免过度层级
5. **操作反馈**:所有可点击元素添加 `:active` 态,缩放 0.96-0.98,过渡 0.2s
### 4.2 页面布局骨架(四模块统一)
所有核心模块页面采用统一的 **三段式布局**:
```
┌─────────────────────────────────────┐
│ Page Header (固定高度 ~120rpx) │
│ ┌──────┬──────────────┬────────┐ │
│ │ 返回 │ 标题+日期 │ 操作Btn │ │
│ └──────┴──────────────┴────────┘ │
├─────────────────────────────────────┤
│ Filter Bar (可选,固定或吸顶) │
│ [全部][今日][本周][本月] ... │
├─────────────────────────────────────┤
│ │
│ Main Content (scroll-view) │
│ ┌─────────────────────────────┐ │
│ │ Stat Cards 统计卡片 │ │
│ └─────────────────────────────┘ │
│ ┌─────────────────────────────┐ │
│ │ Content List / Form │ │
│ └─────────────────────────────┘ │
│ │
├─────────────────────────────────────┤
│ Footer Action (固定底部) │
│ ┌─────────────────────────────┐ │
│ │ [ 保存 / 添加 / 提交 ] │ │
│ └─────────────────────────────┘ │
└─────────────────────────────────────┘
```
### 4.3 色彩规范(基于现有主题系统)
沿用 `utils/theme.js` 中的 `THEME_PRESETS`,确保所有页面 100% 使用 `themeConfig` 绑定,禁止硬编码颜色。
| 用途 | 主题变量 | 默认值(暖陶) |
|-----|---------|--------------|
| 页面背景 | `themeConfig.bgColor` | `#FAF6F0` |
| 卡片背景 | `themeConfig.cardBgColor` | `#FFFCF8` |
| 主文本 | `themeConfig.textPrimary` | `#3D3630` |
| 次要文本 | `themeConfig.textSecondary` | `#7A7066` |
| 禁用文本 | `themeConfig.textDisabled` | `#B0A89E` |
| 主题色 | `themeConfig.primaryColor` | `#C68E3F` |
| 辅助色 | `themeConfig.secondaryColor` | `#4A9E7F` |
| 成功/收入 | `themeConfig.successColor` | `#5B9E6E` |
| 危险/支出 | `themeConfig.dangerColor` | `#C75B4A` |
| 警告 | `themeConfig.warningColor` | `#D4A24A` |
| 边框 | `themeConfig.borderColor` | `#E8E2DA` |
| 轻边框 | `themeConfig.borderLight` | `#F2EDE6` |
| 渐变按钮 | `themeConfig.gradientSoft` | `linear-gradient(135deg, #C68E3F, #D4AA60)` |
| 阴影轻 | `themeConfig.shadowLight` | `rgba(61,54,48,0.04)` |
### 4.4 字体规范
| 元素 | 字号 | 字重 | 行高 |
|-----|------|------|------|
| 页面大标题 | 36rpx | 700 | 1.2 |
| 页面副标题/日期 | 24rpx | 500 | 1.4 |
| 卡片标题 | 30rpx | 700 | 1.3 |
| 正文内容 | 28rpx | 400 | 1.6 |
| 标签/辅助文字 | 22rpx | 500 | 1.4 |
| 金额数字 | 34rpx | 700 | 1.0 |
| 按钮文字 | 32rpx | 600 | 1.0 |
### 4.5 公共组件规范
#### 4.5.1 页面头部(PageHeader)
```vue
```
**样式规范**:
- 高度:自适应,内边距 `24rpx 36rpx`
- 顶部安全区:`padding-top: calc(24rpx + env(safe-area-inset-top))`
- 标题字号:36rpx,700
- 副标题字号:24rpx,500
- 右侧按钮:68rpx × 68rpx,圆角 20rpx,背景 `cardBgColor`
- 按钮点击态:`transform: scale(0.93); transition: all 0.25s ease`
#### 4.5.2 统一卡片(AppCard)
```vue
```
**样式规范**:
- 背景:`themeConfig.cardBgColor`
- 圆角:20rpx
- 内边距:24rpx(可根据内容调整 20-32rpx)
- 阴影:`0 8rpx 24rpx ${themeConfig.shadowLight}`
- 边框:2rpx solid transparent(仅作为占位,实际靠阴影区分层级)
#### 4.5.3 统一按钮
**主按钮(底部固定)**:
- 宽度:100%(减去左右边距)
- 高度:108rpx
- 圆角:100rpx(全圆角胶囊)
- 背景:`themeConfig.gradientVibrant`
- 文字:32rpx,#fff,600
- 阴影:`0 12rpx 36rpx ${themeConfig.shadowColor}`
- 禁用态:`opacity: 0.5; pointer-events: none`
**次要按钮(模态框内)**:
- 高度:88rpx-96rpx
- 圆角:14rpx
- 取消按钮:背景 `rgba(0,0,0,0.05)`,文字 `textSecondary`
- 确认按钮:背景 `gradientSoft`,文字 #fff
**胶囊筛选标签**:
- 内边距:10rpx 24rpx
- 圆角:22rpx
- 默认态:背景 `borderColor`,文字 `textSecondary`
- 激活态:背景 `primaryColor`,文字 #fff
- 过渡:`all 0.25s ease`
#### 4.5.4 统一模态框(BottomSheet / CenterModal)
**底部弹出(用于新增/编辑)**:
- 宽度:100%
- 圆角:顶部 24rpx
- 背景:`cardBgColor`
- 动画:`slideUp 0.3s ease`
- 最大高度:85vh
- 底部安全区:`padding-bottom: calc(24rpx + env(safe-area-inset-bottom))`
**居中弹窗(用于确认/设置)**:
- 宽度:600rpx
- 圆角:20rpx
- 背景:`cardBgColor`
- 动画:`popUp 0.25s ease`
#### 4.5.5 统一日历组件(InlineCalendar)
当前首页、复盘页各自实现了一套日历。**必须抽取为统一组件**。
**组件能力**:
- 月份切换(上一月/下一月)
- 日期选择回调
- 标记日期(传入有数据的日期数组)
- 今日高亮
- 选中态高亮(背景 `gradientSoft`,文字 #fff)
**样式规范**:
- 背景:`cardBgColor`
- 圆角:20rpx
- 内边距:24rpx
- 星期标题:20rpx,600,`textSecondary`
- 日期格子:72rpx × 72rpx,圆角 10rpx
- 非当月日期:`opacity: 0.25`
- 数据标记点:8rpx 圆点,`primaryColor`
#### 4.5.6 统一列表项(SwipeableItem)
当前待办和账单的滑动删除/编辑逻辑各自实现,需统一。
**组件能力**:
- 左滑/右滑露出操作按钮
- 支持多个操作按钮(编辑、删除、完成)
- 点击主区域收起滑动菜单
- 同时只允许一项展开
**样式规范**:
- 滑动按钮宽度:80rpx/个
- 按钮高度:100%
- 编辑按钮:`primaryColor`
- 删除按钮:`dangerColor`
- 完成按钮:`successColor`
- 文字:24rpx,#fff
- 滑动过渡:`transform 0.3s ease`
#### 4.5.7 统一空状态(EmptyState)
当前已存在 `components/EmptyState.vue`,**所有列表页面强制使用**。
**规范**:
- 图标:48rpx emoji 或 FaIcon
- 标题:26rpx,600,`textSecondary`
- 描述:22rpx,`textDisabled`
- 操作按钮(可选):主按钮样式 mini 版
---
## 五、各模块页面详细设计
### 5.1 首页(pages/index/index)
**定位**:今日 Dashboard,聚合展示 + AI 快速录入。
**布局调整**:
1. **顶部问候区**:保留现有头像 + 问候语 + 日期显示,统一样式
2. **AI 智能记录卡片**:
- 优化为更明显的录入入口
- 快捷标签横向滚动(替代当前换行)
- 结果提示条动画优化
3. **快捷入口四宫格**:
- 统一为 AppCard 样式
- 图标背景色使用各模块主题色 + 15% 透明度
- 待办显示 `待完成/总数`,账单显示 `今日收支`,心情显示 `今日emoji或未记录`,复盘显示 `已完成/未记录`
4. **今日概览卡片**:
- 保留完成进度环
- 增加「复盘状态」行:今日是否已复盘
- 最近待办列表最多展示 3 条(当前 2 条)
- 增加「最近账单」3 条预览(新增)
**数据加载优化**:
- 优先调用新增接口 `POST /dashboard/daily`
- 失败时降级为现有并发请求
---
### 5.2 待办模块(pages/todo/todo)
**定位**:任务管理中心,强调高效规划与批量操作。
**布局重构**:
```
┌─────────────────────────────────────┐
│ Header: 待办清单 / 高效规划每一天 │
│ [批量模式Btn] │
├─────────────────────────────────────┤
│ SearchBar: 🔍 搜索待办 │
├─────────────────────────────────────┤
│ FilterRow1: [今日][本周][本月][自定义]│
│ FilterRow2: [全部][待办][已完成] │
├─────────────────────────────────────┤
│ InlineCalendar(时间筛非今日时显示) │
├─────────────────────────────────────┤
│ ListHeader: ● 任务列表 12项 │
├─────────────────────────────────────┤
│ ┌─────────────────────────────┐ │
│ │ ☐ 🔴 写周报 14:00 │ │
│ │ 工作 · 今天 │ │
│ └─────────────────────────────┘ │
│ ┌─────────────────────────────┐ │
│ │ ☑ 🟡 买咖啡豆 │ │
│ │ 生活 · 今天 [已完成] │ │
│ └─────────────────────────────┘ │
├─────────────────────────────────────┤
│ EmptyState(无数据时) │
├─────────────────────────────────────┤
│ [+] 悬浮添加按钮 │
└─────────────────────────────────────┘
```
**样式统一**:
- 页面背景:`bgColor`
- 所有卡片使用 AppCard 规范
- 任务列表项使用 SwipeableItem 组件
- 优先级标识统一为圆形徽章(🔴🟡🟢 或 FaIcon),尺寸 40rpx
- 批量操作底部栏:固定底部,背景 `cardBgColor`,阴影 `shadowMedium`
**交互优化**:
- 任务完成动画:点击后 checkbox 缩放弹跳 `cubic-bezier(0.34, 1.56, 0.64, 1)`
- 新增/编辑弹窗统一为 BottomSheet,字段分区:标题 > 日期/优先级 > 时间段 > 分类 > 备注
---
### 5.3 心情模块(pages/mood/mood)
**定位**:情绪记录与治愈空间,强调温暖与仪式感。
**布局重构**:
```
┌─────────────────────────────────────┐
│ Header: 记录心情 / 7月28日 │
│ [心情日历Btn] │
├─────────────────────────────────────┤
│ Hero区域: │
│ ┌─────────────────────────────┐ │
│ │ 今天心情如何? │ │
│ │ 选择最贴合此刻感受的... │ │
│ └─────────────────────────────┘ │
├─────────────────────────────────────┤
│ MoodSelector(5列网格) │
│ 😊 😌 😔 😤 😴 │
│ 😰 😄 🤔 😢 😎 │
│ ... │
├─────────────────────────────────────┤
│ SelectedBanner(选中后展示) │
│ ┌─────────────────────────────┐ │
│ │ 😊 开心 │ │
│ │ 今天是开心的一天 │ │
│ └─────────────────────────────┘ │
├─────────────────────────────────────┤
│ InputCard: 想对自己说 │
│ ┌─────────────────────────────┐ │
│ │ 记录此刻的心情与感悟... │ │
│ │ ─────────── 0/200 │ │
│ └─────────────────────────────┘ │
├─────────────────────────────────────┤
│ QuickPhrases: 快捷短语流式布局 │
│ [今天很棒!] [工作很累] [加油呀] ... │
├─────────────────────────────────────┤
│ [ 发送心情 ✨ ] │
└─────────────────────────────────────┘
```
**样式统一**:
- 心情选项卡片:110rpx × 110rpx,圆形,背景 `cardBgColor`
- 选中态:缩放 1.15,背景 `primaryColor + 12%`,边框 `primaryColor`
- 过渡动画:`all 0.35s cubic-bezier(0.34, 1.56, 0.64, 1)`
- 文字输入区:AppCard 样式,内边距 28rpx
- 进度条:10rpx 高度,圆角 100rpx,背景 `borderLight`,填充 `gradientSoft`
**交互优化**:
- 心情选中后,banner 区域淡入上移
- 保存成功后触发 AI 生成,弹窗使用居中 Modal,展示加载/成功/失败状态
- AI 结果卡片支持「换一换」和「保存图片」
---
### 5.4 账单模块(pages/bill/bill)
**定位**:收支明细与财务概览,强调数据清晰与预算控制。
**布局重构**:
```
┌─────────────────────────────────────┐
│ Header: 记账 / 记录每一笔收支 │
│ [预算设置Btn] │
├─────────────────────────────────────┤
│ SearchBar: 🔍 搜索备注/分类 │
├─────────────────────────────────────┤
│ FilterRow1: [全部][支出][收入] │
│ FilterRow2: [今日][本周][本月][上月]..│
├─────────────────────────────────────┤
│ BudgetCard(本月/上月预算进度,可选) │
│ 本月预算 ¥5000 [========>--] 65% │
├─────────────────────────────────────┤
│ StatGrid(4宫格统计卡片) │
│ ┌──────┐┌──────┐┌──────┐┌──────┐ │
│ │总支出 ││总收入 ││周期结余││累计结余│ │
│ │¥3250 ││¥8000 ││+¥4749││+¥4749│ │
│ └──────┘└──────┘└──────┘└──────┘ │
├─────────────────────────────────────┤
│ CateStat(分类统计) │
│ [餐饮¥1200] [交通¥300] [购物¥800]... │
├─────────────────────────────────────┤
│ BillList(账单列表) │
│ ┌─────────────────────────────┐ │
│ │ 🍚 餐饮 午餐 -¥28.5 │ │
│ │ 微信 · 07/28 │ │
│ └─────────────────────────────┘ │
├─────────────────────────────────────┤
│ [+] 悬浮添加按钮 │
└─────────────────────────────────────┘
```
**样式统一**:
- 统计 4 宫格:每个格子为 AppCard,内部图标 48rpx,金额 26rpx 700,标签 20rpx
- 分类统计:≤2 个时纵向满宽卡片,>2 个时横向滚动卡片(宽度 200rpx)
- 分类图标:56rpx × 56rpx,圆角 16rpx,白色图标文字
- 账单列表项:高度 140rpx,使用 SwipeableItem,左滑显示编辑+删除
- 金额颜色:支出 `dangerColor`,收入 `successColor`
**交互优化**:
- 分类统计卡片点击后筛选对应分类,列表实时过滤
- 记账弹窗(BottomSheet)分区:类型切换(支出/收入大按钮)> 金额输入(大字号)> 快捷金额 > 分类网格 > 渠道选择 > 备注 > 日期 > 底部按钮
- 金额输入框获得焦点时自动弹出数字键盘
---
### 5.5 复盘模块(pages/review/review + 新增 reviewList)
**定位**:每日反思与成长记录,强调结构化思考。
**重大改造**:
1. 现有 `review.vue` 改为**复盘编辑页**
2. 新增 `pages/review/reviewList.vue` 为**复盘历史列表页**
3. 所有数据从本地 Storage 迁移到后端接口
4. **仅保留 KPT 复盘法**,移除 GRAI 方法切换
#### 5.5.1 复盘编辑页(review.vue)
```
┌─────────────────────────────────────┐
│ Header: 今日复盘 / 7月28日 │
│ [日历Btn] [历史Btn] │
├─────────────────────────────────────┤
│ IntroCard: 💡 KPT复盘法 │
│ 通过记录做得好的、遇到的问题... │
├─────────────────────────────────────┤
│ Card 1: Keep(保持) │
│ ┌─────────────────────────────┐ │
│ │ 💡 做得好的地方 │ │
│ │ ─────────────────────────── │ │
│ │ 今天按时完成了所有待办... │ │
│ │ ─────────── 45/500 │ │
│ └─────────────────────────────┘ │
│ Card 2: Problem(问题) │
│ ┌─────────────────────────────┐ │
│ │ ⚠️ 遇到的挑战 │ │
│ │ ─────────────────────────── │ │
│ │ 下午注意力不集中... │ │
│ │ ─────────── 12/500 │ │
│ └─────────────────────────────┘ │
│ Card 3: Try(尝试) │
│ ┌─────────────────────────────┐ │
│ │ 🚀 改进方向 │ │
│ │ ─────────────────────────── │ │
│ │ 明天尝试番茄工作法... │ │
│ │ ─────────── 28/500 │ │
│ └─────────────────────────────┘ │
├─────────────────────────────────────┤
│ [ 保存复盘 ✨ ] │
└─────────────────────────────────────┘
```
**样式统一**:
- 介绍卡片:AppCard,左侧图标 56rpx,圆角 16rpx
- 输入卡片:AppCard,内边距 26rpx
- 卡片头部:图标 wrap 60rpx + 标题 30rpx 700 + 副标题 24rpx
- 输入框:min-height 160rpx,28rpx,行高 1.8
- 底部进度条:8rpx 高度 + 字数统计
**交互优化**:
- 日期切换使用 InlineCalendar 组件
- 离开页面时自动保存草稿到本地 Storage
#### 5.5.2 复盘历史列表页(新增 reviewList.vue)
**路由**:`pages/review/reviewList`
```
┌─────────────────────────────────────┐
│ Header: 复盘历史 / 回顾与成长 │
├─────────────────────────────────────┤
│ Filter: 🔍搜索 │
├─────────────────────────────────────┤
│ ┌─────────────────────────────┐ │
│ │ 07月28日 周一 │ │
│ │ 保持:今天按时完成了所有待办... │ │
│ └─────────────────────────────┘ │
│ ┌─────────────────────────────┐ │
│ │ 07月27日 周日 │ │
│ │ 保持:专注度很高... │ │
│ └─────────────────────────────┘ │
└─────────────────────────────────────┘
```
- 列表项使用 AppCard,点击后进入复盘编辑页查看详情
- 支持按日期范围筛选
---
### 5.6 我的心情日历(pages/moodCalendar/moodCalendar)
**定位**:月度心情可视化回顾。
**布局优化**:
- 顶部月份切换器统一样式(与 InlineCalendar 一致)
- 日历格子内展示当日心情 emoji(28rpx)
- 底部增加「本月心情统计」卡片:
- 心情分布横向条形图
- 高频词汇标签
- 平均心情评分
---
## 六、公共组件开发清单
| 组件名 | 路径 | 用途 | 优先级 |
|-------|------|------|--------|
| `PageHeader` | `components/PageHeader.vue` | 统一页面头部 | 高 |
| `AppCard` | `components/AppCard.vue` | 统一卡片容器 | 高 |
| `InlineCalendar` | `components/InlineCalendar.vue` | 内联日历(选择/展示) | 高 |
| `SwipeableItem` | `components/SwipeableItem.vue` | 滑动列表项 | 高 |
| `CapsuleFilter` | `components/CapsuleFilter.vue` | 胶囊筛选标签组 | 高 |
| `BottomSheet` | `components/BottomSheet.vue` | 底部弹出模态框 | 高 |
| `CenterModal` | `components/CenterModal.vue` | 居中模态框 | 高 |
| `StatCard` | `components/StatCard.vue` | 统计数字卡片 | 中 |
| `ProgressBar` | `components/ProgressBar.vue` | 进度条(预算/经验等) | 中 |
| `EmptyState` | `components/EmptyState.vue` | 空状态(已存在,需推广到所有页面) | 高 |
---
## 七、数据结构定义
### 7.1 待办项(TodoItem)
```typescript
interface TodoItem {
id: string;
title: string;
date: string; // YYYY-MM-DD
done: number; // 0-未完成 1-已完成
priority: number; // 1-高 2-中 3-低
category: string; // work / life / study
start_time?: string; // HH:MM
end_time?: string; // HH:MM
remark?: string;
repeat_type?: number; // 0-不重复 1-每日 2-每周 3-每月
created_at: string;
updated_at: string;
}
```
### 7.2 账单项(BillItem)
```typescript
interface BillItem {
id: string;
type: number; // 1-支出 2-收入
money: string; // 金额字符串,保留两位小数
cate: string; // 分类 value
channel?: string; // 支付渠道
note?: string;
date: string; // YYYY-MM-DD
created_at: string;
}
```
### 7.3 心情项(MoodItem)
```typescript
interface MoodItem {
id: string;
date: string; // YYYY-MM-DD
emoji: string; // emoji 字符
content?: string; // 文字内容
ai_text?: string; // AI 生成文案
ai_image_url?: string;
generate_count?: number;
created_at: string;
}
```
### 7.4 复盘项(ReviewItem)
```typescript
interface ReviewItem {
id: string;
date: string; // YYYY-MM-DD
method: 'kpt'; // 固定为 kpt(历史数据可能含 'grai')
kpt?: {
keep: string;
problem: string;
try: string;
};
created_at: string;
updated_at: string;
}
```
---
## 八、开发顺序建议
### 第一阶段:基础设施 ✅ 已完成
1. ✅ 开发公共组件:`AppCard`、`PageHeader`、`CapsuleFilter`、`BottomSheet`、`CenterModal`
2. ✅ 开发 `InlineCalendar`、`SwipeableItem`、`ProgressBar`、`SkeletonScreen` 组件
3. ✅ 开发 `themeMixin`、`growthModalMixin`、`moodMixin` 混入
4. ✅ 实现请求缓存(`apiCache.js`)和请求去重机制
### 第二阶段:接口对接 ✅ 已完成
1. ✅ 前端复盘模块全面接入后端 API(`saveReview`、`getReviewByDate`、`getReviewList`、`deleteReview`)
2. ✅ 新增聚合接口 `getDashboardDaily`(首页 3 合 1)
3. ✅ 新增统计接口 `getTodoStat`、`getMoodStat`、`getBillAggregateStat`
4. ✅ 移除复盘模块本地 Storage 逻辑(保留草稿自动保存)
5. ✅ 修复字体加载 ERR_CACHE_MISS(移除 CSS @font-face 本地路径)
### 第三阶段:页面重构 ✅ 已完成
1. ✅ 重构 `pages/review/review.vue`,接入后端 + 统一 UI + 仅保留 KPT 法
2. ✅ 新增 `pages/review/reviewList.vue` 复盘历史列表
3. ✅ 重构 `pages/todo/todo.vue`,接入公共组件
4. ✅ 重构 `pages/mood/mood.vue`,接入公共组件
5. ✅ 重构 `pages/bill/bill.vue`,接入公共组件
6. ✅ 优化 `pages/index/index.vue`,接入聚合接口
### 第四阶段:体验优化 ✅ 已完成
1. ✅ 统一所有页面过渡动画(pageFadeIn、cardEnter、theme-transition)
2. ✅ 优化列表加载骨架屏(SkeletonScreen 组件,支持 list/card/stats/dashboard/form 布局)
3. ✅ 空状态全覆盖(EmptyState 组件)
4. ✅ 请求缓存与去重(apiCache.js + request.js cache 选项)
---
## 九、注意事项
1. **复盘数据迁移**:复盘由本地改为云端,老用户本地数据需考虑提示「历史数据将保留在本地,新复盘将同步到云端」,或在版本更新时提供一次性上传引导。
2. **接口兼容性**:`POST /todo/list` 现有参数为 `date`,建议后端同时支持 `start_date` + `end_date` 以适配日历范围查询,保持向后兼容。
3. **主题一致性**:所有重构页面必须 100% 使用 `themeConfig` 变量,禁止任何硬编码颜色值。
4. **安全区适配**:所有固定底部操作栏必须添加 `env(safe-area-inset-bottom)` 适配。
5. **性能优化**:列表页使用虚拟滚动或分页加载,避免一次性渲染大量数据。
6. **字体加载**:微信小程序中字体仅通过 JS `uni.loadFontFace()` + base64 加载,CSS `@font-face` 本地路径会导致 ERR_CACHE_MISS,已移除。
7. **复盘方法简化**:仅保留 KPT 复盘法,GRAI 法已移除。历史数据可能包含 GRAI 记录,列表页兼容展示。
---
*文档结束。如有疑问请在开发群中沟通确认。*