SpringBoot+flowable快速實(shí)現(xiàn)工作流,so easy

一迹炼、flowable-ui部署運(yùn)行

flowable-6.6.0 運(yùn)行 官方demo

參考文檔:

https://flowable.com/open-source/docs/bpmn/ch14-Applications/

1螟蝙、從官網(wǎng)下載flowable-6.6.0 : https://github.com/flowable/flowable-engine/releases/download/flowable-6.6.0/flowable-6.6.0.zip

2源武、將壓縮包中的 flowable-6.6.0\wars\flowable-ui.war 丟到Tomcat中跑起來

3、打開http://localhost:8080/flowable-ui 用賬戶:admin/test 登錄

SpringBoot+flowable快速實(shí)現(xiàn)工作流舱污,so easy

4呀舔、進(jìn)入APP.MODELER創(chuàng)建流程,之后可以導(dǎo)出流程到項目中使用扩灯,或者配置apache-tomcat-9.0.37\webapps\flowable-ui\WEB-INF\classes\flowable-default.properties連接本地數(shù)據(jù)庫


注意:需要將java驅(qū)動jar(mysql-connector-java-5.1.45.jar)復(fù)制到 apache-tomcat-9.0.37\webapps\flowable-rest\WEB-INF\lib

這樣創(chuàng)建的流程后端程序就能直接使用

二媚赖、繪制流程圖

根據(jù)業(yè)務(wù)需要在 flowable-ui>APP.MODELER里面繪制流程圖霜瘪,示例如上圖。先解釋一些概念惧磺。

  • 事件(event) 通常用于為流程生命周期中發(fā)生的事情建模颖对,圖里是【開始、結(jié)束】兩個圈磨隘。
  • 順序流(sequence flow) 是流程中兩個元素間的連接器惜互。圖里是【箭頭線段】。
  • 網(wǎng)關(guān)(gateway) 用于控制執(zhí)行的流向琳拭。圖里是【菱形(中間有X)】
  • 用戶任務(wù)(user task) 用于對需要人工執(zhí)行的任務(wù)進(jìn)行建模训堆。圖里是【矩形】。

簡單的工作流大概就這些元素(還有很多這里就不擴(kuò)展了)白嘁。下面描述一下工作流是如何流動的坑鱼。

首先啟動了工作流后,由【開始】節(jié)點(diǎn)自動流向【學(xué)生】節(jié)點(diǎn)絮缅,等待該任務(wù)執(zhí)行鲁沥。任務(wù)被分配的學(xué)生用戶執(zhí)行后流向 【老師】節(jié)點(diǎn),再次等待該任務(wù)執(zhí)行耕魄。被分配的老師用戶執(zhí)行后流向 【網(wǎng)關(guān)】画恰,網(wǎng)關(guān)以此檢查每個出口,流向符合條件的任務(wù)吸奴,比如這里老師執(zhí)行任務(wù)時是同意允扇,就流向【校長】節(jié)點(diǎn),等待該任務(wù)執(zhí)行则奥。執(zhí)行后跟老師類似考润,同意后就流向【結(jié)束】節(jié)點(diǎn),整個流程到此結(jié)束读处。

繪圖細(xì)節(jié):

1糊治、保留流程模型

2、順序流可以設(shè)置流條件來限制流動罚舱,比如上面的網(wǎng)關(guān)出口就設(shè)置了條件

3井辜、任務(wù)需要分配任務(wù)的執(zhí)行用戶,可以分配到候選組管闷,也可以直接分配到候選人粥脚。另外,搜索公眾號頂級架構(gòu)師后臺回復(fù)“架構(gòu)整潔”渐北,獲取一份驚喜禮包阿逃。

最后導(dǎo)出工作流文件

文件內(nèi)容

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-insmtece" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:flowable="http://flowable.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.flowable.org/processdef">
  <process id="leave_approval" name="請假審批" isExecutable="true">
    <startEvent id="start" name="開始" flowable:initiator="startuser" flowable:formFieldValidation="true"></startEvent>
    <userTask id="stu_task" name="學(xué)生" flowable:candidateGroups="stu_group" flowable:formFieldValidation="true"></userTask>
    <sequenceFlow id="flow1" sourceRef="start" targetRef="stu_task"></sequenceFlow>
    <userTask id="te_task" name="老師" flowable:candidateGroups="te_group" flowable:formFieldValidation="true"></userTask>
    <exclusiveGateway id="getway1" name="網(wǎng)關(guān)1"></exclusiveGateway>
    <userTask id="mte_task" name="校長" flowable:candidateGroups="mte_group" flowable:formFieldValidation="true"></userTask>
    <exclusiveGateway id="getway2" name="網(wǎng)關(guān)2"></exclusiveGateway>
    <endEvent id="end" name="結(jié)束"></endEvent>
    <sequenceFlow id="flow1" name="請假" sourceRef="stu_task" targetRef="te_task" skipExpression="${command=='agree'}"></sequenceFlow>
    <sequenceFlow id="flow3_1" name="同意" sourceRef="getway1" targetRef="mte_task">
      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${command=='agree'}]]></conditionExpression>
    </sequenceFlow>
    <sequenceFlow id="flow2" name="審批" sourceRef="te_task" targetRef="getway1"></sequenceFlow>
    <sequenceFlow id="flow3_2" name="拒絕" sourceRef="getway1" targetRef="stu_task">
      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${command=='refuse'}]]></conditionExpression>
    </sequenceFlow>
    <sequenceFlow id="flow4" name="審批" sourceRef="mte_task" targetRef="getway2"></sequenceFlow>
    <sequenceFlow id="flow4_1" name="同意" sourceRef="getway2" targetRef="end" skipExpression="${command=='free'}">
      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${command=='agree'}]]></conditionExpression>
    </sequenceFlow>
    <sequenceFlow id="flow4_2" name="拒絕" sourceRef="getway2" targetRef="stu_task">
      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${command=='refuse'}]]></conditionExpression>
    </sequenceFlow>
  </process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_leave_approval">
    這里先省略
  </bpmndi:BPMNDiagram>
</definitions>

4铭拧、bpmn文件導(dǎo)入

如果需要赃蛛,可以把這個流程文件下載下來恃锉,直接導(dǎo)入使用

三、后臺項目搭建

后臺項目基于jdk8呕臂,使用springboot框架

spring 版本

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.0.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

項目依賴pom.xml

<dependency>
    <groupId>org.flowable</groupId>
    <artifactId>flowable-spring-boot-starter</artifactId>
    <version>6.6.0</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.45</version>
</dependency>

項目配置application.yml

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/flowable?useSSL=false&characterEncoding=UTF-8&serverTimezone=GMT%2B8
    driver-class-name: com.mysql.jdbc.Driver
    username: root
    password: 123456

四破托、數(shù)據(jù)庫

1、Flowable的所有數(shù)據(jù)庫表都以ACT_開頭歧蒋。第二部分是說明表用途的兩字符標(biāo)示符土砂。服務(wù)API的命名也大略符合這個規(guī)則。

2谜洽、ACT_RE_: 'RE’代表repository萝映。帶有這個前綴的表包含“靜態(tài)”信息,例如流程定義與流程資源(圖片阐虚、規(guī)則等)序臂。

3、ACT_RU_: 'RU’代表runtime实束。這些表存儲運(yùn)行時信息奥秆,例如流程實(shí)例(process instance)、用戶任務(wù)(user task)咸灿、變量(variable)构订、作業(yè)(job)等。Flowable只在流程實(shí)例運(yùn)行中保存運(yùn)行時數(shù)據(jù)避矢,并在流程實(shí)例結(jié)束時刪除記錄悼瘾。這樣保證運(yùn)行時表小和快。

4审胸、ACT_HI_: 'HI’代表history分尸。這些表存儲歷史數(shù)據(jù),例如已完成的流程實(shí)例歹嘹、變量箩绍、任務(wù)等。

5尺上、ACT_GE_: 通用數(shù)據(jù)材蛛。在多處使用。

1)通用數(shù)據(jù)表(2個)

  • act_ge_bytearray:二進(jìn)制數(shù)據(jù)表怎抛,如流程定義卑吭、流程模板、流程圖的字節(jié)流文件马绝;
  • act_ge_property:屬性數(shù)據(jù)表(不常用)豆赏;

2)歷史表(8個,HistoryService接口操作的表)

  • act_hi_actinst:歷史節(jié)點(diǎn)表,存放流程實(shí)例運(yùn)轉(zhuǎn)的各個節(jié)點(diǎn)信息(包含開始掷邦、結(jié)束等非任務(wù)節(jié)點(diǎn))白胀;
  • act_hi_attachment:歷史附件表,存放歷史節(jié)點(diǎn)上傳的附件信息(不常用)抚岗;
  • act_hi_comment:歷史意見表或杠;
  • act_hi_detail:歷史詳情表,存儲節(jié)點(diǎn)運(yùn)轉(zhuǎn)的一些信息(不常用)宣蔚;
  • act_hi_identitylink:歷史流程人員表向抢,存儲流程各節(jié)點(diǎn)候選、辦理人員信息胚委,常用于查詢某人或部門的已辦任務(wù)挟鸠;
  • act_hi_procinst:歷史流程實(shí)例表,存儲流程實(shí)例歷史數(shù)據(jù)(包含正在運(yùn)行的流程實(shí)例)亩冬;
  • act_hi_taskinst:歷史流程任務(wù)表兄猩,存儲歷史任務(wù)節(jié)點(diǎn);
  • act_hi_varinst:流程歷史變量表鉴未,存儲流程歷史節(jié)點(diǎn)的變量信息枢冤;

3)用戶相關(guān)表(4個,IdentityService接口操作的表)

  • act_id_group:用戶組信息表铜秆,對應(yīng)節(jié)點(diǎn)選定候選組信息淹真;
  • act_id_info:用戶擴(kuò)展信息表,存儲用戶擴(kuò)展信息连茧;
  • act_id_membership:用戶與用戶組關(guān)系表核蘸;
  • act_id_user:用戶信息表,對應(yīng)節(jié)點(diǎn)選定辦理人或候選人信息啸驯;

4)流程定義客扎、流程模板相關(guān)表(3個,RepositoryService接口操作的表)

  • act_re_deployment:部屬信息表罚斗,存儲流程定義徙鱼、模板部署信息;
  • act_re_procdef:流程定義信息表针姿,存儲流程定義相關(guān)描述信息袱吆,但其真正內(nèi)容存儲在act_ge_bytearray表中,以字節(jié)形式存儲距淫;
  • act_re_model:流程模板信息表绞绒,存儲流程模板相關(guān)描述信息,但其真正內(nèi)容存儲在act_ge_bytearray表中榕暇,以字節(jié)形式存儲蓬衡;

5)流程運(yùn)行時表(6個喻杈,RuntimeService接口操作的表)

  • act_ru_task:運(yùn)行時流程任務(wù)節(jié)點(diǎn)表,存儲運(yùn)行中流程的任務(wù)節(jié)點(diǎn)信息狰晚,重要筒饰,常用于查詢?nèi)藛T或部門的待辦任務(wù)時使用;
  • act_ru_event_subscr:監(jiān)聽信息表家肯,不常用龄砰;
  • act_ru_execution:運(yùn)行時流程執(zhí)行實(shí)例表盟猖,記錄運(yùn)行中流程運(yùn)行的各個分支信息(當(dāng)沒有子流程時讨衣,其數(shù)據(jù)與act_ru_task表數(shù)據(jù)是一一對應(yīng)的);
  • act_ru_identitylink:運(yùn)行時流程人員表式镐,重要反镇,常用于查詢?nèi)藛T或部門的待辦任務(wù)時使用;
  • act_ru_job:運(yùn)行時定時任務(wù)數(shù)據(jù)表娘汞,存儲流程的定時任務(wù)信息歹茶;
  • act_ru_variable:運(yùn)行時流程變量數(shù)據(jù)表,存儲運(yùn)行中的流程各節(jié)點(diǎn)的變量信息你弦;

五惊豺、流程引擎API與服務(wù)

引擎API是與Flowable交互的最常用手段∏葑鳎總?cè)肟邳c(diǎn)是ProcessEngine尸昧。

1、RepositoryService很可能是使用Flowable引擎要用的第一個服務(wù)旷偿。這個服務(wù)提供了管理與控制部署(deployments)與流程定義(process definitions)的操作烹俗。管理靜態(tài)信息,

2萍程、RuntimeService用于啟動流程定義的新流程實(shí)例幢妄。

3、IdentityService很簡單茫负。它用于管理(創(chuàng)建蕉鸳,更新,刪除忍法,查詢……)組與用戶置吓。

4、FormService是可選服務(wù)缔赠。也就是說Flowable沒有它也能很好地運(yùn)行衍锚,而不必犧牲任何功能。

5嗤堰、HistoryService暴露Flowable引擎收集的所有歷史數(shù)據(jù)戴质。要提供查詢歷史數(shù)據(jù)的能力度宦。

6、ManagementService通常在用Flowable編寫用戶應(yīng)用時不需要使用告匠。它可以讀取數(shù)據(jù)庫表與表原始數(shù)據(jù)的信息戈抄,也提供了對作業(yè)(job)的查詢與管理操作。

7后专、DynamicBpmnService可用于修改流程定義中的部分內(nèi)容划鸽,而不需要重新部署它。例如可以修改流程定義中一個用戶任務(wù)的辦理人設(shè)置戚哎,或者修改一個服務(wù)任務(wù)中的類名裸诽。另外,搜索公眾號頂級算法后臺回復(fù)“算法”型凳,獲取一份驚喜禮包丈冬。

接下來使用之前的請假流程圖,上代碼

代碼


import lombok.extern.slf4j.Slf4j;
import org.flowable.engine.HistoryService;
import org.flowable.engine.RepositoryService;
import org.flowable.engine.RuntimeService;
import org.flowable.engine.history.HistoricProcessInstance;
import org.flowable.engine.repository.Deployment;
import org.flowable.engine.repository.ProcessDefinition;
import org.flowable.engine.runtime.Execution;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.idm.api.Group;
import org.flowable.idm.api.User;
import org.flowable.task.api.Task;
import org.flowable.task.api.history.HistoricTaskInstance;
import org.springframework.beans.factory.annotation.Autowired;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.zip.ZipInputStream;

/**
 * TestFlowable
 *
 * @Author 
 * @Date: 2021/10/17 23:35
 * @Version 1.0
 */
@Slf4j
public class TestFlowable {

    @Autowired
    private RepositoryService repositoryService;

    @Autowired
    private RuntimeService runtimeService;

    @Autowired
    private HistoryService historyService;

    @Autowired
    private org.flowable.engine.TaskService taskService;

    @Autowired
    private org.flowable.engine.IdentityService identityService;

    public void createDeploymentZip() {

        /*
         * @Date: 2021/10/17 23:38
         * Step 1: 部署xml(壓縮到zip形式甘畅,直接xml需要配置相對路徑埂蕊,麻煩,暫不用)
         */
        try {
            File zipTemp = new File("f:/leave_approval.bpmn20.zip");
            ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(zipTemp));
            Deployment deployment = repositoryService
                    .createDeployment()
                    .addZipInputStream(zipInputStream)
                    .deploy();
            log.info("部署成功:{}", deployment.getId());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        /*
         * @Date: 2021/10/17 23:40
         * Step 2: 查詢部署的流程定義
         */
        List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery().processDefinitionKey("leave_approval").list();
        List<ProcessDefinition> pages = repositoryService.createProcessDefinitionQuery().processDefinitionKey("leave_approval").listPage(1, 30);

        /*
         * @Date: 2021/10/17 23:40
         * Step 3: 啟動流程疏唾,創(chuàng)建實(shí)例
         */
        String processDefinitionKey = "leave_approval";//流程定義的key,對應(yīng)請假的流程圖
        String businessKey = "schoolleave";//業(yè)務(wù)代碼蓄氧,根據(jù)自己的業(yè)務(wù)用
        Map<String, Object> variablesDefinition = new HashMap<>();//流程變量,可以自定義擴(kuò)充
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey, businessKey, variablesDefinition);
        log.info("啟動成功:{}", processInstance.getId());

        /*
         * @Date: 2021/10/17 23:40
         * Step 4: 查詢指定流程所有啟動的實(shí)例列表
         * 列表槐脏,或 分頁 刪除
         */
        List<Execution> executions = runtimeService.createExecutionQuery().processDefinitionKey("leave_approval").list();
        List<Execution> executionPages = runtimeService.createExecutionQuery().processDefinitionKey("leave_approval").listPage(1, 30);
//        runtimeService.deleteProcessInstance(processInstanceId, deleteReason); //刪除實(shí)例

        /*
         * @Date: 2021/10/17 23:40
         * Step 5: 學(xué)生查詢可以操作的任務(wù),并完成任務(wù)
         */
        String candidateGroup = "stu_group"; //候選組 xml文件里面的 flowable:candidateGroups="stu_group"
        List<Task> taskList = taskService.createTaskQuery().taskCandidateGroup(candidateGroup).orderByTaskCreateTime().desc().list();
        for (Task task : taskList) {
            // 申領(lǐng)任務(wù)
            taskService.claim(task.getId(), "my");
            // 完成
            taskService.complete(task.getId());
        }

        /*
         * @Date: 2021/10/17 23:40
         * Step 6: 老師查詢可以操作的任務(wù),并完成任務(wù)
         */
        String candidateGroupTe = "te_group"; //候選組 xml文件里面的 flowable:candidateGroups="te_group"
        List<Task> taskListTe = taskService.createTaskQuery().taskCandidateGroup(candidateGroupTe).orderByTaskCreateTime().desc().list();
        for (Task task : taskListTe) {
            // 申領(lǐng)任務(wù)
            taskService.claim(task.getId(), "myte");
            // 完成
            Map<String, Object> variables = new HashMap<>();
            variables.put("command","agree"); //攜帶變量冒嫡,用于網(wǎng)關(guān)流程的條件判定来惧,這里的條件是同意
            taskService.complete(task.getId(), variables);
        }

        /*
         * @Date: 2021/10/18 0:17
         * Step 7: 歷史查詢资厉,因?yàn)橐坏┝鞒虉?zhí)行完畢描滔,活動的數(shù)據(jù)都會被清空,上面查詢的接口都查不到數(shù)據(jù)露氮,但是提供歷史查詢接口
         */
        // 歷史流程實(shí)例
        List<HistoricProcessInstance> historicProcessList = historyService.createHistoricProcessInstanceQuery().processDefinitionKey("leave_approval").list();
        // 歷史任務(wù)
        List<HistoricTaskInstance> historicTaskList = historyService.createHistoricTaskInstanceQuery().processDefinitionKey("leave_approval").list();
        // 實(shí)例歷史變量 , 任務(wù)歷史變量
        // historyService.createHistoricVariableInstanceQuery().processInstanceId(processInstanceId);
        // historyService.createHistoricVariableInstanceQuery().taskId(taskId);

        // *****************************************************分隔符********************************************************************
        // *****************************************************分隔符********************************************************************
        // 可能還需要的API
        // 移動任務(wù)祖灰,人為跳轉(zhuǎn)任務(wù)
        // runtimeService.createChangeActivityStateBuilder().processInstanceId(processInstanceId)
        //       .moveActivityIdTo(currentActivityTaskId, newActivityTaskId).changeState();

        // 如果在數(shù)據(jù)庫配置了分組和用戶,還會用到
        List<User> users = identityService.createUserQuery().list();    //用戶查詢畔规,用戶id對應(yīng)xml 里面配置的用戶
        List<Group> groups = identityService.createGroupQuery().list(); //分組查詢局扶,分組id對應(yīng)xml 里面配置的分組 如 stu_group,te_group 在表里是id的值

        // 另外叁扫,每個查詢后面都可以拼條件三妈,內(nèi)置恁多查詢,包括模糊查詢莫绣,大小比較都有
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末畴蒲,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子对室,更是在濱河造成了極大的恐慌模燥,老刑警劉巖咖祭,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蔫骂,居然都是意外死亡么翰,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門辽旋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來浩嫌,“玉大人,你說我怎么就攤上這事补胚÷肽停” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵糖儡,是天一觀的道長伐坏。 經(jīng)常有香客問我怔匣,道長握联,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任每瞒,我火速辦了婚禮金闽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘剿骨。我一直安慰自己代芜,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布浓利。 她就那樣靜靜地躺著挤庇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪贷掖。 梳的紋絲不亂的頭發(fā)上嫡秕,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機(jī)與錄音苹威,去河邊找鬼昆咽。 笑死,一個胖子當(dāng)著我的面吹牛牙甫,可吹牛的內(nèi)容都是我干的掷酗。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼窟哺,長吁一口氣:“原來是場噩夢啊……” “哼泻轰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起且轨,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤浮声,失蹤者是張志新(化名)和其女友劉穎亩鬼,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體阿蝶,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡雳锋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了羡洁。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片玷过。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖筑煮,靈堂內(nèi)的尸體忽然破棺而出辛蚊,到底是詐尸還是另有隱情,我是刑警寧澤真仲,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布袋马,位于F島的核電站,受9級特大地震影響秸应,放射性物質(zhì)發(fā)生泄漏虑凛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一软啼、第九天 我趴在偏房一處隱蔽的房頂上張望桑谍。 院中可真熱鬧,春花似錦祸挪、人聲如沸锣披。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽雹仿。三九已至,卻和暖如春整以,著一層夾襖步出監(jiān)牢的瞬間胧辽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工悄蕾, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留票顾,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓帆调,卻偏偏與公主長得像奠骄,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子番刊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容