ITPub博客

首页 > IT职业 > IT图书 > 移动商城第四篇(商品管理)【添加商品续篇、商品审核和上下架、前台展示、

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

IT图书 作者:socall 时间:2021-09-09 09:11:05 0 删除 编辑

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

编写dao


/**
 * 继承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);
    }

编写service


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

    }

controller


    @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();
});
不限 ${val}

图片描述

接收参数数据

    /**
     * 接收条件,查询出符合条件的商品
     * @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+"&paraStr="+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


 
总结
  • 第三个选项卡是展示商品的普通属性字段的,拿到数据库的所有普通属性字段,在页面上判断输入的方式是哪一个,按照不同的输入方式来展示(有的下拉框、有的多选框、有的单选框)
  • 展示完之后,那我们怎么获取选中的数据呢???页面上又有下拉框、又有多选框什么的。单单通过字符串数据的方式获取选中的数据是不行的。因为我们无法判断该属性是哪种输入方式。
    • 我们可以这样干:页面展示的数据都是我们后台查询出来的。那么我们只要遍历原来的集合,获取选中的Id。
    • 在遍历期间判断输入方式,如果是多选框,那我们就获取其字符串数组、如果是单选框、那么就直接获取其id。
    • 只要id吻合了,那么就是页面选中的数据。只要将被选中的数据封装到对象中。
  • 当然了,一个商品也是有很多参数的,在Dao层用集合来进行保存所有的参数,商品的Id也是需要外界传递进来的。用一个Session就要把所有的数据存入到数据库中。
  • 对于最小销售单元,我们查询出特殊的属性在页面上展示。可能需要多个规格,可以使用Jquery来进行复制。
    • 复制出来是会有问题的:name属性的名字是相同的,于是一个规格和第二个规格就会互斥、我们后台也不能拿到数据
    • 既然知道根本的原因是name属性,我们只要在复制后,改变name属性的名称即可。我们通过一个变量,既可以记录我们增添了多少个规格,又可以用来标识不同的name属性
    • 在复制完之后,使用正则表达式把对应的name名称替换即可了。
  • 一个商品也对应着多个销售单元的,因此还是用集合来进行保存。同样需要外界对商品的Id传入。由于Sku和SkuValue需要同时在页面上展示,那么Sku还是需要使用List来维护SkuValue的。
  • 在保存Sku时和ParaValue的逻辑是差不多的。
  • 查看商品审核的数据本质上就是有条件地查询商品。与我们之前查询商品的逻辑代码是一样的
  • 对于数据回显来说,还是一样,如果属性是表单内的。我们就判断或者直接进行回显。如果是表单外的数据,我们就通过隐藏域获取该值。通过Jquery来进行控制回显。
  • 处理审核的时候,我们将审核的记录添加到数据库表中。要做到两个JavaScript方法共享数据:我们可以将数据使用form表单,表单内使用隐藏域。Jquery为隐藏域赋值就行了。最后提交表单
  • 商品的上下架和商品审核逻辑几乎一样
  • 准备前台页面,在web.xml一样是需要加载我们Core模块的bean.xml文件。需要自己手动去写一个springMVC的配置文件。
  • 在筛选后台的时候,接收类型可以分成三类
    • 价钱
    • 品牌Id
    • 要被筛选的条件。
  • 对于这三类,我们很容易就能够把他们显示出来。最主要的问题是获取他们这些数据、然后根据这些数据进行查询
    • 我是这样做的:把他们关联的表一次性写出来,内连接他们的相同条件。
      • 价钱参数使用between and关键字来搜索
      • 品牌用等值连接
      • 被选中的参数用动态的SQL来进行查询
      • 还有值得注意的就是最小销售单元,一般我们只会在页面上显示最低价的那款商品。因此我们用到分组函数。
  • 对于标准答案,是将被选中的参数使用exist关键字来对其进行过滤。一个条件对应一个exist。至于他俩有什么区别我倒不知道了,知道了再回来补吧。
  • 那怎么获取这三类的值呢??可以在每个a标签上自定义类型,还有对应的值。当点击其中一个标签的时候,遍历这些标签,获取他们的值。
    • 价钱使用字符串来接收,是一个范围。我们接收完在后台切割就行了。
    • 品牌直接使用Long类型接收
    • 被选中的标签也可以使用字符串来接收,同样在后台切割就行了。
  • 由于我们有3个参数、Dao层使用map集合来接收。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/3536/viewspace-2800098/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-08-30

  • 博文量
    80
  • 访问量
    559