This commit is contained in:
@@ -2,6 +2,7 @@ package cool
|
||||
|
||||
import (
|
||||
"context"
|
||||
"reflect"
|
||||
"strings"
|
||||
|
||||
"blazing/cool/coolconfig"
|
||||
@@ -158,12 +159,33 @@ func (c *Controller) Page(ctx context.Context, req *PageReq) (res *BaseRes, err
|
||||
// 注册控制器到路由
|
||||
func RegisterController(c IController) {
|
||||
var ctx = context.Background()
|
||||
var sController = &Controller{}
|
||||
gconv.Struct(c, &sController)
|
||||
var sController *Controller
|
||||
rv := reflect.ValueOf(c)
|
||||
if rv.IsValid() && rv.Kind() == reflect.Ptr {
|
||||
ev := rv.Elem()
|
||||
if ev.IsValid() {
|
||||
field := ev.FieldByName("Controller")
|
||||
if field.IsValid() && !field.IsNil() {
|
||||
if ctrl, ok := field.Interface().(*Controller); ok && ctrl != nil {
|
||||
sController = ctrl
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if sController == nil {
|
||||
sController = &Controller{}
|
||||
gconv.Struct(c, &sController)
|
||||
}
|
||||
if coolconfig.Config.Eps {
|
||||
model := sController.Service.GetModel()
|
||||
columns := getModelInfo(ctx, sController.Prefix, model)
|
||||
ModelInfo[sController.Prefix] = columns
|
||||
tableName := ""
|
||||
if model != nil {
|
||||
tableName = strings.TrimSpace(model.TableName())
|
||||
}
|
||||
if tableName != "" && tableName != "this_table_should_not_exist" {
|
||||
columns := getModelInfo(ctx, sController.Prefix, model)
|
||||
ModelInfo[sController.Prefix] = columns
|
||||
}
|
||||
}
|
||||
g.Server().Group(
|
||||
sController.Prefix, func(group *ghttp.RouterGroup) {
|
||||
|
||||
73
help/初始化SPT配置.sql
Normal file
73
help/初始化SPT配置.sql
Normal file
@@ -0,0 +1,73 @@
|
||||
-- 初始化/修复 SPT 配置表(PostgreSQL)
|
||||
-- 用法:在 sun 数据库执行本文件
|
||||
|
||||
BEGIN;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS config_spt (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
"createTime" TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
"updateTime" TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
deleted_at TIMESTAMPTZ NULL,
|
||||
is_enable INTEGER NOT NULL DEFAULT 1,
|
||||
remark VARCHAR(255) NOT NULL DEFAULT '',
|
||||
task_id INTEGER NOT NULL,
|
||||
title VARCHAR(64) NOT NULL DEFAULT '',
|
||||
pet_id INTEGER NOT NULL DEFAULT 0,
|
||||
online INTEGER NOT NULL DEFAULT 1,
|
||||
level INTEGER NOT NULL DEFAULT 1,
|
||||
seat_id INTEGER NOT NULL DEFAULT 0,
|
||||
enter_id INTEGER NOT NULL DEFAULT 0,
|
||||
description TEXT NOT NULL DEFAULT ''
|
||||
);
|
||||
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS idx_config_spt_task_id ON config_spt(task_id);
|
||||
|
||||
INSERT INTO config_spt
|
||||
(task_id, title, pet_id, online, level, seat_id, enter_id, description, is_enable, remark)
|
||||
VALUES
|
||||
(301,'蘑菇怪',47,1,1,12,12,'生活在克洛斯星,被艾里逊的液氮冻伤而发狂,使用火焰喷射器可以使它安静下来。制服它可以获得草系精灵小蘑菇。',1,'破除防护罩'),
|
||||
(302,'钢牙鲨',34,1,1,22,21,'海洋星海底的危险怪兽,据说它躲藏的洞穴中有制作黑武士装的黑晶矿石。记住,到海底一定要穿上耐压的潜水套装。',1,''),
|
||||
(303,'里奥斯',42,1,2,17,17,'海盗艾里逊在火山被它困住,战胜它有机会获得火系精灵“胡里亚”。在火山,你会用到喷水装的。',1,'扑灭火焰屏障'),
|
||||
(304,'阿克希亚',50,1,4,40,40,'塞西利亚星的守护者,正义的精灵圣兽,它是不可战胜的,千年来一直等待着宿命的对手。',1,''),
|
||||
(305,'提亚斯',69,1,3,27,27,'云霄星出现了一只极具攻击性的变异精灵,拥有很多蛋的它虽然想要努力呵护自己的孩子却力不从心,看来需要大家帮帮忙啊。',1,''),
|
||||
(306,'雷伊',70,1,3,32,32,'赫尔卡星天空中划过一道闪电,映出了一个酷似精灵的黑影,它全身被电流包围,从它的神态中可以看出它正等待来自各方的挑战。',1,'雷雨天'),
|
||||
(307,'纳多雷',88,1,3,106,106,'在双子阿尔法星上,特派队遇见了一只巨大的精灵,经过多次挑战后,它仍然丝毫无损,赛尔们是否有办法战胜这只精灵呢?',1,''),
|
||||
(308,'雷纳多',113,1,3,49,49,'彪悍的雷纳多盘踞在双子贝塔星上,和双子阿尔法星的纳多雷遥相对应,守护着星球上所有精灵的。',1,''),
|
||||
(309,'尤纳斯',132,1,4,314,314,'黑暗之门的制造者,拥有能够抵御一切的暗影屏障和所有能量来源的黑暗之核。',1,''),
|
||||
(310,'魔狮迪露',187,1,4,53,53,'魔狮迪露具有神秘的力量,能使自己的体力突破界限,但同时也会受到未知的惩罚。',1,''),
|
||||
(311,'哈莫雷特',216,1,5,60,60,'拥有无比巨大的身躯,集水火草三种原能为一身,龙系的神秘力量使它所向无敌。失忆的它,似乎还有很多谜团……',1,''),
|
||||
(312,'奈尼芬多',264,1,4,325,325,'奈尼芬多是爱迪星的守护者,凄美的歌声连月亮都为之倾倒,据说只有音乐的力量才能够唤醒它。',1,''),
|
||||
(316,'厄尔塞拉',421,1,5,61,61,'浑身散发着各色光芒,任何邪恶在她的光芒下消散无形',1,''),
|
||||
(50,'卡特斯',169,1,2,110,110,'作为暗黑武斗场的试炼精灵,守护着试炼之门,它的气度和风度非同一般,杀气重重很难对付!',1,''),
|
||||
(51,'魔牙鲨',171,1,3,503,503,'暗黑第一门的魔牙鲨,被赋予了传说中的暗黑斗气,隐藏在暗影中攻击时它的能力可以被放大增强。',1,''),
|
||||
(53,'贝鲁基德',174,1,3,504,504,'暗黑第二门的贝鲁基德,暗黑火焰环绕周身,凶悍的外表下藏着善战勇敢的心。',1,''),
|
||||
(55,'巴弗洛',177,1,3,505,505,'勇猛凶横的巴弗洛把守着暗黑武斗场Ⅲ-Ⅰ门,霹雳闪电般的羽翼攻击、震荡心胸的音乐攻击,让人防不胜防。',1,''),
|
||||
(56,'奇拉塔顿',183,1,3,505,505,'勇敢的奇拉塔顿驻守在暗黑武斗场Ⅲ-Ⅱ门的那一边,身为大地之子的它驾驭着反物质能量,纵横无敌。',1,''),
|
||||
(59,'西萨拉斯',195,1,3,506,506,'拥有强大反物质电力的暗黑Ⅳ-Ⅰ门守护者,雷霆之刃震撼寰宇天地,电流之剑穿透空间阻隔,威慑四方。',1,''),
|
||||
(60,'克林卡修',192,1,4,506,506,'暗黑Ⅳ-Ⅱ门守护者冰雪灵兽克林卡修,冰雪之爪具有猛烈的攻击力,果敢不张扬的个性,让它成为忍者般的精灵。',1,''),
|
||||
(76,'卡库',222,1,4,507,507,'暗黑Ⅴ-Ⅰ门是武学之门,守门精灵不张扬、不蛮横、步步为营,每出一招都会致命。',1,''),
|
||||
(77,'赫德卡',224,1,4,507,507,'驻守暗黑V-II门的铁血赫德卡,有着铜墙铁壁的防守能力,有着超级强力的电光炮,它的防御之门你能够开启吗?',1,''),
|
||||
(78,'伊兰罗尼',227,1,5,507,507,'守护暗黑Ⅴ-Ⅲ门的伊兰罗尼是优雅得体的淑女,擅长在裙摆飘飘、光芒闪耀间使出杀手。',1,''),
|
||||
(117,'斯加尔卡',356,1,5,508,508,'暗黑VI-I门的守护者,擅长使用暗黑电能的家伙,比起折磨对手的身体,斯加尔卡更喜欢震慑对手的心灵。',1,''),
|
||||
(118,'艾尔伊洛',297,1,5,508,508,'暗黑VI-II门的守护者,历经了炼狱洗礼的艾尔伊洛开始崇尚爽快的攻击方式,喜欢凭借精湛的技巧近距地伤害对手。',1,''),
|
||||
(119,'布林克克',359,1,5,508,508,'暗黑VI-III门的守护者,拥有海妖之力的庇护,体内充满着混沌的能量企图吞噬整个海洋。',1,''),
|
||||
(502,'魔花使者',438,1,5,509,509,'暗黑VII-I门的守护者,比恩特的进化形态,浑身散发着反物质世界中的黑暗气息,散发出来的毒粉是它的致命武器。',1,''),
|
||||
(503,'莫尔加斯',441,1,5,509,509,'暗黑VII-II门的守护者,莫鲁格尔的进化形态,受到了反物质世界的影响,浑身被黑暗所包围,拥有极强的防御能力,所有攻击在它面前都显得非常渺小。',1,''),
|
||||
(504,'萨诺拉斯',435,1,5,509,509,'暗黑VII-III门的守护者,萨诺的进化形态,经过岩浆洗礼的皮肤拥有独特的降温功能,即使在极其炎热的环境下依然不受影响。',1,''),
|
||||
(606,'帕多尼',656,1,5,510,510,'暗黑Ⅷ-Ⅰ门的守护者,浑身充斥着暗黑能量,暗黑能量会随着它的歌神散发出来。',1,''),
|
||||
(607,'加洛德',659,1,5,510,510,'暗黑Ⅷ-Ⅱ门的守护,暗黑能量的注入,使它的脾气变得暴躁,擅长与对手近身搏斗,浑身的尖刺、催生出的植物都是它进攻的利器。',1,''),
|
||||
(608,'萨多拉尼',661,1,5,510,510,'暗黑Ⅷ-Ⅲ门的守护,将暗黑能量融入自身,肢体变得非常结实有力,虽然体积很小,但是却拥有了堪比巨龙的神力。',1,'')
|
||||
ON CONFLICT (task_id) DO UPDATE
|
||||
SET
|
||||
title = EXCLUDED.title,
|
||||
pet_id = EXCLUDED.pet_id,
|
||||
online = EXCLUDED.online,
|
||||
level = EXCLUDED.level,
|
||||
seat_id = EXCLUDED.seat_id,
|
||||
enter_id = EXCLUDED.enter_id,
|
||||
description = EXCLUDED.description,
|
||||
is_enable = EXCLUDED.is_enable,
|
||||
remark = EXCLUDED.remark,
|
||||
"updateTime" = NOW();
|
||||
|
||||
COMMIT;
|
||||
@@ -4,6 +4,7 @@ import (
|
||||
"blazing/common/socket/errorcode"
|
||||
logicplayer "blazing/logic/service/player"
|
||||
"blazing/logic/service/user"
|
||||
baseservice "blazing/modules/base/service"
|
||||
configservice "blazing/modules/config/service"
|
||||
playerservice "blazing/modules/player/service"
|
||||
"strings"
|
||||
@@ -14,6 +15,11 @@ import (
|
||||
func (h Controller) CDK(data *C2S_GET_GIFT_COMPLETE, player *logicplayer.Player) (result *user.S2C_GET_GIFT_COMPLETE, err errorcode.ErrorCode) {
|
||||
result = &user.S2C_GET_GIFT_COMPLETE{}
|
||||
|
||||
userInfo := baseservice.NewBaseSysUserService().GetPerson(data.Head.UserID)
|
||||
if userInfo == nil || userInfo.QQ == 0 {
|
||||
return nil, errorcode.ErrorCodes.ErrCannotPerformAction
|
||||
}
|
||||
|
||||
cdkCode := strings.Trim(data.PassText, "\x00")
|
||||
cdkService := configservice.NewCdkService()
|
||||
now := time.Now()
|
||||
|
||||
@@ -74,7 +74,6 @@ var limiter *ratelimit.Rule = ratelimit.NewRule()
|
||||
|
||||
// 简单规则案例
|
||||
func init() {
|
||||
|
||||
//步骤二:增加一条或者多条规则组成复合规则,此复合规则必须至少包含一条规则
|
||||
limiter.AddRule(time.Second*1, 20)
|
||||
//步骤三:调用函数判断某用户是否允许访问 allow:= r.AllowVisit(user)
|
||||
|
||||
@@ -2,41 +2,60 @@ package blazing
|
||||
|
||||
import (
|
||||
_ "blazing/modules/config/controller"
|
||||
_ "blazing/modules/config/packed"
|
||||
_ "blazing/modules/config/model"
|
||||
_ "blazing/modules/config/service"
|
||||
|
||||
"blazing/cool"
|
||||
"blazing/modules/config/model"
|
||||
configModel "blazing/modules/config/model"
|
||||
|
||||
"github.com/gogf/gf/v2/encoding/gjson"
|
||||
"github.com/gogf/gf/v2/frame/g"
|
||||
"github.com/gogf/gf/v2/os/gfile"
|
||||
"github.com/gogf/gf/v2/os/gctx"
|
||||
)
|
||||
|
||||
func init() {
|
||||
var (
|
||||
ctx = gctx.GetInitCtx()
|
||||
mod bool
|
||||
)
|
||||
cool.Logger.Debug(ctx, "module config init start ...")
|
||||
cool.FillInitData(ctx, "config", model.NewSptConfig(), &mod)
|
||||
if mod {
|
||||
if err := g.DB("default").Model("base_sys_menu").Where("name", "SPT配置").Delete(); err != nil {
|
||||
cool.Logger.Warning(ctx, "cleanup duplicated SPT menu failed:", err)
|
||||
|
||||
// 首次初始化 SPT 默认数据(不依赖 XML)。
|
||||
sptModel := configModel.NewSptConfig()
|
||||
count, err := g.DB("default").Model(sptModel.TableName()).Count()
|
||||
if err != nil {
|
||||
cool.Logger.Warning(ctx, "count config_spt failed:", err)
|
||||
} else if count == 0 {
|
||||
initPath := "modules/config/resource/initjson/config_spt.json"
|
||||
content := gfile.GetBytes(initPath)
|
||||
if len(content) == 0 {
|
||||
cool.Logger.Warning(ctx, "config_spt init file is empty:", initPath)
|
||||
} else {
|
||||
jsonData, jErr := gjson.LoadContent(content)
|
||||
if jErr != nil {
|
||||
cool.Logger.Warning(ctx, "load config_spt init json failed:", jErr)
|
||||
} else {
|
||||
_, err = g.DB("default").Model(sptModel.TableName()).Data(jsonData.Var()).Insert()
|
||||
}
|
||||
}
|
||||
_, err := g.DB("default").Model("base_sys_menu").Data(g.Map{
|
||||
"parentId": 2,
|
||||
"name": "SPT配置",
|
||||
"router": "/config/spt",
|
||||
"viewPath": "config/views/spt.vue",
|
||||
"module": "config-spt",
|
||||
"icon": "list",
|
||||
"orderNum": 70,
|
||||
"keepAlive": true,
|
||||
"isShow": 1,
|
||||
"type": 1,
|
||||
"isEnable": 1,
|
||||
"permission": "",
|
||||
if err != nil {
|
||||
cool.Logger.Warning(ctx, "insert default config_spt failed:", err)
|
||||
}
|
||||
}
|
||||
|
||||
menuCount, err := g.DB("default").Model("base_sys_menu").Where("router", "/config/spt").Count()
|
||||
if err != nil {
|
||||
cool.Logger.Warning(ctx, "count SPT menu failed:", err)
|
||||
} else if menuCount == 0 {
|
||||
_, err = g.DB("default").Model("base_sys_menu").Data(g.Map{
|
||||
"parentId": 2,
|
||||
"name": "SPT配置",
|
||||
"router": "/config/spt",
|
||||
"viewPath": "config/views/spt.vue",
|
||||
"icon": "icon-menu",
|
||||
"ordernum": 70,
|
||||
"keepAlive": true,
|
||||
"isShow": true,
|
||||
"type": 1,
|
||||
}).Insert()
|
||||
if err != nil {
|
||||
cool.Logger.Warning(ctx, "insert SPT menu failed:", err)
|
||||
|
||||
@@ -2,6 +2,7 @@ package admin
|
||||
|
||||
import (
|
||||
"blazing/cool"
|
||||
"blazing/modules/config/model"
|
||||
"blazing/modules/config/service"
|
||||
)
|
||||
|
||||
@@ -10,6 +11,15 @@ type SptController struct {
|
||||
}
|
||||
|
||||
func init() {
|
||||
// 仅为新加的 SPT 表做定点迁移,避免首次启用 EPS 时读取表结构报错。
|
||||
db, err := cool.InitDB("default")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
if err = db.AutoMigrate(model.NewSptConfig()); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
cool.RegisterController(&SptController{
|
||||
&cool.Controller{
|
||||
Prefix: "/admin/config/spt",
|
||||
|
||||
@@ -12,6 +12,11 @@ type SptConfig struct {
|
||||
|
||||
TaskID uint32 `gorm:"not null;uniqueIndex;comment:'SPT任务ID'" json:"task_id" description:"SPT任务ID"`
|
||||
Title string `gorm:"type:varchar(64);not null;default:'';comment:'SPT名字'" json:"title" description:"SPT名字"`
|
||||
PetID uint32 `gorm:"not null;default:0;comment:'SPT精灵ID'" json:"pet_id" description:"SPT精灵ID"`
|
||||
Online int32 `gorm:"not null;default:1;comment:'是否开放(1开放/0未开放)'" json:"online" description:"是否开放"`
|
||||
Level uint32 `gorm:"not null;default:1;comment:'SPT星级'" json:"level" description:"SPT星级"`
|
||||
SeatID uint32 `gorm:"not null;default:0;comment:'所在地图点位ID'" json:"seat_id" description:"所在地图点位ID"`
|
||||
EnterID uint32 `gorm:"not null;default:0;comment:'进入地图ID'" json:"enter_id" description:"进入地图ID"`
|
||||
Description string `gorm:"type:text;not null;default:'';comment:'SPT描述'" json:"description" description:"SPT描述"`
|
||||
}
|
||||
|
||||
|
||||
@@ -1,100 +0,0 @@
|
||||
[
|
||||
{
|
||||
"task_id": 301,
|
||||
"title": "蘑菇怪",
|
||||
"description": "生活在克洛斯星,被艾里逊的液氮冻伤而发狂,使用火焰喷射器可以使它安静下来。制服它可以获得草系精灵小蘑菇。",
|
||||
"is_enable": 1,
|
||||
"remark": "SPT默认数据"
|
||||
},
|
||||
{
|
||||
"task_id": 302,
|
||||
"title": "钢牙鲨",
|
||||
"description": "海洋星海底的危险怪兽,据说它躲藏的洞穴中有制作黑武士装的黑晶矿石。记住,到海底一定要穿上耐压的潜水套装。",
|
||||
"is_enable": 1,
|
||||
"remark": "SPT默认数据"
|
||||
},
|
||||
{
|
||||
"task_id": 303,
|
||||
"title": "里奥斯",
|
||||
"description": "海盗艾里逊在火山被它困住,战胜它有机会获得火系精灵“胡里亚”。在火山,你会用到喷水装的。",
|
||||
"is_enable": 1,
|
||||
"remark": "SPT默认数据"
|
||||
},
|
||||
{
|
||||
"task_id": 304,
|
||||
"title": "阿克希亚",
|
||||
"description": "塞西利亚星的守护者,正义的精灵圣兽,它是不可战胜的,千年来一直等待着宿命的对手。",
|
||||
"is_enable": 1,
|
||||
"remark": "SPT默认数据"
|
||||
},
|
||||
{
|
||||
"task_id": 305,
|
||||
"title": "提亚斯",
|
||||
"description": "云霄星出现了一只极具攻击性的变异精灵,拥有很多蛋的它虽然想要努力呵护自己的孩子却力不从心,看来需要大家帮帮忙啊。",
|
||||
"is_enable": 1,
|
||||
"remark": "SPT默认数据"
|
||||
},
|
||||
{
|
||||
"task_id": 306,
|
||||
"title": "雷伊",
|
||||
"description": "赫尔卡星天空中划过一道闪电,映出了一个酷似精灵的黑影,它全身被电流包围,从它的神态中可以看出它正等待来自各方的挑战。",
|
||||
"is_enable": 1,
|
||||
"remark": "SPT默认数据"
|
||||
},
|
||||
{
|
||||
"task_id": 307,
|
||||
"title": "纳多雷",
|
||||
"description": "在双子阿尔法星上,特派队遇见了一只巨大的精灵,经过多次挑战后,它仍然丝毫无损,赛尔们是否有办法战胜这只精灵呢?",
|
||||
"is_enable": 1,
|
||||
"remark": "SPT默认数据"
|
||||
},
|
||||
{
|
||||
"task_id": 308,
|
||||
"title": "雷纳多",
|
||||
"description": "彪悍的雷纳多盘踞在双子贝塔星上,和双子阿尔法星的纳多雷遥相对应,守护着星球上所有精灵的。",
|
||||
"is_enable": 1,
|
||||
"remark": "SPT默认数据"
|
||||
},
|
||||
{
|
||||
"task_id": 309,
|
||||
"title": "尤纳斯",
|
||||
"description": "黑暗之门的制造者,拥有能够抵御一切的暗影屏障和所有能量来源的黑暗之核。",
|
||||
"is_enable": 1,
|
||||
"remark": "SPT默认数据"
|
||||
},
|
||||
{
|
||||
"task_id": 310,
|
||||
"title": "魔狮迪露",
|
||||
"description": "魔狮迪露具有神秘的力量,能使自己的体力突破界限,但同时也会受到未知的惩罚。",
|
||||
"is_enable": 1,
|
||||
"remark": "SPT默认数据"
|
||||
},
|
||||
{
|
||||
"task_id": 311,
|
||||
"title": "哈莫雷特",
|
||||
"description": "拥有无比巨大的身躯,集水火草三种原能为一身,龙系的神秘力量使它所向无敌。失忆的它,似乎还有很多谜团……",
|
||||
"is_enable": 1,
|
||||
"remark": "SPT默认数据"
|
||||
},
|
||||
{
|
||||
"task_id": 312,
|
||||
"title": "奈尼芬多",
|
||||
"description": "奈尼芬多是爱迪星的守护者,凄美的歌声连月亮都为之倾倒,据说只有音乐的力量才能够唤醒它。",
|
||||
"is_enable": 1,
|
||||
"remark": "SPT默认数据"
|
||||
},
|
||||
{
|
||||
"task_id": 316,
|
||||
"title": "厄尔塞拉",
|
||||
"description": "浑身散发着各色光芒,任何邪恶在她的光芒下消散无形",
|
||||
"is_enable": 1,
|
||||
"remark": "SPT默认数据"
|
||||
},
|
||||
{
|
||||
"task_id": 50,
|
||||
"title": "卡特斯",
|
||||
"description": "作为暗黑武斗场的试炼精灵,守护着试炼之门,它的气度和风度非同一般,杀气重重很难对付!",
|
||||
"is_enable": 1,
|
||||
"remark": "SPT默认数据"
|
||||
}
|
||||
]
|
||||
@@ -2,6 +2,7 @@ package app
|
||||
|
||||
import (
|
||||
"blazing/cool"
|
||||
baseservice "blazing/modules/base/service"
|
||||
configservice "blazing/modules/config/service"
|
||||
playerservice "blazing/modules/player/service"
|
||||
"context"
|
||||
@@ -118,6 +119,10 @@ func (c *CdkController) DonationRedeem(ctx context.Context, req *DonationRedeemR
|
||||
return cool.Fail("未登录或登录已失效"), nil
|
||||
}
|
||||
ownerID := uint32(admin.UserId)
|
||||
user := baseservice.NewBaseSysUserService().GetPerson(ownerID)
|
||||
if user == nil || user.QQ == 0 {
|
||||
return cool.Fail("请先绑定QQ"), nil
|
||||
}
|
||||
|
||||
cdkCode := strings.TrimSpace(req.CDKCode)
|
||||
if cdkCode == "" {
|
||||
|
||||
Reference in New Issue
Block a user