1. 27 Dec, 2025 25 commits
    • IanShaw027's avatar
      feat(frontend): DataTable组件增强 - 操作列宽度自适应和列数自适应padding · fd78993b
      IanShaw027 authored
      新增功能:
      
      1. 操作列宽度自适应
         - checkActionsColumnWidth 方法:智能检测操作按钮是否超出列宽
           - 临时展开所有按钮测量实际宽度
           - 计算包含gap的总宽度
           - 与可用宽度对比,自动显示/隐藏"展开"按钮
         - 新增 actionsCount prop:
           - 用于快速判断是否需要展开功能
           - 避免DOM查询带来的性能开销
      
      2. 列数自适应padding
         - getAdaptivePaddingClass 方法:根据列数动态调整内边距
           - ≥10列 → px-2 (8px)
           - ≥7列  → px-3 (12px)
           - ≥5列  → px-4 (16px)
           - <5列  → px-6 (24px,原始值)
         - 让表格在列数较多时更紧凑,提升空间利用率
      fd78993b
    • shaw's avatar
      fix(frontend): 修复添加账号弹窗宽度和tooltip被截断问题 · 80cce858
      shaw authored
      - 将弹窗尺寸从 lg 改为 xl,增加内容显示空间
      - 修复 AI Studio tooltip 被弹窗边界截断的问题
        - 调整定位从 left-0 改为 right-0
        - 减小宽度从 w-[28rem] 改为 w-80
        - 提高 z-index 确保正确显示
      80cce858
    • shaw's avatar
      Merge branch 'feature/ui-and-backend-improvements' · 0743652d
      shaw authored
      0743652d
    • IanShaw027's avatar
      fix(test): 实现GetUserStatsAggregated方法以支持新的统计查询 · 96bec5c9
      IanShaw027 authored
      - 在stubUsageLogRepo中实现GetUserStatsAggregated方法
      - 根据userLogs计算统计数据而不是返回错误
      - 修复类型转换问题(int转int64)
      96bec5c9
    • IanShaw027's avatar
      cfeb6b8b
    • IanShaw027's avatar
      fix(test): 修复CI测试失败 · 481310de
      IanShaw027 authored
      - 修复gofmt格式问题
      - 为stubUsageLogRepo添加缺失的GetApiKeyStatsAggregated方法
      481310de
    • IanShaw027's avatar
      refactor(frontend): 优化用户视图和设置向导 · ea2821d1
      IanShaw027 authored
      - 改进API密钥管理界面
      - 优化用户使用统计视图
      - 完善初始化设置向导
      ea2821d1
    • IanShaw027's avatar
      refactor(frontend): 优化管理后台视图 · 7a0de176
      IanShaw027 authored
      - 改进账户管理视图
      - 优化分组管理界面
      - 完善代理管理功能
      - 增强兑换码管理
      - 改进订阅管理视图
      - 优化使用统计展示
      - 完善用户管理界面
      7a0de176
    • IanShaw027's avatar
      refactor(frontend): 优化格式化工具函数 · 35b1bc37
      IanShaw027 authored
      - 改进数据格式化逻辑
      - 增强工具函数可读性
      35b1bc37
    • IanShaw027's avatar
      feat(frontend): 更新国际化翻译 · 8d387886
      IanShaw027 authored
      - 新增英文翻译条目
      - 完善中文翻译内容
      - 改进多语言支持
      8d387886
    • IanShaw027's avatar
      refactor(frontend): 优化通用组件 · c615a426
      IanShaw027 authored
      - 改进ConfirmDialog对话框组件
      - 增强DataTable表格组件功能和响应式布局
      - 优化EmptyState空状态组件
      - 完善SubscriptionProgressMini订阅进度组件
      c615a426
    • IanShaw027's avatar
      feat(backend): 增强使用统计和API密钥功能 · 227d506c
      IanShaw027 authored
      - 优化使用统计处理逻辑
      - 增强API密钥仓储层功能
      - 改进账户使用服务
      - 完善API契约测试覆盖
      227d506c
    • IanShaw027's avatar
      perf(backend): 优化数据库查询性能 · 36a86e9a
      IanShaw027 authored
      - 合并多个独立查询为单个SQL查询
      - 减少数据库往返次数
      - 提升仪表板统计数据获取效率
      36a86e9a
    • shaw's avatar
      fix: 修复TG通知workflow语法错误 · f133b051
      shaw authored
      - 移除if条件中对secrets的直接引用(GitHub Actions不支持)
      - 改用shell脚本内部检查环境变量是否存在
      f133b051
    • shaw's avatar
      chore: workflow增加TG频道更新通知 · 7af1bdbf
      shaw authored
      7af1bdbf
    • shaw's avatar
      feat: 增强前端clipboard功能 · 016d7ef6
      shaw authored
      016d7ef6
    • shaw's avatar
      fix: 修复账号更新时分组绑定操作顺序导致的数据不一致问题 · f1e47291
      shaw authored
      原逻辑先执行 Update 再验证 GroupIDs,如果验证失败会导致账号已更新但返回错误。
      现改为先验证分组是否存在,再执行 Update 和 BindGroups。
      f1e47291
    • shaw's avatar
      d7e9ae38
    • 程序猿MT's avatar
      feat: (#47) · 88be981a
      程序猿MT authored
      
      
      golang 1.24-> 1.25
      node 20 -> node 24
      具体提升请查看官方文档
      Co-authored-by: default avataryangjianbo <yangjianbo@leagsoft.com>
      88be981a
    • IanShaw's avatar
      3f92a431
    • shaw's avatar
      2101f1d1
    • daodao97's avatar
      feat: cc/codex/gemini 增加账号重试 · f0f920e4
      daodao97 authored
      f0f920e4
    • daodao97's avatar
      feat: cc/codex support account retry · 95583fce
      daodao97 authored
      95583fce
    • IanShaw's avatar
      feat(frontend): 前端界面优化与使用统计功能增强 (#46) · 254f1254
      IanShaw authored
      * 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 方法调用
      254f1254
    • IanShaw's avatar
      fix: 修复 Gemini API 认证和 /responses 端点路由问题 (#45) · cf8a6452
      IanShaw authored
      * 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 在远程服务器上断开连接的问题
      
      根本原因:
      在 6c469b42 提交中添加了 /responses 路由,但未同步更新前端嵌入中间件
      的 API 白名单,导致该路由被拦截并返回 index.html 而非 API 响应。
      cf8a6452
  2. 26 Dec, 2025 15 commits
    • shaw's avatar
      chore: home页面更新gemini为已支持 · 2b79c4e8
      shaw authored
      2b79c4e8
    • shaw's avatar
      429f38d0
    • 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
    • IanShaw027's avatar
      merge: 合并 upstream/main 解决 PR #37 冲突 · bfcd9501
      IanShaw027 authored
      - 删除 backend/internal/model/account.go 符合重构方向
      - 合并最新的项目结构重构
      - 包含 SSE 格式解析修复
      - 更新依赖和配置文件
      bfcd9501
    • September999999999's avatar
      fix: 卸载时删除安装锁文件以支持重新安装 (#39) · 12252c60
      September999999999 authored
      - 卸载时自动删除 .installed 安装锁文件
      - 新增 --purge 参数支持完全清理(包括配置目录)
      - 交互模式下增加是否删除配置目录的确认提示
      - 支持中英文消息
      12252c60
    • shaw's avatar
      2d89f366
    • shaw's avatar
      Merge branch 'refactor/redis-key-helpers' · 3d608c26
      shaw authored
      3d608c26
    • shaw's avatar
      fix: admin handlers 添加 DTO 转换修复 JSON 序列化 · 739d0ee6
      shaw authored
      修复 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 函数
      739d0ee6
    • shaw's avatar
      22f07a7b
    • ianshaw's avatar
      fix(sse): 修复非标准 SSE 格式解析问题 · 16eec4eb
      ianshaw authored
      部分上游 API 返回的 SSE 格式不符合标准规范:
      - 标准格式: `data: {...}`(冒号后有空格)
      - 非标准格式: `data:{...}`(冒号后无空格)
      
      使用预编译正则 `^data:\s*` 统一处理两种格式。
      16eec4eb
    • shaw's avatar
      ecb2c535
    • Forest's avatar
      refactor: 封装 Redis key 生成函数 · 06d5876b
      Forest authored
      06d5876b