在玩家断开连接时,使用 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 等新生成文件路径, 避免误提交二进制文件到版本控制。
101 lines
2.1 KiB
Go
101 lines
2.1 KiB
Go
package service
|
|
|
|
import (
|
|
"context"
|
|
|
|
"blazing/cool"
|
|
|
|
"blazing/modules/dict/model"
|
|
|
|
"github.com/gogf/gf/v2/frame/g"
|
|
"github.com/gogf/gf/v2/util/gconv"
|
|
)
|
|
|
|
type DictInfoService struct {
|
|
*cool.Service
|
|
}
|
|
|
|
// Data方法, 用于获取数据
|
|
func (s *DictInfoService) Data(ctx context.Context, types []string) (data interface{}, err error) {
|
|
var (
|
|
dictInfoModel = model.NewDictInfo()
|
|
dictTypeModel = model.NewDictType()
|
|
)
|
|
mType := cool.DBM(dictTypeModel)
|
|
// 如果types不为空, 则查询指定类型的数据
|
|
if len(types) > 0 {
|
|
mType = mType.Where("type in (?)", types)
|
|
}
|
|
// 查询所有类型
|
|
typeData, err := mType.All()
|
|
// 如果typeData为空, 则返回空
|
|
if typeData.IsEmpty() {
|
|
return g.Map{}, nil
|
|
}
|
|
data = g.Map{}
|
|
for _, v := range typeData {
|
|
m := cool.DBM(dictInfoModel)
|
|
result, err := m.Where("typeId", v["id"]).Fields("id", "name", "parentId", "typeId").Order("ordernum asc").All()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if result.IsEmpty() {
|
|
continue
|
|
}
|
|
data.(g.Map)[v["key"].String()] = result
|
|
}
|
|
return
|
|
}
|
|
|
|
// ModifyAfter 修改后
|
|
func (s *DictInfoService) ModifyAfter(ctx context.Context, method string, param map[string]interface{}) (err error) {
|
|
if method == "Delete" {
|
|
// 删除后,同时删除子节点
|
|
ids, ok := param["ids"]
|
|
if !ok {
|
|
return
|
|
}
|
|
for _, v := range ids.([]interface{}) {
|
|
err = delChildDict(gconv.Int64(v))
|
|
if err != nil {
|
|
return
|
|
}
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
// delChildDict 删除子字典
|
|
func delChildDict(id int64) error {
|
|
var (
|
|
dictInfoModel = model.NewDictInfo()
|
|
)
|
|
m := cool.DBM(dictInfoModel)
|
|
result, err := m.Where("parentId=?", id).Fields("id").All()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if result.IsEmpty() {
|
|
return nil
|
|
}
|
|
for _, v := range result {
|
|
delChildDict(v["id"].Int64())
|
|
}
|
|
_, err = m.Where("parentId=?", id).Delete()
|
|
return err
|
|
}
|
|
|
|
// NewDictInfoService 初始化 DictInfoService
|
|
func NewDictInfoService() *DictInfoService {
|
|
return &DictInfoService{
|
|
&cool.Service{
|
|
Model: model.NewDictInfo(),
|
|
ListQueryOp: &cool.QueryOp{
|
|
FieldEQ: []string{"typeId"},
|
|
KeyWordField: []string{"name"},
|
|
AddOrderby: g.MapStrStr{"createTime": "ASC"},
|
|
},
|
|
},
|
|
}
|
|
}
|