2025-02-05 18:45:49 +08:00
|
|
|
package svc
|
|
|
|
|
2025-02-07 15:18:26 +08:00
|
|
|
import (
|
2025-02-07 17:01:48 +08:00
|
|
|
"context"
|
2025-02-08 18:57:05 +08:00
|
|
|
"gitea.youtukeji.com.cn/youtu/youtu_grpc/app/ranking_management/internal/gen/dao/query"
|
|
|
|
"gitea.youtukeji.com.cn/youtu/youtu_grpc/app/ranking_management/internal/logic/rankings"
|
|
|
|
"gitea.youtukeji.com.cn/youtu/youtu_grpc/app/user_management/user_management"
|
|
|
|
"gitea.youtukeji.com.cn/youtu/youtu_grpc/app/user_management/user_management_client"
|
|
|
|
"gitea.youtukeji.com.cn/youtu/youtu_grpc/pkg/config"
|
|
|
|
"gitea.youtukeji.com.cn/youtu/youtu_grpc/pkg/my_gorm"
|
2025-02-07 17:01:48 +08:00
|
|
|
"github.com/redis/go-redis/v9"
|
2025-02-08 18:57:05 +08:00
|
|
|
"github.com/spf13/viper"
|
|
|
|
"github.com/zeromicro/go-zero/core/conf"
|
|
|
|
"github.com/zeromicro/go-zero/core/discov"
|
|
|
|
"github.com/zeromicro/go-zero/zrpc"
|
2025-02-07 17:01:48 +08:00
|
|
|
"gorm.io/driver/mysql"
|
|
|
|
"gorm.io/gorm"
|
2025-02-07 15:18:26 +08:00
|
|
|
)
|
2025-02-05 18:45:49 +08:00
|
|
|
|
|
|
|
type ServiceContext struct {
|
2025-02-08 18:57:05 +08:00
|
|
|
Config config.Config
|
|
|
|
Query *query.Query
|
|
|
|
RedisRanking *rankings.Ranking
|
|
|
|
UserManagerClient user_management_client.UserManagement
|
2025-02-05 18:45:49 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
func NewServiceContext(c config.Config) *ServiceContext {
|
2025-02-07 17:01:48 +08:00
|
|
|
svc := &ServiceContext{
|
2025-02-05 18:45:49 +08:00
|
|
|
Config: c,
|
|
|
|
}
|
2025-02-07 17:01:48 +08:00
|
|
|
|
|
|
|
//初始化redis client
|
|
|
|
redisClient := redis.NewClient(&redis.Options{
|
2025-02-08 18:57:05 +08:00
|
|
|
Addr: c.Redis[0].Host,
|
2025-02-07 17:01:48 +08:00
|
|
|
})
|
|
|
|
//初始化数据库
|
2025-02-08 18:57:05 +08:00
|
|
|
db, err := my_gorm.NewDBWithCache(mysql.Open(c.Mysql), &gorm.Config{}, redisClient)
|
2025-02-07 17:01:48 +08:00
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
svc.Query = query.Use(db)
|
|
|
|
|
2025-02-08 18:57:05 +08:00
|
|
|
// 初始化用户客户端
|
|
|
|
clientConf := zrpc.RpcClientConf{}
|
|
|
|
err = conf.FillDefault(&clientConf) // 填充默认值,比如 trace 透传等,参考服务配置说明
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
clientConf.Token = "user_management.rpc.key"
|
|
|
|
clientConf.App = "user_management.rpc"
|
|
|
|
clientConf.Etcd = discov.EtcdConf{ // 通过 etcd 服务发现
|
|
|
|
Hosts: []string{viper.GetString(config.EtcdAddrKey)},
|
|
|
|
Key: "user_management.rpc",
|
|
|
|
}
|
|
|
|
|
|
|
|
svc.UserManagerClient = user_management.NewUserManagementClient(zrpc.MustNewClient(clientConf).Conn())
|
|
|
|
|
2025-02-07 17:01:48 +08:00
|
|
|
//初始化排行榜对象
|
|
|
|
svc.InitRankings(redisClient)
|
|
|
|
|
|
|
|
return svc
|
|
|
|
}
|
|
|
|
|
|
|
|
func (svc *ServiceContext) InitRankings(redisClient *redis.Client) {
|
|
|
|
//初始化排行榜对象
|
|
|
|
svc.RedisRanking = rankings.NewRanking(redisClient)
|
|
|
|
|
|
|
|
//获取所有不同的排行榜
|
|
|
|
gs := svc.Query.GameScore
|
|
|
|
r, err := gs.FindDistinctRanking()
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
//获取所有排行榜
|
|
|
|
for _, ranking := range r {
|
|
|
|
scores, err := gs.Where(gs.AppAccount.Eq(ranking.AppAccount), gs.T.Eq(ranking.T)).Find()
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
data := make([]redis.Z, 0, len(scores))
|
|
|
|
|
|
|
|
for _, score := range scores {
|
|
|
|
data = append(data, redis.Z{
|
|
|
|
Score: float64(uint64(score.Score)<<32 + uint64(score.UpdatedAt.Unix())),
|
|
|
|
Member: score.AppUserID,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
svc.RedisRanking.SetList(context.Background(), rankings.GetRankingsCacheKey(ranking.AppAccount, ranking.T), data...)
|
|
|
|
}
|
2025-02-05 18:45:49 +08:00
|
|
|
}
|