乐优商城第9,10两天,商品的新增,是整个后台系统最难的地方,尤其是前端页面,这里把中心放在后端代码和业务逻辑上

spu是一种商品的总称,比如小米8

sku是细分领域,比如xiaomi8 星空黑64G

商品的新增涉及4张表,spu,spudetail,sku,store

其实就是两张表spu和sku,但是spudetail数据量太为庞大,而且不常用,我们采取了垂直拆分的方式,而sku的库存,因为要经常读写,所以我们这里单独拆出了一张表stoke,为了读写分离。

我们这里有个 很重要的数据库思想

我们想一下,商品的规格参数信息数不胜数,我们如何操作,才能够让规格参数更好操作呢,我们来事想到了,每一个分类对应一个模版,因为同一个细分领域的事物,他一般就有相同的属性,所以,我们这里以分类id为id,建立一个模版,一个分类具有一个json格式的模版,这样商品的规格模版问题就完美解决了。

那么,参数模版的问题就被顺利地解决了

我们可以开始商品的新增了

首先,点击页面的新增按钮,会弹出对话框,

此时,我们需要去数据库中查询商品的分类信息,当我们选择完毕之后,我们会根据选择的cid,去查询他对应的品牌的信息

然后品牌就可以填写了。   接下来就是一些简单信息的填写,spu和spudetail的信息就填写完成。

接下来,是sku页面的显示,第一个页面是全局属性,是根据模版中的global来显示的

接下来,就是sku的特殊属性,特殊属性会根据笛卡尔积枢纽工程若干个,我们可以根据需求选择

最后,提交的时候,因为数据量过大,我们以json的格式进行提交

格式如下:

{
    "categories": [
        {
            "name": "手机",
            "id": 74
        },
        {
            "name": "手机通讯",
            "id": 75
        },
        {
            "name": "手机",
            "id": 76
        }
    ],
    "brandId": 1528,
    "title": "1111",
    "subTitle": "1",
    "spuDetail": {
        "packingList": "1",
        "afterService": "1",
        "description": "<p>11111</p>",
        "specTemplate": "{\"机身颜色\":[\"111111\"],\"内存\":[\"1GB及以下\"],\"机身存储\":[\"8GB及以下\"]}",
        "specifications": "[{\"group\":\"主体\",\"params\":[{\"k\":\"品牌\",\"searchable\":false,\"global\":true,\"v\":\"1\"},{\"k\":\"型号\",\"searchable\":false,\"global\":true,\"v\":\"1\"},{\"k\":\"上市年份\",\"searchable\":false,\"global\":true,\"numerical\":true,\"unit\":\"年\",\"v\":\"1\"}]},{\"group\":\"基本信息\",\"params\":[{\"k\":\"机身颜色\",\"searchable\":false,\"global\":false},{\"k\":\"机身重量(g)\",\"searchable\":false,\"global\":true,\"numerical\":true,\"unit\":\"g\",\"v\":\"1\"},{\"k\":\"机身材质工艺\",\"searchable\":false,\"global\":true,\"v\":\"1\"}]},{\"group\":\"操作系统\",\"params\":[{\"k\":\"操作系统\",\"searchable\":true,\"global\":true,\"v\":\"IOS\"}]},{\"group\":\"主芯片\",\"params\":[{\"k\":\"CPU品牌\",\"searchable\":true,\"global\":true,\"v\":\"骁龙(Snapdragon)\"},{\"k\":\"CPU型号\",\"searchable\":false,\"global\":true,\"v\":\"1\"},{\"k\":\"CPU核数\",\"searchable\":true,\"global\":true,\"v\":\"二核\"},{\"k\":\"CPU频率\",\"searchable\":true,\"global\":true,\"numerical\":true,\"unit\":\"GHz\",\"v\":\"1\"}]},{\"group\":\"存储\",\"params\":[{\"k\":\"内存\",\"searchable\":true,\"global\":false,\"numerical\":false,\"unit\":\"\"},{\"k\":\"机身存储\",\"searchable\":true,\"global\":false,\"numerical\":false,\"unit\":\"\"}]},{\"group\":\"屏幕\",\"params\":[{\"k\":\"主屏幕尺寸(英寸)\",\"searchable\":true,\"global\":true,\"numerical\":true,\"unit\":\"英寸\",\"v\":\"1\"},{\"k\":\"分辨率\",\"searchable\":false,\"global\":true,\"v\":\"1\"}]},{\"group\":\"摄像头\",\"params\":[{\"k\":\"前置摄像头\",\"searchable\":true,\"global\":true,\"numerical\":true,\"unit\":\"万\",\"v\":\"1\"},{\"k\":\"后置摄像头\",\"searchable\":true,\"global\":true,\"numerical\":true,\"unit\":\"万\",\"v\":\"1\"}]},{\"group\":\"电池信息\",\"params\":[{\"k\":\"电池容量(mAh)\",\"searchable\":true,\"global\":true,\"numerical\":true,\"unit\":\"mAh\",\"v\":\"1\"}]}]"
    },
    "cid1": 74,
    "cid2": 75,
    "cid3": 76,
    "skus": [
        {
            "id": null,
            "enable": true,
            "title": "1111 8GB及以下 1GB及以下 111111",
            "images": "",
            "ownSpec": "{\"机身存储\":\"8GB及以下\",\"内存\":\"1GB及以下\",\"机身颜色\":\"111111\"}",
            "indexes": "0_0_0",
            "stock": null
        }
    ]

}

这样,spu和sku的数据就齐全了,spu,spudetail,skus(一个sku的集合),这样就全了

下面,我们来到后端代码的书写

首先,我们是post方式提交,而且是json,我们用@ResquestBody来接收

@PostMapping
public ResponseEntity<Void> addGoods(@RequestBody GoodsBo goods){
    this.goodsService.addGoods(goods);
    return ResponseEntity.status(HttpStatus.OK).body(null);
}

goods是一个实体类,里面包含了我们要提交的所有数据

public class GoodsBo extends Spu {

    private SpuDetail spuDetail;

    private List<Sku> skus;

继承自spu,新增spudetail,skus,这样就可以完美接收传过来的数据了,然后就是四个表的数据的新增

,数据的新增很简单,直接亮出代码

public void addGoods(GoodsBo goods) {

    //保存spu
    Spu spu = new Spu();
    BeanUtils.copyProperties(goods, spu);
    long currentTimeMillis = System.currentTimeMillis();
    Date date = new Date(currentTimeMillis);

    spu.setSaleable(true);
    spu.setValid(true);
    spu.setCreateTime(date);

    spu.setLastUpdateTime(date);
    spuMapper.insertSelective(spu);

    //保存spuDetail
    SpuDetail spuDetail = goods.getSpuDetail();
    spuDetail.setSpuId(spu.getId());
    spuDetailMapper.insertSelective(spuDetail);

    //保存sku和store
    List<Sku> skus = goods.getSkus();

    for (Sku sku : skus) {
        sku.setSpuId(spu.getId());
        sku.setEnable(true);
        sku.setCreateTime(date);
        sku.setLastUpdateTime(date);

        skuMapper.insertSelective(sku);
        Stock stock = new Stock();
        Long stocks = sku.getStock();

        stock.setStock(stocks);
        stock.setSkuId(sku.getId());
        stockMapper.insertSelective(stock);
    }

当然了,这当中,我肯定也遇到了各种问题,其中最叼的一个坑是数据类型的不一致,前端传过来的库存字段stock是一个对象,而我后端接收的是一个基本数据类型,这样导致,我的addGoods方法根本进不来。。。。。。。。这个是最大方的坑,可能以后还会经常遇到吧

乐优商城第九天,第十天,(商品规格参数模版的新增,商品的新增)相关推荐

  1. 乐优商城之基本搜索(十四)

    文章目录 (一)搭建搜索微服务 (二)结合页面设计Goods数据模型 (三)商品微服务提供接口 (四)根据spu构建Goods (五)完成数据导入功能 (六)完成基本查询 (一)搭建搜索微服务 mav ...

  2. 乐优商城(十)用户注册

    文章目录 1. 搭建用户微服务 1.1 用户微服务的结构 1.2 创建 leyou-user 1.3 创建 leyou-user-interface 1.4 创建 leyou-user-service ...

  3. 乐优商城之项目搭建(四)

    文章目录 (一)项目分类 (二)电商行业 (三)专业术语 (四)项目介绍 (五)技术选型 (六)开发环境 (七)搭建后台环境:父工程 (八)搭建后台环境:eureka (九)搭建后台环境:zuul ( ...

  4. 乐优商城源码/数据库及笔记总结

    文章目录 1 源码 2 笔记 2.1 项目概述 2.2 微服务 3 项目优化 4 项目或学习过程中涉及到的设计模式 5 安全问题 6 高内聚低耦合的体现 7 项目中待优化的地方 1 源码 Github ...

  5. 【javaWeb微服务架构项目——乐优商城day15】——会调用订单系统接口,实现订单结算功能,实现微信支付功能

    0.学习目标 会调用订单系统接口 实现订单结算功能 实现微信支付功能 源码笔记及资料: 链接:https://pan.baidu.com/s/1_opfL63P1pzH3rzLnbFiNw 提取码:v ...

  6. 乐优商城(四)商品规格管理

    文章目录 1. 商品规格 1.1 SPU 和 SKU 1.2 分析商品规格的关系 1.3 数据库设计 1.3.1 商品规格组表 1.3.2 商品规格参数表 2. 商品规格组 2.1 商品规格组前端 2 ...

  7. 【javaWeb微服务架构项目——乐优商城day05】——商品规格参数管理(增、删、改,查已完成),SPU和SKU数据结构,商品查询

    乐优商城day05 0.学习目标 1.商品规格数据结构 1.1.SPU和SKU 1.2.数据库设计分析 1.2.1.思考并发现问题 1.2.2.分析规格参数 1.2.3.SKU的特有属性 1.2.4. ...

  8. 乐优商城之分类查询品牌查询(八)

    文章目录 (一)编写分类查询 (二)跨域问题 (三)cors跨域原理 (四)解决跨域问题 (五)品牌查询页面分析 (六)品牌查询后台代码 (七)分页查询排序的原理 (八)axios (一)编写分类查询 ...

  9. 乐优商城(05)--商品管理

    乐优商城(05)–商品管理 一.导入图片资源 现在商品表中虽然有数据,但是所有的图片信息都是无法访问的,因此需要把图片导入到服务器中: 将images.zip文件上传至/leyou/static目录: ...

  10. 乐优商城(填坑)——后台登录

    后台管理模块增加登录验证,与门户网站一样都是采用无状态登录. 一.新增全局函数 在main.js中新增用户验证: 二.修改路由 先显示登录页面 效果: 三.解决cookie写入问题 在http.js中 ...

最新文章

  1. 关于JS中的JSON
  2. 实例:ABAP权限对象设计与权限检查的实现
  3. NOIP2018比赛总结
  4. java泛型方法 通配符_Java泛型教程–示例类,接口,方法,通配符等
  5. 噪音曲线图测试软件,利用示波器统计工具分析有噪声信号之测量统计和余晖图...
  6. 阿里云k8s私有仓库registry操作管理
  7. 六、Spring MVC之返回数据
  8. sql server 函数--rand() 生成整数的随机数
  9. python 成语库_python实现成语找一找
  10. 通信原理 AMI码和HDB3码的编码方式
  11. P1878 舞蹈课(二叉堆)
  12. 死亡、疾病、意外,如何面对?
  13. 鸿蒙思维闪卡训练,提高孩子智力,父母不妨使用思维导图来提升孩子记忆力和创造力...
  14. arduino 源码分层浅析
  15. 在Keil MDK编译环境下使用UEstudio编写程序
  16. 一眼“看穿破绽”,3D视觉成锂电池“智造”降本增效利器
  17. 识别图片中的圆形并求所有圆形的平均半径
  18. iphone android换机助手下载,腾讯换机助手手机最新版 目前最好用的安卓/苹果一键换机工具...
  19. android fps 获取,Android下获取FPS的几种方法
  20. Lemon Parser Generator

热门文章

  1. HTTP请求过程——Chrome浏览器Network详解
  2. python显示单片机温度_基于Python串口和单片机的实时温度采集系统
  3. 001# 大家好,打招呼啦!
  4. 数字频率系数测试软件,基于单片机简易数字频率计设计方案汇总
  5. linux的4k播放器,【Linux1GB4K(3840*2160)电视播放器】Linux1GB4K(3840*2160)电视播放器报价及图片大全-列表版-ZOL中关村在线...
  6. 集中器与本地通信模块的交互流程
  7. vb在服务器上新建文件夹,VB 创建文件夹
  8. 2021年4月-(计算机网络)小型校园网络模拟搭建,最全最准确版!!!!!
  9. excel常用函数大全及示例(一)
  10. 谷歌翻译退出中国市场?我们还有这个!