zoukankan      html  css  js  c++  java
  • 收货地址管理模块

    功能:

    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.地址详情

  • 相关阅读:
    设计师必备:来自顶级设计师的建议清单
    Qt 控制线程的顺序执行(使用QWaitCondition,并且线程类的run函数里记得加exec(),使得线程常驻)
    Qt 模拟鼠标点击(QApplication::sendEvent(ui->pushbutton, &event0);)
    利用Qt开发跨平台APP(二)(iOS,使用Qt5.9,很详细,有截图)
    C# RESTful API
    NET架构
    一个宏实现
    初步了解 Netty
    使用Rabbit MQ消息队列
    NET CORE与Spring Boot
  • 原文地址:https://www.cnblogs.com/cing/p/7841030.html
Copyright © 2011-2022 走看看