一个简洁高效的家庭资产管理 Dashboard,支持多币种账户管理、净值追踪、历史走势分析和汇率管理。
- 多币种账户管理:支持人民币(RMB)、美元(USD)、港币(HKD)
- 净值追踪:记录账户净值变化,支持历史回溯
- 资产汇总:自动计算总资产(按汇率转换为人民币)
- 股票占比统计:追踪投资组合中股票资产占比
- 标签分类:通过标签对账户进行分类管理
- 总资产走势图:支持月度/季度/年度视图
- 账户净值历史:每日/每周/每月粒度的净值折线图
- 资产分布柱状图:直观展示各账户资产占比
- 汇率实时显示:顶部状态栏显示当前汇率
- 更新记录:完整的净值更新历史,显示变化值
- 汇率管理:支持手动更新或从 API 自动刷新汇率
- 账户编辑:支持修改账户所有属性(名称、币种、初始净值、标签等)
- React 18 - UI 框架
- Vite - 构建工具
- Recharts - 数据可视化
- React Router - 路由管理
- Node.js + Express - API 服务
- better-sqlite3 - SQLite 数据库
- node-fetch - 汇率 API 调用
- Yarn Workspaces - Monorepo 管理
- Concurrently - 并行启动前后端
wealth_ui/
├── client/ # React 前端
│ ├── src/
│ │ ├── api/ # API 调用封装
│ │ ├── components/ # React 组件
│ │ ├── hooks/ # 自定义 Hooks
│ │ ├── pages/ # 页面组件
│ │ └── main.jsx # 入口文件
│ └── package.json
├── server/ # Express 后端
│ ├── src/
│ │ ├── db/ # 数据库 schema 和初始化
│ │ ├── routes/ # API 路由
│ │ ├── services/ # 业务逻辑
│ │ ├── utils/ # 工具函数
│ │ └── index.js # 服务入口
│ ├── data/ # SQLite 数据库文件
│ └── package.json
└── package.json # 根配置
- Node.js >= 16
- Yarn >= 1.22
yarn install汇率功能支持两种方式:
- 手动编辑:在首页顶部点击汇率可直接修改
- API 自动刷新:配置 API key 后可自动获取最新汇率
如需使用 API 自动刷新,创建 .env 文件:
EXCHANGERATE_API_KEY=your_api_key_here
PORT=16888获取免费 API key:访问 ExchangeRate-API 注册即可获得免费额度(每月 1500 次请求)。
yarn devyarn prod # 构建并启动(推荐)或分步执行:
yarn build # 构建前端 → server/public
yarn start # 启动服务(端口 16888)docker compose up --build方式一:导出镜像导入 NAS(推荐)
在有 Docker 的电脑上构建并导出:
docker build -t wealth-ui:latest .
docker save -o wealth-ui.tar wealth-ui:latest将 wealth-ui.tar 上传到 NAS,通过 Docker 管理界面导入镜像并创建容器:
- 端口映射:
16888 → 16888 - 存储卷:NAS 目录(如
/docker/wealth-ui/data)→ 容器/app/data
方式二:NAS 上直接构建
git clone https://github.com/mrj666/wealth-ui.git
cd wealth-ui
docker compose up -d --build数据持久化
SQLite 数据存储在容器的 /app/data 目录,通过 volume 映射到宿主机。升级时数据不会丢失:
docker compose down
git pull
docker compose up -d --build数据备份:只需备份宿主机上映射的 data 文件夹。
- 进入「账户管理」页面
- 点击「+ 添加账户」
- 填写账户信息:
- 账户名称(必填)
- 币种(必填)
- 初始净值(可选)
- 初始净值日期(可选)
- 标签(可选,逗号分隔)
- 股票占比(可选)
- 备注(可选)
- 在首页账户净值折线图右上角点击「更新净值」按钮
- 填写净值、日期、随记(可选)
- 保存后会在「更新记录」中留下历史记录
- 在「账户管理」页面点击「编辑」
- 可修改账户所有属性,包括初始净值
- 编辑初始净值不会留下更新记录,直接覆盖
- 首页顶部显示当前汇率
- 点击汇率可手动编辑
- 点击「刷新汇率」从 API 自动更新
- 首页:总资产走势、资产分布柱状图、账户净值历史
- 账户管理:账户列表、标签筛选
- 更新记录:所有净值更新历史
id- 账户 IDname- 账户名称currency- 币种(RMB/USD/HKD)description- 备注tags- 标签(逗号分隔)stock_ratio- 股票占比(%)created_at- 创建时间updated_at- 更新时间
id- 记录 IDaccount_id- 账户 ID(外键)value- 净值date- 日期note- 随记stock_ratio- 股票占比(可覆盖账户默认值)created_at- 创建时间
id- 汇率 IDcurrency- 币种(USD/HKD)rate_to_rmb- 对人民币汇率updated_at- 更新时间
GET /api/accounts- 获取所有账户POST /api/accounts- 创建账户PUT /api/accounts/:id- 更新账户DELETE /api/accounts/:id- 删除账户GET /api/accounts/:id/valuations- 获取账户净值历史
POST /api/valuations- 添加净值记录GET /api/valuations/history- 获取所有更新记录
GET /api/exchange-rates- 获取汇率POST /api/exchange-rates/refresh- 刷新汇率PUT /api/exchange-rates/:currency- 更新汇率
GET /api/aggregated- 获取资产汇总GET /api/aggregated/total-history?days=30- 获取总资产历史
- 数据库索引:
valuations(account_id, date)复合索引 - 查询优化:使用 SQL 窗口函数计算变化值
- 前端缓存:React hooks 缓存 API 响应
- 日期处理:统一使用 UTC+8 时区
- 使用 ES6+ 语法
- 组件使用函数式组件 + Hooks
- API 调用统一封装在
client/src/api/index.js
feat:新功能fix:修复 bugrefactor:重构ui:UI 调整docs:文档更新
MIT