|
|
@@ -175,19 +175,55 @@ public class PortalManagerImpl extends AbstractCommManager implements PortalMana |
|
|
|
// 目前做法:创建了一个基本角色,可以去给基本角色去进行菜单分配, |
|
|
|
// 每个人在进入小程序的时候会默认分配一个基本角色,然后再去查询,在小程序中该账号是否又分配了其他的角色,并返回这些角色 |
|
|
|
// 每个人在进入APP的时候会默认分配一个基本角色,然后再去查询,在小程序中该账号是否又分配了其他的角色,并返回这些角色 |
|
|
|
|
|
|
|
SourceType loginSource = dto.getOrderSource(); |
|
|
|
String openId = findOpenIdByToken(dto.getAccessToken()); |
|
|
|
SystemType systemType = SystemType.fromCode(dto.getSystemType()); |
|
|
|
if (systemType == null) throw GlyServiceError.BUSINESS_VALIDATE_ERR.toHandleException("系统类型错误"); |
|
|
|
SourceType loginSource = SourceType.findByCode(dto.getLoginSource()); |
|
|
|
if (loginSource == null) throw GlyServiceError.BUSINESS_VALIDATE_ERR.toHandleException("来源错误"); |
|
|
|
List<String> roleIds = accountUserRoleRepo.findRoleByOpenIdAndSystemType(openId, systemType); |
|
|
|
if (isEmpty(roleIds)) |
|
|
|
throw GlyServiceError.BUSINESS_VALIDATE_ERR.toHandleException("该账号在该系统中没有分配角色,无法访问该系统!"); |
|
|
|
if (loginSource == SourceType.SERVICE_HALL) roleIds.add(appBaseRoleId);// APP |
|
|
|
if (loginSource == SourceType.WECHAT) roleIds.add(miniProgramBaseRoleId);// 微信小程序 |
|
|
|
if (loginSource == SourceType.ALI) roleIds.add(zfbMiniProgramBaseRoleId);// 支付宝小程序 |
|
|
|
if (loginSource == SourceType.WEB && roleIds.size() > 1) |
|
|
|
throw GlyServiceError.BUSINESS_VALIDATE_ERR.toHandleException("该账号在一个系统中只能分配一个角色,该账户在该系统中分配了多个角色,暂时无法访问,请联系管理员处理!"); |
|
|
|
// List<AccountUserRole> list = accountUserRoleRepo.getListBySystemTypeAndOpenId(request.getSystemType(), request.getOpenId()); |
|
|
|
|
|
|
|
//1、根据登录来源方,查询该openId和系统类型,对应的系统角色 |
|
|
|
List<AccountUserRole> list = accountUserRoleRepo.getListBySystemTypeAndOpenIdAndLoginSource(systemType, openId, loginSource); |
|
|
|
|
|
|
|
//2、判断登录来源方 |
|
|
|
List<String> roleIds = new ArrayList<>(); |
|
|
|
//将不可变的list转为可变的list |
|
|
|
if (list != null && list.size() > 0) { |
|
|
|
roleIds.addAll(list.stream().map(aur -> aur.getRoleId()).collect(Collectors.toList())); |
|
|
|
} |
|
|
|
|
|
|
|
// TODO 判断app或者小程序中,一次要获取所有角色的所有菜单, |
|
|
|
// 还是先只要一个基本角色的所有菜单, |
|
|
|
// 如果需要切换角色,那么再切换成其他角色即可 |
|
|
|
// 目前是允许app/小程序端返回多个角色 |
|
|
|
|
|
|
|
// (1) APP端 |
|
|
|
if (SourceType.SERVICE_HALL.equals(loginSource) && !roleIds.contains(appBaseRoleId)) { |
|
|
|
roleIds.add(appBaseRoleId); //分配app端的基本角色 |
|
|
|
} |
|
|
|
// (2) 微信小程序端 |
|
|
|
else if (SourceType.WECHAT.equals(loginSource) && !roleIds.contains(miniProgramBaseRoleId)) { |
|
|
|
roleIds.add(miniProgramBaseRoleId); //分配微信小程序端的基本角色 |
|
|
|
} |
|
|
|
// (3) 支付宝小程序端 |
|
|
|
else if (SourceType.ALI.equals(loginSource) && !roleIds.contains(zfbMiniProgramBaseRoleId)) { |
|
|
|
roleIds.add(zfbMiniProgramBaseRoleId); //分配支付宝小程序端的基本角色 |
|
|
|
} |
|
|
|
// (3) WEB端 |
|
|
|
else { |
|
|
|
//(3.1)、判断账号是否分配了系统角色 |
|
|
|
if (list == null || list.size() == 0) { |
|
|
|
throw GlyServiceError.BUSINESS_VALIDATE_ERR.toHandleException("该账号在该系统中没有分配角色,无法访问该系统!"); |
|
|
|
} |
|
|
|
//(3.2)判断该账户是否在一个系统中有多个角色(规则:一个系统只能有一个角色) |
|
|
|
if (list.size() > 1) { |
|
|
|
throw GlyServiceError.BUSINESS_VALIDATE_ERR.toHandleException("该账号在一个系统中只能分配一个角色,该账户在该系统中分配了多个角色,暂时无法访问,请联系管理员处理!"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
//TODO 角色过滤:过滤掉被禁用的角色 |
|
|
|
|
|
|
|
//3、获取该系统角色对应的所有菜单(此处的roleIds一定有值) |
|
|
|
//获取角色-菜单-中间表 |
|
|
|
List<UserRoleUserMenu> userRoleUserMenuList = userRoleUserMenuRepo.getListByRoleIds(roleIds); |
|
|
|
|
|
|
|
//4、获取分好层级的所有菜单 |
|
|
@@ -212,15 +248,14 @@ public class PortalManagerImpl extends AbstractCommManager implements PortalMana |
|
|
|
} |
|
|
|
|
|
|
|
//4.4、获取顶层父菜单 |
|
|
|
pMenuList = menuVoList.stream().filter(m -> 1 == m.getFloor()).collect(Collectors.toList()); |
|
|
|
pMenuList = menuVoList.stream().filter(m -> 1 == m.getFloor()).collect(Collectors.toList());; |
|
|
|
//4.5、顶级父菜单排序 |
|
|
|
pMenuList = pMenuList.stream().sorted((m1, m2) -> m1.getSort() - m2.getSort()).collect(Collectors.toList()); |
|
|
|
pMenuList = pMenuList.stream().sorted((m1, m2) -> m1.getSort() - m2.getSort()).collect(Collectors.toList());; |
|
|
|
//4.5、获取非顶层的父菜单 |
|
|
|
menuVoList = menuVoList.stream().filter(m -> 1 != m.getFloor()).collect(Collectors.toList()); |
|
|
|
menuVoList = menuVoList.stream().filter(m -> 1 != m.getFloor()).collect(Collectors.toList());; |
|
|
|
|
|
|
|
//4.6、为顶层父菜单配置子菜单 |
|
|
|
for (RbacMenuListBySystemTypeAndOpenIdMenuVO pMenu : pMenuList) { |
|
|
|
|
|
|
|
//TODO 目前是通过查询菜单列表的时候,同步把该角色在该菜单对应的权限标识,附在最底层的菜单中 |
|
|
|
//通过递归的方式,设置到最底层的子菜单 |
|
|
|
setSubByRole(pMenu, menuVoList, userRoleUserMenuList); |