Browse Source

user_menu: 系统菜单权限

Yi 11 months ago
parent
commit
36aef552a9

+ 1 - 1
go.mod

@@ -3,7 +3,7 @@ module kpt-pasture
 go 1.17
 
 require (
-	gitee.com/xuyiping_admin/go_proto v0.0.0-20240407084244-eed4fd8a4a34
+	gitee.com/xuyiping_admin/go_proto v0.0.0-20240409092953-5fb8d55c7e27
 	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

+ 4 - 0
go.sum

@@ -92,6 +92,10 @@ gitee.com/xuyiping_admin/go_proto v0.0.0-20240407075741-0bae8f479fb6 h1:REB46lI1
 gitee.com/xuyiping_admin/go_proto v0.0.0-20240407075741-0bae8f479fb6/go.mod h1:x47UOU+lOkZnrtAENAsOGd7mZ5I8D2JRkMKMqLLRlVw=
 gitee.com/xuyiping_admin/go_proto v0.0.0-20240407084244-eed4fd8a4a34 h1:86om/+9gKt1rJKSc1ZyttwMVTsUxAlJgY2Cm5tunsv8=
 gitee.com/xuyiping_admin/go_proto v0.0.0-20240407084244-eed4fd8a4a34/go.mod h1:x47UOU+lOkZnrtAENAsOGd7mZ5I8D2JRkMKMqLLRlVw=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20240409091955-ba718340ac5d h1:YaptUIwd8wGoSJcscr5BNgTCmOgcZGk27ATrBNezCes=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20240409091955-ba718340ac5d/go.mod h1:x47UOU+lOkZnrtAENAsOGd7mZ5I8D2JRkMKMqLLRlVw=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20240409092953-5fb8d55c7e27 h1:3zx37XXutz3KR2xDX5wcfe62k5PZ6lnKylyKDYpUxBc=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20240409092953-5fb8d55c7e27/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=

+ 0 - 60
http/handler/system/user.go

@@ -210,63 +210,3 @@ func UserRoleSave(c *gin.Context) {
 		Data: &operationPb.Success{Success: true},
 	})
 }
-
-// DetailsSystemUser 系统用户详情
-func DetailsSystemUser(c *gin.Context) {
-	userIdStr := c.Param("user_id")
-	userId, _ := strconv.Atoi(userIdStr)
-
-	if err := valid.Validate(userId, valid.Required, valid.Min(1)); err != nil {
-		apierr.ClassifiedAbort(c, err)
-		return
-	}
-
-	res, err := middleware.BackendOperation(c).OpsService.DetailsSystemUser(c, int64(userId))
-	if err != nil {
-		apierr.ClassifiedAbort(c, err)
-		return
-	}
-
-	ginutil.JSONResp(c, res)
-}
-
-// GetUserInfo 获取用户信息
-func GetUserInfo(c *gin.Context) {
-	token := middleware.GetToken(c)
-	if err := valid.Validate(token, valid.Required); err != nil {
-		apierr.ClassifiedAbort(c, err)
-		return
-	}
-
-	res, err := middleware.BackendOperation(c).OpsService.GetUserInfo(c, token)
-	if err != nil {
-		apierr.ClassifiedAbort(c, err)
-		return
-	}
-	ginutil.JSONResp(c, res)
-}
-
-// GetSystemUserPermissions 获取系统用户菜单权限
-func GetSystemUserPermissions(c *gin.Context) {
-	token := middleware.GetToken(c)
-	if err := valid.Validate(token, valid.Required); err != nil {
-		apierr.ClassifiedAbort(c, err)
-		return
-	}
-
-	res, err := middleware.BackendOperation(c).OpsService.GetSystemUserPermissions(c, token)
-	if err != nil {
-		apierr.ClassifiedAbort(c, err)
-		return
-	}
-	ginutil.JSONResp(c, res)
-}
-
-// LogoutSystemUser 用户登出,
-func LogoutSystemUser(c *gin.Context) {
-	ginutil.JSONResp(c, &operationPb.CommonOK{
-		Code: http.StatusOK,
-		Msg:  "ok",
-		Data: &operationPb.Success{Success: true},
-	})
-}

+ 73 - 0
http/handler/user.go

@@ -0,0 +1,73 @@
+package handler
+
+import (
+	"kpt-pasture/http/middleware"
+	"net/http"
+	"strconv"
+
+	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"
+	"github.com/gin-gonic/gin"
+)
+
+// GetUserInfo 获取用户信息
+func GetUserInfo(c *gin.Context) {
+	token := middleware.GetToken(c)
+	if err := valid.Validate(token, valid.Required); err != nil {
+		apierr.ClassifiedAbort(c, err)
+		return
+	}
+
+	res, err := middleware.BackendOperation(c).OpsService.GetUserInfo(c, token)
+	if err != nil {
+		apierr.ClassifiedAbort(c, err)
+		return
+	}
+	ginutil.JSONResp(c, res)
+}
+
+// Details 系统用户详情
+func Details(c *gin.Context) {
+	userIdStr := c.Param("user_id")
+	userId, _ := strconv.Atoi(userIdStr)
+
+	if err := valid.Validate(userId, valid.Required, valid.Min(1)); err != nil {
+		apierr.ClassifiedAbort(c, err)
+		return
+	}
+
+	res, err := middleware.BackendOperation(c).OpsService.DetailsSystemUser(c, int64(userId))
+	if err != nil {
+		apierr.ClassifiedAbort(c, err)
+		return
+	}
+
+	ginutil.JSONResp(c, res)
+}
+
+// GetUserMenu 获取系统用户菜单权限
+func GetUserMenu(c *gin.Context) {
+	token := middleware.GetToken(c)
+	if err := valid.Validate(token, valid.Required); err != nil {
+		apierr.ClassifiedAbort(c, err)
+		return
+	}
+
+	res, err := middleware.BackendOperation(c).OpsService.GetSystemUserPermissions(c, token)
+	if err != nil {
+		apierr.ClassifiedAbort(c, err)
+		return
+	}
+	ginutil.JSONResp(c, res)
+}
+
+// Logout 用户登出,
+func Logout(c *gin.Context) {
+	ginutil.JSONResp(c, &operationPb.CommonOK{
+		Code: http.StatusOK,
+		Msg:  "ok",
+		Data: &operationPb.Success{Success: true},
+	})
+}

+ 7 - 5
http/route/system_api.go

@@ -29,11 +29,6 @@ func SystemAPI(opts ...func(engine *gin.Engine)) func(s *gin.Engine) {
 		systemRoute.GET("/user/role/:user_id", system.UserRole)
 		systemRoute.POST("/user/role/save", system.UserRoleSave)
 
-		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/list", system.SearchSystemRoleList)
 		systemRoute.DELETE("/role/:id", system.DeleteSystemRole)
@@ -53,6 +48,13 @@ func SystemAPI(opts ...func(engine *gin.Engine)) func(s *gin.Engine) {
 		systemRoute.POST("/dept/list", system.DeptList)
 		systemRoute.DELETE("/dept/:id", system.DepIsShow)
 		systemRoute.POST("/dept/createOrUpdate", system.DepCreateOrUpdate)
+
+		// 登录用户的相关接口
+		systemRoute.POST("/user/menu", handler.GetUserMenu)
+
+		systemRoute.POST("/user_info", handler.GetUserInfo)
+		systemRoute.GET("/user/details/:user_id", handler.Details)
+		systemRoute.POST("/user/logout", handler.Logout)
 	}
 }
 

+ 48 - 0
model/system_menu.go

@@ -1,6 +1,8 @@
 package model
 
 import (
+	"fmt"
+	"sort"
 	"time"
 
 	pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
@@ -103,6 +105,52 @@ func (s SystemMenuSlice) ToPB() []*pasturePb.SearchMenuRequest {
 	}
 	return res
 }
+func (s SystemMenuSlice) ToTree() []*pasturePb.MenuTree {
+	res := make([]*pasturePb.MenuTree, len(s))
+	if 0 == len(s) {
+		return res
+	}
+	// 排序
+	sort.Slice(s, func(i, j int) bool {
+		return s[i].ParentId > s[j].ParentId
+	})
+
+	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
+		}
+
+		if 0 == i {
+			res[menu.Id] = &pasturePb.MenuTree{
+				Id:   int32(menu.Id),
+				Path: menu.Path,
+				Meta: &pasturePb.MenuMeta{
+					Icon:  menu.Icon,
+					Title: menu.Title,
+					Rank:  menu.Rank,
+					Roles: make([]string, 0),
+				},
+				Children: make([]*pasturePb.MenuTree, 0),
+			}
+		} else {
+			fmt.Println(frameLoading, keepalive, hiddenTag, showLink, showParent)
+		}
+	}
+	return res
+}
 
 func BooleanToIsShow(isShow bool) pasturePb.IsShow_Kind {
 	showKind := pasturePb.IsShow_No

+ 3 - 1
module/backend/interface.go

@@ -57,10 +57,12 @@ type SystemService interface {
 	SystemUserRole(ctx context.Context, userId int64) (*pasturePb.SystemUserRoleResponse, error)
 	SystemUserRoleSave(ctx context.Context, req *pasturePb.SystemUserRoleRequest) error
 
+	// GetSystemUserMenu 当前登录用户菜单权限
+	GetSystemUserMenu(ctx context.Context) (*pasturePb.SystemUserMenuTreeResponse, error)
+
 	GetCurrentUserName(ctx context.Context) (string, error)
 	GetUserInfo(ctx context.Context, token string) (*operationPb.UserAuth, error)
 	DetailsSystemUser(ctx context.Context, userId int64) (*operationPb.UserDetails, error)
-	GetSystemUserPermissions(ctx context.Context, token string) (*operationPb.SystemUserMenuPermissions, error)
 
 	// SearchSystemRoleList 系统角色相关
 	SearchSystemRoleList(ctx context.Context, req *pasturePb.SearchRoleRequest) (*pasturePb.SearchRoleResponse, error)

+ 0 - 53
module/backend/system_permissions.go

@@ -1,53 +0,0 @@
-package backend
-
-import (
-	"context"
-	"kpt-pasture/model"
-
-	operationPb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/operation"
-	"gitee.com/xuyiping_admin/pkg/logger/zaplog"
-	"gitee.com/xuyiping_admin/pkg/xerr"
-	"go.uber.org/zap"
-)
-
-type SystemAllPermissionsList struct {
-	MenuList []*model.SystemRoleMenu
-}
-
-// SystemUserMenuPermissionsUnDuplicate 角色权限去重
-func (s *SystemAllPermissionsList) SystemUserMenuPermissionsUnDuplicate() {
-	newMenuList := make([]*model.SystemRoleMenu, 0)
-	seen := make(map[int64]bool)
-	for _, menu := range s.MenuList {
-		if _, ok := seen[menu.MenuId]; !ok {
-			newMenuList = append(newMenuList, menu)
-		}
-	}
-	s.MenuList = newMenuList
-}
-
-// GetSystemRoleMenuList 获取角色相关菜单
-func (s *StoreEntry) GetSystemRoleMenuList(ctx context.Context, roleId int64) []*model.SystemRoleMenu {
-	menuList := make([]*model.SystemRoleMenu, 0)
-	if err := s.DB.Where("role_id = ?", roleId).Find(&menuList).Error; err != nil {
-		zaplog.Error("GetSystemRoleMenuList", zap.Any("Err", err))
-	}
-	return menuList
-}
-
-// GetMenuList 获取******
-func (s *StoreEntry) GetMenuList(ctx context.Context, req []*model.SystemRoleMenu) ([]*model.SystemMenu, error) {
-	ids := make([]int64, 0)
-	for _, v := range req {
-		ids = append(ids, v.MenuId)
-	}
-
-	menuList := make([]*model.SystemMenu, 0)
-	if len(ids) > 0 {
-		if err := s.DB.Where("is_show = ?", operationPb.IsShow_OK).Find(&menuList, ids).Error; err != nil {
-			return nil, xerr.WithStack(err)
-		}
-	}
-
-	return menuList, nil
-}

+ 41 - 117
module/backend/system_service.go

@@ -10,6 +10,7 @@ import (
 	"time"
 
 	"gitee.com/xuyiping_admin/pkg/logger/zaplog"
+	"go.uber.org/zap"
 
 	pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
 	operationPb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/operation"
@@ -150,12 +151,21 @@ func (s *StoreEntry) IsShowSystemUser(ctx context.Context, userId int64) error {
 
 // SystemUserCreateOrUpdate 创建或者更新系统用户
 func (s *StoreEntry) SystemUserCreateOrUpdate(ctx context.Context, req *pasturePb.SearchUserRequest) error {
+	systemUser := &model.SystemUser{}
 	if req.Id > 0 {
-		systemUser := &model.SystemUser{}
+		systemUser.Id = int64(req.Id)
 		if err := s.DB.First(systemUser).Error; err != nil {
 			return xerr.WithStack(err)
 		}
 		req.Password = systemUser.Password
+	} else {
+		if err := s.DB.Where("name = ?", req.Name).First(systemUser).Error; err != nil {
+			if !errors.Is(err, gorm.ErrRecordNotFound) {
+				return xerr.WithStack(err)
+			}
+		} else if systemUser.Id > 0 {
+			return xerr.Custom("该用户名称已经存在")
+		}
 	}
 
 	if err := s.DB.Model(&model.SystemUser{}).Where(map[string]interface{}{
@@ -281,8 +291,8 @@ func (s *StoreEntry) DetailsSystemUser(ctx context.Context, userId int64) (*oper
 	}, nil
 }
 
-// GetSystemUserPermissions 返回系统用户相关菜单权限
-func (s *StoreEntry) GetSystemUserPermissions(ctx context.Context, token string) (*operationPb.SystemUserMenuPermissions, error) {
+// GetSystemUserMenu 返回系统用户相关菜单权限
+func (s *StoreEntry) GetSystemUserMenu(ctx context.Context) (*pasturePb.SystemUserMenuTreeResponse, error) {
 	// 解析token
 	userName, err := s.GetCurrentUserName(ctx)
 	if err != nil {
@@ -290,129 +300,40 @@ func (s *StoreEntry) GetSystemUserPermissions(ctx context.Context, token string)
 	}
 	// 根据用户token获取用户数据
 	systemUser := &model.SystemUser{Name: userName}
-	if err = s.DB.Where("name = ?", userName).First(systemUser).Error; err != nil {
+	if err = s.DB.Where("name = ?", userName).
+		Where("is_show = ? and is_delete = ?", pasturePb.IsShow_Ok, pasturePb.IsShow_Ok).
+		First(systemUser).Error; err != nil {
 		if errors.Is(err, gorm.ErrRecordNotFound) {
 			return nil, xerr.Custom("该用户数据不存在")
 		}
 		return nil, xerr.WithStack(err)
 	}
-	/*roleIds := systemUser.SystemUserRoleToSlice()*/
-	roleIds := []int64{1}
+	if systemUser.RoleId <= 0 {
+		return nil, xerr.Custom("该用户没有角色")
+	}
 	// 获取用户角色数据
-	systemRoles := make([]*model.SystemRole, 0)
-	if err = s.DB.Where("is_show = ?", operationPb.IsShow_OK).Find(&systemRoles, roleIds).Error; err != nil {
+	systemRole := &model.SystemRole{}
+	if err = s.DB.Where("id = ?", systemUser.RoleId).First(systemRole).Error; err != nil {
+		if errors.Is(err, gorm.ErrRecordNotFound) {
+			return nil, xerr.Custom("该用户角色不存在")
+		}
 		return nil, xerr.WithStack(err)
 	}
-
-	systemAllPermissionsList := &SystemAllPermissionsList{
-		MenuList: make([]*model.SystemRoleMenu, 0),
-	}
-
-	for _, role := range systemRoles {
-		zaplog.Info(role.Name)
-		/*item := s.GetSystemRoleMenuList(ctx, role.Id)
-		systemAllPermissionsList.MenuList = append(systemAllPermissionsList.MenuList, item.MenuList...)*/
-	}
-
-	systemAllPermissionsList.SystemUserMenuPermissionsUnDuplicate()
-
-	menuList, err := s.GetMenuList(ctx, systemAllPermissionsList.MenuList)
-	if err != nil {
+	// 获取用户菜单
+	systemMenu := &model.SystemMenu{}
+	if err = s.DB.Table(fmt.Sprintf("%s as a", new(model.SystemRoleMenu).TableName())).
+		Joins("LEFT JOIN system_menu AS b ON a.menu_id = b.id").
+		Where("a.role_id = ? and b.is_delete = ?", systemRole.Id, pasturePb.IsShow_Ok).
+		Find(&systemMenu).Error; err != nil {
 		return nil, xerr.WithStack(err)
 	}
 
-	return s.SystemPermissionsFormatPb(menuList), nil
-}
-
-func (s *StoreEntry) SystemPermissionsFormatPb(menuList []*model.SystemMenu) *operationPb.SystemUserMenuPermissions {
-	systemUserMenuPermissions := &operationPb.SystemUserMenuPermissions{
-		Code: http.StatusOK,
-		Msg:  "ok",
-		Data: &operationPb.SystemUserMenuData{
-			PastureList:     make([]*operationPb.AddPastureRequest, 0),
-			MenuList:        make([]*operationPb.AddMenuRequest, 0),
-			MobileList:      make([]*operationPb.AddMobileRequest, 0),
-			MenuButtonsPath: make([]*operationPb.MenuButtonsPath, 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)
-		}
-		level[menu.Level] = append(level[menu.Level], &operationPb.AddMenuRequest{
-			Id:              int32(menu.Id),
-			Name:            menu.Name,
-			ParentId:        int32(menu.ParentId),
-			MenuType:        menu.MenuType,
-			Title:           menu.Title,
-			Path:            menu.Path,
-			IsShow:          menu.IsShow,
-			Component:       menu.Component,
-			Icon:            menu.Icon,
-			Sort:            menu.Sort,
-			Redirect:        menu.Redirect,
-			CreatedAt:       int32(menu.CreatedAt),
-			CreatedAtFormat: time.Unix(menu.CreatedAt, 0).Format(model.LayoutTime),
-			Level:           menu.Level,
-			Affix:           true,
-			KeepAlive:       true,
-			Children:        make([]*operationPb.AddMenuRequest, 0),
-		})
-		if menu.Level == model.Level3 {
-			systemUserMenuPermissions.Data.MenuButtonsPath = append(systemUserMenuPermissions.Data.MenuButtonsPath, &operationPb.MenuButtonsPath{
-				Path:   menu.Path,
-				MenuId: int32(menu.Id),
-			})
-		}
-	}
-
-	level2IsShow := make([]int32, 0)
-	for _, leve2Data := range level[model.Level2] {
-		for _, leve3Data := range level[model.Level3] {
-			if leve3Data.ParentId == leve2Data.Id && strings.Contains(leve3Data.Path, ":page") {
-				level2IsShow = append(level2IsShow, leve2Data.Id)
-			}
-
-			if leve3Data.ParentId == leve2Data.Id {
-				if leve2Data.Children == nil {
-					leve2Data.Children = make([]*operationPb.AddMenuRequest, 0)
-				}
-				leve2Data.Children = append(leve2Data.Children, leve3Data)
-			}
-		}
-	}
-
-	sort.SliceStable(level[model.Level2], func(i, j int) bool {
-		return level[model.Level2][i].Sort > level[model.Level2][j].Sort
-	})
-	for _, leve2Data := range level[model.Level2] {
-		var info bool
-		for _, v := range level2IsShow {
-			if v == leve2Data.Id {
-				info = true
-			}
-		}
-		if !info {
-			continue
-		}
-		for _, leve1Data := range level[model.Level1] {
-			if leve2Data.ParentId == leve1Data.Id {
-				if leve1Data.Children == nil {
-					leve1Data.Children = make([]*operationPb.AddMenuRequest, 0)
-				}
-				leve1Data.Children = append(leve1Data.Children, leve2Data)
-			}
-		}
-	}
-
-	sort.SliceStable(level[model.Level1], func(i, j int) bool {
-		return level[model.Level1][i].Sort > level[model.Level1][j].Sort
-	})
-
-	systemUserMenuPermissions.Data.MenuList = level[model.Level1]*/
-	return systemUserMenuPermissions
+	// 获取菜单权限
+	return &pasturePb.SystemUserMenuTreeResponse{
+		Code:    http.StatusOK,
+		Message: "ok",
+		Data:    nil,
+	}, nil
 }
 
 // SystemRoleCreateOrUpdate 添加角色
@@ -534,11 +455,14 @@ func (s *StoreEntry) GetRoleMenuList(ctx context.Context, roleId int64) (*pastur
 		return nil, xerr.Custom("该数据已被删除")
 	}
 
-	item := s.GetSystemRoleMenuList(ctx, systemRole.Id)
+	menuList := make([]*model.SystemRoleMenu, 0)
+	if err := s.DB.Where("role_id = ?", systemRole.Id).Find(&menuList).Error; err != nil {
+		zaplog.Error("GetSystemRoleMenuList", zap.Any("Err", err))
+	}
 	return &pasturePb.SystemRoleMenuResponse{
 		Code:    http.StatusOK,
 		Message: "ok",
-		Data:    model.SystemRoleMenuSlice(item).ToPB(),
+		Data:    model.SystemRoleMenuSlice(menuList).ToPB(),
 	}, nil
 
 }