package hero import ( "context" v1 "epic/api/hero/v1" "epic/internal/dao" "epic/internal/model/entity" "epic/internal/service" "fmt" "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/os/gcache" "time" ) 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) { // 推荐从配置文件加载 redisClient := g.Redis() cache := gcache.New() cache.SetAdapter(gcache.NewAdapterRedis(redisClient)) // Create redis cache adapter and set it to cache object. //fmt.Println(cache.MustGet(ctx, "epic_artifact_map_key").String()) cache.Set(ctx, "epic_artifact_map_key111", "545487878", 1000*time.Second) cache.Set(ctx, "epic_artifact_map_key222", "5454878787878878", 0) fmt.Println(cache.Get(ctx, "epic_artifact_map_key111")) 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 }