说在前面的话

上一节说了购物车的生成,本节主要说了在购物车的列表上去结算,从而生成一个未支付的订单,生成的订单默认状态为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. Canal简介

    以下内容主要摘自Canal 官方wiki和网友博客:https://www.jianshu.com/p/6299048fad66 一.背景 早期,阿里巴巴B2B公司因为存在杭州和美国双机房部署,存在跨 ...

  2. CSS样式大全(网络收集整理)

    CSS样式大全(网络收集整理 字体属性:(font) 大小 {font-size: x-large;}(特大) xx-small;(极小) 一般中文用不到,只要用数值就可以,单位:PX.PD 样式 { ...

  3. 037_go语言中的互斥锁

    代码演示: package main import ( "fmt" "math/rand" "runtime" "sync&quo ...

  4. 介绍一种 Python 更方便的爬虫代理池实现方案

    现在搞爬虫,代理是不可或缺的资源 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识.那 ...

  5. Linux学习笔记之配置网络

    1.打开VMware Workstation虚拟机 2.在VMware下安装虚拟ubunt系统后配置网络,如图所示配置,即可. 3.检查笔记本所使用的网段 ①按 “win + R ”键,并输入“cmd ...

  6. 通过java程序(JSch)运行远程linux主机上的shell脚本

    如果您看完文章之后,觉得对您有帮助,请帮我点个赞,您的支持是我不竭的创作动力! 如果您看完文章之后,觉得对您有帮助,请帮我点个赞,您的支持是我不竭的创作动力! 如果您看完文章之后,觉得对您有帮助,请帮 ...

  7. 某大型企业ospf面试题分析(含路由策略和路由过滤,及双点双向重发布)

    面试问题背景 本面试题来自国内最大通信技术公司之一,央企,有很多金融网项目. 了解行业的同学,一定知道事哪个企业. 上面试问题(取自百哥收集整理的面试总结大全,关注百哥CSDN或知乎,不定期分享名企面 ...

  8. GitHub上最火的SpringCloud微服务商城系统项目,附全套教程

    项目介绍 mall-swarm是一套微服务商城系统,采用了 Spring Cloud Greenwich.Spring Boot 2.MyBatis.Docker.Elasticsearch等核心技术 ...

  9. 剑指Offer顺时针打印矩阵

    题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数 ...

  10. C#LeetCode刷题之#453-最小移动次数使数组元素相等(Minimum Moves to Equal Array Elements)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3877 访问. 给定一个长度为 n 的非空整数数组,找到让数组所有 ...