c
This commit is contained in:
parent
d562c644dd
commit
23c83b745c
@ -14,11 +14,19 @@ func RegisterGameApi(handler IGameApi) {
|
|||||||
gameApiInstance = handler
|
gameApiInstance = handler
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ResourceBtnInfo struct {
|
||||||
|
Key string `json:"key"` // 按钮关键词,用于后端判断点击按钮
|
||||||
|
Name string `json:"name"` // 按钮中文名
|
||||||
|
BtnType string `json:"btn_type"` // primary warn等
|
||||||
|
}
|
||||||
|
|
||||||
type ResourceInitInfo struct {
|
type ResourceInitInfo struct {
|
||||||
Resource string `json:"resource"`
|
Resource string `json:"resource"`
|
||||||
Desc string `json:"desc"`
|
Desc string `json:"desc"`
|
||||||
ShowMethods []string `json:"show_methods"` // 资源权限列表
|
ShowMethods []string `json:"show_methods"` // 资源权限列表
|
||||||
MethodsPermissionStr []string `json:"methods_permission"` // 资源权限字符串
|
MethodsPermissionStr []string `json:"methods_permission"` // 资源权限字符串
|
||||||
|
GlobalBtns []*ResourceBtnInfo `json:"global_btns"` // 页面全局按钮,放在新增后面
|
||||||
|
RowBtns []*ResourceBtnInfo `json:"row_btns"` // 页面每一行的功能按钮
|
||||||
}
|
}
|
||||||
|
|
||||||
type ProjectInitInfo struct {
|
type ProjectInitInfo struct {
|
||||||
|
@ -21,7 +21,19 @@ type CommonResourceService struct {
|
|||||||
|
|
||||||
func initCommonResourcesRepo(db *gorm.DB) {
|
func initCommonResourcesRepo(db *gorm.DB) {
|
||||||
r(consts.ResourcesName_Project, "项目管理", repo.NewCommonResourceRepo(db, &model.Project{}), ShowMethod_Get|ShowMethod_Post|ShowMethod_Put|ShowMethod_Delete)
|
r(consts.ResourcesName_Project, "项目管理", repo.NewCommonResourceRepo(db, &model.Project{}), ShowMethod_Get|ShowMethod_Post|ShowMethod_Put|ShowMethod_Delete)
|
||||||
r(consts.ResourcesName_Server, "服务器管理", repo.NewCommonResourceRepo(db, &model.Server{}), ShowMethod_Get|ShowMethod_Post|ShowMethod_Put|ShowMethod_Delete)
|
|
||||||
|
{
|
||||||
|
serverRepo := r(consts.ResourcesName_Server, "服务器管理", repo.NewCommonResourceRepo(db, &model.Server{}), ShowMethod_Get|ShowMethod_Post|ShowMethod_Put|ShowMethod_Delete)
|
||||||
|
serverRepo.GlobalBtns = []*api.ResourceBtnInfo{
|
||||||
|
{Key: consts.BtnKeyGlobal_Server_DownAll, Name: "一键停服", BtnType: "info"},
|
||||||
|
{Key: consts.BtnKeyGlobal_Server_UpAll, Name: "一键起服", BtnType: "warning"},
|
||||||
|
}
|
||||||
|
serverRepo.RowBtns = []*api.ResourceBtnInfo{
|
||||||
|
{Key: consts.BtnKeyRow_Server_Down, Name: "停服", BtnType: "info"},
|
||||||
|
{Key: consts.BtnKeyRow_Server_Up, Name: "起服", BtnType: "warning"},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
r(consts.ResourcesName_Account, "账号列表", repo.NewCommonResourceRepo(db, &model.Account{}), ShowMethod_Get) // 账号管理不需要在后台读写数据,都是通过项目api拉
|
r(consts.ResourcesName_Account, "账号列表", repo.NewCommonResourceRepo(db, &model.Account{}), ShowMethod_Get) // 账号管理不需要在后台读写数据,都是通过项目api拉
|
||||||
r(consts.ResourcesName_SupportAccount, "扶持账号", repo.NewCommonResourceRepo(db, &model.SupportAccount{}), ShowMethod_Get|ShowMethod_Post|ShowMethod_Delete) // 扶持账号,只是标记哪些账号是扶持好
|
r(consts.ResourcesName_SupportAccount, "扶持账号", repo.NewCommonResourceRepo(db, &model.SupportAccount{}), ShowMethod_Get|ShowMethod_Post|ShowMethod_Delete) // 扶持账号,只是标记哪些账号是扶持好
|
||||||
r(consts.ResourcesName_Role, "角色列表", repo.NewCommonResourceRepo(db, &model.Role{}), ShowMethod_Get) // 角色管理不需要在后台读写数据,都是通过项目api拉
|
r(consts.ResourcesName_Role, "角色列表", repo.NewCommonResourceRepo(db, &model.Role{}), ShowMethod_Get) // 角色管理不需要在后台读写数据,都是通过项目api拉
|
||||||
@ -29,8 +41,8 @@ func initCommonResourcesRepo(db *gorm.DB) {
|
|||||||
r(consts.ResourcesName_Ban, "封禁管理", repo.NewCommonResourceRepo(db, &model.Ban{}), ShowMethod_Get|ShowMethod_Post|ShowMethod_Put|ShowMethod_Delete)
|
r(consts.ResourcesName_Ban, "封禁管理", repo.NewCommonResourceRepo(db, &model.Ban{}), ShowMethod_Get|ShowMethod_Post|ShowMethod_Put|ShowMethod_Delete)
|
||||||
r(consts.ResourcesName_MailRole, "个人邮件", repo.NewCommonResourceRepo(db, &model.RoleMail{}), ShowMethod_Get|ShowMethod_Post) // 个人邮件发放就没法撤回?
|
r(consts.ResourcesName_MailRole, "个人邮件", repo.NewCommonResourceRepo(db, &model.RoleMail{}), ShowMethod_Get|ShowMethod_Post) // 个人邮件发放就没法撤回?
|
||||||
r(consts.ResourcesName_MailGlobal, "全服邮件", repo.NewCommonResourceRepo(db, &model.GlobalMail{}), ShowMethod_Get|ShowMethod_Post) // 直接删除,别修改了,玩家收到的更乱
|
r(consts.ResourcesName_MailGlobal, "全服邮件", repo.NewCommonResourceRepo(db, &model.GlobalMail{}), ShowMethod_Get|ShowMethod_Post) // 直接删除,别修改了,玩家收到的更乱
|
||||||
r(consts.ResourcesName_Notice, "公告", repo.NewCommonResourceRepo(db, &model.Notice{}), ShowMethod_Get|ShowMethod_Post|ShowMethod_Put|ShowMethod_Delete)
|
|
||||||
r(consts.ResourcesName_CDKey, "礼包码", repo.NewCommonResourceRepo(db, &model.CDKey{}), ShowMethod_Get|ShowMethod_Post|ShowMethod_Put|ShowMethod_Delete)
|
r(consts.ResourcesName_CDKey, "礼包码", repo.NewCommonResourceRepo(db, &model.CDKey{}), ShowMethod_Get|ShowMethod_Post|ShowMethod_Put|ShowMethod_Delete)
|
||||||
|
r(consts.ResourcesName_Notice, "公告(暂无)", repo.NewCommonResourceRepo(db, &model.Notice{}), ShowMethod_Get|ShowMethod_Post|ShowMethod_Put|ShowMethod_Delete)
|
||||||
r(consts.ResourcesName_DevicePush, "设备推送(暂无)", repo.NewCommonResourceRepo(db, &model.DevicePush{}), ShowMethod_Get)
|
r(consts.ResourcesName_DevicePush, "设备推送(暂无)", repo.NewCommonResourceRepo(db, &model.DevicePush{}), ShowMethod_Get)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -101,7 +113,7 @@ func (svc *CommonResourceService) Create(projectId int, resource string, dtoObj
|
|||||||
}
|
}
|
||||||
|
|
||||||
createOne := func(obj dto.CommonDtoValues) (dto.CommonDtoValues, error) {
|
createOne := func(obj dto.CommonDtoValues) (dto.CommonDtoValues, error) {
|
||||||
et, err := findCommResourceRepo(resource).Create(projectEt, obj)
|
et, err := findCommResourceRepo(resource).Create(projectEt, resource, obj)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -200,6 +212,20 @@ func (svc *CommonResourceService) Delete(projectId int, resource string, id int)
|
|||||||
return oldEt, nil
|
return oldEt, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (svc *CommonResourceService) RowsSelection(projectId int, resourceName string, params *dto.CommonRowsSelectionReq) (*dto.CommonRowsSelectionRsp, error) {
|
||||||
|
_, projectEt, find, err := svc.projectRepo.GetById(projectId)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if resourceName != consts.ResourcesName_Project && !find {
|
||||||
|
return nil, errcode.New(errcode.ServerError, "not found project %v db data", projectId)
|
||||||
|
}
|
||||||
|
if hook, ok := projects.GetProjectResourceHook(projectEt, resourceName).(projects.IPostResourceOpRowsHook); ok {
|
||||||
|
return hook.RowsSelection(projectEt, resourceName, params.BtnKey, params.Rows)
|
||||||
|
}
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (svc *CommonResourceService) GetSupportResourcesList(permissions []string) []*api.ResourceInitInfo {
|
func (svc *CommonResourceService) GetSupportResourcesList(permissions []string) []*api.ResourceInitInfo {
|
||||||
list := make([]*api.ResourceInitInfo, 0, len(commResourcesRepo))
|
list := make([]*api.ResourceInitInfo, 0, len(commResourcesRepo))
|
||||||
for _, v := range commResourcesRepo {
|
for _, v := range commResourcesRepo {
|
||||||
@ -207,6 +233,8 @@ func (svc *CommonResourceService) GetSupportResourcesList(permissions []string)
|
|||||||
Resource: v.Resource,
|
Resource: v.Resource,
|
||||||
Desc: v.Desc,
|
Desc: v.Desc,
|
||||||
ShowMethods: v.ShowMethods,
|
ShowMethods: v.ShowMethods,
|
||||||
|
GlobalBtns: v.GlobalBtns,
|
||||||
|
RowBtns: v.RowBtns,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
return list
|
return list
|
||||||
@ -225,11 +253,13 @@ type resourceRepoInfo struct {
|
|||||||
Repo repo.ICommonResourceRepo
|
Repo repo.ICommonResourceRepo
|
||||||
ShowMethods []string
|
ShowMethods []string
|
||||||
showMethods int
|
showMethods int
|
||||||
|
GlobalBtns []*api.ResourceBtnInfo
|
||||||
|
RowBtns []*api.ResourceBtnInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
var commResourcesRepo = make([]*resourceRepoInfo, 0)
|
var commResourcesRepo = make([]*resourceRepoInfo, 0)
|
||||||
|
|
||||||
func r(resource, desc string, repo repo.ICommonResourceRepo, showMethods int) {
|
func r(resource, desc string, repo repo.ICommonResourceRepo, showMethods int) *resourceRepoInfo {
|
||||||
curRepo := &resourceRepoInfo{
|
curRepo := &resourceRepoInfo{
|
||||||
Resource: resource,
|
Resource: resource,
|
||||||
Desc: desc,
|
Desc: desc,
|
||||||
@ -251,6 +281,8 @@ func r(resource, desc string, repo repo.ICommonResourceRepo, showMethods int) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
commResourcesRepo = append(commResourcesRepo, curRepo)
|
commResourcesRepo = append(commResourcesRepo, curRepo)
|
||||||
|
|
||||||
|
return curRepo
|
||||||
}
|
}
|
||||||
|
|
||||||
func findCommResourceRepo(resource string) repo.ICommonResourceRepo {
|
func findCommResourceRepo(resource string) repo.ICommonResourceRepo {
|
||||||
|
@ -23,6 +23,10 @@ type IPostResourceOpDeleteHook interface {
|
|||||||
Delete(projectInfo *entity.Project, resource string, dtoObj dto.CommonDtoValues) error
|
Delete(projectInfo *entity.Project, resource string, dtoObj dto.CommonDtoValues) error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type IPostResourceOpRowsHook interface {
|
||||||
|
RowsSelection(projectInfo *entity.Project, resource string, btnKey string, dtoObjs []dto.CommonDtoValues) (*dto.CommonRowsSelectionRsp, error)
|
||||||
|
}
|
||||||
|
|
||||||
type IGetAllValueChoicesHook interface {
|
type IGetAllValueChoicesHook interface {
|
||||||
// 获取所有道具,可以用于前端页面做下拉选择等
|
// 获取所有道具,可以用于前端页面做下拉选择等
|
||||||
GetItems(projectInfo *entity.Project) ([]*dto.CommonDtoFieldChoice, error)
|
GetItems(projectInfo *entity.Project) ([]*dto.CommonDtoFieldChoice, error)
|
||||||
|
@ -42,20 +42,20 @@ func (hook *BanHook) Create(projectInfo *entity.Project, resource string, dtoObj
|
|||||||
params.Add("server", banInfo.ServerConfID)
|
params.Add("server", banInfo.ServerConfID)
|
||||||
params.Add("roleid", roleId)
|
params.Add("roleid", roleId)
|
||||||
|
|
||||||
expireAt := banInfo.ExpireAt.Unix()
|
expireAt := banInfo.ExpireAt
|
||||||
|
|
||||||
if expireAt <= 0 {
|
if !expireAt.Valid {
|
||||||
// 解封
|
// 解封
|
||||||
params.Add("forbidtime", "0")
|
params.Add("forbidtime", "0")
|
||||||
params.Add("desc", banInfo.BanReason)
|
params.Add("desc", banInfo.BanReason)
|
||||||
params.Add("notifytouser", banInfo.BanNotifyReason)
|
params.Add("notifytouser", banInfo.BanNotifyReason)
|
||||||
} else {
|
} else {
|
||||||
dura := (expireAt - time.Now().Unix()) / 60 // 神魔大陆封禁是分钟
|
dura := int64(expireAt.Time.Sub(time.Now()).Minutes()) // 神魔大陆封禁是分钟
|
||||||
if dura <= 0 {
|
if dura <= 0 {
|
||||||
// 解封
|
// 解封
|
||||||
params.Add("forbidtime", "0")
|
params.Add("forbidtime", "0")
|
||||||
} else {
|
} else {
|
||||||
params.Add("forbidtime", strconv.FormatInt(dura, 10))
|
params.Add("forbidtime", strconv.FormatInt(int64(dura), 10))
|
||||||
params.Add("desc", banInfo.BanReason)
|
params.Add("desc", banInfo.BanReason)
|
||||||
params.Add("notifytouser", banInfo.BanNotifyReason)
|
params.Add("notifytouser", banInfo.BanNotifyReason)
|
||||||
}
|
}
|
||||||
@ -70,6 +70,59 @@ func (hook *BanHook) Create(projectInfo *entity.Project, resource string, dtoObj
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (hook *BanHook) Edit(projectInfo *entity.Project, resource string, dtoObj dto.CommonDtoValues) error {
|
||||||
|
alisrvAddr := projectInfo.GetApiAddr()
|
||||||
|
if alisrvAddr == "" {
|
||||||
|
return errcode.New(errcode.ServerError, "项目%v没有配置api服务器地址", projectInfo.Po.Name)
|
||||||
|
}
|
||||||
|
|
||||||
|
et := (&entity.CommonResource{}).FromPo(&model.Ban{}).FromDto(dtoObj)
|
||||||
|
banInfo := et.ToPo().(*model.Ban)
|
||||||
|
|
||||||
|
banApi := ""
|
||||||
|
switch banInfo.BanType {
|
||||||
|
case consts.BanType_Role:
|
||||||
|
banApi = "banrole"
|
||||||
|
case consts.BanType_RoleChat:
|
||||||
|
banApi = "banroletalk"
|
||||||
|
default:
|
||||||
|
xlog.Warnf("神魔大陆不支持此类型的封禁:%v", banInfo.BanType)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
roleId := banInfo.Value
|
||||||
|
|
||||||
|
params := &url.Values{}
|
||||||
|
params.Add("server", banInfo.ServerConfID)
|
||||||
|
params.Add("roleid", roleId)
|
||||||
|
|
||||||
|
expireAt := banInfo.ExpireAt
|
||||||
|
|
||||||
|
if !expireAt.Valid {
|
||||||
|
// 解封
|
||||||
|
params.Add("forbidtime", "0")
|
||||||
|
params.Add("desc", banInfo.BanReason)
|
||||||
|
params.Add("notifytouser", banInfo.BanNotifyReason)
|
||||||
|
} else {
|
||||||
|
dura := int64(expireAt.Time.Sub(time.Now()).Minutes()) // 神魔大陆封禁是分钟
|
||||||
|
if dura <= 0 {
|
||||||
|
// 解封
|
||||||
|
params.Add("forbidtime", "0")
|
||||||
|
} else {
|
||||||
|
params.Add("forbidtime", strconv.FormatInt(int64(dura), 10))
|
||||||
|
params.Add("desc", banInfo.BanReason)
|
||||||
|
params.Add("notifytouser", banInfo.BanNotifyReason)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rsp := make(map[string]any)
|
||||||
|
err := httpclient.Request(alisrvAddr+"/"+banApi, "get", params, &rsp)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (hook *BanHook) Delete(projectInfo *entity.Project, resource string, dtoObj dto.CommonDtoValues) error {
|
func (hook *BanHook) Delete(projectInfo *entity.Project, resource string, dtoObj dto.CommonDtoValues) error {
|
||||||
alisrvAddr := projectInfo.GetApiAddr()
|
alisrvAddr := projectInfo.GetApiAddr()
|
||||||
if alisrvAddr == "" {
|
if alisrvAddr == "" {
|
||||||
|
@ -9,8 +9,6 @@ import (
|
|||||||
"admin/lib/httpclient"
|
"admin/lib/httpclient"
|
||||||
"admin/lib/xlog"
|
"admin/lib/xlog"
|
||||||
"net/url"
|
"net/url"
|
||||||
"strconv"
|
|
||||||
"time"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type NoticeHook struct {
|
type NoticeHook struct {
|
||||||
@ -22,55 +20,57 @@ func (hook *NoticeHook) Create(projectInfo *entity.Project, resource string, dto
|
|||||||
return errcode.New(errcode.ServerError, "项目%v没有配置api服务器地址", projectInfo.Po.Name)
|
return errcode.New(errcode.ServerError, "项目%v没有配置api服务器地址", projectInfo.Po.Name)
|
||||||
}
|
}
|
||||||
|
|
||||||
et := (&entity.CommonResource{}).FromPo(&model.Ban{}).FromDto(dtoObj)
|
//et := (&entity.CommonResource{}).FromPo(&model.Notice{}).FromDto(dtoObj)
|
||||||
banInfo := et.ToPo().(*model.Ban)
|
//banInfo := et.ToPo().(*model.Notice)
|
||||||
|
//
|
||||||
banApi := ""
|
//banApi := ""
|
||||||
switch banInfo.BanType {
|
//switch banInfo.BanType {
|
||||||
case consts.BanType_Role:
|
//case consts.BanType_Role:
|
||||||
banApi = "banrole"
|
// banApi = "banrole"
|
||||||
case consts.BanType_RoleChat:
|
//case consts.BanType_RoleChat:
|
||||||
banApi = "banroletalk"
|
// banApi = "banroletalk"
|
||||||
default:
|
//default:
|
||||||
xlog.Warnf("神魔大陆不支持此类型的封禁:%v", banInfo.BanType)
|
// xlog.Warnf("神魔大陆不支持此类型的封禁:%v", banInfo.BanType)
|
||||||
return nil
|
// return nil
|
||||||
}
|
//}
|
||||||
|
//
|
||||||
roleId := banInfo.Value
|
//roleId := banInfo.Value
|
||||||
|
//
|
||||||
params := &url.Values{}
|
//params := &url.Values{}
|
||||||
params.Add("server", banInfo.ServerConfID)
|
//params.Add("server", banInfo.ServerConfID)
|
||||||
params.Add("roleid", roleId)
|
//params.Add("roleid", roleId)
|
||||||
|
//
|
||||||
expireAt := banInfo.ExpireAt.Unix()
|
//expireAt := banInfo.ExpireAt.Unix()
|
||||||
|
//
|
||||||
if expireAt <= 0 {
|
//if expireAt <= 0 {
|
||||||
// 解封
|
// // 解封
|
||||||
params.Add("forbidtime", "0")
|
// params.Add("forbidtime", "0")
|
||||||
params.Add("desc", banInfo.BanReason)
|
// params.Add("desc", banInfo.BanReason)
|
||||||
params.Add("notifytouser", banInfo.BanNotifyReason)
|
// params.Add("notifytouser", banInfo.BanNotifyReason)
|
||||||
} else {
|
//} else {
|
||||||
dura := (expireAt - time.Now().Unix()) / 60 // 神魔大陆封禁是分钟
|
// dura := (expireAt - time.Now().Unix()) / 60 // 神魔大陆封禁是分钟
|
||||||
if dura <= 0 {
|
// if dura <= 0 {
|
||||||
// 解封
|
// // 解封
|
||||||
params.Add("forbidtime", "0")
|
// params.Add("forbidtime", "0")
|
||||||
} else {
|
// } else {
|
||||||
params.Add("forbidtime", strconv.FormatInt(dura, 10))
|
// params.Add("forbidtime", strconv.FormatInt(dura, 10))
|
||||||
params.Add("desc", banInfo.BanReason)
|
// params.Add("desc", banInfo.BanReason)
|
||||||
params.Add("notifytouser", banInfo.BanNotifyReason)
|
// params.Add("notifytouser", banInfo.BanNotifyReason)
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
//
|
||||||
rsp := make(map[string]any)
|
//rsp := make(map[string]any)
|
||||||
err := httpclient.Request(alisrvAddr+"/"+banApi, "get", params, &rsp)
|
//err := httpclient.Request(alisrvAddr+"/"+banApi, "get", params, &rsp)
|
||||||
if err != nil {
|
//if err != nil {
|
||||||
return err
|
// return err
|
||||||
}
|
//}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (hook *NoticeHook) Delete(projectInfo *entity.Project, resource string, dtoObj dto.CommonDtoValues) error {
|
func (hook *NoticeHook) Delete(projectInfo *entity.Project, resource string, dtoObj dto.CommonDtoValues) error {
|
||||||
|
return nil
|
||||||
|
|
||||||
alisrvAddr := projectInfo.GetApiAddr()
|
alisrvAddr := projectInfo.GetApiAddr()
|
||||||
if alisrvAddr == "" {
|
if alisrvAddr == "" {
|
||||||
return errcode.New(errcode.ServerError, "项目%v没有配置api服务器地址", projectInfo.Po.Name)
|
return errcode.New(errcode.ServerError, "项目%v没有配置api服务器地址", projectInfo.Po.Name)
|
||||||
|
@ -58,6 +58,13 @@ func (hook *ServerHook) List(projectInfo *entity.Project, resource string, param
|
|||||||
return totalCount, fields, rows, nil
|
return totalCount, fields, rows, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (hook *ServerHook) RowsSelection(projectInfo *entity.Project, resource string, btnKey string, dtoObjs []dto.CommonDtoValues) (*dto.CommonRowsSelectionRsp, error) {
|
||||||
|
return &dto.CommonRowsSelectionRsp{
|
||||||
|
Msg: "执行行操作成功!",
|
||||||
|
NeedRefresh: true,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
type ServerInfo struct {
|
type ServerInfo struct {
|
||||||
ServerId string `json:"serverId"`
|
ServerId string `json:"serverId"`
|
||||||
ServerName string `json:"serverName"`
|
ServerName string `json:"serverName"`
|
||||||
@ -135,7 +142,7 @@ func getAttachFields() []*dto.CommonDtoFieldDesc {
|
|||||||
Uneditable: true,
|
Uneditable: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Name: "是否只允许白名单登录",
|
Name: "停服维护中",
|
||||||
Key: "IsWhitelistLogin",
|
Key: "IsWhitelistLogin",
|
||||||
Type: "bool",
|
Type: "bool",
|
||||||
HelpText: "打开就是相当于停服维护中了",
|
HelpText: "打开就是相当于停服维护中了",
|
||||||
|
@ -5,6 +5,7 @@ import (
|
|||||||
"admin/apps/game/model"
|
"admin/apps/game/model"
|
||||||
"admin/apps/game/model/dto"
|
"admin/apps/game/model/dto"
|
||||||
"admin/internal/errcode"
|
"admin/internal/errcode"
|
||||||
|
"admin/internal/global"
|
||||||
"errors"
|
"errors"
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
"time"
|
"time"
|
||||||
@ -23,6 +24,25 @@ func NewCDKeyRepo(db *gorm.DB) ICDKeyRepo {
|
|||||||
return &cdKeyRepoImpl{db: db}
|
return &cdKeyRepoImpl{db: db}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func cdKeyPreCreateHook(projectEt *entity.Project, dtoObj dto.CommonDtoValues) error {
|
||||||
|
et := (&entity.CommonResource{}).FromPo(&model.CDKey{}).FromDto(dtoObj)
|
||||||
|
do := entity.NewCDKey(et.Po.(*model.CDKey))
|
||||||
|
if do.IsGlobalType() {
|
||||||
|
if do.Po.Code == "" {
|
||||||
|
return errcode.New(errcode.CDKeyInvalid, "cdkey empty:%v", dtoObj)
|
||||||
|
}
|
||||||
|
dbEt, find, err := NewCDKeyRepo(global.GLOB_DB).GetByKey(projectEt.GetProjectPo().ID, do.Po.Code)
|
||||||
|
if err != nil {
|
||||||
|
return errcode.New(errcode.DBError, "get cdkey by key:%v db error:%v", do.Po.Code, err)
|
||||||
|
}
|
||||||
|
if find {
|
||||||
|
return errcode.New(errcode.DBInsertDuplicate, "create cdkey:%v key duplicate with:%v", dtoObj, et, dbEt.Po)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
type cdKeyRepoImpl struct {
|
type cdKeyRepoImpl struct {
|
||||||
db *gorm.DB
|
db *gorm.DB
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,7 @@ import (
|
|||||||
"admin/apps/game/domain/entity"
|
"admin/apps/game/domain/entity"
|
||||||
"admin/apps/game/model"
|
"admin/apps/game/model"
|
||||||
"admin/apps/game/model/dto"
|
"admin/apps/game/model/dto"
|
||||||
|
"admin/internal/consts"
|
||||||
"admin/internal/errcode"
|
"admin/internal/errcode"
|
||||||
"admin/lib/xlog"
|
"admin/lib/xlog"
|
||||||
"errors"
|
"errors"
|
||||||
@ -15,10 +16,14 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var createHooks = map[string]func(projectEt *entity.Project, et dto.CommonDtoValues) error{
|
||||||
|
consts.ResourcesName_CDKey: cdKeyPreCreateHook,
|
||||||
|
}
|
||||||
|
|
||||||
type ICommonResourceRepo interface {
|
type ICommonResourceRepo interface {
|
||||||
List(project *entity.Project, params *dto.CommonListReq) (int, []*dto.CommonDtoFieldDesc, []*entity.CommonResource, error)
|
List(project *entity.Project, params *dto.CommonListReq) (int, []*dto.CommonDtoFieldDesc, []*entity.CommonResource, error)
|
||||||
GetById(projectEt *entity.Project, id int) ([]*dto.CommonDtoFieldDesc, *entity.CommonResource, bool, error)
|
GetById(projectEt *entity.Project, id int) ([]*dto.CommonDtoFieldDesc, *entity.CommonResource, bool, error)
|
||||||
Create(projectEt *entity.Project, et dto.CommonDtoValues) (*entity.CommonResource, error)
|
Create(projectEt *entity.Project, resource string, et dto.CommonDtoValues) (*entity.CommonResource, error)
|
||||||
Edit(projectEt *entity.Project, et dto.CommonDtoValues) error
|
Edit(projectEt *entity.Project, et dto.CommonDtoValues) error
|
||||||
Delete(projectEt *entity.Project, id int) (*entity.CommonResource, bool, error)
|
Delete(projectEt *entity.Project, id int) (*entity.CommonResource, bool, error)
|
||||||
}
|
}
|
||||||
@ -102,8 +107,14 @@ func (repo *commonResourceRepoImpl) GetById(projectEt *entity.Project, id int) (
|
|||||||
return repo.fieldsDescInfoFun(projectEt), (&entity.CommonResource{}).FromPo(po), true, nil
|
return repo.fieldsDescInfoFun(projectEt), (&entity.CommonResource{}).FromPo(po), true, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (repo *commonResourceRepoImpl) Create(projectEt *entity.Project, dtoObj dto.CommonDtoValues) (*entity.CommonResource, error) {
|
func (repo *commonResourceRepoImpl) Create(projectEt *entity.Project, resource string, dtoObj dto.CommonDtoValues) (*entity.CommonResource, error) {
|
||||||
et := (&entity.CommonResource{}).FromPo(repo.newEmptyPo()).FromDto(dtoObj)
|
et := (&entity.CommonResource{}).FromPo(repo.newEmptyPo()).FromDto(dtoObj)
|
||||||
|
if handler, find := createHooks[resource]; find {
|
||||||
|
if err := handler(projectEt, dtoObj); err != nil {
|
||||||
|
return et, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
err := repo.db.Create(et.Po).Error
|
err := repo.db.Create(et.Po).Error
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if strings.Contains(err.Error(), "Duplicate entry") || strings.Contains(err.Error(), "UNIQUE constraint") {
|
if strings.Contains(err.Error(), "Duplicate entry") || strings.Contains(err.Error(), "UNIQUE constraint") {
|
||||||
|
@ -4,6 +4,7 @@ import (
|
|||||||
"admin/apps/game/model/dto"
|
"admin/apps/game/model/dto"
|
||||||
"admin/internal/consts"
|
"admin/internal/consts"
|
||||||
"admin/internal/db"
|
"admin/internal/db"
|
||||||
|
"database/sql"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -12,14 +13,14 @@ func init() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type Ban struct {
|
type Ban struct {
|
||||||
ID int `gorm:"primarykey" readonly:"true"`
|
ID int `gorm:"primarykey" readonly:"true"`
|
||||||
ProjectId int `gorm:"uniqueIndex:idx_ban"`
|
ProjectId int `gorm:"index:project_id"`
|
||||||
ServerConfID string `gorm:"type:varchar(200);uniqueIndex:idx_server" name:"区服id" required:"true" choices:"GetServerConfIDChoices" uneditable:"true"`
|
ServerConfID string `gorm:"type:varchar(200);index:idx_server" name:"区服id" required:"true" choices:"GetServerConfIDChoices" uneditable:"true" where:"eq"`
|
||||||
BanType string `name:"封禁类型" required:"true" choices:"GetBanTypeChoices" uneditable:"true"`
|
BanType string `name:"封禁类型" required:"true" choices:"GetBanTypeChoices" uneditable:"true" where:"eq"`
|
||||||
Value string `gorm:"type:varchar(128);uniqueIndex:idx_ban" name:"封禁值" required:"true" desc:"根据封禁类型填对应值,例如ip就填ip地址" uneditable:"true"`
|
Value string `gorm:"type:varchar(128);index:value" name:"封禁值" required:"true" desc:"根据封禁类型填对应值,例如ip就填ip地址" uneditable:"true" where:"eq"`
|
||||||
BanReason string `name:"封禁描述" desc:"封禁描述,入库记录的描述信息" required:"true"`
|
BanReason string `name:"封禁描述" desc:"封禁描述,入库记录的描述信息" required:"true"`
|
||||||
BanNotifyReason string `name:"封禁弹窗" desc:"封禁弹窗内容,会推送给客户端弹窗" required:"true"`
|
BanNotifyReason string `name:"封禁弹窗" desc:"封禁弹窗内容,会推送给客户端弹窗" required:"true"`
|
||||||
ExpireAt time.Time `name:"封禁到期时间" desc:"封禁到期时间,0表示永久封禁"`
|
ExpireAt sql.NullTime `name:"封禁到期时间" desc:"封禁到期时间,0表示永久封禁"`
|
||||||
|
|
||||||
CreatedAt time.Time `readonly:"true"`
|
CreatedAt time.Time `readonly:"true"`
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,7 @@ type CDKey struct {
|
|||||||
Name string `gorm:"type:varchar(100);unique" name:"礼包说明" required:"true" uneditable:"true"`
|
Name string `gorm:"type:varchar(100);unique" name:"礼包说明" required:"true" uneditable:"true"`
|
||||||
ServerIDs []string `gorm:"type:json;serializer:json" name:"区服" desc:"不选就是全服通用" type:"[]string" choices:"GetChoiceServers" multi_choice:"true" uneditable:"true""`
|
ServerIDs []string `gorm:"type:json;serializer:json" name:"区服" desc:"不选就是全服通用" type:"[]string" choices:"GetChoiceServers" multi_choice:"true" uneditable:"true""`
|
||||||
CodeType int `name:"礼包类型" required:"true" choices:"GetCodeTypeChoices" uneditable:"true"`
|
CodeType int `name:"礼包类型" required:"true" choices:"GetCodeTypeChoices" uneditable:"true"`
|
||||||
Code string `gorm:"type:VARCHAR(50);index" name:"礼包码" desc:"一码通用才配置"`
|
Code string `gorm:"type:VARCHAR(50);index" name:"礼包码" desc:"一码通用才配置" uneditable:"true"`
|
||||||
CodeNum int `name:"礼包数量" desc:"一码一用才配置"`
|
CodeNum int `name:"礼包数量" desc:"一码一用才配置"`
|
||||||
ValidStartTime sql.NullTime `name:"生效起始时间"`
|
ValidStartTime sql.NullTime `name:"生效起始时间"`
|
||||||
ValidEndTime sql.NullTime `name:"生效结束时间"`
|
ValidEndTime sql.NullTime `name:"生效结束时间"`
|
||||||
|
@ -43,6 +43,16 @@ type CommonDeleteRsp struct {
|
|||||||
Id int `json:"id"`
|
Id int `json:"id"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type CommonRowsSelectionReq struct {
|
||||||
|
BtnKey string `json:"btn_key"`
|
||||||
|
Rows []CommonDtoValues `json:"rows"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type CommonRowsSelectionRsp struct {
|
||||||
|
Msg string `json:"msg"`
|
||||||
|
NeedRefresh bool `json:"need_refresh"`
|
||||||
|
}
|
||||||
|
|
||||||
type CommandListReq struct {
|
type CommandListReq struct {
|
||||||
Addr string `json:"addr"`
|
Addr string `json:"addr"`
|
||||||
}
|
}
|
||||||
|
@ -16,6 +16,7 @@ type Server struct {
|
|||||||
ProjectId int `gorm:"uniqueIndex:idx_server"`
|
ProjectId int `gorm:"uniqueIndex:idx_server"`
|
||||||
ServerConfID string `gorm:"type:varchar(200);uniqueIndex:idx_server" name:"区服id" required:"true" uneditable:"true"`
|
ServerConfID string `gorm:"type:varchar(200);uniqueIndex:idx_server" name:"区服id" required:"true" uneditable:"true"`
|
||||||
Desc string `name:"描述"`
|
Desc string `name:"描述"`
|
||||||
|
|
||||||
// command_list接口服务器地址,为空代表由由项目统一提供command_list.
|
// command_list接口服务器地址,为空代表由由项目统一提供command_list.
|
||||||
// 取决于每个项目改造难度:
|
// 取决于每个项目改造难度:
|
||||||
// 为空就代表项目要实现一个自己统一对外暴露的gm调用服务对内聚合、分发指令执行,本后台执行指令只调用一次;
|
// 为空就代表项目要实现一个自己统一对外暴露的gm调用服务对内聚合、分发指令执行,本后台执行指令只调用一次;
|
||||||
|
@ -13,9 +13,9 @@ func init() {
|
|||||||
type WhiteList struct {
|
type WhiteList struct {
|
||||||
ID int `gorm:"primarykey" readonly:"true"`
|
ID int `gorm:"primarykey" readonly:"true"`
|
||||||
ProjectId int `gorm:"uniqueIndex:idx_whitelist"`
|
ProjectId int `gorm:"uniqueIndex:idx_whitelist"`
|
||||||
ServerConfID string `gorm:"type:varchar(200);uniqueIndex:idx_whitelist;index:idx_server" name:"区服id" required:"true" choices:"GetChoiceServers" where:"eq"`
|
ServerConfID string `gorm:"type:varchar(200);uniqueIndex:idx_whitelist;index:idx_server" name:"区服id" required:"true" choices:"GetChoiceServers" multi_choices:"true" where:"eq"`
|
||||||
WType string `name:"白名单类型" desc:"账号或者ip" required:"true" choices:"GetWhitelistTypeChoices"`
|
WType string `name:"白名单类型" desc:"账号或者ip" required:"true" choices:"GetWhitelistTypeChoices"`
|
||||||
Value string `gorm:"type:varchar(128);uniqueIndex:idx_whitelist" name:"账户" required:"true"`
|
Value string `gorm:"type:varchar(128);uniqueIndex:idx_whitelist" name:"账号或者ip等值" required:"true"`
|
||||||
|
|
||||||
CreatedAt time.Time `readonly:"true" where:"range"`
|
CreatedAt time.Time `readonly:"true" where:"range"`
|
||||||
}
|
}
|
||||||
|
@ -61,6 +61,19 @@ func (ctl *controller) CommonDelete(ctx *context.WebContext, params *dto.CommonD
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (ctl *controller) CommonRowsSelection(ctx *context.WebContext, params *dto.CommonRowsSelectionReq, rsp *dto.CommonRowsSelectionRsp) error {
|
||||||
|
projectId, resource := getCtxURIProjectIdAndResource(ctx)
|
||||||
|
|
||||||
|
ctx1 := stdContext.WithValue(ctx.Context, "user_id", ctx.Header.UserId)
|
||||||
|
ctx1 = stdContext.WithValue(ctx1, "user_name", ctx.Header.UserName)
|
||||||
|
|
||||||
|
err := ctl.svc.CommonRowsSelection(ctx1, projectId, resource, params)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (ctl *controller) OnClickCustomButton(ctx *context.WebContext, params *dto.CommonDeleteReq, rsp *dto.CommonDeleteRsp) error {
|
func (ctl *controller) OnClickCustomButton(ctx *context.WebContext, params *dto.CommonDeleteReq, rsp *dto.CommonDeleteRsp) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -27,6 +27,7 @@ func (srv *Server) Route(engine *web.Engine, sdkEngine *web.Engine) {
|
|||||||
resourceUnderProjectGroup.Post("", "新增", consts.WebPathPermit_Read, srv.ctl.CommonPost)
|
resourceUnderProjectGroup.Post("", "新增", consts.WebPathPermit_Read, srv.ctl.CommonPost)
|
||||||
resourceUnderProjectGroup.Put("", "编辑", consts.WebPathPermit_Read, srv.ctl.CommonPut)
|
resourceUnderProjectGroup.Put("", "编辑", consts.WebPathPermit_Read, srv.ctl.CommonPut)
|
||||||
resourceUnderProjectGroup.Delete("", "删除", consts.WebPathPermit_Read, srv.ctl.CommonDelete)
|
resourceUnderProjectGroup.Delete("", "删除", consts.WebPathPermit_Read, srv.ctl.CommonDelete)
|
||||||
|
resourceUnderProjectGroup.Post("/selection", "多选", consts.WebPathPermit_Read, srv.ctl.CommonDelete)
|
||||||
}
|
}
|
||||||
|
|
||||||
projectGroup.Get("/:projectId/items", "获取项目所有道具列表", consts.WebPathPermit_Read, srv.ctl.GetProjectAllItems)
|
projectGroup.Get("/:projectId/items", "获取项目所有道具列表", consts.WebPathPermit_Read, srv.ctl.GetProjectAllItems)
|
||||||
|
@ -122,6 +122,27 @@ func (svc *Service) CommonDelete(ctx context.Context, projectId int, resourceNam
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (svc *Service) CommonRowsSelection(ctx context.Context, projectId int, resourceName string, param *dto.CommonRowsSelectionReq) error {
|
||||||
|
rsp, err := svc.resourceSvc.RowsSelection(projectId, resourceName, param)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
userId := ctx.Value("user_id").(int)
|
||||||
|
userName := ctx.Value("user_name").(string)
|
||||||
|
|
||||||
|
event.GetMgrInstance().Publish(event.EventTopic_UserExecute, &event.EventPayload_UserExecute{
|
||||||
|
UserId: userId,
|
||||||
|
UserName: userName,
|
||||||
|
ProjectId: projectId,
|
||||||
|
Resource: resourceName,
|
||||||
|
Method: "删除",
|
||||||
|
Any: param,
|
||||||
|
})
|
||||||
|
|
||||||
|
return rsp, err
|
||||||
|
}
|
||||||
|
|
||||||
func (svc *Service) GetSupportResourcesList(permissions []string) []*api.ResourceInitInfo {
|
func (svc *Service) GetSupportResourcesList(permissions []string) []*api.ResourceInitInfo {
|
||||||
return svc.resourceSvc.GetSupportResourcesList(permissions)
|
return svc.resourceSvc.GetSupportResourcesList(permissions)
|
||||||
}
|
}
|
||||||
|
@ -31,6 +31,8 @@ func (svc *Service) GetRoutes(req *api.GetRoutesReq) (*api.GetRoutesRsp, error)
|
|||||||
Desc: v.Desc,
|
Desc: v.Desc,
|
||||||
ShowMethods: make([]string, 0),
|
ShowMethods: make([]string, 0),
|
||||||
MethodsPermissionStr: make([]string, 0),
|
MethodsPermissionStr: make([]string, 0),
|
||||||
|
GlobalBtns: v.GlobalBtns,
|
||||||
|
RowBtns: v.RowBtns,
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, resourceMethod := range v.ShowMethods {
|
for _, resourceMethod := range v.ShowMethods {
|
||||||
|
Binary file not shown.
@ -55,3 +55,14 @@ const (
|
|||||||
CDKeyType_Global = 0 // 一码通用
|
CDKeyType_Global = 0 // 一码通用
|
||||||
CDKeyType_Private = 1 // 一码一用
|
CDKeyType_Private = 1 // 一码一用
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
BtnKeyGlobal_Server_DownAll = "server:down:all" // 一键维护
|
||||||
|
BtnKeyGlobal_Server_UpAll = "server:up:all" // 一键维护结束
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
BtnKeyRow_Server_Down = "server:down"
|
||||||
|
BtnKeyRow_Server_Up = "server:up"
|
||||||
|
)
|
||||||
|
@ -12,4 +12,5 @@ type EventPayload_UserExecute struct {
|
|||||||
Method string `json:"method"`
|
Method string `json:"method"`
|
||||||
OldData any `json:"old_data"`
|
OldData any `json:"old_data"`
|
||||||
NewData any `json:"new_data"`
|
NewData any `json:"new_data"`
|
||||||
|
Any any `json:"any"`
|
||||||
}
|
}
|
||||||
|
9
admin/lib/dtimer/timer.go
Normal file
9
admin/lib/dtimer/timer.go
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
package dtimer
|
||||||
|
|
||||||
|
/*
|
||||||
|
分布式定时器,用于解决比如多个进程启动后,只有一个进程触发定时器事件执行,
|
||||||
|
目标不影响架构复杂性,做个能用的出来。思路是用mysql做分布式锁,多个进程抢占单例执行
|
||||||
|
*/
|
||||||
|
|
||||||
|
type DTimer struct {
|
||||||
|
}
|
@ -22,7 +22,7 @@ func ParseUnixTimestamp2LocalTime(ts int64) (local time.Time) {
|
|||||||
sec = ts
|
sec = ts
|
||||||
nsec = 0
|
nsec = 0
|
||||||
default:
|
default:
|
||||||
panic(fmt.Errorf("ts:%v invalid parse to local time"))
|
panic(fmt.Errorf("ts:%v invalid parse to local time", ts))
|
||||||
}
|
}
|
||||||
|
|
||||||
t := time.Unix(sec, nsec)
|
t := time.Unix(sec, nsec)
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import {ElNotification} from "element-plus";
|
import {ElNotification, selectGroupKey} from "element-plus";
|
||||||
import {resourceDelete, resourceList, resourcePost, resourcePut, resourceGetAllItems} from "@/api/resource.js";
|
import {resourceDelete, resourceList, resourcePost, resourcePut, resourceGetAllItems} from "@/api/resource.js";
|
||||||
import {ref, toRaw} from "vue";
|
import {ref, toRaw} from "vue";
|
||||||
import {useRoute} from 'vue-router';
|
import {useRoute} from 'vue-router';
|
||||||
@ -14,6 +14,10 @@ const listDataOK = ref(false)
|
|||||||
const projectId = cachedResource.meta.projectId
|
const projectId = cachedResource.meta.projectId
|
||||||
const resource_raw_node = cachedResource;
|
const resource_raw_node = cachedResource;
|
||||||
const hasListPermit = resource_raw_node.meta.methods.get !== undefined && resource_raw_node.meta.methods.get === true;
|
const hasListPermit = resource_raw_node.meta.methods.get !== undefined && resource_raw_node.meta.methods.get === true;
|
||||||
|
const globalClickBtns = resource_raw_node.meta.global_click_btns ? resource_raw_node.meta.global_click_btns : [];
|
||||||
|
const rowClickBtns = resource_raw_node.meta.row_click_btns ? resource_raw_node.meta.row_click_btns : [];
|
||||||
|
|
||||||
|
console.log("global btns:", resource_raw_node)
|
||||||
|
|
||||||
const resource_url = cachedResource.meta.resource_url;
|
const resource_url = cachedResource.meta.resource_url;
|
||||||
const fieldsDescInfo = ref([])
|
const fieldsDescInfo = ref([])
|
||||||
@ -139,6 +143,20 @@ const dialogObjectForm = ref({
|
|||||||
Attach: [],
|
Attach: [],
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const tableSelectRows = ref([])
|
||||||
|
|
||||||
|
const handleTableSelectRowsSendToServer = (keyType, rows) => {
|
||||||
|
console.log(`选择表格行,类型:${keyType},:`, rows)
|
||||||
|
}
|
||||||
|
const handleTableSelectChange = (rows) => {
|
||||||
|
tableSelectRows.value = rows
|
||||||
|
}
|
||||||
|
const tableSelectRows1 = (keyType) => {
|
||||||
|
handleTableSelectRowsSendToServer(keyType, tableSelectRows.value)
|
||||||
|
}
|
||||||
|
const tableSelectRows2 = (keyType, index, row) => {
|
||||||
|
handleTableSelectRowsSendToServer(keyType, [row])
|
||||||
|
}
|
||||||
|
|
||||||
const submitAdd = async () => {
|
const submitAdd = async () => {
|
||||||
try {
|
try {
|
||||||
@ -363,14 +381,25 @@ const handlePaginationCurChange = (val) => {
|
|||||||
</el-row>
|
</el-row>
|
||||||
|
|
||||||
<el-row style="margin-top: 10px">
|
<el-row style="margin-top: 10px">
|
||||||
<el-button @click="dialogAddVisible = true" size="large" type="primary"
|
<el-button @click="dialogAddVisible = true" size="default" type="primary"
|
||||||
v-if="(resource_raw_node.meta.methods.post === true)">
|
v-if="(resource_raw_node.meta.methods.post === true)">
|
||||||
添加
|
添加
|
||||||
</el-button>
|
</el-button>
|
||||||
|
|
||||||
|
<el-button v-for="btn in globalClickBtns" size="default" :type="btn.btn_type"
|
||||||
|
@click="tableSelectRows1(btn.key)">
|
||||||
|
{{ btn.name }}
|
||||||
|
</el-button>
|
||||||
</el-row>
|
</el-row>
|
||||||
|
|
||||||
|
|
||||||
</el-header>
|
</el-header>
|
||||||
<el-main>
|
<el-main>
|
||||||
<el-table :data="rows" style="width: 100%" table-layout="auto" stripe>
|
<el-table :data="rows" style="width: 100%" table-layout="auto" stripe
|
||||||
|
@selection-change="handleTableSelectChange">
|
||||||
|
<el-table-column type="selection" v-if="globalClickBtns.length > 0 || rowClickBtns.length > 0">
|
||||||
|
|
||||||
|
</el-table-column>
|
||||||
<template v-for="fieldDescInfo in fieldsDescInfo">
|
<template v-for="fieldDescInfo in fieldsDescInfo">
|
||||||
<el-table-column prop="jsonValue" :label="fieldDescInfo.name" show-overflow-tooltip
|
<el-table-column prop="jsonValue" :label="fieldDescInfo.name" show-overflow-tooltip
|
||||||
v-if="(fieldDescInfo.type === 'items')"></el-table-column>
|
v-if="(fieldDescInfo.type === 'items')"></el-table-column>
|
||||||
@ -382,18 +411,22 @@ const handlePaginationCurChange = (val) => {
|
|||||||
|
|
||||||
<el-button size="default" type="success" @click="handleEdit( scope.$index, scope.row)"
|
<el-button size="default" type="success" @click="handleEdit( scope.$index, scope.row)"
|
||||||
v-if="(resource_raw_node.meta.methods.put === true)">
|
v-if="(resource_raw_node.meta.methods.put === true)">
|
||||||
<el-icon style="vertical-align: middle">
|
<!-- <el-icon style="vertical-align: middle">-->
|
||||||
<Edit/>
|
<!-- <Edit/>-->
|
||||||
</el-icon>
|
<!-- </el-icon>-->
|
||||||
<span>编辑</span>
|
<span>编辑</span>
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button size="default" type="danger" @click="handleDelete( scope.$index, scope.row)"
|
<el-button size="default" type="danger" @click="handleDelete( scope.$index, scope.row)"
|
||||||
v-if="(resource_raw_node.meta.methods.delete === true)">
|
v-if="(resource_raw_node.meta.methods.delete === true)">
|
||||||
<el-icon style="vertical-align: middle">
|
<!-- <el-icon style="vertical-align: middle">-->
|
||||||
<Delete/>
|
<!-- <Delete/>-->
|
||||||
</el-icon>
|
<!-- </el-icon>-->
|
||||||
<span>删除</span>
|
<span>删除</span>
|
||||||
</el-button>
|
</el-button>
|
||||||
|
<el-button v-for="btn in rowClickBtns" size="default" :type="btn.btn_type"
|
||||||
|
@click="tableSelectRows2(btn.key, scope.$index, scope.row)">
|
||||||
|
{{ btn.name }}
|
||||||
|
</el-button>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
|
@ -85,7 +85,7 @@ const router = createRouter({
|
|||||||
export default router
|
export default router
|
||||||
|
|
||||||
export function setProjectOperationRoutes(projectList) {
|
export function setProjectOperationRoutes(projectList) {
|
||||||
// console.log("resourceList:", projectList)
|
console.log("resourceList:", projectList)
|
||||||
|
|
||||||
isGetUserInfo.value = true
|
isGetUserInfo.value = true
|
||||||
projectOpTreeRoutes.value = []
|
projectOpTreeRoutes.value = []
|
||||||
@ -119,6 +119,8 @@ export function setProjectOperationRoutes(projectList) {
|
|||||||
resource: resource.resource,
|
resource: resource.resource,
|
||||||
resource_url: routePath,
|
resource_url: routePath,
|
||||||
methods: {},
|
methods: {},
|
||||||
|
global_click_btns: resource.global_btns,
|
||||||
|
row_click_btns: resource.row_btns,
|
||||||
},
|
},
|
||||||
component: () => import('@/views/project/project_op.vue'),
|
component: () => import('@/views/project/project_op.vue'),
|
||||||
props: true
|
props: true
|
||||||
|
@ -25,6 +25,7 @@
|
|||||||
- [ ] 公告发送游戏
|
- [ ] 公告发送游戏
|
||||||
- [ ] 订单列表从游戏服拉取可以查看
|
- [ ] 订单列表从游戏服拉取可以查看
|
||||||
- [ ] 优化header右上角昵称部分显示
|
- [ ] 优化header右上角昵称部分显示
|
||||||
|
- [ ] 角色在线状态
|
||||||
|
|
||||||
* bug记录
|
* bug记录
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user