DataConfig.vue 5.9 KB

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