DataConfig.vue 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. <template>
  2. <Form
  3. size="small"
  4. layout="horizontal"
  5. :model="formModel"
  6. :label-col="{ span: 8 }"
  7. :wrapper-col="{ span: 16 }"
  8. >
  9. <Form.Item label="类型" name="sourceType">
  10. <Select v-model:value="formModel.sourceType">
  11. <SelectOption :value="DataSourceType.STATIC">静态数据</SelectOption>
  12. <SelectOption :value="DataSourceType.API">动态数据</SelectOption>
  13. </Select>
  14. </Form.Item>
  15. <!-- 静态数据 -->
  16. <template v-if="formModel.sourceType === DataSourceType.STATIC">
  17. <Form.Item label="数据" name="data">
  18. <Button type="default" size="small" @click="handleEditData('data')"
  19. >编辑</Button
  20. >
  21. </Form.Item>
  22. </template>
  23. <!-- 接口 -->
  24. <template v-else-if="formModel.sourceType === DataSourceType.API">
  25. <Form.Item label="接口地址" name="url">
  26. <Input.TextArea
  27. :auto-size="{ minRows: 5 }"
  28. placeholder="请输入接口地址"
  29. v-model:value="formModel.url"
  30. ></Input.TextArea>
  31. </Form.Item>
  32. <Form.Item label="请求方式" name="method">
  33. <RadioGroup v-model:value="formModel.method">
  34. <Radio value="GET">GET</Radio>
  35. <Radio value="POST">POST</Radio>
  36. </RadioGroup>
  37. </Form.Item>
  38. <Form.Item label="刷新时间" name="refreshTime">
  39. <InputNumber
  40. v-model:value="formModel.refreshTime"
  41. :step="1"
  42. style="width: 100%"
  43. @change="handleRefreshTimeChange"
  44. >
  45. <template #addonAfter>
  46. <span class="text-gray-500">秒</span>
  47. </template>
  48. </InputNumber>
  49. </Form.Item>
  50. <Form.Item label="请求参数" name="params">
  51. <Button type="default" size="small" @click="handleEditData('params')"
  52. >编辑</Button
  53. >
  54. </Form.Item>
  55. <Form.Item label="请求头" name="headers">
  56. <Button type="default" size="small" @click="handleEditData('headers')"
  57. >编辑</Button
  58. >
  59. </Form.Item>
  60. <Form.Item label="数据处理" name="dataProcess">
  61. <Button
  62. type="default"
  63. size="small"
  64. @click="handleEditData('dataProcess')"
  65. >编辑</Button
  66. >
  67. </Form.Item>
  68. </template>
  69. </Form>
  70. <CodeEditorModal ref="codeEditorRef" title="编辑" @ok="handleCodeSave" />
  71. </template>
  72. <script setup lang="ts">
  73. import type { DataSource } from "./types";
  74. import type { Ref } from "vue";
  75. import { ref, defineProps, watch, defineEmits } from "vue";
  76. import {
  77. Form,
  78. Input,
  79. Button,
  80. InputNumber,
  81. Select,
  82. SelectOption,
  83. RadioGroup,
  84. Radio,
  85. } from "ant-design-vue";
  86. import { DataSourceType } from "./chartEnum";
  87. import { CodeEditorModal, type CodeEditorModalInstance } from "../codeEditor";
  88. /**
  89. * 通用数据data约定内容结构
  90. * {
  91. * xData: ['x轴标签A', 'x轴标签B', 'x轴标签C', 'x轴标签D'],
  92. * yData: ['y轴数据A', 'y轴数据B', 'y轴数据C', 'y轴数据D'],
  93. * // 根据不同类型的图表配置不同的series
  94. * series: [
  95. * {
  96. * name: '系列A',
  97. * data: [10, 20, 30, 40]
  98. * },
  99. * {
  100. * name: '系列B',
  101. * data: [10, 20, 30, 40]
  102. * }
  103. * ]
  104. * }
  105. */
  106. const emit = defineEmits(["change"]);
  107. const props = defineProps<{
  108. dataSource: DataSource;
  109. }>();
  110. const formModel = ref({
  111. sourceType: DataSourceType.STATIC,
  112. // 静态数据相关
  113. data: "",
  114. // 接口相关
  115. url: "",
  116. method: "",
  117. params: {},
  118. headers: {},
  119. refreshTime: 0,
  120. // 数据处理
  121. dataProcess: "",
  122. });
  123. const handleRefreshTimeChange = (val: unknown) => {
  124. formModel.value.refreshTime =
  125. val === 0 || (val as number) >= 60 ? (val as number) : 60;
  126. };
  127. /* =====================编辑代码======================= */
  128. let pathKey: "data" | "params" | "headers" | "dataProcess";
  129. const codeEditorRef = ref<Ref<CodeEditorModalInstance> | null>(null);
  130. const handleEditData = (key: "data" | "params" | "headers" | "dataProcess") => {
  131. pathKey = key;
  132. codeEditorRef.value?.open(
  133. typeof formModel.value[key] === "string"
  134. ? formModel.value[key]
  135. : JSON.stringify(formModel.value[key])
  136. );
  137. };
  138. const handleCodeSave = (code: string) => {
  139. try {
  140. formModel.value[pathKey] = JSON.parse(code);
  141. } catch (error) {
  142. formModel.value[pathKey] = code;
  143. }
  144. };
  145. watch(
  146. () => props.dataSource,
  147. (val) => {
  148. Object.assign(formModel.value, val || {});
  149. },
  150. { immediate: true }
  151. );
  152. watch(
  153. () => formModel.value,
  154. (val) => {
  155. emit("change", val);
  156. },
  157. { deep: true }
  158. );
  159. </script>
  160. <style scoped></style>