说在前面的话

上一节说了购物车的生成,本节主要说了在购物车的列表上去结算,从而生成一个未支付的订单,生成的订单默认状态为1,

题目说的BUG是因为所有数据都是通过前端向后端生成的,包括订单的金额。因此是可以通过F12工具进行修改金额。所以说这个商城的订单生成金额是有BUG存在的。所以我们应该在后台通过商品id、数量进行生成金额,不应该在取前端的金额。

购物车的数据都是从redis中取出来的。


service层:

OrderServiceImpl .java

package cn.tsu.order.e3mall.service.impl;

import java.util.Date;
import java.util.List; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import cn.tsu.e3mall.dao.TbOrderItemMapper;
import cn.tsu.e3mall.dao.TbOrderMapper;
import cn.tsu.e3mall.dao.TbOrderShippingMapper;
import cn.tsu.e3mall.jedis.JedisClient;
import cn.tsu.e3mall.pojo.TbItem;
import cn.tsu.e3mall.pojo.TbOrderItem;
import cn.tsu.e3mall.pojo.TbOrderShipping;
import cn.tsu.e3mall.utils.E3Result;
import cn.tsu.order.e3mall.pojo.OrderInfo;
import cn.tsu.order.e3mall.service.OrderService;
import cn.tsu.order.e3mall.service.config.OrderConfig;
import cn.tsu.order.e3mall.service.config.UUIDUtils;
/**
* 订单列表的service
* @author xiaofeng
*
*/
@Service
public class OrderServiceImpl implements OrderService{ @Autowired
private JedisClient jedisClient;//redis @Autowired
private TbOrderMapper orderMapper;//订单 @Autowired
private TbOrderShippingMapper orderShippingMapper;//收件人 @Autowired
private TbOrderItemMapper orderItemMapper;//订单中的商品列表 //创建订单
@Override
public E3Result CreateOrder(OrderInfo orderInfo) {
// 订单生成
//1.查询redis中是否含有初始值,通过redis生成商品id
//2.若不含,则创建一个初始值
if (!jedisClient.exists(OrderConfig.ORDER_ID_KEY_REDIS)) {
jedisClient.set(OrderConfig.ORDER_ID_KEY_REDIS, OrderConfig.ORDER_ID_REDIS);
}
//3.若含有,则初始值加1当做orderId
String orderId = jedisClient.incr(OrderConfig.ORDER_ID_KEY_REDIS).toString();
//4.把orderId加入到orderInfo中
orderInfo.setOrderId(orderId);
//状态:1、未付款,2、已付款,3、未发货,4、已发货,5、交易成功,6、交易关闭',
orderInfo.setStatus(1);
orderInfo.setCreateTime(new Date());
orderInfo.setUpdateTime(new Date());
orderMapper.insert(orderInfo);
//商品生成
List<TbOrderItem> orderItems = orderInfo.getOrderItems();
for (TbOrderItem orderItem : orderItems) {
orderItem.setId(UUIDUtils.date());
orderItem.setOrderId(orderId);
orderItemMapper.insert(orderItem);
}
//收件人生成
TbOrderShipping orderShipping = orderInfo.getOrderShipping();
orderShipping.setOrderId(orderId);
orderShipping.setCreated(new Date());
orderShipping.setUpdated(new Date());
//清除购物车
jedisClient.del(OrderConfig.CART_REDIS_PRE+orderInfo.getUserId());
return E3Result.ok(orderId);
}
}

controller层:

OrderController.java

package cn.tsu.order.e3mall.controller;

import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping; import cn.tsu.cart.e3mall.service.CartService;
import cn.tsu.e3mall.pojo.TbItem;
import cn.tsu.e3mall.pojo.TbUser;
import cn.tsu.e3mall.utils.E3Result;
import cn.tsu.order.e3mall.pojo.OrderInfo;
import cn.tsu.order.e3mall.service.OrderService; /**
* 支付的逻辑controller
* @author xiaofeng
*
*/
@Controller
public class OrderController { @Autowired
private CartService cartService; @Autowired
private OrderService orderService; @RequestMapping("order/order-cart")
public String showOrder(HttpServletRequest request) {
//通过拦截器set的tbuser获取用户
TbUser tbUser = (TbUser) request.getAttribute("tbUser");
//获取购物车里的商品
List<TbItem> cartList = cartService.getCart(tbUser.getId());
request.setAttribute("cartList", cartList);
return "order-cart";
}
//订单生成
@RequestMapping("/order/create")
public String orderCreate(OrderInfo orderInfo ,HttpServletRequest request) {
TbUser tbUser = (TbUser) request.getAttribute("tbUser");
orderInfo.setUserId(tbUser.getId());
orderInfo.setBuyerNick(tbUser.getUsername());
E3Result e3Result = orderService.CreateOrder(orderInfo);
request.setAttribute("payment", orderInfo.getPayment());
request.setAttribute("orderId", e3Result.getData());
return "success";
}
}

拦截器LoginInterceptor:

LoginInterceptor.java

package cn.tsu.order.e3mall.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang3.StringUtils;
import org.jboss.netty.util.internal.StringUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView; import cn.tsu.cart.e3mall.config.OrderConfig;
import cn.tsu.e3mall.pojo.TbUser;
import cn.tsu.e3mall.utils.CookieUtils;
import cn.tsu.e3mall.utils.E3Result;
import cn.tsu.sso.e3mall.service.UserService;
/**
*登录拦截器
* @author xiaofeng
*
*/
public class LoginInterceptor implements HandlerInterceptor{ @Autowired
private UserService userService; @Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
String url = request.getRequestURL().toString();
System.out.println(url);
//从用户浏览器中获取cookies
String token = CookieUtils.getCookieValue(request, OrderConfig.USER_LOGIN_TOKEN);
//若获取不到,则代表没登录,跳转到登录页面,拦截
if (StringUtils.isBlank(token)) {
response.sendRedirect(OrderConfig.LOGIN_HEAD+"/page/login?redirect="+url);
return false;
}
//获取到后到redis中查找user信息
E3Result e3Result = userService.getToken(token);
//若查不到信息,则代表没登录,跳转到登录页面,拦截
if (e3Result.getStatus() != 200) {
response.sendRedirect(OrderConfig.LOGIN_HEAD+"/page/login?redirect="+url);
return false;
}
//若查找到,把user放到request域中
TbUser tbUser = (TbUser) e3Result.getData();
request.setAttribute("tbUser", tbUser);
//放行
return true;
} @Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub } @Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// TODO Auto-generated method stub
}
}

数据库的读写分离(mycat)

Mysql提供的解决方案:使用binlog进行数据库同步。需要配置mysql。

代码中实现读写分类:

1、可以使用aop实现一个切面。动态切换数据源。需要编程实现。

2、使用数据库中间件实现读写分类,分库分表。



分库分表:

当数据库的表中数据非常大的时候例如上千万条数据。查询性能非常低。可以把一张表保存到不同的数中。



可以使用一个数据库中间件mycat。国产开源项目,前身是cobar项目。

完!!!!

e3mall商城总结13之订单确认(有BUG)的更多相关文章

  1. JAVAEE——宜立方商城13:订单系统实现、订单生成、Mycat数据库分片

    1. 学习计划 1.订单系统实现 2.订单生成 3.Mycat数据库分片 2. 订单系统 2.1. 功能分析 1.在购物车页面点击“去结算”按钮,跳转到订单确认页面 a) 必须要求用户登录 b) 使用 ...

  2. JAVAEE——宜立方商城12:购物车实现、订单确认页面展示

    1. 学习计划 第十二天: 1.购物车实现 2.订单确认页面展示 2. 购物车的实现 2.1. 功能分析 1.购物车是一个独立的表现层工程. 2.添加购物车不要求登录.可以指定购买商品的数量. 3.展 ...

  3. e3mall商城的归纳总结1之项目的架构

    首先来谈谈e3mall商城,e3mall商城是黑马推出一个学习的项目,前身是淘淘商城.两个用的技术差不多.,但由于后期加了一些新技术,更名为e3mall商城.本商城为分布式商城,主要用到的技术使mav ...

  4. 【JAVAWEB学习笔记】网上商城实战4:订单模块

    今日任务 完成订单模块的功能 1.1      订单 模块的功能 1.1.1    我的订单: [我的订单的查询] * 在header.jsp中点击我的订单. * 提交到Servlet: * 获得用户 ...

  5. e3mall商城的归纳总结9之activemq整合spring、redis的缓存

    敬给读者 本节主要给大家说一下activemq整合spring,该如何进行配置,上一节我们说了activemq的搭建和测试(单独测试),想看的可以点击时空隧道前去查看.讲完了之后我们还说一说在项目中使 ...

  6. e3mall商城的归纳总结6之redis

    一.说在前面的话 前面几节我们主要对该项目的后端进行了增删改查,但是所有的数据都是存放在数据库中,这样的话数据库的压力显而易见是很大的,因此本节学习nosql的缓存,也就是redis的使用,在使用之前 ...

  7. JavaWeb学习记录(十三)——商城购物之添加订单的数据库级联操作

    一.方法实现 private JdbcTemplate jdbcTemplate = new JdbcTemplate(DBConn.getDataSource()); @SuppressWarnin ...

  8. DRF 商城项目 - 购物( 购物车, 订单, 支付 )逻辑梳理

    购物车 购物车模型 购物车中的数据不应该重复. 即对相同商品的增加应该是对购买数量的处理而不是增加一条记录 因此对此进行联合唯一索引, 但是也因此存在一些问题 class ShoppingCart(m ...

  9. e3mall商城总结12之购物车的实现、以及购物车小计问题、json406报错

    说在前面的话 1.本节主要讲了e3mall购物车的实现方法,我搭建的项目和系统购物车有一些区别,因此这里需要说一下.系统搭建的项目在未登陆的情况下也可以通过cookie进行加入购物车,当用户要下单的时 ...

随机推荐

  1. 6.18 省选模拟赛 树 倍增 LCT

    LINK:树 考虑暴力 保存每个版本的父亲 然后暴力向上跳.得分20. 考虑离线 可以离线那么就可以先把树给搞出来 然后考虑求k级祖先 可以倍增求. 如何判断合法 其实要求路径上的边的时间戳<= ...

  2. 一本通 1783 矩阵填数 状压dp 容斥 计数

    LINK:矩阵填数 刚看到题目的时候感觉是无从下手的. 可以看到有n<=2的点 两个矩形. 如果只有一个矩形 矩形外的方案数容易计算考虑 矩形内的 必须要存在x这个最大值 且所有值<=x. ...

  3. GitLab 数据库

    访问 GitLab 数据库 步骤 用的 Docker Gitlab,首先进入容器 docker exec -it gitlab /bin/bash `` 找到数据库配置文件 ```bash /var/ ...

  4. WordPress固定链接后404的解决方法

    一般Wordpress自带的链接是一大串数字加符号,不美观也不明确,一般要设置成固定链接,而设置成功后大部分情况访问文章,子链接都会出现404界面,我找了网上的资料,才知道需要配置伪静态链接, 一般的 ...

  5. JS与React分别实现倒计时(天时分秒)

    JS方法 html部分 <div class="clock"> <i></i> 天 <i></i> : <i> ...

  6. 2020-03-26:eureka 和其他注册中心比如zk有什么不同?

    从eureka工作原理可以看出,eureka client有缓存功能,即使eureka所有的serve都宕掉,仍然能给服务消费者发送服务信息,所以eureka保证了服务可用性,不能保证数据一致性,是一 ...

  7. Error:Failed to resolve: com.android.support:recyclerview-v7:28.0.0解决方法

    在使用Android Studio的过程中需要添加依赖recyclerview,出现报错: Unable to resolve dependency for ':app@debug/compileCl ...

  8. 实践Kong for Kubernetes(K8S),kong最新2.1版本和kong-ingress-controller:0.9.1版本

    先决条件 Kubernetes集群:您可以使用Minikube或GKE集群.Kong与Kubernetes的所有发行版兼容. kubectl访问权限:您应该已经kubectl安装并配置为与Kubern ...

  9. python设计模式之外观模式

    python设计模式之外观模式 系统会随着演化变得非常复杂,最终形成大量的(并且有时是令人迷惑的)类和交互,这种情况并不少见.许多情况下,我们并不想把这种复杂性暴露给客户端.外观设计模式有助于隐藏系统 ...

  10. antd-vue的select组件实现既可以输入添加,又可以下拉选择

    最近,项目中碰到需求,要求任务类型可以从下拉框(后台返回的数据)中选择,也可以手动输入添加新项,项目用的是antd-vue,所以最接近的组件就是a-select组件了,废话不多说,改造方法如下: HT ...