diff --git a/api/v1/system/user.go b/api/v1/system/user.go index 8b9f59c..7d48c6a 100644 --- a/api/v1/system/user.go +++ b/api/v1/system/user.go @@ -13,8 +13,9 @@ type UserLoginReq struct { VerifyKey string `p:"verifyKey"` } type UserLoginRes struct { - g.Meta `mime:"application/json" example:""` - UserInfo *model.LoginUserRes `json:"userInfo"` - Token string `json:"token"` - MenuList []*model.UserMenus `json:"menuList"` + g.Meta `mime:"application/json" example:""` + UserInfo *model.LoginUserRes `json:"userInfo"` + Token string `json:"token"` + MenuList []*model.UserMenus `json:"menuList"` + Permissions []string `json:"permissions"` } diff --git a/internal/app/system/controller/user.go b/internal/app/system/controller/user.go index 46d555d..62ffbfa 100644 --- a/internal/app/system/controller/user.go +++ b/internal/app/system/controller/user.go @@ -24,8 +24,10 @@ type UserController struct { func (c *UserController) Login(ctx context.Context, req *system.UserLoginReq) (res *system.UserLoginRes, err error) { var ( - user *model.LoginUserRes - token string + user *model.LoginUserRes + token string + permissions []string + menuList []*model.UserMenus ) //判断验证码是否正确 debug := genv.GetWithCmd("gf.debug") @@ -72,14 +74,15 @@ func (c *UserController) Login(ctx context.Context, req *system.UserLoginReq) (r return } //获取用户菜单数据 - menuList, err := service.User().GetAdminRules(ctx, user.Id) + menuList, permissions, err = service.User().GetAdminRules(ctx, user.Id) if err != nil { return } res = &system.UserLoginRes{ - UserInfo: user, - Token: token, - MenuList: menuList, + UserInfo: user, + Token: token, + MenuList: menuList, + Permissions: permissions, } return } diff --git a/internal/app/system/service/sys_auth_rule.go b/internal/app/system/service/sys_auth_rule.go index 138a729..0c89b86 100644 --- a/internal/app/system/service/sys_auth_rule.go +++ b/internal/app/system/service/sys_auth_rule.go @@ -21,6 +21,7 @@ import ( type IRule interface { GetIsMenuStatusList(ctx context.Context) ([]*model.SysAuthRuleInfoRes, error) GetMenuList(ctx context.Context) (list []*model.SysAuthRuleInfoRes, err error) + GetIsButtonStatusList(ctx context.Context) ([]*model.SysAuthRuleInfoRes, error) } type ruleImpl struct { @@ -70,3 +71,18 @@ func (s *ruleImpl) getMenuListFromDb(ctx context.Context) (value interface{}, er }) return } + +// GetIsButtonStatusList 获取所有按钮isMenu=2 且status=1的菜单列表 +func (s *ruleImpl) GetIsButtonStatusList(ctx context.Context) ([]*model.SysAuthRuleInfoRes, error) { + list, err := s.GetMenuList(ctx) + if err != nil { + return nil, err + } + var gList = make([]*model.SysAuthRuleInfoRes, 0, len(list)) + for _, v := range list { + if v.MenuType == 2 && v.Status == 1 { + gList = append(gList, v) + } + } + return gList, nil +} diff --git a/internal/app/system/service/sys_user.go b/internal/app/system/service/sys_user.go index cbc798a..0686ba0 100644 --- a/internal/app/system/service/sys_user.go +++ b/internal/app/system/service/sys_user.go @@ -32,7 +32,7 @@ type IUser interface { LoginLog(ctx context.Context, params *model.LoginLogParams) UpdateLoginInfo(ctx context.Context, id uint64, ip string) (err error) NotCheckAuthAdminIds(ctx context.Context) *gset.Set - GetAdminRules(ctx context.Context, userId uint64) (menuList []*model.UserMenus, err error) + GetAdminRules(ctx context.Context, userId uint64) (menuList []*model.UserMenus, permissions []string, err error) } type userImpl struct{} @@ -114,7 +114,7 @@ func (s *userImpl) UpdateLoginInfo(ctx context.Context, id uint64, ip string) (e } // GetAdminRules 获取用户菜单数据 -func (s *userImpl) GetAdminRules(ctx context.Context, userId uint64) (menuList []*model.UserMenus, err error) { +func (s *userImpl) GetAdminRules(ctx context.Context, userId uint64) (menuList []*model.UserMenus, permissions []string, err error) { err = g.Try(func() { //是否超管 isSuperAdmin := false @@ -140,9 +140,14 @@ func (s *userImpl) GetAdminRules(ctx context.Context, userId uint64) (menuList [ //获取菜单信息 if isSuperAdmin { //超管获取所有菜单 + permissions = []string{"*/*/*"} menuList, err = s.GetAllMenus(ctx) + liberr.ErrIsNil(ctx, err) } else { menuList, err = s.GetAdminMenusByRoleIds(ctx, roleIds) + liberr.ErrIsNil(ctx, err) + permissions, err = s.GetPermissions(ctx, roleIds) + liberr.ErrIsNil(ctx, err) } }) return @@ -279,3 +284,30 @@ func (s *userImpl) setMenuData(menu *model.UserMenu, entity *model.SysAuthRuleIn } return menu } + +func (s *userImpl) GetPermissions(ctx context.Context, roleIds []uint) (userButtons []string, err error) { + err = g.Try(func() { + //获取角色对应的菜单id + enforcer, err := service.CasbinEnforcer(ctx) + liberr.ErrIsNil(ctx, err) + menuIds := map[int64]int64{} + for _, roleId := range roleIds { + //查询当前权限 + gp := enforcer.GetFilteredPolicy(0, gconv.String(roleId)) + for _, p := range gp { + mid := gconv.Int64(p[1]) + menuIds[mid] = mid + } + } + //获取所有开启的按钮 + allButtons, err := Rule().GetIsButtonStatusList(ctx) + liberr.ErrIsNil(ctx, err) + userButtons = make([]string, 0, len(allButtons)) + for _, button := range allButtons { + if _, ok := menuIds[gconv.Int64(button.Id)]; gstr.Equal(button.Condition, "nocheck") || ok { + userButtons = append(userButtons, button.Name) + } + } + }) + return +}