移動商城第九篇【屬性選項卡、最小存儲單元、數據進庫】

屬性選項卡

第三個選項卡涉及到了咱們的手機屬性,所以,仍是須要用到咱們其餘的數據庫表:EB_FEATUREjavascript

繼續作逆向工程:html

這裏寫圖片描述

查詢出普通屬性和特殊屬性:java

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

dao和service和controller

dao實現正則表達式

/** * 繼承SqlSessionDaoSupport可以獲得sessionFactory的引用,很是方便! */
@Repository
public class EbFeatureDaoImpl extends SqlSessionDaoSupport implements EbFeatureDao {

    String nameSpace = "com.rl.ecps.sqlMap.EbFeatureMapper.";

    public List<EbFeature> selectCommFeature() {
        return this.getSqlSession().selectList(nameSpace + "selectCommFeature");
    }

    public List<EbFeature> selectSpecFeature() {
        return this.getSqlSession().selectList(nameSpace + "selectSpecFeature");
    }
}

service實現sql

@Service
public class EbFeatureServiceImpl implements EbFeatureService {

    @Autowired
    private EbFeatureDao featureDao;
    public List<EbFeature> selectCommFeature() {
        return featureDao.selectCommFeature();
    }

    public List<EbFeature> selectSpecFeature() {
        return featureDao.selectSpecFeature();

    }
}

controller調用service拿到對應的普通屬性和特殊屬性。數據庫

/** * 跳轉到添加商品頁面 * * @return */
    @RequestMapping("/toAddItem.do")
    public String toAddItem(Model model) {

        List<EbBrand> ebBrands = ebBrandService.selectBrand();
        List<EbFeature> commFeature = featureService.selectCommFeature();
        List<EbFeature> specFeature = featureService.selectSpecFeature();
        model.addAttribute("ebBrands", ebBrands);
        model.addAttribute("commFeature", commFeature);
        model.addAttribute("specFeature", specFeature);

        return "item/addItem";
    }

JSP顯示普通屬性:bash

  • forEach標籤默認支持遍歷以「,」逗號分割的數據!
<div id="tab_3" class="edit set" style="display: none"> <c:if test="${fn:length(commFeature) == 0}"> <p><label></label>無屬性</p> </c:if> <%--判斷每一個屬性的錄入方式並顯示--%> <c:forEach items="${commFeature}" var="feature"> <p> <label>${feature.featureName }:</label> <%--若是輸入類型爲1,那麼就是下拉框方式--%> <c:if test="${feature.inputType==1}"> <select name="${feature.featureId}"> <%--這裏須要設置一個空值,不然後臺是能夠獲取到數據「請選擇」--%> <option value="">請選擇</option> <c:forEach items="${feature.selectValues}" var="value"> <option value="${value}">${value}</option> </c:forEach> </select> </c:if> <%--若是輸入類型爲2,那麼就是單選框方式--%> <c:if test="${feature.inputType==2}"> <c:forEach items="${feature.selectValues}" var="value"> <input type="radio" name="${feature.featureId}" value="${value}">${value} &nbsp; </c:forEach> </c:if> <%--若是輸入類型爲3,那麼就是多選框方式--%> <c:if test="${feature.inputType==3}"> <c:forEach items="${feature.selectValues}" var="value"> <input type="checkbox" name="${feature.featureId}" value="${value}">${value} &nbsp; </c:forEach> </c:if> </p> </c:forEach> </div>

這裏寫圖片描述

屬性存放

想要把咱們在頁面上選定的基本屬性進行保存的話,咱們是使用另外一張表來進行保存的。Featrue表僅僅保存了相對應的屬性,是不作保存功能的!markdown

這裏寫圖片描述

所以,咱們須要對EB_PARA_VALUE作逆向工程!session

這裏寫圖片描述

咱們參數表的主鍵是不須要被其餘的表用的, 所以咱們直接使用序列來管理進行的。並不須要主鍵返回app

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

編寫參數表的dao

public interface EbParaValueDao {


    /** *因爲咱們的參數數據是多個的,不想在service作循環而浪費咱們的數據庫鏈接 * 所以就使用了List集合做爲參數 * @param ebParaValues * @param itemId */
    void saveParaValue(List<EbParaValue> ebParaValues, Long itemId);

}
@Repository
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);
        }
    }
}

controller

回到咱們的網頁上,咱們發現屬性是很是多的,那麼咱們在controller是怎麼接收的呢???

這裏寫圖片描述

咱們將JSP頁面的name屬性都設置爲咱們的featureId

這裏寫圖片描述

因爲咱們該頁面上的數據都是從數據庫中查詢出來的,數據庫中的記錄有多少,在頁面上顯示的就有多少

所以,咱們能夠這麼幹:

  • 咱們使用request對象來獲取頁面上全部的勾選出來的數據屬性
  • 再次從數據庫中查詢數據,遍歷這些數據,若是發現有勾選出來的數據,那麼咱們就保存在EbParaValue對象中!

代碼:

//查詢出全部的屬性數據
        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);
                }
            }
        }

測試:

這裏寫圖片描述

這裏寫圖片描述

最小庫存單元選項卡

來到咱們的最小庫存單元選項卡,咱們是須要把咱們的特殊屬性查詢出來的,供用戶選擇。

查詢出特殊屬性:

這裏寫圖片描述

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

這裏寫圖片描述

當咱們想點擊增長規格的時候,就應該多那麼一個div在頁面上顯示!那爲何咱們須要多個規格呢??以下所示:

這裏寫圖片描述

對該按鈕添加單擊事件

//實現頁面規格的自動增長和刪除
    $("#button2").click(function () {

        //獲得想要控件div全部的內容,不包含本身的標籤
        var htmlDiv = $("#sp_0").html();

        //把本身的標籤包含進去
        htmlDiv = "<div class='sp_0'>"+htmlDiv+"</div>";

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

    });

當咱們添加了對應的內容時,問題就隨之而來了:咱們的按鈕選項互斥了!

  • 當咱們點擊第一行的顏色時,想要點擊第二行的顏色就不行了!【第一行的顏色選擇沒有了】
  • 提交表單中的name屬性多個重複了。

緣由就是出在:

  • name屬性是同樣的,radio只讓選一個!
  • 咱們是直接把html內容複製過來的。

那麼咱們使用一個變量值,讓每次的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);

    });

仍是就是咱們不能刪除第一個銷售單元規格:

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

最小庫存單元屬性存放

咱們的最小庫存單元涉及到了兩張數據庫表:

這裏寫圖片描述

首先咱們來作逆向工程:

這裏寫圖片描述

設置SKU有一個集合來保存全部的特殊屬性值:

private List<EbSpecValue> 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>

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>

編寫Dao

public interface EbSkuDao {

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

}
/** * 繼承SqlSessionDaoSupport可以獲得sessionFactory的引用,很是方便! */
@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);
            }
        }

獲取獲得值:

這裏寫圖片描述

將Item數據存進數據庫

到目前爲止,咱們4個選項卡的數據均可以拿到了。所以,咱們能夠把Item所須要的對象存入數據庫了..

dao層編寫

public void saveItem(EbItem 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());
    }

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";
    }

檢查數據是否進去了

  • 項目的id是本身查詢出來的。
SELECT * from 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
相關文章
相關標籤/搜索