|
@@ -0,0 +1,210 @@
|
|
|
+package org.jeecg.common.system.service.impl;
|
|
|
+
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.jeecg.common.aspect.UrlMatchEnum;
|
|
|
+import org.jeecg.common.constant.CacheConstant;
|
|
|
+import org.jeecg.common.constant.CommonConstant;
|
|
|
+import org.jeecg.common.system.entity.*;
|
|
|
+import org.jeecg.common.system.mapper.CoreMapper;
|
|
|
+import org.jeecg.common.system.mapper.CorePermissionMapper;
|
|
|
+import org.jeecg.common.system.service.ICoreService;
|
|
|
+import org.jeecg.common.system.vo.LoginUser;
|
|
|
+import org.jeecg.common.system.vo.SysPermissionDataRuleModel;
|
|
|
+import org.jeecg.common.system.vo.SysUserCacheInfo;
|
|
|
+import org.jeecg.common.util.oConvertUtils;
|
|
|
+import org.springframework.beans.BeanUtils;
|
|
|
+import org.springframework.cache.annotation.Cacheable;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.util.AntPathMatcher;
|
|
|
+import org.springframework.util.PathMatcher;
|
|
|
+
|
|
|
+import javax.annotation.Resource;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.HashSet;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Set;
|
|
|
+
|
|
|
+/**
|
|
|
+ * <p>
|
|
|
+ * 字典表 服务实现类
|
|
|
+ * </p>
|
|
|
+ *
|
|
|
+ * @Author zhangweijian
|
|
|
+ * @since 2018-12-28
|
|
|
+ */
|
|
|
+@Service
|
|
|
+@Slf4j
|
|
|
+public class CoreServiceImpl extends ServiceImpl<CoreMapper, SysDict> implements ICoreService {
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private CoreMapper coreMapper;
|
|
|
+ @Resource
|
|
|
+ private CorePermissionMapper corePermissionMapper;
|
|
|
+ /**
|
|
|
+ * 通过查询指定code 获取字典值text
|
|
|
+ * @param code
|
|
|
+ * @param key
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public String queryDictTextByKey(String code, String key,String extendsKey,String extendsValue) {
|
|
|
+ return coreMapper.queryDictTextByKey(code, key,extendsKey,extendsValue);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 通过查询指定table的 text code 获取字典值text
|
|
|
+ * dictTableCache采用redis缓存有效期10分钟
|
|
|
+ * @param table
|
|
|
+ * @param text
|
|
|
+ * @param code
|
|
|
+ * @param key
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public String queryTableDictTextByKey(String table,String text,String code, String key,String extendsKey,String extendsValue) {
|
|
|
+ return coreMapper.queryTableDictTextByKey(table,text,code,key,extendsKey,extendsValue);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<SysPermissionDataRuleModel> queryPermissionDataRule(String component, String requestPath, String username) {
|
|
|
+ List<SysPermission> currentSyspermission = null;
|
|
|
+ if(oConvertUtils.isNotEmpty(component)) {
|
|
|
+ //1.通过注解属性pageComponent 获取菜单
|
|
|
+ LambdaQueryWrapper<SysPermission> query = new LambdaQueryWrapper<SysPermission>();
|
|
|
+ query.eq(SysPermission::getDelFlag,0);
|
|
|
+ query.eq(SysPermission::getComponent, component);
|
|
|
+ currentSyspermission = corePermissionMapper.selectList(query);
|
|
|
+ }else {
|
|
|
+ //1.直接通过前端请求地址查询菜单
|
|
|
+ LambdaQueryWrapper<SysPermission> query = new LambdaQueryWrapper<SysPermission>();
|
|
|
+ query.eq(SysPermission::getMenuType,2);
|
|
|
+ query.eq(SysPermission::getDelFlag,0);
|
|
|
+ query.eq(SysPermission::getUrl, requestPath);
|
|
|
+ currentSyspermission = corePermissionMapper.selectList(query);
|
|
|
+ //2.未找到 再通过自定义匹配URL 获取菜单
|
|
|
+ if(currentSyspermission==null || currentSyspermission.size()==0) {
|
|
|
+ //通过自定义URL匹配规则 获取菜单(实现通过菜单配置数据权限规则,实际上针对获取数据接口进行数据规则控制)
|
|
|
+ String userMatchUrl = UrlMatchEnum.getMatchResultByUrl(requestPath);
|
|
|
+ LambdaQueryWrapper<SysPermission> queryQserMatch = new LambdaQueryWrapper<SysPermission>();
|
|
|
+ queryQserMatch.eq(SysPermission::getMenuType, 1);
|
|
|
+ queryQserMatch.eq(SysPermission::getDelFlag, 0);
|
|
|
+ queryQserMatch.eq(SysPermission::getUrl, userMatchUrl);
|
|
|
+ if(oConvertUtils.isNotEmpty(userMatchUrl)){
|
|
|
+ currentSyspermission = corePermissionMapper.selectList(queryQserMatch);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //3.未找到 再通过正则匹配获取菜单
|
|
|
+ if(currentSyspermission==null || currentSyspermission.size()==0) {
|
|
|
+ //通过正则匹配权限配置
|
|
|
+ String regUrl = getRegexpUrl(requestPath);
|
|
|
+ if(regUrl!=null) {
|
|
|
+ currentSyspermission = corePermissionMapper.selectList(new LambdaQueryWrapper<SysPermission>().eq(SysPermission::getMenuType,2).eq(SysPermission::getUrl, regUrl).eq(SysPermission::getDelFlag,0));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(currentSyspermission!=null && currentSyspermission.size()>0){
|
|
|
+ List<SysPermissionDataRuleModel> dataRules = new ArrayList<SysPermissionDataRuleModel>();
|
|
|
+ for (SysPermission sysPermission : currentSyspermission) {
|
|
|
+ // update-begin--Author:scott Date:20191119 for:数据权限规则编码不规范,项目存在相同包名和类名 #722
|
|
|
+ List<SysPermissionDataRule> temp = queryPermissionDataRules(username, sysPermission.getId());
|
|
|
+ if(temp!=null && temp.size()>0) {
|
|
|
+ //dataRules.addAll(temp);
|
|
|
+ dataRules = oConvertUtils.entityListToModelList(temp,SysPermissionDataRuleModel.class);
|
|
|
+ }
|
|
|
+ // update-end--Author:scott Date:20191119 for:数据权限规则编码不规范,项目存在相同包名和类名 #722
|
|
|
+ }
|
|
|
+ return dataRules;
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 匹配前端传过来的地址 匹配成功返回正则地址
|
|
|
+ * AntPathMatcher匹配地址
|
|
|
+ *()* 匹配0个或多个字符
|
|
|
+ *()**匹配0个或多个目录
|
|
|
+ */
|
|
|
+ private String getRegexpUrl(String url) {
|
|
|
+ List<String> list = corePermissionMapper.queryPermissionUrlWithStar();
|
|
|
+ if(list!=null && list.size()>0) {
|
|
|
+ for (String p : list) {
|
|
|
+ PathMatcher matcher = new AntPathMatcher();
|
|
|
+ if(matcher.match(p, url)) {
|
|
|
+ return p;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ public List<SysPermissionDataRule> queryPermissionDataRules(String username,String permissionId) {
|
|
|
+ List<String> idsList = coreMapper.queryDataRuleIds(username, permissionId);
|
|
|
+ //update-begin--Author:scott Date:20191119 for:数据权限失效问题处理--------------------
|
|
|
+ if(idsList==null || idsList.size()==0) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ //update-end--Author:scott Date:20191119 for:数据权限失效问题处理--------------------
|
|
|
+ List<String> idList = new ArrayList<>();
|
|
|
+ for (String ids : idsList) {
|
|
|
+ if(oConvertUtils.isEmpty(ids)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ String[] arr = ids.split(",");
|
|
|
+ for (String id : arr) {
|
|
|
+ if(oConvertUtils.isNotEmpty(id)) {
|
|
|
+ idList.add(id);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(idList.size()==0) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ return coreMapper.selectSysPermissionDataRuleList(idList,1);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public SysUserCacheInfo getCacheUser(String username) {
|
|
|
+ SysUserCacheInfo info = new SysUserCacheInfo();
|
|
|
+ info.setOneDepart(true);
|
|
|
+ LoginUser user = this.getUserByName(username);
|
|
|
+ if(user!=null) {
|
|
|
+ info.setSysUserCode(user.getUsername());
|
|
|
+ info.setSysUserName(user.getRealname());
|
|
|
+ info.setSysOrgCode(user.getOrgCode());
|
|
|
+ }
|
|
|
+ //多部门支持in查询
|
|
|
+ List<SysDepart> list = coreMapper.queryUserDeparts(user.getId());
|
|
|
+ List<String> sysMultiOrgCode = new ArrayList<String>();
|
|
|
+ if(list==null || list.size()==0) {
|
|
|
+ //当前用户无部门
|
|
|
+ //sysMultiOrgCode.add("0");
|
|
|
+ }else if(list.size()==1) {
|
|
|
+ sysMultiOrgCode.add(list.get(0).getOrgCode());
|
|
|
+ }else {
|
|
|
+ info.setOneDepart(false);
|
|
|
+ for (SysDepart dpt : list) {
|
|
|
+ sysMultiOrgCode.add(dpt.getOrgCode());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ info.setSysMultiOrgCode(sysMultiOrgCode);
|
|
|
+ return info;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Cacheable(cacheNames= CacheConstant.SYS_USERS_CACHE, key="#username")
|
|
|
+ public LoginUser getUserByName(String username) {
|
|
|
+ if(oConvertUtils.isEmpty(username)) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ LoginUser loginUser = new LoginUser();
|
|
|
+ SysUser sysUser = coreMapper.getUserByName(username);
|
|
|
+ if(sysUser==null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ BeanUtils.copyProperties(sysUser, loginUser);
|
|
|
+ return loginUser;
|
|
|
+ }
|
|
|
+}
|