yangjianbo
e79dbad602
Merge branch 'main' into test
2026-01-10 14:56:51 +08:00
yangjianbo
6a9cc13e3e
fix(网关): 明确粘性命中范围并优化映射构建
...
仅在粘性命中时构建候选账号映射以减少开销
新增用例验证粘性账号缺失时回退负载感知选择
2026-01-10 14:51:16 +08:00
yangjianbo
7a0ca05233
perf(网关): 粘性会话命中复用候选账号
...
使用候选账号映射避免粘性命中时额外的 GetByID 查询
新增单测确保粘性命中不触发 GetByID 且提前返回
2026-01-10 14:39:33 +08:00
yangjianbo
3730819857
chore(合并): 修复合并冲突并保留分组上下文优化
...
解决 GroupRepository 接口签名更新导致的测试失败
保留 ctxkey.Group Hydrated 覆盖逻辑相关测试
测试: make test-backend
2026-01-10 10:00:49 +08:00
yangjianbo
297f08c683
Merge branch 'test' into dev
2026-01-10 09:39:02 +08:00
yangjianbo
61f556745a
Merge branch 'main' of https://github.com/mt21625457/aicodex2api
2026-01-10 09:28:30 +08:00
yangjianbo
435f693892
test(分组): 增加无效上下文覆盖回归测试
...
补充 GatewayService 与 APIKey 中间件对无效 ctxkey.Group 的覆盖行为测试
测试: make test-backend
2026-01-10 09:27:47 +08:00
yangjianbo
72f78f8a56
fix(分组): 强化上下文分组可信校验
...
- 引入 Hydrated 标记限制复用来源
- 无效上下文分组允许被新值覆盖自愈
- 更新相关单测覆盖
2026-01-10 08:40:27 +08:00
yangjianbo
2597fe78ba
fix(分组): 防止降级环并校验上下文分组
...
- 增加降级链路环检测并拦截配置
- 仅复用合法分组上下文并必要时回退查询
- 标注 GetByIDLite 轻量语义并补充测试
2026-01-10 07:56:50 +08:00
yangjianbo
675543240e
perf(网关): 复用分组上下文减少热路径查询
...
新增 GetByIDLite 并在网关与 Gemini 选择流程复用上下文 group,避免 COUNT 触发
更新 API key 中间件注入 group 上下文,减少重复查库
补充 gateway/gemini 中间件与仓库层回归测试
测试: make test
2026-01-09 23:01:42 +08:00
yangjianbo
eeb1282f0c
Merge branch 'main' of https://github.com/mt21625457/aicodex2api
2026-01-09 15:30:52 +08:00
yangjianbo and Claude Opus 4.5
470abee092
fix(auth): 修复邮件验证服务未配置时可绕过验证的安全漏洞
...
当邮件验证开启但 emailService 未配置时,原逻辑允许用户绕过验证直接注册。
现在会返回 ErrServiceUnavailable 拒绝注册,确保配置错误不会导致安全问题。
- 在验证码检查前先检查 emailService 是否配置
- 添加日志记录帮助发现配置问题
- 新增单元测试覆盖该场景
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-09 09:57:42 +08:00
yangjianbo and Claude Opus 4.5
39433f2a29
fix(auth): 修复 RefreshToken 使用过期 token 时的 nil pointer panic
...
问题分析:
- RefreshToken 允许过期 token 继续流程(用于无感刷新)
- 但 ValidateToken 在 token 过期时返回 nil claims
- 导致后续访问 claims.UserID 时触发 panic
修复方案:
- 修改 ValidateToken,在检测到 ErrTokenExpired 时仍然返回 claims
- jwt-go 在解析时即使遇到过期错误,token.Claims 仍会被填充
- 这样 RefreshToken 可以正常获取用户信息并生成新 token
新增测试:
- TestAuthService_ValidateToken_ExpiredReturnsClaimsWithError
- TestAuthService_RefreshToken_ExpiredTokenNoPanic
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-09 09:36:06 +08:00
yangjianbo and Claude Sonnet 4.5
823497a2af
fix(并发): 修复 wrapReleaseOnDone goroutine 泄露问题
...
问题描述:
- wrapReleaseOnDone 函数创建的 goroutine 会持续等待 ctx.Done()
- 即使 release() 已被调用,goroutine 仍不会退出
- 高并发场景下(1000 req/s)会产生 3000+ 个泄露 goroutine
修复方案:
- 添加 quit channel 作为退出信号
- 正常释放时 close(quit) 通知 goroutine 立即退出
- 使用 select 监听 ctx.Done() 和 quit 两个信号
- 确保 goroutine 在正常流程中及时退出
测试覆盖:
- 新增 5 个单元测试验证修复效果
- 验证 goroutine 不泄露
- 验证并发安全性和多次调用保护
- 性能影响:471.9 ns/op, 208 B/op
影响范围:
- gateway_handler.go: 每请求调用 2-4 次
- openai_gateway_handler.go: 每请求调用 2-3 次
- 修复后 goroutine 泄露数量从 3/req 降至 0
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2026-01-06 20:31:40 +08:00
yangjianbo
66fe484f0d
chore: 删除依赖安全文档
2026-01-06 20:26:32 +08:00
yangjianbo and Claude Sonnet 4.5
5a52cb608c
fix(前端): 修复账号管理页面平台过滤不生效的问题
...
添加 @update:filters 事件监听,使过滤器参数能正确同步到数据请求中。
修复了平台、类型、状态三个过滤器全部失效的问题。
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2026-01-06 19:20:05 +08:00
yangjianbo and Claude Opus 4.5
1181b332f7
fix(前端): 修复编辑账号错误提示无法显示具体原因的问题
...
后端 API 返回 message 字段,但前端读取 detail 字段,导致无法显示具体错误信息。
现在优先读取 message 字段,兼容 detail 字段。
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-06 15:46:36 +08:00
yangjianbo and Claude Opus 4.5
58b1777198
fix(ci): 修复 frontend-security job 中的 pnpm 安装顺序问题
...
**问题描述:**
GitHub Actions 在 frontend-security job 中报错:
"Error: Unable to locate executable file: pnpm"
**根本原因:**
setup-node@v4 在尝试使用 pnpm cache 时,pnpm 还未安装
**解决方案:**
1. 调整步骤顺序:先安装 pnpm,再设置 Node.js
2. 升级 pnpm/action-setup 从 v2 到 v4
3. 明确指定 pnpm version: 9
**修改内容:**
- 将 "Set up pnpm" 步骤移到 "Set up Node.js" 之前
- 更新 pnpm/action-setup@v2 → pnpm/action-setup@v4
- 添加 version: 9 配置
**正确的步骤顺序:**
1. Checkout 代码
2. Set up pnpm (指定版本)
3. Set up Node.js (可以使用 pnpm cache)
4. Install dependencies
相关 Issue: #174
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-06 13:42:47 +08:00
yangjianbo and Claude Opus 4.5
0c7a58fcc7
fix(配置): 修改 URL 安全配置默认值为开发友好模式
...
调整以下配置的默认值以匹配 .env.example:
- allow_insecure_http: false → true (允许 HTTP URL)
- allow_private_hosts: false → true (允许本地/私有 IP)
**改动说明:**
- 默认允许 HTTP URL,方便开发测试环境使用
- 默认允许本地和私有 IP 地址
- 与 deploy/.env.example 中的推荐配置保持一致
- 更新相应的单元测试以验证新的默认值
**安全提示:**
⚠️ 这些默认值适合开发/测试环境
⚠️ 生产环境建议显式配置更严格的安全策略
⚠️ HTTP 存在明文传输风险,仅在可信网络中使用
**测试结果:**
- ✅ 所有单元测试通过
- ✅ golangci-lint 无问题
相关文件:
- backend/internal/config/config.go:451-452
- backend/internal/config/config_test.go:83-88
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-06 12:56:29 +08:00
yangjianbo and Claude Opus 4.5
17ae51c0a0
merge: 合并远程分支并修复代码冲突
...
合并了远程分支 cb72262 的功能更新,同时保留了 ESLint 修复:
**冲突解决详情:**
1. AccountTableFilters.vue
- ✅ 保留 emit 模式修复(避免 vue/no-mutating-props 错误)
- ✅ 添加第三个筛选器 type(账户类型)
- ✅ 新增 antigravity 平台和 inactive 状态选项
2. UserBalanceModal.vue
- ✅ 保留 console.error 错误日志
- ✅ 添加输入验证(金额校验、余额不足检查)
- ✅ 使用 appStore.showError 向用户显示友好错误
3. AccountsView.vue
- ✅ 保留所有 console.error 错误日志(避免 no-empty 错误)
- ✅ 使用新 API:clearRateLimit 和 setSchedulable
4. UsageView.vue
- ✅ 添加 console.error 错误日志
- ✅ 添加图表功能(模型分布、使用趋势)
- ✅ 添加粒度选择(按天/按小时)
- ✅ 保留 XLSX 动态导入优化
**测试结果:**
- ✅ Go tests: PASS
- ✅ golangci-lint: 0 issues
- ✅ ESLint: 0 errors
- ✅ TypeScript: PASS
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-06 12:50:51 +08:00
yangjianbo and Claude Opus 4.5
4790aced15
fix(前端): 修复 ESLint 代码规范问题
...
- 修复 AccountTableFilters.vue 中的 vue/no-mutating-props 错误,使用 emit 模式替代直接修改 props
- 修复 TypeScript 类型错误,支持 Select 组件的 null 值类型
- 为所有空 catch 块添加错误日志,提升代码可维护性和调试能力
- 涉及文件:AccountTableFilters.vue, UserAllowedGroupsModal.vue, UserApiKeysModal.vue, UserBalanceModal.vue, AccountsView.vue, UsageView.vue, DashboardView.vue, ProfileView.vue
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-06 12:42:06 +08:00
yangjianbo
3f0017d1f1
fix(安全): 修复依赖漏洞并强化安全扫描
...
主要改动:
- 固定 Go 1.25.5 与 CI 校验并更新扫描流程
- 升级 quic-go、x/crypto、req 等依赖并通过 govulncheck
- 强化 JWT 校验、TLS 配置与 xlsx 动态加载
- 新增审计豁免清单与校验脚本
2026-01-06 11:36:38 +08:00
yangjianbo
d936eb6518
Merge branch 'main' of https://github.com/mt21625457/aicodex2api
2026-01-05 17:26:18 +08:00
yangjianbo and Claude Sonnet 4.5
3b7d0c42f1
fix(格式): 修复 config.go 代码格式问题
...
修复 golangci-lint gofmt 检查失败,移除 AllowInsecureHTTP 字段后多余的空格。
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2026-01-05 17:24:37 +08:00
yangjianbo
6451b3cd83
Merge branch 'test'
2026-01-05 17:05:30 +08:00
yangjianbo
c4628d4604
fix(安全): 允许在禁用白名单时使用不安全的 HTTP URL
2026-01-05 16:09:42 +08:00
yangjianbo
ee6d01fd1c
fix(配置): 更新配置文件,添加中文注释并优化部分字段说明
2026-01-05 16:06:03 +08:00
yangjianbo
5668736389
fix(依赖): 更新 Redis 镜像版本至 8-alpine
2026-01-05 15:54:47 +08:00
yangjianbo and Claude Opus 4.5
1aef4ce20d
fix(部署): 配置文件挂载改为可选,避免 Docker 自动创建目录
...
当挂载的源文件不存在时,Docker 会自动创建同名目录而非文件。
将配置文件挂载默认注释,用户需要时先创建文件再取消注释。
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-05 15:50:29 +08:00
yangjianbo and Claude Opus 4.5
ce7893ee44
feat(部署): 支持通过环境变量配置挂载的配置文件路径
...
- docker-compose.yml 配置文件挂载路径改为 ${CONFIG_FILE:-./config.yaml}
- .env.example 添加 CONFIG_FILE 配置项,方便用户指定自定义配置文件
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-05 15:40:30 +08:00
yangjianbo and Claude Opus 4.5
4c1293a74c
fix(安全): CSP 策略添加 Google Fonts 支持
...
在 style-src 中添加 fonts.googleapis.com,在 font-src 中添加
fonts.gstatic.com,解决浏览器控制台因 CSP 策略阻止加载
Google Fonts 样式表的错误。
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-05 15:32:36 +08:00
yangjianbo
d43599243c
Implement feature X to enhance user experience and fix bug Y in module Z
2026-01-05 15:25:25 +08:00
yangjianbo
fb313356f7
Merge branch 'main' into test-dev
2026-01-05 14:43:08 +08:00
yangjianbo
048ed061c2
fix(安全): 关闭白名单时保留最小校验与默认白名单
...
实现 allow_insecure_http 并在关闭校验时执行最小格式验证
- 关闭 allowlist 时要求 URL 可解析且 scheme 合规
- 响应头过滤关闭时使用默认白名单策略
- 更新相关文档、示例与测试覆盖
2026-01-05 14:41:08 +08:00
yangjianbo
794a9f969b
feat(安全): 添加安全开关并完善测试流程
...
实现安全开关默认关闭与响应头透传逻辑
- URL 校验与响应头过滤支持开关并覆盖流式路径
- 非流式 Content-Type 透传/默认值按配置生效
- 接入 go test、golangci-lint 与前端 lint/typecheck
- 补充相关测试与配置/文档说明
2026-01-05 13:54:43 +08:00
yangjianbo
c8e5455df0
chore(配置): 更新上游白名单默认值
...
新增 Kimi/BigModel/Minimax 官方域名到 allowlist
保持示例配置与默认值一致
2026-01-05 09:18:17 +08:00
yangjianbo
f8e7255c32
feat(界面): 为 Gemini 配置片段添加语法高亮
...
补齐高亮渲染并保留纯文本回退
新增高亮 token 工具并做 HTML 转义
2026-01-04 22:19:11 +08:00
yangjianbo
5dd8b8802b
fix(后端): 修复 lint 失败并清理无用代码
...
修正测试中的 APIKey 名称引用
移除不可达返回与未使用函数
统一 gofmt 格式并处理 Close 错误
2026-01-04 22:10:32 +08:00
yangjianbo
7dddd06583
Merge branch 'main' of https://github.com/mt21625457/aicodex2api
2026-01-04 21:06:12 +08:00
yangjianbo
25a0d49af9
chore(合并): 同步主分支变更并解决冲突
...
- 合并 wire/httpclient/http_upstream/proxy_probe 冲突并保留校验逻辑
- 引入 proxyutil 及测试,完善代理配置
- 更新 goreleaser/workflow 与前端细节调整
测试: go test ./...
2026-01-04 20:29:39 +08:00
yangjianbo
7489da49cb
fix(流式): 以上游读取判定超时并调大事件缓冲
...
- 以读取时间戳判定流式间隔超时,避免下游阻塞误判
- antigravity 流式读取使用 MaxLineSize 配置
- 事件通道缓冲提升到 16
测试: go test ./...
2026-01-04 20:19:07 +08:00
yangjianbo
73ffb58518
fix(流式): 提升SSE稳定性并统一超时配置
...
- 扩展SSE行长与间隔超时处理,补充keepalive
- 写入失败与超长行时发送错误事件,修复并发释放
- 同步默认配置与示例配置,更新Caddy超时/压缩规则
- 新增OpenAI流式超时与超长行测试
测试: go test ./...
2026-01-04 19:49:59 +08:00
yangjianbo
6c86cf7605
Merge branch 'main' into test-dev
2026-01-03 21:38:21 +08:00
yangjianbo and Claude Opus 4.5
e51a32881b
merge: 合并 test 分支到 test-dev,解决冲突
...
解决的冲突文件:
- wire_gen.go: 合并 ConcurrencyService/CRSSyncService 参数和 userAttributeHandler
- gateway_handler.go: 合并 pkg/errors 和 antigravity 导入
- gateway_service.go: 合并 validateUpstreamBaseURL 和 GetAvailableModels
- config.example.yaml: 合并 billing/turnstile 配置和额外 gateway 选项
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-03 11:36:31 +08:00
yangjianbo
25e1632628
fix(安全): 修复上游校验与 URL 清理问题
...
增加请求阶段 DNS 解析校验,阻断重绑定到私网
补充默认透传 WWW-Authenticate 头,保留认证挑战
前端相对 URL 过滤拒绝 // 协议相对路径
测试: go test ./internal/repository -run TestGitHubReleaseServiceSuite
测试: go test ./internal/repository -run TestTurnstileServiceSuite
测试: go test ./internal/repository -run TestProxyProbeServiceSuite
测试: go test ./internal/repository -run TestClaudeUsageServiceSuite
2026-01-03 10:52:24 +08:00
yangjianbo
bd4bf00856
feat(安全): 强化安全策略与配置校验
...
- 增加 CORS/CSP/安全响应头与代理信任配置
- 引入 URL 白名单与私网开关,校验上游与价格源
- 改善 API Key 处理与网关错误返回
- 管理端设置隐藏敏感字段并优化前端提示
- 增加计费熔断与相关配置示例
测试: go test ./...
2026-01-02 17:40:57 +08:00
yangjianbo and Claude Opus 4.5
59269dc1c1
fix(数据层): 修复软删除与唯一约束冲突问题
...
问题:软删除的记录仍占用唯一约束位置,导致删后无法重建同名/同邮箱/同订阅
修复方案:使用 PostgreSQL 部分唯一索引(WHERE deleted_at IS NULL)
- User.email: 移除字段级 Unique(),改用部分唯一索引
- Group.name: 移除字段级 Unique(),改用部分唯一索引
- UserSubscription.(user_id, group_id): 移除组合唯一索引,改用部分唯一索引
- ApiKey.key: 保留普通唯一约束(安全考虑,已删除的 Key 不应重用)
安全性:
- 应用层已有 ExistsByXxx 检查,自动过滤软删除记录
- 数据库层部分唯一索引提供最后一道防线
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-31 16:37:18 +08:00
yangjianbo and Claude Opus 4.5
1ef4f09df5
fix(网关): 添加 model 参数必填验证
...
在以下端点添加 model 参数的必填验证,缺失时直接返回 400 错误:
- /v1/messages
- /v1/messages/count_tokens
- /openai/v1/responses
修复前:空 model 会进入账号选择流程,最终由上游 API 返回错误
修复后:入口处直接拒绝,避免浪费资源和不明确的错误信息
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-31 16:17:45 +08:00
yangjianbo
0ffb3201b7
Merge branch 'main' of https://github.com/mt21625457/aicodex2api
2025-12-31 15:33:08 +08:00
yangjianbo and Claude Opus 4.5
6f6dc3032c
fix(设置): 修复站点设置保存失败的问题
...
问题:
1. Setting.value 字段设置了 NotEmpty() 约束,导致保存空字符串值时验证失败
2. 数据库 settings 表缺少 key 字段的唯一约束,导致 ON CONFLICT 语句执行失败
修复:
- 移除 ent/schema/setting.go 中 value 字段的 NotEmpty() 约束
- 新增迁移 015_fix_settings_unique_constraint.sql 添加缺失的唯一约束
- 添加3个回归测试确保空值保存功能正常
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-31 15:31:26 +08:00
yangjianbo
d77d0544d0
fix(仓储): 修复并发缓存前缀与软删除更新
...
补齐 Redis ZSET 前缀处理,确保并发释放计数正确
删除时改用 Client().Mutate 走更新逻辑,保留软删除记录
测试: make test-integration
2025-12-31 15:20:58 +08:00
yangjianbo and Claude Opus 4.5
682f546c0e
fix(lint): 修复 golangci-lint 报告的代码问题
...
- errcheck: 修复类型断言未检查返回值的问题
- pool.go: 添加 sync.Map 类型断言安全检查
- req_client_pool.go: 添加 sync.Map 类型断言安全检查
- concurrency_cache_benchmark_test.go: 显式忽略断言返回值
- gateway_service.go: 显式忽略 WriteString 返回值
- gofmt: 修复代码格式问题
- redis.go: 注释对齐
- api_key_repo.go: 结构体字段对齐
- concurrency_cache.go: 字段对齐
- http_upstream.go: 注释对齐
- unused: 删除未使用的代码
- user_repo.go: 删除未使用的 sql 字段
- usage_service.go: 删除未使用的 calculateStats 函数
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-31 14:51:58 +08:00
yangjianbo
dbc0cf33a1
Merge branch 'main' of https://github.com/mt21625457/aicodex2api
2025-12-31 14:26:20 +08:00
yangjianbo and Claude Opus 4.5
679b21a86c
Merge branch 'main' into test
...
冲突解决:
- wire_gen.go: 合并 antigravityGatewayService 和 ProvideConcurrencyCache
- user_repo_integration_test.go: 保留 NotFound 测试
- antigravity_gateway_service.go: 适配 httpUpstream.Do 新签名
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-31 14:17:18 +08:00
yangjianbo and Claude Opus 4.5
5906f9ab98
fix(数据层): 修复数据完整性与仓储一致性问题
...
## 数据完整性修复 (fix-critical-data-integrity)
- 添加 error_translate.go 统一错误转换层
- 修复 nil 输入和 NotFound 错误处理
- 增强仓储层错误一致性
## 仓储一致性修复 (fix-high-repository-consistency)
- Group schema 添加 default_validity_days 字段
- Account schema 添加 proxy edge 关联
- 新增 UsageLog ent schema 定义
- 修复 UpdateBalance/UpdateConcurrency 受影响行数校验
## 数据卫生修复 (fix-medium-data-hygiene)
- UserSubscription 添加软删除支持 (SoftDeleteMixin)
- RedeemCode/Setting 添加硬删除策略文档
- account_groups/user_allowed_groups 的 created_at 声明 timestamptz
- 停止写入 legacy users.allowed_groups 列
- 新增迁移: 011-014 (索引优化、软删除、孤立数据审计、列清理)
## 测试补充
- 添加 UserSubscription 软删除测试
- 添加迁移回归测试
- 添加 NotFound 错误测试
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-31 14:11:57 +08:00
yangjianbo
820bb16ca7
fix(网关): 防止连接池缓存失控
...
超限且无可淘汰条目时拒绝新建
规范化代理地址并更新失败时的访问时间
补充连接池上限与代理规范化测试
2025-12-31 12:01:31 +08:00
yangjianbo
d1c9889609
perf(网关): 实现上游账号连接池隔离
...
新增隔离策略与连接池缓存回收
连接池大小跟随账号并发并处理代理切换
同步配置默认值与示例并补充测试
2025-12-31 11:43:58 +08:00
yangjianbo
3d7f8e4b3a
fix(服务): 修复system判定、统计时区与缓存日志
...
- system 字段存在即视为显式提供,避免 null 触发默认注入
- 日统计分组显式使用应用时区,缺失时从 TZ 回退到 UTC
- 缓存写入队列丢弃日志节流汇总,关键任务同步回退
测试: go test ./internal/service -run TestBillingCacheServiceQueueHighLoad
2025-12-31 10:17:38 +08:00
yangjianbo
7efa8b54c4
perf(后端): 完成性能优化与连接池配置
...
新增 DB/Redis 连接池配置与校验,并补充单测
网关请求体大小限制与 413 处理
HTTP/req 客户端池化并调整上游连接池默认值
并发槽位改为 ZSET+Lua 与指数退避
用量统计改 SQL 聚合并新增索引迁移
计费缓存写入改工作池并补测试/基准
测试: 在 backend/ 下运行 go test ./...
2025-12-31 08:50:12 +08:00
yangjianbo
5376786694
chore(配置): 提升容器文件描述符上限到10万
...
调整原因:
- 防止高并发下出现 "too many open files" 错误
- 统一测试与生产环境的 ulimits 配置
改动内容:
- 为 sub2api、postgres、redis 设置 nofile
- 软硬限制均为 100000
测试: 未运行
2025-12-30 20:28:41 +08:00
yangjianbo
8cb2d3b352
fix(仓储): 规范 rows.Close 错误回传
...
统一 usage_log_repo 查询的 Close 错误处理,避免\n成功路径吞掉关闭失败
scanSingleRow 使用 errors.Join 合并 Close 错误,\n保留 ErrNoRows 可判定
测试: make -C backend test-unit
2025-12-30 17:13:32 +08:00
yangjianbo
7e758b24c4
chore(依赖): 同步 Go 模块依赖
...
更新 go.mod/go.sum 的间接依赖记录
包含 gorm/mysql 相关依赖项
2025-12-30 16:43:18 +08:00
yangjianbo
aacbc98aec
fix(仓储): 修复查询关闭错误并迁移集成测试
...
修复 rows.Close 失败时的错误返回逻辑
迁移网关路由集成测试到 ent 事务基建
补齐仓储接口变更对应的测试桩方法
新增 backend/Makefile 统一测试命令
测试: GOTOOLCHAIN=go1.24.11 go test ./...
测试: golangci-lint run ./... --timeout=5m
测试: make test-integration
2025-12-30 16:41:45 +08:00
yangjianbo
b6fec590a7
Merge branch 'main' of https://github.com/mt21625457/aicodex2api
2025-12-30 14:46:46 +08:00
yangjianbo
e5a79fedac
Merge branch 'test-dev'
2025-12-30 14:36:52 +08:00
yangjianbo
148048b035
feat: update agents.md
2025-12-30 14:36:37 +08:00
yangjianbo
b9a753cd04
fix(仓库): 使用 ent 实现账号调度查询
...
替换 gorm 查询并复用分组过滤逻辑,避免编译错误
2025-12-30 14:35:29 +08:00
yangjianbo
daf0e883ae
feat: 增加对应的忽略文件
2025-12-30 14:29:43 +08:00
yangjianbo
a641d4a14a
Merge branch 'main' into test-dev
2025-12-30 14:17:12 +08:00
yangjianbo
809ea23587
Merge branch 'main' of https://github.com/mt21625457/aicodex2api
2025-12-30 14:15:52 +08:00
yangjianbo
e5c314092d
feat: 增加忽略目录
2025-12-30 14:08:48 +08:00
yangjianbo
0ea373d9d5
feat: 增加git 忽略目录
2025-12-30 14:04:53 +08:00
yangjianbo
52e3e44008
feat: 还原误删的makefile
2025-12-30 10:29:26 +08:00
yangjianbo
84c009da63
Merge branch 'main' into test
2025-12-30 10:22:12 +08:00
yangjianbo
b9760abe36
feat: 忽略openspec
2025-12-30 10:16:34 +08:00
yangjianbo
d34f5a01cb
feat: 忽略掉一些目录
2025-12-30 09:23:17 +08:00
yangjianbo
e83f0ee307
Merge branch 'main' into test-dev
2025-12-30 09:07:55 +08:00
yangjianbo
bff3c66d69
feat: 增加测试用docker compose配置文件
2025-12-30 09:00:42 +08:00
yangjianbo
2ea4dafa08
feat: 删除openspec
2025-12-30 08:42:51 +08:00
yangjianbo
b63b338e95
Merge branch 'main' into test-dev
2025-12-30 08:41:49 +08:00
yangjianbo
57db688d7c
feat:增加一个快捷的build docker镜像的脚本,用于本地测试
2025-12-29 20:26:18 +08:00
yangjianbo
9d1d608f4f
feat: 增加makefile编译脚本
2025-12-29 20:23:19 +08:00
yangjianbo
042d82359c
fix(仓储): 修复 ApiKey 更新并发语义
...
ApiKey 更新时显式设置 updated_at 并回填,避免二次查询竞态
补充软删除范围注释以统一审计语义
2025-12-29 19:59:36 +08:00
yangjianbo
74db0c15ae
chore(生成代码): 更新 ent 客户端与事务代码
...
同步生成文件以匹配最新的 schema 与运行时变更
2025-12-29 19:24:29 +08:00
yangjianbo
ae191f72a4
fix(仓储): 修复软删除过滤与事务测试
...
修复软删除拦截器使用错误,确保默认查询过滤已删记录
仓储层改用 ent.Tx 与扫描辅助,避免 sql.Tx 断言问题
同步更新集成测试以覆盖事务与统计变动
2025-12-29 19:23:49 +08:00
yangjianbo
b436da7249
fix(界面): 显示用户操作失败详情
...
创建/删除用户失败时优先展示后端 message\n保留原有兜底提示
2025-12-29 17:00:03 +08:00
yangjianbo
a792f32d5b
feat: 优化dockerfile文件
2025-12-29 16:59:07 +08:00
yangjianbo
777e1c8f1c
feat: 删除没有必要的脚本
2025-12-29 16:58:54 +08:00
yangjianbo
4dab18a94f
fix(用户): 修复删除用户软删除钩子
...
避免软删除钩子类型断言失败导致 500\n删除无记录时返回未找到错误并记录日志
2025-12-29 16:57:50 +08:00
yangjianbo and Claude Opus 4.5
5584709ac9
fix(仓储层): 修复事务 ent client 调用 Close() 导致的 panic
...
问题:创建用户时发生 panic,错误信息为
"interface conversion: sql.ExecQuerier is *sql.Tx, not *sql.DB"
原因:基于事务创建的 ent client 在调用 Close() 时,ent 的 sql driver
会尝试将 ExecQuerier 断言为 *sql.DB 来关闭连接,但实际类型是 *sql.Tx
修复:移除对 txClient.Close() 的调用,事务的清理通过
sqlTx.Rollback() 和 sqlTx.Commit() 完成即可
影响范围:
- user_repo.go: Create 和 Update 方法
- group_repo.go: Delete 方法
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-29 15:49:20 +08:00
yangjianbo
305eaabb53
test(用户): 补齐创建用户与注册单测
...
覆盖管理员创建用户与注册流程的关键失败分支\n完善创建成功路径的断言
2025-12-29 15:22:50 +08:00
yangjianbo
f6de36cb04
test(删除): 添加删除单测并修复中间件测试
...
新增 AdminService 删除路径单元测试与规范场景更新\n同步调整 Google API Key 中间件测试桩与签名
2025-12-29 15:01:19 +08:00
yangjianbo and Claude Opus 4.5
100d9d2034
test(服务层): 添加删除方法的单元测试
...
- 新增 AccountService.Delete 方法的 4 个测试用例
- 新增 ApiKeyService.Delete 方法的 4 个测试用例
- 使用 stub 模式隔离数据库依赖,验证权限检查和缓存清理逻辑
- 添加详细的中文注释说明测试设计和预期行为
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-29 14:29:51 +08:00
yangjianbo and Claude Opus 4.5
e9c755f428
perf(后端): 优化删除操作的数据库查询性能
...
- 新增 ExistsByID 方法用于账号存在性检查,避免加载完整对象
- 新增 GetOwnerID 方法用于 API Key 所有权验证,仅查询 user_id 字段
- 优化 AccountService.Delete 使用轻量级存在性检查
- 优化 ApiKeyService.Delete 使用轻量级权限验证
- 改进前端删除错误提示,显示后端返回的具体错误消息
- 添加详细的中文注释说明优化原因
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-29 14:06:38 +08:00
yangjianbo
89b1b744f2
fix(构建): 支持配置基础镜像仓库
...
允许通过构建参数/脚本选项切换基础镜像来源,避免镜像源 403 影响构建
2025-12-29 12:00:33 +08:00
yangjianbo
bbd6236385
fix(数据库): 补充默认分组种子迁移
...
确保安装时至少存在一个默认分组
2025-12-29 11:48:19 +08:00
yangjianbo
cc4da2ae82
fix(数据库): 修复使用记录缓存列命名不一致
...
新增迁移补齐 cache_creation_5m_tokens/cache_creation_1h_tokens 列,并从旧列回填数据
2025-12-29 11:45:07 +08:00
yangjianbo and Claude Opus 4.5
b415a62bf9
feat(部署): 添加 Docker 镜像构建脚本
...
新增 build_docker.sh 脚本,支持以下功能:
- -t, --tag: 指定镜像标签 (默认: latest)
- -r, --registry: 指定镜像仓库地址
- -p, --push: 构建后推送镜像到仓库
- --no-cache: 不使用 Docker 构建缓存
自动获取 Git 版本信息并注入到构建参数中。
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-29 11:18:12 +08:00
yangjianbo and Claude Opus 4.5
8ab924ad9b
fix(构建): 删除遗留的 GORM auto_migrate.go 文件
...
该文件是 GORM 迁移到 Ent ORM 过程中遗留的,仍然导入了
gorm.io/gorm,导致 Docker 构建失败。
文件中的功能已被迁移到 SQL 迁移文件中:
- fixInvalidExpiresAt → 006_fix_invalid_subscription_expires_at.sql
- ensureDefaultGroups → 001_init.sql
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-29 11:18:00 +08:00
yangjianbo
3c3419475d
Merge branch 'main' into test-dev
2025-12-29 10:50:46 +08:00