Merge branch 'dev' into market

This commit is contained in:
yangduo 2024-08-05 17:10:20 +08:00
commit af951bad87
18 changed files with 350 additions and 67 deletions

View File

@ -3,7 +3,7 @@
"account_address": "0x903c617e66902aa1b916DF79c7F1730fba40c2cA",
"__doc__": "yd",
"roles": [
"service"
"customer_service"
],
"special": {
"api": ["xxx", "-xxx"],

View File

@ -0,0 +1,248 @@
package system
import (
"f5"
"main/constant"
"main/model/system"
"net/http"
"q5"
"github.com/gin-gonic/gin"
"github.com/xuri/excelize/v2"
)
type BlockPlayerApi struct {
}
func (bpa *BlockPlayerApi) List(c *gin.Context) {
req := struct {
PageDto system.PageDto `json:"page_dto"`
}{}
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusOK, gin.H{
"code": 1,
"message": err.Error(),
})
return
}
result := []*system.BlockPlayer{}
f5.GetGoStyleDb().PageQuery(
constant.CONF_DB,
q5.ToInt32(req.PageDto.PageSize),
q5.ToInt32(req.PageDto.Page),
"SELECT * FROM t_blockplayer WHERE 1=1",
[]string{},
f5.GetDbFilter().Comp([]f5.DbQueryFilter{}...),
" ORDER BY account_id ",
func(err error, pg *f5.Pagination) {
if err != nil {
c.JSON(http.StatusOK, gin.H{
"code": 1,
"message": err.Error(),
})
return
}
for pg.Rows.Next() {
p := new(system.BlockPlayer)
p.Blocked = q5.SafeToInt32(pg.Rows.GetByName("blocked"))
p.Account = pg.Rows.GetByName("account_id")
p.CreateTime = q5.SafeToInt32(pg.Rows.GetByName("createtime"))
p.ModifyTime = q5.SafeToInt32(pg.Rows.GetByName("modifytime"))
q5.AppendSlice(&result, p)
}
c.JSON(http.StatusOK, gin.H{
"code": 0,
"message": "获取成功",
"data": result,
"total": pg.Total,
"total_page": pg.TotalPages,
"cur_page": pg.CurrentPage,
})
})
}
func (bpa *BlockPlayerApi) Add(c *gin.Context) {
req := struct {
Account string `binding:"required" json:"account_id"`
}{}
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusOK, gin.H{
"code": 1,
"message": err.Error(),
})
return
}
var count int64 = 0
if err := f5.GetApp().GetOrmDb(constant.CONF_DB).Table("t_blockplayer").Where("account_id =?", req.Account).Count(&count).Error; err == nil && count > 0 {
c.JSON(http.StatusOK, gin.H{
"code": 1,
"message": "数据存在",
})
return
}
info := new(system.BlockPlayer)
nowDaySeconds := int32(f5.GetApp().GetRealSeconds())
info.Account = req.Account
info.Blocked = 1
info.CreateTime = nowDaySeconds
info.ModifyTime = nowDaySeconds
if err := f5.GetApp().GetOrmDb(constant.CONF_DB).Create(info).Error; err != nil {
c.JSON(http.StatusOK, gin.H{
"code": 1,
"message": err.Error(),
})
return
}
c.JSON(http.StatusOK, gin.H{
"code": 0,
"message": "添加成功",
})
}
func (bpa *BlockPlayerApi) Edit(c *gin.Context) {
req := struct {
Account string `binding:"required" json:"account_id"`
Blocked int32 `json:"blocked"`
}{}
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusOK, gin.H{
"code": 1,
"message": err.Error(),
})
return
}
blockplayer := new(system.BlockPlayer)
db := f5.GetApp().GetOrmDb(constant.CONF_DB)
if err := db.Take(blockplayer, "account_id =?", req.Account).Error; err != nil {
if !f5.IsOrmErrRecordNotFound(err) {
c.JSON(http.StatusOK, gin.H{
"code": 500,
"message": "sever internal error:" + err.Error(),
})
return
} else {
c.JSON(http.StatusOK, gin.H{
"code": 2,
"message": "无法查到记录",
})
return
}
}
nowDaySeconds := int32(f5.GetApp().GetRealSeconds())
blockplayer.Blocked = req.Blocked
blockplayer.ModifyTime = nowDaySeconds
if err := db.Where("account_id = ?", req.Account).Save(blockplayer).Error; err != nil {
c.JSON(http.StatusOK, gin.H{
"code": 500,
"message": "sever internal error:" + err.Error(),
})
return
}
c.JSON(http.StatusOK, gin.H{
"code": 0,
"message": "",
})
}
func (bpa *BlockPlayerApi) Del(c *gin.Context) {
req := struct {
Account string `binding:"required" json:"account_id"`
}{}
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusOK, gin.H{
"code": 1,
"message": err.Error(),
})
return
}
blockplayer := new(system.BlockPlayer)
db := f5.GetApp().GetOrmDb(constant.CONF_DB)
if err := db.Take(blockplayer, "account_id =?", req.Account).Error; err != nil {
if !f5.IsOrmErrRecordNotFound(err) {
c.JSON(http.StatusOK, gin.H{
"code": 500,
"message": "sever internal error:" + err.Error(),
})
return
} else {
c.JSON(http.StatusOK, gin.H{
"code": 2,
"message": "无法查到记录",
})
return
}
} else {
}
nowDaySeconds := int32(f5.GetApp().GetRealSeconds())
blockplayer.Blocked = -1
blockplayer.ModifyTime = nowDaySeconds
if err := db.Where("account_id = ?", req.Account).Delete(blockplayer).Error; err != nil {
c.JSON(http.StatusOK, gin.H{
"code": 500,
"message": "sever internal error:" + err.Error(),
})
return
}
c.JSON(http.StatusOK, gin.H{
"code": 0,
"message": "",
})
}
func (bpa *BlockPlayerApi) UploadExcel(c *gin.Context) {
file, _, err := c.Request.FormFile("file")
if err != nil {
c.JSON(http.StatusOK, gin.H{
"code": 1,
"message": "上传文件失败",
})
return
}
xlsx, err := excelize.OpenReader(file)
if err != nil {
c.JSON(http.StatusOK, gin.H{
"code": 1,
"message": "解析文件失败",
})
return
}
rows, err := xlsx.GetRows(xlsx.GetSheetName(xlsx.GetActiveSheetIndex()))
if err != nil {
c.JSON(http.StatusOK, gin.H{
"code": 1,
"message": err.Error(),
})
return
}
nowDaySeconds := int32(f5.GetApp().GetRealSeconds())
blockplayers := []*system.BlockPlayer{}
for i, row := range rows {
if i == 0 {
continue
}
member := new(system.BlockPlayer)
member.Account = row[0]
member.Blocked = 1
member.CreateTime = nowDaySeconds
member.ModifyTime = nowDaySeconds
blockplayers = append(blockplayers, member)
}
if err := f5.GetApp().GetOrmDb(constant.CONF_DB).Create(blockplayers).Error; err != nil {
c.JSON(http.StatusOK, gin.H{
"code": 1,
"message": err.Error(),
})
return
}
c.JSON(http.StatusOK, gin.H{
"code": 0,
"message": "添加成功",
})
}

View File

@ -11,4 +11,5 @@ type ApiGroup struct {
PlayerApi
NFTApi
GameSwitchApi
BlockPlayerApi
}

View File

@ -28,7 +28,7 @@ const (
EMAIL_KEY = "520d8eeb8cf1d833a42c820432c020b2fd60f4b7|" + EMAIL_URL_DEV
)
const (
/* const (
FULL_PERMISSION = "*"
PLAYER_INFO = "playerinfo" //玩家基本信息查询
BAG_QUERY = "bagquery" //玩家背包查询
@ -50,6 +50,12 @@ const (
EMAIL_GROUP_LIST = "emailgroup" //邮件组列表
UPLOAD_EXCEL_MAIL_GROUP = "uploadexcelmailgroup" //上传excel邮件组
ADD_BLACK_PLAYER = "addblackplayer" //添加黑名单成员
EDIT_BLACK_PLAYER = "editblackplayer" //编辑黑名单成员
DEL_BLACK_PLAYER = "delblackplayer" //删除黑名单成员
BLACK_PLAYER_LIST = "listblackplayer" //黑名单列表
UPLOAD_EXCEL_BLACK_PLAYER = "uploadexcelblackplayer" //上传excel名单
ADD_GAME_SWITCH = "addgameswitch" //添加游戏配置
EDIT_GAME_SWITCH = "editgameswitch" //编辑游戏配置
DEL_GAME_SWITCH = "delgameswitch" //删除游戏配置
@ -75,7 +81,7 @@ const (
SYS_EDIT_USER = "editsysuser" //编辑后台用户
SYS_DEL_USER = "delsysuser" //删除后台用户
SYS_USER_LIST = "sysuserlist" //查看后台用户列表
)
) */
const (
UI_FULL_PERMISSION = "*"

View File

@ -0,0 +1,12 @@
package system
type BlockPlayer struct {
Account string `gorm:"column:account_id" json:"account_id"`
Blocked int32 `gorm:"column:blocked" json:"blocked"`
CreateTime int32 `gorm:"column:createtime" json:"createtime"`
ModifyTime int32 `gorm:"column:modifytime" json:"modifytime"`
}
func (BlockPlayer) TableName() string {
return "t_blockplayer"
}

View File

@ -4,7 +4,6 @@ import (
"encoding/json"
"f5"
"fmt"
"main/constant"
"q5"
"strings"
)
@ -16,17 +15,17 @@ type role struct {
type user struct {
accountAddress string
roleHash *q5.ConcurrentMap[string, *role]
api *q5.ConcurrentMap[string, bool]
ui *q5.ConcurrentMap[string, bool]
specApi []string
specUi []string
roleHash *q5.ConcurrentMap[string, *role]
api *q5.ConcurrentMap[string, bool]
ui *q5.ConcurrentMap[string, bool]
specApi []string
specUi []string
}
type PermissionTable struct {
f5.CustomMetaTable
apiHash *q5.ConcurrentMap[string, bool]
uiHash *q5.ConcurrentMap[string, bool]
apiHash *q5.ConcurrentMap[string, bool]
uiHash *q5.ConcurrentMap[string, bool]
roleHash *q5.ConcurrentMap[string, *role]
userHash *q5.ConcurrentMap[string, *user]
}
@ -52,7 +51,7 @@ func (this *PermissionTable) CheckAPIPermission(accountAddress string, cmd strin
return *ret
}
ret, exist = (*u).api.Load(constant.FULL_PERMISSION)
ret, exist = (*u).api.Load("*")
if exist {
return *ret
}
@ -92,20 +91,20 @@ func (this *PermissionTable) loadRole() {
}
{
for _, name := range roles {
if jsonStr, err := f5.ReadJsonFile("../config/role/" + name + ".json"); err == nil {
rolePermission := struct{
if jsonStr, err := f5.ReadJsonFile("../config/roles/" + name + ".json"); err == nil {
rolePermission := struct {
Api []string `json:"api"`
Ui []string `json:"ui"`
Ui []string `json:"ui"`
}{}
if err := q5.DecodeJson(jsonStr, &rolePermission); err != nil {
panic(fmt.Sprintf("parse role metafile error %s %s", name + ".json", err))
panic(fmt.Sprintf("parse role metafile error %s %s", name+".json", err))
}
p := this.newRole()
for _, pName := range rolePermission.Api {
p.api.Store(pName, true)
}
for _, pName := range rolePermission.Ui {
p.api.Store(pName, true)
p.ui.Store(pName, true)
}
this.roleHash.Store(name, p)
}
@ -115,11 +114,11 @@ func (this *PermissionTable) loadRole() {
func (this *PermissionTable) loadUser() {
users := []struct {
AccountAddress string `json:"account_address"`
Roles []string `json:"roles"`
Special struct {
AccountAddress string `json:"account_address"`
Roles []string `json:"roles"`
Special struct {
Api []string `json:"api"`
Ui []string `json:"ui"`
Ui []string `json:"ui"`
} `json:"special"`
}{}
{
@ -146,7 +145,7 @@ func (this *PermissionTable) loadUser() {
q5.AppendSlice(&p.specApi, pName)
}
for _, pName := range u.Special.Ui {
q5.AppendSlice(&p.specApi, pName)
q5.AppendSlice(&p.specUi, pName)
}
this.genUserPermission(p)
this.userHash.Store(p.accountAddress, p)
@ -168,11 +167,11 @@ func (this *PermissionTable) newUser() *user {
p.ui = new(q5.ConcurrentMap[string, bool])
p.specApi = []string{}
p.specUi = []string{}
this.apiHash.Range(func (key string, val bool) bool {
this.apiHash.Range(func(key string, val bool) bool {
p.api.Store(key, false)
return true
})
this.uiHash.Range(func (key string, val bool) bool {
this.uiHash.Range(func(key string, val bool) bool {
p.ui.Store(key, false)
return true
})

View File

@ -27,6 +27,8 @@ func (this *routerMgr) Init() {
this.system.InitPlayerRouter(priGroup)
this.system.InitNFTRouter(priGroup)
this.system.InitGameSwitchRouter(priGroup)
this.system.InitBlockPlayerRouter(priGroup)
f5.GetSysLog().Info("routerMgr.init")
}

View File

@ -0,0 +1,23 @@
package system
import (
v1 "main/api/v1"
"main/middleware"
"github.com/gin-gonic/gin"
)
type BlockPlayerRoute struct {
}
func (this *BlockPlayerRoute) InitBlockPlayerRouter(priRouter *gin.RouterGroup) {
group := priRouter.Group("block_player")
api := v1.ApiGroupApp.SystemApiGroup.BlockPlayerApi
{
group.POST("add", middleware.Permission("api/v1/block_player/add", api.Add))
group.POST("edit", middleware.Permission("api/v1/block_player/edit", api.Edit))
group.POST("del", middleware.Permission("api/v1/block_player/del", api.Del))
group.POST("list", middleware.Permission("api/v1/block_player/list", api.List))
group.POST("uploadExcel", middleware.Permission("api/v1/block_player/uploadExcel", api.UploadExcel))
}
}

View File

@ -11,4 +11,5 @@ type RouterGroup struct {
PlayerRouter
NFTRouter
GameSwitchRoute
BlockPlayerRoute
}

View File

@ -2,7 +2,6 @@ package system
import (
v1 "main/api/v1"
"main/constant"
"main/middleware"
"github.com/gin-gonic/gin"
@ -15,9 +14,9 @@ func (this *GameSwitchRoute) InitGameSwitchRouter(priRouter *gin.RouterGroup) {
group := priRouter.Group("game_switch")
api := v1.ApiGroupApp.SystemApiGroup.GameSwitchApi
{
group.POST("add", middleware.Permission(constant.ADD_GAME_SWITCH, api.Add))
group.POST("edit", middleware.Permission(constant.EDIT_GAME_SWITCH, api.Edit))
group.POST("del", middleware.Permission(constant.DEL_GAME_SWITCH, api.Del))
group.GET("list", middleware.Permission(constant.GAME_SWITCH_LIST, api.List))
group.POST("add", middleware.Permission("api/v1/game_switch/add", api.Add))
group.POST("edit", middleware.Permission("api/v1/game_switch/edit", api.Edit))
group.POST("del", middleware.Permission("api/v1/game_switch/del", api.Del))
group.GET("list", middleware.Permission("api/v1/game_switch/list", api.List))
}
}

View File

@ -2,7 +2,6 @@ package system
import (
v1 "main/api/v1"
"main/constant"
"main/middleware"
"github.com/gin-gonic/gin"
@ -15,10 +14,10 @@ func (this *GroupMemberRoute) InitGroupMemberRouter(priRouter *gin.RouterGroup)
group := priRouter.Group("group_member")
api := v1.ApiGroupApp.SystemApiGroup.GroupMemberApi
{
group.POST("add", middleware.Permission(constant.ADD_MAIL_GROUP_MEMBER, api.Add))
group.POST("edit", middleware.Permission(constant.EDIT_MAIL_GROUP_MEMBER, api.Edit))
group.POST("del", middleware.Permission(constant.DEL_MAIL_GROUP_MEMBER, api.Del))
group.GET("list", middleware.Permission(constant.EMAIL_GROUP_LIST, api.List))
group.POST("uploadExcel", middleware.Permission(constant.UPLOAD_EXCEL_MAIL_GROUP, api.UploadExcel))
group.POST("add", middleware.Permission("api/v1/group_member/add", api.Add))
group.POST("edit", middleware.Permission("api/v1/group_member/edit", api.Edit))
group.POST("del", middleware.Permission("api/v1/group_member/del", api.Del))
group.GET("list", middleware.Permission("api/v1/group_member/list", api.List))
group.POST("uploadExcel", middleware.Permission("api/v1/group_member/uploadExcel", api.UploadExcel))
}
}

View File

@ -2,7 +2,6 @@ package system
import (
v1 "main/api/v1"
"main/constant"
"main/middleware"
"github.com/gin-gonic/gin"
@ -14,8 +13,8 @@ func (this *MailRoute) InitMailRouter(priRouter *gin.RouterGroup) {
priUserRouter := priRouter.Group("mail")
mailApi := v1.ApiGroupApp.SystemApiGroup.MailApi
{
priUserRouter.POST("add", middleware.Permission(constant.SEND_MAIL, mailApi.AddMail))
priUserRouter.POST("edit", middleware.Permission(constant.EDIT_MAIL, mailApi.EditMail))
priUserRouter.GET("list", middleware.Permission(constant.LIST_MAIL, mailApi.ListMail))
priUserRouter.POST("add", middleware.Permission("api/v1/mail/add", mailApi.AddMail))
priUserRouter.POST("edit", middleware.Permission("api/v1/mail/edit", mailApi.EditMail))
priUserRouter.GET("list", middleware.Permission("api/v1/mail/list", mailApi.ListMail))
}
}

View File

@ -2,7 +2,6 @@ package system
import (
v1 "main/api/v1"
"main/constant"
"main/middleware"
"github.com/gin-gonic/gin"
@ -14,8 +13,8 @@ func (this *AnncRouter) InitAnncRouter(priRouter *gin.RouterGroup) {
priUserRouter := priRouter.Group("annc")
anncApi := v1.ApiGroupApp.SystemApiGroup.AnncApi
{
priUserRouter.GET("anncList", middleware.Permission(constant.LIST_ANNOUNCEMENT, anncApi.AnncList))
priUserRouter.POST("addAnnc", middleware.Permission(constant.ADD_ANNOUNCEMENT, anncApi.AddAnnc))
priUserRouter.PUT("updateAnnc/:idx", middleware.Permission(constant.EDIT_ANNOUNCEMENT, anncApi.UpdateAnnc))
priUserRouter.GET("anncList", middleware.Permission("api/v1/annc/anncList", anncApi.AnncList))
priUserRouter.POST("addAnnc", middleware.Permission("api/v1/annc/addAnnc", anncApi.AddAnnc))
priUserRouter.PUT("updateAnnc/:idx", middleware.Permission("api/v1/annc/updateAnnc", anncApi.UpdateAnnc))
}
}

View File

@ -2,7 +2,6 @@ package system
import (
v1 "main/api/v1"
"main/constant"
"main/middleware"
"github.com/gin-gonic/gin"
@ -14,8 +13,8 @@ func (ar *AnncRouter) InitAuditRouter(priRouter *gin.RouterGroup) {
priUserRouter := priRouter.Group("audit")
auditApi := v1.ApiGroupApp.SystemApiGroup.AuditApi
{
priUserRouter.GET("auditList", middleware.Permission(constant.LIST_AUDIT, auditApi.AuditList))
priUserRouter.POST("addAudit", middleware.Permission(constant.ADD_AUDIT, auditApi.AddAudit))
priUserRouter.PUT("updateAudit/:idx", middleware.Permission(constant.EDIT_AUDIT, auditApi.UpdateAudit))
priUserRouter.GET("auditList", middleware.Permission("api/v1/audit/auditList", auditApi.AuditList))
priUserRouter.POST("addAudit", middleware.Permission("api/v1/audit/addAudit", auditApi.AddAudit))
priUserRouter.PUT("updateAudit/:idx", middleware.Permission("api/v1/audit/updateAudit", auditApi.UpdateAudit))
}
}

View File

@ -2,7 +2,6 @@ package system
import (
v1 "main/api/v1"
"main/constant"
"main/middleware"
"github.com/gin-gonic/gin"
@ -14,8 +13,8 @@ func (r *BattleServerRoute) InitBattleServerRouter(priRouter *gin.RouterGroup) {
priUserRouter := priRouter.Group("battle_server")
api := v1.ApiGroupApp.SystemApiGroup.BattleServerApi
{
priUserRouter.POST("add", middleware.Permission(constant.ADD_BATTLE_SERVER, api.Add))
priUserRouter.GET("list", middleware.Permission(constant.LIST_BATTLE_SERVER, api.List))
priUserRouter.PUT("update", middleware.Permission(constant.EDIT_BATTLE_SERVER, api.Update))
priUserRouter.POST("add", middleware.Permission("api/v1/battle_server/add", api.Add))
priUserRouter.GET("list", middleware.Permission("api/v1/battle_server/list", api.List))
priUserRouter.PUT("update", middleware.Permission("api/v1/batle_server/update", api.Update))
}
}

View File

@ -2,7 +2,6 @@ package system
import (
v1 "main/api/v1"
"main/constant"
"main/middleware"
"github.com/gin-gonic/gin"
@ -14,8 +13,8 @@ func (nr *NFTRouter) InitNFTRouter(priRouter *gin.RouterGroup) {
group := priRouter.Group("nft")
api := v1.ApiGroupApp.SystemApiGroup.NFTApi
{
group.POST("orderquery", middleware.Permission(constant.ORDER_QUERY, api.OrderQuery))
group.POST("salequery", middleware.Permission(constant.SALE_QUERY, api.SaleQuery))
group.POST("nftquery", middleware.Permission(constant.NFT_QUERY, api.NFTQuery))
group.POST("orderquery", middleware.Permission("api/v1/nft/orderquery", api.OrderQuery))
group.POST("salequery", middleware.Permission("api/v1/nft/salequery", api.SaleQuery))
group.POST("nftquery", middleware.Permission("api/v1/nft/nftquery", api.NFTQuery))
}
}

View File

@ -2,7 +2,6 @@ package system
import (
v1 "main/api/v1"
"main/constant"
"main/middleware"
"github.com/gin-gonic/gin"
@ -14,11 +13,11 @@ func (pr *PlayerRouter) InitPlayerRouter(priRouter *gin.RouterGroup) {
group := priRouter.Group("player")
api := v1.ApiGroupApp.SystemApiGroup.PlayerApi
{
group.POST("info", middleware.Permission(constant.PLAYER_INFO, api.Info))
group.POST("bagquery", middleware.Permission(constant.BAG_QUERY, api.BagQuery))
group.POST("heroesquery", middleware.Permission(constant.HERO_QUERY, api.HeroesQuery))
group.POST("goldbullionquery", middleware.Permission(constant.GOLD_BULLION_QUERY, api.GoldBullionQuery))
group.POST("ticketconsumequery", middleware.Permission(constant.TICKET_CONSUME_QUERY, api.TicketConsumeQuery))
group.POST("gamemallquery", middleware.Permission(constant.GAME_MALL_QUERY, api.GameMallQuery))
group.POST("info", middleware.Permission("api/v1/player/info", api.Info))
group.POST("bagquery", middleware.Permission("api/v1/player/bagquery", api.BagQuery))
group.POST("heroesquery", middleware.Permission("api/v1/player/heroesquery", api.HeroesQuery))
group.POST("goldbullionquery", middleware.Permission("api/v1/player/goldbullionquery", api.GoldBullionQuery))
group.POST("ticketconsumequery", middleware.Permission("api/v1/player/ticketconsumequery", api.TicketConsumeQuery))
group.POST("gamemallquery", middleware.Permission("api/v1/player/gamemallquery", api.GameMallQuery))
}
}

View File

@ -2,7 +2,6 @@ package system
import (
v1 "main/api/v1"
"main/constant"
"main/middleware"
"github.com/gin-gonic/gin"
@ -15,9 +14,9 @@ func (this *UserGroupRoute) InitUserGroupRouter(priRouter *gin.RouterGroup) {
group := priRouter.Group("user_group")
api := v1.ApiGroupApp.SystemApiGroup.UserGroupApi
{
group.POST("add", middleware.Permission(constant.SYS_ADD_USER, api.Add))
group.POST("edit", middleware.Permission(constant.SYS_EDIT_USER, api.Edit))
group.POST("del", middleware.Permission(constant.SYS_EDIT_USER, api.Del))
group.GET("list", middleware.Permission(constant.SYS_USER_LIST, api.List))
group.POST("add", middleware.Permission("api/v1/user_group/add", api.Add))
group.POST("edit", middleware.Permission("api/v1/user_group/edit", api.Edit))
group.POST("del", middleware.Permission("api/v1/user_group/del", api.Del))
group.GET("list", middleware.Permission("api/v1/user_group/list", api.List))
}
}