SpringBoot电商项目实战
完成了整个项目初步的开发,包括用户模块、商品分类模块、商品模块、购物车模块、订单模块。
package com.imooc.mall.Service.impl;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.google.zxing.WriterException;
import com.imooc.mall.Service.CartService;
import com.imooc.mall.Service.OrderService;
import com.imooc.mall.Service.UserService;
import com.imooc.mall.common.Constant;
import com.imooc.mall.exception.ImoocMallException;
import com.imooc.mall.exception.ImoocMallExceptionEnum;
import com.imooc.mall.filter.UserFilter;
import com.imooc.mall.model.dao.CartMapper;
import com.imooc.mall.model.dao.OrderItemMapper;
import com.imooc.mall.model.dao.OrderMapper;
import com.imooc.mall.model.dao.ProductMapper;
import com.imooc.mall.model.pojo.Order;
import com.imooc.mall.model.pojo.OrderItem;
import com.imooc.mall.model.pojo.Product;
import com.imooc.mall.model.request.CreateOrderReq;
import com.imooc.mall.model.vo.CartVO;
import com.imooc.mall.model.vo.OrderItemVO;
import com.imooc.mall.model.vo.OrderVO;
import com.imooc.mall.util.OrderCodeFactory;
import com.imooc.mall.util.QrcodeGenerator;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* 描述: 订单Service实现类
*/
@Service
public class OrderServiceImpl implements OrderService {
@Autowired
CartService cartService;
@Autowired
ProductMapper productMapper;
@Autowired
CartMapper cartMapper;
@Autowired
OrderMapper orderMapper;
@Autowired
OrderItemMapper orderItemMapper;
@Resource
UserService userService;
@Value("${file.upload.ip}")
String ip;
//数据库事务
@Transactional(rollbackFor = Exception.class)
@Override
public String create(CreateOrderReq createOrderReq) {
//拿到用户ID
Integer userId = UserFilter.currentUser.getId();
//从购物车查找已经勾选的商品
List<CartVO> cartVOList = cartService.list(userId);
ArrayList<CartVO> cartVOListTemp = new ArrayList<>();
for (int i = 0; i < cartVOList.size(); i++) {
CartVO cartVO = cartVOList.get(i);
if (cartVO.getSelected().equals(Constant.Cart.CHECKED)) {
cartVOListTemp.add(cartVO);
}
}
cartVOList = cartVOListTemp;
//如果购物车已勾选的为空,报错
if (CollectionUtils.isEmpty(cartVOList)) {
throw new ImoocMallException(ImoocMallExceptionEnum.CART_EMPTY);
}
//判断商品是否存在,上下架状态、库存
validSaleStatusAndStock(cartVOList);
//把购物车对象转化为订单item对象
List<OrderItem> orderItemList = cartVOListToOrderItemList(cartVOList);
//扣库存
for (int i = 0; i < orderItemList.size(); i++) {
OrderItem orderItem = orderItemList.get(i);
Product product = productMapper.selectByPrimaryKey(orderItem.getProductId());
int stock = product.getStock() - orderItem.getQuantity();
if (stock < 0) {
throw new ImoocMallException(ImoocMallExceptionEnum.NOT_ENOUGH);
}
product.setStock(stock);
productMapper.updateByPrimaryKeySelective(product);
}
//把购物车中已勾选的商品删除
cleanCart(cartVOList);
//生成订单
Order order = new Order();
//生成订单号,有独立的规则
String orderNo = OrderCodeFactory.getOrderCode(Long.valueOf(userId));
order.setOrderNo(orderNo);
order.setUserId(userId);
order.setTotalPrice(totalPrice(orderItemList));
order.setReceiverName(createOrderReq.getReceiverName());
order.setReceiverMobile(createOrderReq.getReceiverMobile());
order.setReceiverAddress(createOrderReq.getReceiverAddress());
order.setOrderStatus(Constant.OrderStatusEnum.NOT_PAIY.getCode());
order.setPostage(0);
order.setPaymentType(1);
//插入到Order表
orderMapper.insertSelective(order);
//循环保存每个商品到order_item表
for (int i = 0; i < orderItemList.size(); i++) {
OrderItem orderItem = orderItemList.get(i);
orderItem.setOrderNo(order.getOrderNo());
orderItemMapper.insertSelective(orderItem);
}
//把结果返回
return orderNo;
}
private Integer totalPrice(List<OrderItem> orderItemList) {
Integer totalPrice = 0;
for (int i = 0; i < orderItemList.size(); i++) {
OrderItem orderItem = orderItemList.get(i);
totalPrice+=orderItem.getTotalPrice();
}
return totalPrice;
}
private void cleanCart(List<CartVO> cartVOList) {
for (int i = 0; i < cartVOList.size(); i++) {
CartVO cartVO = cartVOList.get(i);
cartMapper.deleteByPrimaryKey(cartVO.getId());
}
}
private List<OrderItem> cartVOListToOrderItemList(List<CartVO> cartVOList) {
List<OrderItem> orderItemList = new ArrayList<>();
for (int i = 0; i < cartVOList.size(); i++) {
CartVO cartVO = cartVOList.get(i);
OrderItem orderItem = new OrderItem();
orderItem.setProductId(cartVO.getProductId());
//记录商品快照信息
orderItem.setProductName(cartVO.getProductName());
orderItem.setProductImg(cartVO.getProductImage());
orderItem.setUnitPrice(cartVO.getPrice());
orderItem.setQuantity(cartVO.getQuantity());
orderItem.setTotalPrice(cartVO.getTotalPrice());
orderItemList.add(orderItem);
}
return orderItemList;
}
private void validSaleStatusAndStock(List<CartVO> cartVOList) {
for (int i = 0; i < cartVOList.size(); i++) {
CartVO cartVO = cartVOList.get(i);
Product product = productMapper.selectByPrimaryKey(cartVO.getProductId());
//判断商品是否存在,是否上架
if (product == null || product.getStatus().equals(Constant.SaleStatus.NOT_SALE)) {
throw new ImoocMallException(ImoocMallExceptionEnum.NOT_SALE);
}
//判断商品库存
if (cartVO.getQuantity() > product.getStock()) {
throw new ImoocMallException(ImoocMallExceptionEnum.NOT_ENOUGH);
}
}
}
@Override
public OrderVO detail(String orderNo) {
Order order = orderMapper.selectByOrderNo(orderNo);
//订单不存在,则报错
if (order==null) {
throw new ImoocMallException(ImoocMallExceptionEnum.NO_ORDER);
}
//订单存在,需要判断所属
Integer userId = UserFilter.currentUser.getId();
if (!order.getUserId().equals(userId)) {
throw new ImoocMallException(ImoocMallExceptionEnum.NOT_YOUR_ORDER);
}
OrderVO orderVO=getOrderVO(order);
return orderVO;
}
private OrderVO getOrderVO(Order order) {
OrderVO orderVO = new OrderVO();
BeanUtils.copyProperties(order, orderVO);
//获取订单对应的orderItemVOList
List<OrderItem> orderItemList = orderItemMapper.selectByOrderNo(order.getOrderNo());
List<OrderItemVO> orderItemVOList = new ArrayList<>();
for (int i = 0; i < orderItemList.size(); i++) {
OrderItem orderItem = orderItemList.get(i);
OrderItemVO orderItemVO = new OrderItemVO();
BeanUtils.copyProperties(orderItem, orderItemVO);
orderItemVOList.add(orderItemVO);
}
orderVO.setOrderItemVOList(orderItemVOList);
orderVO.setOrderStatusName(Constant.OrderStatusEnum.codeOf(orderVO.getOrderStatus()).getValue());
return orderVO;
}
@Override
public PageInfo listForCustomer(Integer pageNum, Integer pageSize) {
Integer userId = UserFilter.currentUser.getId();
PageHelper.startPage(pageNum, pageSize);
List<Order> orderList = orderMapper.selectForCustomer(userId);
List<OrderVO> orderVOList = orderListToRoderVOList(orderList);
PageInfo PageInfo = new PageInfo<>(orderList);
PageInfo.setList(orderVOList);
return PageInfo;
}
private List<OrderVO> orderListToRoderVOList(List<Order> orderList) {
List<OrderVO> orderVOList = new ArrayList<>();
for (int i = 0; i < orderList.size(); i++) {
Order order = orderList.get(i);
OrderVO orderVO = getOrderVO(order);
orderVOList.add(orderVO);
}
return orderVOList;
}
@Override
public void cancel(String orderNo) {
Order order = orderMapper.selectByOrderNo(orderNo);
//查不到订单报错
if (order == null) {
throw new ImoocMallException(ImoocMallExceptionEnum.NO_ORDER);
}
//验证用户身份
//订单存在,需要判断所属
Integer userId = UserFilter.currentUser.getId();
if (!order.getUserId().equals(userId)) {
throw new ImoocMallException(ImoocMallExceptionEnum.NOT_YOUR_ORDER);
}
if (order.getOrderStatus().equals(Constant.OrderStatusEnum.NOT_PAIY.getCode())) {
order.setOrderStatus(Constant.OrderStatusEnum.CANCELED.getCode());
order.setEndTime(new Date());
orderMapper.updateByPrimaryKeySelective(order);
}else {
throw new ImoocMallException(ImoocMallExceptionEnum.WRONG_ORDER_STATUS);
}
}
@Override
public String qrcode(String orderNo) {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
// try {
// ip = InetAddress.getLocalHost().getHostAddress();
// } catch (UnknownHostException e) {
// e.printStackTrace();
// }
String address = ip +":"+ request.getLocalPort();
String payUrl = "http://" + address + "/pay?orderNo=" + orderNo;
try {
QrcodeGenerator.generatorQRCodeImage(payUrl, 350, 350, Constant.FILE_UPLOAD_DIR + orderNo + ".png");
} catch (WriterException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
String pngAddress = "http://" + address + "/images/" + orderNo + ".png";
return pngAddress;
}
@Override
public void pay(String orderNo) {
Order order = orderMapper.selectByOrderNo(orderNo);
//查不到订单报错
if (order == null) {
throw new ImoocMallException(ImoocMallExceptionEnum.NO_ORDER);
}
if (order.getOrderStatus() == Constant.OrderStatusEnum.NOT_PAIY.getCode()) {
order.setOrderStatus(Constant.OrderStatusEnum.PAIY.getCode());
order.setPayTime(new Date());
orderMapper.updateByPrimaryKeySelective(order);
} else {
throw new ImoocMallException(ImoocMallExceptionEnum.WRONG_ORDER_STATUS);
}
}
@Override
public PageInfo listForAdmin(Integer pageNum, Integer pageSize) {
PageHelper.startPage(pageNum, pageSize);
List<Order> orderList = orderMapper.selectAllForAdmin();
List<OrderVO> orderVOList = orderListToRoderVOList(orderList);
PageInfo PageInfo = new PageInfo<>(orderList);
PageInfo.setList(orderVOList);
return PageInfo;
}
//发货
@Override
public void delivered(String orderNo) {
Order order = orderMapper.selectByOrderNo(orderNo);
//查不到订单报错
if (order == null) {
throw new ImoocMallException(ImoocMallExceptionEnum.NO_ORDER);
}
if (order.getOrderStatus() == Constant.OrderStatusEnum.PAIY.getCode()) {
order.setOrderStatus(Constant.OrderStatusEnum.DELIVERED.getCode());
order.setDeliveryTime(new Date());
orderMapper.updateByPrimaryKeySelective(order);
} else {
throw new ImoocMallException(ImoocMallExceptionEnum.WRONG_ORDER_STATUS);
}
}
@Override
public void finish(String orderNo) {
Order order = orderMapper.selectByOrderNo(orderNo);
//查不到订单报错
if (order == null) {
throw new ImoocMallException(ImoocMallExceptionEnum.NO_ORDER);
}
//如果是普通用户,就要校验订单的所属
if (!userService.checkAdminRole(UserFilter.currentUser) && !order.getUserId().equals(UserFilter.currentUser.getId())) {
throw new ImoocMallException(ImoocMallExceptionEnum.NOT_YOUR_ORDER);
}
//发货后可以完结订单
if (order.getOrderStatus() == Constant.OrderStatusEnum.DELIVERED.getCode()) {
order.setOrderStatus(Constant.OrderStatusEnum.FINISHED.getCode());
order.setEndTime(new Date());
orderMapper.updateByPrimaryKeySelective(order);
} else {
throw new ImoocMallException(ImoocMallExceptionEnum.WRONG_ORDER_STATUS);
}
}
}
希尔排序法的优化-步长序列
import java.util.Arrays;
public class ShellSort {
private ShellSort() {
}
public static <E extends Comparable<E>> void sort(E[] data) {
int h = data.length / 2;
while (h >= 1) {
//对data[h,n),进行插入排序
for (int i = h; i < data.length; i++) {
E t = data[i];
int j;
for (j = i; j - h >= 0 && t.compareTo(data[j - h]) < 0; j -= h)
data[j] = data[j - h];
data[j] = t;
}
h /= 2;
}
}
public static <E extends Comparable<E>> void sort2(E[] data) {
int h = 1;
while (h< data.length) h = h * 3 + 1;
while (h >= 1) {
//对data[h,n),进行插入排序
for (int i = h; i < data.length; i++) {
E t = data[i];
int j;
for (j = i; j - h >= 0 && t.compareTo(data[j - h]) < 0; j -= h)
data[j] = data[j - h];
data[j] = t;
}
h /= 3;
}
}
public static void main(String[] args) {
int n = 5000000;
Integer[] arr = ArrayGenerator.generatorRandomArray(n, n);
Integer[] arr2 = Arrays.copyOf(arr, arr.length);
Integer[] arr3 = Arrays.copyOf(arr, arr.length);
SortingHelper.sortTest("ShellSort", arr);
//SortingHelper.sortTest("InsertionSort", arr2);
SortingHelper.sortTest("ShellSort2", arr3);
}
}
排序算法的总结
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Amjcm5CX-1667836665564)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20221107235003203.png)]
ayGenerator.generatorRandomArray(n, n);
Integer[] arr2 = Arrays.copyOf(arr, arr.length);
Integer[] arr3 = Arrays.copyOf(arr, arr.length);
SortingHelper.sortTest(“ShellSort”, arr);
//SortingHelper.sortTest(“InsertionSort”, arr2);
SortingHelper.sortTest(“ShellSort2”, arr3);
}
}
## 排序算法的总结
[外链图片转存中...(img-Amjcm5CX-1667836665564)]