第三個選項卡涉及到了咱們的手機屬性,所以,仍是須要用到咱們其餘的數據庫表: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實現正則表達式
/** * 繼承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顯示普通屬性:ruby
<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} </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} </c:forEach> </c:if> </p> </c:forEach> </div>
想要把咱們在頁面上選定的基本屬性進行保存的話,咱們是使用另外一張表來進行保存的。Featrue表僅僅保存了相對應的屬性,是不作保存功能的!bash
所以,咱們須要對EB_PARA_VALUE作逆向工程!markdown
咱們參數表的主鍵是不須要被其餘的表用的, 所以咱們直接使用序列來管理進行的。並不須要主鍵返回session
<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>
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是怎麼接收的呢???
咱們將JSP頁面的name屬性都設置爲咱們的featureId
因爲咱們該頁面上的數據都是從數據庫中查詢出來的,數據庫中的記錄有多少,在頁面上顯示的就有多少
所以,咱們能夠這麼幹:
代碼:
//查詢出全部的屬性數據
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屬性都不同便可!
//獲得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>
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);
}
}
}
}
//使用集合來進行裝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);
}
}
獲取獲得值:
到目前爲止,咱們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";
}
檢查數據是否進去了
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