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

iis 网站模板下载天门市网站建设seo

iis 网站模板下载,天门市网站建设seo,网站设计销售,校园综合门户网站建设方案文章目录 前言缓存菜品问题分析和实现思路缓存菜品数据清理缓存数据功能测试 SpringCache介绍入门案例 缓存套餐购物车功能添加购物车需求分析和产品原型测试 查看购物车清空购物车 前言 本章节主要是进行用户端的购物车功能开发 和redis作为mysql缓存的应用以及SpringCache的… 文章目录 前言缓存菜品问题分析和实现思路缓存菜品数据清理缓存数据功能测试 SpringCache介绍入门案例 缓存套餐购物车功能添加购物车需求分析和产品原型测试 查看购物车清空购物车 前言 本章节主要是进行用户端的购物车功能开发 和redis作为mysql缓存的应用以及SpringCache的介绍 因为很多人查询数据库会导致mysql的查询效率降低可以通过redis作为缓存来解决 实现产品原型 基本可以看出一些功能 添加购物车 查看购物车 清空购物车 以及我们进行redis应用的缓存菜品和套餐 还有一个自己的作业 就是增减购物车内商品的功能 缓存菜品 问题分析和实现思路 缓存菜品数据 这个挺简单的 就是根据redis中有无对应数据来进行操作 注意redis返回的数据类型存入时是什么取出来就是什么 redis中的string可以对应java中的任意类型 RestController(userDishController) RequestMapping(/user/dish) Slf4j Api(tags C端-菜品浏览接口) public class DishController {Autowiredprivate DishService dishService;Autowiredprivate RedisTemplate redisTemplate;/*** 根据分类id查询菜品** param categoryId* return*/GetMapping(/list)ApiOperation(根据分类id查询菜品)public ResultListDishVO list(Long categoryId) {//构造redis中的key规则: dish_分类id(以分类形式存储菜品)String key dish_categoryId;//查询redis是否存在菜品数据ListDishVO list (ListDishVO) 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);//查询起售中的菜品list dishService.listWithFlavor(dish);//如果不存在查询数据库讲查询到的数据库放入redis中redisTemplate.opsForValue().set(key,list);return Result.success(list);}}清理缓存数据 有可能我们管理端会修改/删除/新增菜品 你们上一次的查询到redis的要跟着更新 要不然sql和redis中数据不一致管理端作出的更改用户端如果还是去查redis就看不到 这里就只写 admin中DishController中修改的方法 PostMappingApiOperation(新增菜品)public Result save(RequestBody DishDTO dishDTO){log.info(新增菜品:{},dishDTO);dishService.saveWithFlavor(dishDTO);//清理缓存数据cleanCache(dish_dishDTO.getCategoryId());return Result.success();}DeleteMappingApiOperation(菜品的批量删除)public Result delete(RequestParam ListLong ids){//传参为1,2,3这种,想要mvc帮我们自动封装需要用到RequestParam否则只能字符串接收自己解析log.info(菜品批量删除:{},ids);dishService.deleteBatch(ids);//这个比较复杂所以直接全部删除 dish_*就表示以dish_开头的key//需要先将对应全部key取出然后再删除cleanCache(dish_*);return Result.success();}PutMappingApiOperation(修改菜品)public Result update(RequestBody DishDTO dishDTO) {log.info(修改菜品,对应信息为:{},dishDTO);dishService.updateWithFlavor(dishDTO);//仔细想想更改 可以设计一个分类只更改名称价格什么的 也可以涉及两个菜品分类的变更//所以这里也清理掉所有缓存cleanCache(dish_*);return Result.success();}PostMapping(/status/{status})ApiOperation(起售,停售菜品)public Result startOrStop(PathVariable Integer status,Long id){log.info(起售停售菜品:{},{},status,id);dishService.startOrStop(status,id);//这里也全部清理掉,需要查表对应分类id情况有点复杂cleanCache(dish_*);return Result.success();}这个是新增方法/*** 清理缓存数据* param pattern*/private void cleanCache(String pattern){Set keys redisTemplate.keys(pattern);redisTemplate.delete(keys);}功能测试 略 看对应更换分类后有没有sql语句输出 和修改分类菜品后对应的分类菜品情况 SpringCache 介绍 admin增删改数据只需要清除缓存CachePut是user那边查询数据时同步缓存用的 只有需要查才会放入缓存 Cacheable用于select查询 CachePut一般用于新增 CacheEvict就是用户端的更改删除等等 入门案例 导入依赖 redis和springcache 其他正常的那些依赖就不介绍了 再进行一下文件配置 controller里面提起写好了方法主要是学一下springcache 往下就是使用springcache的正常流程了 1.再springboot启动类开启缓存注解 比如这个请求 我们存储用户一般是希望同时存储到缓存中 所以我们用CachePut修饰 对应的属性 cacheNames和key是与redis中的key有关的 redis中的keycacheNames::key key一般是动态获取使不同用户对应不同key可以获取user的id 格式是 key #user(参数).id 有人可能问刚开始还没传id怎么获取对应iduser参数和user返回值是一个然后其实操作是先插入到sql数据库然后再进行缓存的mybatis进行操作返回id给user对象 也可以这样写result引用方法的返回值 其实还有很多用法 但是还是最推荐第一种 查询相关的语句先看redis有没有没有查数据库的然后存到redis中 用到Cacheable注解这里就不能用result具体可以看注解里有对应的注释说明 然后我们要查询的key就是userCache::id (因为我们新增就是用这个然后查询也要用这个可以) 删除一条数据 使用CaheEvict来进行缓存数据的删除保障数据库和缓存的数据一致性 删除所有的缓存的键值对 把key属性变为allEntries属性并且设为true 缓存套餐 改的不多 这是admin包下的setmealController RestController RequestMapping(/admin/setmeal) Api(套餐相关接口) Slf4j public class SetmealController {/*** 新增套餐*/Autowired SetmealService setmealService;PostMappingApiOperation(新增套餐)CacheEvict(cacheNames setmealCache,key #setmealDTO.categoryId)public Result save(RequestBody SetmealDTO setmealDTO){log.info(新增套餐信息:{},setmealDTO);setmealService.saveWithDish(setmealDTO);return Result.success();}/*** 根据id查询套餐* param id* return*/GetMapping(/{id})ApiOperation(根据id查询套餐)public ResultSetmealVO getById(PathVariable Long id){SetmealVO setmealVO setmealService.getByIdWithDish(id);return Result.success(setmealVO);}/*** 分页查询* param setmealPageQueryDTO* return*/GetMapping(/page)ApiOperation(分页查询)public ResultPageResult page(SetmealPageQueryDTO setmealPageQueryDTO){log.info(套餐分页查询:{},setmealPageQueryDTO);PageResult pageResult setmealService.pageQuery(setmealPageQueryDTO);return Result.success(pageResult);}/*** 批量删除套餐* param ids* return*/DeleteMappingApiOperation(批量删除套餐)CacheEvict(cacheNames setmealCache,allEntries true)public Result delete(RequestParam ListLong ids){//让Spring自动处理字符串变成集合log.info(批量删除套餐{},ids);setmealService.deleteBatch(ids);return Result.success();}/*** 修改套餐* param setmealDTO* return*/PutMappingApiOperation(修改套餐)CacheEvict(cacheNames setmealCache,allEntries true)public Result update(RequestBody SetmealDTO setmealDTO){log.info(修改套餐信息:{},setmealDTO);setmealService.update(setmealDTO);return Result.success();}/*** 套餐起售停售* param status* param id* return*/PostMapping(/status/{status})ApiOperation(套餐起售停售)CacheEvict(cacheNames setmealCache,allEntries true)public Result startOrStop(PathVariable Integer status, Long id) {setmealService.startOrStop(status, id);return Result.success();}}购物车功能 添加购物车 需求分析和产品原型 菜品设置口味数据点击的是选择规格然后才能加入购物车 未设置口味数据直接加入 套餐直接加入 设置冗余字段可以增加查询速度不用查多表查单表即可 注意点非常多代码还是挺难实现的建议仔细看看不同情况 菜品 套餐的处理 菜品有无口味如果包含该菜品/套餐需要实现数量1而不是新增操作了 设计多个表 setmeal dish 等 且可能涉及回查操作 重点就是搞清我们插入需要什么数据什么数据还没有怎么进行获取 ShoppingCartController RestController 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();} } ShoppingCartMapper Mapper public interface ShoppingCartMapper {/*** 动态条件查询* param shoppingCart* return*/ListShoppingCart 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); }对应xml文件 mapper namespacecom.sky.mapper.ShoppingCartMapperselect idlist resultTypecom.sky.entity.ShoppingCartselect * from shopping_cartwhereif testuserId ! nulland user_id #{userId}/ifif testsetmealId ! nulland setmeal_id #{setmealId}/ifif testdishId ! nulland dish_id #{dishId}/ifif testdishFlavor ! nulland dish_flavor #{dishFlavor}/if/where/select /mapper 重量级ShoppingCartServiceImpl Service Slf4j public class ShoppingCartServiceImpl implements ShoppingCartService {Autowiredprivate ShoppingCartMapper shoppingCartMapper;Autowiredprivate DishMapper dishMapper;Autowiredprivate SetmealMapper setmealMapper;/*** 添加购物车* param shoppingCartDTO*/public void addShoppingCart(ShoppingCartDTO shoppingCartDTO) {//添加购物车两种情况1.本身就在购物车里面 就让对应的number1 不是的话就添加//判断是否已经存在ShoppingCart shoppingCart new ShoppingCart();BeanUtils.copyProperties(shoppingCartDTO,shoppingCart);//还少userIdLong currentId BaseContext.getCurrentId();shoppingCart.setUserId(currentId);ListShoppingCart list shoppingCartMapper.list(shoppingCart);//如果存在只需要将数量1//实际上只能查出来一条if (list ! null list.size()0){ShoppingCart cart list.get(0);cart.setNumber(cart.getNumber()1);//update shopping_cart set number ? where id ?shoppingCartMapper.updateNumberById(cart);}else {//如果不存在只需要插入一条购物车数据//然后是插入但是插入的话前段没提供nameimage等信息所以要先查一下//菜品差菜品表套餐查套餐表//判断是菜品还是套餐Long dishId shoppingCartDTO.getDishId();if(dishId ! null){//菜品Dish dish dishMapper.getById(dishId);shoppingCart.setName(dish.getName());shoppingCart.setImage(dish.getImage());shoppingCart.setAmount(dish.getPrice());//购物车价格是amount}else {Long setmealId shoppingCartDTO.getSetmealId();Setmeal setmeal setmealMapper.getById(setmealId);shoppingCart.setName(setmeal.getName());shoppingCart.setImage(setmeal.getImage());shoppingCart.setAmount(setmeal.getPrice());//购物车价格是amount}shoppingCart.setNumber(1);//第一次添加数量肯定为1shoppingCart.setCreateTime(LocalDateTime.now());shoppingCartMapper.insert(shoppingCart);}} }测试 略 自己去把套餐和对应的菜品都添加一下再看看数量变化一个菜品两次debug看一下对应语句对不对 再去数据库检查一下 查看购物车 产品原型 接口设计 controller /*** 查看购物车* return*/GetMapping(/list)ApiOperation(查看购物车)public ResultListShoppingCart list(){ListShoppingCart list shoppingCartService.showShoppingCart();return Result.success(list);} }ShoppingCartServiceImpl /*** 查看购物车* return*/public ListShoppingCart showShoppingCart() {Long id BaseContext.getCurrentId();ListShoppingCart list shoppingCartMapper.list(ShoppingCart.builder().userId(id).build());return list;} } mapper的list是用之前的定义的方法所以没有mapper层 自己测试 清空购物车 controller /*** 清空购物车* return*/ApiOperation(清空购物车)DeleteMapping(/clean)public Result clean(){shoppingCartService.cleanShoppingCart();return Result.success();} } service /*** 清空购物车数据*/public void cleanShoppingCart() {Long id BaseContext.getCurrentId();shoppingCartMapper.deleteByUserId(id);} } Mapper /*** 清空购物车* param id*/Delete(delete from shopping_cart where user_id-#{id})void deleteByUserId(Long id); }自己测试
http://www.w-s-a.com/news/927697/

相关文章:

  • 阿里云上传的网站 服务器路径试用网站开发
  • 做美食原创视频网站网站开发要多钱
  • 怎么做网站作业哪个网站可兼职做logo
  • asp网站搭建教程做网站备案完成之后需要干什么
  • 无锡外贸网站开发兰州网站在哪备案
  • 广州百度网站建设公司天津建设电工证查询网站
  • 网站建设与管理行业发展情况制作网页动态效果
  • wordpress 特色缩略图临沂seo全网营销
  • 隆昌市住房和城乡建设厅网站做网站用什么字体比较好
  • 惠州网站建设设计18款未成年禁用软件ap入口
  • 班级网站 建设目标如何做好网站建设内容的策划书
  • 网站建设与网页设计期末考试清博舆情系统
  • plone网站开发商城网站建设怎么收费
  • 旺旺号查询网站怎么做公司门户网站项目模版
  • 网站免费一站二站四站上海网站怎么备案表
  • 漫画交流网站怎么做开发微信小程序公司
  • 网站建设马鞍山怎么建立局域网网站
  • 开源 网站开发框架哪些网站可以做图片链接
  • 大良制作网站网站设计的能力要求
  • 前端设计除了做网站还能做什么江苏高校品牌专业建设工程网站
  • 做二手房产网站多少钱用户权限配置wordpress
  • 做亚马逊网站需要租办公室吗小型企业网站模板
  • 网站全屏视频怎么做个人公司注册网上申请
  • 如何k掉别人的网站搜索引擎优化与关键词的关系
  • 百度推广 网站吸引力做网站开发的薪酬怎么样
  • js网站开发工具软件营销方案
  • 做网站的天空网云南省建设厅网站怎么进不去
  • 天津网站排名提升网络营销推广策略包括哪些
  • 网站建设与管理 ppt网站打开是别人的
  • 图片网站怎么做排名怎么分析一个网站seo