rosercode
6439d336d4
chore: 前后端引入代码检查工具并整改存量问题
...
为统一前后端代码规范与质量,前端引入 ESLint + Prettier,后端在 Spotless 之外新增 Checkstyle 与 SpotBugs,检查接入构建与打包流程并失败即阻断,同时一次性整改全部存量告警,检查范围为后端主源码与前端源码。
变更内容:
- 前端新增 ESLint(flat config)与 Prettier 配置及 lint / lint:fix / format / format:check 脚本,并新增对应开发依赖
- 后端 build.gradle 应用 checkstyle 与 com.github.spotbugs 插件,新增 gradle/checkstyle/checkstyle.xml、suppressions.xml 与 gradle/spotbugs/exclude.xml
- 新增 Gradle frontendLint 任务并作为 frontendBuild 前置,新增 lint 聚合任务(Spotless + Checkstyle + SpotBugs + 前端 ESLint)
- 修复后端 Checkstyle 1 处(补花括号)与 SpotBugs 17 处(getParent() 判空、拆装箱冗余、异常捕获与日志、volatile 同步等),并按设计豁免值对象引用暴露等告警
- 修复前端规则问题(未使用变量、无意义赋值、v-for key、v-html 安全提示)并格式化存量文件
- README 补充依赖安装、代码检查与打包说明
说明:
- SpotBugs 工具版本固定为 4.8.6,规避其 BCEL 与 Spring Boot BOM 选定 commons-lang3 3.14.0 的 NoSuchMethodError
- 检查范围仅主源码,src/test/ 本地测试不纳入 Checkstyle/SpotBugs
- 前端格式化统一为无分号、单引号、行宽 120、LF,与 .gitattributes 保持一致
2026-10-12 13:06:10 +08:00
rosercode
863e221220
refactor: 拆分交易记录前后端巨型文件并优化批量与导出性能
...
将 TransactionServiceImpl(922 行)与 TransactionList.vue(2811 行)按职责拆分为多个协作组件,对外接口与既有行为保持兼容,并在拆分后的组件中修复批量创建 N+1 查询与导出全量加载的内存风险。
变更内容:
- 后端拆分:TransactionServiceImpl 作为门面保留 TransactionService 契约,抽出 TransactionQuerySupport(查询条件构建)、TransactionVoEnricher(视图富化)、TransactionTagWriter(标签写入)、TransactionBatchService(批量操作)与 exporter.TransactionExportAssembler(导出组装)
- 前端拆分:TransactionList.vue 抽出 AiRecordModal、AiSuggestModal、TransactionBatchModal 三个弹窗组件与 utils/datetime 工具,并将本地 AI 启用状态迁移到共享 useAiEnabled
- 性能:batchCreate 预加载分类消除循环内 N+1 并改为批量写入标签关联;export 增加 1 万条上限保护,超限提示缩小筛选范围
2026-10-09 14:29:00 +08:00
rosercode
4735f0bf85
fix: 修复代码审查安全与稳定性问题并清理日历跳转残留筛选
...
修复第三方代码审查报告中的安全、账单导入事务与 AI 稳定性问题,并附带修复日历页跳转收支记录时未清空残留筛选条件、可能只显示当天被筛掉后部分记录的问题。
变更内容:
- 安全性:JWT 签名密钥改为环境变量 JWT_SECRET 优先、未配置回退内置默认;CORS 由全放开收窄为 localhost 与 192.168/10/172 局域网网段
- 账单导入:新增 BillImportWriteService,以 REQUIRES_NEW 独立事务承载批量插入与失败回退,避免批量失败污染外层事务;findExistingExternalNos 改为分批查询;压缩包临时文件删除失败记录 warn、读取条目失败记录 debug
- AI 稳定性:DeepSeekClient 对超时/连接层异常/5xx/429 做指数退避重试(最多 2 次);图片记账 SSE 线程池固定为 8 线程、连接 5 分钟超时,并每 15s 发送注释行心跳
- 日历:跳转收支记录页时清空上次残留的类型/分类/渠道/备注/金额/标签筛选
2026-10-09 14:28:43 +08:00
rosercode
8c4f343c34
feat: 后端接口请求/响应体加解密(RSA + AES-GCM)
...
新增可一键开关的接口数据加密能力:前端经 RSA 公钥协商 AES-256 会话密钥,普通 JSON 接口的请求体与响应体统一以 AES-GCM 信封收发,避免明文 JSON 被抓包;SSE 流式接口、文件上传下载与 GET 查询参数按设计保持明文。
变更内容:
- 后端新增常量开关 CryptoConstants.API_ENCRYPTION_ENABLED 与 util/crypto(RSA 密钥管理、AES 会话存储、加解密服务)
- 后端新增 /api/crypto 公钥与握手接口,及会话拦截器、请求体解密与响应体加密 Advice,并在 WebConfig 注册、JWT 放行 /api/crypto
- 前端新增 utils/apiCrypto.ts(node-forge)并改造 api/request.ts,实现自动握手、请求/响应加解密与会话失效自动重试
- 前端 package.json 增加 node-forge 与 @types/node-forge 依赖
说明:
- RSA 密钥对持久化在 config/crypto-keys.json(已 gitignore),AES 会话密钥仅存内存并按 TTL 与上限清理
- 关闭常量开关后后端整体旁路,前端探测到 enabled=false 自动改走明文
- 不加密 SSE、multipart 上传、二进制下载/图片与 GET 查询参数
2026-10-01 23:42:27 +08:00
rosercode
0aaceef235
feat: 记账支持手动新建分类标签渠道并完善日历偏好与统计口径
...
前端在收支记录新增/编辑弹窗内提供直接新建分类、标签、渠道的入口,日历页面记住最近浏览年月并把统计口径贯通到当日明细与收支记录跳转,同时收敛小屏布局避免横向溢出。
变更内容:
- 记账弹窗新增「新建分类 / 新建标签 / 新建渠道」按钮与对应弹窗,创建后刷新选项并自动回填所选值(TransactionList.vue)
- 记账弹窗的分类、渠道、标签等表单项改用可换行的 form-inline 布局,避免小屏横向溢出(TransactionList.vue)
- 日历新增最近浏览年月偏好键并在进入时恢复上次年月,年视图切换年份时同步记录(Calendar.vue、storageKeys.ts)
- 日历统计口径同步作用于当日明细查询与跳转收支记录页的「计入统计」筛选(Calendar.vue)
- 日历月视图小屏下将当日收入与支出分两行展示(Calendar.vue)
- 补充新建分类、标签、渠道的三语文案(messages.ts)
2026-10-01 14:03:57 +08:00
rosercode
007e6727a6
feat: 新增日历页面并设为默认首页
...
新增日历页以月视图展示每日收支汇总、以年视图展示每月汇总,支持月份切换、统计口径过滤与当日明细查看,并将日历置于侧边导航首位、作为访问 / 的默认落地页。
变更内容:
- 新增 `views/Calendar.vue`:月视图按日展示收入/支出/结余与当月合计,年视图以 12 月网格展示每月汇总并可点击进入该月,表头支持上一/下一期、年与月下拉跳转、「今天」及月/年视图切换
- 日历支持统计口径过滤(仅计入统计/全部记录/仅不计入,持久化于 `ledgerly.calendar.statsScope`),仅作用于汇总、不影响当日明细
- 点击日期弹出当日明细浮窗(顶部显示当日收入/支出/结余合计),明细行在条目主行展示金额,可点击打开完整账单详情(只读)并跳转到收支记录按当日筛选
- 视图模式持久化于 `ledgerly.calendar.view`,当前视图与年月同步到 URL(`?view=month|year&y=YYYY&m=MM`),月/年无数据时显示空状态
- `TransactionDetailModal` 新增 `editable` 属性(默认 true)以支持只读场景;`utils/navItems.ts` 将日历置于导航首位;`router` 与 `Login` 默认跳转由统计面板改为日历;补充导航、存储键与 `layout.calendar`、`calendar.*` 三语文案
2026-09-30 17:50:21 +08:00
rosercode
75e75ad190
feat: 前端适配移动端与小屏并优化触屏图表交互
...
新增断点基础设施与响应式布局,使手机(<768px)与平板(768–1023px)下可正常浏览和操作,桌面端(≥1024px)布局保持原有形态不变;引入此前未被入口引用的全局样式文件,使全局小屏兜底规则生效,并修复小屏分页控件被裁切、触屏端图表点击误触直接跳转的问题。
变更内容:
- 断点基础设施:新增 `frontend/src/composables/useBreakpoints.ts`(isMobile / isTablet / isDesktop / viewportWidth / isTouch),作为全站统一断点与触屏判定来源
- 全局样式:`frontend/src/main.ts` 引入 `./style.css`(此前从未被引入,导致其中规则一直无效),使弹层 max-width 92vw、body 防横向溢出等兜底规则实际生效
- 主布局 `views/Layout.vue`:小屏侧栏收起为 NDrawer、Header 增加菜单按钮,切回桌面自动收起;内容区高度改用 dvh,内边距随断点收窄;新增三语文案 `layout.menu`
- 表格:为列宽可能超出窄屏的 NDataTable 统一补 `:scroll-x`(收支记录、邮箱账单、规则/分类/标签/渠道、账单预览、AI 使用、关系编辑等)
- 弹窗:为固定宽度弹窗补 `max-width: 92vw`(分类/标签/渠道/规则、收支新增编辑与原始数据与一键设置、通知渠道、登录与注册卡片)
- 栅格与图表:`Dashboard.vue` / `SqlQuery.vue` 栅格改用断点列(responsive="screen"),图表高度随断点降低
- 浮窗:`FloatingPanel.vue` 按视口约束宽高、最小尺寸随视口下调;`AiQueryWindow.vue` / `EmojiPicker.vue` 小屏自适应
- 表单与列表:左标签表单小屏改为顶部标签(AI 配置、数据库配置、通知配置、邮箱账单弹窗);未换行 NSpace 与关系编辑器成员行小屏可换行
- 分页修复:≤1023px 下 `.n-pagination` 允许换行、居中、高度自适应(naive-ui 运行期注入样式优先级更高,用 !important 覆盖),表格内置分页容器同步居中,避免页大小选择与跳页输入被裁到视口外
- 触屏图表交互:`Dashboard.vue` 触屏端点击趋势柱或饼图扇区时按点击坐标弹出确认气泡(「查看明细 / 取消」),确认后才跳转;`handleTrendBlankClick` 在触屏端直接返回、禁用「绘图区整列可点」;桌面端保持点击即跳转;新增三语文案 `dashboard.chartActionHint` / `dashboard.chartActionView`
说明:
- 桌面端布局与跳转逻辑不变,点击柱子直接跳转、不显示气泡
- 分页控件在窄屏换行显示,页大小可切换、跳页输入可见可用
- 触屏端滑动/缩放不触发跳转(仅图形本体点击且需二次确认)
- 采用「基础可用适配」范围,未做移动端卡片式重排;断点统一走 `useBreakpoints`,后续新增页面按工作区 `AGENTS.md`《前端响应式适配(移动端 / 小屏)》约定实现
验证:
- 测试环境(5174)以 375 / 768 / 800 / 1280 宽度遍历统计面板、收支记录、分类管理、设置、邮箱账单、日志、智能查数等页面,均无横向溢出;手机端侧栏抽屉可开合;分页控件均在视口内且页大小可切换
- 触屏(375,hasTouch)点柱子/饼图扇区弹出确认气泡且不跳转,点空白不弹不跳,点「查看明细」跳转 `/transactions` 并写入筛选偏好;桌面(1280)点柱子直接跳转
- `./package.sh` 构建成功(bootJar + bootGuiJar,含前端 build)
- `npx vue-tsc -b --force` 类型检查通过
2026-09-30 17:10:07 +08:00
rosercode
801da3e196
feat: 收支记录批量操作按钮移至表格右上角并优化一键设置作用范围
...
将批量相关按钮从页头工具栏集中到列表右上角,并让一键设置优先作用于勾选记录、未勾选时作用于当前页全部记录,同时补充区分来源的作用范围提示文案。
变更内容:
- 将「批量操作/退出批量、一键设置、批量删除、建立关系」移至列表右上角(分页统计信息上方)
- 一键设置以打开弹窗时的目标快照为准:有勾选时作用于勾选记录,未勾选时作用于当前页全部记录
- 作用范围提示区分「已勾选」与「未勾选(当前表格展示)」两种文案
- 新增中英日三语文案 batchScopeHintSelected / batchScopeHintPage,移除旧 batchScopeHint
说明:
- 顺带移除 LoginRequest 未使用的 Size 导入与 AiSuggestionServiceImpl 未使用的 BigDecimal 导入
2026-09-26 22:51:40 +08:00
rosercode
ce71fd9b7a
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。
2026-09-24 14:43:01 +08:00
rosercode
feb56c8a8d
feat: 智能查数支持提问历史持久化与体验优化
...
为智能查数补充提问历史的后端持久化(含创建时间、可清空),并完善前端历史展示、会话缓存与若干体验问题。
变更内容:
- 新增 t_ai_sql_history 表(MySQL/SQLite 双脚本)与 AiSqlHistory 实体、Mapper、Service、VO,记录提问内容与创建时间
- AiSqlQueryServiceImpl 在查询成功后写入提问历史,新增 GET/DELETE /api/ai/sql/history 接口,支持按创建时间倒序查询与清空
- 前端历史改为后端持久化:卡片式列表、展示创建时间、搜索过滤、一键复制提问、点击回填重查与清空
- 新增会话缓存(sessionStorage):切走再回或刷新后恢复上次输入、结果与视图模式,结果超过 500 行时不缓存结果,登出时清除
体验修复:
- 修复柱状图与饼图切换时旧 series/坐标轴残留(VChart 采用 notMerge)
- 修复进入 /smart-query 时短暂误显示「AI 未启用」(新增 aiEnabledLoaded 加载态)
- 引入 JetBrains Mono 字体并修复生成的 SQL 字体未生效(内部 code 元素继承父级字体)
依赖:
- 新增前端依赖 @fontsource/jetbrains-mono
说明:
- 历史表由 SchemaInitializer 启动时幂等创建,无需手工执行 SQL
2026-09-24 12:30:00 +08:00
rosercode
49d16bec82
feat: 左侧导航支持配置显隐与拖拽排序
...
在「设置」页新增「导航设置」面板,用户可拖拽调整左侧各导航项的顺序并控制显隐;配置按用户持久化到后端,跨设备生效。隐藏仅移除菜单入口,页面路由仍可访问,且至少保留一个可见项。
变更内容:
- 后端新增 /api/setting/nav-menu 读写接口,复用 t_user_preference 键值存储,无需改表
- 新增 NavMenuPrefsVO / NavMenuPrefsRequest / NavMenuItem,保存时过滤空 key 与重复项
- 前端新增导航清单单一数据源与共享状态,主布局菜单据此渲染顺序与显隐
- 新增「导航设置」面板,支持拖拽排序、显隐开关、恢复默认,改动防抖自动保存
- 「智能查数」仍受 AI 启用状态约束,未启用时不在菜单与配置项中显示
- 新增导航设置相关中英日三语文案
- 新增拖拽依赖 vuedraggable@4
- 顺带将 Hikari 连接池名前缀由 finance- 修正为 ledgerly-
2026-09-24 11:01:14 +08:00
rosercode
0e1443c59e
feat: 新增智能查数(自然语言转 SQL 只读查询)
...
新增「智能查数」功能:用户用自然语言提问,由大模型生成一条只读 SQL,经安全校验后在当前用户数据上执行,前端按结果形状自适应渲染为统计卡片、表格或图表。入口位于侧边栏,仅在 AI 启用时显示。
变更内容:
- 后端新增 AiSqlQueryService 与 POST /api/ai/sql,新增 AiCallType.SQL 用量记录与提示词模板 ai-sql-system.tpl
- 新增安全网关 TextToSqlGuard:仅允许单条 SELECT,拒绝写操作、多语句、危险函数与 SELECT INTO/FOR UPDATE;校验表白名单与 schema 前缀;递归注入 user_id 隔离(主表加 WHERE、JOIN 加 ON,覆盖括号连接与 CTE);结果上限 1000
- 表结构改由 TextToSqlSchemaProvider 从数据库元数据动态读取(60 秒缓存),白名单与表列中文说明集中在 TextToSqlTables,字段增删改无需调整提示词
- 新增 AiSqlQueryResultVO、AiSqlColumnVO,返回生成的 SQL、列元数据与行数据
- 前端新增智能查数页 SqlQuery.vue(路由 /smart-query),按结果形状渲染单行统计卡片、多行动态表格并支持柱状图与饼图切换
- 渠道列用 getChannelLabel 本地化展示,生成的 SQL 用 sql-formatter 缩进、highlight.js 高亮并支持复制
- 新增共享 useAiEnabled 状态,侧边栏「智能查数」菜单仅 AI 启用时显示,设置页保存 AI 配置后即时刷新
- 设置页与收支记录页文案补充智能查数相关三语文案
依赖与清理:
- 新增前端依赖 sql-formatter、highlight.js
- 移除仓库内测试文件 LedgerlyApplicationTests、PromptTemplateServiceTest、AiPromptPayloadPrivacyTest,此后测试源码不再纳入提交
说明:
- 表结构动态读取保证字段变更零维护,仅可查表白名单需显式登记
- 安全网关对 JOIN 条件注入 ON 子句以保证 LEFT JOIN 语义,并对括号连接与 CTE 递归处理
2026-09-24 10:38:24 +08:00
rosercode
5673f6fca2
feat: 外观设置分页与展示样式改为即时保存
...
- 分页每页条数候选与默认值变更后防抖 500ms 自动保存,移除分组内独立「保存」按钮
- 「不计入统计」展示样式切换即保存,失败回滚到上一值,移除面板底部「保存」按钮
- 自动保存增加初始化与回填保护、过期响应丢弃,候选删空时不提交以免覆盖后端值
- 更新中英日三语提示文案,清理不再使用的保存相关文案
2026-09-24 08:51:13 +08:00
rosercode
24074aeea2
refactor: 品牌改名为汇账 Ledgerly,包名与工程标识统一为 ledgerly
...
- Java 包名由 cn.rosercode.finance 改为 cn.rosercode.ledgerly,主类 FinanceApplication 更名为 LedgerlyApplication
- Gradle 项目名、spring.application.name 与日志文件名统一为 ledgerly
- 前端界面文案、页面标题、登录注册标题、README 与 Knife4j 标题更新为汇账 / Ledgerly
- 前端本地存储键前缀由 finance. 改为 ledgerly.,并新增旧键自动迁移避免老用户偏好丢失
- 运行目录系统属性与环境变量改为 ledgerly.home / LEDGERLY_HOME
- 部署编排、启动脚本、容器名、SQLite 默认路径与构建产物名同步改为 ledgerly
2026-09-23 17:33:59 +08:00
rosercode
e0fa1abec5
feat: 表格分页支持统一配置并记忆各表格每页条数
...
- 后端新增聚合用户偏好 paginationPrefs(每页条数候选列表与默认每页条数),提供 GET/PUT /api/setting/pagination-prefs,默认候选 [10,20,50,100]、默认每页 20,非法值自动过滤并回退
- 后端新增 /category/page、/tag/page、/channel/page、/email-bill/configs/page、/email-bill/sender-rules/page 分页接口,原全量接口保持不变以免影响下拉、筛选、AI 与导出
- 前端新增共享 composables/usePageSizeOptions.ts 与 useTablePageSize.ts,所有表格统一取用候选列表并记住各自上次选择的每页条数,优先级为表格记忆 > 全局默认 > 20
- 各表格上次选择以聚合偏好 finance.pagination.tablePageSizes 存于本机 localStorage,收支记录页旧的 filterPrefs.pageSize 自动迁移
- 设置页外观设置新增「表格每页条数选项」分组,可增删候选值并配置默认每页条数,保存后全局即时生效
- 路由守卫在已登录时预加载分页偏好,保证表格页首次渲染即使用配置值
- 前端分类、标签、渠道、邮箱配置、发件人规则表格接入后端分页
- 补充中文、英文、日文三语文案
2026-09-23 11:14:54 +08:00
rosercode
7172f6aa44
feat: 统计面板与收支记录支持图表点击跳转与筛选双向联动
...
- 统计面板支出/收入分类饼图与支出/收入渠道饼图支持点击扇区跳转收支记录,并带上对应分类或渠道筛选
- 新增统计面板「查看收支记录」与收支记录「查看统计」按钮,实现两页双向跳转
- 收支记录跳转统计面板时按共享偏好还原类型、分类、渠道、标签、金额、备注、计入统计与时间范围
- 时间范围统一为具体起止区间,面板预设选择时换算为区间写入共享偏好
- 「计入统计」默认统一为「仅计入」,并修复「全部」与金额字段显式 null 的记忆
- 抽出公共跳转字段与共享筛选读写,收敛统计面板多处跳转的重复逻辑
2026-09-23 10:00:58 +08:00
rosercode
eb358d0ba1
refactor: 前端本地偏好统一为公共存储层
...
- 新增 frontend/src/utils/storageKeys.ts 集中维护存储键常量并登记旧键迁移
- 新增 frontend/src/utils/storage.ts 统一 localStorage/sessionStorage 读写与异常容错
- 新增 frontend/src/composables/usePreference.ts 提供 useStringPreference 响应式字符串偏好
- 新增 frontend/src/utils/transactionFilterPrefs.ts 抽出收支筛选偏好字段定义与共享读写
- 存储键统一以 finance. 前缀命名,locale、emailBill.tab、logs.tab 迁移到新键并自动迁移旧值
- 各页面与组件改用公共层,移除重复的 try/catch 与跨组件重复的序列化逻辑
- 认证凭据 token 属登录状态,保持原键名不纳入 finance. 前缀
2026-09-23 09:41:55 +08:00
rosercode
66d6ab86b5
feat: 新增隐藏备注记录显示开关并简化设置与日志菜单文案
...
- 设置页「外观设置」新增「显示已隐藏备注的记录」开关,默认关闭,切换即时保存
- 新增 GET/PUT /api/setting/show-hidden-data 接口,用户级偏好持久化于 t_user_preference
- 收支记录列表与 Excel 导出按该偏好过滤,关闭时排除已隐藏备注的记录
- 移除「备注关键字搜索时总是跳过隐藏记录」逻辑,改由该偏好统一控制,统计备注搜索同步放开
- 列表内隐藏备注后,偏好关闭时该行即时移除,当前页清空自动回退上一页
- 外观设置面板拆分为两个浅灰底分组,两个配置项区分更清晰
- 顶部用户菜单与设置/日志页标题由「系统设置/系统日志」简化为「设置/日志」,同步中英日三语
2026-09-23 09:28:42 +08:00
rosercode
66088e8c7e
feat: 用户自助修改密码与 AI 查询统计筛选增强
...
- 设置页新增「账号安全」面板,当前登录用户校验原密码后可修改自己的密码
- 新增 PUT /api/user/password 接口,BCrypt 校验原密码,新旧相同与长度非法均拒绝
- 新增随机密码工具,一键生成 12 位大小写字母与数字组合密码(排除易混淆字符)
- 随机密码明文展示并支持复制,非安全上下文回退 execCommand 方案
- 新增账号安全相关中英日三语文案
- AI 查询与统计结果新增 untagged/uncategorized 字段,提示词同步说明互斥规则
- 统计面板与交易列表支持「无标签」筛选项,AI 结果可回填无标签/未分类条件
- 备注已隐藏的交易不参与备注关键字搜索,避免隐藏内容被检索命中
- 交易列表操作列将「编辑」调整至「详情」之前
2026-09-22 10:49:01 +08:00
rosercode
be7e27805d
feat: AI 智能查询改为可拖拽缩放的非模态浮窗并支持多行输入
...
- 统计面板与收支记录的 AI 智能查询由模态弹窗改为非模态浮窗,窗口打开时可继续操作主界面,无遮罩且不自动聚焦
- 新增通用浮窗组件 FloatingPanel,支持标题栏拖拽与右下角缩放,位置尺寸按页面持久化到 localStorage
- 新增 AiQueryWindow 组件,输入由单行改为多行文本域,Enter 换行、Ctrl/Cmd+Enter 提交
- 历史记录聚焦时以浮层展示并可按输入过滤,忽略大小写去重、最多保留 200 条
- 提交查询后不关闭窗口,移除取消按钮,统一由右上角关闭按钮关闭
- 修复示例下拉层级低于浮窗被遮挡的问题,并在打开窗口时重置加载状态,避免按钮一直显示加载中
- 补充 close 与 ai.query.submitHint 的中文、英文、日文三语文案
2026-09-21 23:03:53 +08:00
rosercode
f390246528
feat: 账单关系(父子/同级)与关系图,AI 生成关系名称备注
...
- 新增 t_transaction_group、t_transaction_group_item 两张表(MySQL 与 SQLite 双脚本)
- 后端新增关系组实体/枚举/Mapper/DTO/VO/Service/Controller:按账单查询、创建、更新、删除;校验同类型唯一、父子角色与成员归属;删除账单时级联清理(组不足或父子组失去父账单则整组移除);分页填充 relationGroupCount
- 前端收支记录新增「关系」列与详情弹窗(基本信息、标签、账单关系、来源图片、原始数据)
- 新增关系图(自定义 SVG 渲染):圆形节点、按收支红/绿着色、父子/同级连线带箭头与「关联」标签、当前账单高亮,成员较多时自动换行
- 关系编辑弹窗支持新建/编辑/删除、分页选择关联账单、AI 生成名称与备注、关系名称历史下拉(按类型过滤、聚焦即显示)、关系类型偏好记忆(localStorage)
- 支持勾选账单批量建立关系,并新增批量选择模式(默认不显示多选列)
- 新增 AI 关系能力:AiCallType.RELATION、AiRelationService 与提示词模板 ai-relation-system(含借贷场景),接口 POST /api/ai/relation
- 新增 /api/transaction/group/* 接口与关系名称历史接口
- 补充中英日三语文案
2026-09-21 22:23:47 +08:00
rosercode
06fd80d55f
feat: 登录显示加载遮罩并将统计面板图表改为异步加载
...
- 登录请求期间显示全屏遮罩与「正在登录」提示,并等待路由跳转完成再隐藏
- 统计面板 echarts 改为 defineAsyncComponent 按需加载,避免阻塞登录后首屏
2026-09-21 21:24:12 +08:00
rosercode
09ca5b43fb
feat: 规则批量删除与多选操作
...
后端新增 DELETE /rule/batch,按 userId 校验规则归属,先清理标签关联再批量删除并返回实际删除数;前端规则管理表格增加多选列与批量删除按钮,补充三语文案;同步更新 README 中 AI 渠道推荐与图片记账说明。
2026-09-21 20:30:45 +08:00
rosercode
2ade60da42
feat: AI 图片记账、自定义交易渠道与淘宝/京东账单导入
...
- AI 图片记账:多图上传由视觉模型识别,SSE 实时推送进度,提取 rawData,按「类型+金额+时间」检测重复,支持缩略图与来源图片查看
- 自定义交易渠道:新增 t_channel 与渠道管理页,支持新建/改名/删除,并接入统计、导出与 AI 查询/记账/建议提示词
- AI 建议:单条建议新增交易渠道推荐(推荐已有渠道 / AI 新建渠道)
- 账单导入:新增淘宝(xlsx)、京东(CSV)解析器
- 交易:新增批量创建接口,导入时按去重键兜底跳过重复
- 运行目录统一经 AppHome 解析,图片与数据文件落盘规范化
- 前端:AI 记账方式偏好记忆、AI 按钮与输入框对齐、来源图片弹窗支持加载原图
2026-09-21 16:21:58 +08:00
rosercode
1f520f4376
feat: 用户级偏好配置与外观设置,枚举统一抽取与账单类型后端下发
...
- 新增用户偏好表 t_user_preference 与进程内缓存,账单来源统计默认值由全局改为按用户存储(/api/setting)
- 新增外观设置:不计入统计记录支持删除线与灰色标签两种展示样式
- 抽取 ChannelType / TransactionType / StatisticsScope 枚举,替换各处硬编码的渠道、类型与统计口径
- BillType 内聚各来源扩展名,新增 /transaction/import/types 接口,前端改为按后端下发渲染
- 仪表盘趋势图支持点击柱子跳转收支记录并带入筛选条件
- 布局内容区按路由记忆滚动位置;已登录访问登录/注册页自动跳转
2026-09-21 10:51:15 +08:00
rosercode
2976b85967
feat: 交易渠道重命名、账单来源统计默认值、AI 规则生成与统计搜索,AI 改用 openai-java SDK
...
- 交易记录「支付方式」全链路重命名为「交易渠道」(channel):DB 列、实体/DTO/VO、接口 /api/transaction/channels、统计维度 CHANNEL、AI 提示词与 JSON 字段、前端与中英日文案;新增 SchemaMigrator 在启动/切换数据源时幂等迁移列名(MySQL 用 information_schema、SQLite 用 PRAGMA)
- 按账单来源设置「计入统计」默认值:AppConfig 持久化 + GET/PUT /api/app/bill-source-include-in-stats,导入解析按「解析器判定 && 来源默认」应用并覆盖上传与邮箱两条路径,设置页新增面板
- AI 生成规则:基于所选已打标签记录归纳分类/标签规则(POST /api/ai/rule/suggest、/api/ai/rule/apply),规则页两步弹窗(选择记录→预览创建),支持候选记录分页/搜索/筛选;按「类型+关键词+分类+标签」签名与已有规则去重,重复项标记「已存在」并禁止导入
- 规则列表新增分页与搜索:GET /api/rule/page(名称/关键词、启用状态、收支类型)
- 统计面板 AI 搜索:POST /api/ai/statistics 将自然语言解析为时间/类型/分类/标签/渠道/金额/统计口径/趋势粒度并回填;交互对齐账单列表 AI 查询(弹窗 + 历史 + 示例 + 空条件守卫);统计后端补充标签筛选,仪表盘新增标签筛选与 AI 搜索
- AI 客户端改用 OpenAI 官方 Java SDK(com.openai:openai-java),自定义 baseUrl 指向 DeepSeek,保留 chat 签名与 DeepSeekResponse
- AI 数据外发收敛:分类/标签建议与规则生成不再发送 rawData 与金额,仅发送类型/备注/渠道/分类/标签;新增 AiCallType.RULE / STATISTICS
- 收支记录页新增「刷新」按钮
2026-09-20 17:13:24 +08:00
rosercode
0a8811534b
refactor: 前端 SSE 鉴权改造与公共逻辑抽取,修复统计分组空指针
...
- SSE 由 EventSource 改为 fetch 流式读取(新增 utils/sse.ts),token 走 Authorization 请求头,避免令牌经 URL 泄露到访问日志
- 抽取 useKeywordHistory,统一备注关键词与 AI 查询历史的读写、下拉与清空
- 抽取 renderCategoryLabel 至 utils/render.ts,消除多处重复实现
- 导出改用统一 request 实例(自动携带鉴权头),并将 blob 错误体解析为业务异常
- 新增 untagged 筛选参数;AI 智能查询改为弹窗入口并补充三语文案
- 分类/标签/邮箱/交易表单补充提交 loading,避免重复提交
- 交易时间改用本地格式化,修复 toISOString 造成的时区偏移
- 移除 Naive UI 全局注册;修正 NLog 的 rows 属性为 lines
- 修复未分类记录分组时 categoryMap.get(null) 抛出的 NPE
2026-09-20 15:09:35 +08:00
rosercode
5fb3d78ce0
feat: 仪表盘新增收入分类饼图并拆分收支支付方式占比
...
- 仪表盘新增「收入分类占比」饼图,支付方式拆分为支出、收入两张饼图
- 支付方式标签按当前语言本地化,仅统计对应方向的记录
- 收支记录中不计入统计的记录整行加删除线(类型、金额列除外)
- 补充中/英/日三语文案
2026-09-20 01:46:14 +08:00
rosercode
9bc858eefc
feat: 邮箱账单自动拉取
...
- 新增邮箱配置、发件人规则、待处理账单三张表(SQLite/MySQL 双脚本)及 CRUD 接口
- 按邮件发件人匹配账单类型,未命中忽略;发件人规则可配置解压密码与默认分类/标签
- 支持 IMAP IDLE 实时监听、定时兜底与手动立即检查;拉取范围可配置(仅新邮件/最近 N 天/最近 N 封)
- 附件保存至本地 data/email-bill,解析预览后手动导入,复用账单解析与规则引擎
- 立即检查通过 SSE 实时推送执行进度
- 前端新增「邮箱账单」页(邮箱配置/发件人规则/待处理账单三 Tab),支持子路由与 Tab 偏好记忆,配置弹窗提供常用 IMAP 服务器候选项
- 新用户注册自动初始化默认发件人规则(支付宝/微信/美团/招商银行/交通银行)
- 抽取共用账单预览与结果组件,供上传导入与邮箱账单复用
同时包含:
- 统计新增口径筛选(仅计入/全部/仅不计入),支付方式改为后端动态获取
- 统一实体 createdAt/updatedAt 位置至 id 之后,调整部分日志级别
2026-09-19 17:50:55 +08:00
rosercode
196afb682d
feat: 招商银行 PDF 账单导入、跨格式去重与导入性能优化
...
- 新增招商银行「交易流水」PDF 解析(PDFBox 坐标还原,支持多页与折行),CSV/PDF 去重标识统一,支持跨格式去重
- 账单导入改为批量插入,MyBatis 日志改 Slf4j,导入接口超时放宽至 120s
- 交易导出 Excel 增加样式、冻结表头与自动筛选,导出前二次确认
- 交易列表展示不计入统计金额,导入预览支持设置「计入统计」
2026-09-19 14:30:09 +08:00
rosercode
9981e77bf1
feat: 扩展账单导入(zip/美团/招行/交行)并新增批量删除与动态支付方式
...
- 账单导入支持 zip 压缩包,加密包自动检测并弹窗输入解压密码(引入 zip4j)
- 新增美团、招商银行、交通银行账单解析器及对应账单类型
- 支付方式列表改为后端动态获取,前端筛选与新增/编辑表单动态渲染
- 支付方式筛选从「更多筛选」移至常用筛选栏,移除「银行卡」选项
- 收支记录支持多选批量删除
- 补充相关三语文案并透传业务错误码
2026-09-19 02:46:35 +08:00
rosercode
c69e76ed4c
feat: 支持自定义分类与标签规则并优化 AI 查询交互
...
- 新增 t_rule、t_rule_tag 表(MySQL/SQLite 双脚本)与规则引擎,支持关键词(备注/交易对方/商品名称)、收支类型、金额区间组合匹配
- 新增 /api/rule 增删改查与启用停用接口,侧边栏新增「规则管理」页,支持排序与启停
- 账单导入解析阶段批量匹配,返回命中规则与建议分类/标签,预览表格新增「匹配规则/建议」列
- 确认导入时按行重新匹配:规则建议分类优先于面板默认分类,规则标签与默认标签合并去重
- 删除标签时同步清理规则标签关联
- AI 自然语言查询解析后直接应用筛选并搜索,移除二次确认弹窗,成功提示展示识别意图
- 修正登录日志筛选 success 参数类型为 'true'/'false'
2026-09-18 17:42:59 +08:00
rosercode
e82e0a4ef9
feat: 新增系统日志记录、查看与自动清理,VO 转换改用 MapStruct
...
- 新增访问/登录日志表与拦截器,登录成功/失败均记录,接口访问同时输出到应用日志
- 新增 /api/log/* 查询与 SSE 实时推送,运行日志默认最近 1 小时并支持日期/级别/关键字筛选
- 新增日志定时清理,保留天数可配置(默认 30 天,0 为永久保留)
- 前端新增系统日志页(独立 URL 子路径、标签偏好记忆),入口位于顶部用户下拉菜单
- 实体到视图对象的属性拷贝改用 MapStruct 编译期生成
2026-09-18 17:18:03 +08:00
rosercode
e49b6b7b81
feat: 新增定时账单导入提醒与通知直达导入页
...
- 新增通知配置、渠道、发送日志三张表(MySQL/SQLite 双建表脚本)及实体、Mapper、Service、Controller
- 支持邮箱(SMTP)与 Server 酱两种推送渠道,抽象 NotificationSender 工厂统一发送
- 新增 NotificationScheduler 定时任务,按每天/每周/每月周期检查并推送账单导入提醒
- 新增全局通知链接地址配置(/api/app/notification-url),随提醒一并下发
- 前端系统设置页新增「定时通知」面板,支持周期配置、渠道增删改测、立即发送与发送日志
- 新增 /bill-import 直达页,供提醒链接一键打开账单上传弹窗
- 登录支持 redirect 回跳,仅允许站内路径以防开放重定向
2026-09-18 16:47:09 +08:00
rosercode
c1f5d02564
feat: 支持数据库运行时配置与多数据库,重构设置页并完善打包
...
- 数据库支持 SQLite / MySQL 运行时配置与切换,未配置时仍可启动,配置后自动建表
- 新增默认分类与标签初始化,注册用户自动创建
- 新增注册开关(默认关闭,可在系统设置开启;无用户时允许创建首个账号)
- 合并数据库、注册与 AI 配置为「系统设置」页,拆分「模型使用情况」独立页面
- AI 一键设置支持新建分类与标签
- 前端构建产物打包进可执行 jar,后端增加 SPA 路由回退
- jar 更名为 finance-app,补全 Gradle Wrapper,移除 archive 任务
- 更新 DeepSeek 模型说明文案
2026-09-18 12:33:41 +08:00
rosercode
16e4c30456
feat: 前端新增日语多语言支持
...
- messages.ts 全量补充日文文案(です・ます 敬体),新增 locale.jaJP 语言名称
- index.ts 扩展 LocaleKey 与消息叶子校验,新增 ja-JP 语言包并支持浏览器 ja 自动识别
- LocaleSwitch 增加「日本語」切换项,App.vue 接入 Naive UI 日语组件与日期 locale
2026-09-18 10:17:30 +08:00
rosercode
a8ef91ed3d
feat: 扩展 AI 记账能力并优化收支记录交互
...
- AI 能力:新增分类 Emoji 推荐、标签颜色推荐、自然语言生成分类/标签、单条记录分类推荐
- AI 批量建议:按类型+支付方式+备注去重聚合后分批调用,支持分类/标签/两者范围并记忆偏好,结果可勾选应用
- 分类/标签管理:新增 EmojiPicker 与预设色板,支持 AI 一键推荐并在列表可视化
- 收支记录:新增序号列,标签筛选支持无标签,编辑记录时允许不设置分类
- 修复:账单导入未选择默认标签时生成空 IN 列表导致的 SQL 语法错误
- AI 未启用时隐藏所有 AI 入口与弹窗
2026-09-18 09:57:53 +08:00
rosercode
49c70a732d
feat: 接入 DeepSeek,新增 AI 分类建议、自然语言查询与智能记账
...
- 后端新增 AI 模块:DeepSeek 客户端、用户级配置表 t_ai_config、用量记录表 t_ai_usage
- 批量设置支持 AI 推荐分类与标签,并可一键应用
- 交易列表支持自然语言查询,解析为筛选条件确认后应用
- 支持自然语言记账,解析后预填新增表单
- 新增 AI 设置页:启用开关、API Key、接口地址、模型、连通性测试与用量统计
- 交易列表重排:AI 查询区、已激活筛选标签、备注与查询历史缓存
- 账单导入默认分类下拉补充分类图标
- 顶部用户入口改为下拉菜单(AI 设置 / 退出登录)
2026-09-17 18:26:03 +08:00
rosercode
179e9b78ca
feat: 前端新增中英文多语言支持
...
- 引入 vue-i18n,新增 locales/messages.ts 以中英对照方式维护词条
- 新增 LocaleSwitch 组件,在登录/注册页与主布局顶部栏提供切换入口
- 语言持久化到 localStorage 并同步 <html lang>,Naive UI 组件语言联动
- 各视图、表格列、弹窗与提示文案全部接入国际化
- 修复 confirmImport 缺失的 tagIds 类型定义
2026-09-17 17:03:49 +08:00
rosercode
65c0d8c550
feat: 新增标签体系、微信账单导入与收支记录体验优化
...
- 标签:新增 t_tag / t_transaction_tag 表与标签 CRUD,支持交易打标签、按标签筛选、批量添加/移除标签、导入账单默认标签,新增标签管理页
- 账单导入:新增微信支付 xlsx 解析器(WechatBillParser),支持支付宝 / 微信按类型导入;解析行保存原始完整数据(raw_data)并可在列表查看
- 收支记录:排序移至顶部并改为服务端排序(交易时间 / 金额,记忆偏好);筛选条件收纳为「更多筛选」弹层;分类筛选显示图标;一键设置支持「计入统计」;导入预览支持关键字 / 类型 / 状态 / 金额筛选
- 数据库:init.sql 新增 raw_data 字段与标签表,新增 init_tags.sql 默认标签种子
- 其他:更新 README 测试账号
2026-09-17 16:47:26 +08:00
rosercode
1df6e23510
feat: 账单导入、统计维度扩展与收支记录增强
...
- 账单导入:新增支付宝账单解析/导入接口,按 external_no 去重;前端拖拽上传 + 预览确认弹窗
- 分类可选:category_id 允许为空,支持「未分类」筛选,新增按类型一键批量设置分类
- 备注隐藏:新增 remark_hidden 与切换接口,列表默认显示 ****** 并可单格查看/取消隐藏,导出同步隐藏
- 统计扩展:新增 /statistics/summary、/statistics/group,支持日/周/月/季/年/支付方式/分类/类型维度与时间范围过滤
- 收支记录:金额区间过滤、金额/交易时间列排序、分页快速跳转、本页收支结余汇总、交易时间列前置并合并创建时间提示
- 用户偏好:统计面板与列表的筛选条件持久化到 localStorage,进入自动还原
- 其他:新增默认分类种子脚本(含美容美发)、commons-csv 依赖、上传大小限制 10MB、Vite 监听 0.0.0.0
2026-09-17 13:19:59 +08:00
wangshuo
733ed4bb86
feat: 初始化收支管理系统
2026-08-30 14:36:22 +08:00