Vue3+express实现element-plus组件upload上传图片携带data

news2024/11/25 14:28:10

需求背景:有多个轮播图需要单独上传,需要用data去区分上传的是哪一个轮播图
添加轮播图页面如下图所示:
轮播图上传
实现效果:
实现效果

实现思路及需要了解一下信息
①每一个轮播图应在数据库中有相对应的字段,如下所示:
sjk
需要在数据库初就考虑好,后续进行更新的时候只需找到对应的字段更新url即可
②upload组件传至后端会返回图片在后端中的url地址,只有url地址而没有对应的轮播图的信息,所以在上传时需携带data
关键点之一在于如何携带data
③在第②步中需要把图片上传至一个类似于中间件的一个数据表中,单纯用来存放图片并接收图片在系统中的url地址
④在第②步执行执行完后,可以接收到图片的url以及对应的是哪个轮播图
⑤通过第④步得到的数据,及时更新表中的数据
⑥为了减少内存,中间件数据表中的url数据应该及时清除,所以在第⑤步之后需要调用一个接口删除url
⑦为了实现第⑥步,需要给每一个上传的图片绑定一个uuid,以便传入uuid找到对应的图片进行删除
⑧获取所有的url地址进行渲染

为什么使用uuid而不用nanoid呢,这是因为nanoid不支持commonJS方式导入

总结使用了如下4个接口:
①把图片上传至中间件数据表中
②把返回的url和data插入真正的数据表中
③清除中间件数据表中的数据
④调用所有的轮播图数据进行渲染

upload组件在设置页面中的代码如下:
template部分

<div class="spider-wrapped">
	<div class="spider-content">轮播图1:</div>
	<!-- action 是上传的接口地址
		on-success是上传成功的回调,及返回url及轮播图1的信息
		auto-upload为自动上传模式
		data为携带的数据
	 -->
	<el-upload class="upload-demo" 
	action="http://127.0.0.1:3007/set/uploadswiper"
		:on-success="onSuc" :auto-upload="true" ref="uploadRef" :data='data.l1'
		:show-file-list='false'>
		<template #trigger>
		<!-- 为上传之前用了个雪碧图代替 -->
			<img :src="swiperData.swiper1" alt="" class="swiper" v-if="!swiperData.swiper1==''">
			<img src="@/assets/雪碧图.png" alt="" v-else>
		</template>
	</el-upload>
</div>

script部分 (组件式setup TS)

// 携带的data
	const data = {
		l1: '轮播图1',
	}
// 轮播图地址
	const swiperData = ref({
		swiper1: '',
	})

const onSuc = async (res) => {
	// 因为返回的数据是一个对象,类型如{0: '轮', 1: '播', 2: '图', 3: '1'} 需要转化成字符串进行传参
	let str = "";
	for (let i = 0; i < 4; i++) {
		str += res.data[i];
	}
	const onlyId = res.onlyId
	const res1 = await addSwiper(str, res.url)
	if (res1 == '添加图片成功') {
		ElMessage({
			message: '添加轮播图片成功',
			type: 'success',
		})
		// 传入uuid删除中间件数据库中的数据,以免增加无用内存
		await deleteSwiper(onlyId)
		// 刷新页面,拿到所有的轮播图数据
		getallswiper()
	} else {
		ElMessage.error('添加轮播图片失败,请检查网络是否通畅')
	}
}

前端接口调用部分:

// 删除在image的轮播图
export const deleteSwiper = onlyId => {
	return instance({
		url: '/set/deleteSwiperInImage',
		method: 'POST',
		data:{
			onlyId
		}
	})
}

// 添加轮播图到setting中
export const addSwiper = (set_name,set_value) => {
	return instance({
		url: '/set/insertSwiperInSetting',
		method: 'POST',
		data:{
			set_name,
			set_value
		}
	})
}

// 获取全部轮播图
export const getSwiperList = () => {
	return instance({
		url: '/set/getAllSwiper',
		method: 'POST',
	})
}

后端接口实现:

// 轮播图上传
exports.uploadswiper = (req, res) => {
	const useful = '轮播图'
	let oldName = req.files[0].filename;
	// 新建uuid
	const onlyId = crypto.randomUUID()
	// 计算机上文件的名称
	let originalname = req.files[0].originalname;
	//给新名字加上原来的后缀
	let newName = req.files[0].originalname;
	//改图片的名字 renameSync为重命名
	fs.renameSync('./public/upload/' + oldName, './public/upload/' + newName);
	const sql = 'insert into image set ? '
	db.query(sql, {
		onlyId,
		image_url: `http://127.0.0.1:3007/upload/${newName}`,
		useful,
	}, (err, result) => {
		if (err) return res.cc(err)
		// 上传成功
		res.send({
			data:req.body,
			// 返回uuid
			onlyId,
			err: 0,
			url: "http://127.0.0.1:3007/upload/" + newName
		});
	})
}

// 删掉image中的轮播图
exports.deleteSwiperInImage = (req, res) => {
	const userinfo = req.body
	// 根据唯一的id删除
	const sql = 'delete from image where onlyId = ?'
	db.query(sql, userinfo.onlyId, (err, result) => {
		if (err) return res.cc(err)
		res.send("删除图片成功")
	})
}

// 添加轮播图到setting中 字段是轮播图和setting中的名字
exports.insertSwiperInSetting = (req, res) => {
	const userinfo = req.body
	const sql = 'update setting set set_value = ? where set_name = ?'
	db.query(sql, [userinfo.set_value,userinfo.set_name], (err, result) => {
		if (err) return res.cc(err)
		res.send("添加图片成功")
	})
}

// 获取全部轮播图 用like字符
exports.getAllSwiper = (req, res) => {
	const userinfo = req.body
	// 使用了like关键字
	const sql = "select * from setting where set_name like '轮播图%' "
	db.query(sql,(err, result) => {
		if (err) return res.cc(err)
		res.send(result)
	})
}

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

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

相关文章

【数据仓库】即席查询

文章目录 定义特点OLTP、OLAP、即席查询(ad hoc query)区别与联系相关框架Kylin来源 定义 即席查询&#xff08;Ad Hoc&#xff09;是用户根据自己的需求&#xff0c;灵活的选择查询条件&#xff0c;系统能够根据用户的选择生成相应的统计报表。即席查询与普通应用查询最大的不…

CompletableFuture的简单使用

原文地址&#xff1a;CompletableFuture原理与实践-外卖商家端API的异步化 CompletableFuture的介绍&#xff1a; CompletableFuture是Java 8中引入的一种基于Future的异步编程机制。与传统的Future相比&#xff0c;CompletableFuture提供了更多的操作链支持&#xff0c;并且…

skywalking 9.x入门(二) skywalking全链路tid追踪

这里是weihubeats,觉得文章不错可以关注公众号小奏技术&#xff0c;文章首发。拒绝营销号&#xff0c;拒绝标题党 背景 继上次我们对skywalking整体架构作了一些了解&#xff0c;然后就是学习了spring boot项目如何基于agent接入skywalking 这次我们要实现的是spring boot项目…

USB | 查询usb设备占用带宽

USB | 查询usb设备占用带宽 请教一下windows下有什么工具能查询usb设备占用带宽吗&#xff1f;Linux上有usbtop&#xff0c;windows有类似工具吗 DeviceMonitoringStudio设备监控工具的使用

好用的自动化框架-Allure

概述 报告主要包含总览、类别、测试套件、图表、时间刻度、功能、包等7大部分&#xff0c;支持自定义诸多信息&#xff0c;包括附件添加、缺陷链接、案例链接、测试步骤、Epic、Feature、Story、Title、案例级别等&#xff0c;相当强大。 allure与pytest的结合使用可以呈现完…

华为OD机试真题B卷 Java 实现【求小球落地5次后所经历的路程和第5次反弹的高度】,附详细解题思路

一、题目描述 假设一个球从任意高度自由落下&#xff0c;每次落地后反跳回原高度的一半; 再落下, 求它在第5次落地时&#xff0c;共经历多少米?第5次反弹多高&#xff1f; 数据范围&#xff1a;输入的小球初始高度满足 1 \le n \le 1000 \1≤n≤1000 &#xff0c;且保证是一…

Mysql存储过程的递归调用及数据量过大group_concat()显示不全的问题

业务场景 使用mysql group_concat()函数&#xff0c;对查询的数据进行字符串连接操作。 由于查询的结果较多&#xff0c;连接后的结果很长导致不能完全显示。 第一种解决方案&#xff08;不需要重启Mysql, 如果mysql重启后设置会失效&#xff0c;需重新设置&#xff09; 执行…

代码随想录-哈希表

学习《代码随想录》 基础知识哈希函数哈希碰撞三种哈希结构 有效的字母异位词两个数组的交集两数之和暴力法Map 四数相加三数之和哈希解法双指针法 四数之和 基础知识 哈希表是一种根据关键码的值直接访问数据的数据结构。一般用来快速判断一个元素是否出现在集合中。 哈希函…

【AUTOSAR】Com通讯栈配置说明(二)---- CanIf模块

CanIf模块 CanIfCtrlDrvCfgs CanIfCtrlDrvBusOffNotification:busoff 发生后的callback函数 CanIfCtrlDrvWakeupNotification: wakeup 发生后的callback函数 CanIfCtrlId: 逻辑Canif id CanIfWakeupSupport:是否支持唤醒 CanIfMaxDlc:最大报文长度 CanIfCtrlCanCtrlRef: 关联…

我们是如何管理蓝精灵协会 PFP 集合的程序性生成的?

自从 Cryptopunks 和 Bored Apes 发布以来&#xff0c;大多数蓝筹 NFT 系列都在其创意基准中使用了相同的反复出现的概念&#xff1a;一幅插图肖像&#xff08;也称为 PFP&#xff0c;用于个人资料图片或证明图片&#xff09;通过使用随机分布的定制层而被改变成几千种略有不同…

【回顾经典AI神作】理解和实现ResNeXt(比ResNet最先进的图像分类模型)

与 ResNet 相比好在哪里? 相同的参数个数,结果更好:一个 101 层的 ResNeXt 网络,和 200 层的 ResNet 准确度差不多,但是计算量只有后者的一半 论文参考:https://arxiv.org/pdf/1611.05431.pdf 以下三篇是介绍和改进残差网络的论文: 用于图像识别的深度残差学习(链接…

ELECTRA模型简单介绍

目录 一、整体概要 二、生成器 三、判别器 四、模型训练 五、其它改进 一、整体概要 ELECTRA&#xff08;Efficiently Learning an Encoder that Classifies Token Replacements Accurately&#xff09;采用了一种“生成器——判别器”结构&#xff0c;其与生成式对抗网络…

报表服务器Stimulsoft Server v2023.2亮点:支持PostgreSQL、选项卡

Stimulsoft Server&#xff08;原Stimulsoft Reports.Server&#xff09;是一款完善的商业智能解决方案&#xff0c;采用C/S架构&#xff0c;提供报告和分析功能。前端用来展现数据&#xff0c;后台用来处理和存储数据。Stimulsoft Server&#xff08;原Stimulsoft Reports.Ser…

IDEA性能优化设置(解决卡顿问题)

在我们日常使用IDEA进行开发时&#xff0c;可能会遇到许多卡顿的瞬间&#xff0c;明明我们的机器配置也不低啊&#xff1f;为什么就会一直卡顿呢&#xff1f; 原来这是因为IDEA软件在我们安装的时候就设置了默认的内存使用上限&#xff08;通常很小&#xff09;&#xff0c;这就…

成都远石无人机航测服务的具体内容

成都远石拥有多年西南地区无人机航测作业经验&#xff0c;现具备DEM、DSM、DOM、三维实景模型及机载激光雷达全套数据成果的生产能力&#xff0c;致力于为各个行业提供准确的数据支持。现在&#xff0c;小编就来给大家介绍成都远石无人机航测服务的具体内容。 1、数字高程模型…

SocketTools Library Edition C++ Crack

SocketTools 库版 SocketTools Library Edition 是一套 Windows 库&#xff0c;可简化 Internet 应用程序开发。它提供您入门所需的一切&#xff0c;包括文档和示例&#xff0c;以及免费的技术支持来回答您遇到的任何开发问题。SocketTools Library Edition 包括本机 Windows 库…

Java集成influxDB 默认UTC时区问题

dd 我用的influxDB 1.8版本高版本我不清楚&#xff0c;因为1.x版本便于写sq语法。 influxDB时序库默认使用 UTC时区&#xff0c;并且无法通过配置来修改这个时区&#xff0c;很多文档说在查询数据的时候加上 tz(Asia/Shanghai)。 而这个在Windows环境下的influxdb会报错…

【youcans动手学模型】AlexNet模型CIFAR10图像分类

欢迎关注『youcans动手学模型』系列 本专栏内容和资源同步到 GitHub/youcans 【youcans动手学模型】AlexNet模型CIFAR10图像分类 1. AlexNet 卷积神经网络模型1.1 论文简介1.2 AlexNet 的主要贡献1.3 AlexNet 网络1.4 模型的运行结果 2. 在 PyTorch 中定义 AlexNet 模型类2.1 按…

Qt编写视频监控系统77-Onvif组件支持非正常时间的设备

一、前言 在经历了大量的现场设备测试&#xff0c;至少几十种厂家、几百种设备&#xff0c;遇见过奇奇怪怪的问题&#xff0c;一个个想方设法解决&#xff0c;发现有个问题是在下发鉴权的时候&#xff0c;需要带上设备的时间&#xff0c;而不是发送端的时间&#xff0c;如果带…

LeetCode 1110. 删点成林

【LetMeFly】1110.删点成林 力扣题目链接&#xff1a;https://leetcode.cn/problems/delete-nodes-and-return-forest/ 给出二叉树的根节点 root&#xff0c;树上每个节点都有一个不同的值。 如果节点值在 to_delete 中出现&#xff0c;我们就把该节点从树上删去&#xff0c…