Parcourir la source

system_menu: 系统菜单管理

Yi il y a 11 mois
Parent
commit
bba2034cba

+ 1 - 1
go.mod

@@ -3,7 +3,7 @@ module kpt-pasture
 go 1.17
 
 require (
-	gitee.com/xuyiping_admin/go_proto v0.0.0-20240402084550-7d66da05ebce
+	gitee.com/xuyiping_admin/go_proto v0.0.0-20240403094850-f22ea147d1c9
 	gitee.com/xuyiping_admin/pkg v0.0.0-20231218082641-aac597b8a015
 	github.com/dgrijalva/jwt-go v3.2.0+incompatible
 	github.com/getsentry/sentry-go v0.23.0

+ 12 - 0
go.sum

@@ -64,6 +64,18 @@ gitee.com/xuyiping_admin/go_proto v0.0.0-20240402030013-33c4fbabf0f5 h1:rJCO0qqv
 gitee.com/xuyiping_admin/go_proto v0.0.0-20240402030013-33c4fbabf0f5/go.mod h1:x47UOU+lOkZnrtAENAsOGd7mZ5I8D2JRkMKMqLLRlVw=
 gitee.com/xuyiping_admin/go_proto v0.0.0-20240402084550-7d66da05ebce h1:HxA+zjiJdYNCK4iu3y1s0sfzOQkdhZ0PPwGOiKowdV0=
 gitee.com/xuyiping_admin/go_proto v0.0.0-20240402084550-7d66da05ebce/go.mod h1:x47UOU+lOkZnrtAENAsOGd7mZ5I8D2JRkMKMqLLRlVw=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20240403014542-2e9f500a53bc h1:KksLuzNAfhN8ibxkLblMofYTe+yCIo9qz0PtkBDNw0g=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20240403014542-2e9f500a53bc/go.mod h1:x47UOU+lOkZnrtAENAsOGd7mZ5I8D2JRkMKMqLLRlVw=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20240403025027-aa4f0f876a01 h1:PA+fcI9mME/pxm42w5GHR/7rGNC7WcuzLmH0Ik/0PDg=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20240403025027-aa4f0f876a01/go.mod h1:x47UOU+lOkZnrtAENAsOGd7mZ5I8D2JRkMKMqLLRlVw=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20240403062917-ced4e8885991 h1:+trtYM63Io8lFzzDd7vE4Mshgus2rWK6x7F681XetA8=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20240403062917-ced4e8885991/go.mod h1:x47UOU+lOkZnrtAENAsOGd7mZ5I8D2JRkMKMqLLRlVw=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20240403064016-d85d48a04178 h1:iBiJINcFX9Zyi/R3niRs9NjkzGswTjwSsH/+eY0PXg0=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20240403064016-d85d48a04178/go.mod h1:x47UOU+lOkZnrtAENAsOGd7mZ5I8D2JRkMKMqLLRlVw=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20240403064536-d1d49348948f h1:HAPmtD2trV5fThjUFpb1xqr+LwrngStFxwlckDkkfwk=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20240403064536-d1d49348948f/go.mod h1:x47UOU+lOkZnrtAENAsOGd7mZ5I8D2JRkMKMqLLRlVw=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20240403094850-f22ea147d1c9 h1:d8nMoLa+sKKuRgAGs/0W4Yez8Kr1NRTjlWYvn0Fh+Do=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20240403094850-f22ea147d1c9/go.mod h1:x47UOU+lOkZnrtAENAsOGd7mZ5I8D2JRkMKMqLLRlVw=
 gitee.com/xuyiping_admin/pkg v0.0.0-20231218082641-aac597b8a015 h1:dfb5dRd57L2HKjdwLT93UFmPYFPOmEl56gtZmqcNnaE=
 gitee.com/xuyiping_admin/pkg v0.0.0-20231218082641-aac597b8a015/go.mod h1:Fk4GYI/v0IK3XFrm1Gn+VkgCz5Y7mfswD5hsTJYOG6A=
 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=

+ 12 - 81
http/handler/system/menu.go

@@ -1,20 +1,22 @@
 package system
 
 import (
+	"kpt-pasture/http/middleware"
+	"net/http"
+	"strconv"
+
+	pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
 	operationPb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/operation"
 	"gitee.com/xuyiping_admin/pkg/apierr"
 	"gitee.com/xuyiping_admin/pkg/ginutil"
 	"gitee.com/xuyiping_admin/pkg/valid"
-	"kpt-pasture/http/middleware"
-	"net/http"
-	"strconv"
 
 	"github.com/gin-gonic/gin"
 )
 
-// AddSystemMenu 添加系统菜单权限
-func AddSystemMenu(c *gin.Context) {
-	var req operationPb.AddMenuRequest
+// CreatedOrUpdateSystemMenu 添加或者更新系统菜单权限
+func CreatedOrUpdateSystemMenu(c *gin.Context) {
+	var req pasturePb.SearchMenuRequest
 	if err := ginutil.BindProto(c, &req); err != nil {
 		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
 		return
@@ -24,88 +26,17 @@ func AddSystemMenu(c *gin.Context) {
 		valid.Field(&req.Name, valid.Required),
 		valid.Field(&req.Title, valid.Required),
 		valid.Field(&req.MenuType, valid.Required, valid.Min(0), valid.Max(2)),
-		valid.Field(&req.Level, valid.Required, valid.Min(1), valid.Max(3)),
-		valid.Field(&req.Path, valid.Required),
-	); err != nil {
-		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
-		return
-	}
-
-	if req.MenuType == 1 {
-		if err := valid.Validate(&req.Component, valid.Required); err != nil {
-			apierr.AbortBadRequest(c, http.StatusBadRequest, err)
-			return
-		}
-	}
-
-	if err := middleware.BackendOperation(c).OpsService.CreateSystemMenu(c, &req); err != nil {
-		apierr.ClassifiedAbort(c, err)
-		return
-	}
-
-	ginutil.JSONResp(c, &operationPb.CommonOK{
-		Code: http.StatusOK,
-		Msg:  "ok",
-		Data: &operationPb.Success{Success: true},
-	})
-}
-
-// EditSystemMenu 编辑系统菜单权限
-func EditSystemMenu(c *gin.Context) {
-	var req operationPb.AddMenuRequest
-	if err := ginutil.BindProto(c, &req); err != nil {
-		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
-		return
-	}
-
-	if err := valid.ValidateStruct(&req,
-		valid.Field(&req.Id, valid.Required, valid.Min(1)),
-		valid.Field(&req.Name, valid.Required),
-		valid.Field(&req.MenuType, valid.Required, valid.Min(0), valid.Max(2)),
 		valid.Field(&req.Path, valid.Required),
 	); err != nil {
 		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
 		return
 	}
 
-	if req.MenuType == 1 {
-		if err := valid.Validate(&req.Component, valid.Required); err != nil {
-			apierr.AbortBadRequest(c, http.StatusBadRequest, err)
-			return
-		}
-	}
-
-	if err := middleware.BackendOperation(c).OpsService.EditSystemMenu(c, &req); err != nil {
+	if err := middleware.BackendOperation(c).OpsService.CreateOrUpdateSystemMenu(c, &req); err != nil {
 		apierr.ClassifiedAbort(c, err)
 		return
 	}
-	ginutil.JSONResp(c, &operationPb.CommonOK{
-		Code: http.StatusOK,
-		Msg:  "ok",
-		Data: &operationPb.Success{Success: true},
-	})
-}
-
-// IsShowSystemMenu 是否启动
-func IsShowSystemMenu(c *gin.Context) {
-	var req operationPb.IsShowSystemMenuRequest
-	if err := ginutil.BindProto(c, &req); err != nil {
-		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
-		return
-	}
-
-	if err := valid.ValidateStruct(&req,
-		valid.Field(&req.MenuId, valid.Required, valid.Min(1)),
-		valid.Field(&req.IsShow, valid.Required, valid.Min(1), valid.Max(2)),
-	); err != nil {
-		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
-		return
-	}
 
-	if err := middleware.Dependency(c).StoreEventHub.OpsService.IsShowSystemMenu(c, &req); err != nil {
-		apierr.ClassifiedAbort(c, err)
-		return
-	}
 	ginutil.JSONResp(c, &operationPb.CommonOK{
 		Code: http.StatusOK,
 		Msg:  "ok",
@@ -115,13 +46,13 @@ func IsShowSystemMenu(c *gin.Context) {
 
 // SearchSystemMenuList 菜单列表查询
 func SearchSystemMenuList(c *gin.Context) {
-	var req operationPb.SearchMenuRequest
+	var req pasturePb.SearchMenuRequest
 	if err := ginutil.BindProto(c, &req); err != nil {
 		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
 		return
 	}
 
-	req.Pagination = &operationPb.PaginationModel{
+	req.Pagination = &pasturePb.PaginationModel{
 		Page:       int32(c.GetInt(middleware.Page)),
 		PageSize:   int32(c.GetInt(middleware.PageSize)),
 		PageOffset: int32(c.GetInt(middleware.PageOffset)),
@@ -137,7 +68,7 @@ func SearchSystemMenuList(c *gin.Context) {
 
 // DeleteSystemMenu 删除菜单
 func DeleteSystemMenu(c *gin.Context) {
-	menuIdStr := c.Param("menu_id")
+	menuIdStr := c.Param("id")
 	menuId, _ := strconv.Atoi(menuIdStr)
 
 	if err := valid.Validate(menuId, valid.Required, valid.Min(1)); err != nil {

+ 33 - 42
http/handler/system/role.go

@@ -1,49 +1,22 @@
 package system
 
 import (
+	"kpt-pasture/http/middleware"
+	"net/http"
+	"strconv"
+
+	pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
 	operationPb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/operation"
 	"gitee.com/xuyiping_admin/pkg/apierr"
 	"gitee.com/xuyiping_admin/pkg/ginutil"
 	"gitee.com/xuyiping_admin/pkg/valid"
-	"kpt-pasture/http/middleware"
-	"net/http"
-	"strconv"
 
 	"github.com/gin-gonic/gin"
 )
 
-// AddSystemRole 添加角色
-func AddSystemRole(c *gin.Context) {
-	var req operationPb.AddRoleRequest
-	if err := ginutil.BindProto(c, &req); err != nil {
-		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
-		return
-	}
-
-	if err := valid.ValidateStruct(&req,
-		valid.Field(&req.Name, valid.Required),
-		valid.Field(&req.PastureId, valid.Required),
-		valid.Field(&req.MenuId, valid.Required),
-		valid.Field(&req.CreateUser, valid.Required),
-	); err != nil {
-		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
-		return
-	}
-
-	if err := middleware.Dependency(c).StoreEventHub.OpsService.CreateSystemRole(c, &req); err != nil {
-		apierr.ClassifiedAbort(c, err)
-		return
-	}
-	ginutil.JSONResp(c, &operationPb.CommonOK{
-		Code: http.StatusOK,
-		Msg:  "ok",
-		Data: &operationPb.Success{Success: true},
-	})
-}
-
-// EditSystemRole 编辑角色
-func EditSystemRole(c *gin.Context) {
-	var req operationPb.AddRoleRequest
+// RoleCreateOrUpdate 添加或者更新角色
+func RoleCreateOrUpdate(c *gin.Context) {
+	var req pasturePb.SearchRoleRequest
 	if err := ginutil.BindProto(c, &req); err != nil {
 		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
 		return
@@ -51,15 +24,12 @@ func EditSystemRole(c *gin.Context) {
 
 	if err := valid.ValidateStruct(&req,
 		valid.Field(&req.Name, valid.Required),
-		valid.Field(&req.PastureId, valid.Required),
-		valid.Field(&req.MenuId, valid.Required),
-		valid.Field(&req.CreateUser, valid.Required),
 	); err != nil {
 		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
 		return
 	}
 
-	if err := middleware.Dependency(c).StoreEventHub.OpsService.EditSystemRole(c, &req); err != nil {
+	if err := middleware.Dependency(c).StoreEventHub.OpsService.SystemRoleCreateOrUpdate(c, &req); err != nil {
 		apierr.ClassifiedAbort(c, err)
 		return
 	}
@@ -91,7 +61,7 @@ func GetRolePermissions(c *gin.Context) {
 
 // DeleteSystemRole 删除角色
 func DeleteSystemRole(c *gin.Context) {
-	roleIdStr := c.Param("role_id")
+	roleIdStr := c.Param("id")
 	roleId, _ := strconv.Atoi(roleIdStr)
 
 	if err := valid.Validate(roleId, valid.Required, valid.Min(1)); err != nil {
@@ -111,15 +81,36 @@ func DeleteSystemRole(c *gin.Context) {
 	})
 }
 
+func IsShowSystemRole(c *gin.Context) {
+	roleIdStr := c.Param("id")
+	roleId, _ := strconv.Atoi(roleIdStr)
+
+	if err := valid.Validate(roleId, valid.Required, valid.Min(1)); err != nil {
+		apierr.ClassifiedAbort(c, err)
+		return
+	}
+
+	if err := middleware.BackendOperation(c).OpsService.IsShowSystemRole(c, int64(roleId)); err != nil {
+		apierr.ClassifiedAbort(c, err)
+		return
+	}
+
+	ginutil.JSONResp(c, &operationPb.CommonOK{
+		Code: http.StatusOK,
+		Msg:  "ok",
+		Data: &operationPb.Success{Success: true},
+	})
+}
+
 // SearchSystemRoleList 角色列表
 func SearchSystemRoleList(c *gin.Context) {
-	var req operationPb.SearchRoleRequest
+	var req pasturePb.SearchRoleRequest
 	if err := ginutil.BindProto(c, &req); err != nil {
 		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
 		return
 	}
 
-	req.Pagination = &operationPb.PaginationModel{
+	req.Pagination = &pasturePb.PaginationModel{
 		Page:       int32(c.GetInt(middleware.Page)),
 		PageSize:   int32(c.GetInt(middleware.PageSize)),
 		PageOffset: int32(c.GetInt(middleware.PageOffset)),

+ 7 - 9
http/route/system_api.go

@@ -30,22 +30,20 @@ func SystemAPI(opts ...func(engine *gin.Engine)) func(s *gin.Engine) {
 		systemRoute.POST("/user_info", system.GetUserInfo)
 		systemRoute.GET("/user/details/:user_id", system.DetailsSystemUser)
 		systemRoute.POST("/user/permissions", system.GetSystemUserPermissions)
-
 		systemRoute.POST("/user/logout", system.LogoutSystemUser)
 
 		// 系统角色
-		systemRoute.POST("/role/add", system.AddSystemRole)
-		systemRoute.GET("/role/permissions/:role_id", system.GetRolePermissions)
-		systemRoute.POST("/role/edit", system.EditSystemRole)
-		systemRoute.DELETE("/role/:role_id", system.DeleteSystemRole)
 		systemRoute.POST("/role/list", system.SearchSystemRoleList)
+		systemRoute.DELETE("/role/:id", system.DeleteSystemRole)
+		systemRoute.PUT("/role/is_show/:id", system.IsShowSystemRole)
+		systemRoute.POST("/role/createOrUpdate", system.RoleCreateOrUpdate)
+
+		systemRoute.GET("/role/permissions/:role_id", system.GetRolePermissions)
 
 		// 系统菜单权限
-		systemRoute.POST("/menu/add", system.AddSystemMenu)
-		systemRoute.POST("/menu/edit", system.EditSystemMenu)
-		systemRoute.POST("/menu/is_show", system.IsShowSystemMenu)
 		systemRoute.POST("/menu/list", system.SearchSystemMenuList)
-		systemRoute.DELETE("/menu/:menu_id", system.DeleteSystemMenu)
+		systemRoute.DELETE("/menu/:id", system.DeleteSystemMenu)
+		systemRoute.POST("/menu/createOrUpdate", system.CreatedOrUpdateSystemMenu)
 
 		// 系统部门
 		systemRoute.POST("/dept/list", system.DeptList)

+ 67 - 78
model/system_menu.go

@@ -1,32 +1,38 @@
 package model
 
 import (
-	operationPb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/operation"
 	"time"
-)
 
-const (
-	Level1 = iota + 1
-	Level2
-	Level3
+	pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
+
+	operationPb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/operation"
 )
 
 type SystemMenu struct {
-	Id        int64                   `json:"id,omitempty"`
-	Name      string                  `json:"name,omitempty"`
-	MenuType  int32                   `json:"menu_type,omitempty"`
-	Level     int32                   `json:"level,omitempty"`
-	Title     string                  `json:"title,omitempty"`
-	Path      string                  `json:"path,omitempty"`
-	IsShow    operationPb.IsShow_Kind `json:"is_show,omitempty"`
-	IsDelete  operationPb.IsShow_Kind `json:"is_delete,omitempty"`
-	Component string                  `json:"component,omitempty"`
-	Icon      string                  `json:"icon,omitempty"`
-	Sort      int32                   `json:"sort,omitempty"`
-	ParentId  int64                   `json:"parent_id"`
-	Redirect  string                  `json:"redirect,omitempty"`
-	CreatedAt int64                   `json:"created_at,omitempty"`
-	UpdatedAt int64                   `json:"updated_at,omitempty"`
+	Id              int64                   `json:"id"`
+	Name            string                  `json:"name"`
+	Title           string                  `json:"title"`
+	Path            string                  `json:"path"`
+	Icon            string                  `json:"icon"`
+	Component       string                  `json:"component"`
+	Redirect        string                  `json:"redirect"`
+	Auths           string                  `json:"auths"`
+	MenuType        pasturePb.MenuType_Kind `json:"menu_type"`
+	ParentId        int64                   `json:"parent_id"`
+	Rank            int32                   `json:"rank"`
+	ExtraIcon       string                  `json:"extra_icon"`
+	EnterTransition string                  `json:"enter_transition"`
+	ActivePath      string                  `json:"active_path"`
+	FrameSrc        string                  `json:"frame_src"`
+	FrameLoading    pasturePb.IsShow_Kind   `json:"frame_loading"`
+	Keepalive       pasturePb.IsShow_Kind   `json:"keepalive"`
+	HiddenTag       pasturePb.IsShow_Kind   `json:"hidden_tag"`
+	ShowLink        pasturePb.IsShow_Kind   `json:"show_link"`
+	ShowParent      pasturePb.IsShow_Kind   `json:"show_parent"`
+	IsShow          pasturePb.IsShow_Kind   `json:"is_show"`
+	IsDelete        pasturePb.IsShow_Kind   `json:"is_delete"`
+	CreatedAt       int64                   `json:"created_at"`
+	UpdatedAt       int64                   `json:"updated_at"`
 }
 
 func (s *SystemMenu) TableName() string {
@@ -36,29 +42,40 @@ func (s *SystemMenu) TableName() string {
 func NewSystemMenu(req *operationPb.AddMenuRequest) *SystemMenu {
 	return &SystemMenu{
 		Name:      req.Name,
-		MenuType:  req.MenuType,
-		Level:     req.Level,
 		Title:     req.Title,
 		Path:      req.Path,
 		Component: req.Component,
 		Icon:      req.Icon,
-		Sort:      req.Sort,
 		Redirect:  req.Redirect,
 		ParentId:  int64(req.ParentId),
-		IsShow:    operationPb.IsShow_OK,
-		IsDelete:  operationPb.IsShow_OK,
+		IsShow:    pasturePb.IsShow_Ok,
+		IsDelete:  pasturePb.IsShow_Ok,
 	}
 }
 
 type SystemMenuSlice []*SystemMenu
 
-func (s SystemMenuSlice) ToPB() []*operationPb.AddMenuRequest {
-	level := make(map[int32][]*operationPb.AddMenuRequest, 0)
-	for _, menu := range s {
-		if _, ok := level[menu.Level]; !ok {
-			level[menu.Level] = make([]*operationPb.AddMenuRequest, 0)
+func (s SystemMenuSlice) ToPB() []*pasturePb.SearchMenuRequest {
+	res := make([]*pasturePb.SearchMenuRequest, len(s))
+	for i, menu := range s {
+		var frameLoading, keepalive, hiddenTag, showLink, showParent bool
+		if menu.FrameLoading == pasturePb.IsShow_Ok {
+			frameLoading = true
+		}
+		if menu.Keepalive == pasturePb.IsShow_Ok {
+			keepalive = true
+		}
+		if menu.HiddenTag == pasturePb.IsShow_Ok {
+			hiddenTag = true
+		}
+		if menu.ShowLink == pasturePb.IsShow_Ok {
+			showLink = true
+		}
+		if menu.ShowParent == pasturePb.IsShow_Ok {
+			showParent = true
 		}
-		level[menu.Level] = append(level[menu.Level], &operationPb.AddMenuRequest{
+
+		res[i] = &pasturePb.SearchMenuRequest{
 			Id:              int32(menu.Id),
 			Name:            menu.Name,
 			ParentId:        int32(menu.ParentId),
@@ -68,57 +85,29 @@ func (s SystemMenuSlice) ToPB() []*operationPb.AddMenuRequest {
 			IsShow:          menu.IsShow,
 			Component:       menu.Component,
 			Icon:            menu.Icon,
-			Sort:            menu.Sort,
 			Redirect:        menu.Redirect,
-			CreatedAt:       int32(menu.CreatedAt),
+			Auths:           menu.Auths,
+			Rank:            menu.Rank,
+			ExtraIcon:       menu.ExtraIcon,
+			EnterTransition: menu.EnterTransition,
+			ActivePath:      menu.ActivePath,
+			FrameSrc:        menu.FrameSrc,
+			FrameLoading:    frameLoading,
+			Keepalive:       keepalive,
+			HiddenTag:       hiddenTag,
+			ShowLink:        showLink,
+			ShowParent:      showParent,
 			CreatedAtFormat: time.Unix(menu.CreatedAt, 0).Format(LayoutTime),
-			Level:           menu.Level,
-			Affix:           true,
-			KeepAlive:       true,
-			Children:        make([]*operationPb.AddMenuRequest, 0),
-		})
-	}
-
-	for _, leve3Data := range level[Level3] {
-		for _, leve2Data := range level[Level2] {
-			if leve3Data.ParentId == leve2Data.Id {
-				if leve2Data.Children == nil {
-					leve2Data.Children = make([]*operationPb.AddMenuRequest, 0)
-				}
-				leve2Data.Children = append(leve2Data.Children, leve3Data)
-			}
+			UpdatedAtFormat: time.Unix(menu.UpdatedAt, 0).Format(LayoutTime),
 		}
 	}
-
-	for _, leve2Data := range level[Level2] {
-		for _, leve1Data := range level[Level1] {
-			if leve2Data.ParentId == leve1Data.Id {
-				if leve1Data.Children == nil {
-					leve1Data.Children = make([]*operationPb.AddMenuRequest, 0)
-				}
-				leve1Data.Children = append(leve1Data.Children, leve2Data)
-			}
-		}
-	}
-
-	return level[Level1]
+	return res
 }
 
-func (s *SystemMenu) ToPb() *operationPb.AddMenuRequest {
-	return &operationPb.AddMenuRequest{
-		Id:              int32(s.Id),
-		Name:            s.Name,
-		MenuType:        s.MenuType,
-		Level:           s.Level,
-		Title:           s.Title,
-		Path:            s.Path,
-		Component:       s.Component,
-		Icon:            s.Icon,
-		Sort:            s.Sort,
-		Redirect:        s.Redirect,
-		ParentId:        int32(s.ParentId),
-		IsShow:          s.IsShow,
-		CreatedAt:       int32(s.CreatedAt),
-		CreatedAtFormat: time.Unix(s.CreatedAt, 0).Format(LayoutTime),
+func BooleanToIsShow(isShow bool) pasturePb.IsShow_Kind {
+	showKind := pasturePb.IsShow_No
+	if isShow {
+		showKind = pasturePb.IsShow_Ok
 	}
+	return showKind
 }

+ 18 - 37
model/system_role.go

@@ -1,18 +1,20 @@
 package model
 
 import (
-	operationPb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/operation"
 	"time"
+
+	pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
+	operationPb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/operation"
 )
 
 type SystemRole struct {
-	Id         int64                   `json:"id,omitempty"`
-	Name       string                  `json:"name,omitempty"`
-	Remarks    string                  `json:"remarks,omitempty"`
-	IsShow     operationPb.IsShow_Kind `json:"is_show,omitempty"`
-	CreateUser string                  `json:"create_user,omitempty"`
-	CreatedAt  int64                   `json:"created_at,omitempty"`
-	UpdatedAt  int64                   `json:"updated_at,omitempty"`
+	Id        int64                 `json:"id,omitempty"`
+	Name      string                `json:"name,omitempty"`
+	Remarks   string                `json:"remarks,omitempty"`
+	IsShow    pasturePb.IsShow_Kind `json:"is_show,omitempty"`
+	IsDelete  pasturePb.IsShow_Kind `json:"is_delete,omitempty"`
+	CreatedAt int64                 `json:"created_at,omitempty"`
+	UpdatedAt int64                 `json:"updated_at,omitempty"`
 }
 
 func (s *SystemRole) TableName() string {
@@ -26,47 +28,26 @@ const (
 
 func NewSystemRole(req *operationPb.AddRoleRequest) *SystemRole {
 	systemRole := &SystemRole{
-		Name:       req.Name,
-		Remarks:    req.Remarks,
-		IsShow:     operationPb.IsShow_OK,
-		CreateUser: req.CreateUser,
+		Name:    req.Name,
+		Remarks: req.Remarks,
+		IsShow:  pasturePb.IsShow_Ok,
 	}
 	return systemRole
 }
 
 type SystemRoleSlice []*SystemRole
 
-func (s SystemRoleSlice) ToPB(systemMenuList map[int64][]*SystemMenu) []*operationPb.AddRoleRequest {
-	res := make([]*operationPb.AddRoleRequest, len(s))
+func (s SystemRoleSlice) ToPB(systemMenuList map[int64][]*SystemMenu) []*pasturePb.SearchRoleRequest {
+	res := make([]*pasturePb.SearchRoleRequest, len(s))
 	for i, v := range s {
-		res[i] = &operationPb.AddRoleRequest{
-			Id:              uint32(v.Id),
+		res[i] = &pasturePb.SearchRoleRequest{
+			Id:              int32(v.Id),
 			Name:            v.Name,
 			Remarks:         v.Remarks,
-			CreateUser:      v.CreateUser,
 			IsShow:          v.IsShow,
-			CreatedAt:       uint32(v.CreatedAt),
 			CreatedAtFormat: time.Unix(v.CreatedAt, 0).Format(LayoutTime),
-		}
-
-		systemMenu, ok := systemMenuList[v.Id]
-		if ok {
-			for _, m := range systemMenu {
-				res[i].MenuList = append(res[i].MenuList, m.Name)
-				res[i].MenuId = append(res[i].MenuId, uint32(m.Id))
-			}
+			UpdatedAtFormat: time.Unix(v.UpdatedAt, 0).Format(LayoutTime),
 		}
 	}
 	return res
 }
-
-func (s *SystemRole) ToPb() *operationPb.AddRoleRequest {
-	return &operationPb.AddRoleRequest{
-		Id:              uint32(s.Id),
-		Name:            s.Name,
-		CreateUser:      s.CreateUser,
-		IsShow:          s.IsShow,
-		CreatedAt:       uint32(s.CreatedAt),
-		CreatedAtFormat: time.Unix(s.CreatedAt, 0).Format(LayoutTime),
-	}
-}

+ 0 - 2
model/system_user.go

@@ -8,8 +8,6 @@ import (
 	operationPb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/operation"
 )
 
-const InitManagerPassword = "kpt123456"
-
 type SystemUser struct {
 	Id        int64                  `json:"id"`
 	Name      string                 `json:"name"`

+ 8 - 9
module/backend/interface.go

@@ -60,19 +60,18 @@ type SystemService interface {
 	DetailsSystemUser(ctx context.Context, userId int64) (*operationPb.UserDetails, error)
 	GetSystemUserPermissions(ctx context.Context, token string) (*operationPb.SystemUserMenuPermissions, error)
 
-	// CreateSystemRole 系统角色相关
-	CreateSystemRole(ctx context.Context, req *operationPb.AddRoleRequest) error
-	EditSystemRole(ctx context.Context, req *operationPb.AddRoleRequest) error
+	// SearchSystemRoleList 系统角色相关
+	SearchSystemRoleList(ctx context.Context, req *pasturePb.SearchRoleRequest) (*pasturePb.SearchRoleResponse, error)
 	DeleteSystemRole(ctx context.Context, roleId int64) error
+	IsShowSystemRole(ctx context.Context, roleId int64) error
+	SystemRoleCreateOrUpdate(ctx context.Context, req *pasturePb.SearchRoleRequest) error
+
 	GetRolePermissions(ctx context.Context, roleId int64) (*operationPb.RolePermissionsList, error)
-	SearchSystemRoleList(ctx context.Context, req *operationPb.SearchRoleRequest) (*operationPb.SearchRoleResponse, error)
 
-	// CreateSystemMenu 系统菜单权限
-	CreateSystemMenu(ctx context.Context, req *operationPb.AddMenuRequest) error
-	EditSystemMenu(ctx context.Context, req *operationPb.AddMenuRequest) error
-	IsShowSystemMenu(ctx context.Context, req *operationPb.IsShowSystemMenuRequest) error
-	SearchSystemMenuList(ctx context.Context, req *operationPb.SearchMenuRequest) (*operationPb.SearchMenuResponse, error)
+	// SearchSystemMenuList 系统菜单权限
+	SearchSystemMenuList(ctx context.Context, req *pasturePb.SearchMenuRequest) (*pasturePb.SearchMenuResponse, error)
 	DeleteSystemMenu(ctx context.Context, menuId int64) error
+	CreateOrUpdateSystemMenu(ctx context.Context, req *pasturePb.SearchMenuRequest) error
 
 	// SearchSystemDeptList 部门列表
 	SearchSystemDeptList(ctx context.Context, req *pasturePb.SearchDeptRequest) (*pasturePb.SearchDeptResponse, error)

+ 85 - 163
module/backend/system_service.go

@@ -7,17 +7,12 @@ import (
 	"kpt-pasture/model"
 	"kpt-pasture/util"
 	"net/http"
-	"sort"
-	"strings"
 	"time"
 
 	pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
 	operationPb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/operation"
 	"gitee.com/xuyiping_admin/pkg/jwt"
-	"gitee.com/xuyiping_admin/pkg/logger/zaplog"
 	"gitee.com/xuyiping_admin/pkg/xerr"
-	"go.uber.org/zap"
-
 	"gorm.io/gorm"
 )
 
@@ -300,8 +295,7 @@ func (s *StoreEntry) SystemPermissionsFormatPb(menuList []*model.SystemMenu) *op
 		},
 	}
 
-	// TODO 后面优化成递归算法
-	level := make(map[int32][]*operationPb.AddMenuRequest, 0)
+	/*level := make(map[int32][]*operationPb.AddMenuRequest, 0)
 	for _, menu := range menuList {
 		if _, ok := level[menu.Level]; !ok {
 			level[menu.Level] = make([]*operationPb.AddMenuRequest, 0)
@@ -376,104 +370,90 @@ func (s *StoreEntry) SystemPermissionsFormatPb(menuList []*model.SystemMenu) *op
 		return level[model.Level1][i].Sort > level[model.Level1][j].Sort
 	})
 
-	systemUserMenuPermissions.Data.MenuList = level[model.Level1]
+	systemUserMenuPermissions.Data.MenuList = level[model.Level1]*/
 	return systemUserMenuPermissions
 }
 
-// CreateSystemRole 添加角色
-func (s *StoreEntry) CreateSystemRole(ctx context.Context, req *operationPb.AddRoleRequest) error {
-	if err := s.DB.Transaction(func(tx *gorm.DB) error {
-		// 创建角色数据
-		role := model.NewSystemRole(req)
-		if err := tx.Create(role).Error; err != nil {
-			return xerr.WithStack(err)
-		}
-		// 创建角色菜单权限数据
-		if len(req.MenuId) > 0 {
-			menuPermissions := model.NewSystemMenuPermissions(role.Id, req.MenuId)
-			if err := tx.Create(menuPermissions).Error; err != nil {
-				return xerr.WithStack(err)
-			}
-		}
+// SystemRoleCreateOrUpdate 添加角色
+func (s *StoreEntry) SystemRoleCreateOrUpdate(ctx context.Context, req *pasturePb.SearchRoleRequest) error {
+	isShow := pasturePb.IsShow_Ok
+	if req.Id > 0 {
+		isShow = req.IsShow
+	}
 
-		return nil
-	}); err != nil {
+	if err := s.DB.Model(&model.SystemRole{}).Where(map[string]interface{}{
+		"id": req.Id,
+	}).Assign(map[string]interface{}{
+		"name":      req.Name,
+		"remarks":   req.Remarks,
+		"is_delete": operationPb.IsShow_OK,
+		"is_show":   isShow,
+	}).FirstOrCreate(&model.SystemRole{}).Error; err != nil {
 		return xerr.WithStack(err)
 	}
 	return nil
 }
 
-// EditSystemRole 编辑角色
-func (s *StoreEntry) EditSystemRole(ctx context.Context, req *operationPb.AddRoleRequest) error {
-	role := &model.SystemRole{Id: int64(req.Id)}
-	if err := s.DB.First(role).Error; err != nil {
+// DeleteSystemRole 删除系统角色
+func (s *StoreEntry) DeleteSystemRole(ctx context.Context, roleId int64) error {
+	systemRole := &model.SystemRole{
+		Id: roleId,
+	}
+	if err := s.DB.First(systemRole).Error; err != nil {
 		if errors.Is(err, gorm.ErrRecordNotFound) {
 			return xerr.Custom("该数据不存在")
 		}
 		return xerr.WithStack(err)
 	}
 
-	if err := s.DB.Transaction(func(tx *gorm.DB) error {
-		updateSystemRole := model.NewSystemRole(req)
-		if err := tx.Omit("is_show").
-			Where("id = ?", role.Id).
-			Updates(updateSystemRole).Error; err != nil {
-			return xerr.WithStack(err)
-		}
-
-		// 更新菜单权限关系表
-		menuIds := req.MenuId
-		if err := tx.Model(new(model.SystemMenuPermissions)).
-			Where("role_id = ?", req.Id).Update("is_show", operationPb.IsShow_NO).Error; err != nil {
-			return xerr.WithStack(err)
-		}
-
-		newSystemMenuPermissions := model.NewSystemMenuPermissions(int64(req.Id), menuIds)
-		if err := tx.Create(newSystemMenuPermissions).Error; err != nil {
-			return xerr.WithStack(err)
-		}
-		return nil
-	}); err != nil {
+	if err := s.DB.Model(systemRole).Update("is_delete", pasturePb.IsShow_No).Error; err != nil {
 		return xerr.WithStack(err)
 	}
-
 	return nil
 }
 
-// DeleteSystemRole 删除系统角色
-func (s *StoreEntry) DeleteSystemRole(ctx context.Context, roleId int64) error {
+// IsShowSystemRole 角色是否启用
+func (s *StoreEntry) IsShowSystemRole(ctx context.Context, roleId int64) error {
 	systemRole := &model.SystemRole{
 		Id: roleId,
 	}
 	if err := s.DB.First(systemRole).Error; err != nil {
 		if errors.Is(err, gorm.ErrRecordNotFound) {
-			return xerr.Custom("该数据不存在")
+			return xerr.Custom("该角色不存在")
 		}
 		return xerr.WithStack(err)
 	}
+	isShow := pasturePb.IsShow_No
+	if systemRole.IsShow == pasturePb.IsShow_No {
+		isShow = pasturePb.IsShow_Ok
+	}
 
-	if err := s.DB.Model(systemRole).Update("is_show", operationPb.IsShow_NO).Error; err != nil {
+	if err := s.DB.Model(systemRole).Update("is_show", isShow).Error; err != nil {
 		return xerr.WithStack(err)
 	}
 	return nil
 }
 
 // SearchSystemRoleList 查询系统角色
-func (s *StoreEntry) SearchSystemRoleList(ctx context.Context, req *operationPb.SearchRoleRequest) (*operationPb.SearchRoleResponse, error) {
+func (s *StoreEntry) SearchSystemRoleList(ctx context.Context, req *pasturePb.SearchRoleRequest) (*pasturePb.SearchRoleResponse, error) {
 	systemRoleList := make([]*model.SystemRole, 0)
 	var count int64 = 0
 
-	pref := s.DB.Model(new(model.SystemRole)).Where("is_show = ?", operationPb.IsShow_OK)
+	pref := s.DB.Model(new(model.SystemRole)).Where("is_delete = ?", operationPb.IsShow_OK)
 	if req.Name != "" {
 		pref.Where("name like ?", fmt.Sprintf("%s%s%s", "%", req.Name, "%"))
 	}
 
+	if req.IsShow > 0 {
+		pref.Where("is_show = ?", req.IsShow)
+	}
+
 	if err := pref.Order("id desc").Count(&count).Limit(int(req.Pagination.PageSize)).
 		Offset(int(req.Pagination.PageOffset)).Find(&systemRoleList).Error; err != nil {
 		return nil, xerr.WithStack(err)
 	}
 
-	permissionsMenuMap := make(map[int64][]*model.SystemMenu, 0)
+	/*permissionsMenuMap := make(map[int64][]*model.SystemMenu, 0)
 	for _, role := range systemRoleList {
 		systemMenuList := make([]*model.SystemMenu, 0)
 		if err := s.DB.Table(new(model.SystemMenu).TableName()).Select(fmt.Sprintf("%s.*", new(model.SystemMenu).TableName())).
@@ -484,16 +464,16 @@ func (s *StoreEntry) SearchSystemRoleList(ctx context.Context, req *operationPb.
 			zaplog.Error("SearchSystemRoleList", zap.Any("SystemMenuPermissions", err))
 		}
 		permissionsMenuMap[role.Id] = systemMenuList
-	}
+	}*/
 
-	return &operationPb.SearchRoleResponse{
-		Code: http.StatusOK,
-		Msg:  "ok",
-		Data: &operationPb.SearchRoleData{
+	return &pasturePb.SearchRoleResponse{
+		Code:    http.StatusOK,
+		Message: "ok",
+		Data: &pasturePb.SearchRoleData{
 			Page:     req.Pagination.Page,
 			Total:    int32(count),
 			PageSize: req.Pagination.PageSize,
-			List:     model.SystemRoleSlice(systemRoleList).ToPB(permissionsMenuMap),
+			List:     model.SystemRoleSlice(systemRoleList).ToPB(nil),
 		},
 	}, nil
 }
@@ -531,122 +511,64 @@ func (s *StoreEntry) GetRolePermissions(ctx context.Context, roleId int64) (*ope
 	return s.AllPermissionsListToRolePermissions(systemAllPermissionsList), nil
 }
 
-// CreateSystemMenu 添加系统菜单权限
-func (s *StoreEntry) CreateSystemMenu(ctx context.Context, req *operationPb.AddMenuRequest) error {
-	systemMenu := model.NewSystemMenu(req)
-	if err := s.DB.Create(systemMenu).Error; err != nil {
-		return xerr.WithStack(err)
-	}
-	return nil
-}
-
-// EditSystemMenu 编辑系统菜单权限
-func (s *StoreEntry) EditSystemMenu(ctx context.Context, req *operationPb.AddMenuRequest) error {
-	systemMenu := &model.SystemMenu{Id: int64(req.Id)}
-	if err := s.DB.First(systemMenu).Error; err != nil {
-		if errors.Is(err, gorm.ErrRecordNotFound) {
-			return xerr.Custom("该数据不存在!")
-		}
-		return xerr.WithStack(err)
-	}
-
-	updateData := &model.SystemMenu{
-		Name:      req.Name,
-		MenuType:  req.MenuType,
-		Title:     req.Title,
-		Path:      req.Path,
-		Component: req.Component,
-		Icon:      req.Icon,
-		Sort:      req.Sort,
-		Redirect:  req.Redirect,
-		ParentId:  int64(req.ParentId),
-	}
-
-	if err := s.DB.Model(new(model.SystemMenu)).Omit("is_show").
-		Where("id = ?", systemMenu.Id).
-		Updates(updateData).Error; err != nil {
-		return xerr.WithStack(err)
-	}
-
-	return nil
-}
+// CreateOrUpdateSystemMenu 添加或者更新系统菜单权限
+func (s *StoreEntry) CreateOrUpdateSystemMenu(ctx context.Context, req *pasturePb.SearchMenuRequest) error {
+	if req.Id > 0 {
 
-// IsShowSystemMenu 菜单是否启用
-func (s *StoreEntry) IsShowSystemMenu(ctx context.Context, req *operationPb.IsShowSystemMenuRequest) error {
-	systemMenu := &model.SystemMenu{Id: int64(req.MenuId)}
-	if err := s.DB.First(systemMenu).Error; err != nil {
-		if errors.Is(err, gorm.ErrRecordNotFound) {
-			return xerr.Custom("该数据不存在")
-		}
-		return xerr.WithStack(err)
 	}
 
-	if err := s.DB.Model(systemMenu).Update("is_show", req.IsShow).Error; err != nil {
+	if err := s.DB.Model(&model.SystemMenu{}).Where(map[string]interface{}{
+		"id": req.Id,
+	}).Assign(map[string]interface{}{
+		"name":             req.Name,
+		"path":             req.Path,
+		"title":            req.Title,
+		"menu_type":        req.MenuType,
+		"parent_id":        req.ParentId,
+		"frame_src":        req.FrameSrc,
+		"frame_loading":    model.BooleanToIsShow(req.FrameLoading),
+		"keepalive":        model.BooleanToIsShow(req.Keepalive),
+		"hidden_tag":       model.BooleanToIsShow(req.HiddenTag),
+		"show_link":        model.BooleanToIsShow(req.ShowLink),
+		"show_parent":      model.BooleanToIsShow(req.ShowParent),
+		"icon":             req.Icon,
+		"component":        req.Component,
+		"redirect":         req.Redirect,
+		"auths":            req.Auths,
+		"rank":             req.Rank,
+		"extra_icon":       req.ExtraIcon,
+		"enter_transition": req.EnterTransition,
+		"leave_transition": req.LeaveTransition,
+		"active_path":      req.ActivePath,
+		"is_delete":        pasturePb.IsShow_Ok,
+		"is_show":          pasturePb.IsShow_Ok,
+	}).FirstOrCreate(&model.SystemMenu{}).Error; err != nil {
 		return xerr.WithStack(err)
 	}
 	return nil
 }
 
 // SearchSystemMenuList 菜单列表查询
-func (s *StoreEntry) SearchSystemMenuList(ctx context.Context, req *operationPb.SearchMenuRequest) (*operationPb.SearchMenuResponse, error) {
-	systemMenuLevel1 := make([]*model.SystemMenu, 0)
+func (s *StoreEntry) SearchSystemMenuList(ctx context.Context, req *pasturePb.SearchMenuRequest) (*pasturePb.SearchMenuResponse, error) {
+	systemMenuList := make([]*model.SystemMenu, 0)
 	var count int64 = 0
 
-	pref := s.DB.Model(new(model.SystemMenu)).Where("is_delete = ? and level = ?", operationPb.IsShow_OK, model.Level1)
-	if req.Name != "" {
-		pref.Where("name like ?", fmt.Sprintf("%s%s%s", "%", req.Name, "%"))
-	}
-
-	if err := pref.Order("sort desc").Count(&count).Limit(int(req.Pagination.PageSize)).Offset(int(req.Pagination.PageOffset)).
-		Find(&systemMenuLevel1).Debug().Error; err != nil {
+	if err := s.DB.Model(new(model.SystemMenu)).Where("is_delete = ? ", operationPb.IsShow_OK).Order("parent_id").Count(&count).Find(&systemMenuList).Error; err != nil {
 		return nil, xerr.WithStack(err)
 	}
 
-	systemMenuLevel1 = append(systemMenuLevel1, s.searchMenuLevel23ByLevel1(ctx, systemMenuLevel1)...)
-	return &operationPb.SearchMenuResponse{
-		Code: http.StatusOK,
-		Msg:  "ok",
-		Data: &operationPb.SearchMenuData{
-			Page:  req.Pagination.Page,
-			Total: int32(count),
-			List:  model.SystemMenuSlice(systemMenuLevel1).ToPB(),
+	return &pasturePb.SearchMenuResponse{
+		Code:    http.StatusOK,
+		Message: "ok",
+		Data: &pasturePb.SearchMenuData{
+			Page:     req.Pagination.Page,
+			Total:    int32(count),
+			PageSize: req.Pagination.PageSize,
+			List:     model.SystemMenuSlice(systemMenuList).ToPB(),
 		},
 	}, nil
 }
 
-// searchMenuLevel23ByLevel1 根据一级菜单返回对应二三级菜单
-func (s *StoreEntry) searchMenuLevel23ByLevel1(ctx context.Context, res []*model.SystemMenu) []*model.SystemMenu {
-	systemMenuLevel23 := make([]*model.SystemMenu, 0)
-	if len(res) <= 0 {
-		return systemMenuLevel23
-	}
-
-	ids1 := make([]int64, 0)
-	for _, v := range res {
-		ids1 = append(ids1, v.Id)
-	}
-	if err := s.DB.Model(new(model.SystemMenu)).Where("is_delete = ? and level = ?", operationPb.IsShow_OK, model.Level2).
-		Where("parent_id IN ?", ids1).Order("sort desc").
-		Find(&systemMenuLevel23).Error; err != nil {
-		return systemMenuLevel23
-	}
-	ids2 := make([]int64, 0)
-	for _, v := range systemMenuLevel23 {
-		ids2 = append(ids2, v.Id)
-	}
-	systemMenuLevel3 := make([]*model.SystemMenu, 0)
-	if err := s.DB.Model(new(model.SystemMenu)).Where("is_delete = ? and level = ?", operationPb.IsShow_OK, model.Level3).
-		Where("parent_id IN ?", ids2).Order("sort desc").
-		Find(&systemMenuLevel3).Error; err != nil {
-		return systemMenuLevel23
-	}
-	if len(systemMenuLevel3) > 0 {
-		systemMenuLevel23 = append(systemMenuLevel23, systemMenuLevel3...)
-	}
-
-	return systemMenuLevel23
-}
-
 // DeleteSystemMenu 删除系统菜单
 func (s *StoreEntry) DeleteSystemMenu(ctx context.Context, menuId int64) error {
 	systemMenu := &model.SystemMenu{Id: menuId}
@@ -657,7 +579,7 @@ func (s *StoreEntry) DeleteSystemMenu(ctx context.Context, menuId int64) error {
 		return xerr.WithStack(err)
 	}
 
-	if err := s.DB.Model(systemMenu).Update("is_delete", operationPb.IsShow_NO).Error; err != nil {
+	if err := s.DB.Model(systemMenu).Update("is_delete", pasturePb.IsShow_No).Error; err != nil {
 		return xerr.WithStack(err)
 	}
 	return nil