核心功能: - 记账CRUD(支出/收入/分类/备注/日期) - 统计分析(概览/分类占比/每日趋势) - 预算管理(按月设置/进度条/超支提醒) - 数据导出CSV 安全与认证: - HMAC-SHA256签名token认证 - 用户数据隔离 - 输入验证与错误处理 - CORS配置 前端优化: - 骨架屏加载 - 账单按日期分组 - 预算页面重构(快捷预设+Numpad) - SvgIcon组件(H5+微信双端适配) - 下拉刷新 后端优化: - 共享日期工具函数 - 数据库连接池优化 - 健康检查端点 - 优雅关闭处理 技术栈: - 前端:Uni-app (Vue 3 + Pinia) - 后端:Node.js + Express + MySQL
1101 lines
39 KiB
Markdown
1101 lines
39 KiB
Markdown
# 小菜记账 — UI 设计稿
|
||
|
||
> 版本: v1.0 | 日期: 2026-05-27
|
||
> 设计风格: Claymorphism (粘土风格) + 极简融合
|
||
> 目标尺寸: 375 × 812px (iPhone SE 基准) / 750 × 1624px (小程序 rpx)
|
||
|
||
---
|
||
|
||
## 目录
|
||
|
||
1. [设计令牌 (Design Tokens)](#设计令牌)
|
||
2. [页面一: 首页仪表盘](#页面一-首页仪表盘)
|
||
3. [页面二: 记账页](#页面二-记账页)
|
||
4. [页面三: 统计页](#页面三-统计页)
|
||
5. [页面四: 我的](#页面四-我的)
|
||
6. [组件库](#组件库)
|
||
7. [交互状态](#交互状态)
|
||
8. [响应式适配](#响应式适配)
|
||
|
||
---
|
||
|
||
## 设计令牌
|
||
|
||
### 间距系统 (4px 基准)
|
||
|
||
| Token | 值 | 用途 |
|
||
|-------|-----|------|
|
||
| `--space-xs` | 4px | 图标与文字间距 |
|
||
| `--space-sm` | 8px | 紧凑内边距 |
|
||
| `--space-md` | 12px | 按钮内边距 |
|
||
| `--space-base` | 16px | 卡片内边距、列表间距 |
|
||
| `--space-lg` | 20px | 区块间距 |
|
||
| `--space-xl` | 24px | 页面内边距 |
|
||
| `--space-2xl` | 32px | 大区块间距 |
|
||
| `--space-3xl` | 48px | 页面顶部留白 |
|
||
|
||
### 圆角系统
|
||
|
||
| Token | 值 | 用途 |
|
||
|-------|-----|------|
|
||
| `--radius-sm` | 8px | 标签、小按钮 |
|
||
| `--radius-md` | 12px | 输入框、普通按钮 |
|
||
| `--radius-lg` | 16px | 主按钮、分类图标 |
|
||
| `--radius-xl` | 20px | 卡片 |
|
||
| `--radius-full` | 9999px | 圆形头像、药丸标签 |
|
||
|
||
### 阴影系统 (粘土风格)
|
||
|
||
| Token | 值 | 用途 |
|
||
|-------|-----|------|
|
||
| `--shadow-clay` | `4px 4px 12px rgba(45,27,27,0.08), inset -2px -2px 6px rgba(45,27,27,0.04)` | 卡片默认 |
|
||
| `--shadow-clay-hover` | `6px 6px 16px rgba(45,27,27,0.12), inset -2px -2px 6px rgba(45,27,27,0.04)` | 卡片悬浮 |
|
||
| `--shadow-clay-pressed` | `inset 2px 2px 6px rgba(45,27,27,0.1)` | 按钮按下 |
|
||
| `--shadow-clay-float` | `8px 8px 24px rgba(45,27,27,0.1), inset -3px -3px 8px rgba(45,27,27,0.05)` | 浮动元素 |
|
||
|
||
---
|
||
|
||
## 页面一: 首页仪表盘
|
||
|
||
### 布局结构
|
||
|
||
```
|
||
┌─────────────────────────────────────────┐
|
||
│ 状态栏 (系统) │ 0px
|
||
├─────────────────────────────────────────┤
|
||
│ │
|
||
│ ┌─ 顶栏 ──────────────────────────┐ │ 12px padding-top
|
||
│ │ [头像] 早上好,小菜 [通知🔔] │ │
|
||
│ └──────────────────────────────────┘ │
|
||
│ │
|
||
│ ┌─ 月度总览卡片 ──────────────────┐ │
|
||
│ │ │ │
|
||
│ │ 本月支出 │ │ 16px padding
|
||
│ │ ¥ 3,280.00 │ │ (Amount XL: 36px Fredoka)
|
||
│ │ │ │
|
||
│ │ ━━━━━━━━━━━━━━━░░░░ 65% │ │ 预算进度条
|
||
│ │ 预算 ¥5,000 · 剩余 ¥1,720 │ │
|
||
│ │ │ │
|
||
│ │ ┌──────┐ ┌──────┐ │ │
|
||
│ │ │收入 │ │支出 │ │ │
|
||
│ │ │¥8,000│ │¥3,280│ │ │
|
||
│ │ └──────┘ └──────┘ │ │
|
||
│ │ │ │
|
||
│ └─────────────────────────────────┘ │
|
||
│ │
|
||
│ ┌─ 快捷操作 ─────────────────────┐ │
|
||
│ │ │ │
|
||
│ │ ┌────────┐┌────────┐┌────────┐│ │
|
||
│ │ │ 💵 ││ 💸 ││ 🔄 ││ │ 3列等分
|
||
│ │ │ 记收入 ││ 记支出 ││ 转账 ││ │ 每个 44px 高
|
||
│ │ └────────┘└────────┘└────────┘│ │
|
||
│ │ │ │
|
||
│ └─────────────────────────────────┘ │
|
||
│ │
|
||
│ ┌─ 近期账单 ─────────────────────┐ │
|
||
│ │ 今天 查看全部 │ │
|
||
│ │ ───────────────────────────── │ │
|
||
│ │ ┌────────────────────────────┐│ │
|
||
│ │ │ 🍜 午餐 -¥35.00 ││ │ 交易项
|
||
│ │ │ 餐饮 · 12:30 ││ │ 高度 64px
|
||
│ │ └────────────────────────────┘│ │
|
||
│ │ ┌────────────────────────────┐│ │
|
||
│ │ │ ☕ 咖啡 -¥18.00 ││ │
|
||
│ │ │ 餐饮 · 09:15 ││ │
|
||
│ │ └────────────────────────────┘│ │
|
||
│ │ │ │
|
||
│ │ 昨天 │ │
|
||
│ │ ───────────────────────────── │ │
|
||
│ │ ┌────────────────────────────┐│ │
|
||
│ │ │ 💰 工资 +¥8,000.00 ││ │
|
||
│ │ │ 收入 · 10:00 ││ │
|
||
│ │ └────────────────────────────┘│ │
|
||
│ │ ┌────────────────────────────┐│ │
|
||
│ │ │ 📦 快递 -¥28.00 ││ │
|
||
│ │ │ 交通 · 15:42 ││ │
|
||
│ │ └────────────────────────────┘│ │
|
||
│ │ │ │
|
||
│ └─────────────────────────────────┘ │
|
||
│ │
|
||
│ ┌─ 底部导航栏 ───────────────────┐ │
|
||
│ │ [首页] [统计] [+] [我的]│ │ 56px 高
|
||
│ │ ● │ │
|
||
│ └─────────────────────────────────┘ │
|
||
│ │
|
||
├─────────────────────────────────────────┤
|
||
│ 安全区域 (Home Indicator) │ 34px
|
||
└─────────────────────────────────────────┘
|
||
```
|
||
|
||
### 顶栏规格
|
||
|
||
```
|
||
高度: 48px
|
||
内边距: 0 24px
|
||
对齐: flex, items-center, justify-between
|
||
|
||
头像: 36×36px, 圆形, 2px 边框 #F0E0D6
|
||
标题: 18px Fredoka 500, #2D1B1B
|
||
通知: 24×24px Lucide Bell 图标, #8B7E7E
|
||
```
|
||
|
||
### 月度总览卡片规格
|
||
|
||
```
|
||
外边距: 0 20px
|
||
内边距: 24px
|
||
圆角: 20px
|
||
背景: #FFFFFF
|
||
阴影: var(--shadow-clay)
|
||
边框: 2px solid #F0E0D6
|
||
|
||
"本月支出" 文字:
|
||
字号: 14px Nunito 400, #8B7E7E
|
||
下方间距: 4px
|
||
|
||
金额:
|
||
字号: 36px Fredoka 600, #2D1B1B
|
||
font-variant-numeric: tabular-nums
|
||
下方间距: 16px
|
||
|
||
进度条:
|
||
高度: 8px, 圆角: 4px
|
||
背景: #F0E0D6
|
||
填充: 渐变 #FF8C69 → #FFB89A
|
||
右侧百分比: 14px Fredoka 500, #FF8C69
|
||
|
||
预算文字:
|
||
12px Nunito 400, #8B7E7E
|
||
margin-top: 8px
|
||
|
||
收支小卡片:
|
||
容器: flex, gap 12px, margin-top 20px
|
||
单卡: flex-1, padding 12px, 圆角 12px, 背景 #FFF8F0
|
||
标签: 12px Nunito 400, #8B7E7E
|
||
金额: 18px Fredoka 600
|
||
收入颜色: #7BC67E
|
||
支出颜色: #FF6B6B
|
||
```
|
||
|
||
### 快捷操作规格
|
||
|
||
```
|
||
外边距: 20px 20px 0
|
||
容器: flex, gap 12px
|
||
|
||
单按钮:
|
||
flex: 1
|
||
高度: 72px
|
||
圆角: 16px
|
||
背景: #FFFFFF
|
||
边框: 2px solid #F0E0D6
|
||
阴影: var(--shadow-clay)
|
||
flex-direction: column
|
||
justify-content: center
|
||
align-items: center
|
||
gap: 4px
|
||
|
||
图标: 28×28px, 居中
|
||
记收入: #7BC67E (Lucide TrendingUp)
|
||
记支出: #FF6B6B (Lucide TrendingDown)
|
||
转账: #6C9BCF (Lucide ArrowLeftRight)
|
||
|
||
文字: 12px Nunito 500, #2D1B1B
|
||
|
||
按下态:
|
||
box-shadow: var(--shadow-clay-pressed)
|
||
transform: scale(0.97)
|
||
transition: 150ms ease-out
|
||
```
|
||
|
||
### 交易列表规格
|
||
|
||
```
|
||
区块标题栏:
|
||
外边距: 24px 20px 12px
|
||
flex, justify-between, items-center
|
||
日期: 14px Nunito 500, #2D1B1B
|
||
"查看全部": 12px Nunito 400, #FF8C69
|
||
|
||
分割线:
|
||
外边距: 0 20px
|
||
高度: 1px, 背景: #F0E0D6
|
||
|
||
交易项:
|
||
外边距: 0 20px
|
||
内边距: 14px 0
|
||
高度: 64px (含分割线)
|
||
flex, items-center, gap 12px
|
||
|
||
分类图标:
|
||
40×40px, 圆角 12px
|
||
背景: 分类对应浅色
|
||
图标: 20×20px, 居中
|
||
|
||
信息区: flex-1
|
||
名称: 14px Nunito 500, #2D1B1B
|
||
副信息: 12px Nunito 400, #8B7E7E
|
||
(格式: "分类 · 时间")
|
||
|
||
金额:
|
||
16px Fredoka 600
|
||
支出: #2D1B1B (带前缀 "-")
|
||
收入: #7BC67E (带前缀 "+")
|
||
font-variant-numeric: tabular-nums
|
||
```
|
||
|
||
### 底部导航栏规格
|
||
|
||
```
|
||
高度: 56px + 34px (安全区域)
|
||
背景: #FFFFFF
|
||
顶部阴影: 0 -2px 12px rgba(45,27,27,0.06)
|
||
圆角: 顶部 20px
|
||
|
||
容器: flex, justify-around, items-center
|
||
安全区: padding-bottom: env(safe-area-inset-bottom)
|
||
|
||
导航项 (4个):
|
||
flex-direction: column
|
||
align-items: center
|
||
gap: 2px
|
||
|
||
图标: 24×24px
|
||
首页: Lucide Home
|
||
统计: Lucide BarChart3
|
||
我的: Lucide User
|
||
|
||
文字: 10px Nunito 500
|
||
默认颜色: #BFB3B3
|
||
选中颜色: #FF8C69
|
||
选中态: 图标填充 + 文字加粗
|
||
|
||
中间 "+" 按钮:
|
||
52×52px, 圆形
|
||
背景: 渐变 #FF8C69 → #E67355
|
||
阴影: 0 4px 16px rgba(255,140,105,0.4)
|
||
图标: Lucide Plus, 28px, 白色
|
||
向上偏移: -12px (悬浮效果)
|
||
按下态: scale(0.93), shadow 减弱
|
||
```
|
||
|
||
---
|
||
|
||
## 页面二: 记账页
|
||
|
||
### 布局结构
|
||
|
||
```
|
||
┌─────────────────────────────────────────┐
|
||
│ 状态栏 │
|
||
├─────────────────────────────────────────┤
|
||
│ │
|
||
│ ┌─ 顶栏 ──────────────────────────┐ │
|
||
│ │ [✕ 关闭] 记一笔 [保存 ✓] │ │
|
||
│ └──────────────────────────────────┘ │
|
||
│ │
|
||
│ ┌─ 支出/收入切换 ─────────────────┐ │
|
||
│ │ ┌──────────┐ ┌──────────┐ │ │
|
||
│ │ │ ● 支出 │ │ 收入 │ │ │
|
||
│ │ └──────────┘ └──────────┘ │ │
|
||
│ └─────────────────────────────────┘ │
|
||
│ │
|
||
│ ┌─ 金额输入区 ────────────────────┐ │
|
||
│ │ │ │
|
||
│ │ ¥ 0.00 │ │ 48px Fredoka
|
||
│ │ │ │
|
||
│ └─────────────────────────────────┘ │
|
||
│ │
|
||
│ ┌─ 分类选择网格 ─────────────────┐ │
|
||
│ │ ┌────┐ ┌────┐ ┌────┐ ┌────┐ │ │
|
||
│ │ │ 🍜 │ │ ☕ │ │ 🛒 │ │ 🚗 │ │ │ 每行 4 列
|
||
│ │ │餐饮 │ │饮品 │ │购物 │ │交通 │ │ │
|
||
│ │ └────┘ └────┘ └────┘ └────┘ │ │
|
||
│ │ ┌────┐ ┌────┐ ┌────┐ ┌────┐ │ │
|
||
│ │ │ 🏠 │ │ 💊 │ │ 📚 │ │ 🎬 │ │ │
|
||
│ │ │住房 │ │医疗 │ │教育 │ │娱乐 │ │ │
|
||
│ │ └────┘ └────┘ └────┘ └────┘ │ │
|
||
│ │ ┌────┐ ┌────┐ ┌────┐ ┌────┐ │ │
|
||
│ │ │ 👕 │ │ 💅 │ │ 📱 │ │ ··· │ │ │
|
||
│ │ │服饰 │ │美容 │ │通讯 │ │更多 │ │ │
|
||
│ │ └────┘ └────┘ └────┘ └────┘ │ │
|
||
│ │ │ │
|
||
│ └─────────────────────────────────┘ │
|
||
│ │
|
||
│ ┌─ 附加信息 ─────────────────────┐ │
|
||
│ │ ┌─────────────────────────┐ │ │
|
||
│ │ │ 📅 今天 (5月27日) ▸ │ │ │ 日期选择
|
||
│ │ └─────────────────────────┘ │ │
|
||
│ │ ┌─────────────────────────┐ │ │
|
||
│ │ │ 📝 添加备注... ▸ │ │ │ 备注输入
|
||
│ │ └─────────────────────────┘ │ │
|
||
│ └─────────────────────────────────┘ │
|
||
│ │
|
||
│ ┌─ 数字键盘 ─────────────────────┐ │
|
||
│ │ ┌────┐ ┌────┐ ┌────┐ ┌────┐ │ │
|
||
│ │ │ 1 │ │ 2 │ │ 3 │ │ 日期│ │ │
|
||
│ │ └────┘ └────┘ └────┘ └────┘ │ │
|
||
│ │ ┌────┐ ┌────┐ ┌────┐ ┌────┐ │ │
|
||
│ │ │ 4 │ │ 5 │ │ 6 │ │ + │ │ │
|
||
│ │ └────┘ └────┘ └────┘ └────┘ │ │
|
||
│ │ ┌────┐ ┌────┐ ┌────┐ ┌────┐ │ │
|
||
│ │ │ 7 │ │ 8 │ │ 9 │ │ - │ │ │
|
||
│ │ └────┘ └────┘ └────┘ └────┘ │ │
|
||
│ │ ┌────┐ ┌────┐ ┌────┐ ┌────┐ │ │
|
||
│ │ │ . │ │ 0 │ │ ⌫ │ │ = │ │ │
|
||
│ │ └────┘ └────┘ └────┘ └────┘ │ │
|
||
│ │ │ │
|
||
│ │ ┌────────────────────────┐ │ │
|
||
│ │ │ ✓ 记好了 │ │ │ 主按钮
|
||
│ │ └────────────────────────┘ │ │
|
||
│ │ │ │
|
||
│ └─────────────────────────────────┘ │
|
||
│ │
|
||
├─────────────────────────────────────────┤
|
||
│ 安全区域 │
|
||
└─────────────────────────────────────────┘
|
||
```
|
||
|
||
### 顶栏规格
|
||
|
||
```
|
||
高度: 48px
|
||
内边距: 0 20px
|
||
flex, justify-between, items-center
|
||
|
||
关闭按钮: 32×32px, Lucide X, #8B7E7E
|
||
标题: 16px Nunito 500, #2D1B1B
|
||
保存按钮: 14px Nunito 600, #FF8C69
|
||
```
|
||
|
||
### 支出/收入切换
|
||
|
||
```
|
||
外边距: 16px 20px
|
||
容器: inline-flex, 背景 #FFF0E6, 圆角 12px, padding 4px
|
||
|
||
标签: 80px 宽, 36px 高, 圆角 10px
|
||
默认: 透明背景, 14px Nunito 400, #8B7E7E
|
||
选中: #FFFFFF 背景, 14px Nunito 600, #FF8C69
|
||
阴影: 2px 2px 8px rgba(45,27,27,0.08)
|
||
切换动画: 200ms ease-in-out
|
||
```
|
||
|
||
### 金额输入区规格
|
||
|
||
```
|
||
外边距: 24px 20px
|
||
高度: 80px
|
||
text-align: center
|
||
|
||
货币符号: 24px Fredoka 500, #BFB3B3
|
||
金额数字: 48px Fredoka 700, #2D1B1B
|
||
font-variant-numeric: tabular-nums
|
||
letter-spacing: 1px
|
||
|
||
光标: 2px 宽, #FF8C69, 闪烁动画
|
||
|
||
输入态变化:
|
||
空状态: "¥ 0.00" 灰色
|
||
输入中: 数字跟随按键逐位显示
|
||
完成: 金额高亮
|
||
```
|
||
|
||
### 分类选择网格规格
|
||
|
||
```
|
||
外边距: 0 20px
|
||
容器: 滚动区域, max-height 约 240px
|
||
|
||
网格: display grid, grid-template-columns: repeat(4, 1fr)
|
||
间距: 12px
|
||
|
||
分类项:
|
||
尺寸: 68×68px (触摸友好)
|
||
flex-direction: column, align-items: center, justify-content: center
|
||
gap: 4px
|
||
|
||
图标容器:
|
||
44×44px, 圆角 14px
|
||
背景: 分类对应浅色 (如餐饮 #FFF0E6)
|
||
flex, center
|
||
图标: 22×22px, 分类对应颜色
|
||
|
||
文字: 11px Nunito 400, #8B7E7E
|
||
|
||
选中态:
|
||
图标容器: 边框 2px solid #FF8C69
|
||
背景: #FFE8E0
|
||
文字: #FF8C69, Nunito 600
|
||
图标放大: scale(1.1), 200ms ease
|
||
|
||
按下态:
|
||
transform: scale(0.95), 100ms
|
||
```
|
||
|
||
### 附加信息区规格
|
||
|
||
```
|
||
外边距: 16px 20px
|
||
|
||
行:
|
||
高度: 48px
|
||
背景: #FFF8F0
|
||
圆角: 12px
|
||
内边距: 0 16px
|
||
flex, items-center, justify-between
|
||
|
||
左侧:
|
||
图标: 18×18px, #8B7E7E
|
||
文字: 14px Nunito 400, #2D1B1B
|
||
gap: 8px
|
||
|
||
右侧:
|
||
箭头: Lucide ChevronRight, 16px, #BFB3B3
|
||
|
||
行间距: 8px
|
||
```
|
||
|
||
### 数字键盘规格
|
||
|
||
```
|
||
外边距: 16px 16px 0
|
||
背景: #FFFFFF
|
||
圆角: 顶部 20px
|
||
padding: 16px
|
||
|
||
按键网格: 4列 × 4行, gap 8px
|
||
|
||
数字键:
|
||
高度: 48px
|
||
圆角: 12px
|
||
背景: #FFF8F0
|
||
文字: 22px Fredoka 500, #2D1B1B
|
||
按下态: 背景 #F0E0D6, 100ms
|
||
|
||
功能键 (日期/+/-/⌫):
|
||
同尺寸
|
||
背景: #FFE8E0
|
||
文字/图标: #FF8C69
|
||
按下态: 背景 #FFD0C0
|
||
|
||
等号键:
|
||
同尺寸
|
||
背景: #FF8C69
|
||
文字: 白色
|
||
按下态: 背景 #E67355
|
||
|
||
主按钮 "记好了":
|
||
外边距: 12px 0
|
||
高度: 52px
|
||
圆角: 16px
|
||
背景: 渐变 #FF8C69 → #E67355
|
||
文字: 18px Nunito 600, 白色
|
||
阴影: 0 4px 16px rgba(255,140,105,0.3)
|
||
按下态: scale(0.97), shadow 减弱
|
||
|
||
禁用态 (金额为0):
|
||
opacity: 0.5
|
||
pointer-events: none
|
||
```
|
||
|
||
---
|
||
|
||
## 页面三: 统计页
|
||
|
||
### 布局结构
|
||
|
||
```
|
||
┌─────────────────────────────────────────┐
|
||
│ 状态栏 │
|
||
├─────────────────────────────────────────┤
|
||
│ │
|
||
│ ┌─ 顶栏 ──────────────────────────┐ │
|
||
│ │ 统计分析 │ │
|
||
│ └──────────────────────────────────┘ │
|
||
│ │
|
||
│ ┌─ 月份选择器 ────────────────────┐ │
|
||
│ │ ◂ 2026年5月 ▸ │ │
|
||
│ └─────────────────────────────────┘ │
|
||
│ │
|
||
│ ┌─ 支出/收入切换 (同记账页) ──────┐ │
|
||
│ │ ┌──────────┐ ┌──────────┐ │ │
|
||
│ │ │ ● 支出 │ │ 收入 │ │ │
|
||
│ │ └──────────┘ └──────────┘ │ │
|
||
│ └─────────────────────────────────┘ │
|
||
│ │
|
||
│ ┌─ 月度概览卡片 ─────────────────┐ │
|
||
│ │ ┌─────────────────────────┐ │ │
|
||
│ │ │ 总支出 ¥3,280.00│ │ │
|
||
│ │ │ 日均 ¥122.00│ │ │
|
||
│ │ │ 笔数 28笔│ │ │
|
||
│ │ └─────────────────────────┘ │ │
|
||
│ └─────────────────────────────────┘ │
|
||
│ │
|
||
│ ┌─ 分类占比 ─────────────────────┐ │
|
||
│ │ 分类占比 │ │
|
||
│ │ │ │
|
||
│ │ ╭─────────────╮ │ │
|
||
│ │ ╱ ┌───────┐ ╲ │ │ 环形图
|
||
│ │ │ │ ¥3,280 │ │ │ │ 中心显示总额
|
||
│ │ │ │ 总支出 │ │ │ │
|
||
│ │ ╲ └───────┘ ╱ │ │
|
||
│ │ ╰─────────────╯ │ │
|
||
│ │ │ │
|
||
│ │ ● 餐饮 38% ● 购物 22% │ │ 图例
|
||
│ │ ● 交通 15% ● 其他 25% │ │
|
||
│ │ │ │
|
||
│ └─────────────────────────────────┘ │
|
||
│ │
|
||
│ ┌─ 每日趋势 ─────────────────────┐ │
|
||
│ │ 每日趋势 │ │
|
||
│ │ │ │
|
||
│ │ ¥200 ┤ │ │
|
||
│ │ │ ╭─╮ │ │ 折线图
|
||
│ │ ¥150 ┤ ╱ ╲ ╭╮ │ │
|
||
│ │ │ ╱ ╲ ╱ ╲ │ │
|
||
│ │ ¥100 ┤╭╯ ╰╯ ╲ │ │
|
||
│ │ │ ╰─ │ │
|
||
│ │ ¥50 ┤ │ │
|
||
│ │ └──┬──┬──┬──┬──┬──┬── │ │
|
||
│ │ 1 5 10 15 20 25 30 │ │
|
||
│ │ │ │
|
||
│ └─────────────────────────────────┘ │
|
||
│ │
|
||
│ ┌─ 分类排行 ─────────────────────┐ │
|
||
│ │ 分类排行 │ │
|
||
│ │ │ │
|
||
│ │ 1 🍜 餐饮 │ │
|
||
│ │ ━━━━━━━━━━━━━━ ¥1,246 │ │ 排行条
|
||
│ │ 12笔 · 38% │ │
|
||
│ │ │ │
|
||
│ │ 2 🛒 购物 │ │
|
||
│ │ ━━━━━━━━━░░░░░ ¥722 │ │
|
||
│ │ 5笔 · 22% │ │
|
||
│ │ │ │
|
||
│ │ 3 🚗 交通 │ │
|
||
│ │ ━━━━━━░░░░░░░░ ¥492 │ │
|
||
│ │ 8笔 · 15% │ │
|
||
│ │ │ │
|
||
│ │ 4 ☕ 饮品 │ │
|
||
│ │ ━━━━░░░░░░░░░░ ¥380 │ │
|
||
│ │ 6笔 · 12% │ │
|
||
│ │ │ │
|
||
│ └─────────────────────────────────┘ │
|
||
│ │
|
||
│ ┌─ 底部导航栏 ───────────────────┐ │
|
||
│ │ [首页] [统计] [+] [我的]│ │
|
||
│ └─────────────────────────────────┘ │
|
||
│ │
|
||
├─────────────────────────────────────────┤
|
||
│ 安全区域 │
|
||
└─────────────────────────────────────────┘
|
||
```
|
||
|
||
### 月份选择器规格
|
||
|
||
```
|
||
外边距: 12px 20px
|
||
高度: 44px
|
||
flex, justify-center, items-center, gap 24px
|
||
|
||
箭头: 24×24px, Lucide ChevronLeft/Right, #8B7E7E
|
||
触摸区域: 44×44px (透明扩展)
|
||
按下态: scale(0.9)
|
||
|
||
月份文字: 16px Fredoka 500, #2D1B1B
|
||
```
|
||
|
||
### 月度概览卡片规格
|
||
|
||
```
|
||
外边距: 16px 20px
|
||
内边距: 20px
|
||
背景: #FFFFFF
|
||
圆角: 20px
|
||
阴影: var(--shadow-clay)
|
||
边框: 2px solid #F0E0D6
|
||
|
||
网格: display grid, grid-template-columns: repeat(3, 1fr)
|
||
文本对齐: center
|
||
|
||
标签: 12px Nunito 400, #8B7E7E, margin-bottom 4px
|
||
金额: 20px Fredoka 600, #2D1B1B
|
||
笔数: 20px Fredoka 600, #2D1B1B (无 ¥ 前缀)
|
||
```
|
||
|
||
### 环形图规格
|
||
|
||
```
|
||
外边距: 20px 20px 0
|
||
卡片: 同概览卡片样式
|
||
|
||
标题: 16px Nunito 500, #2D1B1B, margin-bottom 16px
|
||
|
||
图表:
|
||
尺寸: 200×200px, 居中
|
||
环宽: 24px
|
||
中心文字:
|
||
总额: 20px Fredoka 600, #2D1B1B
|
||
标签: 12px Nunito 400, #8B7E7E
|
||
|
||
图例:
|
||
margin-top: 16px
|
||
flex, wrap, justify-center, gap 16px
|
||
每项: flex, items-center, gap 6px
|
||
圆点: 10×10px, 圆形, 分类颜色
|
||
文字: 12px Nunito 400, #8B7E7E
|
||
百分比: 12px Fredoka 500, #2D1B1B
|
||
|
||
颜色分配:
|
||
餐饮: #FF8C69
|
||
购物: #FFD166
|
||
交通: #6C9BCF
|
||
住房: #7BC67E
|
||
其他: #BFB3B3
|
||
```
|
||
|
||
### 折线图规格
|
||
|
||
```
|
||
外边距: 16px 20px 0
|
||
卡片: 同概览卡片样式
|
||
|
||
标题: 16px Nunito 500, #2D1B1B, margin-bottom 16px
|
||
|
||
图表高度: 160px
|
||
线条: 2px, #FF8C69, 圆角端点
|
||
填充: 渐变, #FF8C69 透明度 15% → 0%
|
||
数据点: 6px 圆, #FF8C69, 2px 白色描边
|
||
hover: 8px, 带 tooltip
|
||
|
||
X 轴标签: 11px Nunito 400, #BFB3B3
|
||
Y 轴标签: 11px Fredoka 400, #BFB3B3
|
||
|
||
网格线: 1px dashed #F0E0D6
|
||
```
|
||
|
||
### 分类排行规格
|
||
|
||
```
|
||
外边距: 16px 20px 24px
|
||
卡片: 同概览卡片样式
|
||
|
||
标题: 16px Nunito 500, #2D1B1B, margin-bottom 16px
|
||
|
||
排行项:
|
||
margin-bottom: 16px (最后一项 0)
|
||
flex, items-center, gap 12px
|
||
|
||
排名: 20px Fredoka 600
|
||
第1名: #FF8C69
|
||
第2名: #FFD166
|
||
第3名: #6C9BCF
|
||
其他: #BFB3B3
|
||
|
||
分类图标: 36×36px, 圆角 10px, 分类浅色背景
|
||
图标: 18×18px, 居中
|
||
|
||
信息区: flex-1
|
||
名称: 14px Nunito 500, #2D1B1B
|
||
|
||
进度条:
|
||
margin-top: 6px
|
||
高度: 6px, 圆角: 3px
|
||
背景: #F0E0D6
|
||
填充: 分类颜色, 宽度 = 百分比
|
||
动画: 600ms ease-out, 延迟 index * 100ms
|
||
|
||
统计: 12px Nunito 400, #8B7E7E
|
||
margin-top: 4px
|
||
格式: "X笔 · XX%"
|
||
|
||
金额:
|
||
16px Fredoka 600, #2D1B1B
|
||
font-variant-numeric: tabular-nums
|
||
```
|
||
|
||
---
|
||
|
||
## 页面四: 我的
|
||
|
||
### 布局结构
|
||
|
||
```
|
||
┌─────────────────────────────────────────┐
|
||
│ 状态栏 │
|
||
├─────────────────────────────────────────┤
|
||
│ │
|
||
│ ┌─ 用户信息卡 ────────────────────┐ │
|
||
│ │ │ │
|
||
│ │ ╭──────╮ │ │
|
||
│ │ │ 头像 │ 小菜 │ │ 64px 头像
|
||
│ │ ╰──────╯ 记账小能手 │ │
|
||
│ │ │ │
|
||
│ │ 已记账 128 天 · 累计 526 笔 │ │
|
||
│ │ │ │
|
||
│ └─────────────────────────────────┘ │
|
||
│ │
|
||
│ ┌─ 快捷统计 ─────────────────────┐ │
|
||
│ │ ┌────────┐┌────────┐┌────────┐│ │
|
||
│ │ │ 本月 ││ 本季 ││ 本年 ││ │
|
||
│ │ │ ¥3,280 ││ ¥9,840 ││¥38,500││ │
|
||
│ │ └────────┘└────────┘└────────┘│ │
|
||
│ └─────────────────────────────────┘ │
|
||
│ │
|
||
│ ┌─ 功能列表 ─────────────────────┐ │
|
||
│ │ │ │
|
||
│ │ ┌─────────────────────────┐ │ │
|
||
│ │ │ 💰 预算设置 ▸ │ │ │
|
||
│ │ └─────────────────────────┘ │ │
|
||
│ │ ┌─────────────────────────┐ │ │
|
||
│ │ │ 🏷️ 分类管理 ▸ │ │ │
|
||
│ │ └─────────────────────────┘ │ │
|
||
│ │ ┌─────────────────────────┐ │ │
|
||
│ │ │ 📤 数据导出 ▸ │ │ │
|
||
│ │ └─────────────────────────┘ │ │
|
||
│ │ ┌─────────────────────────┐ │ │
|
||
│ │ │ 🔄 数据备份 ▸ │ │ │
|
||
│ │ └─────────────────────────┘ │ │
|
||
│ │ │ │
|
||
│ └─────────────────────────────────┘ │
|
||
│ │
|
||
│ ┌─ 设置列表 ─────────────────────┐ │
|
||
│ │ │ │
|
||
│ │ ┌─────────────────────────┐ │ │
|
||
│ │ │ 🌙 深色模式 [开关] │ │ │
|
||
│ │ └─────────────────────────┘ │ │
|
||
│ │ ┌─────────────────────────┐ │ │
|
||
│ │ │ 🔔 记账提醒 [开关] │ │ │
|
||
│ │ └─────────────────────────┘ │ │
|
||
│ │ ┌─────────────────────────┐ │ │
|
||
│ │ │ 🌐 语言 中文 ▸│ │ │
|
||
│ │ └─────────────────────────┘ │ │
|
||
│ │ ┌─────────────────────────┐ │ │
|
||
│ │ │ ℹ️ 关于小菜 ▸ │ │
|
||
│ │ └─────────────────────────┘ │ │
|
||
│ │ │ │
|
||
│ └─────────────────────────────────┘ │
|
||
│ │
|
||
│ ┌─ 底部导航栏 ───────────────────┐ │
|
||
│ │ [首页] [统计] [+] [我的]│ │
|
||
│ └─────────────────────────────────┘ │
|
||
│ │
|
||
├─────────────────────────────────────────┤
|
||
│ 安全区域 │
|
||
└─────────────────────────────────────────┘
|
||
```
|
||
|
||
### 用户信息卡规格
|
||
|
||
```
|
||
外边距: 0 20px
|
||
内边距: 24px
|
||
背景: 渐变 #FF8C69 → #FFB89A
|
||
圆角: 20px
|
||
阴影: var(--shadow-clay-float)
|
||
|
||
头像:
|
||
64×64px, 圆形
|
||
边框: 3px solid rgba(255,255,255,0.6)
|
||
背景: #FFF8F0 (无头像时显示 Lucide User 图标)
|
||
|
||
用户名:
|
||
20px Fredoka 600, 白色
|
||
margin-top: 12px (若头像在上方布局)
|
||
|
||
签名:
|
||
14px Nunito 400, rgba(255,255,255,0.8)
|
||
|
||
统计:
|
||
12px Nunito 400, rgba(255,255,255,0.7)
|
||
margin-top: 12px
|
||
|
||
布局: flex, items-center, gap 16px (头像左,文字右)
|
||
```
|
||
|
||
### 快捷统计规格
|
||
|
||
```
|
||
外边距: 16px 20px
|
||
容器: flex, gap 12px
|
||
|
||
单卡:
|
||
flex: 1
|
||
内边距: 16px 12px
|
||
背景: #FFFFFF
|
||
圆角: 16px
|
||
阴影: var(--shadow-clay)
|
||
边框: 2px solid #F0E0D6
|
||
text-align: center
|
||
|
||
标签: 12px Nunito 400, #8B7E7E, margin-bottom 4px
|
||
金额: 16px Fredoka 600, #2D1B1B
|
||
```
|
||
|
||
### 功能列表规格
|
||
|
||
```
|
||
外边距: 20px 20px 0
|
||
卡片:
|
||
背景: #FFFFFF
|
||
圆角: 20px
|
||
阴影: var(--shadow-clay)
|
||
边框: 2px solid #F0E0D6
|
||
overflow: hidden
|
||
|
||
列表项:
|
||
高度: 56px
|
||
内边距: 0 20px
|
||
flex, items-center, justify-between
|
||
border-bottom: 1px solid #F0E0D6 (最后一项无)
|
||
|
||
左侧:
|
||
图标: 20×20px, #FF8C69
|
||
文字: 14px Nunito 500, #2D1B1B
|
||
gap: 12px
|
||
|
||
右侧:
|
||
箭头: Lucide ChevronRight, 16px, #BFB3B3
|
||
|
||
按下态:
|
||
background: #FFF8F0
|
||
transition: 150ms
|
||
|
||
列表间距: 16px (卡片之间)
|
||
```
|
||
|
||
### 开关规格
|
||
|
||
```
|
||
尺寸: 48×28px
|
||
圆角: 14px
|
||
关闭态:
|
||
背景: #F0E0D6
|
||
滑块: 22×22px, 白色, 左侧 3px
|
||
开启态:
|
||
背景: #FF8C69
|
||
滑块: 22×22px, 白色, 右侧 3px
|
||
切换动画: 200ms ease-in-out
|
||
```
|
||
|
||
---
|
||
|
||
## 组件库
|
||
|
||
### AmountCard 组件
|
||
|
||
```
|
||
用途: 显示金额的卡片容器
|
||
Props:
|
||
- title: string (标题文字)
|
||
- amount: number (金额,分)
|
||
- prefix: '+' | '-' | '' (前缀)
|
||
- variant: 'default' | 'warm' | 'primary'
|
||
- trend: { value: number, direction: 'up' | 'down' }
|
||
|
||
默认态:
|
||
背景: #FFFFFF, 阴影: var(--shadow-clay)
|
||
|
||
变体:
|
||
warm: 背景 #FFF0E6
|
||
primary: 背景 渐变 #FF8C69 → #FFB89A, 文字白色
|
||
```
|
||
|
||
### TransactionItem 组件
|
||
|
||
```
|
||
用途: 交易列表项
|
||
Props:
|
||
- icon: string (分类图标名)
|
||
- iconColor: string (图标颜色)
|
||
- iconBg: string (图标背景色)
|
||
- name: string (交易名称)
|
||
- category: string (分类名)
|
||
- time: string (时间)
|
||
- amount: number (金额,分)
|
||
- type: 'expense' | 'income'
|
||
|
||
布局: 64px 高, flex, items-center, gap 12px
|
||
点击态: background #FFF8F0, 100ms
|
||
```
|
||
|
||
### CategoryIcon 组件
|
||
|
||
```
|
||
用途: 分类图标
|
||
Props:
|
||
- name: string (Lucide 图标名)
|
||
- size: 'sm' | 'md' | 'lg' (20 | 24 | 28px)
|
||
- color: string (图标颜色)
|
||
- bgColor: string (背景色)
|
||
- selected: boolean
|
||
|
||
尺寸映射:
|
||
sm: 容器 32px, 图标 16px, 圆角 8px
|
||
md: 容器 44px, 图标 22px, 圆角 12px
|
||
lg: 容器 56px, 图标 28px, 圆角 14px
|
||
```
|
||
|
||
### BudgetBar 组件
|
||
|
||
```
|
||
用途: 预算进度条
|
||
Props:
|
||
- total: number (预算总额,分)
|
||
- used: number (已用金额,分)
|
||
- showLabel: boolean (是否显示标签)
|
||
|
||
结构:
|
||
轨道: 高度 8px, 圆角 4px, 背景 #F0E0D6
|
||
填充: 渐变 #FF8C69 → #FFB89A, 宽度 = used/total * 100%
|
||
超支态: 填充颜色变为 #FF6B6B
|
||
|
||
标签:
|
||
flex, justify-between, margin-top 8px
|
||
"预算 ¥X,XXX" 左对齐, 12px Nunito 400, #8B7E7E
|
||
"XX%" 右对齐, 14px Fredoka 500, #FF8C69
|
||
|
||
动画: 宽度变化 600ms ease-out
|
||
```
|
||
|
||
### BottomNav 组件
|
||
|
||
```
|
||
用途: 底部导航栏
|
||
Props:
|
||
- current: 'home' | 'stats' | 'profile'
|
||
- onNavigate: (page) => void
|
||
|
||
结构: (见首页规格)
|
||
高度: 56px + safe-area
|
||
4个导航项 + 中间浮动 "+" 按钮
|
||
|
||
选中态:
|
||
图标: 填充色 #FF8C69
|
||
文字: #FF8C69, Nunito 600
|
||
|
||
默认态:
|
||
图标: 线条 #BFB3B3
|
||
文字: #BFB3B3, Nunito 400
|
||
```
|
||
|
||
---
|
||
|
||
## 交互状态
|
||
|
||
### 按钮状态矩阵
|
||
|
||
| 状态 | Primary | Secondary | Ghost | Danger |
|
||
|------|---------|-----------|-------|--------|
|
||
| Default | bg #FF8C69, shadow clay | bg white, border #FF8C69 | text #FF8C69 | bg #FF6B6B |
|
||
| Hover | bg #E67355 | bg #FFF0E6 | bg #FFF0E6 | bg #E65555 |
|
||
| Pressed | scale(0.97), inset shadow | scale(0.97), inset shadow | bg #FFE8E0 | scale(0.97) |
|
||
| Disabled | opacity 0.5 | opacity 0.5 | opacity 0.5 | opacity 0.5 |
|
||
| Loading | spinner + 文字 | spinner + 文字 | spinner + 文字 | spinner + 文字 |
|
||
|
||
### 页面切换动画
|
||
|
||
```
|
||
进入: opacity 0→1, translateY 8px→0, 250ms ease-out
|
||
离开: opacity 1→0, translateY 0→-8px, 200ms ease-in
|
||
|
||
Tab 切换: 水平滑动, 250ms ease-in-out
|
||
左→右: translateX -20px → 0
|
||
右→左: translateX 20px → 0
|
||
```
|
||
|
||
### 列表项交错入场
|
||
|
||
```
|
||
每项延迟: 50ms
|
||
动画: opacity 0→1, translateY 12px→0, 300ms ease-out
|
||
最大交错: 5项 (250ms)
|
||
|
||
prefers-reduced-motion: 无动画, 直接显示
|
||
```
|
||
|
||
### 数字变化动画
|
||
|
||
```
|
||
金额变化: 逐位滚动, 400ms ease-out
|
||
实现: requestAnimationFrame + easeOutCubic 缓动函数
|
||
font-variant-numeric: tabular-nums 防止宽度跳动
|
||
|
||
预算进度条: 宽度过渡, 600ms ease-out
|
||
```
|
||
|
||
---
|
||
|
||
## 响应式适配
|
||
|
||
### 断点
|
||
|
||
| 断点 | 宽度 | 设备 | 布局调整 |
|
||
|------|------|------|----------|
|
||
| xs | < 375px | 小屏手机 | 缩小间距, 字号减 1px |
|
||
| sm | 375-414px | 标准手机 | 基准设计 |
|
||
| md | 415-768px | 大手机/小平板 | 内容区 max-width 480px 居中 |
|
||
| lg | > 768px | 平板/H5 | 双列布局, 侧边导航 |
|
||
|
||
### 小程序 rpx 换算
|
||
|
||
```
|
||
设计稿 375px → 750rpx
|
||
1px = 2rpx
|
||
|
||
字号 rpx:
|
||
12px → 24rpx
|
||
14px → 28rpx
|
||
16px → 32rpx
|
||
18px → 36rpx
|
||
20px → 40rpx
|
||
22px → 44rpx
|
||
24px → 48rpx
|
||
36px → 72rpx
|
||
48px → 96rpx
|
||
```
|
||
|
||
### H5 适配
|
||
|
||
```
|
||
桌面端 (>768px):
|
||
内容区: max-width 420px, 居中
|
||
背景: #F0E0D6 (深色底)
|
||
手机框: 圆角 32px, 阴影, 模拟手机外观
|
||
|
||
平板端 (768-1024px):
|
||
内容区: max-width 480px, 居中
|
||
```
|
||
|
||
---
|
||
|
||
## 无障碍清单
|
||
|
||
- [ ] 所有图标按钮有 `aria-label`
|
||
- [ ] 颜色对比度 ≥ 4.5:1 (文字)
|
||
- [ ] 颜色对比度 ≥ 3:1 (大文字/图标)
|
||
- [ ] 触摸目标 ≥ 44×44px
|
||
- [ ] 焦点状态可见 (键盘导航)
|
||
- [ ] `prefers-reduced-motion` 尊重
|
||
- [ ] 表单输入有对应 label
|
||
- [ ] 图表提供数据表格替代
|
||
- [ ] 金额读屏: "三千二百八十元"
|
||
|
||
---
|
||
|
||
## 暗色模式预留
|
||
|
||
> 暗色模式为 v2 功能,此处仅定义 token 映射
|
||
|
||
| Token | Light | Dark |
|
||
|-------|-------|------|
|
||
| Background | #FFF8F0 | #1A1412 |
|
||
| Surface | #FFFFFF | #2D2422 |
|
||
| Surface Warm | #FFF0E6 | #3D2E2A |
|
||
| Text Primary | #2D1B1B | #F5EDE8 |
|
||
| Text Secondary | #8B7E7E | #A89890 |
|
||
| Border | #F0E0D6 | #4A3C38 |
|
||
| Primary | #FF8C69 | #FF8C69 (不变) |
|
||
| Shadow | rgba(45,27,27,0.08) | rgba(0,0,0,0.3) |
|