2021-02-19

一、ajax基础

  1. ajax概述

数据是存放在服务端的,无法通过已知的API获取

我们希望对服务端发送请求并且接受服务端返回的响应,是否可以通过js向服务端发送请求,不再是“单机游戏”模式呢?

AJAX:使我们可以通过js直接获取服务端最新的内容,而不必重新加载页面,同时让web更接近桌面应用的功能。比如 google搜索,输入某个内容,会实时弹出相关内容,优化了用户体验。

AJAX是浏览器提供的一套API,可以通过js调用,实现通过代码控制请求和响应。

应用场景:按需获取数据;对用户数据检验;自动更新页面内容;提升用户体验,无需刷新

  1. ajax体验

    jq中的ajax方法:获取指定接口的数据,在浏览器中查看:

$.ajax({

   url: "https://jsonplaceholder.typicode.com/users",

   type: "GET",

   dataType: "json",

   data: {"id": 1},

   success: function (data) {

    // 使用请求成功的数据

    console.log(data);

   }

  })

3.原装ajax

发送ajax请求的步骤,4步:相比于jq的ajax方法要复杂一些:

// 1.创建一个 XMLHttpRequest 类型的对象 --- 相当于打开了一个浏览器

  var xhr = new XMLHttpRequest();

  // 2.打开一个与网址之间的连接 --- 相当于在地址栏输入网址,访问json-placeholder这个服务器上的数据了

  xhr.open("GET","https://jsonplaceholder.typicode.com/users");

  // 3.通过连接发送一次请求 --- 相当于点击回车或者超链接

  xhr.send(null);

  // 4.指定 xhr 状态变化事件处理函数  --- 相当于处理网页呈现后的操作

  xhr.onreadystatechange = function () {

   // 通过判断 xhr 的 readyState ,确定此次请求是否完成

   if (this.readyState === 4) {

    console.log(this.responseText)

   }

  }

4.XMLHttpRequest类型对象

AJAX API中的核心提供的是XMLHttpRequest类型对象,所有的ajax操作都需要用到这个对象

创建该对象的兼容写法:

// 1.创建一个 XMLHttpRequest 类型的对象 

  var xhr = null;

  // 兼容写法

  if (window.XMLHttpRequest) {

   // 标准浏览器

   xhr = new XMLHttpRequest();
 
  } else {

   // IE 6 浏览器

   xhr = new ActiveXObject("Microsoft.XMLHTTP");

  }
  1. open()方法开启请求

    第一种:GET 方法,获取服务器数据,不上传或修改数据:

    xhr.open("GET","https://jsonplaceholder.typicode.com/users?id=1");

    第二种:POST方法,增加服务器数据,将本地json文件上传至自己制作的服务器端口:

    xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");

  2. send()方法发送请求GET方法和Post方法有差别,Get方法的数据体是直接在网址上修改

    GET方法的send(),无参数或者参数为null:xhr.send(null)

    POST方法的send(),需要先设置请求头xhr.setRequestHeader()xhr.send("name=harry&age=19"); send()中的参数为数据体, Get方法的数据体在网址上修改

    参数则为字符串格式的 数据 ,用于上传到服务端的

  3. 响应状态分析

    send()方法执行之后有3个状态,通过readyState 的值来反映:

    headers received:xhr.readyState==2

    loading:xhr.readyState==3 此时数据可能还未上传完毕

    done:xhr.readyState==4 此时数据完全上传完毕

  4. 同步和异步

    同步: 一个人在同一时刻只能做一件事情,执行一些需要时间的事情需要先等待

    异步:可以同时做多件事情

    xhr.open( ) 参数为boolern值,默认为 true,表示异步进行加载 ,不建议使用同步加载方式,为了让其这个事件一定触发,可以在发送请求send()之前,先注册readystatechange这个方法,保障同步异步都可以成功

  5. 响应数据格式

    XML格式:一直数据描述手段,很老,现在不用,数据冗杂太多,不好进行操作

  6. JSON格式 ,服务端采用JSON返回数据,客户端按照JSON数据处理数据

    json数据不需要存到变量中,可以新建 json文件,格式 是一个{ },内部类似对象子面量的写法,不过区别是属性名必须加 “ ” ,不用;结尾


// 创建新的json文件中书写`
`{`

 `"name": "tom",`

 `"age": 19,`

 `"hobby": ["novel","sing"]`

`}

字符串里面内容是json数据也是可以的:var str = {"name": "tom","age": 80};

此时,JSON 对象的 parse 方法可以将 json 格式的字符串转换成 对象格式:

var strObj = JSON.parse(str); console.log(strObj.name)
JSON对象中的方法 stringfy 把字面量方法创建的对象obj转换为字符串:
console.log(JSON.stringify(obj));

服务端不管采用XML和JSON数据 本质上都是讲数据返回客户端

  1. json-server

平时我们自己也会写一写数据,通过Ajax获取,所有需要再本地搭建一个临时服务器

json-server可以使用它快速搭建一个Web服务器

网址:

搭建步骤:1.安装 2.定制自己的db-json文件 3.再将这个数据库部署到我们的服务器上 (打开 vscode 的终端功能,在第一行书写json-server 然后 --watch db-json)4.最后可以根据服务器分配给我们的接口进行访问了 我们新建的服务器就是类似 json-placeholder这种的

  1. json文件书写方法
     "users": [
    
     {
    
     "id": 1,
    
     "name": "tom",
    
     "age": 19,
    
     "class": 1
    
     },
    
     {
    
     "id": 2,
    
     "name": "jerry",
    
     "age": 18,
    
     "class": 2
    
     },
    
     {
    
     "id": 3,
    
     "name": "lucy",
    
     "age": 19,
    
     "class": 1
    
     },
    
     {
    
     "name": "lily",
    
     "age": "19",
    
     "class": "2",
    
     "id": 4
    
     },
    
     {
    
     "name": "lulu",
    
     "age": 18,
    
     "class": 2,
    
     "id": 5
    
     },
    
     {
    
     "name": "harry",
    
     "age": 18,
    
     "class": 1,
    
     "id": 6
    
     },
    
     {
    
     "name": "john",
    
     "age": "19",
    
     "class": "2",
    
     "id": 7
    
     }
    
     ],
    
     "posts": [
    
     {
    
     "id": 1,
    
     "userId": 1,
    
     "title": "javascript",
    
     "content": "js 是一门非常好学语言"
    
     },
    
     {
    
     "id": 2,
    
     "userId": 1,
    
     "title": "jquery",
    
     "content": "jq 是一门非常好学语言"
    
     },
    
     {
    
     "id": 3,
    
     "userId": 2,
    
     "title": "html",
    
     "content": "html 是一门非常好学语言"
    
     },
    
     {
    
     "id": 4,
    
     "userId": 3,
    
     "title": "css",
    
     "content": "css 是一门非常好学语言"
    
     }
    
     ],
    
     "comments": [
    
     {
    
     "id": 1,
    
     "postId": 1,
    
     "content": "good"
    
     },
    
     {
    
     "id": 2,
    
     "postId": 3,
    
     "content": "better"
    
     },
    
     {
    
     "id": 3,
    
     "postId": 4,
    
     "content": "best"
    
     }
    
     ]
    
    }

书写完成后,打开vscode的终端,输入 json-server ,和--watch自己的文件名dbs-json,打开其中一个分配的接口如uesr,点击进入,可以通过/ 的方法查找不同的属性,如 / 1 可以筛选id为1的user即 tom 的各个属性,也可以继续添加/posts,可以查找 userid为1的post

13.原生AJAX 方法

GET方法,获取服务器数据:参数传递都是通过url地址中的 ?来传递的,无需设置请求头,无需设置响应体,或者传null或者可以直接不传

     xhr.send(null);
     xhr.onreadystatechange = function () {
     if (this.readyState === 4) {
     console.log(this.responseText);
     }
     }

POST方法,更改增加服务器数据:需要设置请求头(setRequestHeader)中的Contrent-Type ,传递的数据也就是请求体,写在send()方法的参数上,send参数是字符串格式的

xhr.open("POST","http://localhost:3000/users");

然后设置请求头(setRequestHeader)

send()中请求体的几种情况:不同的请求体,其请求头的写法有不同

第一种简单版:增加的属性之间 用 & 符号连接
    xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    xhr.send("name=lily&age=19&class=2");
 第二种:json格式 ,用模板字符串,可以换行,请求头也变了
  
 xhr.setRequestHeader("Content-Type","application/json");
     xhr.send(`{
    
     "name": "lulu",
    
     "age": 18,
    
     "class": 2
    
     }`);
     //第三种:请求头和第二种一样的,都是json格式,运用json.stingfly 把对象字面量格式转换为json格式的字符串,不用模板字符串
     xhr.setRequestHeader("Content-Type","application/json");
     xhr.send(JSON.stringify({
     "name": "harry",
     "age": 18,
     "class": 1
     }));

     //设置完成后,可以检验是否完成:
     xhr.onreadystatechange = function () {
     if (this.readyState === 4) {
     console.log(this.responseText);
     }
     }</pre>

14.处理响应数据渲染
15.封装AJAX库
可以多次操作ajax,就不用一边一边去书写了
必须的几个参数:

  • 参数1:{string} method 请求方法
  • 参数2:{string} url 请求地址
  • 参数3:{Object} params 请求参数
  • 参数4:{function} done 请求完成后执行的回调函数

16.一个完整的AJAX封装函数如下:

    
     // 统一将方法中的字母转大写,便于后面判断
    
     method = method.toUpperCase();
    
     // 书写 IE 6 的兼容
    
     var xhr = window.XMLHttpRequest 
    
     ? new XMLHttpRequest() 
    
     : new ActiveXObject("Microsoft.XMLHTTP");
    
     // 将对象格式的参数转为 urlencoded的格式
    
     var pairs = [];
    
     for (var k in params) {
    
        pairs.push(k + "=" + params[k]);
    
     }
    
     var str = pairs.join("&");
    
     // 判断是否是 get 方法,需要更改 url 的值
    
     if (method === "GET") {
    
        url += "?" + str;
    
     }
    
     // 创建打开一个连接
    
     xhr.open(method, url);
    
     var data = null;
    
     // 如果是 post 方法,需要设置请求头,还有请求体
    
     if (method === "POST") {
    
        xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    
        data = str;
    
     }
    
     xhr.send(data);
    
     // 执行回调函数
    
     xhr.onreadystatechange = function () {
    
        if (this.readyState !== 4) return;
    
       // 执行外部传进来的回调函数即可
    
       // 需要用到响应体
    
       done(JSON.parse(this.responseText));
    
     }
    
     }
    
     // 调用函数
    
     ajax("GET", "http://localhost:3000/users",{"id": 1},function (data) {
    
     console.log(data);
    
     });
    
     ajax("POST", "http://localhost:3000/users",{"name": "john","age": 19,"class": 2},function (data) {
    
     console.log(data);
    
     });

二、ajax常用库

  1. jq中的 ajax,更加方便,可以参考 w3c 的 jq 参考手册

    $.ajax({ 内容如下 ,包含多种属性} ) 其参数是一个 配置 的对象,对象中包含多种属性,如:

    url 服务端口 ;

    type 请求方法,默认为 "get" ;

    dataType: "json" (如果数据是json格式的话)

    data:传递到服务端的数据,如果是GET方法就通过URL传递,如果POST就通过请求体传递

    timeout:请求超时时间

    四个回调的方法:

    beforeSend:请求发起时 触发

    success:请求成功时候触发,比较常用,因为都会希望请求成功

    error:请求失败触发

    complete:请求完成后触发(不管是否成功)

    回调函数:查询请求的状态如何

           console.log("before send");`
        
         `},`    //会先于后面输出
        
         `success: function (data) {`
        
            `console.log(data);  //成功后会将data转换为对象格式输出在控制台
        
         `},`
        
         `error: function (xhr) {`
        
            `console.log(xhr);`
        
         `},  //如果请求的地址不对,则会显示404,请求的data{} 为错误的话,只会返回空对象,不会返回错误
        
         `complete: function (xhr) {`
        
            `console.log(xhr);`
        
         `}`
        
         `});`

2.$.get() 方法

传统的$.ajax( )实现:

$.ajax({
    
     url: "http://localhost:3000/comments",
    
     type: "get",
    
     dataType: "json",
    
     data: {"id": 2},
    
     success: function (data) {
    
        console.log(data);
    
     }
    
     })

.get() 方法的参数:.get(“url” ,data{ } ,回调函数 ) ,如果需要另外的参数,可以参考w3c文档:

$.get("http://localhost:3000/comments", {"id": 1}, function (data) {
    
     console.log(data);
    
     })

3.$.post( )方法

传统的$.ajax( )实现:传入新的数据 data: {"postId": 2, "content": "bad"},

 $.ajax({

 url: "http://localhost:3000/comments",

 type: "post",

 dataType: "json",

 data: {"postId": 2, "content": "bad"},

 success: function (data) {

  console.log(data);

 }

 })



$.post("http://localhost:3000/comments", {"postId": 3, "content": "bad"},function (data) {

 console.log(data);

 })

4.其他类型请求

put请求,只能由$.ajax()方法实现,功能是可以 更改数据,和post有些类似:

 $.ajax({

 url: "http://localhost:3000/comments/4",

 type: "put",

 dataType: "json",

 data: {"content": "good", "postId": 2},

 success: function (data) {

    console.log(data)

 }

 })

// delete 请求,删除数据,没有data这一属性,直接在url上选择要删除的数据

 $.ajax({

 url: "http://localhost:3000/comments/5",

 type: "delete",

 success: function (data) {

•    console.log(data)

 }

 })

jQery其他的方法,也可以在jQery参考手册进行自学,如:

// ajaxSetup() 方法,设置默认的参数

 $.ajaxSetup({

 url: "http://localhost:3000/users",

 type: "post"

 })

之后所有的ajax请求,url和type都不需要书写了,已经通过$.ajaxSetup() 方法设置好了

5.Axios介绍:是目前应用最为广泛的ajax库

中文官网:axios-js.com 支持promise,后续会学到promise

Axios库:直接用sript标签引用

体会 get 请求

 axios.get("http://localhost:3000/posts")

 .then(function (response) {

•    console.log(response.data)

 })

 .catch(function (error) {

•    console.log(error)

 })</pre>

6.Axios API

axios方法:配置项如下:

axios({

 url: "/comments",

 method: "post",
 //基础url,多个端口的公共部分,是完整url地址的前缀,此时url只用写完整url
 的后面部分
 baseURL: "http://localhost:3000",
 //请求头一般默认是"application/json"
 headers: {

•    "Content-Type": "application/json"

 },

 timeout: 1000,
 //传入json格式数据
 data: {

•    "postId": 3,

•    "content": "better"

 }
 //params  :即将与请求一起发送的url参数,当方法类型为get 和 delete时,直接在url地址上进行获取或者删除的时候,可以设置这个参数
//以json格式返回,会转换为对象格式
 }).then(function (res) {

 console.log(res.data)

 }).catch(function (error) {

 console.log(error)

 })

7.axios方法的全局默认值

在axios方法之前进行配置:

axios.defaults.baseURL = "http://localhost:3000"; 配置baseurl的默认值

8.axios方法的参数,不用设置配置项,直接把url设置为第一个参数:

axios("http://localhost:3000/posts", {

 params: {

•    id: 1

 }

 })
 //不用设置回调函数,then方法设置成功后的效果,参数res 是返回的响应体response

 .then(function (res) {

 console.log(res.data)

 })

 .catch(function (error) {

 console.log(error)

 })
  1. 拦截器

  2. 快速请求方法 get 和post delete put 增删改查

    //直接在url上修改,也可以设置params
     axios.get("http://localhost:3000/users?id=2")
    
     .then(function (res) {
    
    •    console.log(res.data)
    
     })
     //设置params
     axios.get("http://localhost:3000/users",{
     params: {
     id: 3
     }
     })

// post 请求 ,添加数据,数据直接作为了参数,不用写成 date:{}格式了

  axios.post("http://localhost:3000/users",{
 
  "name": "nancy",
 
  "age": 19,
 
  "class": 2
 
  })
 
  .then(function (res) {
 
  console.log(res.data)
 
  })</pre>

11.onload / onprogress

xhr. onload 事件,只在 请求完成时触发,相当于readyState=4的阶段

xhr.onprogress 事件 ,只在请求时触发,相当于readyState=3的阶段

事件对象有两个属性:loaded 和 total
  xhr.onprogress = function (e) {
 
  console.log("progress",this.readyState)
 
  // 在周期性请求过程中,接收到的数据的个数
 
  console.log(e.loaded);
 
  // 接收数据的总个数
 
  console.log(e.total);
 
  }
 
  xhr.send(null);

12.response属性和responseType

     var xhr = new XMLHttpRequest();
    
     xhr.open("GET", "http://localhost:3000/posts");
     //设置响应体的数据类型为json,就不用像之前那样用json.stringfy("responseText")把字符串转换为对象了
    
     xhr.responseType = "json";
    
     xhr.onload = function () {
    
     console.log(this.response);
    
     }
    
     xhr.send(null);

三、跨域和模板引擎

  1. JSONP原理

    是一种借助script标签发送跨域请求的技巧,原理是在script 标签请求服务端的一个地址

    返回一段带有某个全局函数调用的Javascript脚本

  2. jq中的jsonp

    $.ajax() ,使用时将dateType设置为sonp 即可

    $.ajax({
    
    •    url: "https://www.baidu.com/sugrec?pre=1&p=3&ie=utf-8&json=1&prod=pc&from=pc_web",
    
    •    type: "GET",
    
    •    dataType: "jsonp",
    
    •    jsonp: "cb",  //这条属性可以设置回调函数的参数名称(必须与后台接口的回调函数参数名保持一致)
    
    •    jsonpCallback: "abc", //jQ 自动分配的回调函数的名称进行重命名
    
    •    data: {"wd": "ajax"},//wd 表示文字,是百度的一种要求格式,“ajax”是输入的搜索内容
    
    •    success: function (data) {
    
    •     console.log(data)
    
    •    }
    
     })

目的:点击按钮,获取 输入“ajax”文字后,控制台返回的与之有关的提示语,如 ajax的跨域,ajax的同步异步等信息

什么是cors跨域:客户端不需要做出变化,只需要服务端在被请求的时候添加一个Acess-Control-Allow-Origin的响应头

Acess-Control-Allow-Origin的值 :* 便是允许任意源访问

http://foo.coom 允许指定的源访问

3.模板引擎的作用

减少字符串拼接 ; 在模板里解析json,然后跟html内容拼接,性能也更好,可以不用进行字符串的拼接

如腾讯的 art-Template,模板引擎

常用语法 <% 与 %>符号包裹起来的语句为模板的逻辑表达式,如for循环的书写格式

、 <% for (var i = 0 ; i < 5 ; i++) { %>

      <div>这是一个模板中的 div<%= i %></div>

 <!-- name 是参数二这一对象的属性名,可以作为变量 -->

      <div>这是一个模板中的 div<%= name %></div>

 <% } %>

将模板内的内容添加到 box 里面:

 // template() 方法可以调用模板内容

 // 参数1: 调用的模板的id

 // 参数2:是一个对象型的数据,数据会传给模板,对象中的每个属性的属性名在模板中可以直接当变量名使用

 $(".box").html(template("tem", {name: "tom"}));

四、Git操作

1.git是分布式代码管理

git安装和初始化 官网 https://www.git-scm.com

git配置:用户信息配置 输入: $git config --golbal user.name " 自己的名字"

用户邮箱信息配置 : $git config --global user.emal " 自己的邮箱地址"

2.工作区:自己写html css js 工作文件的地方,文件传到暂存区暂存

暂存区: 在内存暂时存储

版本库: 觉得暂存区的内容没有问题,可以存到版本库,真正存放本地内容的地方

3.初始化

托管文件夹:创建一个空白文件夹,右键打开 git bash ,输入自己的命令:

输入 $git init 回车后就初始化成功了

4.提交到本地仓库

第一步:把文件提交到暂存区:

git add./ 文件的url 提交某个文件

git add ./ 提交所有文件

第二步:git commit -m “提交的注释信息” 提交到版本库, 每次修改文件之后再次提交都需要这两部

状态查看 :git status查看你上次提交之后是否对文件发生过修改

如果自己改了文件,没有再次书写 git add .,书写 git status可以进行查看

5.提交日志

git log --oneline 可以直接查看自己添加的注释信息

6.回退版本

git reset Head~ i 回退到上i个版本,会保留历史记录

git reset --hard Head~i 强制退回到上i个版本,删除后续的历史记录,尽量不用

git reflog

7.分支 合并 和冲突处理 (git的精髓所在)

执行 git init的时候,默认git 会为自己创建一个master 分支

master 分支是我们存储的主分支 ,我们需要创建临时分支,后期测试

没有问题,才能将测试分支合并到主分支,工作时每个人会有临时分支进行分配

实际工作时是不允许在主分支直接修改的

创建分支命令 :

git branch (分支名) 如 git branch dev 添加了一个dev的分支

git checkout(分支名) 如 :git checkout dev 切换到dev这一个分支,也可以切换到主分支

将没有问题的临时分支 如 dev 合并到主分支:

首先先切换到主分支 git checkout master

然后合并git merge dev
冲突和如何解决冲突

如果这时修改了文件,相当于主分支修改了,然后提交,切换到dev分支,在dev分支 再

次修改文件,提交,这个时候就有了冲突,需要再工作区进行手动更改,选择哪条分支由领导再次

决定,也可以选择两条都保留,冲突解决后,只是工作区有了更改,需要再次提交add 和commit

Github :

就是把版本库的本地文件传到Github进行托管

自己先注册, 首先点击右上角 + 号,新建一个仓库,然后获取自己仓库的链接url

git clone origin 可以直接从远端仓库克隆岛本地;

连接远端仓库 git remote add origin + 仓库的url

git push origin master 推送到指定的master分支

在第一次推送时会提示你输入账号密码,然后根据提示操作即可

刷新自己的远端仓库,可以看到已经传输成功的文件

如果想要推送 dev 分支

先切换到 dev 分支,还是使用push 命令

推送完成后:

使用 git pull origin master 、可以将选段仓库的内容下拉到本地,每次push值前,记得

进行一次pull

克隆:新建一个文件,右键打开 git bash ,先初始化

连接远端仓库:git remote add origin + 仓库的url

克隆:git clone +仓库的url

在本地仓库存在的情况下,可以将远端仓库的内容下拉到本地:

git pull origin master这样可以将本地仓库和远端仓库最新分支版本进行合并

VScode 可视化操作

左侧第三个图标 ,点击+号把指定的文件传到暂存区,点击上方的√ 传到 版本库,可以在下方的文本框输入 注释 下方的云端 小图标,可以直接帮助我们进行push 和 pull 的操作

在三个点,可以有更多操作 ,如克隆 创建分支 更改分支等功能

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

推荐阅读更多精彩内容