添加购物车-02.代码开发
一.代码开发
购物车属于用户端功能,因此要在user下创建controller代码。
Controller层
package com.sky.controller.user;import com.sky.dto.ShoppingCartDTO;
import com.sky.entity.ShoppingCart;
import com.sky.result.Result;
import com.sky.service.ShoppingCartService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/user/shoppingCart")
@Slf4j
@Api(tags = "购物车相关接口")
public class ShoppingCartController {@Autowiredprivate ShoppingCartService shoppingCartService;/*** 添加购物车* @param shoppingCartDTO* @return*/@ApiOperation("添加购物车")@PostMapping("/add")public Result add(@RequestBody ShoppingCartDTO shoppingCartDTO) {log.info("向购物车中添加菜品或套餐:{}",shoppingCartDTO);shoppingCartService.add(shoppingCartDTO);return Result.success();}
}
前端传递过来的参数是JSON类型的,要使用注解@RequestBody。 ShoppingCartDTO中包含3个属性:setmealId,dishId,dishFlavor。
Service层
接口
package com.sky.service;import com.sky.dto.ShoppingCartDTO;
import org.springframework.stereotype.Service;@Service
public interface ShoppingCartService {/*** 添加购物车* @param shoppingCartDTO*/void add(ShoppingCartDTO shoppingCartDTO);
}
实现类
package com.sky.service.impl;import com.sky.context.BaseContext;
import com.sky.dto.ShoppingCartDTO;
import com.sky.entity.Dish;
import com.sky.entity.Setmeal;
import com.sky.entity.ShoppingCart;
import com.sky.mapper.DishMapper;
import com.sky.mapper.SetmealMapper;
import com.sky.mapper.ShoppingCartMapper;
import com.sky.service.ShoppingCartService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.time.LocalDateTime;
import java.util.List;@Service
public class ShoppingCartServiceImpl implements ShoppingCartService {@Autowiredprivate ShoppingCartMapper shoppingCartMapper;@Autowiredprivate DishMapper dishMapper;@Autowiredprivate SetmealMapper setmealMapper;/*** 添加购物车* @param shoppingCartDTO*/@Overridepublic void add(ShoppingCartDTO shoppingCartDTO) {// 首先判断这次添加购物车的操作加入的菜品或套餐是否已经存在,如果存在就把份数+1,如果不存在就新增ShoppingCart shoppingCart = new ShoppingCart();BeanUtils.copyProperties(shoppingCartDTO,shoppingCart);Long userId = BaseContext.getCurrentId();shoppingCart.setUserId(userId);// 1.首先查询该菜品或套餐在数据库中是否存在List<ShoppingCart> list = shoppingCartMapper.list(shoppingCart); // 每次添加的要么是菜品,要么是套餐。且如果重复添加只会增加份数而不会新增一条数据,因此每次查询要么为空,要么查询出1条数据if (list != null && list.size() > 0) { // 已存在,数量+1ShoppingCart cart = list.get(0); // 将已存在的购物车对象取出cart.setNumber(cart.getNumber() + 1); // 并将其菜品/套餐数量+1shoppingCartMapper.updateNumberById(cart); // 通过id更新} else {// 2.不存在,先判断是套餐还是菜品,因为套餐和菜品在购物车中所需要的属性是不一样的Long dishId = shoppingCartDTO.getDishId();if (dishId != null) {// 3.如果是菜品,那么从菜品数据库中查找并将对应属性赋值给购物车对象Dish dish = dishMapper.getById(dishId);shoppingCart.setName(dish.getName());shoppingCart.setImage(dish.getImage());shoppingCart.setAmount(dish.getPrice());} else {// 4.如果是套餐,那么从套餐数据库中查找并将对应属性赋值给购物车对象Long setmealId = shoppingCartDTO.getSetmealId();Setmeal setmeal = setmealMapper.getById(setmealId);shoppingCart.setName(setmeal.getName());shoppingCart.setImage(setmeal.getImage());shoppingCart.setAmount(setmeal.getPrice());}// 5.将新增的菜品/套餐加入数据库中shoppingCart.setNumber(1);shoppingCart.setCreateTime(LocalDateTime.now());shoppingCartMapper.insert(shoppingCart);}}
}
首先判断这次添加购物车的操作加入的菜品或套餐是否已经存在,如果存在就把份数+1,如果不存在就新增。首先我们创建一个购物车对象shoppingCart,然后将shoppingCartDTO的属性赋值给shoppingCart。接着我们通过前端请求的JWT令牌来获得登录用户的用户id作为shoppingCart对象的userId字段。接着我们进行以下操作:
1.首先查询该菜品或套餐在数据库中是否存在。请注意:每次添加的要么是菜品,要么是套餐。且如果重复添加只会增加份数而不会新增一条数据,因此每次查询要么为空,要么查询出1条数据
如果存在,那么将其数量+1即可,即进行数据库的查询和修改操作。
2.如果不存在,先判断是套餐还是菜品,因为套餐和菜品在购物车中所需要的属性是不一样的。如何判断?通过shoppingCartDTO中的dishId和setmealId判断,哪个不为空就是哪个。
3.如果是菜品,那么从菜品数据库中查找并将对应属性赋值给购物车对象。
4.如果是套餐,那么从套餐数据库中查找并将对应属性赋值给购物车对象。
5.将新增的菜品/套餐加入数据库中。
Mapper层
package com.sky.mapper;import com.sky.entity.ShoppingCart;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Update;import java.util.List;@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, image, user_id, dish_id, setmeal_id, dish_flavor, number, amount, create_time) " +"VALUES (#{name}, #{image}, #{userId}, #{dishId}, #{setmealId}, #{dishFlavor}, #{number}, #{amount},#{createTime})")void insert(ShoppingCart shoppingCart);
}
首先查询是否存在,不存在就执行insert操作,存在就执行update操作。
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" resultType="com.sky.entity.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></select>
</mapper>
相关文章:
添加购物车-02.代码开发
一.代码开发 购物车属于用户端功能,因此要在user下创建controller代码。 Controller层 package com.sky.controller.user;import com.sky.dto.ShoppingCartDTO; import com.sky.entity.ShoppingCart; import com.sky.result.Result; import com.sky.service.Shopp…...
2094. 找出 3 位偶数
from typing import Listclass Solution:def findEvenNumbers(self, digits: List[int]) -> List[int]:# 统计 digits 中每个数字(0-9)的出现次数。cnt [0] * 10for d in digits:cnt[d] 1ans []# i0 百位,i1 十位,i2 个位&a…...
外出充电不发愁,倍思便携式移动电源成出行新宠
电子设备已深度融入现代快节奏生活,成为出行必备。但随之而来的电量焦虑,却始终困扰着人们。无论是出差远行、户外探索,还是每日通勤,如何随时为设备充电,成了亟待解决的难题。倍思极客充伸缩数据线充电宝应运而生&…...
防火墙安全策略基础配置
拓朴图 设备基础配置 # AR1 路由器配置 [Huawei]interface GigabitEthernet0/0/0 [Huawei-GigabitEthernet0/0/0]ip address 1.1.1.2 255.255.255.0 [Huawei]ip route-static 192.168.1.0 255.255.255.0 1.1.1.1# FW1 防火墙配置 [USG6000V1]sysname FW1 [FW1]interface Gigab…...
系统架构-通信系统架构设计
通信网络系统架构 局域网 单一机构所拥有的专用计算机网络 局域网从早期只提供二层交换功能的简单网络发展到现在,还提供三层路由功能的复杂网络 局域网的典型架构风格: 单核心架构:由一台核心二层或三层交换设备充当网络的核心设备&…...
2.3 定积分
一、数学定义与核心公式 核心思想: 定积分是通过无限细分区间、累加微小矩形面积来逼近曲边图形面积的数学工具。其本质是极限过程下的误差控制与动态平衡。 公式与符号解析: 表达式:定积分写作 ∫ₐᵇ f(x)dx,表示在区间 [a, …...
TCPIP详解 卷1协议 八 ICMPv4和ICMPv6 Internet控制报文协议
8.1——ICMPv4和ICMPv6 Internet控制报文协议 IP 协议本身并没有为终端系统提供直接的方法来发现那些发往目的地址失败的IP数据包。此外,IP 没有提供直接的方式来获取诊断信息(例如,哪些路由器在沿途中被使用了或使用一种方法来估计往返时间…...
ik 分词器 设置自定义词典
进入 ES 的安装目录,进入 /elasticsearch-8.10.0/plugins/ik/config/ 文件夹目录,打开 IKAnalyzer.cfg.xml 文件进行配置。 一、添加 自定义扩展词典 扩展词:就是不想哪些词分开,让他们成为一个词,比如“蒙的全是对…...
RabbitMQ 工作模式
RabbitMQ 一共有 7 中工作模式,可以先去官网上了解一下(一下截图均来自官网):RabbitMQ 官网 Simple P:生产者,要发送消息的程序;C:消费者,消息的接受者;hell…...
sqlmap使用入门
sqlmap加速了sql注入的发展,需要掌握6点,其一是--dbs获得数据库名称,其二是-D 数据库名称 --tables 获得数据库中的所有表名,其三是-D 数据库名 -T 表名 -C 字段1,字段2 --dump 获得数据库中的表中的字段的值,其四是-r…...
C++23 中的 views::stride:让范围操作更灵活
文章目录 什么是 views::stride语法与用法参数与返回值实现细节适用场景编译器支持总结 什么是 views::stride views::stride 是 C23 引入的一个范围适配器。它允许我们从一个范围中以固定步长提取元素,从而生成一个新的范围视图。具体来说,给定一个范围…...
OSI 7层模型
OSI 7层模型: 1、物理层(光纤等把电脑连接起来的物理手段) 2、数据链路层(以太网,确认0和1电信号的分组方式,负责MAC地址,MAC地址用于在网络中唯一标示一个网卡,相当于网卡的身份证…...
向量组的维度是单个向量中元素的个数
在线性代数中,向量组的维数通常指的是单个向量中元素的个数,即每个向量的维度(dimension)。例如,一个由三维几何向量(如 ( x , y , z ) (x, y, z) (x,y,z))组成的向量组,其维数是3&…...
VM中 ubuntu 网卡不显示
1.添加网卡配置 #sudo nano /etc/netplan/01-netcfg.yaml network:version: 2renderer: networkdethernets:ens33:dhcp4: trueens37:dhcp4: trueens38:dhcp4: true#保存后 sudo netplan apply2.查看网络状态 sudo systemctl start systemd-networkd sudo systemctl status sy…...
Scratch基础-运动模块详解
一、本次任务 二、内容详解 1)点位坐标知识 1、什么是坐标? 答: 坐标是定位位置的数字,大家进教室是不是都有自己的座位?比如第3排第2列?这就像Scratch舞台的坐标,每个角色都有自己的‘座位号’…...
dp自动化登陆之hCaptcha 验证码
hCaptcha 是一种常见的验证码服务,用于区分人类用户和自动化程序。由于其基于图像识别和行为分析,下面介绍如何使用自动化点击验证码完成登陆。 思路:登陆目标网站触发验证码,截图并发给打码平台返回坐标,模拟人工点击…...
【002】renPy android端启动流程分析
接上篇分析 org.renpy.android.PythonSDLActivity#onCreate它先调用了 org.libsdl.app.SDLActivity#onCreate 源码如下: Override // android.app.Activity protected void onCreate(Bundle bundle0) {//1. 日志记录String s;Log.v("SDL", "Dev…...
基于注意力机制与iRMB模块的YOLOv11改进模型—高效轻量目标检测新范式
随着深度学习技术的发展,目标检测在自动驾驶、智能监控、工业质检等场景中得到了广泛应用。针对当前主流目标检测模型在边缘设备部署中所面临的计算资源受限和推理效率瓶颈问题,YOLO系列作为单阶段目标检测框架的代表,凭借其高精度与高速度的…...
suricata增加单元测试编译失败
一、环境 $ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.5 LTS Release: 22.04 Codename: jammysuricata: suricata7.0.5 IDE: vscode 二、背景 在suricata中开发了某个功能后,增加unittest时,…...
如何查看电脑处理器配置 电脑处理器查看方法
电脑处理器(CPU)直接影响着电脑的运行速度和响应能力,无论是进行日常办公、娱乐,还是玩大型游戏,处理器的性能都至关重要。那么,电脑cpu在哪里看呢?本文将为你介绍几种简单的方法,帮…...
idea查看pom文件依赖
IDEA中查看依赖树的插件 很方便 能够分析源码中引入的注解是来自哪个jar包的...
图形化编程平台的破局之道:从工具同质化到生态差异化
一、同质化困局的底层逻辑剖析 在全球图形化编程市场中,工具功能趋同已成为行业共识。据 Statista 2024 年数据显示,主流平台的基础功能重合度高达 78%,核心模块(如条件判断、循环结构)的实现方式高度相似。这种现象的…...
Spring Boot动态配置修改全攻略
精心整理了最新的面试资料和简历模板,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 无需重启应用,实时更新配置的终极指南 在微服务架构中,动态配置管理是提高系统灵活性的关键技术。本文将通过4种主流方案,…...
基于STM32、HAL库的DPS368XTSA1气压传感器 驱动程序设计
一、简介: DPS368XTSA1 是 InvenSense(TDK 集团旗下公司)生产的一款高精度数字气压传感器,专为需要精确测量气压和温度的应用场景设计。它具有超低功耗、高精度、快速响应等特点,非常适合物联网、可穿戴设备和无人机等应用。 二、硬件接口: DPS368XTSA1 引脚STM32L4XX 引…...
VMware虚拟机实例-docker启动失败
DOCKER启动失败 错误消息 [rootlocalhost docker]# yum install docker......[rootlocalhost docker]# systemctl start dockerFailed to start docker.service: Unit is masked. 错误原因 # /var/log/messagesMay 12 18:14:04 localhost systemd: Started Session 11 of user…...
计算机图形学编程(使用OpenGL和C++)(第2版)学习笔记 09.天空和背景
天空和背景 对于 3D 场景,通常可以通过在远处的地平线附近创造一些逼真的效果,来增强其真实感。我们可以采用天空盒、天空柱(Skydome)或天空穹(Skydome)等技术来模拟天空。 天空盒 天空盒(Sk…...
CSDN博客粘贴图片失败如何解决
以前还好,最近越发的厉害了。 因为我最近恰好换了个网,所以我还以为是网络的问题。 网的问题我暂时解决不了,除非在加银子换个网,否则我搞不定。 终于找到一种貌似还行的方法,记录一下。 1,现象 CSDN博…...
USB学习【10】描述符-HID描述符
目录 1.前言2.HID描述符概述3.HID描述符组成4.报告描述符的概念和作用5.报告描述符中的通用项(Item) 1.前言 HID描述符功能上面相对独立一些,所以单分一篇专门整理。 原文链接:https://blog.csdn.net/weiaipan1314/article/detai…...
什么是Vim
Vim可是Linux中最强大、最受欢迎的文本编辑器之一,很多程序员、系统管理员都离不开它。要说清楚Vim的各种功能和用法,似乎有点长,但我会尽量用简单通俗的方式,把Vim的核心知识讲清楚,让你能一步一步开始使用它。 一、…...
【Unity3D插件】Unity3D插件之天气系统/日夜系统插件-UniStorm
推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享QQ群:398291828小红书小破站 一、前言 1.0136537.8,1.023651377.4,每天进步一点点,一年后就差了几十倍的差距,加油吧少年。 UniStorm是一款强大的动态昼夜天气系统&…...
AIGC时代的内容安全:AI检测技术如何应对新型风险挑战?
在数字时代,互联网内容以文本、图像、音频和视频等形式呈现爆发式增长,深刻塑造了信息传播的格局。然而,内容的快速传播也带来了严峻挑战:违法信息(如涉黄、涉政)、虚假广告、网络暴力等内容不仅威胁用户体…...
SAGAR线上网页程序生成准随机结构(SQS)
SAGAR线上网页程序地址 http://sagar.compphys.cn/sagar 页面最上方默认使用8个原子的Si为基础结构。 打开网页 选择C1模块 在下方填入结构信息,以及掺杂入原子和数量 这里则设置掺杂入4个C原子,然后点击submit,则会自动生成并让你下载一根压…...
Wi-Fi网络角色及功能详解
在 Wi-Fi 网络中,不同的角色和组件协同工作以实现无线通信。以下是 Wi-Fi 中的主要角色及其功能: 1. 基础设施模式(Infrastructure Mode) 这是最常见的 Wi-Fi 网络架构,包含以下核心角色: 接入点ÿ…...
18.three官方示例+编辑器+AI快速学习webgl_buffergeometry_points_interleaved
本实例主要讲解内容 这个Three.js示例展示了如何使用BufferGeometry和Points对象创建高效的粒子系统。通过共享内存缓冲区和交错存储顶点数据,实现了50万个粒子的流畅渲染,并为每个粒子设置基于位置的颜色。 核心技术包括: 使用ArrayBuffe…...
Oracle 19c 静默安装
文章目录 环境介绍安装包下载准备工作配置 yum 源安装依赖包创建用户和用户组创建必要目录关闭 SELinux配置内核参数配置资源限制配置环境变量 Oracle 19c 安装解压缩编辑相应文件执行静默安装配置监听静默创建数据库 数据库维护连接数据库 环境介绍 操作系统为 CentOS 7.9 O…...
vscode 默认环境路径
1.下面放在项目根目录上: .vscode/settings.json 2.settings.json内容: {"python.analysis.extraPaths": ["${workspaceFolder}"],"python.defaultInterpreterPath": "/shared_disk/users/lbg/envs/py310_see3d/b…...
电力系统静态安全因素与动态安全因素的区别及具体分类
电力系统的安全分析分为静态安全和动态安全两类。静态安全分析关注系统在稳态或小扰动下的安全裕度,动态安全分析则关注系统在大扰动或暂态过程中的稳定能力。 一、静态安全因素 频率静态安全 因素: 发电与负荷的静态平衡:需保证稳态下的发电…...
arduinoIDE核心库更新导致的ESP32开发板神秘接口更换和三方库冲突
ESP32开发遇到的问题的解决记录贴 arduinoIDE核心库更新导致的ESP32开发板神秘接口更换和三方库冲突情况描述其余解决方法(网上查的,未验证): arduinoIDE核心库更新导致的ESP32开发板神秘接口更换和三方库冲突 情况描述 当我将a…...
MCU开启浮点计算FPU
FPU 测试 1. FPU 简介2. 协处理器控制寄存器(CPACR)3. 开启FPU4. 验证FPU(Julia 分形实验) 1. FPU 简介 FPU 即浮点运算单元(Float Point Unit)。浮点运算,对于定点 CPU(没有 FPU 的…...
vue3+three 搭建平面上滚动旋转的几何体
嗨,我是小路。今天主要和大家分享的主题是“vue3three 搭建平面上滚动旋转的几何体”。 在现代前端开发中,结合 Vue 3 的响应式能力和 Three.js 的强大 3D 渲染能力,可以轻松构建出令人惊叹的交互式三维场景。本文将带你一步步实现一…...
《Python星球日记》 第59天:生成对抗网络(GAN)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、引言二、GAN的基本原理1. 天才的创意:生成器与判别器的博弈过程2. 训练流程与目标函数三、常见GAN变体1. DCGAN (深度卷积生成对抗网络)2.…...
用户态到内核态:Linux信号传递的九重门(二)
1. 保存信号 1.1. 信号其他相关常见概念 实际执⾏信号的处理动作称为信号递达(Delivery)。 信号从产⽣到递达之间的状态,称为信号未决(Pending)。 进程可以选择阻塞 (Block )某个信号。 被阻塞的信号产⽣时将保持在未决状态,直到进程解除对此信号的阻塞,才执⾏递达的动作。 1.…...
【深度学习-Day 9】机器学习核心概念入门:监督、无监督与强化学习全解析
Langchain系列文章目录 01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...
android特许权限调试
新aosp中新应用无权限,但需要正常运行,来排查权限问题 ro.control_privapp_permissionslog这样做可确保设备保持工作状态,同时仍然提供违规行为列表。错误消息格式如下: PackageManager: Privileged permission {PERMISSION_NAM…...
如何避免Java中的ConcurrentModificationException
引言 在Java开发中,操作集合(如List、Set、Map)时,许多开发者都遇到过ConcurrentModificationException。这个异常通常出现在遍历集合的同时尝试修改其结构(如添加或删除元素)。本文将深入探讨这一异常的根…...
5月12日复盘-RNN
5月12日复盘 二、RNN 模型 1.先导 1.1 为什么需要循环神经网络 RNN 上图是一幅全连接神经网络图,我们可以看到输入层-隐藏层-输出层,他们每一层之间是相互独立地,(框框里面代表同一层),每一次输入生成一个节点,同…...
linux小主机搭建自己的nas(二)docker卸载navidrome
测试的时候安装了一个音乐播放器在root下面,现在先给他删掉 停止并删除容器 docker ps -a | grep navidrome# 停止并删除容器(替换 YOUR_CONTAINER_NAME 为实际名称) docker stop YOUR_CONTAINER_NAME && docker rm YOUR_CONTAINER…...
.NET 在鸿蒙系统上的适配现状
目录 .NET 在鸿蒙系统上的适配现状 鸿蒙系统对虚拟机的限制与.NET的适配挑战 NativeAOT 在鸿蒙系统中的适配原理与实现方式 已知问题与解决方案:鸿蒙系统中的 syscall 限制 鸿蒙系统适配中的技术难点与解决方案 跨平台编译的挑战与应对策略 依赖库管理与兼容…...
01-centos离线升级至almalinux
官网链接官方代码调整: 1. vi repositories/system_upgrade/common/actors/targetuserspacecreator/libraries/userspacegen.py with mounting.BindMount(sourceuserspace_dir, targetos.path.join(context.base_dir, install_root_dir.lstrip(/))):_restore_persi…...
Python 处理图像并生成 JSONL 元数据文件 - 固定text版本
Python 处理图像并生成 JSONL 元数据文件 - 固定text版本 flyfish JSONL(JSON Lines)简介 JSONL(JSON Lines,也称为 newline-delimited JSON)是一种轻量级的数据序列化格式,由一系列独立的 JSON 对象组成…...