index.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  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" disabled> 删除表 </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. appNamespaces: [] as Array<String>, // 存储位置
  106. });
  107. onMounted(async () => {
  108. state.loading = true;
  109. var res = await getAPI(SysDatabaseApi).apiSysDatabaseListGet();
  110. state.dbData = res.data.result;
  111. state.loading = false;
  112. let appNamesRes = await getAPI(SysCodeGenApi).apiSysCodeGenApplicationNamespacesGet();
  113. state.appNamespaces = appNamesRes.data.result as Array<string>;
  114. });
  115. // 增加表
  116. const addTableSubmitted = (e: any) => {
  117. handleQueryTable();
  118. state.tableName = e;
  119. handleQueryColumn();
  120. };
  121. // 表查询操作
  122. const handleQueryTable = async () => {
  123. state.tableName = '';
  124. state.columnData = [];
  125. state.loading = true;
  126. var res = await getAPI(SysDatabaseApi).apiSysDatabaseTableListConfigIdGet(state.configId);
  127. let tableData = res.data.result ?? [];
  128. tableData.forEach((element: any) => {
  129. //排除zero_开头的表
  130. if (!element.name.startsWith('zero_')) {
  131. state.tableData.push(element);
  132. }
  133. });
  134. state.loading = false;
  135. };
  136. // 列查询操作
  137. const handleQueryColumn = async () => {
  138. state.columnData = [];
  139. if (state.tableName == '' || typeof state.tableName == 'undefined') return;
  140. state.loading1 = true;
  141. state.tableData = [];
  142. var res = await getAPI(SysDatabaseApi).apiSysDatabaseColumnListTableNameConfigIdGet(state.tableName, state.configId);
  143. state.columnData = res.data.result ?? [];
  144. state.loading1 = false;
  145. };
  146. // 打开表编辑页面
  147. const openEditTable = () => {
  148. if (state.configId == '' || state.tableName == '') {
  149. ElMessage({
  150. type: 'error',
  151. message: `请选择库名和表名!`,
  152. });
  153. return;
  154. }
  155. var res = state.tableData.filter((u: any) => u.name == state.tableName);
  156. var table: any = {
  157. configId: state.configId,
  158. tableName: state.tableName,
  159. oldTableName: state.tableName,
  160. description: res[0].description,
  161. };
  162. editTableRef.value?.openDialog(table);
  163. };
  164. // 打开实体生成页面
  165. const openGenDialog = () => {
  166. if (state.configId == '' || state.tableName == '') {
  167. ElMessage({
  168. type: 'error',
  169. message: `请选择库名和表名!`,
  170. });
  171. return;
  172. }
  173. // var res = state.tableData.filter((u: any) => u.name == state.tableName);
  174. var table: any = {
  175. configId: state.configId,
  176. tableName: state.tableName,
  177. position: state.appNamespaces[0],
  178. };
  179. genEntityRef.value?.openDialog(table);
  180. };
  181. // 生成种子数据页面
  182. const openGenSeedDataDialog = () => {
  183. if (state.configId == '' || state.tableName == '') {
  184. ElMessage({
  185. type: 'error',
  186. message: `请选择库名和表名!`,
  187. });
  188. return;
  189. }
  190. var table: any = {
  191. configId: state.configId,
  192. tableName: state.tableName,
  193. position: state.appNamespaces[0],
  194. };
  195. genSeedDataRef.value?.openDialog(table);
  196. };
  197. // 打开表增加页面
  198. const openAddTable = () => {
  199. if (state.configId == '') {
  200. ElMessage({
  201. type: 'error',
  202. message: `请选择库名!`,
  203. });
  204. return;
  205. }
  206. var table: any = {
  207. configId: state.configId,
  208. tableName: '',
  209. oldTableName: '',
  210. description: '',
  211. };
  212. addTableRef.value?.openDialog(table);
  213. };
  214. // 打开列编辑页面
  215. const openEditColumn = (row: any) => {
  216. var column: any = {
  217. configId: state.configId,
  218. tableName: row.tableName,
  219. columnName: row.dbColumnName,
  220. oldColumnName: row.dbColumnName,
  221. description: row.columnDescription,
  222. };
  223. editColumnRef.value?.openDialog(column);
  224. };
  225. // 打开列增加页面
  226. const openAddColumn = () => {
  227. if (state.configId == '' || state.tableName == '') {
  228. ElMessage({
  229. type: 'error',
  230. message: `请选择库名和表名!`,
  231. });
  232. return;
  233. }
  234. const addRow: DbColumnInput = {
  235. configId: state.configId,
  236. tableName: state.tableName,
  237. columnDescription: '',
  238. dataType: '',
  239. dbColumnName: '',
  240. decimalDigits: 0,
  241. isIdentity: 0,
  242. isNullable: 0,
  243. isPrimarykey: 0,
  244. length: 0,
  245. // key: 0,
  246. // editable: true,
  247. // isNew: true,
  248. };
  249. addColumnRef.value?.openDialog(addRow);
  250. };
  251. // 删除表
  252. const delTable = () => {
  253. if (state.tableName == '') {
  254. ElMessage({
  255. type: 'error',
  256. message: `请选择表名!`,
  257. });
  258. return;
  259. }
  260. ElMessageBox.confirm(`确定删除表:【${state.tableName}】?`, '提示', {
  261. confirmButtonText: '确定',
  262. cancelButtonText: '取消',
  263. type: 'warning',
  264. })
  265. .then(async () => {
  266. const deleteDbTableInput: DeleteDbTableInput = {
  267. configId: state.configId,
  268. tableName: state.tableName,
  269. };
  270. await getAPI(SysDatabaseApi).apiSysDatabaseDeleteTablePost(deleteDbTableInput);
  271. handleQueryTable();
  272. ElMessage.success('表删除成功');
  273. })
  274. .catch(() => {});
  275. };
  276. // 删除列
  277. const delColumn = (row: any) => {
  278. ElMessageBox.confirm(`确定删除列:【${row.dbColumnName}】?`, '提示', {
  279. confirmButtonText: '确定',
  280. cancelButtonText: '取消',
  281. type: 'warning',
  282. })
  283. .then(async () => {
  284. const eleteDbColumnInput: DeleteDbColumnInput = {
  285. configId: state.configId,
  286. tableName: state.tableName,
  287. dbColumnName: row.dbColumnName,
  288. };
  289. await getAPI(SysDatabaseApi).apiSysDatabaseDeleteColumnPost(eleteDbColumnInput);
  290. handleQueryTable();
  291. ElMessage.success('列删除成功');
  292. })
  293. .catch(() => {});
  294. };
  295. // 可视化表
  296. const visualTable = () => {
  297. if (state.configId == '') {
  298. ElMessage({
  299. type: 'error',
  300. message: `请选择库名!`,
  301. });
  302. return;
  303. }
  304. router.push(`/develop/database/visual?configId=${state.configId}`);
  305. };
  306. </script>