fieldedit.vue 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. <template>
  2. <a-modal
  3. :width="1200"
  4. v-model:visible="visible"
  5. :title="title"
  6. :confirm-loading="confirmLoading"
  7. :keyboard="false"
  8. :footer="null"
  9. :mask-closable="false">
  10. <Form :ref="modalFormRef" :model="dataModel" @finish="handleOk" autocomplete="off">
  11. <a-divider orientation="left">基础信息</a-divider>
  12. <a-row type="flex">
  13. <a-col :span="7">
  14. <a-form-item label="字段编码" name="fieldCode" :label-col="{span:7}"
  15. :rules="[{ required: true, message: '请填写字段编码!' }]">
  16. <a-input v-model:value="dataModel.fieldCode" placeholder="">
  17. </a-input>
  18. </a-form-item>
  19. </a-col>
  20. <a-col :span="7">
  21. <a-form-item label="字段名称" name="fieldName" :label-col="{span:7}"
  22. :rules="[{ required: true, message: '请填写字段名称!' }]">
  23. <a-input v-model:value="dataModel.fieldName" placeholder="">
  24. </a-input>
  25. </a-form-item>
  26. </a-col>
  27. </a-row>
  28. <a-row type="flex">
  29. <a-col :span="7">
  30. <a-form-item label="配置类型" name="settingTypeId" :label-col="{span:7}"
  31. :rules="[{ required: true, message: '请选择配置类型!' }]">
  32. <a-select ref="select" v-model:value="dataModel.settingTypeId"
  33. :options="settingTypeList" :field-names="{label:'name',value:'value'}" :allow-clear="true">
  34. </a-select>
  35. </a-form-item>
  36. </a-col>
  37. <a-col :span="7">
  38. <a-form-item label="数据类型" name="dataType" :label-col="{span:7}"
  39. :rules="[{ required: true, message: '请选择数据类型!' }]">
  40. <a-select ref="select" v-model:value="dataModel.dataType"
  41. :options="DataTypeList" :field-names="{label:'name',value:'value'}" :allow-clear="true">
  42. </a-select>
  43. </a-form-item>
  44. </a-col>
  45. <a-col :span="7">
  46. <a-form-item label="是否查询字段" name="isSearchField" :label-col="{span:7}">
  47. <a-radio-group v-model:value="dataModel.isSearchField">
  48. <a-radio :value="1">是</a-radio>
  49. <a-radio :value="0">否</a-radio>
  50. </a-radio-group>
  51. </a-form-item>
  52. </a-col>
  53. </a-row>
  54. <a-row type="flex">
  55. <a-col :span="7">
  56. <a-form-item label="查询类型" name="queryTypeId" :label-col="{span:7}"
  57. :rules="[{ required: true, message: '请选择配置类型!' }]">
  58. <a-select ref="select" v-model:value="dataModel.queryTypeId"
  59. :options="queryTypeList" :field-names="{label:'name',value:'value'}" :allow-clear="true">
  60. </a-select>
  61. </a-form-item>
  62. </a-col>
  63. <a-col :span="7" v-if="dataModel.queryTypeId==4">
  64. <a-form-item label="取数字典编码" name="dictionaryCode" :label-col="{span:7}"
  65. :rules="[{ required: true, message: '请选择数据类型!' }]">
  66. <a-input v-model:value="dataModel.dictionaryCode" placeholder="">
  67. </a-input>
  68. </a-form-item>
  69. </a-col>
  70. <a-col :span="7">
  71. <a-form-item label="显示排序" name="disOrder" :label-col="{span:7}"
  72. :rules="[{ required: true, message: '请输入显示排序!' }]">
  73. <a-input-number v-model:value="dataModel.disOrder">
  74. </a-input-number>
  75. </a-form-item>
  76. </a-col>
  77. </a-row>
  78. <a-row type="flex">
  79. <a-col :span="14">
  80. <a-form-item label="标签" name="queryTypeId" :label-col="{span:3}"
  81. :rules="[{ required: true, message: '请选择标签' }]">
  82. <a-select
  83. v-model:value="dataModel.tagList"
  84. mode="tags"
  85. style="width: 100%"
  86. :options="tagOptions">
  87. </a-select>
  88. </a-form-item>
  89. </a-col>
  90. </a-row>
  91. <a-row type="flex">
  92. <a-col :span="7">
  93. <a-form-item label="是否关联字段" name="isForeignKey" :label-col="{span:7}">
  94. <a-radio-group v-model:value="dataModel.isForeignKey">
  95. <a-radio :value="1">是</a-radio>
  96. <a-radio :value="0">否</a-radio>
  97. </a-radio-group>
  98. </a-form-item>
  99. </a-col>
  100. <a-col :span="7" v-if="dataModel.isForeignKey==1">
  101. <a-form-item label="显示别名" name="fieldAlias" :label-col="{span:7}"
  102. :rules="[{ required: true, message: '请填写显示别名!' }]">
  103. <a-input v-model:value="dataModel.fieldAlias" placeholder="">
  104. </a-input>
  105. </a-form-item>
  106. </a-col>
  107. </a-row>
  108. <a-row type="flex" v-if="dataModel.isForeignKey==1">
  109. <a-col :span="7">
  110. <a-form-item label="外键表" name="referencesTab" :label-col="{span:7}"
  111. :rules="[{ required: true, message: '请输入外键表!' }]">
  112. <a-input v-model:value="dataModel.referencesTab" placeholder="">
  113. </a-input>
  114. </a-form-item>
  115. </a-col>
  116. <a-col :span="7">
  117. <a-form-item label="外键列" name="foreignKey" :label-col="{span:7}"
  118. :rules="[{ required: true, message: '请输入外键列!' }]">
  119. <a-input v-model:value="dataModel.foreignKey" placeholder="">
  120. </a-input>
  121. </a-form-item>
  122. </a-col>
  123. <a-col :span="7">
  124. <a-form-item label="外键表显示列" name="displayColumn" :label-col="{span:7}"
  125. :rules="[{ required: true, message: '请输入外键表显示列!' }]">
  126. <a-input v-model:value="dataModel.displayColumn" placeholder="">
  127. </a-input>
  128. </a-form-item>
  129. </a-col>
  130. </a-row>
  131. <a-row v-if="dataModel.isForeignKey==1">
  132. <a-col :span="21">
  133. <a-form-item label="sql预览" name="displayColumn" :label-col="{span:2}">
  134. <codemirror
  135. v-model="code"
  136. :style="{ height: '100px',width:'100%' ,fontSize:'16px'}"
  137. :autofocus="true"
  138. :indent-with-tab="true"
  139. disabled="false"
  140. tab-size="2"
  141. :extensions="[sql(),solarizedLight]"
  142. />
  143. </a-form-item>
  144. </a-col>
  145. </a-row>
  146. <a-row style="height: 20px"></a-row>
  147. <a-row type="flex">
  148. <a-col :span="24" style="text-align: right;margin-right: 20px;">
  149. <a-button type="primary" html-type="submit">提交</a-button>
  150. </a-col>
  151. </a-row>
  152. </Form>
  153. </a-modal>
  154. </template>
  155. <script lang="ts">
  156. import {Form} from 'ant-design-vue';
  157. import {defineComponent, reactive, ref, watch} from "vue";
  158. import BUploadFile from "@/components/file/uploadFile.vue";
  159. import type {SelectProps} from "ant-design-vue";
  160. import {getDictionaryItemList} from "@/api/system/dictionary";
  161. import type {FormInstance} from 'ant-design-vue';
  162. import {DataTypeList} from '@/enums/dictions';
  163. import {Codemirror} from 'vue-codemirror'
  164. import {solarizedLight} from 'thememirror';
  165. import {sql, MySQL} from '@codemirror/lang-sql';
  166. import type {Subjectfield} from "@/views/subject/model";
  167. import {get} from '@/api/common';
  168. export default defineComponent({
  169. name: 'FieldEdit',
  170. components: {BUploadFile, Form, Codemirror, MySQL, sql, solarizedLight},
  171. props: {
  172. onSave: {
  173. type: Function,
  174. default: null
  175. }
  176. },
  177. setup(props) {
  178. const visible = ref<boolean>(false);
  179. const confirmLoading = ref<boolean>(false);
  180. const modalFormRef = ref<FormInstance>();
  181. const defaultValue = reactive<Subjectfield>({
  182. fieldCode: "",
  183. fieldName: "",
  184. fieldAlias: "",
  185. settingTypeId: "",
  186. fieldDesc: "",
  187. dataType: null,
  188. queryTypeId: "",
  189. isSearchField: 1,
  190. dictionaryCode: '',
  191. isForeignKey: 0,
  192. foreignKey: '',
  193. displayColumn: '',
  194. referencesTab: '',
  195. tagList: []
  196. });
  197. const dataModel = ref({...defaultValue});
  198. const settingTypeList = ref<SelectProps['options']>();
  199. const queryTypeList = ref<SelectProps['options']>();
  200. const tagOptions = ref();
  201. const title = ref();
  202. const code = ref("");
  203. const options = {
  204. disabled: false,
  205. indentWithTab: true,
  206. tabSize: 2,
  207. autofocus: true,
  208. height: 'auto',
  209. language: 'javascript',
  210. theme: 'oneDark'
  211. }
  212. getDictionaryItemList({code: "settingType"}).then(data => {
  213. settingTypeList.value = data;
  214. });
  215. getDictionaryItemList({code: "queryType"}).then(data => {
  216. queryTypeList.value = data;
  217. });
  218. get('subject/getTagList', {}).then((data: any[]) => {
  219. tagOptions.value = data.map(x => ({value: x.tagName}));
  220. })
  221. const show = (record: any) => {
  222. if (record == null) {
  223. record = {...defaultValue};
  224. }
  225. dataModel.value = record;
  226. title.value = "主题字段定义";
  227. visible.value = true;
  228. };
  229. const handleOk = () => {
  230. props.onSave(dataModel.value);
  231. visible.value = false;
  232. };
  233. const handleCancel = () => {
  234. visible.value = false;
  235. };
  236. watch(
  237. () => [dataModel.value.fieldCode, dataModel.value.fieldAlias, dataModel.value.foreignKey, dataModel.value.referencesTab, dataModel.value.displayColumn],
  238. () => {
  239. code.value = ` select 主表.*, ${dataModel.value.referencesTab}.${dataModel.value.displayColumn} as ${dataModel.value.fieldAlias}
  240. from 主表 ` +
  241. ` inner join ${dataModel.value.referencesTab} on 主表.${dataModel.value.fieldCode} =${dataModel.value.referencesTab}.${dataModel.value.foreignKey}`
  242. },
  243. );
  244. return {
  245. dataModel,
  246. modalFormRef,
  247. visible, title, options, code,sql, solarizedLight, tagOptions,
  248. confirmLoading,
  249. settingTypeList,
  250. DataTypeList,
  251. queryTypeList,
  252. show, handleOk, handleCancel,
  253. };
  254. },
  255. mounted() {
  256. },
  257. })
  258. </script>