vue3 实现多层级列表

文章目录

  • 需求背景
  • 解决效果
  • index.vue
  • 视频效果

需求背景

需要在统一个列表下,实现商品和规格得管理和联动

解决效果

在这里插入图片描述

index.vue

<!--/*** @author: liuk* @date: 2023/7/7* @describe: 商品列表
*/-->
<template><div class="container"><h1>商品列表</h1><div class="creatbtn" style="margin-bottom: 15px"><div class="creatbtn1"><el-button class="btn" @click="editShop('')">+&nbsp;新增商品</el-button></div></div><el-row justify="space-between" style="margin-bottom: 15px"><el-col :span="12"><el-radio-group v-model="fromData.putShelf" @change="getList" size="large"><el-radio-button label="">全部</el-radio-button><el-radio-button label="1">已发布</el-radio-button><el-radio-button label="0">未发布</el-radio-button></el-radio-group></el-col><el-col :span="12"><el-form-item label="名称"><el-input v-model="fromData.productName" style="width: 400px;marginRight:30px " placeholder="请输入内容"@keyup.enter="getList"><template #append><el-icon @click="getList"><Search/></el-icon></template></el-input><el-button type="danger" @click="resetBtn">重置</el-button></el-form-item></el-col></el-row><el-table v-if="shopTableList.length" v-loading="loading" :data="shopTableList" class="cemetery-table" borderwidth="1200px"@expand-change="expandChange" :row-key="(row) => row.id" :expand-row-keys="expands"><el-table-column min-width="50" type="expand"><template #default="props"><div><el-table :data="props.row.bMallGoodsSpecifications" border><el-table-column width="80" type="index" label="序号" align="center"/><el-table-column label="图片" align="center" prop="image"><template #default="scope"><image-upload class="img-specif-box" v-model="scope.row.image" :limit="1":disabled="!scope.row.specificationEdit"></image-upload></template></el-table-column><el-table-column label="规格描述" align="center" prop="specificationDescription"><template #default="scope"><el-input v-model="scope.row.specificationDescription":disabled="!scope.row.specificationEdit"style="width: 60px"/></template></el-table-column><el-table-column label="规格" align="center" prop="specifications"><template #default="scope"><el-input v-model="scope.row.specifications":disabled="!scope.row.specificationEdit"style="width: 60px"/></template></el-table-column><el-table-column label="价格" align="center" prop="price"><template #header><span class="red">*</span><el-icon><Edit/></el-icon>价格</template><template #default="scope"><el-input v-model="scope.row.price":disabled="!scope.row.specificationEdit"style="width: 60px"/></template></el-table-column><el-table-column label="单位" align="center" prop="unitName"><template #default="scope"><el-select v-model="scope.row.unitId" :disabled="!scope.row.specificationEdit"><el-option v-for="(item,i) in units" :key="i" :label="item.label" :value="item.value"/></el-select></template></el-table-column><el-table-column label="划线价" align="center" prop="crossedPrice"><template #header><el-icon><Edit/></el-icon>划线价</template><template #default="scope"><el-input v-model="scope.row.crossedPrice":disabled="!scope.row.specificationEdit"style="width: 60px"/></template></el-table-column><el-table-column label="库存" align="center" prop="stock"><template #default="scope"><el-input v-model="scope.row.stock":disabled="!scope.row.specificationEdit"style="width: 60px"/></template></el-table-column><el-table-column label="可否调价" align="center" prop="adjustThePrice"><template #default="scope"><el-switch v-model="scope.row.adjustThePrice" :active-value="1" :inactive-value="0":disabled="!scope.row.specificationEdit"style="--el-switch-on-color: rgb(19, 206, 102); --el-switch-off-color: rgb(255, 73, 73)"/></template></el-table-column><el-table-column fixed="right" label="操作" align="center" class-name="small-padding fixed-width"min-width="210"><template #default="scope"><el-button v-show="!scope.row.specificationEdit" type="success"@click="editSpecifications(scope.row,props)">编辑</el-button><el-button v-show="scope.row.specificationEdit" type="success"@click="updateSpecification(scope.row)">保存</el-button><el-button v-show="scope.row.specificationEdit"@click="scope.row.specificationEdit = false">取消</el-button><el-button v-show="!scope.row.specificationEdit" type="danger"@click="delSpecifica(scope.row,props)">删除</el-button></template></el-table-column></el-table></div></template></el-table-column><el-table-column min-width="80" type="index" align="center" label="序号"/><el-table-column min-width="100" label="商品名称" align="center" prop="productName" sortable><template #header>商品名称<el-icon><QuestionFilled/></el-icon></template></el-table-column><el-table-column min-width="150" label="图片" align="center" prop="productImage"><template #default="scope"><el-image style="width: 40px; height: 40px":src="scope.row.productImage":zoom-rate="1.2":preview-src-list="[scope.row.productImage]":initial-index="4"preview-teleportedfit="cover"/></template></el-table-column><el-table-column min-width="100" label="库存策略" align="center" prop="inventoryStrategy"><template #default="scope">{{ formatInventoryStrategy(scope.row.inventoryStrategy) }}</template></el-table-column><el-table-column min-width="100" label="顺序" prop="sort" align="center" sortable><template #header>顺序<el-icon><QuestionFilled/></el-icon></template></el-table-column><el-table-column min-width="100" label="是否已发布" align="center" prop="putShelf"><template #default="scope"><el-switchv-model="scope.row.putShelf" :active-value="1" :inactive-value="0"style="--el-switch-on-color: rgb(19, 206, 102); --el-switch-off-color: rgb(255, 73, 73)"/></template></el-table-column><el-table-column min-width="100" label="是否静态" align="center" prop="staticState"><template #default="scope"><el-switch v-model="scope.row.staticState" :active-value="1" :inactive-value="0":before-change="staticStateChange.bind(null, scope.row)":disabled="scope.row.staticState == 1"style="--el-switch-on-color: rgb(19, 206, 102); --el-switch-off-color: rgb(255, 73, 73)"/></template></el-table-column><el-table-column min-width="100" label="SKU数量" align="center" prop="productNum"><template #default="scope"><span :class="{red:scope.row.productNum == 0}">{{ scope.row.productNum }}</span></template></el-table-column><el-table-column min-width="100" label="价格" align="center" prop="productPrice"/><el-table-column label="操作" fixed="right" min-width="250" align="center" class-name="small-padding fixed-width"><template #default="scope"><el-button @click="addSpecif(scope.row,scope)">增加规格</el-button><el-button type="primary" @click="editShop(scope.row.id)">编辑</el-button><el-button type="danger" @click="delShop(scope.row)">删除</el-button></template></el-table-column></el-table><el-empty description="暂无商品" v-else/><paginationv-show="pages.total>0":total="pages.total"v-model:page="pages.pageNum"v-model:limit="pages.pageSize"@pagination="getList"/></div>
</template><script setup>
import {listGoods, delGoods, previewGoods} from "@/api/retailmall/goods";
import {updateSpecifications, addSpecifications, delSpecifications} from "@/api/retailmall/specifications";
import {listUnits,} from "@/api/mall/units";
import {useRoute, useRouter} from "vue-router";
import {onMounted} from "vue";// Emit
const emit = defineEmits(['editShopOpen'])
// route
const route = useRoute()
// store
import useMallStore from '@/store/modules/mall'const mallStore = useMallStore()
const router = useRouter()
const {proxy} = getCurrentInstance();const model = reactive({fromData: {},pages: {pageNum: 1,pageSize: 10,total: 0},expands: [],//表格展开行shopTableList: [],//商品列表loading: true,units: [],//单位列表
});
const {fromData, expands, pages, shopTableList, loading, units} = toRefs(model);// 编辑商品
const editShop = (id) => {emit('editShopOpen')mallStore.setCurGoodId(id)
}// 增加规格
const addSpecif = (row, props) => {let params = {commodityId: row.id,crossedPrice: 0,stock: 0,price: 0,specifications: 0,specificationDescription: ""}addSpecifications(params).then(res => {if (+res.code === 200) {previewGoods(props.row.id).then((res) => {if (+res.code === 200) {model.expands = [] // 展开行model.expands.push(row.id)props.row.bMallGoodsSpecifications = res.data.bMallGoodsSpecificationsproxy.$message.success("新增成功")}})}})
}// 修改规格
const updateSpecification = (row) => {updateSpecifications(row).then((res) => {if (+res.code === 200) {row.specificationEdit = falseproxy.$message.success("编辑成功")}})
}
// 表格展开变化  -- 只能展开一行
const expandChange = (row, expandedRows) => {if (expandedRows.length) {model.expands = []if (row) {model.expands.push(row.id)}} else {model.expands = []}
}// 删除商品
const delShop = (row) => {proxy.$modal.confirm(`确定要删除${row.productName}`).then(function () {return delGoods(row.id)}).then(() => {getList();proxy.$modal.msgSuccess("删除成功");})
}// 是否静态开关变化
const staticStateChange = (item) => {return new Promise((resolve, reject) => {proxy.$modal.confirm('一旦商品开启静态,该商品不可进行任何操作(删除编辑发布隐藏),是否确定要 修改 商品 ?').then(() => {resolve(true)})})
}// 编辑规格
const editSpecifications = (row) => {row.specificationEdit = true
}// 删除规格
const delSpecifica = (row, props) => {proxy.$modal.confirm(`确定要删除${row.productName}`).then(function () {return delSpecifications(row.id)}).then(() => {previewGoods(props.row.id).then((res) => {props.row.bMallGoodsSpecifications = res.data.bMallGoodsSpecifications})proxy.$modal.msgSuccess("删除成功");})
}// 获取商品列表
function getList() {let params = {...model.fromData,...model.pages,shopIds: [route.query.id],total: undefined}model.loading = true;listGoods(params).then(response => {model.expands = [] // 不展开行model.shopTableList = response.rows || {bMallGoodsSpecifications: []};model.pages.total = response.total;model.loading = false;})
}// 表单重置
function reset() {form.value = {};
}// 获取全部单位
const getlistUnits = () => {let params = {pageNum: 1,pageSize: 999}listUnits(params).then(res => {model.units = res.rows.map((item) => {return {label: item.name,value: item.id}})})
}
// 重置
const resetBtn = () => {fromData.value = {}getList()
}onMounted(() => {getList();getlistUnits()
})const formatInventoryStrategy = (val) => {let str = ''switch (val) {case 0:str = '无需库存'breakcase 1:str = '下单后减少'breakcase 2:str = '支付后减少'breakcase 3:str = '使用后减少'break}return str
}
</script>

视频效果

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

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

相关文章

Java类加载深度剖析-大白话

Java类加载深度剖析 1.类加载的入口2.AppClassLoader、ExtClassLoader、BootstrapClassLoader的血脉渊源3.ExtClassLoader究竟是不是孙大圣4.为什么自定义类加载器的父类加载器是AppClassLoader呢&#xff1f;5.我们应该如何打破双亲委派机制呢&#xff1f;6.如何保证同class对…

Mac VSCode配置运行单个C++文件

题外话&#xff1a;VSCode一键整理代码快捷键&#xff1a;ShiftoptionF 方法一&#xff1a;命令行直接编译 g -o 想创建的可执行文件名 ./cpp文件名 ./可执行文件名 以test.cpp为例&#xff0c;我创建的可执行文件名为test&#xff0c;运行结果如下&#xff1a; 方法二&#…

【裸机开发】GPT 定时器(一) —— GPT的功能、寄存器解析

后续需要使用 GPT 计数器实现中断以及延时&#xff0c;这里我们需要先了解一下GPT的功能以及相关寄存器。 目录 一、GPT 定时器的功能 1、计数器 2、输入捕获 3、输出比较&#xff08;GPT的两种工作模式&#xff09; 二、寄存器解析 1、GPTx_CR 2、GPTx_PR 3、GPTx_SR …

3.1.cuda运行API-概述

目录 前言1. Runtime API概述总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程&#xff0c;之前有看过一遍&#xff0c;但是没有做笔记&#xff0c;很多东西也忘了。这次重新撸一遍&#xff0c;顺便记记笔记。 本次课程学习精简 CUDA 教程-Runtime API 概述 课程大纲可…

【编程的多线程学习-前章】什么是进程,PCB进程控制块抽象,cup分配,内存分配,虚拟地址,进程的通信,进程的意义

什么是进程 什么是进程/任务&#xff08;Process/Task&#xff09;进程就是一个运行起来的程序PCB 进程控制块抽象(PCB Process Control Block)pcb就是一个进程PCB具体包含的信息 CPU 分配 —— 进程调度&#xff08;Process Scheduling&#xff09;内存分配 —— 内存管理&…

简单的手机记事本app怎么查看提醒列表?

很多人平时都有随手记事的习惯&#xff0c;在记录事情的时候使用手机上的记事本app是一个不错的选择。有的记事本功能比较完善&#xff0c;不但能记事还能设置提醒&#xff0c;当有多条提醒内容存在时&#xff0c;简单的手机记事本app怎么查看提醒列表呢&#xff1f;以iPhone手…

数据结构--线索二叉树找前驱后继

数据结构–线索二叉树找前驱后继 中序线索二叉树找中序后继 在中序线索二叉树中找到指定结点*p的 中序后继 \color{red}中序后继 中序后继next ①若p->rtag 1&#xff0c;则next p->rchild ②若p->rtag 0 中序遍历――左根右 左根(左根右) 左根((左根右)根右) next …

基于matlab使用多类掩码区域的卷积神经网络对人和汽车的各个实例进行分段(附源码)

一、前言 此示例展示了如何使用基于多类掩码区域的卷积神经网络 &#xff08;R-CNN&#xff09; 对人和汽车的各个实例进行分段。实例分割是一种计算机视觉技术&#xff0c;您可以在其中检测和定位对象&#xff0c;同时为每个检测到的实例生成分割图。 此示例首先演示如何使用…

分治法求最近点对问题

目录 蛮力法 分治法 探究分治规模小于一定程度时采用暴力解法 蛮力法 算法思想 蛮力法&#xff0c;顾名思义&#xff0c;即穷举所有点与点之间的距离&#xff0c;两层循环暴力找出最近点对。算法执行可视化如图1所示&#xff0c;word文档GIF静态显示&#xff0c;附件已含动…

阿里版ChatGPT——通义千问,开箱初体验

所有行业、所有应用、所有服务都值得基于新型人工智能技术重做一遍&#xff0c;在带来创造性客户体验的同时&#xff0c;生产范式、工作范式、生活范式也将发生变化。——阿里集团董事会主席兼CEO 张勇 2023阿里云峰会上&#xff0c;通义千问大语言模型对外发布&#xff0c;宣称…

JAVA环境变量配置步骤及测试(JDK的下载 安装 环境配置教程)

目录 一&#xff1a;JDK的下载、安装和配置 JDK 压缩包版的安装 JDK 安装版的安装 二&#xff1a;环境变量配置步骤 三&#xff1a;测试 四、Eclipse安装 已对此文进行更新&#xff0c;请到新文发布地址&#xff1a;https://rej177.blog.csdn.net/article/details/131565…

SpringBoot通过获取请求参数或者Headers上的特殊标识实现i18n国际化

实现效果 我们大部分都是把i18n的标识放在Headers上面&#xff1b;而把标识放在参数上的话比较少&#xff0c;放参数上的话一般是在使用a标签下载某些文件不好配置请求头的时候才使用上 配置在Headers上面&#xff1a; 配置在params上面&#xff1a; 配置代码&#xff1a; /**…