柴叁
9985c4a344
fix(gemini): 优化 Gemini 接口认证兼容性,支持 Authorization: Bearer
...
调整 API key 提取优先级,让 /v1beta 接口同时支持 x-goog-api-key 和
Authorization: Bearer 两种认证方式,解决 OpenClaw 等使用 Bearer 认证
的客户端无法直接访问 Gemini 接口的问题。
2026-02-04 16:26:36 +08:00
Wesley Liddick
4cce21b125
Merge branch 'main' into main
2026-02-03 21:43:41 +08:00
Wesley Liddick
c0c9c984d1
Merge pull request #471 from bayma888/feature/api-key-quota-expiration
...
feat(api-key): 添加API密钥独立配额和过期时间功能
2026-02-03 21:11:17 +08:00
bayma888
0afc5d0b1a
fix(test): update API contract tests for new quota fields
...
Add quota, quota_used, expires_at fields to expected JSON responses
in POST /api/v1/keys and GET /api/v1/keys test cases.
2026-02-03 20:54:25 +08:00
bayma888
be7bc658fc
fix(test): add IncrementQuotaUsed to all APIKeyRepository test stubs
...
- Add missing IncrementQuotaUsed method to stubApiKeyRepo in api_contract_test.go
- Fix gofmt formatting issues in api_key_service.go, dto/types.go, api_key_handler.go
2026-02-03 20:49:58 +08:00
Wesley Liddick
c89bbf5130
Merge pull request #458 from bayma888/feature/admin-user-balance-history
...
feat(admin): 管理员可查看每个用户充值和并发变动记录、点击余额可直接查看、优化弹框UI
2026-02-03 20:37:30 +08:00
bayma888
e59e3a9f00
fix(test): add IncrementQuotaUsed to all APIKeyRepository test stubs
...
Add the missing IncrementQuotaUsed method to:
- fakeAPIKeyRepo (api_key_auth_google_test.go)
- stubApiKeyRepo (api_key_auth_test.go)
- apiKeyRepoStub (api_key_service_delete_test.go)
- authRepoStub (api_key_service_cache_test.go)
2026-02-03 20:00:43 +08:00
bayma888
6146be1474
feat(api-key): add independent quota and expiration support
...
This feature allows API Keys to have their own quota limits and expiration
times, independent of the user's balance.
Backend:
- Add quota, quota_used, expires_at fields to api_key schema
- Implement IsExpired() and IsQuotaExhausted() checks in middleware
- Add ResetQuota and ClearExpiration API endpoints
- Integrate quota billing in gateway handlers (OpenAI, Anthropic, Gemini)
- Include quota/expiration fields in auth cache for performance
- Expiration check returns 403, quota exhausted returns 429
Frontend:
- Add quota and expiration inputs to key create/edit dialog
- Add quick-select buttons for expiration (+7, +30, +90 days)
- Add reset quota confirmation dialog
- Add expires_at column to keys list
- Add i18n translations for new features (en/zh)
Migration:
- Add 045_add_api_key_quota.sql for new columns
2026-02-03 19:49:31 +08:00
bayma888
730d2a9ad2
fix(test): add missing stub methods to stubRedeemCodeRepo in api_contract_test
...
Add ListByUserPaginated and SumPositiveBalanceByUser methods
2026-02-03 19:36:17 +08:00
song
7cb5444dbb
fix: update tests for group fallback
2026-02-03 16:48:52 +08:00
song
2220fd18ca
merge upstream main
2026-02-03 15:36:17 +08:00
shuike
0ed4a404e4
fix(test): api_contract_test添加 invitation_code_enabled 字段
2026-02-03 13:38:44 +08:00
shuike
6c86501d11
feat: 增加邀请码注册功能
2026-02-03 13:38:44 +08:00
bayma888
606e29d390
feat(admin): add user balance/concurrency history modal
...
- Add new API endpoint GET /admin/users/:id/balance-history with pagination and type filter
- Add SumPositiveBalanceByUser for calculating total recharged amount
- Create UserBalanceHistoryModal component with:
- User info header (email, username, created_at, current balance, notes, total recharged)
- Type filter dropdown (all/balance/admin_balance/concurrency/admin_concurrency/subscription)
- Quick deposit/withdraw buttons
- Paginated history list with icons and colored values
- Add instant tooltip on balance column for better UX
- Add z-index prop to BaseDialog for modal stacking control
- Update i18n translations (zh/en)
2026-02-03 00:16:10 +08:00
song
0170d19fa7
merge upstream main
2026-02-02 22:13:50 +08:00
liuxiongfeng
ce1d2904c7
test: 为测试 stub 添加缺失的 GroupRepository 接口方法
...
新增 BindAccountsToGroup 和 GetAccountIDsByGroupIDs 方法的 stub 实现,
确保测试文件中的 mock 类型满足 GroupRepository 接口要求。
2026-02-02 22:06:37 +08:00
ducky
b7f69844e1
feat(announcements): add admin/user announcement system
...
Implements announcements end-to-end (admin CRUD + read status, user list + mark read) with OR-of-AND targeting. Also breaks the ent<->service import cycle by moving schema-facing constants/targeting into a new domain package.
2026-01-30 16:45:04 +08:00
ducky
04a509d45e
feat(purchase): 增加购买订阅 iframe 页面与配置
...
- 新增 /purchase 页面(iframe + 新窗口兜底)
- 管理员系统设置可配置开关与URL
- 非 simple mode 才在侧边栏展示入口
2026-01-28 13:54:32 +08:00
shaw
1245f07a2d
feat(auth): 实现 TOTP 双因素认证功能
...
新增功能:
- 支持 Google Authenticator 等应用进行 TOTP 二次验证
- 用户可在个人设置中启用/禁用 2FA
- 登录时支持 TOTP 验证流程
- 管理后台可全局开关 TOTP 功能
安全增强:
- TOTP 密钥使用 AES-256-GCM 加密存储
- 添加 TOTP_ENCRYPTION_KEY 配置项,必须手动配置才能启用功能
- 防止服务重启导致加密密钥变更使用户无法登录
- 验证失败次数限制,防止暴力破解
配置说明:
- Docker 部署:在 .env 中设置 TOTP_ENCRYPTION_KEY
- 非 Docker 部署:在 config.yaml 中设置 totp.encryption_key
- 生成密钥命令:openssl rand -hex 32
2026-01-26 09:19:53 +08:00
shaw
9cc8352593
feat(auth): 密码重置邮件队列化与限流优化
...
- 邮件发送改为异步队列处理,避免并发导致发送失败
- 新增 Email 维度限流(30秒冷却期),防止邮件轰炸
- Token 验证使用常量时间比较,防止时序攻击
- 重构代码消除冗余,提取公共验证逻辑
2026-01-24 22:55:28 +08:00
shaw
43a1031e38
fix(test): 修复订阅相关测试失败问题
...
1. 使用未来日期(2099年)作为测试订阅的过期时间,避免
normalizeSubscriptionStatus 将测试数据标记为过期
2. 修复 List 方法调用参数不足的问题(新增 sortBy/sortOrder 参数)
2026-01-24 21:10:02 +08:00
shaw
b0aa23540b
feat(subscription): 订阅过期状态自动更新与服务端排序
...
- 新增 SubscriptionExpiryService 定时任务,每分钟更新过期订阅状态
- 订阅列表支持服务端排序(按过期时间、状态、创建时间)
- 实时显示正确的过期状态,无需等待定时任务
- 允许对已过期订阅进行续期操作
- DataTable 组件支持 serverSideSort 模式
2026-01-24 20:26:01 +08:00
shaw
2665230a09
fix(token-cache): 修复异步刷新与请求线程的缓存竞态条件
...
- 新增 _token_version 版本号机制,防止过期 token 污染缓存
- TokenRefreshService 刷新成功后写入版本号并清除缓存
- TokenProvider 写入缓存前检查版本,过时则跳过
- ClearError 时同步清除 token 缓存
2026-01-22 21:09:28 +08:00
shaw
81989eed1c
test: add promo_code_enabled to API contract test
2026-01-20 16:02:49 +08:00
song
64795a03e3
新增账号凭证邮箱查询接口
2026-01-20 14:17:10 +08:00
Wesley Liddick
e7bc62500b
Merge pull request #333 from whoismonay/main
...
fix: 普通用户接口移除管理员敏感字段透传
2026-01-19 21:35:51 +08:00
墨颜
6aef1af76e
fix(redeem): 用户兑换历史不返回备注
...
- 用户侧 RedeemCode DTO 移除 notes 字段,避免泄露内部备注\n- 新增 AdminRedeemCode,并调整管理员兑换码接口继续返回 notes\n- 增加 /api/v1/redeem/history 契约测试,确保用户侧响应不包含 notes
2026-01-19 20:09:35 +08:00
Gemini Wen
a54852e129
fix: 补充API契约测试中缺失的hide_ccs_import_button字段
...
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-19 20:06:36 +08:00
Gemini Wen
668118def1
fix: 修复遗漏的测试文件更新和lint错误
...
- 更新api_contract_test.go以匹配NewAccountHandler新增的tokenCacheInvalidator参数
- 修复errcheck lint错误,显式忽略c.Error()返回值
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-19 19:58:09 +08:00
墨颜
31cde6c555
fix(subscriptions): 用户订阅不返回分配信息
...
- 用户侧 UserSubscription DTO 移除 assigned_by/assigned_at/notes/assigned_by_user 等管理员字段\n- 新增 AdminUserSubscription,并调整管理员订阅接口与批量分配结果使用\n- 增加 /api/v1/subscriptions 契约测试,确保用户侧响应不包含上述字段
2026-01-19 19:35:13 +08:00
墨颜
00d9fbd220
fix(user): 普通用户接口不返回备注
...
- 用户侧 dto.User 移除 notes 字段,避免泄露管理员备注\n- 新增 dto.AdminUser 并调整 /admin/users 系列接口使用\n- 前端拆分 User/AdminUser,管理端用户页面使用 AdminUser\n- 更新契约测试:/api/v1/auth/me 响应不包含 notes
2026-01-19 19:23:51 +08:00
墨颜
4f4c9679bf
fix(groups): 用户分组不下发内部路由信息
...
- 普通用户 Group DTO 移除 model_routing/account_count/account_groups,避免泄露内部路由与账号信息\n- 新增 AdminGroup DTO,并仅在管理员分组接口返回完整字段\n- 前端拆分 Group/AdminGroup,管理端页面与 API 使用 AdminGroup\n- 增加 /api/v1/groups/available 契约测试,防止回归
2026-01-19 18:58:42 +08:00
墨颜
2f6f758670
fix(usage): 用户使用记录不下发账号计费倍率
...
- 将 usage log DTO 拆分为用户/管理员两类
- 用户接口不返回 account_rate_multiplier/ip_address/account
- 管理员接口保留管理员字段
- 补充契约测试防止回归
2026-01-19 17:05:42 +08:00
Wesley Liddick
0f8d42c577
Merge pull request #327 from mt21625457/main
...
feat(usage): 添加清理任务与统计过滤
2026-01-19 09:18:00 +08:00
Wesley Liddick
03c7578713
Merge pull request #325 from slovx2/main
...
fix(antigravity): 修复Antigravity 频繁429的问题,以及一系列优化,配置增强
2026-01-19 09:17:15 +08:00
shaw
46ae08ecb7
fix: 补充测试桩缺失的接口方法
2026-01-18 22:23:03 +08:00
yangjianbo
bdc426a774
Merge branch 'main' into dev
2026-01-18 15:55:58 +08:00
yangjianbo
ef5a41057f
feat(usage): 添加清理任务与统计过滤
2026-01-18 10:52:18 +08:00
song
b9b4db3df5
Merge upstream/main
2026-01-17 18:00:07 +08:00
shaw
34415db7ed
fix: 修复 api_contract_test 缺少 SessionLimitCache 参数的问题
2026-01-16 23:53:54 +08:00
yangjianbo
e3f812c2fe
fix(安全): CSP 策略自动增强,无需配置文件修改即可生效
...
- 添加 enhanceCSPPolicy() 自动增强任何 CSP 策略
- 自动添加 nonce 占位符(如果策略中没有)
- 自动添加 Cloudflare Insights 域名
- 即使配置文件使用旧策略也能正常工作
- 添加 enhanceCSPPolicy 和 addToDirective 单元测试
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-16 17:20:39 +08:00
yangjianbo
c9f79dee66
feat(安全): 实现 CSP nonce 支持解决内联脚本安全问题
...
- 添加 GenerateNonce() 生成加密安全的随机 nonce
- SecurityHeaders 中间件为每个请求生成唯一 nonce
- CSP 策略支持 __CSP_NONCE__ 占位符动态替换
- embed_on.go 注入的内联脚本添加 nonce 属性
- 添加 Cloudflare Insights 域名到 CSP 允许列表
- 添加完整单元测试,覆盖率达到 89.8%
解决的问题:
- 内联脚本违反 CSP script-src 指令
- Cloudflare Insights beacon.min.js 加载被阻止
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-16 17:05:49 +08:00
wfunc
452fa53c0d
feat: Claude Sonnet 429 仅限模型限流
2026-01-16 13:03:04 +08:00
longgexx
4672a6fac3
merge: 合并上游 upstream/main 分支
...
解决冲突:
- usage_log_repo.go: 保留 groupID 和 stream 参数,同时合并上游的
account_rate_multiplier 逻辑
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-15 13:09:26 +08:00
Wesley Liddick
27214f8657
Merge pull request #285 from IanShaw027/fix/ops-bug
...
feat(ops): 增强错误日志管理、告警静默和前端 UI 优化
2026-01-15 11:26:16 +08:00
Wesley Liddick
28de614dfb
Merge pull request #282 from LLLLLLiulei/feat/ip-management-enhancements
...
feat: enhance proxy management
2026-01-15 11:23:17 +08:00
IanShaw027
9584af5cb4
fix(ops): 优化错误日志查询和详情展示
...
- 新增 GetErrorLogByID 接口用于获取单个错误日志详情
- 优化 GetErrorLogs 过滤逻辑,简化参数处理
- 简化前端错误详情模态框代码,提升可维护性
- 更新相关 API 接口和 i18n 翻译
2026-01-14 23:16:01 +08:00
longgexx
5efeabb0c6
fix(admin): 修复使用记录页面趋势图筛选联动和日期选择问题
...
修复两个问题:
1. Token使用趋势图和模型分布图未响应筛选条件
2. 上午时段选择今天刷新后日期回退到前一天
前端修改:
- 更新 dashboard API 类型定义,添加 model、account_id、group_id、stream 参数支持
- 修改 UsageView 趋势图加载逻辑,传递所有筛选参数到后端
- 修复日期格式化函数,使用本地时区避免 UTC 转换导致的日期偏移
后端修改:
- Handler 层:接收并解析所有筛选参数(model、account_id、group_id、stream)
- Service 层:传递完整的筛选参数到 Repository 层
- Repository 层:SQL 查询动态添加所有过滤条件
- 更新接口定义和测试 mock 以保持一致性
影响范围:
- /admin/dashboard/trend 端点现支持完整筛选
- /admin/dashboard/models 端点现支持完整筛选
- 用户在后台使用记录页面选择任意筛选条件时,趋势图和模型分布图会实时响应
- 日期选择器在任何时区下都能正确保持今天的选择
2026-01-14 22:02:56 +08:00
LLLLLLiulei
02cb14c7b8
test: fix proxy repo stub
2026-01-14 19:56:19 +08:00
LLLLLLiulei
9bdb45be7c
feat: enhance proxy management
2026-01-14 19:45:29 +08:00