|
|
|
<script setup>
|
|
|
|
import {ref, reactive, onBeforeMount, onMounted, watch} from "vue";
|
|
|
|
import {getCurrentInstance} from 'vue'
|
|
|
|
import Sortable from "sortablejs";
|
|
|
|
import {useStore, mapState} from "vuex";
|
|
|
|
import {nextTick} from "vue";
|
|
|
|
import JsonEditorVue from "json-editor-vue3";
|
|
|
|
|
|
|
|
|
|
|
|
// 注册store
|
|
|
|
const store = useStore()
|
|
|
|
|
|
|
|
// 标签相关的定义
|
|
|
|
const tabsRef = ref(null); // tabs的Ref
|
|
|
|
const activeTab = ref(store.state.ecApiModule.first_tab_api_id); // 当前选项卡,存储的是api_id
|
|
|
|
|
|
|
|
|
|
|
|
// 表格相关的定义
|
|
|
|
const ApiTableRef = ref(null) // 表格的Ref
|
|
|
|
// const multipleSelection = ref([]) // checkbox的处理
|
|
|
|
|
|
|
|
// 定义变量用于存储接口设置的数据
|
|
|
|
const UserApiData = ref({api: {}, base_info: {}, tab: {}})
|
|
|
|
|
|
|
|
// 表格逻辑
|
|
|
|
// 多选改变后处理逻辑
|
|
|
|
function handleParamsChange(newCheckedResult) {
|
|
|
|
console.log('handleParamsChange', newCheckedResult)
|
|
|
|
console.log('activeTab.value', activeTab.value)
|
|
|
|
console.log('UserApiData.value.api[activeTab.value]', UserApiData.value.api[activeTab.value])
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
function handleParamsSelect(val) {
|
|
|
|
console.log('val', val)
|
|
|
|
UserApiData.value.api[activeTab.value].params.forEach(param => {
|
|
|
|
console.log(val.indexOf(param))
|
|
|
|
param['is_checked'] = val.indexOf(param) >= 0;
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
// function handleTabChange(val){
|
|
|
|
// console.log('handleTabChange', val)
|
|
|
|
// }
|
|
|
|
|
|
|
|
// 自动勾选行
|
|
|
|
function markIsChecked() {
|
|
|
|
console.log('checkRequestSelection')
|
|
|
|
if (UserApiData.value.hasOwnProperty('api') || UserApiData.value.api.length > 0) {
|
|
|
|
console.log('UserApiData.value.api[activeTab.value]', UserApiData.value.api[activeTab.value])
|
|
|
|
UserApiData.value.api[activeTab.value].params.forEach(item => {
|
|
|
|
console.log('item', item)
|
|
|
|
if (item['is_checked'] === true) {
|
|
|
|
console.log('ApiTableRef.value', ApiTableRef.value)
|
|
|
|
ApiTableRef.value[UserApiData.value.tab[activeTab.value]].toggleRowSelection(item, true)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
// console.log(multipleSelection.value)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// 初始逻辑数据逻辑处理
|
|
|
|
function initApiData() {
|
|
|
|
UserApiData.value['base_info'] = {
|
|
|
|
env: store.state.ecApiModule.ec_api_data.env,
|
|
|
|
cinema: store.state.ecApiModule.ec_api_data.cinema,
|
|
|
|
channel: store.state.ecApiModule.ec_api_data.channel,
|
|
|
|
}
|
|
|
|
let api_id_array = []
|
|
|
|
let api_tab = {}
|
|
|
|
if (store.state.ecApiModule.ec_api_data.api) {
|
|
|
|
store.state.ecApiModule.ec_api_data.api.forEach((item, index) => {
|
|
|
|
api_id_array.push(item.id)
|
|
|
|
api_tab[item.id] = index
|
|
|
|
if (!UserApiData.value['api'].hasOwnProperty(item.id)) {
|
|
|
|
UserApiData.value['api'][item.id] = {
|
|
|
|
'id': item.id,
|
|
|
|
'description': item.description,
|
|
|
|
'path': item.path,
|
|
|
|
'type': item.type,
|
|
|
|
'params': store.state.ecApiModule.ec_api_data.api_params[item.id]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
})
|
|
|
|
Object.values(UserApiData.value['api']).forEach((api) => {
|
|
|
|
if (api_id_array.indexOf(api['id']) < 0) {
|
|
|
|
delete UserApiData.value['api'][api['id']]
|
|
|
|
}
|
|
|
|
})
|
|
|
|
UserApiData.value.tab = api_tab
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// 监测ec_select_api的变化 如果当前选中的标签被取消勾选,则选择剩下标签的第一个
|
|
|
|
watch(() => store.state.ecApiModule.ec_api_data.api, (oldValue, newValue) => {
|
|
|
|
console.log('watch')
|
|
|
|
console.log('store.state.ecApiModule.ec_api_data.api', store.state.ecApiModule.ec_api_data.api)
|
|
|
|
console.log('newValue', newValue)
|
|
|
|
// 接口数据变化后初始化本地数据
|
|
|
|
initApiData()
|
|
|
|
// 处理空标签逻辑
|
|
|
|
const select_api_id = store.getters['ecApiModule/ec_select_api_getter']
|
|
|
|
if (select_api_id.indexOf(activeTab.value) < 0) {
|
|
|
|
activeTab.value = select_api_id[0]
|
|
|
|
}
|
|
|
|
}, {deep: true})
|
|
|
|
|
|
|
|
|
|
|
|
watch(activeTab, (val) => {
|
|
|
|
console.log('watch.activeTab', val)
|
|
|
|
markIsChecked()
|
|
|
|
})
|
|
|
|
/*
|
|
|
|
生命周期逻辑
|
|
|
|
*/
|
|
|
|
onBeforeMount(
|
|
|
|
() => {
|
|
|
|
console.log('TabArea onBeforeMount')
|
|
|
|
// 处理请求参数生成本地数据结构
|
|
|
|
initApiData()
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
// 挂载后
|
|
|
|
onMounted(() => {
|
|
|
|
console.log('TabArea onMounted')
|
|
|
|
// 勾选is_checked选项
|
|
|
|
markIsChecked()
|
|
|
|
// 处理拖拽
|
|
|
|
const elTabsHeader = tabsRef.value.$el.querySelector('.el-tabs__header .el-tabs__nav');
|
|
|
|
new Sortable(elTabsHeader, {
|
|
|
|
animation: 150,
|
|
|
|
ghostClass: 'dragging',
|
|
|
|
draggable: '.el-tabs__item',
|
|
|
|
onEnd: (evt) => {
|
|
|
|
store.commit('ecApiModule/handle_sort_ec_select_api', {'newIndex': evt.newIndex, 'oldIndex': evt.oldIndex})
|
|
|
|
},
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
// 添加新字段
|
|
|
|
function addNewParams() {
|
|
|
|
UserApiData.value.api[activeTab.value].params.push({
|
|
|
|
id: Date.now(),
|
|
|
|
api_id: activeTab.value,
|
|
|
|
param: '',
|
|
|
|
value: '',
|
|
|
|
is_request: false,
|
|
|
|
is_checked: false,
|
|
|
|
is_preset: false
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
function test() {
|
|
|
|
console.log('store.state.ecApiModule.ec_api_data.api', store.state.ecApiModule.ec_api_data.api)
|
|
|
|
console.log('UserApiData.value', UserApiData.value)
|
|
|
|
}
|
|
|
|
</script>
|
|
|
|
|
|
|
|
<template>
|
|
|
|
<el-tabs ref="tabsRef" v-model="activeTab">
|
|
|
|
<el-tab-pane
|
|
|
|
v-for="api in Object.values(UserApiData.api)"
|
|
|
|
:key="api['id']"
|
|
|
|
:label="api['description']"
|
|
|
|
:name="api['id']"
|
|
|
|
>
|
|
|
|
<el-table
|
|
|
|
ref='ApiTableRef'
|
|
|
|
:data="UserApiData.api[api['id']].params"
|
|
|
|
@selection-change="handleParamsChange"
|
|
|
|
@select="handleParamsSelect"
|
|
|
|
>
|
|
|
|
<el-table-column type="selection" width="50"/>
|
|
|
|
<el-table-column label="字段名" width="120">
|
|
|
|
<template v-slot="scope">
|
|
|
|
<span v-if="scope.row.is_preset">{{ scope.row.param }}</span>
|
|
|
|
<span v-else><el-input type="text" placeholder="输入字段名" v-model="scope.row.param"></el-input></span>
|
|
|
|
</template>
|
|
|
|
</el-table-column>
|
|
|
|
<el-table-column label="字段值" width="800">
|
|
|
|
<template v-slot="scope">
|
|
|
|
<el-input type="textarea" placeholder="输入字段值" v-model="scope.row.value" rows="1"
|
|
|
|
v-if="scope.row.value === 'json' && scope.row.param === 'format'" disabled></el-input>
|
|
|
|
<el-input type="textarea" placeholder="输入字段值" v-model="scope.row.value" rows="1" v-else></el-input>
|
|
|
|
</template>
|
|
|
|
</el-table-column>
|
|
|
|
<el-table-column label="必选" width="80">
|
|
|
|
<template v-slot="scope">
|
|
|
|
<span>{{ scope.row.is_request ? '是' : '否' }}</span>
|
|
|
|
</template>
|
|
|
|
</el-table-column>
|
|
|
|
<el-table-column prop="description" label="描述" show-overflow-tooltip/>
|
|
|
|
</el-table>
|
|
|
|
<el-row class="BtnRow" style="width: 100%">
|
|
|
|
<el-col :span="2">
|
|
|
|
<el-button type="primary" @click="addNewParams">添加新字段</el-button>
|
|
|
|
</el-col>
|
|
|
|
</el-row>
|
|
|
|
<el-row class="BtnRow" style="width: 100%" :gutter="10">
|
|
|
|
<el-col :span="2"><span>请求地址:</span></el-col>
|
|
|
|
<el-col :span="12">
|
|
|
|
<el-input type="text">1111</el-input>
|
|
|
|
</el-col>
|
|
|
|
<el-col :span="2">
|
|
|
|
<el-button type="primary" @click="test">发送</el-button>
|
|
|
|
</el-col>
|
|
|
|
<el-col :span="8">
|
|
|
|
</el-col>
|
|
|
|
</el-row>
|
|
|
|
<!-- <JsonEditorVue class="editor" v-model="json_data" language="zh-CN" @change="handleRunningChange"-->
|
|
|
|
<!-- style="width: 1200px"/>-->
|
|
|
|
</el-tab-pane>
|
|
|
|
</el-tabs>
|
|
|
|
</template>
|
|
|
|
|
|
|
|
<style scoped>
|
|
|
|
.BtnRow {
|
|
|
|
margin-top: 10px;
|
|
|
|
}
|
|
|
|
|
|
|
|
.editor {
|
|
|
|
margin-top: 20px;
|
|
|
|
}
|
|
|
|
</style>
|