国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Spring Boot + URule 規(guī)則引擎,可視化配置太爽了!

這篇具有很好參考價(jià)值的文章主要介紹了Spring Boot + URule 規(guī)則引擎,可視化配置太爽了!。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

作者:知了一笑
來源:juejin.cn/post/7210194936276680759

一、背景

前段時(shí)間,在做項(xiàng)目重構(gòu)的時(shí)候,遇到很多地方需要做很多的條件判斷。當(dāng)然可以用很多的if-else判斷去解決,但是當(dāng)時(shí)也不清楚怎么回事,就想玩點(diǎn)別的。于是乎,就去調(diào)研了規(guī)則引擎。

當(dāng)然,市面上有很多成熟的規(guī)則引擎,功能很多,性能很好。但是,就是想玩點(diǎn)不一樣的(大家做技術(shù)選型別這樣,這個(gè)是反面教材)。最終一款URule的規(guī)則引擎吸引了我,主要還是采用瀏覽器可直接配置,不需要過多安裝,可視化規(guī)則也做的不錯(cuò)。經(jīng)過一系列調(diào)研,后面就把它接入了項(xiàng)目中,順便記錄下調(diào)研的結(jié)果。

二、介紹

規(guī)則引擎其實(shí)是一種組件,它可以嵌入到程序當(dāng)中。將程序復(fù)雜的判斷規(guī)則從業(yè)務(wù)代碼中剝離出來,使得程序只需要關(guān)心自己的業(yè)務(wù),而不需要去進(jìn)行復(fù)雜的邏輯判斷;簡(jiǎn)單的理解是規(guī)則接受一組輸入的數(shù)據(jù),通過預(yù)定好的規(guī)則配置,再輸出一組結(jié)果。

當(dāng)然,市面上有很多成熟的規(guī)則引擎,如:Drools、Aviator、EasyRules等等。但是URule,它可以運(yùn)行在Windows、Linux、Unix等各種類型的操作系統(tǒng)之上,采用純?yōu)g覽器的編輯模式,不需要安裝工具,直接在瀏覽器上編輯規(guī)則和測(cè)試規(guī)則。

當(dāng)然這款規(guī)則引擎有開源和pro版本的區(qū)別,至于pro版是啥,懂的都懂,下面放個(gè)表格,了解下具體的區(qū)別

特性 PRO版 開源版
向?qū)經(jīng)Q策集
腳本式?jīng)Q策集
決策樹
決策流
決策表
交叉決策表 無(wú)
復(fù)雜評(píng)分卡 無(wú)
文件名、項(xiàng)目名重構(gòu) 無(wú)
參數(shù)名、變量常量名重構(gòu) 無(wú)
Excel決策表導(dǎo)入 無(wú)
規(guī)則集模版保存與加載 無(wú)
中文項(xiàng)目名和文件名支持 無(wú)
服務(wù)器推送知識(shí)包到客戶端功能的支持 無(wú)
知識(shí)包優(yōu)化與壓縮的支持 無(wú)
客戶端服務(wù)器模式下大知識(shí)包的推拉支持 無(wú)
規(guī)則集中執(zhí)行組的支持 無(wú)
規(guī)則流中所有節(jié)點(diǎn)向?qū)綏l件與動(dòng)作配置的支持 無(wú)
循環(huán)規(guī)則多循環(huán)單元支持 無(wú)
循環(huán)規(guī)則中無(wú)條件執(zhí)行的支持 無(wú)
導(dǎo)入項(xiàng)目自動(dòng)重命名功能 無(wú)
規(guī)則樹構(gòu)建優(yōu)化 無(wú)
對(duì)象查找索引支持 無(wú)
規(guī)則樹中短路計(jì)算的支持 無(wú)
規(guī)則條件冗余計(jì)算緩存支持 無(wú)
基于方案的批量場(chǎng)景測(cè)試功能 無(wú)
知識(shí)包調(diào)用監(jiān)控 無(wú)
更為完善的文件讀寫權(quán)限控制 無(wú)
知識(shí)包版本控制 無(wú)
SpringBean及Java類的熱部署 無(wú)
技術(shù)支持 無(wú)

三、安裝使用

實(shí)際使用時(shí),有四種使用URule Pro的方式,分別是嵌入式模式、本地模式、分布式計(jì)算模式以及獨(dú)立服務(wù)模式。

但是我們這里不考慮URule Pro,咱自己整個(gè)開源版,在開源版集成springboot的基礎(chǔ)上做一個(gè)二次開發(fā),搜了一圈,其實(shí)就有解決方案。

大致的項(xiàng)目模塊如下:

Spring Boot + URule 規(guī)則引擎,可視化配置太爽了!

Spring Boot 基礎(chǔ)就不介紹了,推薦看這個(gè)實(shí)戰(zhàn)項(xiàng)目:

https://github.com/javastacks/spring-boot-best-practice

自己創(chuàng)建個(gè)空數(shù)據(jù)庫(kù),只需要在edas-rule-server服務(wù)中修改下數(shù)據(jù)庫(kù)的配置,然后啟動(dòng)服務(wù)即可。第一次啟動(dòng)完成,數(shù)據(jù)庫(kù)中會(huì)創(chuàng)建表。

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/urule-data?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false
spring.datasource.username=root
spring.datasource.password=mysql

上面說過,它是純用瀏覽器進(jìn)行編輯,配置規(guī)則的,只需要打開瀏覽器,輸入地址:http://localhost:8090/urule/frame,看到這個(gè)界面,就說明啟動(dòng)成功了。

Spring Boot + URule 規(guī)則引擎,可視化配置太爽了!

四、基礎(chǔ)概念

3.1整體介紹

先說下URule它的構(gòu)成部分,主要是兩部分:1、設(shè)計(jì)器部分 2、規(guī)則執(zhí)行引擎。設(shè)計(jì)器部分主要是庫(kù)文件和規(guī)則文件構(gòu)成。下面看下整體的結(jié)構(gòu)圖

Spring Boot + URule 規(guī)則引擎,可視化配置太爽了!

3.2庫(kù)文件

如上圖介紹的,庫(kù)文件有4種,包括變量庫(kù),參數(shù)庫(kù),常量庫(kù)和動(dòng)作庫(kù)。其實(shí)類似于Java開發(fā)的系統(tǒng)中的實(shí)體對(duì)象,枚舉,常量以及方法。

上面說過,規(guī)則都是可視化配置的。在配置規(guī)則的過程中,就需要引入各種已經(jīng)定義好的庫(kù)文件,再結(jié)合業(yè)務(wù)需求,從而配置出符合業(yè)務(wù)場(chǎng)景的業(yè)務(wù)規(guī)則,所以哪里都有庫(kù)文件的身影。

3.2.1變量庫(kù)文件

在業(yè)務(wù)開發(fā)中,我們會(huì)創(chuàng)建很多Getter和Setter的Java類,比如PO、VO、BO、DTO、POJO等等,其實(shí)這些類new對(duì)象后主要起到的作用就是數(shù)據(jù)的載體,用來傳輸數(shù)據(jù)。

在URule中,變量庫(kù)就是用來映射這些對(duì)象,然后可以在規(guī)則中使用,最終完成業(yè)務(wù)和規(guī)則的互動(dòng)。最后上一張圖,用來創(chuàng)建變量庫(kù)

Spring Boot + URule 規(guī)則引擎,可視化配置太爽了!

對(duì)了,上面廢話了這么多可視化配置,這才是第一次展示配置界面,慚愧慚愧。

上圖一目了然,在“庫(kù)”這個(gè)菜單底下右鍵,然后點(diǎn)擊添加變量庫(kù)即可,最后定義自己喜歡的變量庫(kù)名,當(dāng)然名字只支持中文或者英文,其他字符不可用。

Spring Boot + URule 規(guī)則引擎,可視化配置太爽了!創(chuàng)建完變量庫(kù)后,就可以對(duì)變量庫(kù)進(jìn)行編輯,可以認(rèn)為就是給POJO添加屬性

Spring Boot + URule 規(guī)則引擎,可視化配置太爽了!也不彎彎繞繞講什么術(shù)語(yǔ),就個(gè)人理解。圖左邊是創(chuàng)建類,其中名稱是它的別名,配置規(guī)則用它代替這個(gè)類。圖右邊是類的屬性,我這里隨便寫了幾個(gè),估計(jì)看了懂得都懂。

最后在業(yè)務(wù)系統(tǒng)中創(chuàng)建對(duì)應(yīng)的類,注意全限定名和配置變量庫(kù)的類路徑一致。

package com.cicada;

import com.bstek.urule.model.Label;
import lombok.Data;

/**
 * @author 往事如風(fēng)
 * @version 1.0
 * @date 2023/3/3 15:38
 * @description
 */
@Data
public class Stu {

    @Label("姓名")
    private String name;

    @Label("年齡")
    private int age;

    @Label("班級(jí)")
    private String classes;
}

最后說下這個(gè)@Label注解,這個(gè)是由URule提供的注解,主要是描述字段的屬性,跟變量庫(kù)的標(biāo)題一欄一致就行。聽官方介紹可以通過這個(gè)注解,實(shí)現(xiàn)POJO屬性和變量庫(kù)屬性映射。就是POJO寫好,然后對(duì)應(yīng)規(guī)則的變量庫(kù)就不需要重新寫,可以直接生成。反正就有這個(gè)功能,這里就直接一筆帶過了。

3.2.2常量庫(kù)文件

說到常量庫(kù),這個(gè)就可以認(rèn)為是我們Java系統(tǒng)中的常量,枚舉。比如性別,要定義枚舉吧;比如對(duì)接的機(jī)構(gòu),也可以定義一個(gè)枚舉吧。

當(dāng)然,類似于變量庫(kù),常量庫(kù)也可以實(shí)現(xiàn)和系統(tǒng)中的枚舉相互映射,這樣做的好處可以避免我們手動(dòng)輸入,防止輸入錯(cuò)誤。創(chuàng)建常量庫(kù)也比較簡(jiǎn)單,直接在“庫(kù)”這個(gè)菜單下右鍵,“添加常量庫(kù)”。

創(chuàng)建好常量庫(kù)文件后,也會(huì)出現(xiàn)如下頁(yè)面:

Spring Boot + URule 規(guī)則引擎,可視化配置太爽了!

3.2.3參數(shù)庫(kù)文件

參數(shù)庫(kù),就是URule規(guī)則中的臨時(shí)變量,變量的類型和數(shù)量不固定??梢哉J(rèn)為類似于Map,實(shí)際上存儲(chǔ)參數(shù)庫(kù)的也就是個(gè)Map。

同樣的套路,直接在“庫(kù)”這個(gè)菜單下右鍵,“添加參數(shù)庫(kù)”。

Spring Boot + URule 規(guī)則引擎,可視化配置太爽了!可以看到,參數(shù)庫(kù)已經(jīng)少了左邊分類這一項(xiàng),直接添加參數(shù),選擇類型就是干,相對(duì)簡(jiǎn)單了很多。“名稱”這列我這里用了英文,就是Map中的key,而“標(biāo)題”這列就是在配置規(guī)則時(shí)候顯示用的,中文看著比較直觀。

當(dāng)然還需要注意的點(diǎn)是,定義的名稱要保證唯一,因?yàn)镸ap中的key是唯一的,不然就會(huì)存在覆蓋的情況。

3.2.4動(dòng)作庫(kù)文件

動(dòng)作庫(kù)可以對(duì)配置在spring中的bean方法進(jìn)行映射,然后可以在規(guī)則中直接調(diào)用這批方法。慣用套路,還是在“庫(kù)”菜單下右鍵,點(diǎn)擊“添加動(dòng)作庫(kù)”。

Spring Boot + URule 規(guī)則引擎,可視化配置太爽了!然后我在系統(tǒng)中添加了一個(gè)類Action,然后在類上標(biāo)記@Component注解,將該類交給spring的bean容器管理。該類中添加一些方法,在方法上標(biāo)記@ExposeAction注解,該注解是URule定義的,說明被標(biāo)記的方法都會(huì)被動(dòng)作庫(kù)讀取到。

package com.bstek.urule.cicada;

import com.bstek.urule.action.ActionId;
import com.bstek.urule.model.ExposeAction;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author 往事如風(fēng)
 * @version 1.0
 * @date 2023/3/10 13:59
 * @description
 */
@Component("action")
public class Action {

    @ActionId("Hello")
    public String hello(){
        return "hello";
    }

    @ExposeAction(value="方法1")
    public boolean evalTest(String username){
        if(username==null){
            return false;
        }else if(username.equals("張三")){
            return true;
        }
        return false;
    }

    @ExposeAction(value="測(cè)試Int")
    public int testInt(int a,int b){
        return a+b;
    }

    @ExposeAction(value="打印內(nèi)容")
    public void printContent(String username, Date birthday){
        SimpleDateFormat sd=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        if(birthday!=null){
            System.out.println(username+"今年已經(jīng)"+sd.format(birthday)+"歲了!");
        }else{
            System.out.println("Hello "+username+"");
        }
    }

    @ExposeAction(value="打印Stu")
    public void printUser(Stu m){
        System.out.println("Hello "+m.getName()+", is age:"+m.getAge());
    }
}

最后在動(dòng)作庫(kù)頁(yè)面上添加bean,“Bean Id”一列輸入對(duì)應(yīng)的spring bean的名稱,這里輸入action。然后點(diǎn)擊操作列中的小手按鈕,就會(huì)彈出剛在Action類中標(biāo)記了ExposeAction注解的方法。選擇一個(gè)指定的方法添加進(jìn)來,最后看到方法對(duì)應(yīng)的參數(shù)也會(huì)被自動(dòng)加載進(jìn)去。

Spring Boot + URule 規(guī)則引擎,可視化配置太爽了!

Spring Boot + URule 規(guī)則引擎,可視化配置太爽了!

最后,變量庫(kù)、參數(shù)庫(kù)、動(dòng)作庫(kù)、常量庫(kù)這些庫(kù)文件定義好后,各種規(guī)則文件配置的時(shí)候就可以導(dǎo)入他們。但是一旦這些庫(kù)文件被某個(gè)規(guī)則文件使用,就不要隨意修改庫(kù)文件了。

3.3規(guī)則集

說到規(guī)則集,顧名思義,就是配置規(guī)則了。前面定義的庫(kù)文件就需要導(dǎo)入到規(guī)則集中去配置使用。它是使用頻率最高的一個(gè)業(yè)務(wù)規(guī)則實(shí)現(xiàn)方式。

規(guī)則集說的是規(guī)則的集合,由三個(gè)部分規(guī)則組成:如果、那么、否則。

在規(guī)則集的定義的方式上,URule由向?qū)胶湍_本式兩種;

  • 向?qū)揭?guī)則集:就是在頁(yè)面上通過鼠標(biāo)點(diǎn)點(diǎn)點(diǎn),高度的可視化配置,不是開發(fā)都能懂,這也是這個(gè)規(guī)則引擎的亮點(diǎn)所在。
  • 腳本式規(guī)則集:聽名字就知道了,這玩意要寫腳本的。拉高配置門檻,需要懂點(diǎn)編碼的人來編寫。

3.3.1向?qū)揭?guī)則集

還是一樣,首先新建。這次是在“決策集”菜單上右鍵,點(diǎn)擊“添加向?qū)經(jīng)Q策集”,這樣就創(chuàng)建好一個(gè)規(guī)則集了。

Spring Boot + URule 規(guī)則引擎,可視化配置太爽了!在配置規(guī)則前,可以先導(dǎo)入前面定義好的庫(kù)文件。我這里導(dǎo)入變量庫(kù)文件,頁(yè)面上點(diǎn)擊“變量庫(kù)”,然后選擇指定的變量庫(kù)文件即可。如圖所示;

Spring Boot + URule 規(guī)則引擎,可視化配置太爽了!最后,可以愉快的配置規(guī)則了,向?qū)經(jīng)]什么好講的,都是可視化界面,點(diǎn)點(diǎn)點(diǎn)即可。下面是我配置的一個(gè)簡(jiǎn)單的規(guī)則集;

Spring Boot + URule 規(guī)則引擎,可視化配置太爽了!可以看到由三部分組成:如果、那么、否則;

  1. 如果:配置規(guī)則的條件;
  2. 那么:配置滿足條件后執(zhí)行的動(dòng)作,一般配置變量賦值比較多
  3. 否則:配置不滿足條件執(zhí)行的動(dòng)作

最后,附上添加完規(guī)則后,通過代碼去執(zhí)行規(guī)則;

package com.cicada;

import cn.hutool.core.bean.BeanUtil;
import com.Result;
import com.bstek.urule.Utils;
import com.bstek.urule.runtime.KnowledgePackage;
import com.bstek.urule.runtime.KnowledgeSession;
import com.bstek.urule.runtime.KnowledgeSessionFactory;
import com.bstek.urule.runtime.service.KnowledgeService;
import com.cicada.req.StuReq;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;

/**
 * @author 往事如風(fēng)
 * @version 1.0
 * @date 2023/3/10 16:47
 * @description
 */
@RestController
@RequestMapping("/rule")
public class RuleDataController {

    @PostMapping("/stu")
    public Result rule(@RequestBody StuReq stuReq) throws IOException {
        KnowledgeService knowledgeService = (KnowledgeService) Utils.getApplicationContext().getBean(KnowledgeService.BEAN_ID);
        KnowledgePackage knowledgePackage = knowledgeService.getKnowledge("xxx/xxx");
        KnowledgeSession knowledgeSession = KnowledgeSessionFactory.newKnowledgeSession(knowledgePackage);
        Stu stu = BeanUtil.copyProperties(stuReq, Stu.class);
        knowledgeSession.insert(stu);
        knowledgeSession.fireRules();
        return Result.success(stu.getTeacher());
    }
}

Spring Boot + URule 規(guī)則引擎,可視化配置太爽了!請(qǐng)求接口,最終參數(shù)符合配置的條件,返回“那么”中配置的輸出結(jié)果。

3.3.2腳本式規(guī)則集

腳本式的規(guī)則集,各種原理都是和向?qū)揭荒R粯?,無(wú)非就是拉高門檻,用寫腳本的方式去實(shí)現(xiàn)配置的規(guī)則。這里不做過多的介紹了。

3.4決策表

再聊下決策表,其實(shí)它就是規(guī)則集的另一種展示形式,比較相對(duì)規(guī)則集,我更喜歡用決策表去配置規(guī)則,應(yīng)為它呈現(xiàn)的更加直觀,更便于理解。但是本質(zhì)和規(guī)則集沒啥區(qū)別。

也不展開過多的贅述,這里我就放一張配置過的決策表;

Spring Boot + URule 規(guī)則引擎,可視化配置太爽了!

3.5其他

當(dāng)然,還有其他的概念和功能,這里也不一一介紹了,因?yàn)樯厦嬲f的已經(jīng)是最常用的了,想了解的可以自行去了解。其他功能包括:交叉決策表、評(píng)分卡、復(fù)雜評(píng)分卡、決策樹、規(guī)則流;當(dāng)然,其中有些是Pro版的功能。

四、運(yùn)用場(chǎng)景

最近在開發(fā)一期大版本的需求,其中就有個(gè)場(chǎng)景,具體如下;參與購(gòu)買訂單的用戶都會(huì)有自己的一個(gè)職級(jí),也可以說是角色。每個(gè)用戶都會(huì)有三個(gè)職位:普通用戶、會(huì)員、精英會(huì)員。

然后,每個(gè)月初都會(huì)對(duì)用戶進(jìn)行一次晉升處理,普通用戶達(dá)到要求,就會(huì)晉升為會(huì)員,會(huì)員達(dá)到要求就會(huì)晉升為精英會(huì)員。

當(dāng)然,普通用戶晉升會(huì)員,會(huì)員晉升精英會(huì)員,都會(huì)有不同的規(guī)則;

  1. 普通用戶->會(huì)員:3個(gè)月內(nèi)幫注冊(cè)人數(shù)達(dá)到3人;3個(gè)月內(nèi)自己和底下團(tuán)隊(duì)的人,下單金額超過1萬(wàn);個(gè)人的訂單繼續(xù)率超過80%。
  2. 會(huì)員->精英會(huì)員:3個(gè)月內(nèi)幫注冊(cè)人數(shù)達(dá)到6人;3個(gè)月內(nèi)自己和底下團(tuán)隊(duì)的人,下單金額超過5萬(wàn);個(gè)人的訂單繼續(xù)率超過90%。
  3. 不能跨級(jí)晉升,普通用戶最多只能到會(huì)員,達(dá)到會(huì)員了才能晉升到精英會(huì)員。

當(dāng)然,這只是做過簡(jiǎn)化的一部分需求,我做過稍許的改動(dòng),真實(shí)的需求場(chǎng)景并沒有這么簡(jiǎn)單。

下面,我對(duì)這個(gè)需求做一個(gè)規(guī)則的配置,這里用一個(gè)決策表進(jìn)行配置;在配置規(guī)則前,我添加一個(gè)變量庫(kù)文件和常量庫(kù);

Spring Boot + URule 規(guī)則引擎,可視化配置太爽了!

Spring Boot + URule 規(guī)則引擎,可視化配置太爽了!最后,添加一個(gè)決策表,并進(jìn)行規(guī)則配置;

Spring Boot + URule 規(guī)則引擎,可視化配置太爽了!可以看到,表格一共五列,其中前四列是規(guī)則,最后一列是滿足規(guī)則后輸出的信息。這樣看著就很清晰,即使并不是技術(shù)人員,也可以輕松看懂其中的規(guī)則。

五、總結(jié)

規(guī)則引擎對(duì)于我們的系統(tǒng)而言可用可不用,它可以錦上添花,幫助我們剝離出業(yè)務(wù)中需要進(jìn)行大量判斷的場(chǎng)景。但是,這種規(guī)則的剝離,需要我們開發(fā)人員對(duì)需求進(jìn)行理解,在理解的基礎(chǔ)上進(jìn)行抽象概念的具化。這,也是整個(gè)編程的必經(jīng)之路。

近期熱文推薦:

1.1,000+ 道 Java面試題及答案整理(2022最新版)

2.勁爆!Java 協(xié)程要來了。。。

3.Spring Boot 2.x 教程,太全了!

4.別再寫滿屏的爆爆爆炸類了,試試裝飾器模式,這才是優(yōu)雅的方式?。?/p>

5.《Java開發(fā)手冊(cè)(嵩山版)》最新發(fā)布,速速下載!

覺得不錯(cuò),別忘了隨手點(diǎn)贊+轉(zhuǎn)發(fā)哦!文章來源地址http://www.zghlxwxcb.cn/news/detail-459988.html

到了這里,關(guān)于Spring Boot + URule 規(guī)則引擎,可視化配置太爽了!的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包