实战SSM_O2O商铺_35【商品】商品编辑之View层的实现

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

概述

接下来,我们来实现下 View层部分的操作。


productoperation.js

/**
 *  因为商品的添加和编辑复用同一个页面,所以需要根据url中的商品Id来判断
 */
$(function(){
  //通过url是否含有productId来判断是添加商品还是编辑
  var productId = getQueryString('productId');
  // 标示符  productId非空则为true即编辑,否则为添加商品
  var isEdit = productId ? true : false ;
  // 商品添加URL 用于提交 
  var addProductURL = '/o2o/shopadmin/addproduct';
  // 商品编辑URL 用于提交 
  var editProductURL = '/o2o/shopadmin/modifyproduct?productId=' + productId;
  // 获取商品初始化信息的URL  根据页面原型只需要获取productCategory即可,后台调用之前写好的路由方法即可
  var categoryInfoURL = '/o2o/shopadmin/getproductcategorybyshopId';
  // 商品编辑URL 用于从后台加载该product的基本信息,页面展示用
  var productInitURL = '/o2o/shopadmin/getproductbyid?productId=' + productId;
  // 通过标示符,确定调用的方法
  if(isEdit){
    // 为true,则根据productId调用获取product信息的方法  
    showEditProductPage(productId);
  }else{
    // 为false,则初始化新增product页面
    showAddProductPage();
  }
  /**
   * 始化新增product页面
   * 
   * 根据页面原型和数据模型,需要加载该shop对应的productCategory信息(shop信息从服务端session中获取)
   */
  function showAddProductPage(){
    $.getJSON(categoryInfoURL,
        function(data){
          if(data.success){
            // 设置product_category
            var productCategoryList = data.data;
            var productCategoryTempHtml = '';
            productCategoryList.map(function(item, index) {
//              productCategoryTempHtml += '<option data-id="'
//                  + item.productCategoryId + '">' + item.productCategoryName
//                  + '</option>';
              productCategoryTempHtml += '<option data-value="'
                + item.productCategoryId + '">'
                + item.productCategoryName + '</option>';
            });
            $('#product-category').html(productCategoryTempHtml);
          }else{
            $.toast(data.errMsg)
          }
    });
  };
  /**
   * 点击控件的最后一个且图片数量小于6个的时候,生成一个选择框
   */
  $('.detail-img-div').on('change', '.detail-img:last-child', function() {
    if ($('.detail-img').length < 6) {
      $('#detail-img').append('<input type="file" class="detail-img">');
    }
  });
  /**
   * 编辑页面调用的function
   */
  function showEditProductPage(productId){
    $.getJSON(
        productInitURL,
        function(data) {
          if (data.success) {
            var product = data.product;
            $('#product-name').val(product.productName);
            $('#product-desc').val(product.productDesc);
            $('#priority').val(product.priority);
            $('#normal-price').val(product.normalPrice);
            $('#promotion-price').val(
                product.promotionPrice);
            var optionHtml = '';
            var optionArr = data.productCategoryList;
            var optionSelected = product.productCategory.productCategoryId;
            optionArr.map(function(item, index) {
                  var isSelect = optionSelected === item.productCategoryId ? 'selected'
                      : '';
                  optionHtml += '<option data-value="'
                      + item.productCategoryId
                      + '"'
                      + isSelect
                      + '>'
                      + item.productCategoryName
                      + '</option>';
                });
            $('#product-category').html(optionHtml);
          }
        });
  };
  /**
   * 提交按钮的响应时间,分别对商品添加和商品编辑做不同的相应
   */
  $('#submit').click(
      function(){
        // 创建商品Json对象,并从表单对象中获取对应的属性值
        var product = {};
        // 如果是编辑操作,需要传入productId
        if(isEdit){
          product.productId = productId;
        }
        product.productName = $('#product-name').val();
        product.productDesc = $('#product-desc').val();
        // 获取商品的特定目录值
        product.productCategory = {
            productCategoryId : $('#product-category').find('option').not(
                function() {
                  return !this.selected;
                }).data('value')
          };
        product.priority = $('#priority').val();
        product.normalPrice = $('#normal-price').val();
        product.promotionPrice = $('#promotion-price').val();
        // 生成表单对象用于接收参数并传递给后台
        var formData = new FormData();
        // 缩略图 (只有一张),获取缩略图的文件流
        var thumbnail = $('#small-img')[0].files[0];
        formData.append('thumbnail',thumbnail);
        // 图片详情
        $('.detail-img').map(
            function(index, item) {
              // 判断该控件是否已经选择了文件 
              if ($('.detail-img')[index].files.length > 0) {
                // 将第i个文件流赋值给key为productImgi的表单键值对里
                formData.append('productImg' + index,
                    $('.detail-img')[index].files[0]);
              }
            });
        // 将product 转换为json ,添加到forData
        formData.append('productStr', JSON.stringify(product));
        // 获取表单中的验证码
        var verifyCodeActual = $('#j_captcha').val();
        if (!verifyCodeActual) {
          $.toast('请输入验证码!');
          return;
        }
        formData.append("verifyCodeActual", verifyCodeActual);
        // 使用ajax异步提交
        $.ajax({
          url: isEdit?editProductURL:addProductURL,
          type: 'POST' ,
          data : formData,
          contentType : false,
          processData : false,
          cache : false,
          success: function(data){
            if (data.success) {
              $.toast('提交成功!');
              $('#captcha_img').click();
            } else {
              $.toast('提交失败!');
              $('#captcha_img').click();
            }
          }
        });
      });
});


验证


因为后台有多session进行校验,所以需要先进入店铺管理页面(先进入shoplist页面,然后进入已经审核过的店铺,即可完成将session写入到服务端。)。 我们还没实现商品列表页面,所以需要手工输入下商品编辑的地址 。


假设前面的步骤操作完成,我们直接来编辑下页面,以productId=7为例

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


20180702115535408.png

前端debug方式调测下能否正确的获取到值,后端在modifyProduct方法中加入断点,debug的方式启动tomcat,逐步调测,最后检查库表中的记录以及磁盘上的文件。

select * from tb_product  where product_id = 7;


20180702115749583.png


select * from tb_product_img  where product_id = 7;

20180702115842263.png


磁盘上的文件:


20180702115935219.png


有个问题,当不传入图片的时候,会报错。需要加个判断,后续完善。

前端的content-type:multipart/form-data


20180702120154538.png


Controller中判断,然后进入了改方法,获取文件时空指针异常。


20180702120302769.png


Github地址


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


相关文章
|
6月前
|
搜索推荐 JavaScript Java
计算机Java项目|基于SSM的个性化商铺系统
计算机Java项目|基于SSM的个性化商铺系统
|
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框架、图书商城系统案例
|
3月前
|
Java 应用服务中间件 数据库连接
ssm项目整合,简单的用户管理系统
文章介绍了一个使用SSM框架(Spring、SpringMVC、MyBatis)构建的简单用户管理系统的整合过程,包括项目搭建、数据库配置、各层代码实现以及视图展示。
ssm项目整合,简单的用户管理系统