fix(rock): 上游地址改为以数据库配置为准,并消除 baseURL 数据竞争

GetConfig 从不把 rock_configs.base_url 回写到客户端,main.go 又硬编码了
https://0666.pro,导致后台改上游地址「保存那一刻生效、进程重启后失效」,
数据库里的值被静默忽略且无任何提示。

- 新增 model.RockDefaultBaseURL 统一默认值来源
- 新增 RockService.ApplyConfigToClient,启动时把 DB 地址同步到客户端
- UpdateConfig 改用 client.SetBaseURL 立即生效,不再直接写字段
- RockClient.baseURL 原为裸字段,被 HTTP 请求线程与库存巡检 goroutine 并发
  读写(数据竞争),改为 sync.RWMutex 保护并新增 BaseURL/SetBaseURL
- ClaimTokens/RefreshToken/RedeemSkin 的 Origin/Referer 跟随配置地址
- 空值回落默认地址,末尾斜杠自动裁剪

为保持该提交可编译,同一次改动把 rock_service.go(1177 行)按域拆分为
8 个文件(最大 221 行):rock_service / rock_bindlink / rock_stock /
rock_assign / rock_bindcheck / rock_redeem / rock_recover / rock_snapshot。
35 个声明块全部有归属,无遗漏无重复;迁移文件 012 受 checksum 保护故未改动。

验证:TestRockServiceBaseURLFromConfig 覆盖「改地址→立即生效→重启→仍生效」;
并发用例在 -race 下通过;全量测试通过。
This commit is contained in:
yml2213
2026-10-06 19:42:58 +08:00
parent d423fc652c
commit 80e2bbf875
12 changed files with 1242 additions and 982 deletions
+11 -2
View File
@@ -6,6 +6,15 @@ import (
// Rock 相关常量
const (
// RockDefaultBaseURL 是 Rock 上游平台的默认地址,只作为「初始值 / 兜底值」。
// 运行期一律以 rock_configs.base_url 为准:启动时由
// RockService.ApplyConfigToClient 同步到 HTTP 客户端,否则后台改过的地址
// 会在进程重启后失效。
//
// 注意:迁移文件 012_rock_fulfillment.sql 中的默认值受 checksum 保护,
// 不能为了统一而修改它,否则已有部署会因 checksum mismatch 启动失败。
RockDefaultBaseURL = "https://0666.pro"
RockColorBlack = "black"
RockColorBlue = "blue"
@@ -26,8 +35,8 @@ const (
// RockConfig 平台配置项
type RockConfig struct {
ID uint `gorm:"primaryKey;default:1" json:"id"`
AutoDeliveryEnabled bool `gorm:"not null;default:true" json:"auto_delivery_enabled"` // 全局自动发货总开关
BaseURL string `gorm:"size:255;not null;default:'https://0666.pro'" json:"base_url"`
AutoDeliveryEnabled bool `gorm:"not null;default:true" json:"auto_delivery_enabled"` // 全局自动发货总开关
BaseURL string `gorm:"size:255;not null;default:'https://0666.pro'" json:"base_url"` // 默认值见 RockDefaultBaseURL
BearerToken string `gorm:"type:text;not null;default:''" json:"bearer_token"`
Username string `gorm:"size:128;not null;default:''" json:"username"`
Points float64 `gorm:"type:numeric(12,2);not null;default:0.00" json:"points"`