CodeDesignPage.vue 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. <template>
  2. <div class="full-height page-container">
  3. <div class="spin">
  4. <div class="form-container">
  5. <Spin :spinning="pageLoading">
  6. <BasicForm @register="registerForm" :size="getFormSize">
  7. <template #addEditForm-connectionId="{ model }">
  8. <DatabaseSelect
  9. v-model:value="model.connectionId"
  10. :parameter="getDatabaseListParameter"
  11. />
  12. </template>
  13. <template #addEditForm-RelateTable="{ model }">
  14. <a-tag
  15. v-for="(table, index) in model.addendumTableList"
  16. :key="index"
  17. style="display: inline-block"
  18. @close="() => handleRemoveRelateTable(model.addendumTableList, index)"
  19. closable
  20. >
  21. {{ table.configName }}
  22. </a-tag>
  23. <Icon
  24. icon="ant-design:plus-outlined"
  25. :style="{ cursor: 'pointer' }"
  26. @click="() => openPageAddendumTableChoseModal(true, {})"
  27. />
  28. <PageAddendumTableChoseModal
  29. :select-table-list="model.relatedTableList"
  30. @ok="handleSetAddendumTable"
  31. @register="registerPageAddendumTableChoseModal"
  32. />
  33. </template>
  34. <template #addEditForm-syncTable>
  35. <a-button type="primary" :size="getButtonSize" @click="handleSyncTableData">
  36. {{ $t('generator.views.code.button.syncTableData') }}
  37. </a-button>
  38. </template>
  39. </BasicForm>
  40. <Divider />
  41. <a-tabs style="min-height: 400px" animated>
  42. <a-tab-pane key="1" :tab="$t('generator.views.code.title.dbMessage')">
  43. <TableFieldTable
  44. class="full-height"
  45. :data="computedTableData"
  46. :loading="dbDataLoading"
  47. />
  48. </a-tab-pane>
  49. <a-tab-pane key="2" :tab="$t('generator.views.code.title.tableSetting')">
  50. <PageTableSetting
  51. ref="pageTableSettingRef"
  52. :edit-data="editConfigData.codePageConfigList"
  53. :table-data="computedTableData"
  54. :loading="dbDataLoading"
  55. />
  56. </a-tab-pane>
  57. <a-tab-pane key="3" :tab="$t('generator.views.code.title.formSetting')">
  58. <PageFormSetting
  59. ref="pageFormSettingRef"
  60. :edit-data="editConfigData.codeFormConfigList"
  61. :table-data="computedTableData"
  62. :loading="dbDataLoading"
  63. />
  64. </a-tab-pane>
  65. <a-tab-pane key="4" :tab="$t('generator.views.code.title.searchSetting')">
  66. <PageSearchSetting
  67. ref="pageSearchSettingRef"
  68. :edit-data="editConfigData.codeSearchConfigList"
  69. :table-data="computedTableData"
  70. :loading="dbDataLoading"
  71. />
  72. </a-tab-pane>
  73. </a-tabs>
  74. </Spin>
  75. </div>
  76. <Divider />
  77. <div style="text-align: right">
  78. <a-button @click="loadConfigData">
  79. {{ $t('common.button.reload') }}
  80. </a-button>
  81. <a-button
  82. style="margin-left: 5px"
  83. :loading="saveLoading"
  84. v-permission="'db:codeConfig:save'"
  85. @click="handleSave"
  86. type="primary"
  87. >
  88. {{ $t('common.button.save') }}
  89. </a-button>
  90. </div>
  91. </div>
  92. </div>
  93. </template>
  94. <script lang="ts" setup>
  95. import { ref, watch, onMounted } from 'vue';
  96. import { useI18n } from '@/hooks/web/useI18n';
  97. import { useRouter, useRoute } from 'vue-router';
  98. import { BasicForm, useForm } from '@/components/Form';
  99. import { useSizeSetting } from '@/hooks/setting/UseSizeSetting';
  100. import { formSchemas } from './CodeDesignPage.config';
  101. import { getConfigByIdApi } from './CodeDesignPage.api';
  102. import { isString } from '@/utils/is';
  103. import { toNumber } from 'lodash-es';
  104. import { propTypes } from '@/utils/propTypes';
  105. import { useModal } from '@/components/Modal';
  106. import { Divider, Spin } from 'ant-design-vue';
  107. import { useLoadDbData, useSaveConfig } from './CodeDesignPageHook';
  108. import DatabaseSelect from './componenets/DatabaseSelect/DatabaseSelect.vue';
  109. import TableFieldTable from './componenets/TableFieldTable/TableFieldTable.vue';
  110. import PageTableSetting from './componenets/PageTableSetting/PageTableSetting.vue';
  111. import PageFormSetting from './componenets/PageFromSetting/PageFormSetting.vue';
  112. import PageSearchSetting from './componenets/PageSearchSetting/PageSearchSettingOld.vue';
  113. import { Icon } from '@/components/Icon';
  114. import PageAddendumTableChoseModal from './componenets/PageAddendumTableChoseModal.vue';
  115. const props = defineProps({
  116. configId: propTypes.oneOfType([propTypes.string, propTypes.number]),
  117. // 系统ID
  118. systemId: propTypes.oneOfType([propTypes.string, propTypes.number]),
  119. });
  120. const { t } = useI18n();
  121. const router = useRouter();
  122. const route = useRoute();
  123. const { getFormSize, getButtonSize } = useSizeSetting();
  124. const pageLoading = ref(false);
  125. const getDatabaseListParameter = () => {
  126. return {
  127. parameter: {
  128. 'systemId@=': props.systemId,
  129. },
  130. };
  131. };
  132. /**
  133. * 代码配置页面
  134. */
  135. const [registerForm, { validateFields, setFieldsValue }] = useForm({
  136. colon: true,
  137. schemas: formSchemas(t),
  138. showActionButtonGroup: false,
  139. baseColProps: {
  140. span: 6,
  141. },
  142. labelCol: {
  143. span: 8,
  144. },
  145. wrapperCol: {
  146. span: 15,
  147. },
  148. });
  149. const handleSetAddendumTable = (tableData) => {
  150. setFieldsValue({ addendumTableList: tableData });
  151. };
  152. const loadConfigData = async () => {
  153. try {
  154. pageLoading.value = true;
  155. let configId = props.configId;
  156. if (!configId) {
  157. return;
  158. }
  159. if (isString(configId)) {
  160. configId = toNumber(configId);
  161. }
  162. const result = await getConfigByIdApi(configId);
  163. await setFieldsValue(result);
  164. // 加载表格数据
  165. handleSyncTableData();
  166. const { codePageConfigList, codeFormConfigList, codeSearchConfigList } = result;
  167. editConfigData.value = {
  168. codePageConfigList,
  169. codeFormConfigList,
  170. codeSearchConfigList,
  171. };
  172. } finally {
  173. pageLoading.value = false;
  174. }
  175. };
  176. onMounted(() => {
  177. /**
  178. * 监控configId变化,更新数据
  179. */
  180. watch(
  181. () => props.configId,
  182. async (value) => {
  183. if (value) {
  184. loadConfigData();
  185. } else {
  186. setFieldsValue({
  187. systemId: props.systemId,
  188. });
  189. }
  190. },
  191. {
  192. immediate: true,
  193. },
  194. );
  195. });
  196. const { dbDataLoading, computedTableData, handleSyncTableData, isSyncRef, dbDataRef } =
  197. useLoadDbData(validateFields);
  198. const editConfigData = ref<any>({});
  199. const handleRemoveRelateTable = (dataList: any[], index: number) => {
  200. dataList.splice(index, 1);
  201. };
  202. const [registerPageAddendumTableChoseModal, { openModal: openPageAddendumTableChoseModal }] =
  203. useModal();
  204. const { handleSave, saveLoading, pageTableSettingRef, pageSearchSettingRef, pageFormSettingRef } =
  205. useSaveConfig(t, isSyncRef, validateFields, dbDataRef, (configId) => {
  206. const { query, path } = route;
  207. router.push({
  208. path: path,
  209. query: {
  210. ...query,
  211. configId,
  212. },
  213. });
  214. });
  215. </script>
  216. <style scoped lang="less">
  217. .page-container {
  218. :deep(.ant-divider) {
  219. margin: 5px 0;
  220. }
  221. .spin {
  222. height: 100%;
  223. padding: 10px;
  224. background: white;
  225. }
  226. .form-container {
  227. height: calc(100% - 42px);
  228. overflow: auto;
  229. }
  230. }
  231. </style>