JAVA解析逻辑表达

最近公司有项目改版。原先菜单是写死在页面,一个角色一个菜单页,且菜单的显示与否不只是和角色有关。页面里有很多的地方用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{

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然,我可以帮你生成一套简单的Java代码来解析UDI码。以下是一个示例: ```java public class UDIAnalyzer { private String udiCode; private String deviceIdentifier; private String producerIdentifier; public UDIAnalyzer(String udiCode) { this.udiCode = udiCode; analyzeUDICode(); } private void analyzeUDICode() { // 将UDI码拆分为设备识别码(DI)和生产者识别码(PI) // 假设DI和PI的长度都是固定的 // 获取设备识别码(DI) deviceIdentifier = udiCode.substring(0, 5); // 假设DI长度为5 // 获取生产者识别码(PI) producerIdentifier = udiCode.substring(5); // 假设PI从第6个字符开始 // 进一步解析DI和PI,获取更详细的信息 // 在实际应用中,可以根据具体的需求和标准来解析DI和PI // 可以使用正则表达式、字符串操作等方式来提取所需信息 } public String getDeviceIdentifier() { return deviceIdentifier; } public String getProducerIdentifier() { return producerIdentifier; } // 可以添加其他方法来获取更详细的信息,如制造商、型号、批次等 public static void main(String[] args) { String udiCode = "ABCD12345XYZ"; UDIAnalyzer analyzer = new UDIAnalyzer(udiCode); System.out.println("Device Identifier: " + analyzer.getDeviceIdentifier()); System.out.println("Producer Identifier: " + analyzer.getProducerIdentifier()); } } ``` 这是一个简单的示例,它将UDI码拆分为设备识别码(DI)和生产者识别码(PI),并提供了获取DI和PI的方法。在实际应用中,你可以根据具体的需求和标准来解析DI和PI,并提取所需的详细信息,如制造商、型号、批次等。这个示例代码可以作为一个起点,你可以根据自己的需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值