springboot篇】二十一. 基于springboot电商项目 十二 订单服务
springboot项目
- **中国加油,武汉加油!**
- 篇幅较长,配合目录观看
- 案例准备
- 1. 订单添加
- 1.1 修改shop-order的affirmOrder.html
- 1.2 修改order表结构
- 1.3 shop-entity编写Order类
- 1.4 shop-common编写工具类
- 1.5 shop-mapper定义Mapper接口
- 1.6 shop-service-api定义Service接口
- 1.5 shop-service-iml新建order-service(module-springboot)
- 1.5.1 order-service定义ServiceImpl
- 1.5.2 配置yml
- 1.6 shop-service-api的ICartService编写方法
- 1.7 cart-service重写方法
- 1.8 shop-mapper定义IOrderMapper.xml
- 1.9 修改order-service的程序入口
- 1.10 Test
- 1.11 shop-entity定义OrderDetail类
- 1.12 修改t_order_detail
- 1.13 shop-mapper定义Mapper接口
- 1.14 shop-service-api定义Service接口
- 1.15 order-service定义ServiceImpl实现类
- 1.16 shop-mapper定义IOrderDetailMapper.xml
- 1.17 Test
- 1.18 shop-order的OrderController编写方法
- 1.19 启动程序入口测试
中国加油,武汉加油!
篇幅较长,配合目录观看
案例准备
- 本案例基于springboot篇】二十一. 基于springboot电商项目 十一 地址服务
1. 订单添加
1.1 修改shop-order的affirmOrder.html
1.2 修改order表结构
1.3 shop-entity编写Order类
package com.wpj.entity;import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.annotations.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;@Data
@AllArgsConstructor
@NoArgsConstructor
public class Order implements Serializable{private String id; // id自己生成private Integer ostatus;private Integer uid;private BigDecimal totalPrice;private Date createTime;private String person;private String phone;private String address;
}
1.4 shop-common编写工具类
package com.wpj.common.utils;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;import java.text.SimpleDateFormat;
import java.util.Date;@Component
public class OrderUtils {@Autowiredprivate StringRedisTemplate stringRedisTemplate;// 订单id的生成规则:时间(年月日)+用户id后四位+流水号public String createOrderId(Integer userId) {StringBuffer orderId = new StringBuffer();Date date = new Date();SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");// 给订单号添加时间orderId.append(sdf.format(date));// 给订单号添加用户id后四位orderId.append(getUserIdEnd(userId));// 添加流水号(这里不需要用stringRedisTemplate)Object order_num1 = stringRedisTemplate.opsForValue().get("order_num");if (order_num1 == null || "".equals(order_num1)) {stringRedisTemplate.opsForValue().set("order_num", "1");}Long order_num = stringRedisTemplate.opsForValue().increment("order_num");orderId.append(order_num.toString());return orderId.toString();}public String getUserIdEnd(Integer userId) {String tempUid = userId.toString();StringBuffer uId = new StringBuffer();if (tempUid.length() < 4) {uId.append(tempUid);for (int i = 0; i < 4 - (tempUid.length()); i++) {uId.insert(0, "0");}} else {uId.append(tempUid.substring(tempUid.length() - 4));}return uId.toString();}
}
1.5 shop-mapper定义Mapper接口
package com.wpj.mapper;import com.wpj.entity.Order;public interface IOrderMapper {public int addOrder(Order order);
}
1.6 shop-service-api定义Service接口
package com.wpj.service;import com.wpj.entity.Order;public interface IOrderService {public int addOrder(Order order);
}
1.5 shop-service-iml新建order-service(module-springboot)
1.5.1 order-service定义ServiceImpl
package com.wpj.service.impl;import com.alibaba.dubbo.config.annotation.Service;
import com.wpj.entity.Order;
import com.wpj.mapper.IOrderMapper;
import com.wpj.service.IOrderService;
import org.springframework.beans.factory.annotation.Autowired;@Service
public class OrderServiceImpl implements IOrderService {@Autowiredprivate IOrderMapper orderMapper;@Overridepublic int addOrder(Order order) {return orderMapper.addOrder(order);}
}
1.5.2 配置yml
spring:datasource:url: jdbc:mysql://localhost:3306/nz1904-springboot-shopusername: rootpassword: 123456driver-class-name: com.mysql.jdbc.Driverredis:host: 192.168.59.100password: admin
mybatis-plus:type-aliases-package: com.wpj.entitymapper-locations: classpath:/mapper/*.xml
dubbo:application:name: order-serviceregistry:address: zookeeper://192.168.59.100:2181protocol:port: -1
1.6 shop-service-api的ICartService编写方法
BigDecimal getTotalPrice(List<Cart> cartList);
void deleteCartByUid(Integer id);
1.7 cart-service重写方法
@Override
public BigDecimal getTotalPrice(List<Cart> cartList) {BigDecimal totalPrice = new BigDecimal(0);for(Cart cart:cartList){totalPrice= totalPrice.add(cart.getSubTotal());}return totalPrice;
}@Override
public void deleteCartByUid(Integer id) {EntityWrapper entityWrapper = new EntityWrapper();entityWrapper.eq("uid",id);cartMapper.delete(entityWrapper);
}
1.8 shop-mapper定义IOrderMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wpj.mapper.IOrderMapper"><insert id="addOrder">INSERT INTO t_order (id,total_price,ocreate_time,ostatus,u_id,person,phone,address)VALUES(#{id},#{totalPrice},#{createTime},#{ostatus},#{uid},#{person},#{phone},#{address})</insert>
</mapper>
1.9 修改order-service的程序入口
package com.wpj;import com.alibaba.dubbo.config.spring.context.annotation.DubboComponentScan;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication(scanBasePackages = "com.wpj")
@DubboComponentScan(basePackages = "com.wpj.service")
@MapperScan(basePackages = "com.wpj.mapper")
public class OrderServiceApplication {public static void main(String[] args) {SpringApplication.run(OrderServiceApplication.class, args);}}
1.10 Test
package com.wpj;import com.alibaba.dubbo.config.annotation.Reference;
import com.wpj.common.utils.OrderUtils;
import com.wpj.entity.Order;
import com.wpj.service.IOrderService;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;@SpringBootTest
@RunWith(SpringRunner.class)
class OrderServiceApplicationTests {@Referenceprivate IOrderService orderService;@Autowiredprivate OrderUtils orderUtils;@Testvoid contextLoads() {Order order = new Order();String orderId = orderUtils.createOrderId(14);order.setId(orderId);orderService.addOrder(order);}}
1.11 shop-entity定义OrderDetail类
package com.wpj.entity;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.io.Serializable;
import java.math.BigDecimal;@Data
@AllArgsConstructor
@NoArgsConstructor
public class OrderDetail implements Serializable{private Integer id;private String oid;private Integer gid;private String gname;private Integer gnum;private String gpic;private BigDecimal gprice;private BigDecimal gcount;private String gdesc;
}
1.12 修改t_order_detail
1.13 shop-mapper定义Mapper接口
package com.wpj.mapper;import com.wpj.entity.OrderDetail;import java.util.List;public interface IOrderDetailMapper {public int addBarch(List<OrderDetail> list);
}
1.14 shop-service-api定义Service接口
package com.wpj.service;import com.wpj.entity.OrderDetail;import java.util.List;public interface IOrderDetailService {public int addBarch(List<OrderDetail> list);
}
1.15 order-service定义ServiceImpl实现类
package com.wpj.service.impl;import com.alibaba.dubbo.config.annotation.Service;
import com.wpj.entity.OrderDetail;
import com.wpj.mapper.IOrderDetailMapper;
import com.wpj.service.IOrderDetailService;
import org.springframework.beans.factory.annotation.Autowired;import java.util.List;@Service
public class OrderDetailServiceImpl implements IOrderDetailService {@Autowiredprivate IOrderDetailMapper orderDetailMapper;@Overridepublic int addBarch(List<OrderDetail> list) {return orderDetailMapper.addBarch(list);}
}
1.16 shop-mapper定义IOrderDetailMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wpj.mapper.IOrderDetailMapper"><insert id="addBarch">INSERT INTO t_order_detail (id,oid,gid,gname,gprice,gnum,gcount,gpic,gdesc)VALUES<foreach collection="list" item="od" separator=",">(#{od.id},#{od.oid},#{od.gid},#{od.gname},#{od.gprice},#{od.gnum},#{od.gcount},#{od.gpic},#{od.gdesc})</foreach></insert>
</mapper>
1.17 Test
@Reference
private IOrderDetailService orderDetailService;@Test
public void test2(){List<OrderDetail> orderDetailList = new ArrayList<>();orderDetailList.add(new OrderDetail());orderDetailService.addBarch(orderDetailList);
}
1.18 shop-order的OrderController编写方法
@Reference
private IOrderService orderService;
@Reference
private IOrderDetailService orderDetailService;@RequestMapping("/addOrder")
@IsLogin(mustUser = true)
@ResponseBody
public String addOrder(Integer addressId,User user){// 根据地址id查询地址的对象Address address = addressService.selectById(addressId);List<Cart> cartList = cartService.getUserCartList(user,"");// 插入订单Order order = new Order();String orderId = orderUtils.createOrderId(user.getId());order.setId(orderId);order.setUid(user.getId());order.setPerson(address.getPhone());order.setAddress(address.getAddress());order.setCreateTime(new Date());order.setOstatus(0); // 0 未支付 1 已支付 2 超时 3 取消order.setPerson(address.getPerson());order.setTotalPrice(cartService.getTotalPrice(cartList));orderService.addOrder(order);// 插入订单详情List<OrderDetail> orderDetailList = new ArrayList<>();for (Cart cart: cartList) {OrderDetail orderDetail = new OrderDetail();Goods goods = cart.getGoods();orderDetail.setGprice(goods.getGprice());orderDetail.setGpic(goods.getGpic());orderDetail.setGnum(cart.getNum());orderDetail.setGname(goods.getGname());orderDetail.setGid(goods.getId());orderDetail.setGcount(cart.getSubTotal());orderDetail.setGdesc(goods.getGdesc());orderDetailList.add(orderDetail);if (orderDetailList.size() == 300) {orderDetailService.addBarch(orderDetailList);orderDetailList.clear();}}if (orderDetailList.isEmpty()){orderDetailService.addBarch(orderDetailList);}// 清空购物车cartService.deleteCartByUid(user.getId());// 跳转到支付页面return "ok";
}
1.19 启动程序入口测试
有个乱码问题待解决
springboot篇】二十一. 基于springboot电商项目 十二 订单服务相关推荐
- Spring Boot电商项目59:订单模块八:【后台:订单列表】接口;
说明: (1)本篇博客的主要内容是开发[后台:订单列表]接口: (2)本篇博客没什么难点:只需要注意:[前台:订单列表]接口是查询当前登录用户的订单数据:[后台:订单列表]接口是查询所有用户的订单数 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(十二)——istio+dapr构建多运行时服务网格...
多运行时是一个非常新的概念.在 2020 年,Bilgin Ibryam 提出了 Multi-Runtime(多运行时)的理念,对基于 Sidecar 模式的各种产品形态进行了实践总结和理论升华.那到 ...
- Spring Boot电商项目57:订单模块六:【前台:生成支付二维码】接口;(支付url的拼凑;利用zxing生成二维码;二维码图片的存储;真实地址与可访问地址的转换;)
说明: (1)本篇博客主要内容是:开发[前台:生成支付二维码]接口: (2)本篇博客需要注意的点有: ● 支付url的拼凑: ● 利用zxing生成二维码: ● 二维码图片的存储:真实地址与可访问地址 ...
- 基于HTML电商项目的设计与实现——html静态网站基于数码类电商购物网站网页设计与实现共计30个页面
常见网页设计作业题材有 个人. 美食. 公司. 学校. 旅游. 电商. 宠物. 电器. 茶叶. 家居. 酒店. 舞蹈. 动漫. 服装. 体育. 化妆品. 物流. 环保. 书籍. 婚纱. 游戏. 节日. ...
- 基于HTML电商项目的设计与实现——html静态网站基于数码类电商购物网站网页设计与实现共计30个页面...
常见网页设计作业题材有 个人. 美食. 公司. 学校. 旅游. 电商. 宠物. 电器. 茶叶. 家居. 酒店. 舞蹈. 动漫. 服装. 体育. 化妆品. 物流. 环保. 书籍. 婚纱. 游戏. 节日. ...
- 基于HTML电商项目的设计与实现—— HTML+CSS+JavaScrip家具网页设计实例 企业网站制作...
常见网页设计作业题材有 个人. 美食. 公司. 学校. 旅游. 电商. 宠物. 电器. 茶叶. 家居. 酒店. 舞蹈. 动漫. 服装. 体育. 化妆品. 物流. 环保. 书籍. 婚纱. 游戏. 节日. ...
- 简单的学生网页作业源码 基于HTML电商项目的设计与实现——html静态网站简单的学生网页作业源码 基于数码类电商购物网站网页设计与实现共计30个页面
常见网页设计作业题材有 个人. 美食. 公司. 学校. 旅游. 电商. 宠物. 电器. 茶叶. 家居. 酒店. 舞蹈. 动漫. 服装. 体育. 化妆品. 物流. 环保. 书籍. 婚纱. 游戏. 节日. ...
- 基于HTML电商项目的设计与实现—— HTML+CSS+JavaScrip家具网页设计实例 企业网站制作
常见网页设计作业题材有 个人. 美食. 公司. 学校. 旅游. 电商. 宠物. 电器. 茶叶. 家居. 酒店. 舞蹈. 动漫. 服装. 体育. 化妆品. 物流. 环保. 书籍. 婚纱. 游戏. 节日. ...
- 基于Vue+SpringCloudAlibaba微服务电商项目实战-构建会员服务-011:基于Vue快速整合会员服务接口
011:基于Vue快速整合会员服务接口 1 构建前端Vue项目调用后端接口实现联合登录效果演示 2 什么是微服务前后端分离开发的模式 3 联合登录接口接口简单回顾 4 前后端分离解决跨域的问题 5 V ...
- java电商项目_Java电商项目总结(二)
前言 在写基于Spring Boot的高并发秒杀Demo的时候,遇到了一点问题,因此记录下来. 遇到的问题 1.当我们在resources目录下,创建fonts文件夹,把Bootstrap所需要的gl ...
最新文章
- nexus 4 linux,Nexus 4刷机Ubuntu Touch教程
- mysql 实验_实验二 MySQL 实验.doc
- Redis学习笔记(11)——Redis缓存集群方案
- 实现查询菜品信息考试题
- Python学习第一天-第2节
- 招聘| 基因组所Yuwen Liu团队诚聘科研人员
- c#: using Microsoft.Office.Interop.Excel 异常
- Android-JNI开发系列《六》jni与java的交互
- 栈的输出_C|简单实现栈、及利用递归将十进制数用其他进制来输出
- python字典forward_《Python机器学习基础教程》
- spring nature
- Python常用模块大全(总结)
- 电脑计算机怎么显示到桌面,怎么显示我的电脑到桌面
- 利用Tushare获取A股所有股票代码
- ECCV2020-DETR笔记
- 10月22日科技联播:饿了么与屈臣氏达成合作;马蜂窝回应数据造假
- 为什么有些编程程序员需要两个显示器?
- Illegal mix of collations (utf8mb4_0900_ai_ci,IMPLICIT) and (utf8mb4_0900_as_ci,IMPLICIT) for operat
- 3t服务器装linux系统如何分区,Linux 分区、格式化3T大容量存储分区
- Windows UAC提权
热门文章
- Offset is outside the bounds of the DataView
- 基于C++的web服务器---总述篇
- python开发板 树莓派_树莓派3代B+型 Raspberry Pi 3b+电脑linux开发板python编程
- unity Animator 同时播放两个动画,并动态更换Animator中的AnimationClip
- 基于VB和单片机的智能家居监控系统设计
- 电驴服务器更新的作用,怎样更新eMule(电驴)服务器列表,有什么好处?
- 2019年MongoDB中文社区 长沙大会
- 手机怎样设置每年自动生日提醒
- 气候制度的转变和森林的丧失放大了亚马逊森林的火灾
- Unity2D游戏制作常用方法