shaw
f1e47291cd
fix: 修复账号更新时分组绑定操作顺序导致的数据不一致问题
...
原逻辑先执行 Update 再验证 GroupIDs,如果验证失败会导致账号已更新但返回错误。
现改为先验证分组是否存在,再执行 Update 和 BindGroups。
2025-12-27 14:57:43 +08:00
shaw
d7e9ae38e4
Merge PR #49 : feat: cc/codex/gemini 增加账号重试功能
2025-12-27 13:59:00 +08:00
程序猿MT
88be981afc
feat: ( #47 )
...
golang 1.24-> 1.25
node 20 -> node 24
具体提升请查看官方文档
Co-authored-by: yangjianbo <yangjianbo@leagsoft.com >
2025-12-27 13:56:14 +08:00
IanShaw
3f92a43170
test: 完善 UsageLogRepo 测试 stub 的过滤逻辑 ( #50 )
2025-12-27 13:53:47 +08:00
shaw
2101f1d1c8
fix: 修复claude OAuth账户刷新token失败的bug
2025-12-27 13:50:35 +08:00
daodao97
f0f920e49f
feat: cc/codex/gemini 增加账号重试
2025-12-27 12:27:47 +08:00
daodao97
95583fce83
feat: cc/codex support account retry
2025-12-27 12:05:38 +08:00
程序猿MT
a413fa3b17
Merge branch 'Wei-Shaw:main' into main
2025-12-27 10:58:30 +08:00
yangjianbo
3a8dbf5a99
feat:
...
golang 1.24-> 1.25
node 20 -> node 24
具体提升请查看官方文档
2025-12-27 10:57:53 +08:00
IanShaw
254f12543c
feat(frontend): 前端界面优化与使用统计功能增强 ( #46 )
...
* feat(frontend): 前端界面优化与使用统计功能增强
主要改动:
1. 表格布局统一优化
- 新增 TablePageLayout 通用布局组件
- 统一所有管理页面的表格样式和交互
- 优化 DataTable、Pagination、Select 等通用组件
2. 使用统计功能增强
- 管理端: 添加完整的筛选和显示功能
- 用户端: 完善 API Key 列显示
- 后端: 优化使用统计数据结构和查询
3. 账户组件优化
- 优化 AccountStatsModal、AccountUsageCell 等组件
- 统一进度条和统计显示样式
4. 其他改进
- 完善中英文国际化
- 统一页面样式和交互体验
- 优化各视图页面的响应式布局
* fix(test): 修复 stubUsageLogRepo.ListWithFilters 测试 stub
测试用例 GET /api/v1/usage 返回 500 是因为 stub 方法未实现,
现在正确返回基于 UserID 过滤的日志数据。
* feat(frontend): 统一日期时间显示格式
**主要改动**:
1. 增强 utils/format.ts:
- 新增 formatDateOnly() - 格式: YYYY-MM-DD
- 新增 formatDateTime() - 格式: YYYY-MM-DD HH:mm:ss
2. 全局替换视图中的格式化函数:
- 移除各视图中的自定义 formatDate 函数
- 统一导入使用 @/utils/format 中的函数
- created_at/updated_at 使用 formatDateTime
- expires_at 使用 formatDateOnly
3. 受影响的视图 (8个):
- frontend/src/views/user/KeysView.vue
- frontend/src/views/user/DashboardView.vue
- frontend/src/views/user/UsageView.vue
- frontend/src/views/user/RedeemView.vue
- frontend/src/views/admin/UsersView.vue
- frontend/src/views/admin/UsageView.vue
- frontend/src/views/admin/RedeemView.vue
- frontend/src/views/admin/SubscriptionsView.vue
**效果**:
- 日期统一显示为 YYYY-MM-DD
- 时间统一显示为 YYYY-MM-DD HH:mm:ss
- 提升可维护性,避免格式不一致
* fix(frontend): 补充遗漏的时间格式化统一
**补充修复**(基于 code review 发现的遗漏):
1. 增强 utils/format.ts:
- 新增 formatTime() - 格式: HH:mm
2. 修复 4 个遗漏的文件:
- src/views/admin/UsersView.vue
* 删除 formatExpiresAt(),改用 formatDateTime()
* 修复订阅过期时间 tooltip 显示格式不一致问题
- src/views/user/ProfileView.vue
* 删除 formatMemberSince(),改用 formatDate(date, 'YYYY-MM')
* 统一会员起始时间显示格式
- src/views/user/SubscriptionsView.vue
* 修改 formatExpirationDate() 使用 formatDateOnly()
* 保留天数计算逻辑
- src/components/account/AccountStatusIndicator.vue
* 删除本地 formatTime(),改用 utils/format 中的统一函数
* 修复 rate limit 和 overload 重置时间显示
**验证**:
- TypeScript 类型检查通过 ✓
- 前端构建成功 ✓
- 所有剩余的 toLocaleString() 都是数字格式化,属于正确用法 ✓
**效果**:
- 订阅过期时间统一为 YYYY-MM-DD HH:mm:ss
- 会员起始时间统一为 YYYY-MM
- 重置时间统一为 HH:mm
- 消除所有不规范的原生 locale 方法调用
2025-12-27 10:50:25 +08:00
IanShaw
cf8a64528c
fix: 修复 Gemini API 认证和 /responses 端点路由问题 ( #45 )
...
* fix(middleware): 修复 Gemini API Key 认证中间件用户上下文类型错误
修复了 ApiKeyAuthWithSubscriptionGoogle 中间件中设置用户上下文时的类型错误。
**问题:**
- 中间件直接设置 `apiKey.User` 对象到上下文
- 导致 handler 中获取 `AuthSubject` 时类型断言失败
- 所有 Gemini v1beta 端点返回 500 "User context not found"
**修复:**
- 改为设置 `AuthSubject` 结构体,与 `api_key_auth.go` 保持一致
- 添加 `ContextKeyUserRole` 设置以完整支持角色检查
**影响范围:**
- Gemini v1beta API 端点 (generateContent, streamGenerateContent)
- 使用 Google API Key 认证的所有请求
**测试:**
- 验证 Gemini CLI 调用成功返回 200
- 确认用户上下文正确传递到 handler
* fix(web): 修复 /responses 端点被前端中间件拦截的问题
- 将 /responses 路径添加到 API 白名单,防止其被当作前端路由处理
- 修复 /responses 端点返回 HTML 而非 API 响应的 BUG
- 解决 codex CLI stream 在远程服务器上断开连接的问题
根本原因:
在 6c469b4 提交中添加了 /responses 路由,但未同步更新前端嵌入中间件
的 API 白名单,导致该路由被拦截并返回 index.html 而非 API 响应。
2025-12-27 10:50:15 +08:00
shaw
2b79c4e8b7
chore: home页面更新gemini为已支持
2025-12-26 23:13:00 +08:00
shaw
429f38d0c9
Merge PR #37 : Add Gemini OAuth and Messages Compat Support
2025-12-26 22:42:34 +08:00
IanShaw027
2714be99a9
feat(test): 添加 Gemini 双响应格式支持
...
添加对两种 Gemini 响应格式的支持:
- AI Studio: `{"candidates": [...]}`
- Gemini CLI: `{"response": {"candidates": [...]}}`
通过 unwrap 逻辑自动检测并适配两种格式,确保账号测试功能
对所有 Gemini 账号类型都能正常工作。
合并 PR #43 的剩余功能到 PR #37
2025-12-26 22:31:12 +08:00
IanShaw027
d851818035
fix(lint): 修复 gofmt 格式问题
...
修复 golangci-lint 检查失败的问题:
- gemini_token_provider.go: 删除 import 后多余空行
- gemini_token_refresher.go: 删除 import 后多余空行
Fixes CI golangci-lint check for PR #37
2025-12-26 22:24:22 +08:00
IanShaw027
576bf4639c
refactor: 统一使用 mergeMap 函数提升代码一致性
...
根据 Gemini CLI 代码审查建议:
## 修改内容
- 将 Gemini OAuth 同步中的 `mergeJSONB` 调用替换为 `mergeMap`
- 删除不再使用的 `mergeJSONB` 函数定义
## 原因
- 其他平台(OpenAI、Anthropic)的账户同步都使用 `mergeMap`
- `mergeJSONB` 是为旧的 `model.JSONB` 类型设计,与重构后的架构不一致
- 统一函数命名提高代码可读性和可维护性
## 影响范围
- backend/internal/service/crs_sync_service.go (4处替换)
- backend/internal/service/account.go (删除 mergeJSONB 函数)
## 验证
✓ 编译通过
✓ 功能逻辑无变化(mergeMap 和 mergeJSONB 实现相同)
2025-12-26 22:15:15 +08:00
IanShaw027
9db52838b5
fix(backend): 适配重构后的架构修复 Gemini OAuth 集成
...
## 主要修改
1. **移除 model 包引用**
- 删除所有 `internal/model` 包的 import
- 使用 service 包中的类型定义(Account, Platform常量等)
2. **修复类型转换**
- JSONB → map[string]any
- 添加 mergeJSONB 辅助函数
- 添加 Account.IsGemini() 方法
3. **更新中间件调用**
- GetUserFromContext → GetAuthSubjectFromContext
- 适配新的并发控制签名(传递 ID 和 Concurrency 而不是完整对象)
4. **修复 handler 层**
- 更新 gemini_v1beta_handler.go
- 修正 billing 检查和 usage 记录
## 影响范围
- backend/internal/service/gemini_*.go
- backend/internal/service/account_test_service.go
- backend/internal/service/crs_sync_service.go
- backend/internal/handler/gemini_v1beta_handler.go
- backend/internal/handler/gateway_handler.go
- backend/internal/handler/admin/account_handler.go
2025-12-26 22:07:55 +08:00
IanShaw027
bfcd9501c2
merge: 合并 upstream/main 解决 PR #37 冲突
...
- 删除 backend/internal/model/account.go 符合重构方向
- 合并最新的项目结构重构
- 包含 SSE 格式解析修复
- 更新依赖和配置文件
2025-12-26 21:56:08 +08:00
September999999999
12252c6005
fix: 卸载时删除安装锁文件以支持重新安装 ( #39 )
...
- 卸载时自动删除 .installed 安装锁文件
- 新增 --purge 参数支持完全清理(包括配置目录)
- 交互模式下增加是否删除配置目录的确认提示
- 支持中英文消息
2025-12-26 21:32:22 +08:00
shaw
2d89f36687
Merge PR #42 : fix(sse): 修复非标准 SSE 格式解析问题
2025-12-26 21:31:34 +08:00
shaw
3d608c2625
Merge branch 'refactor/redis-key-helpers'
2025-12-26 21:26:18 +08:00
shaw
739d0ee61e
fix: admin handlers 添加 DTO 转换修复 JSON 序列化
...
修复 PR #36 合并后部分 admin handler 直接返回 service 层对象导致
JSON 字段名为 PascalCase 而非期望的 snake_case 问题。
修复内容:
- account_handler: Refresh 接口添加 dto.AccountFromService
- openai_oauth_handler: RefreshAccountToken/CreateAccountFromOAuth 添加 dto 转换
- subscription_handler: BulkAssign 添加 dto.BulkAssignResultFromService
- usage_handler: List 接口添加 dto.UsageLogFromService 转换
- 新增 dto.BulkAssignResult 类型和对应的 mapper 函数
2025-12-26 21:22:48 +08:00
shaw
22f07a7bb6
Merge PR #36 : refactor: 调整项目结构为单向依赖
2025-12-26 20:08:26 +08:00
ianshaw
16eec4eb41
fix(sse): 修复非标准 SSE 格式解析问题
...
部分上游 API 返回的 SSE 格式不符合标准规范:
- 标准格式: `data: {...}`(冒号后有空格)
- 非标准格式: `data:{...}`(冒号后无空格)
使用预编译正则 `^data:\s*` 统一处理两种格式。
2025-12-26 03:49:55 -08:00
shaw
ecb2c5353c
fix: 修复docker-compose.yml redis密码传递问题
2025-12-26 17:25:12 +08:00
Forest
06d5876b02
refactor: 封装 Redis key 生成函数
2025-12-26 16:47:44 +08:00
Forest
e5a77853b0
refactor: 调整项目结构为单向依赖
2025-12-26 16:45:40 +08:00
ianshaw
9780f0fd9d
fix(backend): 修复 rebase 后的代码集成问题
...
- 更新 middleware import 路径到 internal/server/middleware
- 修复 api_key_auth_google.go 使用正确的 service 类型
- 更新 router.go 和 http.go 支持 Gemini v1beta 路由
- 在 routes/gateway.go 中添加 Gemini v1beta API 端点
- 在 routes/admin.go 中添加 Gemini OAuth 路由
- 更新 wire.go 添加 GeminiOAuthService cleanup
- 重新生成 wire_gen.go
2025-12-26 00:17:55 -08:00
ianshaw
3559830882
fix(service): 应用德摩根定律修复 staticcheck QF1001 警告
2025-12-26 00:11:04 -08:00
ianshaw
5594680130
docs(deploy): 说明 AI Studio OAuth Client 需发布为正式版本
...
README.md:
- 添加第 7 步:发布 OAuth 应用到正式版本
- 说明 Testing 模式限制(100 用户、7 天 token 过期)
- 说明 sensitive scope 可能需要 Google 审核
.env.example:
- 添加 OAuth Client 需发布为正式版本的说明
2025-12-26 00:11:04 -08:00
ianshaw
50855ec15f
feat(i18n): 添加 AI Studio OAuth 配置状态相关文案
...
- 添加 aiStudioNotConfiguredShort/Tip/aiStudioNotConfigured 翻译
- 更新 needsProjectIdDesc/noProjectIdNeededDesc 描述更准确
2025-12-26 00:11:04 -08:00
ianshaw
f9f33e7b5c
feat(frontend): UI 显示 AI Studio OAuth 配置状态
...
CreateAccountModal:
- 检测 AI Studio OAuth 是否可用(服务器配置了自定义 OAuth 客户端)
- 未配置时禁用 AI Studio 选项并显示提示
- 添加悬停提示说明配置要求
ReAuthAccountModal:
- 同步 AI Studio OAuth 可用性检测逻辑
- 未配置时自动回退到 Code Assist
2025-12-26 00:11:03 -08:00
ianshaw
1bec35999b
feat(frontend): 添加 Gemini OAuth 能力查询 API
...
- 添加 GeminiOAuthCapabilities 类型定义
- 添加 getCapabilities API 函数
- useGeminiOAuth composable 导出 getCapabilities 方法
2025-12-26 00:11:03 -08:00
ianshaw
632318ad33
feat(backend): 添加 OAuth 能力查询接口,改进 OAuth 客户端选择逻辑
...
Handler 改进:
- 添加 GET /api/v1/admin/gemini/oauth/capabilities 接口
- 简化 GenerateAuthURL,redirect_uri 由服务层决定
Repository 改进:
- ExchangeCode/RefreshToken 根据 oauthType 选择正确的 OAuth 客户端
- Code Assist 始终使用内置客户端,AI Studio 使用用户配置的客户端
2025-12-26 00:11:03 -08:00
ianshaw
456e8984b0
feat(service): 改进 Gemini OAuth 服务层,区分 Code Assist 和 AI Studio 客户端
...
OAuth 服务改进:
- 添加 GetOAuthConfig 返回 AI Studio OAuth 可用性
- Code Assist 强制使用内置 Gemini CLI 客户端
- AI Studio OAuth 要求用户配置自定义 OAuth 客户端
- ExchangeCode/RefreshToken 接口添加 oauthType 参数
- 添加 unauthorized_client 错误的向后兼容重试逻辑
兼容层改进:
- 403 重试逻辑仅对 Code Assist OAuth 生效
- 添加 insufficient-scope 错误检测,避免无效重试
- 上游错误消息脱敏处理(隐藏 API key 等敏感信息)
- 改进错误提示,显示更多上游错误详情
2025-12-26 00:11:03 -08:00
ianshaw
eea949853a
feat(geminicli): 添加内置 Gemini CLI OAuth 客户端常量和改进配置逻辑
...
- 添加 GeminiCLIOAuthClientID/Secret 常量(Gemini CLI 公开 OAuth 客户端)
- 更新 DefaultAIStudioScopes 使用 generative-language.retriever(符合 Google 文档)
- EffectiveOAuthConfig 支持自动回退到内置客户端
- 内置客户端自动过滤受限 scope(如 generative-language)
- 添加 scope 向后兼容性处理
2025-12-26 00:11:03 -08:00
ianshaw
85fd1e4a2c
fix(backend): 移除对已删除 ports 包的依赖
...
适配 main 分支的 ports 目录删除重构:
- 将 ports 包中的接口移至 service 包
- 更新 repository 层的导入路径
2025-12-26 00:11:03 -08:00
ianshaw
6682d06c99
fix(backend): 修复 golangci-lint 报告的格式和代码规范问题
...
- gofmt: 修复 account_handler.go, models.go, gemini_messages_compat_service.go 的格式
- staticcheck ST1005: 将 error strings 改为小写开头
2025-12-26 00:11:03 -08:00
ianshaw
efa470efc7
fix(backend): 修复 golangci-lint 报告的问题
...
- gofmt: 修复代码格式问题
- errcheck: 处理 WriteString 和 Close 返回值
- staticcheck: 错误信息改为小写开头
- staticcheck: 移除无效的 nil 检查
- staticcheck: 使用 append 替换循环
- staticcheck: 使用无条件的 TrimPrefix
- ineffassign: 移除无效赋值
- unused: 移除未使用的 geminiOAuthService 字段
- 重新生成 wire_gen.go
2025-12-26 00:11:03 -08:00
ianshaw
79d1585250
docs(deploy): 更新部署配置和文档
...
- .env.example: 新增 Gemini OAuth 环境变量配置示例
- config.example.yaml: 新增 Gemini OAuth 配置示例
- README.md: 更新部署文档
- docker-compose.yml: 添加 Gemini OAuth 环境变量传递
2025-12-26 00:11:03 -08:00
ianshaw
2d1a15b196
feat(frontend): 添加 Gemini OAuth 类型国际化
...
- zh.ts: 添加中文翻译(Code Assist/AI Studio 选择等)
- en.ts: 添加英文翻译
2025-12-26 00:11:03 -08:00
ianshaw
09431cfc0b
feat(frontend): 支持 Gemini OAuth 类型选择 (Code Assist/AI Studio)
...
- CreateAccountModal.vue: 新增 OAuth 类型选择 UI
- ReAuthAccountModal.vue: 重授权支持选择类型
- OAuthAuthorizationFlow.vue: 新增 Project ID 输入框
- AccountTestModal.vue: Gemini 模型默认选择优化
- useGeminiOAuth.ts: OAuth 逻辑参数变更
- gemini.ts: API 调用更新
2025-12-26 00:11:03 -08:00
ianshaw
46cb82bac0
feat(backend): 添加 Gemini V1beta Handler 和路由
...
- 新增 gemini_v1beta_handler.go: 代理原生 Google API 格式
- 更新 gemini_oauth_handler.go: 移除 redirectUri,新增 oauthType
- 更新 account_handler.go: 账户 Handler 增强
- 更新 router.go: 注册 v1beta 路由
- 更新 config.go: Gemini OAuth 通过环境变量配置
- 更新 wire_gen.go: 依赖注入
2025-12-26 00:11:03 -08:00
ianshaw
b2d71da2a2
feat(backend): 实现 Gemini AI Studio OAuth 和消息兼容服务
...
- gemini_oauth_service.go: 新增 AI Studio OAuth 类型支持
- gemini_token_provider.go: Token 提供器增强
- gemini_messages_compat_service.go: 支持 AI Studio 端点
- account_test_service.go: Gemini 账户可用性检测
- gateway_service.go: 网关服务适配
- openai_gateway_service.go: OpenAI 兼容层调整
2025-12-26 00:11:03 -08:00
ianshaw
2d6e1d26c0
feat(backend): 扩展 Gemini OAuth Repository 层
...
- 更新 gemini_oauth_client.go: 支持 AI Studio OAuth 客户端
- 更新 geminicli_codeassist_client.go: 适配新的认证流程
2025-12-26 00:11:03 -08:00
ianshaw
50734c5edc
feat(backend): 添加 Google API Key 认证中间件
...
- 新增 api_key_auth_google.go: 支持 x-goog-api-key 格式认证
- 更新 api_key_auth.go: 适配 Gemini 原生 API 格式
2025-12-26 00:11:03 -08:00
ianshaw
040dc27ea5
feat(backend): 添加 Gemini/Google API 基础包
...
- 新增 pkg/gemini: 模型定义与回退列表
- 新增 pkg/googleapi: Google API 错误状态处理
- 新增 pkg/geminicli/models.go: CLI 模型结构
- 更新 constants.go: AI Studio 相关常量
- 更新 oauth.go: 支持 AI Studio OAuth 流程,凭据通过环境变量配置
2025-12-26 00:10:44 -08:00
ianshaw
d7090de0e0
chore: 更新 .gitignore 忽略 Go 编译缓存
...
添加 backend/.gocache/ 到忽略列表
2025-12-26 00:10:44 -08:00
ianshaw
cab681c7d1
chore(frontend): 更新项目配置和依赖
...
- 更新 package-lock.json 依赖版本
- 优化 Vite、PostCSS、Tailwind 配置
- 更新入口 HTML 文件
- 更新 TypeScript 构建缓存
2025-12-26 00:10:44 -08:00
ianshaw
01f990a5c9
style(frontend): 统一核心模块代码风格
...
- Composables: 优化 OAuth 相关 hooks 代码格式
- Stores: 规范状态管理模块格式
- Types: 统一类型定义格式
- Utils: 优化工具函数格式
- App.vue & style.css: 调整全局样式和主组件格式
2025-12-26 00:10:44 -08:00