当前位置: 首页 > article >正文

Vue接口平台学习六——接口列表及部分调试页面

一、实现效果图及界面布局简单梳理

在这里插入图片描述
整体布局分左右,左边调试,右边显示接口列表

左侧:

一个输入框+按钮;下面展示信息,大部分使用代码编辑器就好了,除了请求体传文件类型需要额外处理。然后再下方显示响应信息,这个后续很多地方都会展示结果,额外拆成一个组件。

右侧:

分项目和三方两个不同列表展示,从Prostore存储的数据中读取,对不同选择传递不同数据,分别展示。

二、页面内容具体实现

2.0 整体布局

整体布局两个div,card样式。

  <div class="main_box"><!-- 左侧内容 --><div class="card left_box"></div><!-- 右侧内容 --><div class="card right_box"></div></div>

flex布局,再给个高度,就ok了

.main_box {display: flex;height: calc(100% - 42px);.left_box {padding: 5px;flex: 1;}.right_box {padding: 5px;flex: 1;}

在这里插入图片描述

2.1 左侧-接口调试

title部分

上面就一个title

<div class="title">接口调试</div>.title {font-weight: bold;text-align: center;height: 40px;line-height: 40px;}

下面部分内容有点多,拆开成一个组件单独来写。
新建一个InterFaceDebug.vue来写下面内容,在页面中引用这个组件

<!-- 左侧内容 -->
<div class="card left_box"><!-- 标题 --><div class="title">接口调试</div><!-- 接口调试组件 --><InterFaceDebug></InterFaceDebug>
</div>
import InterFaceDebug from './components/InterfaceDebug.vue'

下面的调试组件部分

url输入框

 <div style="display: flex"><el-input v-model="caseData.interface.url" placeholder="输入接口地址"><template #prepend><el-select v-model="caseData.interface.method" placeholder="选择请求方法" style="width: 115px"><el-option label="GET" value="get"/><el-option label="POST" value="post"/><el-option label="PUT" value="put"/><el-option label="PATCH" value="patch"/><el-option label="DELETE" value="delete"/></el-select></template></el-input><el-button type="primary">运行</el-button></div>

根据接口文档,定义一些需要的内容

const caseData = reactive({interface: {method: "get",url: ""},headers: '{}',request: {json: '{}',data: '{}',params: '{}'},file: [],setup_script: '',teardown_script: ''
})
let bodyType = ref('json')

然后是请求信息

<!--请求信息-->
<el-divider content-position="left">请求信息</el-divider>
<el-tabs type="border-card" class="demo-tabs"><el-tab-pane label="请求头(headers)"><Editor lang="json" v-model="caseData.headers"></Editor></el-tab-pane><el-tab-pane label="查询参数(params)"><Editor lang="json" v-model="caseData.request.params"></Editor></el-tab-pane><el-tab-pane label="请求体(Body)" :disabled="caseData.interface.method === 'get'"><el-radio-group v-model="bodyType"><el-radio label="json">Json</el-radio><el-radio label="data">X-www-form-urlencoded</el-radio><el-radio label="form-data">form-data</el-radio></el-radio-group><!-- json参数 --><div v-if='bodyType==="json"'><Editor lang="json" v-model="caseData.request.json"></Editor></div><div v-else-if='bodyType==="data"'><Editor lang="json" v-model="caseData.request.data"></Editor></div><div v-else><!-- 这里比较复杂 后面再来处理--> </div></el-tab-pane><el-tab-pane label="前置脚本"><Editor lang="python" v-model="caseData.setup_script"></Editor></el-tab-pane><el-tab-pane label="后置脚本"><Editor lang="python" v-model="caseData.teardown_script"></Editor></el-tab-pane>
</el-tabs>

请求体部分做了一个判断,如果是get请求就禁用点击

:disabled="caseData.interface.method === 'get'"

再下方是响应信息

<el-divider content-position="left">响应信息</el-divider>
<!-- 响应信息内容比较多,后面再处理-->

大致就得到了下面的界面
在这里插入图片描述
左边部分还有比较复杂的未完善内容。后续再来完善

  1. 请求体是form-data的情况,上传文件等
  2. 请求响应信息的结果展示

现在先处理简单的右边 列表显示部分。

2.2 右侧-接口列表()

前置准备

在最开始进入home页面时,可以先获取项目中所有接口列表,保存起来。然后切换到接口列表时,可以直接读取使用。

1.在ProStore定义获取接口函数及存储变量:
// ProStore.js
// 保存接口列表
interfaces: [],getters: {// 项目接口interfaces1() {return this.interfaces.filter((item) => {return item.type === '1'})},// 第三方接口interfaces2() {return this.interfaces.filter((item) => {return item.type === '2'})},
},
actions: {// 获取项目下面所有的接口async getInterFaceList() {const response = await api.getInterFaceListApi(this.pro.id)if (response.status === 200) {this.interfaces = response.data}},。。。。
2. 在ProjectApi.js定义接口列表

为了避免后续麻烦,这里把interface相关的全部定义了

//========================   interface相关 =============================// 添加接口createInterFaceApi(params) {return request.post('/api/TestInterFace/interfaces/', params)},// 获取接口列表getInterFaceListApi(pro_id) {return request.get('/api/TestInterFace/interfaces/', {params: {project: pro_id}})},// 编辑接口editInterFaceApi(id, params) {return request.patch(`/api/TestInterFace/interfaces/${id}/`, params)},// 删除接口deleteInterFaceApi(id) {return request.delete(`/api/TestInterFace/interfaces/${id}/`)},
3.在进入Home页面时调用接口获取数据存储
//HomeView.vue
// 获取项目所有的接口
pstore.getInterFaceList()
4.定义组件InterFaceList复用。

由于有项目接口,和第三方接口 2种不同类型,同样的内容,就拆成组件复用。将不同的数据传递给组件

<div class="card right_box"><div class="title">项目接口管理</div><el-tabs type="border-card" class="demo-tabs"><el-tab-pane label="项目接口"><InterFaceList :interface='pstore.interfaces1'></InterFaceList></el-tab-pane><el-tab-pane label="第三方接口"><InterFaceList :interface='pstore.interfaces2'></InterFaceList></el-tab-pane></el-tabs>
</div>

InterFaceList组件(⭐️)

<el-button size="small" type="primary" plain>添加接口</el-button>
<el-table :data="props.interface" style="width: 100%"><el-table-column prop="name" label="接口名称" width="150" align="center"/><el-table-column prop="url" label="接口地址" width="200" align="center" /><el-table-column prop="method" label="请求方法" align="center"/><el-table-column label="操作" align="right" header-align="center"><template #default="scope"><el-button size="small" icon='Edit' type="primary" plain></el-button><el-button size="small" icon='Delete' type="danger"plain></el-button></template></el-table-column>
</el-table>
// 定义组件的porps,接收传递过来的值
const props = defineProps({interface: {type: Array, required: true ,// 如果需要该属性为必需,则设置为 truedefault:[]}
})

页面整体框架到此就搭建好了
在这里插入图片描述

三、函数功能

这里主要是接口列表的函数功能,调试页面的内容还未完成。

添加接口

<el-button @click="clickAdd"  size="small" type="primary" plain>添加接口</el-button>

可以做一个弹窗,点击添加/编辑 时,使用插槽定义弹窗名字,创建就展示创建,编辑再展示编辑再展示。

<!-- 弹框 --><el-drawer v-model="isShowDrawer"><template #header><b>{{dlgTitle}}</b></template><template #default><!-- 添加的表单 --><el-form :model="formData"><el-form-item label="接口名称"><el-input v-model="formData.name" /></el-form-item><el-form-item label="接口地址"><el-input v-model="formData.url" /></el-form-item><el-form-item label="请求方法"><el-select style="width: 100%;" v-model="formData.method"><el-option label="GET" value="get" /><el-option label="POST" value="post" /><el-option label="PUT" value="put" /><el-option label="PATCH" value="patch" /><el-option label="DELETE" value="delete" /></el-select></el-form-item><el-form-item label="接口类型"><el-select style="width: 100%;" v-model="formData.type"><el-option label="项目接口" value="1" /><el-option label="第三方接口" value="2" /></el-select></el-form-item></el-form></template><template #footer><div style="flex: auto"><el-button @click="isShowDrawer=false">取消</el-button><el-button v-if='dlgTitle==="添加接口"' type="primary" @click='addInterface'>确定</el-button><el-button v-else type="primary" @click='updateInterFace'>确定</el-button></div></template></el-drawer>
// 是否显示添加接口的窗口let isShowDrawer = ref(false)let dlgTitle = ref('添加接口')let formData = reactive({name: "",url: "",method: "get",type: "1",project: pstore.pro.id,})// 点击添加按钮执行function clickAdd() {dlgTitle.value = '添加接口'isShowDrawer.value = trueformData.name = ''formData.url = ''formData.method = 'get'formData.type = '1'}// 点击确认添加执行async function addInterface() {const response = await http.pro.createInterFaceApi(formData)if (response.status === 201) {// 关闭窗口isShowDrawer.value = falseElNotification({title: '添加成功',type: 'success',})}// 刷新页面数据pstore.getInterFaceList()}

在这里插入图片描述

编辑接口

编辑按钮按绑定编辑时间

<el-button @click='clickEdit(scope.row)' size="small" icon='Edit' type="primary" plain></el-button>
// 保存当前编辑接口的ID
let editInterId = null
// 点击编辑接口
function clickEdit(item) {// 显示编辑框dlgTitle.value = '编辑接口'isShowDrawer.value = trueformData.name = item.nameformData.url = item.urlformData.method = item.methodformData.type = item.type// 保存当前编辑接口的IDeditInterId = item.id
}
// 编辑完成,调用后端修改接口信息的方法
async function updateInterFace() {const response = await api.editInterFaceApi(editInterId, formData)if (response.status === 200) {// 关闭窗口isShowDrawer.value = falseElNotification({title: '修改成功',type: 'success',})// 刷新页面数据pstore.getInterFaceList()}
}

在这里插入图片描述
这里内容有点长换行显示了,做个小修改,超长部分省略显示,鼠标悬浮再显示完全,增加 show-overflow-tooltip 属性

<el-table-column prop="name" label="接口名称" width="150" align="center" show-overflow-tooltip/>

在这里插入图片描述

删除接口

<el-button @click='deleteInterFace(scope.row.id)' size="small" icon='Delete' type="danger" plain></el-button>

同样做2次确认

// 删除接口的方法
function deleteInterFace(id) {ElMessageBox.confirm('删除操作不可恢复,请确认是否要删除该接口?','提示', {confirmButtonText: '确认',cancelButtonText: '取消',type: 'warning',}).then(async () => {// 调用后端接口进行删除const response = await api.deleteInterFaceApi(id)if (response.status === 204) {ElNotification({title: '删除成功',type: 'success',})// 刷新页面数据pstore.getInterFaceList()}}).catch(() => {ElMessage({type: 'info',message: '已取消删除操作',})})
}

总结

大致就是elment的组件使用,消息提示,table数据展示等,此外用到了代码编辑器。pinia数据存储调用,还有组件传递数据,props接收数据。

相关文章:

Vue接口平台学习六——接口列表及部分调试页面

一、实现效果图及界面布局简单梳理 整体布局分左右&#xff0c;左边调试&#xff0c;右边显示接口列表 左侧&#xff1a; 一个输入框按钮&#xff1b;下面展示信息&#xff0c;大部分使用代码编辑器就好了&#xff0c;除了请求体传文件类型需要额外处理。然后再下方显示响应信…...

2025年消防设施操作员考试题库及答案

一、多选题 31.区域报警系统主要由&#xff08;&#xff09;等组成。 A.火灾探测器 B.手动火灾报警按钮 C.火灾声光警报器 D消防联动控制器 E.区域型火灾报警控制器 答案&#xff1a;ABCE 解析&#xff1a;根据《基础知识》第215页&#xff0c;“消防联动控制器”一项可…...

【C语言】预处理(下)(C语言完结篇)

一、#和## 1、#运算符 这里的#是一个运算符&#xff0c;整个运算符会将宏的参数转换为字符串字面量&#xff0c;它仅可以出现在带参数的宏的替换列表中&#xff0c;我们可以将其理解为字符串化。 我们先看下面的一段代码&#xff1a; 第二个printf中是由两个字符串组成的&am…...

深入理解全排列算法:DFS与回溯的完美结合

全排列问题是算法中的经典问题&#xff0c;其目标是将一组数字的所有可能排列组合列举出来。本文将详细解析如何通过深度优先搜索&#xff08;DFS&#xff09;和回溯法高效生成全排列&#xff0c;并通过模拟递归过程帮助读者彻底掌握其核心思想。 问题描述 给定一个正整数 n&a…...

低频rfid手持机,助力动物耳标智能化管理

低频RFID手持机&#xff0c;助力动物耳标智能化管理&#xff0c;正逐步成为现代畜牧业不可或缺的工具。它不仅能够高效读取动物耳标中的信息&#xff0c;如唯一识别码、疫苗接种记录、健康状态等&#xff0c;还极大地提升了数据录入的准确性和时效性。 1.精准识别与追踪‌ 通过…...

【从零开始学习JVM | 第三篇】虚拟机的垃圾回收学习(一)

堆空间的基本结构 Java 的自动内存管理主要是针对对象内存的回收和对象内存的分配。同时&#xff0c;Java 自动内存管理最核心的功能是 堆 内存中对象的分配与回收。 Java 堆是垃圾收集器管理的主要区域&#xff0c;因此也被称作 GC 堆&#xff08;Garbage Collected Heap&am…...

蓝桥杯之门牌

问题&#xff1a; 这条街一共有 2020 位住户&#xff0c;门牌号从 1 到 2020 编号。 小蓝制作门牌的方法是先制作 0 到9 这几个数字字符&#xff0c;最后根据需要将字符粘贴到门牌上&#xff0c;例如门牌 1017 需要依次粘贴字符 1、0、1、7,即需要 1 个字符 0&#xff0c;2 个…...

Jieba分词的原理及应用(三)

前言 “结巴”中文分词&#xff1a;做最好的 Python 中文分词组件 上一篇文章讲了使用TF-IDF分类器范式进行企业级文本分类的案例。其中提到了中文场景不比英文场景&#xff0c;在喂给模型之前需要进行分词操作。 分词的手段有很多&#xff0c;其中最常用的手段还是Jieba库进行…...

Openlayers:flat样式介绍

在前段时间我在使用WebGL矢量图层时接触到了flat样式&#xff0c;我对其十分的感兴趣&#xff0c;于是我花了几天的时间对其进行了了解&#xff0c;在这篇文章中我将简单的介绍一下flat样式的使用方式以及我对其的一些理解。 一、了解flat样式 1.什么是flat样式&#xff1f; …...

149页研读——华为基于IPD全过程研发质量管理【附全文阅读】

本文介绍了IPD(集成产品开发)的全过程研发质量管理,强调了以客户需求为导向,通过跨部门协同、资源整合、快速响应等方式提高研发效率和成功率。文章详细阐述了IPD研发管理体系的精要,包括其核心思想、优势、框架以及核心理念。 其中,跨领域平台与技术研发、端到端流程与项…...

Linux入门指南:从零开始探索开源世界

引言 欢迎来到Linux的奇妙世界&#xff01;&#x1f30d; 这个诞生于1991年的开源操作系统&#xff0c;如今已悄然成为数字世界的隐形支柱。从智能手机到超级计算机&#xff0c;从智能家电到航天器&#xff0c;Linux的身影无处不在。本文将带你纵览Linux的发展历程、主流发行版…...

Oracle 23ai Vector Search 系列之5 向量索引(Vector Indexes)

文章目录 Oracle 23ai Vector Search 系列之5 向量索引Oracle 23ai支持的向量索引类型内存中的邻居图向量索引 (In-Memory Neighbor Graph Vector Index)磁盘上的邻居分区矢量索引 (Neighbor Partition Vector Index) 创建向量索引HNSW索引IVF索引 向量索引示例参考 Windows 环…...

vue模拟扑克效果

vue模拟扑克效果 效果图&#xff1a; step1:C:\Users\wangrusheng\PycharmProjects\untitled18\src\views\Home.vue <template><div class"poker-container"><!-- 使用复合数据对象实现双行显示 --><divv-for"(card, index) in POKER_…...

Android12源码编译之预置Android Studio项目Android.mk文件编写

1、在AndroidManifest.xml文件中添加package"com.sprd.silentinstalldemo"属性&#xff0c;因为新版本的Android Studio默认生成的AndroidManifest.xml是没有这个属性值的 <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:an…...

高阶函数/柯里化/纯函数

本篇文章主要是介绍一下标题里面的概念&#xff0c;在面试的时候经常文档&#xff0c;结合阅读到的资料&#xff0c;结合本人的个人见解出品了该文章&#xff0c;如有写的不好的地方或理解有误的&#xff0c;还望阁下多多指教。 1、高阶函数 什么是高阶函数&#xff1f; 接受…...

Spring Boot 测试详解,包含maven引入依赖、测试业务层类、REST风格测试和Mock测试

Spring Boot 测试详解 1. 测试依赖引入 Spring Boot 默认通过以下 Maven 依赖引入测试工具&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</s…...

探索 HTML5 新特性:提升网页开发的现代体验

在 Web 开发的演进历程中&#xff0c;HTML5 无疑是一座重要的里程碑。它不仅为网页带来了更丰富的功能&#xff0c;还提升了开发效率与用户体验。本文将深入探讨 HTML5 那些令人瞩目的新特性&#xff0c;助你紧跟现代 Web 开发潮流。 一、语义化标签&#xff1a;让结构更清晰 …...

Python中如何用正则表达式精准匹配IP地址?

在网络编程和数据处理时&#xff0c;我们经常需要从文本中提取或验证IP地址。Python的正则表达式(re模块)是完成这个任务的利器。但你知道怎么写才能准确匹配各种合法的IP地址吗&#xff1f;今天我们就来详细探讨这个问题。 为什么需要IP正则表达式&#xff1f; 假设你正在分…...

leetcode刷题日记——螺旋矩阵

[ 题目描述 ]&#xff1a; [ 思路 ]&#xff1a; 题目要求按顺时针顺序给出m行n列的矩阵的数组按照题目所给的顺序挨个插入答案数组中运行如下 int* spiralOrder(int** matrix, int matrixSize, int* matrixColSize, int* returnSize) {*returnSize matrixSize * matrixCol…...

金字塔原理学习法

金字塔原理学习法 金字塔原理&#xff08;Pyramid Principle&#xff09; 是由麦肯锡顾问芭芭拉明托提出的结构化思维方法&#xff0c;核心是通过纵向分层、横向归类的逻辑架构组织信息&#xff0c;实现复杂问题的清晰表达与高效学习。在技术学习领域&#xff0c;该原理能有效…...

模板引擎语法-标签

模板引擎语法-标签 文章目录 模板引擎语法-标签[toc]一、用于进行判断的{% if-elif-else-endif %}标签二、关于循环对象的{% for-endfor %}标签三、关于自动转义的{% autoescape-endautoescape %}标签四、关于循环对象的{% cycle %}标签五、关于检查值是否变化的{% ifchange %}…...

深度学习学习笔记

目录 摘要 Abstracts 简介 Hourglass Module&#xff08;Hourglass 模块&#xff09; 网络结构 Intermediate Supervision&#xff08;中间监督&#xff09; 训练过程细节 评测结果 摘要 本周阅读了《Stacked Hourglass Networks for Human Pose Estimation》&#xf…...

当Browser Use遇见A2A:浏览器自动化与智能体协作的“冰与火之歌“

——一场正在改写数字文明的技术奇遇 第一章 浏览器革命&#xff1a;从"手动挡"到"自动驾驶" 1.1 传统自动化工具的"中年危机" 还记得2023年那个抓狂的凌晨吗&#xff1f;你蹲守演唱会门票时&#xff0c;Selenium脚本因为验证码识别失败第108次…...

智能医疗辅助诊断:深度解析与实战教程

引言&#xff1a;医疗领域的新革命 在医疗资源紧张、诊断效率亟待提升的今天&#xff0c;智能医疗辅助诊断技术正以前所未有的速度改变医疗行业的面貌。通过结合人工智能与医学专业知识&#xff0c;智能医疗辅助诊断系统能够为医生提供精准的诊断建议和决策支持&#xff0c;显…...

(已解决)如何安装python离线包及其依赖包 2025最新

字数 305&#xff0c;阅读大约需 2 分钟 没有网络的Linux服务器上&#xff0c;如何安装完整的、离线的python包 1. 写入待安装的包 新建requirement.txt, 写入待安装的包 和 包的版本 如 flwr1.13.0 2.使用命令行直接下载 pip download -d flwr_packages -r requirements.tx…...

Java如何获取文件的编码格式?

Java获取文件的编码格式 在计算机中&#xff0c;文件编码是指将文件内容转换成二进制形式以便存储和传输的过程。常见的文件编码格式包括UTF-8、GBK等。不同的编码使用不同的字符集和字节序列&#xff0c;因此在读取文件时需要正确地确定文件的编码格式 Java提供了多种方式以获…...

豪越赋能消防安全管控,解锁一体化内管“安全密码”

在消防安全保障体系中&#xff0c;内部管理的高效运作是迅速、有效应对火灾及各类灾害事故的重要基础。豪越科技凭借在消防领域的深耕细作与持续创新&#xff0c;深入剖析消防体系内部管理的痛点&#xff0c;以自主研发的消防一体化安全管控平台&#xff0c;为行业发展提供了创…...

Python实现链接KS3,并批量下载KS3文件数据到本地

前言 本文是该专栏的第56篇,后面会持续分享python的各种干货知识,值得关注。 在本专栏的上篇文章《Python实现链接KS3,并将文件数据批量上传到KS3》中,笔者有详细介绍基于Python,实现链接KS3并将文件数据批量上传。而本文,笔者将基于在上一篇文章的基础之上,实现链接KS…...

状态机 XState

以下是关于 状态机(XState) 基本知识的梳理,涵盖核心概念、高级特性、实际应用场景及最佳实践,帮助我们掌握这一强大的状态管理工具: 一、状态机核心概念 1. 有限状态机(Finite State Machine, FSM)基础 定义:系统在有限状态集合中流转,由事件触发状态转换核心要素:…...

Python及C++中的排序

一、Python中的排序 &#xff08;一&#xff09;内置排序函数sorted() 基本用法 sorted()函数可以对所有可迭代对象进行排序操作&#xff0c;返回一个新的列表&#xff0c;原列表不会被修改。例如&#xff0c;对于一个简单的数字列表nums [3, 1, 4, 1, 5, 9, 2, 6]&#xff…...