index.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  1. <template>
  2. <div class="sys-database-container">
  3. <el-card shadow="hover" :body-style="{ paddingBottom: '0' }">
  4. <el-form :model="state.queryParams" ref="queryForm" :inline="true" v-loading="state.loading">
  5. <el-form-item label="库名">
  6. <el-select v-model="state.configId" placeholder="库名" filterable @change="handleQueryTable">
  7. <el-option v-for="item in state.dbData" :key="item" :label="item" :value="item" />
  8. </el-select>
  9. </el-form-item>
  10. <el-form-item label="表名">
  11. <el-select v-model="state.tableName" placeholder="表名" filterable clearable @change="handleQueryColumn">
  12. <el-option v-for="item in state.tableData" :key="item.name" :label="item.name + '[' + item.description + ']'" :value="item.name" />
  13. </el-select>
  14. </el-form-item>
  15. <el-form-item>
  16. <el-button-group>
  17. <el-button icon="ele-Plus" type="primary" @click="openAddTable"> 增加表 </el-button>
  18. <el-button icon="ele-Edit" @click="openEditTable"> 编辑表 </el-button>
  19. <el-button icon="ele-Delete" type="danger" @click="delTable"> 删除表 </el-button>
  20. <el-button icon="ele-View" @click="visualTable"> 可视化 </el-button>
  21. </el-button-group>
  22. <el-button-group style="padding-left: 10px">
  23. <el-button icon="ele-Plus" @click="openAddColumn"> 增加列 </el-button>
  24. <el-button icon="ele-Plus" @click="openGenDialog"> 生成实体 </el-button>
  25. <el-button icon="ele-Plus" @click="openGenSeedDataDialog"> 生成种子 </el-button>
  26. </el-button-group>
  27. </el-form-item>
  28. </el-form>
  29. </el-card>
  30. <el-card class="full-table" shadow="hover" style="margin-top: 5px">
  31. <el-table :data="state.columnData" style="width: 100%" v-loading="state.loading1" border>
  32. <el-table-column type="index" label="序号" width="55" align="center" />
  33. <el-table-column prop="dbColumnName" label="字段名" align="center" show-overflow-tooltip />
  34. <el-table-column prop="dataType" label="数据类型" align="center" show-overflow-tooltip />
  35. <el-table-column prop="isPrimarykey" label="主键" width="70" align="center" show-overflow-tooltip>
  36. <template #default="scope">
  37. <el-tag type="success" v-if="scope.row.isPrimarykey === true">是</el-tag>
  38. <el-tag type="info" v-else>否</el-tag>
  39. </template>
  40. </el-table-column>
  41. <el-table-column prop="isIdentity" label="自增" width="70" align="center" show-overflow-tooltip>
  42. <template #default="scope">
  43. <el-tag type="success" v-if="scope.row.isIdentity === true">是</el-tag>
  44. <el-tag type="info" v-else>否</el-tag>
  45. </template>
  46. </el-table-column>
  47. <el-table-column prop="isNullable" label="可空" width="70" align="center" show-overflow-tooltip>
  48. <template #default="scope">
  49. <el-tag v-if="scope.row.isNullable === true">是</el-tag>
  50. <el-tag type="info" v-else>否</el-tag>
  51. </template>
  52. </el-table-column>
  53. <el-table-column prop="length" label="长度" width="70" align="center" show-overflow-tooltip />
  54. <el-table-column prop="decimalDigits" label="精度" width="70" align="center" show-overflow-tooltip />
  55. <el-table-column prop="defaultValue" label="默认值" align="center" show-overflow-tooltip />
  56. <el-table-column prop="columnDescription" label="描述" header-align="center" show-overflow-tooltip />
  57. <el-table-column label="操作" width="145" fixed="right" align="center" show-overflow-tooltip>
  58. <template #default="scope">
  59. <el-button icon="ele-Edit" size="small" text type="primary" @click="openEditColumn(scope.row)"> 编辑 </el-button>
  60. <el-button icon="ele-Delete" size="small" text type="danger" @click="delColumn(scope.row)"> 删除 </el-button>
  61. </template>
  62. </el-table-column>
  63. </el-table>
  64. </el-card>
  65. <EditTable ref="editTableRef" @handleQueryTable="handleQueryTable" />
  66. <EditColumn ref="editColumnRef" @handleQueryColumn="handleQueryColumn" />
  67. <AddTable ref="addTableRef" @addTableSubmitted="addTableSubmitted" />
  68. <AddColumn ref="addColumnRef" @handleQueryColumn="handleQueryColumn" />
  69. <GenEntity ref="genEntityRef" @handleQueryColumn="handleQueryColumn" :application-namespaces="state.appNamespaces" />
  70. <GenSeedData ref="genSeedDataRef" :application-namespaces="state.appNamespaces" />
  71. </div>
  72. </template>
  73. <script lang="ts" setup name="sysDatabase">
  74. import { onMounted, reactive, ref } from 'vue';
  75. import { ElMessageBox, ElMessage } from 'element-plus';
  76. import { useRouter } from 'vue-router';
  77. import EditTable from '/@/views/system/database/component/editTable.vue';
  78. import EditColumn from '/@/views/system/database/component/editColumn.vue';
  79. import AddTable from '/@/views/system/database/component/addTable.vue';
  80. import AddColumn from '/@/views/system/database/component/addColumn.vue';
  81. import GenEntity from '/@/views/system/database/component/genEntity.vue';
  82. import GenSeedData from '/@/views/system/database/component/genSeedData.vue';
  83. import { getAPI } from '/@/utils/axios-utils';
  84. import { SysDatabaseApi, SysCodeGenApi } from '/@/api-services/api';
  85. import { DbColumnOutput, DbTableInfo, DbColumnInput, DeleteDbTableInput, DeleteDbColumnInput } from '/@/api-services/models';
  86. const editTableRef = ref<InstanceType<typeof EditTable>>();
  87. const editColumnRef = ref<InstanceType<typeof EditColumn>>();
  88. const addTableRef = ref<InstanceType<typeof AddTable>>();
  89. const addColumnRef = ref<InstanceType<typeof AddColumn>>();
  90. const genEntityRef = ref<InstanceType<typeof GenEntity>>();
  91. const genSeedDataRef = ref<InstanceType<typeof GenSeedData>>();
  92. const router = useRouter();
  93. const state = reactive({
  94. loading: false,
  95. loading1: false,
  96. dbData: [] as any,
  97. configId: '',
  98. tableData: [] as Array<DbTableInfo>,
  99. tableName: '',
  100. columnData: [] as Array<DbColumnOutput>,
  101. queryParams: {
  102. name: undefined,
  103. code: undefined,
  104. },
  105. editPosTitle: '',
  106. appNamespaces: [] as Array<String>, // 存储位置
  107. });
  108. onMounted(async () => {
  109. state.loading = true;
  110. var res = await getAPI(SysDatabaseApi).apiSysDatabaseListGet();
  111. state.dbData = res.data.result;
  112. state.loading = false;
  113. let appNamesRes = await getAPI(SysCodeGenApi).apiSysCodeGenApplicationNamespacesGet();
  114. state.appNamespaces = appNamesRes.data.result as Array<string>;
  115. });
  116. // 增加表
  117. const addTableSubmitted = (e: any) => {
  118. handleQueryTable();
  119. state.tableName = e;
  120. handleQueryColumn();
  121. };
  122. // 表查询操作
  123. const handleQueryTable = async () => {
  124. state.tableName = '';
  125. state.columnData = [];
  126. state.loading = true;
  127. var res = await getAPI(SysDatabaseApi).apiSysDatabaseTableListConfigIdGet(state.configId);
  128. state.tableData = res.data.result ?? [];
  129. state.loading = false;
  130. };
  131. // 列查询操作
  132. const handleQueryColumn = async () => {
  133. state.columnData = [];
  134. if (state.tableName == '') return;
  135. state.loading1 = true;
  136. var res = await getAPI(SysDatabaseApi).apiSysDatabaseColumnListTableNameConfigIdGet(state.tableName, state.configId);
  137. state.columnData = res.data.result ?? [];
  138. state.loading1 = false;
  139. };
  140. // 打开表编辑页面
  141. const openEditTable = () => {
  142. if (state.configId == '' || state.tableName == '') {
  143. ElMessage({
  144. type: 'error',
  145. message: `请选择库名和表名!`,
  146. });
  147. return;
  148. }
  149. var res = state.tableData.filter((u: any) => u.name == state.tableName);
  150. var table: any = {
  151. configId: state.configId,
  152. tableName: state.tableName,
  153. oldTableName: state.tableName,
  154. description: res[0].description,
  155. };
  156. editTableRef.value?.openDialog(table);
  157. };
  158. // 打开实体生成页面
  159. const openGenDialog = () => {
  160. if (state.configId == '' || state.tableName == '') {
  161. ElMessage({
  162. type: 'error',
  163. message: `请选择库名和表名!`,
  164. });
  165. return;
  166. }
  167. // var res = state.tableData.filter((u: any) => u.name == state.tableName);
  168. var table: any = {
  169. configId: state.configId,
  170. tableName: state.tableName,
  171. position: state.appNamespaces[0],
  172. };
  173. genEntityRef.value?.openDialog(table);
  174. };
  175. // 生成种子数据页面
  176. const openGenSeedDataDialog = () => {
  177. if (state.configId == '' || state.tableName == '') {
  178. ElMessage({
  179. type: 'error',
  180. message: `请选择库名和表名!`,
  181. });
  182. return;
  183. }
  184. var table: any = {
  185. configId: state.configId,
  186. tableName: state.tableName,
  187. position: state.appNamespaces[0],
  188. };
  189. genSeedDataRef.value?.openDialog(table);
  190. };
  191. // 打开表增加页面
  192. const openAddTable = () => {
  193. if (state.configId == '') {
  194. ElMessage({
  195. type: 'error',
  196. message: `请选择库名!`,
  197. });
  198. return;
  199. }
  200. var table: any = {
  201. configId: state.configId,
  202. tableName: '',
  203. oldTableName: '',
  204. description: '',
  205. };
  206. addTableRef.value?.openDialog(table);
  207. };
  208. // 打开列编辑页面
  209. const openEditColumn = (row: any) => {
  210. var column: any = {
  211. configId: state.configId,
  212. tableName: row.tableName,
  213. columnName: row.dbColumnName,
  214. oldColumnName: row.dbColumnName,
  215. description: row.columnDescription,
  216. };
  217. editColumnRef.value?.openDialog(column);
  218. };
  219. // 打开列增加页面
  220. const openAddColumn = () => {
  221. if (state.configId == '' || state.tableName == '') {
  222. ElMessage({
  223. type: 'error',
  224. message: `请选择库名和表名!`,
  225. });
  226. return;
  227. }
  228. const addRow: DbColumnInput = {
  229. configId: state.configId,
  230. tableName: state.tableName,
  231. columnDescription: '',
  232. dataType: '',
  233. dbColumnName: '',
  234. decimalDigits: 0,
  235. isIdentity: 0,
  236. isNullable: 0,
  237. isPrimarykey: 0,
  238. length: 0,
  239. // key: 0,
  240. // editable: true,
  241. // isNew: true,
  242. };
  243. addColumnRef.value?.openDialog(addRow);
  244. };
  245. // 删除表
  246. const delTable = () => {
  247. if (state.tableName == '') {
  248. ElMessage({
  249. type: 'error',
  250. message: `请选择表名!`,
  251. });
  252. return;
  253. }
  254. ElMessageBox.confirm(`确定删除表:【${state.tableName}】?`, '提示', {
  255. confirmButtonText: '确定',
  256. cancelButtonText: '取消',
  257. type: 'warning',
  258. })
  259. .then(async () => {
  260. const deleteDbTableInput: DeleteDbTableInput = {
  261. configId: state.configId,
  262. tableName: state.tableName,
  263. };
  264. await getAPI(SysDatabaseApi).apiSysDatabaseDeleteTablePost(deleteDbTableInput);
  265. handleQueryTable();
  266. ElMessage.success('表删除成功');
  267. })
  268. .catch(() => {});
  269. };
  270. // 删除列
  271. const delColumn = (row: any) => {
  272. ElMessageBox.confirm(`确定删除列:【${row.dbColumnName}】?`, '提示', {
  273. confirmButtonText: '确定',
  274. cancelButtonText: '取消',
  275. type: 'warning',
  276. })
  277. .then(async () => {
  278. const eleteDbColumnInput: DeleteDbColumnInput = {
  279. configId: state.configId,
  280. tableName: state.tableName,
  281. dbColumnName: row.dbColumnName,
  282. };
  283. await getAPI(SysDatabaseApi).apiSysDatabaseDeleteColumnPost(eleteDbColumnInput);
  284. handleQueryTable();
  285. ElMessage.success('列删除成功');
  286. })
  287. .catch(() => {});
  288. };
  289. // 可视化表
  290. const visualTable = () => {
  291. //if (state.configId == '') {
  292. // ElMessage({
  293. // type: 'error',
  294. // message: `请选择库名!`,
  295. // });
  296. // return;
  297. //}
  298. router.push(`/develop/database/visual?configId=${state.configId}`);
  299. };
  300. </script>