From f7f04c28eb97bf112c08182188ce84919c7ee654 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=85=AD=E5=A6=82?= <8775@163.com> Date: Thu, 19 Dec 2024 18:05:59 +0800 Subject: [PATCH] 5.0 --- .../common/context/UserContext.java | 9 ++ .../common/enums/MenuTypeEnum.java | 21 +++ .../adminbackend/common/util/DateUtil.java | 22 +++ .../adminbackend/dao/entity/SysResource.java | 2 +- .../service/sys/SysResourceService.java | 1 - .../service/sys/SysRoleResourceService.java | 7 + .../service/sys/SysUserRoleService.java | 19 +++ .../service/sys/UserPermissionService.java | 99 ++++++++++++ .../service/sys/dto/MenuTreeDTO.java | 131 ++++++++++++++++ .../service/sys/dto/SysRoleDTO.java | 29 ++++ .../service/sys/dto/UserPermissionDTO.java | 31 ++++ .../service/sys/dto/UserRoleInfoDTO.java | 20 +++ .../service/sys/login/LoginService.java | 24 ++- .../service/sys/login/dto/LoginUser.java | 6 +- .../controller/sys/SysResourceController.java | 14 +- .../sys/UserPermissionController.java | 35 +++++ .../sys/param/SysResourceAddParam.java | 17 +- .../controller/sys/vo/LoginResultVO.java | 5 +- .../sop-admin-frontend/mock/asyncRoutes.ts | 146 +----------------- .../sop-admin-frontend/src/api/routes.ts | 10 +- .../sop-admin-frontend/src/utils/perm.ts | 23 +++ .../src/views/doc/list/index.ts | 16 +- .../src/views/doc/list/index.vue | 7 +- .../src/views/serve/api/index.ts | 11 +- 24 files changed, 517 insertions(+), 188 deletions(-) create mode 100644 sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/enums/MenuTypeEnum.java create mode 100644 sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/util/DateUtil.java create mode 100644 sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/UserPermissionService.java create mode 100644 sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/dto/MenuTreeDTO.java create mode 100644 sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/dto/SysRoleDTO.java create mode 100644 sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/dto/UserPermissionDTO.java create mode 100644 sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/dto/UserRoleInfoDTO.java create mode 100644 sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/UserPermissionController.java create mode 100644 sop-admin/sop-admin-frontend/src/utils/perm.ts diff --git a/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/context/UserContext.java b/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/context/UserContext.java index b578e0b6..4ba3c4c5 100644 --- a/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/context/UserContext.java +++ b/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/context/UserContext.java @@ -19,6 +19,7 @@ import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; import java.util.Locale; import java.util.Map; +import java.util.Optional; import java.util.function.Supplier; /** @@ -40,6 +41,14 @@ public class UserContext { UserContext.tokenGetter = tokenGetter; } + /** + * 获取当前登录用户id + * @return 返回id,没有返回-1 + */ + public static Long getUserId() { + return Optional.ofNullable(getUser()).map(User::getUserId).orElse(-1L); + } + /** * 获取当前登录用户 * diff --git a/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/enums/MenuTypeEnum.java b/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/enums/MenuTypeEnum.java new file mode 100644 index 00000000..de35d987 --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/enums/MenuTypeEnum.java @@ -0,0 +1,21 @@ +package com.gitee.sop.adminbackend.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 菜单类型 + * @author 六如 + */ +@Getter +@AllArgsConstructor +public enum MenuTypeEnum implements IntEnum { + MENU(0, "菜单"), + IFRAME(1, "iframe"), + LINK(2, "外链"), + BUTTON(3, "按钮"); + + private final Integer value; + + private final String description; +} diff --git a/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/util/DateUtil.java b/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/util/DateUtil.java new file mode 100644 index 00000000..f8e4927f --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/util/DateUtil.java @@ -0,0 +1,22 @@ +package com.gitee.sop.adminbackend.common.util; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +/** + * @author 六如 + */ +public class DateUtil { + + static DateTimeFormatter FORMATTER_FRONT = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"); + static DateTimeFormatter FORMATTER_YMDHMS = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + + public static String formatFrontDate(LocalDateTime localDateTime) { + return FORMATTER_FRONT.format(localDateTime); + } + + public static String formatYmdhms(LocalDateTime localDateTime) { + return FORMATTER_YMDHMS.format(localDateTime); + } + +} diff --git a/sop-admin/sop-admin-backend/backend-dao/src/main/java/com/gitee/sop/adminbackend/dao/entity/SysResource.java b/sop-admin/sop-admin-backend/backend-dao/src/main/java/com/gitee/sop/adminbackend/dao/entity/SysResource.java index f34fb4fa..c64a3e26 100644 --- a/sop-admin/sop-admin-backend/backend-dao/src/main/java/com/gitee/sop/adminbackend/dao/entity/SysResource.java +++ b/sop-admin/sop-admin-backend/backend-dao/src/main/java/com/gitee/sop/adminbackend/dao/entity/SysResource.java @@ -60,7 +60,7 @@ public class SysResource { private String redirect; /** - * 路由重定向 + * 菜单图标 */ private String icon; diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysResourceService.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysResourceService.java index 7065a0a1..7ded99e6 100644 --- a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysResourceService.java +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysResourceService.java @@ -12,5 +12,4 @@ import org.springframework.stereotype.Service; @Service public class SysResourceService implements LambdaService { - } diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysRoleResourceService.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysRoleResourceService.java index fc373dee..049cb6c4 100644 --- a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysRoleResourceService.java +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysRoleResourceService.java @@ -7,6 +7,7 @@ import com.gitee.sop.adminbackend.service.sys.dto.SysRoleResourceDTO; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.Collection; import java.util.List; import java.util.stream.Collectors; @@ -50,4 +51,10 @@ public class SysRoleResourceService implements LambdaService listRoleResource(Collection roleIds) { + return this.query() + .in(SysRoleResource::getRoleId, roleIds) + .listUniqueValue(SysRoleResource::getResourceId); + } + } diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysUserRoleService.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysUserRoleService.java index dbdfa4a2..2e07f312 100644 --- a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysUserRoleService.java +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysUserRoleService.java @@ -2,11 +2,17 @@ package com.gitee.sop.adminbackend.service.sys; import com.gitee.fastmybatis.core.support.LambdaService; import com.gitee.sop.adminbackend.common.user.User; +import com.gitee.sop.adminbackend.common.util.CopyUtil; +import com.gitee.sop.adminbackend.dao.entity.SysRole; import com.gitee.sop.adminbackend.dao.entity.SysUserRole; +import com.gitee.sop.adminbackend.dao.mapper.SysRoleMapper; import com.gitee.sop.adminbackend.dao.mapper.SysUserRoleMapper; +import com.gitee.sop.adminbackend.service.sys.dto.SysRoleDTO; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; +import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List; import java.util.stream.Collectors; @@ -18,6 +24,9 @@ import java.util.stream.Collectors; @Service public class SysUserRoleService implements LambdaService { + @Autowired + private SysRoleMapper sysRoleMapper; + /** * 设置用户角色 * @@ -52,4 +61,14 @@ public class SysUserRoleService implements LambdaService listUserRoles(Long userId) { + List roleIds = this.listUserRoleIds(userId); + if (roleIds.isEmpty()) { + return new ArrayList<>(0); + } + return sysRoleMapper.query() + .in(SysRole::getId, roleIds) + .list(sysRole -> CopyUtil.copyBean(sysRole, SysRoleDTO::new)); + } + } diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/UserPermissionService.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/UserPermissionService.java new file mode 100644 index 00000000..2789373a --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/UserPermissionService.java @@ -0,0 +1,99 @@ +package com.gitee.sop.adminbackend.service.sys; + +import com.gitee.fastmybatis.core.util.TreeUtil; +import com.gitee.sop.adminbackend.common.enums.MenuTypeEnum; +import com.gitee.sop.adminbackend.common.util.CopyUtil; +import com.gitee.sop.adminbackend.dao.entity.SysResource; +import com.gitee.sop.adminbackend.dao.entity.SysRoleResource; +import com.gitee.sop.adminbackend.service.sys.dto.MenuTreeDTO; +import com.gitee.sop.adminbackend.service.sys.dto.MenuTreeDTO.Meta; +import com.gitee.sop.adminbackend.service.sys.dto.SysRoleDTO; +import com.gitee.sop.adminbackend.service.sys.dto.UserPermissionDTO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Collections; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + + +/** + * @author 六如 + */ +@Service +public class UserPermissionService { + + @Autowired + private SysResourceService sysResourceService; + @Autowired + private SysRoleResourceService sysRoleResourceService; + @Autowired + private SysUserRoleService sysUserRoleService; + + public UserPermissionDTO getUserPermission(Long userId) { + List sysRoleDTOS = sysUserRoleService.listUserRoles(userId); + if (sysRoleDTOS.isEmpty()) { + return UserPermissionDTO.empty(); + } + + Set roleIds = sysRoleDTOS.stream().map(SysRoleDTO::getId).collect(Collectors.toSet()); + List roleCodes = sysRoleDTOS.stream().map(SysRoleDTO::getCode).distinct().collect(Collectors.toList()); + + // 角色对应的资源 + List resourceIds = sysRoleResourceService.query() + .in(SysRoleResource::getRoleId, roleIds) + .listUniqueValue(SysRoleResource::getResourceId); + + // 获取按钮权限 + List permissions = sysResourceService.query() + .eq(SysResource::getMenuType, MenuTypeEnum.BUTTON.getValue()) + .in(SysResource::getId, resourceIds) + .listUniqueValue(SysResource::getAuths); + + UserPermissionDTO userPermissionDTO = new UserPermissionDTO(); + userPermissionDTO.setRoles(roleCodes); + userPermissionDTO.setPermissions(permissions); + return userPermissionDTO; + } + + + /** + * 获取用户菜单 + * + * @param userId 用户id + * @return 返回菜单树 + */ + public List listUserMenuTree(Long userId) { + List roleIds = sysUserRoleService.listUserRoleIds(userId); + if (roleIds.isEmpty()) { + return Collections.emptyList(); + } + List resourceIds = sysRoleResourceService.listRoleResource(roleIds); + if (resourceIds.isEmpty()) { + return Collections.emptyList(); + } + List list = sysResourceService.query() + .in(SysResource::getId, resourceIds) + .eq(SysResource::getMenuType, MenuTypeEnum.MENU) + .list(); + + return convert(list); + + + } + + private List convert(List list) { + List menuTreeDTOS = list.stream() + .map(sysResource -> { + MenuTreeDTO menuTreeDTO = CopyUtil.copyBean(sysResource, MenuTreeDTO::new); + Meta meta = CopyUtil.copyBean(sysResource, Meta::new); + menuTreeDTO.setMeta(meta); + return menuTreeDTO; + }) + .collect(Collectors.toList()); + + return TreeUtil.convertTree(menuTreeDTOS, 0L); + } + +} diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/dto/MenuTreeDTO.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/dto/MenuTreeDTO.java new file mode 100644 index 00000000..a41f4b48 --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/dto/MenuTreeDTO.java @@ -0,0 +1,131 @@ +package com.gitee.sop.adminbackend.service.sys.dto; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.gitee.fastmybatis.core.support.TreeNode; +import com.gitee.sop.adminbackend.common.jackson.convert.annotation.Bool; +import com.google.common.collect.Lists; +import lombok.Data; + +import java.util.List; + + +/** + * 菜单资源 + * + * @author 六如 + * @see ... + */ +@Data +@JsonInclude(JsonInclude.Include.NON_EMPTY) +public class MenuTreeDTO implements TreeNode { + + /** + * id + */ + private Long id; + + /** + * 路由路径 + */ + private String path; + + /** + * 路由名称(必须保持唯一) + */ + private String name; + + /** + * 路由重定向(默认跳转地址) + */ + private String redirect; + + /** + * 父级id + */ + private Long parentId; + + /** + * 路由元信息 + */ + private Meta meta; + + private List children; + + @Override + public Long takeId() { + return id; + } + + @Override + public Long takeParentId() { + return parentId; + } + + /** + * 路由元信息,通俗来说就是路由上的额外信息 https://router.vuejs.org/zh/guide/advanced/meta.html#%E8%B7%AF%E7%94%B1%E5%85%83%E4%BF%A1%E6%81%AF + */ + @Data + @JsonInclude(JsonInclude.Include.NON_EMPTY) + public static class Meta { + /** + * 菜单名称(兼容国际化、非国际化,如果用国际化的写法就必须在根目录的locales文件夹下对应添加) + */ + private String title; + + /** + * 菜单图标 + */ + private String icon; + + /** + * 右侧图标 + */ + private String extraIcon; + + /** + * 菜单(是否显示该菜单) + */ + @Bool + private Integer showLink; + + /** + * 父级菜单(是否显示父级菜单 + */ + @Bool + private Integer showParent; + + /** + * 链接地址(需要内嵌的`iframe`链接地址) + */ + private String frameSrc; + + /** + * 加载动画(内嵌的`iframe`页面是否开启首次加载动画) + */ + @Bool + private Integer frameLoading; + + /** + * 缓存页面 + */ + @Bool + private Integer keepAlive; + + /** + * 标签页(当前菜单名称或自定义信息禁止添加到标签页) + */ + @Bool + private Integer hiddenTag; + + /** + * 菜单激活 + */ + private String activePath; + + /** + * 排序 + */ + private Integer rank; + + } +} diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/dto/SysRoleDTO.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/dto/SysRoleDTO.java new file mode 100644 index 00000000..1f090f49 --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/dto/SysRoleDTO.java @@ -0,0 +1,29 @@ +package com.gitee.sop.adminbackend.service.sys.dto; + +import lombok.Data; + +/** + * @author 六如 + */ +@Data +public class SysRoleDTO { + /** + * id + */ + private Long id; + + /** + * 角色名称 + */ + private String name; + + /** + * 角色code + */ + private String code; + + /** + * 备注 + */ + private String remark; +} diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/dto/UserPermissionDTO.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/dto/UserPermissionDTO.java new file mode 100644 index 00000000..c1ce3199 --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/dto/UserPermissionDTO.java @@ -0,0 +1,31 @@ +package com.gitee.sop.adminbackend.service.sys.dto; + +import java.util.ArrayList; +import java.util.List; +import lombok.Data; + + +/** + * @author 六如 + */ +@Data +public class UserPermissionDTO { + + /** + * 用户角色code + */ + private List roles; + + /** + * 用户按钮级别code + */ + private List permissions; + + public static UserPermissionDTO empty() { + UserPermissionDTO userPermissionDTO = new UserPermissionDTO(); + userPermissionDTO.setRoles(new ArrayList<>()); + userPermissionDTO.setPermissions(new ArrayList<>()); + return userPermissionDTO; + } + +} diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/dto/UserRoleInfoDTO.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/dto/UserRoleInfoDTO.java new file mode 100644 index 00000000..657c0fe8 --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/dto/UserRoleInfoDTO.java @@ -0,0 +1,20 @@ +package com.gitee.sop.adminbackend.service.sys.dto; + +import lombok.Data; + +import java.util.List; + +/** + * 用户角色信息 + * @author 六如 + */ +@Data +public class UserRoleInfoDTO { + + private Long userId; + + private List roleIds; + + private List roleCodes; + +} diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/login/LoginService.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/login/LoginService.java index a183de0f..bbbc6464 100644 --- a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/login/LoginService.java +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/login/LoginService.java @@ -6,16 +6,18 @@ import com.gitee.sop.adminbackend.common.enums.StatusEnum; import com.gitee.sop.adminbackend.common.exception.BizException; import com.gitee.sop.adminbackend.common.manager.UserCacheManager; import com.gitee.sop.adminbackend.common.util.CopyUtil; +import com.gitee.sop.adminbackend.common.util.DateUtil; import com.gitee.sop.adminbackend.common.util.GenerateUtil; import com.gitee.sop.adminbackend.common.util.JwtUtil; import com.gitee.sop.adminbackend.dao.entity.SysUser; import com.gitee.sop.adminbackend.service.sys.SysUserService; +import com.gitee.sop.adminbackend.service.sys.UserPermissionService; +import com.gitee.sop.adminbackend.service.sys.dto.UserPermissionDTO; import com.gitee.sop.adminbackend.service.sys.login.dto.LoginDTO; import com.gitee.sop.adminbackend.service.sys.login.dto.LoginForm; import com.gitee.sop.adminbackend.service.sys.login.dto.LoginResult; import com.gitee.sop.adminbackend.service.sys.login.dto.LoginUser; import com.gitee.sop.adminbackend.service.sys.login.enums.RegTypeEnum; -import com.google.common.collect.Sets; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.math.NumberUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -25,7 +27,6 @@ import org.springframework.util.Assert; import org.springframework.util.StringUtils; import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; import java.util.HashMap; import java.util.Map; import java.util.Objects; @@ -39,9 +40,10 @@ public class LoginService { @Autowired private SysUserService sysUserService; - @Autowired private UserCacheManager userCacheManager; + @Autowired + private UserPermissionService userPermissionService; public LoginUser login(LoginDTO loginDTO) { @@ -74,20 +76,14 @@ public class LoginService { // 创建token String token = this.createToken(sysUser.getId()); loginUser.setAccessToken(token); - if ("admin".equals(sysUser.getUsername())) { - // ROLE - loginUser.setRoles(Sets.newHashSet("admin")); - // *:*:* 表示所有权限 - loginUser.setPermissions(Sets.newHashSet("*:*:*")); - } else { - // TODO:其它角色权限 - loginUser.setRoles(Sets.newHashSet()); - loginUser.setPermissions(Sets.newHashSet()); - } + UserPermissionDTO userPermission = userPermissionService.getUserPermission(loginUser.getUserId()); + // 角色权限 + loginUser.setRoles(userPermission.getRoles()); + loginUser.setPermissions(userPermission.getPermissions()); // 设置token过期时间 String value = Configs.getValue(ConfigKeyEnum.JWT_TIMEOUT_DAYS); LocalDateTime expireDate = LocalDateTime.now().plusDays(NumberUtils.toInt(value)); - loginUser.setExpires(expireDate.format(DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"))); + loginUser.setExpires(DateUtil.formatFrontDate(expireDate)); return loginUser; } diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/login/dto/LoginUser.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/login/dto/LoginUser.java index fb541b58..26c91b6d 100644 --- a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/login/dto/LoginUser.java +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/login/dto/LoginUser.java @@ -3,7 +3,7 @@ package com.gitee.sop.adminbackend.service.sys.login.dto; import com.gitee.sop.adminbackend.common.user.User; import lombok.Data; -import java.util.Set; +import java.util.List; /** * @author 六如 @@ -56,9 +56,9 @@ public class LoginUser implements User { */ private Integer status; - private Set roles; + private List roles; - private Set permissions; + private List permissions; private String accessToken; diff --git a/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/SysResourceController.java b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/SysResourceController.java index 7633f929..ab86a761 100644 --- a/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/SysResourceController.java +++ b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/SysResourceController.java @@ -36,13 +36,25 @@ public class SysResourceController { @Autowired private SysRoleResourceService sysRoleResourceService; + /** + * 获取菜单树 + * + * @return 返回分页结果 + */ + @GetMapping("/tree") + public Result> tree() { + List list = sysResourceService.listAll(); + List retList = CopyUtil.copyList(list, SysResourceVO::new); + return Result.ok(retList); + } + /** * 查询全部资源 * * @return 返回分页结果 */ @GetMapping("/listAll") - public Result> tree() { + public Result> listAll() { List list = sysResourceService.listAll(); List retList = CopyUtil.copyList(list, SysResourceVO::new); return Result.ok(retList); diff --git a/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/UserPermissionController.java b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/UserPermissionController.java new file mode 100644 index 00000000..79ecc35e --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/UserPermissionController.java @@ -0,0 +1,35 @@ +package com.gitee.sop.adminbackend.controller.sys; + +import com.gitee.sop.adminbackend.common.context.UserContext; +import com.gitee.sop.adminbackend.common.resp.Result; +import com.gitee.sop.adminbackend.service.sys.UserPermissionService; +import com.gitee.sop.adminbackend.service.sys.dto.MenuTreeDTO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * @author 六如 + */ +@RestController +@RequestMapping("sys/userperm") +public class UserPermissionController { + + @Autowired + private UserPermissionService userPermissionService; + + /** + * 获取当前登录用户菜单 + * + * @return 返回菜单树 + */ + @GetMapping("listCurrentUserMenu") + public Result> listCurrentUserMenu() { + List menuTreeDTOS = userPermissionService.listUserMenuTree(UserContext.getUserId()); + return Result.ok(menuTreeDTOS); + } + +} diff --git a/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/param/SysResourceAddParam.java b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/param/SysResourceAddParam.java index af886dd8..afbdde42 100644 --- a/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/param/SysResourceAddParam.java +++ b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/param/SysResourceAddParam.java @@ -1,12 +1,10 @@ package com.gitee.sop.adminbackend.controller.sys.param; -import java.time.LocalDateTime; - import com.gitee.sop.adminbackend.common.jackson.convert.annotation.Bool; import lombok.Data; -import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; /** @@ -19,29 +17,26 @@ public class SysResourceAddParam { /** * 菜单类型(0代表菜单、1代表iframe、2代表外链、3代表按钮) */ - @NotNull + @NotNull(message = "菜单类型必填") private Integer menuType; /** - * 菜单名称 + * 菜单名称, menuType=0时必填 */ - @NotBlank private String title; /** - * 路由名称 + * 路由名称, menuType=0时必填 */ - @NotBlank private String name; /** - * 路由路径 + * 路由路径, menuType=0时必填 */ - @NotBlank private String path; /** - * 路由路径 + * 组件路径 */ private String component; diff --git a/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/vo/LoginResultVO.java b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/vo/LoginResultVO.java index cfd2ebc3..e07d662f 100644 --- a/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/vo/LoginResultVO.java +++ b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/vo/LoginResultVO.java @@ -2,6 +2,7 @@ package com.gitee.sop.adminbackend.controller.sys.vo; import lombok.Data; +import java.util.List; import java.util.Set; /** @@ -41,9 +42,9 @@ public class LoginResultVO { */ private Integer status; - private Set roles; + private List roles; - private Set permissions; + private List permissions; private String accessToken; diff --git a/sop-admin/sop-admin-frontend/mock/asyncRoutes.ts b/sop-admin/sop-admin-frontend/mock/asyncRoutes.ts index 37f5622a..fad699dd 100644 --- a/sop-admin/sop-admin-frontend/mock/asyncRoutes.ts +++ b/sop-admin/sop-admin-frontend/mock/asyncRoutes.ts @@ -1,156 +1,12 @@ // 模拟后端动态生成路由 import { defineFakeRoute } from "vite-plugin-fake-server/client"; -import { system } from "@/router/enums"; - -const apiRouters = [ - { - path: "/serve", - meta: { - title: "服务管理", - icon: "ri:server-line", - rank: 10 - }, - children: [ - { - path: "/serve/api", - name: "ServeApi", - meta: { - title: "接口管理", - roles: ["admin"] - } - } - ] - }, - { - path: "/doc", - meta: { - title: "文档管理", - icon: "ep:document", - rank: 10 - }, - children: [ - { - path: "/doc/setting", - name: "DocSetting", - meta: { - title: "基础配置", - roles: ["admin"] - } - }, - { - path: "/doc/list", - name: "DocList", - meta: { - title: "文档列表", - roles: ["admin"] - } - } - ] - }, - { - path: "/isv", - meta: { - title: "ISV管理", - icon: "ri:shield-user-line", - rank: 10 - }, - children: [ - { - path: "/isv/list", - name: "IsvList", - meta: { - title: "ISV列表", - roles: ["admin"] - } - }, - { - path: "/isv/perm/permGroup", - name: "IsvPermPermGroup", - meta: { - title: "分组管理", - roles: ["admin"] - } - } - ] - } - - // , - // { - // path: "/sys", - // meta: { - // title: "系统管理", - // icon: "ri:settings-2-line", - // rank: 10 - // }, - // children: [ - // { - // path: "/admin/user/index", - // name: "AdminUser", - // meta: { - // title: "用户管理", - // roles: ["admin"] - // } - // } - // ] - // } -]; - -const systemManagementRouter = { - path: "/system", - meta: { - icon: "ri:settings-3-line", - title: "menus.pureSysManagement", - rank: system - }, - children: [ - { - path: "/system/user/index", - name: "SystemUser", - meta: { - icon: "ri:admin-line", - title: "menus.pureUser", - roles: ["admin"] - } - }, - { - path: "/system/role/index", - name: "SystemRole", - meta: { - icon: "ri:admin-fill", - title: "menus.pureRole", - roles: ["admin"] - } - }, - { - path: "/system/menu/index", - name: "SystemMenu", - meta: { - icon: "ep:menu", - title: "menus.pureSystemMenu", - roles: ["admin"] - } - }, - { - path: "/system/dept/index", - name: "SystemDept", - meta: { - icon: "ri:git-branch-line", - title: "menus.pureDept", - roles: ["admin"] - } - } - ] -}; export default defineFakeRoute([ { url: "/get-async-routes", method: "get", response: () => { - return { - success: true, - data: apiRouters.concat(systemManagementRouter) - }; + return []; } } ]); diff --git a/sop-admin/sop-admin-frontend/src/api/routes.ts b/sop-admin/sop-admin-frontend/src/api/routes.ts index 501ea3c7..7ac46745 100644 --- a/sop-admin/sop-admin-frontend/src/api/routes.ts +++ b/sop-admin/sop-admin-frontend/src/api/routes.ts @@ -1,4 +1,9 @@ -import { http } from "@/utils/http"; +import { createUrl, http } from "@/utils/http"; + +// 后端请求接口 +const apiUrl: any = createUrl({ + listMenu: "sys/userperm/listCurrentUserMenu" +}); type Result = { success: boolean; @@ -6,5 +11,6 @@ type Result = { }; export const getAsyncRoutes = () => { - return http.request("get", "/get-async-routes"); + return http.request("get", apiUrl.listMenu); + // return http.request("get", "/get-async-routes"); }; diff --git a/sop-admin/sop-admin-frontend/src/utils/perm.ts b/sop-admin/sop-admin-frontend/src/utils/perm.ts new file mode 100644 index 00000000..904cceb3 --- /dev/null +++ b/sop-admin/sop-admin-frontend/src/utils/perm.ts @@ -0,0 +1,23 @@ +/** + * 按钮权限定义 + */ +export const PermCode = { + // 接口管理按钮权限 + api: { + // 更新 + update: "api:table-btn:update", + // 启用/禁用 + updateStatus: "api:table-btn:updateStatus" + }, + // 文档列表按钮定义 + doc: { + // 发布 + publish: "doc:table-btn:publish", + // 下线 + offline: "doc:table-btn:offline", + // 同步 + sync: "doc:table-btn:sync", + // 同步所有接口 + syncAll: "doc:page-btn:sync" + } +}; diff --git a/sop-admin/sop-admin-frontend/src/views/doc/list/index.ts b/sop-admin/sop-admin-frontend/src/views/doc/list/index.ts index 23fae348..0c3a4cb0 100644 --- a/sop-admin/sop-admin-frontend/src/views/doc/list/index.ts +++ b/sop-admin/sop-admin-frontend/src/views/doc/list/index.ts @@ -1,12 +1,14 @@ import { computed, onMounted, ref } from "vue"; import { ElMessage, ElMessageBox } from "element-plus"; import { api } from "@/api/doc"; +import { PermCode } from "@/utils/perm"; import { type ButtonsCallBackParams, type PlusColumn, useTable } from "plus-pro-components"; import { YesOrNoEnum } from "@/model/enums"; +import { hasPerms } from "@/utils/auth"; export function useDocList() { const tabsData = ref>([ @@ -45,6 +47,8 @@ export function useDocList() { ); }; + // 按钮权限code + const btnCode = PermCode.doc; // 表格字段定义 const tableColumns: PlusColumn[] = [ { @@ -129,7 +133,7 @@ export function useDocList() { search(); }); }, - show: (row: any) => row.isFolder === 1 + show: (row: any) => hasPerms(btnCode.publish) && row.isFolder === 1 }, { text: "下线", @@ -155,7 +159,7 @@ export function useDocList() { search(); }); }, - show: (row: any) => row.isFolder === 1 + show: (row: any) => hasPerms(btnCode.offline) && row.isFolder === 1 }, { text: row => (row.isPublish ? "下线" : "发布"), @@ -181,7 +185,10 @@ export function useDocList() { search(); }); }, - show: (row: any) => row.isFolder === 0 + show: (row: any) => { + const perm = row.isPublish ? btnCode.offline : btnCode.publish; + return hasPerms(perm) && row.isFolder === 0; + } }, { text: "同步", @@ -210,7 +217,8 @@ export function useDocList() { .catch(() => { loading.value = false; }); - } + }, + show: () => hasPerms(btnCode.sync) } ]; diff --git a/sop-admin/sop-admin-frontend/src/views/doc/list/index.vue b/sop-admin/sop-admin-frontend/src/views/doc/list/index.vue index 7a3afe55..fb958e10 100644 --- a/sop-admin/sop-admin-frontend/src/views/doc/list/index.vue +++ b/sop-admin/sop-admin-frontend/src/views/doc/list/index.vue @@ -1,6 +1,7 @@