Vue接口平台学习七——接口调试页面请求体
一、实现效果图及简单梳理

请求体部分的左边,展示参数,分text和file类型。
右边部分一个el-upload的上传文件按钮,一个table列表展示,一个显示框,用于预览选择的文件,点击可大图展示。
二、页面内容实现
0. 整体布局
这里分左右两边,左边用于添加和显示参数,右边用于上传文件和预览文件
<el-row :gutter="5"><el-col :span="15"></el-col><el-col :span="9"></el-col></el-row>
1. 左边的参数值部分
单个参数
左边包含内容,参数名(输入框),参数类型(下拉选择),参数值(选择text时为输入框,选择file时,为下拉选择),一个删除按钮,一个添加参数按钮
<el-col :span="15"><el-row :gutter="5" style="margin-top: 5px;"><el-col :span="5"><el-input size="small" placeholder="参数名" clearable/></el-col><el-col :span="4"><el-select v-model="paramsType" placeholder="参数类型" size="small" style="width: 100%;"><el-option label="Text" value="text"/><el-option label="File" value="file"/></el-select></el-col><el-col :span="11"><!-- 文字输入框 --><el-input v-if="paramsType === 'text'" placeholder="参数值" size="small"clearable/><el-select v-else size="small" placeholder="选择已有文件" style="width: 100%;"><el-option value="123"/></el-select></el-col><el-col :span="4"><el-button icon="Delete" size="small" type="danger" plain></el-button></el-col></el-row><el-button style="margin-top: 10px;" icon="Plus" size="small" type="primary" plain></el-button></el-col>


单个参数大概就这样,现在需要定义一个变量,用来存储所有参数,然后遍历显示,并且点击添加时,需要向这个列表增加新的值。
多个参数循环遍历
const params = ref([]); // 参数列表 ['name','value']
<el-col :span="15"><el-row v-for="(item, index) in params" :key="index" :gutter="5" style="margin-top: 5px;"><el-col :span="5"><el-input size="small" v-model="item[0]" placeholder="参数名" clearable/></el-col><el-col :span="4"><el-select v-model="paramsType[index]" placeholder="参数类型" size="small" style="width: 100%;"><el-option label="Text" value="text"/><el-option label="File" value="file"/></el-select></el-col><el-col :span="11"><!-- 文字输入框 --><el-input v-if="paramsType[index] === 'text'" v-model="item[1]" placeholder="参数值" size="small"clearable/><el-select v-else v-model="item[1][0]" size="small" placeholder="选择已有文件" style="width: 100%;"><el-option value="123"/></el-select></el-col><el-col :span="4"><el-button icon="Delete" size="small" type="danger" plain></el-button></el-col></el-row><el-button @click="params.push(['',''])" style="margin-top: 10px;" icon="Plus" size="small" type="primary" plain></el-button></el-col>

由于后端定义的文件内容,包含名字,文件类型,文件地址三部分。所以如果选择类型是File,则有包含三部分内容。而下拉选择的仅仅只是绑定文件名,也就是列表第一个值。
删除
绑定点击事件
<el-button icon="Delete" @click="params.splice(index, 1)" size="small" type="danger" plain></el-button></el-col>
从数组中删除元素splice。
文件相关
定义接口
根据接口文档,在vue中封装接口

页面组件挂载完毕,获取一下文件列表,存储在files中,然后将数据中的info字段的第一个,也就是info[0] 绑定给文件下拉选择的选项,作为name
text和file的参数区别
后端返回文件列表的数据格式如下:

之前定义的params是一个列表,如下
params = [name,value] # 2部分组成,name和value,
# 而这个value,需要区分text和file
# 1.当选择text,value只有一个文本值
params = [name,[text_value]]# 2.当选择file,value则包含3部分
params = [name,[file_name,file_type,file_url]]
所以这里需要区分一下选择Text和选择File
<el-select @change="selectType($event, index)" v-model="paramsType[index]" placeholder="参数类型" size="small" style="width: 100%;"><el-option label="Text" value="text"/><el-option label="File" value="file"/></el-select>
const selectType = (val, index) => {if (val === 'file') {params.value[index][1] = ['', '', ''];} else {params.value[index][1] = '';}
};
下拉选项绑定File
在下拉选择时,绑定change函数,如果选择file,那参数就有3个部分组成.
<el-select v-else @change="selectFile($event, index)" v-model="item[1][0]" size="small"placeholder="选择已有文件" style="width: 100%;"><el-option v-for="item in files" :label="item.info[0]" :value="item.info[0]"/></el-select>
const files = ref([]);const getAllFile = async () => {// 获取文件列表const response = await http.pro.getFiles();if (response.status === 200) {files.value = response.data;}
};onMounted(() => {
if (props.modelValue.length > 0) {params.value = props.modelValue;} else {params.value = [['', '']];}getAllFile();
});

2. 右边的上传及预览部分
<el-col :span="9"><el-card style="padding: 0;"><el-upload class="upload-demo" :action="uploadApi" :on-success="uploadSuccess" :on-error="uploadError" :show-file-list="false" name="file" ><el-button type="primary" plain size="small">上传文件</el-button></el-upload><el-table :data="files" style="width: 100%" size="small" height="200px"><el-table-column label="已有文件"><template #default="scope"><el-tag type="success">{{ scope.row.info[0] }}</el-tag></template></el-table-column><el-table-column label="文件类型"><template #default="scope"><el-tag type="info">{{ scope.row.info[1] }}</el-tag></template></el-table-column></el-table><div>。。。图片和视频展示</div></el-card></el-col>
一个上传按钮,使用el-upload,然后一个表单展示组件,一个iframe用于显示已有的文件。
el-upload
https://element-plus.org/zh-CN/component/upload.html

添加请求上传的url
cosnt uploadApi = request.defaults.baseURL + `/api/testFile/files/`
绑定成功和失败的事件,给出提醒就行了。
const uploadSuccess = (response) => {ElMessage({type: 'success',message: '文件上传成功!',duration: 2000});getAllFile();
};const uploadError = (error) => {ElMessage({type: 'error',message: error,duration: 2000});
};
此时选择文件就能直接调用接口,上传了。

el-table
<el-table :data="files" style="width: 100%" size="small" height="200px"><el-table-column label="已有文件" show-overflow-tooltip><template #default="scope"><el-tag type="success">{{ scope.row.info[0] }}</el-tag></template></el-table-column><el-table-column label="文件类型"><template #default="scope"><el-tag type="info">{{ scope.row.info[1] }}</el-tag></template></el-table-column>
</el-table>
表单部分,与之前下拉选择时一致。内容从files读取,显示名字的地方,超长,则悬浮展示全称。
单个文件数据
{"id": 5,"info": ["procard.jpg","image/jpeg","https://testapi-13xxxx-chengdu.myqcloud.com/procard.jpg "],"file": "procard.jpg"
}
之前也看过,文件类型数据info定义时含3个字段,名字,图片,和存储地址(使用了腾讯云的对象存储)。
所以显示文件名是scope.row.info[0] ,文件类型是scope.row.info[1]
图片与视频预览展示
点击文件名,预览一下图片/视频。给文件名增加点击事件,把info传过去
<el-tag type="success" @click="viewfile( scope.row.info)">{{ scope.row.info[0] }}</el-tag>
点击后,判断点击的是图片还是视频,用不同的标签进行渲染展示
const fileType = ref('image')
const mediaIframe = ref(null);const viewFile = (info) => {mediaIframe.value = info[2];const type = info[1].toLowerCase().split('/')[0];console.log(type)if (type === 'image') {fileType.value = 'image'} else {fileType.value = 'video'}
};
<div v-if="mediaIframe"><img v-if="fileType === 'image'" @click="showFullImg" :src="mediaIframe" style="width: 100%; height: 200px;"alt="预览"><videov-else:src="mediaIframe"@click="showFullImg"controlspreload="metadata"controlsList="nodownload"style="width: 100%; height: 200px;">您的浏览器不支持视频播放</video></div><!-- 添加Dialog组件,用于大屏展示 --><el-dialog v-if="fileType==='image'" v-model="dialogVisible" title="图片预览" width="80%"><img :src="mediaIframe" style="width: 100%; height: auto;" alt="完整图片"></el-dialog><el-dialog v-else v-model="dialogVisible" title="视频预览" :width="dialogWidth" ref="videoDialog"><video:src="mediaIframe"style="width: 100%; height:500px;"controlspreload="auto"controlsList="nodownload"@loadedmetadata="setDialogWidth"autoplay>您的浏览器不支持视频播放</video></el-dialog>
const dialogVisible = ref(false);
const dialogWidth = ref('80%'); // 默认宽度
const videoDialog = ref(null); // 对话框的 ref//点击全屏展示
const showFullImg = () => {dialogVisible.value = true; // 显示Dialog
};// 根据视频本身大小,来设置弹窗宽高。代码用cursor生成的,能用就行
const setDialogWidth = (event) => {const video = event.target;const videoWidth = video.videoWidth;const videoHeight = video.videoHeight;const maxWidth = window.innerWidth * 0.8; // 最大宽度为视口宽度的80%const maxHeight = window.innerHeight * 0.8; // 最大高度为视口高度的80%let dialogWidthValue = (videoWidth / videoHeight) * maxHeight;if (dialogWidthValue > maxWidth) {dialogWidthValue = maxWidth;}dialogWidth.value = `${dialogWidthValue}px`;
};
// 添加视频相关样式 (AI生成的,直接复制的)
video {object-fit: contain;background: #000; /* 添加黑色背景 */cursor: pointer;&::-webkit-media-controls-download-button {display: none; /* 隐藏 Chrome 下载按钮 */}&::-webkit-media-controls-enclosure {overflow: hidden;}
}// 优化弹窗中的视频显示
.el-dialog {.el-dialog__body {padding: 10px;background: #000;video {max-height: 70vh;margin: 0 auto;display: block;}}
}

点击全屏展示:

到此,整个请求体部分就完成了

三、总结
主要还是elment组件的使用,用到了el-upload,el-table,el-row,el-select等等。
video展示那块还得是AI,真是一边写,一边问。才得到结果。
相关文章:
Vue接口平台学习七——接口调试页面请求体
一、实现效果图及简单梳理 请求体部分的左边,展示参数,分text和file类型。 右边部分一个el-upload的上传文件按钮,一个table列表展示,一个显示框,用于预览选择的文件,点击可大图展示。 二、页面内容实现 …...
小程序css实现容器内 数据滚动 无缝衔接 点击暂停
<view class"gundongBox"><!-- 滚动展示信息的模块 --><image class"imgWid" :src"imgurlgundong.png" mode"widthFix"></image><view class"gundongView"><view class"container&qu…...
内存条装机,无法启动
1、i5-9600k,主板技嘉z390gamingx: ①、插满4条DDR4-2666,无法启动; ②、两条DDR4-2666,插在2、4或者1、3插槽,可以启动; ③、三条DDR4-2666,一条DDR4-2400,插满4个内存插槽&…...
【力扣】day1
文章目录 27.移除元素26. 删除有序数组的重复项 27.移除元素 26. 删除有序数组的重复项 我们仔细看一下这两道题的最后的返回值,为什么第一题返回slow 而第二题返回slow1 最后的返回值该如何返回绝对不是凭感觉,我们自己分析一下第一个slow,从0位置开始, 遇到val值就开始和fas…...
图像预处理-色彩空间补充,灰度化与二值化
一.图像色彩空间转换 1.1 HSV颜色空间 HSV颜色空间使用色调(Hue)、饱和度(Saturation)和亮度(Value)三个参数来表示颜色 一般对颜色空间的图像进行有效处理都是在HSV空间进行的,然后对于基本…...
linux如何用关键字搜索日志
在 Linux 系统中搜索日志是日常运维的重要工作,以下是几种常用的关键字搜索日志方法: 1. 基础 grep 搜索 bash 复制 # 基本搜索(区分大小写) grep "keyword" /var/log/syslog# 忽略大小写搜索 grep -i "error&…...
Spring Boot项目中结合MyBatis实现MySQL的自动主从切换
原理解析 1. MySQL主从复制(Master-Slave Replication) 工作原理:MySQL主从复制通过二进制日志(binary log)来同步数据。主服务器记录所有更改操作到二进制日志中,从服务器读取这些日志并执行相应的SQL语…...
项目交接时信息遗漏,如何预防
项目交接时,信息遗漏可能导致任务延误、质量下降和团队混乱,因此,建立系统化的交接流程和使用专业的工具是防止信息遗漏的有效策略。交接过程中的信息丢失往往源自沟通不畅、文档不完整或者责任不明确等问题,这不仅影响项目的顺利…...
【AI量化第24篇】KhQuant 策略框架深度解析:让策略开发回归本质——基于miniQMT的量化交易回测系统开发实记
我是Mr.看海,我在尝试用信号处理的知识积累和思考方式做量化交易,应用深度学习和AI实现股票自动交易,目的是实现财务自由~ 目前我正在开发基于miniQMT的量化交易系统——看海量化交易系统。 本篇要讲到量化的核心了——策略。说白了每个投资者…...
向量数据库Qdrant 安装 不使用docker
一、导读 环境:Ubuntu 24.04、Windows 10、WSL 2、Qdrant 1.13.4 背景:换了新工作,使用qdrant作为向量库,需要不使用docker安装 时间:20250415 说明:初入职,不了解,暂且记下 二、…...
微电网与分布式能源:智能配电技术的场景化落地
安科瑞顾强 随着数字化转型与能源革命的加速推进,电力系统正经历从传统模式向智能化、网络化方向的深刻变革。用户侧的智能配电与智能用电技术作为这一变革的核心驱动力,正在重塑电力行业的生态格局。本文将从技术架构、应用场景及未来趋势等维度&#…...
实战指南:封装Whisper为FastAPI接口并实现高并发处理-附整合包
实战指南:封装Whisper为FastAPI接口并实现高并发处理 下面给出一个详细的示例,说明如何使用 FastAPI 封装 OpenAI 的 Whisper 模型,提供一个对外的 REST API 接口,并支持一定的并发请求。 下面是主要步骤和示例代码。 1. 环境准备…...
C#Winform程序将子窗体嵌入容器方法
private void OpenForm(Form childFrom) { //首先判断容器中是否有其他的窗体 foreach (Control item in this.panelRight.Controls) { if (item is Form) { ((Form)item).Close(); } } //嵌入新的窗体 childFrom.TopLevel false;//将子窗体设置成非顶级控件 childFrom.Parent…...
Web三漏洞学习(其一:文件上传漏洞)
靶场:云曦历年考核题 一、文件上传 在此之前先准备一个一句话木马 将其命名为muma.txt 23年秋期末考 来给师兄上个马 打开环境以后直接上传muma.txt,出现js弹窗,说明有前端验证 提示只能上传.png .jpg 和 .gif文件,那就把muma.txt的后缀…...
37-串联所有单词的子串
给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串 长度相同。 s 中的 串联子串 是指一个包含 words 中所有字符串以任意顺序排列连接起来的子串。 例如,如果 words ["ab","cd","ef"], 那么 "abcdef…...
ShardingSphere复合分片之hash槽算法
前言 上一篇《ShardingSphere复合分片》中有详细介绍多key多value的复合分片算法应该如何设计,在大部分情况下该算法是没有问题的,但是一旦涉及到数据迁移时,该算法的缺点就暴露无疑了。 为满足日益增长的用户或者订单的需求,在分…...
Web三漏洞学习(其二:sql注入)
靶场:NSSCTF 、云曦历年考核题 二、sql注入 NSSCTF 【SWPUCTF 2021 新生赛】easy_sql 这题虽然之前做过,但为了学习sql,整理一下就再写一次 打开以后是杰哥的界面 注意到html网页标题的名称是 “参数是wllm” 那就传参数值试一试 首先判…...
KrillinAI:视频跨语言传播的一站式AI解决方案
引言 在全球内容创作领域,跨语言传播一直是内容创作者面临的巨大挑战。传统的视频本地化流程繁琐,涉及多个环节和工具,不仅耗时耗力,还常常面临质量不稳定的问题。随着大语言模型(LLM)技术的迅猛发展,一款名为Krillin…...
gravity`(控制 View 内部内容的对齐方式)
文章目录 **1. 常用取值****示例** **2. layout_gravity(控制 View 在父容器中的对齐方式)****常用取值****示例** **3. gravity vs layout_gravity 对比****4. 注意事项****5. 总结** 作用对象:当前 View 的内部内容(如 TextView…...
gitdiagram源码架构分析
https://github.com/ahmedkhaleel2004/gitdiagram 整体架构分析 前端请求入口: 后端对应接口: 后端调试 后端调试:会提示api_key失败的问题: 有两种方法解决: 1、注释掉下面的行代码; 方法二࿱…...
蓝光三维扫描:汽车冲压模具与钣金件全尺寸检测的精准解决方案
随着汽车市场竞争日趋激烈,新车型开发周期缩短,安全性能要求提高,车身结构愈加复杂。白车身由多达上百个具有复杂空间型面的钣金件,通过一系列工装装配、焊接而成。 钣金件尺寸精度是白车身装配精度的基础。采用新拓三维XTOM蓝光…...
《分布式软总线:网络抖动下的数据传输“定海神针”》
在当下,智能设备之间的互联互通已成为生活与工作的刚需。分布式软总线作为实现这一愿景的关键技术,正日益凸显其重要性。然而,网络环境的复杂性,尤其是网络抖动频繁的情况,给分布式软总线的数据传输带来了严峻挑战。如…...
WPS JS宏编程教程(从基础到进阶)-- 第八部分:字符串技术与WPS结合应用
目录 第8章 字符串技术与WPS结合应用8-1 字符串的3种引用方式场景:动态生成报表标题三种引用方式对比代码解析表模板字符串核心优势8-2 字符串处理之切片与搜索场景:提取身份证中的出生年份三大截取方法对比方法选择指南索引搜索实战8-3 字符串处理之修改与填充场景:规范商品…...
C++实用函数:bind
本篇来介绍了C++中bind功能。 1 std::bind 在 C++ 里,std::bind 是一个函数模板,其作用是创建一个可调用对象,该对象可绑定到一组参数上。std::bind 的函数原型如下: template< class F, class... Args > /*unspecified*/ bind( F&& f, Args&&...…...
深度学习占用大量内存空间解决办法
应该是缓存的问题,关机重启内存多了10G,暂时没找到别的方法 重启前 关机重启后...
完全无网络环境的 openEuler 系统离线安装 ClamAV 的详细步骤
准备工作(在外网机器操作) 1. 下载 ClamAV RPM 包及依赖 mkdir -p ~/clamav-offline/packages cd ~/clamav-offline/packages# 使用 yumdownloader 下载所有依赖包(需提前安装 yum-utils) sudo dnf install yum-utils -y sudo y…...
Matlab绘制函数方程图形
Matlab绘制函数方程图形: 多项式计算: polyval 函数 Values of Polynomials: polyval ( ) 绘制方程式图形: 代码如下: >> a[9,-5,3,7]; x-2:0.01:5; fpolyval(a,x); plot(x,f,LineWidth,2); xlabel(x); ylabel(f(x))…...
Unity UI 从零到精通 (第30天): Canvas、布局与C#交互实战
Langchain系列文章目录 01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...
在AMGX中使用MPI加载自定义分布式矩阵和向量
在AMGX中使用MPI加载自定义分布式矩阵和向量 AMGX是一个用于大规模并行代数多重网格求解的GPU加速库,支持MPI多线程环境。以下是加载用户自定义分布式矩阵和向量的方法: 1. 矩阵和向量分布的基本概念 在MPI环境中,AMGX使用行分布方式&…...
电视盒子 刷armbian
参考 中兴电视盒子中兴B860AV3.2-M刷Armbian新手级教程-CSDN博客 1.刷安卓9 带root版本 a. 下载安卓线刷包 链接:https://pan.baidu.com/s/1hz87_ld2lJea0gYjeoHQ8A?pwdd7as 提取码:d7as b.拆机短接 3.安装usbburning工具 使用方法 ,…...
