094d564723
fix(t04): improve add page tags admin and undo delete
2026-06-12 10:17:47 +08:00
b33ebf0879
feat(t03): improve performance and UX
...
- add category/tag caching and optimistic updates
- add stats dashboard aggregation and batched tracking
- add undo delete snackbar and group read-only view mode
- improve app-ready timeout handling and refresh guards
2026-06-11 16:26:46 +08:00
5a0ae0b28d
refactor(iter-v2): T02 code quality - shared components, transactions, utils
...
- C2: ColorPicker and EditModal reusable components extracted
- C2: tag-manage and category-manage pages use EditModal (remove ~120 dup lines)
- C3: Upload logic extracted to server/src/utils/upload.ts
- C4: /recurring/sync wrapped in DB transaction
- C7: Backup download uses API_BASE (no hardcoded URLs)
- C9: getAvatarUrl() utility function, used in 5 files
- C1: getCurrentMonth() documented as aligned with server date.ts
2026-06-11 09:49:17 +08:00
d170df5c51
fix(iter-v2): T01 QA fixes - race condition, hook regex, deleted user check
...
- BUG-1: Pre-commit hook allows .env.example (grep -v filter)
- BUG-2: /auth/refresh uses transaction + FOR UPDATE to prevent race condition
- WARN-1: Auth middleware checks deleted_at with 5-min TTL cache
- WARN-2: PUT /admin/users/:id/status filters deleted_at IS NULL
- WARN-3: Install node-cron@^3.0.3
2026-06-11 09:34:27 +08:00
263a7c4616
feat(iter-v2): T01 complete - security + infrastructure
...
- S1: .githooks/pre-commit blocks .env commits, .env.test in .gitignore
- S3: TOKEN_SECRET centralized to config/token.ts, all files import from it
- S3: checkTokenSecret enforces min 32-char TOKEN_SECRET at startup
- S5: Refresh Token mechanism (Access 2h + Refresh 30d, dual token)
- S5: POST /auth/refresh endpoint with rotation and max 5 per user
- S5: Frontend request.ts auto-refresh on 40101, concurrent-safe
- S6: Soft delete (deleted_at column), admin soft-delete with confirmName
- S6: POST /admin/users/:id/restore endpoint
- S6: All user queries filter deleted_at IS NULL
- S7: DB connection requires env vars, no fallback credentials
- Infra: jest.config.js, vitest.config.ts, .env.test
- Infra: node-cron, jest, ts-jest, supertest, vitest, @pinia/testing
2026-06-11 09:24:10 +08:00
61f9b33f8c
feat(iter-v2): T01 partial - TOKEN_SECRET check, SQL param, export credential, docs
...
- S2: logs.ts LIMIT/OFFSET SQL parameterization (? placeholders)
- S3: checkTokenSecret() startup validation, JWT_SECRET→TOKEN_SECRET in backup.ts
- S3: Access Token expiry shortened to 2h (from 30d)
- S4: Export download uses HMAC signed short-term token (/prepare endpoint)
- S4: Frontend export.ts adapted for prepare-then-download flow
- .env.example reorganized with security notes
- Added PRD and architecture docs for iteration v2
2026-06-11 08:58:24 +08:00
ae9b415822
refactor: TransactionItem 左滑提示改为 prop 控制
2026-06-10 17:35:58 +08:00
31f6487d61
feat: 前后端功能对齐 - 实现8个对齐差距
...
P0-1: 分类拖拽排序 - category-manage 添加拖拽 UI
P1-1: 反馈回复展示 - 新增 GET /feedback/mine + 前端我的反馈Tab
P1-2: 备份管理页面 - 新增下载端点 + backup-manage 页面
P2-1: 统计年度/周视图 - stats 支持 period 参数 + 前端维度切换器
P2-2: 数据导入 - 新增 POST /import 端点 + data-import 页面
P2-3: 数据导出服务端化 - 新增 GET /export 流式端点
P3-1: 健康检查展示 - health 移到 auth 前 + admin 状态卡片
P3-2~4: 交易标签系统 - tags CRUD + 交易关联 + 按标签筛选统计
后端: 新增 tag.ts/export.ts 路由, 改造 feedback/backup/transaction/stats
前端: 新增 DragSortList 组件, 3个新页面, 改造 7 个现有页面
QA 修复: 5个严重Bug + 4个潜在问题
2026-06-10 17:30:36 +08:00
5df910c9f1
feat(ui): UI/交互优化 — 动画系统+Design Token+骨架屏+微反馈
...
1. Design Token 统一:CategoryIcon/BudgetBar/Numpad/Skeleton/TransactionItem
硬编码hex颜色替换为 $primary/$border/$danger 等SCSS变量
2. 入场动画:mixins.scss 添加 fade-in-up/bounce-in/count-up 等 mixin+keyframes,
首页卡片/金额/快捷按钮应用交错入场动画
3. 记账成功动画增强:SaveSuccess 增加纸屑粒子爆发+光环脉冲效果,
prefers-reduced-motion 下自动隐藏
4. 骨架屏替代文字加载:recurring/group-manage/notifications 三个页面
从"加载中..."替换为骨架屏;空状态增加图标容器+引导文案
5. 交互微反馈:分类按压0.92缩放、推荐虚线呼吸动画、
Tab滑块cubic-bezier优化、快捷按钮弹性按压
6. 左滑删除提示:TransactionItem首项1.5s后自动微微左滑再回弹,
引导用户发现滑动删除功能
2026-06-10 15:59:42 +08:00
9f5802d634
fix: 修复3个高优先级Bug + 5个中低优先级问题
...
BUG-01: recurring /sync next_date 更新逻辑错误(应用循环后的 next)
BUG-02: bills onReachBottom loading 缺 .value
BUG-03: group store switchToPersonal 缺少 await (3处)
OPT-04: notification requireNotificationEditAuth 加 try-catch
OPT-05: category 迁移源分类条件改为 is_custom=1 AND user_id=?
OPT-06: user 旧头像删除加 try-catch + 日志
CODE-02: format.ts 跨年日期显示年份
CODE-05: notification isValidUrl 去掉相对路径允许
2026-06-10 15:59:12 +08:00
f586f9e117
fix: 金额编辑器小数位溢出挤位 + 编辑页自动聚焦 + 周期账单移除冗余聚焦
2026-06-09 16:54:13 +08:00
6b26951b1b
fix: 金额输入框样式优化 + 预算页键盘遮挡修复 + admin 样式修复
...
- AmountEditor: 未聚焦时透明,聚焦时粘土卡片浮起;¥/单位 baseline 对齐
- budget: 补充 Numpad 占位高度,auto-focus 改为 false 缩短页面
- admin/feedback: 补充 modal-mask mixin
- admin/track: filter-tabs 与 scroll-view 分离 + 格式化
2026-06-09 14:44:25 +08:00
768c72d7b7
feat: 金额编辑器交互优化 — 支持光标定位、插入删除、长按删除
...
- 新增 AmountEditor 组件,页面只接一个组件即可获得完整金额编辑体验
- Numpad 增强:支持 cursorIndex 光标输入 + 长按连续删除
- 金额编辑纯函数 amount-edit.ts 集中管理插入/删除/校验规则
- 记一笔、预算页、周期账单弹窗统一接入 AmountEditor
- 默认聚焦金额、点击备注/日期/分类隐藏 Numpad、再次点击金额恢复
- 空值输入小数点规范为 0.
2026-06-09 14:09:14 +08:00
ac20a70a20
refactor: 移除前端接口缓存 — 每次 onShow 都实时请求最新数据
2026-06-09 09:21:16 +08:00
4e4b7dac69
fix: 周期账单弹窗 — Numpad 移到 scroll-view 外 + 防重复提交 + @confirm 绑定
2026-06-09 09:13:28 +08:00
df6f1a54d6
refactor: Numpad 组件支持 fixed prop — 弹窗内嵌 / 页面固定两种模式
2026-06-09 09:10:36 +08:00
7bf899f0b1
refactor: 周期账单 Numpad 改为弹窗内嵌,移除 fixed 定位
2026-06-09 09:08:03 +08:00
a277f1533b
fix: 首页刷新/反馈按钮/周期键盘三个 bug 修复
2026-06-09 09:06:44 +08:00
f745f4b4f0
fix: 修复 feedback 状态类型 — string → Feedback['status'] 联合类型
2026-06-09 09:02:02 +08:00
6908ffed0e
feat: 智能分类建议 — 根据金额/备注/历史自动推荐分类
2026-06-08 17:21:10 +08:00
057c69800e
feat: 周期账单 — 自动生成定期交易(房租/订阅/工资)
2026-06-08 17:17:16 +08:00
986c187156
feat: 忽略反馈也支持回复 — 统一标记处理/忽略的回复流程
2026-06-08 17:03:50 +08:00
91ff95ea48
feat: 反馈处理增加回复功能 — 管理员可回复用户反馈并推送通知
2026-06-08 17:02:34 +08:00
a1e62e487d
feat: 数据导出增强 — 日期范围/类型筛选/CSV+JSON 格式
2026-06-08 16:58:48 +08:00
be665f7859
fix: S3 UI优化 — 底部弹窗/FAB 安全区适配
2026-06-08 16:54:56 +08:00
4e43a9049a
fix: S2 缺陷修复 — emoji/类型/双重请求/动画/prefers-reduced-motion
2026-06-08 16:53:27 +08:00
618cd20ebf
docs: S1 全面扫描汇总报告 — 12 项发现
2026-06-08 16:47:34 +08:00
3279440ce6
docs: S1 全面扫描实施计划
2026-06-08 16:40:43 +08:00
2b04f057a9
docs: 质量迭代设计文档 — S1 全面扫描方案
2026-06-08 16:37:26 +08:00
41cddcd2c1
fix: 修复 feedback 查询 LIMIT/OFFSET 参数类型错误
...
- 和 logs.ts 同样的问题,execute 对参数类型要求严格
- 改为直接嵌入 SQL 字符串
2026-06-08 16:24:15 +08:00
4d3a390075
fix: queryTrackEvents 也过滤 undefined 值
2026-06-08 16:22:02 +08:00
ef4ab774b0
fix: 修复日志查询 undefined 序列化问题
...
- queryLogs 过滤掉 undefined 值
- 防止 undefined 被序列化为 'undefined' 字符串导致筛选失败
2026-06-08 16:14:22 +08:00
af15a41186
fix: 日志和埋点页面修复
...
日志页:
- 关键词搜索添加搜索按钮
- 修复搜索样式重复问题
埋点页:
- 事件类型显示中文名称(页面访问、用户操作等)
- 今日事件和热门事件使用标签样式
- 添加日期筛选和关键词搜索
- 事件类型筛选可横向滚动
2026-06-08 16:12:38 +08:00
6ef44805f5
fix: 修复埋点查询 LIMIT/OFFSET 参数类型错误
...
- mysql2 execute 对 LIMIT/OFFSET 参数类型要求严格
- 改为直接嵌入 SQL 字符串(pSize 和 offset 已是安全的数字)
2026-06-08 15:56:16 +08:00
50c41d8759
fix: 埋点统计和日志查询修复
...
- track.vue: 修复日期格式化(处理 ISO 格式)
- track.vue: 筛选标签改为可滚动
- logs.ts: 修复 queryLogs 参数传递(移除 undefined date)
2026-06-08 15:50:30 +08:00
b21c90c560
fix: 修复 feedbacks 表 TEXT 类型默认值问题
...
- admin_reply TEXT 不能有 DEFAULT '',移除默认值
- 此问题导致 feedbacks 和 track_events 表都创建失败
2026-06-08 15:42:17 +08:00
7f6da1fa10
fix: 恢复使用服务器本地时间,不硬编码时区
...
- logger.ts: 使用 new Date() 服务器本地时间
- logs.ts: 统计使用服务器本地时间
- 时区显示由客户端处理
2026-06-08 15:37:21 +08:00
3ce5ff4b65
fix: 日志时区修复 + 日期选择器
...
- logger.ts: 使用 UTC+8 时区记录日志
- logs.ts: 统计使用 UTC+8 今日日期
- logs.vue: 日期选择器改用 picker 组件
- 移除未使用的 showDatePicker 变量
2026-06-08 15:35:50 +08:00
fc3491742f
fix: 全面检查修复 — 路由顺序 + 安全加固
...
- logs.ts: /track/stats 和 /track/list 移到 /:date 之前,修复路由匹配问题
- config.ts: 添加配置键白名单校验,限制值长度 500 字符
- track.ts: 添加输入校验,限制事件数量和字段长度
- index.ts: /api/track 添加 rate limiter
2026-06-08 15:27:57 +08:00
a1e3106899
feat: 埋点统计系统 — 数据库存储 + 管理后台查询
...
后端:
- track_events 表存储埋点数据(事件类型、页面、数据、用户)
- track 路由改为写入数据库
- logs 路由新增 /track/stats 和 /track/list 查询接口
前端:
- 新增埋点统计页面(今日事件、7天趋势、热门事件)
- 支持按事件类型筛选
- 管理后台添加「埋点统计」入口
2026-06-08 15:19:12 +08:00
162f2dc89c
fix: 日志系统修复
...
- userId 延迟到 finish 事件获取(authMiddleware 已执行)
- 日志记录 UTC 时间戳,支持前端按用户时区显示
- 日期筛选和级别筛选 watch 监听修复
- 添加 showDatePicker 变量定义
2026-06-08 15:06:29 +08:00
860c599b7c
fix: 系统检查修复 — 安全和稳定性
...
后端:
- config.ts 使用 requireAdmin 中间件,统一响应格式
- feedback.ts 使用 requireAdmin 中间件,移除重复权限检查
- feedback.ts 添加 affectedRows 检查(反馈不存在时返回 404)
- 全局错误处理中间件兜底未捕获异常
前端:
- request.ts 添加 15 秒请求超时设置
2026-06-08 14:48:39 +08:00
dcab68b3a8
fix: 修复 logs.ts TypeScript 类型错误 — level 参数类型处理
2026-06-08 14:34:45 +08:00
cc09a177ef
feat: 管理后台日志查询系统
...
后端:
- 新增 /api/logs 路由,支持日志文件列表、统计、查询
- 按日期/级别/关键词筛选日志
前端:
- 新增日志管理页面,展示今日统计和7天趋势
- 支持按级别筛选和关键词搜索
- 管理后台添加「系统日志」入口
2026-06-08 14:33:09 +08:00
0de4c9832c
feat: 请求日志 + 前端埋点系统
...
后端:
- 新增 logger 中间件,记录所有请求到 logs/ 目录
- 新增 /api/track 接口接收前端埋点数据
前端:
- 新增 tracker 工具,支持页面访问/操作/错误埋点
- request.ts 添加 API 错误自动埋点
- App.vue 初始化全局错误追踪
文档:
- CLAUDE.md 更新项目结构
- DEV.md 添加埋点和日志说明
2026-06-08 14:28:11 +08:00
2f122d0a96
docs: 更新 DEV.md — 后端 API 响应格式规范
...
- 统一响应格式 { code: 0, data: ... }
- 错误码规范说明
2026-06-08 11:30:58 +08:00
d681dc67a3
fix: 后端 API 响应格式统一 — config 和 feedback 路由
...
- config.ts: 响应格式改为 { code: 0, data: ... }
- feedback.ts: 响应格式改为 { code: 0, data: ... }
- 修复前端 request 函数因响应格式不标准导致的请求失败
2026-06-08 11:30:38 +08:00
9423f15f29
docs: 更新 DEV.md — API 调用规范和页面加载模式
...
- request 函数正确调用格式说明
- 页面数据加载标准模式(initialLoaded 守卫)
2026-06-08 11:25:03 +08:00
65c2a81486
fix: API 调用格式修复 — request 参数传递方式
...
- feedback.ts: 修复 request 调用格式,使用 { url, data } 对象
- config.ts: 修复 request 调用格式,使用 { url } 对象
2026-06-08 11:23:43 +08:00
24166aeb62
fix: 系统检查修复 — 布局一致性 + bug 修复
...
- 公告图片样式统一:圆角 $radius-md,间距 $space-sm
- 首页紧急公告弹窗样式改为 SCSS 变量
- 新增 modal-mask-high mixin 统一高层级弹窗
- admin/config.vue 添加 initialLoaded 守卫避免重复请求
- notifications/index.vue 添加 initialLoaded 守卫
- notification store 所有方法添加 try-catch 错误处理
2026-06-08 11:21:08 +08:00