news 2026/6/8 3:22:12

苍穹外卖5月31日

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
苍穹外卖5月31日

今日主要实现了微信小程序用户端的一些功能,包括缓存菜品,缓存套餐,新增购物车,查看购物车,清空购物车。新技术,缓存套餐使用了新的注解。

一.缓存菜品(使用redistemplate对象)

步骤:

代码:

@GetMapping("/list") @ApiOperation("根据分类id查询菜品") public Result<List<DishVO>> list(Long categoryId) { //构造redis中的key String key ="dish_"+categoryId; //查看redis中是否有菜品 List<DishVO> list = (List<DishVO>) redisTemplate.opsForValue().get(key); if(list!=null&&list.size()>0) { //如果有直接返回 return Result.success(list); } //没有,查询数据库,将数据保存到redis中 Dish dish = new Dish(); dish.setCategoryId(categoryId); dish.setStatus(StatusConstant.ENABLE);//查询起售中的菜品 list = dishService.listWithFlavor(dish); redisTemplate.opsForValue().set(key,list); return Result.success(list); }

解决数据一致性:在管理端进行新增,修改,删除操作时,应把缓存中的数据删除。

package com.sky.controller.admin; import com.sky.dto.DishDTO; import com.sky.dto.DishPageQueryDTO; import com.sky.entity.Dish; import com.sky.result.PageResult; import com.sky.result.Result; import com.sky.service.DishService; import com.sky.vo.DishVO; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Set; @RestController @RequestMapping("/admin/dish") @Slf4j public class DishController { @Autowired private DishService dishService; @Autowired private RedisTemplate redisTemplate; @PostMapping public Result save(@RequestBody DishDTO dishDTO) { log.info("新增菜品,参数:{}", dishDTO); dishService.saveWithflavor(dishDTO); String key = "dish_" + dishDTO.getCategoryId(); cleanCache( key); return Result.success(); } @GetMapping("/page") public Result<PageResult> page(DishPageQueryDTO dishPageQueryDTO) { log.info("分页查询:{}", dishPageQueryDTO); PageResult pageResult = dishService.pageQuery(dishPageQueryDTO); return Result.success(pageResult); } @DeleteMapping public Result deleteById(@RequestParam List<Long> ids) { log.info("批量删除:{}", ids); dishService.delete(ids); String key = "dish_*"; cleanCache(key); return Result.success(); } @GetMapping("/{id}") public Result<DishVO> getById(@PathVariable Long id) { log.info("根据id查询菜品信息:{}", id); DishVO dishVO = dishService.getByIdWithFlavor(id); return Result.success(dishVO); } @PutMapping public Result update(@RequestBody DishDTO dishDTO) { log.info("修改菜品信息:{}",dishDTO); dishService.update(dishDTO); String key = "dish_*"; cleanCache(key); return Result.success(); } /** * 菜品起售停售 * @param status * @param id * @return */ @PostMapping("/status/{status}") public Result<String> startOrStop(@PathVariable Integer status, Long id){ dishService.startOrStop(status,id); String key = "dish_*"; cleanCache(key); return Result.success(); } /** * 根据分类id查询菜品 * @param categoryId * @return */ @GetMapping("/list") public Result<List<Dish>> list(Long categoryId){ List<Dish> list = dishService.list(categoryId); return Result.success(list); } private void cleanCache(String pattern) { Set keys = redisTemplate.keys(pattern); redisTemplate.delete(keys); } }

二.缓存套餐(使用注解)

注解

说明

@EnableCaching

开启缓存注解功能,通常加在启动类上

@Cacheable

在方法执行前先查询缓存中是否有数据,如果有数据,则直接返回缓存数据;如果没有缓存数据,调用方法并将方法返回值放到缓存中

@CachePut

将方法的返回值放到缓存中

@CacheEvict

将一条或多条数据从缓存中删除

参数key的多种写法:

一般使用与函数形参名字一样的作为key,如下面代码#setmealDTO.categoryId。

也可使用#result.id result为函数返回值。更多用法可查看源码,一般使用第一种即可,更加清晰。

代码:

@PostMapping @CacheEvict(cacheNames = "setmealCache", key = "#setmealDTO.categoryId") public Result save(@RequestBody SetmealDTO setmealDTO) { setmealService.saveWithDish(setmealDTO); return Result.success(); }

解决数据不一致性:

@DeleteMapping @CacheEvict(cacheNames = "setmealCache", allEntries = true) public Result delete(@RequestParam List<Long> ids){ setmealService.deleteBatch(ids); return Result.success(); } @PutMapping @CacheEvict(cacheNames = "setmealCache", allEntries = true) public Result update(@RequestBody SetmealDTO setmealDTO) { setmealService.update(setmealDTO); return Result.success(); } /** * 套餐起售停售 * @param status * @param id * @return */ @PostMapping("/status/{status}") @CacheEvict(cacheNames = "setmealCache", allEntries = true) public Result startOrStop(@PathVariable Integer status, Long id) { setmealService.startOrStop(status, id); return Result.success(); }

新增购物车,查看购物车,清空购物车这部分代码见gitee,采用规范controller层,services层,mapper层,根据接口文档写出。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/8 3:12:30

操作系统知识点

第一章总问题&#xff1a;&#xff08;1&#xff09;操作系统的定义、设计目标、性质、作用*&#xff08;2&#xff09;操作系统的发展过程&#xff08;3&#xff09;单道批处理系统和多道批处理系统的原理、优缺点&#xff08;4&#xff09;分时、批处理、实时系统的特征总解答…

作者头像 李华
网站建设 2026/6/8 3:05:23

数电课设救星:手把手教你用CD4511驱动数码管,搞定电子时钟的显示部分

数电课设实战指南&#xff1a;CD4511驱动数码管的原理与故障排查全解析当你在数字电路课程设计中遇到电子时钟项目时&#xff0c;最令人头疼的往往不是时钟信号的生成或计数逻辑的实现&#xff0c;而是如何让那些闪烁不定的数码管稳定、准确地显示时间。本文将带你深入理解CD45…

作者头像 李华
网站建设 2026/6/8 3:04:20

IntelliJ IDEA 项目推送到 Gitee 完整教程

每次新建项目要推送到 Gitee 时都要重新搜文章&#xff0c;索性自己整理一篇&#xff0c;以后照着做就行。 第一步&#xff1a;在 Gitee 上新建仓库 打开 Gitee&#xff0c;点击右上角的 号&#xff0c;选择「新建仓库」&#xff0c;填写仓库名称等信息后点击创建。 第二步&a…

作者头像 李华