后台管理系统: 商品管理

news2024/12/23 15:12:51

 商品管理之三级联动静态组件

先做俩个卡片组件,分开距离 

三级联动很多地方都用到了它,我们可以封装成一个组件

注册为一个全局组件

 

<div>
    <el-form :inline="true" class="demo-form-inline">
  <el-form-item label="一级分类">
    <el-select  placeholder="请选择" value="">
      <el-option label="区域一" value="shanghai"></el-option>
      <el-option label="区域二" value="beijing"></el-option>
    </el-select>
  </el-form-item>
  <el-form-item label="二级分类">
    <el-select  placeholder="请选择" value="">
      <el-option label="区域一" value="shanghai"></el-option>
      <el-option label="区域二" value="beijing"></el-option>
    </el-select>
  </el-form-item>
  <el-form-item label="三级分类">
    <el-select  placeholder="请选择" value="">
      <el-option label="区域一" value="shanghai"></el-option>
      <el-option label="区域二" value="beijing"></el-option>
    </el-select>
  </el-form-item>
</el-form>
  </div>

商品管理之三级联动动态组件

书写相对于的api

  拿到数据,然后渲染到页面上

 一级分类完成

我们需要在一级联动数据发生改变的时候,把id传给二级联动。这里有一个注意点,就是这个是在组件中,@change这个其实就是自定义事件 

绑定事件,但是报错了

 接口测试没有问题,后面查询出来是接口的请求写错了

 

三级联动完成

一级分类数据发送变化的时候,二级,三级分类数据要变化。首先要清除原有的值,同时我们需要在子组件中给父组件传递参数

<template>
  <div>
    <!-- inline:代表的是行内表单,代表一行可以放置多个表单元素 -->
    <el-form :inline="true" class="demo-form-inline" :model="cForm">
      <el-form-item label="一级分类">
        <el-select
          placeholder="请选择"
          v-model="cForm.category1Id"
          @change="handler1"
          :disabled="show"
        >
          <el-option
            :label="c1.name"
            :value="c1.id"
            v-for="(c1, index) in list1"
            :key="c1.id"
          ></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="二级分类">
        <el-select
          placeholder="请选择"
          v-model="cForm.category2Id"
          @change="handler2"
          :disabled="show"
        >
          <el-option
            :label="c2.name"
            :value="c2.id"
            v-for="(c2, index) in list2"
            :key="c2.id"
          ></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="三级分类">
        <el-select
          placeholder="请选择"
          v-model="cForm.category3Id"
          @change="handler3"
          :disabled="show"
        >
          <el-option
            :label="c3.name"
            :value="c3.id"
            v-for="(c3, index) in list3"
            :key="c3.id"
          ></el-option>
        </el-select>
      </el-form-item>
    </el-form>
  </div>
</template>

<script>
export default {
  name: "CategorySelect",
  props: ["show"],
  data() {
    return {
      //一级分类的数据
      list1: [],
      //二级分类的数据
      list2: [],
      //三级分类的数据
      list3: [],
      //收集相应的一级二级三级分类的id
      cForm: {
        category1Id: "",
        category2Id: "",
        category3Id: "",
      },
    };
  },
  //组件挂载完毕:向服务器发请求,获取相应的一级分类的数据
  mounted() {
    //获取一级分类的数据的方法
    this.getCategory1List();
  },
  methods: {
    //获取一级分类数据的方法
    async getCategory1List() {
      //获取一级分类的请求:不需要携带参数
      let result = await this.$Api.attr.reqCategory1List();
      if (result.code == 200) {
        this.list1 = result.data;
      }
    },
    //一级分类的select事件回调(当一级分类的option发生变化的时候获取相应二级分类的数据)
    async handler1() {
      //清除数据
      this.list2 = [];
      this.list3 = [];
      this.cForm.category2Id = "";
      this.cForm.category3Id = "";
      //解构出一级分类的id
      const { category1Id } = this.cForm;
      this.$emit("getCategoryId", { categoryId: category1Id, level: 1 });
      //通过一级分类的id,获取二级分类的数据
      let result = await this.$Api.attr.reqCategory2List(category1Id);
      if (result.code == 200) {
        this.list2 = result.data;
      }
    },
    //二级分类的select事件回调(当二级分类的option发生变化的时候获取相应三级分类的数据)
    async handler2() {
      //清除数据
      this.list3 = [];
      this.cForm.category3Id = "";
      //结构出数据
      const { category2Id } = this.cForm;
      this.$emit("getCategoryId", { categoryId: category2Id, level: 2 });
      let result = await this.$Api.attr.reqCategory3List(category2Id);
      if (result.code == 200) {
        this.list3 = result.data;
      }
    },
    //三级分类的事件回调
    handler3() {
      //获取三级分类的id
      const { category3Id } = this.cForm;
      this.$emit("getCategoryId", { categoryId: category3Id, level: 3 });
    },
  },
};
</script>

<style scoped>
</style>

 父组件来接收数据

平台属性管理动态展示属性

就是三级联动数据确定那一刻,获取平台属性的内容

先写接口 

拿到数据 

动态渲染 

平台属性之添加属性与修改属性静态完成

通过一个v-show来控制这个显示和隐藏

这里有一个细节,那就是没有选一二三级。这个按钮就不能使用。这里我们用 :disabled="!category3Id" 如果有category3Id就是相当于可以使用

我们还需要写添加属性修改属性的结构

  <div v-show="!isShowTable">
        <el-form :inline="true" ref="form" label-width="80px" >
          <el-form-item label="属性名">
            <el-input placeholder="请输入属性名"></el-input>
          </el-form-item>
        </el-form>
        <el-button type="primary" icon="el-icon-plus">添加属性值</el-button>
        <el-button @click="isShowTable = true">取消</el-button>
        <el-table style="width: 100%; margin: 20px 0px" border >
          <el-table-column align="center" type="index" label="序号" width="80"> </el-table-column>
          <el-table-column width="width" prop="prop" label="属性值名称">
          </el-table-column>
          <el-table-column width="width" prop="prop" label="操作">
          </el-table-column>
        </el-table>
        <el-button type="primary">保存</el-button>
        <el-button @click="isShowTable = true">取消</el-button>
      </div>
    </el-card>
  </div>

收集属性名和属性值操作

这里要说一下什么是属性和属性值

这块写属性名称     属性列表

属性:颜色

属性值:粉色,红色等等

调用这个接口

 携带参数有讲究的

"attrName": "string",
  "attrValueList": [
    {
      "attrId": 0,
      "id": 0,
      "valueName": "string"
    }
  ],
  "categoryId": 0,
  "categoryLevel": 0,
  "id": 0

 注意:别在data当中收集三级分类的id

因为对象存储数据是无序存储

就是你不能确定对象中的属性谁先谁后,因此这个this.category3Id就是undefined

 通过这种方式就能获取到表单的属性 

现在我们获取到了属性名,但是没有获取到属性值

 async getAttrList() {
      //获取分类的ID
      const { category1Id, category2Id, category3Id } = this;
      //获取属性列表的数据
      let result = await this.$Api.attr.reqAttrList(
        category1Id,
        category2Id,
        category3Id
      );
      if (result.code == 200) {
        this.attrList = result.data;
      }
    }, 


addAttrValue() {
      //向属性值的数组里面添加元素
      //attrId:是你相应的属性的id,目前而言我们是添加属性的操作,还没有相应的属性的id,目前而言带给服务器的id为undefined
      //valueName:相应的属性值的名称
      this.attrInfo.attrValueList.push({
        attrId: this.attrInfo.id, //对于修改某一个属性的时候,可以在已有的属性值基础之上新增新的属性值(新增属性值的时候,需要把已有的属性的id带上)
        valueName: "",
        flag: true,
      });}

解决返回按钮数据回显问题

就是在每次按钮点击之前,把之前的数据清空。

同时我们这里可以点击添加属性按钮,收集到3id

addAttr() {
      //切换table显示与隐藏
      this.isShowTable = false;
      //清除数据
      //收集三级分类的id
      this.attrInfo = {
        attrName: "", //属性名
        attrValueList: [
          //属性值,因为属性值可以有多个因此用数组,每一个属性值都是一个对象需要attrId,valueName
        ],
        categoryId: this.category3Id, //三级分类的id
        categoryLevel: 3, //因为服务器也需要区分几级id
      };
    },

修改属性操作

这个row就是这一行的属性值

 这里有一个bug,就是我们点击取消按钮的时候他也会变化。这里我们不能使用浅拷贝,由于数据结构当中存在对象里面套数组,数组里面有套对象,因此需要使用深拷贝解决这类问题

这里可以使用插件loadsh进行深拷贝,这就不能实现值不会随的v-model的修改,而修改了

查看模式与修改模式切换

当我们点击添加属性值按钮的时候就应该把属性的id传进去

对于修改某一个属性的时候,可以在已有的属性值基础之上新增新的属性值(新增属性值的时候,需要把已有的属性的id带上)

input跟span来回进行切换

参看模式:显示span

编辑模式:显示input

注意:通过flag标记进行切换参看模式与编辑模式,但是需要注意的时候,一个属性flag是没有办法控制全部属性的切换

解决方案就是在每个元素添加的时候给他添加一个属性flag

flag属性:给每一个属性值添加一个标记flag,用户切换查看模式与编辑模式,好处,每一个属性值可以控制自己的模式切换

当前flag属性,响应式数据(数据变化视图跟着变化) 

然后通过v-if来控制 当失去焦点和回车的时候,我们需要进行模式的切换 

查看模式与编辑模式注意事项

1.如果属性值为空不能作为新的属性值,需要给用户提示,让他输入一个其他的属性值

2.新增的属性值不能与已有的属性值重复

row最新新增的属性值【数组的最后一项元素】 而item是指得这个数组的每一项

修改查看模式和编辑模式的切换

就是我们切换到编辑模式上,发现flag是没有的,因为它是后面添加上的,并不是响应式数据

可以通过这种方式,但是视图并不会跟着变化(对象中后追加的属性,Vue默认不做响应式处理) 

这里我们需要使用$set

第一个参数:对象  第二个参数:添加新的响应式属性  第三参数:新的属性的属性值

表单元素自动对焦实现

点击span的时候,获取到input的节点,然后自动对焦

这里我们给span绑定一个事件 同时给input 用ref获取到它的节点,但是这个input并不是一个而是多个。因此我们可以用索引值当做它的标记 用于区分它是第几个信息

获取input节点,实现自动聚焦

        需要注意:点击span的时候,切换为input变为编辑模式,但是需要注意,对于浏览器而言,页面重绘与重拍耗时间的

       点击span的时候,重绘重拍一个input它是需要耗费事件,因此我们不可能一点击span立马获取到input

       $nextTick,当节点渲染完毕了,会执行一次

除了切换span要获取聚焦外,点击添加属性值按钮也应该让获取到数组的最后一项聚焦

删除属性值的操作

这里我们需要用到这个组件

 复制到代码中,结构大概是这样的

这里使用模板字符串的方式,告诉用户删除的是那个 confirm是气泡确定框确定事件

但是我们会发现调用这个办法是没有效果的,因为我们这个项目的版本是老版本很旧

 所以用@onConfirm

保存操作

用这个接口

 这里提交给服务器的参数,有俩个讲究

整理参数:1,如果用户添加很多属性值,且属性值为空的不应该提交给服务器

2.提交给服务器数据当中不应该出现flag字段

用filter这个方法实现那flag这个属性过滤掉 

按钮与三级联动的可操作性 

isShowTable给子传过去 

子接收show属性 

然后通过这个属性来控制 

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

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

相关文章

数据集笔记:纽约花旗共享单车od数据

花旗共享单车公布的其共享单车轨迹数据&#xff0c;包括2013年-2021年曼哈顿、布鲁克林、皇后区和泽西城大约14500辆自行车和950个站点的共享单车轨迹数据 数据地址&#xff1a;Citi Bike System Data | Citi Bike NYC | Citi Bike NYC 性别&#xff08;0未知&#xff1b;1男&…

Idea引入thymeleaf失败解决方法

报错 Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback.Fri Sep 29 09:42:00 CST 2023 There was an unexpected error (typeNot Found, status404). 原因&#xff1a;html没有使用thymeleaf 首先要引入…

pmp考试有包过班吗?靠谱吗?

PMP考试是全球范围内最为知名和认可的项目管理专业认证考试之一。对于想要在项目管理领域取得突破和进步的人来说&#xff0c;PMP认证是非常重要的一项资格。然而&#xff0c;对于很多考生来说&#xff0c;他们可能会关心一个问题&#xff1a;PMP考试有包过班吗&#xff1f;靠谱…

四川玖璨电子商务有限公司抖音培训引领电商新潮

近年来&#xff0c;随着电子商务的迅猛发展&#xff0c;抖音这个社交媒体平台也逐渐成为了商家必争之地。四川玖璨电子商务有限公司抖音培训&#xff0c;为你解锁电商流量密码&#xff0c;助你一飞冲天&#xff01; 一、抖音电商&#xff1a;下一个电商蓝海 作为拥有海量用户的…

操作系统相关杂项

系列文章目录 文章目录 系列文章目录前言一、dlopen, dlerror, dlclose直接执行动态库中的某个函数/某段代码 Linux共享库的组织共享库的构造和析构函数 动态链接堆栈初始化C全局构造与析构模拟实现库函数 freadsyscallsyscall 原理基于int的Linux的经典系统调用实现 前言 一、…

idea Springboot 图书管理系统VS开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot 图书管理系统是一套完善的信息系统&#xff0c;结合springboot框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#…

基于Java实现的民宿预订管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

yolox相关

yolox YOLOXYOLOX-DarkNet53yolov3作为baseline输入端Strong data augmentationMosaic数据增强MixUp数据增强注意 BackboneNeckPrediction层Decoupled headDecoupled Head 细节 Anchor-freeAnchor Based方式Anchor Free方式标签分配初步筛选精细化筛选 SimOTASimOTA Other Back…

Thymeleaf快速入门(Spring版)

文章目录 Thymeleaf快速入门&#xff08;Spring版&#xff09;1、Thymeleaf概述2、Thymeleaf快速入门3、Thymeleaf基础语法3.1 th属性3.2 标准表达式语法3.2.1 变量表达式3.2.2 选择表达式3.2.3 URL表达式3.2.3 链接表达式3.2.4 国际化表达式3.2.5 片段引用表达式 Thymeleaf快速…

机器学习——一元线性回归构造直线,并给出损失函数

目 录 Question 问题分析 1.概念补充 2.流程分析 3.注意 具体实现 最终成果 代码 思考&#xff1a; Question 在二维平面有n个点&#xff0c;如何画一条直线&#xff0c;使得所有点到该直线距离之和最短 如果能找到&#xff0c;请给出其损失函数 问题分析 1.概念…

BASH shell脚本篇2——条件命令

这篇文章介绍下BASH shell中的条件相关的命令&#xff0c;包括&#xff1a;if, case, while, until, for, break, continue。之前有介绍过shell的其它基本命令&#xff0c;请参考&#xff1a;BASH shell脚本篇1——基本命令 1. If语句 if语句用于在顺序执行语句的流程中执行条…

visio将形状、图形、文字、符合进行任意角度旋转(已解决)

第一步&#xff1a;选择一个形状&#xff0c;并选定它&#xff0c;如下图 第二步&#xff1a;在视图中&#xff0c;按顺序点击 会弹出一个位置框&#xff0c;如下图。 这里设置 角度的值 为 35deg&#xff0c;按“回车键”&#xff0c;如下图

爆肝整理,常问接口自动化测试面试题+答案(详全)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 面试题&#xff1…

LLMs: 强化学习从人类反馈中学习Reinforcement learning from human feedback (RLHF)

让我们考虑一下文本摘要的任务&#xff0c; 即使用模型生成一段简短的文本&#xff0c;捕捉 较长的文章中最重要的观点。 您的目标是通过向模型 展示人工生成的摘要示例&#xff0c;使用微调来提高模型的总结能力。 2020年&#xff0c;OpenAI的研究人员发表了一篇论文&#xff…

【SQL】mysql创建定时任务执行存储过程--20230928

1.先设定时区 https://blog.csdn.net/m0_46629123/article/details/133382375 输入命令show variables like “%time_zone%”;&#xff08;注意分号结尾&#xff09;设置时区&#xff0c;输入 set global time_zone “8:00”; 回车,然后退出重启&#xff08;一定记得重启&am…

定时任务管理平台青龙 QingLong

一、关于 QingLong 1.1 QingLong 介绍 青龙面板是支持 Python3、JavaScript、Shell、Typescript 多语言的定时任务管理平台&#xff0c;支持在线管理脚本和日志等。其功能丰富&#xff0c;能够满足大部分需求场景&#xff0c;值得一试。 主要功能 支持多种脚本语言&#xf…

《动手学深度学习 Pytorch版》 7.6 残差网络(ResNet)

import torch from torch import nn from torch.nn import functional as F from d2l import torch as d2l7.6.1 函数类 如果把模型看作一个函数&#xff0c;我们设计的更强大的模型则可以看作范围更大的函数。为了使函数能逐渐靠拢到最优解&#xff0c;应尽量使函数嵌套&…

Java 基于 SpringBoot 的在线学习平台

1 简介 基于SpringBoot的Java学习平台&#xff0c;通过这个系统能够满足学习信息的管理及学生和教师的学习管理功能。系统的主要功能包括首页&#xff0c;个人中心&#xff0c;学生管理&#xff0c;教师管理&#xff0c;课程信息管理&#xff0c;类型管理&#xff0c;作业信息…

F12报错前端对应请求接口未在NetWork显示

问题背景 今天看到一个接口在部分情况下为正常渲染数据 发现是后端发送数据有问题&#xff0c;但是在NetWork里面怎么都找不到 问题原因 翻看代码&#xff0c;发现是一种异步请求 内部报错了&#xff0c;所以浏览器看不到接口 具体情况 翻看控制台&#xff1a; 发现属性未…

QT用户登录注册,数据库实现

登录窗口头文件 #ifndef LOGINUI_H #define LOGINUI_H#include <QWidget> #include <QLineEdit> #include <QPushButton> #include <QLabel> #include <QMessageBox>#include <QSqlDatabase> //数据库管理类 #include <QSqlQuery> …