diff --git a/help/server_show冠名索引修复.sql b/help/server_show冠名索引修复.sql new file mode 100644 index 00000000..8d449f53 --- /dev/null +++ b/help/server_show冠名索引修复.sql @@ -0,0 +1,18 @@ +-- server_show 冠名索引修复 +-- 目的: +-- 1. 允许同一服务器存在多个不同玩家的冠名记录 +-- 2. 保证同一玩家对同一服务器只有一条记录(续费更新该记录) + +BEGIN; + +-- 历史上 server_id 被建成了单列唯一约束/唯一索引,会拦截同服多冠名 +ALTER TABLE server_show DROP CONSTRAINT IF EXISTS idx_server_show_server_id; +DROP INDEX IF EXISTS idx_server_show_server_id; + +-- 保留普通查询索引 +CREATE INDEX IF NOT EXISTS idx_server_show_server_id ON server_show (server_id); + +-- 保证“一个玩家对一个服务器最多一条” +CREATE UNIQUE INDEX IF NOT EXISTS idx_server_show_server_owner ON server_show (server_id, owner); + +COMMIT; diff --git a/modules/base/service/base_sys_user.go b/modules/base/service/base_sys_user.go index 5155155e..1ec5701e 100644 --- a/modules/base/service/base_sys_user.go +++ b/modules/base/service/base_sys_user.go @@ -52,6 +52,18 @@ func (s *BaseSysUserService) GetPerson(userId uint32) (res *model.BaseSysUser) { return } + +func (s *BaseSysUserService) GetByUsername(username string) (res *model.BaseSysUser) { + if strings.TrimSpace(username) == "" { + return nil + } + + m := cool.DBM(s.Model) + m.Where("username", strings.ToLower(strings.TrimSpace(username))).FieldsEx("password").Scan(&res) + + return +} + func (s *BaseSysUserService) SetdepartmentId(userId, departmentId uint32) (res *model.BaseSysUser) { m := cool.DBM(s.Model) m.Where("id", userId).Data("departmentId", departmentId).Update() diff --git a/modules/config/service/server.go b/modules/config/service/server.go index 751e9828..ae8b03ed 100644 --- a/modules/config/service/server.go +++ b/modules/config/service/server.go @@ -193,6 +193,9 @@ func (s *ServerService) GetDonationAvailableServerIDs() []uint32 { if server.OnlineID == 0 { continue } + if server.IsDebug != 0 { + continue + } ids = append(ids, server.OnlineID) } sort.Slice(ids, func(i, j int) bool { return ids[i] < ids[j] }) diff --git a/modules/player/controller/admin/item.go b/modules/player/controller/admin/item.go index 71b0c8fd..4fc5e984 100644 --- a/modules/player/controller/admin/item.go +++ b/modules/player/controller/admin/item.go @@ -1,8 +1,14 @@ package admin import ( + "context" + + "blazing/common/data" "blazing/cool" + baseservice "blazing/modules/base/service" "blazing/modules/player/service" + + "github.com/gogf/gf/v2/frame/g" ) type ItemBagController struct { @@ -13,10 +19,54 @@ func init() { var task_info_controller = &ItemBagController{ &cool.Controller{ Prefix: "/admin/game/item", - Api: []string{"Delete", "Update", "Info", "List", "Page"}, + Api: []string{"Add", "Delete", "Update", "Info", "List", "Page", "Grant"}, Service: service.NewItemService(0), //因为page已经过滤,所以这里需要改成0 }, } // 注册路由 cool.RegisterController(task_info_controller) } + +type ItemGrantReq struct { + g.Meta `path:"/grant" method:"POST"` + Authorization string `json:"Authorization" in:"header"` + PlayerID uint32 `json:"player_id"` + Username string `json:"username"` + ItemID int64 `json:"item_id" v:"required#请选择物品"` + ItemCnt int64 `json:"item_cnt" v:"required|min:1#请输入数量|数量必须大于0"` +} + +func (c *ItemBagController) Grant(ctx context.Context, req *ItemGrantReq) (res *cool.BaseRes, err error) { + playerID := req.PlayerID + if playerID == 0 && req.Username != "" { + user := baseservice.NewBaseSysUserService().GetByUsername(req.Username) + if user == nil { + return cool.Fail("用户不存在"), nil + } + playerID = uint32(user.ID) + } + + if playerID == 0 { + return cool.Fail("请先选择玩家"), nil + } + + items, err := service.NewItemService(playerID).AddItems([]data.ItemInfo{ + { + ItemId: req.ItemID, + ItemCnt: req.ItemCnt, + }, + }) + if err != nil { + return cool.Fail(err.Error()), nil + } + if len(items) == 0 { + return cool.Fail("发放失败,可能已达到物品上限"), nil + } + + return cool.Ok(g.Map{ + "player_id": playerID, + "item_id": req.ItemID, + "item_cnt": req.ItemCnt, + "items": items, + }), nil +} diff --git a/modules/player/service/item.go b/modules/player/service/item.go index 9f622299..42271172 100644 --- a/modules/player/service/item.go +++ b/modules/player/service/item.go @@ -3,6 +3,7 @@ package service import ( "blazing/common/data" "blazing/cool" + basemodel "blazing/modules/base/model" "blazing/modules/player/model" "context" "strings" @@ -345,17 +346,32 @@ func NewItemService(id uint32) *ItemService { Service: &cool.Service{Model: model.NewPlayerBag(), UniqueKey: map[string]string{ "player_id": "角色名称不能重复", }, PageQueryOp: &cool.QueryOp{ - KeyWordField: []string{"player_id"}, - FieldEQ: []string{"player_id"}, + Select: `player_item.*, base_sys_user.username`, + Join: []*cool.JoinOp{ + { + Model: basemodel.NewBaseSysUser(), + Alias: "base_sys_user", + Type: cool.LeftJoin, + Condition: `player_item.player_id = base_sys_user.id`, + }, + }, + KeyWordField: []string{"player_item.player_id", "base_sys_user.username"}, + FieldEQ: []string{"player_id", "item_id"}, Where: func(ctx context.Context) [][]interface{} { var ( - //admin = cool.GetAdmin(ctx) - //userId = admin.UserId + r = g.RequestFromCtx(ctx) ) - return [][]interface{}{ + + where := [][]interface{}{ // {"player_id", userId, true}, // {"free", 0, true}, } + + if username := strings.TrimSpace(r.Get("username").String()); username != "" { + where = append(where, []interface{}{`LOWER(base_sys_user.username) LIKE ?`, "%" + strings.ToLower(username) + "%"}) + } + + return where }, }}, },