实战SSM_O2O商铺_34【商品】商品编辑之Controller层的实现

简介: 实战SSM_O2O商铺_34【商品】商品编辑之Controller层的实现

概述


在完成了 实战SSM_O2O商铺_33【商品】商品编辑之Service层的实现之后,我们继续来实现Controller层的代码部分。

主要逻辑:

  • 根据前端url中productId ,调用service层的接口获取product信息,以便前端能在商品编辑页面展示对应的数据
  • 修改商品

ProductController

/**
   * 
   * 
   * @Title: getProductById
   * 
   * @Description: 因为只需要传入productId,使用@RequestParam注解。
   *               同时也无需传入HttpServletRequest,用不到
   * 
   *               根据页面原型,不仅要加载prodcut的信息,还需要加载对应的目录信息。
   * 
   * @param productId
   * 
   * @return: Map<String,Object>
   */
  @RequestMapping(value = "/getproductbyid", method = RequestMethod.GET)
  @ResponseBody
  public Map<String, Object> getProductById(@RequestParam long productId) {
    Map<String, Object> modelMap = new HashMap<String, Object>();
    if (productId > -1) {
      Product product = productService.queryProductById(productId);
      List<ProductCategory> productCategoryList = productCategoryService.queryProductCategoryList(product.getShop().getShopId());
      modelMap.put("product", product);
      modelMap.put("productCategoryList", productCategoryList);
      modelMap.put("success", true);
    } else {
      modelMap.put("success", false);
      modelMap.put("errMsg", "empty pageSize or pageIndex or shopId");
    }
    return modelMap;
  }
@RequestMapping(value = "/modifyproduct", method = RequestMethod.POST)
  @ResponseBody
  private Map<String, Object> modifyProduct(HttpServletRequest request) {
    Map<String, Object> modelMap = new HashMap<String, Object>();
    if (!VerifyCodeUtil.verifyCode(request)) {
      modelMap.put("success", false);
      modelMap.put("errMsg", "输入了错误的验证码");
      return modelMap;
    }
    Product product = null;
    // 接收前端传递过来的product
    String productStr = null;
    // 商品图片缩略图(输入流和名称的封装类)
    ImageHolder thumbnail = null;
    // 将HttpServletRequest转型为MultipartHttpServletRequest,可以很方便地得到文件名和文件内容
    MultipartHttpServletRequest multipartHttpServletRequest = null;
    // 接收商品缩略图
    CommonsMultipartFile thumbnailFile = null;
    // 接收商品详情图片
    List<ImageHolder> productDetailImgList = new ArrayList<ImageHolder>();
    // 创建一个通用的多部分解析器
    CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
    // Step2: 使用FastJson提供的api,实例化Product 构造调用service层的第一个参数
    ObjectMapper mapper = new ObjectMapper();
    // 获取前端传递过来的product,约定好使用productStr
    try {
      productStr = HttpServletRequestUtil.getString(request, "productStr");
      product = mapper.readValue(productStr, Product.class);
    } catch (Exception e) {
      modelMap.put("success", false);
      modelMap.put("errMsg", e.toString());
      return modelMap;
    }
    // Step3: 商品缩略图 和 商品详情图 构造调用service层的第二个参数和第三个参数
    try {
      // 判断 request 是否有文件上传,即多部分请求
      if (commonsMultipartResolver.isMultipart(request)) {
        // 将request转换成多部分request
        multipartHttpServletRequest = (MultipartHttpServletRequest) request;
        // 得到缩略图的CommonsMultipartFile ,和前端约定好使用thumbnail 传递
        // ,并构建ImageHolder对象
        thumbnailFile = (CommonsMultipartFile) multipartHttpServletRequest.getFile("thumbnail");
        // 转化为ImageHolder,使用service层的参数类型要求
        thumbnail = new ImageHolder(thumbnailFile.getInputStream(), thumbnailFile.getOriginalFilename());
        // 得到 商品详情的列表,和前端约定使用productImg + i 传递 ,并构建ImageHolder对象
        for (int i = 0; i < IMAGEMAXCOUNT; i++) {
          CommonsMultipartFile productDetailImgFile = (CommonsMultipartFile) multipartHttpServletRequest.getFile("productImg" + i);
          if (productDetailImgFile != null) {
            ImageHolder productDetailImg = new ImageHolder(productDetailImgFile.getInputStream(), productDetailImgFile.getOriginalFilename());
            productDetailImgList.add(productDetailImg);
          } else {
            // 如果从请求中获取的到file为空,终止循环
            break;
          }
        }
      } else {
        modelMap.put("success", false);
        modelMap.put("errMsg", "上传图片不能为空");
        return modelMap;
      }
    } catch (Exception e) {
      e.printStackTrace();
      modelMap.put("success", false);
      modelMap.put("errMsg", e.toString());
      return modelMap;
    }
    // Step4 调用Service层
    if (product != null && thumbnailFile != null && productDetailImgList.size() > 0) {
      try {
        // 从session中获取shop信息,不依赖前端的传递更加安全
        Shop currentShop = (Shop) request.getSession().getAttribute("currentShop");
        product.setShop(currentShop);
        // 调用addProduct
        ProductExecution pe = productService.modifyProduct(product, thumbnail, productDetailImgList);
        if (pe.getState() == ProductStateEnum.SUCCESS.getState()) {
          modelMap.put("success", true);
        } else {
          modelMap.put("success", false);
          modelMap.put("errMsg", pe.getStateInfo());
        }
      } catch (ProductOperationException e) {
        modelMap.put("success", false);
        modelMap.put("errMsg", e.toString());
        return modelMap;
      }
    } else {
      modelMap.put("success", false);
      modelMap.put("errMsg", "请输入商品信息");
    }
    return modelMap;
  }
  /**
   * 
   * 
   * @Title: changeStatus
   * 
   * @Description: 标注@ResponseBody将返回的model解析为json
   * 
   * @param request
   * @return
   * 
   * @return: Map<String,Object>
   */
  @RequestMapping(value = "/changestatus",method = RequestMethod.POST)
  @ResponseBody
  public Map<String, Object> changeStatus(HttpServletRequest request) {
    Map<String, Object> modelMap = new HashMap<String, Object>();
    ObjectMapper mapper = new ObjectMapper();
    // 获取前端传递过来的product,约定好使用productStr
    try {
      String productStr = HttpServletRequestUtil.getString(request, "productStr");
      Product product = mapper.readValue(productStr, Product.class);
      Shop tempShop = (Shop) request.getSession().getAttribute("currentShop");
      product.setShop(tempShop);
      ProductExecution pe = productService.modifyProduct(product, null, null);
      if (pe.getState() == ProductStateEnum.SUCCESS.getState()) {
        modelMap.put("success", true);
        modelMap.put("errMsg", "操作成功");
      } else {
        modelMap.put("success", false);
        modelMap.put("errMsg", pe.getStateInfo());
      }
    } catch (Exception e) {
      modelMap.put("success", false);
      modelMap.put("errMsg", e.toString());
      return modelMap;
    }
    return modelMap;
  }


单元测试


启动tomcat,我们对getProductById方法进行单元测试。modifyProduct方法待前端开发完成后一并测试。

根据路由规则访问

http://localhost:8080/o2o/shopadmin/getproductbyid?productId=7

20180702054600442.png


{
    "product": {
        "productId": 7,
        "productName": "offical_product",
        "productDesc": "product offical desc",
        "imgAddr": "\\upload\\item\\shopImage\\5\\2018070100324625530.jpg",
        "normalPrice": "100",
        "promotionPrice": "80",
        "priority": 66,
        "createTime": 1530286468000,
        "lastEditTime": 1530419566000,
        "enableStatus": 1,
        "productImgList": [
            {
                "productImgId": 14,
                "imgAddr": "\\upload\\item\\shopImage\\5\\2018070100324625530.jpg",
                "imgDesc": null,
                "priority": 66,
                "createTime": 1530286468000,
                "productId": 7
            },
            {
                "productImgId": 15,
                "imgAddr": "\\upload\\item\\shopImage\\5\\2018070100324625530.jpg",
                "imgDesc": null,
                "priority": 66,
                "createTime": 1530286468000,
                "productId": 7
            }
        ],
        "productCategory": {
            "productCategoryId": 36,
            "shopId": null,
            "productCategoryName": null,
            "productCategoryDesc": null,
            "priority": null,
            "createTime": null,
            "lastEditTime": null
        },
        "shop": {
            "shopId": 5,
            "shopName": null,
            "shopDesc": null,
            "shopAddr": null,
            "phone": null,
            "shopImg": null,
            "priority": null,
            "createTime": null,
            "lastEditTime": null,
            "enableStatus": null,
            "advice": null,
            "owner": null,
            "area": null,
            "shopCategory": null
        }
    },
    "productCategoryList": [
        {
            "productCategoryId": 36,
            "shopId": 5,
            "productCategoryName": "奶茶",
            "productCategoryDesc": "香飘飘奶茶",
            "priority": 99,
            "createTime": 1529678397000,
            "lastEditTime": 1529678397000
        },
        {
            "productCategoryId": 37,
            "shopId": 5,
            "productCategoryName": "咖啡",
            "productCategoryDesc": "拿铁咖啡",
            "priority": 98,
            "createTime": 1529678397000,
            "lastEditTime": 1529678397000
        }
    ],
    "success": true
}


检查数据是否符合预期。


Github地址

代码地址: https://github.com/yangshangwei/o2o


相关文章
|
6月前
|
搜索推荐 JavaScript Java
计算机Java项目|基于SSM的个性化商铺系统
计算机Java项目|基于SSM的个性化商铺系统
|
6月前
|
Java
SSM框架Controller层可以做什么
SSM框架Controller层可以做什么
|
6月前
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的商铺租赁管理系统附带文章和源代码部署视频讲解等
基于ssm+vue.js+uniapp小程序的商铺租赁管理系统附带文章和源代码部署视频讲解等
74 7
|
6月前
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的超市商品管理系统附带文章和源代码部署视频讲解等
基于ssm+vue.js+uniapp小程序的超市商品管理系统附带文章和源代码部署视频讲解等
46 4
|
7月前
|
JavaScript Java 测试技术
基于ssm+vue.js的会员制度管理的商品营销系统附带文章和源代码设计说明文档ppt
基于ssm+vue.js的会员制度管理的商品营销系统附带文章和源代码设计说明文档ppt
50 1
|
7月前
|
Java 关系型数据库 MySQL
基于SSM的商品分类管理系统
基于SSM的商品分类管理系统
75 1
|
6月前
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的二手商品网站附带文章和源代码部署视频讲解等
基于ssm+vue.js+uniapp小程序的二手商品网站附带文章和源代码部署视频讲解等
28 0
|
6月前
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的在线商品交易平台附带文章和源代码设计说明文档ppt
基于ssm+vue.js+uniapp小程序的在线商品交易平台附带文章和源代码设计说明文档ppt
82 0
|
7月前
|
SQL 测试技术
实战SSM_O2O商铺_32【商品】商品编辑之Dao层的实现
实战SSM_O2O商铺_32【商品】商品编辑之Dao层的实现
66 0
|
4月前
|
Java 数据库连接 Maven
手把手教你如何搭建SSM框架、图书商城系统案例
这篇文章是关于如何搭建SSM框架以及实现一个图书商城系统的详细教程,包括了项目的配置文件整合、依赖管理、项目结构和运行效果展示,并提供了GitHub源码链接。
手把手教你如何搭建SSM框架、图书商城系统案例