tags: 移动商城项目
查询出未审核的商品其实就是条件查询的一种,因此该controller的代码和列出商品的代码几乎一样。
@RequestMapping("/listAudit.do")
public String listAudit(QueryCondition queryCondition,Model model) {
//查询出所有的品牌
List 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并且随着条件,样式发生改变:

全部
待审核
审核不通过
已审核
审核通过和不通过总会有理由的,对于我们的理由我们使用一张表来保存的。
function isPass(itemId, auditStatus){
//修改浮动层的标题
$("#addItemNoteH2").html("商品审核");
//清空内容
$("#itemNote").val("");
tipShow("#addItemNote");
//给表单赋值
$("#itemId").val(itemId);
$("#myAuditStatus").val(auditStatus);
} 使用表单来处理我们的操作。其中notes是我们弹出框的数据。
响应事件,给表单赋值,提交表单
$("#addItemNoteConfirm").click(function(){
var notes = $("#itemNote").val();
//给表单赋值
$("#notes").val(notes);
//提交表单
$("#auditForm").submit();
}); 我们是使用EB_CONSOLE_LOG这张数据表来保存我们后台操作的日志记录的。
表的字段如下:

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

设置主键为自动增长
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})
/**
* 继承SqlSessionDaoSupport能够得到sessionFactory的引用,非常方便!
*/
@Repository
public class EbConsoleLogDaoImpl extends SqlSessionDaoSupport implements EbConsoleLogDao {
String nameSpace = "com.rl.ecps.sqlMap.EbConsoleLogMapper.";
public void saveConsoleLog(EbConsoleLog ConsoleLog) {
this.getSqlSession().insert(nameSpace + "insert", ConsoleLog);
}
}
修改商品的属性,由于修改的状态个数是未知的,因此我们使用动态修改:
public void updateItem(EbItem ebItem) {
this.getSqlSession().update(nameSpace + "updateByPrimaryKeySelective", ebItem);
}
public void updateItem(Long itemId, Short auditStatus, String notes) {
//设置item的属性
EbItem ebItem = new EbItem();
ebItem.setItemId(itemId);
ebItem.setAuditStatus(auditStatus);
ebItem.setCheckerUserId((long) 222);
ebItem.setCheckTime(new Date());
//更新item
itemDao.updateItem(ebItem);
//操作日志
EbConsoleLog ebConsoleLog = new EbConsoleLog();
ebConsoleLog.setEntityId(itemId);
ebConsoleLog.setEntityName("商品表");
ebConsoleLog.setNotes(notes);
ebConsoleLog.setOpTime(new Date());
if(auditStatus == 1){
ebConsoleLog.setOpType("审核通过");
}else{
ebConsoleLog.setOpType("审核不通过");
}
ebConsoleLog.setTableName("EB_ITEM");
ebConsoleLog.setUserId(1l);
logDao.saveConsoleLog(ebConsoleLog);
}
@RequestMapping("/auditItem.do")
public String auditItem(Long itemId, Short auditStatus, String notes) throws IOException {
itemService.updateItem(itemId, auditStatus, notes);
return "redirect:listAudit.do";
}
把商品的状态修改了,并且已经把操作记录写到数据库表中了。

给表单赋值
function isShow(itemId, showStatus) {
tipShow("#confirm");
//给表单赋值
$("#itemId").val(itemId);
$("#myShowStatus").val(showStatus);
} 在弹出框中绑定提交事件,提交表单
$("#confirmOk").click(function () {
$("#showForm").submit();
}); 
/**
* 接收条件,查询出符合条件的商品
* @param brandId 品牌id
* @param price 价钱
* @param param 被选中的参数
* @return
*/
@RequestMapping("listItem.do")
public String listItem(Long brandId, String price, String param) {
return "phoneClassification";
} 参数我们已经知道了,那我们怎么写这个SQL语句呢??
我的分析是这样子的:
/**
根据价钱,品牌,被选中属性查询符合条件的商品
涉及到的表:
1.商品
2.商品
3.参数值
4.价钱
*/
SELECT *
FROM EB_BRAND brand, EB_ITEM item, EB_PARA_VALUE para, EB_SKU sku
WHERE brand.BRAND_ID = item.BRAND_ID AND
para.ITEM_ID = item.ITEM_ID AND
sku.ITEM_ID = item.ITEM_ID AND
brand.BRAND_ID = 1002 AND
sku.SKU_PRICE BETWEEN 1 AND 800000 AND
para.PARA_VALUE = 'Android4.0';
在价钱中是一个范围,因此我们用between and 语法,而我们的参数传递过来可能是与很多的,因此只要我们使用动态SQL循环就行了。
因此,我们的mapper中的SQL是这样子的。
由于我们的展示数据还需要价钱,返回的basemap不够用。我们就新创建了一个Map
在实体中给予对应的属性
private BigDecimal skuPrice;
public BigDecimal getSkuPrice() {
return skuPrice;
}
public void setSkuPrice(BigDecimal skuPrice) {
this.skuPrice = skuPrice;
} 编写Dao和Service dao实现
public List listItem(Map map) {
return this.getSqlSession().selectList(nameSpace + "listItem", map);
} service实现
public List listItem(Long brandId, String price, String param) {
Map map = new HashedMap();
map.put("brandId", brandId);
//将价钱进行分割成两部分
if (StringUtils.isNotBlank(price)) {
String[] strings = price.split(",");
map.put("minPrice", strings[0]);
map.put("maxPrice", strings[1]);
}
//分割并装载到map中
List list = new ArrayList();
if (StringUtils.isNotBlank(param)) {
String[] paras = param.split(",");
for (String para : paras) {
list.add(para);
}
map.put("paraList", list);
}
return itemDao.listItem(map);
} 前台请求 
基于这么一个需求,当我们点击一个条件的时候,我们要把当前所有获取的条件都获取出来。然后提交给服务器端就行了!
在点击选中事件上,我们获取数据
//使用变量状态我们的数据
var price = "";
var brandId = "";
var paraStr = "";
$(".filter li a").each(function () {
//拿到选中的超链接
var clazz = $(this).attr("class");
if (clazz == "here") {
//得到他们的类型【在html中我们自定义了3个类型】
var myType = $(this).attr("myType");
//根据不同的类型,对其进行不同的操作
if (myType == "brand") {
brandId = $(this).attr("myBrandValue")
} else if (myType == "price") {
price = $(this).attr("myPriceValue");
} else if (myType == "para" && $(this).attr("myParaValue") != null) {
var val = $(this).attr("myParaValue");
paraStr = paraStr + val+",";
}
}
});
alert(price + "---" + brandId + "---" + paraStr);

修改iframe的请求路径,把我们的参数带过去
var iframePath = "${path}/item/listItem.do?price="+price+"&brandId="+brandId+"¶Str="+paraStr;
$("#itemListIframe").attr("src", iframePath); controller /**
* 接收条件,查询出符合条件的商品
*
* @param brandId 品牌id
* @param price 价钱
* @param paraStr 被选中的参数
* @return
*/
@RequestMapping("/listItem.do")
public String listItem(Long brandId, String price, String paraStr, Model model) {
// TODO 基本效果出来了,但条件查询还有问题。
List items = itemService.listItem(brandId, price, paraStr);
model.addAttribute("items", items);
return "phoneClassification";
}
我们在查询的时候,发现很多相同价钱的手机都展示出来的。讲道理我们只要展示最低价钱那款就行了

想要展示最低价那款,还是要去修改SQL语句。需要用到分组函数了。
首先我有这么一个商品

它有两个最小销售单元,一般我们在页面上显示最便宜的那个就行了。

我们的SQL语句可以写成这样:
SELECT min(sku.SKU_PRICE) SKU_PRICE ,item.*
FROM EB_ITEM item, EB_PARA_VALUE para, EB_SKU sku
WHERE para.ITEM_ID = item.ITEM_ID
AND sku.ITEM_ID = item.ITEM_ID
AND item.BRAND_ID = 3069
AND sku.SKU_PRICE BETWEEN 1 AND 1000000
AND para.PARA_VALUE = 'Android'
AND item.ITEM_ID=3080
GROUP BY item.ITEM_ID,
item.ITEM_NAME,
item.ITEM_NO,
item.BRAND_ID,
item.CAT_ID,
item.TAG_IMG_ID,
item.TAG_IMG,
item.IS_NEW,
item.IS_GOOD,
item.IS_HOT,
item.PROMOTION,
item.AUDIT_STATUS,
item.SHOW_STATUS,
item.IMGS,
item.KEYWORDS,
item.PAGE_DESC,
item.ITEM_RECYCLE,
item.ON_SALE_TIME,
item.CHECK_TIME,
item.UPDATE_TIME,
item.UPDATE_USER_ID,
item.CREATE_TIME,
item.CHECKER_USER_ID,
item.FULL_PATH_DEPLOY,
item.FULL_PATH_DEPLOY_OFFER,
item.ORIGINAL_ITEM_ID,
item.LAST_STATUS,
item.MERCHANT_ID,
item.ITEM_SORT,
item.SALES,
item.CREATE_USER_ID,
item.SIM_LEVEL,
item.GIFT_DESC,
item.GIFT_IMG,
item.GIFT_SHOW_TYPE,
item.IMG_SIZE1
order by item.item_id desc 修改一下Mapper中的SQL语句:
再次查看的时候,只出现一台了。
标准答案的SQL是使用exists关键字来进行查询的:在单表查询的情况下,看有没有符合条件的数据,如果符合,那么exists为ture
总结 来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/3536/viewspace-2800098/ ,如需转载,请注明出处,否则将追究法律责任。