DataConfig.vue 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  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 {
  88. CodeEditorModal,
  89. type CodeEditorModalInstance,
  90. } from "../codeEditor";
  91. /**
  92. * 通用数据data约定内容结构
  93. * {
  94. * xData: ['x轴标签A', 'x轴标签B', 'x轴标签C', 'x轴标签D'],
  95. * yData: ['y轴数据A', 'y轴数据B', 'y轴数据C', 'y轴数据D'],
  96. * // 根据不同类型的图表配置不同的series
  97. * series: [
  98. * {
  99. * name: '系列A',
  100. * data: [10, 20, 30, 40]
  101. * },
  102. * {
  103. * name: '系列B',
  104. * data: [10, 20, 30, 40]
  105. * }
  106. * ]
  107. * }
  108. */
  109. const emit = defineEmits(["change"]);
  110. const props = defineProps<{
  111. dataSource: DataSource;
  112. }>();
  113. const formModel = ref({
  114. sourceType: DataSourceType.STATIC,
  115. // 静态数据相关
  116. data: "",
  117. // 接口相关
  118. url: '',
  119. method: "",
  120. params: {},
  121. headers: {},
  122. refreshTime: 0,
  123. // 数据处理
  124. dataProcess: "",
  125. });
  126. const handleRefreshTimeChange = (val: unknown) => {
  127. formModel.value.refreshTime = val === 0 || val as number >= 60 ? val as number : 60;
  128. };
  129. /* =====================编辑代码======================= */
  130. let pathKey: "data" | "params" | "headers" | "dataProcess";
  131. const codeEditorRef = ref<Ref<CodeEditorModalInstance> | null>(null);
  132. const handleEditData = (key: "data" | "params" | "headers" | "dataProcess") => {
  133. pathKey = key;
  134. codeEditorRef.value?.open(JSON.stringify(formModel.value[key]));
  135. };
  136. const handleCodeSave = (code: string) => {
  137. formModel.value[pathKey] = JSON.parse(code);
  138. };
  139. watch(
  140. () => props.dataSource,
  141. (val) => {
  142. Object.assign(formModel.value, val || {});
  143. },
  144. { immediate: true }
  145. );
  146. watch(
  147. () => formModel.value,
  148. (val) => {
  149. emit("change", val);
  150. },
  151. { deep: true }
  152. );
  153. </script>
  154. <style scoped></style>