java电商项目搭建-------订单模块

努力好了,时间会给你答案。--------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 {


    @Autowired
    private ICarService carService;

    @Autowired
    private IAddressService addressService;

    @Autowired
    private IOrderService orderService;

    @Autowired
    private OrderUtils orderUtils;

    /**
     * 结算按钮绑定方法,查询购物车,将购物车信息发送至前端,展示在订单页面
     * @return ResultEntity
     */
    @RequestMapping("/settlement")
    @LoginUser
    public 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")
    @LoginUser
    public 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 {

    @Autowired
    private ICarService carService;

    @Autowired
    private IAddressService addressService;

    @Autowired
    private IOrderDetailService orderDetailService;

    @Autowired
    private OrderUtils orderUtils;

    @Override
    public String insertOrder(Integer uid, Integer addressId) {

        // 根据用户id查询购物车信息
        List<CarGoods> carGoodsList = carService.getCarGoodsList(uid);

        // 根据地址Id,查询出用户选择的地址
        Address address = addressService.getAddressById(addressId);

        // 通过工具类获取订单Id
        String 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;
    }

    @Override
    public 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 {

    @Autowired
    private 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


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

  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
mall项目是一套电商系统,包括前台商城系统及后台管理系统,基于SpringBoot+MyBatis实现,采用Docker容器化部署。前台商城系统包含首页门户、商品推荐、商品搜索、商品展示、购物车、订单流程、会员中心、客户服务、帮助中心等模块。后台管理系统包含商品管理、订单管理、会员管理、促销管理、运营管理、内容管理、统计报表、财务管理、权限管理、设置等模块。 开发环境: JDK 1.8 Mysql 5.7 Redis 5.0 MongoDB 4.2.5 RabbitMQ 3.7.14 Nginx 1.10 Elasticsearch 7.6.2 Logstash 7.6.2 Kibana 7.6.2 搭建步骤: 1、Windows环境部署 Windows环境搭建请参考:mall在Windows环境下的部署; 注意:只启动mall-admin,仅需安装Mysql、Redis即可; 克隆mall-admin-web项目,并导入到IDEA中完成编译:前端项目地址; mall-admin-web项目的安装及部署请参考:mall前端项目的安装与部署。 2、Docker环境部署 使用虚拟机安装CentOS7.6请参考:虚拟机安装及使用Linux,看这一篇就够了; Docker环境的安装请参考:开发者必备Docker命令; 本项目Docker镜像构建请参考:使用Maven插件为SpringBoot应用构建Docker镜像; 本项目在Docker容器下的部署请参考:mall在Linux环境下的部署(基于Docker容器); 本项目使用Docker Compose请参考: mall在Linux环境下的部署(基于Docker Compose); 本项目在Linux下的自动化部署请参考:mall在Linux环境下的自动化部署(基于Jenkins); 3、相关环境部署 ELK日志收集系统的搭建请参考:SpringBoot应用整合ELK实现日志收集; 使用MinIO存储文件请参考:前后端分离项目,如何优雅实现文件存储; 读写分离解决方案请参考:你还在代码里做读写分离么,试试这个中间件吧; Redis集群解决方案请参考:Docker环境下秒建Redis集群,连SpringBoot也整上了!。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值