mirror of
https://github.com/go-admin-team/go-admin.git
synced 2026-09-21 02:04:09 +00:00
Merge branch 'dev' of github.com:go-admin-team/go-admin into dev
This commit is contained in:
+51
-13
@@ -1,6 +1,7 @@
|
||||
package apis
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/gin-gonic/gin/binding"
|
||||
"github.com/go-admin-team/go-admin-core/sdk"
|
||||
"go-admin/app/admin/models"
|
||||
@@ -63,8 +64,7 @@ func (e SysRole) GetPage(c *gin.Context) {
|
||||
// @Description 获取JSON
|
||||
// @Tags 角色/Role
|
||||
// @Param roleId path string false "roleId"
|
||||
// @Success 200 {string} string "{"code": 200, "data": [...]}"
|
||||
// @Success 200 {string} string "{"code": -1, "message": "抱歉未找到相关信息"}"
|
||||
// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
|
||||
// @Router /api/v1/role/{id} [get]
|
||||
// @Security Bearer
|
||||
func (e SysRole) Get(c *gin.Context) {
|
||||
@@ -77,7 +77,7 @@ func (e SysRole) Get(c *gin.Context) {
|
||||
Errors
|
||||
if err != nil {
|
||||
e.Logger.Error(err)
|
||||
e.Error(500, err, err.Error())
|
||||
e.Error(500, err, fmt.Sprintf(" %s ", err.Error()))
|
||||
return
|
||||
}
|
||||
|
||||
@@ -99,8 +99,7 @@ func (e SysRole) Get(c *gin.Context) {
|
||||
// @Accept application/json
|
||||
// @Product application/json
|
||||
// @Param data body dto.SysRoleControl true "data"
|
||||
// @Success 200 {string} string "{"code": 200, "message": "添加成功"}"
|
||||
// @Success 200 {string} string "{"code": -1, "message": "添加失败"}"
|
||||
// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
|
||||
// @Router /api/v1/role [post]
|
||||
// @Security Bearer
|
||||
func (e SysRole) Insert(c *gin.Context) {
|
||||
@@ -144,8 +143,7 @@ func (e SysRole) Insert(c *gin.Context) {
|
||||
// @Accept application/json
|
||||
// @Product application/json
|
||||
// @Param data body dto.SysRoleControl true "body"
|
||||
// @Success 200 {string} string "{"code": 200, "message": "修改成功"}"
|
||||
// @Success 200 {string} string "{"code": -1, "message": "修改失败"}"
|
||||
// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
|
||||
// @Router /api/v1/role/{id} [put]
|
||||
// @Security Bearer
|
||||
func (e SysRole) Update(c *gin.Context) {
|
||||
@@ -183,8 +181,7 @@ func (e SysRole) Update(c *gin.Context) {
|
||||
// @Description 删除数据
|
||||
// @Tags 角色/Role
|
||||
// @Param data body dto.SysRoleById true "body"
|
||||
// @Success 200 {string} string "{"code": 200, "message": "删除成功"}"
|
||||
// @Success 200 {string} string "{"code": -1, "message": "删除失败"}"
|
||||
// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
|
||||
// @Router /api/v1/role [delete]
|
||||
// @Security Bearer
|
||||
func (e SysRole) Delete(c *gin.Context) {
|
||||
@@ -197,25 +194,66 @@ func (e SysRole) Delete(c *gin.Context) {
|
||||
Errors
|
||||
if err != nil {
|
||||
e.Logger.Error(err)
|
||||
e.Error(500, err, err.Error())
|
||||
e.Error(500, err, fmt.Sprintf("删除角色 %v 失败,\r\n失败信息 %s", req.Ids, err.Error()))
|
||||
return
|
||||
}
|
||||
|
||||
err = s.Remove(&req)
|
||||
if err != nil {
|
||||
e.Logger.Error(err)
|
||||
e.Error(http.StatusInternalServerError, err, "")
|
||||
e.Error(500, err, "")
|
||||
return
|
||||
}
|
||||
_, err = global.LoadPolicy(c)
|
||||
if err != nil {
|
||||
e.Error(http.StatusInternalServerError, err, "")
|
||||
e.Error(500, err, fmt.Sprintf("删除角色 %v 失败,失败信息 %s", req.Id, err.Error()))
|
||||
return
|
||||
}
|
||||
e.OK(req.GetId(), "删除成功")
|
||||
e.OK(req.GetId(), fmt.Sprintf("删除角色角色 %v 状态成功!", req.GetId()))
|
||||
}
|
||||
|
||||
// Update2Status 修改用户角色状态
|
||||
// @Summary 修改用户角色
|
||||
// @Description 获取JSON
|
||||
// @Tags 角色/Role
|
||||
// @Accept application/json
|
||||
// @Product application/json
|
||||
// @Param data body dto.UpdateStatusReq true "body"
|
||||
// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
|
||||
// @Router /api/v1/role-status/{id} [put]
|
||||
// @Security Bearer
|
||||
func (e SysRole) Update2Status(c *gin.Context) {
|
||||
s := service.SysRole{}
|
||||
req := dto.UpdateStatusReq{}
|
||||
err := e.MakeContext(c).
|
||||
MakeOrm().
|
||||
Bind(&req, nil, binding.JSON).
|
||||
MakeService(&s.Service).
|
||||
Errors
|
||||
if err != nil {
|
||||
e.Logger.Error(err)
|
||||
e.Error(500, err, fmt.Sprintf("更新角色状态失败,失败原因:%s ", err.Error()))
|
||||
return
|
||||
}
|
||||
req.SetUpdateBy(user.GetUserId(c))
|
||||
err = s.UpdateStatus(&req)
|
||||
if err != nil {
|
||||
e.Error(500, err, fmt.Sprintf("更新角色状态失败,失败原因:%s ", err.Error()))
|
||||
return
|
||||
}
|
||||
e.OK(req.GetId(), fmt.Sprintf("更新角色 %v 状态成功!", req.GetId()))
|
||||
}
|
||||
|
||||
// Update2DataScope 更新角色数据权限
|
||||
// @Summary 更新角色数据权限
|
||||
// @Description 获取JSON
|
||||
// @Tags 角色/Role
|
||||
// @Accept application/json
|
||||
// @Product application/json
|
||||
// @Param data body dto.RoleDataScopeReq true "body"
|
||||
// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
|
||||
// @Router /api/v1/role-status/{id} [put]
|
||||
// @Security Bearer
|
||||
func (e SysRole) Update2DataScope(c *gin.Context) {
|
||||
s := &service.SysRole{}
|
||||
req := dto.RoleDataScopeReq{}
|
||||
|
||||
+62
-143
@@ -2,6 +2,8 @@ package tools
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"go-admin/app/admin/service"
|
||||
"go-admin/app/admin/service/dto"
|
||||
"net/http"
|
||||
"strconv"
|
||||
"strings"
|
||||
@@ -13,7 +15,6 @@ import (
|
||||
"github.com/go-admin-team/go-admin-core/sdk/config"
|
||||
"github.com/go-admin-team/go-admin-core/sdk/pkg"
|
||||
|
||||
"go-admin/app/admin/models"
|
||||
"go-admin/app/admin/models/tools"
|
||||
)
|
||||
|
||||
@@ -250,14 +251,20 @@ func (e Gen) NOActionsGen(c *gin.Context, tab tools.SysTables) {
|
||||
}
|
||||
|
||||
func (e Gen) genApiToFile(c *gin.Context, tab tools.SysTables) {
|
||||
e.Context = c
|
||||
log := e.GetLogger()
|
||||
err := e.MakeContext(c).
|
||||
MakeOrm().
|
||||
Errors
|
||||
if err != nil {
|
||||
e.Logger.Error(err)
|
||||
e.Error(500, err, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
basePath := "template/"
|
||||
|
||||
t1, err := template.ParseFiles(basePath + "api_migrate.template")
|
||||
if err != nil {
|
||||
log.Error(err)
|
||||
e.Logger.Error(err)
|
||||
e.Error(500, err, "")
|
||||
return
|
||||
}
|
||||
@@ -273,8 +280,15 @@ func (e Gen) genApiToFile(c *gin.Context, tab tools.SysTables) {
|
||||
}
|
||||
|
||||
func (e Gen) ActionsGen(c *gin.Context, tab tools.SysTables) {
|
||||
e.Context = c
|
||||
log := api.GetRequestLogger(c)
|
||||
err := e.MakeContext(c).
|
||||
MakeOrm().
|
||||
Errors
|
||||
if err != nil {
|
||||
e.Logger.Error(err)
|
||||
e.Error(500, err, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
basePath := "template/v4/"
|
||||
routerFile := basePath + "actions/router_check_role.go.template"
|
||||
|
||||
@@ -284,31 +298,31 @@ func (e Gen) ActionsGen(c *gin.Context, tab tools.SysTables) {
|
||||
|
||||
t1, err := template.ParseFiles(basePath + "model.go.template")
|
||||
if err != nil {
|
||||
log.Error(err)
|
||||
e.Logger.Error(err)
|
||||
e.Error(500, err, "")
|
||||
return
|
||||
}
|
||||
t3, err := template.ParseFiles(routerFile)
|
||||
if err != nil {
|
||||
log.Error(err)
|
||||
e.Logger.Error(err)
|
||||
e.Error(500, err, "")
|
||||
return
|
||||
}
|
||||
t4, err := template.ParseFiles(basePath + "js.go.template")
|
||||
if err != nil {
|
||||
log.Error(err)
|
||||
e.Logger.Error(err)
|
||||
e.Error(500, err, "")
|
||||
return
|
||||
}
|
||||
t5, err := template.ParseFiles(basePath + "vue.go.template")
|
||||
if err != nil {
|
||||
log.Error(err)
|
||||
e.Logger.Error(err)
|
||||
e.Error(500, err, "")
|
||||
return
|
||||
}
|
||||
t6, err := template.ParseFiles(basePath + "dto.go.template")
|
||||
if err != nil {
|
||||
log.Error(err)
|
||||
e.Logger.Error(err)
|
||||
e.Error(500, err, "")
|
||||
return
|
||||
}
|
||||
@@ -338,25 +352,26 @@ func (e Gen) ActionsGen(c *gin.Context, tab tools.SysTables) {
|
||||
}
|
||||
|
||||
func (e Gen) GenMenuAndApi(c *gin.Context) {
|
||||
e.Context = c
|
||||
log := e.GetLogger()
|
||||
|
||||
table := tools.SysTables{}
|
||||
timeNow := pkg.GetCurrentTime()
|
||||
id, err := pkg.StringToInt(c.Param("tableId"))
|
||||
pkg.HasError(err, "", -1)
|
||||
|
||||
db, err := pkg.GetOrm(c)
|
||||
s:=service.SysMenu{}
|
||||
err := e.MakeContext(c).
|
||||
MakeOrm().
|
||||
MakeService(&s.Service).
|
||||
Errors
|
||||
if err != nil {
|
||||
log.Errorf("get db connection error, %s", err.Error())
|
||||
e.Error(http.StatusInternalServerError, err, "数据库连接获取失败")
|
||||
e.Logger.Error(err)
|
||||
e.Error(500, err, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
table := tools.SysTables{}
|
||||
id, err := pkg.StringToInt(c.Param("tableId"))
|
||||
pkg.HasError(err, "", -1)
|
||||
|
||||
|
||||
table.TableId = id
|
||||
tab, _ := table.Get(db)
|
||||
Mmenu := models.Menu{}
|
||||
//Mmenu.MenuName =
|
||||
tab, _ := table.Get(e.Orm)
|
||||
|
||||
Mmenu := dto.SysMenuControl{}
|
||||
Mmenu.Title = tab.TableComment
|
||||
Mmenu.Icon = "pass"
|
||||
Mmenu.Path = "/" + strings.Replace(tab.TBName, "_", "-", -1)
|
||||
@@ -368,13 +383,10 @@ func (e Gen) GenMenuAndApi(c *gin.Context) {
|
||||
Mmenu.Sort = 0
|
||||
Mmenu.Visible = "0"
|
||||
Mmenu.IsFrame = "0"
|
||||
Mmenu.CreateBy = "1"
|
||||
Mmenu.UpdateBy = "1"
|
||||
Mmenu.CreatedAt = timeNow
|
||||
Mmenu.UpdatedAt = timeNow
|
||||
Mmenu.MenuId, err = Mmenu.Create(db)
|
||||
Mmenu.CreateBy = 1
|
||||
s.Insert(&Mmenu)
|
||||
|
||||
Cmenu := models.Menu{}
|
||||
Cmenu := dto.SysMenuControl{}
|
||||
Cmenu.MenuName = tab.ClassName + "Manage"
|
||||
Cmenu.Title = tab.TableComment
|
||||
Cmenu.Icon = "pass"
|
||||
@@ -388,13 +400,11 @@ func (e Gen) GenMenuAndApi(c *gin.Context) {
|
||||
Cmenu.Sort = 0
|
||||
Cmenu.Visible = "0"
|
||||
Cmenu.IsFrame = "0"
|
||||
Cmenu.CreateBy = "1"
|
||||
Cmenu.UpdateBy = "1"
|
||||
Cmenu.CreatedAt = timeNow
|
||||
Cmenu.UpdatedAt = timeNow
|
||||
Cmenu.MenuId, err = Cmenu.Create(db)
|
||||
Cmenu.CreateBy = 1
|
||||
Cmenu.UpdateBy = 1
|
||||
s.Insert(&Cmenu)
|
||||
|
||||
MList := models.Menu{}
|
||||
MList := dto.SysMenuControl{}
|
||||
MList.MenuName = ""
|
||||
MList.Title = "分页获取" + tab.TableComment
|
||||
MList.Icon = ""
|
||||
@@ -407,13 +417,11 @@ func (e Gen) GenMenuAndApi(c *gin.Context) {
|
||||
MList.Sort = 0
|
||||
MList.Visible = "0"
|
||||
MList.IsFrame = "0"
|
||||
MList.CreateBy = "1"
|
||||
MList.UpdateBy = "1"
|
||||
MList.CreatedAt = timeNow
|
||||
MList.UpdatedAt = timeNow
|
||||
MList.MenuId, err = MList.Create(db)
|
||||
MList.CreateBy = 1
|
||||
MList.UpdateBy = 1
|
||||
s.Insert(&MList)
|
||||
|
||||
MCreate := models.Menu{}
|
||||
MCreate := dto.SysMenuControl{}
|
||||
MCreate.MenuName = ""
|
||||
MCreate.Title = "创建" + tab.TableComment
|
||||
MCreate.Icon = ""
|
||||
@@ -426,13 +434,11 @@ func (e Gen) GenMenuAndApi(c *gin.Context) {
|
||||
MCreate.Sort = 0
|
||||
MCreate.Visible = "0"
|
||||
MCreate.IsFrame = "0"
|
||||
MCreate.CreateBy = "1"
|
||||
MCreate.UpdateBy = "1"
|
||||
MCreate.CreatedAt = timeNow
|
||||
MCreate.UpdatedAt = timeNow
|
||||
MCreate.MenuId, err = MCreate.Create(db)
|
||||
MCreate.CreateBy = 1
|
||||
MCreate.UpdateBy = 1
|
||||
s.Insert(&MCreate)
|
||||
|
||||
MUpdate := models.Menu{}
|
||||
MUpdate := dto.SysMenuControl{}
|
||||
MUpdate.MenuName = ""
|
||||
MUpdate.Title = "修改" + tab.TableComment
|
||||
MUpdate.Icon = ""
|
||||
@@ -445,13 +451,11 @@ func (e Gen) GenMenuAndApi(c *gin.Context) {
|
||||
MUpdate.Sort = 0
|
||||
MUpdate.Visible = "0"
|
||||
MUpdate.IsFrame = "0"
|
||||
MUpdate.CreateBy = "1"
|
||||
MUpdate.UpdateBy = "1"
|
||||
MUpdate.CreatedAt = timeNow
|
||||
MUpdate.UpdatedAt = timeNow
|
||||
MUpdate.MenuId, err = MUpdate.Create(db)
|
||||
MUpdate.CreateBy = 1
|
||||
MUpdate.UpdateBy = 1
|
||||
s.Insert(&MUpdate)
|
||||
|
||||
MDelete := models.Menu{}
|
||||
MDelete := dto.SysMenuControl{}
|
||||
MDelete.MenuName = ""
|
||||
MDelete.Title = "删除" + tab.TableComment
|
||||
MDelete.Icon = ""
|
||||
@@ -464,95 +468,10 @@ func (e Gen) GenMenuAndApi(c *gin.Context) {
|
||||
MDelete.Sort = 0
|
||||
MDelete.Visible = "0"
|
||||
MDelete.IsFrame = "0"
|
||||
MDelete.CreateBy = "1"
|
||||
MDelete.UpdateBy = "1"
|
||||
MDelete.CreatedAt = timeNow
|
||||
MDelete.UpdatedAt = timeNow
|
||||
MDelete.MenuId, err = MDelete.Create(db)
|
||||
MDelete.CreateBy = 1
|
||||
MDelete.UpdateBy = 1
|
||||
s.Insert(&MDelete)
|
||||
|
||||
var InterfaceId = 63
|
||||
Amenu := models.Menu{}
|
||||
Amenu.MenuName = tab.TBName
|
||||
Amenu.Title = tab.TableComment
|
||||
Amenu.Icon = "bug"
|
||||
Amenu.Path = tab.TBName
|
||||
Amenu.MenuType = "M"
|
||||
Amenu.Action = "无"
|
||||
Amenu.ParentId = InterfaceId
|
||||
Amenu.NoCache = false
|
||||
Amenu.Sort = 0
|
||||
Amenu.Visible = "1"
|
||||
Amenu.IsFrame = "0"
|
||||
Amenu.CreateBy = "1"
|
||||
Amenu.UpdateBy = "1"
|
||||
Amenu.CreatedAt = timeNow
|
||||
Amenu.UpdatedAt = timeNow
|
||||
Amenu.MenuId, err = Amenu.Create(db)
|
||||
|
||||
//AList := models.SysApi{}
|
||||
//AList.Name = ""
|
||||
//AList.Title = "分页获取" + tab.TableComment
|
||||
//AList.Path = "/api/v1/" + tab.ModuleFrontName
|
||||
//AList.Action = "GET"
|
||||
//AList.ParentId = Amenu.MenuId
|
||||
//AList.Sort = 0
|
||||
//AList.CreateBy = 1
|
||||
//AList.UpdateBy = 1
|
||||
//AList.CreatedAt = timeNow
|
||||
//AList.UpdatedAt = timeNow
|
||||
//AList.Id, err = AList.Create(db)
|
||||
//
|
||||
//AGet := models.SysApi{}
|
||||
//AList.Name = ""
|
||||
//AGet.Title = "根据id获取" + tab.TableComment
|
||||
//AGet.Path = "/api/v1/" + tab.ModuleFrontName + "/:id"
|
||||
//AGet.Action = "GET"
|
||||
//AGet.ParentId = Amenu.MenuId
|
||||
//AGet.Sort = 0
|
||||
//AGet.CreateBy = 1
|
||||
//AGet.UpdateBy = 1
|
||||
//AGet.CreatedAt = timeNow
|
||||
//AGet.UpdatedAt = timeNow
|
||||
//AGet.Id, err = AGet.Create(db)
|
||||
//
|
||||
//ACreate := models.SysApi{}
|
||||
//AList.Name = ""
|
||||
//ACreate.Title = "创建" + tab.TableComment
|
||||
//ACreate.Path = "/api/v1/" + tab.ModuleFrontName
|
||||
//ACreate.Action = "POST"
|
||||
//ACreate.ParentId = Amenu.MenuId
|
||||
//ACreate.Sort = 0
|
||||
//ACreate.CreateBy = 1
|
||||
//ACreate.UpdateBy = 1
|
||||
//ACreate.CreatedAt = timeNow
|
||||
//ACreate.UpdatedAt = timeNow
|
||||
//ACreate.Id, err = ACreate.Create(db)
|
||||
//
|
||||
//AUpdate := models.SysApi{}
|
||||
//AList.Name = ""
|
||||
//AUpdate.Title = "修改" + tab.TableComment
|
||||
//AUpdate.Path = "/api/v1/" + tab.ModuleFrontName + "/:id"
|
||||
//AUpdate.Action = "PUT"
|
||||
//AUpdate.ParentId = Amenu.MenuId
|
||||
//AUpdate.Sort = 0
|
||||
//AUpdate.CreateBy = 1
|
||||
//AUpdate.UpdateBy = 1
|
||||
//AUpdate.CreatedAt = timeNow
|
||||
//AUpdate.UpdatedAt = timeNow
|
||||
//AUpdate.Id, err = AUpdate.Create(db)
|
||||
//
|
||||
//ADelete := models.SysApi{}
|
||||
//AList.Name = ""
|
||||
//ADelete.Title = "删除" + tab.TableComment
|
||||
//ADelete.Path = "/api/v1/" + tab.ModuleFrontName
|
||||
//ADelete.Action = "DELETE"
|
||||
//ADelete.ParentId = Amenu.MenuId
|
||||
//ADelete.Sort = 0
|
||||
//ADelete.CreateBy = 1
|
||||
//ADelete.UpdateBy = 1
|
||||
//ADelete.CreatedAt = timeNow
|
||||
//ADelete.UpdatedAt = timeNow
|
||||
//ADelete.Id, err = ADelete.Create(db)
|
||||
|
||||
e.OK("", "数据生成成功!")
|
||||
}
|
||||
|
||||
+152
-160
@@ -1,162 +1,154 @@
|
||||
package models
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"github.com/go-admin-team/go-admin-core/sdk/pkg"
|
||||
"go-admin/common/models"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
type Menu struct {
|
||||
MenuId int `json:"menuId" gorm:"primaryKey;autoIncrement"`
|
||||
MenuName string `json:"menuName" gorm:"size:128;"`
|
||||
Title string `json:"title" gorm:"size:128;"`
|
||||
Icon string `json:"icon" gorm:"size:128;"`
|
||||
Path string `json:"path" gorm:"size:128;"`
|
||||
Paths string `json:"paths" gorm:"size:128;"`
|
||||
MenuType string `json:"menuType" gorm:"size:1;"`
|
||||
Action string `json:"action" gorm:"size:16;"`
|
||||
Permission string `json:"permission" gorm:"size:255;"`
|
||||
ParentId int `json:"parentId" gorm:"size:11;"`
|
||||
NoCache bool `json:"noCache" gorm:"size:8;"`
|
||||
Breadcrumb string `json:"breadcrumb" gorm:"size:255;"`
|
||||
Component string `json:"component" gorm:"size:255;"`
|
||||
Sort int `json:"sort" gorm:"size:4;"`
|
||||
Visible string `json:"visible" gorm:"size:1;"`
|
||||
CreateBy string `json:"createBy" gorm:"size:128;"`
|
||||
UpdateBy string `json:"updateBy" gorm:"size:128;"`
|
||||
IsFrame string `json:"isFrame" gorm:"size:1;DEFAULT:0;"`
|
||||
DataScope string `json:"dataScope" gorm:"-"`
|
||||
Params string `json:"params" gorm:"-"`
|
||||
RoleId int `gorm:"-"`
|
||||
Children []Menu `json:"children" gorm:"-"`
|
||||
IsSelect bool `json:"is_select" gorm:"-"`
|
||||
|
||||
models.ModelTime
|
||||
}
|
||||
|
||||
func (Menu) TableName() string {
|
||||
return "sys_menu"
|
||||
}
|
||||
|
||||
type MenuLable struct {
|
||||
Id int `json:"id" gorm:"-"`
|
||||
Label string `json:"label" gorm:"-"`
|
||||
Children []MenuLable `json:"children" gorm:"-"`
|
||||
}
|
||||
|
||||
type Menus struct {
|
||||
MenuId int `json:"menuId" gorm:"column:menu_id;primaryKey;autoIncrement;"`
|
||||
MenuName string `json:"menuName" gorm:"column:menu_name"`
|
||||
Title string `json:"title" gorm:"column:title"`
|
||||
Icon string `json:"icon" gorm:"column:icon"`
|
||||
Path string `json:"path" gorm:"column:path"`
|
||||
MenuType string `json:"menuType" gorm:"column:menu_type"`
|
||||
Action string `json:"action" gorm:"column:action"`
|
||||
Permission string `json:"permission" gorm:"column:permission"`
|
||||
ParentId int `json:"parentId" gorm:"column:parent_id"`
|
||||
NoCache bool `json:"noCache" gorm:"column:no_cache"`
|
||||
Breadcrumb string `json:"breadcrumb" gorm:"column:breadcrumb"`
|
||||
Component string `json:"component" gorm:"column:component"`
|
||||
Sort int `json:"sort" gorm:"column:sort"`
|
||||
|
||||
Visible string `json:"visible" gorm:"column:visible"`
|
||||
Children []Menu `json:"children" gorm:"-"`
|
||||
|
||||
CreateBy string `json:"createBy" gorm:"column:create_by"`
|
||||
UpdateBy string `json:"updateBy" gorm:"column:update_by"`
|
||||
DataScope string `json:"dataScope" gorm:"-"`
|
||||
Params string `json:"params" gorm:"-"`
|
||||
BaseModel
|
||||
}
|
||||
|
||||
func (Menus) TableName() string {
|
||||
return "sys_menu"
|
||||
}
|
||||
|
||||
type MenuRole struct {
|
||||
Menus
|
||||
IsSelect bool `json:"is_select" gorm:"-"`
|
||||
}
|
||||
|
||||
type MS []Menu
|
||||
|
||||
func (e *Menu) Get(tx *gorm.DB) (Menus []Menu, err error) {
|
||||
table := tx.Table(e.TableName())
|
||||
if e.MenuName != "" {
|
||||
table = table.Where("menu_name = ?", e.MenuName)
|
||||
}
|
||||
if e.Path != "" {
|
||||
table = table.Where("path = ?", e.Path)
|
||||
}
|
||||
if e.Action != "" {
|
||||
table = table.Where("action = ?", e.Action)
|
||||
}
|
||||
if e.MenuType != "" {
|
||||
table = table.Where("menu_type = ?", e.MenuType)
|
||||
}
|
||||
|
||||
if err = table.Order("sort").Find(&Menus).Error; err != nil {
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (e *Menu) GetPage(tx *gorm.DB) (Menus []Menu, err error) {
|
||||
table := tx.Table(e.TableName())
|
||||
if e.MenuName != "" {
|
||||
table = table.Where("menu_name = ?", e.MenuName)
|
||||
}
|
||||
if e.Title != "" {
|
||||
table = table.Where("title = ?", e.Title)
|
||||
}
|
||||
if e.Visible != "" {
|
||||
table = table.Where("visible = ?", e.Visible)
|
||||
}
|
||||
if e.MenuType != "" {
|
||||
table = table.Where("menu_type = ?", e.MenuType)
|
||||
}
|
||||
|
||||
// 数据权限控制
|
||||
dataPermission := new(DataPermission)
|
||||
dataPermission.UserId, _ = pkg.StringToInt(e.DataScope)
|
||||
table, err = dataPermission.GetDataScope("sys_menu", table)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if err = table.Order("sort").Find(&Menus).Error; err != nil {
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (e *Menu) Create(tx *gorm.DB) (id int, err error) {
|
||||
result := tx.Table(e.TableName()).Create(&e)
|
||||
if result.Error != nil {
|
||||
err = result.Error
|
||||
return
|
||||
}
|
||||
err = InitPaths(tx, e)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
id = e.MenuId
|
||||
return
|
||||
}
|
||||
|
||||
func InitPaths(tx *gorm.DB, menu *Menu) (err error) {
|
||||
parentMenu := new(Menu)
|
||||
if menu.ParentId != 0 {
|
||||
tx.Table("sys_menu").Where("menu_id = ?", menu.ParentId).First(parentMenu)
|
||||
if parentMenu.Paths == "" {
|
||||
err = errors.New("父级paths异常,请尝试对当前节点父级菜单进行更新操作!")
|
||||
return
|
||||
}
|
||||
menu.Paths = parentMenu.Paths + "/" + pkg.IntToString(menu.MenuId)
|
||||
} else {
|
||||
menu.Paths = "/0/" + pkg.IntToString(menu.MenuId)
|
||||
}
|
||||
tx.Table("sys_menu").Where("menu_id = ?", menu.MenuId).Update("paths", menu.Paths)
|
||||
return
|
||||
}
|
||||
//type Menu struct {
|
||||
// MenuId int `json:"menuId" gorm:"primaryKey;autoIncrement"`
|
||||
// MenuName string `json:"menuName" gorm:"size:128;"`
|
||||
// Title string `json:"title" gorm:"size:128;"`
|
||||
// Icon string `json:"icon" gorm:"size:128;"`
|
||||
// Path string `json:"path" gorm:"size:128;"`
|
||||
// Paths string `json:"paths" gorm:"size:128;"`
|
||||
// MenuType string `json:"menuType" gorm:"size:1;"`
|
||||
// Action string `json:"action" gorm:"size:16;"`
|
||||
// Permission string `json:"permission" gorm:"size:255;"`
|
||||
// ParentId int `json:"parentId" gorm:"size:11;"`
|
||||
// NoCache bool `json:"noCache" gorm:"size:8;"`
|
||||
// Breadcrumb string `json:"breadcrumb" gorm:"size:255;"`
|
||||
// Component string `json:"component" gorm:"size:255;"`
|
||||
// Sort int `json:"sort" gorm:"size:4;"`
|
||||
// Visible string `json:"visible" gorm:"size:1;"`
|
||||
// CreateBy string `json:"createBy" gorm:"size:128;"`
|
||||
// UpdateBy string `json:"updateBy" gorm:"size:128;"`
|
||||
// IsFrame string `json:"isFrame" gorm:"size:1;DEFAULT:0;"`
|
||||
// DataScope string `json:"dataScope" gorm:"-"`
|
||||
// Params string `json:"params" gorm:"-"`
|
||||
// RoleId int `gorm:"-"`
|
||||
// Children []Menu `json:"children" gorm:"-"`
|
||||
// IsSelect bool `json:"is_select" gorm:"-"`
|
||||
//
|
||||
// models.ModelTime
|
||||
//}
|
||||
//
|
||||
//func (Menu) TableName() string {
|
||||
// return "sys_menu"
|
||||
//}
|
||||
//
|
||||
//type MenuLable struct {
|
||||
// Id int `json:"id" gorm:"-"`
|
||||
// Label string `json:"label" gorm:"-"`
|
||||
// Children []MenuLable `json:"children" gorm:"-"`
|
||||
//}
|
||||
//
|
||||
//type Menus struct {
|
||||
// MenuId int `json:"menuId" gorm:"column:menu_id;primaryKey;autoIncrement;"`
|
||||
// MenuName string `json:"menuName" gorm:"column:menu_name"`
|
||||
// Title string `json:"title" gorm:"column:title"`
|
||||
// Icon string `json:"icon" gorm:"column:icon"`
|
||||
// Path string `json:"path" gorm:"column:path"`
|
||||
// MenuType string `json:"menuType" gorm:"column:menu_type"`
|
||||
// Action string `json:"action" gorm:"column:action"`
|
||||
// Permission string `json:"permission" gorm:"column:permission"`
|
||||
// ParentId int `json:"parentId" gorm:"column:parent_id"`
|
||||
// NoCache bool `json:"noCache" gorm:"column:no_cache"`
|
||||
// Breadcrumb string `json:"breadcrumb" gorm:"column:breadcrumb"`
|
||||
// Component string `json:"component" gorm:"column:component"`
|
||||
// Sort int `json:"sort" gorm:"column:sort"`
|
||||
//
|
||||
// Visible string `json:"visible" gorm:"column:visible"`
|
||||
// Children []Menu `json:"children" gorm:"-"`
|
||||
//
|
||||
// CreateBy string `json:"createBy" gorm:"column:create_by"`
|
||||
// UpdateBy string `json:"updateBy" gorm:"column:update_by"`
|
||||
// DataScope string `json:"dataScope" gorm:"-"`
|
||||
// Params string `json:"params" gorm:"-"`
|
||||
// BaseModel
|
||||
//}
|
||||
//
|
||||
//func (Menus) TableName() string {
|
||||
// return "sys_menu"
|
||||
//}
|
||||
//
|
||||
//type MenuRole struct {
|
||||
// Menus
|
||||
// IsSelect bool `json:"is_select" gorm:"-"`
|
||||
//}
|
||||
//
|
||||
//type MS []Menu
|
||||
//
|
||||
//func (e *Menu) Get(tx *gorm.DB) (Menus []Menu, err error) {
|
||||
// table := tx.Table(e.TableName())
|
||||
// if e.MenuName != "" {
|
||||
// table = table.Where("menu_name = ?", e.MenuName)
|
||||
// }
|
||||
// if e.Path != "" {
|
||||
// table = table.Where("path = ?", e.Path)
|
||||
// }
|
||||
// if e.Action != "" {
|
||||
// table = table.Where("action = ?", e.Action)
|
||||
// }
|
||||
// if e.MenuType != "" {
|
||||
// table = table.Where("menu_type = ?", e.MenuType)
|
||||
// }
|
||||
//
|
||||
// if err = table.Order("sort").Find(&Menus).Error; err != nil {
|
||||
// return
|
||||
// }
|
||||
// return
|
||||
//}
|
||||
//
|
||||
//func (e *Menu) GetPage(tx *gorm.DB) (Menus []Menu, err error) {
|
||||
// table := tx.Table(e.TableName())
|
||||
// if e.MenuName != "" {
|
||||
// table = table.Where("menu_name = ?", e.MenuName)
|
||||
// }
|
||||
// if e.Title != "" {
|
||||
// table = table.Where("title = ?", e.Title)
|
||||
// }
|
||||
// if e.Visible != "" {
|
||||
// table = table.Where("visible = ?", e.Visible)
|
||||
// }
|
||||
// if e.MenuType != "" {
|
||||
// table = table.Where("menu_type = ?", e.MenuType)
|
||||
// }
|
||||
//
|
||||
// // 数据权限控制
|
||||
// dataPermission := new(DataPermission)
|
||||
// dataPermission.UserId, _ = pkg.StringToInt(e.DataScope)
|
||||
// table, err = dataPermission.GetDataScope("sys_menu", table)
|
||||
// if err != nil {
|
||||
// return nil, err
|
||||
// }
|
||||
// if err = table.Order("sort").Find(&Menus).Error; err != nil {
|
||||
// return
|
||||
// }
|
||||
// return
|
||||
//}
|
||||
//
|
||||
//func (e *Menu) Create(tx *gorm.DB) (id int, err error) {
|
||||
// result := tx.Table(e.TableName()).Create(&e)
|
||||
// if result.Error != nil {
|
||||
// err = result.Error
|
||||
// return
|
||||
// }
|
||||
// err = InitPaths(tx, e)
|
||||
// if err != nil {
|
||||
// return
|
||||
// }
|
||||
// id = e.MenuId
|
||||
// return
|
||||
//}
|
||||
//
|
||||
//func InitPaths(tx *gorm.DB, menu *Menu) (err error) {
|
||||
// parentMenu := new(Menu)
|
||||
// if menu.ParentId != 0 {
|
||||
// tx.Table("sys_menu").Where("menu_id = ?", menu.ParentId).First(parentMenu)
|
||||
// if parentMenu.Paths == "" {
|
||||
// err = errors.New("父级paths异常,请尝试对当前节点父级菜单进行更新操作!")
|
||||
// return
|
||||
// }
|
||||
// menu.Paths = parentMenu.Paths + "/" + pkg.IntToString(menu.MenuId)
|
||||
// } else {
|
||||
// menu.Paths = "/0/" + pkg.IntToString(menu.MenuId)
|
||||
// }
|
||||
// tx.Table("sys_menu").Where("menu_id = ?", menu.MenuId).Update("paths", menu.Paths)
|
||||
// return
|
||||
//}
|
||||
|
||||
@@ -71,11 +71,6 @@ func SaveOperaLog(message storage.Messager) (err error) {
|
||||
log.Errorf("json Unmarshal error, %s", err.Error())
|
||||
return err
|
||||
}
|
||||
if l.Title == "" {
|
||||
m := &SysMenu{}
|
||||
db.Model(m).Select("Title").Where("action = ?", l.Method).Where("path = ?", message.GetValues()["_fullPath"]).First(m)
|
||||
l.Title = m.Title
|
||||
}
|
||||
err = db.Create(&l).Error
|
||||
if err != nil {
|
||||
log.Errorf("db create error, %s", err.Error())
|
||||
|
||||
@@ -2,16 +2,17 @@ package router
|
||||
|
||||
import (
|
||||
"github.com/gin-gonic/gin"
|
||||
jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth"
|
||||
"go-admin/app/admin/apis"
|
||||
"go-admin/app/admin/apis/tools"
|
||||
)
|
||||
|
||||
func init() {
|
||||
routerNoCheckRole = append(routerNoCheckRole, sysNoCheckRoleRouter, registerDBRouter, registerSysTableRouter)
|
||||
routerCheckRole = append(routerCheckRole, sysNoCheckRoleRouter, registerDBRouter, registerSysTableRouter)
|
||||
}
|
||||
|
||||
func sysNoCheckRoleRouter(v1 *gin.RouterGroup) {
|
||||
r := v1.Group("")
|
||||
func sysNoCheckRoleRouter(v1 *gin.RouterGroup ,authMiddleware *jwt.GinJWTMiddleware) {
|
||||
r := v1.Group("").Use(authMiddleware.MiddlewareFunc())
|
||||
{
|
||||
sys := apis.System{}
|
||||
r.GET("/getCaptcha", sys.GenerateCaptchaHandler)
|
||||
@@ -25,8 +26,8 @@ func sysNoCheckRoleRouter(v1 *gin.RouterGroup) {
|
||||
}
|
||||
}
|
||||
|
||||
func registerDBRouter(v1 *gin.RouterGroup) {
|
||||
db := v1.Group("/db")
|
||||
func registerDBRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {
|
||||
db := v1.Group("/db").Use(authMiddleware.MiddlewareFunc())
|
||||
{
|
||||
gen := tools.Gen{}
|
||||
db.GET("/tables/page", gen.GetDBTableList)
|
||||
@@ -34,12 +35,12 @@ func registerDBRouter(v1 *gin.RouterGroup) {
|
||||
}
|
||||
}
|
||||
|
||||
func registerSysTableRouter(v1 *gin.RouterGroup) {
|
||||
func registerSysTableRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {
|
||||
tables := v1.Group("/sys/tables")
|
||||
{
|
||||
sysTable := tools.SysTable{}
|
||||
tables.GET("/page", sysTable.GetSysTableList)
|
||||
tablesInfo := tables.Group("/info")
|
||||
tables.Group("").Use(authMiddleware.MiddlewareFunc()).GET("/page", sysTable.GetSysTableList)
|
||||
tablesInfo := tables.Group("/info").Use(authMiddleware.MiddlewareFunc())
|
||||
{
|
||||
tablesInfo.POST("", sysTable.InsertSysTable)
|
||||
tablesInfo.PUT("", sysTable.UpdateSysTable)
|
||||
|
||||
@@ -6,12 +6,7 @@ import (
|
||||
"github.com/gin-gonic/gin"
|
||||
log "github.com/go-admin-team/go-admin-core/logger"
|
||||
"github.com/go-admin-team/go-admin-core/sdk"
|
||||
"github.com/go-admin-team/go-admin-core/sdk/api"
|
||||
"github.com/go-admin-team/go-admin-core/sdk/config"
|
||||
"github.com/go-admin-team/go-admin-core/sdk/pkg"
|
||||
|
||||
common "go-admin/common/middleware"
|
||||
"go-admin/common/middleware/handler"
|
||||
)
|
||||
|
||||
// InitRouter 路由初始化,不要怀疑,这里用到了
|
||||
@@ -19,8 +14,8 @@ func InitRouter() {
|
||||
var r *gin.Engine
|
||||
h := sdk.Runtime.GetEngine()
|
||||
if h == nil {
|
||||
h = gin.New()
|
||||
sdk.Runtime.SetEngine(h)
|
||||
log.Fatal("not found engine...")
|
||||
os.Exit(-1)
|
||||
}
|
||||
switch h.(type) {
|
||||
case *gin.Engine:
|
||||
@@ -29,14 +24,7 @@ func InitRouter() {
|
||||
log.Fatal("not support other engine")
|
||||
os.Exit(-1)
|
||||
}
|
||||
if config.SslConfig.Enable {
|
||||
r.Use(handler.TlsHandler())
|
||||
}
|
||||
|
||||
r.Use(common.Sentinel()).
|
||||
Use(common.RequestId(pkg.TrafficKey)).
|
||||
Use(api.SetRequestLogger)
|
||||
common.InitMiddleware(r)
|
||||
// the jwt middleware
|
||||
authMiddleware, err := common.AuthInit()
|
||||
if err != nil {
|
||||
|
||||
@@ -28,12 +28,12 @@ func registerSysConfigRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMidd
|
||||
r1.GET("/:configKey", api.GetSysConfigByKEYForService)
|
||||
}
|
||||
|
||||
r2 := v1.Group("/app-config")
|
||||
r2 := v1.Group("/app-config").Use(authMiddleware.MiddlewareFunc())
|
||||
{
|
||||
r2.GET("", api.GetSysConfigBySysApp)
|
||||
}
|
||||
|
||||
r3 := v1.Group("/set-config")
|
||||
r3 := v1.Group("/set-config").Use(authMiddleware.MiddlewareFunc())
|
||||
{
|
||||
r3.PUT("", api.Update2Set)
|
||||
r3.GET("", api.Get2Set)
|
||||
|
||||
@@ -23,5 +23,9 @@ func registerSysRoleRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddle
|
||||
r.PUT("/:id", api.Update)
|
||||
r.DELETE("", api.Delete)
|
||||
}
|
||||
v1.PUT("/roledatascope", api.Update2DataScope)
|
||||
r1 := v1.Group("").Use(authMiddleware.MiddlewareFunc())
|
||||
{
|
||||
r1.PUT("/role-status", api.Update2Status)
|
||||
r1.PUT("/roledatascope", api.Update2DataScope)
|
||||
}
|
||||
}
|
||||
@@ -34,7 +34,6 @@ func (m *SysRoleSearch) GetNeedSearch() interface{} {
|
||||
return *m
|
||||
}
|
||||
|
||||
// SysConfigControl 增、改使用的结构体
|
||||
type SysRoleControl struct {
|
||||
RoleId int `uri:"id" comment:"角色编码"` // 角色编码
|
||||
RoleName string `form:"roleName" comment:"角色名称"` // 角色名称
|
||||
@@ -80,7 +79,25 @@ func (s *SysRoleControl) GetId() interface{} {
|
||||
return s.RoleId
|
||||
}
|
||||
|
||||
// SysConfigById 获取单个或者删除的结构体
|
||||
type UpdateStatusReq struct {
|
||||
RoleId int `form:"roleId" comment:"角色编码"` // 角色编码
|
||||
Status string `form:"status" comment:"状态"` // 状态
|
||||
common.ControlBy
|
||||
}
|
||||
|
||||
func (s *UpdateStatusReq) Generate(model *models.SysRole) {
|
||||
if s.RoleId != 0 {
|
||||
model.RoleId = s.RoleId
|
||||
}
|
||||
model.Status = s.Status
|
||||
}
|
||||
|
||||
func (s *UpdateStatusReq) GetId() interface{} {
|
||||
return s.RoleId
|
||||
}
|
||||
|
||||
|
||||
// SysRoleById 获取单个或者删除的结构体
|
||||
type SysRoleById struct {
|
||||
dto.ObjectById
|
||||
}
|
||||
|
||||
@@ -18,7 +18,7 @@ type SysMenu struct {
|
||||
service.Service
|
||||
}
|
||||
|
||||
// GetSysMenuPage 获取SysMenu列表
|
||||
// GetPage 获取SysMenu列表
|
||||
func (e *SysMenu) GetPage(c *dto.SysMenuSearch, menus *[]models.SysMenu) *SysMenu {
|
||||
var menu = make([]models.SysMenu, 0)
|
||||
err := e.getPage(c, &menu).Error
|
||||
@@ -36,7 +36,7 @@ func (e *SysMenu) GetPage(c *dto.SysMenuSearch, menus *[]models.SysMenu) *SysMen
|
||||
return e
|
||||
}
|
||||
|
||||
// getSysMenuPage 菜单分页列表
|
||||
// getPage 菜单分页列表
|
||||
func (e *SysMenu) getPage(c *dto.SysMenuSearch, list *[]models.SysMenu) *SysMenu {
|
||||
var err error
|
||||
var data models.SysMenu
|
||||
@@ -55,7 +55,7 @@ func (e *SysMenu) getPage(c *dto.SysMenuSearch, list *[]models.SysMenu) *SysMenu
|
||||
return e
|
||||
}
|
||||
|
||||
// GetSysMenu 获取SysMenu对象
|
||||
// Get 获取SysMenu对象
|
||||
func (e *SysMenu) Get(d *dto.SysMenuById, model *models.SysMenu) *SysMenu {
|
||||
var err error
|
||||
var data models.SysMenu
|
||||
@@ -82,7 +82,7 @@ func (e *SysMenu) Get(d *dto.SysMenuById, model *models.SysMenu) *SysMenu {
|
||||
return e
|
||||
}
|
||||
|
||||
// InsertSysMenu 创建SysMenu对象
|
||||
// Insert 创建SysMenu对象
|
||||
func (e *SysMenu) Insert(c *dto.SysMenuControl) *SysMenu {
|
||||
var err error
|
||||
var data models.SysMenu
|
||||
@@ -92,6 +92,7 @@ func (e *SysMenu) Insert(c *dto.SysMenuControl) *SysMenu {
|
||||
e.Log.Errorf("db error:%s", err)
|
||||
_ = e.AddError(err)
|
||||
}
|
||||
c.MenuId = data.MenuId
|
||||
return e
|
||||
}
|
||||
|
||||
@@ -113,7 +114,7 @@ func (e *SysMenu) initPaths(menu *models.SysMenu) error {
|
||||
return err
|
||||
}
|
||||
|
||||
// UpdateSysMenu 修改SysMenu对象
|
||||
// Update 修改SysMenu对象
|
||||
func (e *SysMenu) Update(c *dto.SysMenuControl) *SysMenu {
|
||||
var err error
|
||||
var model = models.SysMenu{}
|
||||
@@ -132,7 +133,7 @@ func (e *SysMenu) Update(c *dto.SysMenuControl) *SysMenu {
|
||||
return e
|
||||
}
|
||||
|
||||
// RemoveSysMenu 删除SysMenu
|
||||
// Remove 删除SysMenu
|
||||
func (e *SysMenu) Remove(d *dto.SysMenuById) *SysMenu {
|
||||
var err error
|
||||
var data models.SysMenu
|
||||
|
||||
@@ -237,3 +237,31 @@ func (e *SysRole) UpdateDataScope(c *models.SysRole) (err error) {
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
// UpdateStatus 修改SysRole对象status
|
||||
func (e *SysRole) UpdateStatus(c *dto.UpdateStatusReq) error {
|
||||
var err error
|
||||
|
||||
tx := e.Orm.Debug().Begin()
|
||||
defer func() {
|
||||
if err != nil {
|
||||
tx.Rollback()
|
||||
} else {
|
||||
tx.Commit()
|
||||
}
|
||||
}()
|
||||
var model = models.SysRole{}
|
||||
tx.First(&model, c.GetId())
|
||||
c.Generate(&model)
|
||||
db := tx.Session(&gorm.Session{FullSaveAssociations: true}).Debug().Save(&model)
|
||||
|
||||
if db.Error != nil {
|
||||
e.Log.Errorf("db error:%s", err)
|
||||
return err
|
||||
}
|
||||
if db.RowsAffected == 0 {
|
||||
return errors.New("无权更新该数据")
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -8,67 +8,68 @@ import (
|
||||
"go-admin/app/admin/models"
|
||||
)
|
||||
|
||||
// SysRoleMenu 即将弃用结构体
|
||||
type SysRoleMenu struct {
|
||||
service.Service
|
||||
}
|
||||
|
||||
func (e *SysRoleMenu) ReloadRule(tx *gorm.DB, roleId int, menuId []int) (err error) {
|
||||
var role models.SysRole
|
||||
|
||||
msgID := e.MsgID
|
||||
|
||||
menu := make([]models.Menu, 0)
|
||||
roleMenu := make([]models.RoleMenu, len(menuId))
|
||||
casbinRule := make([]models.CasbinRule, 0)
|
||||
//先删除所有的
|
||||
err = e.DeleteRoleMenu(tx, roleId)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
// 在事务中做一些数据库操作(从这一点使用'tx',而不是'db')
|
||||
err = tx.Where("role_id = ?", roleId).First(&role).Error
|
||||
if err != nil {
|
||||
log.Errorf("msgID[%s] get role error, %s", msgID, err.Error())
|
||||
return
|
||||
}
|
||||
err = tx.Where("menu_id in (?)", menuId).
|
||||
//Select("path, action, menu_id, menu_type").
|
||||
Find(&menu).Error
|
||||
if err != nil {
|
||||
log.Errorf("msgID[%s] get menu error, %s", msgID, err.Error())
|
||||
return
|
||||
}
|
||||
for i := range menu {
|
||||
roleMenu[i] = models.RoleMenu{
|
||||
RoleId: role.RoleId,
|
||||
MenuId: menu[i].MenuId,
|
||||
RoleName: role.RoleKey,
|
||||
}
|
||||
if menu[i].MenuType == "A" {
|
||||
casbinRule = append(casbinRule, models.CasbinRule{
|
||||
PType: "p",
|
||||
V0: role.RoleKey,
|
||||
V1: menu[i].Path,
|
||||
V2: menu[i].Action,
|
||||
})
|
||||
}
|
||||
}
|
||||
err = tx.Create(&roleMenu).Error
|
||||
if err != nil {
|
||||
log.Errorf("msgID[%s] batch create role's menu error, %s", msgID, err.Error())
|
||||
return
|
||||
}
|
||||
if len(casbinRule) > 0 {
|
||||
err = tx.Create(&casbinRule).Error
|
||||
if err != nil {
|
||||
log.Errorf("msgID[%s] batch create casbin rule error, %s", msgID, err.Error())
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
//func (e *SysRoleMenu) ReloadRule(tx *gorm.DB, roleId int, menuId []int) (err error) {
|
||||
// var role models.SysRole
|
||||
//
|
||||
// msgID := e.MsgID
|
||||
//
|
||||
// menu := make([]models.Menu, 0)
|
||||
// roleMenu := make([]models.RoleMenu, len(menuId))
|
||||
// casbinRule := make([]models.CasbinRule, 0)
|
||||
// //先删除所有的
|
||||
// err = e.DeleteRoleMenu(tx, roleId)
|
||||
// if err != nil {
|
||||
// return
|
||||
// }
|
||||
//
|
||||
// // 在事务中做一些数据库操作(从这一点使用'tx',而不是'db')
|
||||
// err = tx.Where("role_id = ?", roleId).First(&role).Error
|
||||
// if err != nil {
|
||||
// log.Errorf("msgID[%s] get role error, %s", msgID, err.Error())
|
||||
// return
|
||||
// }
|
||||
// err = tx.Where("menu_id in (?)", menuId).
|
||||
// //Select("path, action, menu_id, menu_type").
|
||||
// Find(&menu).Error
|
||||
// if err != nil {
|
||||
// log.Errorf("msgID[%s] get menu error, %s", msgID, err.Error())
|
||||
// return
|
||||
// }
|
||||
// for i := range menu {
|
||||
// roleMenu[i] = models.RoleMenu{
|
||||
// RoleId: role.RoleId,
|
||||
// MenuId: menu[i].MenuId,
|
||||
// RoleName: role.RoleKey,
|
||||
// }
|
||||
// if menu[i].MenuType == "A" {
|
||||
// casbinRule = append(casbinRule, models.CasbinRule{
|
||||
// PType: "p",
|
||||
// V0: role.RoleKey,
|
||||
// V1: menu[i].Path,
|
||||
// V2: menu[i].Action,
|
||||
// })
|
||||
// }
|
||||
// }
|
||||
// err = tx.Create(&roleMenu).Error
|
||||
// if err != nil {
|
||||
// log.Errorf("msgID[%s] batch create role's menu error, %s", msgID, err.Error())
|
||||
// return
|
||||
// }
|
||||
// if len(casbinRule) > 0 {
|
||||
// err = tx.Create(&casbinRule).Error
|
||||
// if err != nil {
|
||||
// log.Errorf("msgID[%s] batch create casbin rule error, %s", msgID, err.Error())
|
||||
// return
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// return
|
||||
//}
|
||||
|
||||
func (e *SysRoleMenu) DeleteRoleMenu(tx *gorm.DB, roleId int) (err error) {
|
||||
msgID := e.MsgID
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package router
|
||||
|
||||
import (
|
||||
"github.com/go-admin-team/go-admin-core/sdk/pkg"
|
||||
_ "github.com/go-admin-team/go-admin-core/sdk/pkg"
|
||||
"os"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
@@ -15,8 +15,8 @@ func InitRouter() {
|
||||
var r *gin.Engine
|
||||
h := sdk.Runtime.GetEngine()
|
||||
if h == nil {
|
||||
h = gin.New()
|
||||
sdk.Runtime.SetEngine(h)
|
||||
log.Fatal("not found engine...")
|
||||
os.Exit(-1)
|
||||
}
|
||||
switch h.(type) {
|
||||
case *gin.Engine:
|
||||
@@ -25,10 +25,6 @@ func InitRouter() {
|
||||
log.Fatal("not support other engine")
|
||||
os.Exit(-1)
|
||||
}
|
||||
r.Use(common.Sentinel()).
|
||||
Use(common.RequestId(pkg.TrafficKey))
|
||||
common.InitMiddleware(r)
|
||||
|
||||
// the jwt middleware
|
||||
authMiddleware, err := common.AuthInit()
|
||||
if err != nil {
|
||||
@@ -36,6 +32,5 @@ func InitRouter() {
|
||||
}
|
||||
|
||||
// 注册业务路由
|
||||
// TODO: 这里可存放业务路由,里边并无实际路由只有演示代码
|
||||
initRouter(r, authMiddleware)
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package router
|
||||
|
||||
import (
|
||||
"github.com/go-admin-team/go-admin-core/sdk/pkg"
|
||||
//"github.com/go-admin-team/go-admin-core/sdk/pkg"
|
||||
"os"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
@@ -15,8 +15,8 @@ func InitRouter() {
|
||||
var r *gin.Engine
|
||||
h := sdk.Runtime.GetEngine()
|
||||
if h == nil {
|
||||
h = gin.New()
|
||||
sdk.Runtime.SetEngine(h)
|
||||
log.Fatal("not found engine...")
|
||||
os.Exit(-1)
|
||||
}
|
||||
switch h.(type) {
|
||||
case *gin.Engine:
|
||||
@@ -26,16 +26,11 @@ func InitRouter() {
|
||||
os.Exit(-1)
|
||||
}
|
||||
|
||||
r.Use(common.Sentinel()).
|
||||
Use(common.RequestId(pkg.TrafficKey))
|
||||
common.InitMiddleware(r)
|
||||
// the jwt middleware
|
||||
authMiddleware, err := common.AuthInit()
|
||||
if err != nil {
|
||||
log.Fatalf("JWT Init Error, %s", err.Error())
|
||||
}
|
||||
|
||||
// 注册业务路由
|
||||
// TODO: 这里可存放业务路由,里边并无实际路由只有演示代码
|
||||
initRouter(r, authMiddleware)
|
||||
}
|
||||
|
||||
@@ -14,8 +14,8 @@ func InitRouter() {
|
||||
var r *gin.Engine
|
||||
h := sdk.Runtime.GetEngine()
|
||||
if h == nil {
|
||||
h = gin.New()
|
||||
sdk.Runtime.SetEngine(h)
|
||||
log.Fatal("not found engine...")
|
||||
os.Exit(-1)
|
||||
}
|
||||
switch h.(type) {
|
||||
case *gin.Engine:
|
||||
@@ -24,10 +24,6 @@ func InitRouter() {
|
||||
log.Fatal("not support other engine")
|
||||
os.Exit(-1)
|
||||
}
|
||||
|
||||
//r.Use(common.Sentinel()).
|
||||
// Use(common.RequestId(pkg.TrafficKey))
|
||||
common.InitMiddleware(r)
|
||||
// the jwt middleware
|
||||
authMiddleware, err := common.AuthInit()
|
||||
if err != nil {
|
||||
|
||||
+41
-49
@@ -12,10 +12,9 @@ import (
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/go-admin-team/go-admin-core/config/source/file"
|
||||
"github.com/go-admin-team/go-admin-core/sdk"
|
||||
"github.com/go-admin-team/go-admin-core/sdk/api"
|
||||
"github.com/go-admin-team/go-admin-core/sdk/config"
|
||||
"github.com/go-admin-team/go-admin-core/sdk/pkg"
|
||||
"github.com/go-admin-team/go-admin-core/sdk/pkg/captcha"
|
||||
"github.com/go-admin-team/go-admin-core/sdk/pkg/logger"
|
||||
"github.com/go-admin-team/go-admin-core/sdk/runtime"
|
||||
"github.com/spf13/cobra"
|
||||
|
||||
@@ -24,6 +23,9 @@ import (
|
||||
"go-admin/app/jobs"
|
||||
"go-admin/common/database"
|
||||
"go-admin/common/global"
|
||||
common "go-admin/common/middleware"
|
||||
"go-admin/common/middleware/handler"
|
||||
"go-admin/common/storage"
|
||||
ext "go-admin/config"
|
||||
)
|
||||
|
||||
@@ -58,65 +60,27 @@ func setup() {
|
||||
// 注入配置扩展项
|
||||
config.ExtendConfig = &ext.ExtConfig
|
||||
//1. 读取配置
|
||||
config.Setup(file.NewSource(file.WithPath(configYml)))
|
||||
//2. 设置日志
|
||||
sdk.Runtime.SetLogger(
|
||||
logger.SetupLogger(
|
||||
config.LoggerConfig.Type,
|
||||
config.LoggerConfig.Path,
|
||||
config.LoggerConfig.Level,
|
||||
config.LoggerConfig.Stdout))
|
||||
//3. 初始化数据库链接
|
||||
database.Setup()
|
||||
|
||||
//4. 设置缓存
|
||||
cacheAdapter, err := config.CacheConfig.Setup()
|
||||
if err != nil {
|
||||
log.Fatalf("cache setup error, %s\n", err.Error())
|
||||
}
|
||||
sdk.Runtime.SetCacheAdapter(cacheAdapter)
|
||||
//5. 设置验证码store
|
||||
captcha.SetStore(captcha.NewCacheStore(cacheAdapter, 600))
|
||||
|
||||
//6. 设置队列
|
||||
if !config.QueueConfig.Empty() {
|
||||
queueAdapter, err := config.QueueConfig.Setup()
|
||||
if err != nil {
|
||||
log.Fatalf("queue setup error, %s\n", err.Error())
|
||||
}
|
||||
sdk.Runtime.SetQueueAdapter(queueAdapter)
|
||||
defer func() {
|
||||
go queueAdapter.Run()
|
||||
}()
|
||||
}
|
||||
|
||||
//7. 设置分布式锁
|
||||
if !config.LockerConfig.Empty() {
|
||||
lockerAdapter, err := config.LockerConfig.Setup()
|
||||
if err != nil {
|
||||
log.Fatalf("locker setup error, %s\n", err.Error())
|
||||
}
|
||||
sdk.Runtime.SetLockerAdapter(lockerAdapter)
|
||||
}
|
||||
|
||||
usageStr := `starting api server...`
|
||||
log.Println(usageStr)
|
||||
config.Setup(
|
||||
file.NewSource(file.WithPath(configYml)),
|
||||
database.Setup,
|
||||
storage.Setup,
|
||||
)
|
||||
//注册监听函数
|
||||
queue := sdk.Runtime.GetMemoryQueue("")
|
||||
queue.Register(global.LoginLog, models.SaveLoginLog)
|
||||
queue.Register(global.OperateLog, models.SaveOperaLog)
|
||||
queue.Register(global.ApiCheck, models.SaveSysApi)
|
||||
go queue.Run()
|
||||
|
||||
usageStr := `starting api server...`
|
||||
log.Println(usageStr)
|
||||
}
|
||||
|
||||
func run() error {
|
||||
if config.ApplicationConfig.Mode == pkg.ModeProd.String() {
|
||||
gin.SetMode(gin.ReleaseMode)
|
||||
}
|
||||
engine := sdk.Runtime.GetEngine()
|
||||
if engine == nil {
|
||||
engine = gin.New()
|
||||
}
|
||||
initRouter()
|
||||
|
||||
for _, f := range AppRouters {
|
||||
f()
|
||||
@@ -126,11 +90,13 @@ func run() error {
|
||||
Addr: fmt.Sprintf("%s:%d", config.ApplicationConfig.Host, config.ApplicationConfig.Port),
|
||||
Handler: sdk.Runtime.GetEngine(),
|
||||
}
|
||||
|
||||
go func() {
|
||||
jobs.InitJob()
|
||||
jobs.Setup(sdk.Runtime.GetDb())
|
||||
|
||||
}()
|
||||
|
||||
if apiCheck {
|
||||
var routers = sdk.Runtime.GetRouter()
|
||||
q := sdk.Runtime.GetMemoryQueue("")
|
||||
@@ -191,3 +157,29 @@ func tip() {
|
||||
usageStr := `欢迎使用 ` + pkg.Green(`go-admin `+global.Version) + ` 可以使用 ` + pkg.Red(`-h`) + ` 查看命令`
|
||||
fmt.Printf("%s \n\n", usageStr)
|
||||
}
|
||||
|
||||
func initRouter() {
|
||||
var r *gin.Engine
|
||||
h := sdk.Runtime.GetEngine()
|
||||
if h == nil {
|
||||
h = gin.New()
|
||||
sdk.Runtime.SetEngine(h)
|
||||
}
|
||||
switch h.(type) {
|
||||
case *gin.Engine:
|
||||
r = h.(*gin.Engine)
|
||||
default:
|
||||
log.Fatal("not support other engine")
|
||||
os.Exit(-1)
|
||||
}
|
||||
if config.SslConfig.Enable {
|
||||
r.Use(handler.TlsHandler())
|
||||
}
|
||||
//r.Use(middleware.Metrics())
|
||||
r.Use(common.Sentinel()).
|
||||
Use(common.RequestId(pkg.TrafficKey)).
|
||||
Use(api.SetRequestLogger)
|
||||
|
||||
common.InitMiddleware(r)
|
||||
|
||||
}
|
||||
|
||||
@@ -11,8 +11,8 @@ type SysRole struct {
|
||||
Admin bool `json:"admin" gorm:"size:4;"`
|
||||
DataScope string `json:"dataScope" gorm:"size:128;"`
|
||||
SysMenu []SysMenu `json:"sysMenu" gorm:"many2many:sys_role_menu;foreignKey:RoleId;joinForeignKey:role_id;references:MenuId;joinReferences:menu_id;"`
|
||||
ModelTime
|
||||
ControlBy
|
||||
ModelTime
|
||||
}
|
||||
|
||||
func (SysRole) TableName() string {
|
||||
|
||||
@@ -40,6 +40,7 @@ func _1599190683659Tables(db *gorm.DB, version string) error {
|
||||
new(models.SysCategory),
|
||||
new(models.SysContent),
|
||||
new(models.SysApi),
|
||||
new(models.SysChinaAreaData),
|
||||
)
|
||||
if err != nil {
|
||||
return err
|
||||
|
||||
+5
-12
@@ -13,7 +13,6 @@ import (
|
||||
"github.com/spf13/cobra"
|
||||
|
||||
"github.com/go-admin-team/go-admin-core/sdk/config"
|
||||
"github.com/go-admin-team/go-admin-core/sdk/pkg/logger"
|
||||
"go-admin/cmd/migrate/migration"
|
||||
_ "go-admin/cmd/migrate/migration/version"
|
||||
_ "go-admin/cmd/migrate/migration/version-local"
|
||||
@@ -49,15 +48,10 @@ func run() {
|
||||
if !generate {
|
||||
fmt.Println(`start init`)
|
||||
//1. 读取配置
|
||||
config.Setup(file.NewSource(file.WithPath(configYml)))
|
||||
//2. 设置日志
|
||||
sdk.Runtime.SetLogger(
|
||||
logger.SetupLogger(
|
||||
config.LoggerConfig.Type,
|
||||
config.LoggerConfig.Path,
|
||||
config.LoggerConfig.Level,
|
||||
config.LoggerConfig.Stdout))
|
||||
_ = initDB()
|
||||
config.Setup(
|
||||
file.NewSource(file.WithPath(configYml)),
|
||||
initDB,
|
||||
)
|
||||
} else {
|
||||
fmt.Println(`generate migration file`)
|
||||
_ = genFile()
|
||||
@@ -81,14 +75,13 @@ func migrateModel() error {
|
||||
migration.Migrate.Migrate()
|
||||
return err
|
||||
}
|
||||
func initDB() error {
|
||||
func initDB() {
|
||||
//3. 初始化数据库链接
|
||||
database.Setup()
|
||||
//4. 数据库迁移
|
||||
fmt.Println("数据库迁移开始")
|
||||
_ = migrateModel()
|
||||
fmt.Println(`数据库基础数据初始化成功`)
|
||||
return nil
|
||||
}
|
||||
|
||||
func genFile() error {
|
||||
|
||||
@@ -14,6 +14,7 @@ import (
|
||||
"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user"
|
||||
"github.com/go-admin-team/go-admin-core/sdk/pkg/response"
|
||||
"github.com/mssola/user_agent"
|
||||
gaConfig "go-admin/config"
|
||||
|
||||
"go-admin/common/global"
|
||||
)
|
||||
@@ -115,7 +116,7 @@ func LoginLogToDB(c *gin.Context, status string, msg string, username string) {
|
||||
|
||||
ua := user_agent.New(c.Request.UserAgent())
|
||||
l["ipaddr"] = c.ClientIP()
|
||||
l["loginLocation"] = pkg.GetLocation(c.ClientIP())
|
||||
l["loginLocation"] = pkg.GetLocation(c.ClientIP(),gaConfig.ExtConfig.AMap.Key)
|
||||
l["loginTime"] = pkg.GetCurrentTime()
|
||||
l["status"] = status
|
||||
l["remark"] = c.Request.UserAgent()
|
||||
@@ -139,6 +140,7 @@ func LoginLogToDB(c *gin.Context, status string, msg string, username string) {
|
||||
}
|
||||
}
|
||||
|
||||
// LogOut
|
||||
// @Summary 退出登录
|
||||
// @Description 获取token
|
||||
// LoginHandler can be used by clients to get a jwt token.
|
||||
@@ -167,7 +169,6 @@ func Authorizator(data interface{}, c *gin.Context) bool {
|
||||
c.Set("userId", u.UserId)
|
||||
c.Set("userName", u.Username)
|
||||
c.Set("dataScope", r.DataScope)
|
||||
|
||||
return true
|
||||
}
|
||||
return false
|
||||
|
||||
@@ -26,6 +26,7 @@ func InitMiddleware(r *gin.Engine) {
|
||||
r.Use(Options)
|
||||
// Secure is a middleware function that appends security
|
||||
r.Use(Secure)
|
||||
//r.Use(DemoEvn())
|
||||
// 链路追踪
|
||||
//r.Use(middleware.Trace())
|
||||
sdk.Runtime.SetMiddleware(JwtTokenCheck, (*jwt.GinJWTMiddleware).MiddlewareFunc)
|
||||
|
||||
@@ -4,6 +4,7 @@ import (
|
||||
"bufio"
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
gaConfig "go-admin/config"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
@@ -104,7 +105,7 @@ func SetDBOperLog(c *gin.Context, clientIP string, statusCode int, reqUri string
|
||||
l["_fullPath"] = c.FullPath()
|
||||
l["operUrl"] = reqUri
|
||||
l["operIp"] = clientIP
|
||||
l["operLocation"] = pkg.GetLocation(clientIP)
|
||||
l["operLocation"] = pkg.GetLocation(clientIP, gaConfig.ExtConfig.AMap.Key)
|
||||
l["operName"] = user.GetUserName(c)
|
||||
l["requestMethod"] = c.Request.Method
|
||||
l["operParam"] = body
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
/*
|
||||
* @Author: lwnmengjing
|
||||
* @Date: 2021/6/10 3:39 下午
|
||||
* @Last Modified by: lwnmengjing
|
||||
* @Last Modified time: 2021/6/10 3:39 下午
|
||||
*/
|
||||
|
||||
package storage
|
||||
|
||||
import (
|
||||
"log"
|
||||
|
||||
"github.com/go-admin-team/go-admin-core/sdk"
|
||||
"github.com/go-admin-team/go-admin-core/sdk/config"
|
||||
"github.com/go-admin-team/go-admin-core/sdk/pkg/captcha"
|
||||
)
|
||||
|
||||
// Setup 配置storage组件
|
||||
func Setup() {
|
||||
//4. 设置缓存
|
||||
cacheAdapter, err := config.CacheConfig.Setup()
|
||||
if err != nil {
|
||||
log.Fatalf("cache setup error, %s\n", err.Error())
|
||||
}
|
||||
sdk.Runtime.SetCacheAdapter(cacheAdapter)
|
||||
//5. 设置验证码store
|
||||
captcha.SetStore(captcha.NewCacheStore(cacheAdapter, 600))
|
||||
|
||||
//6. 设置队列
|
||||
if !config.QueueConfig.Empty() {
|
||||
if q := sdk.Runtime.GetQueueAdapter(); q != nil {
|
||||
q.Shutdown()
|
||||
}
|
||||
queueAdapter, err := config.QueueConfig.Setup()
|
||||
if err != nil {
|
||||
log.Fatalf("queue setup error, %s\n", err.Error())
|
||||
}
|
||||
sdk.Runtime.SetQueueAdapter(queueAdapter)
|
||||
defer func() {
|
||||
go queueAdapter.Run()
|
||||
}()
|
||||
}
|
||||
|
||||
//7. 设置分布式锁
|
||||
if !config.LockerConfig.Empty() {
|
||||
lockerAdapter, err := config.LockerConfig.Setup()
|
||||
if err != nil {
|
||||
log.Fatalf("locker setup error, %s\n", err.Error())
|
||||
}
|
||||
sdk.Runtime.SetLockerAdapter(lockerAdapter)
|
||||
}
|
||||
}
|
||||
+7
-3828
File diff suppressed because it is too large
Load Diff
+3
-3
@@ -8,9 +8,9 @@ var ExtConfig Extend
|
||||
// name: demo-name
|
||||
// 使用方法: config.ExtConfig......即可!!
|
||||
type Extend struct {
|
||||
// Demo Demo // 这里配置对应配置文件的结构即可
|
||||
AMap AMap // 这里配置对应配置文件的结构即可
|
||||
}
|
||||
|
||||
type Demo struct {
|
||||
Name string
|
||||
type AMap struct {
|
||||
Key string
|
||||
}
|
||||
|
||||
@@ -9,8 +9,8 @@ require (
|
||||
github.com/bytedance/go-tagexpr/v2 v2.7.10
|
||||
github.com/casbin/casbin/v2 v2.25.1
|
||||
github.com/gin-gonic/gin v1.7.1
|
||||
github.com/go-admin-team/go-admin-core v1.3.5-rc.3.0.20210609062350-5aeb6bd49b09
|
||||
github.com/go-admin-team/go-admin-core/sdk v1.3.0-rc.3.0.20210609082125-a317acc34456
|
||||
github.com/go-admin-team/go-admin-core v1.3.5-rc.5.0.20210610090758-13967b971b9f
|
||||
github.com/go-admin-team/go-admin-core/sdk v1.3.5-rc.5.0.20210610090758-13967b971b9f
|
||||
github.com/google/uuid v1.2.0
|
||||
github.com/mssola/user_agent v0.5.2
|
||||
github.com/opentracing/opentracing-go v1.1.0
|
||||
|
||||
Reference in New Issue
Block a user