# personal-finance
**Repository Path**: amespaces/personal-finance
## Basic Information
- **Project Name**: personal-finance
- **Description**: 一个用rust 开发的个人记账项目, 全程使用AI, 部分接口存在bug待修改
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-05-18
- **Last Updated**: 2026-05-28
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 个人记账 Web 项目 - 需求与设计说明书 (v1.0)
> **核心目标**:构建一个高性能、类型安全、用户体验优秀的个人记账 Web 应用。
> **后端技术**:Rust (Axum + SQLx + PostgreSQL)
> **前端技术**:React + Vite + TypeScript + Tailwind CSS + shadcn/ui
---
## 一、 技术栈架构
### 1.1 后端 (Backend)
| 层级 | 推荐方案 | 选型理由 |
|------|---------|----------|
| **Web 框架** | **Axum** + **Tokio** | 轻量、生态成熟、与 Tower 中间件无缝集成,适合高并发 API |
| **数据库/ORM** | **SQLx** + **PostgreSQL** | 编译期 SQL 检查(零运行时语法错误),全异步,高性能连接池 |
| **验证与序列化** | **serde** + **validator** | Rust 生态标准,JSON 解析与入参校验的一站式方案 |
| **鉴权** | **jsonwebtoken** (JWT) + **bcrypt** | 无状态认证,密码哈希存储,适合 RESTful API |
| **时间/金额** | **chrono** + **rust_decimal** | 统一 UTC 时间处理;避免浮点数精度丢失 |
### 1.2 前端 (Frontend)
| 层级 | 推荐方案 | 选型理由 |
|------|---------|----------|
| **框架** | **React** + **Vite** + **TypeScript** | 开发体验极佳,构建速度快,类型安全 |
| **样式** | **Tailwind CSS** | 原子化 CSS,开发效率高,支持 Dark Mode |
| **组件库** | **shadcn/ui** | 无头组件,高度可定制,UI 现代化且简洁 |
| **状态管理** | **Zustand** + **React Query** | 轻量全局状态 + 强大的服务端数据缓存/同步 |
| **图表库** | **Recharts** | 轻量级,基于 SVG,与 React 生态完美契合 |
---
## 二、 后端功能说明
### 2.1 核心模块划分
| 模块 | 功能描述 | 关键 API 路由 |
|------|---------|-------------|
| **用户认证** | 注册、登录、JWT 签发与校验 | `POST /api/v1/auth/register`
`POST /api/v1/auth/login` |
| **分类管理** | 预设分类、自定义增删改 | `GET /api/v1/categories`
`POST /api/v1/categories` |
| **账单管理** | 增删改查、软删除、多条件筛选 | `GET /api/v1/transactions`
`POST /api/v1/transactions`
`PUT /api/v1/transactions/:id` |
| **预算模块** | 月度预算设置、进度计算、预警 | `GET /api/v1/budgets`
`PUT /api/v1/budgets/:month` |
| **数据统计** | 收支汇总、分类占比、趋势分析 | `GET /api/v1/reports/summary`
`GET /api/v1/reports/trend` |
### 2.2 关键架构设计
- **统一错误响应**:
```json
{ "code": 400, "message": "业务错误描述", "data": null }
```
- **权限控制**:通过 JWT 中间件提取 `user_id`,所有 SQL 查询强制注入 `WHERE user_id = $1`,防止越权。
- **分页查询**:采用 `Offset` 或 `Cursor` 分页策略,避免大数据量下的性能瓶颈。
---
## 三、 前端页面与交互设计
### 3.1 整体布局
- **响应式设计**:桌面端左侧固定导航栏;移动端底部 Tab Bar 导航。
- **主题支持**:内置 Light/Dark 模式,支持跟随系统自动切换。
- **交互原则**:
- **乐观更新 (Optimistic UI)**:列表操作(增删)即时反馈 UI,后台异步处理。
- **加载状态**:首屏使用 Skeleton 骨架屏,避免页面闪烁。
- **空状态**:无数据时展示插画与引导操作(如“开始记第一笔”)。
### 3.2 页面路由结构
| 路由路径 | 页面名称 | 核心组件与功能 |
|----------|---------|----------------|
| `/dashboard` | **概览页** | 卡片(本月结余/收支)、环形图(分类占比)、快速记账 FAB 按钮 |
| `/transactions` | **账单列表** | 顶部过滤栏(日期/类型/分类)、流水列表(无限滚动)、编辑/删除抽屉 |
| `/reports` | **报表页** | 时间轴选择器、折线图(收支趋势)、柱状图(分类对比)、CSV 导出 |
| `/budget` | **预算管理** | 预算进度条(绿/黄/红三色阈值)、按月/分类设置 |
| `/settings` | **设置** | 偏好设置(货币/主题)、数据管理(导入导出)、账户安全 |
---
## 四、 核心数据模型 (SQLx / PostgreSQL)
```sql
-- 1. 用户表 (Users)
CREATE TABLE users (
id VARCHAR(36) PRIMARY KEY DEFAULT (UUID()),
email VARCHAR(255) UNIQUE NOT NULL,
password_hash VARCHAR(255) NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
-- 2. 分类表 (Categories)
CREATE TABLE categories (
id VARCHAR(36) PRIMARY KEY DEFAULT (UUID()),
user_id VARCHAR(36) NOT NULL,
name VARCHAR(50) NOT NULL,
type ENUM('income', 'expense') NOT NULL,
icon VARCHAR(50), -- 图标标识
color VARCHAR(7), -- Hex 颜色
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
-- 3. 账单表 (Transactions)
CREATE TABLE transactions (
id VARCHAR(36) PRIMARY KEY DEFAULT (UUID()),
user_id VARCHAR(36) NOT NULL,
category_id VARCHAR(36) DEFAULT NULL,
amount DECIMAL(12,2) NOT NULL CHECK (amount > 0),
type ENUM('income', 'expense') NOT NULL,
date DATE NOT NULL,
note TEXT,
tags JSON, -- JSON 类型
is_deleted BOOLEAN DEFAULT FALSE, -- MySQL 中 BOOLEAN 是 TINYINT(1) 的别名
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id),
FOREIGN KEY (category_id) REFERENCES categories(id) ON DELETE SET NULL
);
-- 4. 预算表 (Budgets)
CREATE TABLE budgets (
id VARCHAR(36) PRIMARY KEY DEFAULT (UUID()),
user_id VARCHAR(36) NOT NULL,
category_id VARCHAR(36) DEFAULT NULL,
month VARCHAR(7) NOT NULL, -- 格式: YYYY-MM
limit_amount DECIMAL(12,2) NOT NULL,
FOREIGN KEY (user_id) REFERENCES users(id),
FOREIGN KEY (category_id) REFERENCES categories(id) ON DELETE CASCADE,
UNIQUE KEY unique_user_category_month (user_id, category_id, month)
);
```
---
## 五、 开发里程碑 (Milestones)
| 阶段 | 目标内容 | 预计工时 |
|------|---------|----------|
| **Phase 1 (MVP)** | 用户鉴权 + 账单 CRUD + 分类管理 + 基础列表页 | 1 - 2 周 |
| **Phase 2** | 概览数据聚合 + 图表集成 + 预算模块开发 | 1 周 |
| **Phase 3** | 报表导出 + 高级筛选 + 响应式适配 + PWA 支持 | 1 周 |
| **Phase 4 (Opt)** | 性能优化 (Redis 缓存) + 批量导入 + 单元测试覆盖 | 持续 |
---
## 六、 Rust 开发特别提示 (避坑指南)
1. **精度问题**:金额字段务必使用 `rust_decimal`,严禁使用 `f64`。
2. **SQLx 编译检查**:本地开发开启离线模式 `SQLX_OFFLINE=true`,避免 CI/CD 环境无数据库导致编译失败。
3. **时间处理**:
* 数据库存储 `TIMESTAMPTZ` (带时区)。
* 后端统一转为 `chrono::Utc`。
* 前端展示时再转换为用户本地时区。
4. **错误处理**:使用 `thiserror` 定义底层错误,`anyhow` 处理应用层错误链。
5. **结构体设计**:数据库实体 (`Model`) 与 API 响应 (`DTO`) 必须分离,避免敏感字段泄露。