属性选项卡
第三个选项卡涉及到了我们的手机属性,因此,还是需要用到我们其他的数据库表:EB_FEATURE
继续做逆向工程:
![这里写图片描述 640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/342b6ed98013f6728a597e80fe3ef420.jpeg)
查询出普通属性和特殊属性:
<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](https://i-blog.csdnimg.cn/blog_migrate/5397b4fc5b8e2aa5c936648b5632b398.jpeg)
因此,我们需要对EB_PARA_VALUE做逆向工程!
![这里写图片描述 640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/282987b84b3499978f6dcacc2a4f1de3.jpeg)
我们参数表的主键是不需要被其他的表用的, 因此我们直接使用序列来管理进行的。并不需要主键返回
<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](https://i-blog.csdnimg.cn/blog_migrate/0ee0ddc90c22519eabcacc255d10b3c1.jpeg)
<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](https://i-blog.csdnimg.cn/blog_migrate/6948491c989f7e6e1d800287fe80c90e.png)
当我们想点击增加规格的时候,就应该多那么一个div在页面上显示!那为什么我们需要多个规格呢??如下所示:
![这里写图片描述 640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/1bd21ee78240d7e657fb37008879dd5d.jpeg)
对该按钮添加单击事件
//实现页面规格的自动增加和删除 $("#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](https://i-blog.csdnimg.cn/blog_migrate/904a9080ee53533e5c64e64c1228955f.jpeg)
首先我们来做逆向工程:
![这里写图片描述 640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/0ca2c1d28a357fe468a8fb0310f4d926.jpeg)
设置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](https://i-blog.csdnimg.cn/blog_migrate/920ffcb5378de75d6c1fb028d4597279.jpeg)
将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](https://i-blog.csdnimg.cn/blog_migrate/fef0b8661327e34cc28ccb916d3d2621.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](https://i-blog.csdnimg.cn/blog_migrate/5fb598cce6fa9c3ccaec40b6a3ed21b3.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](https://i-blog.csdnimg.cn/blog_migrate/ed272ee87ea134f6ade542e1d88e71a3.jpeg)
查询条件以及回显:
<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](https://i-blog.csdnimg.cn/blog_migrate/7bee106673bb58f6be807ca1cb016ce4.png)
根据审核条件的不同,在显示商品的url中也应该是不同的。
![这里写图片描述 640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/dffc45f9adfb45183cc4b818f5366f76.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](https://i-blog.csdnimg.cn/blog_migrate/221ff6931a1949614032d0d2df328a10.jpeg)
既然我们要操作到表,我们就得逆向工厂…
![这里写图片描述 640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/7430c241a545a2ab4a86d0b6e7ed17df.jpeg)
设置主键为自动增长
<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](https://i-blog.csdnimg.cn/blog_migrate/4106f3293d8dd9e73fd785bf6d2d161d.jpeg)
根据不同的状态给出不同的超链接:
<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](https://i-blog.csdnimg.cn/blog_migrate/df0f1bfe324d664632cea852bfd1bdc1.png)
总结
如果文章有错的地方欢迎指正,大家互相交流。习惯在微信看技术文章,想要获取更多的Java资源的同学,可以关注微信公众号:Java3y