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

news2025/1/16 20:07:19

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-pagination
        style="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:为了区分是几级的id
      if (level == 1) {
        this.category1Id = categoryId
        this.category2Id = ''
        this.category3Id = ''
      } else if (level == 2) {
        this.category2Id = categoryId
        this.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.coloradmin.cn/o/1398686.html

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

相关文章

视频剪辑技巧:一键批量制作画中画视频的方法,高效提升剪辑任务

在数字媒体时代&#xff0c;视频剪辑已成为一项重要的技能。无论是专业的影视制作&#xff0c;还是日常的社交媒体分享&#xff0c;掌握视频剪辑技巧都能为内容增色不少。下面来看云炫AI智剪如何高效的剪辑视频技巧&#xff1a;一键批量制作画中画视频的方法&#xff0c;帮助您…

【日常聊聊】边缘计算的挑战和机遇

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; 日常聊聊 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 边缘计算的挑战和机遇 一&#xff1a;数据安全与隐私保护 二&#xff1a;网络稳定性与可靠性 三&#xff1a;实时性与性能优…

SpringCloud-高级篇(十四)

缓存的作用是其实就是为了减轻对数据库的压力&#xff0c;缩短服务响应的时间&#xff0c;从而提高整个服务的并发能力&#xff0c;Redis单节点并发其实已经很高了&#xff0c;但是它依然有自己的上限&#xff0c;随着互联网的发展&#xff0c;用户低量越来越大&#xff0c;想淘…

list列表可编辑状态

有时候list需要修改或选择属性,mfc自带的只能显示内容,基本上是不可以修改,为了实现这个功能需求,需要完成一下步骤转换. 第一步记录选择的单元格. 第二步创建一个编辑框CComboBox对象, 设置字体,窗口属性. 第三步获取选中单元格的位置信息. 第四步获取单元格内容信息. 第五步…

C++ STL容器详解

string容器 string的基本概念 本质 string是C风格的字符串&#xff0c;而string本质上是一个类 string与char* 的区别 char * 是一个指针 string是一个类&#xff0c;类内部封装了char*&#xff0c;管理这个字符串&#xff0c;是一个char*型的容器。 string的构造函数 构造函…

数据库性能优化的解决方案

目录​​​​​​​ 1、什么是数据库性能优化 1.1 数据库性能优化的概念 1.2 为何需要进行数据库性能优化 1.3 数据库性能优化的好处 2、数据库性能优化的基本原理 2.1 数据库查询优化 2.2 数据库索引优化 2.3 数据库表结构优化 2.4 数据库硬件优化 3、数据库查询优化…

机床导轨误差对机械加工品质的影响

机床导轨是确定机床各部件相对位置关系的基准&#xff0c;也是相对运动的基准&#xff0c;其精度直接决定了机械加工产品的精度&#xff0c;机床导轨要确保精准,才能保证机械加工产品的良好&#xff0c;否则&#xff0c;会影响加工品质&#xff0c;主要体现在以下几方面&#x…

力扣刷MySQL-第六弹(详细讲解)

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;力扣刷题讲解-MySQL &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出…

C++——函数的定义

1&#xff0c;概述 作用&#xff1a;将一段经常使用的代码封装起来&#xff0c;减少重复代码 一个较大的程序&#xff0c;一般分为若干个程序块&#xff0c;每个模块实现特定的功能。 2&#xff0c;函数的定义 函数的定义一般主要有五个步骤&#xff1a; 1&#xff0c;返回…

C++ 学习系列 -- std::function 与 std::bind

一 std::function 与 std::bind 的介绍 1. std::function std::function 是 c 11 的新特性 &#xff0c;包含在头文件<functional>中&#xff0c;为了更方便的调用函数而引入。 std::function 是一个函数包装器&#xff08;function wrapper&#xff09;&#xff0c;…

英国金融时报关注TRX登陆Mercado Bitcoin交易所:波场TRON强化南美洲布局,国际化进程持续加速

近日,波场TRON网络原生代币TRX正式上线巴西最大的合规加密交易所Mercado Bitcoin。英国金融时报、Decrypt、Blockworks等财经及加密行业权威媒体对该话题进行了报道,表示此次合作是波场TRON全球业务增长的有力证明,也表明该平台力求处于数字经济前沿的坚定决心。 据悉,Mercado…

小白快速上手maven【基础篇】

Maven的概念和作用 Maven是什么&#xff1f;POM的概念 Maven的作用&#xff1f; 提供自动化构建项目的方式&#xff0c;并且统一了项目的结构管理项目中的依赖 Maven基础概念-仓库&#xff0c;坐标&#xff0c;仓库配置 仓库&#xff1a;用于存储各种jar包资源 根据功能的不…

【微信小程序开发】环境介绍和基本使用

文章目录 前言1. 项目的基本组成结构1.1 JSON 配置文件的作用1.2 如何新建小程序页面1.3 修改项目首页1.4 WXML 模板1.5 WXSS 样式1.6 JS 逻辑交互 2. 宿主环境2.1 什么是宿主环境2.2 通信模型2.3 运行机制2.4 组件2.4.1 view 组件的基本使用&#xff1a;2.4.2 scroll-view 组件…

专业137总分439东南大学920专业基础综合考研经验电子信息与通信电路系统芯片

我本科是南京信息工程大学&#xff0c;今年报考东南大学信息学院&#xff0c;成功逆袭&#xff0c;专业137&#xff0c;政治69&#xff0c;英语86&#xff0c;数一147&#xff0c;总分439。以下总结了自己的复习心得和经验&#xff0c;希望对大家复习有一点帮助。啰嗦一句&…

OpenAI CEO称“AGI时代”即将来临,下一个风口或为能源领域

原创 | 文 BFT机器人 在最近的达沃斯论坛上&#xff0c;Sam Altman以其深邃的见解和前瞻性的思考&#xff0c;再次成为了全场关注的焦点。他以一场激情四溢的演讲&#xff0c;深入剖析了人工智能技术的未来发展趋势&#xff0c;以及它可能对社会和工作领域产生的深远影响。 Al…

HTTP 协议和 TCP/IP 协议之间有什么区别?

HTTP&#xff08;超文本传输协议&#xff09;和TCP/IP&#xff08;传输控制协议/互联网协议&#xff09;是两种在互联网通信中广泛使用的协议&#xff0c;它们之间的区别和联系对许多人来说可能还不是很清晰&#xff0c;今天我们就带大家来一起了解一下HTTP和TCP/IP协议这2者之…

JAVAEE初阶 封装与分用

封装和分用 一.封装1.1 应用层1.2 传输层1.3 网络层1.4 数据链路层1.5 物理层 二.分用2.1 物理层2.2 数据链路层2.3 网络层2.4 传输层2.5 应用层 三. 交换机的封装分用四.路由器的封装分用五. 网络中数据传输的单位 在讲解封装与分用前&#xff0c;我们需要先说明一个例子。 例…

【Qt】ubuntu环境下使用命令行安装Qt

起因是我上一篇文章说的&#xff0c;官网下的安装包卡死在第一步安装界面了。 于是我就问GPT有没有纯命令行的安装方式&#xff0c;果然是有的。 在Ubuntu上安装Qt可以使用以下命令&#xff1a; 1. 首先&#xff0c;添加Qt的官方存储库到系统中&#xff1a; sudo add-apt-rep…

如何进行产品的人机交互设计?

产品的人机交互设计是指通过用户界面和用户体验设计来优化产品与用户之间的交互过程&#xff0c;从而提高产品的易用性、可用性和用户满意度。人机交互设计需要考虑用户的需求、行为模式、心理感受以及技术实现&#xff0c;下面我将介绍如何进行产品的人机交互设计。 首先&…

汇川PLC如何连接电脑进行数据通信和远程上下载

准备工作 一台可联网操作的电脑一台单网口的远程透传网关及博达远程透传配置工具网线一条&#xff0c;用于实现网络连接和连接PLC一台汇川PLC及其编程软件InoPrShop一张4G卡或WIFI天线实现通讯(使用4G联网则插入4G SIM卡&#xff0c;WIFI联网则将WIFI天线插入USB口&#xff09…