1. 31 Dec, 2025 3 commits
  2. 30 Dec, 2025 2 commits
  3. 29 Dec, 2025 7 commits
    • shaw's avatar
      fix(frontend): 修复新手引导中Select下拉框无法点击的问题 · 4bbf71b7
      shaw authored
      - 使用 Teleport 将 Select 下拉菜单渲染到 body,避免 driver.js 遮罩层阻挡
      - 添加 pointer-events 和 @click.stop 确保下拉选项可点击
      - 移除 useOnboardingTour 中无效的 Select 组件处理代码
      - 清理未使用的 CSS 样式和 console 调试语句
      - 简化 Select 组件在引导期间的交互逻辑
      4bbf71b7
    • shaw's avatar
      chore(frontend): 移除未使用的新手引导组件残留代码 · ef22d6f6
      shaw authored
      删除开发过程中遗留的未使用文件:
      - TourDescription.vue: 未被使用的结构化描述组件
      - useTourStepDescription.ts: 步骤key映射,引用的组件从未创建
      - TourStepDescriptions/: 空的组件目录
      
      当前实现通过 i18n + HTML 字符串直接提供描述内容,无需这些文件。
      ef22d6f6
    • IanShaw027's avatar
      feat(frontend): 优化弹窗组件架构和用户体验 · 23412965
      IanShaw027 authored
      - 使用 BaseDialog 替代旧版 Modal 组件
      - 添加平滑过渡动画和更好的可访问性支持
      - 新增 ExportProgressDialog 导出进度弹窗
      - 优化所有账号管理和使用记录相关弹窗
      - 更新国际化文案,改进用户交互体验
      - 精简依赖,减少 package.json 体积
      23412965
    • IanShaw027's avatar
      fix(frontend): 简易模式下禁用新手引导并优化显示逻辑 · 337d9ad7
      IanShaw027 authored
      修复 Gemini 审查发现的潜在问题,并增强新手引导功能:
      
      1. 简易模式下完全禁用新手引导
         - useOnboardingTour: 添加 isSimpleMode 判断,简易模式下不自动启动
         - 只在标准模式的管理员第一次加载时自动弹出
      
      2. 动态过滤简易模式相关步骤
         - steps.ts: getAdminSteps 添加 isSimpleMode 参数
         - 简易模式下自动过滤分组管理和账号分组选择步骤
         - 避免引导找不到被隐藏的元素
      
      3. 优化引导按钮显示条件
         - AppHeader: 添加 showOnboardingButton computed
         - 只在标准模式的管理员下显示"重新开始引导"按钮
         - 非管理员或简易模式下不显示按钮
      
      4. 确保引导只在首次自动弹出
         - 关闭后不再自动出现
         - 只能从右上角手动重新打开
      337d9ad7
    • IanShaw027's avatar
      feat(frontend): 实现新手引导功能 · dd247e55
      IanShaw027 authored
      - 添加 Guide 组件和引导步骤配置
      - 实现 useOnboardingTour 和 useTourStepDescription composables
      - 添加 onboarding store 管理引导状态
      - 更新多个视图和组件以支持引导功能
      - 添加国际化支持(中英文)
      - 删除旧的实现指南文档
      dd247e55
    • song's avatar
      feat(antigravity): 添加混合调度可选功能 · 1ad29032
      song authored
      - 后端:账户模型添加 IsMixedSchedulingEnabled() 方法,读取 extra.mixed_scheduling
      - 后端:gateway_service 和 gemini_messages_compat_service 支持混合调度逻辑
      - 后端:分组创建支持指定 platform 参数
      - 前端:账户创建/编辑弹窗添加混合调度开关(仅 antigravity 账户显示)
      - 前端:混合调度开关添加问号图标和 tooltip 说明
      - 前端:GroupSelector 支持根据 mixedScheduling 属性过滤分组
      - 前端:分组创建支持选择 platform
      - 测试:e2e 测试添加 ENDPOINT_PREFIX 环境变量支持混合/隔离模式测试
      - 测试:删除过时的 Claude signature 测试用例
      1ad29032
    • shaw's avatar
      fix(frontend): resolve TypeScript errors in simple mode implementation · 1f5ced70
      shaw authored
      - Remove unused simpleMode variable in AppSidebar.vue
      - Add run_mode to AuthResponse.user type definition
      1f5ced70
  4. 28 Dec, 2025 15 commits
    • IanShaw027's avatar
      fix(简易模式): 统一前端状态管理,修复路由守卫失效问题 · 2a708704
      IanShaw027 authored
      **问题**:
      1. login/register 未处理 run_mode,导致 authStore.runMode 不更新
      2. 侧边栏使用 simpleMode.value,与路由守卫的 authStore.isSimpleMode 不一致
      
      **修复**:
      1. 在 login() 和 register() 中提取并设置 run_mode
      2. 统一侧边栏使用 authStore.isSimpleMode
      
      **影响**:
      - 路由守卫现在可以正确工作
      - 前端UI状态与后端配置保持一致
      - 登录/注册后立即生效,无需刷新
      2a708704
    • 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
    • song's avatar
      cf1d0f23
    • song's avatar
      test: 添加 Claude signature 场景 e2e 测试 · 995adaee
      song authored
      - 新增 TestClaudeMessagesWithClaudeSignature 测试
      - 验证历史 thinking block 带有 Claude signature 时的处理
      - 修复配额刷新服务的次要问题
      995adaee
    • shaw's avatar
      fix(frontend): 修复账号管理页面 API Key 类型的提示文案错误 · e247be6e
      shaw authored
      - 添加 OpenAI/Gemini 平台的 baseUrlHint 和 apiKeyHint 国际化文案
      - 修改 CreateAccountModal 和 EditAccountModal 根据平台显示正确提示
      - 将重复的平台判断逻辑抽取为 computed 属性,优化代码结构
      e247be6e
    • shaw's avatar
      fix(frontend): 修复 Select 下拉菜单选项文本被截断的问题 · 31d4c1d2
      shaw authored
      - 修改下拉框宽度策略为 min-w-full w-max max-w-[300px],允许自动扩展
      - 添加 left-0 确保下拉框左对齐
      - 为选项标签添加 flex-1 min-w-0 text-left 确保正确布局
      31d4c1d2
    • song's avatar
      feat(antigravity): 添加配额窗口显示功能 · 08ce6de4
      song authored
      后端:
      - 新增 AntigravityQuotaRefresher 定时刷新配额
      - Client 添加 FetchAvailableModels 方法获取模型配额
      - 配额数据存入 account.extra.quota 字段
      
      前端:
      - AccountUsageCell 支持显示 Antigravity 账户配额
      - UsageProgressBar 新增 amber 颜色
      - 显示 G3P/G3F/G3I/C4.5 四个配额进度条
      08ce6de4
    • shaw's avatar
      feat: 添加简单模式功能 · 7d4b7dee
      shaw authored
      新增简单模式设置,适合个人使用场景:
      - 隐藏多用户管理相关菜单(用户管理、兑换码等)
      - 自动关闭用户注册功能
      - 管理员并发数自动设为无限制(99999)
      - 侧边栏根据模式动态调整菜单项
      
      同时优化分组页面的"专属分组"功能,添加帮助提示说明使用场景
      7d4b7dee
    • song's avatar
    • song's avatar
      6648e650
    • IanShaw027's avatar
      fix(frontend): 移除DataTable中未使用的函数和变量 · 386f6da1
      IanShaw027 authored
      - 移除未使用的 hasExpandableActions 计算属性
      - 移除未使用的 toggleActionsExpanded 函数
      - 修复 TypeScript 类型检查错误
      386f6da1
    • IanShaw027's avatar
      refactor(frontend): 移除DataTable表头中废弃的展开/折叠按钮 · d895a2c4
      IanShaw027 authored
      - 移除操作列表头的展开/折叠按钮和图标
      - 该功能已被操作列内的'更多'按钮替代
      - 保留底层的展开/收起逻辑供'更多'按钮使用
      d895a2c4
    • IanShaw027's avatar
      fix(frontend): 修复UI改进分支中的关键问题 · 5f2d81d1
      IanShaw027 authored
      - 修复RedeemView订阅刷新失败导致流程中断的问题
        将订阅刷新隔离到独立try/catch,失败时仅显示警告
      - 修复DataTable resize事件监听器泄漏问题
        确保添加和移除使用同一个回调引用
      - 修复订阅状态缓存导致强制刷新失效的问题
        force=true时绕过activePromise缓存,clear()清空缓存
      - 修复图表主题切换后颜色不更新的问题
        添加图表ref并在主题切换时调用update()方法
      5f2d81d1
    • IanShaw027's avatar
      26cdb180
    • IanShaw027's avatar
      refactor(frontend): UI/UX改进和组件优化 · 506cb21c
      IanShaw027 authored
      - DataTable组件操作列自适应
      - 优化各种Modal弹窗
      - 统一API调用方式(AbortSignal)
      - 添加全局订阅状态管理
      - 优化各管理视图的交互和布局
      - 修复国际化翻译问题
      506cb21c
  5. 27 Dec, 2025 7 commits
    • shaw's avatar
      fix(frontend): 修复DataTable无限循环和i18n邮箱解析错误 · 5187db5e
      shaw authored
      - 修复DataTable组件watch监听actionsExpanded导致的无限循环卡死问题
      - 为AccountsView和UsersView添加actionsCount属性启用操作列展开功能
      - 修复i18n翻译中邮箱地址的@符号未转义导致的编译错误
      5187db5e
    • IanShaw027's avatar
      fix(frontend): 统一账号编辑弹窗宽度与新增弹窗保持一致 · 9cd97c9e
      IanShaw027 authored
      问题:
      - 编辑账号弹窗使用size='lg'
      - 新增账号弹窗使用size='xl'
      - 两者宽度不一致,体验不统一
      
      修复:
      - 将EditAccountModal的size从lg改为xl
      - 与CreateAccountModal保持一致
      9cd97c9e
    • 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
    • IanShaw027's avatar
      refactor(frontend): 优化通用组件 · c615a426
      IanShaw027 authored
      - 改进ConfirmDialog对话框组件
      - 增强DataTable表格组件功能和响应式布局
      - 优化EmptyState空状态组件
      - 完善SubscriptionProgressMini订阅进度组件
      c615a426
    • shaw's avatar
      feat: 增强前端clipboard功能 · 016d7ef6
      shaw authored
      016d7ef6
    • 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
  6. 26 Dec, 2025 5 commits
    • ianshaw's avatar
      feat(frontend): UI 显示 AI Studio OAuth 配置状态 · f9f33e7b
      ianshaw authored
      CreateAccountModal:
      - 检测 AI Studio OAuth 是否可用(服务器配置了自定义 OAuth 客户端)
      - 未配置时禁用 AI Studio 选项并显示提示
      - 添加悬停提示说明配置要求
      
      ReAuthAccountModal:
      - 同步 AI Studio OAuth 可用性检测逻辑
      - 未配置时自动回退到 Code Assist
      f9f33e7b
    • ianshaw's avatar
      feat(frontend): 支持 Gemini OAuth 类型选择 (Code Assist/AI Studio) · 09431cfc
      ianshaw authored
      - CreateAccountModal.vue: 新增 OAuth 类型选择 UI
      - ReAuthAccountModal.vue: 重授权支持选择类型
      - OAuthAuthorizationFlow.vue: 新增 Project ID 输入框
      - AccountTestModal.vue: Gemini 模型默认选择优化
      - useGeminiOAuth.ts: OAuth 逻辑参数变更
      - gemini.ts: API 调用更新
      09431cfc
    • ianshaw's avatar
      style(frontend): 优化 Components 代码风格和结构 · 5deef27e
      ianshaw authored
      - 统一移除语句末尾分号,规范代码格式
      - 优化组件类型定义和 props 声明
      - 改进组件文档和示例代码
      - 提升代码可读性和一致性
      5deef27e
    • ianshaw's avatar
      feat(frontend): Components 集成 Gemini 账号支持 · 1ac8b1f0
      ianshaw authored
      - CreateAccountModal: 添加 Gemini 平台选项和 OAuth 授权流程
      - EditAccountModal: 支持 Gemini 账号编辑
      - OAuthAuthorizationFlow: 新增 Gemini 平台 OAuth 流程处理(支持 state 参数)
      - ReAuthAccountModal: 支持 Gemini 账号重新授权
      - 优化代码格式和组件逻辑
      1ac8b1f0
    • shaw's avatar
      feat: apikey使用弹出适配codex分组 · d9e6cfc4
      shaw authored
      d9e6cfc4
  7. 25 Dec, 2025 1 commit
    • hi_yueban's avatar
      fix: 修复 OpenAI 账号 5h/7d 使用限制显示错误的问题 (#30) · f57f12c6
      hi_yueban authored
      * fix: 修复 OpenAI 账号 5h/7d 使用限制显示错误的问题
      
      问题描述:
      - 账号管理页面中,OpenAI OAuth 账号的 5h 列显示 7 天的剩余时间
      - 7d 列却显示几小时的剩余时间
      - 根本原因: OpenAI 响应头中 primary/secondary 的实际含义与代码假设相反
      
      修复方案:
      1. 后端归一化 (openai_gateway_service.go):
         - 根据 window_minutes 动态判断哪个是 5h/7d 限制
         - 新增规范字段 codex_5h_* 和 codex_7d_*
         - 保留旧字段以兼容性
      
      2. 前端适配 (AccountUsageCell.vue):
         - 优先使用新的规范字段
         - Fallback 到旧字段时基于 window_minutes 动态判断
         - 更新 computed 属性命名
      
      3. 类型定义更新 (types/index.ts):
         - 添加新的规范字段定义
         - 更新注释说明实际语义由 window_minutes 决定
      
      🤖
      
       Generated with Claude Code and Codex collaboration
      Co-Authored-By: default avatarClaude Sonnet 4.5 <noreply@anthropic.com>
      Co-Authored-By: default avatarOpenAI Codex <noreply@openai.com>
      
      * fix: 改进窗口判断逻辑,修复两个窗口都小于阈值时的bug
      
      问题:
      当两个窗口都小于360分钟时(如 primary=180分钟,secondary=300分钟),
      之前的逻辑会导致:
      - primary5h = true, secondary5h = true
      - 5h 字段会使用 primary(错误)
      - 7d 字段没有数据(bug)
      
      修复方案:
      改用比较策略:
      1. 当两个窗口都存在时:较小的分配给5h,较大的分配给7d
      2. 当只有一个窗口时:根据大小(<=360分钟)判断是5h还是7d
      3. 确保数据不会丢失,逻辑更健壮
      
      示例:
      - Primary: 180分钟, Secondary: 300分钟
        → 5h 使用 Primary(180分钟), 7d 使用 Secondary(300分钟) ✓
      
      🤖
      
       Generated with Claude Code
      Co-Authored-By: default avatarClaude Sonnet 4.5 <noreply@anthropic.com>
      
      * fix: 修正窗口大小判断逻辑 - 不能用剩余时间判断窗口类型
      
      **严重bug修复:**
      之前的 fallback 逻辑错误地使用 reset_after_seconds 来判断窗口大小。
      
      问题示例:
      - 周限制(7d)剩余 2h → reset_after_seconds = 7200秒
      - 5h限制 剩余 4h → reset_after_seconds = 14400秒
      - 错误逻辑:7200/60 < 14400/60,把周限制当成5h 
      
      根本问题:
      - window_minutes = 窗口的总大小(300 or 10080)
      - reset_after_seconds = 距离重置的剩余时间(变化的)
      - 不能用剩余时间来判断窗口类型!
      
      修复方案:
      1. **只使用 window_minutes** 来判断窗口大小
      2. 移除错误的 reset_after_seconds fallback
      3. 如果 window_minutes 都不存在,使用传统假设
      4. 添加详细注释说明这个陷阱
      
      🤖
      
       Generated with Claude Code
      Co-Authored-By: default avatarClaude Sonnet 4.5 <noreply@anthropic.com>
      
      * fix: 修复 lint 问题 - 改进 fallback 逻辑的变量赋值
      
      问题:
      第882-883行的简单布尔赋值可能触发 ineffassign 或 staticcheck 警告:
        use5hFromSecondary = snapshot.SecondaryUsedPercent != nil
        use7dFromPrimary = snapshot.PrimaryUsedPercent != nil
      
      修复:
      改用明确的 if 语句检查任意字段是否存在,更符合代码意图:
      - 如果 secondary 的任意字段存在,将其视为 5h
      - 如果 primary 的任意字段存在,将其视为 7d
      
      这样逻辑更清晰,也避免了 lint 警告。
      
      ---------
      Co-authored-by: default avatarClaude Sonnet 4.5 <noreply@anthropic.com>
      Co-authored-by: default avatarOpenAI Codex <noreply@openai.com>
      f57f12c6