qiubh il y a 1 mois
Parent
révision
03bde1bc31

+ 50
- 15
zhywpt-app-iaw/src/main/java/cn/com/taiji/iaw/manager/portal/PortalManagerImpl.java Voir le fichier

@@ -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);

Chargement…
Annuler
Enregistrer