移动商城第四篇(商品管理)【添加商品续篇、商品审核和上下架、前台展示、后台筛选】...

 
 

属性选项卡

第三个选项卡涉及到了我们的手机属性,因此,还是需要用到我们其他的数据库表:EB_FEATURE

继续做逆向工程:

640?wx_fmt=png
这里写图片描述

查询出普通属性和特殊属性:

  <select id="selectCommFeature" resultMap="BaseResultMap">    select * from eb_feature t where t.is_spec = 0  </select>  <select id="selectSpecFeature" resultMap="BaseResultMap">    select * from eb_feature t where t.is_spec = 1  </select>

   select * from eb_feature t where t.is_spec = 0
 </select>
 <select id="selectSpecFeature" resultMap="BaseResultMap">
   select * from eb_feature t where t.is_spec = 1
 </select>

属性存放

想要把我们在页面上选定的基本属性进行保存的话,我们是使用另一张表来进行保存的。Featrue表仅仅保存了相对应的属性,是不做保存功能的!

640?wx_fmt=png
这里写图片描述

因此,我们需要对EB_PARA_VALUE做逆向工程!

640?wx_fmt=png
这里写图片描述

我们参数表的主键是不需要被其他的表用的, 因此我们直接使用序列来管理进行的。并不需要主键返回

  <insert id="insert" parameterType="com.rl.ecps.model.EbParaValue" >    insert into EB_PARA_VALUE (PARA_ID, ITEM_ID, FEATURE_ID,       PARA_VALUE)    values (seqparavalueid.nextval, #{itemId,jdbcType=DECIMAL}, #{featureId,jdbcType=DECIMAL},      #{paraValue,jdbcType=VARCHAR})  </insert>
   insert into EB_PARA_VALUE (PARA_ID, ITEM_ID, FEATURE_ID,
     PARA_VALUE)
   values (seqparavalueid.nextval, #{itemId,jdbcType=DECIMAL}, #{featureId,jdbcType=DECIMAL},
     #{paraValue,jdbcType=VARCHAR})
 </insert>

编写参数表的dao

public interface EbParaValueDao {    /**     *由于我们的参数数据是多个的,不想在service做循环而浪费我们的数据库连接     * 因此就使用了List集合作为参数     * @param ebParaValues     * @param itemId     */    void saveParaValue(List<EbParaValue> ebParaValues, Long itemId);}interface EbParaValueDao {


   /**
    *由于我们的参数数据是多个的,不想在service做循环而浪费我们的数据库连接
    * 因此就使用了List集合作为参数
    * @param ebParaValues
    * @param itemId
    */

   void saveParaValue(List<EbParaValue> ebParaValues, Long itemId);

}
@Repositorypublic class EbParaValueDaoImpl extends SqlSessionDaoSupport implements EbParaValueDao {    private String nameSpace = "com.rl.ecps.sqlMap.EbParaValueMapper.";    public void saveParaValue(List<EbParaValue> ebParaValues, Long itemId) {        //获取数据库连接,通过一个连接把数据存到数据库里边去        SqlSession sqlSession = this.getSqlSession();        for (EbParaValue ebParaValue : ebParaValues) {            ebParaValue.setItemId(itemId);            sqlSession.insert(nameSpace + "insert", ebParaValue);        }    }}
public class EbParaValueDaoImpl extends SqlSessionDaoSupport implements EbParaValueDao {

   private String nameSpace = "com.rl.ecps.sqlMap.EbParaValueMapper.";
   public void saveParaValue(List<EbParaValue> ebParaValues, Long itemId) {

       //获取数据库连接,通过一个连接把数据存到数据库里边去
       SqlSession sqlSession = this.getSqlSession();
       for (EbParaValue ebParaValue : ebParaValues) {
           ebParaValue.setItemId(itemId);
           sqlSession.insert(nameSpace + "insert", ebParaValue);
       }
   }
}

最小库存单元选项卡

来到我们的最小库存单元选项卡,我们是需要把我们的特殊属性查询出来的,供用户选择。

查询出特殊属性:

640?wx_fmt=png
这里写图片描述
<c:forEach items="${specFeature }" var="spec">    <tr>        <td>${spec.featureName }:</td>        <td>            <c:forEach items="${spec.selectValues}" var="para">                    <input type="radio" name="${spec.featureId}" value="${para}">${para}            </c:forEach>        </td>    </tr></c:forEach>
   <tr>
       <td>${spec.featureName }:</td>
       <td>
           <c:forEach items="${spec.selectValues}" var="para">
                   <input type="radio" name="${spec.featureId}" value="${para}">${para}
           </c:forEach>
       </td>
   </tr>
</c:forEach>
640?wx_fmt=png
这里写图片描述

当我们想点击增加规格的时候,就应该多那么一个div在页面上显示!那为什么我们需要多个规格呢??如下所示:

640?wx_fmt=png
这里写图片描述

对该按钮添加单击事件

    //实现页面规格的自动增加和删除    $("#button2").click(function () {        //得到想要控件div所有的内容,不包含自己的标签        var htmlDiv = $("#sp_0").html();        //把自己的标签包含进去        htmlDiv = "<div class='sp_0'>"+htmlDiv+"</div>";        //在下一个div之前插入        $(".page_c").before(htmlDiv);    });
   $("#button2").click(function () {

       //得到想要控件div所有的内容,不包含自己的标签
       var htmlDiv = $("#sp_0").html();

       //把自己的标签包含进去
       htmlDiv = "<div class='sp_0'>"+htmlDiv+"</div>";

       //在下一个div之前插入
       $(".page_c").before(htmlDiv);

   });

当我们添加了对应的内容时,问题就随之而来了:我们的按钮选项互斥了!

原因就是出在:

那么我们使用一个变量值,让每次的name属性都不一样即可!

    //得到divNum的值    var divNum =  $("#divNum").val();    //实现页面规格的自动增加和删除    $("#button2").click(function () {        divNum++;        //得到想要控件div所有的内容,不包含自己的标签        var htmlDiv = $("#sp_0").html();       //把自己的标签包含进去        htmlDiv = "<div class='sp_0' id='sp_"+divNum+"'>"+htmlDiv+"</div>";        //修改各个name的值,使用正则表达式就可以修改一部份的了        htmlDiv = htmlDiv.replace(/specradio1/g, "specradio"+divNum);        htmlDiv = htmlDiv.replace(/#sp_0/g, "#sp_"+divNum);        //skuType1   showStatus1   sort1     skuPrice1  marketPrice1  stockInventory1  skuUpperLimit1  sku1  location1        htmlDiv = htmlDiv.replace(/skuType1/g, "skuType"+divNum);        htmlDiv = htmlDiv.replace(/showStatus1/g, "showStatus"+divNum);        htmlDiv = htmlDiv.replace(/sort1/g, "sort"+divNum);        htmlDiv = htmlDiv.replace(/skuPrice1/g, "skuPrice"+divNum);        htmlDiv = htmlDiv.replace(/marketPrice1/g, "marketPrice"+divNum);        htmlDiv = htmlDiv.replace(/stockInventory1/g, "stockInventory"+divNum);        htmlDiv = htmlDiv.replace(/skuUpperLimit1/g, "skuUpperLimit"+divNum);        htmlDiv = htmlDiv.replace(/sku1/g, "sku"+divNum);        htmlDiv = htmlDiv.replace(/location1/g, "location"+divNum);        //重新设置div的值        $("#divNum").val(divNum);        //在下一个div之前插入        $(".page_c").before(htmlDiv);    });
   var divNum =  $("#divNum").val();

   //实现页面规格的自动增加和删除
   $("#button2").click(function () {
       divNum++;

       //得到想要控件div所有的内容,不包含自己的标签
       var htmlDiv = $("#sp_0").html();

      //把自己的标签包含进去
       htmlDiv = "<div class='sp_0' id='sp_"+divNum+"'>"+htmlDiv+"</div>";

       //修改各个name的值,使用正则表达式就可以修改一部份的了
       htmlDiv = htmlDiv.replace(/specradio1/g, "specradio"+divNum);
       htmlDiv = htmlDiv.replace(/#sp_0/g, "#sp_"+divNum);

       //skuType1   showStatus1   sort1     skuPrice1  marketPrice1  stockInventory1  skuUpperLimit1  sku1  location1
       htmlDiv = htmlDiv.replace(/skuType1/g, "skuType"+divNum);
       htmlDiv = htmlDiv.replace(/showStatus1/g, "showStatus"+divNum);
       htmlDiv = htmlDiv.replace(/sort1/g, "sort"+divNum);
       htmlDiv = htmlDiv.replace(/skuPrice1/g, "skuPrice"+divNum);
       htmlDiv = htmlDiv.replace(/marketPrice1/g, "marketPrice"+divNum);
       htmlDiv = htmlDiv.replace(/stockInventory1/g, "stockInventory"+divNum);
       htmlDiv = htmlDiv.replace(/skuUpperLimit1/g, "skuUpperLimit"+divNum);
       htmlDiv = htmlDiv.replace(/sku1/g, "sku"+divNum);
       htmlDiv = htmlDiv.replace(/location1/g, "location"+divNum);

       //重新设置div的值
       $("#divNum").val(divNum);

       //在下一个div之前插入
       $(".page_c").before(htmlDiv);

   });

还是就是我们不能删除第一个销售单元规格:

        function clickRemove(id) {            var a = $(".sp_0").length;            if (a == 1) {                alert("默认规格不可删除");                return;            }        }
           var a = $(".sp_0").length;
           if (a == 1) {
               alert("默认规格不可删除");
               return;
           }
       }

最小库存单元属性存放

我们的最小库存单元涉及到了两张数据库表:

640?wx_fmt=png
这里写图片描述

首先我们来做逆向工程:

640?wx_fmt=png
这里写图片描述

设置SKU有一个集合来保存所有的特殊属性值:

    private List<EbSpecValue> specList;    public List<EbSpecValue> getSpecList() {        return specList;    }    public void setSpecList(List<EbSpecValue> specList) {        this.specList = specList;    }

   public List<EbSpecValue> getSpecList() {
       return specList;
   }

   public void setSpecList(List<EbSpecValue> specList) {
       this.specList = specList;
   }

sku的主键需要被SpecValue用到,因此需要返回主键

    <selectKey keyProperty="skuId" order="BEFORE" resultType="long">      select seqskuid.nextval from dual    </selectKey>
     select seqskuid.nextval from dual
   </selectKey>

specValue主键自动增长:

  <insert id="insert" parameterType="com.rl.ecps.model.EbSpecValue" >    insert into EB_SPEC_VALUE (SPEC_ID, SKU_ID, FEATURE_ID,       SPEC_VALUE)    values (seqspecvalueid.nextval, #{skuId,jdbcType=DECIMAL}, #{featureId,jdbcType=DECIMAL},       #{specValue,jdbcType=VARCHAR})  </insert>
   insert into EB_SPEC_VALUE (SPEC_ID, SKU_ID, FEATURE_ID,
     SPEC_VALUE)
   values (seqspecvalueid.nextval, #{skuId,jdbcType=DECIMAL}, #{featureId,jdbcType=DECIMAL},
     #{specValue,jdbcType=VARCHAR})
 </insert>

编写Dao

public interface EbSkuDao {    void saveEbSku(List<EbSku> ebSkus, Long itemId);}interface EbSkuDao {

   void saveEbSku(List<EbSku> ebSkus, Long itemId);

}
/** * 继承SqlSessionDaoSupport能够得到sessionFactory的引用,非常方便! */@Repositorypublic class EbSkuDaoImpl extends SqlSessionDaoSupport implements EbSkuDao {    String nameSpace = "com.rl.ecps.sqlMap.EbSkuMapper.";    String nameSpace1 = "com.rl.ecps.sqlMap.EbSpecValueMapper.";    public void saveEbSku(List<EbSku> ebSkus, Long itemId) {        SqlSession sqlSession = this.getSqlSession();        for (EbSku ebSku : ebSkus) {            //设置商品属性            ebSku.setItemId(itemId);            sqlSession.insert(nameSpace+"insert", ebSku);            List<EbSpecValue> specList = ebSku.getSpecList();            for (EbSpecValue ebSpecValue : specList) {                ebSpecValue.setSkuId(ebSku.getSkuId());                sqlSession.insert(nameSpace1 + "insert", ebSpecValue);            }        }    }}
@Repository
public class EbSkuDaoImpl extends SqlSessionDaoSupport implements EbSkuDao {

   String nameSpace = "com.rl.ecps.sqlMap.EbSkuMapper.";
   String nameSpace1 = "com.rl.ecps.sqlMap.EbSpecValueMapper.";


   public void saveEbSku(List<EbSku> ebSkus, Long itemId) {
       SqlSession sqlSession = this.getSqlSession();
       for (EbSku ebSku : ebSkus) {

           //设置商品属性
           ebSku.setItemId(itemId);

           sqlSession.insert(nameSpace+"insert", ebSku);
           List<EbSpecValue> specList = ebSku.getSpecList();
           for (EbSpecValue ebSpecValue : specList) {
               ebSpecValue.setSkuId(ebSku.getSkuId());
               sqlSession.insert(nameSpace1 + "insert", ebSpecValue);
           }
       }
   }
}

Controller获取页面数据

 //使用集合来进行装sku的对象        List<EbSku> skuList = new ArrayList<EbSku>();        //遍历出特殊属性的值        List<EbFeature> specList = featureService.selectSpecFeature();        //获取页面有多少个单元格,对其进行遍历,取出对应的值        for (int i = 1; i <= divNum; i++) {            //获得商城价和库存,他们是必填的字段            String skuPrice = request.getParameter("skuPrice" + i);            String stock = request.getParameter("stockInventory" + i);            //如果上面的必填字段不是空说明数据有效            if (StringUtils.isNotBlank(skuPrice) && StringUtils.isNotBlank(stock)) {                String skuType = request.getParameter("skuType" + i);                String showStatus = request.getParameter("showStatus" + i);                String sort = request.getParameter("sort" + i);                String marketPrice = request.getParameter("marketPrice" + i);                String skuUpperLimit = request.getParameter("skuUpperLimit" + i);                String sku = request.getParameter("sku" + i);                String location = request.getParameter("location" + i);                //创建最小销售单元的对象,并且赋值                EbSku skuObj = new EbSku();                skuObj.setSkuPrice(new BigDecimal(skuPrice));                skuObj.setStockInventory(new Integer(stock));                if (StringUtils.isNotBlank(skuType) && !StringUtils.equals(skuType, "")) {                    skuObj.setSkuType(new Short(skuType));                }                if (StringUtils.isNotBlank(showStatus) && !StringUtils.equals(showStatus, "")) {                    skuObj.setShowStatus(new Short(showStatus));                }                if (StringUtils.isNotBlank(sort) && !StringUtils.equals(sort, "")) {                    skuObj.setSkuSort(new Integer(sort));                }                if (StringUtils.isNotBlank(marketPrice) && !StringUtils.equals(marketPrice, "")) {                    skuObj.setMarketPrice(new BigDecimal(marketPrice));                }                if (StringUtils.isNotBlank(skuUpperLimit) && !StringUtils.equals(skuUpperLimit, "")) {                    skuObj.setSkuUpperLimit(new Integer(skuUpperLimit));                }                skuObj.setSku(sku);                skuObj.setLocation(location);                //装取特殊属性的集合                List<EbSpecValue> specValList = new ArrayList<EbSpecValue>();                for (EbFeature feature : specList) {                    Long featureId = feature.getFeatureId();                    //获得所选规格属性的值                    String specVal = request.getParameter(featureId + "specradio" + i);                    if (StringUtils.isNotBlank(specVal)) {                        //创建规格对象                        EbSpecValue spec = new EbSpecValue();                        spec.setFeatureId(featureId);                        spec.setSpecValue(specVal);                        specValList.add(spec);                    }                }                skuObj.setSpecList(specValList);                skuList.add(skuObj);            }        }
       List<EbSku> skuList = new ArrayList<EbSku>();

       //遍历出特殊属性的值
       List<EbFeature> specList = featureService.selectSpecFeature();

       //获取页面有多少个单元格,对其进行遍历,取出对应的值
       for (int i = 1; i <= divNum; i++) {

           //获得商城价和库存,他们是必填的字段
           String skuPrice = request.getParameter("skuPrice" + i);
           String stock = request.getParameter("stockInventory" + i);

           //如果上面的必填字段不是空说明数据有效
           if (StringUtils.isNotBlank(skuPrice) && StringUtils.isNotBlank(stock)) {

               String skuType = request.getParameter("skuType" + i);
               String showStatus = request.getParameter("showStatus" + i);
               String sort = request.getParameter("sort" + i);
               String marketPrice = request.getParameter("marketPrice" + i);
               String skuUpperLimit = request.getParameter("skuUpperLimit" + i);
               String sku = request.getParameter("sku" + i);
               String location = request.getParameter("location" + i);

               //创建最小销售单元的对象,并且赋值
               EbSku skuObj = new EbSku();
               skuObj.setSkuPrice(new BigDecimal(skuPrice));
               skuObj.setStockInventory(new Integer(stock));

               if (StringUtils.isNotBlank(skuType) && !StringUtils.equals(skuType, "")) {
                   skuObj.setSkuType(new Short(skuType));
               }
               if (StringUtils.isNotBlank(showStatus) && !StringUtils.equals(showStatus, "")) {
                   skuObj.setShowStatus(new Short(showStatus));
               }
               if (StringUtils.isNotBlank(sort) && !StringUtils.equals(sort, "")) {
                   skuObj.setSkuSort(new Integer(sort));
               }
               if (StringUtils.isNotBlank(marketPrice) && !StringUtils.equals(marketPrice, "")) {
                   skuObj.setMarketPrice(new BigDecimal(marketPrice));
               }
               if (StringUtils.isNotBlank(skuUpperLimit) && !StringUtils.equals(skuUpperLimit, "")) {
                   skuObj.setSkuUpperLimit(new Integer(skuUpperLimit));
               }
               skuObj.setSku(sku);
               skuObj.setLocation(location);

               //装取特殊属性的集合
               List<EbSpecValue> specValList = new ArrayList<EbSpecValue>();

               for (EbFeature feature : specList) {
                   Long featureId = feature.getFeatureId();
                   //获得所选规格属性的值
                   String specVal = request.getParameter(featureId + "specradio" + i);
                   if (StringUtils.isNotBlank(specVal)) {
                       //创建规格对象
                       EbSpecValue spec = new EbSpecValue();
                       spec.setFeatureId(featureId);
                       spec.setSpecValue(specVal);
                       specValList.add(spec);
                   }
               }
               skuObj.setSpecList(specValList);
               skuList.add(skuObj);
           }
       }

获取得到值:

640?wx_fmt=png
这里写图片描述

将Item数据存进数据库

到目前为止,我们4个选项卡的数据都可以拿到了。因此,我们可以把Item所需要的对象存入数据库了..

dao层编写

    public void saveItem(EbItem ebItem) {        this.getSqlSession().insert(nameSpace + "insert", ebItem);    }
       this.getSqlSession().insert(nameSpace + "insert", ebItem);
   }

service层编写:

    public void saveItem(EbItem ebItem, EbItemClob clob, List<EbSku> skus, List<EbParaValue> ebParaValues) {        itemDao.saveItem(ebItem);        clobDao.saveItemClob(clob, ebItem.getItemId());        skuDao.saveEbSku(skus, ebItem.getItemId());        paraValueDao.saveParaValue(ebParaValues, ebItem.getItemId());    }
       itemDao.saveItem(ebItem);

       clobDao.saveItemClob(clob, ebItem.getItemId());

       skuDao.saveEbSku(skus, ebItem.getItemId());

       paraValueDao.saveParaValue(ebParaValues, ebItem.getItemId());
   }

controller编写:

 @RequestMapping("/addItem.do")    public void addItem(EbItem ebItem, EbItemClob ebItemClob, HttpServletRequest request, Integer divNum) {        //为商品设置编号        ebItem.setItemNo(new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date()));        //查询出所有的属性数据        List<EbFeature> commFeature = featureService.selectCommFeature();        //创建一个集合来装载我们所有的参数数据        List<EbParaValue> ebParaValues = new ArrayList<EbParaValue>();        for (EbFeature feature : commFeature) {            //得到录入方式            Short inputType = feature.getInputType();            //复选,复选的值是有多个的            if (inputType == 3) {                String[] parameterValues = request.getParameterValues(feature.getFeatureId() + "");                //装载参数数据                String value = "";                //如果得到的数据不为null,那么就使用一个字符串来对其进行拼接                if (parameterValues != null && parameterValues.length > 0) {                    for (String parameterValue : parameterValues) {                        value = value + parameterValue + ",";                    }                    //去除最后一个逗号                    value = value.substring(0, value.length() - 1);                    //把数据封装到参数对象上                    EbParaValue ebParaValue = new EbParaValue();                    ebParaValue.setFeatureId(feature.getFeatureId());                    ebParaValue.setParaValue(value);                    //装载到集合中                    ebParaValues.add(ebParaValue);                }            } else {                //非复选的值都只有一个                String parameter = request.getParameter(feature.getFeatureId() + "");                //如果拿到的数据不为null                if (StringUtils.isNotBlank(parameter)) {                    //把数据封装到参数对象上                    EbParaValue ebParaValue = new EbParaValue();                    ebParaValue.setFeatureId(feature.getFeatureId());                    ebParaValue.setParaValue(parameter);                    //装载到集合中                    ebParaValues.add(ebParaValue);                }            }        }        //使用集合来进行装sku的对象        List<EbSku> skuList = new ArrayList<EbSku>();        //遍历出特殊属性的值        List<EbFeature> specList = featureService.selectSpecFeature();        //获取页面有多少个单元格,对其进行遍历,取出对应的值        for (int i = 1; i <= divNum; i++) {            //获得商城价和库存,他们是必填的字段            String skuPrice = request.getParameter("skuPrice" + i);            String stock = request.getParameter("stockInventory" + i);            //如果上面的必填字段不是空说明数据有效            if (StringUtils.isNotBlank(skuPrice) && StringUtils.isNotBlank(stock)) {                String skuType = request.getParameter("skuType" + i);                String showStatus = request.getParameter("showStatus" + i);                String sort = request.getParameter("sort" + i);                String marketPrice = request.getParameter("marketPrice" + i);                String skuUpperLimit = request.getParameter("skuUpperLimit" + i);                String sku = request.getParameter("sku" + i);                String location = request.getParameter("location" + i);                //创建最小销售单元的对象,并且赋值                EbSku skuObj = new EbSku();                skuObj.setSkuPrice(new BigDecimal(skuPrice));                skuObj.setStockInventory(new Integer(stock));                if (StringUtils.isNotBlank(skuType) && !StringUtils.equals(skuType, "")) {                    skuObj.setSkuType(new Short(skuType));                }                if (StringUtils.isNotBlank(showStatus) && !StringUtils.equals(showStatus, "")) {                    skuObj.setShowStatus(new Short(showStatus));                }                if (StringUtils.isNotBlank(sort) && !StringUtils.equals(sort, "")) {                    skuObj.setSkuSort(new Integer(sort));                }                if (StringUtils.isNotBlank(marketPrice) && !StringUtils.equals(marketPrice, "")) {                    skuObj.setMarketPrice(new BigDecimal(marketPrice));                }                if (StringUtils.isNotBlank(skuUpperLimit) && !StringUtils.equals(skuUpperLimit, "")) {                    skuObj.setSkuUpperLimit(new Integer(skuUpperLimit));                }                skuObj.setSku(sku);                skuObj.setLocation(location);                //装取特殊属性的集合                List<EbSpecValue> specValList = new ArrayList<EbSpecValue>();                for (EbFeature feature : specList) {                    Long featureId = feature.getFeatureId();                    //获得所选规格属性的值                    String specVal = request.getParameter(featureId + "specradio" + i);                    if (StringUtils.isNotBlank(specVal)) {                        //创建规格对象                        EbSpecValue spec = new EbSpecValue();                        spec.setFeatureId(featureId);                        spec.setSpecValue(specVal);                        specValList.add(spec);                    }                }                skuObj.setSpecList(specValList);                skuList.add(skuObj);            }        }        itemService.saveItem(ebItem, ebItemClob, skuList, ebParaValues);        return "redirect:listItem.do";    }"/addItem.do")
   public void addItem(EbItem ebItem, EbItemClob ebItemClob, HttpServletRequest request, Integer divNum) {


       //为商品设置编号
       ebItem.setItemNo(new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date()));

       //查询出所有的属性数据
       List<EbFeature> commFeature = featureService.selectCommFeature();

       //创建一个集合来装载我们所有的参数数据
       List<EbParaValue> ebParaValues = new ArrayList<EbParaValue>();

       for (EbFeature feature : commFeature) {
           //得到录入方式
           Short inputType = feature.getInputType();

           //复选,复选的值是有多个的
           if (inputType == 3) {
               String[] parameterValues = request.getParameterValues(feature.getFeatureId() + "");

               //装载参数数据
               String value = "";

               //如果得到的数据不为null,那么就使用一个字符串来对其进行拼接
               if (parameterValues != null && parameterValues.length > 0) {
                   for (String parameterValue : parameterValues) {
                       value = value + parameterValue + ",";
                   }
                   //去除最后一个逗号
                   value = value.substring(0, value.length() - 1);

                   //把数据封装到参数对象上
                   EbParaValue ebParaValue = new EbParaValue();
                   ebParaValue.setFeatureId(feature.getFeatureId());
                   ebParaValue.setParaValue(value);

                   //装载到集合中
                   ebParaValues.add(ebParaValue);
               }

           } else {
               //非复选的值都只有一个
               String parameter = request.getParameter(feature.getFeatureId() + "");

               //如果拿到的数据不为null
               if (StringUtils.isNotBlank(parameter)) {

                   //把数据封装到参数对象上
                   EbParaValue ebParaValue = new EbParaValue();
                   ebParaValue.setFeatureId(feature.getFeatureId());
                   ebParaValue.setParaValue(parameter);

                   //装载到集合中
                   ebParaValues.add(ebParaValue);
               }
           }
       }

       //使用集合来进行装sku的对象
       List<EbSku> skuList = new ArrayList<EbSku>();

       //遍历出特殊属性的值
       List<EbFeature> specList = featureService.selectSpecFeature();

       //获取页面有多少个单元格,对其进行遍历,取出对应的值
       for (int i = 1; i <= divNum; i++) {

           //获得商城价和库存,他们是必填的字段
           String skuPrice = request.getParameter("skuPrice" + i);
           String stock = request.getParameter("stockInventory" + i);

           //如果上面的必填字段不是空说明数据有效
           if (StringUtils.isNotBlank(skuPrice) && StringUtils.isNotBlank(stock)) {

               String skuType = request.getParameter("skuType" + i);
               String showStatus = request.getParameter("showStatus" + i);
               String sort = request.getParameter("sort" + i);
               String marketPrice = request.getParameter("marketPrice" + i);
               String skuUpperLimit = request.getParameter("skuUpperLimit" + i);
               String sku = request.getParameter("sku" + i);
               String location = request.getParameter("location" + i);

               //创建最小销售单元的对象,并且赋值
               EbSku skuObj = new EbSku();
               skuObj.setSkuPrice(new BigDecimal(skuPrice));
               skuObj.setStockInventory(new Integer(stock));

               if (StringUtils.isNotBlank(skuType) && !StringUtils.equals(skuType, "")) {
                   skuObj.setSkuType(new Short(skuType));
               }
               if (StringUtils.isNotBlank(showStatus) && !StringUtils.equals(showStatus, "")) {
                   skuObj.setShowStatus(new Short(showStatus));
               }
               if (StringUtils.isNotBlank(sort) && !StringUtils.equals(sort, "")) {
                   skuObj.setSkuSort(new Integer(sort));
               }
               if (StringUtils.isNotBlank(marketPrice) && !StringUtils.equals(marketPrice, "")) {
                   skuObj.setMarketPrice(new BigDecimal(marketPrice));
               }
               if (StringUtils.isNotBlank(skuUpperLimit) && !StringUtils.equals(skuUpperLimit, "")) {
                   skuObj.setSkuUpperLimit(new Integer(skuUpperLimit));
               }
               skuObj.setSku(sku);
               skuObj.setLocation(location);

               //装取特殊属性的集合
               List<EbSpecValue> specValList = new ArrayList<EbSpecValue>();

               for (EbFeature feature : specList) {
                   Long featureId = feature.getFeatureId();
                   //获得所选规格属性的值
                   String specVal = request.getParameter(featureId + "specradio" + i);
                   if (StringUtils.isNotBlank(specVal)) {
                       //创建规格对象
                       EbSpecValue spec = new EbSpecValue();
                       spec.setFeatureId(featureId);
                       spec.setSpecValue(specVal);
                       specValList.add(spec);
                   }
               }
               skuObj.setSpecList(specValList);
               skuList.add(skuObj);
           }
       }
       itemService.saveItem(ebItem, ebItemClob, skuList, ebParaValues);
       return "redirect:listItem.do";
   }

检查数据是否进去了

SELECT * from EB_ITEM WHERE ITEM_ID = 3073SELECT  * from EB_SKU where ITEM_ID = 3073SELECT * from EB_PARA_VALUE WHERE ITEM_ID =  3073SELECT  * from EB_SPEC_VALUE WHERE SKU_ID = 3060from EB_ITEM WHERE ITEM_ID = 3073
SELECT  * from EB_SKU where ITEM_ID = 3073
SELECT * from EB_PARA_VALUE WHERE ITEM_ID =  3073

SELECT  * from EB_SPEC_VALUE WHERE SKU_ID = 3060

商品审核

接下来我们做的是商品审核的功能:

640?wx_fmt=png
这里写图片描述

我们到修改url的地址,并且给出对应controller的方法

<li><a href="${path}/item/listAudit.do?auditStatus=0&showStatus=1"><samp class="t05"></samp>商品审核</a></li><a href="${path}/item/listAudit.do?auditStatus=0&showStatus=1"><samp class="t05"></samp>商品审核</a></li>

查询出未审核的商品其实就是条件查询的一种,因此该controller的代码和列出商品的代码几乎一样。

    @RequestMapping("/listAudit.do")    public String listAudit(QueryCondition queryCondition,Model model) {        //查询出所有的品牌        List<EbBrand> ebBrands = ebBrandService.selectBrand();        //如果是第一次访问的话,那么默认是没有当前页号的,因此赋值为1        if (queryCondition.getPageNo() == null) {            queryCondition.setPageNo(1);        }        //得到分页数据        Page page = itemService.selectItemByCondition(queryCondition);        model.addAttribute("page", page);        model.addAttribute("ebBrands", ebBrands);        //回显条件数据        model.addAttribute("queryCondition", queryCondition);        return "item/listAudit";    }"/listAudit.do")
   public String listAudit(QueryCondition queryCondition,Model model) {

       //查询出所有的品牌
       List<EbBrand> ebBrands = ebBrandService.selectBrand();

       //如果是第一次访问的话,那么默认是没有当前页号的,因此赋值为1
       if (queryCondition.getPageNo() == null) {
           queryCondition.setPageNo(1);
       }
       //得到分页数据
       Page page = itemService.selectItemByCondition(queryCondition);

       model.addAttribute("page", page);
       model.addAttribute("ebBrands", ebBrands);

       //回显条件数据
       model.addAttribute("queryCondition", queryCondition);


       return "item/listAudit";
   }

处理下边的url并且随着条件,样式发生改变:

640?wx_fmt=png
这里写图片描述
        <h2 class="h2_ch"><span id="tabs" class="l">        <a id="label4" href="${base}/item/listAudit.do" title="全部实体商品" class="nor">全部</a>        <a id="label1" href="${path}/item/listItem.do?auditStatus=0&showStatus=1" title="待审核实体商品"           class="nor">待审核</a>        <a id="label2" href="${path}/item/listItem.do?auditStatus=2&showStatus=1" title="审核不通过实体商品"           class="nor">审核不通过</a>        <a id="label3" href="${path}/item/listItem.do?auditStatus=1&showStatus=1" title="已审核实体商品"           class="nor">已审核</a>    </span></h2><span id="tabs" class="l">
       <a id="label4" href="${base}/item/listAudit.do" title="全部实体商品" class="nor">全部</a>
       <a id="label1" href="${path}/item/listItem.do?auditStatus=0&showStatus=1" title="待审核实体商品"
          class="nor">
待审核</a>
       <a id="label2" href="${path}/item/listItem.do?auditStatus=2&showStatus=1" title="审核不通过实体商品"
          class="nor">
审核不通过</a>
       <a id="label3" href="${path}/item/listItem.do?auditStatus=1&showStatus=1" title="已审核实体商品"
          class="nor">
已审核</a>
   </span></h2>

数据回显

通过隐藏域拿到查询条件的值:

<input type="hidden" id="auditStatus" name="auditStatus" value="${queryCondition.auditStatus}"/>

通过判断隐藏域的值来改变我们的样式:

        $(document).ready(function () {            if ($("#auditStatus").val() == '0') {                $("#label1").attr("class", "here");            }            else if ($("#auditStatus").val() == 2) {                $("#label2").attr("class", "here");            }            else if ($("#auditStatus").val() == 1) {                $("#label3").attr("class", "here");            }            else $("#label4").attr("class", "here");        })function () {
           if ($("#auditStatus").val() == '0') {
               $("#label1").attr("class", "here");
           }
           else if ($("#auditStatus").val() == 2) {
               $("#label2").attr("class", "here");
           }
           else if ($("#auditStatus").val() == 1) {
               $("#label3").attr("class", "here");
           }
           else $("#label4").attr("class", "here");
       })
640?wx_fmt=png
这里写图片描述

查询条件以及回显:

                <p>查询:                    <ui:select name="catID" list="catList" rootId="0" defaulttext="所有分类" defaultvalue=""                               currentValue="${catID}"/>                    <select id="brandId" name="brandId"">                    <option value="">全部品牌</option>                    <c:forEach items="${ebBrands}" var="brand">                        <option value="${brand.brandId}"                            <%--这是数据回显--%>                                <c:if test="${queryCondition.brandId==brand.brandId}"> selected </c:if>                        >${brand.brandName}</option>                    </c:forEach>                    <%--    </select><select id="stock" name="stock" style="display:none;">                            <option value="-1" selected="">全部库存</option>                            <option value="0"<c:if test='${stock==0}'> selected</c:if>>已缺货</option>                            <option value="1"<c:if test='${stock==1}'> selected</c:if>>即将缺货</option>                        </select>--%>                    <%--模糊查询--%>                    <input type="text" id="searchText" name="itemName" value="${queryCondition.itemName}"                           title="" class="text20 medium gray"/>                    <input type="submit" id="goSearch"                           class="hand btn60x20"                           value="查询"/>                </p>
                   <ui:select name="catID" list="catList" rootId="0" defaulttext="所有分类" defaultvalue=""
                              currentValue="${catID}"/>


                   <select id="brandId" name="brandId"">
                   <option value="">全部品牌</option>

                   <c:forEach items="${ebBrands}" var="brand">
                       <option value="${brand.brandId}"
                           <%--这是数据回显--%>

                               <c:if test="${queryCondition.brandId==brand.brandId}"> selected </c:if>
                       >${brand.brandName}</option>
                   </c:forEach>

                   <%--    </select><select id="stock" name="stock" style="display:none;">
                           <option value="-1" selected="">全部库存</option>
                           <option value="0"<c:if test='${stock==0}'> selected</c:if>>已缺货</option>
                           <option value="1"<c:if test='${stock==1}'> selected</c:if>>即将缺货</option>
                       </select>--%>
                   <%--模糊查询--%>
                   <input type="text" id="searchText" name="itemName" value="${queryCondition.itemName}"
                          title="" class="text20 medium gray"/>

                   <input type="submit" id="goSearch"
                          class="hand btn60x20"
                          value="查询"/>

               </p>
640?wx_fmt=png
这里写图片描述

根据审核条件的不同,在显示商品的url中也应该是不同的。

640?wx_fmt=png
这里写图片描述

处理审核

处理审核:使用JavaScript方法来进行控制,把item的Id传递进去和审核对应的值。

    <c:if test="${item.auditStatus==0}">        <a href="javascript:void(0);" onclick="isPass(${item.itemId}, 1)">通过</a>        <a href="javascript:void(0);" onclick="isPass(${item.itemId}, 2)">不通过</a>    </c:if>
       <a href="javascript:void(0);" onclick="isPass(${item.itemId}, 1)">通过</a>
       <a href="javascript:void(0);" onclick="isPass(${item.itemId}, 2)">不通过</a>
   </c:if>

审核通过和不通过总会有理由的,对于我们的理由我们使用一张表来保存的。

        function isPass(itemId, auditStatus){            //修改浮动层的标题            $("#addItemNoteH2").html("商品审核");            //清空内容            $("#itemNote").val("");            tipShow("#addItemNote");            //给表单赋值            $("#itemId").val(itemId);            $("#myAuditStatus").val(auditStatus);        }
           //修改浮动层的标题
           $("#addItemNoteH2").html("商品审核");
           //清空内容
           $("#itemNote").val("");
           tipShow("#addItemNote");
           //给表单赋值
           $("#itemId").val(itemId);
           $("#myAuditStatus").val(auditStatus);
       }

使用表单来处理我们的操作。其中notes是我们弹出框的数据。

<form action="${path }/item/auditItem.do" id="auditForm" method="post">    <input type="hidden" name="itemId" id="itemId">    <input type="hidden" name="auditStatus" id="myAuditStatus">    <input type="hidden" name="notes" id="notes"></form>
   <input type="hidden" name="itemId" id="itemId">
   <input type="hidden" name="auditStatus" id="myAuditStatus">
   <input type="hidden" name="notes" id="notes">
</form>

响应事件,给表单赋值,提交表单

         $("#addItemNoteConfirm").click(function(){                var notes = $("#itemNote").val();                //给表单赋值                $("#notes").val(notes);                //提交表单                $("#auditForm").submit();            });function(){
               var notes = $("#itemNote").val();
               //给表单赋值
               $("#notes").val(notes);
               //提交表单
               $("#auditForm").submit();
           });

我们是使用EB_CONSOLE_LOG这张数据表来保存我们后台操作的日志记录的。

表的字段如下:

640?wx_fmt=png
这里写图片描述

既然我们要操作到表,我们就得逆向工厂…

640?wx_fmt=png
这里写图片描述

设置主键为自动增长

  <insert id="insert" parameterType="com.rl.ecps.model.EbConsoleLog" >    insert into EB_CONSOLE_LOG (CONSOLE_LOG_ID, ENTITY_NAME, ENTITY_ID,       USER_ID, OP_TYPE, OP_TIME,       NOTES, TABLE_NAME)    values (seqconsolelogid.nextval, #{entityName,jdbcType=VARCHAR}, #{entityId,jdbcType=DECIMAL},       #{userId,jdbcType=DECIMAL}, #{opType,jdbcType=VARCHAR}, #{opTime,jdbcType=TIMESTAMP},       #{notes,jdbcType=VARCHAR}, #{tableName,jdbcType=VARCHAR})  </insert>
   insert into EB_CONSOLE_LOG (CONSOLE_LOG_ID, ENTITY_NAME, ENTITY_ID,
     USER_ID, OP_TYPE, OP_TIME,
     NOTES, TABLE_NAME)
   values (seqconsolelogid.nextval, #{entityName,jdbcType=VARCHAR}, #{entityId,jdbcType=DECIMAL},
     #{userId,jdbcType=DECIMAL}, #{opType,jdbcType=VARCHAR}, #{opTime,jdbcType=TIMESTAMP},
     #{notes,jdbcType=VARCHAR}, #{tableName,jdbcType=VARCHAR})
 </insert>

上下价

对于上下价和审核的逻辑基本是相同的…

640?wx_fmt=png
这里写图片描述

根据不同的状态给出不同的超链接:

            <a href="/ecps-console/shop/item/viewItem.jsp" title="查看">查看</a>            <c:if test="${item.showStatus == 1 }">                <a href="/ecps-console/ecps/console/item/editItem.do?type=1&itemId=2384">编辑</a>                <a href="javascript:void(0);" onclick="singleDel('2384')">删除</a>                <a href="javascript:void(0);" onclick="isShow(${item.itemId}, 0)">上架</a>            </c:if>            <c:if test="${item.showStatus == 0 }">                <a href="javascript:void(0);" onclick="isShow(${item.itemId}, 1)">下架</a>                <a href="javascript:void(0);">发布</a>            </c:if></a>
           <c:if test="${item.showStatus == 1 }">
               <a href="/ecps-console/ecps/console/item/editItem.do?type=1&itemId=2384">编辑</a>
               <a href="javascript:void(0);" onclick="singleDel('2384')">删除</a>
               <a href="javascript:void(0);" onclick="isShow(${item.itemId}, 0)">上架</a>
           </c:if>
           <c:if test="${item.showStatus == 0 }">
               <a href="javascript:void(0);" onclick="isShow(${item.itemId}, 1)">下架</a>
               <a href="javascript:void(0);">发布</a>
           </c:if>

给表单赋值

        function isShow(itemId, showStatus) {            tipShow("#confirm");            //给表单赋值            $("#itemId").val(itemId);            $("#myShowStatus").val(showStatus);        }
           tipShow("#confirm");
           //给表单赋值
           $("#itemId").val(itemId);
           $("#myShowStatus").val(showStatus);
       }

在弹出框中绑定提交事件,提交表单

$("#confirmOk").click(function () {    $("#showForm").submit();});function () {
   $("#showForm").submit();
});

编写controller和service

    @RequestMapping("/showItem.do")    public String  showItem(Long itemId, Short showStatus) throws IOException {        itemService.showItem(itemId, showStatus);        return "redirect:listItem.do";    }"/showItem.do")
   public String  showItem(Long itemId, Short showStatus) throws IOException {
       itemService.showItem(itemId, showStatus);
       return "redirect:listItem.do";
   }
    public void showItem(Long itemId, Short showStatus) {        //设置item的属性        EbItem ebItem = new EbItem();        ebItem.setItemId(itemId);        ebItem.setShowStatus(showStatus);        ebItem.setCheckerUserId((long) 222);        ebItem.setCheckTime(new Date());        //更新item        itemDao.updateItem(ebItem);        //操作日志        EbConsoleLog ebConsoleLog = new EbConsoleLog();        ebConsoleLog.setEntityId(itemId);        ebConsoleLog.setEntityName("商品表");        ebConsoleLog.setOpTime(new Date());        if(showStatus == 1){            ebConsoleLog.setOpType("下架");        }else{            ebConsoleLog.setOpType("上架");        }        ebConsoleLog.setTableName("EB_ITEM");        ebConsoleLog.setUserId(1l);        logDao.saveConsoleLog(ebConsoleLog);    }

       //设置item的属性
       EbItem ebItem = new EbItem();
       ebItem.setItemId(itemId);
       ebItem.setShowStatus(showStatus);
       ebItem.setCheckerUserId((long) 222);
       ebItem.setCheckTime(new Date());

       //更新item
       itemDao.updateItem(ebItem);

       //操作日志
       EbConsoleLog ebConsoleLog = new EbConsoleLog();
       ebConsoleLog.setEntityId(itemId);
       ebConsoleLog.setEntityName("商品表");
       ebConsoleLog.setOpTime(new Date());
       if(showStatus == 1){
           ebConsoleLog.setOpType("下架");
       }else{
           ebConsoleLog.setOpType("上架");
       }
       ebConsoleLog.setTableName("EB_ITEM");
       ebConsoleLog.setUserId(1l);
       logDao.saveConsoleLog(ebConsoleLog);
   }
640?wx_fmt=png
这里写图片描述

总结

如果文章有错的地方欢迎指正,大家互相交流。习惯在微信看技术文章,想要获取更多的Java资源的同学,可以关注微信公众号:Java3y


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值