feat(hero): 英雄详情页面增加套装和神器统计功能
- 新增英雄详情接口,包含60级属性、套装平均属性、套装占比、神器占比等信息- 优化数据处理逻辑,提高查询效率 - 增加缓存机制,减少数据库访问- 新增数据传输对象HeroSetData和HeroSetItem,用于处理套装数据
This commit is contained in:
@@ -148,63 +148,10 @@ func (l *Logic) GetHeroDetailByCode(ctx context.Context, code string) (*v1.HeroD
|
|||||||
allItems []dto.HeroSetItem
|
allItems []dto.HeroSetItem
|
||||||
)
|
)
|
||||||
//now := time.Now()
|
//now := time.Now()
|
||||||
setTypeNameMap := map[string]string{
|
|
||||||
"set_speed": "速度",
|
|
||||||
"set_cri": "暴击",
|
|
||||||
"set_revenge": "复仇",
|
|
||||||
"set_counter": "反击",
|
|
||||||
"set_vampire": "吸血",
|
|
||||||
"set_immune": "免疫",
|
|
||||||
"set_cri_dmg": "破灭",
|
|
||||||
"set_torrent": "激流",
|
|
||||||
"set_max_hp": "生命",
|
|
||||||
"set_penetrate": "穿透",
|
|
||||||
"set_scar": "伤口",
|
|
||||||
"set_shield": "护盾",
|
|
||||||
"set_def": "防御",
|
|
||||||
"set_acc": "命中",
|
|
||||||
"set_res": "抵抗",
|
|
||||||
}
|
|
||||||
isTwoSet := func(setType string) bool {
|
|
||||||
twoSet := map[string]struct{}{
|
|
||||||
"set_acc": {}, "set_cri": {}, "set_immune": {}, "set_torrent": {},
|
|
||||||
"set_max_hp": {}, "set_penetrate": {}, "set_def": {}, "set_res": {},
|
|
||||||
}
|
|
||||||
_, ok := twoSet[setType]
|
|
||||||
return ok
|
|
||||||
}
|
|
||||||
isFourSet := func(setType string) bool {
|
|
||||||
fourSet := map[string]struct{}{
|
|
||||||
"set_speed": {}, "set_cri_dmg": {}, "set_revenge": {}, "set_counter": {},
|
|
||||||
"set_vampire": {}, "set_scar": {}, "set_shield": {},
|
|
||||||
}
|
|
||||||
_, ok := fourSet[setType]
|
|
||||||
return ok
|
|
||||||
}
|
|
||||||
for i := range heroSetData.Data {
|
for i := range heroSetData.Data {
|
||||||
item := &heroSetData.Data[i]
|
item := &heroSetData.Data[i]
|
||||||
// 1. 解析 SetsName
|
// 1. 解析 SetsName
|
||||||
var fourNames, twoNames []string
|
item.SetsName = GetSetNames(item.Sets)
|
||||||
for setType, count := range item.Sets {
|
|
||||||
if isFourSet(setType) && count >= 4 {
|
|
||||||
if cn, ok := setTypeNameMap[setType]; ok {
|
|
||||||
fourNames = append(fourNames, cn)
|
|
||||||
} else {
|
|
||||||
fourNames = append(fourNames, setType)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for setType, count := range item.Sets {
|
|
||||||
if isTwoSet(setType) && count >= 2 {
|
|
||||||
if cn, ok := setTypeNameMap[setType]; ok {
|
|
||||||
twoNames = append(twoNames, cn)
|
|
||||||
} else {
|
|
||||||
twoNames = append(twoNames, setType)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
allNames := append(fourNames, twoNames...)
|
|
||||||
item.SetsName = strings.Join(allNames, ",")
|
|
||||||
// 2. 累加属性
|
// 2. 累加属性
|
||||||
totalCp += item.Gs
|
totalCp += item.Gs
|
||||||
totalAtk += item.Atk
|
totalAtk += item.Atk
|
||||||
@@ -420,8 +367,8 @@ func (l *Logic) GetHeroDetailByCode(ctx context.Context, code string) (*v1.HeroD
|
|||||||
Dac: 0,
|
Dac: 0,
|
||||||
Eff: float64(item.Eff),
|
Eff: float64(item.Eff),
|
||||||
Efr: float64(item.Efr),
|
Efr: float64(item.Efr),
|
||||||
Hds: "",
|
Hds: GetSetNames(item.Sets),
|
||||||
Ctr: "",
|
Ctr: item.CreateDate,
|
||||||
ArfName: func() string {
|
ArfName: func() string {
|
||||||
info := artifactInfoMap[item.ArtifactCode]
|
info := artifactInfoMap[item.ArtifactCode]
|
||||||
if info != nil {
|
if info != nil {
|
||||||
@@ -465,3 +412,64 @@ func (l *Logic) ClearHeroCache(ctx context.Context, code string) error {
|
|||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 公用套装名称映射和判断
|
||||||
|
var setTypeNameMap = map[string]string{
|
||||||
|
"set_speed": "速度",
|
||||||
|
"set_cri": "暴击",
|
||||||
|
"set_revenge": "复仇",
|
||||||
|
"set_counter": "反击",
|
||||||
|
"set_vampire": "吸血",
|
||||||
|
"set_immune": "免疫",
|
||||||
|
"set_cri_dmg": "破灭",
|
||||||
|
"set_torrent": "激流",
|
||||||
|
"set_max_hp": "生命",
|
||||||
|
"set_penetrate": "穿透",
|
||||||
|
"set_scar": "伤口",
|
||||||
|
"set_shield": "护盾",
|
||||||
|
"set_def": "防御",
|
||||||
|
"set_acc": "命中",
|
||||||
|
"set_res": "抵抗",
|
||||||
|
}
|
||||||
|
|
||||||
|
func isTwoSet(setType string) bool {
|
||||||
|
twoSet := map[string]struct{}{
|
||||||
|
"set_acc": {}, "set_cri": {}, "set_immune": {}, "set_torrent": {},
|
||||||
|
"set_max_hp": {}, "set_penetrate": {}, "set_def": {}, "set_res": {},
|
||||||
|
}
|
||||||
|
_, ok := twoSet[setType]
|
||||||
|
return ok
|
||||||
|
}
|
||||||
|
func isFourSet(setType string) bool {
|
||||||
|
fourSet := map[string]struct{}{
|
||||||
|
"set_speed": {}, "set_cri_dmg": {}, "set_revenge": {}, "set_counter": {},
|
||||||
|
"set_vampire": {}, "set_scar": {}, "set_shield": {},
|
||||||
|
}
|
||||||
|
_, ok := fourSet[setType]
|
||||||
|
return ok
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetSetNames 公用方法:根据套装 map 生成套装中文名
|
||||||
|
func GetSetNames(sets map[string]int) string {
|
||||||
|
var fourNames, twoNames []string
|
||||||
|
for setType, count := range sets {
|
||||||
|
if isFourSet(setType) && count >= 4 {
|
||||||
|
if cn, ok := setTypeNameMap[setType]; ok {
|
||||||
|
fourNames = append(fourNames, cn)
|
||||||
|
} else {
|
||||||
|
fourNames = append(fourNames, setType)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for setType, count := range sets {
|
||||||
|
if isTwoSet(setType) && count >= 2 {
|
||||||
|
if cn, ok := setTypeNameMap[setType]; ok {
|
||||||
|
twoNames = append(twoNames, cn)
|
||||||
|
} else {
|
||||||
|
twoNames = append(twoNames, setType)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
allNames := append(fourNames, twoNames...)
|
||||||
|
return strings.Join(allNames, ",")
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user