当前位置: 首页 > wzjs >正文

招聘预算网站怎么做在线培训平台

招聘预算网站怎么做,在线培训平台,代做财务报表分析网站,WordPress可以做社交网站嘛2-12 缓存菜品&缓存套餐 02 02-缓存菜品_问题分析和实现思路 实现思路: 03 03-缓存菜品_代码开发_缓存菜品数据 代码实现如下: 改造了查询菜品的方法 /*** 根据分类id查询菜品* param categoryId* return*/GetMapping("/list")ApiOperat…

2-12 缓存菜品&缓存套餐

02 02-缓存菜品_问题分析和实现思路

实现思路:

03 03-缓存菜品_代码开发_缓存菜品数据

代码实现如下:

改造了查询菜品的方法

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

写这段代码的时候一定要看清楚啊,别像我一样傻乎乎的就在admincontroller中修改了

可以看到我们的菜品数据确实存储在了redis中了。

04 04-缓存菜品_代码开发_清理缓存数据

我们虽然将数据存储在缓存中,实实在在的解决了我们高频次用户访问会导致的频繁访问数据库的问题,但是也会出现一个很重要的问题:如果我们在管理端修改了菜品数据,但是没有清理缓存,我们修改后的菜品数据是无法正常上传给用户端的。所以:

我们对菜品管理接口中涉及到数据库修改的方法进行了清楚redis缓存的处理,操作代码如下:

import java.util.List;
import java.util.Set;@RequestMapping("/admin/dish")
@RestController
@Api(tags = "菜品管理接口")
@Slf4j
public class DishController {@Autowiredprivate DishService dishService;@Autowiredprivate RedisTemplate redisTemplate;/*** 新增菜品* @param dishDTO* @return*/@ApiOperation("新增菜品")@PostMappingpublic Result save(@RequestBody DishDTO dishDTO) {log.info("新增菜品:{}", dishDTO);dishService.saveWithFlavor(dishDTO);//清理当前缓存数据String key="dish_"+dishDTO.getCategoryId();clearCache(key);return Result.success();}/*** 菜品分页查询* @param dishPageQueryDTO* @return*/@ApiOperation("菜品分页查询")@GetMapping("/page")public Result<Object> page(DishPageQueryDTO dishPageQueryDTO) {log.info("菜品分页查询:{}", dishPageQueryDTO);PageResult pageResult =dishService.pageQuery(dishPageQueryDTO);return Result.success(pageResult);}/*** 批量删除菜品* @param ids* @return*/@ApiOperation("批量删除菜品")@DeleteMappingpublic Result delete(@RequestParam List<Long> ids) {log.info("批量删除菜品:{}", ids);dishService.deleteBatch(ids);// 清理所有菜品的缓存数据clearCache("dish_*");return Result.success();}/*** 根据id查询菜品* @param id* @return*/@ApiOperation("根据菜品id查询菜品")@GetMapping("/{id}")public Result<DishVO> getById(@PathVariable Long id) {log.info("根据菜品id查询菜品:{}", id);DishVO dishVO = dishService.getByIdWithFlavor(id);return Result.success(dishVO);}/*** 修改菜品* @param dishDTO* @return*/@ApiOperation("修改菜品")@PutMappingpublic Result update(@RequestBody DishDTO dishDTO) {log.info("修改菜品:{}", dishDTO);dishService.update(dishDTO);//清理全部缓存clearCache("dish_*");return Result.success();}/*** 控制起售停售* @param status* @param id* @return*/@ApiOperation("控制起售停售")@PostMapping("/status/{status}")public Result<String> startOrStop(@PathVariable("status") Integer status, Long id) {log.info("控制起售停售:{},{}", status, id);dishService.startOrStop(status, id);return Result.success();}/*** 根据分类id查询菜品* @param categoryId* @return*/@GetMapping("/list")@ApiOperation("根据分类id查询菜品")public Result<List<Dish>> list(Long categoryId){List<Dish> list = dishService.list(categoryId);return Result.success(list);}/*** 清理缓存* @param pattern*/private void clearCache(String pattern){Set keys = redisTemplate.keys(pattern);redisTemplate.delete(keys);}}

测试结果成功,修改菜品后redis的缓存被清除!

06 06-缓存套餐_Spring Cache_介绍和常用注解

 使用这个需要存在依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId></dependency>

 使用测试:使用前记得在启动类上加@EnableCaching



@CachePut注解:

这五种格式都可以,都是在获取第一个形参中的id值作为生成唯一key的要素。

生成的格式就是cachename加两个冒号加key

冒号相当于是创建了子包,他们是一个树形的关系。双冒号不是这个作用哦。

@Cacheable注解:

这个注解在使用后其实是会自动生成一个代理对象,然后用这个代理对象去查询redis看有无数据缓存,如果有是不需要调用方法体的,会直接使用缓存,如果没有,在方法体完成查询返回的时候,会把数据缓存在redis中。

@CacheEvict注解:

删除单条:

这里使用key=#id,用于获取指定id删除指定缓存。

删除多条:

这里不再使用key,使用allentrie=true

用途在于,删除userCache下的所有缓存。如下图,都将被删除:

04 11-缓存套餐_代码开发

1,在启动类上加入@EnableCaching注解开启缓存注解功能:(略)

2,在用户端接口setmealcontroller中的list方法上加上@Chacheable注解: 

 /*** 条件查询** @param categoryId* @return*/@Cacheable(cacheNames = "setmealCache", key = "#categoryId")@GetMapping("/list")@ApiOperation("根据分类id查询套餐")public Result<List<Setmeal>> list(Long categoryId) {Setmeal setmeal = new Setmeal();setmeal.setCategoryId(categoryId);setmeal.setStatus(StatusConstant.ENABLE);List<Setmeal> list = setmealService.list(setmeal);return Result.success(list);}

3, 在管理端接口SetmealController的save,delete,update,startOrStop等方法上加入CacheEvict注解:

@RestController
@Api(tags="套餐相关接口")
@RequestMapping("/admin/setmeal")
@Slf4j
public class SetmealController {@Autowiredprivate SetmealService setmealService;/*** 新增套餐* @param setmealDTO* @return*/@CacheEvict(value = "setmealCache",key = "#setmealDTO.categoryId")@PostMapping@ApiOperation("新增套餐")public Result save(@RequestBody SetmealDTO setmealDTO) {setmealService.saveWithDish(setmealDTO);return Result.success();}/*** 套餐分页查询* @param* @return*/@ApiOperation("套餐分页查询")@GetMapping("/page")public Result<Object> page(SetmealPageQueryDTO setmealPageQueryDTO) {log.info("菜品分页查询:{}", setmealPageQueryDTO);PageResult pageResult =setmealService.pageQuery(setmealPageQueryDTO);return Result.success(pageResult);}/*** 批量删除套餐* @param ids* @return*/@CacheEvict(value = "setmealCache",allEntries = true)@ApiOperation("批量删除套餐")@DeleteMappingpublic Result delete(@RequestParam List<Long> ids) {log.info("批量删除套餐,ids:{}", ids);setmealService.deleteBatch(ids);return Result.success();}/*** 根据id查询套餐* @param id* @return*/@ApiOperation("根据id查询套餐")@GetMapping("/{id}")public Result<SetmealVO> getById(@PathVariable Long id) {log.info("根据id查询套餐:{}", id);SetmealVO setmealVO = setmealService.getByIdWithDish(id);return Result.success(setmealVO);}/***  修改套餐* @param setmealDTO* @return*/@CacheEvict(value = "setmealCache",allEntries = true)@ApiOperation("修改套餐")@PutMappingpublic Result update(@RequestBody SetmealDTO setmealDTO) {log.info("修改套餐:{}", setmealDTO);setmealService.update(setmealDTO);return Result.success();}/*** 套餐起售、停售* @param status* @param id* @return*/@CacheEvict(value = "setmealCache",allEntries = true)@ApiOperation("套餐起售、停售")@PostMapping("/status/{status}")public Result<String> startOrStop(@PathVariable("status") Integer status, Long id) {log.info("控制起售停售:{},{}", status, id);setmealService.startOrStop(status, id);return Result.success();}}

 记得测试的时候确定一下自己的套餐到底有没有起售,默认都是为起售的状态。

正常状态如上图,调整套餐状态或修改删除之后:

可以看到缓存确实有被删除。代码开发成功。

2-13 添加购物车

这里设定了冗余字段,作用是让我们不必进行多表查询去获取冗余字段的值,单表查询就可以了。

冗余字段不建议大量使用,且可以作为冗余字段的值应该是不易轻易更改的,稳定的值。

01 14-添加购物车_代码开发

1,做条件判断,实现添加购物车的时候需要先查询购物车当中到底有无当前数据,如果有则执行修改操作,让其数量加一,如果没有则开始添加商品到购物车。

这时候问题就来了。我们需要做查询的sql语法有很多条,

比如传输的是套餐id,我们就要根据套餐id查询。

如果传输的是菜品id,我们就需要通过菜品id查询。

如果传输的菜品口味不同,也不能按照购物车已有数据来处理。所以可能还需要查询到口味

所以我们尝试使用动态sql去处理这个问题

    <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></where></select>

核心代码实现如下:

    /*** 添加购物车* @param shoppingCartDTO* @return*/@ApiOperation("添加购物车")@RequestMapping("/add")public Result add(@RequestBody ShoppingCartDTO shoppingCartDTO) {log.info("添加购物车:{}", shoppingCartDTO);shoppingCartService.add(shoppingCartDTO);return Result.success();}/*** 添加购物车* @param shoppingCartDTO* @return*/@Overridepublic void add(ShoppingCartDTO shoppingCartDTO) {// 获取当前登录用户id,用id获取对应用户的购物车ShoppingCart shoppingCart = new ShoppingCart();BeanUtils.copyProperties(shoppingCartDTO, shoppingCart);Long userId = BaseContext.getCurrentId();//拦截器中有拦截,可以获取当前用户idshoppingCart.setUserId(userId);List<ShoppingCart> list = shoppingCartMapper.list(shoppingCart);//判断购物车中是否有该菜品或套餐if (list != null && list.size() > 0){//如果存在,数量加1ShoppingCart cart = list.get(0);cart.setNumber(cart.getNumber() + 1);//购物车中数量加1,然后要将数据保存到数据库中shoppingCartMapper.updateNumberById(cart);}else {//如果不存在,添加到购物车//判断当前添加的是菜品还是套餐Long dishId = shoppingCartDTO.getDishId();if (dishId != null){//当前添加的是菜品Dish dish = dishMapper.getById(dishId);//补充获取dishdto中没有的属性shoppingCart.setName(dish.getName());shoppingCart.setImage(dish.getImage());shoppingCart.setAmount(dish.getPrice());}else {//当前添加的是套餐//获取套餐信息,补充获取dishdto中没有的属性Long setmealId = shoppingCartDTO.getSetmealId();Setmeal setmeal = setmealMapper.getByIds(setmealId);shoppingCart.setName(setmeal.getName());shoppingCart.setImage(setmeal.getImage());shoppingCart.setAmount(setmeal.getPrice());}//插入公共数据shoppingCart.setNumber(1);shoppingCart.setCreateTime(LocalDateTime.now());//统一插入数据shoppingCartMapper.insert(shoppingCart);}}

05 18-查看购物车

代码实现如下:

  /***  查看购物车* @return*/@ApiOperation("查看购物车")@GetMapping("/list")public Result<List<ShoppingCart>> list(){List<ShoppingCart> list = shoppingCartService.showShoppingCart();return Result.success(list);}/***  查看购物车* @return*/@Overridepublic List<ShoppingCart> showShoppingCart() {//获取当前用户idLong userId = BaseContext.getCurrentId();ShoppingCart shoppingCart = ShoppingCart.builder().userId(userId).build();List<ShoppingCart> list = shoppingCartMapper.list(shoppingCart);return list;}

测试结果如下:

06 19-清空购物车

 核心也就是这一个sql了,没什么区别

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

测试成功:

 

http://www.dtcms.com/wzjs/520562.html

相关文章:

  • 网站关键词优化怎么做竞价托管运营哪家好
  • 网站建设云麒麟seo外推软件
  • 竞价页面网站做优化百度搜一搜
  • 成都网站制作龙兵科技公司网站设计图
  • 外贸公司都是在什么网站做推广搜索引擎优化的英文缩写是什么
  • 网站怎样绑定域名访问可以搜任何网站的浏览器
  • 兰州建设工程信息网站免费网站提交入口
  • 建站公司网站用什么好自媒体营销
  • 管理咨询公司能给接受咨询企业提供资金支持吗班级优化大师功能介绍
  • 做响应式的网站成品短视频网站源码搭建
  • easyui 做的网站温州seo团队
  • 网络存储上做网站广东seo排名
  • 网站备案大概需要多久怎么创建网站平台
  • 临沂做企业网站百度客户端电脑版
  • 网页设计一般一个月工资多少旺道网站排名优化
  • 网站建设的er图怎么画网店seo是什么意思
  • 网站技术开发设计广州seo外包公司
  • 平台做的h5如何嫁接到网站新手怎么入行seo
  • 重庆手机网站建设seoapp推广
  • 淮安做网站找哪家公司网络推广公司名字
  • 自动网站建设系统cmsseo值是什么意思
  • 中文网站什么意思中国十大教育培训机构有哪些
  • 国家公务员局seo是啥
  • 个人做网站需要多少钱推广网站排名
  • 哪个网站做推广效果好买卖链接网站
  • 沈阳网站建设方案外包抖音seo排名系统哪个好用
  • 三网合一网站开源培训网站有哪些
  • 济南网站设计建设正规推广赚佣金的平台
  • 人个做外贸用什么网站好沈阳网站制作推广
  • 公司做的网站入哪个会计科目企业推广宣传方案