苍穹外卖-day07- 缓存菜品- 缓存套餐- 添加购物车- 查看购物车- 清空购物车

1. 缓存菜品

用redis来缓存菜品数据, 因为每次查询数据库就会造成一次压力

缓存逻辑:

 每个分类下的菜品保存一份缓存数据

数据库中的菜品有变化的时候,清理缓存数据

清除缓存功能

      为了保证数据的一致性,相当于数据库中的数据和页面中从缓存中取的数据是相同的,在数据库中的数据进行变动的时候,需要清除缓存中的数据(新增,删除,修改,起售,停售菜品都是需要清除缓存的)。

为了在crud方法中进行清除缓存,直接提一个方法出来。

缓存套餐功能 Spring Cache

springcache是spring框架开发的一个缓存的框架它支持redis的缓存

先让我们看看springcache中常用的注解

注解一般放在Controller的方法上,@CachePut 注解一般有两个参数,第一个时存储的名称,第二个时名称后边的key,使用SpEL动态的计算key。其余的注解也都是这两个参数。在用户端的查询操作需要使用@Cacheable,服务器端的增删改都使用@CacheEvict

具体请参考:原文链接:https://blog.youkuaiyun.com/ros275229/article/details/136232825
添加购物车功能

     添加购物车时,需要先判断数据库中是否有相同菜品,如果有的,就将其数量字段更新为加一,如果没有就直接插入,插入的时候,先判断是菜品还是套餐。

Controller

Service

Impl

  @Override
    public void addShopPingCart(ShoppingCartDTO shoppingCartDTO) {
        ShoppingCart shoppingCart = new ShoppingCart();
        BeanUtils.copyProperties(shoppingCartDTO, shoppingCart);
        shoppingCart.setUserId(BaseContext.getCurrentId());
//先查这个人有没有购物车(未结算)
//        boolean flage_Dish=false;//默认这个购物车内没找到该菜品或套餐
//        boolean flage_Setmeal=false;//默认这个购物车内没找到该菜品或套餐
        //公共部分
        List<ShoppingCart> shoppingCartList = shoppingCartMapper.checkShoppingCartList(shoppingCart);
            if (shoppingCartList != null && shoppingCartList.size() == 1) {
                //如果已经存在,就更新数量,数量加1
                shoppingCart = shoppingCartList.get(0);
                shoppingCart.setNumber(shoppingCart.getNumber() + 1);
                shoppingCartMapper.updateShoppingCart(shoppingCart);
            } else {
                //如果不存在,插入数据,数量就是1

                //判断当前添加到购物车的是菜品还是套餐
                Long dishId = shoppingCartDTO.getDishId();
                //判断菜品id是否为空
                if (dishId != null) {
                    //添加到购物车的是菜品
                    insertDish(shoppingCart);
                } else {
                    //添加到购物车的是套餐
                    insertSetmeal(shoppingCart);
                }
                shoppingCart.setCreateTime(LocalDateTime.now());
                shoppingCart.setNumber(1);
                shoppingCartMapper.insert(shoppingCart);
            //查到有该用户的购物车,直接给数量加1,即使判断了套餐或菜品无意义
//            for (ShoppingCart cart : shoppingCartList) {
//                if (shoppingCart.getDishId() != null) {
//                    if (cart.getDishId() == shoppingCart.getDishId()) {
//                        //查出来的菜品id等于购物车的货物id,或套餐id==货物id
//                        flage_Dish=true;
//                        cart.setNumber(cart.getNumber() + 1);
//                        shoppingCartMapper.updateShoppingCart(cart);
//                    }
//                } if (shoppingCart.getSetmealId() != null) {
//                    if (cart.getSetmealId() == shoppingCart.getSetmealId()) {
//                        flage_Setmeal=true;
//                        cart.setNumber(cart.getNumber() + 1);
//                        shoppingCartMapper.updateShoppingCart(cart);
//                    }
//                }
//            }
//            if (flage_Dish==false){
//                insertDish(shoppingCart);
//                shoppingCart.setCreateTime(LocalDateTime.now());
//                shoppingCart.setNumber(1);
//                shoppingCartMapper.insert(shoppingCart);
//            }
//            if (flage_Setmeal==false){
//                insertSetmeal(shoppingCart);
//                shoppingCart.setCreateTime(LocalDateTime.now());
//                shoppingCart.setNumber(1);
//                shoppingCartMapper.insert(shoppingCart);
//            }
            //如果没找到就新增
            }
//        else {
//            //判断是否未菜品
//            if (shoppingCart.getDishId() != null) {
//                //通过dishid查菜品获得字段
//                insertDish(shoppingCart);
//                //判断是否未套餐
//            } else if (shoppingCart.getSetmealId() != null) {
//                insertSetmeal(shoppingCart);
//            }
            //执行插入。菜品获或者套餐

//        }
    }

查看购物车功能:

 Controller

Service

Impl

Mapper

Mapper.xml

清空购物车功能:

Controller

Service

Impl

Mapper

Mapper.xml

<think>好的,我现在需要解决用户提到的苍穹外卖系统中启用或禁用员工账号失败的问题。根据用户提供的引用内容,我需要先理解相关的代码和数据库结构,然后分析可能的问题原因。 首先,用户引用了EmployeeController中的startOrStop方法,这个方法处理启用和禁用账号的请求。代码路径是POST "/status/{status}",接收状态和员工ID。这里需要确认是否正确接收参数,是否有日志输出。根据代码中的日志记录,如果日志没有正确打印参数,可能参数绑定有问题,比如路径变量status是否正确映射,或者id是否通过请求参数传递。 接着,查看用户表设计,特别是status字段是int类型,允许1和0。如果数据库中的status字段类型不符,或者字段名有误,可能导致更新失败。例如,字段名是否确实是status,是否存在拼写错误。 然后,引用了updateEmp方法,这是一个PUT请求,用于更新员工信息。虽然startOrStop可能调用了不同的服务方法,但需要确认employeeService.startOrStop的实现是否正确,比如是否执行了正确的SQL更新语句,是否处理了异常情况,比如员工ID不存在。 可能的错误点包括:参数绑定不正确,如路径变量与方法参数名称不匹配;SQL语句错误,如字段名或表名错误;事务管理问题导致更新未提交;权限问题,如数据库用户没有更新权限;或者前端传递的参数格式不正确,比如id是否为Long类型。 需要逐步排查:首先检查日志输出,确认参数是否正确传递;然后检查SQL语句是否正确,是否有语法错误;接着验证数据库连接和权限;最后确认前端请求是否符合预期,比如是否传递了正确的id和status值。</think>### 逐步排查与解决方案 #### 1. **检查请求参数绑定** - **问题现象**:日志未输出正确参数值,或返回参数错误提示 - **解决方法**: - 确认路径变量`{status}`与`@PathVariable`参数名一致 - 检查前端是否通过`URL参数`或`请求体`传递`id`(根据代码应为URL参数) - 添加参数校验逻辑: ```java if(id == null || id <= 0){ return Result.error("非法ID"); } ``` #### 2. **验证SQL执行情况** - **问题现象**:日志显示执行SQL但数据库未更新 - **解决方法**: - 检查`employeeService.startOrStop`中SQL语句: ```sql UPDATE employee SET status = #{status} WHERE id = #{id} ``` - 确认数据库字段名是否为`status`(注意大小写敏感问题) - 添加SQL执行结果日志: ```java int affectedRows = employeeMapper.updateStatus(status, id); log.info("更新影响行数:{}", affectedRows); ``` #### 3. **事务与异常处理** - **问题现象**:控制台报错但无业务提示 - **解决方法**: - 添加事务注解保证原子性: ```java @Transactional public void startOrStop(Integer status, Long id) { //... } ``` - 捕获并处理异常: ```java try { employeeMapper.updateStatus(status, id); } catch (DataAccessException e) { log.error("数据库操作异常", e); throw new BusinessException("账号状态更新失败"); } ``` #### 4. **数据一致性验证** - **问题现象**:状态值不符合预期(如出现2、3等非法值) - **解决方法**: ```java if(status != 0 && status != 1){ throw new IllegalArgumentException("非法状态码"); } ``` #### 5. **前端联调验证** - **典型错误场景**: - 请求路径错误:未使用`/employee/status/1?id=1001`格式 - 请求方式错误:误用GET代替POST - 参数格式错误:传递字符串类型的id值 ### 补充验证步骤 1. **查看MyBatis日志**: 在`application.yml`中开启SQL日志: ```yaml logging.level.com.xxx.mapper: debug ``` 2. **数据库锁排查**: 检查是否出现行锁: ```sql SHOW OPEN TABLES WHERE In_use > 0; ``` ### 典型错误案例 **案例1**:前端传递`id=“1001”`(字符串类型) - **现象**:控制台报`NumberFormatException` - **修复**:前端改为传递数字类型 **案例2**:字段误写为`stats` - **现象**:SQL执行成功但数据未更新 - **修复**:修正字段名为`status` ### 最终代码优化建议 ```java @PostMapping("/status/{status}") @ApiOperation("启用禁用员工账号") public Result startOrStop( @PathVariable @Range(min = 0, max = 1, message = "状态值非法") Integer status, @RequestParam @Min(1) Long id) { if (employeeService.checkAdmin(id)) { return Result.error("管理员账号不可禁用"); } return Result.success(employeeService.updateStatus(status, id)); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值