营销系统规则引擎

一、系统介绍

       该系统包括两个模版,分别为规则配置是否正确校验以及规则过滤校验。

二、技术实现

1.RuleEngine

         filter 方法判断规则是否满足,用的算法是逆波兰表示法。 

         validate方法会判断规则配置是否正确,用的算法是dfs。

public class RuleEngine{

    /**
     * 规则项配置
     */
    @Autowired
    private Map<String, RuleItem> ruleItemMap;
    

    /**
     * 规则命中校验
     */
    public boolean filter(Rule rule, RuleContext context) {
        String ruleExpression = rule.getExpression();
        Stack<Character> opStack = new Stack<>();
        Stack<Boolean> resStack = new Stack<>();
        Set<Character> opChSet = Set.of('(', ')', '&', '|');
        int i = 0;
        // 处理右括号
        while (i < ruleExpression.length()) {
            char ch = ruleExpression.charAt(i);
            switch (ch) {
                case ')': 
                    while (opStack.peek() != '(') {
                        Character opChar = opStack.peek();
                        if (opChar == '&') {
                            boolean right = resStack.pop();
                            boolean left = resStack.pop();
                            resStack.push(left && right);
                        } else if (opChar == '|') {
                            boolean right = resStack.pop();
                            boolean left = resStack.pop();
                            resStack.push(left || right);
                        }
                        opStack.pop();
                    }
                    break;
                case '(':
                case '&':
                case '|':
                    opStack.push(ch);
                    i++;
                    break;
                default: // 操作数 放入结果
                    int j = i;
                    while (j < ruleExpression.length() && !opChSet.contains(ruleExpression.charAt(j))) {
                        j++;
                    }
                    String rule = ruleExpression.substring(i, j);
                    resStack.push(ruleItemMap.get(rule).filter(ruleContext));
                    i = j;
            }
        }
        // 处理结果
        while (!opStack.isEmpty()) {
            Character opChar = opStack.peek();
            if (opChar == '&') {
                boolean right = resStack.pop();
                boolean left = resStack.pop();
                resStack.push(left && right);
            } else if (opChar == '|') {
                boolean right = resStack.pop();
                boolean left = resStack.pop();
                resStack.push(left || right);
            }
            opStack.pop();
        }

        return resStack.pop();
    }

    
    default String rootRulePath();


    /**
     * 规则配置校验
     */
    public PathError validate(Rule rule) {
       
        PathError pathError = PathError.of(null, rule.getClass().getSimpleName());
        for (Map.Entry<String, RuleItem> entry : rule.getRuleItems()) {
            String ruleItemPath = entry.getKey();
            RuleItem ruleItem = entry.getValue();
            PathError ruleItemError = ruleItem.validate();
            if (ruleItemError != null) {
                return pathError.with(ruleItemError);
            }
        }
        return null;
    }
}

 2.UserCenterRegistryActivityRule 

         UserCenterRegistryActivityRule是用户中心注册活动对应规则,对应rule expression为 userGroup & channelRule

class UserCenterRegistryActivityRule extends Rule{
    
    @Overrider
    public Map<String, RuleItem> getRuleItems(){
        return Map.of("userGroup", new UserGroupItem(), "channelRule", new ChannelRuleItem());
    }

    @Override
    public String getRuleExpression(){
        return "userGroup&channelRule";
    }
}

 3.RuleItem 

        RuleItem 是规则项定义,UserGroupRuleItem 是具体的RuleItem,会判断用户组是否命中。

class UserGroupRuleItem extends RuleItem{

    private List<String> groupsLimit;
    
    
    /**
    * 判断规则配置
    */

    @Override
    public PathError validate(){
        PathError pathError = PathError.of(null, getClass().getSimpleClassName());
        if (groupsLimit == null || groupsLimit.size() == 0){
            return pathError.withPath("groupsLimit").withError("groupsLimit不能为空");
        }
        return null;
    }


    /**
    * 判断规则命中
    */
    public boolean check(RuleContext context){
        UserService userService = SpringUtil.getBean(UserService.class);
        // 判断用户是否符合用户组规则
        List<String> userGroups = userService.getUserGroups(context.getUser().getUserId());
        if (groupsLimit.stream().anyMatch(userGroups::contains)){
            return true;
        }
        retrun false;
    }
}

  • 14
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
鸿鹄智能云CMS站群系统是一个在centos7.x 系统中,以python+Mysql进行开发的cms站群系统。 一.环境要求 鸿鹄智能云站系统版本是基于centos7开发的,务必使用centos7.x 系统 (裸系统即可/一般情况下不会有问题) 二.安装命令 SSH登陆你的服务器,ROOT用户权限下执行: yum install -y wget && wget -O install.sh http://download.swanyun.com/version/install.sh && sh install.sh (*)注意:部分服务器系统yum陈旧,如报yum错请先执行 yum update 更新一下完成后执行上述命令 三.登陆管理 安装完成后面板有提示,请注意(复制保存以防您忘记) 鸿鹄智能云CMS站群系统系统特性: 1、一键批量建站(快) 填写好域名后可一键批量创建站点,简单易用,速度飞快,只需要做三件事:解析域名,批量添加网站,等待30分钟站点自动建好,而且还带高质量的内容。 速度:一分钟建立一个站点(包含高质量内容),30分钟1000+站点,飞一般的速度! 2、一键调度数据(免规则免采集) 我们的云端数据提供内容高度精准调度服务,包括内容标题、内容主体、内容质量度、行为模式等分析,通过关键字自动调取相关内容! 数量:站点需要什么数据我们就能为您提供什么数据,不是采集! 栏目数*更新量 质量:标题唯一性  内容主题集中度 页面相关内容 地区内容 图文混版 3、SEO自动化功能(内置) 前端SEO模版优化适用于目前主流的搜索引擎,MIP/AMP/H5,OG协议,XML文件,网站地图SITEMAP不用自己写都有!自动ping,主动推送提交URL,404自定义等! 基础:通用SEO基础代码功能,页面关键字密度控制 自动内链 高级:URL自定义 404高级功能 SSL 数据分析 4、高性能并发负载(稳) 我们采用了python高并发框架系统构建底层源码结构,提升整体高并发负载性能,异步模式解决调用阻塞问题,前端展现毫秒级响应,单网站承载千万级别内容数据轻松应对,成功通过高压力测试! 代码:Python  数据库:Mysql 缓存组:Redis  WEB服务器:鸿鹄WEB服务器 5、商业SEO模版(选) 我们提供的模版自动适应各种浏览设备,同时针对搜索引擎做了深度优化,模版自身修改也简单易用,HTML前端SEO优化代码无需用户担心,模版内置多个模型调用标签,可以轻松为网站前端植入广告代码、表单代码、统计代码、在线客服等! 特性:自适应 MIP/AMP/H5 扩展:模版分离 易于编写 6、超多自定义功能(唯一性) 为每个网站提供差异化自定义功能,您可以对网站中的任意一个站做个性化修改(包含栏目URL,内容页URL都可自定义),而且针对网站模板的任何地方都能修改,内容调度可以完全模拟正常人工发布内容! 7、API一键获取数据(关键字) 支持多种格式数据返回格式,商业展现各种数据关联性,兼容多种CMS一键接入,提供多种数据文件格式离线下载,数据云端每日更新! 接口:主关键字 长尾词提取 相关词提取 关联标题内容/图片提取 8、傻瓜化但与众不同(一键模式) 云端调度模式解决您最关心的企业营销问题,建站、优化、维护、运营、分析,客户需要的技术支持我们都全力提供服务! 传统:找人,写源码,改需求,发布内容,SEO优化,运维 我们:安装,点鼠标设置,喝茶,看数据分析,上排名流量!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值