up:: SpringBoot电商项目购物车模块删除购物车的某个商品接口

说明:

(1) 本篇博客主要内容是开发【选中/不选中购物车的某个商品】接口;其实,这儿选中与否,就是更新购物车中该商品的selected字段的值;

(2)一个尚未解决、需要留意的疑惑: 自己并没有在实际中,开发过【电商系统】;所以,有这个疑惑:【购物车中,某个商品是否被勾选】,究竟需不需要在数据库中中增加一个字段来表征;是不是,在有的电商系统中,【购物车中,某个商品是否被勾选】这个活完全交给前端就行了?(PS:这个疑问尚未解决;目前采用本项目的做法即可;)

(3) PS:本篇博客内容,比较简单;


一:【选中/不选中购物车的某个商品】接口说明;

1.【选中/不选中购物车的某个商品】接口文档;

2.【选中/不选中购物车的某个商品】接口,在界面上的表现;

待写,项目上线后,回来补……


二:正式开发;

1.在CartController中,创建选中/不选中购物车的某个商品的方法:select()方法;

 
         /**
          * 购物车模块:选中/不选中购物车的某个商品
          * @param productId
          * @param selected
          * @return
          */
         @ApiOperation("选中/不选中购物车的某个商品")
         @PostMapping("/select")
         public ApiRestResponse select(@RequestParam("productId") Integer productId,
                                       @RequestParam("selected") Integer  selected) {
             List<CartVO> cartVOList =  cartService.selectOrNot(UserFilter.currentUser.getId(), productId,  selected);
             return ApiRestResponse.success(cartVOList);
         }

说明:

(1) url,请求方式,参数要符合接口要求;

(2) 同样,这儿出于安全考虑,防止横向越权,用户id,我们从程序中获取;

(3) 有关Service层的,选中/不选中购物车的某个商品的逻辑方法,selectOrNot()方法,在下一部分介绍;

2.在CartServiceImpl中,创建选中/不选中购物车的某个商品的逻辑方法:selectOrNot()方法;并在CartService中反向生成方法的声明;

(1)在CartServiceImpl中,创建选中/不选中购物车的某个商品的逻辑方法:selectOrNot()方法;

 
         /**
          * 选中/不选中购物车的某个商品
          * @param userId
          * @param productId
          * @param selected
          * @return
          */
         @Override
         public List<CartVO> selectOrNot(Integer userId, Integer productId, Integer selected) {
             //首先,根据userId和productId,去查一下,看购物车中是否有对应的数据
             Cart cart = cartMapper.selectCartByUserIdAndProductId(userId,  productId);
             if (cart == null) {//所以,如果购物车中没有这个商品;那么很显然,是无法选中(都没有,怎么更新其selected字段的值);于是,就抛出“更新失败”异常;
                 throw new  ImoocMallException(ImoocMallExceptionEnum.UPDATE_FAILED);
             } else {
                 //如果购物车中有这个商品,那么我们就可以正常去更新其selected字段了
                 cartMapper.selectOrNot(userId, productId, selected);
             }
             return this.list(userId);
         }

说明:

(1) 有一句话说得好,优秀的程序员之所以优秀,不仅因为其可以编写正确的逻辑,更多是其能够考虑到所有意外的情况;所以,这儿,我们就考虑到了意外的情况,并做了处理;

(2) 如果在数据中有对应的数据,那么我们就去更改选中状态;(其实就是更新selected字段);selectOrNot()方法,在下一部分介绍;

(3)一个需要特别说明的点:

● 其实但就这一个业务来说,Dao层的方法,可以这些写:

● 那么,至于为什么没有这样写,是因为:【选中/不选中购物车的某个商品接口】和【全选/全不选购物车的某个商品接口】,差不多,我们想在这两个接口中,复用一点东西,以节省点工作量;

● 自然,为此,这儿有很多种可行的策略;

● 只是,这儿我们采取的策略是:(【全选/全不选购物车的某个商品】接口在下一篇博客介绍)

● 所以,这儿我们的Dao层的方法,没有写成【selectOrNot(cart.getId(),selected);】这种传cartId的形式;而是写成了【selectOrNot(userId, productId, selected);】这种传userId和productId的形式;

● 还是那句话,为了解决同一个业务,会有很多可行的策略;我们需要做的就是,在自己能力范围内,尽量选择一个明确的、更好的策略;


(2)在CartService中反向生成方法的声明;

3.在CartMapper中定义【根据userId、ProductId、selected,更新购物车中某个商品的selected字段】的方法,selectOrNot()方法;并在CartMapper.xml中,编写实现SQL;

(1)在CartMapper中定义【根据userId、ProductId、selected,更新购物车中某个商品的selected字段】的方法,selectOrNot()方法;

 
         /**
          * 根据userId、ProductId、selected,更新购物车中某个商品的selected字段
          * @param userId
          * @param productId
          * @param selected
          * @return
          */
         Integer selectOrNot(@Param("userId") Integer userId,@Param("productId") Integer productId,
                             @Param("selected") Integer selected);

(2)在CartMapper.xml中,编写实现SQL;

 
       <update id="selectOrNot">
         update imooc_mall_cart
         set selected = #{selected}
         where user_id = #{userId}
         and product_id = #{productId}
       </update>
 

说明:

(1) 这儿的内容,见过N次了,没什么好说的;还是那句话,建议使用(“自认为”)标准的、更完美的方案;(可以参考【附加Mybatis传递多个参数时的处理策略】)


三:测试;

启动项目;