商品发布功能

news2024/12/23 12:11:05

文章目录

    • 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 实现方法
    @Override
    public List<BrandEntity> getBrandsByCategoryId(Long categoryId) {
        // 1.查询关联关系表,获取到品牌id
        List<CategoryBrandRelationEntity> categoryBrandRelationEntities = categoryBrandRelationDao.selectList(new QueryWrapper<CategoryBrandRelationEntity>().eq("category_id", categoryId));
        // 2.得到所有的品牌id
        if (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 实现方法
    @Override
    public 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 实现方法
    @Override
    public 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.coloradmin.cn/o/1688814.html

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

相关文章

《艺术大观》知网艺术刊:可加急, 出刊上网快

《艺术大观》 《艺术大观》征文通知 《艺术大观》期刊诚邀学者、艺术家和文化工作者积极投稿&#xff0c;共同探索艺术领域的前沿问题&#xff0c;促进学术交流和艺术创作的发展。我们欢迎各类艺术形式的研究与评论&#xff0c;包括但不限于绘画、雕塑、音乐、舞蹈、戏剧、电…

Linux c开发线程锁和条件变量使用

#include <pthread.h> #include <stdio.h> #include <unistd.h>pthread_mutex_t mutex PTHREAD_MUTEX_INITIALIZER; pthread_cond_t cond PTHREAD_COND_INITIALIZER;void* thread_function(void* arg) {printf("线程等待唤醒,锁定互斥量...\n");…

【C语言】程序员自我修养之文件操作

【C语言】程序员自我修养之文件操作 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;C语言学习之路 文章目录 【C语言】程序员自我修养之文件操作前言一.文件介绍1.1为什么使用文件1.2文件分类1.3二进制文件和文本文件 二.文件的打开和关闭2.…

个人博客网站搭建笔记1

文章目录 前言要求自己的理解资源过程视频教程SpringBoot开发一个小而美的个人博客p1课程介绍p2需求和功能 前言 自己之前其实就想搭建一个属于自己的网站&#xff0c;但是不知道怎么操作&#xff0c;没找到合适的教程&#xff0c;&#xff08;手把手的那种&#xff09;&#…

Pytest框架实战二

在Pytest框架实战一中详细地介绍了Pytest测试框架在参数化以及Fixture函数在API测试领域的实战案例以及具体的应用。本文章接着上个文章的内容继续阐述Pytest测试框架优秀的特性以及在自动化测试领域的实战。 conftest.py 在上一篇文章中阐述到Fixture函数的特性&#xff0c;第…

智慧医疗时代:探索互联网医院开发的新篇章

在智慧医疗时代&#xff0c;互联网医院开发正引领着医疗服务的创新浪潮。通过将先进的技术与医疗服务相结合&#xff0c;互联网医院为患者和医生提供了全新的互动方式&#xff0c;极大地提升了医疗服务的便捷性和效率。本文将深入探讨互联网医院的开发&#xff0c;介绍其技术实…

pdf加水印怎么加?3种添加水印方法分享

pdf加水印怎么加&#xff1f;PDF加水印不仅是为了保护文档内容&#xff0c;确保信息的安全性和完整性&#xff0c;更是一种有效的版权保护措施。通过添加水印&#xff0c;您可以在文档中嵌入公司名称、日期、编号等信息&#xff0c;以明确文档的归属权和使用限制。此外&#xf…

重学java 42.多线程 等待唤醒机制案例分析

Strength is built under a heavy load,I am expecting to pick up all of my loads and travel on. —— 24.5.24 章节重点 1.会用wait和notify两个方法 2.会使用Lock锁对象 3.会利用Cal1able接口实现多线程 4.会使用线程池完成多线程 等待唤醒案例分析&#xff08;线程之间的…

SEO优化,小白程序员如何做SEO优化流量从0到1

原文链接&#xff1a;SEO优化&#xff0c;小白程序员如何做SEO优化流量从0到1 1、SEO是什么&#xff1f; SEO即&#xff1a;搜索引擎优化(Search Engine Optimization)&#xff0c;是一种通过优化网站结构、内容和外部链接等因素&#xff0c;提高网站在搜索引擎中的自然排名&…

景源畅信数字:抖音小店新手该怎么做?

在数字化时代的浪潮中&#xff0c;抖音不仅仅是一个分享短视频的平台&#xff0c;更是一个充满潜力的电商平台。对于想要进入这个领域的朋友们来说&#xff0c;开设一家抖音小店无疑是一个既激动又迷茫的起点。那么&#xff0c;作为新手&#xff0c;该如何在这个全新的舞台上立…

在链游中,智能合约如何被用于实现游戏内的各种功能

随着区块链技术的快速发展&#xff0c;链游&#xff08;Blockchain Games&#xff09;作为区块链技术的重要应用领域之一&#xff0c;正逐渐展现出其独特的魅力和优势。其中&#xff0c;智能合约作为链游的核心技术之一&#xff0c;对于实现游戏内的各种功能起到了至关重要的作…

【YOLOv5/v7改进系列】替换激活函数为SiLU、ReLU、LeakyReLU、FReLU、PReLU、Hardswish、Mish、ELU等

一、导言 激活函数在目标检测中的作用至关重要&#xff0c;它们主要服务于以下几个关键目的&#xff1a; 引入非线性&#xff1a;神经网络的基本构建块&#xff08;如卷积层、全连接层等&#xff09;本质上是线性变换&#xff0c;而激活函数通过引入非线性&#xff0c;使得网络…

完成商品属性分组和商品属性关联维护

文章目录 1.前端页面搭建1.复制attrgroup-attr-relation.vue到src/views/modules/commodity下2.加入超链接和引入组件 src/views/modules/commodity/attrgroup.vue1.加入超链接2.引入组件 3.数据池加入变量4.使用组件1.引用组件2.添加方法3.测试&#xff0c;点击关联&#xff0…

【低照度图像增强系列(7)】RDDNet算法详解与代码实现(同济大学|ICME)

前言 ☀️ 在低照度场景下进行目标检测任务&#xff0c;常存在图像RGB特征信息少、提取特征困难、目标识别和定位精度低等问题&#xff0c;给检测带来一定的难度。 &#x1f33b;使用图像增强模块对原始图像进行画质提升&#xff0c;恢复各类图像信息&#xff0c;再使用目标检测…

qt改变样式表 label

border:1px solid black; background-color:rgb(238,234,235); border-color:rgb(0,112,249);

Zabbix实现7x24小时架构监控

上篇&#xff1a;https://blog.csdn.net/Lzcsfg/article/details/138774511 文章目录 Zabbix功能介绍Zabbix平台选择安装Zabbix监控端部署MySQL数据库Zabbix参数介绍登录Zabbix WEBWEB界面概览修改WEB界面语言添加被控主机导入监控模板主机绑定模板查看主机状态查看监控数据解…

一文了解基于ITIL的运维管理体系框架

本文来自腾讯蓝鲸智云社区用户&#xff1a;CanWay ITIL&#xff08;Information Technology Infrastructure Library&#xff09;是全球最广泛使用的 IT 服务管理方法&#xff0c;旨在帮助组织充分利用其技术基础设施和云服务来实现增长和转型。优化IT运维&#xff0c;作为企业…

U-Boot menu菜单分析

文章目录 前言目标环境背景U-Boot如何自动调起菜单U-Boot添加自定义命令实践 前言 在某个厂家的开发板中&#xff0c;在进入它的U-Boot后&#xff0c;会自动弹出一个菜单页面&#xff0c;输入对应的选项就会执行对应的功能。如SD卡镜像更新、显示设置等&#xff1a; 目标 本…

Linux进程--函数 system 和 popen 的区别

system() 和 popen() 是 C 语言中用于执行外部命令的两个函数&#xff0c;它们的功能类似&#xff0c;但在使用方式和特性上有一些区别。 system() system() 函数允许您在程序中执行外部命令&#xff0c;并等待该命令执行完成后继续执行程序。其基本语法如下&#xff1a; in…

本地idea连接虚拟机linux中的docker进行打包镜像上传--maven的dockerfile-maven-plugin插件

项目名必须是英文,-,.,_,这些数字,idea需要管理员运行,因为idea控制台mvn命令需要管理员权限才能运行(maven需配置环境变量)改linux中的Docker服务文件,使用2375 进行非加密通信,然后加载重启 2.1 #修改Docker服务文件 vi /lib/systemd/system/docker.service ​ # 通常使…