Files
epic-go/internal/logic/hero/hero.go
hxt c5c273f0ab feat(hero): 新增英雄相关接口和功能
- 新增英雄信息获取接口和相关逻辑
- 实现英雄列表和详情查询功能- 添加英雄相关数据结构和VO对象
- 更新项目结构,移除不必要的文件
2025-06-21 20:12:02 +08:00

104 lines
2.3 KiB
Go

package hero
import (
"context"
v1 "epic/api/hero/v1"
"epic/internal/dao"
"epic/internal/model/entity"
"epic/internal/service"
"github.com/gogf/gf/v2/frame/g"
)
type Logic struct{}
func New() *Logic {
return &Logic{}
}
func init() {
service.SetHero(New())
}
// GetHeroByCode 根据 code 获取英雄信息
func (l *Logic) GetHeroByCode(ctx context.Context, code string) (*entity.EpicHeroInfo, error) {
// 2. 缓存未命中,查数据库
var hero *entity.EpicHeroInfo
err := dao.EpicHeroInfo.Ctx(ctx).
Where(dao.EpicHeroInfo.Columns().HeroCode, code).
Scan(&hero)
if err != nil {
return nil, err
}
return hero, nil
}
// GetHeroList 查询所有英雄信息,并按创建时间倒序排列
func (l *Logic) GetHeroList(ctx context.Context) ([]*v1.EpicHeroVO, error) {
redis := g.Redis()
cacheKey := "hero:list"
// 1. 先查缓存
value, err := redis.Get(ctx, cacheKey)
if err == nil && !value.IsEmpty() {
var voList []*v1.EpicHeroVO
if err := value.Scan(&voList); err == nil {
return voList, nil
}
}
var (
doList []*entity.EpicHeroInfo // 数据库原始结构
voList []*v1.EpicHeroVO // 要返回的视图结构
)
// 2. 缓存未命中,查数据库
err = dao.EpicHeroInfo.Ctx(ctx).
OrderDesc(dao.EpicHeroInfo.Columns().CreateTime). // 按创建时间倒序
Scan(&doList)
if err != nil {
return nil, err
}
// 3. 手动映射 DO -> VO
for _, hero := range doList {
voList = append(voList, &v1.EpicHeroVO{
Id: hero.Id,
HeroName: hero.HeroName,
HeroCode: hero.HeroCode,
Attribute: hero.Attribute,
HeadImgUrl: hero.HeadImgUrl,
HeroAttrLv60: hero.HeroAttrLv60,
NickName: hero.NickName,
Rarity: hero.Rarity,
Role: hero.Role,
Zodiac: hero.Zodiac,
Remark: hero.Remark,
})
}
return voList, nil
}
func (l *Logic) GetHeroDetailByCode(ctx context.Context, code string) (*v1.HeroDetailVO, error) {
//TODO implement me
panic("implement me")
}
// ClearHeroCache 清理英雄相关缓存
func (l *Logic) ClearHeroCache(ctx context.Context, code string) error {
redis := g.Redis()
// 清理单个英雄缓存
if code != "" {
cacheKey := "hero:" + code
redis.Del(ctx, cacheKey)
}
// 清理英雄列表缓存
redis.Del(ctx, "hero:list")
return nil
}