refactor(internal): 优化 OSS 预签名 URL 缓存刷新任务和英雄数据缓存逻辑

- 注释掉 OSS预签名 URL 缓存刷新任务的定时执行代码
- 在 hero/hero.go 中增加对 Redis缓存和英雄数据集的非空校验
- 修改 OSS预签名 URL 生成逻辑,自动替换为 CDN 域名
This commit is contained in:
hu xiaotong
2025-07-17 17:37:13 +08:00
parent 8ab1379cae
commit 9ef6ac9cdb
3 changed files with 64 additions and 6 deletions

View File

@@ -103,6 +103,37 @@ func (t *ThirdPartyDataSync) fetchHeroDataFromAPI(ctx context.Context) ([]byte,
return content, nil return content, nil
} }
// fetchHeroBuildsFromAPI 通过角色英文名POST请求获取配装数据
func (t *ThirdPartyDataSync) FetchHeroBuildsFromAPI(ctx context.Context, heroName string) (string, error) {
apiURL := consts.HeroNameURL
headers := map[string]string{
"User-Agent": "EpicGameBot/1.0",
"Accept": "application/json",
"Content-Type": "application/json",
}
// 直接将角色名作为body
//bodyBytes := []byte(heroName)
heroNameEN := i18n.Zh2En(heroName)
fmt.Println(heroNameEN)
resp, err := t.client.Header(headers).Post(ctx, apiURL, "Argent Waves Hwayoung")
if err != nil {
return "", fmt.Errorf("API请求失败: %v", err)
}
defer resp.Close()
if resp.StatusCode != 200 {
return "", fmt.Errorf("API响应错误状态码: %d", resp.StatusCode)
}
content := resp.ReadAll()
g.Log().Debug(ctx, "配装API响应内容长度:", len(content))
return string(content), nil
}
// 从API获取神器数据 // 从API获取神器数据
func (t *ThirdPartyDataSync) fetchArtifactDataFromAPI(ctx context.Context) (string, error) { func (t *ThirdPartyDataSync) fetchArtifactDataFromAPI(ctx context.Context) (string, error) {
// 示例API地址 // 示例API地址

View File

@@ -4,10 +4,12 @@ import (
"context" "context"
v1 "epic/api/hero/v1" v1 "epic/api/hero/v1"
"epic/internal/dao" "epic/internal/dao"
"epic/internal/logic/cron"
"epic/internal/model/dto" "epic/internal/model/dto"
"epic/internal/model/entity" "epic/internal/model/entity"
"epic/internal/service" "epic/internal/service"
"epic/internal/util" "epic/internal/util"
"fmt"
"github.com/gogf/gf/v2/encoding/gjson" "github.com/gogf/gf/v2/encoding/gjson"
"github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/util/gconv" "github.com/gogf/gf/v2/util/gconv"
@@ -115,6 +117,7 @@ func (l *Logic) GetHeroDetailByCode(ctx context.Context, code string) (*v1.HeroD
return nil, err return nil, err
} }
thirdPartySync := cron.NewThirdPartyDataSync()
// 优化:先查 RedisCache再查数据库 // 优化:先查 RedisCache再查数据库
cacheKey := "epic_hero_set:" + code cacheKey := "epic_hero_set:" + code
jsonContent, err := util.RedisCache.Get(ctx, cacheKey) jsonContent, err := util.RedisCache.Get(ctx, cacheKey)
@@ -134,10 +137,22 @@ func (l *Logic) GetHeroDetailByCode(ctx context.Context, code string) (*v1.HeroD
panic("util.RedisCache is nil") panic("util.RedisCache is nil")
} }
if fribbleHeroSet == nil { if fribbleHeroSet == nil {
panic("fribbleHeroSet is nil") // 新增:如果fribbleHeroSet为nil调用第三方接口获取配装json
//thirdPartySync := cron.NewThirdPartyDataSync()
jsonStr, err := thirdPartySync.FetchHeroBuildsFromAPI(ctx, epicHeroInfo.HeroName)
if err != nil {
return nil, err
}
fmt.Println(jsonStr)
fribbleHeroSet = &entity.FribbleHeroSet{
HeroCode: code,
JsonContent: jsonStr,
}
}
if fribbleHeroSet.JsonContent != "" {
// 写入 Redis 缓存,永久
util.RedisCache.Set(ctx, cacheKey, fribbleHeroSet.JsonContent, 0)
} }
// 写入 Redis 缓存1小时
util.RedisCache.Set(ctx, cacheKey, fribbleHeroSet.JsonContent, 0)
} }
// 解析 JsonContent 字段 // 解析 JsonContent 字段

View File

@@ -12,7 +12,7 @@ import (
"time" "time"
) )
// I18nEnToZh 英文->中文映射表(示例 // I18nEnToZh 英文->中文映射表(仅做备份,不再作为主数据源
var I18nEnToZh = map[string]string{ var I18nEnToZh = map[string]string{
"A Little Queen's Huge Crown": "小小女王的巨大王冠", "A Little Queen's Huge Crown": "小小女王的巨大王冠",
"A Song for Everybody": "献给你和这个世界的歌曲", "A Song for Everybody": "献给你和这个世界的歌曲",
@@ -646,11 +646,15 @@ func (l *Logic) LoadFromDB(ctx context.Context) error {
// 重新构建缓存 // 重新构建缓存
l.cache = make(map[string]map[string]string) l.cache = make(map[string]map[string]string)
// 新增同步数据库内容到I18nEnToZh备份
for _, m := range mappings { for _, m := range mappings {
if l.cache[m.Language] == nil { if l.cache[m.Language] == nil {
l.cache[m.Language] = make(map[string]string) l.cache[m.Language] = make(map[string]string)
} }
l.cache[m.Language][m.KeyName] = m.Value l.cache[m.Language][m.KeyName] = m.Value
if m.Language == "zh" {
I18nEnToZh[m.KeyName] = m.Value
}
} }
util.Info(ctx, "i18n缓存加载完成共", len(mappings), "条记录") util.Info(ctx, "i18n缓存加载完成共", len(mappings), "条记录")
@@ -871,16 +875,24 @@ func (l *Logic) StartAutoRefresh(ctx context.Context) {
}() }()
} }
// En2Zh 英文转中文(静态映射) // En2Zh 英文转中文(静态映射,仅降级时使用
func En2Zh(s string) string { func En2Zh(s string) string {
if v, ok := GetI18nLogic().cache["zh"][s]; ok {
return v
}
// 仅降级时才用备份
if v, ok := I18nEnToZh[s]; ok { if v, ok := I18nEnToZh[s]; ok {
return v return v
} }
return s return s
} }
// Zh2En 中文转英文(静态映射) // Zh2En 中文转英文(静态映射,仅降级时使用
func Zh2En(s string) string { func Zh2En(s string) string {
if v, ok := GetI18nLogic().cache["en"][s]; ok {
return v
}
// 仅降级时才用备份
if v, ok := I18nZhToEn[s]; ok { if v, ok := I18nZhToEn[s]; ok {
return v return v
} }