M3 收尾: 限流/配额 + 前端骨架屏 + 单端口托管前端

- ratelimit(内存计数): 密钥级每日请求数/Token 配额、用户级每秒速率
  (OT_RATELIMIT_USER_RPS), 超限返回 429
- 网关 Auth 前置配额/限流检查, finishUsage 累计密钥 token 用量
- 前端 Skeleton 组件 + Dashboard/管理总览加载态
- Go 服务托管 web/dist 静态资源(SPA 回退), 单端口即可访问前后端

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Sakurasan
2026-08-15 16:13:09 +08:00
co-authored by Claude
parent 0637ce0a51
commit 4846db9293
14 changed files with 303 additions and 34 deletions
+18 -7
View File
@@ -11,13 +11,19 @@ import (
)
type Config struct {
Env string // development | production
Port int
DB DBConfig
JWT JWTConfig
Auth AuthConfig
Proxy ProxyConfig
Master string // 渠道密钥 AES-GCM 主密钥(来自环境变量)
Env string // development | production
Port int
DB DBConfig
JWT JWTConfig
Auth AuthConfig
Proxy ProxyConfig
RateLimit RateLimitConfig
Master string // 渠道密钥 AES-GCM 主密钥(来自环境变量)
}
// RateLimitConfig 限流参数(MVP 内存计数,Redis 后置)。
type RateLimitConfig struct {
UserRPS int // 用户级每秒请求数上限(0=不限制)
}
type DBConfig struct {
@@ -116,6 +122,8 @@ func Load() (*Config, error) {
v.SetDefault("proxy.health_interval", "60s")
v.SetDefault("proxy.health_fail_threshold", 2)
v.SetDefault("ratelimit.user_rps", 20)
return &Config{
Env: v.GetString("env"),
Port: v.GetInt("port"),
@@ -149,6 +157,9 @@ func Load() (*Config, error) {
HealthInterval: v.GetDuration("proxy.health_interval"),
HealthFailThreshold: v.GetInt("proxy.health_fail_threshold"),
},
RateLimit: RateLimitConfig{
UserRPS: v.GetInt("ratelimit.user_rps"),
},
Master: v.GetString("master_key"),
}, nil
}