springBoot01----2019-05-16

一,springboot简介

1,简介

简化spring应用开发的一个框架

整个spring技术栈的一个大整合

J2EE开发的一站式解决方案

2,微服务

martin fowler 2014发表了一篇微服务的博客,这个时候微服务才慢慢的被人所熟知

什么是微服务?

解释的是当我们开发一个应用时,这个应用应该是作为我们一系列小服务的组合

一个应用应该是一个小型服务,可以通过http的方式进行互通

传统的单体应用,在开发和部署都和简单,但是当修改时,可能会带来很多的麻烦,一个大型应用这样使用就太麻烦

[图片上传失败...(image-d5101c-1557995679911)]

每一个功能元素最后都是一个可独立替换独立生成的单元,但是相对的,太多的单个元素直接互调会带来很多的麻烦,所以这个时候使用springcloud来进行分布式的互调,这样spring就提供了一站式的开发

[图片上传失败...(image-b1dcaa-1557995679911)]

3,优点

  • 快速创建独立运行的spring项目以及主流框架集成(也就是说,可以简化那些之前学习ssm时的框架的配置,以及快速开发)

  • 有内嵌的servlet容器,应用无需打成war包,(直接打成jar包,用java -jar就可以运行)

  • starters自动依赖与版本控制,这样可以简化操作,需要使用什么技术的相关功能直接导入对应的starters即可,同样的可以直接来管理版本的内容

  • 大量的自动配置,用户不需要太多的进行相关技术之间的整合信息,可以做到开箱即用,当然也可通过自己的配置来完成一些需求

  • 无需配置XML文件,无代码生成,开箱即用

  • 准生产环境的运行时应用监控

  • 与云计算的天然集成

4,缺点

入门容易,精通难,spring框架底层的api很麻烦

二,springboot的helloworld

实战

  1. 首先使用maven创建一个项目

  2. 添加入springboot的依赖

  3. 创建一个类名(与下面启动一样HelloWorldMainApplication),添加上@SpringBootApplication的注解

  4. 在该类中创建一个main方法,然后添加上一段代码

    <pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="java" cid="n44" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px 0px; margin-bottom: 15px; margin-top: 15px; width: inherit;"> SpringApplication.run(HelloWorldMainApplication.class,args);</pre>

  5. 编写相关的Controller之类的

  6. 部署,导入一个maven插件(spring-boot-maven-plugin),使用maven中的package打包,然后在对应的地方可以直接将 他找到,使用java -jar的方式启动这个jar包文件

解析

1,POM文件

1,父项目

<pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="xml" cid="n52" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px 0px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
<relativePath/>
</parent>
它的父项目是
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.4.RELEASE</version>
<relativePath>../../spring-boot-dependencies</relativePath>
</parent>
在这个依赖里面,可以看到所有的springboot的所有依赖版本
所以称为springBoot版本仲裁中心,以后我们导入依赖默认是不需要写版本 </pre>

2,导入依赖

有一个spring-boot- starter-web这个依赖,这个依赖导入依赖一些其他的依赖,所以也就是说吗,这个东西帮我们导入了很多需要web开发的依赖

springBoot将所有的功能场景都抽取出来,做成一个个的starter(启动器),只需要在项目中引入这些starter相关场景的所有依赖都会导入进来,需要使用什么功能就导入什么功能

springboot启动器

3,主程序

首先是需要@SpringBootApplication将该注解标记在某一个类上,说明这个类是springBoot的主配置类,表示运行这个类的main方法就可以启动springBoot应用

@SpringBootApplication是一个组合的注解

<pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="java" cid="n60" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px 0px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> @SpringBootConfiguration
这个是配置内的注解,也就是之前我们使用配置文件进行配置,现在使用配置内可以使该容器具有配置文件一样的效果
@EnableAutoConfiguration
这个是开启自动配置功能,包扫描,开启mapper之类的一些东西
自动配置的原理在于它也是一个组合的组件,里面也有很多注解
详解可以看关于spring注解的解释</pre>

快速创建

具体使用方式不解释了,简单的使用就完了

只需要选择我们需要的模块,然后自动联网下载需要的文件

其中有些文件暂时没有用

<pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="" cid="n66" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px 0px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> .mvn文件夹
.gitgnore
mvnw
mvnw.cmd</pre>

默认生成的springBoot项目有几个特点

  1. 主程序生成好了,我们只需要关注自己的业务逻辑就完事了

  2. resources文件夹中的目录

    1. static,保存所有的静态资源,js,css,images

    2. templates,保存所有的模板页面;(springBoot默认jar包使用内嵌的tomcat,默认不支持jsp页面);可以使用模板引擎(freemarker,thymeleaf);

    3. application.properties,springBoot应用的配置(可以修改springBoot的默认配置,例如需要修改端口号,就可以在这个文件中使用server.port=8081的方式修改)


三,SpringBoot的配置

1,配置文件

SpringBoot可以使用两种方式创建配置文件,一种是application.properties和application.yml

2,YAML语法

YAML(YAML Ain't Markip Language)

可以说是一种标记语言,也可以说不是一种标记语言

<pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="" cid="n88" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px 0px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> 对于上面properties的方式修改端口号
yaml是写成这个样子的
server:
port: 8081</pre>

1,基本语法

k:(空格)v:表示一对键值对(空格必须有),以空格的缩进来控制层级关系,只要是左对齐的一列数据,都是同一层级的

<pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="" cid="n91" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px 0px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> server:
port: 8080
path: /hello
注意空格</pre>

2,值的写法

字面量:普通的值(数字,字符串,布尔)

使用类似k:v:字面量的形式来直接写

字符串默认不加上单引号或者双引号(有特殊含义)

“”:双引号,会转义字符串中的特殊字符,特殊字符会作为本身要表达的意思,也就是说“/n”是换行的意思

‘’:单引号,不会转义特殊字符,也就是说“/n”是字符串的意思

对象,map(属性和值)(键值对)

k: v:在下一行来写对象的属性和值的关系,注意缩进

<pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="" cid="n100" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px 0px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> friends:
lastName: zhangsan
age: 20
还是要注意:后的空格</pre>

行内写法

<pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="" cid="n102" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px 0px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> friends:{lastName: zhangsan,age: 19}</pre>

数组(List ,Set)

使用-值表示数组中的一个元素

<pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="" cid="n105" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px 0px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> pets:

  • cat
  • dog
  • pig
    这个地方是,空格-空格值</pre>

行内写法

<pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="" cid="n107" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px 0px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> pets: [cat,dog,pig]</pre>

3,将配置文件中的值映射到组件中

在需要映射到的类上加上@ConfigurationProperties(prefix="")其中写的参数是对应的那歌映射文件中的对应的那个下面的所有属性

可以导入一个配置文件处理器,这个时候配置文件进行绑定就会有提示

spring-boot-configuration-processor这个依赖

需要注意的是,编写的映射类需要是容器中的组件,才能容器提供那个注解,所以需要在@ConfigurationProperties注解之前加上@Component注解

可以使用test中进行单元测试,可以在测试期间,类似编码一样进行自动注入的方式

properties的使用

语法自学,一般都是.的形式

需要注意的是properties需要修改编码的问题,在file中修改就完事了

使用@Value(“”)来获取值,具体写法再议,不建议使用

@ConfigurationProperties @Value
功能 批量注入配置文件属性 单个指定
松散绑定(语法) 支持 不支持
spEL 不支持 支持
JSR303校验 支持 不支持
复杂类型 支持 不支持

松散语法:javaBean中last-name(或者lastName) -->application.properties中的last-name;

spEL语法:#{11*2}

JSR303:@Value会直接忽略,校验规则

@PropertySource和@ImportResource

@PropertySource加载指定的配置文件;也就是说,对于需要映射值的类,可能它的那个映射yaml文件并不是全局的配置文件,这个时候就需要使用这个注解来

[图片上传失败...(image-85279e-1557995679910)]

也就是说,对于上面的@ConfigurationProperties只能加载核心配置文件,也就是application.yml/properties,但是@PropertySource可以加载指定的配置文件,使用类路径的形式加载进去

@ImportResource作用是导入spring的配置文件,让配置文件中的内容生效,也就是之前写spring配置文件时的形式,使用这个注解可以将对应的文件映射到该类上,也是使用类路径的形式导入

SpringBoot推荐给容器添加组件的方式:

1、配置类=====Spring的xml配置文件(old)

2、全注解方式@Configuration+@Bean(new)(推荐)

4,配置文件使用占位符

<pre spellcheck="false" class="md-fences mock-cm md-end-block md-fences-with-lineno" lang="" cid="n157" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px 8px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">也就是使用
${}的形式给对应的值赋值
</pre>

5,Profile

1, 多Profile文件

我们在编写主配置文件时,配置文件的文件名可以是

<pre spellcheck="false" class="md-fences mock-cm md-end-block md-fences-with-lineno" lang="" cid="n161" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px 8px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">application-{profile}.properties/yml

</pre>

比如我创建了application.yml,application-dev.yml和application-prod.yml用于在不同的开发周期中使用不同的配置文件

也就是说我们可以创建多个配置文件,但是默认使用的是application.properties/yml

但是何时我们的其他配置文件可以生效呢?

2,激活指定profiles文件


1,也就是可以在application.yml(核心配置文件)中使用一条语句

<pre spellcheck="false" class="md-fences mock-cm md-end-block md-fences-with-lineno" lang="yaml" cid="n168" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px 8px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">spring:
profiles:
active: dev

properties的写法是spring.profiles.active=dev
</pre>

这样这个时候就可以激活使用对应的application-dev.yml配置文件

2,yaml有一个特性是多行文版块的形式,这样就不需要创建多个yaml文件,直接选择激活哪个文版块就完事了,不同的文版块使用“---”隔开,对文版块使用语句定义不同文版块的名称

<pre spellcheck="false" class="md-fences mock-cm md-end-block md-fences-with-lineno" lang="" cid="n171" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px 8px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">server:
port: 8080
spring:
profiles:
active: dev


server:
port: 8081
spring:
profiles: dev


server:
port: 8082
spring:
profiles: prod
</pre>

使用这种方式定义和激活对应的文版块

3,使用命令行的形式激活

用处不大,待续

使用方式,也就是打成jar包之后在cmd中打开jar时使用

<pre spellcheck="false" class="md-fences mock-cm md-end-block md-fences-with-lineno" lang="" cid="n176" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px 8px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">java -jar 文件名 --spring.profiles.active=dev(激活模块)
</pre>

4,虚拟机参数

待续

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

推荐阅读更多精彩内容