收货地址管理模块

功能:

1.添加地址

controller层用到了SpringMVC中的数据绑定的对象绑定方式:

 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     }
View Code

service层:

在插入完新地址后,将新地址的id返回,是用到了MyBatis自动生成主键、配置和使用

 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     }
View Code

sql动态实现:

 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>
View Code

2.删除地址

controller层实现:

传入userId,shippingId到service层。

 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     }
View Code

service层实现:

这里不仅传入shippingId,也传入userId,是为了防止横向越权问题,如不传入userId,可能出现一个普通用户随便传入一个shippingId,就删除了地址的问题。

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     }
View Code

3.更新地址

4.地址列表

使用PageHelper的简单的分页实现:

经典三步:
1)PageHelper.startPage()
2)去数据库中查询数据
3)PageInfo承接分页数据

 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     }
View Code

5.地址详情

原文地址:https://www.cnblogs.com/cing/p/7841030.html