说明:
(1)本篇博客主要内容是开发【选中/不选中购物车的某个商品】接口;其实,这儿选中与否,就是更新购物车中该商品的selected字段的值;
(2)一个尚未解决、需要留意的疑惑:自己并没有在实际中,开发过【电商系统】;所以,有这个疑惑:【购物车中,某个商品是否被勾选】,究竟需不需要在数据库中中增加一个字段来表征;是不是,在有的电商系统中,【购物车中,某个商品是否被勾选】这个活完全交给前端就行了?(PS:这个疑问尚未解决;目前采用本项目的做法即可;)
(3)PS:本篇博客内容,比较简单;
目录
一:【选中/不选中购物车的某个商品】接口说明;
1.【选中/不选中购物车的某个商品】接口文档;
2.【选中/不选中购物车的某个商品】接口,在界面上的表现;
二:正式开发;
1.在CartController中,创建选中/不选中购物车的某个商品的方法:select()方法;
2.在CartServiceImpl中,创建选中/不选中购物车的某个商品的逻辑方法:selectOrNot()方法;并在CartService中反向生成方法的声明;
(1)在CartServiceImpl中,创建选中/不选中购物车的某个商品的逻辑方法:selectOrNot()方法;
(2)在CartService中反向生成方法的声明;
3.在CartMapper中定义【根据userId、ProductId、selected,更新购物车中某个商品的selected字段】的方法,selectOrNot()方法;并在CartMapper.xml中,编写实现SQL;
(1)在CartMapper中定义【根据userId、ProductId、selected,更新购物车中某个商品的selected字段】的方法,selectOrNot()方法;
(2)在CartMapper.xml中,编写实现SQL;
三:测试;
一:【选中/不选中购物车的某个商品】接口说明;
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传递多个参数时的处理策略;(包括:是否使用@Param注解,parameterType=“”的使用,使用Map或者List接收;)】)?
三:测试;
启动项目;
……………………………………………………
|