零基础快速入门SpringBoot2.0教程 (三)

一、SpringBoot

Starter讲解

       简介:介绍什么是SpringBoot Starter和主要作用


       1、官网地址:https://docs.spring.io/spring-boot/docs/2.1.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-starter


       2、starter主要简化依赖用的

              spring-boot-starter-web  ->里面包含多种依赖


       3、几个常用的starter

              spring-boot-starter-activemq

              spring-boot-starter-aop

              spring-boot-starter-data-redis

              spring-boot-starter-freemarker

              spring-boot-starter-thymeleaf

              spring-boot-starter-webflux


二、SpringBoot2.x常见模板引擎讲解和官方推荐使用

       简介:介绍常用的SpringBoot2.x模板引擎和官方推荐案例


              1、JSP(后端渲染,消耗性能)

                     JavaServer Pages动态网页技术,由应用服务器中的JSP引擎来编译和执行,再将生成的整个页面返回给客户端

                     可以写java代码

                     持表达式语言(el、jstl)

                     内建函数

                     JSP->Servlet(占用JVM内存)permSize

                     javaweb官方推荐

                     springboot不推荐https://docs.spring.io/spring-boot/docs/2.1.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-jsp-limitations


              2、Freemarker

                     FreeMarkerTemplate Language(FTL) 文件一般保存为xxx.ftl

                     严格依赖MVC模式,不依赖Servlet容器(不占用JVM内存)

                     内建函数


              3、Thymeleaf (主推)

                     轻量级的模板引擎(负责逻辑业务的不推荐,解析DOM或者XML会占用多的内存)

                     可以直接在浏览器中打开且正确显示模板页面


                     直接是html结尾,直接编辑

                     xdlcass.net/user/userinfo.html

                     社会工程学

                            伪装


三、SpringBoot整合模板引擎freemarker实战

       简介:SpringBoot2.x整合模板引擎freemarker实战


       1、Freemarker相关maven依赖


       

           org.springframework.boot

           spring-boot-starter-freemarker



       2、Freemarker基础配置

              #是否开启thymeleaf缓存,本地为false,生产建议为true

              spring.freemarker.cache=false


              spring.freemarker.charset=UTF-8

              spring.freemarker.allow-request-override=false

              spring.freemarker.check-template-location=true


              #类型

              spring.freemarker.content-type=text/html


              spring.freemarker.expose-request-attributes=true

              spring.freemarker.expose-session-attributes=true


              #文件后缀

              spring.freemarker.suffix=.ftl

              #路径

              spring.freemarker.template-loader-path=classpath:/templates/



       3、建立文件夹

              1)src/main/resources/templates/fm/user/

              2)建立一个index.ftl

              3)user文件夹下面建立一个user.html




       4、简单测试代码编写和访问



四、SpringBoot2整合模板引擎thymeleaf实战

       讲解:SpringBoot2.x整合模板引擎thymeleaf实战


       官网地址:https://www.thymeleaf.org/doc/articles/thymeleaf3migration.html

       1、thymeleaf相关maven依赖

                    

                          org.springframework.boot

                          spring-boot-starter-thymeleaf



       2、thymeleaf基础配置


              #开发时关闭缓存,不然没法看到实时页面

              spring.thymeleaf.cache=false

              spring.thymeleaf.mode=HTML5

              #前缀

              spring.thymeleaf.prefix=classpath:/templates/

              #编码

              spring.thymeleaf.encoding=UTF-8

              #类型

              spring.thymeleaf.content-type=text/html

              #名称的后缀

              spring.thymeleaf.suffix=.html


       3、建立文件夹

              1)src/main/resources/templates/tl/

              2)建立一个index.html


       4、简单测试代码编写和访问

              注意:$表达式只能写在th标签内部

              快速入门:https://www.thymeleaf.org/doc/articles/standarddialect5minutes.html



五、SpringBoot2.x持久化数据方式介绍


       简介:介绍近几年常用的访问数据库的方式和优缺点


              1、原始java访问数据库

                     开发流程麻烦

                     1、注册驱动/加载驱动

                            Class.forName("com.mysql.jdbc.Driver")

                     2、建立连接

                            Connectioncon =DriverManager.getConnection("jdbc:mysql://localhost:3306/dbname","root","root");

                     3、创建Statement


                     4、执行SQL语句


                     5、处理结果集


                     6、关闭连接,释放资源


              2、apache dbutils框架

                     比上一步简单点

                     官网:https://commons.apache.org/proper/commons-dbutils/

              3、jpa框架

                     spring-data-jpa

                     jpa在复杂查询的时候性能不是很好


              4、Hiberante   解释:ORM:对象关系映射Object

Relational Mapping

                     企业大都喜欢使用hibernate


              5、Mybatis框架  

                     互联网行业通常使用mybatis

                     不提供对象和关系模型的直接映射,半ORM


六、SpringBoot2.x整合Mybatis3.x注解实战

       简介:SpringBoot2.x整合Mybatis3.x注解配置实战


              1、使用starter, maven仓库地址:http://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter


              2、加入依赖(可以用 http://start.spring.io/ 下载)



                                  

                                      org.mybatis.spring.boot

                                      mybatis-spring-boot-starter

                                       1.3.2

                                       runtime                        




                                 

                                          mysql

                                          mysql-connector-java

                                          runtime



                                  

                                          com.alibaba

                                          druid

                                          1.1.6



              3、加入配置文件

                     #mybatis.type-aliases-package=net.xdclass.base_project.domain

                     #可以自动识别

                     #spring.datasource.driver-class-name=com.mysql.jdbc.Driver


                     spring.datasource.url=jdbc:mysql://localhost:3306/movie?useUnicode=true&characterEncoding=utf-8

                     spring.datasource.username=root

                     spring.datasource.password=password

                     #如果不使用默认的数据源(com.zaxxer.hikari.HikariDataSource)

                     spring.datasource.type=com.alibaba.druid.pool.DruidDataSource


              加载配置,注入到sqlSessionFactory等都是springBoot帮我们完成


              4、启动类增加mapper扫描

                     @MapperScan("net.xdclass.base_project.mapper")


                      技巧:保存对象,获取数据库自增id

                      @Options(useGeneratedKeys=true, keyProperty="id",keyColumn="id")


              4、开发mapper

                     参考语法http://www.mybatis.org/mybatis-3/zh/java-api.html


              5、sql脚本

                     CREATETABLE `user` (

                       `id` int(11) unsigned NOT NULLAUTO_INCREMENT,

                       `name` varchar(128) DEFAULT NULL COMMENT '名称',

                       `phone` varchar(16) DEFAULT NULL COMMENT '用户手机号',

                       `create_time` datetime DEFAULT NULL COMMENT '创建时间',

                       `age` int(4) DEFAULT NULL COMMENT '年龄',

                       PRIMARY KEY (`id`)

                     )ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8;



              相关资料:

              http://www.mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/#Configuration


              https://github.com/mybatis/spring-boot-starter/tree/master/mybatis-spring-boot-samples


              整合问题集合:

                     https://my.oschina.net/hxflar1314520/blog/1800035

                     https://blog.csdn.net/tingxuetage/article/details/80179772


七、SpringBoot整合Mybatis实操和打印SQL语句

       讲解:SpringBoot2.x整合Mybatis3.x增删改查实操, 控制台打印sql语句


       1、控制台打印sql语句             

              #增加打印sql语句,一般用于本地开发测试

              mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl


       2、增加mapper代码          

           @Select("SELECT * FROM user")

           @Results({

               @Result(column ="create_time",property = "createTime")  //javaType = java.util.Date.class       

           })

           List getAll();


           @Select("SELECT * FROM user WHERE id =#{id}")

           @Results({

                   @Result(column ="create_time",property = "createTime")

           })

           User findById(Long id);


           @Update("UPDATE user SET name=#{name}WHERE id =#{id}")

           void update(User user);


           @Delete("DELETE FROM user WHERE id=#{userId}")

           void delete(Long userId);


        3、增加API


              @GetMapping("find_all")

              publicObject findAll(){

              returnJsonData.buildSuccess(userMapper.getAll());

              }


              @GetMapping("find_by_Id")

              publicObject findById(long id){

              returnJsonData.buildSuccess(userMapper.findById(id));

              }


              @GetMapping("del_by_id")

              publicObject delById(long id){

              userMapper.delete(id);

              return JsonData.buildSuccess();

              }


              @GetMapping("update")

              publicObject update(String name,int id){

                     Useruser = new User();

                     user.setName(name);

                     user.setId(id);

                     userMapper.update(user);

                  return JsonData.buildSuccess();

              }


八、事务介绍和常见的隔离级别,传播行为


       简介:讲解什么是数据库事务,常见的隔离级别和传播行为


       1、介绍什么是事务,单机事务,分布式事务处理等


       2、讲解场景的隔离级别

              Serializable:最严格,串行处理,消耗资源大

              RepeatableRead:保证了一个事务不会修改已经由另一个事务读取但未提交(回滚)的数据

              ReadCommitted:大多数主流数据库的默认事务等级

              ReadUncommitted:保证了读取过程中不会读取到非法数据。



       3、讲解常见的传播行为

              PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务,最常见的选择。


              PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。


              PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。


              PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起, 两个事务之间没有关系,一个异常,一个提交,不会同时回滚


              PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。


              PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常


九、SpringBoot整合mybatis之事务处理实战

       简介:SpringBoot整合Mybatis之事务处理实战

       1、service逻辑引入事务@Transantional(propagation=Propagation.REQUIRED)


       2、service代码

              @Override

           @Transactional

              publicint addAccount() {

                     Useruser = new User();

                     user.setAge(9);

                     user.setCreateTime(newDate());

                     user.setName("事务测试");

                     user.setPhone("000121212");


                     userMapper.insert(user);

               int a = 1/0;


                     returnuser.getId();

              }


十、源码编译安装Redis4.x

       简介:使用源码安装Redis4.x和配置外网访问


       1、快速安装  https://redis.io/download#installation

                     wgethttp://download.redis.io/releases/redis-4.0.9.tar.gz

                     tarxzf redis-4.0.9.tar.gz

                     cdredis-4.0.9

                     make


                     启动服务端:src/redis-server

                     启动客户端:src/redis-cli


       2、默认是本地访问的,需要开放外网访问

              1)打开redis.conf文件在NETWORK部分修改

                 注释掉bind 127.0.0.1可以使所有的ip访问redis

                 修改 protected-mode,值改为no



十一、SpringBoot2.x整合redis实战讲解


       简介:使用springboot-starter整合reids实战


              1、官网:https://docs.spring.io/spring-boot/docs/2.1.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-redis

                     集群文档:https://docs.spring.io/spring-data/data-redis/docs/current/reference/html/#cluster


              2、springboot整合redis相关依赖引入

                    

                  org.springframework.boot

                   spring-boot-starter-data-redis



           3、相关配置文件配置

                     #=========redis基础配置=========

                     spring.redis.database=0

                     spring.redis.host=127.0.0.1

                     spring.redis.port=6390

                     #连接超时时间单位 ms(毫秒)

                     spring.redis.timeout=3000


                     #=========redis线程池设置=========

                     #连接池中的最大空闲连接,默认值也是8。

                     spring.redis.pool.max-idle=200


                     #连接池中的最小空闲连接,默认值也是0。

                     spring.redis.pool.min-idle=200


                     #如果赋值为-1,则表示不限制;pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。

                     spring.redis.pool.max-active=2000


                     #等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时

                     spring.redis.pool.max-wait=1000




              4、常见redistemplate种类讲解和缓存实操(使用自动注入)


                     1、注入模板

                     @Autowired

                     privateStirngRedisTemplate strTplRedis


                     2、类型String,List,Hash,Set,ZSet

                     对应的方法分别是opsForValue()、opsForList()、opsForHash()、opsForSet()、opsForZSet()


十二、SpringBoot定时任务schedule讲解

       简介:讲解什么是定时任务和常见定时任务区别


              1、常见定时任务 Java自带的java.util.Timer类

                     timer:配置比较麻烦,时间延后问题

                     timertask:不推荐


              2、Quartz框架

                     配置更简单

                     xml或者注解


              3、SpringBoot使用注解方式开启定时任务

                     1)启动类里面 @EnableScheduling开启定时任务,自动扫描

                     2)定时任务业务类加注解 @Component被容器扫描

                     3)定时执行的方法加上注解@Scheduled(fixedRate=2000) 定期执行一次


十三、SpringBoot常用定时任务配置实战

       简介:SpringBoot常用定时任务表达式配置和在线生成器


              1、cron 定时任务表达式 @Scheduled(cron="*/1 * * * * *") 表示每秒

                     1)crontab 工具 https://tool.lu/crontab/

              2、fixedRate: 定时多久执行一次(上一次开始执行时间点后xx秒再次执行;)

              3、fixedDelay: 上一次执行结束时间点后xx秒再次执行

              4、fixedDelayString:  字符串形式,可以通过配置文件指定


十四、SpringBoot2.x异步任务实战(核心知识)

       简介:讲解什么是异步任务,和使用SpringBoot2.x开发异步任务实战

              1、什么是异步任务和使用场景:适用于处理log、发送邮件、短信……等

                     下单接口->查库存 100

                                   余额校验 150

                                   风控用户100

                                   ....



              2、启动类里面使用@EnableAsync注解开启功能,自动扫描


              3、定义异步任务类并使用@Component标记组件被容器扫描,异步方法加上@Async

                     注意点:

                            1)要把异步任务封装到类里面,不能直接写到Controller

                            2)增加Future 返回结果AsyncResult("task执行完成"); 

                            3)如果需要拿到结果需要判断全部的 task.isDone()

              4、通过注入方式,注入到controller里面,如果测试前后区别则改为同步则把Async注释掉


十五、新日志框架LogBack介绍

       简介:日志介绍和新日志框架Logback讲解


       1.常用处理java的日志组件slf4j,log4j,logback,common-logging 等


       2、logback介绍:基于Log4j基础上大量改良,不能单独使用,推荐配合日志框架SLF4J来使用

              logback当前分成三个模块:logback-core,logback-classic和logback-access;

              logback-core是其它两个模块的基础模块


       3、Logback的核心对象:

              Logger:日志记录器

              Appender:指定日志输出的目的地,目的地可以是控制台,文件

              Layout:日志布局格式化日志信息的输出



       4、日志级别:DEBUG < INFO < WARN <

ERROR


              ===========log4j示例===========          

               ###设置###

              log4j.rootLogger= debug,stdout,D,E


              ###输出信息到控制抬 ###

              log4j.appender.stdout= org.apache.log4j.ConsoleAppender

              log4j.appender.stdout.Target= System.out

              log4j.appender.stdout.layout= org.apache.log4j.PatternLayout

              log4j.appender.stdout.layout.ConversionPattern= [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n


              ###输出DEBUG 级别以上的日志到=D://logs/error.log ###

              log4j.appender.D= org.apache.log4j.DailyRollingFileAppender

              log4j.appender.D.File= D://logs/log.log

              log4j.appender.D.Append= true

              log4j.appender.D.Threshold= DEBUG

              log4j.appender.D.layout= org.apache.log4j.PatternLayout

              log4j.appender.D.layout.ConversionPattern= %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [%p ]  %m%n


              ###输出ERROR 级别以上的日志到=D://logs/error.log ###

              log4j.appender.E= org.apache.log4j.DailyRollingFileAppender

              log4j.appender.E.File=E://logs/error.log

              log4j.appender.E.Append= true

              log4j.appender.E.Threshold= ERROR

              log4j.appender.E.layout= org.apache.log4j.PatternLayout

              log4j.appender.E.layout.ConversionPattern= %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [%p ]  %m%n


              ===========logback============


       4、Log4j日志转换为logback在线工具(支持log4j.properties转换为logback.xml,不支持 log4j.xml转换为logback.xml)

        https://logback.qos.ch/translator/


十六、SpringBoot2.x日志讲解和Logback配置实战

       简介:讲解SpringBoot2.x整合Logback配置实战


              1、官网介绍:https://docs.spring.io/spring-boot/docs/2.1.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-logging


                 各个组件案例:https://logback.qos.ch/manual/index.html


              2、分析SpringBoot启动日志

                     1)默认情况下,Spring Boot将日志输出到控制台


              3、整合Logback实战

                     1)创建日志文件logback-spring.xml,官方推荐 -spring.xml结尾

                            默认加载加载配置顺序 logback-spring.xml,

logback-spring.groovy, logback.xml, or logback.groovy


                     注释:

                            子节点

                                                            

                           

                            (要加在最后)


十七、搜索知识和搜索框架elasticsearch介绍

       简介:通过京东电商介绍什么是搜索引擎,和开源搜索框架ElasticSearch6.x新特性介绍


              前言:介绍ES的主要特点和使用场景,新特性讲解

              mysql:like 模糊,性能问题,


              solr:针对企业,Lucene

              elasticsearch:针对数据量特别大,PB,TB

                纯java开发,springboot使用,5.6版本

                es升级4->5版本,改动大,但是5版本后,改动不大


elasticSearch主要特点


              1、特点:全文检索,结构化检索,数据统计、分析,接近实时处理,分布式搜索(可部署数百台服务器),处理PB级别的数据

                     搜索纠错,自动完成

              2、使用场景:日志搜索,数据聚合,数据监控,报表统计分析


              3、国内外使用者:维基百科,Stack Overflow,GitHub


       新特性讲解


              1、6.2.x版本基于Lucene 7.x,更快,性能进一步提升,对应的序列化组件,升级到Jackson

2.8

                     mysql:database   table  rocord

                     es   : index     type(只能存在一个)    document


              2、推荐使用5.0版本推出的Java REST/HTTP客户端,依赖少,比Transport使用更方便,在基准测试中,性能并不输于Transport客户端,


              在5.0到6.0版本中,每次有对应的API更新, 文档中也说明,推荐使用这种方式进行开发使用,所有可用节点间的负载均衡

              在节点故障和特定响应代码的情况下进行故障转移,失败的连接处罚(失败的节点是否重试取决于失败的连续次数;失败的失败次数越多,客户端在再次尝试同一节点之前等待的时间越长)


              3、(重要)不再支持一个索引库里面多个type,6.x版本已经禁止一个index里面多个type,所以一个index索引库只能存在1个type


              官方文档:

              1、6.0更新特性

               https://www.elastic.co/guide/en/elasticsearch/reference/6.0/release-notes-6.0.0.html#breaking-java-6.0.0

              2、6.1更新特性

              https://www.elastic.co/guide/en/elasticsearch/reference/6.1/release-notes-6.1.0.html




十八、快速部署ElastcSearch5.6.x

       简介:讲解为什么不用ES6.x版本,及本地快速安装ElasticSeach和场景问题处理


       配置JDK1.8

              使用wget 下载elasticsearch安装包

              wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.6.8.tar.gz

       解压

              tar-zxvf elasticsearch-5.6.8.tar.gz

       官网:https://www.elastic.co/products/elasticsearch


       外网访问配置:   

              config目录下面elasticsearch.yml

              修改为network.host:0.0.0.0



       配置es出现相关问题处理(阿里云、腾讯云,亚马逊云安装问题集合):

              1、问题一

                     JavaHotSpot(TM) 64-Bit Server VM warning: INFO:os::commit_memory(0x00000000c5330000, 986513408, 0) failed; error='Cannotallocate memory' (errno=12)

                     #

                     #There is insufficient memory for the Java Runtime Environment to continue.

                     #Native memory allocation (mmap) failed to map 986513408 bytes for committingreserved memory.

                     #An error report file with more information is saved as:

                     #/usr/local/software/temp/elasticsearch-6.2.2/hs_err_pid1912.log

              解决:内存不够,购买阿里云的机器可以动态增加内存


              2、问题二

                     [root@iZwz95j86y235aroi85ht0Zbin]# ./elasticsearch

                     [2018-02-22T20:14:04,870][WARN][o.e.b.ElasticsearchUncaughtExceptionHandler] [] uncaught exception in thread[main]

                     org.elasticsearch.bootstrap.StartupException:java.lang.RuntimeException: can not run elasticsearch as root

                     atorg.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:125)~[elasticsearch-6.2.2.jar:6.2.2]

                     atorg.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:112)~[elasticsearch-6.2.2.jar:6.2.2]

                     atorg.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86)~[elasticsearch-6.2.2.jar:6.2.2]

                     atorg.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124)~[elasticsearch-cli-6.2.2.jar:6.2.2]

              解决:用非root用户

                     添加用户:useradd -m 用户名 然后设置密码  passwd用户名



              3、问题三

                     ./elasticsearch

                     Exception in thread"main" java.nio.file.AccessDeniedException: /usr/local/software/temp/elasticsearch-6.2.2/config/jvm.options

                 解决:权限不够 chmod 777 -R 当前es目录


              常见配置问题资料:https://www.jianshu.com/p/c5d6ec0f35e0


十九、ElasticSearch5.6测试数据准备

       简介: ElasticSearch5.6.x简单测试

              1、步骤 https://www.elastic.co/guide/en/elasticsearch/reference/5.6/index.html

              2、使用POSTMAN 工具


              基础

                     查看集群状态:localhost:9200/_cat/health?v

                     查看索引列表:localhost:9200/_cat/indices?v


二十、SpringBoot2.x整合elasticsearch5.6.x

       简介:SpringBoot2.x整合elasticSearch5.6.8实战


              SpringData Elasticsearch文档地址

              https://docs.spring.io/spring-data/elasticsearch/docs/3.0.6.RELEASE/reference/html/


              版本说明:SpringBoot整合elasticsearch

                     https://github.com/spring-projects/spring-data-elasticsearch/wiki/Spring-Data-Elasticsearch---Spring-Boot---version-matrix


              1、添加maven依赖                                

                      

                 org.springframework.boot 

                 spring-boot-starter-data-elasticsearch 



              2、接口继承ElasticSearchRepository,里面有很多默认实现

                     注意点:

                           索引名称记得小写,类属性名称也要小写

                    新建实体对象article

                    加上类注解 @Document(indexName =

"blog", type = "article")



             3、配置文件:

                    # ELASTICSEARCH(ElasticsearchProperties)

                     spring.data.elasticsearch.cluster-name=elasticsearch# Elasticsearch cluster name.

                     spring.data.elasticsearch.cluster-nodes=localhost:9300# Comma-separated list of cluster node addresses.

                     spring.data.elasticsearch.repositories.enabled=true# Whether to enable Elasticsearch repositories.


              4、QueryBuilder使用

              https://www.elastic.co/guide/en/elasticsearch/client/java-api/1.3/query-dsl-queries.html


              //单个匹配,搜索name为jack的文档 

              QueryBuilderqueryBuilder = QueryBuilders.matchQuery("title", "搜");


              4、查看es数据


                     查看索引信息:http://localhost:9200/_cat/indices?v

                     查看某个索引库结构:http://localhost:9200/blog

                     查看某个对象:http://localhost:9200/blog/article/1



教程会持续更新。。。。

更多学习资料可参考:https://xdclass.net/html/course_catalogue.html?video_id=4

https://ke.qq.com/course/299498

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

推荐阅读更多精彩内容

  • 今天注定要落笔生成点什么了?只是很乱,很乱。 看完关于宋朝词霸李清照的文字,又徜徉在最喜爱的现代诗人泰戈尔家,心再...
    F芳子阅读 523评论 0 0
  • 今天感恩自己的影子给自己上课一堂令人痛彻心扉的教育课。很多不足,不良恶果。所以,距离平淡淡定凡事平静还有很大距离,...
    念秀阅读 152评论 0 0
  • 每个人都会有自己的亮点,只是在工作体现上有所不同。员工在某一个方面的缺点不能全部否定他,管理者需要有足够内...
    DDM王军燕阅读 190评论 4 0
  • 这是一本启迪心灵的书,它告诉我们如何把日常生活中的负面情绪减少到最小,教导我们要实事求是地看待问题和处理问题,减少...
    从容舒展阅读 861评论 2 0