1. 29 Dec, 2025 5 commits
    • yangjianbo's avatar
      test(用户): 补齐创建用户与注册单测 · 305eaabb
      yangjianbo authored
      覆盖管理员创建用户与注册流程的关键失败分支\n完善创建成功路径的断言
      305eaabb
    • yangjianbo's avatar
      test(删除): 添加删除单测并修复中间件测试 · f6de36cb
      yangjianbo authored
      新增 AdminService 删除路径单元测试与规范场景更新\n同步调整 Google API Key 中间件测试桩与签名
      f6de36cb
    • yangjianbo's avatar
      test(服务层): 添加删除方法的单元测试 · 100d9d20
      yangjianbo authored
      - 新增 AccountService.Delete 方法的 4 个测试用例
      - 新增 ApiKeyService.Delete 方法的 4 个测试用例
      - 使用 stub 模式隔离数据库依赖,验证权限检查和缓存清理逻辑
      - 添加详细的中文注释说明测试设计和预期行为
      
      🤖 Generated with [Claude Code](https://claude.com/claude-code
      
      )
      Co-Authored-By: default avatarClaude Opus 4.5 <noreply@anthropic.com>
      100d9d20
    • yangjianbo's avatar
      perf(后端): 优化删除操作的数据库查询性能 · e9c755f4
      yangjianbo authored
      - 新增 ExistsByID 方法用于账号存在性检查,避免加载完整对象
      - 新增 GetOwnerID 方法用于 API Key 所有权验证,仅查询 user_id 字段
      - 优化 AccountService.Delete 使用轻量级存在性检查
      - 优化 ApiKeyService.Delete 使用轻量级权限验证
      - 改进前端删除错误提示,显示后端返回的具体错误消息
      - 添加详细的中文注释说明优化原因
      
      🤖 Generated with [Claude Code](https://claude.com/claude-code
      
      )
      Co-Authored-By: default avatarClaude Opus 4.5 <noreply@anthropic.com>
      e9c755f4
    • shaw's avatar
      refactor: 移除旧版数据库配置的简易模式实现 · 31fef105
      shaw authored
      移除与 PR #66 冲突的旧版简易模式实现(commit 7d4b7dee)。
      新版简易模式通过 run_mode 配置文件/环境变量控制,无需数据库设置。
      
      后端变更:
      - 移除 SettingKeySimpleMode 常量
      - 移除 SystemSettings/PublicSettings 中的 SimpleMode 字段
      - 移除 setting_handler 中的简易模式切换逻辑
      - 移除 userService 依赖(不再需要自动设置管理员并发数)
      
      前端变更:
      - 移除 appStore.simpleMode 状态
      - 移除设置页面的"使用模式"设置区块
      - 移除 GroupsView 中的简易模式相关逻辑
      - 移除相关国际化文案
      31fef105
  2. 28 Dec, 2025 6 commits
    • IanShaw027's avatar
      feat(全栈): 实现简易模式核心功能 · ecfad788
      IanShaw027 authored
      **功能概述**:
      实现简易模式(Simple Mode),为个人用户和小团队提供简化的使用体验,隐藏复杂的分组、订阅、配额等概念。
      
      **后端改动**:
      1. 配置系统
         - 新增 run_mode 配置项(standard/simple)
         - 支持环境变量 RUN_MODE
         - 默认值为 standard
      
      2. 数据库初始化
         - 自动创建3个默认分组:anthropic-default、openai-default、gemini-default
         - 默认分组配置:无并发限制、active状态、非独占
         - 幂等性保证:重复启动不会重复创建
      
      3. 账号管理
         - 创建账号时自动绑定对应平台的默认分组
         - 如果未指定分组,自动查找并绑定默认分组
      
      **前端改动**:
      1. 状态管理
         - authStore 新增 isSimpleMode 计算属性
         - 从后端API获取并同步运行模式
      
      2. UI隐藏
         - 侧边栏:隐藏分组管理、订阅管理、兑换码菜单
         - 账号管理页面:隐藏分组列
         - 创建/编辑账号对话框:隐藏分组选择器
      
      3. 路由守卫
         - 限制访问分组、订阅、兑换码相关页面
         - 访问受限页面时自动重定向到仪表板
      
      **配置示例**:
      ```yaml
      run_mode: simple
      
      run_mode: standard
      ```
      
      **影响范围**:
      - 后端:配置、数据库迁移、账号服务
      - 前端:认证状态、路由、UI组件
      - 部署:配置文件示例
      
      **兼容性**:
      - 简易模式和标准模式可无缝切换
      - 不需要数据迁移
      - 现有数据不受影响
      ecfad788
    • shaw's avatar
      fix(usage): 分离 API 响应和窗口统计缓存,修复 5h 窗口未激活时的显示 bug · 30b95cf5
      shaw authored
      问题:
      1. WindowStats 与 API 响应一起缓存 10 分钟,导致费用数据更新延迟
      2. 当 5h 窗口未激活(ResetsAt 为空)时,FiveHour 为 nil,导致所有窗口的 WindowStats 都无法显示
      
      修复:
      - 分离缓存:API 响应缓存 10 分钟,窗口统计独立缓存 1 分钟
      - RemainingSeconds 每次请求时实时计算
      - FiveHour 对象始终创建(即使 ResetsAt 为空)
      - addWindowStats 增强防护,支持 FiveHour 为 nil 时仍处理其他窗口
      30b95cf5
    • shaw's avatar
      feat: 添加简单模式功能 · 7d4b7dee
      shaw authored
      新增简单模式设置,适合个人使用场景:
      - 隐藏多用户管理相关菜单(用户管理、兑换码等)
      - 自动关闭用户注册功能
      - 管理员并发数自动设为无限制(99999)
      - 侧边栏根据模式动态调整菜单项
      
      同时优化分组页面的"专属分组"功能,添加帮助提示说明使用场景
      7d4b7dee
    • shaw's avatar
      fix: 防止订阅过期时间超出 JSON 序列化范围 · fbdff4f3
      shaw authored
      问题:当分配订阅天数过大时,expires_at 年份可能超过 9999,
      导致 time.Time JSON 序列化失败(RFC 3339 要求年份 <= 9999),
      使后台无法显示和删除异常数据。
      
      修复:
      - handler 层添加 validity_days 最大值验证(max=36500,即100年)
      - service 层添加 MaxValidityDays 和 MaxExpiresAt 双重保护
      - 启动时自动修复已存在的异常数据(expires_at > 2099年)
      fbdff4f3
    • shaw's avatar
      cd9d31f5
    • noreply's avatar
      feat: Schedule batch update for account last_used_at · cbfce49a
      noreply authored
      Implement deferred batch update mechanism to reduce database load:
      
      - Add DeferredService for batching account last_used_at updates
      - Add TimingWheelService for efficient recurring task scheduling
      - Integrate with GatewayService and OpenAIGatewayService
      - Implement BatchUpdateLastUsed repository method using CASE...WHEN SQL
      - Fix golangci-lint error: Replace interface{} with any
      
      Benefits:
      - Reduces database writes by batching updates (10-second intervals)
      - Improves request throughput by deferring non-critical updates
      - Maintains accurate account usage tracking for scheduling
      cbfce49a
  3. 27 Dec, 2025 7 commits
  4. 26 Dec, 2025 20 commits
    • IanShaw027's avatar
      feat(test): 添加 Gemini 双响应格式支持 · 2714be99
      IanShaw027 authored
      添加对两种 Gemini 响应格式的支持:
      - AI Studio: `{"candidates": [...]}`
      - Gemini CLI: `{"response": {"candidates": [...]}}`
      
      通过 unwrap 逻辑自动检测并适配两种格式,确保账号测试功能
      对所有 Gemini 账号类型都能正常工作。
      
      合并 PR #43 的剩余功能到 PR #37
      2714be99
    • IanShaw027's avatar
      fix(lint): 修复 gofmt 格式问题 · d8518180
      IanShaw027 authored
      修复 golangci-lint 检查失败的问题:
      - gemini_token_provider.go: 删除 import 后多余空行
      - gemini_token_refresher.go: 删除 import 后多余空行
      
      Fixes CI golangci-lint check for PR #37
      d8518180
    • IanShaw027's avatar
      refactor: 统一使用 mergeMap 函数提升代码一致性 · 576bf463
      IanShaw027 authored
      根据 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 实现相同)
      576bf463
    • IanShaw027's avatar
      fix(backend): 适配重构后的架构修复 Gemini OAuth 集成 · 9db52838
      IanShaw027 authored
      ## 主要修改
      
      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
      9db52838
    • ianshaw's avatar
      fix(sse): 修复非标准 SSE 格式解析问题 · 16eec4eb
      ianshaw authored
      部分上游 API 返回的 SSE 格式不符合标准规范:
      - 标准格式: `data: {...}`(冒号后有空格)
      - 非标准格式: `data:{...}`(冒号后无空格)
      
      使用预编译正则 `^data:\s*` 统一处理两种格式。
      16eec4eb
    • Forest's avatar
      refactor: 封装 Redis key 生成函数 · 06d5876b
      Forest authored
      06d5876b
    • Forest's avatar
      refactor: 调整项目结构为单向依赖 · e5a77853
      Forest authored
      e5a77853
    • ianshaw's avatar
    • ianshaw's avatar
      feat(service): 改进 Gemini OAuth 服务层,区分 Code Assist 和 AI Studio 客户端 · 456e8984
      ianshaw authored
      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 等敏感信息)
      - 改进错误提示,显示更多上游错误详情
      456e8984
    • ianshaw's avatar
      fix(backend): 移除对已删除 ports 包的依赖 · 85fd1e4a
      ianshaw authored
      适配 main 分支的 ports 目录删除重构:
      - 将 ports 包中的接口移至 service 包
      - 更新 repository 层的导入路径
      85fd1e4a
    • ianshaw's avatar
      fix(backend): 修复 golangci-lint 报告的格式和代码规范问题 · 6682d06c
      ianshaw authored
      - gofmt: 修复 account_handler.go, models.go, gemini_messages_compat_service.go 的格式
      - staticcheck ST1005: 将 error strings 改为小写开头
      6682d06c
    • ianshaw's avatar
      fix(backend): 修复 golangci-lint 报告的问题 · efa470ef
      ianshaw authored
      - gofmt: 修复代码格式问题
      - errcheck: 处理 WriteString 和 Close 返回值
      - staticcheck: 错误信息改为小写开头
      - staticcheck: 移除无效的 nil 检查
      - staticcheck: 使用 append 替换循环
      - staticcheck: 使用无条件的 TrimPrefix
      - ineffassign: 移除无效赋值
      - unused: 移除未使用的 geminiOAuthService 字段
      - 重新生成 wire_gen.go
      efa470ef
    • ianshaw's avatar
      feat(backend): 实现 Gemini AI Studio OAuth 和消息兼容服务 · b2d71da2
      ianshaw authored
      - 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 兼容层调整
      b2d71da2
    • ianshaw's avatar
      feat(backend): 完善 Gemini OAuth Token 处理 · 03a8ae62
      ianshaw authored
      - 修复 account_handler 中 token 字段类型转换(int64 转 string)
      - 增强 Account.GetCredential 支持多种数值类型(float64, int, json.Number 等)
      - 添加 Account.IsGemini() 方法用于平台判断
      - 优化 refresh_token 和 scope 的空值处理
      03a8ae62
    • ianshaw's avatar
      feat(handler): 添加 Gemini OAuth Handler 和完善依赖注入 · e36fb98f
      ianshaw authored
      - 新增 Gemini OAuth 授权处理器
      - 扩展账号和网关处理器支持 Gemini
      - 注册 Gemini 相关路由
      - 更新 Wire 依赖注入配置(所有层)
      - 更新 Docker Compose 配置
      e36fb98f
    • ianshaw's avatar
      feat(service): 扩展 CRS 同步和定价服务支持 Gemini · 55258bf0
      ianshaw authored
      - CRS 同步服务新增 Gemini 账号同步逻辑(+273行)
      - 定价服务扩展 Gemini 模型定价计算(+99行)
      - 更新 Token 刷新服务集成 Gemini
      - 更新相关单元测试
      55258bf0
    • ianshaw's avatar
      feat(service): 实现 Gemini OAuth 和 Token 管理服务 · dc109827
      ianshaw authored
      - 实现 OAuth 授权流程服务
      - 添加 Token 提供者和自动刷新机制
      - 实现 Gemini Messages API 兼容层
      - 更新服务容器注册
      dc109827
    • ianshaw's avatar
      feat(service): 定义 Gemini 服务端口接口 · 71c28e43
      ianshaw authored
      - 定义 OAuth 服务接口
      - 定义 Token 缓存服务接口
      - 定义 Code Assist 服务接口
      71c28e43
    • shaw's avatar
      chore: 调整403重试次数跟间隔 · b3463769
      shaw authored
      b3463769
    • Forest's avatar
      refactor: 调整 server 目录结构 · 57fd1722
      Forest authored
      57fd1722
  5. 25 Dec, 2025 2 commits