1. 24 Apr, 2026 1 commit
  2. 21 Apr, 2026 2 commits
    • erio's avatar
      feat(channel-monitor): request templates with snapshot apply + headers/body override · a2964259
      erio authored
      Problem:
      Upstream channels can reject monitor probes based on client fingerprint
      (e.g. "only Claude Code clients allowed"). The monitor had no way to
      customize the outgoing request to bypass such restrictions.
      
      Solution:
      Introduce reusable request templates that carry extra_headers plus an
      optional body override; monitors reference a template and receive a
      snapshot copy on apply. Template edits do NOT auto-propagate — users
      must click "apply to associated monitors" to refresh snapshots, so a
      bad template edit cannot instantly break all production monitors.
      
      Data model (migration 112):
      - channel_monitor_request_templates: id, name, provider, description,
        extra_headers jsonb, body_override_mode ('off'|'merge'|'replace'),
        body_override jsonb. Unique (provider, name).
      - channel_monitors: +template_id (FK, ON DELETE SET NULL), +extra_headers,
        +body_override_mode, +body_override (the three runtime snapshot fields).
      
      Checker (channel_monitor_checker.go):
      - callProvider + runCheckForModel accept a CheckOptions carrying the
        snapshot fields. mergeHeaders applies user headers on top of adapter
        defaults (forbidden list: Host / Content-Length / Transfer-Encoding /
        Connection / Content-Encoding).
      - buildRequestBody:
          off     -> adapter default body
          merge   -> shallow-merge over default; per-provider deny list
                     (model/messages/contents) protects the challenge contract
          replace -> user body verbatim
      - Replace mode skips challenge validation; instead HTTP 2xx + non-empty
        extracted response text = operational, empty = failed.
      - 4 new unit tests cover all three modes + replace/empty-response case.
      
      Admin API:
      - /admin/channel-monitor-templates CRUD + /:id/apply (overwrite snapshot
        on all template_id=id monitors, returns affected count).
      - channel_monitor request/response DTOs gain the 4 new fields.
      
      Frontend:
      - channelMonitorTemplate.ts API client.
      - MonitorAdvancedRequestConfig.vue shared component for headers textarea
        + body mode radio + body JSON editor; used by both template and monitor
        forms.
      - MonitorTemplateManagerDialog.vue: provider tabs, list/create/edit/
        delete/apply, live "associated monitors" count per row.
      - MonitorFiltersBar: new 模板管理 button next to 新增监控.
      - MonitorFormDialog: collapsible 高级 section with template dropdown
        (filtered by form.provider, clears on provider change) + embedded
        AdvancedRequestConfig. Picking a template copies its fields into the
        form (snapshot semantics mirrored on the client).
      - i18n zh/en entries for all new copy.
      
      chore: bump version to 0.1.114.32
      a2964259
    • erio's avatar
      feat(channel-monitor): aggregate history to daily rollups + soft delete · 8cf83c98
      erio authored
      明细只保留 1 天,超过 1 天聚合到新表 channel_monitor_daily_rollups(按
      monitor_id/model/bucket_date 维度),聚合保留 30 天。两张表都用 SoftDeleteMixin
      软删除(DELETE 自动改为 UPDATE deleted_at = NOW())。
      
      聚合 + 清理任务由 OpsCleanupService 的 cron 统一调度,与运维监控的清理共享
      schedule(默认 0 2 * * *)和 leader lock。ChannelMonitorRunner 的 cleanupLoop
      被移除,只保留 dueCheckLoop。
      
      读取路径 ComputeAvailability* 改为 UNION 明细(今天 deleted_at IS NULL)+
      聚合(过去 windowDays 天 deleted_at IS NULL),SUM(ok)/SUM(total) 自然加权
      计算可用率,AVG latency 用 SUM(sum_latency_ms)/SUM(count_latency)。
      
      watermark 表 channel_monitor_aggregation_watermark 单行(id=1),记录
      last_aggregated_date,重启后从该日期 +1 继续聚合,首次为 nil 则从
      today - 30d 开始回填,单次最多 35 天上限避免长事务。
      
      raw SQL 的 ListLatestPerModel / ListLatestForMonitorIDs / ListRecentHistoryForMonitors
      都补上 deleted_at IS NULL 过滤(SoftDeleteMixin interceptor 只对 ent query 生效)。
      
      bump version to 0.1.114.28
      
      GroupBadge 在 MonitorKeyPickerDialog 中复用平台主题色 + 倍率/专属倍率
      (顺手优化)。
      8cf83c98
  3. 20 Apr, 2026 2 commits
    • erio's avatar
      feat(monitor): admin channel monitor MVP with SSRF protection and batch aggregation · 20a4e418
      erio authored
      新增 admin「渠道监控」模块(参考 BingZi-233/check-cx),独立于现有 Channel 体系。
      admin 配置 + 后台定时调用上游 LLM chat completions 健康检查 + 所有登录用户只读可见。
      
      后端:
      - ent: channel_monitor + channel_monitor_history(AES-256-GCM 加密 api_key)
      - service 按职责拆分:service/aggregator/validate/checker/runner/ssrf
      - provider strategy map 替代 switch(openai/anthropic/gemini)
      - repository batch 聚合(ListLatestForMonitorIDs + ComputeAvailabilityForMonitors)消除 N+1
      - runner: ticker(5s) + pond worker pool(5) + inFlight 防并发 + TrySubmit 防雪崩
        + 凌晨 3 点 cron 清理 30 天历史
      - SSRF 防护:强制 https + 私网/loopback/云元数据 IP 拒绝(127/8、10/8、172.16/12、
        192.168/16、169.254/16、100.64/10、::1、fc00::/7、fe80::/10)+ DialContext
        在 socket 层防 DNS rebinding
      - API key sanitize:擦除 url.Error 与上游响应 body 中的 sk-/sk-ant-/AIza/JWT 模式
      - APIKeyDecryptFailed 标志位 + 单 monitor 路径检测,避免空 key 调用上游
      
      handler:
      - admin: CRUD + 手动触发 + 历史接口(api_key 脱敏)
      - user: 只读列表 + 状态详情(去除 api_key/endpoint)
      - ParseChannelMonitorID 共用 + dto.ChannelMonitorExtraModelStatus 共用
      
      前端:
      - 路由 /admin/channels/{pricing,monitor} + /monitor(用户只读)
      - AppSidebar 父项 expandOnly 支持
      - ChannelMonitorView 拆为 8 个子组件 + ChannelStatusView 拆出 detail dialog
      - composables/useChannelMonitorFormat + constants/channelMonitor 共享
      - i18n monitorCommon namespace 消除 admin/user 两 view 重复
      
      合规:所有文件符合 CLAUDE.md(Go ≤ 500 行 / Vue ≤ 300 行 / 函数 ≤ 30 行)
      CI: go build / gofmt / golangci-lint(0 issues) / make test-unit / pnpm build 全绿
      20a4e418
    • IanShaw027's avatar
      feat: rebuild auth identity foundation flow · e9de839d
      IanShaw027 authored
      e9de839d
  4. 14 Apr, 2026 2 commits
    • erio's avatar
      feat: add per-provider allow_user_refund control and align wildcard matching · f1297a36
      erio authored
      allow_user_refund:
      - Add allow_user_refund field to PaymentProviderInstance ent schema
      - Migration 103: ALTER TABLE payment_provider_instances ADD COLUMN
      - Cascade logic: disabling refund_enabled auto-disables allow_user_refund
      - User refund validation: check provider instance allows user refund
      - Admin refund validation: check provider instance allows admin refund
      - Subscription refund: deduct days on refund, rollback on failure
      - New endpoint: GET /payment/orders/refund-eligible-providers
      - Frontend: ToggleSwitch in ProviderCard/Dialog, cascade in SettingsView
      
      Wildcard matching:
      - Change findPricingForModel from "longest prefix wins" to "config order
        priority (first match wins)", aligning with channel service behavior
      f1297a36
    • erio's avatar
      refactor: remove PaymentChannel, reuse upstream Channel with features field · 794e8172
      erio authored
      - Delete payment_channels table and PaymentChannel Ent schema
      - Add `features` column to upstream channels table (migration 095)
      - Add Features field to Channel struct, input types, handler request/response
      - Payment user/admin handlers now use ChannelService directly
      - Remove Channel CRUD from PaymentConfigService and admin payment routes
      - Remove "渠道管理" tab from admin orders page (use /admin/channels)
      794e8172
  5. 11 Apr, 2026 1 commit
  6. 29 Mar, 2026 1 commit
    • shaw's avatar
      feat(tls-fingerprint): 新增 TLS 指纹 Profile 数据库管理及代码质量优化 · b22ab6ad
      shaw authored and 陈曦's avatar 陈曦 committed
      新增功能:
      - 新增 TLS 指纹 Profile CRUD 管理(Ent schema + 迁移 + Admin API + 前端管理界面)
      - 支持账号绑定数据库中的自定义 TLS Profile,或随机选择(profile_id=-1)
      - HTTPUpstream.DoWithTLS 接口从 bool 改为 *tlsfingerprint.Profile,支持按账号指定 Profile
      - AccountUsageService 注入 TLSFingerprintProfileService,统一 usage 场景与网关的 Profile 解析逻辑
      
      代码优化:
      - 删除已被 TLSFingerprintProfileService 完全取代的 registry.go 死代码(418 行)
      - 提取 3 个 dialer 的重复 TLS 握手逻辑为 performTLSHandshake() 共用函数
      - 修复 GetTLSFingerprintProfileID 缺少 json.Number 处理的 bug
      - gateway_service.Forward 中 ResolveTLSProfile 从重试循环内重复调用改为预解析局部变量
      - 删除冗余的 buildClientHelloSpec() 单行 wrapper 和 int64(e.ID) 无效转换
      - tls_fingerprint_profile_cache.go 日志从 log.Printf 改为 slog 结构化日志
      - dialer_capture_test.go 添加 //go:build integration 标签,防止 CI 失败
      - 去重 TestProfileExpectation 类型至共享 test_types_test.go
      - 修复 9 个测试文件缺少 tlsfingerprint import 的编译错误
      - 修复 error_policy_integration_test.go 中 handleError 回调签名被错误替换的问题
      b22ab6ad
  7. 27 Mar, 2026 1 commit
    • shaw's avatar
      feat(tls-fingerprint): 新增 TLS 指纹 Profile 数据库管理及代码质量优化 · 1854050d
      shaw authored
      新增功能:
      - 新增 TLS 指纹 Profile CRUD 管理(Ent schema + 迁移 + Admin API + 前端管理界面)
      - 支持账号绑定数据库中的自定义 TLS Profile,或随机选择(profile_id=-1)
      - HTTPUpstream.DoWithTLS 接口从 bool 改为 *tlsfingerprint.Profile,支持按账号指定 Profile
      - AccountUsageService 注入 TLSFingerprintProfileService,统一 usage 场景与网关的 Profile 解析逻辑
      
      代码优化:
      - 删除已被 TLSFingerprintProfileService 完全取代的 registry.go 死代码(418 行)
      - 提取 3 个 dialer 的重复 TLS 握手逻辑为 performTLSHandshake() 共用函数
      - 修复 GetTLSFingerprintProfileID 缺少 json.Number 处理的 bug
      - gateway_service.Forward 中 ResolveTLSProfile 从重试循环内重复调用改为预解析局部变量
      - 删除冗余的 buildClientHelloSpec() 单行 wrapper 和 int64(e.ID) 无效转换
      - tls_fingerprint_profile_cache.go 日志从 log.Printf 改为 slog 结构化日志
      - dialer_capture_test.go 添加 //go:build integration 标签,防止 CI 失败
      - 去重 TestProfileExpectation 类型至共享 test_types_test.go
      - 修复 9 个测试文件缺少 tlsfingerprint import 的编译错误
      - 修复 error_policy_integration_test.go 中 handleError 回调签名被错误替换的问题
      1854050d
  8. 28 Feb, 2026 1 commit
  9. 12 Feb, 2026 1 commit
  10. 05 Feb, 2026 1 commit
    • shaw's avatar
      feat: 新增全局错误透传规则功能 · 39e05a2d
      shaw authored
      支持管理员配置上游错误如何返回给客户端:
      - 新增 ErrorPassthroughRule 数据模型和 Ent Schema
      - 实现规则的 CRUD API(/admin/error-passthrough-rules)
      - 支持按错误码、关键词匹配,支持 any/all 匹配模式
      - 支持按平台过滤(anthropic/openai/gemini/antigravity)
      - 支持透传或自定义响应状态码和错误消息
      - 实现两级缓存(Redis + 本地内存)和多实例同步
      - 集成到 gateway_handler 的错误处理流程
      - 新增前端管理界面组件
      - 新增单元测试覆盖核心匹配逻辑
      
      优化:
      - 移除 refreshLocalCache 中的冗余排序(数据库已排序)
      - 后端 Validate() 增加匹配条件非空校验
      39e05a2d
  11. 02 Feb, 2026 1 commit
  12. 30 Jan, 2026 1 commit
    • ducky's avatar
      feat(announcements): add admin/user announcement system · b7f69844
      ducky authored
      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.
      b7f69844
  13. 29 Jan, 2026 1 commit
    • yangjianbo's avatar
      feat(sora): 新增 Sora 平台支持并修复高危安全和性能问题 · 13262a56
      yangjianbo authored
      
      
      新增功能:
      - 新增 Sora 账号管理和 OAuth 认证
      - 新增 Sora 视频/图片生成 API 网关
      - 新增 Sora 任务调度和缓存机制
      - 新增 Sora 使用统计和计费支持
      - 前端增加 Sora 平台配置界面
      
      安全修复(代码审核):
      - [SEC-001] 限制媒体下载响应体大小(图片 20MB、视频 200MB),防止 DoS 攻击
      - [SEC-002] 限制 SDK API 响应大小(1MB),防止内存耗尽
      - [SEC-003] 修复 SSRF 风险,添加 URL 验证并强制使用代理配置
      
      BUG 修复(代码审核):
      - [BUG-001] 修复 for 循环内 defer 累积导致的资源泄漏
      - [BUG-002] 修复图片并发槽位获取失败时已持有锁未释放的永久泄漏
      
      性能优化(代码审核):
      - [PERF-001] 添加 Sentinel Token 缓存(3 分钟有效期),减少 PoW 计算开销
      
      技术细节:
      - 使用 io.LimitReader 限制所有外部输入的大小
      - 添加 urlvalidator 验证防止 SSRF 攻击
      - 使用 sync.Map 实现线程安全的包级缓存
      - 优化并发槽位管理,添加 releaseAll 模式防止泄漏
      
      影响范围:
      - 后端:新增 Sora 相关数据模型、服务、网关和管理接口
      - 前端:新增 Sora 平台配置、账号管理和监控界面
      - 配置:新增 Sora 相关配置项和环境变量
      Co-Authored-By: default avatarClaude Sonnet 4.5 <noreply@anthropic.com>
      13262a56
  14. 18 Jan, 2026 1 commit
  15. 10 Jan, 2026 1 commit
    • long's avatar
      feat: 实现注册优惠码功能 · d2fc14fb
      long authored
        - 支持创建/编辑/删除优惠码,设置赠送金额和使用限制
        - 注册页面实时验证优惠码并显示赠送金额
        - 支持 URL 参数自动填充 (?promo=CODE)
        - 添加优惠码验证接口速率限制
        - 使用数据库行锁防止并发超限
        - 新增后台优惠码管理页面,支持复制注册链接
      d2fc14fb
  16. 04 Jan, 2026 1 commit
    • IanShaw027's avatar
      fix(lint): 修复所有 Go 命名规范问题 · a4953785
      IanShaw027 authored
      - 全局替换 ApiKey → APIKey(类型、字段、方法、变量)
      - 修复所有 initialism 命名(API, SMTP, HTML, URL 等)
      - 添加所有缺失的包注释
      - 修复导出符号的注释格式
      
      主要修改:
      - ApiKey → APIKey(所有出现的地方)
      - ApiKeyID → APIKeyID
      - ApiKeyIDs → APIKeyIDs
      - TestSmtpConnection → TestSMTPConnection
      - HtmlURL → HTMLURL
      - 添加 20+ 个包注释
      - 修复 10+ 个导出符号注释格式
      
      验证结果:
      - ✓ golangci-lint: 0 issues
      - ✓ 单元测试: 通过
      - ✓ 集成测试: 通过
      a4953785
  17. 03 Jan, 2026 1 commit
    • ianshaw's avatar
      chore: 更新依赖、配置和代码生成 · 112a2d08
      ianshaw authored
      主要更新:
      - 更新 go.mod/go.sum 依赖
      - 重新生成 Ent ORM 代码
      - 更新 Wire 依赖注入配置
      - 添加 docker-compose.override.yml 到 .gitignore
      - 更新 README 文档(Simple Mode 说明和已知问题)
      - 清理调试日志
      - 其他代码优化和格式修复
      112a2d08
  18. 02 Jan, 2026 1 commit
    • IanShaw's avatar
      运维监控系统安全加固和功能优化 (#21) · 45bd9ac7
      IanShaw authored
      * fix(ops): 修复运维监控系统的关键安全和稳定性问题
      
      ## 修复内容
      
      ### P0 严重问题
      1. **DNS Rebinding防护** (ops_alert_service.go)
         - 实现IP钉住机制防止验证后的DNS rebinding攻击
         - 自定义Transport.DialContext强制只允许拨号到验证过的公网IP
         - 扩展IP黑名单,包括云metadata地址(169.254.169.254)
         - 添加完整的单元测试覆盖
      
      2. **OpsAlertService生命周期管理** (wire.go)
         - 在ProvideOpsMetricsCollector中添加opsAlertService.Start()调用
         - 确保stopCtx正确初始化,避免nil指针问题
         - 实现防御式启动,保证服务启动顺序
      
      3. **数据库查询排序** (ops_repo.go)
         - 在ListRecentSystemMetrics中添加显式ORDER BY updated_at DESC, id DESC
         - 在GetLatestSystemMetric中添加排序保证
         - 避免数据库返回顺序不确定导致告警误判
      
      ### P1 重要问题
      4. **并发安全** (ops_metrics_collector.go)
         - 为lastGCPauseTotal字段添加sync.Mutex保护
         - 防止数据竞争
      
      5. **Goroutine泄漏** (ops_error_logger.go)
         - 实现worker pool模式限制并发goroutine数量
         - 使用256容量缓冲队列和10个固定worker
         - 非阻塞投递,队列满时丢弃任务
      
      6. **生命周期控制** (ops_alert_service.go)
         - 添加Start/Stop方法实现优雅关闭
         - 使用context控制goroutine生命周期
         - 实现WaitGroup等待后台任务完成
      
      7. **Webhook URL验证** (ops_alert_service.go)
         - 防止SSRF攻击:验证scheme、禁止内网IP
         - DNS解析验证,拒绝解析到私有IP的域名
         - 添加8个单元测试覆盖各种攻击场景
      
      8. **资源泄漏** (ops_repo.go)
         - 修复多处defer rows.Close()问题
         - 简化冗余的defer func()包装
      
      9. **HTTP超时控制** (ops_alert_service.go)
         - 创建带10秒超时的http.Client
         - 添加buildWebhookHTTPClient辅助函数
         - 防止HTTP请求无限期挂起
      
      10. **数据库查询优化** (ops_repo.go)
          - 将GetWindowStats的4次独立查询合并为1次CTE查询
          - 减少网络往返和表扫描次数
          - 显著提升性能
      
      11. **重试机制** (ops_alert_service.go)
          - 实现邮件发送重试:最多3次,指数退避(1s/2s/4s)
          - 添加webhook备用通道
          - 实现完整的错误处理和日志记录
      
      12. **魔法数字** (ops_repo.go, ops_metrics_collector.go)
          - 提取硬编码数字为有意义的常量
          - 提高代码可读性和可维护性
      
      ## 测试验证
      -  go test ./internal/service -tags opsalert_unit 通过
      -  所有webhook验证测试通过
      -  重试机制测试通过
      
      ## 影响范围
      - 运维监控系统安全性显著提升
      - 系统稳定性和性能优化
      - 无破坏性变更,向后兼容
      
      * feat(ops): 运维监控系统V2 - 完整实现
      
      ## 核心功能
      - 运维监控仪表盘V2(实时监控、历史趋势、告警管理)
      - WebSocket实时QPS/TPS监控(30s心跳,自动重连)
      - 系统指标采集(CPU、内存、延迟、错误率等)
      - 多维度统计分析(按provider、model、user等维度)
      - 告警规则管理(阈值配置、通知渠道)
      - 错误日志追踪(详细错误信息、堆栈跟踪)
      
      ## 数据库Schema (Migration 025)
      ### 扩展现有表
      - ops_system_metrics: 新增RED指标、错误分类、延迟指标、资源指标、业务指标
      - ops_alert_rules: 新增JSONB字段(dimension_filters, notify_channels, notify_config)
      
      ### 新增表
      - ops_dimension_stats: 多维度统计数据
      - ops_data_retention_config: 数据保留策略配置
      
      ### 新增视图和函数
      - ops_latest_metrics: 最新1分钟窗口指标(已修复字段名和window过滤)
      - ops_active_alerts: 当前活跃告警(已修复字段名和状态值)
      - calculate_health_score: 健康分数计算函数
      
      ## 一致性修复(98/100分)
      ### P0级别(阻塞Migration)
      -  修复ops_latest_metrics视图字段名(latency_p99→p99_latency_ms, cpu_usage→cpu_usage_percent)
      -  修复ops_active_alerts视图字段名(metric→metric_type, triggered_at→fired_at, trigger_value→metric_value, threshold→threshold_value)
      -  统一告警历史表名(删除ops_alert_history,使用ops_alert_events)
      -  统一API参数限制(ListMetricsHistory和ListErrorLogs的limit改为5000)
      
      ### P1级别(功能完整性)
      -  修复ops_latest_metrics视图未过滤window_minutes(添加WHERE m.window_minutes = 1)
      -  修复数据回填UPDATE逻辑(QPS计算改为request_count/(window_minutes*60.0))
      -  添加ops_alert_rules JSONB字段后端支持(Go结构体+序列化)
      
      ### P2级别(优化)
      -  前端WebSocket自动重连(指数退避1s→2s→4s→8s→16s,最大5次)
      -  后端WebSocket心跳检测(30s ping,60s pong超时)
      
      ## 技术实现
      ### 后端 (Go)
      - Handler层: ops_handler.go(REST API), ops_ws_handler.go(WebSocket)
      - Service层: ops_service.go(核心逻辑), ops_cache.go(缓存), ops_alerts.go(告警)
      - Repository层: ops_repo.go(数据访问), ops.go(模型定义)
      - 路由: admin.go(新增ops相关路由)
      - 依赖注入: wire_gen.go(自动生成)
      
      ### 前端 (Vue3 + TypeScript)
      - 组件: OpsDashboardV2.vue(仪表盘主组件)
      - API: ops.ts(REST API + WebSocket封装)
      - 路由: index.ts(新增/admin/ops路由)
      - 国际化: en.ts, zh.ts(中英文支持)
      
      ## 测试验证
      -  所有Go测试通过
      -  Migration可正常执行
      -  WebSocket连接稳定
      -  前后端数据结构对齐
      
      * refactor: 代码清理和测试优化
      
      ## 测试文件优化
      - 简化integration test fixtures和断言
      - 优化test helper函数
      - 统一测试数据格式
      
      ## 代码清理
      - 移除未使用的代码和注释
      - 简化concurrency_cache实现
      - 优化middleware错误处理
      
      ## 小修复
      - 修复gateway_handler和openai_gateway_handler的小问题
      - 统一代码风格和格式
      
      变更统计: 27个文件,292行新增,322行删除(净减少30行)
      
      * fix(ops): 运维监控系统安全加固和功能优化
      
      ## 安全增强
      - feat(security): WebSocket日志脱敏机制,防止token/api_key泄露
      - feat(security): X-Forwarded-Host白名单验证,防止CSRF绕过
      - feat(security): Origin策略配置化,支持strict/permissive模式
      - feat(auth): WebSocket认证支持query参数传递token
      
      ## 配置优化
      - feat(config): 支持环境变量配置代理信任和Origin策略
        - OPS_WS_TRUST_PROXY
        - OPS_WS_TRUSTED_PROXIES
        - OPS_WS_ORIGIN_POLICY
      - fix(ops): 错误日志查询限流从5000降至500,优化内存使用
      
      ## 架构改进
      - refactor(ops): 告警服务解耦,独立运行评估定时器
      - refactor(ops): OpsDashboard统一版本,移除V2分离
      
      ## 测试和文档
      - test(ops): 添加WebSocket安全验证单元测试(8个测试用例)
      - test(ops): 添加告警服务集成测试
      - docs(api): 更新API文档,标注限流变更
      - docs: 添加CHANGELOG记录breaking changes
      
      ## 修复文件
      Backend:
      - backend/internal/server/middleware/logger.go
      - backend/internal/handler/admin/ops_handler.go
      - backend/internal/handler/admin/ops_ws_handler.go
      - backend/internal/server/middleware/admin_auth.go
      - backend/internal/service/ops_alert_service.go
      - backend/internal/service/ops_metrics_collector.go
      - backend/internal/service/wire.go
      
      Frontend:
      - frontend/src/views/admin/ops/OpsDashboard.vue
      - frontend/src/router/index.ts
      - frontend/src/api/admin/ops.ts
      
      Tests:
      - backend/internal/handler/admin/ops_ws_handler_test.go (新增)
      - backend/internal/service/ops_alert_service_integration_test.go (新增)
      
      Docs:
      - CHANGELOG.md (新增)
      - docs/API-运维监控中心2.0.md (更新)
      
      * fix(migrations): 修复calculate_health_score函数类型匹配问题
      
      在ops_latest_metrics视图中添加显式类型转换,确保参数类型与函数签名匹配
      
      * fix(lint): 修复golangci-lint检查发现的所有问题
      
      - 将Redis依赖从service层移到repository层
      - 添加错误检查(WebSocket连接和读取超时)
      - 运行gofmt格式化代码
      - 添加nil指针检查
      - 删除未使用的alertService字段
      
      修复问题:
      - depguard: 3个(service层不应直接import redis)
      - errcheck: 3个(未检查错误返回值)
      - gofmt: 2个(代码格式问题)
      - staticcheck: 4个(nil指针解引用)
      - unused: 1个(未使用字段)
      
      代码统计:
      - 修改文件:11个
      - 删除代码:490行
      - 新增代码:105行
      - 净减少:385行
      45bd9ac7
  19. 01 Jan, 2026 1 commit
    • Edric Li's avatar
      feat(backend): add user custom attributes system · 3c3fed88
      Edric Li authored
      Add a flexible user attribute system that allows admins to define
      custom fields for users (text, textarea, number, email, url, date,
      select, multi_select types).
      
      - Add Ent schemas for UserAttributeDefinition and UserAttributeValue
      - Add service layer with validation logic
      - Add repository layer with batch operations support
      - Add admin API endpoints for CRUD and reorder operations
      - Add batch API for loading attribute values for multiple users
      - Add database migration (018_user_attributes.sql)
      
      🤖 Generated with [Claude Code](https://claude.com/claude-code
      
      )
      Co-Authored-By: default avatarClaude Opus 4.5 <noreply@anthropic.com>
      3c3fed88
  20. 31 Dec, 2025 1 commit
    • yangjianbo's avatar
      fix(数据层): 修复数据完整性与仓储一致性问题 · 5906f9ab
      yangjianbo authored
      ## 数据完整性修复 (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: default avatarClaude Opus 4.5 <noreply@anthropic.com>
      5906f9ab
  21. 29 Dec, 2025 1 commit
    • yangjianbo's avatar
      refactor(数据库): 迁移持久层到 Ent 并清理 GORM · 3d617de5
      yangjianbo authored
      将仓储层/基础设施改为 Ent + 原生 SQL 执行路径,并移除 AutoMigrate 与 GORM 依赖。
      重构内容包括:
      - 仓储层改用 Ent/SQL(含 usage_log/account 等复杂查询),统一错误映射
      - 基础设施与 setup 初始化切换为 Ent + SQL migrations
      - 集成测试与 fixtures 迁移到 Ent 事务模型
      - 清理遗留 GORM 模型/依赖,补充迁移与文档说明
      - 增加根目录 Makefile 便于前后端编译
      
      测试:
      - go test -tags unit ./...
      - go test -tags integration ./...
      3d617de5