feat(hero): 新增英雄相关接口和功能
- 新增英雄信息获取接口和相关逻辑 - 实现英雄列表和详情查询功能- 添加英雄相关数据结构和VO对象 - 更新项目结构,移除不必要的文件
This commit is contained in:
103
internal/logic/hero/hero.go
Normal file
103
internal/logic/hero/hero.go
Normal file
@@ -0,0 +1,103 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user