努力好了,时间会给你答案。--------magic_guo

订单模块的流程以及用户操作如下:
1.当用户选定购物车需要结算的商品并单击结算按钮时,会跳转到订单页面,此时会将选定的购物车信息展示在订单界面,并且还会显示用户的地址信息以供用户选择;
2.用户选择了地址,点击提交订单按钮,此时生成订单数据,并将插入数据库,同时清除购物车信息,然后跳转到支付页面;
3.根据订单id查询订单
5.根据用户id查询所有订单;
6.更新订单状态的操作;
7.取消订单,用户跳转到支付页面而未支付;此时订单处于待支付状态;
取消订单分为两种操作:①在订单未超时的情况下用户主动取消、②订单超时,被动取消;

看代码:
Maven配置:

 <dependencies><dependency><groupId>com.guo</groupId><artifactId>shop-common</artifactId></dependency><dependency><groupId>com.guo</groupId><artifactId>shop-feign</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>

订单表t_order:

订单详情表t_order_detail:

订单实体类:

@Data
@TableName(value = "t_order")
public class Order {// 根据用户id后四位生成订单,这里使用字符串@TableId(type = IdType.INPUT)private String id;private Integer uid;private Date createTime;private String address;private String phone;private String username;private BigDecimal totalPrice;// 支付方式:1:支付宝,2:微信,3:银行卡支付private Integer payType;// 订单状态:1:未支付,2:已支付,3:已取消,4:已超时,5:已发货,6:已签收private Integer orderStatus;@TableField(exist = false)private List<OrderDetail> orderDetailList;}

订单详情实体类:

@Data
@TableName(value = "t_order_detail")
public class OrderDetail {@TableId(type = IdType.AUTO)private Integer id;private String oid;private Integer gid;private Integer gcount;private BigDecimal gprice;private BigDecimal subtotal;private String gname;private String gdesc;private String gpng;}

CarGoods实体类:

@Data
public class CarGoods {private Integer gid;private Integer count;private String gname;private BigDecimal gprice;private String gdesc;private Integer gtype;private List<GoodsPng> goodsPicList;
}

控制层controller:

@RequestMapping("/order")
@RestController
public class OrderController {@Autowiredprivate ICarService carService;@Autowiredprivate IAddressService addressService;@Autowiredprivate IOrderService orderService;@Autowiredprivate OrderUtils orderUtils;/*** 结算按钮绑定方法,查询购物车,将购物车信息发送至前端,展示在订单页面* @return ResultEntity*/@RequestMapping("/settlement")@LoginUserpublic ResultEntity settlement(User user) {if (user.getId() == null) {return ResultEntity.error("你还未登录,请登录!");}// 从购物车中查询出商品信息List<CarGoods> carGoodsList = carService.getCarGoodsList(user.getId());// 查询用户的地址信息List<Address> userAllAddress = addressService.getUserAllAddress(user.getId());// 计算总价BigDecimal totalPrice = orderUtils.getTotalPrice(carGoodsList);Map<String, Object> map = new HashMap<>();map.put("totalPrice", totalPrice);map.put("carGoodsList", carGoodsList);map.put("userAllAddress", userAllAddress);return ResultEntity.success(map);}/*** 提交订单按钮绑定方法,此过程生成订单,插入数据库;并清空购物车数据;* @return 订单Id*/@RequestMapping("/submitOrder")@LoginUserpublic ResultEntity submitOrder(User user, Integer addressId) {if (user.getId() == null) {return ResultEntity.error("你还未登录,请登录!");}// 将数据插入数据库String orderId = orderService.insertOrder(user.getId(), addressId);// 清空购物车信息carService.clearUserCar(user.getId());// 跳转到第三方支付平台return ResultEntity.success(orderId);}@RequestMapping("/getOrderByOrderId")public Order getOrderByOrderId(@Param("id") String orderId) {return orderService.selectById(orderId);}@RequestMapping("/getOrderListByUserId")public List<Order> getOrderListByUserId(@Param("id") String userId) {EntityWrapper<Order> orderEntityWrapper = new EntityWrapper<>();orderEntityWrapper.eq("uid", userId);return orderService.selectList(orderEntityWrapper);}@RequestMapping("/updateOrderStatus")public ResultEntity updateOrderStatus(String orderId, Integer status) {orderService.updateOrderStatus(orderId, status);return ResultEntity.success();}
}

Order service层:

public interface IOrderService extends IService<Order> {String insertOrder(Integer uid, Integer addressId);void updateOrderStatus(String orderId, Integer status);
}@Service
public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements IOrderService {@Autowiredprivate ICarService carService;@Autowiredprivate IAddressService addressService;@Autowiredprivate IOrderDetailService orderDetailService;@Autowiredprivate OrderUtils orderUtils;@Overridepublic String insertOrder(Integer uid, Integer addressId) {// 根据用户id查询购物车信息List<CarGoods> carGoodsList = carService.getCarGoodsList(uid);// 根据地址Id,查询出用户选择的地址Address address = addressService.getAddressById(addressId);// 通过工具类获取订单IdString orderId = orderUtils.createOrderId(uid);// 获取订单总价BigDecimal totalPrice = orderUtils.getTotalPrice(carGoodsList);// 封装订单实体类Order order = new Order();order.setId(orderId);order.setUid(uid);order.setAddress(address.getAddress());order.setPhone(address.getPhone());order.setUsername(address.getUsername());order.setCreateTime(new Date());order.setOrderStatus(1);order.setPayType(1);order.setTotalPrice(totalPrice);// 插入订单表Integer insert = baseMapper.insert(order);// 封装订单详情并插入订单详情表List<OrderDetail> orderDetailList = new ArrayList<>();for (CarGoods carGoods : carGoodsList) {OrderDetail orderDetail = new OrderDetail();orderDetail.setGcount(carGoods.getCount());orderDetail.setGdesc(carGoods.getGdesc());orderDetail.setGname(carGoods.getGname());orderDetail.setGpng(carGoods.getGoodsPicList().get(0).getPng());orderDetail.setGprice(carGoods.getGprice());orderDetail.setGid(uid);orderDetail.setOid(orderId);orderDetail.setSubtotal(carGoods.getGprice().multiply(BigDecimal.valueOf(carGoods.getCount())));orderDetailList.add(orderDetail);}boolean b = orderDetailService.insertBatch(orderDetailList);return orderId;}@Overridepublic void updateOrderStatus(String orderId, Integer status) {baseMapper.updateOrderStatus(orderId, status);}
}

OrderDetail service层:

public interface IOrderDetailService extends IService<OrderDetail> {}@Service
public class OrderDetailServiceImpl extends ServiceImpl<OrderDetailMapper, OrderDetail> implements IOrderDetailService {}

OrderMapper层:

public interface OrderMapper extends BaseMapper<Order> {@Update("update t_order set order_status = #{status} where id = #{orderId}")void updateOrderStatus(@Param("orderId") String orderId, @Param("status") Integer status);
}

OrderDetailMapper层:

public interface OrderDetailMapper extends BaseMapper<OrderDetail> {}

OrderUtil工具类:

@Component
public class OrderUtils {@Autowiredprivate StringRedisTemplate redisTemplate;/*** 构造订单id* 订单规则:年月日 + 用户id后四位 + 随机四位 + 流水号* @param userId 用户id* @return 返回构造的订单id*/public String createOrderId(Integer userId) {// 年月日String date = new SimpleDateFormat("yyyyMMdd").format(new Date());// 用户id后四位String userIdSuffix = getUserIdSuffix(userId);// 随机四位数String random = RandomStringUtils.random(4, false, true);// 流水号int orderIndex = 1;//if (redisTemplate.hasKey(ShopConstants.ORDER_INDEX)) {// 如果存在,就自增orderIndex = redisTemplate.opsForValue().increment(ShopConstants.ORDER_INDEX).intValue();} else {// 不存在就插入redisTemplate.opsForValue().set(ShopConstants.ORDER_INDEX, String.valueOf(orderIndex));}// 组合起来, 返回订单编号return date + userIdSuffix + random + orderIndex;}/*** 根据用户id,获取用户id后四位* @param userId 用户id* @return 返回用户id后四位,不够则前边补0,够则直接取后四位*/public String getUserIdSuffix(Integer userId) {StringBuffer stringBuffer = new StringBuffer(String.valueOf(userId));// 判断用户id的长度是否大于四位if (stringBuffer.length() < 4) {for (int i = stringBuffer.length(); i < 4; i++) {stringBuffer.insert(0, "0");}return stringBuffer.toString();} else {return stringBuffer.substring((stringBuffer.length() - 4));}}/*** 获取购物车信息,计算订单总价* @param carGoodsList List<CarGoods>* @return 返回订单总价格*/public BigDecimal getTotalPrice(List<CarGoods> carGoodsList) {BigDecimal totalPrice = new BigDecimal(0);for (CarGoods carGoods : carGoodsList) {// 商品数量Integer count = carGoods.getCount();// 商品单价BigDecimal gprice = carGoods.getGprice();// 商品的小计BigDecimal subTotal = gprice.multiply(BigDecimal.valueOf(count));totalPrice = totalPrice.add(subTotal);}return totalPrice;}
}

就这样吧。


本文章教学视频来自:https://www.bilibili.com/video/BV1tb4y1Q74E?p=3&t=125


静下心,慢慢来,会很快!

java电商项目搭建-------订单模块相关推荐

  1. java电商项目搭建-------商品详情页模块

    努力好了,时间会给你答案.--------magic_guo 在一个电商项目中,访问频率最高的是商品详情页页面,而且商品详情页的变化评率不会太高(除非是搞活动的时候):那么访问频率高,然后再使用数据库 ...

  2. java电商项目搭建-------分布式文件存储系统(fastDFS)

    人之所以痛苦,那是因为你在成长.--------magic_guo 微服务项目,由于访问量和系统的高可用性能,会将上传的文件图片等存放在搭建的分布式文件存储系统:现在比较流行的文件存储系统有fastD ...

  3. java电商项目有哪些模块_Java电商项目面试--分类模块

    面试:分类模块要点 1.递归算法 2.复杂对象排重 3.无限层级树结构设计 一.添加分类 1.判断用户是否登录 2.判断用户是否是管理员 3.如果是管理员则根据分类名和父类id添加分类节点 具体流程: ...

  4. Java电商项目面试--分类模块

    面试:分类模块要点 1.递归算法 2.复杂对象排重 3.无限层级树结构设计 一.添加分类 1.判断用户是否登录 2.判断用户是否是管理员 3.如果是管理员则根据分类名和父类id添加分类节点 具体流程: ...

  5. java烟草项目功能模块_一个电商项目的功能模块梳理

    电商项目核心玩法:定制商品+供应链(商品辅料库)+网红社区 最近做项目,功能越来越多,想清晰地理解项目,有点累了. 今天抽空,把这个项目的核心功能模块简要总结下,顺便画了个图. 一.全局功能模块图 二 ...

  6. 电商项目中订单系统到底该怎么设计才好?(至尊典藏版)

    目录 前言 一.订单系统架构 1. 订单系统在企业中的角色 2. 订单系统与各业务系统的关系 3. 订单系统上下游关系​编辑 4. 订单系统的业务架构​编辑 二.订单系统核心功能 1. 订单中所包含的 ...

  7. java 电商项目 搜索模块,SSH电商项目实战之十:商品类基本模块的搭建

    前面我们完成了与商品类别相关的业务逻辑,接下来我们开始做具体商品部分. 1. 数据库建表并映射Model 首先我们在数据库中新建一张表,然后使用逆向工程将表映射成Model类,表如下: SQL代码/* ...

  8. 电商平台搭建--订单管理模块开发(一)

    Hi,大家好,我是Steafan!项目开发到这里,基本上已经进行了90%了.项目中最关键的也是最难开发的就是今天我要向大家介绍的订单管理模块了.在实际的项目开发中,订单管理模块和支付模块往往是并行开发 ...

  9. hadoop集群搭建完整教程,java电商项目面试技巧

    前言 本系列的目的是明明白白.彻彻底底的搞定日期/时间处理的几乎所有case.上篇文章铺设所有涉及到的概念解释,例如GMT.UTC.夏令时.时间戳等等,若你还没看过,不仅强烈建议而是强制建议你前往用花 ...

最新文章

  1. Android Studio编译问题-Error:Could not find org.jetbrains.trove4j
  2. golang辟谣之模板编程
  3. [20150629]12c物化视图刷新Out of place
  4. 【坐在马桶上看算法】啊哈算法13:零基础彻底弄懂“并查集“
  5. 网络安全统计显示XSS和过时的软件是主要问题
  6. sql 异常除非另外还指定了 TOP、OFFSET 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效。...
  7. mysql设置显示结果_php 与mysql配置,让页面显示结果
  8. Memcache和Redis区别:
  9. keil5的基本使用
  10. 6轴游戏手柄测试python程序
  11. 网页版bpc电波对时_BPC电波对时app下载|BPC电波对时安卓版下载 v1.04 - 跑跑车安卓网...
  12. 合成孔径雷达(微波遥感)的应用
  13. 面试智力题:赛马问题求前几名
  14. 动词,名词记忆(2): ise,ize,en后缀常用词
  15. Groovy+Spock单元测试
  16. Radio RDS简介
  17. secureCRT 中文破解版
  18. 接口测试 | 如何高效管理接口文档
  19. 函数渐近界与算法性能分析
  20. 金属质感怎么把握?高光和反光对比一定要加强~

热门文章

  1. 安装 ARM-MDK的方法,以及nRF52的学习资料,Beacon,Nordic NCS
  2. 软件被人后台篡改了收款码属于入侵吗?
  3. 打印机可以打印不能扫描怎么弄_打印机可以打印不能扫描怎么设置
  4. 好用的数据分析工具,轻松搞定财务分析报表
  5. fatal: in unpopulated submodule 'xxxxx'
  6. 女的不许光膀子游泳!(转载)
  7. 【如何成为学习高手】003-高效学习:提升专注力
  8. 无边缘计算,何以万物互联
  9. 《代码大全2》第5章 软件构建中的设计
  10. 智能门锁有哪些安全风险?该如何防范?