苍穹外卖开发笔记(6.缓存商品,购物车)

目录

  • 一、缓存商品
    • 2、缓存菜品(redis)
      • 1.问题说明
      • 2.实现思路
      • 3.代码开发
    • 2、缓存套餐(spring cache)
      • 1.实现思路
      • 2.代码实现
    • 3、测试
  • 二、购物车功能
    • 1、添加购物车
      • 1.需求分析设计
      • 2.代码开发
      • 3.测试
    • 2、查看购物车
      • 1.需求分析设计
      • 2.代码开发
      • 3.测试
    • 3、清空购物车
      • 1.需求分析设计
      • 2.代码设计
      • 3.测试
  • 三、相关知识
    • 1、Spring Cache实现注解缓存功能

一、缓存商品

2、缓存菜品(redis)

1.问题说明

在这里插入图片描述

2.实现思路

在这里插入图片描述
在这里插入图片描述

3.代码开发

修改user端的dishController下的根据分类id查询菜品方法:

    /*** 根据分类id查询菜品* @param categoryId* @return*/@GetMapping("/list")@ApiOperation("根据分类id查询菜品")public Result<List<DishVO>> list(Long categoryId){//构造redis中的key,规则:dish_分类idString key = "dish_" + categoryId;//查询redis中是否存在菜品数据List<DishVO> list = (List<DishVO>) redisTemplate.opsForValue().get(key);if(list.size() > 0 && list != null){//如果存在直接返回return Result.success(list);}//如果不存在,查询数据库,并把数据放入redisDish dish = new Dish();dish.setCategoryId(categoryId);dish.setStatus(StatusConstant.ENABLE);//查询在起售中的商品//如果不存在,查询数据库,并把数据放入redislist = dishService.listWithFlavor(dish);redisTemplate.opsForValue().set(key, list);return Result.success(list);}

同时,当新增菜品,修改菜品等操作时,也需要清理缓存数据:
admin下的dishController:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、缓存套餐(spring cache)

1.实现思路

在这里插入图片描述

2.代码实现

在启动类上开启缓存注解
在这里插入图片描述
在相应需要使用缓存的地方加上注解:

用户端查询套餐

在这里插入图片描述

管理端添加,修改,删除套餐

在这里插入图片描述

在这里插入图片描述

3、测试

重新加载页面,可以看到redis缓存的数据
在这里插入图片描述
在这里插入图片描述

二、购物车功能

1、添加购物车

1.需求分析设计

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2.代码开发

创建接收数据的DTO:ShoppingCartDTO

@Data
public class ShoppingCartDTO implements Serializable {private Long dishId;private Long setmealId;private String dishFlavor;}

以及连接数据库购物车表的实体类

public class ShoppingCart implements Serializable {private static final long serialVersionUID = 1L;private Long id;//名称private String name;//用户idprivate Long userId;//菜品idprivate Long dishId;//套餐idprivate Long setmealId;//口味private String dishFlavor;//数量private Integer number;//金额private BigDecimal amount;//图片private String image;private LocalDateTime createTime;
}

ShoppingCartController


@RestController("userShoppingCartController")
@RequestMapping("/user/shoppingCart")
@Slf4j
@Api(tags = "C端购物车相关接口")
public class ShoppingCartController {@Autowiredprivate ShoppingCartService shoppingCartService;/*** 添加购物车* @param shoppingCartDTO* @return*/@PostMapping("/add")@ApiOperation("添加购物车商品")public Result add(@RequestBody ShoppingCartDTO shoppingCartDTO){log.info("添加购物车,商品信息为:{}",shoppingCartDTO);shoppingCartService.addShoppingCart(shoppingCartDTO);return Result.success();}
}

ShoppingCartService:

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

ShoppingCartServiceImpl:

@Service
@Slf4j
public class ShoppingCartServiceImpl implements ShoppingCartService {@Autowiredprivate ShoppingCartMapper shoppingCartMapper;@Autowiredprivate DishMapper dishMapper;@Autowiredprivate SetmealMapper setmealMapper;/*** 添加购物车* @param shoppingCartDTO*/@Overridepublic void addShoppingCart(ShoppingCartDTO shoppingCartDTO) {//判读当前加入购物车中的商品是否已经存在ShoppingCart shoppingCart = new ShoppingCart();BeanUtils.copyProperties(shoppingCartDTO,shoppingCart);Long userId = BaseContext.getCurrentId();shoppingCart.setUserId(userId);List<ShoppingCart> list = shoppingCartMapper.list(shoppingCart);//如果已经存在,只需要数量+1if(list.size() > 0 && list != null){ShoppingCart cart = list.get(0);cart.setNumber(cart.getNumber() + 1);shoppingCartMapper.updateNumberById(cart);}else {//如果不存在,则插入一条购物车数据//判读本次添加购物车的时菜品还是套餐Long dishId = shoppingCartDTO.getDishId();if(dishId != null){//本次添加的是菜品Dish dish = dishMapper.getById(dishId);shoppingCart.setName(dish.getName());shoppingCart.setImage(dish.getImage());shoppingCart.setAmount(dish.getPrice());shoppingCart.setNumber(1);shoppingCart.setCreateTime(LocalDateTime.now());}else {//本次添加的是套餐Long setmealId = shoppingCartDTO.getSetmealId();Setmeal setmeal = setmealMapper.getById(setmealId);shoppingCart.setName(setmeal.getName());shoppingCart.setImage(setmeal.getImage());shoppingCart.setAmount(setmeal.getPrice());shoppingCart.setNumber(1);shoppingCart.setCreateTime(LocalDateTime.now());}shoppingCartMapper.insert(shoppingCart);}}}

ShoppingCartMapper:


@Mapper
public interface ShoppingCartMapper {/*** 动态条件查询* @param shoppingCart* @return*/List<ShoppingCart> list(ShoppingCart shoppingCart);/*** 根据id修改商品数量* @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" resultType="com.sky.entity.ShoppingCart">select * from shopping_cart<where><if test="userId != null">and user_id = #{userId}</if><if test="setmealId != null">and setmeal_id = #{setmealId}</if><if test="dishId != null">and dish_id = #{dishId}</if><if test="dishFlavor != null">and dish_flavor = #{dishFlavor}</if></where></select>
</mapper>

3.测试

选择商品加入购物车
在这里插入图片描述
可以看到数据库中已经有数据了,则添加成功
在这里插入图片描述
并且添加两个套餐后
在这里插入图片描述

2、查看购物车

1.需求分析设计

在这里插入图片描述
在这里插入图片描述

2.代码开发

ShoppingCartController:

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

ShoppingCartService:

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

ShoppingCartServiceImpl:

    /*** 查看购物车* @return*/@Overridepublic List<ShoppingCart> showShoppingCart() {//获取用户idLong userId = BaseContext.getCurrentId();ShoppingCart shoppingCart = ShoppingCart.builder().userId(userId).build();List<ShoppingCart> list = shoppingCartMapper.list(shoppingCart);return list;}

3.测试

可以看到购物车回显数据
在这里插入图片描述

3、清空购物车

1.需求分析设计

在这里插入图片描述

2.代码设计

ShoppingCartController:

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

ShoppingCartService:

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

ShoppingCartServiceImpl:

    /*** 清空购物车*/@Overridepublic void cleanShoppingCart() {//获取用户idLong userId = BaseContext.getCurrentId();shoppingCartMapper.deleteByUserId(userId);}

ShoppingCartMapper:

    /*** 清空购物车* @param userId*/@Delete("delete from shopping_cart where user_id = #{userId}")void deleteByUserId(Long userId);

3.测试

点击清空购物车
在这里插入图片描述
在这里插入图片描述

三、相关知识

1、Spring Cache实现注解缓存功能

在这里插入图片描述
在这里插入图片描述
具体用法:
启动类上开启springcache功能
在这里插入图片描述
CachePut的多种生成缓存方法
在这里插入图片描述
同理Cacheable
在这里插入图片描述
在这里插入图片描述
CacheEvict删除所有缓存
在这里插入图片描述

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

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

相关文章

Scrapy爬虫框架入门(豆瓣电影Top 250)

文章目录 Scrapy 官网Scrapy 文档GithubScrapy 简介项目结构爬虫实现XPath 教程创建 Scrapy 项目配置用户代理网页 dom 元素 IP 代理池IP代理池作用配置IP代理池申请IP代理池 Scrapy 官网 https://scrapy.org/ Scrapy 文档 https://docs.scrapy.org/en/latest/ Github htt…

重发布及路由策略实验

目录 一、实验拓扑 二、实验需求 1、按照图示配置 IP 地址&#xff0c;R1&#xff0c;R3&#xff0c;R4 上使用 loopback 口模拟业务网段 2、R2&#xff0c;R3 和R4运行 oSPF&#xff0c;各自协议内部互通 3、在 RIP 和 oSPF 间配置双向路由引入&#xff0c;要求除 R4 上的…

(2024|WACV,fMRI到图像,对比学习,数据增强,用多阶段编解码器解决数据对稀缺)DREAM:逆转人类视觉系统的视觉解码

DREAM: Visual Decoding from REversing HumAn Visual SysteM 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 1. 引言 3. 人类视觉系统基础 4. DREAM 4.1. R-VAC&#xff0…

vue3+Echarts+Nodejs实现动态数据可视化

最近在做毕设的后台管理系统&#xff0c;刚好需要做数据动态可视化的功能&#xff0c;就来记录一下具体的实现方式吧&#xff01; 在开始之前就不阐述用vue创建项目的具体步骤了&#xff0c;主要详细讲解一下vue3、echarts和nodejs三者之间是如何实现数据的动态显示的&#xf…

在 VSCode 中运行 C#

文章目录 1.为何选择VSCode而不是VS2.操作步骤2.1 安装.NET2.2 安装扩展插件2.2.1 C#2.2.2 Code Runner 3.新建工程HelloCsharp 1.为何选择VSCode而不是VS VS实在是太“重”了&#xff0c;如果只是写一些简单控制台程序进行调试&#xff0c;则完全没必要 2.操作步骤 2.1 安装…

数据赋能(65)——要求:岗位与能力要求关系

“要求&#xff1a;岗位与能力要求关系”是作为标准的参考内容编写的。 岗位与能力要求关系存在多种。岗位与能力要求主要关系如下图所示 所有岗位所需要一定的基础能力或者称为胜任能力&#xff0c;主要基础能力包括&#xff1a;数据思维能力、协调与沟通能、持续学习能力、创…

Redis入门到通关之Redis数据结构-Hash篇

文章目录 ☃️ 概述☃️底层实现☃️源码☃️其他 欢迎来到 请回答1024 的博客 &#x1f353;&#x1f353;&#x1f353;欢迎来到 请回答1024的博客 关于博主&#xff1a; 我是 请回答1024&#xff0c;一个追求数学与计算的边界、时间与空间的平衡&#xff0c;0与1的延伸的后…

【Redis】set 数据类型

文章目录 常用命令sadd & smemberssismember & scardspopsmove & srem 多个集合间的交互命令交集 & sinter & sinterstore并集 & sunion & sunionstore差集 & sdiff & sdiffstore 内部编码 集合类型也是保存多个字符串类型的元素的&#x…

文旅元宇宙平台|景区导览|数字人导游|智能导览系统

随着科技的飞速发展&#xff0c;人工智能、虚拟数字人以及元宇宙等前沿技术逐渐走进人们的日常生活&#xff0c;为各行各业带来了前所未有的变革。在这个数字化浪潮中&#xff0c;道可云文旅元宇宙平台应运而生&#xff0c;以其独特的技术应用和创新的商业模式&#xff0c;引领…

前沿论文 | LLM推理性能优化最佳实践

原文&#xff1a;安全验证 - 知乎​ 来源 题目&#xff1a;LLM Inference Performance Engineering: Best Practices 地址&#xff1a;https://www.databricks.com/blog/llm-inference-performance-engineering-best-practices 在这篇博文中&#xff0c;MosaicML工程团队分析了…

node.js-包

包的概念 包&#xff1a;将模块&#xff0c;代码&#xff0c;其他资料聚合成的一个文件夹 包分类&#xff1a; 1.项目包&#xff1a;主要用于编写项目和业务逻辑的文件夹 2.软件包&#xff1a;封装工具和方法供开发者使用&#xff08;一般使用npm管理&#xff09; 1&#…

编译支持播放H265的cef控件

接着在上次编译的基础上增加h265支持编译支持视频播放的cef控件&#xff08;h264&#xff09; 测试页面&#xff0c;直接使用cef_enhancement,里边带着的那个html即可&#xff0c;h265视频去这个网站下载elecard,我修改的这个版本参考了里边的修改方式&#xff0c;不过我的这个…