最近公司有项目改版。原先菜单是写死在页面,一个角色一个菜单页,且菜单的显示与否不只是和角色有关。页面里有很多的地方用if去判断该菜单是否显示。上级要求,将菜单放到数据库管理。跟角色有关的菜单通过配置角色的权限就可以了。这个大家都懂得。但这里还有一个问题,菜单不只是和角色有关。写很多if在代码里进行判断,这种方式显然不灵活。而且很容易出问题。于是我想到了在菜单表增加一个列。叫菜单展示条件列。这个列的数据类似下面:({session_mchtType}={ 1.9}或{session_mchtType}={25})且({session_payType}={74}且{session_circleId}={6})。然后,在加载完用户的权限后,解析该规则,过滤掉不满足条件的菜单就可以了。
下面是代码:
测试类:
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import com.smartpay.ops.cms.dto.MbMenuDto;
public class Test {
static Map map=new HashMap();
public static void main(String[] args) throws Exception {
map.put("session_mchtType", "1.9");
map.put("session_circleId", 6);
map.put("session_payType", 74);
Test t=new Test();
String ruleStr=" ({session_mchtType}={ 1.9}或{session_mchtType}={25})且({session_payType}={74}且{session_circleId}={6})";
t.parseRule( ruleStr);
List<MbMenuDto> menuList=new ArrayList();
MbMenuDto menu=new MbMenuDto();
menu.setMenuName("密码修改");
menu.setShowCondition("{session_mchtType}!={3}或{session_payType}={7}且{session_circleId}={6}");
menuList.add(menu);
new Test().filteMenu(menuList);
}
public boolean parseRule(String ruleStr){
//没有规则限制
if(ruleStr==null||ruleStr.trim().length()==0){
return true;
}
//把所有的空格去掉
ruleStr=ruleStr.replaceAll(" {1,}", "");
String k1="(";
//1:从最后一个“(”开始解析,将带括号的表达式解析成最基本的逻辑表达式
do{
int indexK1=ruleStr.lastIndexOf(k1);
if(indexK1>-1){
int indexK2=getK2(indexK1, ruleStr);
//2:解析成最基本的逻辑表达式后,将表达式嵌入原规则字符串
if(indexK2>-1){
String rule2=ruleStr.substring(indexK1+1, indexK2);
String logicValue=logic(rule2);
ruleStr=ruleStr.substring(0, indexK1)+logicValue+ruleStr.substring(indexK2+1);
System.out.println("替换后的表达式:"+ruleStr);
}else{