商品发布功能

文章目录

    • 1.SPU和SKU介绍
        • 1.SPU
        • 2.SKU
        • 3.两者之间的关系
    • 2.完成商品发布界面
        • 1.组件引入
          • 1.commoditylaunch.vue 引入到 src/views/modules/commodity下
          • 2.multiUpload.vue 引入到 src/components/upload/multiUpload.vue
        • 2.创建菜单
          • 1.创建目录
          • 2.创建菜单,注意菜单路由要匹配
          • 3.重启前端项目,查看界面
    • 3.选择分类联动显示品牌
        • 1.首先让分类以树形菜单的形式显示
          • 1.修改getCategorys请求的url为环境变量 + 资源路径
          • 2.访问测试
        • 2.思路分析
        • 3.后端 sunliving-commodity模块
          • 1.CategoryBrandRelationService.java 根据分类id获取关联的品牌
          • 2.CategoryBrandRelationServiceImpl.java 实现方法
          • 3.CategoryBrandRelationController.java 编写接口
          • 4.测试
        • 4.前端 commoditylaunch.vue
          • 1.查看getCatBrands方法,修改请求为环境变量 + 资源路径的形式
          • 2.测试
    • 4.完成获取某个分类关联的所有属性分组和这些分组关联的基本属性,并显示供发布选择
        • 1.设计VO类 包含一个属性组和该属性组关联的基本属性列表
        • 2.后端 sunliving-commodity模块
          • 1.AttrgroupService.java 根据分类id获取属性分组以及分组下的属性
          • 2.AttrgroupServiceImpl.java 实现方法
        • 3.前端 commoditylaunch.vue
          • 1.将showBaseAttrs方法的请求改成 环境变量 + 资源路径的形式
          • 2.后端编写接口
          • 3.postman测试
          • 4.前端测试,发现item.attrs是空的
          • 5.问题分析
          • 6.解决方式:让每一个属性组都至少有一个关联的属性即可
          • 7.再次访问测试
        • 4.可以看到目前的功能虽然可以正常实现,但是测试数据不是很好,所以重新设置一下数据
          • 1.分类管理
            • 1.以京东的这个页面为主
            • 2.设计
          • 2.品牌管理
            • 1.主要是小米和华为
            • 2.小米关联三个分类
            • 3.华为关联一个
          • 3.属性分组
            • 1.参考规格与包装
            • 2.性价比手机分类下有6个属性分组
          • 4.基本属性和销售属性
            • 1.参考小米手机购买页面
            • 2.基本属性
            • 3.销售属性
          • 5.对于这些数据的解释
            • 1.分类管理
            • 2.品牌管理
            • 3.属性分组
            • 4.基本属性
            • 5.销售属性
          • 6.表关联的示意图
    • 5.完成销售属性的显示
        • 1.前端分析 commoditylaunch.vue
          • 1.修改 commoditylaunch.vue的getShowSaleAttr方法的url为环境变量 + 资源路径的形式
          • 2.分析url发现前端请求携带分类管理的id,要求返回分页的销售属性
        • 2.后端 sunliving-commodity模块
          • 1.思路分析
          • 2.AttrService.java 销售属性分页查询,根据分类id
          • 3.AttrServiceImpl.java 实现方法
          • 4.AttrController.java 编写接口
          • 5.测试
        • 3.前后端联调
          • 1.前端访问
          • 2.发现这里应该使用逗号分隔才对,而不是几个可选项放在一起
            • 1.将这个复选框的分隔方式改成逗号即可
            • 2.基本属性那里也是要改动一下
          • 3.点击+自定义还是分号
          • 4.解决方式
            • 1.找到+自定义的输入框
            • 2.进入这个handleInputConfirm方法,修改分隔符为逗号
    • 6.生成SKU信息(前端完成)
        • 这个SKU信息就是基本属性+销售属性的组合

1.SPU和SKU介绍

1.SPU

image-20240421193217630

2.SKU

image-20240421193228617

3.两者之间的关系

image-20240421193255238

2.完成商品发布界面

1.组件引入
1.commoditylaunch.vue 引入到 src/views/modules/commodity下

image-20240421193659756

2.multiUpload.vue 引入到 src/components/upload/multiUpload.vue

image-20240421194049258

2.创建菜单
1.创建目录

image-20240421194536566

2.创建菜单,注意菜单路由要匹配

image-20240421194746379

3.重启前端项目,查看界面

image-20240421194935197

3.选择分类联动显示品牌

1.首先让分类以树形菜单的形式显示
1.修改getCategorys请求的url为环境变量 + 资源路径

image-20240422094136998

2.访问测试

image-20240422094429603

2.思路分析

image-20240422103424874

3.后端 sunliving-commodity模块
1.CategoryBrandRelationService.java 根据分类id获取关联的品牌
    /*** 根据分类id获取关联的品牌** @param categoryId* @return*/List<BrandEntity> getBrandsByCategoryId(Long categoryId);
2.CategoryBrandRelationServiceImpl.java 实现方法
    @Overridepublic List<BrandEntity> getBrandsByCategoryId(Long categoryId) {// 1.查询关联关系表,获取到品牌idList<CategoryBrandRelationEntity> categoryBrandRelationEntities = categoryBrandRelationDao.selectList(new QueryWrapper<CategoryBrandRelationEntity>().eq("category_id", categoryId));// 2.得到所有的品牌idif (categoryBrandRelationEntities.size() > 0) {List<Long> brandIds = categoryBrandRelationEntities.stream().map(CategoryBrandRelationEntity::getBrandId).collect(Collectors.toList());// 3.查询品牌表,获取到品牌信息List<BrandEntity> brandEntities = brandDao.selectBatchIds(brandIds);return brandEntities;}return Collections.emptyList();}
3.CategoryBrandRelationController.java 编写接口
    /*** 根据categoryId返回关联的品牌* @param categoryId* @return*/@RequestMapping("/brands/list")public R relationBrandsList(@RequestParam(value = "catId", required = true) Long categoryId) {return R.ok().put("data", categoryBrandRelationService.getBrandsByCategoryId(categoryId));}
4.测试

image-20240422103745553

4.前端 commoditylaunch.vue
1.查看getCatBrands方法,修改请求为环境变量 + 资源路径的形式

image-20240422104052815

2.测试

image-20240422104125187

4.完成获取某个分类关联的所有属性分组和这些分组关联的基本属性,并显示供发布选择

1.设计VO类 包含一个属性组和该属性组关联的基本属性列表
@Data
public class AttrGroupWithAttrsVo {/*** id*/private Long id;/*** 组名*/private String name;/*** 排序*/private Integer sort;/*** 说明*/private String description;/*** 组图标*/private String icon;/*** 所属分类 id*/private Long categoryId;/*** 基本属性列表*/private List<AttrEntity> attrs;
}
2.后端 sunliving-commodity模块
1.AttrgroupService.java 根据分类id获取属性分组以及分组下的属性
    /*** 根据分类id获取属性分组以及分组下的属性* @param categoryId* @return*/List<AttrGroupWithAttrsVo> getAttrGroupWithAttrsByCategoryId(Long categoryId);
2.AttrgroupServiceImpl.java 实现方法
    @Overridepublic List<AttrGroupWithAttrsVo> getAttrGroupWithAttrsByCategoryId(Long categoryId) {// 1.根据分类id获取属性分组的集合List<AttrgroupEntity> AttrgroupList = attrgroupDao.selectList(new QueryWrapper<AttrgroupEntity>().eq("category_id", categoryId));// 2.使用stream api 遍历属性分组的集合,调用attrService的getRelationAttr方法,根据属性分组id获取属性的集合if (AttrgroupList.size() > 0) {return AttrgroupList.stream().map(attrgroup -> {// 创建AttrGroupWithAttrsVo对象AttrGroupWithAttrsVo attrGroupWithAttrsVo = new AttrGroupWithAttrsVo();// 设置属性attrGroupWithAttrsVo.setId(attrgroup.getId());attrGroupWithAttrsVo.setName(attrgroup.getName());attrGroupWithAttrsVo.setSort(attrgroup.getSort());attrGroupWithAttrsVo.setDescription(attrgroup.getDescription());attrGroupWithAttrsVo.setIcon(attrgroup.getIcon());attrGroupWithAttrsVo.setCategoryId(attrgroup.getCategoryId());attrGroupWithAttrsVo.setAttrs(attrService.getRelationAttr(attrgroup.getId()));// 对每一个属性分组,设置完一个vo对象之后返回,最后组成一个vo对象的集合并返回return attrGroupWithAttrsVo;}).collect(Collectors.toList());}return Collections.emptyList();}
3.前端 commoditylaunch.vue
1.将showBaseAttrs方法的请求改成 环境变量 + 资源路径的形式

image-20240422131934216

2.后端编写接口
    /*** 根据分类id获取属性分组以及分组下的属性* @param catalogId* @return*/@RequestMapping("/{catalogId}/withattr")public R getAttrGroupWithAttrsByCatalogId(@PathVariable("catalogId") Long catalogId) {List<AttrGroupWithAttrsVo> attrGroupWithAttrsByCategoryId = attrgroupService.getAttrGroupWithAttrsByCategoryId(catalogId);return R.ok().put("data", attrGroupWithAttrsByCategoryId);}
3.postman测试

image-20240422132107699

4.前端测试,发现item.attrs是空的

image-20240422132934117

5.问题分析
  • item表示的是每一个VO,而item.attrs表示的是attrs
  • attrs出现空,就说明有的属性组并没有关联的属性
6.解决方式:让每一个属性组都至少有一个关联的属性即可
7.再次访问测试

image-20240422133917119

4.可以看到目前的功能虽然可以正常实现,但是测试数据不是很好,所以重新设置一下数据
1.分类管理
1.以京东的这个页面为主

image-20240422134656096

2.设计

image-20240422140640431

2.品牌管理
1.主要是小米和华为

image-20240422140129111

2.小米关联三个分类

image-20240422140838009

3.华为关联一个

image-20240422140904754

3.属性分组
1.参考规格与包装

image-20240422141217105

2.性价比手机分类下有6个属性分组

image-20240422142234176

4.基本属性和销售属性
1.参考小米手机购买页面

image-20240422144200954

2.基本属性

image-20240422145034900

3.销售属性

image-20240422145108022

5.对于这些数据的解释
1.分类管理

有三级分类

2.品牌管理

一个分类可以有多个品牌,一个品牌也可以有多个分类,所以采用关联表的方式与分类管理进行关联

3.属性分组

一个分类可以有多个属性分组,所以使用外键的方式与分类管理进行关联

4.基本属性

一个分类可以有多个基本属性,所以使用外键的方式与分类管理进行关联

一个属性分组可以有多个基本属性,为了好扩展还是使用了关联表的方式与属性分组进行关联

这个基本属性需要放到一个分组里,然后再归属于一个分类中

5.销售属性

一个分类可以有多个销售属性,所以使用外键的方式与分类管理进行关联

这个销售属性就相当于在某个分类中不需分组来区分的,通用的属性

6.表关联的示意图

image-20240422154031690

5.完成销售属性的显示

1.前端分析 commoditylaunch.vue
1.修改 commoditylaunch.vue的getShowSaleAttr方法的url为环境变量 + 资源路径的形式

image-20240422155212834

2.分析url发现前端请求携带分类管理的id,要求返回分页的销售属性
2.后端 sunliving-commodity模块
1.思路分析

image-20240422155906129

2.AttrService.java 销售属性分页查询,根据分类id
    /*** 销售属性分页查询,根据分类id* @param params* @param categoryId* @return*/PageUtils queryPageOnSale(Map<String, Object> params, Long categoryId);
3.AttrServiceImpl.java 实现方法
    @Overridepublic PageUtils queryPageOnSale(Map<String, Object> params, Long categoryId) {// 1.获取关键字和分页参数String key = (String) params.get("key");int currentPage = Integer.parseInt(params.getOrDefault("page", "1").toString());int pageSize = Integer.parseInt(params.getOrDefault("limit", "10").toString());// 2.构建基本查询条件,根据key进行查询QueryWrapper<AttrEntity> queryWrapper = new QueryWrapper<>();if (StringUtils.isNotBlank(key)) {queryWrapper.and(wrapper ->wrapper.eq("attr_id", key).or().like("attr_name", key));}// 3.如果有categoryId,附加查询条件,根据categoryId查询出对应的销售属性if (categoryId != null) {queryWrapper.eq("category_id", categoryId);queryWrapper.eq("attr_type", 0);  // 只包括类型为0的属性}// 4.执行分页查询Page<AttrEntity> page = new Page<>(currentPage, pageSize);IPage<AttrEntity> attrPage = attrDao.selectPage(page, queryWrapper);// 5.使用PageUtils封装返回结果return new PageUtils(attrPage);}
4.AttrController.java 编写接口
    @RequestMapping("/sale/list/{categoryId}")public R list(@RequestParam Map<String, Object> params, @PathVariable("categoryId") Long categoryId){PageUtils page = attrService.queryPageOnSale(params, categoryId);return R.ok().put("page", page);}
5.测试

image-20240422161349535

image-20240422161505344

3.前后端联调
1.前端访问

image-20240422161600353

2.发现这里应该使用逗号分隔才对,而不是几个可选项放在一起
1.将这个复选框的分隔方式改成逗号即可

image-20240422162924710

2.基本属性那里也是要改动一下

image-20240422163634065

3.点击+自定义还是分号

image-20240422163733524

4.解决方式
1.找到+自定义的输入框

image-20240422163950658

2.进入这个handleInputConfirm方法,修改分隔符为逗号

image-20240422164713981

6.生成SKU信息(前端完成)

这个SKU信息就是基本属性+销售属性的组合

image-20240422170832513

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/14589.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

go语言中同一for循环体内的多个初始变量和多个自增变量用法示例

在go语言的for循环体中&#xff0c;我们可以同时初始多个变量&#xff0c; 也可以同时多多个变量进行自增/自减操作&#xff0c; 用法如下&#xff1a; for 后面的多个初始化变量使用的是逗号分隔的批量赋值操作&#xff0c;多个变量自增自减使用 加减运算符和逗号分隔 字符…

MySQL之性能剖析和Schema与数据类型优化(一)

性能剖析总结 1.定义性能最有效的方法是响应时间2.如果无法测量就无法有效地优化&#xff0c;所以性能优化工作需要基于高质量、全方位及完整的响应时间测量3.测量的最佳开始点是应用程序&#xff0c;而不是数据库。即使问题出在底层的数据库&#xff0c;借助良好的测量也可以…

C++系列-友元

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 我们在之前的文章有提到友元&#xff0c;我们先来看下面的这段包含了友元的代码&#xff1a; ​​#define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace…

CLIP论文学习

学习来自B站bryanyzhu

jdk17安装教程详细(jdk17安装超详细图文)

2021年9月14日JDK17 发布&#xff0c;其中不仅包含很多新语言功能&#xff0c;而且与旧版 JDK 相比&#xff0c;性能提升也非常明显。与之前 LTS 版本的 JDK 8 和 JDK 11 相比&#xff0c;JDK17 的性能提升尤为明显&#xff0c;本文将教你如何安装 相比于JDK1.8&#xff0c;JD…

虚拟机网络设置为桥接模式后未显示网络

本方法为&#xff0c;VMware配置正确&#xff0c;但在尝试其他办法后未能成功解决的人提供一种方法 本机的虚拟机使用NAT模式正常使用 但是使用桥接模式后重启&#xff0c;未发现虚拟机内网络设置,详见下图&#xff1a; 使用 ifconfig 查看网络详情 发现没有ens33接口 查看硬…

双非本科,逆袭中大厂的 Java 学习路线

从零基础入门 Java&#xff0c;到最后秋招上岸&#xff0c;笔者也是花费了不少的经历&#xff0c;也走了很多弯路。这一篇文章会记录下真正有用的学习路线。 为什么要强调真正有用&#xff1f;网上的很多所谓从入门到求职&#xff0c;推荐的路线都超级长&#xff0c;零基础的同…

LeetCode198:打家劫舍

题目描述 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。 给定一个代表每个房屋存…

【学习笔记】Windows GDI绘图(六)图形路径GraphicsPath详解(中)

上一篇【学习笔记】Windows GDI绘图(五)图形路径GraphicsPath详解(上)介绍了GraphicsPath类的构造函数、属性和方法AddArc添加椭圆弧、AddBezier添加贝赛尔曲线、AddClosedCurve添加封闭基数样条曲线、AddCurve添加开放基数样条曲线、基数样条如何转Bezier、AddEllipse添加椭圆…

华为校招机试 - 最久最少使用缓存(20240508)

题目描述 无线通信移动性需要在基站上配置邻区(本端基站的小区 LocalCell 与周边邻基站的小区 NeighborCelI 映射)关系, 为了能够加速无线算法的计算效率,设计一个邻区关系缓存表,用于快速的通过本小区 LocalCell 查询到邻小区 NeighborCell。 但是缓存表有一定的规格限…

代码随想录-Day07

454. 四数相加 II 给你四个整数数组 nums1、nums2、nums3 和 nums4 &#xff0c;数组长度都是 n &#xff0c;请你计算有多少个元组 (i, j, k, l) 能满足&#xff1a; 0 < i, j, k, l < n nums1[i] nums2[j] nums3[k] nums4[l] 0 示例 1&#xff1a; 输入&#x…

系统磁盘高级管理、lvm例子、创建pv、创建VG、创建lv、磁盘扩展

LVM&#xff1a; 逻辑卷&#xff0c;动态调整分区大小&#xff0c;扩展性好 创建pv pvcreate &#xff1a; 将实体 partition 创建成为 PV &#xff1b; pvscan &#xff1a; 搜寻目前系统里面任何具有 PV 的磁盘&#xff1b; pvdisplay &#xff1a; 显示出目前系统上面…

GNSS仿真测试之三种常用坐标系与转换

作者介绍 在当今的全球导航卫星系统&#xff08;GNSS&#xff09;技术领域&#xff0c;仿真测试是评估和验证GNSS接收机性能的关键环节&#xff0c;全球导航卫星系统&#xff08;GNSS&#xff09;仿真测试是确保GNSS接收机和导航解决方案在实际部署前能够正确、可靠地工作的关键…

【git】学习记录: 贮藏功能

Git 贮藏修改是一种临时存储工作目录中已经修改但尚未提交的更改的机制。通过贮藏修改&#xff0c;你可以将当前的工作目录状态保存起来&#xff0c;以便你可以在之后的时间点重新应用这些更改&#xff0c;或者在不同的分支间切换时避免冲突。 要使用 Git 贮藏修改&#xff0c…

Linux(centos)常用命令

Linux&#xff08;Centos&#xff09;常用命令使用说明文档 切换到/home目录下 使用cd命令切换目录&#xff0c;例如&#xff1a; cd /home列出/home目录下的所有文件 使用ls命令列出目录下的文件和子目录&#xff0c;例如&#xff1a; ls /home新建目录dir1 使用mkdir命…

头歌OpenGauss数据库-I.复杂查询第1关:获取前N名成绩

本关任务&#xff1a;编写函数来实现获取前N名成绩的方法。 提示&#xff1a;前面的实验没有提供编写自定义函数的示例&#xff0c;需要参考OpenGauss数据库文档学习自定义函数的使用。 score表内容如下&#xff1a; IdScore13.5223.6534.2343.8554.2363.65 --#请在BEGIN - END…

python windows 开发.exe程序笔记

import win32api import win32gui import win32con import time import tkinter as tk## pyinstaller --onefile t4.py 将python 代码打包为windows可执行文件 .exe ## airtext 大漠 def clickGoogle():hw win32gui.FindWindow("Chrome_WidgetWin_1", "新标…

解决Redis 缓存雪崩(过期时间不一致) 和 缓存穿透(黑名单)

解决Redis 缓存雪崩&#xff08;过期时间不一致&#xff09; 和 缓存穿透&#xff08;黑名单&#xff09; public Product getdetailById(Integer id) {String key "product." id;// 查询黑名单中是否有该keyBoolean b hashOperations.hasKey(PROODUCT_DETAIL_B…

算法 Hw7

Hw 7 Graph Algorithm 1 Edge detection2 Reachability3 Bitonic shortest paths 1 Edge detection 由 Cut Property 可知&#xff1a;如果 e 是从某个集合 S 到补集 V−S 的开销最小的边&#xff0c;则 e 一定所有最小生成树中。 由 Cycle Property 可知&#xff1a;如果 e 是…

Gradle常见问题及总结

使用android studio开发项目&#xff0c;难免遇到gradle相关的错误&#xff0c;在此总结。 gradle插件与gradle home版本关系错误 参考更新 Gradle Gradle下载太慢 Index of /gradle/ (tencent.com) 是国内下载地址,手动下载对应版本即可 缓存不刷新 问题描述 maven发布…