1. 23 Dec, 2025 5 commits
    • shaw's avatar
      feat: 账号列表显示所属分组 · d9e27df9
      shaw authored
      - Account模型新增Groups虚拟字段
      - 账号列表API预加载Group信息
      - 账号管理页面新增分组列,使用GroupBadge展示
      d9e27df9
    • shaw's avatar
      feat: 用户列表显示订阅分组及剩余天数 · f0fabf89
      shaw authored
      - User模型新增Subscriptions关联
      - 用户列表批量加载订阅信息避免N+1查询
      - GroupBadge组件支持显示剩余天数(过期红色、<=3天红色、<=7天橙色)
      - 用户管理页面新增订阅分组列
      f0fabf89
    • shaw's avatar
      fix: 修复订阅窗口过期后进度条显示不正确的问题 · 5bbfbcda
      shaw authored
      问题:滑动窗口过期后(如昨天用满额度),前端仍显示历史数据(红色进度条100%、"即将重置")
      
      解决:
      - 后端返回数据前检查窗口是否过期,过期则清零展示数据
      - 前端处理 window_start 为 null 的情况,显示"窗口未激活"
      - 不影响实际的窗口激活逻辑,窗口仍从当天零点开始
      5bbfbcda
    • shaw's avatar
      fix: 修复golangci-lint检查问题 · eb55947e
      shaw authored
      - 移除OpenAIGatewayHandler中未使用的userService字段
      - 将账号类型判断的if-else链改为switch语句
      eb55947e
    • shaw's avatar
      feat: 平台图标与计费修复 · fda75327
      shaw authored
      - fix(billing): 修复 OpenAI 兼容 API 缓存 token 重复计费问题
      - fix(auth): 隐藏数据库错误详情,返回通用服务不可用错误
      - feat(ui): 新增 PlatformIcon 组件,GroupBadge 支持平台颜色区分
      - feat(ui): 账号管理新增重置状态按钮,重授权后自动清除错误
      - feat(ui): 分组管理新增计费类型列,显示订阅限额信息
      - ui: 首页 GPT 状态改为已支持
      fda75327
  2. 22 Dec, 2025 1 commit
  3. 21 Dec, 2025 1 commit
  4. 20 Dec, 2025 10 commits
  5. 19 Dec, 2025 9 commits
  6. 18 Dec, 2025 11 commits
    • Forest's avatar
      refactor(backend): 拆分 Wire ProviderSet · 236908c0
      Forest authored
      236908c0
    • shaw's avatar
      feat: 实现后台在线更新功能 · 9b4fc424
      shaw authored
      - 前端添加更新和重启按钮,支持一键更新 Release 构建
      - 修复条件判断优先级问题,确保错误/成功状态正确显示
      - 后端使用原子文件替换模式,确保更新过程安全可靠
      - 在可执行文件同目录创建临时文件,保证 rename 原子性
      - 删除未使用的 copyFile 函数,保持代码整洁
      9b4fc424
    • shaw's avatar
      refactor: 使用行业标准方案重构服务重启逻辑 · 8e81e395
      shaw authored
      重构内容:
      - 移除复杂的 sudo systemctl restart 方案
      - 改用 os.Exit(0) + systemd Restart=always 的标准做法
      - 删除 sudoers 配置及相关代码
      - 删除 sub2api-sudoers 文件
      
      优势:
      - 代码从 85+ 行简化到 47 行
      - 无需 sudo 权限配置
      - 无需特殊用户 shell 配置
      - 更简单、更可靠
      - 符合行业最佳实践(Docker/K8s 等均采用此方案)
      
      工作原理:
      - 服务调用 os.Exit(0) 优雅退出
      - systemd 检测到退出后自动重启(Restart=always)
      8e81e395
    • shaw's avatar
      fix: 使用 setsid 确保重启命令独立于父进程执行 · f0e89992
      shaw authored
      问题原因:
      - cmd.Start() 启动的子进程与父进程在同一会话中
      - 当 systemctl restart 发送 SIGTERM 给父进程时
      - 子进程可能也会被终止,导致重启命令无法完成
      
      修复内容:
      - 使用 setsid 创建新会话,子进程完全独立于父进程
      - 分离标准输入/输出/错误流
      - 确保即使父进程被 kill,重启命令仍能执行完成
      f0e89992
    • shaw's avatar
      fix: 使用完整路径执行 sudo 和 systemctl 命令 · 4eaa0cf1
      shaw authored
      问题原因:
      - systemd 服务的 PATH 环境变量可能受限
      - 直接使用 "sudo" 可能找不到可执行文件
      
      修复内容:
      - 添加 findExecutable 函数动态查找可执行文件路径
      - 先尝试 exec.LookPath,再检查常见系统路径
      - 添加日志显示实际使用的路径,方便调试
      - 兼容不同 Linux 发行版的路径差异
      4eaa0cf1
    • shaw's avatar
      fix: 修复 sudo 在非交互模式下无法执行的问题 · e9ec2280
      shaw authored
      问题原因:
      - sudo 命令没有 -n 选项
      - 在后台服务中,sudo 会尝试从终端读取密码
      - 由于没有终端,命令静默失败
      
      修复内容:
      - 添加 sudo -n 选项强制非交互模式
      - 如果需要密码会立即失败并返回错误,而不是挂起
      e9ec2280
    • 江西小徐's avatar
      fix: 修复并发请求时共享httpClient.Transport导致的竞态条件 · 2392e7cf
      江西小徐 authored
      问题描述:
      当多个请求并发执行且使用不同代理配置时,它们会同时修改共享的
      s.httpClient.Transport,导致请求可能使用错误的代理(数据泄露风险)
      或意外失败。
      
      修复方案:
      为需要代理的请求创建独立的http.Client,而不是修改共享的httpClient.Transport。
      
      改动内容:
      - 新增 buildUpstreamRequestResult 结构体,返回请求和可选的独立client
      - 修改 buildUpstreamRequest 方法,配置代理时创建独立client
      - 更新 Forward 方法,根据是否有代理选择合适的client
      2392e7cf
    • shaw's avatar
      fix: 修复安装/升级无法重启服务的问题 · 8e4bd42e
      shaw authored
      8e4bd42e
    • shaw's avatar
      fix: release error · e2ae9fe5
      shaw authored
      e2ae9fe5
    • shaw's avatar
      fix: release error · 6cf60176
      shaw authored
      6cf60176
    • shaw's avatar
      First commit · 642842c2
      shaw authored
      642842c2