SKU商品信息录入思路以及代码具体实现 - Springboot+AngularJS

简介: SKU=Stock Keeping Unit(库存量单位),即库存进出计量的单位,可以是以件,盒,托盘等为单位。SKU这是对于大型连锁超市DC(配送中心)物流管理的一个必要的方法。当下已经被我们引申为产品统一编号的简称,每种产品均对应有唯一的SKU号。

SKU:


SKU=Stock Keeping Unit(库存量单位),即库存进出计量的单位,可以是以件,盒,托盘等为单位。SKU这是对于大型连锁超市DC(配送中心)物流管理的一个必要的方法。当下已经被我们引申为产品统一编号的简称,每种产品均对应有唯一的SKU号。


针对电商而言,SKU有另外的注解:


1、SKU是指一款商品,每款都有出现一个SKU,便于电商品牌识别商品。


2、一款商品多色,则是有多个SKU,例:一件衣服,有红色、白色、蓝色,则SKU编码也不相同,如相同则会出现混淆,发错货。


与SPU关系:


SPU = Standard Product Unit (标准化产品单元)


SPU 是商品信息聚合的最小单位。


再加上颜色白色,尺码4.0,即表示一个SKU


SPU + 颜色 + 尺码,就是一个SKU,SKU是从属于SPU的关系


实现思路:


1、先定义一个初始化的不带规格名称的集合,只有一条记录


2、每选一个规格选项,则增加一行


3、如何实现增加一行?克隆


4、克隆分两种:浅克隆与深克隆(后端可以使用fastJSON)


 4.1、浅克隆:var a={}; var b=a;  当a发生改变时,b会跟着变化,b变化时a也会跟着变化,因为两个是同一引用地址


4.2、深克隆:var a={'name':'helloworld'}; var b={'name':'helloworld'};  a与b的内容完全一样,但是两个对象。


5、深克隆其实就是重新构建一个对象,将所有的值都复制到b,但逐个属性复制效率低,所以可以利用js中JSON类中的stringify()方法(将对象转成JSON字符串)


5.1、先利用stringify()方法,将对象转成JSON字符串,再使用parse()方法转回对象


var b=JSON.parse(JSON.stringify(a));

6、规格项后半部分较为固定,但前半部分是动态获取的,如何展示?


 //6.1、构造一个集合,集合中的对象就代表每一个规格项,spec:{}代表的就是动态获取的部分,将其封装成对象(规格项作为key) 
var list=[{spec:{'网络':'4G','屏幕':'6.5寸'},'price':1024,'count':1024}]


7、数据最终提交到item表中,item的标题由后端负责拼接:xxx手机+选中的规格项


代码实现:


1、前端创建SKU列表:


//创建SKU列表
$scope.createItemList=function(){
  //组合实体类中定义,构建初始值,列表初始化(需要深克隆,所以需要事先构建)
  $scope.entity.itemList=[{spec:{},price:0,num:99999,status:'0',isDefault:'0'}];
  //根据页面所选择的规格项来循环
  var items = $scope.entity.goodsDesc.specificationItems;
  for(var i=0;i<items.length;i++){
    $scope.entity.itemList = addColumn($scope.entity.itemList,items[i].attributeName,items[i].attributeValue);    
  }
}


2、AngularJS的controller层定义私有方法:


//Controller私有方法
addColumn=function(list,columnName,columnValues){
  //获取原来的集合,返回生成后的集合
  var newList=[];
  //循环原列表,得到集合中的每一条记录
  for(var i=0;i<list.length;i++){
    var oldRow = list[i];
    for(var j=0;j<columnValues.length;j++){
      var newRow = JSON.parse(JSON.stringify(oldRow));
      newRow.spec[columnName] = columnValues[j];
      newList.push(newRow);
    }
  }
  return newList;
}

3、后台实现方法:


        /**
   * 增加
   */
  @Override
  public void add(Goods goods) {
    //商品状态为未审核
    goods.getGoods().setAuditStatus("0");
    //插入商品基本信息
    goodsMapper.insert(goods.getGoods()); 
    //将商品基本表信息id给商品扩展表信息id 
    goods.getGoodsDesc().setGoodsId(goods.getGoods().getId());
    //插入扩展表信息
    goodsDescMapper.insert(goods.getGoodsDesc());
    if("1".equals(goods.getGoods().getIsEnableSpec())) {
      //获取到前端封装好的列表数据
      for (TbItem item: goods.getItemList()) {
        //构建标题 SPU名称+规格选项值
        String title = goods.getGoods().getGoodsName();//SPU名称
        //前端传过来的spec,解析之后就是:{"内存":"16G","网络":"全网通"}
        Map<String, Object> map = JSON.parseObject(item.getSpec());
        for(String key:map.keySet()) {
          title += " "+map.get(key);
        }
        item.setTitle(title);
        setItemValues(item, goods);
        itemMapper.insert(item);
      }
    }else {
      //没有启用规格选项
      TbItem item = new TbItem();
      item.setTitle(goods.getGoods().getGoodsName());
      item.setPrice(goods.getGoods().getPrice());
      item.setNum(99999);
      item.setStatus("1");
      item.setIsDefault("1");
      //避免存入null数据
      item.setSpec("{}");
      setItemValues(item, goods);
      itemMapper.insert(item);
    }
  }
  private void setItemValues(TbItem item, Goods goods) {
    //商品分类
    item.setCategoryid(goods.getGoods().getCategory3Id());
    //创建日期、更新日期
    item.setCreateTime(new Date());
    item.setUpdateTime(new Date());
    //商品id
    item.setGoodsId(goods.getGoods().getId());
    //商家id
    item.setSellerId(goods.getGoods().getSellerId());
    //分类名称
    TbItemCat itemCat = itemCatMapper.selectByPrimaryKey(goods.getGoods().getCategory3Id());
    item.setCategory(itemCat.getName());
    //品牌名称
    TbBrand brand = brandMapper.selectByPrimaryKey(goods.getGoods().getBrandId());
    item.setBrand(brand.getName());
    //商家名称(店铺名称)
    TbSeller seller = sellerMapper.selectByPrimaryKey(goods.getGoods().getSellerId());
    item.setSeller(seller.getNickName());
    //图片
    List<Map> list = JSON.parseArray(goods.getGoodsDesc().getItemImages(), Map.class);
    if(list.size() > 0) {
      item.setImage((String)list.get(0).get("url"));
    }
  }


目录
相关文章
|
1月前
|
SQL 监控 Java
在IDEA 、springboot中使用切面aop实现日志信息的记录到数据库
这篇文章介绍了如何在IDEA和Spring Boot中使用AOP技术实现日志信息的记录到数据库的详细步骤和代码示例。
在IDEA 、springboot中使用切面aop实现日志信息的记录到数据库
|
1月前
|
Java 数据安全/隐私保护 Spring
揭秘Spring Boot自定义注解的魔法:三个实用场景让你的代码更加优雅高效
揭秘Spring Boot自定义注解的魔法:三个实用场景让你的代码更加优雅高效
|
1月前
|
前端开发 IDE Java
"揭秘前端转Java的秘径:SpringBoot Web极速入门,掌握分层解耦艺术,让你的后端代码飞起来,你敢来挑战吗?"
【8月更文挑战第19天】面向前端开发者介绍Spring Boot后端开发,通过简化Spring应用搭建,快速实现Web应用。本文以创建“Hello World”应用为例,展示项目基本结构与运行方式。进而深入探讨三层架构(Controller、Service、DAO)下的分层解耦概念,通过员工信息管理示例,演示各层如何协作及依赖注入的使用,以此提升代码灵活性与可维护性。
34 2
|
1月前
|
前端开发 数据库
SpringBoot+Vue实现商品不能重复加入购物车、购物车中展示商品的信息、删除商品重点提示等操作。如何点击图片实现图片放大
这篇文章介绍了如何在SpringBoot+Vue框架下实现购物车功能,包括防止商品重复加入、展示商品信息、删除商品时的提示,以及点击图片放大的前端实现。
SpringBoot+Vue实现商品不能重复加入购物车、购物车中展示商品的信息、删除商品重点提示等操作。如何点击图片实现图片放大
|
1月前
|
JSON JavaScript 前端开发
基于SpringBoot + Vue实现单个文件上传(带上Token和其它表单信息)的前后端完整过程
本文介绍了在SpringBoot + Vue项目中实现单个文件上传的同时携带Token和其它表单信息的前后端完整流程,包括后端SpringBoot的文件上传处理和前端Vue使用FormData进行表单数据和文件的上传。
110 0
基于SpringBoot + Vue实现单个文件上传(带上Token和其它表单信息)的前后端完整过程
|
1月前
|
数据库
elementUi使用dialog的进行信息的添加、删除表格数据时进行信息提示。删除或者添加成功的信息提示(SpringBoot+Vue+MybatisPlus)
这篇文章介绍了如何在基于SpringBoot+Vue+MybatisPlus的项目中使用elementUI的dialog组件进行用户信息的添加和删除操作,包括弹窗表单的设置、信息提交、数据库操作以及删除前的信息提示和确认。
elementUi使用dialog的进行信息的添加、删除表格数据时进行信息提示。删除或者添加成功的信息提示(SpringBoot+Vue+MybatisPlus)
|
1月前
|
XML Java Maven
logback在springBoot项目中的使用 springboot中使用日志进行持久化保存日志信息
这篇文章详细介绍了如何在Spring Boot项目中使用logback进行日志记录,包括Maven依赖配置、logback配置文件的编写,以及实现的日志持久化和控制台输出效果。
logback在springBoot项目中的使用 springboot中使用日志进行持久化保存日志信息
|
1月前
|
安全 Java Shell
"SpringBoot防窥秘籍大公开!ProGuard混淆+xjar加密,让你的代码穿上隐形斗篷,黑客也无奈!"
【8月更文挑战第11天】开发SpringBoot应用时,保护代码免遭反编译至关重要。本文介绍如何运用ProGuard和xjar强化安全性。ProGuard能混淆代码,去除未使用的部分,压缩字节码,使反编译困难。需配置ProGuard规则文件并处理jar包。xjar则进一步加密jar包内容,即使被解压也无法直接读取。结合使用这两种工具可显著提高代码安全性,有效保护商业机密及知识产权。
165 3
|
1月前
|
Java API 数据格式
Spring Boot API参数读取秘籍大公开!6大神器助你秒变参数处理大师,让你的代码飞起来!
【8月更文挑战第4天】Spring Boot凭借其便捷的开发和配置特性,成为构建微服务的热门选择。高效处理HTTP请求参数至关重要。本文介绍六种核心方法:查询参数利用`@RequestParam`;路径变量采用`@PathVariable`;请求体通过`@RequestBody`自动绑定;表单数据借助`@ModelAttribute`或`@RequestParam`;请求头使用`@RequestHeader`;Cookie则依靠`@CookieValue`。每种方法针对不同场景,灵活运用可提升应用性能与用户体验。
44 9