在玩家断开连接时,使用 sync.Once 确保只保存一次玩家数据, 防止因并发或多次触发导致的数据异常。 feat(fight): 增加战斗资格判断与邀请取消功能 - 新增 Player.CanFight() 方法用于统一判断是否可以参与战斗 - 在多个战斗相关接口中加入 CanFight 检查 - 添加“取消战斗邀请”指令及处理逻辑(cmd: 2402) - 修复部分错误码不准确的问题,提升提示一致性 refactor(login): 优化登录流程并增强健壮性 - 提前校验 session 合法性 - 增强获取玩家信息后的空指针检查 - 调整挖矿数据重置方式为 defer 执行 - 优化日志输出内容,便于调试追踪 docs(model): 更新部门、菜单等模型字段命名规范 将 orderNum 字段改为 ordernum,保持数据库列名风格一致, 同时更新了 base_sys_role 中 userId 为 userid。 perf(rate-limit): 提高登录接口的限流 Burst 容量 调整限流器配置,将请求 burst 容量从 2 提升至 5, 以应对短时间高频访问场景,改善用户体验。 chore(build): 忽略新增编译产物和临时文件 在 .gitignore 中添加 logic/logic2、login/login 等新生成文件路径, 避免误提交二进制文件到版本控制。
97 lines
2.4 KiB
Go
97 lines
2.4 KiB
Go
package service
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"blazing/cool"
|
|
|
|
"blazing/modules/base/model"
|
|
|
|
"github.com/gogf/gf/v2/container/garray"
|
|
"github.com/gogf/gf/v2/database/gdb"
|
|
"github.com/gogf/gf/v2/frame/g"
|
|
"github.com/gogf/gf/v2/text/gstr"
|
|
"github.com/gogf/gf/v2/util/gconv"
|
|
)
|
|
|
|
type BaseSysMenuService struct {
|
|
*cool.Service
|
|
}
|
|
|
|
// GetPerms 获取菜单的权限
|
|
func (s *BaseSysMenuService) GetPerms(roleIds []string) []string {
|
|
var (
|
|
perms []string
|
|
result gdb.Result
|
|
)
|
|
m := cool.DBM(s.Model).As("a")
|
|
// 如果roldIds 包含 1 则表示是超级管理员,则返回所有权限
|
|
if garray.NewIntArrayFrom(gconv.Ints(roleIds)).Contains(1) {
|
|
result, _ = m.Fields("a.perms").All()
|
|
} else {
|
|
result, _ = m.InnerJoin("base_sys_role_menu b", `a.id=b."menuId"`).InnerJoin("base_sys_role c", `b."roleId"=c.id`).Where("c.id IN (?)", roleIds).Fields("a.perms").All()
|
|
}
|
|
for _, v := range result {
|
|
vmap := v.Map()
|
|
if vmap["perms"] != nil {
|
|
p := gstr.Split(vmap["perms"].(string), ",")
|
|
perms = append(perms, p...)
|
|
}
|
|
}
|
|
return perms
|
|
}
|
|
|
|
// GetMenus 获取菜单
|
|
func (s *BaseSysMenuService) GetMenus(roleIds []string, isAdmin bool) (result gdb.Result) {
|
|
// 屏蔽 base_sys_role_menu.id 防止部分权限的用户登录时菜单渲染错误
|
|
m := cool.DBM(s.Model).As("a").Fields("a.*")
|
|
var err error
|
|
if isAdmin {
|
|
result, err = m.Group("a.id").Order(`a.ordernum`, "asc").All()
|
|
fmt.Println(err)
|
|
} else {
|
|
result, _ = m.InnerJoin("base_sys_role_menu b", `a.id=b."menuId"`).Where(`b."roleId" IN (?)`, roleIds).Group("a.id").Order("a.ordernum asc").All()
|
|
}
|
|
return
|
|
|
|
}
|
|
|
|
// ModifyAfter 修改后
|
|
func (s *BaseSysMenuService) ModifyAfter(ctx context.Context, method string, param g.MapStrAny) (err error) {
|
|
if method == "Delete" {
|
|
ids := gconv.Ints(param["ids"])
|
|
if len(ids) > 0 {
|
|
_, err = cool.DBM(s.Model).Where("parentId IN (?)", ids).Delete()
|
|
}
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
// ServiceAdd 添加
|
|
func (s *BaseSysMenuService) ServiceAdd(ctx context.Context, req *cool.AddReq) (data interface{}, err error) {
|
|
r := g.RequestFromCtx(ctx)
|
|
rjson, err := r.GetJson()
|
|
if err != nil {
|
|
return
|
|
}
|
|
// g.DumpWithType(rjson)
|
|
m := cool.DBM(s.Model)
|
|
lastInsertId, err := m.Data(rjson).InsertAndGetId()
|
|
if err != nil {
|
|
return
|
|
}
|
|
data = g.Map{"id": lastInsertId}
|
|
return
|
|
}
|
|
|
|
// NewBaseSysMenuService 创建一个BaseSysMenuService实例
|
|
func NewBaseSysMenuService() *BaseSysMenuService {
|
|
return &BaseSysMenuService{
|
|
&cool.Service{
|
|
Model: model.NewBaseSysMenu(),
|
|
},
|
|
}
|
|
}
|