Files
school-developer/src/views/knowledge/aiFlow/panels/HttpPanel.vue
吴红兵 1f645dad3e init
2025-12-02 10:37:49 +08:00

252 lines
7.5 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="panel-content">
<!-- 输入变量部分 -->
<div class="mb-2 panel-section">
<div class="flex justify-between items-center panel-header">
<span>变量输入</span>
<el-button type="primary" size="small" @click="addParam">
<el-icon>
<Plus />
</el-icon>
添加
</el-button>
</div>
<div class="params-list">
<div v-for="(param, index) in inputParams" :key="index" class="mb-2">
<div class="param-item">
<el-row :gutter="12">
<el-col :span="9">
<el-input v-model="param.name" placeholder="变量名" />
</el-col>
<el-col :span="12">
<el-select v-model="param.type" placeholder="变量值" class="w-full">
<el-option-group v-for="item in previousOutputParams" :key="item.name" :label="item.name">
<el-option v-for="param in item.list" :key="param.name" :label="param.name" :value="`${item.id}.${param.name}`" />
</el-option-group>
</el-select>
</el-col>
<el-col :span="3">
<el-button @click="removeHttpParam(index)">
<el-icon>
<Delete />
</el-icon>
</el-button>
</el-col>
</el-row>
</div>
</div>
</div>
</div>
<!-- 请求方法 -->
<div class="mb-2 panel-section">
<div class="panel-header">
<span>请求方法</span>
</div>
<div class="param-item">
<el-row :gutter="12">
<el-col :span="6">
<el-select v-model="node.httpParams.method" class="w-full">
<el-option value="GET" label="GET" />
<el-option value="POST" label="POST" />
<el-option value="PUT" label="PUT" />
<el-option value="DELETE" label="DELETE" />
</el-select>
</el-col>
<el-col :span="18">
<el-input v-model="node.httpParams.url" placeholder="请求URL" />
</el-col>
</el-row>
</div>
</div>
<!-- 请求参数 -->
<div class="mb-2 panel-section">
<div class="flex justify-between items-center panel-header">
<span>请求参数</span>
<el-button type="primary" size="small" @click="addHttpParam">
<el-icon>
<Plus />
</el-icon>
添加
</el-button>
</div>
<el-tabs v-model="activeTab">
<el-tab-pane label="Params" name="params">
<div class="params-list">
<div v-for="(param, index) in node.httpParams.paramsParams" :key="index" class="mb-2">
<div class="param-item">
<el-row :gutter="12">
<el-col :span="9">
<el-input v-model="param.name" placeholder="参数名称" />
</el-col>
<el-col :span="12">
<el-select v-model="param.type" placeholder="变量值" class="w-full">
<el-option-group v-for="item in previousOutputParams" :key="item.name" :label="item.name">
<el-option v-for="param in item.list" :key="param.name" :label="param.name" :value="`${item.id}.${param.name}`" />
</el-option-group>
</el-select>
</el-col>
<el-col :span="3">
<el-button @click="removeHttpParam(index)">
<el-icon>
<Delete />
</el-icon>
</el-button>
</el-col>
</el-row>
</div>
</div>
</div>
</el-tab-pane>
<el-tab-pane label="Body" name="body" v-if="['POST', 'PUT'].includes(node.httpParams.method)">
<el-radio-group v-model="node.httpParams.contentType" size="small" class="mb-2">
<el-radio label="none"></el-radio>
<el-radio label="application/x-www-form-urlencoded">Form Data</el-radio>
<el-radio label="application/json">JSON</el-radio>
</el-radio-group>
<template v-if="node.httpParams.contentType === 'application/x-www-form-urlencoded'">
<div class="params-list">
<div v-for="(param, index) in node.httpParams.bodyParams" :key="index" class="mb-2">
<div class="param-item">
<el-row :gutter="12">
<el-col :span="9">
<el-input v-model="param.name" placeholder="参数名称" />
</el-col>
<el-col :span="12">
<el-select v-model="param.type" placeholder="变量值" class="w-full">
<el-option-group v-for="item in previousOutputParams" :key="item.name" :label="item.name">
<el-option v-for="param in item.list" :key="param.name" :label="param.name" :value="`${item.id}.${param.name}`" />
</el-option-group>
</el-select>
</el-col>
<el-col :span="3">
<el-button @click="removeBody(index)">
<el-icon>
<Delete />
</el-icon>
</el-button>
</el-col>
</el-row>
</div>
</div>
</div>
</template>
<template v-else-if="node.httpParams.contentType === 'application/json'">
<el-row>
<json-editor v-model="node.httpParams.jsonBody" />
</el-row>
</template>
</el-tab-pane>
<el-tab-pane label="Headers" name="headers">
<div class="params-list">
<div v-for="(header, index) in node.httpParams.headerParams" :key="index" class="mb-2">
<div class="param-item">
<el-row :gutter="12">
<el-col :span="9">
<el-input v-model="header.name" placeholder="Header名称" />
</el-col>
<el-col :span="12">
<el-select v-model="header.type" placeholder="变量值" class="w-full">
<el-option-group v-for="item in previousOutputParams" :key="item.name" :label="item.name">
<el-option v-for="param in item.list" :key="param.name" :label="param.name" :value="`${item.id}.${param.name}`" />
</el-option-group>
</el-select>
</el-col>
<el-col :span="3">
<el-button @click="removeHeader(index)">
<el-icon>
<Delete />
</el-icon>
</el-button>
</el-col>
</el-row>
</div>
</div>
</div>
</el-tab-pane>
</el-tabs>
</div>
<!-- 输出变量 -->
<div class="panel-section">
<div class="panel-header">
<span>输出变量</span>
</div>
<div class="params-list">
<div v-for="(output, index) in outputParams" :key="index" class="mb-2">
<div class="param-item">
<el-row :gutter="12">
<el-col :span="9">
<el-text> 变量名 </el-text>
<el-tag>{{ output.name }}</el-tag>
</el-col>
<el-col :span="2">
<el-text>|</el-text>
</el-col>
<el-col :span="11">
<el-text> 变量类型 </el-text>
<el-tag>{{ output.type }}</el-tag>
</el-col>
</el-row>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import { Plus, Delete } from '@element-plus/icons-vue';
import common from './common.ts';
// @ts-ignore
import JsonEditor from '@axolo/json-editor-vue';
export default {
name: 'HttpPanel',
components: {
JsonEditor,
Plus,
Delete,
},
mixins: [common],
data() {
return {
activeTab: 'params', // 默认显示Params标签页
};
},
methods: {
addHttpParam() {
if (this.activeTab === 'params') {
this.node.httpParams.paramsParams.push({});
} else if (this.activeTab === 'headers') {
this.node.httpParams.headerParams.push({});
} else {
this.node.httpParams.bodyParams.push({});
}
},
removeHttpParam(index) {
this.node.httpParams.paramsParams.splice(index, 1);
},
addHeader() {
this.node.httpParams.headerParams.push({});
},
removeHeader(index) {
this.node.httpParams.headerParams.splice(index, 1);
},
addBody() {
this.node.httpParams.bodyParams.push({});
},
removeBody(index) {
this.node.httpParams.bodyParams.splice(index, 1);
},
},
};
</script>