SpringBoot+flowable快速實現(xiàn)工作流

總覽

  • 使用flowable自帶的flowable-ui制作流程圖
  • 使用springboot開發(fā)流程使用的接口完成流程的業(yè)務(wù)功能

一衅金、flowable-ui部署運行

flowable-6.6.0 運行 官方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 登錄

4背传、進入APP.MODELER創(chuàng)建流程鹅颊,之后可以導出流程到項目中使用彩匕,或者配置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)復制到?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ù)進行建模。圖里是【矩形】曲聂。

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

首先啟動了工作流后朋腋,由【開始】節(jié)點自動流向【學生】節(jié)點齐疙,等待該任務(wù)執(zhí)行。任務(wù)被分配的學生用戶執(zhí)行后流向 【老師】節(jié)點旭咽,再次等待該任務(wù)執(zhí)行贞奋。被分配的老師用戶執(zhí)行后流向 【網(wǎng)關(guān)】,網(wǎng)關(guān)以此檢查每個出口轻专,流向符合條件的任務(wù)忆矛,比如這里老師執(zhí)行任務(wù)時是同意,就流向【校長】節(jié)點请垛,等待該任務(wù)執(zhí)行催训。執(zhí)行后跟老師類似,同意后就流向【結(jié)束】節(jié)點宗收,整個流程到此結(jié)束漫拭。

繪圖細節(jié):

1、保留流程模型

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

3、任務(wù)需要分配任務(wù)的執(zhí)行用戶匈勋,可以分配到候選組礼旅,也可以直接分配到候選人

最后導出工作流文件

文件內(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="學生"?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文件導入

如果需要洽洁,可以把這個流程文件下載下來痘系,直接導入使用

三、后臺項目搭建

后臺項目基于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_開頭昭雌。第二部分是說明表用途的兩字符標示符复唤。服務(wù)API的命名也大略符合這個規(guī)則。

2烛卧、ACT_RE_: 'RE’代表repository佛纫。帶有這個前綴的表包含“靜態(tài)”信息,例如流程定義與流程資源(圖片、規(guī)則等)呈宇。

3跟磨、ACT_RU_: 'RU’代表runtime。這些表存儲運行時信息攒盈,例如流程實例(process instance)、用戶任務(wù)(user task)哎榴、變量(variable)型豁、作業(yè)(job)等。Flowable只在流程實例運行中保存運行時數(shù)據(jù)尚蝌,并在流程實例結(jié)束時刪除記錄迎变。這樣保證運行時表小和快。

4飘言、ACT_HI_: 'HI’代表history衣形。這些表存儲歷史數(shù)據(jù),例如已完成的流程實例姿鸿、變量谆吴、任務(wù)等。

5苛预、ACT_GE_: 通用數(shù)據(jù)句狼。在多處使用。

1)通用數(shù)據(jù)表(2個)
  • act_ge_bytearray:二進制數(shù)據(jù)表热某,如流程定義腻菇、流程模板、流程圖的字節(jié)流文件昔馋;
  • act_ge_property:屬性數(shù)據(jù)表(不常用)筹吐;
2)歷史表(8個,HistoryService接口操作的表)
  • act_hi_actinst:歷史節(jié)點表秘遏,存放流程實例運轉(zhuǎn)的各個節(jié)點信息(包含開始丘薛、結(jié)束等非任務(wù)節(jié)點);
  • act_hi_attachment:歷史附件表垄提,存放歷史節(jié)點上傳的附件信息(不常用)榔袋;
  • act_hi_comment:歷史意見表;
  • act_hi_detail:歷史詳情表铡俐,存儲節(jié)點運轉(zhuǎn)的一些信息(不常用)凰兑;
  • act_hi_identitylink:歷史流程人員表,存儲流程各節(jié)點候選审丘、辦理人員信息吏够,常用于查詢某人或部門的已辦任務(wù);
  • act_hi_procinst:歷史流程實例表,存儲流程實例歷史數(shù)據(jù)(包含正在運行的流程實例)锅知;
  • act_hi_taskinst:歷史流程任務(wù)表播急,存儲歷史任務(wù)節(jié)點;
  • act_hi_varinst:流程歷史變量表售睹,存儲流程歷史節(jié)點的變量信息桩警;
3)用戶相關(guān)表(4個,IdentityService接口操作的表)
  • act_id_group:用戶組信息表昌妹,對應(yīng)節(jié)點選定候選組信息捶枢;
  • act_id_info:用戶擴展信息表,存儲用戶擴展信息飞崖;
  • act_id_membership:用戶與用戶組關(guān)系表烂叔;
  • act_id_user:用戶信息表,對應(yīng)節(jié)點選定辦理人或候選人信息固歪;
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)流程運行時表(6個,RuntimeService接口操作的表)

  • act_ru_task:運行時流程任務(wù)節(jié)點表偎痛,存儲運行中流程的任務(wù)節(jié)點信息旱捧,重要,常用于查詢?nèi)藛T或部門的待辦任務(wù)時使用踩麦;
  • act_ru_event_subscr:監(jiān)聽信息表枚赡,不常用;
  • act_ru_execution:運行時流程執(zhí)行實例表谓谦,記錄運行中流程運行的各個分支信息(當沒有子流程時贫橙,其數(shù)據(jù)與act_ru_task表數(shù)據(jù)是一一對應(yīng)的);
  • act_ru_identitylink:運行時流程人員表反粥,重要卢肃,常用于查詢?nèi)藛T或部門的待辦任務(wù)時使用疲迂;
  • act_ru_job:運行時定時任務(wù)數(shù)據(jù)表,存儲流程的定時任務(wù)信息莫湘;
  • act_ru_variable:運行時流程變量數(shù)據(jù)表尤蒿,存儲運行中的流程各節(jié)點的變量信息;

五幅垮、流程引擎API與服務(wù)

引擎API是與Flowable交互的最常用手段腰池。總?cè)肟邳c是ProcessEngine忙芒。

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

2爷耀、RuntimeService用于啟動流程定義的新流程實例甘桑。

3、IdentityService很簡單歹叮。它用于管理(創(chuàng)建跑杭,更新,刪除咆耿,查詢……)組與用戶德谅。

4、FormService是可選服務(wù)萨螺。也就是說Flowable沒有它也能很好地運行窄做,而不必犧牲任何功能。

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ù)中的類名。

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

代碼


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)建實例?????????*/

????????String?processDefinitionKey?=?"leave_approval";//流程定義的key,對應(yīng)請假的流程圖
????????String?businessKey?=?"schoolleave";//業(yè)務(wù)代碼谈撒,根據(jù)自己的業(yè)務(wù)用
????????Map<String,?Object>?variablesDefinition?=?new?HashMap<>();//流程變量,可以自定義擴充
????????ProcessInstance?processInstance?=?runtimeService.startProcessInstanceByKey(processDefinitionKey,?businessKey,?variablesDefinition);
????????log.info("啟動成功:{}",?processInstance.getId());

????????/*
?????????*?@Date:?2021/10/17?23:40
?????????*?Step?4:?查詢指定流程所有啟動的實例列表
?????????*?列表匾南,或?分頁?刪除?????????*/

????????List<Execution>?executions?=?runtimeService.createExecutionQuery().processDefinitionKey("leave_approval").list();
????????List<Execution>?executionPages?=?runtimeService.createExecutionQuery().processDefinitionKey("leave_approval").listPage(1,?30);
//????????runtimeService.deleteProcessInstance(processInstanceId,?deleteReason);?//刪除實例

????????/*
?????????*?@Date:?2021/10/17?23:40
?????????*?Step?5:?學生查詢可以操作的任務(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:?歷史查詢蛆楞,因為一旦流程執(zhí)行完畢溯乒,活動的數(shù)據(jù)都會被清空,上面查詢的接口都查不到數(shù)據(jù)豹爹,但是提供歷史查詢接口?????????*/

????????//?歷史流程實例
????????List<HistoricProcessInstance>?historicProcessList?=?historyService.createHistoricProcessInstanceQuery().processDefinitionKey("leave_approval").list();
????????//?歷史任務(wù)
????????List<HistoricTaskInstance>?historicTaskList?=?historyService.createHistoricTaskInstanceQuery().processDefinitionKey("leave_approval").list();
????????//?實例歷史變量?,?任務(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)置恁多查詢,包括模糊查詢肄方,大小比較都有
????}
}

五冰垄、參考資料

  • 分享牛Flowable文檔漢化:https://github.com/qiudaoke/flowable-userguide
  • 貓七姑娘 flowable-6.6.0 運行官方 demo
  • 華格瑞沙 https://www.cnblogs.com/yangjiming/p/10938515.html

本文使用 文章同步助手 同步

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市权她,隨后出現(xiàn)的幾起案子虹茶,更是在濱河造成了極大的恐慌,老刑警劉巖隅要,帶你破解...
    沈念sama閱讀 222,946評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件写烤,死亡現(xiàn)場離奇詭異,居然都是意外死亡拾徙,警方通過查閱死者的電腦和手機洲炊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來尼啡,“玉大人暂衡,你說我怎么就攤上這事⊙虏t!?“怎么了狂巢?”我有些...
    開封第一講書人閱讀 169,716評論 0 364
  • 文/不壞的土叔 我叫張陵,是天一觀的道長书聚。 經(jīng)常有香客問我唧领,道長藻雌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,222評論 1 300
  • 正文 為了忘掉前任斩个,我火速辦了婚禮胯杭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘受啥。我一直安慰自己做个,他們只是感情好,可當我...
    茶點故事閱讀 69,223評論 6 398
  • 文/花漫 我一把揭開白布滚局。 她就那樣靜靜地躺著居暖,像睡著了一般。 火紅的嫁衣襯著肌膚如雪藤肢。 梳的紋絲不亂的頭發(fā)上太闺,一...
    開封第一講書人閱讀 52,807評論 1 314
  • 那天,我揣著相機與錄音嘁圈,去河邊找鬼跟束。 笑死,一個胖子當著我的面吹牛丑孩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播灭贷,決...
    沈念sama閱讀 41,235評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼温学,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了甚疟?” 一聲冷哼從身側(cè)響起仗岖,我...
    開封第一講書人閱讀 40,189評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎览妖,沒想到半個月后轧拄,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,712評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡讽膏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,775評論 3 343
  • 正文 我和宋清朗相戀三年檩电,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片府树。...
    茶點故事閱讀 40,926評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡俐末,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出奄侠,到底是詐尸還是另有隱情卓箫,我是刑警寧澤,帶...
    沈念sama閱讀 36,580評論 5 351
  • 正文 年R本政府宣布垄潮,位于F島的核電站烹卒,受9級特大地震影響闷盔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜旅急,卻給世界環(huán)境...
    茶點故事閱讀 42,259評論 3 336
  • 文/蒙蒙 一逢勾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧坠非,春花似錦敏沉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,750評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至潦闲,卻和暖如春攒菠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背歉闰。 一陣腳步聲響...
    開封第一講書人閱讀 33,867評論 1 274
  • 我被黑心中介騙來泰國打工辖众, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人和敬。 一個月前我還...
    沈念sama閱讀 49,368評論 3 379
  • 正文 我出身青樓凹炸,卻偏偏與公主長得像,于是被迫代替她去往敵國和親昼弟。 傳聞我的和親對象是個殘疾皇子啤它,可洞房花燭夜當晚...
    茶點故事閱讀 45,930評論 2 361

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