fieldedit.vue 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  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==8">
  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}" :rules="[{ required: true, message: '请输入显示排序!' }]">
  72. <a-input-number v-model:value="dataModel.disOrder">
  73. </a-input-number>
  74. </a-form-item>
  75. </a-col>
  76. </a-row>
  77. <a-row type="flex">
  78. <a-col :span="7">
  79. <a-form-item label="是否关联字段" name="isForeignKey" :label-col="{span:7}">
  80. <a-radio-group v-model:value="dataModel.isForeignKey">
  81. <a-radio :value="1">是</a-radio>
  82. <a-radio :value="0">否</a-radio>
  83. </a-radio-group>
  84. </a-form-item>
  85. </a-col>
  86. <a-col :span="7" v-if="dataModel.isForeignKey==1">
  87. <a-form-item label="显示别名" name="fieldAlias" :label-col="{span:7}"
  88. :rules="[{ required: true, message: '请填写显示别名!' }]">
  89. <a-input v-model:value="dataModel.fieldAlias" placeholder="">
  90. </a-input>
  91. </a-form-item>
  92. </a-col>
  93. </a-row>
  94. <a-row type="flex" v-if="dataModel.isForeignKey==1">
  95. <a-col :span="7">
  96. <a-form-item label="外键表" name="referencesTab" :label-col="{span:7}"
  97. :rules="[{ required: true, message: '请输入外键表!' }]">
  98. <a-input v-model:value="dataModel.referencesTab" placeholder="">
  99. </a-input>
  100. </a-form-item>
  101. </a-col>
  102. <a-col :span="7">
  103. <a-form-item label="外键列" name="foreignKey" :label-col="{span:7}"
  104. :rules="[{ required: true, message: '请输入外键列!' }]">
  105. <a-input v-model:value="dataModel.foreignKey" placeholder="">
  106. </a-input>
  107. </a-form-item>
  108. </a-col>
  109. <a-col :span="7">
  110. <a-form-item label="外键表显示列" name="displayColumn" :label-col="{span:7}" :rules="[{ required: true, message: '请输入外键表显示列!' }]">
  111. <a-input v-model:value="dataModel.displayColumn" placeholder="">
  112. </a-input>
  113. </a-form-item>
  114. </a-col>
  115. </a-row>
  116. <a-row v-if="dataModel.isForeignKey==1">
  117. <a-col :span="21">
  118. <a-form-item label="sql预览" name="displayColumn" :label-col="{span:2}" >
  119. <codemirror
  120. v-model="code"
  121. :style="{ height: '100px',width:'100%' }"
  122. :autofocus="true"
  123. :indent-with-tab="true"
  124. :lang="lang"
  125. disabled="false"
  126. tab-size="2"
  127. :theme="oneDark"
  128. />
  129. </a-form-item>
  130. </a-col>
  131. </a-row>
  132. <a-row style="height: 20px"></a-row>
  133. <a-row type="flex">
  134. <a-col :span="24" style="text-align: right;margin-right: 20px;">
  135. <a-button type="primary" html-type="submit">提交</a-button>
  136. </a-col>
  137. </a-row>
  138. </Form>
  139. </a-modal>
  140. </template>
  141. <script lang="ts">
  142. import {Form} from 'ant-design-vue';
  143. import {defineComponent, reactive, ref, watch} from "vue";
  144. import BUploadFile from "@/components/file/uploadFile.vue";
  145. import type {SelectProps} from "ant-design-vue";
  146. import {getDictionaryItemList} from "@/api/system/dictionary";
  147. import type {FormInstance} from 'ant-design-vue';
  148. import {DataTypeList} from '@/enums/dictions';
  149. import { Codemirror } from 'vue-codemirror'
  150. import { oneDark } from '@codemirror/theme-one-dark'
  151. import { sql, MySQL } from '@codemirror/lang-sql';
  152. import type {Subjectfield} from "@/views/subject/model";
  153. export default defineComponent({
  154. name: 'FieldEdit',
  155. components: {BUploadFile, Form,Codemirror,MySQL,sql,oneDark},
  156. props: {
  157. onSave: {
  158. type: Function,
  159. default: null
  160. }
  161. },
  162. setup(props) {
  163. const visible = ref<boolean>(false);
  164. const confirmLoading = ref<boolean>(false);
  165. const modalFormRef = ref<FormInstance>();
  166. const defaultValue = reactive<Subjectfield>({
  167. fieldCode: "",
  168. fieldName: "",
  169. fieldAlias: "",
  170. settingTypeId: "",
  171. fieldDesc: "",
  172. dataType: null,
  173. queryTypeId: "",
  174. isSearchField: 1,
  175. dictionaryCode: '',
  176. isForeignKey: 0,
  177. foreignKey: '',
  178. displayColumn: '',
  179. referencesTab: ''
  180. });
  181. const dataModel = ref({...defaultValue});
  182. const settingTypeList = ref<SelectProps['options']>();
  183. const queryTypeList = ref<SelectProps['options']>();
  184. const title = ref();
  185. const lang=sql();
  186. const code =ref("");
  187. const options = {
  188. disabled: false,
  189. indentWithTab: true,
  190. tabSize: 2,
  191. autofocus: true,
  192. height: 'auto',
  193. language: 'javascript',
  194. theme:'oneDark'
  195. }
  196. getDictionaryItemList({code: "settingType"}).then(data => {
  197. settingTypeList.value = data;
  198. });
  199. getDictionaryItemList({code: "queryType"}).then(data => {
  200. queryTypeList.value = data;
  201. });
  202. const show = (record: any) => {
  203. if(record==null) {
  204. record = {...defaultValue} ;
  205. }
  206. dataModel.value =record;
  207. title.value = "主题字段定义";
  208. visible.value = true;
  209. };
  210. const handleOk = () => {
  211. props.onSave(dataModel.value);
  212. visible.value=false;
  213. };
  214. const handleCancel = () => {
  215. visible.value = false;
  216. };
  217. watch(
  218. () => [dataModel.value.fieldCode,dataModel.value.fieldAlias,dataModel.value.foreignKey,dataModel.value.referencesTab,dataModel.value.displayColumn],
  219. () => {
  220. code.value=` select 主表.*,${dataModel.value.referencesTab}.${dataModel.value.displayColumn} as ${dataModel.value.fieldAlias} from 主表 ` +
  221. `inner join ${dataModel.value.referencesTab} on 主表.${dataModel.value.fieldCode} =${dataModel.value.referencesTab}.${dataModel.value.foreignKey}`
  222. },
  223. );
  224. return {
  225. dataModel,
  226. modalFormRef,
  227. visible,title,options,code,oneDark,lang,
  228. confirmLoading,
  229. settingTypeList,
  230. DataTypeList,
  231. queryTypeList,
  232. show, handleOk,handleCancel,
  233. };
  234. },
  235. mounted() {
  236. },
  237. })
  238. </script>