#mysql8+mybatis-plus3.1自动生成带lombok和swagger和增删改查接口

mybatis-dsc-generator

[图片上传失败...(image-835cad-1601049787821)]

还在为写swagger而烦恼吗?还在为忘记写注释而烦恼吗?还在为写简单的api接口而烦恼吗?mybatis-dsc-generator完美集成lombok,swagger的代码生成工具,让你不再为繁琐的注释和简单的接口实现而烦恼:entity集成,格式校验,swagger; dao自动加@ mapper,service自动注释和依赖; 控制器实现单表的增副改查,并实现swaggers的api文档。

源码地址

MAVEN地址

2.1.0版本是未集成Mybatis-plus版本——源码分支master

<dependency>
    <groupId>com.github.flying-cattle</groupId>
    <artifactId>mybatis-dsc-generator</artifactId>
    <version>2.1.0.RELEASE</version>
</dependency>

3.0.0版本是集成了Mybatis-plus版本——源码分支mybatisPlus

<dependency>
    <groupId>com.github.flying-cattle</groupId>
    <artifactId>mybatis-dsc-generator</artifactId>
    <version>3.0.0.RELEASE</version>
</dependency>

数据表结构样式

CREATE TABLE `user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `login_name` varchar(40) DEFAULT NULL COMMENT '登录名',
  `password` varchar(100) NOT NULL COMMENT '秘密',
  `nickname` varchar(50) NOT NULL COMMENT '昵称',
  `type` int(10) unsigned DEFAULT NULL COMMENT '类型',
  `state` int(10) unsigned NOT NULL DEFAULT '1' COMMENT '状态:-1失败,0等待,1成功',
  `note` varchar(255) DEFAULT NULL COMMENT '备注',
  `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `update_uid` bigint(20) DEFAULT '0' COMMENT '修改人用户ID',
  `login_ip` varchar(50) DEFAULT NULL COMMENT '登录IP地址',
  `login_addr` varchar(100) DEFAULT NULL COMMENT '登录地址',
  PRIMARY KEY (`id`),
  UNIQUE KEY `login_name` (`login_name`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

要求必须有表注释,要求必须有主键为id,所有字段必须有注释(便于生成java注释swagger等)。

生成的实体类

生成方法参考源码中的:https://gitee.com/flying-cattle/mybatis-dsc-generator/blob/master/src/main/java/com/github/mybatis/fl/test/TestMain.java

执行结果

实体类

/**
 * @filename:User CollectionRoute
 * @project wallet-sign  V1.0
 * Copyright(c) 2018 BianPeng Co. Ltd. 
 * All right reserved. 
 */
package com.emep.mall.admin.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.util.Date;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;

/**   
 * Copyright: Copyright (c) 2019 
 * 
 * <p>说明: 资金归集实体类</P>
 * @version: V1.0
 * @author: BianPeng
 * 
 * Modification History:
 * Date             Author          Version          Description
 *---------------------------------------------------------------*
 * CollectionRoute      BianPeng    V1.0           initialize
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class User extends Model<User> {

    private static final long serialVersionUID = 1601046735413L;
    
    @TableId(value = "id", type = IdType.AUTO)
    @ApiModelProperty(name = "id" , value = "ID")
    private Long id;
    @ApiModelProperty(name = "loginName" , value = "登录名")
    private String loginName;
    @ApiModelProperty(name = "password" , value = "秘密")
    private String password;
    @ApiModelProperty(name = "nickname" , value = "昵称")
    private String nickname;
    @ApiModelProperty(name = "type" , value = "类型")
    private Integer type;
    @ApiModelProperty(name = "state" , value = "状态:-1失败,0等待,1成功")
    private Integer state;
    @ApiModelProperty(name = "note" , value = "备注")
    private String note;
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    @ApiModelProperty(name = "createTime" , value = "创建时间")
    private Date createTime;
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    @ApiModelProperty(name = "updateTime" , value = "更新时间")
    private Date updateTime;
    @ApiModelProperty(name = "updateUid" , value = "修改人用户ID")
    private Long updateUid;
    @ApiModelProperty(name = "loginIp" , value = "登录IP地址")
    private String loginIp;
    @ApiModelProperty(name = "loginAddr" , value = "登录地址")
    private String loginAddr;
    @Override
    protected Serializable pkVal() {
        return this.id;
    }
}

20.jpg

DAO

/**
 * @filename:UserDao CollectionRoute
 * @project wallet-sign  V1.0
 * Copyright(c) 2018 BianPeng Co. Ltd. 
 * All right reserved. 
 */
package com.emep.mall.admin.dao;

import java.util.List;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import com.emep.mall.admin.entity.User;

/**   
 * Copyright: Copyright (c) 2019 
 * 
 * <p>说明: 资金归集数据访问层</P>
 * @version: V1.0
 * @author: BianPeng
 * 
 * Modification History:
 * Date             Author          Version          Description
 *---------------------------------------------------------------*
 * CollectionRoute      BianPeng    V1.0         initialize
 */
@Mapper
public interface UserDao extends BaseMapper<User> {
    
}

21.jpg

xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.emep.mall.admin.dao.UserDao">

    <resultMap id="BaseResultMap" type="com.emep.mall.admin.entity.User">
        <id column="id" property="id" />
        <id column="login_name" property="loginName" />
        <id column="password" property="password" />
        <id column="nickname" property="nickname" />
        <id column="type" property="type" />
        <id column="state" property="state" />
        <id column="note" property="note" />
        <id column="create_time" property="createTime" />
        <id column="update_time" property="updateTime" />
        <id column="update_uid" property="updateUid" />
        <id column="login_ip" property="loginIp" />
        <id column="login_addr" property="loginAddr" />
    </resultMap>
    <sql id="Base_Column_List">
        id, login_name, password, nickname, type, state, note, create_time, update_time, update_uid, login_ip, login_addr
    </sql>
    
</mapper>
22.jpg

service

/**
 * @filename:UserService CollectionRoute
 * @project wallet-sign  V1.0
 * Copyright(c) 2018 BianPeng Co. Ltd. 
 * All right reserved. 
 */
package com.emep.mall.admin.service;

import com.emep.mall.admin.entity.User;
import com.baomidou.mybatisplus.extension.service.IService;
/**   
 * Copyright: Copyright (c) 2019 
 * 
 * <p>说明: 资金归集服务层</P>
 * @version: V1.0
 * @author: BianPeng
 * 
 * Modification History:
 * Date             Author          Version          Description
 *---------------------------------------------------------------*
 * CollectionRoute      BianPeng    V1.0           initialize
 */
public interface UserService extends IService<User> {
    
}
23.jpg

serviceImpl

/**
 * @filename:UserServiceImpl CollectionRoute
 * @project wallet-sign  V1.0
 * Copyright(c) 2018 BianPeng Co. Ltd. 
 * All right reserved. 
 */
package com.emep.mall.admin.service.impl;

import com.emep.mall.admin.entity.User;
import com.emep.mall.admin.dao.UserDao;
import com.emep.mall.admin.service.UserService;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

/**   
 * Copyright: Copyright (c) 2019 
 * 
 * <p>说明: 资金归集服务实现层</P>
 * @version: V1.0
 * @author: BianPeng
 * 
 * Modification History:
 * Date             Author          Version          Description
 *---------------------------------------------------------------*
 * CollectionRoute      BianPeng    V1.0           initialize
 */
@Service
public class UserServiceImpl  extends ServiceImpl<UserDao, User> implements UserService  {
    
}
24.jpg

controller

/**
 * @filename:UserController CollectionRoute
 * @project wallet-sign  V1.0
 * Copyright(c) 2018 BianPeng Co. Ltd. 
 * All right reserved. 
 */
package com.emep.mall.admin.web;



import com.emep.mall.admin.response.JsonResult;
import com.emep.mall.admin.entity.User;
import com.emep.mall.admin.service.UserService;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;

/**   
 * Copyright: Copyright (c) 2019 
 * https://my.oschina.net/bianxin/blog/3035352?nocache=1554967026459
 * <p>说明: 资金归集API接口层</P>
 * @version: V1.0
 * @author: BianPeng
 * 
 * Modification History:
 * Date             Author          Version          Description
 *---------------------------------------------------------------*
 * CollectionRoute      BianPeng    V1.0           initialize
 */
@Api(description = "资金归集",value="资金归集" )
@RestController
@RequestMapping("/user")
public class UserController {

    Logger logger = LoggerFactory.getLogger(this.getClass());
    
    @Autowired
    public UserService userServiceImpl;
    
    /**
     * @explain 查询资金归集对象  <swagger GET请求>
     * @param   对象参数:id
     * @return  user
     * @author  BianPeng
     * @time    CollectionRoute
     */
    @GetMapping("/getUserById/{id}")
    @ApiOperation(value = "获取资金归集信息", notes = "获取资金归集信息[user],作者:BianPeng")
    @ApiImplicitParam(paramType="path", name = "id", value = "资金归集id", required = true, dataType = "Long")
    public JsonResult<User> getUserById(@PathVariable("id")Long id){
        JsonResult<User> result=new JsonResult<User>();
        try {
            User user=userServiceImpl.getById(id);
            if (user!=null) {
                result.setType("success");
                result.setMessage("成功");
                result.setData(user);
            } else {
                logger.error("获取资金归集失败ID:"+id);
                result.setType("fail");
                result.setMessage("你获取的资金归集不存在");
            }
        } catch (Exception e) {
            logger.error("获取资金归集执行异常:"+e.getMessage());
            result=new JsonResult<User>(e);
        }
        return result;
    }

    /**
     * @explain 添加或者更新资金归集对象
     * @param   对象参数:user
     * @return  int
     * @author  BianPeng
     * @time    CollectionRoute
     */
    @PostMapping("/insertSelective")
    @ApiOperation(value = "添加资金归集", notes = "添加资金归集[user],作者:BianPeng")
    public JsonResult<User> insertSelective(User user){
        JsonResult<User> result=new JsonResult<User>();
        try {
            boolean rg=userServiceImpl.saveOrUpdate(user);
            if (rg) {
                result.setType("success");
                result.setMessage("成功");
                result.setData(user);
            } else {
                logger.error("添加资金归集执行失败:"+user.toString());
                result.setType("fail");
                result.setMessage("执行失败,请稍后重试");
            }
        } catch (Exception e) {
            logger.error("添加资金归集执行异常:"+e.getMessage());
            result=new JsonResult<User>(e);
        }
        return result;
    }

    /**
     * @explain 删除资金归集对象
     * @param   对象参数:id
     * @return  int
     * @author  BianPeng
     * @time    CollectionRoute
     */
    @PostMapping("/deleteByPrimaryKey")
    @ApiOperation(value = "删除资金归集", notes = "删除资金归集,作者:BianPeng")
    @ApiImplicitParam(paramType="query", name = "id", value = "资金归集id", required = true, dataType = "Long")
    public JsonResult<Object> deleteByPrimaryKey(Long id){
        JsonResult<Object> result=new JsonResult<Object>();
        try {
            boolean reg=userServiceImpl.removeById(id);
            if (reg) {
                result.setType("success");
                result.setMessage("成功");
                result.setData(id);
            } else {
                logger.error("删除资金归集失败ID:"+id);
                result.setType("fail");
                result.setMessage("执行错误,请稍后重试");
            }
        } catch (Exception e) {
            logger.error("删除资金归集执行异常:"+e.getMessage());
            result=new JsonResult<Object>(e);
        }
        return result;
    }

    /**
     * @explain 分页条件查询资金归集
     * @param   对象参数:AppPage<User>
     * @return  PageInfo<User>
     * @author  BianPeng
     * @time    CollectionRoute
     */
    @GetMapping("/getUserPages")
    @ApiOperation(value = "分页查询", notes = "分页查询返回对象[IPage<User>],作者:边鹏")
    @ApiImplicitParams({
        @ApiImplicitParam(paramType="query", name = "pageNum", value = "当前页", required = true, dataType = "int"),
        @ApiImplicitParam(paramType="query", name = "pageSize", value = "页行数", required = true, dataType = "int")
    })
    public JsonResult<IPage<User>> getUserPages(Integer pageNum,Integer pageSize){
    
        JsonResult<IPage<User>> result=new JsonResult<IPage<User>>();
        Page<User> page=new Page<User>(pageNum,pageSize);
        QueryWrapper<User> queryWrapper =new QueryWrapper<User>();
        //分页数据
        try {
            IPage<User> pageInfo=userServiceImpl.page(page, queryWrapper);
            result.setType("success");
            result.setMessage("成功");
            result.setData(pageInfo);
        } catch (Exception e) {
            logger.error("分页查询资金归集执行异常:"+e.getMessage());
            result=new JsonResult<IPage<User>>(e);
        }
        return result;
    }
}
25.jpg

aJaxResponse

package com.emep.mall.admin.response;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.Serializable;
import java.net.ConnectException;
import java.sql.SQLException;

/**
 * Copyright: Copyright (c) 2019
 *
 * <p>说明: 用户服务层</P>
 * @version: V1.0
 * @author: BianPeng
 *
 * Modification History:
 * Date         Author         Version         Description
 *---------------------------------------------------------*
 * 2019/4/9     flying-cattle  V1.0            initialize
 */
public class JsonResult <T> implements Serializable {

    Logger logger = LoggerFactory.getLogger(this.getClass());
    private static final long serialVersionUID = 1071681926787951549L;

    /**
     * <p>返回状态</p>
     */
    private Boolean isTrue=true;
    /**
     *<p> 状态码</p>
     */
    private String code;
    /**
     * <p>业务码</p>
     */
    private String type;
    /**
     *<p> 状态说明</p>
     */
    private String message;
    /**
     * <p>返回数据</p>
     */
    private T data;
    public Boolean getTrue() {
        return isTrue;
    }
    public void setTrue(Boolean aTrue) {
        isTrue = aTrue;
    }
    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
    public T getData() {
        return data;
    }
    public void setData(T data) {
        this.data = data;
    }
    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    }
    /**
     * <p>返回成功</p>
     * @param type 业务码
     * @param message 错误说明
     * @param data 数据
     */
    public JsonResult(String type, String message, T data) {
        this.isTrue=true;
        this.code ="0000";
        this.type=type;
        this.message = message;
        this.data=data;
    }
    public JsonResult() {
        this.isTrue=true;
        this.code ="0000";
    }
    public JsonResult(Throwable throwable) {
        logger.error(throwable+"tt");
        this.isTrue=false;
        if(throwable instanceof NullPointerException){
            this.code= "1001";
            this.message="空指针:"+throwable;
        }else if(throwable instanceof ClassCastException ){
            this.code= "1002";
            this.message="类型强制转换异常:"+throwable;
        }else if(throwable instanceof ConnectException){
            this.code= "1003";
            this.message="链接失败:"+throwable;
        }else if(throwable instanceof IllegalArgumentException ){
            this.code= "1004";
            this.message="传递非法参数异常:"+throwable;
        }else if(throwable instanceof NumberFormatException){
            this.code= "1005";
            this.message="数字格式异常:"+throwable;
        }else if(throwable instanceof IndexOutOfBoundsException){
            this.code= "1006";
            this.message="下标越界异常:"+throwable;
        }else if(throwable instanceof SecurityException){
            this.code= "1007";
            this.message="安全异常:"+throwable;
        }else if(throwable instanceof SQLException){
            this.code= "1008";
            this.message="数据库异常:"+throwable;
        }else if(throwable instanceof ArithmeticException){
            this.code= "1009";
            this.message="算术运算异常:"+throwable;
        }else if(throwable instanceof RuntimeException){
            this.code= "1010";
            this.message="运行时异常:"+throwable;
        }else if(throwable instanceof Exception){
            logger.error("未知异常:"+throwable);
            this.code= "9999";
            this.message="未知异常"+throwable;
        }
    }
}
26.jpg

generator生成器

package com.emep.mall.admin.generator;

import com.github.mybatis.fl.entity.BasisInfo;
import com.github.mybatis.fl.util.EntityInfoUtil;
import com.github.mybatis.fl.util.Generator;
import com.github.mybatis.fl.util.MySqlToJavaUtil;

import java.sql.SQLException;
import java.util.Date;

/**
 * @ClassName: MyGenerator
 * @Description:
 * @Author: BYP <502955177@qq.com>
 * @Date: 2020/9/25  23:04
 * @Copyright: 2019 www.tydic.com Inc. All rights reserved.
 * 注意:本内容仅限于弘毅天承信息技术股份有限公司内部传阅,禁止外泄以及用于其他的商业目
 */
/**
 * Copyright: Copyright (c) 2019
 *
 * <p>说明: 自动生成工具</P>
 * <p>源码地址:https://gitee.com/flying-cattle/mybatis-dsc-generator</P>
 */
public class MyGenerator {

    // 基础信息:项目名、作者、版本
    public static final String PROJECT = "wallet-sign";
    public static final String AUTHOR = "BianPeng";
    public static final String VERSION = "V1.0";
    // 数据库连接信息:连接URL、用户名、秘密、数据库名
    public static final String URL = "jdbc:mysql://127.0.0.1:3306/buybit_wallet_sign?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&failOverReadOnly=false&useSSL=true&serverTimezone=UTC";
    public static final String NAME = "root";
    public static final String PASS = "root";
    public static final String DATABASE = "buybit_wallet_sign";
    // 类信息:类名、对象名(一般是【类名】的首字母小些)、类说明、时间
    public static final String CLASSNAME = "CollectionRoute";
    public static final String TABLE = "user";
    public static final String CLASSCOMMENT = "用户";
    public static final String TIME = "2019年6月12日";
    public static final String AGILE = new Date().getTime() + "";
    // 路径信息,分开路径方便聚合工程项目,微服务项目
    public static final String ENTITY_URL = "com.emep.mall.admin.entity";
    public static final String DAO_URL = "com.emep.mall.admin.dao";
    public static final String XML_URL = "com.emep.mall.admin.dao.impl";
    public static final String SERVICE_URL = "com.emep.mall.admin.service";
    public static final String SERVICE_IMPL_URL = "com.emep.mall.admin.service.impl";
    public static final String CONTROLLER_URL = "com.emep.mall.admin.web";
    //是否是Swagger配置
    public static final String IS_SWAGGER = "true";


    public static void main(String[] args) {
        BasisInfo bi = new BasisInfo(PROJECT, AUTHOR, VERSION, URL, NAME, PASS, DATABASE, CLASSNAME, AGILE, ENTITY_URL, DAO_URL, XML_URL, SERVICE_URL, SERVICE_IMPL_URL, CONTROLLER_URL);
        bi.setTable(TABLE);
        bi.setEntityName(MySqlToJavaUtil.getClassName(TABLE));
        bi.setObjectName(MySqlToJavaUtil.changeToJavaFiled(TABLE));
        bi.setEntityComment(CLASSCOMMENT);
        try {
            bi = EntityInfoUtil.getInfo(bi);
            String fileUrl = "D:\\software\\workspace\\idea\\admin\\src\\main\\java\\";// 生成文件存放位置
            //开始生成文件
            String aa1 = Generator.createEntity(fileUrl, bi).toString();
            String aa2 = Generator.createDao(fileUrl, bi).toString();
            String aa3 = Generator.createDaoImpl(fileUrl, bi).toString();
            String aa4 = Generator.createService(fileUrl, bi).toString();
            String aa5 = Generator.createServiceImpl(fileUrl, bi).toString();
            String aa6 = Generator.createController(fileUrl, bi).toString();

            System.out.println(aa1);
            System.out.println(aa2); System.out.println(aa3); System.out.println(aa4);
            System.out.println(aa5); System.out.println(aa6);

        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

27.jpg

如果你生成的分页的方法不能分页:根据官方提升,记得在启动类中加入

@Bean
public PaginationInterceptor paginationInterceptor() {
    return new PaginationInterceptor();
}

项目最后的结果给大家展示一下:


28.jpg
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351