订单模块的实现
1.订单确认页面跳转
说明: 当点击去结算按钮时,应该跳转到订单确认页面order-cart.jsp.
2 编辑OrderController
package com.jt.controller;
import com.alibaba.dubbo.config.annotation.Reference;
import com.jt.pojo.Cart;
import com.jt.service.DubboCartService;
import com.jt.util.UserThreadLocal;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.List;
@Controller
@RequestMapping("/order")
public class OrderController {
@Reference
private DubboCartService cartService;
/**
* 业务说明:
* 当点击按钮时,跳转到订单确认页面 cartList购物车数据
* URL地址:http://www.jt.com/order/create.html
* 参数: userId
* 返回值: 页面逻辑名称 order-cart
* 页面取值: ${carts}
*/
@RequestMapping("/create")
public String orderCreate(Model model){
long userId = UserThreadLocal.get().getId();
List<Cart> cartList = cartService.findCartListByUserId(userId);
model.addAttribute("carts",cartList);
return "order-cart";
}
}
3 页面效果展现
3.2 订单项目创建
3.2.1 创建订单项目
3.2.2 添加继承/依赖/插件
<dependencies>
<dependency>
<groupId>com.jt</groupId>
<artifactId>jt-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
<!--添加插件 有main方法时 需要添加插件-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
3.2.3 关于订单表设计说明
3.2.4 编辑POJO,继承BasePojo
3.2.5 代码结构如下
实现好对应接口,Mapper,启动类(别忘了加包扫描)
3.4 订单提交
3.4.1 页面分析
1).页面URL分析
2).参数说明
3).POJO对象封装
4).页面JS分析
jQuery.ajax( {
type : "POST",
dataType : "json",
url : "/order/submit",
//将name属性与值进行拼接 形式 name=value1&name2=value2&name3=value3......
//表单序列化,可以简化参数写法
data : $("#orderForm").serialize(),
cache : false,
success : function(result) { //SysResult对象
if(result.status == 200){ //要求返回orderId
location.href = "/order/success.html?id="+result.data;
}else{
$("#submit_message").html("订单提交失败,请稍后重试...").show();
}
},
error : function(error) {
$("#submit_message").html("亲爱的用户请不要频繁点击, 请稍后重试...").show();
}
});
3.4.2 编辑OrderController
/**
* 实现订单入库操作
* url分析: http://www.jt.com/order/submit
* 参数: 整个form表单 Order对象
* 返回值: SysResult对象
* 页面取值: 要求返回orderId
*/
@RequestMapping("/submit")
@ResponseBody
public SysResult submit(Order order){
long userId = UserThreadLocal.get().getId();
order.setUserId(userId);
String orderId = orderService.saveOrder(order);
//完成订单之后,应该删除购物车.. 分布式事务....
//cartService.deleteCart();
return SysResult.success(orderId);
}
3.4.3 编辑OrderService
package com.jt.service;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import com.alibaba.dubbo.config.annotation.Service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.jt.mapper.OrderItemMapper;
import com.jt.mapper.OrderMapper;
import com.jt.mapper.OrderShippingMapper;
import com.jt.pojo.Order;
import com.jt.pojo.OrderItem;
import com.jt.pojo.OrderShipping;
@Service
public class OrderServiceImpl implements DubboOrderService {
@Autowired
private OrderMapper orderMapper;
@Autowired
private OrderShippingMapper orderShippingMapper;
@Autowired
private OrderItemMapper orderItemMapper;
/**
* 完成3张表入库操作
* order表入库
* orderItem表入库
* OrderShipping表入库
* 动态生成orderId.设定默认状态
* 注意数据库事务控制
* @param order
* @return
*/
@Override
@Transactional
public String saveOrder(Order order) {
//动态生成主键
String orderId = "" + order.getUserId() + System.currentTimeMillis();
//1.完成订单入库操作
order.setOrderId(orderId).setStatus(1);
orderMapper.insert(order);
System.out.println("订单入库操作成功!!!");
//2.完成订单物流入库
OrderShipping orderShipping = order.getOrderShipping();
orderShipping.setOrderId(orderId);
orderShippingMapper.insert(orderShipping);
System.out.println("订单物流入库成功!!!");
//3.完成订单商品入库操作
List<OrderItem> orderItems = order.getOrderItems();
for (OrderItem orderItem : orderItems){
orderItem.setOrderId(orderId);
orderItemMapper.insert(orderItem);
}
System.out.println("订单全部入库成功!!!!");
return orderId;
}
}
3.5 订单查询
3.5.1 业务分析
说明: 当用户订单入库之后,应该跳转到订单的成功页面. 格式如下:
页面数据: ${order}
3.5.2 编辑OrderController
/**
* 实现订单查询
* url: http://www.jt.com/order/success.html?id=71613981329562
* 参数: orderId
* 返回值: 成功页面 success.jsp
* 页面取值: Order对象(包含其它2个业务数据) ${order.orderId}
*/
@RequestMapping("/success")
public String success(String id,Model model){
//根据id 查询订单对象
Order order = orderService.findOrderById(id);
model.addAttribute("order", order);
return "success";
}
3.5.3 编辑OrderService
@Override
public Order findOrderById(String id) {
Order order = orderMapper.selectById(id);
OrderShipping orderShipping = orderShippingMapper.selectById(id);
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.eq("order_id", id);
List<OrderItem> orderItems = orderItemMapper.selectList(queryWrapper);
return order.setOrderShipping(orderShipping).setOrderItems(orderItems);
}
3.5.4 页面效果
订单模块的实现步骤
1-建立单独订单模块,添加继承/依赖/插件
2-设计pojo :order(整个订单模板),orderItem(商品订单:商品展示在订单里的西信息有哪些),orderShipping(商品物流)
3-jt-web 前端编辑一个隐藏的form表单,
当点击按钮时,跳转到订单确认页面 cartList购物车数据
参数: userId
返回值: 页面逻辑名称 order-cart,
页面取值: ${carts}
4-通过ThreadLocal获取到userId,然后根据userId,查询数据库,得到商品列表,并用控制层的Model渲染为商品订单界面
5-跳转到商品订单界面后,点击确认按钮通过本地线程ThreaLocal线程获取到userId,然后在业务层进行三张表的入库操作
- 完成3张表入库操作
- order表入库
- orderItem表入库
- OrderShipping表入库
最后,返回orderId给订单提交成功后的界面,
最后当用户订单入库之后,跳转到订单的成功页面