diff --git a/.gitignore b/.gitignore index a19f004..659191e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,11 +1,11 @@ -# ---> Vue -# gitignore template for Vue.js projects -# -# Recommended template: Node.gitignore - -# TODO: where does this rule come from? -docs/_book - -# TODO: where does this rule come from? -test/ - +# ---> Vue +# gitignore template for Vue.js projects +# +# Recommended template: Node.gitignore + +# TODO: where does this rule come from? +docs/_book + +# TODO: where does this rule come from? +test/ + diff --git a/README.md b/README.md index 07138d3..b830c7a 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,2 @@ -# fire_goal - +# fire_goal + diff --git a/docs/01-需求文档-PRD.md b/docs/01-需求文档-PRD.md new file mode 100644 index 0000000..60183d3 --- /dev/null +++ b/docs/01-需求文档-PRD.md @@ -0,0 +1,75 @@ +# 01 · 需求文档(PRD) + +> 个人 FIRE 自律 App | 版本 v0.1(MVP 定义) + +## 一、背景与目标 + +用户已制定个人 FIRE 计划(详见 `../我的FIRE计划与建议.md`),核心诉求是: +**"开发一个适合自己情况的、通用的 FIRE App,每天监督自己把行为对齐 FIRE 要求。"** + +现有开源工具(Firefly III 等)偏专业记账、需自托管运维,且不做"每日行为自律"。因此决定自研一个**轻量、跨端、可自托管**的工具。 + +## 二、用户画像 + +| 维度 | 信息 | +|---|---| +| 年龄 | 40 岁以上 | +| FIRE 路线 | **Barista FIRE(半退休)** | +| 目标本金 | 约 43–71 万(中性取 71 万) | +| 现状 | 起始本金 7 万,每月定投 1500,持有工商银行等 | +| 技术条件 | 有腾讯云 VPS + 域名(certbot/HTTPS)、Synology NAS、可用 Docker;偏好数据自己掌握 | +| 平台诉求 | 希望能打包成 **iOS + Android** App,最好不依赖 Mac | + +## 三、产品定位 + +> 自托管、跨端的**个人 FIRE 自律工具** = 「自律闹钟」+「目标进度仪表盘」,**不是专业会计软件**。 + +设计原则: +1. **每天 30 秒能用完** —— 自律优先,低摩擦。 +2. **绑定个人真实目标** —— 内置用户的 71 万目标、3.5% 提取率等参数。 +3. **数据自己掌握** —— 本地优先,可同步到自己的服务器(腾讯云 VPS)。 +4. **够用即可** —— 不追求复式记账级别的专业度。 + +## 四、功能需求(MVP 四大模块) + +### 1. 每日行为打卡 🟥 核心 +- 每日勾选清单:✅记账了 ✅无冲动消费 ✅定投到账 ✅复盘。 +- 连续打卡天数、本月/本周完成率统计。 +- 目的:把"对齐 FIRE 行为"变成可坚持的日常习惯。 + +### 2. 目标进度 & 净资产 +- 录入当前资产,自动显示**距离 71 万目标的进度条**。 +- 储蓄率、净资产曲线。 + +### 3. FIRE 测算器 +- 搬入 `../FIRE可调测算表.xlsx` 的逻辑。 +- 可调参数:起始本金 / 每月定投 / 兼职收入 / 安全提取率 / 收益率。 +- 自动计算:目标本金、达成年限(保守/中性/乐观三档)。 + +### 4. 持仓 & 分红跟踪 +- 记录工行等持仓的成本/市值/股息率/分红。 +- 提醒:按估值加仓、分红复投。 +- ⚠️ 第一版**手动录入**,不接实时行情(见风险文档)。 + +## 五、非功能需求 + +- **跨端**:H5(网页/PWA)、App(iOS/Android),小程序可选(后置)。 +- **用户端骨架**:基于开源脚手架 **unibest**(uni-app + Vue3)。 +- **后端**:Go + Gin + GORM + SQLite,部署在用户腾讯云 VPS(Docker + Nginx + certbot HTTPS);NAS 可作备份/备选。 +- **管理端**:**Web 管理后台(无构建)**,Gin html/template + HTMX + Alpine + **Tabler**(Bootstrap5 后台皮肤),由 Go 进程直接托管(并入 `server/`),电脑端登录,用于数据增删改查、报表、参数调整;与用户端共用同一后端与数据库。单人自管,不做多用户权限。 +- **离线可用**:本地优先,联网时同步。 +- **隐私**:财务数据不经第三方云。 + +## 六、范围边界(本期不做) + +- ❌ 复式记账 / 多账户专业账本(用 Firefly III 那类)。 +- ❌ 实时股票行情接入(数据源不稳定,先手动录入)。 +- ❌ 微信小程序首发(HTTPS 已就绪,但仍需域名 ICP 备案,故本期后置,见风险文档)。 +- ❌ 多用户 / 社交功能(个人自用)。 + +## 七、验收标准(MVP) + +1. 浏览器(H5)中四大模块可用,数据本地持久化。 +2. 能打出可安装的 Android 包并在手机使用。 +3. 「打卡 + 目标进度」形成每日可用闭环。 +4. 测算器结果与 Excel 测算表一致。 diff --git a/docs/02-技术选型.md b/docs/02-技术选型.md new file mode 100644 index 0000000..78c5456 --- /dev/null +++ b/docs/02-技术选型.md @@ -0,0 +1,63 @@ +# 02 · 技术选型 + +> 记录"如何把一套代码打包成 iOS + Android"的方案对比与最终决策。 + +## 一、候选方案对比 + +| 方案 | 原理 | iOS 免 Mac | 出微信小程序 | 自托管当网页 | 生态 | +|---|---|---|---|---|---| +| **uni-app** ✅选定 | Vue 语法,一套代码多端,HBuilderX 云打包 | ✅ 云打包 | ✅ | ✅(H5) | 中文/Vue | +| Capacitor + React | 网页 App 套原生壳 | ❌ 需 Mac | ❌ | ✅(更原生) | React/英文 | +| Flutter | Dart 编译双端原生 + Web | ❌ 需 Mac | ❌ | 一般 | Dart | +| React Native / Expo | JS 原生组件,Expo 可云构建 | ⚠️ 可云构建 | ❌ | ❌ | React | + +## 二、最终决策 + +**前端框架:经典 uni-app(Vue 3)** + +选它的三个决定性理由(贴合用户约束): +1. **iOS 能云打包,不用 Mac** —— 直接解决用户"没有 Mac 也想出 iOS 包"的痛点。 +2. **一套代码可顺手出微信小程序** —— 方便分享给家人/组员,免安装。 +3. **中文生态、文档、社区**,Vue 上手快,图表库(uCharts/qiun-data-charts)成熟。 + +> 为什么不用 uni-app x:性能更强但插件生态不成熟,财务仪表盘类用经典版(Vue)更省事。 + +## 三、必须明确的现实约束(iOS 相关) + +uni-app 云打包能省掉 **Mac 电脑**,但**苹果的规矩绕不开**: + +1. **Apple 开发者账号 $99/年** —— 想装到 iPhone(哪怕自用)就得有,框架无法豁免。 +2. **iOS 证书**(`.p12` + `.mobileprovision`)—— 没 Mac 也能生成,用在线工具(香蕉云编 / Appuploader)配合苹果开发者后台。 +3. **云打包在 HBuilderX 中操作** —— 需 DCloud 账号;此步由用户在 HBuilderX 点击完成,无法从命令行触发。 + +> 结论:uni-app 让"无 Mac 出 iOS 包"成立,但 $99/年苹果账号免不了。预算未定前,先用 H5/PWA + Android 自用。 + +## 四、技术栈清单 + +| 层 | 选型 | +|---|---| +| 用户端骨架 | **unibest**(uni-app + Vue3 + Vite + TS + UnoCSS + wot-ui,命令行开发不依赖 HBuilderX) | +| 用户端页面 | 普通 vue 页面(**不用 nvue**) | +| 图表 | qiun-data-charts(多端兼容封装) | +| 用户端目标 | H5(网页/PWA) + App(iOS/Android 云打包) +(可选/后置)微信小程序 | +| **后端** | **Go + Gin + GORM + SQLite(modernc 纯 Go 驱动)+ JWT**,Docker 部署于腾讯云 VPS;Nginx + certbot 提供 HTTPS | +| **管理后台** | **无构建**:Gin html/template + HTMX + Alpine.js + **Tabler**(Bootstrap5 后台皮肤) + Chart.js,由 Go 进程直接托管(`//go:embed`),并入 `server/` | +| 同步 | REST API(HTTPS) + 本地缓存(离线优先),简单时间戳同步策略 | +| 鉴权 | 单用户 JWT | + +### 后端语言决策:Go vs Node + +选 **Go(Gin + GORM + SQLite)**。理由:单二进制部署、内存占用小、Docker 镜像极小,**更适合常驻的小 VPS 自托管**;前后端经 REST/JSON 解耦,后端用什么语言对 unibest 前端无影响。 + +**管理端形态:API + Web 管理后台,且管理后台采用「无构建」方案** —— Gin html/template + HTMX + Alpine + **Tabler 后台模板**,由 Go 进程直接渲染托管。Tabler(MIT,Bootstrap5)自带登录/侧边栏/仪表盘/表格等现成页面,是 admin 端等价于 unibest 的"带基本模块骨架",且 CSS/JS 预编译、无需 build。放弃 Vue3+Element Plus(需独立 build/子项目) 与 gin-vue-admin/GoFrame(偏重),换来零 Node 工具链、单二进制、仓库更简单。 + +## 五、开发分工 + +- **AI(在 WSL)**:基于 unibest 搭用户端、写四大功能、H5 实时预览;写 Go(Gin) 后端 + 无构建管理后台(html/template+HTMX);给出 VPS 部署 + certbot HTTPS 步骤。 +- **用户**:装 HBuilderX 导入项目 → 点云打包出 App;按教程办苹果账号/生成证书;在腾讯云 VPS 跑后端容器(如需小程序则办域名备案)。 + +## 六、用户需准备(按阶段) + +- 现在:HBuilderX(免费)+ DCloud 账号。 +- 出 Android:基本零成本。 +- 出 iOS:Apple 开发者账号 $99/年(界面稳定、确定要上 iOS 时再办)。 diff --git a/docs/03-架构设计.md b/docs/03-架构设计.md new file mode 100644 index 0000000..74b6515 --- /dev/null +++ b/docs/03-架构设计.md @@ -0,0 +1,169 @@ +# 03 · 架构设计 + +> 用户端(uni-app 多端) + 管理后台(Web) + 腾讯云 VPS 后端(Go·域名·certbot HTTPS) + 本地优先同步。 + +## 一、整体架构图 + +``` +用户端(unibest / uni-app · Vue3) 后端(腾讯云 VPS · Docker · HTTPS) +┌─────────────────────────────┐ ┌────────────────────────────┐ +│ ① 每日打卡 │ │ 域名 + Nginx + certbot │ +│ ② 目标进度 & 净资产曲线 │ HTTPS │ Go + Gin + GORM │ +│ ③ FIRE 测算器 │ ─REST→ │ ├─ JWT 单用户鉴权 │ +│ ④ 持仓 & 分红跟踪 │ ←同步─ │ ├─ API: 打卡/快照/持仓/设置 │ +│ 本地缓存(离线优先) │ │ └─ SQLite(纯Go驱动·可备份) │ +└─────────────────────────────┘ └────────────────────────────┘ + │ 由同一个 Go 进程托管 ▲ + ├─ 浏览器 → 网页 / PWA │ html/template + ├─ 云打包 → Android (.apk/.aab) │ 渲染(共用DB) + └─ 云打包 → iOS (.ipa,需苹果账号) ┌─────────────────────────┐ + │ 管理后台(Web · 电脑端) │ + │ Gin html/template + │ + │ HTMX + Alpine + Tabler │ + │ 无构建·数据增删改查/报表 │ + └─────────────────────────┘ +``` + +## 二、前端结构 + +- **页面**:四大模块各一主页面 + 设置页,普通 vue 页面(不碰 nvue)。 +- **图表**:统一用 qiun-data-charts,图表页避免 nvue,数据做抽稀。 +- **状态/数据层**:本地优先,所有读写先走"存储抽象层",再异步同步到后端。 + +### 存储抽象层(关键设计) + +各端存储能力不同,必须封装统一接口,内部用条件编译分端实现: + +| 端 | 底层实现 | 注意 | +|---|---|---| +| H5 | IndexedDB(大数据)/ localStorage | localStorage ~5MB 上限 | +| App | uni.storage / 原生 SQLite 插件 | 历史快照/流水量大时用 SQLite | +| 小程序 | uni.storage | 总量约 10MB,存流水易爆 | + +``` +interface Store { + get(key), set(key, val), query(table, filter), bulkSave(...) +} +// #ifdef H5 → IndexedDB 实现 +// #ifdef APP-PLUS → SQLite/uni.storage 实现 +// #ifdef MP → uni.storage 实现 +``` + +## 三、后端结构(腾讯云 VPS · Go) + +- **技术栈**:**Go + Gin(Web)+ GORM(ORM)+ SQLite**(纯 Go 驱动 `modernc.org/sqlite`,免 CGO,编译/部署最省心)+ **JWT** 鉴权。 +- **部署**:编译为**单个静态二进制**,Docker 化部署到腾讯云 VPS;前置 **Nginx 反向代理**,由 **certbot(Let's Encrypt)** 签发并自动续期 HTTPS。 +- **域名**:使用用户已有域名,解析到 VPS 公网 IP。 +- **数据表(初版)**:`checkins`(打卡)、`snapshots`(资产快照)、`holdings`(持仓)、`settings`(参数)、`users`(单用户)。 +- **接口**:标准 REST(增删改查 + 拉取增量),全程 HTTPS;用户端与管理后台**共用同一套 API**。 +- **备份**:SQLite 单文件,定时备份到对象存储/本地。 + +> 为什么用 Go 而非 Node:单二进制、内存占用小、Docker 镜像可压到几 MB,**更适合常驻的小 VPS 自托管**;前后端经 REST/JSON 解耦,后端语言对 uni-app 前端无影响。 + +## 三-B、管理后台(Web 管理端 · 无构建) + +- **定位**:电脑端网页,给本人用来**增删改查数据、查看报表、调整参数**(如目标本金、提取率、收益率假设)。 +- **技术(无构建)**:**Gin html/template 服务端渲染 + HTMX(局部刷新)+ Alpine.js(小交互)+ Tabler 后台模板(Bootstrap5,自带登录/侧边栏/仪表盘/表格/表单皮肤)+ Chart.js(图表)**。全部走 `