Files
simple-memo/docs/project_plan.md
sunct 3c3bf53ae4 docs(website): 添加简记memo产品原型和UI设计规范文档
- 新增「简记memo」一体化小程序产品原型设计文档
- 新增简记memo完整版UI视觉设计规范和界面细节
- 添加IDEA项目配置文件.gitignore
- 创建404页面HTML文件,包含响应式布局和错误提示
- 添加关于页面HTML文件,展示品牌介绍和团队信息
- 实现AES加解密工具函数,支持请求体加密
- 添加用户协议页面基础框架
2026-07-31 14:12:32 +08:00

1110 lines
44 KiB
Markdown
Raw Permalink 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.
# 简记 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
<!-- 统一组件 props -->
<PageHeader
title="待办清单"
subtitle="高效规划每一天"
:showBack="true"
:date="currentDate"
@dateChange="onDateChange"
>
<template #right>
<view class="header-btn" @click="toggleBatch">
<FaIcon icon="bars" />
</view>
</template>
</PageHeader>
```
**样式规范**
- 高度:自适应,内边距 `24rpx 36rpx`
- 顶部安全区:`padding-top: calc(24rpx + env(safe-area-inset-top))`
- 标题字号:36rpx700
- 副标题字号:24rpx500
- 右侧按钮:68rpx × 68rpx,圆角 20rpx,背景 `cardBgColor`
- 按钮点击态:`transform: scale(0.93); transition: all 0.25s ease`
#### 4.5.2 统一卡片(AppCard
```vue
<AppCard :padding="24" :radius="20">
<!-- 内容 -->
</AppCard>
```
**样式规范**
- 背景:`themeConfig.cardBgColor`
- 圆角:20rpx
- 内边距:24rpx(可根据内容调整 20-32rpx
- 阴影:`0 8rpx 24rpx ${themeConfig.shadowLight}`
- 边框:2rpx solid transparent(仅作为占位,实际靠阴影区分层级)
#### 4.5.3 统一按钮
**主按钮(底部固定)**
- 宽度:100%(减去左右边距)
- 高度:108rpx
- 圆角:100rpx(全圆角胶囊)
- 背景:`themeConfig.gradientVibrant`
- 文字:32rpx#fff600
- 阴影:`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
- 星期标题:20rpx600`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
- 标题:26rpx600`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区域: │
│ ┌─────────────────────────────┐ │
│ │ 今天心情如何? │ │
│ │ 选择最贴合此刻感受的... │ │
│ └─────────────────────────────┘ │
├─────────────────────────────────────┤
│ MoodSelector5列网格) │
│ 😊 😌 😔 😤 😴 │
│ 😰 😄 🤔 😢 😎 │
│ ... │
├─────────────────────────────────────┤
│ 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 160rpx28rpx,行高 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 记录,列表页兼容展示。
---
*文档结束。如有疑问请在开发群中沟通确认。*