@@ -7,10 +7,7 @@ import cc.smtweb.framework.core.common.SwConsts; | |||||
import cc.smtweb.framework.core.db.DbEngine; | import cc.smtweb.framework.core.db.DbEngine; | ||||
import cc.smtweb.framework.core.db.EntityDao; | import cc.smtweb.framework.core.db.EntityDao; | ||||
import java.util.ArrayList; | |||||
import java.util.Comparator; | |||||
import java.util.List; | |||||
import java.util.Set; | |||||
import java.util.*; | |||||
/** | /** | ||||
* Created by Akmm at 2022/1/12 18:34 | * Created by Akmm at 2022/1/12 18:34 | ||||
@@ -102,4 +99,12 @@ public class ModelFormCache extends AbstractEntityCache<ModelForm> { | |||||
public ModelForm getByPageName(String pageName) { | public ModelForm getByPageName(String pageName) { | ||||
return getByKey(mn, pageName.toUpperCase()); | return getByKey(mn, pageName.toUpperCase()); | ||||
} | } | ||||
// 获取包含本页面的模块下的所有页面 | |||||
public Set<ModelForm> getIncPage(long pageId){ | |||||
ModelForm form = get(pageId); | |||||
if(form==null || form.getParent()<=0L){ | |||||
return null; | |||||
} | |||||
return getListByModule(form.getParent()); | |||||
} | |||||
} | } |
@@ -21,6 +21,8 @@ import cc.smtweb.system.bpm.web.design.db.ModelCatalogCache; | |||||
import cc.smtweb.system.bpm.web.design.db.ModelProjectCache; | import cc.smtweb.system.bpm.web.design.db.ModelProjectCache; | ||||
import cc.smtweb.system.bpm.web.design.form.define.*; | import cc.smtweb.system.bpm.web.design.form.define.*; | ||||
import cc.smtweb.system.bpm.web.engine.flow.entity.Comment; | import cc.smtweb.system.bpm.web.engine.flow.entity.Comment; | ||||
import cc.smtweb.system.bpm.web.sys.user.menuPlan.MenuPlanHelper; | |||||
import cc.smtweb.system.bpm.web.sys.user.role.RoleHelper; | |||||
import com.fasterxml.jackson.core.JsonProcessingException; | import com.fasterxml.jackson.core.JsonProcessingException; | ||||
import org.apache.commons.lang3.StringUtils; | import org.apache.commons.lang3.StringUtils; | ||||
@@ -293,6 +295,13 @@ public class ModelFormHelper { | |||||
ret.put("label", form.getTitle()); | ret.put("label", form.getTitle()); | ||||
ret.put("service", service); | ret.put("service", service); | ||||
ret.put("module", ModelProjectCache.getInstance().getModule(form.getPrjId())); | ret.put("module", ModelProjectCache.getInstance().getModule(form.getPrjId())); | ||||
// 加载权限 | |||||
long menuId = params.readLong("menuId"); | |||||
String fullPath = params.readString("fullPath"); | |||||
long findMenuId = MenuPlanHelper.findMenuId(menuId,form.getId(),fullPath); | |||||
Map<String,Object> permission = RoleHelper.getFuncAndFieldRight(us.getUserId(),us.getPartyId(),findMenuId); | |||||
ret.put("menuId",findMenuId>0L? findMenuId: menuId); | |||||
ret.put("permission",permission); | |||||
buildOptsEx(form, ret); | buildOptsEx(form, ret); | ||||
//form不用管 | //form不用管 | ||||
if (pageInfo.form != null) ret.put("form", pageInfo.form); | if (pageInfo.form != null) ret.put("form", pageInfo.form); | ||||
@@ -4,6 +4,8 @@ import cc.smtweb.framework.core.db.DbEngine; | |||||
import cc.smtweb.framework.core.exception.BizException; | import cc.smtweb.framework.core.exception.BizException; | ||||
import cc.smtweb.framework.core.util.CommUtil; | import cc.smtweb.framework.core.util.CommUtil; | ||||
import cc.smtweb.framework.core.util.JsonUtil; | import cc.smtweb.framework.core.util.JsonUtil; | ||||
import cc.smtweb.system.bpm.web.sys.user.menu.Menu; | |||||
import cc.smtweb.system.bpm.web.sys.user.menu.MenuCache; | |||||
import java.util.ArrayList; | import java.util.ArrayList; | ||||
import java.util.Collections; | import java.util.Collections; | ||||
@@ -138,6 +140,23 @@ public class MenuPlanContent { | |||||
findHome(item.getChildren(),homeList); | findHome(item.getChildren(),homeList); | ||||
} | } | ||||
} | } | ||||
// 查询指定页面 | |||||
public void findPage(long pageId,List<MenuPlanItem> pageList){ | |||||
findPage(list,pageList,pageId); | |||||
} | |||||
// 查询指定页面 | |||||
private void findPage(List<MenuPlanItem> source,List<MenuPlanItem> pageList,long pageId){ | |||||
if(CommUtil.isEmpty(source))return; | |||||
for(MenuPlanItem item: source){ | |||||
if(item.getMenu()>0L){ | |||||
Menu menu = MenuCache.getInstance().get(item.getMenu()); | |||||
if(menu!=null&& menu.getPageId().equalsIgnoreCase(String.valueOf(pageId))){ | |||||
pageList.add(item); | |||||
} | |||||
} | |||||
findPage(item.getChildren(),pageList,pageId); | |||||
} | |||||
} | |||||
private MenuPlanItem findById(long id, List<MenuPlanItem> itemList) { | private MenuPlanItem findById(long id, List<MenuPlanItem> itemList) { | ||||
if (CommUtil.isEmpty(itemList)) { | if (CommUtil.isEmpty(itemList)) { | ||||
return null; | return null; | ||||
@@ -1,5 +1,12 @@ | |||||
package cc.smtweb.system.bpm.web.sys.user.menuPlan; | package cc.smtweb.system.bpm.web.sys.user.menuPlan; | ||||
import cc.smtweb.framework.core.util.CommUtil; | |||||
import cc.smtweb.framework.core.util.StringUtil; | |||||
import cc.smtweb.system.bpm.web.design.form.ModelForm; | |||||
import cc.smtweb.system.bpm.web.design.form.ModelFormCache; | |||||
import java.util.*; | |||||
/** | /** | ||||
* @Author: tanghp | * @Author: tanghp | ||||
* @Date: 2022-09-26 10:19 | * @Date: 2022-09-26 10:19 | ||||
@@ -13,9 +20,120 @@ public class MenuPlanHelper { | |||||
* @param fullPath 带参数的路径 | * @param fullPath 带参数的路径 | ||||
* @return | * @return | ||||
*/ | */ | ||||
public long findMenuId(long menuId,long pageId,String fullPath){ | |||||
// | |||||
public static long findMenuId(long menuId,long pageId,String fullPath){ | |||||
MenuPlanItemProvider.MenuPlanItem2 mItem = MenuPlanItemProvider.getInstance().getMenuPlanItem(menuId); | |||||
if(mItem==null)return 0L; | |||||
// 1、如果是本页面的菜单 直接返回菜单ID | |||||
if(mItem.getPageId() == pageId){ | |||||
return menuId; | |||||
} | |||||
// 获取本菜单对应的模块包含的所有页面 | |||||
Set<ModelForm> children = ModelFormCache.getInstance().getIncPage(mItem.getPageId()); | |||||
if(!CommUtil.isEmpty(children)){ | |||||
for(ModelForm form : children){ | |||||
//2、本页属于本菜单模块的子页面 也返回该菜单 | |||||
if(form.getId() == pageId){ | |||||
return menuId; | |||||
} | |||||
} | |||||
} | |||||
// 获取包含本页面的所有的菜单 | |||||
List<MenuPlanItemProvider.MenuPlanItem2> pItems = findItemIncPage(mItem.getMpId(),pageId); | |||||
// 解析fullPath | |||||
UrlPath urlPath = new UrlPath(fullPath); | |||||
Map<Long, Map<String,Integer>> countMap = new HashMap<>(); | |||||
for(MenuPlanItemProvider.MenuPlanItem2 item: pItems){ | |||||
Map<String,Integer> map = new HashMap<>(); | |||||
map.put("total",item.getParameterNames().size()); | |||||
map.put("count",0); | |||||
item.getParameterNames().forEach(name->{ | |||||
if(urlPath.getParamNames().contains(name)){ | |||||
map.put("count",map.get("count")+1); | |||||
} | |||||
}); | |||||
countMap.put(item.getId(),map); | |||||
// 3.参数总个数和命中个数 和配置一致直接返回 | |||||
if(map.get("total").intValue() == map.get("count").intValue()&& map.get("count")==urlPath.paramNames.size()){ | |||||
return item.getId(); | |||||
} | |||||
} | |||||
// 记录最大命中数的菜单 | |||||
int count = 0; | |||||
long rtMenuId=0L; | |||||
for(Map.Entry<Long,Map<String,Integer>> item: countMap.entrySet()){ | |||||
// 4、参数命中个数 和 url的参数个数一致 也返回 | |||||
if(item.getValue().get("count")==urlPath.paramNames.size()){ | |||||
return item.getKey(); | |||||
} | |||||
// 找最大命中数的菜单 | |||||
if(count<item.getValue().get("count")){ | |||||
count = item.getValue().get("count"); | |||||
rtMenuId = item.getKey(); | |||||
} | |||||
} | |||||
// 5.返回最大命中数的菜单 | |||||
return rtMenuId; | |||||
} | |||||
/** | |||||
* 获取包含指定页面的所有明细 | |||||
* @param mpId 菜单方案ID | |||||
* @param pageId 页面ID | |||||
* @return 明细集合 | |||||
*/ | |||||
public static List<MenuPlanItemProvider.MenuPlanItem2> findItemIncPage(long mpId, long pageId){ | |||||
MenuPlan menuPlan = MenuPlanCache.getInstance().get(mpId); | |||||
if(menuPlan==null){ | |||||
return new ArrayList<>(); | |||||
} | |||||
List<MenuPlanItemProvider.MenuPlanItem2> rtList = new ArrayList<>(); | |||||
List<MenuPlanItem> tempList = new ArrayList<>(); | |||||
MenuPlanContent menuPlanContent = new MenuPlanContent(menuPlan.getContent()); | |||||
menuPlanContent.findPage(pageId,tempList); | |||||
tempList.forEach(item->{ | |||||
MenuPlanItemProvider.MenuPlanItem2 bean = new MenuPlanItemProvider.MenuPlanItem2(); | |||||
bean.getData().putAll(item.getData()); | |||||
bean.setMpId(mpId); | |||||
}); | |||||
return rtList; | |||||
} | |||||
static class UrlPath{ | |||||
private String path; | |||||
private Set<String> paramNames = new HashSet<>(); | |||||
public UrlPath(String urlPath) { | |||||
String[] array = urlPath.split("\\?"); | |||||
if(array.length>0){ | |||||
path = array[0]; | |||||
} | |||||
if(array.length>1){ | |||||
String[] pArray = array[1].split("&"); | |||||
for(String p1 : pArray){ | |||||
String[] param = p1.split("="); | |||||
if(param.length>0){ | |||||
String p = param[0]; | |||||
if(StringUtil.isNotEmpty(p)){ | |||||
paramNames.add(p); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} | |||||
public String getPath() { | |||||
return path; | |||||
} | |||||
public void setPath(String path) { | |||||
this.path = path; | |||||
} | |||||
public Set<String> getParamNames() { | |||||
return paramNames; | |||||
} | |||||
return 0L; | |||||
public void setParamNames(Set<String> paramNames) { | |||||
this.paramNames = paramNames; | |||||
} | |||||
} | } | ||||
} | } |
@@ -1,11 +1,10 @@ | |||||
package cc.smtweb.system.bpm.web.sys.user.menuPlan; | package cc.smtweb.system.bpm.web.sys.user.menuPlan; | ||||
import cc.smtweb.framework.core.cache.SessionCacheFactory; | |||||
import cc.smtweb.framework.core.util.CommUtil; | import cc.smtweb.framework.core.util.CommUtil; | ||||
import cc.smtweb.system.bpm.web.sys.user.menu.Menu; | |||||
import cc.smtweb.system.bpm.web.sys.user.menu.MenuCache; | |||||
import java.util.Collection; | |||||
import java.util.HashMap; | |||||
import java.util.Map; | |||||
import java.util.*; | |||||
/** | /** | ||||
* @Author: tanghp | * @Author: tanghp | ||||
@@ -13,33 +12,70 @@ import java.util.Map; | |||||
* @Desc: 菜单明细加载类 | * @Desc: 菜单明细加载类 | ||||
*/ | */ | ||||
public class MenuPlanItemProvider { | public class MenuPlanItemProvider { | ||||
private volatile MenuPlanItemProvider provider; | |||||
private Map<Long, MenuPlanItem> map = new HashMap<>(); | |||||
private Map<Long, MenuPlanItem2> map = new HashMap<>(); | |||||
private MenuPlanItemProvider() { | private MenuPlanItemProvider() { | ||||
} | } | ||||
public MenuPlanItemProvider getInstance(){ | |||||
if (provider == null) { | |||||
synchronized (SessionCacheFactory.class) { | |||||
if (provider == null) { | |||||
provider = new MenuPlanItemProvider(); | |||||
} | |||||
} | |||||
} | |||||
return provider; | |||||
public static MenuPlanItemProvider getInstance(){ | |||||
return ProviderHolder.provider; | |||||
} | } | ||||
// 获取菜单方案明细ID | // 获取菜单方案明细ID | ||||
public MenuPlanItem getMenuPlanItem(long menuId){ | |||||
MenuPlanItem menuPlanItem = map.get(menuId); | |||||
public MenuPlanItem2 getMenuPlanItem(long menuId){ | |||||
MenuPlanItem2 menuPlanItem = map.get(menuId); | |||||
if(menuPlanItem!=null)return menuPlanItem; | if(menuPlanItem!=null)return menuPlanItem; | ||||
Collection<MenuPlan> plans = MenuPlanCache.getInstance().getAll(); | Collection<MenuPlan> plans = MenuPlanCache.getInstance().getAll(); | ||||
if(CommUtil.isEmpty(plans))return null; | if(CommUtil.isEmpty(plans))return null; | ||||
for(MenuPlan menuPlan: plans){ | for(MenuPlan menuPlan: plans){ | ||||
menuPlanItem = MenuPlanCache.getInstance().getById(menuPlan.getEntityId(),menuId); | |||||
if(menuPlanItem!=null){ | |||||
MenuPlanItem item = MenuPlanCache.getInstance().getById(menuPlan.getEntityId(),menuId); | |||||
if(item!=null){ | |||||
menuPlanItem = new MenuPlanItem2(); | |||||
menuPlanItem.getData().putAll(item.getData()); | |||||
menuPlanItem.setMpId(menuPlan.getEntityId()); | |||||
map.put(menuId,menuPlanItem); | map.put(menuId,menuPlanItem); | ||||
return menuPlanItem; | return menuPlanItem; | ||||
} | } | ||||
} | } | ||||
return null; | return null; | ||||
} | } | ||||
private static final class ProviderHolder { | |||||
static final MenuPlanItemProvider provider = new MenuPlanItemProvider(); | |||||
} | |||||
public static class MenuPlanItem2 extends MenuPlanItem{ | |||||
// 获取菜单方案ID | |||||
public long getMpId(){ | |||||
return getLong("mp_id"); | |||||
} | |||||
public void setMpId(long mp_id){ | |||||
put("mp_id",mp_id); | |||||
} | |||||
// 获取页面ID | |||||
public long getPageId(){ | |||||
if(getMenu()>0L){ | |||||
Menu menu = MenuCache.getInstance().get(getMenu()); | |||||
if(menu!=null){ | |||||
return Long.parseLong(menu.getPageId()); | |||||
} | |||||
} | |||||
return 0L; | |||||
} | |||||
// 获取路径的参数name | |||||
public Set<String> getParameterNames(){ | |||||
Set<String> rtSet = new HashSet<>(); | |||||
if(getMenu()>0L){ | |||||
Menu menu = MenuCache.getInstance().get(getMenu()); | |||||
if(menu!=null){ | |||||
String urlPath = menu.getPath(); | |||||
rtSet = getNamesByPath(urlPath); | |||||
} | |||||
} | |||||
return rtSet; | |||||
} | |||||
private Set<String> getNamesByPath(String url){ | |||||
MenuPlanHelper.UrlPath urlPath = new MenuPlanHelper.UrlPath(url); | |||||
return urlPath.getParamNames(); | |||||
} | |||||
} | |||||
} | } |
@@ -1,17 +1,16 @@ | |||||
package cc.smtweb.system.bpm.web.sys.user.role; | package cc.smtweb.system.bpm.web.sys.user.role; | ||||
import cc.smtweb.framework.core.util.CommUtil; | |||||
import cc.smtweb.system.bpm.web.sys.user.dataRight.DataRightDefine; | import cc.smtweb.system.bpm.web.sys.user.dataRight.DataRightDefine; | ||||
import cc.smtweb.system.bpm.web.sys.user.dataRight.DataRightDefineCache; | import cc.smtweb.system.bpm.web.sys.user.dataRight.DataRightDefineCache; | ||||
import cc.smtweb.system.bpm.web.sys.user.dataRightGroup.DataRightGroup; | import cc.smtweb.system.bpm.web.sys.user.dataRightGroup.DataRightGroup; | ||||
import cc.smtweb.system.bpm.web.sys.user.dataRightGroup.DataRightGroupCache; | import cc.smtweb.system.bpm.web.sys.user.dataRightGroup.DataRightGroupCache; | ||||
import cc.smtweb.system.bpm.web.sys.user.menuPlan.MenuPlan; | |||||
import cc.smtweb.system.bpm.web.sys.user.menuPlan.MenuPlanCache; | |||||
import cc.smtweb.system.bpm.web.sys.user.menuPlan.MenuPlanContent; | |||||
import cc.smtweb.system.bpm.web.sys.user.menuPlan.MenuPlanItem; | |||||
import cc.smtweb.system.bpm.web.sys.user.menuPlan.*; | |||||
import cc.smtweb.system.bpm.web.sys.user.user.User; | import cc.smtweb.system.bpm.web.sys.user.user.User; | ||||
import cc.smtweb.system.bpm.web.sys.user.user.UserCache; | import cc.smtweb.system.bpm.web.sys.user.user.UserCache; | ||||
import cc.smtweb.system.bpm.web.sys.user.user.UserRoleCache; | import cc.smtweb.system.bpm.web.sys.user.user.UserRoleCache; | ||||
import javax.print.DocFlavor; | |||||
import java.util.*; | import java.util.*; | ||||
/** | /** | ||||
@@ -134,17 +133,16 @@ public final class RoleHelper { | |||||
* 获取用户指定类型的数据权限组 | * 获取用户指定类型的数据权限组 | ||||
* @param userId 用户ID | * @param userId 用户ID | ||||
* @param partyId 登录的单位 | * @param partyId 登录的单位 | ||||
* @param menuId 菜单ID | |||||
* @param menuId 菜单明细ID | |||||
* @param dsType 数据权限类型编码 | * @param dsType 数据权限类型编码 | ||||
* @return 数据权限组集合 | * @return 数据权限组集合 | ||||
*/ | */ | ||||
public static Set<DataRightGroup> getDataRightGroup(long userId,long partyId,long menuId,String dsType){ | public static Set<DataRightGroup> getDataRightGroup(long userId,long partyId,long menuId,String dsType){ | ||||
Set<Long> mpIds = getMenuPlanIds(userId,partyId); | |||||
if(mpIds.size()==0){ | |||||
MenuPlanItemProvider.MenuPlanItem2 menuPlanItem2 =MenuPlanItemProvider.getInstance().getMenuPlanItem(menuId); | |||||
if(menuPlanItem2 ==null){ | |||||
return new HashSet<>(); | return new HashSet<>(); | ||||
} | } | ||||
// 没传菜单方案ID,随机取一个菜单方案 | |||||
return getDataRightGroup(userId,partyId,menuId,dsType,mpIds.iterator().next()); | |||||
return getDataRightGroup(userId,partyId,menuId,dsType,menuPlanItem2.getMpId()); | |||||
} | } | ||||
/** | /** | ||||
@@ -179,4 +177,66 @@ public final class RoleHelper { | |||||
}); | }); | ||||
return new HashSet<>(mapGroup.values()); | return new HashSet<>(mapGroup.values()); | ||||
} | } | ||||
/** | |||||
* 获取功能权限和字段权限 | |||||
* @param userId 用户ID | |||||
* @param partyId 登录单位ID | |||||
* @param menuId 菜单明细ID | |||||
* @return | |||||
*/ | |||||
public static Map<String,Object> getFuncAndFieldRight(long userId,long partyId,long menuId){ | |||||
MenuPlanItemProvider.MenuPlanItem2 menuPlanItem2 =MenuPlanItemProvider.getInstance().getMenuPlanItem(menuId); | |||||
if(menuPlanItem2 ==null){ | |||||
return new HashMap<>(); | |||||
} | |||||
return getFuncAndFieldRight(userId,partyId,menuId,menuPlanItem2.getMpId()); | |||||
} | |||||
/** | |||||
* 获取功能权限和字段权限 | |||||
* @param userId 用户ID | |||||
* @param partyId 登录单位ID | |||||
* @param menuId 菜单明细ID | |||||
* @param menuPlanId 菜单方案ID | |||||
* @return | |||||
*/ | |||||
public static Map<String,Object> getFuncAndFieldRight(long userId,long partyId,long menuId,long menuPlanId){ | |||||
Set<Long> roleIds = UserRoleCache.getInstance().getRoleIdByUP(userId,partyId); | |||||
RoleCache roleCache = RoleCache.getInstance(); | |||||
Set<String> fun = new HashSet<>(); | |||||
Map<String,Integer> fieldMap = new HashMap<>(); | |||||
roleIds.forEach((roleId)-> { | |||||
Role role = roleCache.get(roleId); | |||||
if(role==null || role.getSmpId()!=menuPlanId){ | |||||
return; | |||||
} | |||||
RoleRightContent roleRightContent = new RoleRightContent(role.getPrivilege()); | |||||
RoleRight roleRight = roleRightContent.getRoleRight(menuId); | |||||
if(roleRight!=null){ | |||||
// 功能权限 | |||||
Set<String> tempFun = roleRight.getRightFunc(); | |||||
if(!CommUtil.isEmpty(tempFun)){ | |||||
fun.addAll(tempFun); | |||||
} | |||||
// 字段权限 | |||||
Map<String,Integer> tempFieldMap = roleRight.getRightField(); | |||||
if(tempFieldMap!=null){ | |||||
tempFieldMap.forEach((key,value)-> { | |||||
if(!fieldMap.containsKey(key)){ | |||||
fieldMap.put(key,value); | |||||
}else { | |||||
if(fieldMap.get(key)<value){ | |||||
fieldMap.put(key,value); | |||||
} | |||||
} | |||||
}); | |||||
} | |||||
} | |||||
}); | |||||
Map<String,Object> rtMap = new HashMap<>(); | |||||
rtMap.put("func",fun); | |||||
rtMap.put("field",fieldMap); | |||||
return rtMap; | |||||
} | |||||
} | } |
@@ -115,7 +115,7 @@ public class RoleRightContent { | |||||
/** | /** | ||||
* 获取菜单的数据权限组ID | * 获取菜单的数据权限组ID | ||||
* @param menuId 菜单id | |||||
* @param menuId 菜单明细id | |||||
* @param dataRightId 数据权限定义id | * @param dataRightId 数据权限定义id | ||||
* @return 数据权限组ID | * @return 数据权限组ID | ||||
*/ | */ | ||||