Commit ed666bb8acbba13e95854537a0788429e7efee83

Authored by xp.Huang
1 parent 5ce62781

Merge branch 'ft' into 'main_dev'

pref:重构公共接口,待完善测试接口

See merge request yunteng/thingskit-front!523

(cherry picked from commit d405e83c)

599b692b pref:重构公共接口,待完善测试接口
36b7d783 Merge branch 'main_dev' into ft
Showing 22 changed files with 887 additions and 396 deletions
... ... @@ -6,6 +6,7 @@ export interface BigScreenCenterItemsModel {
6 6 createTime: string;
7 7 creator: string;
8 8 remark: string;
  9 + state: number;
9 10 }
10 11 export type queryPageParams = BasicPageParams & {
11 12 name?: Nullable<string>;
... ...
... ... @@ -118,6 +118,7 @@
118 118 };
119 119
120 120 const handleDesign = (record: BigScreenCenterItemsModel) => {
  121 + if (record.state === 1) return;
121 122 window.open(`${largeDesignerPrefix}/#/chart/home/${record.id}`);
122 123 };
123 124
... ... @@ -241,8 +242,9 @@
241 242 </Tooltip>
242 243 <Tooltip title="设计">
243 244 <AuthIcon
244   - v-if="item.state === 0"
245   - class="!text-lg"
  245 + :class="`!text-lg ${
  246 + item.state === 1 ? '!cursor-not-allowed !text-gray-200' : ''
  247 + }`"
246 248 icon="ant-design:edit-outlined"
247 249 @click="handleDesign(item)"
248 250 />
... ...
1   -import EditCellTable from './index.vue';
2   -
3   -export { EditCellTable };
src/views/dataview/publicApi/components/SimpleRequest/components/body.vue renamed from src/views/dataview/publicApi/components/SimpleRequest/body.vue
... ... @@ -13,18 +13,17 @@
13 13 placeholder="该接口没有 Body 体"
14 14 :rows="2"
15 15 />
16   - <EditCellTable
17   - ref="editCellTableRef"
18   - v-show="
19   - getRequestBody.content.requestParamsBodyType === 'form-data' ||
20   - getRequestBody.content.requestParamsBodyType === 'x-www-form-urlencoded'
21   - "
  16 + <BodyTable
  17 + ref="bodyCellFormDataTableRef"
  18 + v-show="getRequestBody.content.requestParamsBodyType === 'form-data'"
22 19 />
23   - <a-textarea
24   - v-model:value="getRequestBody.content.json"
  20 + <BodyTable
  21 + ref="bodyCellXwwwTableRef"
  22 + v-show="getRequestBody.content.requestParamsBodyType === 'x-www-form-urlencoded'"
  23 + />
  24 + <JsonEditor
25 25 v-show="getRequestBody.content.requestParamsBodyType === 'json'"
26   - placeholder="请输入json"
27   - :rows="6"
  26 + ref="jsonEditorRef"
28 27 />
29 28 <a-textarea
30 29 v-model:value="getRequestBody.content.xml"
... ... @@ -37,20 +36,11 @@
37 36 </template>
38 37 <script lang="ts" setup name="body">
39 38 import { reactive, ref, nextTick } from 'vue';
40   - import { RequestBodyTypeEnum } from '../../enum/index';
41   - import { EditCellTable } from '../EditCellTable/index';
42   -
43   - defineProps({
44   - method: {
45   - type: String,
46   - },
47   - paramsType: {
48   - type: String,
49   - },
50   - data: {
51   - type: Array || Object,
52   - },
53   - });
  39 + import { RequestBodyTypeEnum } from '../../../enum/index';
  40 + import BodyTable from './bodyTable.vue';
  41 + import { isEmpty } from '/@/utils/is';
  42 + import { useUtils } from '../../../hooks/useUtils';
  43 + import JsonEditor from './jsonEditor.vue';
54 44
55 45 const getRequestBody = reactive({
56 46 content: {
... ... @@ -62,7 +52,13 @@
62 52 },
63 53 });
64 54
65   - const editCellTableRef = ref<InstanceType<typeof EditCellTable>>();
  55 + const { pushObj } = useUtils();
  56 +
  57 + const bodyCellFormDataTableRef = ref<InstanceType<typeof BodyTable>>();
  58 +
  59 + const jsonEditorRef = ref<InstanceType<typeof JsonEditor>>();
  60 +
  61 + const bodyCellXwwwTableRef = ref<InstanceType<typeof BodyTable>>();
66 62
67 63 const handleChange = ({ target }) => {
68 64 const { value } = target;
... ... @@ -72,42 +68,39 @@
72 68 //获取数据
73 69 const getValue = () => {
74 70 const type = Reflect.get(getRequestBody.content, 'requestParamsBodyType');
  71 + const valuesFormData = bodyCellFormDataTableRef.value?.getValue();
  72 + const valuesXWww = bodyCellXwwwTableRef.value?.getValue();
  73 + const jsonEditorValue = jsonEditorRef.value?.getJsonValue();
  74 + getRequestBody.content['form-data'] = valuesFormData as any;
  75 + getRequestBody.content['x-www-form-urlencoded'] = valuesXWww as any;
  76 + getRequestBody.content['json'] = jsonEditorValue;
75 77 if (type === 'none') getRequestBody.content = {} as any;
76   - const values = editCellTableRef.value?.getValue();
77   - if (type === 'form-data') getRequestBody.content['form-data'] = values as any;
78   - if (type === 'x-www-form-urlencoded')
79   - getRequestBody.content['x-www-form-urlencoded'] = values as any;
80 78 return getRequestBody.content;
81 79 };
82 80
83 81 //设置数据
84   - const setValue = (data) => {
85   - nextTick(() => {
86   - try {
87   - if (!data) return;
88   - const type = data?.requestParamsBodyType;
89   - getRequestBody.content.requestParamsBodyType = type;
90   - type === 'none'
91   - ? null
92   - : type === 'form-data'
93   - ? editCellTableRef.value?.setValue(data['form-data'])
94   - : type === 'x-www-form-urlencoded'
95   - ? editCellTableRef.value?.setValue(data['x-www-form-urlencoded'])
96   - : type === 'json'
97   - ? (getRequestBody.content.json = data['json'])
98   - : type === 'xml'
99   - ? (getRequestBody.content.xml = data['xml'])
100   - : '';
101   - } finally {
102   - }
103   - });
  82 + const setValue = async (data) => {
  83 + if (!data) return;
  84 + const type = data?.requestParamsBodyType;
  85 + getRequestBody.content.requestParamsBodyType = type;
  86 + await nextTick();
  87 + await nextTick();
  88 + bodyCellFormDataTableRef.value?.setValue(isEmpty(data) ? [pushObj] : data['form-data']);
  89 + bodyCellXwwwTableRef.value?.setValue(isEmpty(data) ? [pushObj] : data['x-www-form-urlencoded']);
  90 + jsonEditorRef.value?.setJsonValue(data['json']);
  91 + getRequestBody.content.xml = data['xml'];
104 92 };
105 93
106 94 //重置数据
107 95 const resetValue = () => {
108 96 for (let i in getRequestBody.content) Reflect.set(getRequestBody.content, i, '');
  97 + getRequestBody.content['form-data'] = {};
  98 + getRequestBody.content['x-www-form-urlencoded'] = {};
109 99 getRequestBody.content.requestParamsBodyType = 'none';
110   - nextTick(() => editCellTableRef?.value?.resetValue());
  100 + nextTick(() => {
  101 + bodyCellFormDataTableRef?.value?.resetValue();
  102 + bodyCellXwwwTableRef?.value?.resetValue();
  103 + });
111 104 };
112 105 defineExpose({
113 106 getValue,
... ...
src/views/dataview/publicApi/components/SimpleRequest/components/bodyTable.vue renamed from src/views/dataview/publicApi/components/EditCellTable/index.vue
... ... @@ -58,8 +58,8 @@
58 58 import { Select, Button } from 'ant-design-vue';
59 59 import { findDictItemByCode } from '/@/api/system/dict';
60 60 import { PlusOutlined, MinusOutlined } from '@ant-design/icons-vue';
61   - import { editCellTableTHeadConfig } from '../../config';
62   - import { selectType, tableItems } from '../../types';
  61 + import { editCellTableTHeadConfig } from '../../../config';
  62 + import { selectType, tableItems } from '../../../types';
63 63
64 64 defineProps({
65 65 method: {
... ... @@ -144,7 +144,7 @@
144 144 const assemblyData = tableArray.content.map((it) => {
145 145 return {
146 146 key: it.key,
147   - value: it?.key === 'date_range' ? `${it.date1},${it.date2}` : it.value,
  147 + value: it.key === 'date_range' ? `${it.date1},${it.date2}` : it.value,
148 148 editDisabled: it.editDisabled,
149 149 required: it.required,
150 150 };
... ...
src/views/dataview/publicApi/components/SimpleRequest/components/headerTable.vue renamed from src/views/dataview/publicApi/components/SimpleRequest/header.vue
... ... @@ -19,6 +19,9 @@
19 19 <a-input style="width: 12vw" placeholder="请输入" v-model:value="item.value" />
20 20 </td>
21 21 <td style="width: 4vw">
  22 + <a-switch v-model:checked="item.required" />
  23 + </td>
  24 + <td style="width: 4vw">
22 25 <div>
23 26 <Button type="dashed" @click="add(item, index)">
24 27 <template #icon><PlusOutlined /></template
... ... @@ -37,8 +40,8 @@
37 40 import { reactive, nextTick } from 'vue';
38 41 import { Button } from 'ant-design-vue';
39 42 import { PlusOutlined, MinusOutlined } from '@ant-design/icons-vue';
40   - import { editTestCellTableTHeaderConfig } from '../../config';
41   - import { tableItems } from '../../types';
  43 + import { editTestCellTableTHeaderConfig } from '../../../config';
  44 + import { tableItems } from '../../../types';
42 45
43 46 defineProps({
44 47 method: {
... ... @@ -53,6 +56,7 @@
53 56 {
54 57 key: '',
55 58 value: '',
  59 + required: false,
56 60 },
57 61 ],
58 62 });
... ... @@ -62,6 +66,7 @@
62 66 tableArray.content.splice(index + 1, 0, {
63 67 key: '',
64 68 value: '',
  69 + required: false,
65 70 });
66 71 };
67 72
... ... @@ -89,8 +94,8 @@
89 94 tableArray.content.push({
90 95 key: '',
91 96 value: '',
  97 + required: false,
92 98 });
93   - nextTick(() => {});
94 99 };
95 100 defineExpose({
96 101 getValue,
... ...
  1 +<template>
  2 + <div ref="jsoneditorRef" style="height: 100%; width: 100%"></div>
  3 +</template>
  4 +
  5 +<script lang="ts" setup>
  6 + import { ref, onMounted, nextTick, unref } from 'vue';
  7 + import jsoneditor from 'jsoneditor';
  8 + import 'jsoneditor/dist/jsoneditor.min.css';
  9 +
  10 + // json 以及初始化JSON
  11 + const jsoneditorRef = ref();
  12 +
  13 + const jsonValue = ref({});
  14 +
  15 + const jsonInstance = ref();
  16 +
  17 + onMounted(() => {
  18 + nextTick(() => {
  19 + let options = {
  20 + mode: 'code',
  21 + mainMenuBar: false,
  22 + statusBar: false,
  23 + };
  24 + let editor = new jsoneditor(jsoneditorRef.value, options);
  25 + editor.set(jsonValue.value);
  26 + jsonInstance.value = editor;
  27 + });
  28 + });
  29 +
  30 + const getJsonValue = () => unref(jsonInstance).get();
  31 +
  32 + const setJsonValue = (Json) => {
  33 + nextTick(() => {
  34 + unref(jsonInstance).set(Json);
  35 + });
  36 + };
  37 +
  38 + defineExpose({
  39 + getJsonValue,
  40 + setJsonValue,
  41 + jsonInstance,
  42 + });
  43 +</script>
  44 +
  45 +<style>
  46 + .jsoneditor {
  47 + border: none;
  48 + }
  49 +</style>
... ...
  1 +<template>
  2 + <div class="table-content">
  3 + <!-- 采用的原生表格 -->
  4 + <table align="center">
  5 + <thead>
  6 + <tr>
  7 + <th v-for="item in editCellTableTHeadConfig" :key="item">{{ item }}</th>
  8 + </tr>
  9 + </thead>
  10 + <tbody>
  11 + <tr v-for="(item, index) in tableArray.content" :key="index">
  12 + <td>
  13 + {{ index + 1 }}
  14 + </td>
  15 + <td style="width: 12vw">
  16 + <Select
  17 + v-model:value="item.key"
  18 + placeholder="请选择"
  19 + :options="selectOptions"
  20 + @change="handleChange"
  21 + allowClear
  22 + />
  23 + </td>
  24 + <td style="width: 12vw">
  25 + <div v-if="item.key === 'date_range'">
  26 + <a-input style="width: 6vw" placeholder="请输入" v-model:value="item.date1" />
  27 + <span>~</span>
  28 + <a-input style="width: 6vw" placeholder="请输入" v-model:value="item.date2" />
  29 + </div>
  30 + <div v-else>
  31 + <a-input
  32 + :disabled="item.editDisabled"
  33 + placeholder="请输入"
  34 + v-model:value="item.value"
  35 + />
  36 + </div>
  37 + </td>
  38 + <td style="width: 4vw">
  39 + <a-switch v-model:checked="item.required" />
  40 + </td>
  41 + <td style="width: 4vw">
  42 + <div>
  43 + <Button type="dashed" @click="add(item, index)">
  44 + <template #icon><PlusOutlined /></template
  45 + ></Button>
  46 + <Button type="dashed" style="margin-left: 5px" @click="remove(item, index)">
  47 + <template #icon> <MinusOutlined /></template>
  48 + </Button>
  49 + </div>
  50 + </td>
  51 + </tr>
  52 + </tbody>
  53 + </table>
  54 + </div>
  55 +</template>
  56 +<script lang="ts" setup name="editCellTable">
  57 + import { reactive, ref, onMounted, nextTick } from 'vue';
  58 + import { Select, Button } from 'ant-design-vue';
  59 + import { findDictItemByCode } from '/@/api/system/dict';
  60 + import { PlusOutlined, MinusOutlined } from '@ant-design/icons-vue';
  61 + import { editCellTableTHeadConfig } from '../../../config';
  62 + import { selectType, tableItems } from '../../../types';
  63 +
  64 + defineProps({
  65 + method: {
  66 + type: String,
  67 + },
  68 + });
  69 +
  70 + const selectOptions = ref<selectType[]>([]);
  71 +
  72 + onMounted(() => {
  73 + getSelectOptions();
  74 + });
  75 +
  76 + const getSelectOptions = async () => {
  77 + const res = await findDictItemByCode({ dictCode: 'dataview_builtin_params' });
  78 + selectOptions.value = res.map((m) => ({ label: m.itemText, value: m.itemValue }));
  79 + selectOptions.value.push({
  80 + label: '自定义',
  81 + value: 'scope',
  82 + });
  83 + };
  84 +
  85 + const tableArray = reactive<{
  86 + content: tableItems[];
  87 + }>({
  88 + content: [
  89 + {
  90 + key: undefined,
  91 + value: '',
  92 + editDisabled: false,
  93 + required: false,
  94 + date1: '',
  95 + date2: '',
  96 + },
  97 + ],
  98 + });
  99 +
  100 + // 新增
  101 + const add = (_, index: number) => {
  102 + tableArray.content.splice(index + 1, 0, {
  103 + key: undefined,
  104 + value: '',
  105 + editDisabled: false,
  106 + required: false,
  107 + date1: '',
  108 + date2: '',
  109 + });
  110 + };
  111 +
  112 + // 减少
  113 + const remove = (item, index: number) => {
  114 + if (tableArray.content.length !== 1) {
  115 + selectOptions.value.forEach((ele) => {
  116 + if (ele.value == item.key) {
  117 + ele.disabled = false;
  118 + }
  119 + });
  120 + tableArray.content.splice(index, 1);
  121 + }
  122 + };
  123 +
  124 + //Select互斥
  125 + const handleChange = () => {
  126 + selectOptions.value.forEach((ele) => {
  127 + ele.disabled = false;
  128 + tableArray.content.forEach((element) => {
  129 + if (element.key === 'scope' || element.key === 'fixed_date') {
  130 + element.editDisabled = false;
  131 + } else {
  132 + element.value = '';
  133 + element.editDisabled = true;
  134 + }
  135 + if (element.key === ele.value && element.key !== 'scope' && element.key !== 'fixed_date') {
  136 + ele.disabled = true;
  137 + }
  138 + });
  139 + });
  140 + };
  141 +
  142 + //获取数据
  143 + const getValue = () => {
  144 + const assemblyData = tableArray.content.map((it) => {
  145 + return {
  146 + key: it.key,
  147 + value: it.key === 'date_range' ? `${it.date1},${it.date2}` : it.value,
  148 + editDisabled: it.editDisabled,
  149 + required: it.required,
  150 + };
  151 + });
  152 + return assemblyData;
  153 + };
  154 +
  155 + //设置数据
  156 + const setValue = async (data) => {
  157 + await nextTick();
  158 + const assemblyData = data.map((it) => {
  159 + return {
  160 + key: it.key,
  161 + value: it.value,
  162 + editDisabled: it.editDisabled,
  163 + required: it.required,
  164 + date1: it.key === 'date_range' ? it.value?.split(',')?.at(-2) : '',
  165 + date2: it.key === 'date_range' ? it.value?.split(',')?.at(-1) : '',
  166 + };
  167 + });
  168 + tableArray.content = assemblyData;
  169 + tableArray.content.forEach(() => {
  170 + handleChange();
  171 + });
  172 + };
  173 +
  174 + //重置数据
  175 + const resetValue = () => {
  176 + tableArray.content = [];
  177 + tableArray.content.push({
  178 + key: undefined,
  179 + value: '',
  180 + editDisabled: false,
  181 + required: false,
  182 + date1: '',
  183 + date2: '',
  184 + });
  185 + nextTick(() => {
  186 + tableArray.content.forEach(() => {
  187 + handleChange();
  188 + });
  189 + });
  190 + };
  191 + defineExpose({
  192 + getValue,
  193 + setValue,
  194 + resetValue,
  195 + });
  196 +</script>
  197 +
  198 +<style scoped lang="less">
  199 + @table-color: #e5e7eb;
  200 +
  201 + .table-border-color {
  202 + border: 1px solid #e5e7eb;
  203 + text-align: center;
  204 + }
  205 +
  206 + .table-content {
  207 + overflow-x: auto;
  208 +
  209 + table {
  210 + border-collapse: collapse;
  211 + width: 35vw;
  212 + &:extend(.table-border-color);
  213 + }
  214 +
  215 + table thead {
  216 + white-space: nowrap;
  217 + }
  218 +
  219 + table td {
  220 + padding: 5px;
  221 + white-space: nowrap;
  222 + &:extend(.table-border-color);
  223 + }
  224 +
  225 + table th {
  226 + padding: 5px;
  227 + &:extend(.table-border-color);
  228 + }
  229 + }
  230 +</style>
... ...
1 1 <template>
2 2 <div>
  3 + <!--TODO: 待优化三者共存下的测试和是否能复用表格 -->
3 4 <Tabs @change="handleTabsChange" v-model:activeKey="activeKey">
4 5 <TabPane class="tab-pane" forceRender key="Params" tab="Params">
5   - <EditCellTable ref="editParamsCellTableRef" :method="method" />
  6 + <ParamsTable ref="paramsCellTableRef" :method="method" />
  7 + <ParamsTest
  8 + @testParamsInterface="handleTestParamsInterface"
  9 + ref="testParamsRequestRef"
  10 + :data="dataMap.mapParamsObj"
  11 + />
6 12 </TabPane>
7 13 <TabPane
8 14 v-if="method !== '2' && requestTypeAndUrl?.requestHttpType !== 'GET'"
... ... @@ -11,36 +17,35 @@
11 17 key="Body"
12 18 tab="Body"
13 19 >
14   - <Body
15   - ref="bodyRef"
16   - :method="method"
17   - :paramsType="requestTypeAndUrl?.requestHttpType"
18   - :data="dataMap.mapObj"
  20 + <Body ref="bodyRef" />
  21 + <ParamsTest
  22 + @testInterface="handleTestBodyInterface"
  23 + ref="testBodyRequestRef"
  24 + :data="dataMap.mapBodyObj"
19 25 />
20 26 </TabPane>
21 27 <TabPane v-if="method !== '2'" class="tab-pane" forceRender key="Header" tab="Header">
22   - <Header ref="editHeaderCellTableRef" :method="method" />
  28 + <HeaderTable ref="editHeaderCellTableRef" :method="method" />
  29 + <HeaderTest
  30 + @testHeaderInterface="handleTestHeaderInterface"
  31 + ref="testHeaderRequestRef"
  32 + :data="dataMap.mapHeaderObj"
  33 + />
23 34 </TabPane>
24 35 </Tabs>
25   - <div class="tab-pane">
26   - <TestRequest
27   - @testInterface="handleTestInterface"
28   - ref="testRequestRef"
29   - :method="method"
30   - :requestOriginUrl="requestOriginUrl"
31   - :requestUrl="requestTypeAndUrl?.requestUrl"
32   - :data="dataMap.mapObj"
33   - />
34   - </div>
  36 + <ExcuteTest ref="excuteTestRef" @emitExcute="handleEmitExcute" :data="excuteData" />
35 37 </div>
36 38 </template>
37 39 <script lang="ts" setup name="simpleRequest">
38 40 import { ref, nextTick, reactive } from 'vue';
39 41 import { Tabs, TabPane } from 'ant-design-vue';
40   - import { EditCellTable } from '../EditCellTable';
41   - import Body from './body.vue';
42   - import { TestRequest } from '../TestRequest/index';
43   - import Header from './header.vue';
  42 + import Body from './components/body.vue';
  43 + import { ParamsTest, HeaderTest } from '../TestInterface/index';
  44 + import HeaderTable from './components/headerTable.vue';
  45 + import ParamsTable from './components/paramsTable.vue';
  46 + import { isEmpty } from '/@/utils/is';
  47 + import { useUtils } from '../../hooks/useUtils';
  48 + import ExcuteTest from '../TestInterface/components/excuteTest.vue';
44 49
45 50 const props = defineProps({
46 51 method: {
... ... @@ -56,45 +61,84 @@
56 61
57 62 const emits = defineEmits(['activeKey']);
58 63
  64 + const { pushObj } = useUtils();
  65 +
59 66 const activeKey = ref('Params');
60 67
61   - const editParamsCellTableRef = ref<InstanceType<typeof EditCellTable>>();
  68 + const excuteData = ref({});
  69 +
  70 + const paramsCellTableRef = ref<InstanceType<typeof ParamsTable>>();
  71 +
  72 + const editHeaderCellTableRef = ref<InstanceType<typeof ParamsTable>>();
62 73
63   - const editHeaderCellTableRef = ref<InstanceType<typeof EditCellTable>>();
  74 + const excuteTestRef = ref<InstanceType<typeof ExcuteTest>>();
64 75
65 76 const bodyRef = ref<InstanceType<typeof Body>>();
66 77
67   - const testRequestRef = ref<InstanceType<typeof TestRequest>>();
  78 + const testParamsRequestRef = ref<InstanceType<typeof ParamsTest>>();
  79 +
  80 + const testBodyRequestRef = ref<InstanceType<typeof ParamsTest>>();
  81 +
  82 + const testHeaderRequestRef = ref<InstanceType<typeof HeaderTest>>();
68 83
69 84 const dataMap: any = reactive({
70   - mapObj: {},
  85 + mapParamsObj: {},
  86 + mapBodyObj: {},
  87 + mapHeaderObj: {},
71 88 });
72 89
73   - const handleTabsChange = () => testRequestRef.value?.setValue();
  90 + const handleTabsChange = () => {
  91 + // testParamsRequestRef.value?.setValue();
  92 + // testBodyRequestRef.value?.setValue();
  93 + // testHeaderRequestRef.value?.setValue();
  94 + };
74 95
75 96 //if-else-if-else分支优化
76 97 const dataForTypeMap = [
77   - [(type) => type === 'Params', (data) => editParamsCellTableRef.value?.setValue(data)],
  98 + [(type) => type === 'Params', (data) => paramsCellTableRef.value?.setValue(data)],
78 99 [(type) => type === 'Body', (data) => bodyRef.value?.setValue(data)],
79 100 [(type) => type === 'Header', (data) => editHeaderCellTableRef.value?.setValue(data)],
80 101 ];
81 102
82   - //测试接口
83   - const handleTestInterface = () => {
  103 + const handleEmitExcute = () => {
  104 + excuteData.value = {
  105 + Params: testParamsRequestRef.value?.getTestValue(),
  106 + Header: testHeaderRequestRef.value?.getTestValue(),
  107 + };
  108 + };
  109 +
  110 + //TODO: 待优化这里测试接口
  111 + const handleTestParamsInterface = () => {
  112 + let value = getValue(false) as any;
  113 + dataMap.mapParamsObj = {
  114 + list: value?.Params,
  115 + requestOriginUrl: props.requestOriginUrl,
  116 + requestTypeAndUrl: props.requestTypeAndUrl,
  117 + method: props.method,
  118 + activeKey: activeKey.value,
  119 + };
  120 + };
  121 +
  122 + const handleTestBodyInterface = () => {
84 123 let value = getValue(false) as any;
85   - const type = value?.requestParamsBodyType;
86   - // if (type === 'none') value = [];
87   - // if (type === 'form-data') value = value['form-data'];
88   - // if (type === 'x-www-form-urlencoded') value = value['x-www-form-urlencoded'];
89   - nextTick(
90   - () =>
91   - (dataMap.mapObj = {
92   - list: value?.Params || value?.Header,
93   - requestOriginUrl: props.requestOriginUrl,
94   - requestParamsBodyType: type,
95   - requestTypeAndUrl: props.requestTypeAndUrl,
96   - })
97   - );
  124 + dataMap.mapBodyObj = {
  125 + list: value?.Body,
  126 + requestOriginUrl: props.requestOriginUrl,
  127 + requestTypeAndUrl: props.requestTypeAndUrl,
  128 + method: props.method,
  129 + activeKey: activeKey.value,
  130 + };
  131 + };
  132 +
  133 + const handleTestHeaderInterface = () => {
  134 + let value = getValue(false) as any;
  135 + dataMap.mapHeaderObj = {
  136 + list: value?.Header,
  137 + requestOriginUrl: props.requestOriginUrl,
  138 + requestTypeAndUrl: props.requestTypeAndUrl,
  139 + method: props.method,
  140 + activeKey: activeKey.value,
  141 + };
98 142 };
99 143
100 144 //获取数据
... ... @@ -102,7 +146,7 @@
102 146 const type = activeKey.value;
103 147 status ? emits('activeKey', type) : null;
104 148 const Body = bodyRef.value?.getValue();
105   - const Params = editParamsCellTableRef.value?.getValue();
  149 + const Params = paramsCellTableRef.value?.getValue();
106 150 const Header = editHeaderCellTableRef.value?.getValue();
107 151 return {
108 152 Params,
... ... @@ -116,9 +160,9 @@
116 160 nextTick(() => {
117 161 const Objects = JSON.parse(data?.requestParams);
118 162 if (!Objects) return;
119   - dataForTypeMap[0][1](Objects?.Params);
120   - dataForTypeMap[1][1](Objects?.Body);
121   - dataForTypeMap[2][1](Objects?.Header);
  163 + dataForTypeMap[0][1](isEmpty(Objects?.Params) ? [pushObj] : Objects?.Params);
  164 + dataForTypeMap[1][1](isEmpty(Objects?.Body) ? {} : Objects?.Body);
  165 + dataForTypeMap[2][1](isEmpty(Objects?.Header) ? [pushObj] : Objects?.Header);
122 166 });
123 167 };
124 168
... ... @@ -126,7 +170,7 @@
126 170 const resetValue = () => {
127 171 activeKey.value = 'Params';
128 172 nextTick(() => {
129   - editParamsCellTableRef.value?.resetValue();
  173 + paramsCellTableRef.value?.resetValue();
130 174 editHeaderCellTableRef.value?.resetValue();
131 175 bodyRef.value?.resetValue();
132 176 handleTabsChange();
... ...
1   -import TestEditCellTable from './index.vue';
2   -
3   -export { TestEditCellTable };
  1 +<template>
  2 + <div class="mt-8">
  3 + <div>
  4 + <Button disabled @click="handleExcute" type="primary"> 执行测试请求 </Button>
  5 + </div>
  6 + <!-- <div class="mt-8">
  7 + <a-row type="flex" justify="center">
  8 + <a-col :span="3"> 测试结果 </a-col>
  9 + <a-col :span="21">
  10 + <a-textarea
  11 + allow-clear
  12 + show-count
  13 + v-model:value="testResult"
  14 + placeholder="测试结果为:"
  15 + :rows="8"
  16 + />
  17 + </a-col>
  18 + </a-row>
  19 + </div> -->
  20 + </div>
  21 +</template>
  22 +<script lang="ts" setup name="testRequest">
  23 + import { nextTick } from 'vue';
  24 + import { Button } from 'ant-design-vue';
  25 + // import { otherHttp } from '/@/utils/http/axios';
  26 +
  27 + const emits = defineEmits(['emitExcute']);
  28 +
  29 + const props = defineProps({
  30 + data: {
  31 + type: Object,
  32 + },
  33 + });
  34 +
  35 + //格式化替换像"http:xxxx/api/xx/{xx}/{xx}/{xx}这种格式"
  36 + String.prototype.restfulFormat = function (replacements) {
  37 + var formatString = function (str, replacements) {
  38 + replacements =
  39 + typeof replacements === 'object' ? replacements : Array.prototype.slice.call(arguments, 1);
  40 + return str.replace(/\{\{|\}\}|\{(\w+)\}/g, function (m, n) {
  41 + if (m == '{{') {
  42 + return '{';
  43 + }
  44 + if (m == '}}') {
  45 + return '}';
  46 + }
  47 + return replacements[n];
  48 + });
  49 + };
  50 + replacements =
  51 + typeof replacements === 'object' ? replacements : Array.prototype.slice.call(arguments, 0);
  52 + return formatString(this, replacements);
  53 + };
  54 +
  55 + // const testResult = ref('');
  56 +
  57 + //执行测试接口
  58 + const handleExcute = () => {
  59 + emits('emitExcute');
  60 + getValue();
  61 + };
  62 +
  63 + const getValue = async () => {
  64 + await nextTick();
  65 + console.log(props.data);
  66 + };
  67 +
  68 + // //TODO: 待优化 项目自带第三方请求
  69 + // const otherHttpRequest = async (apiType, params = {}, api, joinPrefix = false) => {
  70 + // switch (apiType) {
  71 + // case 'GET':
  72 + // return await otherHttp.get(
  73 + // { url: api, params },
  74 + // {
  75 + // apiUrl: '',
  76 + // joinPrefix,
  77 + // }
  78 + // );
  79 + // }
  80 + // };
  81 +</script>
  82 +
  83 +<style scoped lang="less"></style>
... ...
  1 +<template>
  2 + <div>
  3 + <div class="mt-8">
  4 + <div>
  5 + <Button disabled @click="handleTest" type="primary"> 测试接口 </Button>
  6 + </div>
  7 + <div v-if="showTestEditCell" class="mt-8">
  8 + <a-row type="flex" justify="center">
  9 + <a-col :span="3"> 参数设置 </a-col>
  10 + <a-col :span="21">
  11 + <TestHeaderEditCellTable ref="testEditCellTableRef" />
  12 + </a-col>
  13 + </a-row>
  14 + </div>
  15 + </div>
  16 + <div class="mt-8"> </div>
  17 + </div>
  18 +</template>
  19 +<script lang="ts" setup name="testRequest">
  20 + import { ref, nextTick } from 'vue';
  21 + import { Button } from 'ant-design-vue';
  22 + import TestHeaderEditCellTable from './testEditHeaderCellTable.vue';
  23 +
  24 + const emits = defineEmits(['testHeaderInterface']);
  25 +
  26 + const props = defineProps({
  27 + data: {
  28 + type: Object,
  29 + },
  30 + });
  31 +
  32 + const showTestEditCell = ref(false);
  33 +
  34 + const excuteData = ref({});
  35 +
  36 + const testEditCellTableRef = ref<InstanceType<typeof TestHeaderEditCellTable>>();
  37 +
  38 + const testResult = ref('');
  39 +
  40 + const handleTest = () => {
  41 + showTestEditCell.value = true;
  42 + emits('testHeaderInterface');
  43 + getValue();
  44 + };
  45 +
  46 + const getValue = async () => {
  47 + await nextTick();
  48 + await nextTick(() => {
  49 + const getValue = props.data?.list;
  50 + testEditCellTableRef.value?.setTableArray(getValue);
  51 + });
  52 + };
  53 +
  54 + //测试表格里的数据转化为 key value 数组对象形式
  55 + const getTestTableKeyValue = () => {
  56 + return testEditCellTableRef.value?.getValue();
  57 + };
  58 +
  59 + //获取数据
  60 + const getTestValue = () => {
  61 + const getTable = getTestTableKeyValue();
  62 + //源地址
  63 + const apiGetUrl = `${props.data?.requestOriginUrl}${props.data?.requestTypeAndUrl?.requestUrl}`;
  64 + //请求类型
  65 + const apiType = props.data?.requestTypeAndUrl?.requestHttpType;
  66 + //替换key value
  67 + const params: any = {};
  68 + getTable?.map((it: any) => (params[it.key!] = it.value!));
  69 + excuteData.value = {
  70 + apiGetUrl,
  71 + apiType,
  72 + params,
  73 + activeKey: props.data?.activeKey,
  74 + };
  75 + return excuteData.value;
  76 + };
  77 +
  78 + //设置数据
  79 + const setValue = () => {
  80 + showTestEditCell.value = false;
  81 + testResult.value = '';
  82 + };
  83 +
  84 + defineExpose({
  85 + setValue,
  86 + handleTest,
  87 + getTestValue,
  88 + });
  89 +</script>
  90 +
  91 +<style scoped lang="less"></style>
... ...
  1 +<!-- eslint-disable vue/valid-v-model -->
  2 +<template>
  3 + <div class="table-content">
  4 + <!-- TODO: 待优化测试表格 -->
  5 + <table align="center">
  6 + <thead>
  7 + <tr>
  8 + <th v-for="item in editTestCellTableTHeadConfig.slice(1)" :key="item">{{ item }}</th>
  9 + </tr>
  10 + </thead>
  11 + <tbody>
  12 + <tr v-for="(item, index) in tableTestArray.content" :key="index">
  13 + <td style="width: 7.5vw">
  14 + <a-input disabled placeholder="请输入" v-model:value="item.key" />
  15 + </td>
  16 + <td style="width: 6.5vw">
  17 + <a-input placeholder="请输入" v-model:value="item.value" />
  18 + </td>
  19 + </tr>
  20 + </tbody>
  21 + </table>
  22 + </div>
  23 +</template>
  24 +<script lang="ts" setup name="editCellTable">
  25 + import { reactive } from 'vue';
  26 + import { cloneDeep } from 'lodash-es';
  27 + import { tableItems } from '../../../types';
  28 + import { editTestCellTableTHeadConfig } from '../../../config';
  29 +
  30 + defineProps({
  31 + method: {
  32 + type: String,
  33 + },
  34 + });
  35 +
  36 + const tableTestArray = reactive<{
  37 + content: tableItems[];
  38 + }>({
  39 + content: [
  40 + {
  41 + key: undefined,
  42 + value: undefined,
  43 + keyValue: null,
  44 + editDisabled: false,
  45 + dateValue: null,
  46 + },
  47 + ],
  48 + });
  49 +
  50 + //设置数据
  51 + const setTableArray = (data) => {
  52 + const list = cloneDeep(data);
  53 + if (Array.isArray(list)) tableTestArray.content = list;
  54 + };
  55 +
  56 + //获取数据
  57 + const getValue = () => {
  58 + return tableTestArray.content;
  59 + };
  60 + defineExpose({
  61 + getValue,
  62 + setTableArray,
  63 + });
  64 +</script>
  65 +
  66 +<style scoped lang="less">
  67 + @table-color: #e5e7eb;
  68 +
  69 + .table-border-color {
  70 + border: 1px solid #e5e7eb;
  71 + text-align: center;
  72 + }
  73 +
  74 + .table-content {
  75 + table {
  76 + width: 31vw;
  77 + &:extend(.table-border-color);
  78 + }
  79 +
  80 + table td {
  81 + padding: 5px;
  82 + white-space: nowrap;
  83 + &:extend(.table-border-color);
  84 + }
  85 +
  86 + table th {
  87 + padding: 5px;
  88 + &:extend(.table-border-color);
  89 + }
  90 + }
  91 +</style>
... ...
  1 +import ParamsTest from './paramsTest/index.vue';
  2 +import HeaderTest from './headerTest/index.vue';
  3 +
  4 +export { ParamsTest, HeaderTest };
... ...
  1 +<template>
  2 + <div>
  3 + <div class="mt-8">
  4 + <div>
  5 + <Button disabled @click="handleTest" type="primary"> 测试接口 </Button>
  6 + </div>
  7 + <div v-if="showTestEditCell" class="mt-8">
  8 + <a-row type="flex" justify="center">
  9 + <a-col :span="3"> 参数设置 </a-col>
  10 + <a-col :span="21">
  11 + <TestParamsCellTable ref="testEditCellTableRef" />
  12 + </a-col>
  13 + </a-row>
  14 + </div>
  15 + </div>
  16 + <div class="mt-8"> </div>
  17 + </div>
  18 +</template>
  19 +<script lang="ts" setup name="testRequest">
  20 + import { ref, nextTick } from 'vue';
  21 + import { Button } from 'ant-design-vue';
  22 + import TestParamsCellTable from './testEditParamsCellTable.vue';
  23 + import moment from 'moment';
  24 + import { useUtils } from '../../../hooks/useUtils';
  25 +
  26 + const emits = defineEmits(['testParamsInterface']);
  27 +
  28 + const props = defineProps({
  29 + data: {
  30 + type: Object,
  31 + },
  32 + });
  33 +
  34 + const showTestEditCell = ref(false);
  35 +
  36 + const excuteData = ref({});
  37 +
  38 + const testEditCellTableRef = ref<InstanceType<typeof TestParamsCellTable>>();
  39 +
  40 + const testResult = ref('');
  41 +
  42 + const { getMultipleKeys } = useUtils();
  43 +
  44 + const handleTest = () => {
  45 + showTestEditCell.value = true;
  46 + emits('testParamsInterface');
  47 + getValue();
  48 + };
  49 +
  50 + const getValue = async () => {
  51 + await nextTick();
  52 + await nextTick(() => {
  53 + //拆分"xx,xx,xx"多个
  54 + const getSingleKey = props.data?.list;
  55 + const getMuteKey = props.data?.list?.filter((it: any) => it.key.split(',').length > 1);
  56 + const getMuteKeys = getMultipleKeys(getMuteKey);
  57 + const mergeKeys = [...getSingleKey, ...getMuteKeys]?.filter(
  58 + (it: any) => it.key.split(',').length === 1
  59 + );
  60 + testEditCellTableRef.value?.setTableArray(mergeKeys);
  61 + });
  62 + };
  63 +
  64 + //测试表格里的数据转化为 key value 数组对象形式
  65 + //TODO:待优化这里的TS类型
  66 + const getTestTableKeyValue = () => {
  67 + //把日期拆分成多个
  68 + const keyValueList: any = [];
  69 + testEditCellTableRef.value?.getValue()?.forEach((item: any) => {
  70 + const splitDateKey = item?.key === 'date_range' ? item?.value?.split(',') : [];
  71 + const splitDateValue = item?.key === 'date_range' ? item?.dateValue : [];
  72 + for (let i in splitDateKey) {
  73 + const obj = {
  74 + key: splitDateKey[i],
  75 + value: moment(splitDateValue[i]).valueOf(),
  76 + };
  77 + keyValueList.push(obj);
  78 + }
  79 + });
  80 + return testEditCellTableRef.value
  81 + ?.getValue()
  82 + .concat(keyValueList)
  83 + .filter((it) => it.key !== 'date_range')
  84 + .map((it: any) => {
  85 + const value = it?.key === 'scope' || it?.key === 'fixed_date' ? it?.keyValue : it?.value;
  86 + const key = it?.key === 'scope' || it?.key === 'fixed_date' ? it?.value : it?.key;
  87 + return {
  88 + key,
  89 + value,
  90 + };
  91 + });
  92 + };
  93 +
  94 + //获取数据
  95 + const getTestValue = () => {
  96 + const getTable = getTestTableKeyValue();
  97 + //源地址
  98 + const apiGetUrl = `${props.data?.requestOriginUrl}${props.data?.requestTypeAndUrl?.requestUrl}`;
  99 + //请求类型
  100 + const apiType = props.data?.requestTypeAndUrl?.requestHttpType;
  101 + //替换key value
  102 + const params: any = {};
  103 + getTable?.map((it) => (params[it.key!] = it.value!));
  104 + excuteData.value = {
  105 + apiGetUrl,
  106 + apiType,
  107 + params,
  108 + activeKey: props.data?.activeKey,
  109 + };
  110 + return excuteData.value;
  111 + };
  112 +
  113 + //设置数据
  114 + const setValue = () => {
  115 + showTestEditCell.value = false;
  116 + testResult.value = '';
  117 + };
  118 +
  119 + defineExpose({
  120 + setValue,
  121 + handleTest,
  122 + getTestValue,
  123 + });
  124 +</script>
  125 +
  126 +<style scoped lang="less"></style>
... ...
src/views/dataview/publicApi/components/TestInterface/paramsTest/testEditParamsCellTable.vue renamed from src/views/dataview/publicApi/components/TestEditCellTable/index.vue
1 1 <!-- eslint-disable vue/valid-v-model -->
2 2 <template>
3 3 <div class="table-content">
4   - <!-- TODO 待优化测试表格 -->
  4 + <!-- TODO: 待优化测试表格 -->
5 5 <table align="center">
6 6 <thead>
7 7 <tr>
... ... @@ -67,10 +67,18 @@
67 67 </td>
68 68 <td style="width: 6.5vw">
69 69 <a-input
70   - v-if="item.key === 'scope' || item.key === 'fixed_date'"
  70 + v-if="item.key === 'scope'"
71 71 placeholder="请输入"
72 72 v-model:value="item.keyValue"
73 73 />
  74 + <a-date-picker
  75 + v-else-if="item.key === 'fixed_date'"
  76 + style="width: 6.5vw"
  77 + v-model:value="item.keyValue"
  78 + :show-time="{ format: 'HH:mm' }"
  79 + format="YYYY-MM-DD HH:mm:ss"
  80 + placeholder="日期时间"
  81 + />
74 82 <a-range-picker
75 83 v-else-if="item.key == 'date_range'"
76 84 style="width: 6.5vw"
... ... @@ -79,7 +87,7 @@
79 87 format="YYYY-MM-DD HH:mm"
80 88 :placeholder="['开始', '结束']"
81 89 />
82   - <a-input v-else disabled="true" placeholder="请输入" v-model:value="item.keyValue" />
  90 + <a-input v-else disabled placeholder="请输入" v-model:value="item.keyValue" />
83 91 </td>
84 92 </tr>
85 93 </tbody>
... ... @@ -92,10 +100,10 @@
92 100 import { findDictItemByCode } from '/@/api/system/dict';
93 101 import { getAllDeviceByOrg } from '/@/api/dataBoard';
94 102 import { getDeviceAttributes } from '/@/api/dataBoard';
95   - import { useApi } from '../../hooks/useApi';
  103 + import { useApi } from '../../../hooks/useApi';
96 104 import { cloneDeep } from 'lodash-es';
97   - import { tableItems, selectType } from '../../types';
98   - import { editTestCellTableTHeadConfig } from '../../config';
  105 + import { tableItems, selectType } from '../../../types';
  106 + import { editTestCellTableTHeadConfig } from '../../../config';
99 107
100 108 const props = defineProps({
101 109 method: {
... ... @@ -166,7 +174,7 @@
166 174
167 175 const handleOrgnationChange = async (e) => {
168 176 let deviceProfileId = '';
169   - tableTestArray.content.forEach((f) => {
  177 + tableTestArray.content.forEach((f: any) => {
170 178 if (f.key === 'entityId') {
171 179 f.value = null;
172 180 }
... ... @@ -192,7 +200,7 @@
192 200 const handleValueChange = (e) => {
193 201 let organizationId = '';
194 202 if (e.key === 'deviceProfileId') {
195   - tableTestArray.content.forEach((f) => {
  203 + tableTestArray.content.forEach((f: any) => {
196 204 if (f.key === 'keys') {
197 205 f.value = null;
198 206 }
... ...
1   -import TestRequest from './index.vue';
2   -
3   -export { TestRequest };
1   -<template>
2   - <div>
3   - <div class="mt-8">
4   - <div>
5   - <Button @click="handleTest" type="primary"> 测试接口 </Button>
6   - </div>
7   - <div v-if="showTestEditCell" class="mt-8">
8   - <a-row type="flex" justify="center">
9   - <a-col :span="3"> 参数设置 </a-col>
10   - <a-col :span="21">
11   - <TestEditCellTable ref="testEditCellTableRef" :method="method" />
12   - </a-col>
13   - </a-row>
14   - </div>
15   - </div>
16   - <div v-if="showTestEditCell" class="mt-8">
17   - <div>
18   - <Button @click="handleExcute" type="primary"> 执行 </Button>
19   - </div>
20   - <div class="mt-8">
21   - <a-row type="flex" justify="center">
22   - <a-col :span="3"> 测试结果 </a-col>
23   - <a-col :span="21">
24   - <a-textarea
25   - allow-clear
26   - show-count
27   - v-model:value="testResult"
28   - placeholder="测试结果为:"
29   - :rows="8"
30   - />
31   - </a-col>
32   - </a-row>
33   - </div>
34   - </div>
35   - </div>
36   -</template>
37   -<script lang="ts" setup name="testRequest">
38   - import { ref, nextTick, reactive } from 'vue';
39   - import { Button } from 'ant-design-vue';
40   - import { TestEditCellTable } from '../TestEditCellTable/index';
41   - import { otherHttp } from '/@/utils/http/axios';
42   - import moment from 'moment';
43   - import { useWebSocket } from '@vueuse/core';
44   - import { JWT_TOKEN_KEY } from '/@/enums/cacheEnum';
45   - import { getAuthCache } from '/@/utils/auth';
46   - import { useMessage } from '/@/hooks/web/useMessage';
47   - import { useGlobSetting } from '/@/hooks/setting';
48   -
49   - const emits = defineEmits(['testInterface']);
50   -
51   - const props = defineProps({
52   - method: {
53   - type: String,
54   - },
55   - data: {
56   - type: Object,
57   - },
58   - });
59   -
60   - const { createMessage } = useMessage();
61   -
62   - const token = getAuthCache(JWT_TOKEN_KEY);
63   -
64   - const { socketUrl } = useGlobSetting();
65   -
66   - const socketMessage = reactive({
67   - server: `${socketUrl}${token}`,
68   - sendValue: {
69   - tsSubCmds: [],
70   - },
71   - });
72   -
73   - const showTestEditCell = ref(false);
74   -
75   - const testEditCellTableRef = ref<InstanceType<typeof TestEditCellTable>>();
76   -
77   - const testResult = ref('');
78   -
79   - // const testNeedKeys = ['organizationId', 'deviceProfileId', 'entityId', 'keys', 'date'];
80   -
81   - const handleTest = () => {
82   - showTestEditCell.value = true;
83   - emits('testInterface');
84   - getValue();
85   - };
86   -
87   - //获取多个key
88   - const getMultipleKeys = (list) => {
89   - let temps = [];
90   - list?.forEach((it) => {
91   - const keys = it.key.split(',');
92   - const temp = keys.map((item) => {
93   - let obj: { key: string; value: string } = { key: '', value: '' };
94   - obj.key = item;
95   - obj.value = item === 'scope' ? it.value : '';
96   - return obj;
97   - });
98   - temps = temp;
99   - });
100   - return temps;
101   - };
102   -
103   - //获取测试表格的key value 数组对象形式
104   - const getTestTableKeyValue = () => {
105   - //把日期拆分成多个
106   - const keyValueList = [];
107   - testEditCellTableRef.value?.getValue()?.forEach((item) => {
108   - const splitDateKey = item.key === 'date_range' ? item.value?.split(',') : [];
109   - const splitDateValue = item.key === 'date_range' ? item.dateValue : [];
110   - for (let i in splitDateKey) {
111   - const obj = {
112   - key: splitDateKey[i],
113   - value: moment(splitDateValue[i]).valueOf(),
114   - };
115   - keyValueList.push(obj);
116   - }
117   - });
118   - return testEditCellTableRef.value
119   - ?.getValue()
120   - .concat(keyValueList)
121   - .filter((it) => it.key !== 'date_range')
122   - .map((it) => {
123   - const value = it.key === 'scope' || it.key === 'fixed_date' ? it.keyValue : it.value;
124   - const key = it.key === 'scope' || it.key === 'fixed_date' ? it.value : it.key;
125   - return {
126   - key,
127   - value,
128   - };
129   - });
130   - };
131   -
132   - //格式化"http:xxxx/api/xx/{xx}/{xx}/{xx}这种格式"
133   - String.prototype.restfulFormat = function (replacements) {
134   - var formatString = function (str, replacements) {
135   - replacements =
136   - typeof replacements === 'object' ? replacements : Array.prototype.slice.call(arguments, 1);
137   - return str.replace(/\{\{|\}\}|\{(\w+)\}/g, function (m, n) {
138   - if (m == '{{') {
139   - return '{';
140   - }
141   - if (m == '}}') {
142   - return '}';
143   - }
144   - return replacements[n];
145   - });
146   - };
147   - replacements =
148   - typeof replacements === 'object' ? replacements : Array.prototype.slice.call(arguments, 0);
149   - return formatString(this, replacements);
150   - };
151   -
152   - //TODO 待优化 项目自带第三方请求
153   - const otherHttpRequest = async (apiType, params = {}, api, joinPrefix = false) => {
154   - switch (apiType) {
155   - case 'GET':
156   - Reflect.deleteProperty(params, 'deviceProfileId');
157   - Reflect.deleteProperty(params, 'organizationId');
158   - Reflect.deleteProperty(params, 'entityId');
159   - Reflect.deleteProperty(params, 'entityType');
160   - Reflect.deleteProperty(params, 'scope');
161   - Reflect.deleteProperty(params, 'id');
162   - Reflect.deleteProperty(params, 'type');
163   - return await otherHttp.get(
164   - { url: api, params },
165   - {
166   - apiUrl: '',
167   - joinPrefix,
168   - }
169   - );
170   - case 'POST':
171   - return await otherHttp.post(
172   - { url: api, data: params },
173   - {
174   - apiUrl: '',
175   - joinPrefix,
176   - }
177   - );
178   - case 'PUT':
179   - return await otherHttp.put(
180   - { url: api, data: params },
181   - {
182   - apiUrl: '',
183   - joinPrefix,
184   - }
185   - );
186   - }
187   - };
188   -
189   - const getValue = async () => {
190   - await nextTick();
191   - await nextTick(() => {
192   - const getSingleKey = props.data?.list;
193   - const getMuteKey = props.data?.list?.filter((it: any) => it.key.split(',').length > 1);
194   - const getMuteKeys = getMultipleKeys(getMuteKey);
195   - const mergeKeys = [...getSingleKey, ...getMuteKeys]?.filter(
196   - (it: any) => it.key.split(',').length === 1
197   - );
198   - testEditCellTableRef.value?.setTableArray(mergeKeys);
199   - });
200   - };
201   -
202   - //执行测试接口
203   - const handleExcute = async () => {
204   - await nextTick();
205   - await nextTick(async () => {
206   - const getTable = getTestTableKeyValue();
207   - const apiGetUrl = `${props.data?.requestOriginUrl}${props.data?.requestTypeAndUrl?.requestUrl}`;
208   - const apiType = props.data?.requestTypeAndUrl?.requestHttpType;
209   - const params: any = {};
210   - getTable?.map((it) => (params[it.key!] = it.value!));
211   - if (props.method === '0') {
212   - //普通请求
213   - const formatApi = apiGetUrl.restfulFormat(params);
214   - const rest = await otherHttpRequest(apiType, params, formatApi.split('{?')[0], false);
215   - testResult.value = JSON.stringify(rest);
216   - } else if (props.method === '2') {
217   - //websocket请求
218   - Reflect.deleteProperty(params, 'deviceProfileId');
219   - Reflect.deleteProperty(params, 'organizationId');
220   - Reflect.set(params, 'cmdId', Number(params?.cmdId));
221   - socketMessage.sendValue.tsSubCmds.push(params);
222   - const { send, close } = useWebSocket(socketMessage.server, {
223   - onConnected() {
224   - send(JSON.stringify(socketMessage.sendValue));
225   - console.log('建立连接了');
226   - },
227   - onMessage(_, e) {
228   - const { data } = JSON.parse(e.data);
229   - testResult.value = JSON.stringify(data);
230   - },
231   - onDisconnected() {
232   - console.log('断开连接了');
233   - close();
234   - },
235   - onError() {
236   - createMessage.error('webSocket连接超时,请联系管理员');
237   - },
238   - });
239   - }
240   - });
241   - };
242   -
243   - //设置数据
244   - const setValue = () => {
245   - showTestEditCell.value = false;
246   - testResult.value = '';
247   - };
248   -
249   - defineExpose({
250   - setValue,
251   - handleTest,
252   - });
253   -</script>
254   -
255   -<style scoped lang="less"></style>
... ... @@ -204,4 +204,4 @@ export const schemas: FormSchema[] = [
204 204 //表格表头配置
205 205 export const editCellTableTHeadConfig = ['序号', '内置参数', '参数名', '是否必须', '操作'];
206 206 export const editTestCellTableTHeadConfig = ['内置参数', '参数名', '参数值'];
207   -export const editTestCellTableTHeaderConfig = ['序号', '参数名', '参数值'];
  207 +export const editTestCellTableTHeaderConfig = ['序号', '参数名', '参数值', '是否必须', '操作'];
... ...
... ... @@ -12,7 +12,6 @@
12 12 <SimpleRequest
13 13 ref="simpleRequestRef"
14 14 v-if="model['requestContentType'] === '0' || model['requestContentType'] === '2'"
15   - @activeKey="handleActiveKey"
16 15 :requestTypeAndUrl="model['requestHttpTypeAndUrl']"
17 16 :method="model['requestContentType']"
18 17 :requestOriginUrl="model['requestOriginUrl']"
... ... @@ -42,7 +41,11 @@
42 41 saveDataViewInterface,
43 42 updateDataViewInterface,
44 43 } from '/@/api/bigscreen/center/bigscreenCenter';
  44 +
45 45 import { useMessage } from '/@/hooks/web/useMessage';
  46 + import { useUtils } from './hooks/useUtils';
  47 +
  48 + const { resetReqHttpType, resetUpdateSchema } = useUtils();
46 49
47 50 const emits = defineEmits(['success', 'register']);
48 51
... ... @@ -52,8 +55,6 @@
52 55
53 56 const putId = ref('');
54 57
55   - const activeKey = ref('');
56   -
57 58 const simpleRequestRef = ref<InstanceType<typeof SimpleRequest>>();
58 59
59 60 const testSqlRef = ref<InstanceType<typeof TestSql>>();
... ... @@ -67,18 +68,8 @@
67 68 const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => {
68 69 await resetFields();
69 70 await nextTick();
70   - updateSchema({
71   - field: 'requestHttpTypeAndUrl',
72   - componentProps: {
73   - type: '0',
74   - },
75   - });
76   - setFieldsValue({
77   - requestHttpTypeAndUrl: {
78   - requestHttpType: undefined,
79   - requestUrl: '',
80   - },
81   - });
  71 + updateSchema(resetUpdateSchema);
  72 + setFieldsValue(resetReqHttpType);
82 73 const title = `${!data.isUpdate ? '新增' : '修改'}公共接口`;
83 74 setDrawerProps({ title });
84 75 isUpdate.value = data.isUpdate;
... ... @@ -104,12 +95,9 @@
104 95 type: String(data.record?.requestContentType),
105 96 },
106 97 });
107   - } else {
108 98 }
109 99 });
110 100
111   - const handleActiveKey = (v) => (activeKey.value = v);
112   -
113 101 const handleSubmit = async () => {
114 102 setDrawerProps({ loading: true });
115 103 try {
... ...
  1 +export const useUtils = () => {
  2 + //获取多个key
  3 + const getMultipleKeys = (list) => {
  4 + let temps = [];
  5 + list?.forEach((it) => {
  6 + const keys = it.key.split(',');
  7 + const temp = keys.map((item) => {
  8 + const obj: { key: string; value: string } = { key: '', value: '' };
  9 + obj.key = item;
  10 + obj.value = item === 'scope' ? it.value : '';
  11 + return obj;
  12 + });
  13 + temps = temp;
  14 + });
  15 + return temps;
  16 + };
  17 + //默认push一个
  18 + const pushObj = {
  19 + key: undefined,
  20 + value: '',
  21 + editDisabled: false,
  22 + required: false,
  23 + date1: '',
  24 + date2: '',
  25 + };
  26 + //新增时置空特定数据
  27 + const resetReqHttpType = {
  28 + requestHttpTypeAndUrl: {
  29 + requestHttpType: undefined,
  30 + requestUrl: '',
  31 + },
  32 + };
  33 + const resetUpdateSchema = {
  34 + field: 'requestHttpTypeAndUrl',
  35 + componentProps: {
  36 + type: '0',
  37 + },
  38 + };
  39 + return { getMultipleKeys, pushObj, resetReqHttpType, resetUpdateSchema };
  40 +};
... ...