商品发布功能

文章目录

    • 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.rhkb.cn/news/330393.html

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

相关文章

开源博客项目Blog .NET Core源码学习(25:App.Hosting项目结构分析-13)

本文学习并分析App.Hosting项目中后台管理页面的文章管理页面。   文章管理页面用于显示、检索、新建、编辑、删除文章数据&#xff0c;以便在前台页面的首页、文章专栏、文章详情页面显示文章数据。文章管理页面附带一新建及编辑页面&#xff0c;以支撑新建和编辑文章数据。…

交换机部分综合实验

实验要求 1.内网IP地址使用172.16.0.0/16 2.sw1和sW2之间互为备份; 3.VRRP/mstp/vlan/eth-trunk均使用; 4.所有pc均通过DHcP获取Ip地址; 5.ISP只配置IP地址; 6.所有电脑可以正常访问IsP路由器环回 实验拓扑 实验思路 1.给交换机创建vlan&#xff0c;并将接口划入vlan 2.在SW1和…

传输层 --- UDP

一、简述与回顾 传输层&#xff1a;负责数据能够从发送端传输接收端 在TCP/IP协议中&#xff0c;我们用"源IP"&#xff0c;"源端口号"&#xff0c;"目的IP"&#xff0c;"目的端口号"&#xff0c;和"协议号"来表示一个通信。…

Android studio关闭自动更新

Windows下&#xff1a; 左上角file - setting - Appearance & Behavier - system setting - update - 取消勾选

golang通过go-aci适配神通数据库

1. go-aci简介 go-aci是神通数据库基于ACI(兼容Oracle的OCI)开发的go语言开发接口&#xff0c;因此运行时需要依赖ACI驱动和ACI库的头文件。支持各种数据类型的读写、支持参数绑定、支持游标范围等操作。 2. Linux部署步骤 2.1. Go安装&#xff1a; 版本&#xff1a;1.9以上…

Spring Cache基本使用

Spring 从 3.1 版本开始定义缓存抽象来统一不同的缓存技术&#xff1b;在应用层面与后端存储之间&#xff0c;提供了一层抽象&#xff0c;这层抽象目的在于封装各种可插拔的后端存储( ehcache, redis, guava)&#xff0c;最小化因为缓存给现有业务代码带来的侵入。 一、Spring…

机器学习实验 --- 逻辑回归

第1关:逻辑回归核心思想 任务描述 本关任务:根据本节课所学知识完成本关所设置的编程题 #encoding=utf8 import numpy as npdef sigmoid(t):完成sigmoid函数计算:param t: 负无穷到正无穷的实数:return: 转换后的概率值:可以考虑使用np.exp()函数#********** Begin *******…

C语言-atoi()库函数的模拟实现

文章目录 前言一、atoi()库函数的介绍及使用1.1 atoi()库函数介绍1.2 atoi()库函数使用 二、atoi()库函数的模拟实现2.1 函数设计2.2 函数实现思路2.3 具体实现2.4 测试 总结 前言 本篇文章介绍c语言中库函数atoi()的使用&#xff0c;以及模拟实现库函数。 一、atoi()库函数的…

景源畅信电商:抖店需要的成本高吗?

在数字化时代的浪潮中&#xff0c;短视频平台迅速崛起&#xff0c;成为连接用户与商家的新桥梁。抖音作为其中的佼佼者&#xff0c;不仅改变了人们的娱乐方式&#xff0c;也催生了新型的电商模式——抖店。许多人好奇&#xff0c;入驻这样一个充满活力的平台&#xff0c;需要承…

【数据结构】第七节:堆

个人主页&#xff1a; 深情秋刀鱼-CSDN博客 数据结构专栏&#xff1a;数据结构与算法 源码获取&#xff1a;数据结构: 上传我写的关于数据结构的代码 (gitee.com) ​ 目录 一、堆 1.堆的概念 2.堆的定义 二、堆的实现 1.初始化和销毁 2.插入 向上调整算法 3.删除 向下调整算法…

DDoS攻击的最新动态及市场趋势分析

随着数字化转型的加速和网络连接设备的增加&#xff0c;分布式拒绝服务(Distributed Denial of Service, DDoS)攻击已经成为全球网络安全领域的一大威胁。根据最新的市场研究报告&#xff0c;预计到2028年&#xff0c;DDoS防护软件市场的复合年增长率将达到14%以上&#xff0c;…

Threes 特效 炫酷传送门HTML5动画特效

基于Three.js的HTML5 3D动画&#xff0c;这个动画模拟了游戏中的一个炫酷的3D场景&#xff0c;支持360度视角查看&#xff0c;也支持鼠标滚轮进行缩放。画面中主要展现了一个游戏中传送门的效果&#xff0c;同时还有路两边的围栏、灯笼、石头&#xff0c;以及星光闪闪的萤火虫&…

springboot vue 开源 会员收银系统 (2) 搭建基础框架

前言 完整版演示 前面我们对会员系统https://blog.csdn.net/qq_35238367/article/details/126174288进行了分析 确定了技术选型 和基本的模块 下面我们将从 springboot脚手架开发一套收银系统 使用脚手架的好处 不用编写基础的rabc权限系统将工作量回归业务本身生成代码 便于…

宿舍管理系统--毕业设计

毕业设计&#x1f4bc;MD5加密&#x1f512;SSM框架&#x1f3a8;Layui框架&#x1f384; 实现功能 管理员的登录与登出 管理员,班级,学生,宿舍&#xff0c;卫生&#xff0c;访客各模块增删改查 个别模块关联查询 各个模块数据导出Excel 一些截图

双向链表C++,C#,Java版,这些程序大多已经过测试,一直在用。

先C版吧&#xff0c;我最先用的是C#,后来是Java&#xff0c;后来改用C版的&#xff0c;因为现在一直在用C&#xff0c;单链 表一直没写上去&#xff0c;因为我很少用&#xff0c;用的是双链表。 执行代码例子1&#xff1a; int main() { _DList<_string> s…

重学java 40.多线程 — 死锁和线程状态

—— 24.5. 一、死锁 1.死锁介绍&#xff08;锁嵌套就有可能产生死锁&#xff09; 指的是两个或者两个以上的线程在执行的过程中由于竞争同步锁而产生的一种阻塞现象;如果没有外力的作用,他们将无法继续执行下去,这种情况称之为死锁 例&#xff1a; 两线程处于互相等待的状态&a…

nss刷题(3)

1、[SWPUCTF 2021 新生赛]include 根据提示传入一个file后显示了关于flag的代码 这是一个文件包含&#xff0c;考虑php伪协议&#xff0c;构造payload&#xff1a; ?filephp://filter/readconvert.base64-encode/resourceflag.php 2、[SWPUCTF 2021 新生赛]Do_you_know_http …

MyBatisPlus使用流程

引入依赖 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.4</version> </dependency> 版本号根据需要选取 在实体类上加注解声明&#xff0c;表信息 根据数…

go-zero 实战(5)

引入Prometheus 用 Prometheus 监控应用 1. 用 docker 启动 Prometheus 编辑配置位置&#xff0c;我将 prometheus.yaml 和 targets.json 文件放在了 /opt/prometheus/conf目录下 prometheus.yaml global:scrape_interval: 15s # 抓取间隔evaluation_interval: 15s # 评估…

网络拓扑—DHCP服务配置

文章目录 DHCP服务搭建相关配置细节前提安装DHCP服务 DHCP服务搭建 相关配置细节前提 系统&#xff1a;Windows Server 2003 IP网段&#xff1a;10.0.0.0/24 三台机子&#xff1a; 普通PC机 DHCP服务器 路由器&#xff08;两块网卡&#xff0c;连接内外网&#xff09; //注…