增加管理员拥有的菜单列表
This commit is contained in:
parent
e4d3254869
commit
6bddebafff
@ -138,7 +138,7 @@ export default function request(url, option) {
|
|||||||
// 将登陆的 accessToken 放到 header
|
// 将登陆的 accessToken 放到 header
|
||||||
const loginToken = getLoginToken();
|
const loginToken = getLoginToken();
|
||||||
if (loginToken && loginToken.accessToken
|
if (loginToken && loginToken.accessToken
|
||||||
&& url.indexOf('/system-api/admins/oauth2/username-authenticate') === -1) { // TODO 芋艿,临时这么加,可能不是很优雅
|
&& url.indexOf('/management-api/passport/login') === -1) { // TODO 芋艿,临时这么加,可能不是很优雅
|
||||||
const headers = {
|
const headers = {
|
||||||
...newOptions.headers,
|
...newOptions.headers,
|
||||||
Authorization: `Bearer ${loginToken.accessToken}`,
|
Authorization: `Bearer ${loginToken.accessToken}`,
|
||||||
|
@ -1,12 +1,10 @@
|
|||||||
package cn.iocoder.common.framework.util;
|
package cn.iocoder.common.framework.util;
|
||||||
|
|
||||||
import org.springframework.util.CollectionUtils;
|
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
public class CollectionUtil {
|
public class CollectionUtils {
|
||||||
|
|
||||||
public static boolean isEmpty(Collection collection) {
|
public static boolean isEmpty(Collection collection) {
|
||||||
return collection == null || collection.isEmpty();
|
return collection == null || collection.isEmpty();
|
||||||
@ -43,12 +41,11 @@ public class CollectionUtil {
|
|||||||
|
|
||||||
// 暂时没想好名字,先以 2 结尾噶
|
// 暂时没想好名字,先以 2 结尾噶
|
||||||
public static <T, K, V> Map<K, Set<V>> convertMultiMap2(List<T> from, Function<T, K> keyFunc, Function<T, V> valueFunc) {
|
public static <T, K, V> Map<K, Set<V>> convertMultiMap2(List<T> from, Function<T, K> keyFunc, Function<T, V> valueFunc) {
|
||||||
return from.stream().collect(Collectors.groupingBy(keyFunc,
|
return from.stream().collect(Collectors.groupingBy(keyFunc, Collectors.mapping(valueFunc, Collectors.toSet())));
|
||||||
Collectors.mapping(valueFunc, Collectors.toSet())));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean containsAny(Collection<?> source, Collection<?> candidates) {
|
public static boolean containsAny(Collection<?> source, Collection<?> candidates) {
|
||||||
return CollectionUtils.containsAny(source, candidates);
|
return org.springframework.util.CollectionUtils.containsAny(source, candidates);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -1,7 +1,7 @@
|
|||||||
package cn.iocoder.mall.security.admin.core.interceptor;
|
package cn.iocoder.mall.security.admin.core.interceptor;
|
||||||
|
|
||||||
import cn.iocoder.common.framework.enums.UserTypeEnum;
|
import cn.iocoder.common.framework.enums.UserTypeEnum;
|
||||||
import cn.iocoder.common.framework.util.CollectionUtil;
|
import cn.iocoder.common.framework.util.CollectionUtils;
|
||||||
import cn.iocoder.common.framework.util.HttpUtil;
|
import cn.iocoder.common.framework.util.HttpUtil;
|
||||||
import cn.iocoder.common.framework.util.ServiceExceptionUtil;
|
import cn.iocoder.common.framework.util.ServiceExceptionUtil;
|
||||||
import cn.iocoder.common.framework.vo.CommonResult;
|
import cn.iocoder.common.framework.vo.CommonResult;
|
||||||
@ -73,7 +73,7 @@ public class AdminSecurityInterceptor extends HandlerInterceptorAdapter {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
String[] permissions = requiresPermissions.value();
|
String[] permissions = requiresPermissions.value();
|
||||||
if (CollectionUtil.isEmpty(permissions)) {
|
if (CollectionUtils.isEmpty(permissions)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// 权限验证 TODO 待完成
|
// 权限验证 TODO 待完成
|
||||||
|
@ -0,0 +1,31 @@
|
|||||||
|
package cn.iocoder.mall.managementweb.controller.permission.vo;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@ApiModel(value = "管理员拥有的菜单树", description = "一般用于首页菜单")
|
||||||
|
@Data
|
||||||
|
@Accessors(chain = true)
|
||||||
|
public class AdminMenuTreeNodeVO {
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "菜单编号", required = true, example = "1")
|
||||||
|
private Integer id;
|
||||||
|
@ApiModelProperty(value = "菜单名", required = true, example = "商品管理")
|
||||||
|
private String name;
|
||||||
|
@ApiModelProperty(value = "前端路由", required = true, example = "/order/list")
|
||||||
|
private String route;
|
||||||
|
@ApiModelProperty(value = "菜单图标", required = true, example = "user")
|
||||||
|
private String icon;
|
||||||
|
@ApiModelProperty(value = "父级资源编号", required = true, example = "1", notes = "如果无父资源,则值为 0")
|
||||||
|
private Integer pid;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 子节点数组
|
||||||
|
*/
|
||||||
|
private List<AdminMenuTreeNodeVO> children;
|
||||||
|
|
||||||
|
}
|
@ -1,5 +1,6 @@
|
|||||||
package cn.iocoder.mall.managementweb.convert.permission;
|
package cn.iocoder.mall.managementweb.convert.permission;
|
||||||
|
|
||||||
|
import cn.iocoder.mall.managementweb.controller.permission.vo.AdminMenuTreeNodeVO;
|
||||||
import cn.iocoder.mall.managementweb.controller.permission.vo.ResourceVO;
|
import cn.iocoder.mall.managementweb.controller.permission.vo.ResourceVO;
|
||||||
import cn.iocoder.mall.systemservice.rpc.permission.dto.ResourceCreateDTO;
|
import cn.iocoder.mall.systemservice.rpc.permission.dto.ResourceCreateDTO;
|
||||||
import cn.iocoder.mall.systemservice.rpc.permission.dto.ResourceUpdateDTO;
|
import cn.iocoder.mall.systemservice.rpc.permission.dto.ResourceUpdateDTO;
|
||||||
@ -21,4 +22,6 @@ public interface ResourceConvert {
|
|||||||
|
|
||||||
List<ResourceVO> convertList(List<cn.iocoder.mall.systemservice.rpc.permission.vo.ResourceVO> list);
|
List<ResourceVO> convertList(List<cn.iocoder.mall.systemservice.rpc.permission.vo.ResourceVO> list);
|
||||||
|
|
||||||
|
AdminMenuTreeNodeVO convertTreeNode(cn.iocoder.mall.systemservice.rpc.permission.vo.ResourceVO bean);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,24 +1,34 @@
|
|||||||
package cn.iocoder.mall.managementweb.manager.permission;
|
package cn.iocoder.mall.managementweb.manager.permission;
|
||||||
|
|
||||||
|
import cn.iocoder.common.framework.util.CollectionUtils;
|
||||||
import cn.iocoder.common.framework.vo.CommonResult;
|
import cn.iocoder.common.framework.vo.CommonResult;
|
||||||
import cn.iocoder.mall.managementweb.controller.permission.dto.ResourceCreateDTO;
|
import cn.iocoder.mall.managementweb.controller.permission.dto.ResourceCreateDTO;
|
||||||
import cn.iocoder.mall.managementweb.controller.permission.dto.ResourceUpdateDTO;
|
import cn.iocoder.mall.managementweb.controller.permission.dto.ResourceUpdateDTO;
|
||||||
|
import cn.iocoder.mall.managementweb.controller.permission.vo.AdminMenuTreeNodeVO;
|
||||||
import cn.iocoder.mall.managementweb.controller.permission.vo.ResourceVO;
|
import cn.iocoder.mall.managementweb.controller.permission.vo.ResourceVO;
|
||||||
import cn.iocoder.mall.managementweb.convert.permission.ResourceConvert;
|
import cn.iocoder.mall.managementweb.convert.permission.ResourceConvert;
|
||||||
|
import cn.iocoder.mall.systemservice.enums.permission.ResourceIdEnum;
|
||||||
|
import cn.iocoder.mall.systemservice.enums.permission.ResourceTypeEnum;
|
||||||
import cn.iocoder.mall.systemservice.rpc.permission.ResourceRpc;
|
import cn.iocoder.mall.systemservice.rpc.permission.ResourceRpc;
|
||||||
|
import cn.iocoder.mall.systemservice.rpc.permission.RoleRpc;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.dubbo.config.annotation.Reference;
|
import org.apache.dubbo.config.annotation.Reference;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.*;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 资源 Manager
|
* 资源 Manager
|
||||||
*/
|
*/
|
||||||
@Service
|
@Service
|
||||||
|
@Slf4j
|
||||||
public class ResourceManager {
|
public class ResourceManager {
|
||||||
|
|
||||||
@Reference(version = "${dubbo.consumer.ResourceRpc.version}", validation = "false")
|
@Reference(version = "${dubbo.consumer.ResourceRpc.version}", validation = "false")
|
||||||
private ResourceRpc resourceRpc;
|
private ResourceRpc resourceRpc;
|
||||||
|
@Reference(version = "${dubbo.consumer.RoleRpc.version}", validation = "false")
|
||||||
|
private RoleRpc roleRpc;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建资源
|
* 创建资源
|
||||||
@ -76,4 +86,54 @@ public class ResourceManager {
|
|||||||
return ResourceConvert.INSTANCE.convertList(listResourceResult.getData());
|
return ResourceConvert.INSTANCE.convertList(listResourceResult.getData());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得管理员的菜单树
|
||||||
|
*
|
||||||
|
* @param adminId 管理员编号
|
||||||
|
* @return 菜单树
|
||||||
|
*/
|
||||||
|
public List<AdminMenuTreeNodeVO> treeAdminMenu(Integer adminId) {
|
||||||
|
// 获得管理员拥有的角色编号列表
|
||||||
|
CommonResult<Set<Integer>> listAdminRoleIdsResult = roleRpc.listAdminRoleIds(adminId);
|
||||||
|
listAdminRoleIdsResult.checkError();
|
||||||
|
if (CollectionUtils.isEmpty(listAdminRoleIdsResult.getData())) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
// 获得角色拥有的资源列表
|
||||||
|
CommonResult<List<cn.iocoder.mall.systemservice.rpc.permission.vo.ResourceVO>> resourceVOResult = resourceRpc.listRoleResource(
|
||||||
|
listAdminRoleIdsResult.getData(), ResourceTypeEnum.MENU.getType());
|
||||||
|
resourceVOResult.checkError();
|
||||||
|
// 构建菜单树
|
||||||
|
return this.buildAdminMenuTree(resourceVOResult.getData());
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<AdminMenuTreeNodeVO> buildAdminMenuTree(List<cn.iocoder.mall.systemservice.rpc.permission.vo.ResourceVO> resourceVOs) {
|
||||||
|
// 排序,保证菜单的有序性
|
||||||
|
resourceVOs.sort(Comparator.comparing(cn.iocoder.mall.systemservice.rpc.permission.vo.ResourceVO::getSort));
|
||||||
|
// 构建菜单树
|
||||||
|
// 使用 LinkedHashMap 的原因,是为了排序 。实际也可以用 Stream API ,就是太丑了。
|
||||||
|
Map<Integer, AdminMenuTreeNodeVO> treeNodeMap = new LinkedHashMap<>();
|
||||||
|
resourceVOs.forEach(resourceVO -> treeNodeMap.put(resourceVO.getId(), ResourceConvert.INSTANCE.convertTreeNode(resourceVO)));
|
||||||
|
// 处理父子关系
|
||||||
|
treeNodeMap.values().stream()
|
||||||
|
.filter(node -> !node.getPid().equals(ResourceIdEnum.ROOT.getId()))
|
||||||
|
.forEach((childNode) -> {
|
||||||
|
// 获得父节点
|
||||||
|
AdminMenuTreeNodeVO parentNode = treeNodeMap.get(childNode.getPid());
|
||||||
|
if (parentNode == null) {
|
||||||
|
log.error("[getResourceTree][resource({}) 找不到父资源({})]", childNode.getId(), childNode.getPid());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (parentNode.getChildren() == null) { // 初始化 children 数组
|
||||||
|
parentNode.setChildren(new ArrayList<>());
|
||||||
|
}
|
||||||
|
// 将自己添加到父节点中
|
||||||
|
parentNode.getChildren().add(childNode);
|
||||||
|
});
|
||||||
|
// 获得到所有的根节点
|
||||||
|
return treeNodeMap.values().stream()
|
||||||
|
.filter(node -> node.getPid().equals(ResourceIdEnum.ROOT.getId()))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,8 @@ import cn.iocoder.mall.systemservice.rpc.permission.dto.ResourceCreateDTO;
|
|||||||
import cn.iocoder.mall.systemservice.rpc.permission.dto.ResourceUpdateDTO;
|
import cn.iocoder.mall.systemservice.rpc.permission.dto.ResourceUpdateDTO;
|
||||||
import cn.iocoder.mall.systemservice.rpc.permission.vo.ResourceVO;
|
import cn.iocoder.mall.systemservice.rpc.permission.vo.ResourceVO;
|
||||||
|
|
||||||
|
import javax.validation.constraints.NotNull;
|
||||||
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -50,4 +52,13 @@ public interface ResourceRpc {
|
|||||||
*/
|
*/
|
||||||
CommonResult<List<ResourceVO>> listResource(List<Integer> resourceIds);
|
CommonResult<List<ResourceVO>> listResource(List<Integer> resourceIds);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得指定角色的资源列表
|
||||||
|
*
|
||||||
|
* @param roleIds 角色编号列表
|
||||||
|
* @param type 资源类型
|
||||||
|
* @return 资源列表
|
||||||
|
*/
|
||||||
|
CommonResult<List<ResourceVO>> listRoleResource(@NotNull(message = "角色编号列表不能为空") Collection<Integer> roleIds, Integer type);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,7 @@ import cn.iocoder.mall.systemservice.rpc.permission.vo.RoleCreateDTO;
|
|||||||
import cn.iocoder.mall.systemservice.rpc.permission.vo.RoleVO;
|
import cn.iocoder.mall.systemservice.rpc.permission.vo.RoleVO;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 角色 Rpc 接口
|
* 角色 Rpc 接口
|
||||||
@ -52,7 +53,6 @@ public interface RoleRpc {
|
|||||||
*/
|
*/
|
||||||
CommonResult<List<RoleVO>> listRole(List<Integer> roleIds);
|
CommonResult<List<RoleVO>> listRole(List<Integer> roleIds);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获得角色分页
|
* 获得角色分页
|
||||||
*
|
*
|
||||||
@ -60,4 +60,13 @@ public interface RoleRpc {
|
|||||||
* @return 角色分页结果
|
* @return 角色分页结果
|
||||||
*/
|
*/
|
||||||
CommonResult<PageResult<RoleVO>> pageRole(RolePageDTO pageDTO);
|
CommonResult<PageResult<RoleVO>> pageRole(RolePageDTO pageDTO);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得管理员拥有的角色编号列表
|
||||||
|
*
|
||||||
|
* @param adminId 管理员编号
|
||||||
|
* @return 角色编号列表
|
||||||
|
*/
|
||||||
|
CommonResult<Set<Integer>> listAdminRoleIds(Integer adminId);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,38 +0,0 @@
|
|||||||
package cn.iocoder.mall.systemservice.dal.mysql.mapper.permission;
|
|
||||||
|
|
||||||
import cn.iocoder.mall.systemservice.dal.mysql.dataobject.permission.AdminRoleDO;
|
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
||||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
|
||||||
import org.apache.ibatis.annotations.Param;
|
|
||||||
import org.springframework.stereotype.Repository;
|
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
@Repository
|
|
||||||
public interface AccountRoleMapper extends BaseMapper<AdminRoleDO> {
|
|
||||||
|
|
||||||
default List<AdminRoleDO> selectByAccountId(Integer accountId) {
|
|
||||||
return selectList(new QueryWrapper<AdminRoleDO>().eq("account_id", accountId));
|
|
||||||
}
|
|
||||||
|
|
||||||
default List<AdminRoleDO> selectListByAccountIds(Collection<Integer> accountIds) {
|
|
||||||
return selectList(new QueryWrapper<AdminRoleDO>().in("account_id", accountIds));
|
|
||||||
}
|
|
||||||
|
|
||||||
default int deleteByAccountId(Integer accountId) {
|
|
||||||
return delete(new QueryWrapper<AdminRoleDO>().eq("account_id", accountId));
|
|
||||||
}
|
|
||||||
|
|
||||||
default int deleteByRoleId(Integer roleId) {
|
|
||||||
return delete(new QueryWrapper<AdminRoleDO>().eq("role_id", roleId));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 批量插入。因为 MyBaits Plus 的批量插入是基于 Service 实现,所以只好写 XML
|
|
||||||
*
|
|
||||||
* @param accountRoleDOs 数组
|
|
||||||
*/
|
|
||||||
int insertList(@Param("accountRoleDOs") List<AdminRoleDO> accountRoleDOs);
|
|
||||||
|
|
||||||
}
|
|
@ -0,0 +1,37 @@
|
|||||||
|
package cn.iocoder.mall.systemservice.dal.mysql.mapper.permission;
|
||||||
|
|
||||||
|
import cn.iocoder.mall.systemservice.dal.mysql.dataobject.permission.AdminRoleDO;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Repository
|
||||||
|
public interface AdminRoleMapper extends BaseMapper<AdminRoleDO> {
|
||||||
|
|
||||||
|
default List<AdminRoleDO> selectByAdminId(Integer adminId) {
|
||||||
|
return selectList(new QueryWrapper<AdminRoleDO>().eq("admin_id", adminId));
|
||||||
|
}
|
||||||
|
|
||||||
|
// default List<AdminRoleDO> selectListByAccountIds(Collection<Integer> accountIds) {
|
||||||
|
// return selectList(new QueryWrapper<AdminRoleDO>().in("account_id", accountIds));
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// default int deleteByAccountId(Integer accountId) {
|
||||||
|
// return delete(new QueryWrapper<AdminRoleDO>().eq("account_id", accountId));
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// default int deleteByRoleId(Integer roleId) {
|
||||||
|
// return delete(new QueryWrapper<AdminRoleDO>().eq("role_id", roleId));
|
||||||
|
// }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量插入。因为 MyBaits Plus 的批量插入是基于 Service 实现,所以只好写 XML
|
||||||
|
*
|
||||||
|
* @param accountRoleDOs 数组
|
||||||
|
*/
|
||||||
|
int insertList(@Param("accountRoleDOs") List<AdminRoleDO> accountRoleDOs);
|
||||||
|
|
||||||
|
}
|
@ -16,6 +16,16 @@ public interface ResourceMapper extends BaseMapper<ResourceDO> {
|
|||||||
return selectOne(new QueryWrapper<ResourceDO>().eq("permission", permission));
|
return selectOne(new QueryWrapper<ResourceDO>().eq("permission", permission));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询指定类型的资源列表
|
||||||
|
*
|
||||||
|
* @param type 资源类型,允许空
|
||||||
|
* @return 资源列表
|
||||||
|
*/
|
||||||
|
default List<ResourceDO> selectListByType(Integer type) {
|
||||||
|
return selectList(new QueryWrapperX<ResourceDO>().eqIfPresent("type", type));
|
||||||
|
}
|
||||||
|
|
||||||
default ResourceDO selectByPidAndName(Integer pid, String name) {
|
default ResourceDO selectByPidAndName(Integer pid, String name) {
|
||||||
return selectOne(new QueryWrapperX<ResourceDO>().eqIfPresent("pid", pid)
|
return selectOne(new QueryWrapperX<ResourceDO>().eqIfPresent("pid", pid)
|
||||||
.eqIfPresent("name", name));
|
.eqIfPresent("name", name));
|
||||||
|
@ -5,10 +5,12 @@ import cn.iocoder.mall.systemservice.rpc.permission.dto.ResourceCreateDTO;
|
|||||||
import cn.iocoder.mall.systemservice.rpc.permission.dto.ResourceUpdateDTO;
|
import cn.iocoder.mall.systemservice.rpc.permission.dto.ResourceUpdateDTO;
|
||||||
import cn.iocoder.mall.systemservice.rpc.permission.vo.ResourceVO;
|
import cn.iocoder.mall.systemservice.rpc.permission.vo.ResourceVO;
|
||||||
import cn.iocoder.mall.systemservice.service.permission.ResourceService;
|
import cn.iocoder.mall.systemservice.service.permission.ResourceService;
|
||||||
|
import cn.iocoder.mall.systemservice.service.permission.RoleService;
|
||||||
import cn.iocoder.mall.systemservice.service.permission.bo.ResourceBO;
|
import cn.iocoder.mall.systemservice.service.permission.bo.ResourceBO;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -19,6 +21,8 @@ public class ResourceManager {
|
|||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private ResourceService resourceService;
|
private ResourceService resourceService;
|
||||||
|
@Autowired
|
||||||
|
private RoleService roleService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建资源
|
* 创建资源
|
||||||
@ -71,4 +75,22 @@ public class ResourceManager {
|
|||||||
return ResourceConvert.INSTANCE.convertList02(resourceBOs);
|
return ResourceConvert.INSTANCE.convertList02(resourceBOs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得指定角色的资源列表
|
||||||
|
*
|
||||||
|
* @param roleIds 角色编号列表
|
||||||
|
* @param type 资源类型,允许空
|
||||||
|
* @return 资源列表
|
||||||
|
*/
|
||||||
|
public List<ResourceVO> listRoleResource(Collection<Integer> roleIds, Integer type) {
|
||||||
|
List<ResourceBO> resourceBOs;
|
||||||
|
// 判断是否为超管。若是超管,默认有所有权限
|
||||||
|
if (roleService.hasSuperAdmin(roleIds)) {
|
||||||
|
resourceBOs = resourceService.listResourceByType(type);
|
||||||
|
} else {
|
||||||
|
resourceBOs = resourceService.listRoleResourceByType(roleIds, type);
|
||||||
|
}
|
||||||
|
return ResourceConvert.INSTANCE.convertList02(resourceBOs);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -12,6 +12,7 @@ import org.springframework.beans.factory.annotation.Autowired;
|
|||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 角色 Manager
|
* 角色 Manager
|
||||||
@ -84,4 +85,14 @@ public class RoleManager {
|
|||||||
return RoleConvert.INSTANCE.convertPage(pageResultBO);
|
return RoleConvert.INSTANCE.convertPage(pageResultBO);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得管理员拥有的角色编号列表
|
||||||
|
*
|
||||||
|
* @param adminId 管理员编号
|
||||||
|
* @return 角色编号列表
|
||||||
|
*/
|
||||||
|
public Set<Integer> listAdminRoleIds(Integer adminId) {
|
||||||
|
return roleService.listAdminRoleIds(adminId);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,7 @@ import cn.iocoder.mall.systemservice.rpc.permission.vo.ResourceVO;
|
|||||||
import org.apache.dubbo.config.annotation.Service;
|
import org.apache.dubbo.config.annotation.Service;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static cn.iocoder.common.framework.vo.CommonResult.success;
|
import static cn.iocoder.common.framework.vo.CommonResult.success;
|
||||||
@ -48,4 +49,9 @@ public class ResourceRpcImpl implements ResourceRpc {
|
|||||||
return success(resourceManager.listResource(resourceIds));
|
return success(resourceManager.listResource(resourceIds));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CommonResult<List<ResourceVO>> listRoleResource(Collection<Integer> roleIds, Integer type) {
|
||||||
|
return success(resourceManager.listRoleResource(roleIds, type));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -11,6 +11,7 @@ import org.apache.dubbo.config.annotation.Service;
|
|||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import static cn.iocoder.common.framework.vo.CommonResult.success;
|
import static cn.iocoder.common.framework.vo.CommonResult.success;
|
||||||
|
|
||||||
@ -55,4 +56,9 @@ public class RoleRpcImpl implements RoleRpc {
|
|||||||
return success(roleManager.pageRole(pageDTO));
|
return success(roleManager.pageRole(pageDTO));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CommonResult<Set<Integer>> listAdminRoleIds(Integer adminId) {
|
||||||
|
return success(roleManager.listAdminRoleIds(adminId));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,12 @@
|
|||||||
package cn.iocoder.mall.systemservice.service.permission;
|
package cn.iocoder.mall.systemservice.service.permission;
|
||||||
|
|
||||||
|
import cn.iocoder.common.framework.util.CollectionUtils;
|
||||||
import cn.iocoder.common.framework.util.ServiceExceptionUtil;
|
import cn.iocoder.common.framework.util.ServiceExceptionUtil;
|
||||||
import cn.iocoder.mall.systemservice.convert.permission.ResourceConvert;
|
import cn.iocoder.mall.systemservice.convert.permission.ResourceConvert;
|
||||||
import cn.iocoder.mall.systemservice.dal.mysql.dataobject.permission.ResourceDO;
|
import cn.iocoder.mall.systemservice.dal.mysql.dataobject.permission.ResourceDO;
|
||||||
|
import cn.iocoder.mall.systemservice.dal.mysql.dataobject.permission.RoleResourceDO;
|
||||||
import cn.iocoder.mall.systemservice.dal.mysql.mapper.permission.ResourceMapper;
|
import cn.iocoder.mall.systemservice.dal.mysql.mapper.permission.ResourceMapper;
|
||||||
|
import cn.iocoder.mall.systemservice.dal.mysql.mapper.permission.RoleResourceMapper;
|
||||||
import cn.iocoder.mall.systemservice.enums.SystemErrorCodeEnum;
|
import cn.iocoder.mall.systemservice.enums.SystemErrorCodeEnum;
|
||||||
import cn.iocoder.mall.systemservice.enums.permission.ResourceIdEnum;
|
import cn.iocoder.mall.systemservice.enums.permission.ResourceIdEnum;
|
||||||
import cn.iocoder.mall.systemservice.enums.permission.ResourceTypeEnum;
|
import cn.iocoder.mall.systemservice.enums.permission.ResourceTypeEnum;
|
||||||
@ -15,6 +18,8 @@ import org.springframework.stereotype.Service;
|
|||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
|
||||||
import javax.validation.Valid;
|
import javax.validation.Valid;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static cn.iocoder.mall.systemservice.enums.SystemErrorCodeEnum.*;
|
import static cn.iocoder.mall.systemservice.enums.SystemErrorCodeEnum.*;
|
||||||
@ -28,6 +33,8 @@ public class ResourceService {
|
|||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private ResourceMapper resourceMapper;
|
private ResourceMapper resourceMapper;
|
||||||
|
@Autowired
|
||||||
|
private RoleResourceMapper roleResourceMapper;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建资源
|
* 创建资源
|
||||||
@ -112,6 +119,34 @@ public class ResourceService {
|
|||||||
return ResourceConvert.INSTANCE.convertList(resourceDOs);
|
return ResourceConvert.INSTANCE.convertList(resourceDOs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得指定类型的资源列表
|
||||||
|
*
|
||||||
|
* @param type 资源类型,允许空
|
||||||
|
* @return 资源列表
|
||||||
|
*/
|
||||||
|
public List<ResourceBO> listResourceByType(Integer type) {
|
||||||
|
List<ResourceDO> resourceDOs = resourceMapper.selectListByType(type);
|
||||||
|
return ResourceConvert.INSTANCE.convertList(resourceDOs);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得角色拥有的资源列表
|
||||||
|
*
|
||||||
|
* @param roleIds 角色编号
|
||||||
|
* @param type 资源类型,允许空
|
||||||
|
* @return 资源列表
|
||||||
|
*/
|
||||||
|
public List<ResourceBO> listRoleResourceByType(Collection<Integer> roleIds, Integer type) {
|
||||||
|
List<RoleResourceDO> roleResourceDOs = roleResourceMapper.selectListByRoleIds(roleIds);
|
||||||
|
if (CollectionUtils.isEmpty(roleResourceDOs)) {
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
List<ResourceDO> resourceDOs = resourceMapper.selectListByIdsAndType(
|
||||||
|
CollectionUtils.convertSet(roleResourceDOs, RoleResourceDO::getResourceId), type);
|
||||||
|
return ResourceConvert.INSTANCE.convertList(resourceDOs);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 校验父资源是否合法
|
* 校验父资源是否合法
|
||||||
*
|
*
|
||||||
|
@ -1,10 +1,14 @@
|
|||||||
package cn.iocoder.mall.systemservice.service.permission;
|
package cn.iocoder.mall.systemservice.service.permission;
|
||||||
|
|
||||||
|
import cn.iocoder.common.framework.util.CollectionUtils;
|
||||||
import cn.iocoder.common.framework.util.ServiceExceptionUtil;
|
import cn.iocoder.common.framework.util.ServiceExceptionUtil;
|
||||||
import cn.iocoder.common.framework.vo.PageResult;
|
import cn.iocoder.common.framework.vo.PageResult;
|
||||||
import cn.iocoder.mall.systemservice.convert.permission.RoleConvert;
|
import cn.iocoder.mall.systemservice.convert.permission.RoleConvert;
|
||||||
|
import cn.iocoder.mall.systemservice.dal.mysql.dataobject.permission.AdminRoleDO;
|
||||||
import cn.iocoder.mall.systemservice.dal.mysql.dataobject.permission.RoleDO;
|
import cn.iocoder.mall.systemservice.dal.mysql.dataobject.permission.RoleDO;
|
||||||
|
import cn.iocoder.mall.systemservice.dal.mysql.mapper.permission.AdminRoleMapper;
|
||||||
import cn.iocoder.mall.systemservice.dal.mysql.mapper.permission.RoleMapper;
|
import cn.iocoder.mall.systemservice.dal.mysql.mapper.permission.RoleMapper;
|
||||||
|
import cn.iocoder.mall.systemservice.enums.permission.RoleCodeEnum;
|
||||||
import cn.iocoder.mall.systemservice.enums.permission.RoleTypeEnum;
|
import cn.iocoder.mall.systemservice.enums.permission.RoleTypeEnum;
|
||||||
import cn.iocoder.mall.systemservice.service.permission.bo.RoleBO;
|
import cn.iocoder.mall.systemservice.service.permission.bo.RoleBO;
|
||||||
import cn.iocoder.mall.systemservice.service.permission.bo.RoleCreateBO;
|
import cn.iocoder.mall.systemservice.service.permission.bo.RoleCreateBO;
|
||||||
@ -17,7 +21,9 @@ import org.springframework.util.StringUtils;
|
|||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
|
||||||
import javax.validation.Valid;
|
import javax.validation.Valid;
|
||||||
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import static cn.iocoder.mall.systemservice.enums.SystemErrorCodeEnum.*;
|
import static cn.iocoder.mall.systemservice.enums.SystemErrorCodeEnum.*;
|
||||||
|
|
||||||
@ -30,6 +36,8 @@ public class RoleService {
|
|||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private RoleMapper roleMapper;
|
private RoleMapper roleMapper;
|
||||||
|
@Autowired
|
||||||
|
private AdminRoleMapper adminRoleMapper;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建角色
|
* 创建角色
|
||||||
@ -151,4 +159,31 @@ public class RoleService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得管理员拥有的角色编号列表
|
||||||
|
*
|
||||||
|
* @param adminId 管理员编号
|
||||||
|
* @return 角色编号列表
|
||||||
|
*/
|
||||||
|
public Set<Integer> listAdminRoleIds(Integer adminId) {
|
||||||
|
List<AdminRoleDO> adminRoleDOs = adminRoleMapper.selectByAdminId(adminId);
|
||||||
|
return CollectionUtils.convertSet(adminRoleDOs, AdminRoleDO::getRoleId);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 判断角色是否有超级管理员
|
||||||
|
*
|
||||||
|
* @param roleIds 角色编号列表
|
||||||
|
* @return 是否有超级管理员
|
||||||
|
*/
|
||||||
|
public boolean hasSuperAdmin(Collection<Integer> roleIds) {
|
||||||
|
List<RoleDO> roleDOs = roleMapper.selectBatchIds(roleIds);
|
||||||
|
for (RoleDO roleDO : roleDOs) {
|
||||||
|
if (RoleCodeEnum.SUPER_ADMIN.getCode().equals(roleDO.getCode())) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
<mapper namespace="cn.iocoder.mall.systemservice.dal.mysql.mapper.permission.AccountRoleMapper">
|
<mapper namespace="cn.iocoder.mall.systemservice.dal.mysql.mapper.permission.AdminRoleMapper">
|
||||||
|
|
||||||
<insert id="insertList">
|
<insert id="insertList">
|
||||||
INSERT INTO account_role (
|
INSERT INTO account_role (
|
||||||
|
@ -1,22 +0,0 @@
|
|||||||
package cn.iocoder.mall.system.biz.dto.authorization;
|
|
||||||
|
|
||||||
import lombok.Data;
|
|
||||||
import lombok.experimental.Accessors;
|
|
||||||
|
|
||||||
import javax.validation.constraints.NotNull;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 授权模块 - 获得账号所拥有的资源树 DTO
|
|
||||||
*/
|
|
||||||
@Data
|
|
||||||
@Accessors(chain = true)
|
|
||||||
public class AuthorizationGetResourceTreeByAccountIdDTO {
|
|
||||||
|
|
||||||
@NotNull(message = "账号编号不能为空")
|
|
||||||
private Integer accountId;
|
|
||||||
/**
|
|
||||||
* 资源类型
|
|
||||||
*/
|
|
||||||
private Integer type;
|
|
||||||
|
|
||||||
}
|
|
@ -122,18 +122,7 @@ public class AuthorizationServiceImpl implements AuthorizationService {
|
|||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
Set<Integer> roleIds = CollectionUtil.convertSet(accountRoleDOs, AccountRoleDO::getRoleId);
|
Set<Integer> roleIds = CollectionUtil.convertSet(accountRoleDOs, AccountRoleDO::getRoleId);
|
||||||
// 判断是否为超管。若是超管,默认有所有权限
|
|
||||||
if (roleService.hasSuperAdmin(roleIds)) {
|
|
||||||
return resourceService.getResourceTree(new ResourceGetTreeDTO().setType(getResourcesByAccountIdDTO.getType()));
|
|
||||||
}
|
|
||||||
// 查询角色拥有的资源关联数据
|
|
||||||
List<RoleResourceDO> roleResourceDOs = roleResourceMapper.selectListByRoleIds(roleIds);
|
|
||||||
if (CollectionUtil.isEmpty(roleResourceDOs)) {
|
|
||||||
return Collections.emptyList();
|
|
||||||
}
|
|
||||||
Set<Integer> resourceIds = CollectionUtil.convertSet(roleResourceDOs, RoleResourceDO::getResourceId);
|
|
||||||
// 查询对应资源树
|
|
||||||
return resourceService.getResourceTree(new ResourceGetTreeDTO().setIds(resourceIds).setType(getResourcesByAccountIdDTO.getType()));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -53,30 +53,7 @@ public class ResourceServiceImpl implements ResourceService {
|
|||||||
// 获得对应的资源列表
|
// 获得对应的资源列表
|
||||||
List<ResourceDO> resourceDOs = resourceMapper.selectListByIdsAndType(getTreeDTO.getIds(), getTreeDTO.getType());
|
List<ResourceDO> resourceDOs = resourceMapper.selectListByIdsAndType(getTreeDTO.getIds(), getTreeDTO.getType());
|
||||||
// 拼装成树
|
// 拼装成树
|
||||||
// 使用 LinkedHashMap 的原因,是为了排序 。实际也可以用 Stream API ,就是太丑了。
|
|
||||||
Map<Integer, ResourceTreeNodeBO> treeNodeMap = new LinkedHashMap<>();
|
|
||||||
resourceDOs.stream().sorted(Comparator.comparing(ResourceDO::getSort))
|
|
||||||
.forEach(resourceDO -> treeNodeMap.put(resourceDO.getId(), ResourceConvert.INSTANCE.convertTreeNode(resourceDO)));
|
|
||||||
// 处理父子关系
|
|
||||||
treeNodeMap.values().stream()
|
|
||||||
.filter(node -> !node.getNode().getPid().equals(ResourceIdEnum.ROOT.getId()))
|
|
||||||
.forEach((childNode) -> {
|
|
||||||
// 获得父节点
|
|
||||||
ResourceTreeNodeBO parentNode = treeNodeMap.get(childNode.getNode().getPid());
|
|
||||||
if (parentNode == null) {
|
|
||||||
log.error("[getResourceTree][resource({}) 找不到父资源({})]", childNode.getNode().getId(), childNode.getNode().getPid());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (parentNode.getChildren() == null) { // 初始化 children 数组
|
|
||||||
parentNode.setChildren(new ArrayList<>());
|
|
||||||
}
|
|
||||||
// 将自己添加到父节点中
|
|
||||||
parentNode.getChildren().add(childNode);
|
|
||||||
});
|
|
||||||
// 获得到所有的根节点
|
|
||||||
return treeNodeMap.values().stream()
|
|
||||||
.filter(node -> node.getNode().getPid().equals(ResourceIdEnum.ROOT.getId()))
|
|
||||||
.collect(Collectors.toList());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,39 +0,0 @@
|
|||||||
package cn.iocoder.mall.system.biz.service.authorization;
|
|
||||||
|
|
||||||
import cn.iocoder.common.framework.vo.PageResult;
|
|
||||||
import cn.iocoder.mall.system.biz.bo.authorization.RoleBO;
|
|
||||||
import cn.iocoder.mall.system.biz.dto.authorization.RoleAddDTO;
|
|
||||||
import cn.iocoder.mall.system.biz.dto.authorization.RoleDeleteDTO;
|
|
||||||
import cn.iocoder.mall.system.biz.dto.authorization.RolePageDTO;
|
|
||||||
import cn.iocoder.mall.system.biz.dto.authorization.RoleUpdateDTO;
|
|
||||||
import cn.iocoder.mall.system.biz.dto.authorization.RoleGetListDTO;
|
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 角色模块 - Service 接口
|
|
||||||
*/
|
|
||||||
public interface RoleService {
|
|
||||||
|
|
||||||
RoleBO getRole(Integer id);
|
|
||||||
|
|
||||||
List<RoleBO> getRoleList(RoleGetListDTO getListDTO);
|
|
||||||
|
|
||||||
PageResult<RoleBO> getRolePage(RolePageDTO pageDTO);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 判断指定角色是否包含超级管理员角色
|
|
||||||
*
|
|
||||||
* @param ids 角色编号数组
|
|
||||||
* @return 是否有超级管理员角色
|
|
||||||
*/
|
|
||||||
boolean hasSuperAdmin(Collection<Integer> ids);
|
|
||||||
|
|
||||||
Integer addRole(RoleAddDTO roleAddDTO);
|
|
||||||
|
|
||||||
void updateRole(RoleUpdateDTO roleUpdateDTO);
|
|
||||||
|
|
||||||
void deleteRole(RoleDeleteDTO roleDeleteDTO);
|
|
||||||
|
|
||||||
}
|
|
@ -1,50 +0,0 @@
|
|||||||
package cn.iocoder.mall.system.biz.service.authorization;
|
|
||||||
|
|
||||||
import cn.iocoder.common.framework.util.ServiceExceptionUtil;
|
|
||||||
import cn.iocoder.common.framework.util.StringUtils;
|
|
||||||
import cn.iocoder.common.framework.vo.PageResult;
|
|
||||||
import cn.iocoder.mall.mybatis.enums.DeletedStatusEnum;
|
|
||||||
import cn.iocoder.mall.system.biz.bo.authorization.RoleBO;
|
|
||||||
import cn.iocoder.mall.system.biz.convert.authorization.RoleConvert;
|
|
||||||
import cn.iocoder.mall.system.biz.dao.authorization.RoleMapper;
|
|
||||||
import cn.iocoder.mall.system.biz.dataobject.authorization.RoleDO;
|
|
||||||
import cn.iocoder.mall.system.biz.dto.authorization.*;
|
|
||||||
import cn.iocoder.mall.system.biz.enums.SystemErrorCodeEnum;
|
|
||||||
import cn.iocoder.mall.system.biz.enums.authorization.RoleCodeEnum;
|
|
||||||
import cn.iocoder.mall.system.biz.enums.authorization.RoleTypeEnum;
|
|
||||||
import cn.iocoder.mall.system.biz.event.authorization.ResourceDeleteEvent;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.context.ApplicationEventPublisher;
|
|
||||||
import org.springframework.stereotype.Service;
|
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.Date;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
@Service
|
|
||||||
public class RoleServiceImpl implements RoleService {
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private ApplicationEventPublisher eventPublisher;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private RoleMapper roleMapper;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PageResult<RoleBO> getRolePage(RolePageDTO pageDTO) {
|
|
||||||
return RoleConvert.INSTANCE.convertPage(roleMapper.selectPage(pageDTO));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean hasSuperAdmin(Collection<Integer> ids) {
|
|
||||||
List<RoleDO> roleDOs = roleMapper.selectBatchIds(ids);
|
|
||||||
for (RoleDO roleDO : roleDOs) {
|
|
||||||
if (RoleCodeEnum.SUPER_ADMIN.getCode().equals(roleDO.getCode())) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -22,69 +22,6 @@ import org.springframework.web.bind.annotation.RestController;
|
|||||||
@Api(tags = "管理员 - 管理员 API")
|
@Api(tags = "管理员 - 管理员 API")
|
||||||
public class AdminsAdminController {
|
public class AdminsAdminController {
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private AdminService adminService;
|
|
||||||
|
|
||||||
@GetMapping("/page")
|
|
||||||
@RequiresPermissions("system:admin:page")
|
|
||||||
@ApiOperation(value = "管理员分页")
|
|
||||||
public CommonResult<PageResult<AdminsAdminPageResponse>> page(AdminsAdminPageRequest request) {
|
|
||||||
// 查询管理员分页
|
|
||||||
AdminPageDTO pageDTO = AdminsAdminConvert.INSTANCE.convert(request);
|
|
||||||
PageResult<AdminBO> adminPageBO = adminService.getAdminPage(pageDTO);
|
|
||||||
PageResult<AdminsAdminPageResponse> adminPageResponse = AdminsAdminConvert.INSTANCE.convertPage(adminPageBO);
|
|
||||||
if (adminPageResponse.getList().isEmpty()) {
|
|
||||||
return CommonResult.success(adminPageResponse);
|
|
||||||
}
|
|
||||||
// 拼接角色数据
|
|
||||||
|
|
||||||
|
|
||||||
// TODO 拼接部门数据
|
|
||||||
|
|
||||||
// 拼接结果
|
|
||||||
// if (!resultPage.getList().isEmpty()) {
|
|
||||||
// // 查询角色数组
|
|
||||||
// Map<Integer, Collection<RoleBO>> roleMap = adminService.getAdminRolesMap(CollectionUtil.convertList(resultPage.getList(), AdminBO::getId));
|
|
||||||
// resultPage.getList().forEach(admin -> admin.setRoles(AdminConvert.INSTANCE.convertAdminVORoleList(roleMap.get(admin.getId()))));
|
|
||||||
//
|
|
||||||
// // 查询对应部门
|
|
||||||
// List<DeptmentBO> deptmentBOS = deptmentService.getAllDeptments();
|
|
||||||
// Map<Integer, String> deptNameMap = deptmentBOS.stream().collect(Collectors.toMap(d->d.getId(), d->d.getName()));
|
|
||||||
// //管理员所在部门被删后,变成未分配状态
|
|
||||||
// deptNameMap.put(0, "未分配");
|
|
||||||
// resultPage.getList().forEach(admin->{
|
|
||||||
// admin.setDeptment(new AdminVO.Deptment(admin.getDeptmentId(), deptNameMap.get(admin.getDeptmentId())));
|
|
||||||
// });
|
|
||||||
// }
|
|
||||||
|
|
||||||
return CommonResult.success(adminPageResponse);
|
|
||||||
}
|
|
||||||
|
|
||||||
// @PostMapping("/add")
|
|
||||||
// @ApiOperation(value = "创建管理员")
|
|
||||||
// public CommonResult<AdminBO> add(AdminAddDTO adminAddDTO) {
|
|
||||||
// return success(adminService.addAdmin(AdminSecurityContextHolder.getContext().getAdminId(), adminAddDTO));
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// @PostMapping("/update")
|
|
||||||
// @ApiOperation(value = "更新管理员")
|
|
||||||
// public CommonResult<Boolean> update(AdminUpdateDTO adminUpdateDTO) {
|
|
||||||
// return success(adminService.updateAdmin(AdminSecurityContextHolder.getContext().getAdminId(), adminUpdateDTO));
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// @PostMapping("/update_status")
|
|
||||||
// @ApiOperation(value = "更新管理员状态")
|
|
||||||
// public CommonResult<Boolean> updateStatus(AdminUpdateStatusDTO adminUpdateStatusDTO) {
|
|
||||||
// return success(adminService.updateAdminStatus(AdminSecurityContextHolder.getContext().getAdminId(), adminUpdateStatusDTO));
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// @PostMapping("/delete")
|
|
||||||
// @ApiOperation(value = "删除管理员")
|
|
||||||
// @ApiImplicitParam(name = "id", value = "管理员编号", required = true, example = "1")
|
|
||||||
// public CommonResult<Boolean> delete(@RequestParam("id") Integer id) {
|
|
||||||
// return success(adminService.deleteAdmin(AdminSecurityContextHolder.getContext().getAdminId(), id));
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// @GetMapping("/role_list")
|
// @GetMapping("/role_list")
|
||||||
// @ApiOperation(value = "指定管理员拥有的角色列表")
|
// @ApiOperation(value = "指定管理员拥有的角色列表")
|
||||||
// @ApiImplicitParam(name = "id", value = "管理员编号", required = true, example = "1")
|
// @ApiImplicitParam(name = "id", value = "管理员编号", required = true, example = "1")
|
||||||
@ -99,7 +36,7 @@ public class AdminsAdminController {
|
|||||||
// result.forEach(adminRoleVO -> adminRoleVO.setAssigned(adminRoleIdSet.contains(adminRoleVO.getId())));
|
// result.forEach(adminRoleVO -> adminRoleVO.setAssigned(adminRoleIdSet.contains(adminRoleVO.getId())));
|
||||||
// return success(result);
|
// return success(result);
|
||||||
// }
|
// }
|
||||||
//
|
|
||||||
// @PostMapping("/assign_role")
|
// @PostMapping("/assign_role")
|
||||||
// @ApiOperation(value = "分配给管理员角色")
|
// @ApiOperation(value = "分配给管理员角色")
|
||||||
// public CommonResult<Boolean> assignRole(AdminAssignRoleDTO adminAssignRoleDTO) {
|
// public CommonResult<Boolean> assignRole(AdminAssignRoleDTO adminAssignRoleDTO) {
|
||||||
|
@ -38,34 +38,4 @@ public class AdminsResourceController {
|
|||||||
return CommonResult.success(AdminsResourceConvert.INSTANCE.convertList(resourceTreeNodeBOs));
|
return CommonResult.success(AdminsResourceConvert.INSTANCE.convertList(resourceTreeNodeBOs));
|
||||||
}
|
}
|
||||||
|
|
||||||
@PostMapping("/add")
|
|
||||||
@ApiOperation(value = "创建资源", notes = "例如说,菜单资源,按钮资源")
|
|
||||||
@RequiresPermissions("system:resource:add")
|
|
||||||
public CommonResult<Integer> add(AdminsResourceAddRequest request) {
|
|
||||||
ResourceAddDTO addDTO = AdminsResourceConvert.INSTANCE.convert(request)
|
|
||||||
.setAdminId(AdminSecurityContextHolder.getAdminId());
|
|
||||||
return CommonResult.success(resourceService.addResource(addDTO));
|
|
||||||
}
|
|
||||||
|
|
||||||
@PostMapping("/update")
|
|
||||||
@ApiOperation(value = "更新资源")
|
|
||||||
@RequiresPermissions("system:resource:update")
|
|
||||||
public CommonResult<Boolean> update(AdminsResourceUpdateRequest request) {
|
|
||||||
ResourceUpdateDTO updateDTO = AdminsResourceConvert.INSTANCE.convert(request)
|
|
||||||
.setAdminId(AdminSecurityContextHolder.getAdminId());
|
|
||||||
resourceService.updateResource(updateDTO);
|
|
||||||
return CommonResult.success(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
@PostMapping("/delete")
|
|
||||||
@ApiOperation(value = "删除资源")
|
|
||||||
@ApiImplicitParam(name = "id", value = "资源编号", required = true, example = "1")
|
|
||||||
@RequiresPermissions("system:resource:delete")
|
|
||||||
public CommonResult<Boolean> delete(@RequestParam("id") Integer id) {
|
|
||||||
ResourceDeleteDTO deleteDTO = new ResourceDeleteDTO().setId(id)
|
|
||||||
.setAdminId(AdminSecurityContextHolder.getAdminId());
|
|
||||||
resourceService.deleteResource(deleteDTO);
|
|
||||||
return CommonResult.success(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,75 +0,0 @@
|
|||||||
package cn.iocoder.mall.system.rest.controller.authorization;
|
|
||||||
|
|
||||||
import cn.iocoder.common.framework.enums.MallConstants;
|
|
||||||
import cn.iocoder.common.framework.vo.CommonResult;
|
|
||||||
import cn.iocoder.common.framework.vo.PageResult;
|
|
||||||
import cn.iocoder.mall.security.core.annotation.RequiresPermissions;
|
|
||||||
import cn.iocoder.mall.security.core.context.AdminSecurityContextHolder;
|
|
||||||
import cn.iocoder.mall.system.biz.bo.authorization.RoleBO;
|
|
||||||
import cn.iocoder.mall.system.biz.dto.authorization.RoleAddDTO;
|
|
||||||
import cn.iocoder.mall.system.biz.dto.authorization.RoleDeleteDTO;
|
|
||||||
import cn.iocoder.mall.system.biz.dto.authorization.RolePageDTO;
|
|
||||||
import cn.iocoder.mall.system.biz.dto.authorization.RoleUpdateDTO;
|
|
||||||
import cn.iocoder.mall.system.biz.service.authorization.RoleService;
|
|
||||||
import cn.iocoder.mall.system.rest.convert.authorization.AdminsRoleConvert;
|
|
||||||
import cn.iocoder.mall.system.rest.request.authorization.AdminsRoleAddRequest;
|
|
||||||
import cn.iocoder.mall.system.rest.request.authorization.AdminsRolePageRequest;
|
|
||||||
import cn.iocoder.mall.system.rest.request.authorization.AdminsRoleUpdateRequest;
|
|
||||||
import cn.iocoder.mall.system.rest.response.authorization.AdminsRolePageResponse;
|
|
||||||
import io.swagger.annotations.Api;
|
|
||||||
import io.swagger.annotations.ApiImplicitParam;
|
|
||||||
import io.swagger.annotations.ApiOperation;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.web.bind.annotation.*;
|
|
||||||
|
|
||||||
@RestController
|
|
||||||
@RequestMapping(MallConstants.ROOT_PATH_ADMIN + "/role")
|
|
||||||
@Api(tags = "管理员 - 角色 API")
|
|
||||||
public class AdminsRoleController {
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private RoleService roleService;
|
|
||||||
|
|
||||||
@GetMapping("/page")
|
|
||||||
@ApiOperation(value = "角色分页")
|
|
||||||
@RequiresPermissions("system:role:page")
|
|
||||||
public CommonResult<PageResult<AdminsRolePageResponse>> page(AdminsRolePageRequest request) {
|
|
||||||
RolePageDTO pageDTO = AdminsRoleConvert.INSTANCE.convert(request);
|
|
||||||
PageResult<RoleBO> pageResult = roleService.getRolePage(pageDTO);
|
|
||||||
return CommonResult.success(AdminsRoleConvert.INSTANCE.convertPage(pageResult));
|
|
||||||
}
|
|
||||||
|
|
||||||
@PostMapping("/add")
|
|
||||||
@ApiOperation(value = "创建角色")
|
|
||||||
@RequiresPermissions("system:role:add")
|
|
||||||
public CommonResult<Integer> add(AdminsRoleAddRequest request) {
|
|
||||||
RoleAddDTO addDTO = AdminsRoleConvert.INSTANCE.convert(request)
|
|
||||||
.setAdminId(AdminSecurityContextHolder.getAdminId());
|
|
||||||
return CommonResult.success(roleService.addRole(addDTO));
|
|
||||||
}
|
|
||||||
|
|
||||||
@PostMapping("/update")
|
|
||||||
@ApiOperation(value = "更新角色")
|
|
||||||
@RequiresPermissions("system:role:update")
|
|
||||||
public CommonResult<Boolean> update(AdminsRoleUpdateRequest request) {
|
|
||||||
RoleUpdateDTO updateDTO = AdminsRoleConvert.INSTANCE.convert(request)
|
|
||||||
.setAdminId(AdminSecurityContextHolder.getAdminId());
|
|
||||||
roleService.updateRole(updateDTO);
|
|
||||||
return CommonResult.success(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
@PostMapping("/delete")
|
|
||||||
@ApiOperation(value = "删除角色")
|
|
||||||
@RequiresPermissions("system:role:delete")
|
|
||||||
@ApiImplicitParam(name = "id", value = "角色编号", required = true, example = "1")
|
|
||||||
public CommonResult<Boolean> delete(@RequestParam("id") Integer id) {
|
|
||||||
RoleDeleteDTO deleteDTO = new RoleDeleteDTO().setId(id)
|
|
||||||
.setAdminId(AdminSecurityContextHolder.getAdminId());
|
|
||||||
roleService.deleteRole(deleteDTO);
|
|
||||||
return CommonResult.success(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
@ -1,26 +0,0 @@
|
|||||||
package cn.iocoder.mall.system.rest.response.authorization;
|
|
||||||
|
|
||||||
import io.swagger.annotations.ApiModel;
|
|
||||||
import io.swagger.annotations.ApiModelProperty;
|
|
||||||
import lombok.Data;
|
|
||||||
import lombok.experimental.Accessors;
|
|
||||||
|
|
||||||
import java.util.Date;
|
|
||||||
|
|
||||||
@ApiModel("管理员 - 角色模块 - 分页列表 Response")
|
|
||||||
@Data
|
|
||||||
@Accessors(chain = true)
|
|
||||||
public class AdminsRolePageResponse {
|
|
||||||
|
|
||||||
@ApiModelProperty(value = "角色编号", required = true, example = "1")
|
|
||||||
private Integer id;
|
|
||||||
@ApiModelProperty(value = "角色名字", required = true, example = "管理员")
|
|
||||||
private String name;
|
|
||||||
@ApiModelProperty(value = "角色编码", example = "SUPER_ADMIN")
|
|
||||||
private String code;
|
|
||||||
@ApiModelProperty(value = "角色类型", required = true, example = "1-系统角色; 2-内置角色")
|
|
||||||
private Integer type;
|
|
||||||
@ApiModelProperty(value = "创建时间", required = true)
|
|
||||||
private Date createTime;
|
|
||||||
|
|
||||||
}
|
|
@ -1,50 +0,0 @@
|
|||||||
package cn.iocoder.mall.system.rest.response.user;
|
|
||||||
|
|
||||||
import io.swagger.annotations.ApiModel;
|
|
||||||
import io.swagger.annotations.ApiModelProperty;
|
|
||||||
import lombok.Data;
|
|
||||||
import lombok.experimental.Accessors;
|
|
||||||
|
|
||||||
import java.util.Date;
|
|
||||||
|
|
||||||
@ApiModel("用户 - OAuth2 模块 - 认证响应")
|
|
||||||
@Data
|
|
||||||
@Accessors(chain = true)
|
|
||||||
public class UsersOAuth2AuthenticateResponse {
|
|
||||||
|
|
||||||
@Data
|
|
||||||
public static class Token {
|
|
||||||
|
|
||||||
@ApiModelProperty(value = "access token", required = true, example = "001e8f49b20e47f7b3a2de774497cd50")
|
|
||||||
private String accessToken;
|
|
||||||
|
|
||||||
@ApiModelProperty(value = "refresh token", required = true, example = "001e8f49b20e47f7b3a2de774497cd50")
|
|
||||||
private String refreshToken;
|
|
||||||
|
|
||||||
@ApiModelProperty(value = "过期时间", required = true)
|
|
||||||
private Date expiresTime;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Data
|
|
||||||
public static class User {
|
|
||||||
|
|
||||||
@ApiModelProperty(value = "管理员编号", required = true, example = "1")
|
|
||||||
private Integer id;
|
|
||||||
|
|
||||||
@ApiModelProperty(value = "昵称", required = true, example = "小王")
|
|
||||||
private String nickname;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* TODO 晚点测试下 swagger 的表现
|
|
||||||
*/
|
|
||||||
private User user;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* TODO 晚点测试下 swagger 的表现
|
|
||||||
*/
|
|
||||||
private Token token;
|
|
||||||
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user