基于uni-app+vue3+uview开发一款日常记账本应用app

小账本 - 系统模块及详细功能说明文档

目录

  1. 系统概述
  2. 技术架构
  3. 模块清单
  4. 页面功能详细说明
  5. 数据模型
  6. 核心Store
  7. 工具函数
  8. 样式规范
  9. 业务流程

系统概述

项目简介

小账本是一款简洁易用的个人记账应用,采用现代化的前端技术栈开发,支持多端运行(H5、微信小程序等)。应用专注于提供流畅的记账体验,同时支持记录每日心情,帮助用户更好地了解自己的消费习惯和情绪状态。

核心特性

  • 多端支持:基于 uni-app 框架,支持 H5、小程序等多端运行
  • 数据持久化:使用 IndexedDB 本地存储,数据安全可靠
  • 心情记录:支持记录每日心情,提供情绪追踪功能
  • 统计分析:提供收支统计、分类分析、心情统计等多维度数据展示
  • 简洁易用:界面简洁,操作直观,记账流程顺畅

技术架构

技术栈

类别 技术 版本 说明
Node.js Node.js >= 18.0.0 运行环境
前端框架 Vue 3.5.39 采用 Composition API
构建工具 Vite 6.x 快速的开发构建体验
跨端框架 uni-app 3.x 支持多端运行
状态管理 Pinia 3.0.4 轻量级状态管理
Vue DevTools @vue/devtools-api 7.7.9 Vue 开发者工具
本地存储 IndexedDB - 浏览器本地数据库
样式预处理 SCSS - 变量、混合等高级特性
图表绘制 Canvas 2D - 自定义统计图表

Node.js 版本要求

  • 最低版本:Node.js 18.0.0
  • 推荐版本:Node.js 20.x LTS

核心依赖版本详情

依赖名称 版本 用途
vue 3.5.39 Vue 核心框架
@vue/compiler-core 3.5.39 Vue 编译器核心
@vue/compiler-dom 3.5.39 Vue DOM 编译器
@vue/compiler-sfc 3.5.39 Vue SFC 编译器
@vue/reactivity 3.5.39 Vue 响应式系统
@vue/runtime-core 3.5.39 Vue 运行时核心
@vue/runtime-dom 3.5.39 Vue DOM 运行时
@vue/shared 3.5.39 Vue 共享工具函数
pinia 3.0.4 状态管理
@vue/devtools-api 7.7.9 Vue DevTools 接口
@babel/parser 7.29.7 JavaScript 解析器
@babel/types 7.29.7 Babel 类型定义
postcss 8.5.15 CSS 处理工具
nanoid 3.3.15 唯一 ID 生成
picocolors 1.1.1 命令行颜色输出
source-map-js 1.2.1 SourceMap 处理

开发环境依赖

依赖名称 版本 用途
@dcloudio/types - uni-app TypeScript 类型定义
@types/node - Node.js TypeScript 类型定义
typescript - TypeScript 编译
sass - SCSS 编译

项目目录结构

复制代码
account-app/
├── pages/                      # 页面文件
│   ├── home/
│   │   └── index.vue          # 首页
│   ├── record/
│   │   ├── add.vue            # 添加记账记录
│   │   ├── edit.vue           # 编辑记账记录
│   │   ├── list.vue           # 记账记录列表
│   │   └── search.vue         # 搜索记账记录
│   ├── calendar/
│   │   └── index.vue          # 日历视图
│   ├── stats/
│   │   └── index.vue          # 统计分析
│   └── category/
│       └── manage.vue          # 分类管理
├── stores/                     # Pinia 状态管理
│   ├── record.js              # 记账记录 Store
│   └── category.js            # 分类 Store
├── components/                 # 公共组件
│   └── WeatherWidget.vue      # 天气组件
├── utils/                     # 工具函数
│   ├── index.js              # 通用工具函数
│   └── db.js                # IndexedDB 数据库操作
├── static/                   # 静态资源
├── styles/                   # 样式文件
│   └── common.scss          # 公共样式
├── uni.scss                 # uni-app 全局变量
├── App.vue                  # 应用入口
├── main.js                  # 主入口文件
└── manifest.json           # 应用配置

模块清单

一级模块

模块名称 文件路径 功能描述
首页模块 pages/home/index.vue 展示收支概况、最近记录、快速入口
记账模块 pages/record/* 添加、编辑、列表、搜索记账记录
日历模块 pages/calendar/index.vue 日历视图展示记录
统计模块 pages/stats/index.vue 数据统计和可视化
分类模块 pages/category/manage.vue 分类管理
天气模块 components/WeatherWidget.vue 显示天气信息

二级模块(Store)

模块名称 文件路径 功能描述
记录Store stores/record.js 记账数据管理、统计计算
分类Store stores/category.js 分类数据管理

二级模块(工具)

模块名称 文件路径 功能描述
数据库模块 utils/db.js IndexedDB 封装
工具函数 utils/index.js 格式化、日期处理等

页面功能详细说明

1. 首页 (pages/home/index.vue)

功能概述

首页是用户打开应用的第一个页面,承担着数据总览和功能导航的作用。

模块结构
复制代码
┌─────────────────────────────────────┐
│  小账本 ✦    [天气组件]              │  <- 顶部标题区
├─────────────────────────────────────┤
│  早上好 / 下午好 / 晚上好            │  <- 问候语
├─────────────────────────────────────┤
│  ┌─────────────────────────────────┐│
│  │ 本月结余                        ││  <- 收支卡片
│  │ ¥12,345.00                      ││
│  │ [📈 收入 ¥20,000] [📉 支出 ¥7,655]││
│  └─────────────────────────────────┘│
├─────────────────────────────────────┤
│  ┌───────┐ ┌───────┐ ┌───────┐    │
│  │ 📝    │ │ 🔥    │ │ 🏆    │    │  <- 快速统计
│  │ ¥256  │ │ 45    │ │ 餐饮   │    │
│  │今日支出│ │本月笔数│ │最多分类│    │
│  └───────┘ └───────┘ └───────┘    │
├─────────────────────────────────────┤
│  最近记录                    查看全部 │
├─────────────────────────────────────┤
│  🍜 餐饮 · 午餐 🍀  ¥35.00          │  <- 记录列表
│  🚗 交通 · 地铁   ¥5.00             │
│  🛍️ 购物 · 衣服   ¥299.00          │
└─────────────────────────────────────┘
功能点清单
序号 功能点 描述 优先级
1 显示本月结余 从 Store 获取 monthBalance 计算当月收支差 P0
2 显示本月收入 从 Store 获取 monthIncome 汇总收入 P0
3 显示本月支出 从 Store 获取 monthExpense 汇总支出 P0
4 显示今日支出 从 Store 获取 todayExpense 计算当天支出 P1
5 显示本月笔数 从 Store 获取 monthRecordCount 统计记录数 P1
6 显示最多分类 从 Store 获取 topExpenseCategory 找出支出最多分类 P1
7 问候语 根据当前时间显示"早上好/下午好/晚上好" P2
8 最近记录列表 从 Store 获取 recentRecords 显示最近5条 P0
9 跳转记账页 点击添加按钮跳转到 add.vue P0
10 跳转列表页 点击"查看全部"跳转到 list.vue P1
11 跳转日历页 点击日历图标跳转到 calendar/index.vue P1
12 跳转统计页 点击统计图标跳转到 stats/index.vue P1
13 编辑记录 点击记录项跳转到 edit.vue P1
14 加载状态 数据未初始化时显示加载提示 P1
15 心情显示 记录列表显示心情表情 P2
交互说明
  • 添加按钮 :点击后带参数 ?type=expense 跳转,方便用户快速记账
  • 记录点击:跳转到编辑页面,传递记录 ID 作为参数
  • 查看全部:跳转到记账列表页面
  • 天气组件:显示当前天气信息(可选功能)

2. 记账添加页面 (pages/record/add.vue)

功能概述

记账添加页面是核心记账功能的入口,用户可以快速添加支出或收入记录,并记录当日心情。

模块结构
复制代码
┌─────────────────────────────────────┐
│  记一笔 ✦                           │  <- 页面标题
├─────────────────────────────────────┤
│  [ 支出 ]    [ 收入 ]               │  <- 类型切换
├─────────────────────────────────────┤
│  ¥  0.00                            │  <- 金额输入
├─────────────────────────────────────┤
│  ┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌───┐     │
│  │🍜 │ │🚗 │ │🛍️│ │🎮 │ │🏠 │     │  <- 分类选择
│  │餐饮│ │交通│ │购物│ │娱乐│ │住房│     │
│  └───┘ └───┘ └───┘ └───┘ └───┘     │
│  ┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌───┐     │
│  │💊 │ │📚 │ │📱 │ │🍪 │ │🏃 │     │
│  │医疗│ │教育│ │通讯│ │零食│ │运动│     │
│  └───┘ └───┘ └───┘ └───┘ └───┘     │
├─────────────────────────────────────┤
│  ┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌───┐     │
│  │😀│ │😊│ │😐│ │😔│ │😭│     │  <- 心情选择
│  │开心│ │愉快│ │一般│ │难过│ │伤心│     │
│  └───┘ └───┘ └───┘ └───┘ └───┘     │
│        ┌───┐                         │
│        │😡│                         │
│        │生气│                         │
│        └───┘                         │
├─────────────────────────────────────┤
│  📅 今天                         今天 │  <- 日期选择
├─────────────────────────────────────┤
│  ┌─────────────────────────────────┐│
│  │ 添加备注(可选)...              ││  <- 备注输入
│  └─────────────────────────────────┘│
├─────────────────────────────────────┤
│        [ 保存记录 ]                 │  <- 提交按钮
└─────────────────────────────────────┘
功能点清单
序号 功能点 描述 优先级
1 类型切换 切换支出/收入类型,刷新分类列表 P0
2 金额输入 输入记账金额,支持小数 P0
3 分类选择 点击选择分类,选中高亮 P0
4 心情选择 选择当日心情(6种表情),默认选择第一个 P0
5 日期选择 点击打开日期选择器 P1
6 备注输入 可选输入,最多100字 P2
7 保存记录 验证数据并保存到 Store P0
8 返回首页 保存成功后自动返回 P1
心情选项配置
表情 名称 值
😀 开心 '😀'
😊 愉快 '😊'
😐 一般 '😐'
😔 难过 '😔'
😭 伤心 '😭'
😡 生气 '😡'
验证规则
字段 规则 错误提示
金额 必须 > 0 "请输入金额"
分类 必须选择 "请选择分类"
交互说明
  • 类型切换:切换支出/收入时重置已选分类
  • 分类选择:单选,点击后高亮显示
  • 心情选择:单选,默认选中第一个"开心"
  • 日期选择:默认当天,支持补录
  • 保存成功:显示提示后延迟返回上一页

3. 记账编辑页面 (pages/record/edit.vue)

功能概述

编辑页面用于修改已有的记账记录,支持完整的数据回显和更新。

模块结构
复制代码
┌─────────────────────────────────────┐
│  [‹]  编辑记录                      │  <- 头部导航
├─────────────────────────────────────┤
│  [ 支出 ]    [ 收入 ]               │  <- 类型切换
├─────────────────────────────────────┤
│  ¥  35.00                           │  <- 金额输入(回显)
├─────────────────────────────────────┤
│  ┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌───┐     │
│  │🍜✓│ │🚗 │ │🛍️│ │🎮 │ │🏠 │     │  <- 分类选择(回显)
│  │餐饮│ │交通│ │购物│ │娱乐│ │住房│     │
│  └───┘ └───┘ └───┘ └───┘ └───┘     │
├─────────────────────────────────────┤
│  ┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌───┐     │
│  │😀 │ │😊✓│ │😐│ │😔│ │😭│     │  <- 心情选择(回显)
│  │开心│ │愉快│ │一般│ │难过│ │伤心│     │
│  └───┘ └───┘ └───┘ └───┘ └───┘     │
├─────────────────────────────────────┤
│  📅 2024-01-15                  补录 │  <- 日期选择
├─────────────────────────────────────┤
│  ┌─────────────────────────────────┐│
│  │ 午餐                          ││  <- 备注输入(回显)
│  └─────────────────────────────────┘│
├─────────────────────────────────────┤
│  [ 删除记录 ]                       │  <- 删除按钮
│        [ 保存修改 ]                 │  <- 提交按钮
└─────────────────────────────────────┘
功能点清单
序号 功能点 描述 优先级
1 加载记录 根据 URL 参数 ID 加载记录数据 P0
2 类型切换 切换支出/收入类型 P0
3 金额回显 显示原金额值 P0
4 分类回显 高亮显示原分类 P0
5 心情回显 高亮显示原心情 P0
6 日期回显 显示原日期 P1
7 备注回显 显示原备注 P1
8 更新记录 保存修改后的数据 P0
9 删除记录 弹出确认后删除记录 P1
数据回显逻辑
复制代码
编辑页面加载时:
1. 从 URL 参数获取 record ID
2. 在 Store 中查找对应记录
3. 填充表单字段:
   - recordType = record.type
   - amount = record.amount
   - selectedCatId = record.catId
   - selectedMood = record.mood || ''
   - selectedDate = record.date
   - note = record.note
交互说明
  • 返回按钮:返回上一页
  • 删除按钮:弹出确认对话框,确认后删除并返回
  • 保存按钮:验证数据后更新记录

4. 记账列表页面 (pages/record/list.vue)

功能概述

列表页面展示所有记账记录,支持多种筛选条件和操作功能。

模块结构
复制代码
┌─────────────────────────────────────┐
│  [‹]  记账列表              [🔍]    │  <- 头部导航
├─────────────────────────────────────┤
│  全部  支出  收入  今天  本周  本月   │  <- 筛选标签
├─────────────────────────────────────┤
│  今天                        ▼ ¥350 │  <- 日期分组
│  ┌───┐ 🍜餐饮 · 午餐🍀    ¥35.00 [✏️🗑️]│
│  ┌───┐ 🚗交通 · 地铁       ¥5.00 [✏️🗑️]│
│  ┌───┐ 🛍️购物 · 衣服   ¥310.00 [✏️🗑️]│
├─────────────────────────────────────┤
│  昨天                        ▼ ¥120 │
│  ┌───┐ 🍜餐饮 · 晚餐      ¥80.00 [✏️🗑️]│
│  ┌───┐ 🎮娱乐 · 电影      ¥40.00 [✏️🗑️]│
├─────────────────────────────────────┤
│  1月15日                    ▼ ¥500 │
│  ┌───┐ 🏠住房 · 房租     ¥500.00 [✏️🗑️]│
└─────────────────────────────────────┘
功能点清单
序号 功能点 描述 优先级
1 全部筛选 显示所有记录 P1
2 支出筛选 仅显示支出记录 P1
3 收入筛选 仅显示收入记录 P1
4 今天筛选 仅显示今天的记录 P1
5 本周筛选 仅显示本周的记录 P1
6 本月筛选 仅显示本月的记录 P1
7 日期分组 按日期分组显示记录 P0
8 当日汇总 显示每天的支出和收入 P1
9 心情显示 显示记录的心情表情 P2
10 编辑记录 点击编辑按钮跳转到编辑页 P0
11 删除记录 点击删除按钮删除记录 P1
12 跳转搜索 点击搜索图标跳转搜索页 P1
13 空状态 无记录时显示提示 P1
筛选条件配置
值 标签 筛选逻辑
all 全部 无筛选
expense 支出 type === 'expense'
income 收入 type === 'income'
today 今天 date === todayStr
week 本周 date in currentWeek
month 本月 date.startsWith(currentMonth)
金额显示规则
类型 格式 颜色
支出 ¥XX.XX 珊瑚色 ($joy-coral-600)
收入 +¥XX.XX 薄荷绿 ($joy-mint-600)
交互说明
  • 筛选切换:点击标签切换筛选条件
  • 记录点击:点击记录项跳转编辑页
  • 编辑按钮:点击跳转编辑页
  • 删除按钮:点击弹出确认后删除

5. 搜索页面 (pages/record/search.vue)

功能概述

搜索页面提供关键词检索功能,方便用户快速找到特定记录。

模块结构
复制代码
┌─────────────────────────────────────┐
│  [搜索记账记录...]     [取消]       │  <- 搜索栏
├─────────────────────────────────────┤
│  📝 输入关键词搜索                  │  <- 空状态
│     搜索记录名称、备注等            │
└─────────────────────────────────────┘

┌─────────────────────────────────────┐
│  [午餐支出...]         [取消]       │  <- 搜索栏(输入中)
├─────────────────────────────────────┤
│  今天                        ▼ ¥35 │
│  🍜餐饮 · 午餐🍀           ¥35.00   │
├─────────────────────────────────────┤
│  昨天                        ▼ ¥80 │
│  🍜餐饮 · 午餐            ¥80.00    │
└─────────────────────────────────────┘
功能点清单
序号 功能点 描述 优先级
1 关键词输入 实时搜索输入 P0
2 分类名称搜索 匹配分类名称 P0
3 备注搜索 匹配备注内容 P0
4 心情搜索 匹配心情表情 P1
5 日期分组 搜索结果按日期分组 P1
6 当日汇总 显示每天收支 P1
7 无结果提示 未匹配时显示提示 P1
8 取消返回 点击取消返回上一页 P1
9 编辑记录 点击搜索结果编辑 P1
搜索范围
字段 说明
分类名称 匹配记录的分类名称
备注 匹配记录的备注内容

6. 日历页面 (pages/calendar/index.vue)

功能概述

日历视图以月历形式展示记账记录,直观显示每日收支情况。

模块结构
复制代码
┌─────────────────────────────────────┐
│  日历视图 ✦                         │
│  [◀]  2024年1月  [▶]                │  <- 月份导航
├─────────────────────────────────────┤
│  日   一   二   三   四   五   六    │  <- 星期标题
├─────────────────────────────────────┤
│       1    2    3    4    5    6    │
│  ▼    ▼    ▼    ▼    ▼    ▼   ▼    │  <- 日期格子
│  ¥150 ¥80  ¥200 ¥120  ¥50  ¥300     │  <- 日支出
├─────────────────────────────────────┤
│  ▼ 点击日期查看详情                 │  <- 操作提示
├─────────────────────────────────────┤
│  1月15日(周一)              ▼ ¥350 │
│  🍜餐饮 · 午餐🍀            ¥35.00  │
│  🚗交通 · 地铁              ¥5.00   │
│  🛍️购物 · 衣服            ¥310.00  │
└─────────────────────────────────────┘
功能点清单
序号 功能点 描述 优先级
1 月份导航 显示当前月份,支持切换 P0
2 月份切换 上一月/下一月 P0
3 日期格子 显示日期数字 P0
4 当日标记 高亮显示今天 P1
5 有记录标记 有记录的日期显示圆点 P1
6 日支出显示 显示每天的支出金额 P1
7 记录列表 点击日期显示当天记录 P0
8 心情显示 显示记录的心情表情 P2
9 空状态 无记录时显示提示 P1
日期状态
状态 样式
今天 背景高亮
有记录 底部圆点标记
无记录 默认样式
选中 边框高亮

7. 统计页面 (pages/stats/index.vue)

功能概述

统计页面提供多维度的数据统计和可视化展示。

模块结构
复制代码
┌─────────────────────────────────────┐
│  统计分析 ✦                         │
│  [ 日 ]  [ 周 ]  [ 月 ]  [ 年 ]     │  <- 周期切换
├─────────────────────────────────────┤
│  ┌─────────────────────────────────┐│
│  │      📈 收支曲线图               ││  <- 图表区域
│  │   ╱╲    ╱╲                      ││
│  │  ╱  ╲__╱  ╲__╱                  ││
│  │ 支出曲线                         ││
│  │      ╱╲                         ││
│  │  ╱╲╱  ╲__╱                      ││
│  │ ╱  ╲__╱                        ││
│  │收入曲线                         ││
│  └─────────────────────────────────┘│
├─────────────────────────────────────┤
│  支出分类统计                        │
│  ┌─────────────────────────────────┐│
│  │ 🍜 餐饮   ¥2,500   ████████ 35% ││
│  │ 🚗 交通   ¥800     ████    15% ││
│  │ 🛍️ 购物   ¥1,200   █████   25% ││
│  └─────────────────────────────────┘│
├─────────────────────────────────────┤
│  收入分类统计                        │
│  ┌─────────────────────────────────┐│
│  │ 💰 工资   ¥8,000    ████████ 80% ││
│  │ 💼 兼职   ¥2,000    ███    20% ││
│  └─────────────────────────────────┘│
├─────────────────────────────────────┤
│  心情统计                            │
│  ┌─────────────────────────────────┐│
│  │ 😀 开心   15次    ████████ 30%  ││
│  │ 😊 愉快   12次    ██████    24%  ││
│  │ 😐 一般   10次    █████     20%  ││
│  │ 😔 难过   8次     ████      16%  ││
│  │ 😭 伤心   3次     ██       6%   ││
│  │ 😡 生气   2次     █        4%   ││
│  └─────────────────────────────────┘│
└─────────────────────────────────────┘
功能点清单
序号 功能点 描述 优先级
1 日统计 显示当天的收支数据 P0
2 周统计 显示本周的收支数据 P1
3 月统计 显示本月的收支数据 P1
4 年统计 显示本年的收支数据 P1
5 支出曲线 绘制支出曲线图(橙色) P0
6 收入曲线 绘制收入曲线图(绿色) P0
7 曲线阴影 曲线下方填充阴影 P2
8 支出分类统计 显示支出分类占比 P0
9 收入分类统计 显示收入分类占比 P1
10 心情统计 显示心情占比 P0
11 统计次数 显示各心情的记录次数 P1
12 进度条 可视化展示占比 P1
周期配置
值 标签 数据范围
day 日 当天
week 周 本周一至周日
month 月 本月1日至月末
year 年 本年1月至12月
图表配置
元素 配置
画布尺寸 宽度100%,高度200px
边距 上20,右10,下30,左10
曲线宽度 2px
阴影宽度 6px
支出颜色 橙色 $joy-coral-500
收入颜色 绿色 $joy-mint-500

8. 分类管理页面 (pages/category/manage.vue)

功能概述

分类管理页面用于管理支出和收入的分类,支持增删改操作。

模块结构
复制代码
┌─────────────────────────────────────┐
│  [‹]  分类管理                      │  <- 头部导航
├─────────────────────────────────────┤
│  ┌─────────────────────────────────┐│
│  │  👤  用户头像                    ││  <- 用户信息
│  │  点击更换头像                    ││
│  └─────────────────────────────────┘│
├─────────────────────────────────────┤
│  支出分类                           │
│  ┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌───┐    │
│  │🍜✓│ │🚗 │ │🛍️│ │🎮 │ │🏠 │    │  <- 分类列表
│  │餐饮│ │交通│ │购物│ │娱乐│ │住房│    │
│  └───┘ └───┘ └───┘ └───┘ └───┘    │
│  ┌───┐ ┌───┐ ┌───┐                 │
│  │💊 │ │📚 │ │📱 │     [+ 添加]   │
│  └─────────────────────────────────┘│
├─────────────────────────────────────┤
│  收入分类                           │
│  ┌───┐ ┌───┐ ┌───┐ ┌───┐          │
│  │💰✓│ │💼 │ │📈 │ │🧧 │          │
│  │工资│ │兼职│ │投资│ │红包│          │
│  └───┘ └───┘ └───┘ └───┘          │
│       [+ 添加]                      │
└─────────────────────────────────────┘
功能点清单
序号 功能点 描述 优先级
1 用户头像 显示用户头像 P2
2 更换头像 点击更换头像图片 P2
3 支出分类列表 显示所有支出分类 P0
4 收入分类列表 显示所有收入分类 P0
5 添加分类 添加新的分类 P1
6 编辑分类 编辑分类名称/图标 P1
7 删除分类 删除不需要的分类 P1
8 分类统计 显示各分类使用次数 P1
默认支出分类
ID 名称 图标 颜色索引
e1 餐饮 🍜 0
e2 交通 🚗 1
e3 购物 🛍️ 2
e4 娱乐 🎮 3
e5 住房 🏠 4
e6 医疗 💊 5
e7 教育 📚 6
e8 通讯 📱 7
e9 零食 🍪 8
e10 运动 🏃 9
e11 宠物 🐾 10
e12 其他 💡 11
默认收入分类
ID 名称 图标 颜色索引
i1 工资 💰 0
i2 兼职 💼 1
i3 投资 📈 2
i4 红包 🧧 3
i5 退款 🔄 4
i6 其他 ✨ 5

数据模型

记账记录 (Record)

typescript 复制代码
interface Record {
  id: number;           // 记录唯一标识,自增
  type: 'expense' | 'income';  // 记录类型
  catId: string;        // 分类ID
  amount: number;       // 金额,精确到分
  date: string;         // 日期,格式 YYYY-MM-DD
  hour: number;         // 小时,0-23
  note: string;         // 备注,最多100字
  mood: string;         // 心情表情,如 '😀'
}

分类 (Category)

typescript 复制代码
interface Category {
  id: string;           // 分类唯一标识
  name: string;         // 分类名称
  icon: string;         // 分类图标(emoji)
  type: 'expense' | 'income';  // 分类类型
  colorIdx: number;     // 颜色索引,对应颜色数组
}

分类颜色配置

typescript 复制代码
// 支出分类颜色
const expenseColors = [
  { bg: '#FFF5F5', color: '#E53E3E' },  // 0 - 红色系
  { bg: '#FFF5EB', color: '#ED8936' },  // 1 - 橙色系
  // ... 更多颜色
]

// 收入分类颜色
const incomeColors = [
  { bg: '#F0FFF4', color: '#38A169' },   // 0 - 绿色系
  { bg: '#E6FFFA', color: '#319795' },   // 1 - 青色系
  // ... 更多颜色
]

核心Store

1. 记录Store (stores/record.js)

状态定义
状态 类型 说明
records ref(\[\]) 记账记录列表
nextId ref(1) 下一个记录ID
initialized ref(false) 数据是否已初始化
计算属性
属性 类型 说明
monthBalance computed 本月结余(收入-支出)
monthIncome computed 本月收入总额
monthExpense computed 本月支出总额
todayExpense computed 今日支出金额
monthRecordCount computed 本月记录笔数
topExpenseCategory computed 本月支出最多分类
recentRecords computed 最近5条记录
moodBreakdown computed 心情统计数据
categoryBreakdown computed 分类统计数据
方法列表
方法 参数 返回值 说明
initDB - Promise 初始化数据库
addRecord type, catId, amount, date, note, hour, mood Record 添加记录
updateRecord id, type, catId, amount, date, note, hour, mood Record|null 更新记录
deleteRecord id boolean 删除记录
getGroupedRecords filter? GroupedRecords\[\] 获取分组记录

2. 分类Store (stores/category.js)

状态定义
状态 类型 说明
expenseCats ref(\[\]) 支出分类列表
incomeCats ref(\[\]) 收入分类列表
方法列表
方法 参数 返回值 说明
getCatById catId, type Category|undefined 根据ID获取分类
getCatColor catId, type ColorConfig 获取分类颜色
addCategory type, name, icon void 添加分类
deleteCategory catId, type void 删除分类

工具函数

1. 格式化函数 (utils/index.js)

函数 参数 返回值 说明
formatMoney amount, prefix? string 格式化金额,如 ¥1,234.00
formatDate date? string 格式化日期为 YYYY-MM-DD
formatDateShort dateStr, todayStr? string 格式化日期为中文,如 今天、昨天、1月15日
getGreeting - string 获取问候语
getWeekday date string 获取星期中文
getDateBadge selectedDate, today? string 获取日期徽章文本
generateId - string 生成唯一ID

2. 数据库函数 (utils/db.js)

函数 参数 返回值 说明
openDB - Promise 打开数据库
addRecord record Promise 添加/更新记录
getAllRecords - Promise<Record\[\]> 获取所有记录
getRecordsByDate date Promise<Record\[\]> 按日期获取记录
deleteRecord id Promise 删除记录
getMaxId - Promise 获取最大ID

样式规范

全局变量 (uni.scss)

scss 复制代码
// 珊瑚色系(支出、主题)
$joy-coral-50: #FFF5F5;
$joy-coral-100: #FED7D7;
$joy-coral-500: #F56565;
$joy-coral-600: #E53E3E;

// 薄荷绿系(收入、正向)
$joy-mint-50: #F0FFF4;
$joy-mint-100: #C6F6D5;
$joy-mint-500: #48BB78;
$joy-mint-600: #38A169;

// 中性色系
$joy-neutral-0: #FFFFFF;
$joy-neutral-50: #F7FAFC;
$joy-neutral-100: #EDF2F7;
$joy-neutral-200: #E2E8F0;
$joy-neutral-400: #A0AEC0;
$joy-neutral-600: #718096;
$joy-neutral-800: #2D3748;
$joy-neutral-900: #1A202C;

分类颜色数组

javascript 复制代码
// 支出分类颜色配置(12种)
categoryColors.expense = [
  { bg: '#FFE8DA', text: '#9C4A28' },  // coral
  { bg: '#D8ECF8', text: '#4A98B8' },  // sky
  { bg: '#E8D8F5', text: '#8864A8' },  // lavender
  { bg: '#F5E8D0', text: '#B89058' },  // amber
  { bg: '#D4F5E6', text: '#2C8858' },  // mint
  { bg: '#FFF5F0', text: '#B85E34' },  // coral-light
  { bg: '#F0F8FF', text: '#4A98B8' },  // sky-light
  { bg: '#F8F0FF', text: '#8864A8' },  // lavender-light
  { bg: '#FFF8F0', text: '#B89058' },  // amber-light
  { bg: '#F0FFF8', text: '#2C8858' },  // mint-light
  { bg: '#FFE8DA', text: '#9C4A28' },  // coral(重复)
  { bg: '#F5F0EA', text: '#585048' },  // neutral
]

// 收入分类颜色配置(6种)
categoryColors.income = [
  { bg: '#D4F5E6', text: '#2C8858' },  // mint
  { bg: '#FFE8DA', text: '#9C4A28' },  // coral
  { bg: '#D8ECF8', text: '#4A98B8' },  // sky
  { bg: '#F5E8D0', text: '#B89058' },  // amber
  { bg: '#E8D8F5', text: '#8864A8' },  // lavender
  { bg: '#F5F0EA', text: '#585048' },  // neutral
]

业务流程

1. 添加记录流程

复制代码
开始
  │
  ▼
┌──────────────────┐
│  打开添加页面     │
│  type=expense     │
└────────┬─────────┘
         │
         ▼
┌──────────────────┐
│  选择记录类型     │
│  支出/收入        │
└────────┬─────────┘
         │
         ▼
┌──────────────────┐
│  输入金额         │
└────────┬─────────┘
         │
         ▼
┌──────────────────┐
│  选择分类         │
└────────┬─────────┘
         │
         ▼
┌──────────────────┐
│  选择心情(默认)  │
└────────┬─────────┘
         │
         ▼
┌──────────────────┐
│  选择日期(默认)  │
└────────┬─────────┘
         │
         ▼
┌──────────────────┐
│  输入备注(可选)  │
└────────┬─────────┘
         │
         ▼
┌──────────────────┐
│  点击保存         │
└────────┬─────────┘
         │
         ▼
    ┌────┴────┐
    │ 验证通过?│
    └────┬────┘
    否   │   是
    │    │    │
    ▼    │    ▼
┌────┐  │  ┌──────────────────┐
│提示│  │  │  保存到Store      │
│错误│  │  └────────┬─────────┘
└────┘  │           │
        │           ▼
        │  ┌──────────────────┐
        │  │  持久化到IndexedDB│
        │  └────────┬─────────┘
        │           │
        │           ▼
        │  ┌──────────────────┐
        │  │  显示成功提示      │
        │  └────────┬─────────┘
        │           │
        │           ▼
        │  ┌──────────────────┐
        └──│  返回上一页       │
           └──────────────────┘

2. 编辑记录流程

复制代码
开始
  │
  ▼
┌──────────────────┐
│  从列表点击记录   │
└────────┬─────────┘
         │
         ▼
┌──────────────────┐
│  跳转编辑页面     │
│  传递 record ID   │
└────────┬─────────┘
         │
         ▼
┌──────────────────┐
│  根据ID加载记录   │
└────────┬─────────┘
         │
         ▼
┌──────────────────┐
│  回显所有字段     │
└────────┬─────────┘
         │
         ▼
    ┌────┴────┐
    │ 用户修改?│
    └────┬────┘
    否   │   是
    │    │    │
    ▼    │    ▼
┌────┐  │  ┌──────────────────┐
│跳过│  │  │  修改字段值       │
└────┘  │  └────────┬─────────┘
         │           │
         │           ▼
    ┌────┴────┐
    │ 点击操作?│
    └────┬────┘
   保存   │   删除   │ 取消
    │    │    │     │
    ▼    │    ▼     │
┌────┐  │ ┌────┐   ┌────┐
│验证│  │ │确认│   │返回│
└─┬──┘  │ └──┬─┘   └────┘
  │     │    │
  ▼     │    ▼
┌────┐  │ ┌────┐
│保存│  │ │删除│
└─┬──┘  │ └─┬──┘
  │     │   │
  ▼     │   ▼
┌────┐  │ ┌────┐
│返回│  │ │返回│
└────┘  │ └────┘

3. 数据持久化流程

复制代码
应用启动
    │
    ▼
┌──────────────────┐
│  执行 initDB()   │
└────────┬─────────┘
         │
         ▼
    ┌────┴────┐
    │ 数据库存在?│
    └────┬────┘
    是   │   否
    │    │    │
    ▼    │    ▼
┌────┐  │  ┌──────────────────┐
│加载│  │  │ 创建默认数据      │
│数据│  │  └────────┬─────────┘
└─┬──┘  │           │
  │     │           ▼
  │     │  ┌──────────────────┐
  │     │  │  写入模拟数据     │
  │     │  └────────┬─────────┘
  │     │           │
  │     ▼           ▼
  │  ┌──────────────────┐
  └──│  设置 initialized │
     └────────┬─────────┘
              │
              ▼
     ┌────────────────┐
     │ 数据准备就绪     │
     └────────────────┘

附录

版本信息

  • 文档版本:v1.0
  • 更新日期:2026-06-30
  • 文档状态:完成

更新记录

日期 版本 更新内容
2026-06-30 v1.0 初始版本