功能:
1.添加地址
controller层用到了SpringMVC中的数据绑定的对象绑定方式:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 @RequestMapping(value = "add.do", method = RequestMethod.POST) 2 @ResponseBody 3 //这里直接传shipping对象,这是SpringMVC数据绑定的对象数据绑定方式,与直接传对象中的属性是一样的效果 4 //SpringMVC会自动生成shiping对象,并把对应的属性赋值上,否则就要一一写上属性 5 //在前端传入的时候还是以属性的形式传入,只是这里SpringMVC可以自动的做转换 6 public ServerResponse add(HttpServletRequest request, Shipping shipping) { 7 String loginToken = CookieUtil.readLoginToken(request); 8 if(StringUtils.isEmpty(loginToken)) { 9 return ServerResponse.createByErrorMessage("用户未登录,无法获取当前用户的信息"); 10 } 11 String userJsonStr = RedisShardedPoolUtil.get(loginToken); 12 User user = JsonUtil.string2Obj(userJsonStr, User.class); 13 14 if(user == null) { 15 return ServerResponse.createByErrorCodeMessage(ResponseCode.NEED_LOGIN.getCode(), ResponseCode.NEED_LOGIN.getDesc()); 16 } 17 return iShippingService.add(user.getId(), shipping); 18 }
service层:
在插入完新地址后,将新地址的id返回,是用到了MyBatis自动生成主键、配置和使用:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 public ServerResponse add(Integer userId, Shipping shipping) { 2 shipping.setUserId(userId); 3 int rowCount = shippingMapper.insert(shipping); 4 if(rowCount > 0) { 5 Map result = Maps.newHashMap(); 6 //插入之后拿到shippingId 7 result.put("shippingId", shipping.getId()); 8 return ServerResponse.createBySuccess("新建地址成功", result); 9 } 10 return ServerResponse.createByErrorMessage("新建地址失败"); 11 }
sql动态实现:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <!--要在插入后能拿到主键,也就是mysql自动生成的主键,需要使用useGenerateKeys属性和keyProperty属性(字段名),这个id就会自动填充到shipping的id中--> 2 <insert id="insert" parameterType="com.mall.pojo.Shipping" useGeneratedKeys="true" keyProperty="id"> 3 insert into shipping (id, user_id, receiver_name, 4 receiver_phone, receiver_mobile, receiver_province, 5 receiver_city, receiver_district, receiver_address, 6 receiver_zip, create_time, update_time 7 ) 8 values (#{id,jdbcType=INTEGER}, #{userId,jdbcType=INTEGER}, #{receiverName,jdbcType=VARCHAR}, 9 #{receiverPhone,jdbcType=VARCHAR}, #{receiverMobile,jdbcType=VARCHAR}, #{receiverProvince,jdbcType=VARCHAR}, 10 #{receiverCity,jdbcType=VARCHAR}, #{receiverDistrict,jdbcType=VARCHAR}, #{receiverAddress,jdbcType=VARCHAR}, 11 #{receiverZip,jdbcType=VARCHAR}, now(), now() 12 ) 13 </insert>
2.删除地址
controller层实现:
传入userId,shippingId到service层。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 @RequestMapping(value = "del.do", method = RequestMethod.POST) 2 @ResponseBody 3 public ServerResponse del(HttpServletRequest request, Integer shippingId) { 4 // User user = (User) session.getAttribute(Const.CURRENT_USER); 5 6 String loginToken = CookieUtil.readLoginToken(request); 7 if(StringUtils.isEmpty(loginToken)) { 8 return ServerResponse.createByErrorMessage("用户未登录,无法获取当前用户的信息"); 9 } 10 String userJsonStr = RedisShardedPoolUtil.get(loginToken); 11 User user = JsonUtil.string2Obj(userJsonStr, User.class); 12 13 if(user == null) { 14 return ServerResponse.createByErrorCodeMessage(ResponseCode.NEED_LOGIN.getCode(), ResponseCode.NEED_LOGIN.getDesc()); 15 } 16 return iShippingService.del(user.getId(), shippingId); 17 }
service层实现:
这里不仅传入shippingId,也传入userId,是为了防止横向越权问题,如不传入userId,可能出现一个普通用户随便传入一个shippingId,就删除了地址的问题。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 public ServerResponse<String> del(Integer userId, Integer shippingId) { 2 //防止横向越权,如果这里不加userId,就有可能出现:普通用户登录之后,传一个不是自己的shippingId,而却可以更改数据库的情况 3 //所以这里要加上userId来进行匹配,避免横向越权问题 4 int resultCount = shippingMapper.deleteByShippingIdUserId(userId, shippingId); 5 if(resultCount > 0) { 6 return ServerResponse.createBySuccess("删除地址成功"); 7 } 8 return ServerResponse.createByErrorMessage("删除地址失败"); 9 }
3.更新地址
4.地址列表
使用PageHelper的简单的分页实现:
经典三步:
1)PageHelper.startPage()
2)去数据库中查询数据
3)PageInfo承接分页数据
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 public ServerResponse<PageInfo> list(Integer userId, int pageNum, int pageSize) { 2 //开始分页 3 PageHelper.startPage(pageNum, pageSize); 4 //根据userId查询该用户的所有收货地址列表 5 List<Shipping> shippingList = shippingMapper.selectByUserId(userId); 6 //将查询结果放入PageInfo中进行分页 7 PageInfo pageInfo = new PageInfo(shippingList); 8 //将pageInfo返回给前端进行显示,这次都没有转成vo啊 9 return ServerResponse.createBySuccess(pageInfo); 10 }
5.地址详情