diff --git a/api/user/user.go b/api/user/user.go index 7ff0b72..e2ef80e 100644 --- a/api/user/user.go +++ b/api/user/user.go @@ -20,4 +20,5 @@ type IUserV1 interface { GetBoundUrl(ctx context.Context, req *v1.GetBoundUrlReq) (res *v1.GetBoundUrlRes, err error) GetUnboundUrl(ctx context.Context, req *v1.GetUnboundUrlReq) (res *v1.GetUnboundUrlRes, err error) DelUser(ctx context.Context, req *v1.DelUserReq) (res *v1.DelUserRes, err error) + GetUserGameRoleList(ctx context.Context, req *v1.GetUserGameRoleListReq) (res *v1.GetUserGameRoleListRes, err error) } diff --git a/api/user/v1/user.go b/api/user/v1/user.go index f512153..bb0faf7 100644 --- a/api/user/v1/user.go +++ b/api/user/v1/user.go @@ -99,3 +99,14 @@ type DelUserReq struct { type DelUserRes struct { Success bool `json:"success" dc:"是否成功"` } + +type GetUserGameRoleListReq struct { + g.Meta `path:"/user/gameRoleList" method:"get" tags:"User" summary:"(PC)获取用户游戏角色列表"` + PopenId string `json:"popenId" v:"required#popenId不能为空" dc:"用户详情接口返回的 wxPopenId 或者是 qqPopenId"` + GameId int `json:"gameId" v:"required#gameId不能为空" dc:"游戏id"` + Area int `json:"area" v:"required#area不能为空" dc:"游戏区"` + BindType int `json:"bindType" v:"required|in:1,2#请选择绑定方式,只能为1或2" dc:"绑定方式,默认值1,1: qq; 2: wx" default:"1"` +} +type GetUserGameRoleListRes struct { + List interface{} `json:"list"` +} diff --git a/internal/consts/gamelife.go b/internal/consts/gamelife.go index bd83154..d4974c3 100644 --- a/internal/consts/gamelife.go +++ b/internal/consts/gamelife.go @@ -12,4 +12,5 @@ const ( const ( GetNonLoginTaskList = "GetNonloginTaskList" GetTaskList = "GetTaskList" + QueryUserRoleList = "QueryUserRoleList" ) diff --git a/internal/controller/user/user_v1_get_user_game_role_list.go b/internal/controller/user/user_v1_get_user_game_role_list.go new file mode 100644 index 0000000..23109b2 --- /dev/null +++ b/internal/controller/user/user_v1_get_user_game_role_list.go @@ -0,0 +1,17 @@ +package user + +import ( + "context" + "server/internal/model" + "server/internal/service" + + "server/api/user/v1" +) + +func (c *ControllerV1) GetUserGameRoleList(ctx context.Context, req *v1.GetUserGameRoleListReq) (res *v1.GetUserGameRoleListRes, err error) { + out, err := service.User().GetUserGameRole(ctx, &model.GetUserGameRoleIn{BindType: req.BindType, GameId: req.GameId, PopenId: req.PopenId, Area: req.Area}) + if err != nil { + return nil, err + } + return &v1.GetUserGameRoleListRes{List: out.RoleList}, nil +} diff --git a/internal/logic/user/user.go b/internal/logic/user/user.go index 457539f..aa274dc 100644 --- a/internal/logic/user/user.go +++ b/internal/logic/user/user.go @@ -299,3 +299,17 @@ func (s *sUser) DelUser(ctx context.Context, in *model.DelUserIn) (out *model.De return &model.DeleteOut{Success: true}, nil } + +func (s *sUser) GetUserGameRole(ctx context.Context, in *model.GetUserGameRoleIn) (out *model.GetUserGameRoleOut, err error) { + activity, err := gamelife.GetGamelifeClient(ctx).RequestActivity(ctx, &model.QQNetbarActivityIn{ServiceName: consts.QueryUserRoleList, PopenId: in.PopenId, BindType: in.BindType, UserRoleParam: model.UserRoleParam{Gid: in.GameId, Area: in.Area}}) + if err != nil { + return nil, err + } + result, ok := activity.(*[]model.UserRole) + if !ok { + return nil, ecode.Fail.Sub("获取用户游戏角色失败") + } + return &model.GetUserGameRoleOut{ + RoleList: *result, + }, nil +} diff --git a/internal/model/gamelife.go b/internal/model/gamelife.go index 076499b..0c76d1c 100644 --- a/internal/model/gamelife.go +++ b/internal/model/gamelife.go @@ -58,9 +58,21 @@ type TaskParam struct { Source string `json:"source"` } -type QQNetbarActivityIn struct { - ServiceName string // 服务名称 - TaskParam TaskParam // 参数体 - PopenId string - BindType int +type UserRoleParam struct { + Area int `json:"area,omitempty"` // 可选参数 + Gid int `json:"gid"` +} +type UserRole struct { + RoleName string `json:"role_name"` + RoleIdx string `json:"roleIdx"` +} +type UserRoleListResponse struct { + RoleList []UserRole `json:"role_list"` +} +type QQNetbarActivityIn struct { + ServiceName string // 服务名称 + TaskParam TaskParam // 参数体 + UserRoleParam UserRoleParam + PopenId string + BindType int } diff --git a/internal/model/user.go b/internal/model/user.go index c050002..75666a7 100644 --- a/internal/model/user.go +++ b/internal/model/user.go @@ -183,3 +183,12 @@ type DelUserIn struct { type DelUserOut struct { Success bool } +type GetUserGameRoleIn struct { + PopenId string + GameId int + BindType int + Area int +} +type GetUserGameRoleOut struct { + RoleList []UserRole +} diff --git a/internal/service/user.go b/internal/service/user.go index c890cab..d78be59 100644 --- a/internal/service/user.go +++ b/internal/service/user.go @@ -23,6 +23,7 @@ type ( UnBoundUrl(ctx context.Context, in *model.UserBoundUrlIn) (out *model.UserUnBoundUrlOut, err error) BoundInfo(ctx context.Context, in *model.UserBoundInfoIn) (out *model.UserBoundInfoOut, err error) DelUser(ctx context.Context, in *model.DelUserIn) (out *model.DeleteOut, err error) + GetUserGameRole(ctx context.Context, in *model.GetUserGameRoleIn) (out *model.GetUserGameRoleOut, err error) } ) diff --git a/utility/gamelife/gamelife.go b/utility/gamelife/gamelife.go index 9a6874f..814e5e2 100644 --- a/utility/gamelife/gamelife.go +++ b/utility/gamelife/gamelife.go @@ -346,6 +346,42 @@ func (s *gamelifeClient) RequestActivity(ctx context.Context, in *model.QQNetbar return nil, ecode.Fail.Sub("请求出现异常") } return &result, nil + case consts.QueryUserRoleList: + cache, err := s.getOrRefreshCache(ctx, in.PopenId) + if err != nil { + return nil, err + } + cacheKey := fmt.Sprintf(consts.GameLifeUserKey, in.PopenId) + if cache.Params == "" { + // Reconstruct Params with default values + value, err := dao.Games.Ctx(ctx).Where(do.Games{GameId: in.UserRoleParam.Gid}).Fields(dao.Games.Columns().GameCode).Value() + if err != nil { + return nil, ecode.Fail.Sub("获取游戏名称失败") + } + + cache.Params, err = s.buildQueryParams(ctx, in.PopenId, cache, value.String(), "", in.BindType, true) + if err != nil { + return nil, err + } + // Update cache with new Params + ttl, err := g.Redis().TTL(ctx, cacheKey) + if err != nil { + return nil, ecode.Fail.Sub("获取缓存过期时间失败") + } + if err := g.Redis().SetEX(ctx, cacheKey, cache, ttl); err != nil { + return nil, ecode.Fail.Sub("更新缓存失败") + } + } + var result model.UserRoleListResponse + resp, err := client.R(). + SetContext(ctx). + SetBody(in.UserRoleParam). + SetResult(&result). + Post(fmt.Sprintf("%s%s?%s", taskURL, consts.QueryUserRoleList, cache.Params)) + if err != nil || resp.IsError() { + return nil, ecode.Fail.Sub("请求出现异常") + } + return &result.RoleList, nil default: return nil, ecode.Fail.Sub(fmt.Sprintf("不支持的任务: %s", in.ServiceName)) diff --git a/utility/myCasbin/casbin.go b/utility/myCasbin/casbin.go index d467f68..a18a3da 100644 --- a/utility/myCasbin/casbin.go +++ b/utility/myCasbin/casbin.go @@ -56,14 +56,16 @@ func init() { enforcer.AddPolicy("user", "/x/upload/image", "POST", "上传图片") enforcer.AddPolicy("user", "/x/upload/user", "POST", "上传头像图片") - // enforcer.AddPolicy("user", "/x/user", "PUT", "修改个人信息") enforcer.AddPolicy("user", "/x/user/getPhoneCode", "POST", "获取验证码") enforcer.AddPolicy("user", "/x/user/bindPhone", "POST", "绑定手机号") enforcer.AddPolicy("user", "/x/user/info", "GET", "查询用户个人信息") + + // 游戏人生 enforcer.AddPolicy("user", "/x/user/boundInfo", "GET", "查询用户绑定信息") enforcer.AddPolicy("user", "/x/user/boundUrl", "GET", "获取用户绑定的URL") enforcer.AddPolicy("user", "/x/user/unBoundUrl", "GET", "获取用户取消绑定的URL") + enforcer.AddPolicy("user", "/x/user/gameRoleList", "GET", "查询用户游戏角色列表") // 反馈信息 enforcer.AddPolicy("user", "/x/feedback", "GET", "获取反馈信息列表")