210904:Mybatis-Plus的實(shí)體類(lèi)注解/多數(shù)據(jù)源配置/Wrapper條件構(gòu)造器篩選不必要的字段/代碼自動(dòng)生成-Navicat v15激活步驟-服務(wù)部署到docker后陷舅,查看信息

一. Mybatis-Plus的實(shí)體類(lèi)注解

1. @TableName注解

@TableName(value = …)

當(dāng)數(shù)據(jù)庫(kù)名與實(shí)體類(lèi)名不一致或不符合駝峰命名時(shí)墨状,需要在此注解指定表名

@TableId(type = …)

指定實(shí)體類(lèi)的屬性為對(duì)應(yīng)的主鍵杯瞻,主要有以下幾種:

// 數(shù)據(jù)庫(kù)ID自增
IdType.AUTO
// 該類(lèi)型為未設(shè)置主鍵類(lèi)型(默認(rèn))
IdType.NONE 
/**
 * 用戶(hù)輸入ID
 * <p>該類(lèi)型可以通過(guò)自己注冊(cè)自動(dòng)填充插件進(jìn)行填充</p>
 */
IdType.INPUT
/* 以下3種類(lèi)型胁赢、只有當(dāng)插入對(duì)象ID 為空,才自動(dòng)填充亦渗。 */
//1.全局唯一ID (idWorker)
IdType.ID_WORKER
//2.全局唯一ID (UUID)
IdType.UUID
//3.字符串全局唯一ID (idWorker 的字符串表示)
IdType.ID_WORKER_STR

2. @TableField注解

  1. 主要用來(lái)解決實(shí)體類(lèi)的字段名與數(shù)據(jù)庫(kù)中的字段名不匹配的問(wèn)題(數(shù)據(jù)庫(kù)user_addr,字段useraddr未駝峰)
  2. 實(shí)體類(lèi)中的屬性字段在表中不存在的問(wèn)題
// 用來(lái)解決數(shù)據(jù)庫(kù)中的字段和實(shí)體類(lèi)的字段不匹配問(wèn)題
@TableField(value = "age")
// 用來(lái)解決實(shí)體類(lèi)中有的屬性但是數(shù)據(jù)表中沒(méi)有的字段
@TableField(exist = false)  // 默認(rèn)為true

二. Navicat v15激活步驟

navicat15安裝完后別著急打開(kāi)

1. 運(yùn)行Navicat Keygen Patch v5.6.0 DFoX.exe

2. 點(diǎn)擊Generate按鈕就會(huì)生成一個(gè)許可證秘鑰汁尺,將許可證秘鑰復(fù)制后就打開(kāi)Navicat Premium 15

3. 打開(kāi)Navicat Premium 15法精,點(diǎn)擊注冊(cè)

4. 粘貼秘鑰,然后點(diǎn)擊激活按鈕

5. 在彈出的界面選擇手動(dòng)激活

6. 將請(qǐng)求碼粘貼到注冊(cè)機(jī)Request Code框中

7. 點(diǎn)擊激活頁(yè)面的激活彈出(說(shuō)明激活成功)

三. 服務(wù)部署到docker后痴突,查看信息

1. 查看日志信息

docker logs -tf --tail 10 容器ID

2. 查看服務(wù)的配置文件

2.1 列出在運(yùn)行的容器

docker ps

2.2 進(jìn)入該容器

docker exec -it 容器ID /bin/bash

2.3 找到配置文件后進(jìn)行修改查看

四. Mybatis-plus多數(shù)據(jù)源配置

1. 環(huán)境準(zhǔn)備

1.1 數(shù)據(jù)庫(kù)相關(guān)

以 mysql 為例進(jìn)行演示說(shuō)明搂蜓,因?yàn)樾枰鄶?shù)據(jù)源,一個(gè)最簡(jiǎn)單的 case 就是一個(gè)物理庫(kù)上多個(gè)邏輯庫(kù)辽装,本文是基于本機(jī)的 mysql 進(jìn)行操作

創(chuàng)建數(shù)據(jù)庫(kù)teststory帮碰,兩個(gè)庫(kù)下都存在一個(gè)表money (同名同結(jié)構(gòu)表,但是數(shù)據(jù)不同哦)

CREATE TABLE `money` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL DEFAULT '' COMMENT '用戶(hù)名',
  `money` int(26) NOT NULL DEFAULT '0' COMMENT '錢(qián)',
  `is_deleted` tinyint(1) NOT NULL DEFAULT '0',
  `create_at` date NOT NULL  COMMENT '創(chuàng)建時(shí)間',
  `update_at` date NOT NULL  COMMENT '更新時(shí)間',
  PRIMARY KEY (`id`),
  KEY `name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

1.2 項(xiàng)目環(huán)境

本項(xiàng)目借助SpringBoot 2.2.1.RELEASE + maven 3.5.3 + IDEA進(jìn)行開(kāi)發(fā)

下面是核心的pom.xml

<dependencies>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>

    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
        <version>3.3.1</version>
    </dependency>

    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.3.1</version>
    </dependency>
</dependencies>

配置文件信息application.yml拾积,請(qǐng)注意下面的寫(xiě)法格式殉挽,如有疑問(wèn)可以參考官方教程

spring:
  datasource:
    dynamic:
      primary: story #設(shè)置默認(rèn)的數(shù)據(jù)源或者數(shù)據(jù)源組,默認(rèn)值即為master
      strict: false  #設(shè)置嚴(yán)格模式,默認(rèn)false不啟動(dòng). 啟動(dòng)后在未匹配到指定數(shù)據(jù)源時(shí)候會(huì)拋出異常,不啟動(dòng)則使用默認(rèn)數(shù)據(jù)源.
      datasource:
        story:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://127.0.0.1:3306/story?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
          username: root
          password:
        test:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
          username: root
          password:

2. 項(xiàng)目演示

2.1 實(shí)體類(lèi)

mybatis-plus 可以借助插件實(shí)現(xiàn)自動(dòng)生成相應(yīng)的代碼,我們這里簡(jiǎn)單自主實(shí)現(xiàn)測(cè)試 demo拓巧,因?yàn)閮蓚€(gè)數(shù)據(jù)庫(kù)中表結(jié)構(gòu)完全一致斯碌,所以只需要一個(gè) Entity

@Data
@Accessors(chain = true)
@TableName(value = "money")
public class MoneyPo {
    /**
     * 指定自增策略
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;

    private String name;

    private Long money;

    @TableField("is_deleted")
    private Integer isDeleted;

    @TableField(value = "create_at")
    private Date createAt;

    @TableField(value = "update_at")
    private Date updateAt;
}

2.2 Mapper 接口

數(shù)據(jù)庫(kù)操作定義接口MoneyMapper

public interface MoneyMapper extends BaseMapper<MoneyPo> {
}

對(duì)應(yīng)的 xml 文件resources/mapper/money-mapper.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.ruangh.mybatisplus.datasouce.mybatisplusdatasouce.mapper.MoneyMapper">
</mapper>

2.3 Service 接口與實(shí)現(xiàn)

因?yàn)閮蓮埍恚晕覀兛梢远x一個(gè)接口肛度,兩個(gè)不同的實(shí)現(xiàn)

public interface MoneyService extends IService<MoneyPo> {
}

@Service
@DS("story")
public class StoryMoneyServiceImpl extends ServiceImpl<MoneyMapper, MoneyPo> implements MoneyService {
}

@Service
@DS("test")
public class TestMoneyServiceImpl extends ServiceImpl<MoneyMapper, MoneyPo> implements MoneyService {
}

請(qǐng)注意上面 Service 的注解@DS傻唾,value 為前面數(shù)據(jù)源配置文件中的 key(spring.datasource.dynamic.datasource下面的story + test)

這個(gè)注解可以放在類(lèi)上也可以放在方法上,方法上的優(yōu)先級(jí) > 類(lèi)承耿,所以上面的兩個(gè) Service 實(shí)現(xiàn)可以改成一個(gè)

@Service
public class MoneyServiceImpl extends ServiceImpl<MoneyMapper, MoneyPo> implements MoneyService {

    @DS("story")
    public List<MoneyPo> findByStoryIds(Collection<Long> ids) {
        return baseMapper.selectBatchIds(ids);
    }

    @DS("test")
    public List<MoneyPo> findByTestIds(Collection<Long> ids) {
        return baseMapper.selectBatchIds(ids);
    }
}

2.4 測(cè)試

為簡(jiǎn)單起見(jiàn)冠骄,直接在啟動(dòng)類(lèi)中添加寫(xiě)上測(cè)試代碼

![010](E:\ruanghDoc\LearningClip\學(xué)習(xí)筆記\新能康-復(fù)盤(pán)\210904-mybatis-plus注解\010.png)@SpringBootApplication
@MapperScan("com.ruangh.mybatisplus.datasouce.mybatisplusdatasouce.mapper")
public class MybatisplusDatasouceApplication {

    public MybatisplusDatasouceApplication(TestMoneyServiceImpl testMoneyService, StoryMoneyServiceImpl storyMoneyService) {
        List<MoneyPo> moneyPoList = testMoneyService.listByIds(Arrays.asList(1, 1000));
        System.out.println(moneyPoList);
        System.out.println("--------------");

        moneyPoList = storyMoneyService.listByIds(Arrays.asList(1, 1000));
        System.out.println(moneyPoList);
    }

    public static void main(String[] args) {
        SpringApplication.run(Application.class);
    }
}

3. 遇到的坑

可以看到啟動(dòng)過(guò)程中我們配置的多數(shù)據(jù)庫(kù)源Start completed.之后遇到異常之后又被shutdown了。

因?yàn)橐肓硕鄠€(gè)Mybatis 的jar包引起的加袋,檢查bom.xml文件是否引入了mybatis和mybatis-plus兩個(gè)依賴(lài)凛辣,如果是去掉mybatis即可。

五. MyBatis-Plus Wrapper條件構(gòu)造器篩選不必要的字段

1. 需求

這個(gè)MP的Wrapper默認(rèn)查詢(xún)是查詢(xún)?nèi)康牧兄吧眨俏业男枨笫切枰樵?xún)某幾個(gè)列即可蟀给。

2. 解決辦法

/**
     * 名字包含雨并且年齡小于40
     * <p>
     * 只顯示id蝙砌、name 兩列
     */
@Test
public void selectByWrapper1() {
    QueryWrapper<User> wrapper = new QueryWrapper();
    wrapper.like("name", "雨").lt("age", 40)
        .select("id","name");
    List<User> users = userMapper.selectList(wrapper);
    users.forEach(System.out::println);
}

/**
     * 名字包含雨并且年齡小于40
     * <p>
     * 除了create_time、manager_id 其他列都顯示
     */
@Test
public void selectByWrapper2() {
    QueryWrapper<User> wrapper = new QueryWrapper();
    wrapper.like("name", "雨").lt("age", 40)
        .select(User.class,i -> !i.getColumn().equals("create_time")
                && !i.getColumn().equals("manager_id"));
    List<User> users = userMapper.selectList(wrapper);
    users.forEach(System.out::println);
}

六. Mybatis-Plus代碼自動(dòng)生成

1. 準(zhǔn)備

準(zhǔn)備兩張表跋理,用于測(cè)試

CREATE TABLE `userT0` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL DEFAULT '' COMMENT '用戶(hù)名',
  `pwd` varchar(26) NOT NULL DEFAULT '' COMMENT '密碼',
  `isDeleted` tinyint(1) NOT NULL DEFAULT '0',
  `created` varchar(13) NOT NULL DEFAULT '0',
  `updated` varchar(13) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `story_t0` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `userId` int(20) unsigned NOT NULL DEFAULT '0' COMMENT '作者的userID',
  `name` varchar(20) NOT NULL DEFAULT '' COMMENT '作者名',
  `title` varchar(26) NOT NULL DEFAULT '' COMMENT '密碼',
  `story` text COMMENT '故事內(nèi)容',
  `is_deleted` tinyint(1) NOT NULL DEFAULT '0',
  `create_at` varchar(13) NOT NULL DEFAULT '0',
  `update_at` varchar(13) NOT NULL DEFAULT '0',
  `tag` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `userId` (`userId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

請(qǐng)注意择克,上面兩張表的命名格式并不一樣,有的是駝峰前普,有的是下劃線(主要為了演示不同表名肚邢,對(duì)于生成代碼的影響)

2. 配置依賴(lài)

首先需要在我們的xml文件中,添加相關(guān)的依賴(lài)

<dependencies>
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-generator</artifactId>
        <version>3.3.1.tmp</version>
    </dependency>
    <dependency>
        <groupId>org.freemarker</groupId>
        <artifactId>freemarker</artifactId>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>

    <!-- 下面兩個(gè)拭卿,用于測(cè)試生成后的代碼骡湖,在生成代碼時(shí),可以不需要-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.2.0</version>
    </dependency>
</dependencies>

3. 代碼生成類(lèi)

寫(xiě)一個(gè)代碼生成類(lèi)方法峻厚,主要邏輯如下

public class CodeGenerator {
    public static void main(String[] args) {
        // 代碼生成器
        AutoGenerator mpg = new AutoGenerator();

        // 全局配置
        GlobalConfig gc = new GlobalConfig();
        String projectPath = System.getProperty("user.dir") + "/spring-boot/106-mybatis-plus-generator";
        gc.setOutputDir(projectPath + "/src/main/java");
        gc.setAuthor("ruangh");
        gc.setOpen(false);
        // 覆蓋寫(xiě)
        gc.setFileOverride(false);
        mpg.setGlobalConfig(gc);

        // 數(shù)據(jù)源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://127.0.0.1:3306/story?useSSL=false&serverTimezone=UTC");
        // dsc.setSchemaName("public");
        dsc.setDriverName("com.mysql.jdbc.Driver");
        dsc.setUsername("root");
        dsc.setPassword("123456");
        mpg.setDataSource(dsc);

        // 包配置
        PackageConfig pc = new PackageConfig();
        // 不額外指定模塊响蕴,如果指定為 test,則生成的xml會(huì)在 mapper/test/ 目錄下
        pc.setModuleName("");
        pc.setParent("com.ruangh.mybatisplus.generator");
        mpg.setPackageInfo(pc);

        // 自定義配置
        InjectionConfig cfg = new InjectionConfig() {
            @Override
            public void initMap() {
                // to do nothing
            }
        };

        // 如果模板引擎是 freemarker
        String templatePath = "/templates/mapper.xml.ftl";

        // 自定義輸出配置
        List<FileOutConfig> focList = new ArrayList<>();
        // 自定義配置會(huì)被優(yōu)先輸出
        focList.add(new FileOutConfig(templatePath) {
            @Override
            public String outputFile(TableInfo tableInfo) {
                // 自定義輸出文件名 惠桃, 如果你 Entity 設(shè)置了前后綴浦夷、此處注意 xml 的名稱(chēng)會(huì)跟著發(fā)生變化!辜王!
                return projectPath + "/src/main/resources/mapper/" + pc.getModuleName() + "/" +
                        tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
            }
        });

        cfg.setFileOutConfigList(focList);
        mpg.setCfg(cfg);

        // 配置模板
        TemplateConfig templateConfig = new TemplateConfig();
        templateConfig.setXml(null);
        // 不自動(dòng)生成controller類(lèi)
        templateConfig.setController(null);
        mpg.setTemplate(templateConfig);

        // 策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setNaming(NamingStrategy.underline_to_camel);
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        // strategy.setSuperEntityClass("你自己的父類(lèi)實(shí)體,沒(méi)有就不用設(shè)置!");
        strategy.setEntityLombokModel(true);
        strategy.setRestControllerStyle(true);
        // 公共父類(lèi)
        // strategy.setSuperControllerClass("你自己的父類(lèi)控制器,沒(méi)有就不用設(shè)置!");
        // 寫(xiě)于父類(lèi)中的公共字段
        // strategy.setSuperEntityColumns("id");

        // 設(shè)置需要生成的表名
        strategy.setInclude("userT0", "story_t0");
        strategy.setControllerMappingHyphenStyle(true);
        // strategy.setTablePrefix(pc.getModuleName() + "_");
        mpg.setStrategy(strategy);
        mpg.setTemplateEngine(new FreemarkerTemplateEngine());
        mpg.execute();
    }
}

上面的代碼劈狐,絕大部分都是通用的,下面著重說(shuō)明需要注意的點(diǎn)

  • GlobalConfig#setOutputDir: 設(shè)置代碼輸出的項(xiàng)目根路徑呐馆,請(qǐng)根據(jù)具體的項(xiàng)目要求進(jìn)行指定肥缔,不包含包名哦

  • GlobalConfig#setFileOverride(true)
    

    : 設(shè)置為true,則每次生成都會(huì)覆蓋之前生成的代碼汹来,適用于表結(jié)構(gòu)發(fā)生變化的場(chǎng)景

    • 注意:會(huì)導(dǎo)致之前添加的業(yè)務(wù)代碼被覆蓋掉续膳,需要額外注意
    • 通常希望設(shè)置為false,當(dāng)表結(jié)構(gòu)發(fā)生變化時(shí)收班,手動(dòng)介入
  • DataSourceConfig: 數(shù)據(jù)源的設(shè)置姑宽,上面設(shè)置的是mysql的相關(guān)配置

  • PackageConfig
    

    : 包信息

    • setParent: java包路徑
    • setModuleName: 設(shè)置模塊名,如設(shè)置為test闺阱,則xml在mapper/test/目錄下; parent包自動(dòng)加上.test
  • FileOutConfig: xml文件名

  • TemplateConfig
    

    : 模板配置

    • 可用默認(rèn)的代碼生成模板炮车,也可以使用自定義的模板
    • 不想生成某個(gè)模板類(lèi)時(shí),設(shè)置為null即可(如上面的不生成controller)
  • StrategyConfig
    

    : 策略配置

    • 可以指定db->pojo字段名的映射規(guī)則
    • 可以指定POJO/Controller繼承自定義的基類(lèi)

在IDEA中酣溃,直接右鍵執(zhí)行上面的代碼瘦穆,就會(huì)生成目標(biāo)類(lèi),如下截圖

4. 輸出測(cè)試

測(cè)試我們生成的類(lèi)赊豌,是否可以對(duì)db進(jìn)行操作扛或,則有必要寫(xiě)一個(gè)啟動(dòng)類(lèi)

@RestController
@SpringBootApplication
@MapperScan("com.ruangh.mybatisplus.generator.mapper")
public class Application {
    @Autowired
    private IUserT0Service userT0Service;

    @GetMapping
    public UserT0 hello(int id) {
        return userT0Service.getById(id);
    }

    public static void main(String[] args) {
        SpringApplication.run(Application.class);
    }
}

請(qǐng)注意上面的@MapperScan注解,其次對(duì)應(yīng)的application.yml配置文件內(nèi)容如下

spring:
  datasource:
    # 注意指定時(shí)區(qū)
    url: jdbc:mysql://127.0.0.1:3306/story?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
    username: root
    password:

mybatis-plus:
  configuration:
    # 執(zhí)行的sql語(yǔ)句日志輸出
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

在db中插入一條數(shù)據(jù)

INSERT INTO `userT0` (`id`, `name`, `pwd`, `isDeleted`, `created`, `updated`)
VALUES
true(1, '一灰灰', 'yihuihuiblog', 0, '2020-04-06 15', '2020-04-06 15');

訪問(wèn)url: http://localhost:8080/?id=1

控制臺(tái)輸出如下:

5. 特殊場(chǎng)景說(shuō)明

上面的代碼生成碘饼,針對(duì)首次執(zhí)行生成打碼時(shí)熙兔,問(wèn)題不大悲伶;但是后續(xù)的業(yè)務(wù)開(kāi)發(fā)中,總會(huì)有一些其他的情況住涉,下面分別說(shuō)明

5.1 表結(jié)構(gòu)修改

當(dāng)表的結(jié)構(gòu)發(fā)生變化時(shí)麸锉,我們需要一般需要重新生成對(duì)應(yīng)的Entity,這個(gè)時(shí)候舆声,需要GlobalConfig#setFileOverride(true)

5.2 繼承公用POJO

我們可以定義一個(gè)通用的PO類(lèi)花沉,希望所有的表生成的POJO繼承它

@Data
public class BasePo implements Serializable {
    private static final long serialVersionUID = -1136173266983480386L;

    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;

}

在代碼自動(dòng)生成類(lèi)的策略配置中,添加下面的兩行設(shè)置即可

// 所有實(shí)體類(lèi)繼承自 BasePo, 且id在父類(lèi)中
StrategyConfig strategy = new StrategyConfig();
strategy.setSuperEntityClass(BasePo.class);
strategy.setSuperEntityColumns("id");

5.3 生成部分代碼

有些時(shí)候媳握,我并不希望生成service,xml碱屁,可能就只需要實(shí)體類(lèi) + mapper接口,這個(gè)時(shí)候可以設(shè)置TemplateConfig

TemplateConfig templateConfig = new TemplateConfig();
templateConfig.setController(null);
templateConfig.setEntityKt(null);
templateConfig.setService(null);
templateConfig.setServiceImpl(null);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蛾找,一起剝皮案震驚了整個(gè)濱河市娩脾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌打毛,老刑警劉巖柿赊,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異隘冲,居然都是意外死亡闹瞧,警方通過(guò)查閱死者的電腦和手機(jī)绑雄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)展辞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人万牺,你說(shuō)我怎么就攤上這事罗珍。” “怎么了脚粟?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵覆旱,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我核无,道長(zhǎng)扣唱,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任团南,我火速辦了婚禮噪沙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘吐根。我一直安慰自己正歼,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布拷橘。 她就那樣靜靜地躺著局义,像睡著了一般喜爷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上萄唇,一...
    開(kāi)封第一講書(shū)人閱讀 51,688評(píng)論 1 305
  • 那天檩帐,我揣著相機(jī)與錄音,去河邊找鬼穷绵。 笑死轿塔,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的仲墨。 我是一名探鬼主播勾缭,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼目养!你這毒婦竟也來(lái)了俩由?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤癌蚁,失蹤者是張志新(化名)和其女友劉穎幻梯,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體努释,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡碘梢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了伐蒂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片煞躬。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖逸邦,靈堂內(nèi)的尸體忽然破棺而出恩沛,到底是詐尸還是另有隱情,我是刑警寧澤缕减,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布雷客,位于F島的核電站,受9級(jí)特大地震影響桥狡,放射性物質(zhì)發(fā)生泄漏搅裙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一裹芝、第九天 我趴在偏房一處隱蔽的房頂上張望部逮。 院中可真熱鬧,春花似錦局雄、人聲如沸甥啄。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蜈漓。三九已至穆桂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間融虽,已是汗流浹背享完。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留有额,地道東北人般又。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像巍佑,于是被迫代替她去往敵國(guó)和親茴迁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

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