最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot整合Flowable實(shí)現(xiàn)工作流的詳細(xì)流程

 更新時(shí)間:2025年06月16日 11:07:13   作者:程序員小假  
Flowable是一個(gè)使用Java編寫的輕量級(jí)業(yè)務(wù)流程引擎,Flowable流程引擎可用于部署B(yǎng)PMN2.0流程定義,創(chuàng)建這些流程定義的流程實(shí)例,進(jìn)行查詢,訪問(wèn)運(yùn)行中或歷史的流程實(shí)例與相關(guān)數(shù)據(jù),本文給大家介紹了如何使用SpringBoot整合Flowable快速實(shí)現(xiàn)工作流,需要的朋友可以參考下

1、流程引擎介紹

Flowable 是一個(gè)使用 Java 編寫的輕量級(jí)業(yè)務(wù)流程引擎。Flowable 流程引擎可用于部署 BPMN2.0 流程定義(用于定義流程的行業(yè) XML 標(biāo)準(zhǔn)),創(chuàng)建這些流程定義的流程實(shí)例,進(jìn)行查詢,訪問(wèn)運(yùn)行中或歷史的流程實(shí)例與相關(guān)數(shù)據(jù),等等。

Java 領(lǐng)域另一個(gè)流程引擎是 Activiti,不這兩個(gè)東西只要會(huì)使用其中一個(gè),另一個(gè)就不在話下。
咱就不廢話了,上代碼吧。 

2、創(chuàng)建項(xiàng)目

首先創(chuàng)建一個(gè) Spring Boot 項(xiàng)目,引入 Web、和 MySQL 驅(qū)動(dòng)兩個(gè)依賴,如下圖:

項(xiàng)目創(chuàng)建成功之后,引入 flowable 依賴,如下:

<dependency>
    <groupId>org.flowable</groupId>
    <artifactId>flowable-spring-boot-starter</artifactId>
    <version>6.7.2</version>
</dependency>

這個(gè)會(huì)做一些自動(dòng)化配置,默認(rèn)情況下,所以位于 resources/processes 的流程都會(huì)被自動(dòng)部署。
接下來(lái)在 application.yaml 中配置一下數(shù)據(jù)庫(kù)連接信息,當(dāng)項(xiàng)目啟動(dòng)的時(shí)候會(huì)自動(dòng)初始化數(shù)據(jù)庫(kù),將來(lái)流程引擎運(yùn)行時(shí)候的數(shù)據(jù)會(huì)被自動(dòng)持久化到數(shù)據(jù)庫(kù)中。

spring:
  datasource:
    username: root
    password: 123
    url: jdbc:mysql:///flowable?serverTimezone=Asia/Shanghai&useSSL=false

配置完成后,就可以啟動(dòng)項(xiàng)目了。項(xiàng)目啟動(dòng)成功之后,flowable 數(shù)據(jù)庫(kù)中就會(huì)自動(dòng)創(chuàng)建如下這些表,將來(lái)流程引擎相關(guān)的數(shù)據(jù)都會(huì)自動(dòng)保存到這些表中。
默認(rèn)的表比較多,截圖只是其中一部分。

3、畫流程圖

畫流程圖算是比較有挑戰(zhàn)的一個(gè)步驟了,也是流程引擎使用的關(guān)鍵。官方提供了一些流程引擎繪制工具,感興趣的小伙伴可以自行去體驗(yàn);IDEA 也自帶了一個(gè)流程可視化的工具,但是特別難用。
這里說(shuō)一下常用的 IDEA 插件 Flowable BPMN visualizer,如下圖:

裝好插件之后,在 resources 目錄下新建 processes 目錄,這個(gè)目錄下的流程文件將來(lái)會(huì)被自動(dòng)部署。

接下來(lái)在 processes 目錄下,新建一個(gè) BPMN 文件(插件裝好了就有這個(gè)選項(xiàng)了),如下:

來(lái)畫個(gè)請(qǐng)假的流程,就叫做 ask_for_leave.bpmn20.xml,注意最后面的 .bpmn20.xml 是固定后綴。
文件創(chuàng)建出來(lái)之后,右鍵單擊,選擇 View BPMN(Flowable) Diagram,就打開了可視化頁(yè)面了,就可以來(lái)繪制自己的流程圖了。

請(qǐng)假流程畫出來(lái)是這樣:

員工發(fā)起一個(gè)請(qǐng)假流程,首先是組長(zhǎng)審核,組長(zhǎng)審核通過(guò)了,就進(jìn)入到經(jīng)理審核,經(jīng)理審核通過(guò)了,這個(gè)流程就結(jié)束了,如果組長(zhǎng)審核未通過(guò)或者經(jīng)理審核未通過(guò),則流程給員工發(fā)送一個(gè)請(qǐng)假失敗的通知,流程結(jié)束。

來(lái)看下這個(gè)流程對(duì)應(yīng)的 XML 文件,一些流程細(xì)節(jié)會(huì)在 XML 文件中體現(xiàn)出來(lái),如下:

<process id="ask_for_leave" name="ask_for_leave" isExecutable="true">
    <userTask id="leaveTask" name="請(qǐng)假" flowable:assignee="#{leaveTask}"/>
    <userTask id="zuzhangTask" name="組長(zhǎng)審核" flowable:assignee="#{zuzhangTask}"/>
    <userTask id="managerTask" name="經(jīng)理審核" flowable:assignee="#{managerTask}"/>
    <exclusiveGateway id="managerJudgeTask"/>
    <exclusiveGateway id="zuzhangJudeTask"/>
    <endEvent id="endLeave" name="結(jié)束"/>
    <startEvent id="startLeave" name="開始"/>
    <sequenceFlow id="flowStart" sourceRef="startLeave" targetRef="leaveTask"/>
    <sequenceFlow id="modeFlow" sourceRef="leaveTask" targetRef="zuzhangTask"/>
    <sequenceFlow id="zuzhang_go" sourceRef="zuzhangJudeTask" targetRef="managerTask" name="通過(guò)">
        <conditionExpression xsi:type="tFormalExpression"><![CDATA[${checkResult=='通過(guò)'}]]></conditionExpression>
    </sequenceFlow>
    <sequenceFlow id="zuzhang_reject" sourceRef="zuzhangJudeTask" targetRef="sendMail" name="拒絕">
        <conditionExpression xsi:type="tFormalExpression"><![CDATA[${checkResult=='拒絕'}]]></conditionExpression>
    </sequenceFlow>
    <sequenceFlow id="jugdeFlow" sourceRef="managerTask" targetRef="managerJudgeTask"/>
    <sequenceFlow id="flowEnd" name="通過(guò)" sourceRef="managerJudgeTask" targetRef="endLeave">
        <conditionExpression xsi:type="tFormalExpression"><![CDATA[${checkResult=='通過(guò)'}]]></conditionExpression>
    </sequenceFlow>
    <sequenceFlow id="rejectFlow" name="拒絕" sourceRef="managerJudgeTask" targetRef="sendMail">
        <conditionExpression xsi:type="tFormalExpression"><![CDATA[${checkResult=='拒絕'}]]></conditionExpression>
    </sequenceFlow>
    <serviceTask id="sendMail" flowable:exclusive="true" name="發(fā)送失敗提示" isForCompensation="true" flowable:class="org.javaboy.flowable.AskForLeaveFail"/>
    <sequenceFlow id="endFlow" sourceRef="sendMail" targetRef="askForLeaveFail"/>
    <endEvent id="askForLeaveFail" name="請(qǐng)假失敗"/>
    <sequenceFlow id="zuzhangTask_zuzhangJudeTask" sourceRef="zuzhangTask" targetRef="zuzhangJudeTask"/>
</process>

結(jié)合 XML 文件來(lái)解釋一下這里涉及到的 Flowable 中的組件:

  • <process> :表示一個(gè)完整的工作流程。
  • <startEvent> :工作流中起點(diǎn)位置,也就是圖中的綠色按鈕。
  • <endEvent> :工作流中結(jié)束位置,也就是圖中的紅色按鈕。
  • <userTask> :代表一個(gè)任務(wù)審核節(jié)點(diǎn)(組長(zhǎng)、經(jīng)理等角色),這個(gè)節(jié)點(diǎn)上有一個(gè) flowable:assignee 屬性,這表示這個(gè)節(jié)點(diǎn)該由誰(shuí)來(lái)處理,將來(lái)在 Java 代碼中調(diào)用的時(shí)候,需要指定對(duì)應(yīng)的處理人的 ID 或者其他唯一標(biāo)記。
  • <serviceTask>:這是服務(wù)任務(wù),在具體的實(shí)現(xiàn)中,這個(gè)任務(wù)可以做任何事情。
  • <exclusiveGateway> :邏輯判斷節(jié)點(diǎn),相當(dāng)于流程圖中的菱形框。
  • <sequenceFlow> :鏈接各個(gè)節(jié)點(diǎn)的線條,sourceRef 屬性表示線的起始節(jié)點(diǎn),targetRef 屬性表示線指向的節(jié)點(diǎn),圖中的線條都屬于這種。

流程圖這塊小編和大家稍微說(shuō)一下,咋一看這個(gè)圖挺復(fù)雜很難畫,但是實(shí)際上只要認(rèn)認(rèn)真真去捋一捋這里邊的各個(gè)屬性,基本上很快就明白到底是怎么一回事。 

4、開發(fā)接口

接下來(lái)寫幾個(gè)接口,來(lái)體驗(yàn)一把流程引擎。
在正式體驗(yàn)之前,先來(lái)熟悉幾個(gè)類,這幾個(gè)類一會(huì)寫代碼會(huì)用到。 

4.1 Java 類梳理

ProcessDefinition

這個(gè)最好理解,就是流程的定義,也就相當(dāng)于規(guī)范,每個(gè) ProcessDefinition 都會(huì)有一個(gè) id。 

ProcessInstance

這個(gè)就是流程的一個(gè)實(shí)例。簡(jiǎn)單來(lái)說(shuō),ProcessDefinition 相當(dāng)于是類,而 ProcessInstance 則相當(dāng)于是根據(jù)類 new 出來(lái)的對(duì)象。 

Activity

Activity 是流程標(biāo)準(zhǔn)規(guī)范 BPMN2.0 里面的規(guī)范,流程中的每一個(gè)步驟都是一個(gè) Activity。 

Execution

Execution 的含義是流程的執(zhí)行線路,通過(guò) Execution 可以獲得當(dāng)前 ProcessInstance 當(dāng)前執(zhí)行到哪個(gè) Activity了。 

Task

Task 就是當(dāng)前要做的工作。

實(shí)際上這里涉及到的東西比較多,不過(guò)這里先整一個(gè)簡(jiǎn)單的例子,所以上面這些知識(shí)點(diǎn)暫時(shí)夠用了。 

4.2 查看流程圖

在正式開始之前,先準(zhǔn)備一個(gè)接口,用來(lái)查看流程圖的實(shí)時(shí)執(zhí)行情況,這樣方便查看流程到底執(zhí)行到哪一步了。
具體的代碼如下:

@RestController
public class HelloController {
    @Autowired
    RuntimeService runtimeService;
    @Autowired
    TaskService taskService;
    @Autowired
    RepositoryService repositoryService;
    @Autowired
    ProcessEngine processEngine;
    @GetMapping("/pic")
    public void showPic(HttpServletResponse resp, String processId) throws Exception {
        ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId(processId).singleResult();
        if (pi == null) {
            return;
        }
        List<Execution> executions = runtimeService
                .createExecutionQuery()
                .processInstanceId(processId)
                .list();
        List<String> activityIds = new ArrayList<>();
        List<String> flows = new ArrayList<>();
        for (Execution exe : executions) {
            List<String> ids = runtimeService.getActiveActivityIds(exe.getId());
            activityIds.addAll(ids);
        }
        /**
         * 生成流程圖
         */
        BpmnModel bpmnModel = repositoryService.getBpmnModel(pi.getProcessDefinitionId());
        ProcessEngineConfiguration engconf = processEngine.getProcessEngineConfiguration();
        ProcessDiagramGenerator diagramGenerator = engconf.getProcessDiagramGenerator();
        InputStream in = diagramGenerator.generateDiagram(bpmnModel, "png", activityIds, flows, engconf.getActivityFontName(), engconf.getLabelFontName(), engconf.getAnnotationFontName(), engconf.getClassLoader(), 1.0, false);
        OutputStream out = null;
        byte[] buf = new byte[1024];
        int legth = 0;
        try {
            out = resp.getOutputStream();
            while ((legth = in.read(buf)) != -1) {
                out.write(buf, 0, legth);
            }
        } finally {
            if (in != null) {
                in.close();
            }
            if (out != null) {
                out.close();
            }
        }
    }
}

這就一個(gè)工具,沒啥好說(shuō)的,一會(huì)大家看完后面的代碼,再回過(guò)頭來(lái)看這個(gè)接口,很多地方就都懂了。 

4.3 開啟一個(gè)流程

為了方便,接下來(lái)的代碼都在單元測(cè)試中完成。

首先來(lái)開啟一個(gè)流程,代碼如下:

String staffId = "1000";
/**
 * 開啟一個(gè)流程
 */
@Test
void askForLeave() {
    HashMap<String, Object> map = new HashMap<>();
    map.put("leaveTask", staffId);
    ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("ask_for_leave", map);
    runtimeService.setVariable(processInstance.getId(), "name", "javaboy");
    runtimeService.setVariable(processInstance.getId(), "reason", "休息一下");
    runtimeService.setVariable(processInstance.getId(), "days", 10);
    logger.info("創(chuàng)建請(qǐng)假流程 processId:{}", processInstance.getId());
}

首先由員工發(fā)起一個(gè)請(qǐng)假流程,map 中存放的 leaveTask 是在 XML 流程文件中提前定義好的,提前定義好當(dāng)前這個(gè)任務(wù)創(chuàng)建之后,該由誰(shuí)來(lái)處理,這里是假設(shè)由工號(hào)為 1000 的員工來(lái)發(fā)起這樣一個(gè)請(qǐng)假流程。同時(shí),還設(shè)置了一些額外信息。ask_for_leave 是在 XML 文件中定義的一個(gè) process 的名稱。

好啦,現(xiàn)在執(zhí)行這個(gè)單元測(cè)試方法,執(zhí)行完成后,控制臺(tái)會(huì)打印出當(dāng)前這個(gè)流程的 id,拿著這個(gè) id 去訪問(wèn) 4.2 小節(jié)的接口,結(jié)果如下:

可以看到,請(qǐng)假用紅色的框框起來(lái)了,說(shuō)明當(dāng)前流程走到了這一步。 

4.4 將請(qǐng)求提交給組長(zhǎng)

接下來(lái),就需要將這個(gè)請(qǐng)假流程向后推進(jìn)一步,將請(qǐng)假事務(wù)提交給組長(zhǎng),代碼如下:

String zuzhangId = "90";
/**
 * 提交給組長(zhǎng)審批
 */
@Test
void submitToZuzhang() {
    //員工查找到自己的任務(wù),然后提交給組長(zhǎng)審批
    List<Task> list = taskService.createTaskQuery().taskAssignee(staffId).orderByTaskId().desc().list();
    for (Task task : list) {
        logger.info("任務(wù) ID:{};任務(wù)處理人:{};任務(wù)是否掛起:{}", task.getId(), task.getAssignee(), task.isSuspended());
        Map<String, Object> map = new HashMap<>();
        //提交給組長(zhǎng)的時(shí)候,需要指定組長(zhǎng)的 id
        map.put("zuzhangTask", zuzhangId);
        taskService.complete(task.getId(), map);
    }
}

首先利用 staffId 查找到當(dāng)前員工的 id,進(jìn)而找到當(dāng)前員工需要執(zhí)行的任務(wù),遍歷這個(gè)任務(wù),調(diào)用 taskService.complete 方法將任務(wù)提交給組長(zhǎng),注意在 map 中指定組長(zhǎng)的 id。
提交完成后,再去看流程圖片,如下:

可以看到,流程圖走到組長(zhǎng)審批了。 

4.5 組長(zhǎng)審批

組長(zhǎng)現(xiàn)在有兩種選擇,同意或者拒絕,同意的代碼如下:

/**
 * 組長(zhǎng)審批-批準(zhǔn)
 */
@Test
void zuZhangApprove() {
    List<Task> list = taskService.createTaskQuery().taskAssignee(zuzhangId).orderByTaskId().desc().list();
    for (Task task : list) {
        logger.info("組長(zhǎng) {} 在審批 {} 任務(wù)", task.getAssignee(), task.getId());
        Map<String, Object> map = new HashMap<>();
        //組長(zhǎng)審批的時(shí)候,如果是同意,需要指定經(jīng)理的 id
        map.put("managerTask", managerId);
        map.put("checkResult", "通過(guò)");
        taskService.complete(task.getId(), map);
    }
}

通過(guò)組長(zhǎng)的 id 查詢組長(zhǎng)的任務(wù),同意的話,需要指定經(jīng)理,也就是這個(gè)流程下一步該由誰(shuí)來(lái)處理。
拒絕的代碼如下:

/**
 * 組長(zhǎng)審批-拒絕
 */
@Test
void zuZhangReject() {
    List<Task> list = taskService.createTaskQuery().taskAssignee(zuzhangId).orderByTaskId().desc().list();
    for (Task task : list) {
        logger.info("組長(zhǎng) {} 在審批 {} 任務(wù)", task.getAssignee(), task.getId());
        Map<String, Object> map = new HashMap<>();
        //組長(zhǎng)審批的時(shí)候,如果是拒絕,就不需要指定經(jīng)理的 id
        map.put("checkResult", "拒絕");
        taskService.complete(task.getId(), map);
    }
}

拒絕的話,就沒那么多事了,直接設(shè)置 checkResult 為拒絕即可。

假設(shè)這里執(zhí)行了同意,那么流程圖如下:

4.6 經(jīng)理審批

經(jīng)理審批和組長(zhǎng)審批差不多,只不過(guò)經(jīng)理這里是最后一步了,不需要再指定下一位處理人了,同意的代碼如下:

/**
 * 經(jīng)理審批自己的任務(wù)-批準(zhǔn)
 */
@Test
void managerApprove() {
    List<Task> list = taskService.createTaskQuery().taskAssignee(managerId).orderByTaskId().desc().list();
    for (Task task : list) {
        logger.info("經(jīng)理 {} 在審批 {} 任務(wù)", task.getAssignee(), task.getId());
        Map<String, Object> map = new HashMap<>();
        map.put("checkResult", "通過(guò)");
        taskService.complete(task.getId(), map);
    }
}

拒絕代碼如下:

/**
 * 經(jīng)理審批自己的任務(wù)-拒絕
 */
@Test
void managerReject() {
    List<Task> list = taskService.createTaskQuery().taskAssignee(managerId).orderByTaskId().desc().list();
    for (Task task : list) {
        logger.info("經(jīng)理 {} 在審批 {} 任務(wù)", task.getAssignee(), task.getId());
        Map<String, Object> map = new HashMap<>();
        map.put("checkResult", "拒絕");
        taskService.complete(task.getId(), map);
    }
}

4.7 拒絕流程

如果組長(zhǎng)拒絕了或者經(jīng)理拒絕了,也有相應(yīng)的處理方案,首先在 XML 流程文件定義時(shí),如下:

<serviceTask id="sendMail" flowable:exclusive="true" name="發(fā)送失敗提示" isForCompensation="true" flowable:class="org.javaboy.flowable.AskForLeaveFail"/>

如果請(qǐng)假被拒絕,會(huì)進(jìn)入到這個(gè) serviceTask,serviceTask 對(duì)應(yīng)的處理類是 org.javaboy.flowable.AskForLeaveFail,該類的代碼如下:

public class AskForLeaveFail implements JavaDelegate {
    @Override
    public void execute(DelegateExecution execution) {
        System.out.println("請(qǐng)假失敗。。。");
    }
}

也就是請(qǐng)假失敗會(huì)進(jìn)入到這個(gè)方法中,現(xiàn)在就可以在這個(gè)方法中該干嘛干嘛了。

以上就是SpringBoot整合Flowable實(shí)現(xiàn)工作流的詳細(xì)流程的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot Flowable工作流的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • IDEA將Java.class文件反編譯為Java文件原理、實(shí)踐與深度解析

    IDEA將Java.class文件反編譯為Java文件原理、實(shí)踐與深度解析

    本文詳細(xì)介紹了如何使用IntelliJ IDEA進(jìn)行.class到.java的反編譯,包括基礎(chǔ)概念、實(shí)用技巧、引擎配置、疑難問(wèn)題解決以及生產(chǎn)環(huán)境實(shí)戰(zhàn)案例,通過(guò)這些步驟,開發(fā)者可以有效地理解和學(xué)習(xí)Java代碼,提升開發(fā)效率,感興趣的朋友跟隨小編一起看看吧
    2025-12-12
  • 詳解java整合solr5.0之solrj的使用

    詳解java整合solr5.0之solrj的使用

    本篇文章主要介紹了詳解java整合solr5.0之solrj的使用 ,具有一定的參考價(jià)值,有興趣的可以了解下
    2017-06-06
  • 淺談Mybatis Plus的BaseMapper的方法是如何注入的

    淺談Mybatis Plus的BaseMapper的方法是如何注入的

    我們?cè)谟玫臅r(shí)候經(jīng)常就是生產(chǎn)自定義的Mapper繼承自BaseMapper,那么BaseMapper怎么被注入到mybatis里的,本文就詳細(xì)的介紹一下,感興趣的可以了解一下
    2021-09-09
  • Spring Boot + thymeleaf 實(shí)現(xiàn)文件上傳下載功能

    Spring Boot + thymeleaf 實(shí)現(xiàn)文件上傳下載功能

    最近同事問(wèn)我有沒有有關(guān)于技術(shù)的電子書,我打開電腦上的小書庫(kù),但是郵件發(fā)給他太大了,公司又禁止用文件夾共享,于是花半天時(shí)間寫了個(gè)小的文件上傳程序,部署在自己的Linux機(jī)器上,需要的朋友可以參考下
    2018-01-01
  • 使用Java實(shí)現(xiàn)PDF文字識(shí)別的方法詳解

    使用Java實(shí)現(xiàn)PDF文字識(shí)別的方法詳解

    在現(xiàn)代信息化的社會(huì)中,PDF文件已經(jīng)成為一種非常常見的文檔格式,本文將詳細(xì)介紹如何使用Java實(shí)現(xiàn)PDF文字識(shí)別,包括所需的工具、庫(kù)、代碼實(shí)現(xiàn)以及實(shí)際應(yīng)用中的注意事項(xiàng),需要的朋友可以參考下
    2025-02-02
  • Springcloud之Gateway組件詳解

    Springcloud之Gateway組件詳解

    Spring Cloud Gateway是Spring Cloud微服務(wù)生態(tài)下的網(wǎng)關(guān)組件。Spring Cloud Gateway是基于Spring 5和Spring Boot 2搭建的,本質(zhì)上是一個(gè)Spring Boot應(yīng)用。本文詳細(xì)介紹了SpringCloud的網(wǎng)關(guān)組件 Gateway,,需要的朋友可以參考下
    2023-05-05
  • 詳解JAVA Stream流

    詳解JAVA Stream流

    這篇文章主要介紹了JAVA Stream流的相關(guān)資料,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • Java TreeMap升序|降序排列和按照value進(jìn)行排序的案例

    Java TreeMap升序|降序排列和按照value進(jìn)行排序的案例

    這篇文章主要介紹了Java TreeMap升序|降序排列和按照value進(jìn)行排序的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-10-10
  • java報(bào)錯(cuò)狀態(tài)碼問(wèn)題

    java報(bào)錯(cuò)狀態(tài)碼問(wèn)題

    這篇文章主要介紹了java報(bào)錯(cuò)狀態(tài)碼問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • spring boot整合mybatis+mybatis-plus的示例代碼

    spring boot整合mybatis+mybatis-plus的示例代碼

    這篇文章主要介紹了spring boot整合mybatis+mybatis-plus的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01

最新評(píng)論

鄂托克前旗| 芒康县| 霍山县| 新干县| 宁晋县| 宁远县| 绥宁县| 奉新县| 枝江市| 咸宁市| 忻州市| 临洮县| 玛多县| 观塘区| 略阳县| 泗水县| 达尔| 广西| 都匀市| 长岛县| 华亭县| 恩施市| 聂拉木县| 南和县| 高州市| 鹿泉市| 吴川市| 贺兰县| 西乌珠穆沁旗| 沁水县| 耒阳市| 安岳县| 工布江达县| 西林县| 吉隆县| 武平县| 通城县| 封开县| 阳谷县| 贞丰县| 凌云县|