package res_m import ( "git.hilo.cn/hilo-common/domain" "git.hilo.cn/hilo-common/resource/mysql" "github.com/bluele/gcache" "gorm.io/gorm" "hilo-group/_const/enum/res_e" "hilo-group/myerr" "time" ) type ResMedal struct { mysql.Entity Name string PicUrl string SvgaUrl string Sort mysql.Num NoPicUrl *string //类型 (0:代表自身就是一种类型 > 0, 一种相关联的类型) Type res_e.ResMedalType Scope res_e.ResMedalScope //限制 (-1, 没有限制) Threshold mysql.Num I mysql.Num } // 查勋章中的等级关系 func GetUserMedalLevelMap(db *gorm.DB) (map[uint64]uint8, map[uint8][]uint64, error) { rows := make([]ResMedal, 0) if err := db.Model(&ResMedal{}).Order("threshold ASC").Find(&rows).Error; err != nil { return nil, nil, err } medalTypes := make(map[uint64]uint8, 0) result := make(map[uint8][]uint64, 0) for _, i := range rows { medalTypes[i.ID] = i.Type if i.Type != 0 { if _, ok := result[i.Type]; !ok { result[i.Type] = make([]uint64, 0) } result[i.Type] = append(result[i.Type], i.ID) } } return medalTypes, result, nil } type RoomMedalConfig struct { Level uint16 Threshold uint64 Desc string InactiveUrl string ActiveUrl string } func GetRoomMedalConfig(db *gorm.DB) ([]RoomMedalConfig, error) { rows := make([]RoomMedalConfig, 0) if err := db.Model(&RoomMedalConfig{}).Order("level").Find(&rows).Error; err != nil { return nil, err } return rows, nil } var medalCache = gcache.New(1000).LRU().Build() var medalMapCache = gcache.New(1).LRU().Build() const medalKey = "MEDAL" // pprof看到内存分配很多 // 加上15min lru func MedalGetAll(db *gorm.DB) ([]ResMedal, error) { if data, err := medalCache.Get(medalKey); err == nil { return data.([]ResMedal), nil } rows := make([]ResMedal, 0) err := db.Find(&rows).Error if err != nil { return nil, err } _ = medalCache.SetWithExpire(medalKey, rows, time.Minute*15) return rows, nil } func MedalGetAllMap(db *gorm.DB) (map[uint32]ResMedal, error) { if data, err := medalMapCache.Get(medalKey); err == nil { return data.(map[uint32]ResMedal), nil } rows, err := MedalGetAll(db) if err != nil { return nil, err } result := make(map[uint32]ResMedal, 0) for _, i := range rows { result[uint32(i.ID)] = i } _ = medalMapCache.SetWithExpire(medalKey, result, time.Minute*15) return result, nil } //每个公开勋章都要有对应的获得来源, type ResMedalPublicObtain struct { mysql.Entity Type res_e.ResMedalObtainType ResMedalId mysql.ID ResGiftId mysql.ID } func ResMedalObtainGetByMedalId(model *domain.Model, medalId mysql.ID) (*ResMedalPublicObtain, error) { resMedalPublicObtain := ResMedalPublicObtain{} if err := model.Db.Model(&ResMedalPublicObtain{}).Where(&ResMedalPublicObtain{ ResMedalId: medalId, }).First(&resMedalPublicObtain).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, nil } else { return nil, myerr.WrapErr(err) } } return &resMedalPublicObtain, nil } func GetResMedalById(model *domain.Model, id mysql.ID) (ResMedal, error) { resMedal := ResMedal{} if err := model.Db.Model(&ResMedal{}).First(&resMedal, id).Error; err != nil { return resMedal, myerr.WrapErr(err) } return resMedal, nil }