写在前面
本篇主要介绍如何实现购物车商品的全选,全反选,单选,单反选以及购物车商品数量查询等功能。
购物车商品的全选
我们打开CartController.java文件,在里面写入以下代码:
/*** * 前台购物车商品全选 * @author lenovo * */ @RequestMapping(value = "select_all. do ") //这里就是具体的每个方法的url链接 @ResponseBody //自动 序列化 json功能 public ServerResponse<CartVo> selectAll(HttpSession session){ //验证用户是否登录 User user =(User) session.getAttribute(Const.CURRENT_USER); //未登录需要用户强制登录 if(user ==null){ return ServerResponse.createByErrorCodeMessage(ResponseCode.NEED_LOGIN.getCode(),ResponseCode.NEED_LOGIN.getDesc()); } //实现我们购物车商品全选的逻辑 return iCartService.selectOrUnSelect(user.getId(),null,Const.Cart.CHECKED); }
接着打开CartServiceImpl.java文件,往里面添加如下代码:
/*** * 前台购物车商品全选或者全反选 * @author envy * */ public ServerResponse<CartVo> selectOrUnSelect(Integer userId,Integer productId,Integer checked){ cartMapper.checkedOrUncheckedProduct(userId,productId,checked); return this.list(userId); }
注意一下,之前我们最后返回的都是两行代码:
CartVo cartVo =this.getCartVoLimit(userId); return ServerResponse.createBySuccess(cartVo);
但是呢,前面我们也说过因为这两行代码已经被list进行封装了,因此现在直接调用list即可:
return this.list(userId);
看到cartMapper.checkedOrUncheckedProduct(userId,productId,checked);这行代码,我们就知道需要去CartMapper.java文件里面新增一行代码:
//注意在mybatis中使用多个参数时,需要使用param注解 int checkedOrUncheckedProduct(@Param("userId") Integer userId,@Param("productId")Integer productId,@Param("checked") Integer checked);
紧接着去CartMapper.xml文件里面新增sql查询语句:
<!--注意set多个值时,需要用逗号隔开--> <update id="checkedOrUncheckedProduct" parameterType="map"> update store_cart set checked =#{checked}, update_time =now() where user_id =#{userId} <if test="productId != null"> and product_id = #{productId} </if> </update>
有人可能要问了,你全选与全反选是不需要商品id的,那在这里写干嘛,的确是不需要,但是我们后面要实现的单选和单反选却是需要的,因此写在这里只是为了后面代码更好的复用。这也就是我们为什么将参数productId设置为null的原因。
最后打开ICartService.java文件,新增以下代码:
ServerResponse<CartVo> selectOrUnSelectAll(Integer userId,Integer productId,Integer checked); //前台购物车商品全选或者全反选,或者单选,或者单反选
接下来完成购物车商品的全反选功能,这个和全选相反,你除了需要修改控制器controller里面的代码以外,其余的代码就可以不要修改了。
购物车商品的全反选
我们打开CartController.java文件,在里面写入以下代码:
/*** * 前台购物车商品全反选 * @author lenovo * */ @RequestMapping(value = "un_select_all.do") //这里就是具体的每个方法的url链接 @ResponseBody //自动序列化json功能 public ServerResponse<CartVo> unSelectAll(HttpSession session){ //验证用户是否登录 User user =(User) session.getAttribute(Const.CURRENT_USER); //未登录需要用户强制登录 if(user ==null){ return ServerResponse.createByErrorCodeMessage(ResponseCode.NEED_LOGIN.getCode(),ResponseCode.NEED_LOGIN.getDesc()); } //实现我们购物车商品全选的逻辑 return iCartService.selectOrUnSelectAll(user.getId(),null,Const.Cart.UN_CHECKED); }
然后就可以了,是不是超级简单。
购物车商品的单选
想起我们前面做的工作了莫,这个依旧很简单,和我们购物车商品的全反选操作一样。打开CartController.java文件,在里面写入以下代码:
/*** * 前台购物车商品单选 * @author lenovo * */ @RequestMapping(value = "select_one.do") //这里就是具体的每个方法的url链接 @ResponseBody //自动序列化json功能 public ServerResponse<CartVo> selectOne(HttpSession session,Integer productId){ //验证用户是否登录 User user =(User) session.getAttribute(Const.CURRENT_USER); //未登录需要用户强制登录 if(user ==null){ return ServerResponse.createByErrorCodeMessage(ResponseCode.NEED_LOGIN.getCode(),ResponseCode.NEED_LOGIN.getDesc()); } //实现我们购物车商品单选的逻辑 return iCartService.selectOrUnSelect(user.getId(),productId,Const.Cart.CHECKED); }
说了两次,那么购物车商品的单反选,你也就知道了吧!
购物车商品的单反选
打开CartController.java文件,在里面写入以下代码:
/*** * 前台购物车商品单反选 * @author lenovo * */ @RequestMapping(value = "un_select_one.do") //这里就是具体的每个方法的url链接 @ResponseBody //自动序列化json功能 public ServerResponse<CartVo> UnSelectOne(HttpSession session,Integer productId){ //验证用户是否登录 User user =(User) session.getAttribute(Const.CURRENT_USER); //未登录需要用户强制登录 if(user ==null){ return ServerResponse.createByErrorCodeMessage(ResponseCode.NEED_LOGIN.getCode(),ResponseCode.NEED_LOGIN.getDesc()); } //实现我们购物车商品单反选的逻辑 return iCartService.selectOrUnSelect(user.getId(),productId,Const.Cart.UN_CHECKED); }
接下来完成购物车商品数量查询这个功能,这个也还是简单的。
购物车商品数量查询
这里的购物车商品数量查询是说,当你查询当前用户的购物车里面的商品数量时,假设一个商品有 8个,那么数量就是 8,我们是不按照商品种类来算,而是按数量算的,这也是目前电商的通用做法。
我们打开CartController.java文件,在里面写入以下代码:
/*** * 前台购物车商品数量查询 * @author lenovo * */ @RequestMapping(value = "get_cart_product_count.do") //这里就是具体的每个方法的url链接 @ResponseBody //自动序列化json功能 public ServerResponse<Integer> getCartProductCount(HttpSession session){ //验证用户是否登录 User user =(User) session.getAttribute(Const.CURRENT_USER); //未登录,那么就返回0 if(user ==null){ return ServerResponse.createBySuccess(0); } //实现我们购物车商品数量查询的逻辑 return iCartService.getCartProductCount(user.getId()); }
接着打开CartServiceImpl.java文件,往里面添加如下代码:
/*** * 前台购物车商品数量查询 * @author lenovo * */ public ServerResponse<Integer> getCartProductCount(Integer userId){ if(userId ==null){ return ServerResponse.createBySuccess(0); } //购物车商品数量查询 return ServerResponse.createBySuccess(cartMapper.selectCartProductCount(userId)); }
看到cartMapper.selectCartProductCount(userId)这行代码,我们就知道需要去CartMapper.java文件里面新增一行代码:
int selectCartProductCount(Integer userId);
然后去CartMapper.xml文件里面新增 sql语句 :(其中select * as count 是给它起了一个别称)
<select id="selectCartProductCount" parameterType="int" resultType="int"> select sum(quantity) as count from store_cart where user_id = #{userId} </select>
不过这样做有一个问题,就是我们前面返回的是一个int,假设我们这个sql语句最后返回的是0,而你知道Int类型是不能传给0给它的,因此可以将代码代码修改如下,使用IFNULL(sum(quantity),0),就是说默认就是0。
<select id="selectCartProductCount" parameterType="int" resultType="int"> select IFNULL(sum(quantity),0) as count from store_cart where user_id = #{userId} </select>
当然你也可以使用另一种方法,就是修改CartMapper.java文件的返回类型,修改为Integer这一也是可以的。
然后就是关于购物车模块的接口测试了,很简单,大家可以参看我提供的接口文档自行进行测试,这里就不进行了。
这样我们本篇关于如何实现购物车商品的全选,全反选,单选,单反选以及购物车商品数量查询等功能的介绍就到此为止了,感谢你的赏阅!