基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖微信小程序端(十二)

购物车相关

  • 1.添加购物车
    • 1.1 需求分析和设计
      • 1.1.1 产品原型
      • 1.1.2 接口设计
      • 1.1.3 表设计
    • 1.2 代码开发
      • 1.2.1 DTO设计
      • 1.2.2 Controller层
      • 1.2.3 Service层接口
      • 1.2.4 Service层实现类
      • 1.2.5 Mapper层
  • 2. 查看购物车
    • 2.1 需求分析和设计
      • 2.1.1 产品原型
      • 2.1.2 接口设计
    • 2.2 代码开发
      • 2.2.1 Controller层
      • 2.2.2 Service层接口
      • 2.2.3 Service层实现类
    • 2.3 功能测试
  • 3. 清空购物车
    • 3.1 需求分析和设计
      • 3.1.1 产品原型
      • 3.1.2 接口设计
    • 3.2 代码开发
      • 3.2.1 Controller层
      • 3.2.2 Service层接口
      • 3.2.3 Service层实现类
      • 3.2.4 Mapper层

1.添加购物车

1.1 需求分析和设计

1.1.1 产品原型

用户可以将菜品或者套餐添加到购物车。对于菜品来说,如果设置了口味信息,则需要选择规格后才能加入购物车;对于套餐来说,可以直接点击+将当前套餐加入购物车。在购物车中可以修改菜品和套餐的数量,也可以清空购物车。

效果图:

在这里插入图片描述

1.1.2 接口设计

通过上述原型图,设计出对应的添加购物车接口。
在这里插入图片描述

说明:添加购物车时,有可能添加菜品,也有可能添加套餐。故传入参数要么是菜品id,要么是套餐id。

1.1.3 表设计

用户的购物车数据,也是需要保存在数据库中的,购物车对应的数据表为shopping_cart表,具体表结构如下:

字段名数据类型说明备注
idbigint主键自增
namevarchar(32)商品名称冗余字段
imagevarchar(255)商品图片路径冗余字段
user_idbigint用户id逻辑外键
dish_idbigint菜品id逻辑外键
setmeal_idbigint套餐id逻辑外键
dish_flavorvarchar(50)菜品口味
numberint商品数量
amountdecimal(10,2)商品单价冗余字段
create_timedatetime创建时间

说明:

  • 购物车数据是关联用户的,在表结构中,我们需要记录,每一个用户的购物车数据是哪些
  • 菜品列表展示出来的既有套餐,又有菜品,如果用户选择的是套餐,就保存套餐ID(setmeal_id),如果用户选择的是菜品,就保存菜品ID(dish_id)
  • 对同一个菜品/套餐,如果选择多份不需要添加多条记录,增加数量number即可

1.2 代码开发

1.2.1 DTO设计

根据添加购物车接口的参数设计DTO:

在这里插入图片描述

在sky-pojo模块,ShoppingCartDTO.java已定义

package com.sky.dto;import lombok.Data;
import java.io.Serializable;@Data
public class ShoppingCartDTO implements Serializable {private Long dishId;private Long setmealId;private String dishFlavor;}

1.2.2 Controller层

根据添加购物车接口创建ShoppingCartController:

package com.sky.controller.user;/*** 购物车*/
@RestController
@RequestMapping("/user/shoppingCart")
@Slf4j
@Api(tags = "C端-购物车接口")
public class ShoppingCartController {@Autowiredprivate ShoppingCartService shoppingCartService;/*** 添加购物车* @param shoppingCartDTO* @return*/@PostMapping("/add")@ApiOperation("添加购物车")public Result<String> add(@RequestBody ShoppingCartDTO shoppingCartDTO){log.info("添加购物车:{}", shoppingCartDTO);shoppingCartService.addShoppingCart(shoppingCartDTO);//后绪步骤实现return Result.success();}
}

1.2.3 Service层接口

创建ShoppingCartService接口:

package com.sky.service;public interface ShoppingCartService {/*** 添加购物车* @param shoppingCartDTO*/void addShoppingCart(ShoppingCartDTO shoppingCartDTO);
}

1.2.4 Service层实现类

创建ShoppingCartServiceImpl实现类,并实现add方法:

package com.sky.service.impl;@Service
public class ShoppingCartServiceImpl implements ShoppingCartService {@Autowiredprivate ShoppingCartMapper shoppingCartMapper;@Autowiredprivate DishMapper dishMapper;@Autowiredprivate SetmealMapper setmealMapper;/*** 添加购物车** @param shoppingCartDTO*/public void addShoppingCart(ShoppingCartDTO shoppingCartDTO) {ShoppingCart shoppingCart = new ShoppingCart();BeanUtils.copyProperties(shoppingCartDTO, shoppingCart);//只能查询自己的购物车数据shoppingCart.setUserId(BaseContext.getCurrentId());//判断当前商品是否在购物车中List<ShoppingCart> shoppingCartList = shoppingCartMapper.list(shoppingCart);if (shoppingCartList != null && shoppingCartList.size() == 1) {//如果已经存在,就更新数量,数量加1shoppingCart = shoppingCartList.get(0);shoppingCart.setNumber(shoppingCart.getNumber() + 1);shoppingCartMapper.updateNumberById(shoppingCart);} else {//如果不存在,插入数据,数量就是1//判断当前添加到购物车的是菜品还是套餐Long dishId = shoppingCartDTO.getDishId();if (dishId != null) {//添加到购物车的是菜品Dish dish = dishMapper.getById(dishId);shoppingCart.setName(dish.getName());shoppingCart.setImage(dish.getImage());shoppingCart.setAmount(dish.getPrice());} else {//添加到购物车的是套餐Setmeal setmeal = setmealMapper.getById(shoppingCartDTO.getSetmealId());shoppingCart.setName(setmeal.getName());shoppingCart.setImage(setmeal.getImage());shoppingCart.setAmount(setmeal.getPrice());}shoppingCart.setNumber(1);shoppingCart.setCreateTime(LocalDateTime.now());shoppingCartMapper.insert(shoppingCart);}}
}

1.2.5 Mapper层

创建ShoppingCartMapper接口:

package com.sky.mapper;@Mapper
public interface ShoppingCartMapper {/*** 条件查询** @param shoppingCart* @return*/List<ShoppingCart> list(ShoppingCart shoppingCart);/*** 更新商品数量** @param shoppingCart*/@Update("update shopping_cart set number = #{number} where id = #{id}")void updateNumberById(ShoppingCart shoppingCart);/*** 插入购物车数据** @param shoppingCart*/@Insert("insert into shopping_cart (name, user_id, dish_id, setmeal_id, dish_flavor, number, amount, image, create_time) " +" values (#{name},#{userId},#{dishId},#{setmealId},#{dishFlavor},#{number},#{amount},#{image},#{createTime})")void insert(ShoppingCart shoppingCart);}

创建ShoppingCartMapper.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.sky.mapper.ShoppingCartMapper"><select id="list" parameterType="ShoppingCart" resultType="ShoppingCart">select * from shopping_cart<where><if test="userId != null">and user_id = #{userId}</if><if test="dishId != null">and dish_id = #{dishId}</if><if test="setmealId != null">and setmeal_id = #{setmealId}</if><if test="dishFlavor != null">and dish_flavor = #{dishFlavor}</if></where>order by create_time desc</select>
</mapper>

2. 查看购物车

2.1 需求分析和设计

2.1.1 产品原型

当用户添加完菜品和套餐后,可进入到购物车中,查看购物中的菜品和套餐。

2.1.2 接口设计

在这里插入图片描述

2.2 代码开发

2.2.1 Controller层

在ShoppingCartController中创建查看购物车的方法:

	/*** 查看购物车* @return*/@GetMapping("/list")@ApiOperation("查看购物车")public Result<List<ShoppingCart>> list(){return Result.success(shoppingCartService.showShoppingCart());}

2.2.2 Service层接口

在ShoppingCartService接口中声明查看购物车的方法:

	/*** 查看购物车* @return*/List<ShoppingCart> showShoppingCart();

2.2.3 Service层实现类

在ShoppingCartServiceImpl中实现查看购物车的方法:

	/*** 查看购物车* @return*/public List<ShoppingCart> showShoppingCart() {return shoppingCartMapper.list(ShoppingCart.builder().userId(BaseContext.getCurrentId()).build());}

2.3 功能测试

在这里插入图片描述

3. 清空购物车

3.1 需求分析和设计

3.1.1 产品原型

当点击清空按钮时,会把购物车中的数据全部清空。
在这里插入图片描述

3.1.2 接口设计

在这里插入图片描述

3.2 代码开发

3.2.1 Controller层

在ShoppingCartController中创建清空购物车的方法:

	/*** 清空购物车商品* @return*/@DeleteMapping("/clean")@ApiOperation("清空购物车商品")public Result<String> clean(){shoppingCartService.cleanShoppingCart();return Result.success();}

3.2.2 Service层接口

在ShoppingCartService接口中声明清空购物车的方法:

	/*** 清空购物车商品*/void cleanShoppingCart();

3.2.3 Service层实现类

在ShoppingCartServiceImpl中实现清空购物车的方法:

	/*** 清空购物车商品*/public void cleanShoppingCart() {shoppingCartMapper.deleteByUserId(BaseContext.getCurrentId());}

3.2.4 Mapper层

在ShoppingCartMapper接口中创建删除购物车数据的方法:

	/*** 根据用户id删除购物车数据** @param userId*/@Delete("delete from shopping_cart where user_id = #{userId}")void deleteByUserId(Long userId);

后记
👉👉💕💕美好的一天,到此结束,下次继续努力!欲知后续,请看下回分解,写作不易,感谢大家的支持!! 🌹🌹🌹

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/626619.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

K8S----YAML

kubernetes中资源可以使用YAML描述&#xff08;如果您对YAML格式不了解&#xff0c;可以参考YAML语法&#xff09;&#xff0c;也可以使用JSON。其内容可以分为如下四个部分&#xff1a; typeMeta&#xff1a;对象类型的元信息&#xff0c;声明对象使用哪个API版本&#xff0c…

L1-027 出租(Java)

下面是新浪微博上曾经很火的一张图&#xff1a; 一时间网上一片求救声&#xff0c;急问这个怎么破。其实这段代码很简单&#xff0c;index数组就是arr数组的下标&#xff0c;index[0]2 对应 arr[2]1&#xff0c;index[1]0 对应 arr[0]8&#xff0c;index[2]3 对应 arr[3]0&…

Android Studio安卓读取EM4100 TK4100卡卡号源码

本示例使用的读卡器&#xff1a;https://item.taobao.com/item.htm?spma1z10.5-c.w4002-21818769070.35.44005b43nb1q2h&id562957272162 <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmln…

2024年【安全生产监管人员】复审考试及安全生产监管人员模拟考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全生产监管人员复审考试是安全生产模拟考试一点通总题库中生成的一套安全生产监管人员模拟考试题库&#xff0c;安全生产模拟考试一点通上安全生产监管人员作业手机同步练习。2024年【安全生产监管人员】复审考试及…

Unity 编辑器篇|(六)编辑器拓展EditorGUI类 (全面总结 | 建议收藏)

目录 1. 前言2. 参数3. 功能3.1 折叠菜单&#xff1a; Foldout3.2 检查 GUI 更改&#xff1a; BeginChangeCheck 、EndChangeCheck 监听值改变3.3 可禁用控件&#xff1a;BeginDisabledGroup 、EndDisabledGroup 是否禁用组中的控件3.4 下拉菜单&#xff1a;DropdownButton3.5 …

CentOS7安装MySQL 错误:软件包:akonadi-mysql-1.9.2-4.el7.x86_64 (@anaconda)

问题如图所示 运行一下命令解决 yum -y remove mariadb-libsyum install mysql-community-server

PriorityBlockingQueue概念

四、PriorityBlockingQueue概念 4.1 PriorityBlockingQueue介绍 首先PriorityBlockingQueue是一个优先级队列&#xff0c;他不满足先进先出的概念。 会将查询的数据进行排序&#xff0c;排序的方式就是基于插入数据值的本身。 如果是自定义对象必须要实现Comparable接口才可…

mysql查询当天、近一周、近一个月及近一年的数据以及各种报表查询sql

以下是一些常见的MySQL查询语句&#xff0c;用于查询当天、近一周、近一个月和近一年的数据&#xff0c;以及一些常见的报表查询。 查询当天的数据&#xff1a; SELECT * FROM table_name WHERE DATE(date_column) CURDATE();查询近一周的数据&#xff1a; SELECT * FROM t…

如何学习three.js

如何学习three.js 前言1. 基础概念场景&#xff08;Scene&#xff09;&#xff1a; three.js中所有物体的容器。你可以把它想象成一个舞台&#xff0c;在这里添加物体、光源等。相机&#xff08;Camera&#xff09;&#xff1a; 决定了哪部分场景会被渲染。最常用的是透视相机&…

MongoDB面试系列-01

1. MongoDB 是什么&#xff1f; MongoDB是由C语言编写的&#xff0c;是一个基于分布式文件存储的开源数据库系统。再高负载的情况下&#xff0c;添加更多的节点&#xff0c;可以保证服务器性能。MongoDB旨在给Web应用提供可扩展的高性能数据存储解决方案。 MongoDB将数据存储…

机器学习算法实战案例:CNN-LSTM实现多变量多步光伏预测

文章目录 1 数据处理1.1 导入库文件1.2 导入数据集1.3 缺失值分析 2 构造训练数据​3 模型训练3.1 CNN-LSTM网络3.2 模型训练 4 模型预测答疑&技术交流机器学习算法实战案例系列 1 数据处理 1.1 导入库文件 from matplotlib import pyplot as pltimport tensorflow as tf…

PHP+MySQL组合开发:微信小程序万能建站源码系统 附带完整的搭建教程

随着移动互联网的快速发展&#xff0c;微信小程序已成为企业进行移动营销的重要工具。然而&#xff0c;对于许多中小企业和个人开发者来说&#xff0c;开发一个功能完善、用户体验良好的小程序是一项复杂的任务。罗峰给大家分享一款微信小程序万能建站源码系统。该系统采用PHPM…

SAP PP 常用表整理

表名描述AFFLWork ordersequence加工单顺序AENR工程变更管理AEOI工程变更管理AFFTOrder processinstructions订单&#xff0d;流程指令AFFVOrder processinstruction values订单-流程指令值AFKOOrder header data PPorders订单表头数据 PP 订单AFPOOrderitem订单项AFRUOrder co…

CMMI3.0认证的卓越方案!

CMMI3.0是软件工程和组织发展领域中的一项重要认证&#xff0c;它旨在提升组织的绩效和成熟度&#xff0c;促进卓越的软件开发和管理实践。本文将探讨CMMI3.0认证的意义、要求以及实施过程&#xff0c;并介绍一些卓越方案&#xff0c;帮助组织达到该认证。 CMMI3.0认证的意义 …

线控底盘新玩家凶猛!这家企业的ONE-BOX产品正式量产下线

高工智能汽车获悉&#xff0c;12月27日&#xff0c;威肯西科技宣布旗下ONE-BOX线控制动产品--液压解耦制动系统HDBS实现量产下线。该产品将与多个汽车品牌签署量产及定点协议&#xff0c;预计年产量达到60万套。 据了解&#xff0c;作为耀宁科技集团的一级子公司&#xff0c;威…

JS CRC16/XMODEM

const byteData HexString2Bytes("1A3B4C5D") let crc crc16(byteData) // CRC转换&#xff1a; A185 console.log("CRC转换&#xff1a;",crc)function crc16(buffer) {var crc 0x0000;var odd;for(var i 0; i < buffer.length; i) {crc ^ (buffer[…

【正点原子】STM32电机应用控制学习笔记——8.FOC简介

FOC是适用于无刷电机的&#xff0c;而像有刷电机&#xff0c;舵机&#xff0c;步进电机是不适用FOC的。FOC是电机应用控制难度最大的部分了。 一.FOC简介&#xff08;了解&#xff09; 1.介绍 FOC&#xff08;Filed Oriented Control&#xff09;即磁场定向控制&#xff0c;…

ITK imagedata三维体数据与VTK imagedata三维体数据的互相转换

VTK的三维imagedata转化为ITK的三维imagedata&#xff0c;以及和ITK的三维imagedata转化为VTK的三维imagedata的代码&#xff1a; #include <itkVTKImageToImageFilter.h> #include <vtkImageData.h> #include <itkImageToVTKImageFilter.h> #include <i…

MySQL 8.0中引入的选项和变量(三)

以下是在MySQL 8.0中新增的系统变量、状态变量和服务选项&#xff1a; • authentication_ldap_sasl_log_status: LDAP服务器日志级别。MySQL 8.0.11版本新增。 • authentication_ldap_sasl_max_pool_size: LDAP服务器最大连接池大小。MySQL 8.0.11版本新增。 • authenticat…

拼多多商家电话采集软件使用教程

拼多多作为一个中国著名的电商平台&#xff0c;拥有大量的商家信息。如果您需要采集拼多多商家的联系电话&#xff0c;可以使用Python编写一个简单的爬虫程序来实现。下面是一个基本的教程&#xff0c;帮助您使用拼多多商家电话采集软件。 步骤1&#xff1a;安装Python和相关库…