SpringBoot 入門必學(xué)篇(一)

前言

這篇文章主要介紹SpringBoot的必學(xué)內(nèi)容

  • SpringBoot項(xiàng)目搭建
  • MyBatis 整合
  • 實(shí)現(xiàn)分頁
  • 實(shí)現(xiàn)文件上傳

一准颓、搭建SpringBoot項(xiàng)目

搭建項(xiàng)目前需要配置Java環(huán)境违霞,Java環(huán)境配置可以在網(wǎng)上都可以找到的,這里就不做太多介紹瞬场。使用的開發(fā)工具是IntelliJ IDEA集成環(huán)境開發(fā)工具买鸽,其自帶創(chuàng)建SpringBoot項(xiàng)目模板,特別方便贯被。

下面就來說下創(chuàng)建的步驟:
(1) 選擇菜單File -> New -> Project眼五,彈出New Project 面板,左側(cè)欄選擇Spring Initializr彤灶,右邊選擇Default看幼。


(2) 點(diǎn)擊Next按鈕,進(jìn)入Project Metadata面板幌陕,依次填寫Group诵姜、Artifact(必須都是小寫字母)、Type選擇Maven Project搏熄,其它基本都是自動(dòng)選擇和配置好的棚唆。

(3) 再點(diǎn)擊Next按鈕,進(jìn)入Spring包選擇面版心例,選擇Dependencies欄中的Web中的Web依賴包宵凌,這個(gè)包里面編寫了自動(dòng)配置Web項(xiàng)的邏輯。

(4) 繼續(xù)點(diǎn)Next按鈕止后,進(jìn)入Finish頁面面板瞎惫,如圖14所示,這里可以修改項(xiàng)目名稱译株、項(xiàng)目保存路徑以及模塊名稱等瓜喇,也可以不做任何修改,使用默認(rèn)配置歉糜,點(diǎn)擊Finish按鈕完成乘寒,SpringBoot項(xiàng)目就創(chuàng)建完成。

(5) 運(yùn)行现恼。此時(shí)直接點(diǎn)擊Run運(yùn)行會(huì)提示錯(cuò)誤肃续,需要修改HellospringbootApplication代碼后再點(diǎn)擊右上角綠色Run按鈕運(yùn)行。代碼中用到了三個(gè)注解叉袍,注解@RestController相當(dāng)于@ResponseBody@Controller兩個(gè)注解合在一起的作用始锚,只返回retrun的內(nèi)容,不會(huì)指向到對(duì)應(yīng)的頁面喳逛,如jsp頁面瞧捌。注解@SpringBootApplication相當(dāng)于@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan三個(gè)注解合在器的作用,目的是開啟自動(dòng)配置姐呐。注解@RequestMapping作用是用來地址映射殿怜,注解在類上則作用在類上,注解在方法則作用在方法上曙砂,如果兩個(gè)都存在則會(huì)疊加头谜。

@RestController
@SpringBootApplication
public class HellospringbootApplication {
    public static void main(String[] args) {
        SpringApplication.run(HellospringbootApplication.class, args);
    }
    @RequestMapping("/")
    public String test() {
        return "Hello SpringBoot";
    }
}

(6) 測(cè)試。運(yùn)行成功后鸠澈,在瀏覽器輸入http://localhost:8080柱告,瀏覽器上顯示Hello SpringBoot,表示搭建SpringBoot項(xiàng)目成功笑陈。

二际度、整合MyBatis

MyBatis是一款優(yōu)秀的持久層框架,它支持定制化 SQL涵妥、存儲(chǔ)過程以及高級(jí)映射乖菱。MyBatis 避免了幾乎所有的 JDBC 代碼和手動(dòng)設(shè)置參數(shù)以及獲取結(jié)果集。MyBatis 可以使用簡(jiǎn)單的 XML 或注解來配置和映射原生類型蓬网、接口和 Java 的 POJO(Plain Old Java Objects窒所,普通老式 Java 對(duì)象)為數(shù)據(jù)庫中的記錄。簡(jiǎn)單的說MyBatis就是類似Hibernate的ORM框架拳缠,相比之下要輕便墩新、靈活的多贸弥,更易保證DB訪問的性能窟坐。

整合MyBatis分為這么幾個(gè)步驟:

(1) 在pom.xml文件里集成添加所需要的依賴包。Maven如果不是設(shè)置自動(dòng)導(dǎo)入绵疲,右下角會(huì)出現(xiàn)Import Changes和Enable Auto-Import, 前者是手動(dòng)點(diǎn)擊導(dǎo)入改變的包哲鸳,后者是設(shè)置為自動(dòng)導(dǎo)入。

<!-- myBatis -->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.0.1</version>
</dependency>

<!-- mySql -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

<!-- 數(shù)據(jù)庫連接池 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.0</version>
</dependency>

(2) 配置application.yml盔憨。在resources文件夾下創(chuàng)建application.yml文件徙菠,在里面配置其服務(wù)器配置信息、spring配置信息以及mybatis配置信息郁岩,配置信息代碼如下:

server: 
  port: 8088

spring:
  datasource:
      username: root
      password: root
      url: jdbc:mysql://localhost:3306/soaic?useUnicode=true&characterEncoding=utf-8
      driver-class-name: com.mysql.jdbc.Driver 
      type: com.alibaba.druid.pool.DruidDataSource
  application:
    name: hellospringboot
  http:
      encoding:
        charset: UTF-8
        force: true
  jackson:
      default-property-inclusion: non_null

mybatis:
  mapper-locations: classpath:mapper/*Mapper.xml
  type-aliases-package: com.soaic.hellospringboot.entity

服務(wù)器端口號(hào)設(shè)置為8088婿奔,配置spring數(shù)據(jù)庫連接信息和連接池,指定myBatis映射在mapper包下并以Mapper.xml命名結(jié)尾和entity包的路徑,jackson這里配置的是過濾返回為null的數(shù)據(jù)问慎。
(3) 開發(fā)entity萍摊。在com.soaic.hellospringboot包下創(chuàng)建entity包,該包下存放所有數(shù)據(jù)實(shí)體類如叼,接著創(chuàng)建MyUser實(shí)體類冰木,定義電影數(shù)據(jù)屬性,并對(duì)其做get和set封裝,代碼如下:

public class MyUser {
    
    private Integer id;
    private String userName;
    private String password;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

}

(4) 開發(fā)mapper踊沸,在com.soaic.hellospringboot包下創(chuàng)建mapper包歇终,該包存放所有Mapper映射接口,以及在resources包下創(chuàng)建mapper包逼龟,該包存放所有定義myBatis與mySQL數(shù)據(jù)庫關(guān)聯(lián)操作的xml文件评凝,通過該文件可以對(duì)數(shù)據(jù)庫進(jìn)行增刪改查操作,并以其對(duì)應(yīng)的Mapper接口返回相關(guān)數(shù)據(jù)給調(diào)用者腺律,注意的是這文件名需要以Mapper.xml結(jié)尾并以前一個(gè)mapper包下一一對(duì)應(yīng)肥哎,否則會(huì)映射不了。

HellospringbootApplication類上添加@MapperScan("com.soaic.hellospringboot.mapper")掃描指定包下的所有mapper疾渣。

@RestController
@SpringBootApplication
@MapperScan("com.soaic.hellospringboot.mapper")
public class HellospringbootApplication {

}

com.soaic.hellospringboot.mapper包下創(chuàng)建MyUserMapper.java篡诽,并編寫代碼如下:

public interface MyUserMapper {

    Integer insertUser(MyUser user);

    Integer batchInsertUser(List<MyUser> users);

    MyUser deleteUser(Integer id);

    MyUser updateUser(MyUser user);

    MyUser selectUser(Integer id);

    List<MyUser> selectAllUser();

    @Select("select * from user_t where username like CONCAT('%',#{0},'%')")
    @ResultMap("com.soaic.hellospringboot.mapper.MyUserMapper.userMap")
    List<MyUser> selectUserByName(String name);

}

resources/mapper包下創(chuàng)建MyUserMapper.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.soaic.hellospringboot.mapper.MyUserMapper">

    <resultMap id="userMap" type="com.soaic.hellospringboot.entity.MyUser">
        <id column="id" property="id" jdbcType="INTEGER"/>
        <result column="username" property="userName" jdbcType="VARCHAR" />
        <result column="password" property="password" jdbcType="VARCHAR" />
    </resultMap>

    <insert id="insertUser" useGeneratedKeys="true" keyProperty="id" parameterType="com.soaic.hellospringboot.entity.MyUser">
        insert into user_t (username, password)
        values(#{userName,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR})
    </insert>

    <insert id="batchInsertUser" useGeneratedKeys="true" keyProperty="id">
        insert into user_t (username, password) values
        <foreach item="item" collection="list" separator=",">
            (#{item.username}, #{item.password})
        </foreach>
    </insert>

    <delete id="deleteUser" parameterType="java.lang.Integer">
        delete from user_t
        where id = #id
    </delete>

    <update id="updateUser" parameterType="com.soaic.hellospringboot.entity.MyUser">
        update user_t
        set username = #{userName, jdbcType=VARCHAR}, password = #{password, jdbcType=VARCHAR}
    </update>

    <select id="selectUser" parameterType="java.lang.Integer" resultMap="userMap">
        select * from user_t
        where id = #{id,jdbcType=INTEGER}
    </select>

    <select id="selectAllUser" resultMap="userMap">
        select * from user_t
    </select>

</mapper>

以上代碼榴捡,主要實(shí)現(xiàn)了對(duì)user_t表的增刪改查杈女、批量添加以及用注解方式根據(jù)username模糊查詢。要注意的是吊圾,id中不能有相同名字达椰,接口中不能有相同方法名,否則會(huì)報(bào)錯(cuò)项乒。
其它功能可以詳細(xì)查看myBatis中文官方文檔:http://www.mybatis.org/mybatis-3/zh/index.html

(5) 開發(fā)services啰劲。在com.soaic.hellospringboot包下創(chuàng)建services包,并創(chuàng)建MyUserServices.java文件檀何。該包下存放調(diào)用Mapper接口的服務(wù)蝇裤,供后面定義的controller提供使用。

@Service
public class MyUserServices {

    @Resource
    private MyUserMapper userMapper;

    public Integer insertUser(MyUser user) {
        return userMapper.insertUser(user);
    }

    public Integer insertUser(List<MyUser> users) {
        return userMapper.batchInsertUser(users);
    }

    public MyUser deleteUser(Integer id) {
        return userMapper.deleteUser(id);
    }

    public MyUser updateUser(MyUser user) {
        return userMapper.updateUser(user);
    }

    public MyUser selectUser(Integer id) {
        return userMapper.selectUser(id);
    }

    public List<MyUser> selectUser() {
        return userMapper.selectAllUser();
    }

    public List<MyUser> selectUserByName(String name) {
        return userMapper.selectUserByName(name);
    }

}

(6) 開發(fā)controller频鉴。在com.soaic.hellospringboot包下創(chuàng)建controller包栓辜,并創(chuàng)建MyUserController.java。該包下存放所有接口控制器垛孔,所有接口都在控制器中定義藕甩。

@RestController
@RequestMapping("/user")
public class MyUserController {

    @Autowired
    private MyUserServices myUserServices;

    @RequestMapping(value = "/register", method = RequestMethod.POST)
    public String register(HttpServletRequest request) {
        try {
            String userName = request.getParameter("username");
            String password = request.getParameter("password");

            MyUser user = new MyUser();
            user.setUserName(userName);
            user.setPassword(password);
            return myUserServices.insertUser(user)+"";
        } catch (Exception e) {
            return e.getMessage();
        }
    }

    @RequestMapping("/findAllUser")
    public List<MyUser> findAllUser() {
        return myUserServices.selectUser();
    }
}

以上代碼實(shí)現(xiàn)了兩個(gè)接口:
http://localhost:8088/user/register注冊(cè)接口,請(qǐng)求方式為POST周荐,代碼中通過HttpServletRequest來獲取請(qǐng)求參數(shù)狭莱,GET方式也可以通過它來獲取。
http://localhost:8088/user/findAllUser獲取所有用戶接口概作,請(qǐng)求方式默認(rèn)為GET腋妙。
其它接口實(shí)現(xiàn)大家可以自己試著實(shí)現(xiàn)以下,實(shí)現(xiàn)方法其實(shí)都差不多仆嗦,這里就不做太多實(shí)現(xiàn)辉阶。

(7) 運(yùn)行測(cè)試。運(yùn)行直接點(diǎn)擊右上角綠色小圖標(biāo)就可以運(yùn)行項(xiàng)目了。測(cè)試/user/findAllUser接口可以在瀏覽器上直接測(cè)試谆甜,測(cè)試/user/register接口垃僚,由于該接口采用的請(qǐng)求方式是POST,所以就不能直接用瀏覽器測(cè)試了规辱。這里推薦大家使用IDEA里自帶的測(cè)試工具HTTP Client來測(cè)試谆棺。
打開方式:菜單欄 > tools > HTTP Client > Test RESTfull Web Service


可以看到左邊可以添加頭Headers,中間添加參數(shù)Parameters,右邊可以添加文本、文件等罕袋,最后點(diǎn)擊左上角綠色小圖標(biāo)就可以執(zhí)行了改淑,是不是特別方便。

三浴讯、接口分頁實(shí)現(xiàn)

在進(jìn)行接口開發(fā)中朵夏,分頁查詢是必不可少的功能,這里我們使用PageHelper分頁插件來進(jìn)行實(shí)現(xiàn)榆纽,使用它來進(jìn)行分頁特別簡(jiǎn)單方便仰猖。

(1) 在pom.xml中添加依賴庫。查看maven中pagehelper的版本:https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper-spring-boot-starter

<!-- 分頁 -->
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.2.10</version>
</dependency>

(2) 在application.yml中配置分頁插件奈籽。

# 分頁插件配置
pagehelper:
 helperDialect: mysql
 reasonable: true
 supportMethodsArguments: true
 params: count=countSql
 page-size-zero: false

(3) 添加PageModel饥侵,這里默認(rèn)頁碼數(shù)pageNum為第一頁,默認(rèn)一頁數(shù)量pageSize為10個(gè)衣屏。

public class PageModel {

    private int pageNum = 1;
    private int pageSize = 10;

    public int getPageNum() {
        return pageNum;
    }

    public void setPageNum(int pageNum) {
        this.pageNum = pageNum;
    }

    public int getPageSize() {
        return pageSize;
    }

    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }
}

(4) 添加PageBean繼承PageInfo, 這里主要是為了自定義返回分頁數(shù)據(jù)躏升,注解@JsonIgnore作用是忽略掉該字段,注解JsonProperty作用是更換返回字段key狼忱。

public class PageBean<T> extends PageInfo<T> {
    public PageBean(List<T> list){
        super(list);
    }
    @JsonIgnore
    @Override
    public int getSize() {
        return super.getSize();
    }
    @JsonIgnore
    @Override
    public int getStartRow() {
        return super.getStartRow();
    }
    @JsonIgnore
    @Override
    public int getEndRow() {
        return super.getEndRow();
    }
    @JsonIgnore
    @Override
    public int getPrePage() {
        return super.getPrePage();
    }
    @JsonIgnore
    @Override
    public int getNextPage() {
        return super.getNextPage();
    }
    @JsonIgnore
    @Override
    public boolean isIsFirstPage() {
        return super.isIsFirstPage();
    }
    @JsonIgnore
    @Override
    public boolean isIsLastPage() {
        return super.isIsLastPage();
    }
    @JsonIgnore
    @Override
    public boolean isHasNextPage() {
        return super.isHasNextPage();
    }
    @JsonIgnore
    @Override
    public boolean isHasPreviousPage() {
        return super.isHasPreviousPage();
    }
    @JsonIgnore
    @Override
    public int getNavigatePages() {
        return super.getNavigatePages();
    }
    @JsonIgnore
    @Override
    public int[] getNavigatepageNums() {
        return super.getNavigatepageNums();
    }
    @JsonIgnore
    @Override
    public int getNavigateFirstPage() {
        return super.getNavigateFirstPage();
    }
    @JsonIgnore
    @Override
    public int getNavigateLastPage() {
        return super.getNavigateLastPage();
    }
    @JsonIgnore
    @Override
    public int getPages() {
        return super.getPages();
    }
    @JsonProperty("items")
    @Override
    public List<T> getList() {
        return super.getList();
    }
    @JsonProperty("items")
    @Override
    public void setList(List<T> list) {
        super.setList(list);
    }
}

(4) 添加ResponseResult膨疏,這里主要是為了返回?cái)?shù)據(jù)時(shí)統(tǒng)一格式,msg是返回消息藕赞,code是返回狀態(tài)碼成肘,data是返回的結(jié)果數(shù)據(jù)。

public class ResponseResult<T> {

    private String msg;
    private Integer code;
    private T data;

    public ResponseResult() {}
    
    public ResponseResult(Integer code, String msg, T data) {
        this.data = data;
        this.code = code;
        this.msg = msg;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    @Override
    public String toString() {
        return "ResponseResult{" +
                ", msg='" + msg + '\'' +
                ", code=" + code +
                ", data=" + data +
                '}';
    }
}

(5) 修改MyUserControllerfindAllUser方法斧蜕。

    @RequestMapping("/findAllUser")
    public ResponseResult<PageBean> findAllUser(PageModel pageModel) {
        ResponseResult<PageBean> responseResult;
        try {
            PageHelper.startPage(pageModel.getPageNum(), pageModel.getPageSize());
            PageHelper.orderBy("id asc");
            List<MyUser> myUsers = myUserServices.selectUser();
            PageBean<MyUser> pageBean = new PageBean<>(myUsers);
            responseResult = new ResponseResult<>(200, "success", pageBean);
        } catch (Exception e) {
            e.printStackTrace();
            responseResult = new ResponseResult<>(501, "failure", null);
        }
        return responseResult;
    }

以上代碼修改了幾個(gè)地方,1)方法中添加了PageModel參數(shù)砚偶,目的是為了接收頁碼pageNum和頁數(shù)量pageSize值批销。2)調(diào)用PageHelperstartPage方法,并把頁碼和頁數(shù)量傳進(jìn)去染坯,設(shè)置分頁芭梯。3)再調(diào)用PageHelperorderBy方法設(shè)置排序可以設(shè)置降序desc和升序asc次乓。4)實(shí)例一個(gè)PageBean對(duì)象并把myUsers對(duì)象傳到構(gòu)造方法中,這時(shí)實(shí)例化的pageBean其實(shí)就是分頁好的數(shù)據(jù)。5)這里我們多做一步操作婚夫,再實(shí)例一個(gè)ResponseResult對(duì)象澄步,傳入codemsgpageBean對(duì)象,最后返回湃鹊。這時(shí)接口拿到的數(shù)據(jù)就是統(tǒng)一json格式數(shù)據(jù)了。

調(diào)用接口http://localhost:8088/user/findAllUser?pageNum=1&pageSize=10镣奋,返回?cái)?shù)據(jù)如下:

{
    "msg":"success",
    "code":200,
    "data":{
        "total":2,
        "pageNum":1,
        "pageSize":10,
        "items":[
            {
                "id":1,
                "userName":"soaic",
                "password":"123456"
            },
            {
                "id":2,
                "userName":"admin",
                "password":"123456"
            }
        ]
    }
}

四币呵、實(shí)現(xiàn)文件上傳接口

文件上傳也是很api必不可少的功能了,有單個(gè)文件上傳侨颈,也有多個(gè)文件和文本一起請(qǐng)求余赢,步驟如下:
(1) 在pom.xml中添加依賴庫。

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.3</version>
</dependency>

(2) 在contoller包中添加UploadFileController哈垢。

@RestController
@RequestMapping("/upload")
public class UploadFileController {

    @RequestMapping(value = "/file", method = RequestMethod.POST)
    public ResponseResult<String> uploadFile(@RequestParam("file") MultipartFile multipartFile) {
        try {
            System.out.println("multipartFile"+multipartFile);
            String filePath = "/Users/soaic/"+multipartFile.getOriginalFilename();
            FileUtils.writeByteArrayToFile(new File(filePath), multipartFile.getBytes());
            return new ResponseResult<>(200, "upload success" , filePath);
        } catch (Exception e) {
            e.printStackTrace();
            return new ResponseResult<>(501, "upload failure", e.getMessage());
        }
    }

    @RequestMapping(value = "/batchFile", method = RequestMethod.POST)
    public ResponseResult<String> uploadFiles(HttpServletRequest request) {
        try {
            String content = request.getParameter("content");
            System.out.println("content="+content);
            //獲取上傳的文件數(shù)組
            List<MultipartFile> files = ((MultipartHttpServletRequest) request).getFiles("file");
            for (MultipartFile file:files) {
                FileUtils.writeByteArrayToFile(new File("/Users/soaic/"+file.getOriginalFilename()), file.getBytes());
            }
            return new ResponseResult<>(200, "upload success",null);
        } catch (Exception e) {
            e.printStackTrace();
            return new ResponseResult<>(501, "upload failure", e.getMessage());
        }
    }
}

以上代碼實(shí)現(xiàn)了兩個(gè)接口:一個(gè)是單文件上傳妻柒,另一個(gè)是多文件上傳并攜帶參數(shù)。單文件上傳是通過multipartFile對(duì)象來接收文件耘分,并通過FileUtils工具類調(diào)用writeByteArrayToFile方法保存文件蛤奢。多文件上傳是通過HttpServletRequest對(duì)象調(diào)用getFiles方法來獲取MultipartFile集合。
(3) 測(cè)試陶贼。文件上傳測(cè)試啤贩,這里推薦一個(gè)新的測(cè)試工具Advanced REST Client,用著還是挺不錯(cuò)的拜秧,大家可以試試痹屹。下載地址:https://install.advancedrestclient.com/install

以上代碼都已放在github上,地址:https://github.com/soaic/HelloSpringBoot

這篇文章主要介紹了SpringBoot的項(xiàng)目搭建枉氮、整合MyBatis志衍、分頁接口實(shí)現(xiàn)和文件上傳接口。下一篇文章會(huì)介紹配置Https聊替、配置攔截器楼肪、頁面轉(zhuǎn)向、資源指向惹悄、事務(wù)處理等等春叫,希望大家多多關(guān)注。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末泣港,一起剝皮案震驚了整個(gè)濱河市暂殖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌当纱,老刑警劉巖呛每,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異坡氯,居然都是意外死亡晨横,警方通過查閱死者的電腦和手機(jī)洋腮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來手形,“玉大人啥供,你說我怎么就攤上這事∪保” “怎么了滤灯?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)曼玩。 經(jīng)常有香客問我鳞骤,道長(zhǎng),這世上最難降的妖魔是什么黍判? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任豫尽,我火速辦了婚禮,結(jié)果婚禮上顷帖,老公的妹妹穿的比我還像新娘美旧。我一直安慰自己,他們只是感情好贬墩,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布榴嗅。 她就那樣靜靜地躺著,像睡著了一般陶舞。 火紅的嫁衣襯著肌膚如雪嗽测。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天肿孵,我揣著相機(jī)與錄音唠粥,去河邊找鬼。 笑死停做,一個(gè)胖子當(dāng)著我的面吹牛晤愧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蛉腌,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼官份,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了眉抬?” 一聲冷哼從身側(cè)響起贯吓,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蜀变,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體介评,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡库北,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年爬舰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寒瓦。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡情屹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出杂腰,到底是詐尸還是另有隱情垃你,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布喂很,位于F島的核電站惜颇,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏少辣。R本人自食惡果不足惜凌摄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望漓帅。 院中可真熱鬧锨亏,春花似錦、人聲如沸忙干。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捐迫。三九已至乾翔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間弓乙,已是汗流浹背末融。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留暇韧,地道東北人勾习。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像懈玻,于是被迫代替她去往敵國(guó)和親巧婶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

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