feat: 桌面启动器、可执行 jar 瘦身与数据库配置实时进度

本次提交为「汇账」补充桌面 GUI 启动器与 jpackage 免安装打包,并对可执行 jar 做两项依赖瘦身(移除 OpenAI SDK、裁剪 Knife4j/Swagger UI),修复 Windows 构建兼容问题,最后将数据库「测试连接 / 保存并应用」改为 SSE 实时进度并新增进度弹框。

变更内容:
- 桌面启动器:新增 cn.rosercode.ledgerly.launcher(启停服务、日志实时查看、系统托盘、单实例锁、端口配置),普通 jar 经 exclude 排除该包以保持无 JavaFX 依赖。
- 打包:bootJar/bootGuiJar 文件名携带目标 JDK 版本;新增 jpackageAppImage(聚合)与 jpackageServerAppImage/jpackageGuiAppImage,基于 jpackage --type app-image 产出免安装应用,GUI 内嵌 win/linux/mac/mac-aarch64 四平台 JavaFX;应用图标不入库,打包时从 OSS 地址(launcher/icon.url)下载源图并由 tools/IconGen.java 生成平台图标(ico/icns/png)。
- 启动器图标:图标二进制不随源码分发,地址记录在 launcher/icon.url(阿里云 OSS 长期签名地址);运行时由 LauncherIconProvider 下载并缓存到 <基准目录>/cache/launcher-icon.png,缓存缺失时先直接用远端地址,下载失败静默降级为无图标。
- 运行目录:AppHome 新增 configDir/logsDir/setHome,config/logs/data 统一以基准目录(ledgerly.home 系统属性 / LEDGERLY_HOME 环境变量)解析,logback 同步支持。
- 依赖瘦身:移除 com.openai:openai-java,DeepSeekClient 改用 Spring RestClient 直连 Chat Completions(对外签名与 DeepSeekResponse 不变);Knife4j/Swagger UI 改为 developmentOnly,生产仅保留 /v3/api-docs JSON,Knife4jConfig 增加 @ConditionalOnClass 兜底。
- Windows 兼容:npm 解析兼容 npm.cmd;Spotless 统一 LF 并新增 .gitattributes。
- 数据库配置:新增 DatabaseConfigStreamService 与 POST /api/database/{test,config}/stream,SchemaInitializer/SchemaMigrator/DatabaseService 增加进度回调,前端弹框实时展示日志;数据库接口超时放宽为测试 60s、保存 120s。
- 缺陷修复:LauncherHome 改用 java.class.path 定位 jar,避免 Spring Boot 可执行 jar 下嵌套路径导致启动器崩溃;JwtInterceptor 跳过 SSE 完成后的 ASYNC 分派并加固响应已提交判断,避免首次无 Token 配置数据库时重复鉴权写入 401 触发 getOutputStream() 异常。
- 文档:README 精简为功能特性与快速开始/构建打包,细节说明迁移至本地 AGENTS.md。
This commit is contained in:
2026-09-24 14:43:01 +08:00
parent feb56c8a8d
commit ce71fd9b7a
35 changed files with 2745 additions and 315 deletions
+24 -149
View File
@@ -1,167 +1,42 @@
# 汇账
个人汇账,支持收入/支出记录管理、分类与标签管理、多来源账单导入、自定义归类规则、AI 智能记账、月度统计与图表展示,并提供定时账单导入提醒与系统日志查看。
个人汇账应用:收支记录、分类标签、账单导入、归类规则、AI 智能记账、统计图表、定时提醒与系统日志。
## 功能特性
### 收支记录
- 收支记录的增删改查、分页与多条件筛选
- 批量设置分类、批量设置标签、批量删除
- 单条记录的「计入统计」开关与「备注隐藏」开关
- 按当前筛选条件导出 Excel
- 收支记录:增删改查、筛选分页、批量操作、Excel 导出,支持「计入统计」「备注隐藏」开关。
- 分类与标签:增删改查与默认数据,分类图标/标签颜色支持 AI 推荐。
- 交易渠道:内置渠道 + 自定义渠道(改名不影响历史账单,有账单使用时不可删除)。
- 统计与图表:月度收支、分类占比、收支趋势、分组统计与概览(ECharts)。
- 账单导入:支付宝/微信/美团/淘宝/京东/交行/招行,支持 zip(含加密压缩包),预览后确认导入并按交易号去重。
- 自定义规则:关键词、收支类型、金额区间组合,命中后自动应用分类与标签。
- AI 能力:分类/标签建议与一键采纳、自然语言查询与记账、图片记账(SSE 进度)、生成分类标签与图标颜色、用量统计。
- 定时提醒与通知:每天/每周/每月提醒,邮箱与 Server 酱推送。
- 系统日志:访问/登录日志查询,运行日志在线查看(SSE 实时推送)。
- 账号与多语言:JWT 登录、注册开关、运行时切换 SQLite/MySQL、中英日界面。
### 分类与标签
- 分类、标签的增删改查,新注册用户自动获得一套默认数据
- 分类图标支持 AI 推荐 Emoji,标签颜色支持 AI 推荐十六进制色值
## 快速开始
### 交易渠道
- 内置渠道:支付宝、微信、美团、淘宝、京东、招商银行、交通银行、现金
- 支持自定义渠道的新建、改名与删除(有账单使用时不可删除,改名不影响历史账单)
- 新增/编辑记录时可由 AI 推荐已有渠道或生成新渠道
### 统计与图表
- 月度收支统计、分类占比、收支趋势、分组统计与概览汇总
- 基于 ECharts 的可视化图表展示
### 账单导入
- 支持支付宝(CSV)、微信(xlsx)、美团、淘宝(xlsx)、京东(CSV)、交通银行、招商银行(PDF)账单解析
- 支持 zip 压缩包(含 ZipCrypto / AES 加密压缩包)上传
- 「解析预览 → 确认导入」两步流程,按交易号去重
### 自定义规则
- 基于关键词(匹配备注 / 交易对方 / 商品名称)、收支类型、金额区间组合的条件规则
- 命中后自动应用分类与标签,支持优先级排序与启用 / 停用
- 账单导入预览阶段展示命中的规则与建议分类 / 标签
### AI 能力(DeepSeek)
- 交易记录分类与标签的批量 / 单条智能建议,支持一键采纳
- 自然语言查询解析与自然语言记账解析
- 图片记账:一次上传最多 5 张账单 / 支付截图(支持粘贴),由视觉模型识别、SSE 实时推送进度,生成多条记录并标记疑似重复(按「类型+金额+时间」),提取原始字段,逐条预览勾选后批量导入
- AI 生成分类、标签,以及 Emoji / 颜色推荐
- AI 调用用量统计与明细查看
### 定时提醒与通知
- 按每天 / 每周 / 每月周期提醒导入新账单(默认每月 1 日)
- 多渠道推送:邮箱 SMTP(如 QQ 邮箱)、Server 酱(推送到个人微信)
- 渠道管理、测试发送与发送日志查看
### 系统日志
- 接口访问日志、登录日志的持久化与分页查询
- 后端运行日志在线查看,支持基于 SSE 的实时推送与筛选
### 账号与多语言
- JWT 登录认证,注册功能可开关
- 运行时数据库配置与切换(SQLite / MySQL),无需启动前准备
- 界面支持中文、英文、日文三种语言
## 技术栈
| 层级 | 技术 |
|---|---|
| 后端 | Spring Boot 3.3.6 + Java 21 + MyBatis-Plus 3.5.12 + MySQL / SQLite |
| 前端 | Vue 3 + TypeScript + Vite + Naive UI + ECharts + Pinia |
| 构建 | Gradle 8.13 (后端) / npm (前端) |
| 认证 | JWT |
| 对象映射 | MapStruct 1.6.3 |
| 账单解析 | EasyExcel 4.0.3 + PDFBox 3.0.3 + Zip4j 2.11.5 |
| AI 能力 | DeepSeek |
| 通知渠道 | 邮箱 SMTP / Server 酱 |
| 多语言 | 中文 / 英文 / 日文 (vue-i18n) |
| API 文档 | Knife4j (OpenAPI 3) |
| JDK 版本 | 21.0.12.1 (Temurin LTS) |
| Node.js 版本 | v24.0.0 |
## 前置条件
- JDK 21.0.12.1 Temurin LTS,安装在 `D:\venv\jdk-21`
- Node.js v24.0.0
## 数据库配置
系统支持在服务启动后再配置数据库,无需启动前准备:
- 未检测到配置时,应用仍可正常启动,前端会引导进入「初始化数据库」页面;
- 支持 **SQLite**(本地单文件,零配置)与 **MySQL** 两种数据库;
- 保存配置后立即生效并自动建表,无需手动执行 SQL;
- 配置持久化在 `config/database.json`(已加入 `.gitignore`),SQLite 数据默认位于 `data/` 目录;
- 新注册用户会自动获得一套默认分类与标签;
- 兼容旧部署:若无本地配置但存在 `DB_URL` / `DB_USERNAME` / `DB_PASSWORD` 环境变量,会自动作为首次配置并保存。
登录后可通过右上角用户菜单 →「数据库设置」随时切换数据库;切换后原数据库的数据保留,不做自动迁移。
## 启动后端
前置条件:JDK 21(Temurin)、Node.js。
```bash
cd ledgerly
set JAVA_HOME=D:\venv\jdk-21
# 后端(默认 8080,接口文档 http://localhost:8080/doc.html)
gradlew.bat bootRun
# 前端(默认 5173)
cd frontend && npm run dev
```
- 后端地址:http://localhost:8080
- API 文档:http://localhost:8080/doc.html
数据库无需预先准备:启动后在页面按引导选择 SQLite(本地文件,零配置)或 MySQL,保存后立即生效并自动建表;配置持久化于 `config/database.json`。
## 启动前端
## 构建与打包
```bash
cd ledgerly/frontend
npm run dev
gradle bootJar bootGuiJar # 普通 jar + 带 GUI 启动器的 jar,产物在 build/libs/
gradle jpackageAppImage # 免安装应用(普通 + GUI),产物在 build/jpackage/
```
- 前端地址:http://localhost:5173
- GUI jar 内嵌前后端与跨平台 JavaFX,单文件即可运行;配置与日志默认落在 jar 所在目录,可用 `--home=<目录>` 或环境变量 `LEDGERLY_HOME` 指定。
- app-image 自带运行时、免安装,但只能为**当前操作系统**生成。
## 构建可执行 jar(前后端一体化)
将前端构建产物一并打入 jar,单文件同时提供前端页面与后端接口:
```bash
gradle bootJar
```
- 该任务会先执行前端 `npm run build`,再把 `frontend/dist` 复制到 jar 内的 `BOOT-INF/classes/static/`
- 构建环境需具备 Node(开发容器通过 `NODE_HOME` 指向系统 nvm Node,npm 走本地 verdaccio 源)
- 输出文件:`build/libs/ledgerly-0.0.1-SNAPSHOT.jar`
启动(默认 8080,可另指定端口):
```bash
java -jar build/libs/ledgerly-0.0.1-SNAPSHOT.jar --server.port=18081
```
访问对应端口即可同时使用前端与接口;刷新 `/dashboard` 等子路由会由后端回退到 `index.html`。
## 项目结构
```
ledgerly/
├── build.gradle
├── src/main/java/cn/rosercode/ledgerly/
│ ├── client/ # 外部服务客户端(DeepSeek)
│ ├── common/ # 公共类
│ ├── config/ # 配置类(应用配置、动态数据源)
│ ├── controller/ # 接口层
│ ├── converter/ # MapStruct 对象转换器
│ ├── dto/ # 请求对象
│ ├── entity/ # 实体类
│ ├── enums/ # 枚举
│ ├── exporter/ # 导出处理
│ ├── importer/ # 账单解析器(支付宝/微信/美团/淘宝/京东/银行)
│ ├── interceptor/ # 拦截器(JWT、访问日志)
│ ├── mapper/ # 数据访问层
│ ├── notification/ # 通知渠道发送器
│ ├── scheduler/ # 定时任务
│ ├── service/ # 业务层(含 impl)
│ ├── util/ # 工具类
│ └── vo/ # 响应对象
├── src/main/resources/
│ ├── application.yml
│ ├── logback-spring.xml
│ ├── mapper/ # MyBatis XML
│ └── sql/ # 建表脚本(init.sql / schema-sqlite.sql 等)
└── frontend/ # Vue 3 前端
└── src/
├── api/ # API 请求封装
├── locales/ # 多语言文案
├── router/ # 路由配置
├── store/ # 状态管理
└── views/ # 页面组件
```
> 更详细的目录结构、启动器、jpackage、图标与开发环境说明见 `AGENTS.md`。