From aeecf8b8b0a7c87b7bafc3df1cbd6592b5a3535d Mon Sep 17 00:00:00 2001 From: likun <906102152@qq.com> Date: Mon, 18 Aug 2025 17:49:05 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- admin/apps/game/domain/account.go | 11 ++ admin/apps/game/domain/comm_resource.go | 3 +- admin/apps/game/domain/project.go | 50 ++++++ admin/apps/game/domain/projects/ihook.go | 1 + admin/apps/game/domain/projects/projects.go | 23 ++- admin/apps/game/domain/projects/smdl/items.go | 36 ++++ .../domain/projects/smdl/support_account.go | 28 +++- admin/apps/game/domain/repo/account.go | 11 ++ admin/apps/game/server/ctl_common_rest.go | 13 ++ admin/apps/game/server/route.go | 1 + admin/apps/game/service/service_project.go | 6 + admin/internal/model/dto/msg_project.go | 10 ++ ui/src/api/resource.js | 13 ++ ui/src/components/game/roleDetail.vue | 2 +- ui/src/components/game/roleDetailItems.vue | 156 ++++++++++++++++++ 15 files changed, 347 insertions(+), 17 deletions(-) diff --git a/admin/apps/game/domain/account.go b/admin/apps/game/domain/account.go index 98b1406..a2bbea4 100644 --- a/admin/apps/game/domain/account.go +++ b/admin/apps/game/domain/account.go @@ -81,6 +81,17 @@ func (svc *AccountService) GetWhiteListAll(projectId int) ([]*dto.WhiteListInfo, }) } } + // 扶持号也用的白名单功能标记 + scList, err := svc.accountRepo.GetSCListAll(projectEt) + if err != nil { + return nil, err + } + for _, sc := range scList { + list = append(list, &dto.WhiteListInfo{ + WType: "support", + Value: sc.Account, + }) + } } return list, nil diff --git a/admin/apps/game/domain/comm_resource.go b/admin/apps/game/domain/comm_resource.go index 5ae4a2c..7264a72 100644 --- a/admin/apps/game/domain/comm_resource.go +++ b/admin/apps/game/domain/comm_resource.go @@ -294,7 +294,8 @@ func (svc *CommonResourceService) Create(ctx context.Context, projectId int, res tmpObj, err := createOne(dtoObj) if err != nil { xlog.Errorf("create support account %v db error:%v", ac, err) - err = nil // 忽略多个插入的报错 + return projectEt, tmpObj, err + //err = nil // 忽略多个插入的报错 } else { newDtoObj = tmpObj } diff --git a/admin/apps/game/domain/project.go b/admin/apps/game/domain/project.go index f25a3ab..0cf4b20 100644 --- a/admin/apps/game/domain/project.go +++ b/admin/apps/game/domain/project.go @@ -6,9 +6,12 @@ import ( "admin/apps/game/domain/repo" "admin/apps/game/model" "admin/internal/errcode" + "admin/internal/event" "admin/internal/model/dto" "admin/lib/xlog" + "context" "gorm.io/gorm" + "strconv" ) type ProjectService struct { @@ -91,6 +94,53 @@ func (svc *ProjectService) GetAllItems(projectId int) ([]*dto.CommonDtoFieldChoi return handler.GetItems(projectEt) } +func (svc *ProjectService) ChangeRoleItem(ctx context.Context, projectId int, serverId, roleId string, itemId int32, itemNum int64) error { + _, projectEt, find, err := svc.repo.GetById(projectId) + if err != nil { + return err + } + if !find { + return errcode.New(errcode.ServerError, "not found project %v db data", projectId) + } + + handler := projects.GetProjectValueChoicesGetHook(projectEt.Po.ProjectType) + if handler == nil { + xlog.Warnf("project %+v not found choices hook", projectEt.Po) + return nil + } + + err = handler.ChangeRoleItem(projectEt, serverId, roleId, itemId, itemNum) + if err != nil { + return err + } + + userId := ctx.Value("user_id").(int) + //userName := ctx.Value("user_name").(string) + + evPayload := &event.EventPayload_UserGameExecute{ + UserId: userId, + ProjectId: projectId, + ProjectName: projectEt.Po.Name, + OpResourceType: "变动道具", + OpResourceGroup: "变动道具", + OpResourceKey: strconv.Itoa(int(itemId)), + Method: "新增", + SrcDataList: []any{map[string]any{ + "server_id": serverId, + "role_id": roleId, + "item_id": itemId, + "item_num": itemNum, + }}, + } + if itemNum <= 0 { + evPayload.Method = "扣除" + } + + event.GetMgrInstance().Publish(event.EventTopic_UserGameExecute, evPayload) + + return err +} + func (svc *ProjectService) GetAllItemBag(projectId int) ([]*dto.ItemBagInfo, error) { dbList, err := new(model.ItemBag).List(projectId) if err != nil { diff --git a/admin/apps/game/domain/projects/ihook.go b/admin/apps/game/domain/projects/ihook.go index 14fbf3f..a681747 100644 --- a/admin/apps/game/domain/projects/ihook.go +++ b/admin/apps/game/domain/projects/ihook.go @@ -39,6 +39,7 @@ type IGetRoleDetailHook interface { type IGetAllValueChoiceHook interface { // 获取所有道具,可以用于前端页面做下拉选择等 GetItems(projectInfo *entity.Project) ([]*dto2.CommonDtoFieldChoice, error) + ChangeRoleItem(projectInfo *entity.Project, serverId, roleId string, itemId int32, itemNum int64) error } type IServerInfoHook interface { diff --git a/admin/apps/game/domain/projects/projects.go b/admin/apps/game/domain/projects/projects.go index 2e5073f..5bb9d89 100644 --- a/admin/apps/game/domain/projects/projects.go +++ b/admin/apps/game/domain/projects/projects.go @@ -13,15 +13,16 @@ var debugDisableAllHook = false // 调试用,关闭所有项目钩子调用, var projectsResourceHookMgr = map[string]map[string]any{ // 神魔大陆项目注册的资源钩子回调 consts.RegisteredProjectId_shenmodalu: { - consts.ResourcesName_Server: &smdl.ServerHook{}, // 查看了数据库所有数据之后,还要连alisrv获取所有进程运行情况 - consts.ResourcesName_Role: &smdl.RoleHook{}, // 所有角色走神魔大陆api直接获取 - consts.ResourcesName_Account: &smdl.AccountHook{}, // 所有角色走神魔大陆api直接获取 - consts.ResourcesName_Ban: &smdl.BanHook{}, // 所有角色走神魔大陆api直接获取 - consts.ResourcesName_MailGlobal: &smdl.MailGlobalHook{}, // 所有角色走神魔大陆api直接获取 - consts.ResourcesName_MailRole: &smdl.MailRoleHook{}, // 所有角色走神魔大陆api直接获取 - consts.ResourcesName_WhiteList: &smdl.WhitelistHook{}, // 所有角色走神魔大陆api直接获取 - consts.ResourcesName_GenAccount: &smdl.GenAccountHook{}, // 所有角色走神魔大陆api直接获取 - consts.ResourcesName_GameLog: &smdl.GameLogHook{}, + consts.ResourcesName_Server: &smdl.ServerHook{}, // 查看了数据库所有数据之后,还要连alisrv获取所有进程运行情况 + consts.ResourcesName_Role: &smdl.RoleHook{}, // 所有角色走神魔大陆api直接获取 + consts.ResourcesName_Account: &smdl.AccountHook{}, // 所有角色走神魔大陆api直接获取 + consts.ResourcesName_Ban: &smdl.BanHook{}, // 所有角色走神魔大陆api直接获取 + consts.ResourcesName_MailGlobal: &smdl.MailGlobalHook{}, // 所有角色走神魔大陆api直接获取 + consts.ResourcesName_MailRole: &smdl.MailRoleHook{}, // 所有角色走神魔大陆api直接获取 + consts.ResourcesName_WhiteList: &smdl.WhitelistHook{}, // 所有角色走神魔大陆api直接获取 + consts.ResourcesName_GenAccount: &smdl.GenAccountHook{}, // 所有角色走神魔大陆api直接获取 + consts.ResourcesName_GameLog: &smdl.GameLogHook{}, + consts.ResourcesName_SupportAccount: &smdl.SupportAccountHook{}, }, } @@ -59,3 +60,7 @@ func (items *debugItemsHook) GetItems(projectInfo *entity.Project) ([]*dto.Commo {Desc: "法杖", Value: 3456456}, }, nil } + +func (items *debugItemsHook) ChangeRoleItem(projectInfo *entity.Project, serverId, roleId string, itemId int32, itemNum int64) error { + return nil +} diff --git a/admin/apps/game/domain/projects/smdl/items.go b/admin/apps/game/domain/projects/smdl/items.go index b81abfe..28f10ff 100644 --- a/admin/apps/game/domain/projects/smdl/items.go +++ b/admin/apps/game/domain/projects/smdl/items.go @@ -5,6 +5,10 @@ import ( "admin/internal/errcode" "admin/internal/model/dto" "admin/lib/httpclient" + "admin/lib/xlog" + "math" + "net/url" + "strconv" "time" ) @@ -67,3 +71,35 @@ func (items *Items) GetItems(projectInfo *entity.Project) ([]*dto.CommonDtoField return rsp.Data.List, nil } + +func (items *Items) ChangeRoleItem(projectInfo *entity.Project, serverId, roleId string, itemId int32, itemNum int64) error { + alisrvAddr := projectInfo.GetApiAddr() + if alisrvAddr == "" { + return errcode.New(errcode.ServerError, "项目%v没有配置api服务器地址", projectInfo.Po.Name) + } + + if itemNum == 0 { + xlog.Warnf("change role item:%v,%v,%v,%v num invalid", serverId, roleId, itemId, itemNum) + return nil + } + + // http://127.0.0.1:12007/GM?cmd_data=addItem&roleid=20007000171&itemsn=14201093&itemnum=1&isbind=true + params := &url.Values{} + params.Set("cmd_data", "addItem") + params.Add("roleid", roleId) + params.Add("server", serverId) + params.Set("itemsn", strconv.Itoa(int(itemId))) + params.Set("itemnum", strconv.FormatInt(int64(math.Abs(float64(itemNum))), 10)) + params.Set("isbind", "true") + if itemNum < 0 { + params.Set("deduct", "true") + } + + rsp := make(map[string]any) + err := httpclient.Request(alisrvAddr+"/gm", "get", params, &rsp) + if err != nil { + + } + + return nil +} diff --git a/admin/apps/game/domain/projects/smdl/support_account.go b/admin/apps/game/domain/projects/smdl/support_account.go index 6b85c27..3412c4a 100644 --- a/admin/apps/game/domain/projects/smdl/support_account.go +++ b/admin/apps/game/domain/projects/smdl/support_account.go @@ -29,10 +29,18 @@ func (hook *SupportAccountHook) Create(projectInfo *entity.Project, resource str params.Add("op", "add") //params.Add("server", info.ServerConfID) - rsp := make(map[string]any) - err := httpclient.Request(alisrvAddr+"/gm", "get", params, &rsp) + // 所有区服 + serverList, err := getAllRunningServers(projectInfo) if err != nil { - return errcode.New(errcode.ServerError, "发送新增白名单请求:%+v错误:%v", info, err) + return err + } + for _, v := range serverList { + params.Set("server", v.ServerId) + rsp := make(map[string]any) + err := httpclient.Request(alisrvAddr+"/gm", "get", params, &rsp) + if err != nil { + return errcode.New(errcode.ServerError, "发送新增扶持号请求:%+v错误:%v", info, err) + } } return nil @@ -54,10 +62,18 @@ func (hook *SupportAccountHook) Delete(projectInfo *entity.Project, resource str params.Add("op", "remove") //params.Add("server", info.ServerConfID) - rsp := make(map[string]any) - err := httpclient.Request(alisrvAddr+"/gm", "get", params, &rsp) + // 所有区服 + serverList, err := getAllRunningServers(projectInfo) if err != nil { - return errcode.New(errcode.ServerError, "发送删除白名单请求:%+v错误:%v", info, err) + return err + } + for _, v := range serverList { + params.Set("server", v.ServerId) + rsp := make(map[string]any) + err := httpclient.Request(alisrvAddr+"/gm", "get", params, &rsp) + if err != nil { + return errcode.New(errcode.ServerError, "发送删除扶持号请求:%+v错误:%v", info, err) + } } return nil diff --git a/admin/apps/game/domain/repo/account.go b/admin/apps/game/domain/repo/account.go index 3e8d3c7..8d4993e 100644 --- a/admin/apps/game/domain/repo/account.go +++ b/admin/apps/game/domain/repo/account.go @@ -11,6 +11,7 @@ import ( type IAccountRepo interface { GetWhiteListAll(projectEt *entity.Project) ([]*dto.WhiteListInfo, error) GetBanListAll(projectEt *entity.Project) ([]*model.Ban, error) + GetSCListAll(projectEt *entity.Project) ([]*model.SupportAccount, error) } type accountRepoImpl struct { @@ -46,3 +47,13 @@ func (impl *accountRepoImpl) GetBanListAll(projectEt *entity.Project) ([]*model. return list, nil } + +func (impl *accountRepoImpl) GetSCListAll(projectEt *entity.Project) ([]*model.SupportAccount, error) { + list := make([]*model.SupportAccount, 0) + err := impl.db.Where("project_id = ?", projectEt.Po.ID).Find(&list).Error + if err != nil { + return nil, errcode.New(errcode.DBError, "list project %v sc list error:%v", projectEt.Po.ID, err) + } + + return list, nil +} diff --git a/admin/apps/game/server/ctl_common_rest.go b/admin/apps/game/server/ctl_common_rest.go index ca6c2e3..5175ee1 100644 --- a/admin/apps/game/server/ctl_common_rest.go +++ b/admin/apps/game/server/ctl_common_rest.go @@ -3,6 +3,7 @@ package server import ( "admin/internal/context" "admin/internal/model/dto" + "admin/lib/xlog" stdContext "context" ) @@ -92,3 +93,15 @@ func (ctl *controller) GetProjectAllItems(ctx *context.WebContext, params *dto.N rsp.Items = items return nil } + +func (ctl *controller) ChangeProjectItem(ctx *context.WebContext, params *dto.ChangeProjectItemReq, rsp *dto.ChangeProjectItemRes) error { + ctx1 := stdContext.WithValue(ctx.Context, "user_id", ctx.Header.UserId) + ctx1 = stdContext.WithValue(ctx1, "user_name", ctx.Header.UserName) + projectId := getCtxURIProjectId(ctx) + xlog.Debugf("receive change item:%v,%v,%v,%v,%v", projectId, params.ServerId, params.RoleId, params.ItemId, params.ItemNum) + err := ctl.svc.ChangeItem(ctx1, projectId, params.ServerId, params.RoleId, params.ItemId, params.ItemNum) + if err != nil { + return err + } + return nil +} diff --git a/admin/apps/game/server/route.go b/admin/apps/game/server/route.go index 39f8f5b..fd7e0ce 100644 --- a/admin/apps/game/server/route.go +++ b/admin/apps/game/server/route.go @@ -31,6 +31,7 @@ func (srv *Server) Route(engine *web.Engine, sdkEngine *web.Engine) { } projectGroup.Get("/:projectId/items", "获取项目所有道具列表", consts.WebPathPermit_Read, srv.ctl.GetProjectAllItems) + projectGroup.Get("/:projectId/change_item", "改变道具数量", consts.WebPathPermit_Read, srv.ctl.ChangeProjectItem) { // 礼包码特殊接口 diff --git a/admin/apps/game/service/service_project.go b/admin/apps/game/service/service_project.go index 3169f5d..55d74fb 100644 --- a/admin/apps/game/service/service_project.go +++ b/admin/apps/game/service/service_project.go @@ -6,6 +6,7 @@ import ( "admin/internal/consts" "admin/internal/model/dto" "admin/internal/permission" + "context" "sort" ) @@ -81,3 +82,8 @@ func (svc *Service) GetProjectInvokeApiAddr(projectId int, serverIds []int) ([]s func (svc *Service) GetAllItems(projectId int) ([]*dto.CommonDtoFieldChoice, error) { return svc.projectSvc.GetAllItems(projectId) } + +func (svc *Service) ChangeItem(ctx context.Context, projectId int, serverId string, roleId string, itemId int32, itemNum int64) error { + err := svc.projectSvc.ChangeRoleItem(ctx, projectId, serverId, roleId, itemId, itemNum) + return err +} diff --git a/admin/internal/model/dto/msg_project.go b/admin/internal/model/dto/msg_project.go index ca62351..aab6849 100644 --- a/admin/internal/model/dto/msg_project.go +++ b/admin/internal/model/dto/msg_project.go @@ -152,3 +152,13 @@ type GameLogEventListRsp struct { FieldsDescInfo []*GameLogFieldInfo `json:"fieldsDescInfo"` Rows [][]any `json:"rows"` } + +type ChangeProjectItemReq struct { + ServerId string `json:"server_id"` + RoleId string `json:"role_id"` + ItemId int32 `json:"item_id"` + ItemNum int64 `json:"item_num"` +} + +type ChangeProjectItemRes struct { +} diff --git a/ui/src/api/resource.js b/ui/src/api/resource.js index f2679c5..5102117 100644 --- a/ui/src/api/resource.js +++ b/ui/src/api/resource.js @@ -47,4 +47,17 @@ export function resourceGetAllItems(projectId) { url: '/project/' + projectId.toString() + "/items", method: 'get', }) +} + +export function resourceChangeRoleItem(projectId, serverId, roleId, itemId, itemNum) { + return request({ + url: '/project/' + projectId.toString() + "/change_item", + method: 'get', + params: { + server_id: serverId, + role_id: roleId, + item_id: itemId, + item_num: itemNum + } + }) } \ No newline at end of file diff --git a/ui/src/components/game/roleDetail.vue b/ui/src/components/game/roleDetail.vue index 054c3cf..726c645 100644 --- a/ui/src/components/game/roleDetail.vue +++ b/ui/src/components/game/roleDetail.vue @@ -62,7 +62,7 @@ const handleClick = (tab, event) => {
- + diff --git a/ui/src/components/game/roleDetailItems.vue b/ui/src/components/game/roleDetailItems.vue index 6bb595f..6ad261b 100644 --- a/ui/src/components/game/roleDetailItems.vue +++ b/ui/src/components/game/roleDetailItems.vue @@ -1,16 +1,172 @@