如何做一个电商系统(七)

1.订单系统

(1)完成订单系统。

(2)实现订单提交功能。

1.1.系统架构

说明:将订单服务抽取出来,创建单独的订单系统。

好处:提供代码的复用性,增强系统的拓展能力。

image.png
image.png

1.2.订单系统表结构

image.png

表结构说明:
(1)订单表跟用户表示多对一的关系。

(2)订单表跟收件人表示一对一的关系。

(3)订单表跟订单商品表示一对多的关系。

(4)订单商品表跟商品表示一对一的关系。

1.3.实现思路

(1)搭建订单系统

(2)在订单系统中发布保存订单接口

(3)在门户系统中调用该接口

2.保存订单功能实现

2.1.第一部分:搭建订单系统

步骤说明:(1)创建一个Maven项目。

(2)导入相关依赖

(3)实现框架整合

2.1.1.第一步:创建项目

--说明:使用Maven Module创建,war模型

image.png

2.1.2.第二步:导入pom依赖

--修改pom.xml文件,添加如下依赖

<project xmlns="http://maven.apache.org/POM/4.0.0"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0

    http://maven.apache.org/xsd/maven-4.0.0.xsd">     

  <modelVersion>4.0.0</modelVersion>

  <parent>

    <groupId>cn.gzsxt.ego</groupId>

    <artifactId>ego-project</artifactId>

    <version>1.0</version>

  </parent>

  <artifactId>ego-order</artifactId>

  <packaging>war</packaging>

    <dependencies>

       <!-- 添加ego-base公共系统依赖 -->

       <dependency>

           <groupId>cn.gzsxt.ego</groupId>

           <artifactId>ego-base</artifactId>

           <version>1.0</version>

       </dependency>

       <!-- spring核心包 -->

       <dependency>

           <groupId>org.springframework</groupId>

           <artifactId>spring-context</artifactId>

       </dependency>

       <!-- 导入spring-jdbc包+事物 -->

       <dependency>

           <groupId>org.springframework</groupId>

           <artifactId>spring-jdbc</artifactId>

       </dependency>

       <!-- 导入切面依赖包 -->

       <dependency>

           <groupId>org.springframework</groupId>

           <artifactId>spring-aspects</artifactId>

       </dependency>

       <!-- 导入springmvc依赖包 -->

       <dependency>

           <groupId>org.springframework</groupId>

           <artifactId>spring-webmvc</artifactId>

       </dependency>

       <!-- mybatis-plus依赖包 -->

       <dependency>

           <groupId>com.baomidou</groupId>

            <artifactId>mybatis-plus</artifactId>

       </dependency>

       <!-- 导入jdbc驱动+连接池 -->

       <!-- MySql -->

       <dependency>

           <groupId>mysql</groupId>

           <artifactId>mysql-connector-java</artifactId>

       </dependency>

       <!-- 连接池 -->

       <dependency>

           <groupId>com.alibaba</groupId>

           <artifactId>druid</artifactId>

       </dependency>

       <dependency>

           <groupId>com.fasterxml.jackson.core</groupId>

           <artifactId>jackson-databind</artifactId>

       </dependency>

  </dependencies>

  <build>

       <plugins>

           <!-- 配置Tomcat插件 -->

           <plugin>

              <groupId>org.apache.tomcat.maven</groupId>

              <artifactId>tomcat7-maven-plugin</artifactId>

              <configuration>

                  <port>8085</port>

                  <path>/</path>

                  <uriEncoding>utf-8</uriEncoding>

              </configuration>

           </plugin>

       </plugins>

  </build>

</project>

2.1.3.第三步:创建web.xml文件

--说明:从ego-rest工程中拷贝,修改url-partten属性即可。

<?xml version="1.0" encoding="UTF-8"?>     

<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"      xmlns:xml="http://www.w3.org/XML/1998/namespace"      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee      http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd ">

    <!-- 配置编码过滤器,防止post乱码 -->

    <filter>

       <filter-name>characterEncodingFilter</filter-name>

       <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>

       <init-param>

           <param-name>encoding</param-name>

           <param-value>utf-8</param-value>

       </init-param>

    </filter>

    <filter-mapping>

       <filter-name>characterEncodingFilter</filter-name>

       <url-pattern>/*</url-pattern>

    </filter-mapping>

    <!-- 配置springmvc核心控制器 -->

    <servlet>

       <servlet-name>dispatcherServlet</servlet-name>

       <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

       <init-param>

           <param-name>contextConfigLocation</param-name>

           <param-value>classpath:spring-*.xml</param-value>

       </init-param>

       <load-on-startup>1</load-on-startup>

    </servlet>

    <servlet-mapping>

       <servlet-name>dispatcherServlet</servlet-name>

       <!-- 所有order项目中的接口路径,都以/order开头,方便维护接口 -->

       <url-pattern>/order/*</url-pattern>

    </servlet-mapping>

</web-app>

2.1.4.第四步:Spring整合SpringMVC

--创建spring-mvc.xml文件

<?xml version="1.0" encoding="UTF-8"?>     

<beans xmlns="http://www.springframework.org/schema/beans"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xmlns:context="http://www.springframework.org/schema/context"

    xmlns:mvc="http://www.springframework.org/schema/mvc"

    xsi:schemaLocation="http://www.springframework.org/schema/beans      http://www.springframework.org/schema/beans/spring-beans-4.3.xsd

       http://www.springframework.org/schema/context      http://www.springframework.org/schema/context/spring-context-4.3.xsd

       http://www.springframework.org/schema/mvc      http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd">

    <!-- 1、开启注解扫描 -->

    <context:component-scan base-package="cn.gzsxt.order"/>

    <!-- 2、开启springmvc注解驱动 -->

    <mvc:annotation-driven/>

</beans>

2.1.5.第五步:MybatisPlus整合Spring

(1)创建resourse.properties文件

#配置数据源     

db.driver=com.mysql.jdbc.Driver

db.url=jdbc:mysql://localhost:3306/ego

db.username=root

db.password=gzsxt

(2)创建spring-data.xml文件

<?xml version="1.0" encoding="UTF-8"?>     

<beans xmlns="http://www.springframework.org/schema/beans"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xmlns:context="http://www.springframework.org/schema/context"

    xmlns:tx="http://www.springframework.org/schema/tx"

    xsi:schemaLocation="http://www.springframework.org/schema/beans      http://www.springframework.org/schema/beans/spring-beans-4.3.xsd

       http://www.springframework.org/schema/context      http://www.springframework.org/schema/context/spring-context-4.3.xsd

       http://www.springframework.org/schema/tx      http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">

    <context:property-placeholder file-encoding="utf-8"      location="classpath:resource.properties"/>

    <!-- 1、创建数据源 -->

    <bean name="dataSource"      class="com.alibaba.druid.pool.DruidDataSource">

       <property name="driverClassName" value="${db.driver}"/>

       <property name="url" value="${db.url}"/>

       <property name="username" value="${db.username}"/>

       <property name="password" value="${db.password}"/>

       <property name="maxActive" value="20"/>

       <property name="minIdle" value="5"/>

    </bean>

    <!-- 2、mybatis-plus整合Spring

       任何的数据库的框架,要使用spring的事物代理,必须使用spring提供的数据源,必须整合spring才可以使用

    -->

    <bean name="sqlSessionFactoryBean"      class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean">

       <!-- 加载数据源 -->

       <property name="dataSource" ref="dataSource"/>

       <!-- 指定pojo目录 -->

       <property name="typeAliasesPackage"      value="cn.gzsxt.base.pojo"/>

       <!-- 配置mybatis-plus插件 -->

       <property name="plugins">

           <list>

               <!-- 配置分页插件 -->

              <bean      class="com.baomidou.mybatisplus.plugins.PaginationInterceptor"/>

              <!-- 配置拦截器属性 -->

              <bean      class="com.baomidou.mybatisplus.plugins.PerformanceInterceptor">

                  <!-- 配置sql响应时间,开发阶段方便做调优 -->

                  <property name="maxTime" value="1000"/>

                  <property name="format" value="true"/>

              </bean>

           </list>

       </property>

       <!-- 配置mybatis-plus全局策略 -->

       <property name="globalConfig"      ref="globalConfiguration"></property>

    </bean>

    <!-- 3、配置mybatis的动态代理 -->

    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">

       <property name="sqlSessionFactoryBeanName"      value="sqlSessionFactoryBean"/>

       <property name="basePackage"      value="cn.gzsxt.base.mapper"></property>

    </bean>

    <!-- 配置mybatis-plus全局属性 -->

    <!-- 定义 MybatisPlus 的全局策略配置-->

    <bean id ="globalConfiguration"      class="com.baomidou.mybatisplus.entity.GlobalConfiguration">

        <!-- 在 2.3 版本以后,dbColumnUnderline 默认值是 true,即pojo属性开启驼峰标识 -->

        <property name="dbColumnUnderline" value="true"></property>

        <!-- 全局的主键策略 -->

        <!--

            AUTO->`0`("数据库ID自增")

             INPUT->`1`(用户输入ID")

            ID_WORKER->`2`("全局唯一ID")

            UUID->`3`("全局唯一ID")

        -->

        <property name="idType" value="0"></property>

        <!-- 全局的表前缀策略配置 -->

        <property name="tablePrefix" value="tb_"></property>

    </bean>

    <!-- 4、配置事物管理器 -->

     <bean name="transactionManager"      class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

           <property name="dataSource" ref="dataSource"></property>

     </bean>

    <!-- 5、开启注解声明式事物 -->

    <tx:annotation-driven/>

</beans>

2.2.第二部分:发布保存订单接口

2.2.1.第一步:创建pojo、mapper

(1)创建Order、OrderItem、OrderShipping这三个类

--创建Order类

package cn.gzsxt.base.pojo;     

import java.util.Date;

import com.baomidou.mybatisplus.annotations.TableField;

import com.baomidou.mybatisplus.annotations.TableId;

import com.baomidou.mybatisplus.annotations.TableName;

/**

* <p>

*

* </p>

*

* @author yq.luan

* @since 2019-02-23

*/

@TableName("tb_order")

public class Order{

    /**

     * 订单id

     */

    @TableId(value="order_id",type=INPUT)

    private String orderId;

    /**

     * 实付金额。精确到2位小数;单位:元。如:200.07,表示:200元7分

     */

    private String payment;

    /**

     * 支付类型,1、在线支付,2、货到付款

     */

    @TableField("payment_type")

    private Integer paymentType;

    /**

     * 邮费。精确到2位小数;单位:元。如:200.07,表示:200元7分

     */

    @TableField("post_fee")

    private String postFee;

    /**

     * 状态:1、未付款,2、已付款,3、未发货,4、已发货,5、交易成功,6、交易关闭

     */

    private Integer status;

    /**

     * 订单创建时间

     */

    @TableField("create_time")

    private Date createTime;

    /**

     * 订单更新时间

     */

    @TableField("update_time")

    private Date updateTime;

    /**

     * 付款时间

     */

    @TableField("payment_time")

    private Date paymentTime;

    /**

     * 发货时间

     */

    @TableField("consign_time")

    private Date consignTime;

    /**

     * 交易完成时间

     */

    @TableField("end_time")

    private Date endTime;

    /**

     * 交易关闭时间

     */

    @TableField("close_time")

    private Date closeTime;

    /**

     * 物流名称

     */

    @TableField("shipping_name")

    private String shippingName;

    /**

     * 物流单号

     */

    @TableField("shipping_code")

    private String shippingCode;

    /**

     * 用户id

     */

    @TableField("user_id")

    private Long userId;

    /**

     * 买家留言

     */

    @TableField("buyer_message")

    private String buyerMessage;

    /**

     * 买家昵称

     */

    @TableField("buyer_nick")

    private String buyerNick;

    /**

     * 买家是否已经评价

     */

    @TableField("buyer_rate")

    private Integer buyerRate;

    //补全get、set方法

}

--创建OrderItem类

package cn.gzsxt.base.pojo;     

import com.baomidou.mybatisplus.annotations.TableField;

import com.baomidou.mybatisplus.annotations.TableId;

import com.baomidou.mybatisplus.annotations.TableName;

import com.baomidou.mybatisplus.enums.IdType;

/**

* <p>

*

* </p>

*

* @author yq.luan

* @since 2019-02-23

*/

@TableName("tb_order_item")

public class OrderItem{

    @TableId(value="id",type=IdType.INPUT)

    private String id;

    /**

     * 商品id

     */

    @TableField("item_id")

    private String itemId;

    /**

     * 订单id

     */

    @TableField("order_id")

    private String orderId;

    /**

     * 商品购买数量

     */

    private Integer num;

    /**

     * 商品标题

     */

    private String title;

    /**

     * 商品单价

     */

    private Long price;

    /**

     * 商品总金额

     */

    @TableField("total_fee")

    private Long totalFee;

    /**

     * 商品图片地址

     */

    @TableField("pic_path")

private String picPath;

//补全get、set方法

}

--创建OrderShipping类

package cn.gzsxt.base.pojo;     

import java.util.Date;

import com.baomidou.mybatisplus.annotations.TableField;

import com.baomidou.mybatisplus.annotations.TableId;

import com.baomidou.mybatisplus.annotations.TableName;

import com.baomidou.mybatisplus.enums.IdType;

/**

* <p>

*

* </p>

*

* @author yq.luan

* @since 2019-02-23

*/

@TableName("tb_order_shipping")

public class OrderShipping{

    /**

     * 订单ID

     */

    @TableId(value="order_id",type=IdType.INPUT)

    private String orderId;

    /**

     * 收货人全名

     */

    @TableField("receiver_name")

    private String receiverName;

    /**

     * 固定电话

     */

    @TableField("receiver_phone")

    private String receiverPhone;

    /**

     * 移动电话

     */

    @TableField("receiver_mobile")

    private String receiverMobile;

    /**

     * 省份

     */

    @TableField("receiver_state")

    private String receiverState;

    /**

     * 城市

     */

    @TableField("receiver_city")

    private String receiverCity;

    /**

     * 区/县

     */

    @TableField("receiver_district")

    private String receiverDistrict;

    /**

     * 收货地址,如:xx路xx号

     */

    @TableField("receiver_address")

    private String receiverAddress;

    /**

     * 邮政编码,如:310001

     */

    @TableField("receiver_zip")

    private String receiverZip;

    private Date created;

    private Date updated;

    //补全get、set方法

}

(2)创建OrderMapper、OrderItemMapper、OrderShippingMapper

--创建OrderMapper

package cn.gzsxt.base.mapper;     

import cn.gzsxt.base.pojo.Order;

import com.baomidou.mybatisplus.mapper.BaseMapper;

/**

* <p>

*  Mapper 接口

* </p>

*

* @author yq.luan

* @since 2019-02-23

*/

public interface OrderMapper extends BaseMapper<Order> {

}

--创建OrderItemMapper接口

package cn.gzsxt.base.mapper;     

import cn.gzsxt.base.pojo.OrderItem;

import com.baomidou.mybatisplus.mapper.BaseMapper;

/**

* <p>

*  Mapper 接口

* </p>

*

* @author yq.luan

* @since 2019-02-23

*/

public interface OrderItemMapper extends BaseMapper<OrderItem> {

}

--创建OrderShippingMapper接口

package cn.gzsxt.base.mapper;     

import cn.gzsxt.base.pojo.OrderShipping;

import com.baomidou.mybatisplus.mapper.BaseMapper;

/**

* <p>

*  Mapper 接口

* </p>

* @author yq.luan

* @since 2019-02-23

*/

public interface OrderShippingMapper extends      BaseMapper<OrderShipping> {

}

2.2.2.第二步:创建OrderDetail类

说明:我们是通过OrderDetail类来接收订单页面提交的参数。

订单页面提交的参数如下:

image.png

分析:
(1)订单商品需要使用List<OrderItem>集合来接收。

(2)收件人信息需要使用对象.属性的方式来接收。

问题1:SpringMVC如何绑定List集合类型的参数?

答:需要将List集合定义到一个javabean对象中。

问题2:SpringMVC如何绑定对象.属性类型的参数?

答:将对象定义成javabean的一个属性。

结论:
(1)我们定义一个OrderDetail类,继承Order这个类。

目的:接收跟订单有关的参数。

(2)将List<OrderItem> orderItems定义成其中一个属性。

(3)将OrderShipping orderShipping定义另外一个属性。

--OrderDetail类结构如下:

package cn.gzsxt.base.vo;     

import java.util.List;

import cn.gzsxt.base.pojo.Order;

import cn.gzsxt.base.pojo.OrderItem;

import cn.gzsxt.base.pojo.OrderShipping;

/**

* 自定义订单详情类

* @author ccnulyq

*

*/

public class OrderDetail extends Order{

    private List<OrderItem> orderItems;

    private OrderShipping orderShipping;

    public OrderDetail() {

       super();

       // TODO Auto-generated constructor stub

    }

    public List<OrderItem> getOrderItems() {

       return orderItems;

    }

    public void setOrderItems(List<OrderItem> orderItems) {

       this.orderItems = orderItems;

    }

    public OrderShipping getOrderShipping() {

       return orderShipping;

    }

    public void setOrderShipping(OrderShipping orderShipping) {

       this.orderShipping = orderShipping;

    }

}

2.2.3.第三步:创建OrderService接口及其实现类

package cn.gzsxt.order.service.impl;     

import java.util.Date;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

import cn.gzsxt.base.mapper.OrderItemMapper;

import cn.gzsxt.base.mapper.OrderMapper;

import cn.gzsxt.base.mapper.OrderShippingMapper;

import cn.gzsxt.base.pojo.OrderItem;

import cn.gzsxt.base.pojo.OrderShipping;

import cn.gzsxt.base.utils.IDUtils;

import cn.gzsxt.base.vo.OrderDetail;

import cn.gzsxt.order.service.OrderService;

@Service

public class OrderServiceImpl implements OrderService{

    @Autowired

    private OrderMapper orderMapper;

    @Autowired

    private OrderItemMapper itemMapper;

    @Autowired

    private OrderShippingMapper shippingMapper;

    @Override

    public String save(OrderDetail order) {

       try {

           //1、保存订单数据

           long orderId = IDUtils.genItemId();

           order.setOrderId(orderId+"");

           order.setStatus(1);

           order.setCreateTime(new Date());

           order.setUpdateTime(order.getCreateTime());

           orderMapper.insert(order);

           //2、保存订单项

           List<OrderItem> items = order.getOrderItems();

           for (OrderItem t : items) {

              t.setId(IDUtils.genItemId()+"");

              t.setOrderId(orderId+"");

              itemMapper.insert(t);

           }

           //3、保存收件人信息

           OrderShipping orderShipping = order.getOrderShipping();

           orderShipping.setOrderId(orderId+"");

           shippingMapper.insert(orderShipping);

           return orderId+"";

       } catch (Exception e) {

           e.printStackTrace();

           return null;

       }

    }

}

2.2.4.第四步:创建OrderController类

package cn.gzsxt.order.controller;     

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

import cn.gzsxt.base.vo.OrderDetail;

import cn.gzsxt.order.service.OrderService;

@RestController

public class OrderController {

    @Autowired

    private OrderService orderService;

    @RequestMapping(value = "/create")

    public String save(String order){

       OrderDetail jsonToPojo = JsonUtils.jsonToPojo(order,      OrderDetail.class);

       String orderId = orderService.save(jsonToPojo);

return orderId;

    }

}

2.3.第三部分:在门户系统中调用保存订单接口

2.3.1.第一步:修改OrderService接口及其实现类

--新增保存订单方法

@Override     

    public String save(OrderDetail order) {

       Map<String, String> params = new HashMap<>();

       params.put("order", JsonUtils.objectToJson(order));

       String doPost =      HttpClientUtils.doGet("http://localhost:8085/order/create", params);

       return doPost;

    }

2.3.2.第二步:修改OrderController类

--新增保存订单方法

@RequestMapping(value="/create", method=RequestMethod.POST)

    public String save(OrderDetail order,ModelMap map){

       String orderid = orderService.save(order);

       if(null!=orderid && !"".equals(orderid)){

           map.addAttribute("orderId", orderid);

           map.addAttribute("payment", order.getPayment());

           //默认送到时间,在3天后

           Calendar c=Calendar.getInstance();

           SimpleDateFormat df=new SimpleDateFormat("yyyy/MM/dd/E");

           c.add(Calendar.DATE, 3);

           System.out.println(df.format(c.getTime()));

           map.addAttribute("date", df.format(c.getTime()));

           return "success";

       }else{

           //订单创建失败

           map.addAttribute("message", orderid);

           return "error/exception";

       }

    }

2.3.3.第三步:测试

(1)重新编译ego-project工程。

(2)在浏览器访问门户首页,并提交订单。

image.png

--保存订单成功!!!

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