1. 10 Jan, 2026 1 commit
    • long's avatar
      feat: 实现注册优惠码功能 · d2fc14fb
      long authored
        - 支持创建/编辑/删除优惠码,设置赠送金额和使用限制
        - 注册页面实时验证优惠码并显示赠送金额
        - 支持 URL 参数自动填充 (?promo=CODE)
        - 添加优惠码验证接口速率限制
        - 使用数据库行锁防止并发超限
        - 新增后台优惠码管理页面,支持复制注册链接
      d2fc14fb
  2. 09 Jan, 2026 4 commits
    • Edric.Li's avatar
      feat(api-key): 添加 IP 白名单/黑名单限制功能 (#221) · 0a4641c2
      Edric.Li authored
      * feat(api-key): add IP whitelist/blacklist restriction and usage log IP tracking
      
      - Add IP restriction feature for API keys (whitelist/blacklist with CIDR support)
      - Add IP address logging to usage logs (admin-only visibility)
      - Remove billing_type column from usage logs UI (redundant)
      - Use generic "Access denied" error message for security
      
      Backend:
      - New ip package with IP/CIDR validation and matching utilities
      - Database migrations for ip_whitelist, ip_blacklist (api_keys) and ip_address (usage_logs)
      - Middleware IP restriction check after API key validation
      - Input validation for IP/CIDR patterns on create/update
      
      Frontend:
      - API key form with enable toggle for IP restriction
      - Shield icon indicator in table for keys with IP restriction
      - Removed billing_type filter and column from usage views
      
      * fix: update API contract tests for ip_whitelist/ip_blacklist fields
      
      Add ip_whitelist and ip_blacklist fields to expected JSON responses
      in API contract tests to match the new API key schema.
      0a4641c2
    • shaw's avatar
      f060db0b
    • IanShaw027's avatar
      feat(admin): 添加账号批量调度开关功能 · 5e936fbf
      IanShaw027 authored
      - 后端:支持批量更新账号的 schedulable 字段
        - 在 BulkUpdateAccountsRequest 中添加 schedulable 参数
        - 在 AccountBulkUpdate 中添加 schedulable 字段支持
        - 更新 repository 层批量更新 SQL 逻辑
      - 前端:在账号管理页面添加批量调度控制
        - 新增"批量启用调度"和"批量停止调度"按钮
        - 添加 handleBulkToggleSchedulable 处理函数
        - 显示具体的成功提示信息(包含操作账号数量)
      - 国际化:添加批量调度相关中英文翻译
      - 优化:添加 search 参数标准化和验证(account_handler)
      5e936fbf
    • IanShaw027's avatar
      fix(admin): 修复表格批量操作和搜索功能问题 · 38202322
      IanShaw027 authored
      1. 恢复账号管理批量操作栏缺失的功能按钮
         - 添加"本页全选"按钮支持批量选择当前页所有账号
         - 添加"清除已选"按钮快速清空已选账号列表
         - 在重构拆分组件时遗漏,现已恢复
      
      2. 修复分组管理搜索功能仅搜索当前页的问题
         - 前端:移除本地过滤逻辑,改用后端搜索
         - 后端:添加 search 参数支持,搜索名称和描述字段
         - 支持不区分大小写的模糊匹配
         - 统一所有管理页面的搜索体验
      38202322
  3. 08 Jan, 2026 2 commits
    • IanShaw's avatar
      fix(gemini): Google One 强制使用内置 OAuth client + 自动获取 project_id + UI 优化 (#212) · afcfbb45
      IanShaw authored
      * 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
      afcfbb45
    • Edric Li's avatar
      feat(usage): add User-Agent column to usage logs · 70fcbd70
      Edric Li authored
      - 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
      70fcbd70
  4. 07 Jan, 2026 4 commits
  5. 06 Jan, 2026 5 commits
  6. 05 Jan, 2026 11 commits
  7. 04 Jan, 2026 13 commits
    • IanShaw027's avatar
      refactor(frontend): 统一管理页面工具条布局和操作列样式 · eef12cb9
      IanShaw027 authored
      ## 修复内容
      
      ### 1. 统一操作列按钮样式
      - 所有操作列按钮统一为"图标+文字"垂直排列样式
      - UsersView: 编辑和更多按钮添加文字标签
      - 与 AccountsView、GroupsView 等页面保持一致
      
      ### 2. 统一顶部工具条布局(6个管理页面)
      - 使用 flex + justify-between 布局
      - 左侧:模糊搜索框、筛选器(可多行排列)
      - 右侧:刷新、创建等操作按钮(靠右对齐)
      - 响应式:宽度不够时右侧按钮自动换行到上一行
      
      ### 3. 修复的页面
      - AccountsView: 合并 actions/filters 到单行工具条
      - UsersView: 标准左右分栏,操作列添加文字
      - GroupsView: 新增搜索框,左右分栏布局
      - ProxiesView: 左右分栏,响应式布局
      - SubscriptionsView: 新增用户模糊搜索,左右分栏
      - UsageView: 补齐所有筛选项,左右分栏
      
      ### 4. 新增功能
      - GroupsView: 新增分组名称/描述模糊搜索
      - SubscriptionsView: 新增用户模糊搜索功能
      - UsageView: 补齐 API Key 搜索筛选
      
      ### 5. 国际化
      - 新增相关搜索框的 placeholder 文案(中英文)
      
      ## 技术细节
      - 使用 flex-wrap-reverse 实现响应式换行
      - 左侧筛选区使用 flex-wrap 支持多行
      - 右侧按钮区使用 ml-auto + justify-end 保持右对齐
      - 移动端使用 w-full sm:w-* 响应式宽度
      
      ## 验证结果
      -  TypeScript 类型检查通过
      -  所有页面布局统一
      -  响应式布局正常工作
      eef12cb9
    • IanShaw027's avatar
      fix(frontend): 修复前端重构后的样式一致性和功能完整性 · 64b52c43
      IanShaw027 authored
      ## 修复内容
      
      ### 1. AccountsView 功能恢复
      - 恢复3个缺失的模态框组件:
        - ReAuthAccountModal.vue - 重新授权功能
        - AccountTestModal.vue - 测试连接功能
        - AccountStatsModal.vue - 查看统计功能
      - 恢复 handleTest/handleViewStats/handleReAuth 调用模态框
      - 修复 UpdateAccountRequest 类型定义(添加 schedulable 字段)
      
      ### 2. DashboardView 修复
      - 恢复 formatBalance 函数(支持千位分隔符显示)
      - 为 UserDashboardStats 添加完整 Props 类型定义
      - 为 UserDashboardRecentUsage 添加完整 Props 类型定义
      - 优化格式化函数到共享 utils/format.ts
      
      ### 3. 类型安全增强
      - 修复 UserAttributeOption 索引签名兼容性
      - 移除未使用的类型导入
      - 所有组件 Props 类型完整
      
      ## 验证结果
      -  TypeScript 类型检查通过(0 errors)
      -  vue-tsc 检查通过(0 errors)
      -  所有样式与重构前100%一致
      -  所有功能完整恢复
      
      ## 影响范围
      - AccountsView: 代码行数从974行优化到189行(提升80.6%可维护性)
      - DashboardView: 保持组件化同时恢复所有原有功能
      - 深色模式支持完整
      - 所有颜色方案和 SVG 图标保持一致
      
      Closes #149
      64b52c43
    • IanShaw027's avatar
    • IanShaw027's avatar
      refactor(frontend): comprehensive architectural optimization and base component extraction · 99308ab4
      IanShaw027 authored
      - Standardized table loading logic with enhanced useTableLoader.
      - Unified form submission patterns via new useForm composable.
      - Extracted common UI components: SearchInput and StatusBadge.
      - Centralized common interface definitions in types/index.ts.
      - Achieved TypeScript zero-error status across refactored files.
      - Greatly improved code reusability and maintainability.
      99308ab4
    • IanShaw027's avatar
      refactor(frontend): final component split and comprehensive type safety fixes · d4d21d5e
      IanShaw027 authored
      - Completed modular refactoring of KeysView.vue and SettingsView.vue.
      - Resolved remaining TypeScript errors in new components.
      - Standardized prop types and event emitters for sub-components.
      - Optimized bundle size by eliminating redundant template code and unused script variables.
      - Verified system stability with final type checking.
      d4d21d5e
    • yangjianbo's avatar
      feat(界面): 为 Gemini 配置片段添加语法高亮 · f8e7255c
      yangjianbo authored
      补齐高亮渲染并保留纯文本回退
      新增高亮 token 工具并做 HTML 转义
      f8e7255c
    • IanShaw027's avatar
      refactor(frontend): comprehensive split of large view files into modular components · e99063e1
      IanShaw027 authored
      - Split UsersView.vue into UserCreateModal, UserEditModal, UserApiKeysModal, etc.
      - Split UsageView.vue into UsageStatsCards, UsageFilters, UsageTable, etc.
      - Split DashboardView.vue into UserDashboardStats, UserDashboardCharts, etc.
      - Split AccountsView.vue into AccountTableActions, AccountTableFilters, etc.
      - Standardized TypeScript types across new components to resolve implicit 'any' and 'never[]' errors.
      - Improved overall frontend maintainability and code clarity.
      e99063e1
    • 墨颜's avatar
      refactor(keys): 优化分组选项显示与代码复用 · 6708f400
      墨颜 authored
      - 删除冗余的 vite.config.js,统一使用 TypeScript 配置
      - 创建 GroupOptionItem 组件封装分组选项 UI 逻辑(GroupBadge + 描述 + 勾选状态)
      - 在密钥页面的分组选择器中显示分组描述文字
      - 添加选中状态的勾选图标,提升交互体验
      - 优化描述文字左对齐和截断显示效果
      - 消除代码重复,简化维护成本
      6708f400
    • IanShaw027's avatar
    • IanShaw027's avatar
      fix(frontend): 优化前端组件和国际化支持 · 6c036d7b
      IanShaw027 authored
      - 添加 Accept-Language 请求头支持后端翻译
      - 优化账户状态指示器和测试模态框
      - 简化用户属性表单和配置模态框
      - 新增多个国际化翻译条目
      - 重构管理视图代码,提升可维护性
      6c036d7b
    • IanShaw027's avatar
      refactor(settings): 规范化缩写词命名并优化前端帮助界面 · 2632a710
      IanShaw027 authored
      - 后端:将 Smtp/Api/Doc 字段改为 SMTP/API/Doc(遵循 Go 命名规范)
      - 前端:添加 Gemini 帮助按钮,简化配额说明展示
      2632a710
    • IanShaw027's avatar
      feat(gemini): 完善 Gemini OAuth 配额系统和用量显示 · a185ad11
      IanShaw027 authored
      主要改动:
      - 后端:重构 Gemini 配额服务,支持多层级配额策略(GCP Standard/Free, Google One, AI Studio, Code Assist)
      - 后端:优化 OAuth 服务,增强 tier_id 识别和存储逻辑
      - 后端:改进用量统计服务,支持不同平台的配额查询
      - 后端:优化限流服务,增加临时解除调度状态管理
      - 前端:统一四种授权方式的用量显示格式和徽标样式
      - 前端:增强账户配额信息展示,支持多种配额类型
      - 前端:改进创建和重新授权模态框的用户体验
      - 国际化:完善中英文配额相关文案
      - 移除 CHANGELOG.md 文件
      
      测试:所有单元测试通过
      a185ad11
    • Yuhao Jiang's avatar
      fix(frontend): 修复跨时区日期范围筛选问题 · 600f9ce2
      Yuhao Jiang authored
      当管理员在比服务器时区更早的时区(如芝加哥 UTC-6)访问使用记录页面时,
      由于服务器时区(如中国 UTC+8)已经是"明天",导致最新的记录无法显示。
      
      修复方案:
      - DateRangePicker: 将日期选择器的 max 限制从"今天"改为"明天"
      - UsageView: 默认和重置时的 endDate 使用"明天"而非"今天"
      
      这样可以确保跨时区场景下用户能看到所有最新记录。
      
      🤖 Generated with [Claude Code](https://claude.ai/code
      
      )
      Co-Authored-By: default avatarClaude <noreply@anthropic.com>
      600f9ce2