后台管理系统: spu管理模块

spu管理模块业务

spu 可以理解为类

例如 people类【spu】

sku可以理解为实例

例如:小明 18 男

spu跟sku可以理解为类跟多个实例的关系

spu管理模块静态

 

<template><div><el-card style="margin: 20px 0px"><CategorySelect @getCategoryId="getCategoryId" :show="!show"></CategorySelect></el-card><el-card style="margin: 20px 0px"><!-- 底部这里将来是有三部分进行切换 --><div><!-- 展示spu列表的结构 --><el-button type="primary" icon="el-icon-plus"> 添加spu </el-button><el-table border style="width: 100%;"><el-table-column type="index" label="序号" width="80" align="center"></el-table-column><el-table-column label="SPU名称" width="width" prop="prop"></el-table-column><el-table-column label="SPU描述" width="width" prop="prop"></el-table-column><el-table-column label="操作" width="width" prop="prop"><template slot-scope="{row,$index}"><el-button type="success" icon="el-icon-plus" size="mini"></el-button><el-button type="warning" icon="el-icon-edit" size="mini"></el-button><el-button type="info" icon="el-icon-info" size="mini"></el-button><el-button type="danger" icon="el-icon-delete" size="mini"></el-button></template></el-table-column></el-table><!--  @size-change="sizeChange"@current-change="currentChange" --><el-paginationstyle="text-align:center;":page-sizes="[3,5,10]":page-size="3"layout="prev, pager, next, jumper,->,sizes,total":total="23" background>:pager-count="7"></el-pagination></div><div></div><div></div></el-card></div>
</template><script>
export default {data() {return {category1Id: '',category2Id: '',category3Id: '',// 控制三级联动的可操作show: true}},methods: {getCategoryId({ categoryId, level }) {// categoryId:获取到一,二,三级分类的id level:为了区分是几级的idif (level == 1) {this.category1Id = categoryIdthis.category2Id = ''this.category3Id = ''} else if (level == 2) {this.category2Id = categoryIdthis.category3Id = ''} else {//代表三级分类的id有了this.category3Id = categoryId//发请求获取平台的属性数据this.getSpuList()}},getSpuList() {}}
}
</script><style>
</style>

动态展示spu列表

 

 这里我不是很懂,明明element-ui自己封装了一个title属性,但是还要自己去封装一个button

这里要注意的是这个按钮是活的,因此不能使用简写

我们把这个按钮封装 全局中,以便后续的使用

通过给他传递title参数来显示提示 

点击分页器第几页按钮的回调@current-change element-ui都已经给我们封装好了,我直接修改page给传进来的page,然后在调用接口就可以拿到数据了 

  这里我们可以采用这种方式,就是默认没有传参数进来page是第一页,如果传参数进来,那这个page直接别赋值未传进来的参数

分页器的某一页数据条数发生变化的回调逻辑跟上表述的一样 

Spu管理内容的切换

由三部分来切换的

--展示spu列表结构

--添加spu|修改spu

--展示添加spu结构

我们可以通过数字来控制

而我们可以将这俩部分拆分为组件,来展示

SpuForm静态组件完成

给他绑定一个点击事件,点击的时候直接修改他的scene就可以了 

书写静态页面,这里要用到这个照片墙的功能

 

 界面

<template><div><el-form ref="form" label-width="80px"><el-form-item label="spu名称"><el-input placeholder="spu名称"></el-input></el-form-item><el-form-item label="品牌"><el-select placeholder="请选择品牌" value=""><el-option label="" value=""></el-option></el-select></el-form-item><el-form-item label="spu描述"><el-input type="textarea" rows="4" placeholder="描述"></el-input></el-form-item><el-form-item label="spu图片"><el-upload action="https://jsonplaceholder.typicode.com/posts/" list-type="picture-card" :on-preview="handlePictureCardPreview" :on-remove="handleRemove"><i class="el-icon-plus"></i></el-upload><el-dialog :visible.sync="dialogVisible"><img width="100%" :src="dialogImageUrl" alt="" /></el-dialog></el-form-item><el-form-item label="销售属性"><el-select placeholder="还有三项未选择" value=""><el-option label="label" value="value"></el-option></el-select><el-button type="primary" icon="el-icon-plus">添加销售属性</el-button><el-table style="width: 100%;" border ><el-table-colum type="index" label="序号" width="80px" align="center"></el-table-colum><el-table-colum type="index" label="属性名" width="width"></el-table-colum><el-table-colum type="index" label="属性名称列表" width="width" ></el-table-colum><el-table-colum type="index" label="操作" width="width" ></el-table-colum></el-table></el-form-item><el-form-item><el-button type="primary">保存</el-button><el-button>取消</el-button></el-form-item></el-form></div>
</template>

SpuForm请求业务得分析

---品牌的数据需要发请求的            http://localhost:9529/dev-api/admin/product/baseTrademark/getTrademarkList
---获取平台中全部的销售属性(3个)    http://localhost:9529/dev-api/admin/product/baseSaleAttrList
---获取某一个SPU信息                 Request URL: http://localhost:9529/dev-api/admin/product/getSpuById/5092
--获取SPU图片                        http://localhost:9529/dev-api/admin/product/spuImageList/5092

先做一个点击取消返回原样的逻辑

子组件发射自定义事件

父组件绑定这个自定义事件

SPUFORM子组件发请求地方分析:
不能书写在mounted里面:
因为咱们刚才看了一下已经完成的项目,每一次显示SpuForm子组件的时候,都会发四个请求,
而我们为什么不能放在子组件的mounted里面,因为v-show只是控制SpuForm子组件显示与隐藏,
这个子组件并没有卸载(只是显示或者隐藏),导致mounted只能执行一次。

解决方法就是拿到子组件,然后每次修改都发请求

在父组件当中可以通过$ref获取子组件等等 

获取SpuForm数据

先写api,然后是调用它

 我们书写在initSpuData,调用的时机就是当我们修改它的时候

测试调用一下,发现是一个对象。那么我们需要存储一下他的数据。按照同样的方式,获取其他服务器返回来的数据

 返回回来的数据都是有数据的

async initSpuData(spu){// spu信息let spuResult=await this.$Api.spu.reqSpu(spu.id)if(spuResult.code==200){this.spu=spuResult}// 品牌信息let tradeMarkResult=await this.$Api.spu.reqTradeMarkList()if(tradeMarkResult.code==200){this.tradeMarkList=tradeMarkResult.data}// spu图片let spuImageResult=await this.$Api.spu.reqSpuImageList(spu.id)if(spuImageResult.code==200){this.spuImageList=spuImageResult.data}// 平台全部的销售属性let saleResult=await this.$Api.spu.reqBaseSaleAttrList()if(saleResult.code==200){this.saleAttrList=saleResult.data}}

SpuForm组件数据展示与收集数据

添加SPU的时候需要给服务器携带的参数

{"category3Id": 0,"tmId": 0,"description": "string","spuName": "string","spuImageList": [{"id": 0,"imgName": "string","imgUrl": "string","spuId": 0}],"spuSaleAttrList": [{"baseSaleAttrId": 0,"id": 0,"saleAttrName": "string","spuId": 0,"spuSaleAttrValueList": [{"baseSaleAttrId": 0,"id": 0,"isChecked": "string","saleAttrName": "string","saleAttrValueName": "string","spuId": 0}]}],
}

 图片上传的属性

这里有一个注意的点就是file-list.由于照片墙显示图片的数据需要数组,数组里面的元素需要name与url字段,因此需要把服务器返回的数据进行修改 

 完整展示效果如上

SpuForm销售属性的数据展示

整个项目当中销售属性一共有三个:颜色,尺码,版本

 我们还需要通过计算属性计算出未选择的销售属性

假如第一次过滤的是颜色,然后到spu这个数组中对比一下,如果spu.saleAttrList是尺寸

那就是颜色!=尺寸返回的结果是真,也就是我们需要的数据过滤出来,反之颜色!=颜色为假,那就不要这个数据 

 展示的是name,收集的是id

完成SpuForm照片墙数据的收集

----照片墙何时收集数据
     ---预览照片墙的时候,显示大的图片的时候,需要收集数据吗? ---不需要收集的【数据已经有了】

    ---照片墙在删除图片的时候,需要收集数据的。
     ---照片墙在添加图片的时候,需要收集数据的。

销售属性的添加的操作

------收集哪些数据
baseSaleAttrId
saleAttrName
spuSaleAttrValueList

 响应的id和name都可以拿到

-----收集到哪里呀?
把数据收集到SPU对象

销售属性值展示与收集

上面的操作只完成了添加销售属性,但是销售属性列表并没有实现

 我们通过row.inputVisible来控制input和button的显示,row.inputValue来收集数据

首先我们需要先把着俩个属性变成响应式数据

因此我们需要使用this.$set

新增的销售属性值需要收集的字段:
baseSaleAttrId
saleAttrValueName

两种情况要考虑,1,是属性值不能未空 2,属性值不能重复

删除销售属性与属性值操作

当我们点击这个属性列表的删除标记时,其实就是删除spuSaleAttrValueList数组里面的数据

删除索引值

删除行 

完成添加spu的操作

1.先写接口,通过判断携带是否有spu.id如果有就是修改这个对象,如果没有那么就是添加spu。(主要是这俩个接口结构类似)

2.当我们点击保存按钮的时候要整理参数(照片墙数据),对于图片,需要携带imageName与imageUrl字段

3.发起请求

4.父组件切换完后,需要重新获取数据,同时当前页page传进去

完成spu操作

就是把spu的数据提交给服务器,新增的业务

点击添加SPU按钮的时候,需要发请求(两个:获取品牌的数据、全部销售属性的数据)

点击添加spu按钮发起请求,调用子组件中的事件

搞定

这里有一个注意点,就是当添加的时候,应该返回的是第一页。而修改才是当前页

通过传递过来第二个参数flag传递过来的是修改还是添加来确认停留在第几页

点击取消按钮,清除数据

 Object.assign(this._data,this.$options.data());

Object.assign(this._data, this.$option.data()) 这行代码的作用是将 this.$option.data() 返回的对象中的属性复制到 this._data 对象中。如果 this._data 对象中存在相同的属性,那么这些属性的值将被覆盖。因此,这行代码可以清除 this._data 对象中的一些数据。

就是B复制到A

Object.assign()合并对象

this._data就是初始的data值

注意当点击取消按钮时,出现如下的效果,这个是因为父组件的changeScene这个方法传入的形参应该是一个对象而不是俩个参数,上面是我写错了,因此出现了该错误。

删除spu

需要使用element-ui的这个组件

<template> <el-popconfirm title="这是一段内容确定删除吗?" > <el-button slot="reference">删除</el-button> </el-popconfirm> </template>

把原先的替换掉,这里要注意的是原先的插槽 slot="reference"需要重现添加到button上,并且原先是删除按钮点击事件,应该修改为弹出框确认触发。

完成,这里注意,删除完成后需要重新发起请求,并且spu个数大于1删除停留当前页,小于1返回上一页

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

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

相关文章

ARM安装与项目结构

1. 安装环境 参考E:\peixunQianrushi\arm\ziliao\FS4412新版&#xff08;学生资料&#xff09;\环境相关资料 这边建议全部默认路径 安装注意事项&#xff1a; 1、在接下来的安装过程中&#xff0c;对于使用win10、win8的操作系统的用户&#xff0c;所有的安装请均以管理员身份…

POKT Network (POKT) :进军百亿美元市场规模的人工智能推理市场

POKT Network&#xff08;又称 Pocket Network&#xff09;是一个去中心化的物理基础设施网络&#xff08;DePIN&#xff09;&#xff0c;它能够协调并激励对任何开放数据源的访问&#xff0c;最初专注于向应用程序和服务提供商提供区块链数据。 自 2020 年主网上线以来&#x…

第十五章 : Spring Cloud全链路监控(Pinpoint实战)

第十五章 : Spring Cloud全链路监控(Pinpoint实战) 前言 本章知识点: Pinpoint的发展历程、特点、优势以及整体架构;数据结构以及对集成框架的兼容性以及Pinpoint实战。 Springboot 2.3.12.RELEASE,spring cloud Hoxton.SR12,spring cloud alibaba 2.2.9.RELEASE发展历…

【GitHub项目推荐--推荐 5 个炫炫炫的可视化项目】【转载】

数据可视化就是将抽象的数据通过视觉的方式进行展示&#xff0c;能让用户直观的看到数据中蕴含的信息和规律。 本篇文章&#xff0c;整理了 5 个可视化开源项目&#xff0c;其中包括可视化制作低代码平台、大屏可视化、地图可视化、热图、图标可视化等等。 00. 数据大屏可视化…

Rust基础语法1

所有权转移&#xff0c;Rust中没有垃圾收集器&#xff0c;使用所有权规则确保内存安全&#xff0c;所有权规则如下&#xff1a; 1、每个值在Rust中都有一个被称为其所有者&#xff08;owner&#xff09;的变量&#xff0c;值在任何时候只能有一个所有者。 2、当所有者离开作用域…

WordPress微信一键关注免认证登录插件

插件介绍 WordPress微信免认证快捷登录插件&#xff1a;订阅号也能一键通行 这款WordPress插件专为个人用户打造&#xff0c;无需繁琐的服务号申请与认证流程。即使您只有未认证的订阅号&#xff0c;也能轻松实现关注公众号后一键登录网站的功能&#xff01; 配置步骤简单明…

【算法详解】力扣88.合并两个有序数组

一、题目介绍 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递减顺序 排列。 注意&#xff1a;最终&#xf…

动态规划基础(二)最长公共子序列 LCS

讲解求两个串中最长的公共的子序列长度或输出子序列等 poj1458 题目大意 给定两个字符串&#xff0c;要求输出两个字符串中最长公共子序列长度 思路 我们定义 a [ i ] [ j ] a[i][j] a[i][j]为&#xff0c;当字串 s t r 1 str1 str1到 i i i位置&#xff0c;字串 s t r 2 s…

采埃孚: 优化1/4员工;苹果Vision Pro开抢,黄牛9万一台 ;招商银行:2023年净利润1466亿元

今日精选 • 采埃孚: 优化1/4员工• 苹果Vision Pro开抢&#xff0c;黄牛9万一台• 招商银行&#xff1a;2023年净利润1466亿元&#xff0c;同比增长6.22% 科技动态 • OpenAI CEO 拟募集百亿级美元&#xff0c;建立 AI 芯片工厂网络以满足需求• 中西医结合“数智岐黄”大模…

【接上篇】二、Flask学习之CSS(下篇)

上篇&#xff1a;二、Flask学习之CSS 3.8hover hover是用来美化鼠标悬停的效果的&#xff0c;当鼠标停放在某个区域&#xff0c;就会执行对应的hover操作。可以操作本标签的内容&#xff0c;也可以操作本标签下某一个标签的内容 3.9after <!DOCTYPE html> <html l…

Unity3d C#实现场景编辑/运行模式下3D模型XYZ轴混合一键排序功能(含源码工程)

前言 在部分场景搭建中需要整齐摆放一些物品&#xff08;如仓库中的货堆、货架等&#xff09;&#xff0c;因为有交互的操作在单个模型上&#xff0c;每次总是手动拖动模型操作起来也是繁琐和劳累。 在这背景下&#xff0c;我编写了一个在运行或者编辑状态下都可以进行一键排序…

C#设计模式教程(10):装饰器模式

装饰器模式的定义 装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许用户在不修改现有对象结构的情况下,动态地给一个对象添加额外的职责。这种模式创建了一个装饰类,用来包装原有的类。 这种模式创建了一个装饰类,用于包装原有的类,并在保持类方法签名完整性…

JS-元素尺寸与位置

通过js的方式&#xff0c;得到元素在页面中的位置 获取宽高 元素.offsetWidth 元素.offsetHeight 1&#xff09;获取元素的自身宽高、包括元素自身设置的宽高paddingborder 2&#xff09;获取出来的是数值&#xff0c;方便计算 3&#xff09;注意&#xff1a;获取的是可视…

C++中的指针、引用;左值、右值;左值引用、右值引用

一、指针、引用 引用指的是为已经创建的对象重新起一个名字。创建引用的时候&#xff0c;编译器只是将这个别名绑定到引用的对象上。 对象名提供了一种直接访问数据的方式&#xff0c;因为对象名本质上是数据所在的内存地址空间的一个地址映射。 引用提供了一种简介访问数据…

在 Python 中实现语音合成的四种方法

1 离线合成 pytts 配置环境 $ apt-get update $ apt-get install espeak $ pip install pyttsx3 $ apt-get install ffmpeg $ apt-get install alsa-utils运行程序 import pyttsx3engine pyttsx3.init() engine.setProperty(rate, 150) engine.setProperty(volume, 0.7)tex…

Python项目——搞怪小程序(PySide6+Pyinstaller)

1、介绍 使用python编写一个小程序&#xff0c;回答你是猪吗。 点击“是”提交&#xff0c;弹窗并退出。 点击“不是”提交&#xff0c;等待5秒&#xff0c;重新选择。 并且隐藏了关闭按钮。 2、实现 新建一个项目。 2.1、设计UI 使用Qt designer设计一个UI界面&#xff0c…

C#,入门教程(20)——列表(List)的基础知识

上一篇&#xff1a; C#&#xff0c;入门教程(19)——循环语句&#xff08;for&#xff0c;while&#xff0c;foreach&#xff09;的基础知识https://blog.csdn.net/beijinghorn/article/details/124060844 List顾名思义就是数据列表&#xff0c;区别于数据数组&#xff08;arr…

redis复制和分区:主从复制、哨兵模式和集群模式

概述 在 Redis 中&#xff0c;复制和分区是用于数据冗余和性能扩展的关键特性。以下是主从复制、哨兵模式和集群模式的工作原理的简要概述&#xff1a; 主从复制 (Replication) 基本概念&#xff1a;Redis 的主从复制功能允许多个 Redis 服务器具有相同的数据副本。这在读取操…

WGAN损失函数解读

WGAN是Wasserstein GAN 解读

【大数据Hive】hive 行列转换使用详解

目录 一、前言 二、使用场景介绍 2.1 使用场景1 2.2 使用场景2 三、多行转多列 3.1 case when 函数 语法一 语法二 操作演示 3.2 多行转多列操作演示 四、多行转单列 4.1 concat函数 语法 4.2 concat_ws函数 语法 4.3 collect_list函数 语法 4.4 collect_set函…