DaydreamCoding
664e9fdcd4
feat(usage): 用户用量按平台拆分 + UsersView 列设置可配置 + 用量列排序
后端
- BatchUserUsageStats / UserDashboardStats 新增 ByPlatform 字段
复用 ops 路径 COALESCE(g.platform, a.platform) 语义,不冗余 DB 字段
- 抽出 usageLogEffectivePlatformExpr 常量供管理员与用户两路径共用
- GetBatchUsersUsage cacheKey 加 v=2 + 当日日期,修复跨午夜旧缓存兼容新字段
前端
- 新建 PlatformUsageBreakdown:管理员用量列 hover tooltip 展示各平台 today/total
- 新建 PlatformCostCell:单平台 today/total 紧凑单元格
- UsersView 列设置新增 Claude/OpenAI/Gemini/Antigravity 四个平台子列,默认隐藏可手动启用
- 普通用户 Dashboard 新增 Row 3 平台拆分卡片,受 isSimple 控制
- 平台之和 < 总值时显式展示"其他"行,避免数字对不齐
- last_active_at 从 FORCED_VISIBLE_COLUMNS 移除,允许用户隐藏并持久化
- 列设置加 schema 版本号 + 迁移机制,老用户升级时新增默认隐藏列自动应用
- UsersView 用量列(汇总 + 4 平台子列)加入前端单页排序:列头单按钮 + 弹出菜单
切换"今日 / 近30天",三态循环 desc → asc → off;菜单底部备注"仅对本页数据排序"
- sortedUsers computed 在 server-side-sort 结果之上叠加本地排序,缺失值按 0 处理;
usageSort 状态独立 localStorage 持久化,互不干扰后端 sort_by
- i18n 新增 admin.users.sortBy / sortCurrentPageOnly
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 15:25:34 +08:00
..
2026-05-19 15:25:34 +08:00
2026-05-12 15:21:31 +08:00
2026-02-02 22:13:50 +08:00
2026-04-09 18:14:28 +08:00
2026-04-22 13:19:28 +08:00
2026-05-06 20:52:10 +08:00
2026-05-06 20:52:10 +08:00
2026-04-24 22:22:26 +08:00
2026-04-22 14:56:56 +08:00
2026-04-26 12:42:35 +08:00
2026-04-22 12:30:00 +08:00
2026-05-07 10:07:28 +08:00
2026-04-26 12:42:35 +08:00
2026-04-22 13:19:20 +08:00
2026-04-22 14:56:56 +08:00
2026-04-26 12:42:35 +08:00
2026-04-25 08:44:18 +08:00
2026-04-25 08:44:18 +08:00
2026-04-26 12:42:35 +08:00
2026-04-21 21:44:34 +08:00
2026-04-21 21:44:34 +08:00
2026-04-21 00:21:29 +08:00
2026-05-07 09:14:47 +08:00
2026-04-22 12:30:08 +08:00
2026-04-22 12:30:08 +08:00
2026-03-08 14:12:17 +08:00
2026-03-08 14:12:17 +08:00
2026-04-23 16:34:37 +08:00
2026-05-19 14:47:52 +08:00
2026-02-14 11:23:10 +08:00
2026-02-07 19:04:08 +08:00
2026-05-18 16:52:32 +08:00
2026-03-15 16:21:49 +08:00
2026-04-29 22:48:39 +08:00
2026-05-19 14:47:52 +08:00
2026-02-07 22:14:07 +08:00
2026-03-09 19:55:18 +08:00
2026-03-18 11:31:32 +08:00
2026-01-06 20:31:40 +08:00
2026-03-01 15:45:44 +08:00
2026-05-15 11:33:26 +08:00
2026-02-07 17:12:15 +08:00
2026-04-01 02:20:13 +08:00
2026-05-18 16:52:32 +08:00
2026-05-07 09:14:47 +08:00
2026-02-23 12:45:37 +08:00
2026-02-23 12:45:37 +08:00
2026-05-05 03:26:54 +08:00
2026-05-05 03:26:54 +08:00
2026-02-12 19:01:09 +08:00
2026-05-19 14:47:10 +08:00
2026-04-25 05:26:33 +00:00
2026-03-15 22:13:42 +08:00
2026-05-07 09:14:47 +08:00
2026-05-18 16:52:20 +08:00
2026-05-05 03:26:54 +08:00
2026-05-18 16:52:20 +08:00
2026-05-18 16:52:06 +08:00
2026-05-18 16:52:06 +08:00
2026-05-12 15:21:31 +08:00
2026-05-07 10:05:49 +08:00
2026-05-11 11:17:26 +08:00
2026-05-11 11:17:26 +08:00
2026-05-11 11:17:26 +08:00
2026-05-11 11:17:26 +08:00
2025-12-26 16:45:40 +08:00
2025-12-31 08:50:12 +08:00
2025-12-31 08:50:12 +08:00
2026-04-21 20:36:10 +08:00
2026-05-07 17:35:05 +08:00
2025-12-26 16:45:40 +08:00
2026-02-02 22:13:50 +08:00
2026-04-09 18:14:28 +08:00
2026-04-09 18:14:28 +08:00
2026-04-09 18:14:28 +08:00
2026-05-05 03:26:54 +08:00
2026-05-05 06:44:37 -07:00
2026-04-25 08:44:18 +08:00
2026-03-03 01:05:11 +08:00
2026-05-07 09:14:47 +08:00