From f4146813c1d56fe62fb076fab9f683390f1e3424 Mon Sep 17 00:00:00 2001 From: qiufeng Date: Mon, 29 May 2023 23:11:39 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=BB=84=E7=BB=87=E8=A7=92=E8=89=B2?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/oauth/api/entity/UserRole.java | 2 + .../oauth/controller/SsoOrgController.java | 5 +- .../com/mfish/oauth/mapper/SsoMenuMapper.java | 4 +- .../com/mfish/oauth/mapper/SsoOrgMapper.java | 6 ++ .../com/mfish/oauth/mapper/SsoRoleMapper.java | 1 - .../mfish/oauth/mapper/xml/SsoMenuMapper.xml | 9 ++- .../mfish/oauth/mapper/xml/SsoRoleMapper.xml | 9 +++ .../mfish/oauth/mapper/xml/SsoUserMapper.xml | 65 +++++++++++++++---- .../mfish/oauth/service/SsoOrgService.java | 2 +- .../mfish/oauth/service/SsoRoleService.java | 2 + .../service/impl/SsoMenuServiceImpl.java | 10 +-- .../oauth/service/impl/SsoOrgServiceImpl.java | 23 +++++-- .../service/impl/SsoRoleServiceImpl.java | 10 ++- 13 files changed, 115 insertions(+), 33 deletions(-) diff --git a/mf-api/mf-oauth-api/src/main/java/cn/com/mfish/common/oauth/api/entity/UserRole.java b/mf-api/mf-oauth-api/src/main/java/cn/com/mfish/common/oauth/api/entity/UserRole.java index 04ba9de1..d635d682 100644 --- a/mf-api/mf-oauth-api/src/main/java/cn/com/mfish/common/oauth/api/entity/UserRole.java +++ b/mf-api/mf-oauth-api/src/main/java/cn/com/mfish/common/oauth/api/entity/UserRole.java @@ -20,4 +20,6 @@ public class UserRole { private String roleName; @ApiModelProperty(value = "角色编码") private String roleCode; + @ApiModelProperty(value = "角色来源 0用户 1组织") + private int source; } diff --git a/mf-oauth/src/main/java/cn/com/mfish/oauth/controller/SsoOrgController.java b/mf-oauth/src/main/java/cn/com/mfish/oauth/controller/SsoOrgController.java index cc34124d..d0f25ed8 100644 --- a/mf-oauth/src/main/java/cn/com/mfish/oauth/controller/SsoOrgController.java +++ b/mf-oauth/src/main/java/cn/com/mfish/oauth/controller/SsoOrgController.java @@ -99,10 +99,7 @@ public class SsoOrgController { @DeleteMapping("/{id}") @RequiresPermissions("sys:org:delete") public Result delete(@ApiParam(name = "id", value = "唯一性ID") @PathVariable String id) { - if (ssoOrgService.removeOrg(id)) { - return Result.ok("组织结构表-删除成功!"); - } - return Result.fail("错误:组织结构表-删除失败!"); + return ssoOrgService.removeOrg(id); } /** diff --git a/mf-oauth/src/main/java/cn/com/mfish/oauth/mapper/SsoMenuMapper.java b/mf-oauth/src/main/java/cn/com/mfish/oauth/mapper/SsoMenuMapper.java index 068aa84a..89c322e8 100644 --- a/mf-oauth/src/main/java/cn/com/mfish/oauth/mapper/SsoMenuMapper.java +++ b/mf-oauth/src/main/java/cn/com/mfish/oauth/mapper/SsoMenuMapper.java @@ -17,9 +17,9 @@ import java.util.List; public interface SsoMenuMapper extends BaseMapper { int insertMenu(SsoMenu ssoMenu); - Integer queryMaxMenuLevel(@Param("reqSsoMenu") ReqSsoMenu reqSsoMenu, @Param("userId") String userId); + Integer queryMaxMenuLevel(@Param("reqSsoMenu") ReqSsoMenu reqSsoMenu, @Param("roleIds") List roleIds); - List queryMenu(@Param("reqSsoMenu") ReqSsoMenu reqSsoMenu, @Param("levels") List levels, @Param("userId") String userId); + List queryMenu(@Param("reqSsoMenu") ReqSsoMenu reqSsoMenu, @Param("levels") List levels, @Param("roleIds") List roleIds); /** * 获取按钮权限用户 diff --git a/mf-oauth/src/main/java/cn/com/mfish/oauth/mapper/SsoOrgMapper.java b/mf-oauth/src/main/java/cn/com/mfish/oauth/mapper/SsoOrgMapper.java index 5bf2a613..8883fe91 100644 --- a/mf-oauth/src/main/java/cn/com/mfish/oauth/mapper/SsoOrgMapper.java +++ b/mf-oauth/src/main/java/cn/com/mfish/oauth/mapper/SsoOrgMapper.java @@ -5,6 +5,7 @@ import cn.com.mfish.oauth.req.ReqSsoOrg; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Delete; import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; import java.util.List; @@ -27,4 +28,9 @@ public interface SsoOrgMapper extends BaseMapper { @Delete("delete from sso_org_role where org_id = #{orgId}") int deleteOrgRole(String orgId); + + @Select("select count(0) from sso_org_user where org_id = #{orgId}") + int queryUserCount(String orgId); + @Select("select user_id from sso_org_user where org_id = #{orgId}") + List getOrgUserId(String orgId); } diff --git a/mf-oauth/src/main/java/cn/com/mfish/oauth/mapper/SsoRoleMapper.java b/mf-oauth/src/main/java/cn/com/mfish/oauth/mapper/SsoRoleMapper.java index a192b020..c64480b3 100644 --- a/mf-oauth/src/main/java/cn/com/mfish/oauth/mapper/SsoRoleMapper.java +++ b/mf-oauth/src/main/java/cn/com/mfish/oauth/mapper/SsoRoleMapper.java @@ -28,7 +28,6 @@ public interface SsoRoleMapper extends BaseMapper { * @param roleId * @return */ - @Select("select user_id from sso_user_role where role_id=#{roleId}") List getRoleUser(String roleId); @Select("select menu_id from sso_role_menu where role_id=#{roleId}") diff --git a/mf-oauth/src/main/java/cn/com/mfish/oauth/mapper/xml/SsoMenuMapper.xml b/mf-oauth/src/main/java/cn/com/mfish/oauth/mapper/xml/SsoMenuMapper.xml index 77ddcd4b..5c5f9761 100644 --- a/mf-oauth/src/main/java/cn/com/mfish/oauth/mapper/xml/SsoMenuMapper.xml +++ b/mf-oauth/src/main/java/cn/com/mfish/oauth/mapper/xml/SsoMenuMapper.xml @@ -56,10 +56,13 @@ - + inner join sso_role_menu rm on m.id = rm.menu_id - inner join sso_user_role ur on ur.role_id = rm.role_id and ur.user_id = #{userId} - inner join sso_role r on r.id = ur.role_id and r.status = 0 + and rm.role_id in ( + + #{roleId} + + ) diff --git a/mf-oauth/src/main/java/cn/com/mfish/oauth/mapper/xml/SsoRoleMapper.xml b/mf-oauth/src/main/java/cn/com/mfish/oauth/mapper/xml/SsoRoleMapper.xml index 77d55836..4444272e 100644 --- a/mf-oauth/src/main/java/cn/com/mfish/oauth/mapper/xml/SsoRoleMapper.xml +++ b/mf-oauth/src/main/java/cn/com/mfish/oauth/mapper/xml/SsoRoleMapper.xml @@ -19,4 +19,13 @@ + diff --git a/mf-oauth/src/main/java/cn/com/mfish/oauth/mapper/xml/SsoUserMapper.xml b/mf-oauth/src/main/java/cn/com/mfish/oauth/mapper/xml/SsoUserMapper.xml index be73e33e..ba4919ca 100644 --- a/mf-oauth/src/main/java/cn/com/mfish/oauth/mapper/xml/SsoUserMapper.xml +++ b/mf-oauth/src/main/java/cn/com/mfish/oauth/mapper/xml/SsoUserMapper.xml @@ -18,8 +18,9 @@ @@ -83,7 +124,7 @@ u.del_flag = 0 - and o.id = #{orgId} + and u.org_id = #{orgId} and u.phone like concat('%',#{phone},'%') @@ -98,7 +139,7 @@ and u.status = #{status} - and cu.client_id = #{clientId} + and u.client_id = #{clientId} group by u.id diff --git a/mf-oauth/src/main/java/cn/com/mfish/oauth/service/SsoOrgService.java b/mf-oauth/src/main/java/cn/com/mfish/oauth/service/SsoOrgService.java index bb8da435..2eaa5ff7 100644 --- a/mf-oauth/src/main/java/cn/com/mfish/oauth/service/SsoOrgService.java +++ b/mf-oauth/src/main/java/cn/com/mfish/oauth/service/SsoOrgService.java @@ -21,7 +21,7 @@ public interface SsoOrgService extends IService { List queryOrg(ReqSsoOrg reqSsoOrg); - boolean removeOrg(String id); + Result removeOrg(String id); int insertOrgRole(String orgId, List roles); diff --git a/mf-oauth/src/main/java/cn/com/mfish/oauth/service/SsoRoleService.java b/mf-oauth/src/main/java/cn/com/mfish/oauth/service/SsoRoleService.java index 7b6a7d0f..c2e9f6dc 100644 --- a/mf-oauth/src/main/java/cn/com/mfish/oauth/service/SsoRoleService.java +++ b/mf-oauth/src/main/java/cn/com/mfish/oauth/service/SsoRoleService.java @@ -22,4 +22,6 @@ public interface SsoRoleService extends IService { boolean roleCodeExist(String clientId, String roleId, String roleCode); List getRoleMenus(String roleId); + + void removeUserCache(List userIds, String clientId); } diff --git a/mf-oauth/src/main/java/cn/com/mfish/oauth/service/impl/SsoMenuServiceImpl.java b/mf-oauth/src/main/java/cn/com/mfish/oauth/service/impl/SsoMenuServiceImpl.java index 6254b04e..39f02706 100644 --- a/mf-oauth/src/main/java/cn/com/mfish/oauth/service/impl/SsoMenuServiceImpl.java +++ b/mf-oauth/src/main/java/cn/com/mfish/oauth/service/impl/SsoMenuServiceImpl.java @@ -4,6 +4,7 @@ import cn.com.mfish.common.core.exception.MyRuntimeException; import cn.com.mfish.common.core.utils.AuthInfoUtils; import cn.com.mfish.common.core.utils.StringUtils; import cn.com.mfish.common.core.web.Result; +import cn.com.mfish.common.oauth.common.OauthUtils; import cn.com.mfish.common.redis.common.RedisPrefix; import cn.com.mfish.oauth.cache.temp.UserPermissionTempCache; import cn.com.mfish.oauth.entity.SsoMenu; @@ -47,18 +48,19 @@ public class SsoMenuServiceImpl extends ServiceImpl impl @Override public List queryMenu(ReqSsoMenu reqSsoMenu, String userId) { + List roleIds = new ArrayList<>(); //如果是超户获取所有菜单 - if (AuthInfoUtils.isSuper(userId)) { - userId = null; + if (!AuthInfoUtils.isSuper(userId)) { + roleIds = OauthUtils.getRoles().stream().map((role)->role.getId()).collect(Collectors.toList()); } - Integer level = baseMapper.queryMaxMenuLevel(reqSsoMenu, userId); + Integer level = baseMapper.queryMaxMenuLevel(reqSsoMenu, roleIds); List list = new ArrayList<>(); if (level != null) { for (int i = 1; i < level; i++) { list.add(i); } } - List menus = baseMapper.queryMenu(reqSsoMenu, list, userId); + List menus = baseMapper.queryMenu(reqSsoMenu, list, roleIds); //菜单节点是从底部往上寻找,如果权限只设置了子节点,父节点并未存储 //所以根据菜单类型展示时,先全部查出后再过滤不需要的类型 if (reqSsoMenu.getMenuType() != null) { diff --git a/mf-oauth/src/main/java/cn/com/mfish/oauth/service/impl/SsoOrgServiceImpl.java b/mf-oauth/src/main/java/cn/com/mfish/oauth/service/impl/SsoOrgServiceImpl.java index 859b5387..3c7ba589 100644 --- a/mf-oauth/src/main/java/cn/com/mfish/oauth/service/impl/SsoOrgServiceImpl.java +++ b/mf-oauth/src/main/java/cn/com/mfish/oauth/service/impl/SsoOrgServiceImpl.java @@ -10,12 +10,14 @@ import cn.com.mfish.common.oauth.api.entity.SsoOrg; import cn.com.mfish.oauth.mapper.SsoOrgMapper; import cn.com.mfish.oauth.req.ReqSsoOrg; import cn.com.mfish.oauth.service.SsoOrgService; +import cn.com.mfish.oauth.service.SsoRoleService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import javax.annotation.Resource; import java.text.MessageFormat; import java.util.ArrayList; import java.util.List; @@ -30,6 +32,8 @@ import java.util.stream.Collectors; @Service @Slf4j public class SsoOrgServiceImpl extends ServiceImpl implements SsoOrgService { + @Resource + SsoRoleService ssoRoleService; @Override @Transactional @@ -80,10 +84,12 @@ public class SsoOrgServiceImpl extends ServiceImpl impleme success = true; } if (success) { - if (null != ssoOrg.getRoleIds()) { - baseMapper.deleteOrgRole(ssoOrg.getId()); + log.info(MessageFormat.format("删除组织角色数量:{0}条", baseMapper.deleteOrgRole(ssoOrg.getId()))); + if (null != ssoOrg.getRoleIds() && !ssoOrg.getRoleIds().isEmpty()) { insertOrgRole(ssoOrg.getId(), ssoOrg.getRoleIds()); } + List userIds = baseMapper.getOrgUserId(ssoOrg.getId()); + ssoRoleService.removeUserCache(userIds, ssoOrg.getClientId()); return Result.ok(ssoOrg, "组织编辑成功!"); } throw new MyRuntimeException("错误:更新组织失败"); @@ -136,13 +142,20 @@ public class SsoOrgServiceImpl extends ServiceImpl impleme } @Override - public boolean removeOrg(String id) { + public Result removeOrg(String id) { + if (StringUtils.isEmpty(id)) { + return Result.fail(false, "错误:组织ID不允许为空"); + } + int count = baseMapper.queryUserCount(id); + if (count > 0) { + return Result.fail(false, "错误:组织下存在用户,请先移出用户"); + } if (baseMapper.updateById(new SsoOrg().setId(id).setDelFlag(1)) == 1) { log.info(MessageFormat.format("删除组织成功,组织ID:{0}", id)); - return true; + return Result.ok("删除组织成功"); } log.error(MessageFormat.format("删除组织失败,组织ID:{0}", id)); - return false; + return Result.fail("错误:删除组织失败"); } @Override diff --git a/mf-oauth/src/main/java/cn/com/mfish/oauth/service/impl/SsoRoleServiceImpl.java b/mf-oauth/src/main/java/cn/com/mfish/oauth/service/impl/SsoRoleServiceImpl.java index 7c604416..737b7c54 100644 --- a/mf-oauth/src/main/java/cn/com/mfish/oauth/service/impl/SsoRoleServiceImpl.java +++ b/mf-oauth/src/main/java/cn/com/mfish/oauth/service/impl/SsoRoleServiceImpl.java @@ -112,9 +112,17 @@ public class SsoRoleServiceImpl extends ServiceImpl impl private void removeRoleCache(String roleId, String clientId) { //查询角色对应的用户并删除角色权限缓存 List list = baseMapper.getRoleUser(roleId); + removeUserCache(list, clientId); + } + + @Override + public void removeUserCache(List userIds, String clientId) { + if (userIds == null || userIds.isEmpty()) { + return; + } List roleKeys = new ArrayList<>(); List permissionKeys = new ArrayList<>(); - for (String userId : list) { + for (String userId : userIds) { roleKeys.add(RedisPrefix.buildUser2RolesKey(userId, clientId)); permissionKeys.add(RedisPrefix.buildUser2PermissionsKey(userId, clientId)); }