创建订单【项目 商城】

  • 创建订单
    • 1 创建数据表
    • 2 创建实体类
    • 3 持久层
      • 3.1 规划SQL语句
      • 3.2 设计接口与抽象方法
      • 3.3 配置SQL映射
    • 测试
    • 4 业务层
      • 4.1 实现接口与抽象方法
      • 4.2 实现抽象方法
    • 测试
    • 5 控制层
      • 5.1 处理异常
      • 5.2 设计请求
      • 5.3 处理请求
    • 测试
    • 6 前端页面
    • 测试

创建订单


1 创建数据表

CREATE TABLE t_order
(oid           INT AUTO_INCREMENT COMMENT '订单id',uid           INT         NOT NULL COMMENT '用户id',recv_name     VARCHAR(20) NOT NULL COMMENT '收货人姓名',recv_phone    VARCHAR(20) COMMENT '收货人电话',recv_province VARCHAR(15) COMMENT '收货人所在省',recv_city     VARCHAR(15) COMMENT '收货人所在市',recv_area     VARCHAR(15) COMMENT '收货人所在区',recv_address  VARCHAR(50) COMMENT '收货详细地址',total_price   BIGINT COMMENT '总价',status        INT COMMENT '状态:0-未支付,1-已支付,2-已取消,3-已关闭,4-已完成',order_time    DATETIME COMMENT '下单时间',pay_time      DATETIME COMMENT '支付时间',created_user  VARCHAR(20) COMMENT '创建人',created_time  DATETIME COMMENT '创建时间',modified_user VARCHAR(20) COMMENT '修改人',modified_time DATETIME COMMENT '修改时间',PRIMARY KEY (oid)
) ENGINE = InnoDBDEFAULT CHARSET = utf8;

CREATE TABLE t_order_item
(id            INT AUTO_INCREMENT COMMENT '订单中的商品记录的id',oid           INT          NOT NULL COMMENT '所归属的订单的id',pid           INT          NOT NULL COMMENT '商品的id',title         VARCHAR(100) NOT NULL COMMENT '商品标题',image         VARCHAR(500) COMMENT '商品图片',price         BIGINT COMMENT '商品价格',num           INT COMMENT '购买数量',created_user  VARCHAR(20) COMMENT '创建人',created_time  DATETIME COMMENT '创建时间',modified_user VARCHAR(20) COMMENT '修改人',modified_time DATETIME COMMENT '修改时间',PRIMARY KEY (id)
) ENGINE = InnoDBDEFAULT CHARSET = utf8;

order.sql


2 创建实体类

1.订单实体类
Order

package com.cy.store.entity;import java.io.Serializable;
import java.util.Date;
import java.util.Objects;/** 订单数据的实体类 */
public class Order extends BaseEntity implements Serializable {private Integer oid;private Integer uid;private String recvName;private String recvPhone;private String recvProvince;private String recvCity;private String recvArea;private String recvAddress;private Long totalPrice;private Integer status;private Date orderTime;private Date payTime;//---
}

2.订单项实体类
OrderItem

package com.cy.store.entity;import java.io.Serializable;
import java.util.Objects;/** 订单中的商品数据 */
public class OrderItem extends BaseEntity implements Serializable {private Integer id;private Integer oid;private Integer pid;private String title;private String image;private Long price;private Integer num;//---
}

Object


3 持久层

3.1 规划SQL语句

1.将数据插入到订单表中。

insert into t_order (oid除外的所有字段) values(字段的值)

2.将数据插入到订单项的表中。

insert into t_order_item (id除外的所有字段) values(字段的值)

3.2 设计接口与抽象方法

创建一个OrderMapper接口,接口中添加以上两个SQL语句的抽象方法。

package com.cy.store.mapper;import com.cy.store.entity.Order;
import com.cy.store.entity.OrderItem;/**订单的持久层接口*/
public interface OrderMapper {/*** 插入订单数据* @param order 订单数据* @return 受影响的行数*/Integer insertOrder(Order order);/*** 插入订单项的数据* @param orderItem 订单项的数据* @return 受影响的行数*/Integer insertOrderItem(OrderItem orderItem);}

3.3 配置SQL映射

创建OrderMapper.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.cy.store.mapper.OrderMapper"><insert id="insertOrder" useGeneratedKeys="true" keyProperty="oid">INSERT INTO t_order (uid, recv_name, recv_phone, recv_province, recv_city, recv_area, recv_address,total_price, status, order_time, pay_time, created_user, created_time, modified_user,modified_time)VALUES (#{uid}, #{recvName}, #{recvPhone}, #{recvProvince}, #{recvCity}, #{recvArea},#{recvAddress}, #{totalPrice}, #{status}, #{orderTime}, #{payTime}, #{createdUser},#{createdTime}, #{modifiedUser}, #{modifiedTime})</insert><insert id="insertOrderItem" useGeneratedKeys="true" keyProperty="id">INSERT INTO t_order_item (oid, pid, title, image, price, num, created_user,created_time, modified_user, modified_time) VALUES (#{oid}, #{pid}, #{title}, #{image}, #{price}, #{num}, #{createdUser},#{createdTime}, #{modifiedUser}, #{modifiedTime})</insert>
</mapper>

OrderMapper–insertOrder


测试

OrderMapperTests

package com.cy.store.mapper;import com.cy.store.entity.Address;
import com.cy.store.entity.Order;
import com.cy.store.entity.OrderItem;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.util.Date;
import java.util.List;//@SpringBootTest:表示标注当前的类是测试类,不会随同项目一块打包
@SpringBootTest
//@RunWith:表示启动这个单元测试类(单元测试类是不能够运行的),需要传递一个参数,必须是SpringRunner的实例类型
//@RunWith(SpringRunner.class)
public class OrderMapperTests {@Autowiredprivate OrderMapper orderMapper;@Testvoid insertOrder(){Order order=new Order();order.setUid(8);order.setRecvName("明明");order.setRecvPhone("17857704444");orderMapper.insertOrder(order);}@Testvoid insertOrderItem(){OrderItem orderItem = new OrderItem();orderItem.setOid(1);orderItem.setPid(10000003);orderItem.setTitle("广博(GuangBo)16K115页线圈记事本子日记本文具笔记本图案随机");orderMapper.insertOrderItem(orderItem);}
}

OrderMapperTests–insertOrder


4 业务层

4.1 实现接口与抽象方法

1.在AddressService接口中定义根据收货地址的id获取收货地址数据。

Address getByAid(Integer aid,Integer uid);

2.在子类中实现改抽象方法。

  @Overridepublic Address getByAid(Integer aid,Integer uid) {Address address = addressMapper.findByAid(aid);if (address==null){throw new AddressNotFoundException("收货地址数据不存在");}if (!address.getUid().equals(uid)){throw new AccessDeniedException("非法数据访问的异常");}address.setProvinceCode(null);address.setCityCode(null);address.setAreaCode(null);address.setCreatedUser(null);address.setCreatedTime(null);address.setModifiedUser(null);address.setModifiedTime(null);return address;}

AddressService–getByAid


3.在service包下创建IOrderService接口添加抽象方法用于创建订单。

package com.cy.store.service;import com.cy.store.entity.Order;public interface IOrderService {Order create(Integer aid, Integer uid, String username, Integer[] cids);
}

4.2 实现抽象方法

4.创建实现类OrderServiceImpl类。

package com.cy.store.service.impl;import com.cy.store.entity.Address;
import com.cy.store.entity.Order;
import com.cy.store.entity.OrderItem;
import com.cy.store.mapper.OrderMapper;
import com.cy.store.service.IAddressService;
import com.cy.store.service.ICartService;
import com.cy.store.service.IOrderService;
import com.cy.store.service.ex.InsertException;
import com.cy.store.vo.CartVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.Date;
import java.util.List;@Service
public class OrderServiceImpl implements IOrderService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate IAddressService addressService;@Autowiredprivate ICartService cartService;@Overridepublic Order create(Integer aid, Integer uid, String username, Integer[] cids) {//即将下单的列表List<CartVO> list = cartService.getVOByCid(uid, cids);//计算商品的总价Long totalPrice=0L;for (CartVO c: list) {totalPrice+=c.getRealPrice()*c.getNum();}Address address = addressService.getByAid(aid, uid);//插入数据Order order=new Order();order.setUid(uid);//收货地址数据order.setRecvName(address.getName());order.setRecvPhone(address.getPhone());order.setRecvProvince(address.getProvinceName());order.setRecvCity(address.getCityName());order.setRecvArea(address.getAreaName());order.setRecvAddress(address.getAddress());//支付、总价、时间order.setStatus(0);order.setTotalPrice(totalPrice);order.setOrderTime(new Date());//日志order.setCreatedUser(username);order.setCreatedTime(new Date());order.setModifiedUser(username);order.setModifiedTime(new Date());Integer rows = orderMapper.insertOrder(order);if (rows!=1){throw new InsertException("插入数据异常");}//创建订单详细项的数据for (CartVO c: list) {//创建一个订单项数据对象OrderItem orderItem=new OrderItem();orderItem.setOid(order.getOid());orderItem.setPid(c.getPid());orderItem.setTitle(c.getTitle());orderItem.setImage(c.getImage());orderItem.setPrice(c.getRealPrice());orderItem.setNum(c.getNum());//日志orderItem.setCreatedUser(username);orderItem.setCreatedTime(new Date());orderItem.setModifiedUser(username);orderItem.setModifiedTime(new Date());//插入数据操作rows=orderMapper.insertOrderItem(orderItem);if (rows!=1){throw new InsertException("插入数据异常");}}return order;}
}

OrderService–create


测试

package com.cy.store.service;import com.cy.store.entity.Address;
import com.cy.store.entity.Order;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;//@SpringBootTest:表示标注当前的类是测试类,不会随同项目一块打包
@SpringBootTest
//@RunWith:表示启动这个单元测试类(单元测试类是不能够运行的),需要传递一个参数,必须是SpringRunner的实例类型
//@RunWith(SpringRunner.class)
public class OrderServiceTests {@Autowiredprivate IOrderService orderService;@Testpublic void create(){Integer[] cids={4,5};Order order = orderService.create(6, 8, "红红", cids);System.out.println(order);}
}

OrderServiceTests–create


5 控制层

5.1 处理异常

5.2 设计请求

1.设计请求

/orders.create
aid,session,cids
post
JsonResult<Order>

5.3 处理请求

2.创建OrderController类,并编写请求处理方法。

package com.cy.store.controller;import com.cy.store.entity.Order;
import com.cy.store.service.IOrderService;
import com.cy.store.util.JsonResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpSession;@RequestMapping("/orders")
@RestController
public class OrderController extends BaseController{@Autowiredprivate IOrderService orderService;@RequestMapping("create")public JsonResult<Order> create(Integer aid, Integer[] cids, HttpSession session) {Integer uid=getuidFromSession(session);String username = getUsernameFromSession(session);Order data = orderService.create(aid, uid, username, cids);return new JsonResult<>(OK,data);}
}

OrderController–create


测试

6 前端页面

在订单确定页面中添加发送请求的处理方法。

         // create$("#btn-create-order").click(function() {let aid = $("#address-list").val();//5let cids = location.search.substr(1);//cids=4&cids=5$.ajax({url: "/orders/create",type: "GET",data: "aid="+aid + "&" +cids,//aid=5&cids=4&cids=5dataType: "JSON",success: function(json) {if (json.state == 200) {location.href = "payment.html";alert("订单创建成功");console.log(json.data)}},error: function(xhr) {alert("订单数据加载产生未知的异常" + xhr.status);}});});// create

orderConfirm.html–create


测试

README–创建订单


创建订单【项目 商城】相关推荐

  1. 10天手敲一个SpringBoot网上商城项目(九)—— 确认订单、创建订单功能的实现及AOP

    静态资源及sql文件分享 链接:https://pan.baidu.com/s/1X-yjmQcPD3PqS21x0HplNA?pwd=23gr 提取码:23gr 文章目录 确认订单 1.确认订单-持 ...

  2. SSM米米商城项目笔记一(数据库表创建和项目搭建)

    米米商城项目笔记一(数据库表创建和项目搭建) 使用的相关技术[当前最新技术]: IDEA:2022+ JDK:1.8 MySQL:8.0+ Maven:3.8+ Tomact:9.0+ 创建数据库信息 ...

  3. 医疗小程序源码_不懂商城小程序源码,如何快速创建小程序商城?

    小程序在近来发展十分迅速,从微信小程序游戏出发,到现在渗透到各种功能类型,甚至已经扩展到了其他的应用程序上.那么如今很多的小程序商城应该怎么创建呢?不懂商城小程序源码也可以自己制作吗?当然可以,下面小 ...

  4. ajax 提交订单,php-在Woocommerce 3中通过ajax提交并在结帐时创建订单

    我在结帐表单中添加了一个按钮: 并在functions.php文件中添加了一个AJAX代码段: add_action('wp_head', 'ajax_call_place_order'); func ...

  5. spring创建web项目_使用Spring WS创建合同优先的Web服务

    spring创建web项目 1引言 本文介绍了如何使用来实现和测试SOAP Web服务 Spring Web Services项目 . 本示例将JAXB2用于(取消)编组. 为了开发服务,我将使用合同 ...

  6. 使用“即时消息服务框架”(iMSF)实现分布式事务的三阶段提交协议(电商创建订单的示例)...

    1,示例解决方案介绍 在上一篇 <消息服务框架(MSF)应用实例之分布式事务三阶段提交协议的实现>中,我们分析了分布式事务的三阶段提交协议的原理,现在我们来看看如何使用消息服务框架(MSF ...

  7. 第一节:创建SpringBoot项目并运行HelloWorld

    SpingBoot 365计划开始更新了,计划手敲365个SpringBoot案例回顾总结形成知识体系.目前已经输出了32节的内容.所有源码托管在GitHub和Gitee上. 1.第一节:创建Spri ...

  8. java微信支付v3系列——4.创建订单的封装及使用

    目录 java微信支付v3系列--1.微信支付准备工作 java微信支付v3系列--2.微信支付基本配置 java微信支付v3系列--3.订单创建准备操作 java微信支付v3系列--4.创建订单的封 ...

  9. 新增收货地址【项目 商城】

    新增收货地址[项目 商城] 新增收货地址 1 新增收货地址-数据表创建 2 新增收货地址-创建实体类 3 新增收货地址-持久层 3.1 各功能的开发顺序 3.2 规划需要执行的SQL语句 3.3 接口 ...

最新文章

  1. 前端测试简述及使用Karma/Mocha实现的集成测试栗子(Travis CI/Coverage)
  2. /sys/class/gpio 文件接口操作IO端口(s3c2440)
  3. python装饰器作用和功能_python装饰器大详解
  4. html5视频播放自定义视频播放暂停,解决暂停按钮在视频画面中的问题
  5. 明了 | 看了这篇文章,多年不能理解的分布式事物,终于看懂了!
  6. 互联网控制协议ICMP
  7. 基于CentOS7安装CM
  8. 关于java中Exception异常
  9. java有用还是c有用_这周的有用资源
  10. 斐讯K1S路由器刷华硕固件教程
  11. win10虚拟显示器开发
  12. Linux上mysql忘记密码重置密码
  13. vue 3 引入百度地图api
  14. 黑苹果 MacOS 10.15.7 Catalina 最新安装教程
  15. dreamweaver cs4 css汉化补丁,dreamweaver cs4官方版
  16. ToC战场进入尾声,ToB市场战争厮杀即将升级?
  17. 免费网络硬盘、FTP、大容量邮箱、电子相册合集
  18. 好用的读书笔记app精选
  19. python如何设置搜狗输入法中英文切换_2020秋季报告:手机输入法AI时代来临,百度输入法优势明显...
  20. 超详细的集合思维导图

热门文章

  1. C语言的access函数的用法
  2. 前端请求异步与同步的区别
  3. RadioButton设置默认选中后无法取消,可选中多个的问题
  4. Reactor模式:反应器模式
  5. IO操作中flush()方法作用
  6. 7.26 3 教育的长久回报期
  7. PyCharm关闭双击shift全局搜索
  8. 通过前端form表单将信息提交至数据库
  9. 免费的B站短链生成器,将链接转成b23.tv
  10. Serializers