IanShaw027
ee9b9b3971
fix(fe): 修复表格分页和基础功能问题
...
修复的主要问题:
1. **分页切换失效**(AccountsView.vue)
- 修复 useTableLoader 未解构 handlePageSizeChange 函数
- 添加 @update:pageSize 事件绑定到 Pagination 组件
2. **内存泄漏修复**(多个文件)
- UsersView.vue: 添加 searchTimeout 清理和 abortController.abort()
- ProxiesView.vue: 添加 onUnmounted 钩子清理定时器
- RedeemView.vue: 添加 onUnmounted 钩子清理定时器
3. **分页重置问题**(UsersView.vue)
- toggleBuiltInFilter: 切换筛选器时重置 pagination.page = 1
- toggleAttributeFilter: 切换属性筛选时重置 pagination.page = 1
影响范围:
- frontend/src/views/admin/AccountsView.vue
- frontend/src/views/admin/ProxiesView.vue
- frontend/src/views/admin/RedeemView.vue
- frontend/src/views/admin/UsersView.vue
测试:✓ 前端构建测试通过
2026-01-09 17:38:45 +08:00
Xu Kang
5d1badfe67
fix: add missing i18n key admin.accounts.outputCopied ( #218 )
2026-01-09 15:28:55 +08:00
shaw
43f104bdf7
fix(auth): 注册接口安全加固 - 默认关闭注册
2026-01-09 14:49:20 +08:00
shaw
0a9c17b9d1
Merge PR #213 : feat(openai): 支持 OpenAI Responses API 标准内容格式
2026-01-09 10:40:47 +08:00
程序猿MT
799b010631
fix(auth): 修复 RefreshToken 使用过期 token 时的 nil pointer panic ( #214 )
...
* fix(auth): 修复 RefreshToken 使用过期 token 时的 nil pointer panic
问题分析:
- RefreshToken 允许过期 token 继续流程(用于无感刷新)
- 但 ValidateToken 在 token 过期时返回 nil claims
- 导致后续访问 claims.UserID 时触发 panic
修复方案:
- 修改 ValidateToken,在检测到 ErrTokenExpired 时仍然返回 claims
- jwt-go 在解析时即使遇到过期错误,token.Claims 仍会被填充
- 这样 RefreshToken 可以正常获取用户信息并生成新 token
新增测试:
- TestAuthService_ValidateToken_ExpiredReturnsClaimsWithError
- TestAuthService_RefreshToken_ExpiredTokenNoPanic
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
* fix(auth): 修复邮件验证服务未配置时可绕过验证的安全漏洞
当邮件验证开启但 emailService 未配置时,原逻辑允许用户绕过验证直接注册。
现在会返回 ErrServiceUnavailable 拒绝注册,确保配置错误不会导致安全问题。
- 在验证码检查前先检查 emailService 是否配置
- 添加日志记录帮助发现配置问题
- 新增单元测试覆盖该场景
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
---------
Co-authored-by: yangjianbo <yangjianbo@leagsoft.com >
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-09 10:37:15 +08:00
shaw
2d83941aaa
feat(antigravity): 添加 URL fallback 机制 (sandbox → daily → prod)
2026-01-09 10:36:56 +08:00
Call White
f6a9a0a45a
Merge pull request #1 from cyhhao/feat/ai-sdk-compatibility
...
feat(openai): add AI SDK content format compatibility for OAuth accounts
2026-01-09 00:47:44 +08:00
cyhhao
5b8d4fb047
feat(openai): add AI SDK content format compatibility for OAuth accounts
...
- Add normalizeInputForCodexAPI function to convert AI SDK multi-part
content format to simplified format expected by ChatGPT Codex API
- AI SDK sends: {"content": [{"type": "input_text", "text": "..."}]}
- Codex API expects: {"content": "..."}
- Only applies to OAuth accounts (ChatGPT internal API)
- API Key accounts remain unchanged (OpenAI Platform API supports both)
2026-01-09 00:34:49 +08:00
IanShaw
afcfbb458d
fix(gemini): Google One 强制使用内置 OAuth client + 自动获取 project_id + UI 优化 ( #212 )
...
* fix(gemini): Google One 强制使用内置 OAuth client + 自动获取 project_id + UI 优化
## 后端改动
### 1. Google One 强制使用内置 Gemini CLI OAuth Client
**问题**:
- Google One 之前允许使用自定义 OAuth client,导致认证流程不稳定
- 与 Code Assist 的行为不一致
**解决方案**:
- 修改 `gemini_oauth_service.go`: Google One 现在与 Code Assist 一样强制使用内置 client (L122-135)
- 更新 `gemini_oauth_client.go`: ExchangeCode 和 RefreshToken 方法支持强制内置 client (L31-44, L77-86)
- 简化 `geminicli/oauth.go`: Google One scope 选择逻辑 (L187-190)
- 标记 `geminicli/constants.go`: DefaultGoogleOneScopes 为 DEPRECATED (L30-33)
- 更新测试用例以反映新行为
**OAuth 类型对比**:
| OAuth类型 | Client来源 | Scopes | Redirect URI |
|-----------|-----------|--------|-----------------|
| code_assist | 内置 Gemini CLI | DefaultCodeAssistScopes | https://codeassist.google.com/authcode |
| google_one | 内置 Gemini CLI (新) | DefaultCodeAssistScopes | https://codeassist.google.com/authcode |
| ai_studio | 必须自定义 | DefaultAIStudioScopes | http://localhost:1455/auth/callback |
### 2. Google One 自动获取 project_id
**问题**:
- Google One 个人账号测试模型时返回 403/404 错误
- 原因:cloudaicompanion API 需要 project_id,但个人账号无需手动创建 GCP 项目
**解决方案**:
- 修改 `gemini_oauth_service.go`: OAuth 流程中自动调用 fetchProjectID
- Google 通过 LoadCodeAssist API 自动分配 project_id
- 与 Gemini CLI 行为保持一致
- 后端根据 project_id 自动选择正确的 API 端点
**影响**:
- Google One 账号现在可以正常使用(需要重新授权)
- Code Assist 和 AI Studio 账号不受影响
### 3. 修复 Gemini 测试账号无内容输出问题
**问题**:
- 测试 Gemini 账号时只显示"测试成功",没有显示 AI 响应内容
- 原因:processGeminiStream 在检查到 finishReason 时立即返回,跳过了内容提取
**解决方案**:
- 修改 `account_test_service.go`: 调整逻辑顺序,先提取内容再检查是否完成
- 确保最后一个 chunk 的内容也能被正确显示
**影响**:
- 所有 Gemini 账号类型(API Key、OAuth)的测试现在都会显示完整响应内容
- 用户可以看到流式输出效果
## 前端改动
### 1. 修复图标宽度压缩问题
**问题**:
- 账户类型选择按钮中的图标在某些情况下会被压缩变形
**解决方案**:
- 修改 `CreateAccountModal.vue`: 为所有平台图标容器添加 `shrink-0` 类
- 确保 Anthropic、OpenAI、Gemini、Antigravity 图标保持固定 8×8 尺寸 (32px × 32px)
### 2. 优化重新授权界面
**问题**:
- 重新授权时显示三个可点击的授权类型选择按钮,可能导致用户误切换到不兼容的授权方式
**解决方案**:
- 修改 `ReAuthAccountModal.vue` (admin 和普通用户版本):
- 将可点击的授权类型选择按钮改为只读信息展示框
- 根据账号的 `credentials.oauth_type` 动态显示对应图标和文本
- 删除 `geminiAIStudioOAuthEnabled` 状态和 `handleSelectGeminiOAuthType` 方法
- 防止用户误操作
## 测试验证
- ✅ 所有后端单元测试通过
- ✅ OAuth client 选择逻辑正确
- ✅ Google One 和 Code Assist 行为一致
- ✅ 测试账号显示完整响应内容
- ✅ UI 图标显示正常
- ✅ 重新授权界面只读展示正确
* fix(lint): 修复 golangci-lint 错误信息格式问题
- 将错误信息改为小写开头以符合 Go 代码规范
- 修复 ST1005: error strings should not be capitalized
2026-01-08 23:47:29 +08:00
Edric Li
8f24d239af
fix: update integration tests for GatewayCache groupID parameter
2026-01-08 23:25:05 +08:00
Edric Li
b7a29a4bac
fix: update mock interfaces and fix gofmt issues for CI
...
- Update mockGatewayCacheForPlatform and mockGatewayCacheForGemini
to match new GatewayCache interface with groupID parameter
- Fix gofmt formatting in group_handler.go and admin_service.go
2026-01-08 23:13:57 +08:00
Edric Li
a42105881f
feat(groups): add Claude Code client restriction and session isolation
...
- Add claude_code_only field to restrict groups to Claude Code clients only
- Add fallback_group_id for non-Claude Code requests to use alternate group
- Implement ClaudeCodeValidator for User-Agent detection
- Add group-level session binding isolation (groupID in Redis key)
- Prevent cross-group sticky session pollution
- Update frontend with Claude Code restriction controls
2026-01-08 23:07:00 +08:00
Edric Li
958ffe7a8a
test: fix unit tests for user_agent and proxy repo interface
...
- Add user_agent field to API contract test expectation
- Add ListWithFiltersAndAccountCount stub to proxyRepoStub
2026-01-08 21:44:18 +08:00
Edric Li
b46b3c5c3c
Merge remote-tracking branch 'upstream/main'
2026-01-08 21:35:34 +08:00
Edric Li
fd1b14fd1d
feat(home): redirect admin users to admin dashboard
...
When clicking "Enter Console" button on home page, admin users are now
redirected to /admin/dashboard instead of /dashboard.
2026-01-08 21:26:00 +08:00
Edric Li
eb198e5969
feat(proxies): add account count column to proxy list
...
Display the number of accounts bound to each proxy in the admin proxy
management page, similar to the groups list view.
2026-01-08 21:20:12 +08:00
Edric Li
70fcbd7006
feat(usage): add User-Agent column to usage logs
...
- Add user_agent field to UsageLog DTO and mapper
- Display User-Agent column in admin and user usage tables
- Add formatUserAgent helper to show friendly client names
- Include user_agent in Excel export
- Remove request_id column from admin usage table
2026-01-08 21:02:13 +08:00
shaw
b015a3bd8a
fix(antigravity): 修复频繁出现429错误的问题
2026-01-08 20:06:32 +08:00
shaw
3fb43b91bf
fix(security): 强化 usage 端点信息暴露控制
2026-01-08 17:45:31 +08:00
shaw
6e8188ed64
fix(antigravity): 修复请求频繁429的问题
2026-01-08 17:27:35 +08:00
shaw
db6f53e2c9
fix(billing): 修复客户端取消请求时计费丢失问题
...
检测 context.Canceled 作为客户端断开信号,返回已收集的 usage 而非错误
2026-01-08 11:25:17 +08:00
shaw
acabdc2f99
fix(i18n): correct priority description - lower value means higher priority
2026-01-08 09:56:26 +08:00
shaw
169aa4716e
Merge branch 'feature/account-expires-at' into main: feat: add account expires-at field and auto-pause expired accounts
2026-01-08 09:27:57 +08:00
shaw
c0753320a0
Merge branch 'feat/usage-log-user-agent'
2026-01-08 09:16:48 +08:00
Edric Li
38d875b06f
feat(update): 添加在线更新和定价数据获取的代理支持
...
针对国内服务器访问 GitHub 困难的问题,为在线更新和定价数据获取功能添加代理支持。
主要变更:
- 新增 update.proxy_url 配置项,支持 http/https/socks5/socks5h 协议
- 修改 GitHubReleaseClient 和 PricingRemoteClient 支持代理配置
- 更新 Wire 依赖注入,通过 Provider 函数传递配置
- 更新 Docker 配置文件,支持通过 UPDATE_PROXY_URL 环境变量设置代理
配置示例:
update:
proxy_url: "http://127.0.0.1:7890 "
Docker 环境变量:
UPDATE_PROXY_URL=http://host.docker.internal:7890
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-07 23:15:20 +08:00
Edric Li
1ada6cf768
feat(usage-log): 增加请求 User-Agent 记录
...
在使用记录中添加 user_agent 字段,用于记录 API 请求的 User-Agent 头信息,
便于分析客户端类型和调试。
变更内容:
- 新增数据库迁移 028_add_usage_logs_user_agent.sql
- 更新 UsageLog 模型和 Ent Schema 添加 user_agent 字段
- 更新 Repository 层的 Create 和 scanUsageLog 方法
- 更新 RecordUsageInput 结构体支持传入 UserAgent
- 更新 Claude/OpenAI/Gemini 三个网关 Handler 传递 UserAgent
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-07 22:49:46 +08:00
LLLLLLiulei
2b528c5f81
feat: auto-pause expired accounts
2026-01-07 16:59:35 +08:00
Xu Kang
f6dd4752e7
fix: 修复 Go 版本、包管理器和技术栈文档 ( #195 )
...
- backend/Dockerfile: Go 版本从 1.21 更新到 1.25.5(与 go.mod 一致)
- Makefile: 使用 pnpm 替代 npm(与 pnpm-lock.yaml 和 CI 一致)
- README.md/README_CN.md: 技术栈从 GORM 修正为 Ent
2026-01-07 16:35:51 +08:00
Xu Kang
b19c7875a4
fix(i18n): use correct translation key for dashboard redeem code description ( #194 )
...
Changed dashboard.addBalance to dashboard.addBalanceWithCode to match the existing translation key in locale files.
2026-01-07 15:01:07 +08:00
shaw
d99a3ef14b
fix(gateway): 修复账号跨分组调度问题
...
问题:账号可能被调度到未分配的分组(如 simon 账号被调度到 claude_default)
根因:
- 强制平台模式下分组查询失败时回退到全平台查询
- listSchedulableAccounts 中分组为空时回退到无分组查询
- 粘性会话只检查平台匹配,未校验账号分组归属
修复:
- 移除强制平台模式的回退逻辑,分组内无账号时返回错误
- 移除 listSchedulableAccounts 的回退逻辑
- 新增 isAccountInGroup 方法用于分组校验
- 在三处粘性会话检查中增加分组归属验证
2026-01-07 10:56:52 +08:00
shaw
fc8fa83fcc
fix(keys): 修复代码框第一行多余空格问题
...
pre 标签会原样保留内部空白字符,导致 code 标签前的模板缩进
被渲染为实际空格。将 pre/code 标签写在同一行消除此问题。
2026-01-07 10:26:24 +08:00
shaw
6dcd99468b
fix(gateway): 修复 cache_control 块超限问题并优化 Claude Code 检测
...
问题:
- OAuth/SetupToken 账号注入 system prompt 后可能导致 cache_control
块超过 Anthropic API 的 4 个限制
- Claude Code 检测使用精确匹配,无法识别 Agent SDK 等变体
修复:
- 新增 enforceCacheControlLimit 函数,强制执行 4 个块限制
- 优先从 messages 移除,再从 system 尾部移除(保护注入的 prompt)
- 改用前缀匹配检测 Claude Code 系统提示词,支持多种变体:
- 标准版、Agent SDK 版、Explore Agent 版、Compact 版
2026-01-07 10:17:09 +08:00
shaw
d5ba7b80d3
fix(admin/usage): 恢复成本 Tooltip 明细并优化账号筛选
...
问题修复:
- 恢复 Cost Tooltip 的成本分项明细 (input_cost, output_cost, cache 成本)
- 修复 Token Tooltip 双分隔线显示问题
- 修复 Tooltip 翻译键缺失问题,新增 costDetails/tokenDetails
- 恢复 Excel 导出格式化 (aoa_to_sheet + 翻译列头)
功能优化:
- 账号筛选从前端搜索改为后端搜索,避免一次加载 1000 条数据
- 行为与用户/API Key 筛选保持一致 (debounce + 后端分页)
2026-01-07 09:35:21 +08:00
shaw
a3b81ef7bc
fix(test): 补充 stubUsageLogRepo 缺失的 GetStatsWithFilters 方法
2026-01-06 22:35:22 +08:00
shaw
015974a27e
feat(admin/usage): 优化管理员用量页面功能和体验
...
后端改进:
- 新增 GetStatsWithFilters 方法支持完整筛选条件
- Stats 端点支持 account_id, group_id, model, stream, billing_type 参数
- 统一使用 filters 结构体,移除冗余的分支逻辑
前端改进:
- 统计卡片添加"所选范围内"文字提示
- 优化总消费显示格式,清晰展示实际费用和标准计费
- Token 和费用列添加问号图标 tooltip 显示详细信息
- API Key 搜索框体验优化:点击即显示下拉选项
- 选择用户后自动加载该用户的所有 API Key
2026-01-06 22:19:07 +08:00
程序猿MT
4cf756ebe6
Merge branch 'Wei-Shaw:main' into main
2026-01-06 20:33:30 +08:00
yangjianbo
823497a2af
fix(并发): 修复 wrapReleaseOnDone goroutine 泄露问题
...
问题描述:
- wrapReleaseOnDone 函数创建的 goroutine 会持续等待 ctx.Done()
- 即使 release() 已被调用,goroutine 仍不会退出
- 高并发场景下(1000 req/s)会产生 3000+ 个泄露 goroutine
修复方案:
- 添加 quit channel 作为退出信号
- 正常释放时 close(quit) 通知 goroutine 立即退出
- 使用 select 监听 ctx.Done() 和 quit 两个信号
- 确保 goroutine 在正常流程中及时退出
测试覆盖:
- 新增 5 个单元测试验证修复效果
- 验证 goroutine 不泄露
- 验证并发安全性和多次调用保护
- 性能影响:471.9 ns/op, 208 B/op
影响范围:
- gateway_handler.go: 每请求调用 2-4 次
- openai_gateway_handler.go: 每请求调用 2-3 次
- 修复后 goroutine 泄露数量从 3/req 降至 0
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2026-01-06 20:31:40 +08:00
yangjianbo
66fe484f0d
chore: 删除依赖安全文档
2026-01-06 20:26:32 +08:00
shaw
216321aa9e
Merge PR #183 : 修复账号管理页面过滤器和错误提示问题
2026-01-06 19:49:18 +08:00
yangjianbo
5a52cb608c
fix(前端): 修复账号管理页面平台过滤不生效的问题
...
添加 @update:filters 事件监听,使过滤器参数能正确同步到数据请求中。
修复了平台、类型、状态三个过滤器全部失效的问题。
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2026-01-06 19:20:05 +08:00
yangjianbo
1181b332f7
fix(前端): 修复编辑账号错误提示无法显示具体原因的问题
...
后端 API 返回 message 字段,但前端读取 detail 字段,导致无法显示具体错误信息。
现在优先读取 message 字段,兼容 detail 字段。
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-06 15:46:36 +08:00
yangjianbo
58b1777198
fix(ci): 修复 frontend-security job 中的 pnpm 安装顺序问题
...
**问题描述:**
GitHub Actions 在 frontend-security job 中报错:
"Error: Unable to locate executable file: pnpm"
**根本原因:**
setup-node@v4 在尝试使用 pnpm cache 时,pnpm 还未安装
**解决方案:**
1. 调整步骤顺序:先安装 pnpm,再设置 Node.js
2. 升级 pnpm/action-setup 从 v2 到 v4
3. 明确指定 pnpm version: 9
**修改内容:**
- 将 "Set up pnpm" 步骤移到 "Set up Node.js" 之前
- 更新 pnpm/action-setup@v2 → pnpm/action-setup@v4
- 添加 version: 9 配置
**正确的步骤顺序:**
1. Checkout 代码
2. Set up pnpm (指定版本)
3. Set up Node.js (可以使用 pnpm cache)
4. Install dependencies
相关 Issue: #174
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-06 13:42:47 +08:00
yangjianbo
0c7a58fcc7
fix(配置): 修改 URL 安全配置默认值为开发友好模式
...
调整以下配置的默认值以匹配 .env.example:
- allow_insecure_http: false → true (允许 HTTP URL)
- allow_private_hosts: false → true (允许本地/私有 IP)
**改动说明:**
- 默认允许 HTTP URL,方便开发测试环境使用
- 默认允许本地和私有 IP 地址
- 与 deploy/.env.example 中的推荐配置保持一致
- 更新相应的单元测试以验证新的默认值
**安全提示:**
⚠️ 这些默认值适合开发/测试环境
⚠️ 生产环境建议显式配置更严格的安全策略
⚠️ HTTP 存在明文传输风险,仅在可信网络中使用
**测试结果:**
- ✅ 所有单元测试通过
- ✅ golangci-lint 无问题
相关文件:
- backend/internal/config/config.go:451-452
- backend/internal/config/config_test.go:83-88
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-06 12:56:29 +08:00
yangjianbo
17ae51c0a0
merge: 合并远程分支并修复代码冲突
...
合并了远程分支 cb72262 的功能更新,同时保留了 ESLint 修复:
**冲突解决详情:**
1. AccountTableFilters.vue
- ✅ 保留 emit 模式修复(避免 vue/no-mutating-props 错误)
- ✅ 添加第三个筛选器 type(账户类型)
- ✅ 新增 antigravity 平台和 inactive 状态选项
2. UserBalanceModal.vue
- ✅ 保留 console.error 错误日志
- ✅ 添加输入验证(金额校验、余额不足检查)
- ✅ 使用 appStore.showError 向用户显示友好错误
3. AccountsView.vue
- ✅ 保留所有 console.error 错误日志(避免 no-empty 错误)
- ✅ 使用新 API:clearRateLimit 和 setSchedulable
4. UsageView.vue
- ✅ 添加 console.error 错误日志
- ✅ 添加图表功能(模型分布、使用趋势)
- ✅ 添加粒度选择(按天/按小时)
- ✅ 保留 XLSX 动态导入优化
**测试结果:**
- ✅ Go tests: PASS
- ✅ golangci-lint: 0 issues
- ✅ ESLint: 0 errors
- ✅ TypeScript: PASS
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-06 12:50:51 +08:00
yangjianbo
4790aced15
fix(前端): 修复 ESLint 代码规范问题
...
- 修复 AccountTableFilters.vue 中的 vue/no-mutating-props 错误,使用 emit 模式替代直接修改 props
- 修复 TypeScript 类型错误,支持 Select 组件的 null 值类型
- 为所有空 catch 块添加错误日志,提升代码可维护性和调试能力
- 涉及文件:AccountTableFilters.vue, UserAllowedGroupsModal.vue, UserApiKeysModal.vue, UserBalanceModal.vue, AccountsView.vue, UsageView.vue, DashboardView.vue, ProfileView.vue
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-06 12:42:06 +08:00
yangjianbo
3f0017d1f1
fix(安全): 修复依赖漏洞并强化安全扫描
...
主要改动:
- 固定 Go 1.25.5 与 CI 校验并更新扫描流程
- 升级 quic-go、x/crypto、req 等依赖并通过 govulncheck
- 强化 JWT 校验、TLS 配置与 xlsx 动态加载
- 新增审计豁免清单与校验脚本
2026-01-06 11:36:38 +08:00
shaw
cb72262ad8
Merge PR #166 : feat: 图片生成计费功能
2026-01-06 11:29:35 +08:00
song
195e227c04
merge: 合并 upstream/main 并保留本地图片计费功能
2026-01-06 10:49:26 +08:00
Yuhao Jiang
f5603b0780
fix: 修复跨时区用户日期范围查询不准确的问题
...
问题:当用户时区与服务器时区不同时,日期范围查询使用服务器时区解析,
导致用户看到的数据与预期不符。
修复方案:
- 前端:所有 GET 请求自动携带用户时区参数
- 后端:新增时区辅助函数,所有日期解析和默认日期范围计算都使用用户时区
- 当用户时区为空或无效时,自动回退到服务器时区
🤖 Generated with [Claude Code](https://claude.ai/code )
Co-Authored-By: Claude <noreply@anthropic.com >
2026-01-05 20:43:03 -06:00
shaw
752882a022
fix: Token 统计支持 M 单位并修复 lint 错误
...
- 用户仪表盘 Token 统计卡片支持 K/M 单位自动切换
- 更新 formatTokensK 工具函数支持百万级显示
- 修复 setup.go 中未检查返回值的 errcheck 错误
2026-01-06 10:13:12 +08:00