table_data.vue 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. <script lang="ts" setup name="table_data">
  2. import { getTableDataByList, getTableFieldsByList } from '@/api/database/dbApi'
  3. interface TreeNode {
  4. label: string
  5. isLeaf: boolean
  6. children?: TreeNode[]
  7. }
  8. const state = reactive({
  9. layoutMode: 'table',
  10. sqlStatement: '',
  11. treeData: [] as TreeNode[],
  12. dataList: [],
  13. curPage: 1,
  14. })
  15. const getTableFields = async (tableName = '') => {
  16. const res = await getTableFieldsByList(tableName)
  17. state.dataList = res.data
  18. }
  19. function handleTreeNodeClick(data: any) {
  20. if (data.isLeaf) {
  21. getTableFields(data.label)
  22. }
  23. }
  24. const init = async () => {
  25. const { data } = await getTableDataByList()
  26. const children: TreeNode[] = []
  27. data.forEach((item: any) => {
  28. children.push({
  29. isLeaf: true,
  30. label: item,
  31. })
  32. })
  33. state.treeData = [
  34. {
  35. label: '数据库表',
  36. isLeaf: false,
  37. children,
  38. },
  39. ]
  40. if (data && data.length > 0) {
  41. const res = await getTableFieldsByList(data[0])
  42. state.dataList = res.data
  43. }
  44. }
  45. onMounted(() => {
  46. init()
  47. })
  48. defineExpose({
  49. init,
  50. })
  51. </script>
  52. <template>
  53. <div class="page-main">
  54. <LayoutContainer left-side-width="300px" hide-left-side-toggle>
  55. <template #leftSide>
  56. <el-scrollbar class="tree">
  57. <div v-if="state.layoutMode !== 'sql'">
  58. <el-tree :data="state.treeData" default-expand-all highlight-current @node-click="handleTreeNodeClick">
  59. <template #default="{ node, data }">
  60. <div class="custom-tree-node">
  61. <div class="label" :title="node.label">
  62. <el-icon v-if="data.isLeaf" size="16px" style="margin-right: 5px;">
  63. <svg-icon name="ep:tickets" />
  64. </el-icon>
  65. <div class="text">
  66. {{ data.label }}
  67. </div>
  68. </div>
  69. </div>
  70. </template>
  71. </el-tree>
  72. </div>
  73. </el-scrollbar>
  74. </template>
  75. <div class="container">
  76. <el-table ref="table" class="list-table" :data="state.dataList" border stripe highlight-current-row>
  77. <el-table-column prop="comment" label="comment" />
  78. <el-table-column prop="defaultValue" label="defaultValue" />
  79. <el-table-column prop="extra" label="extra" />
  80. <el-table-column prop="fieldName" label="fieldName" />
  81. <el-table-column prop="accident_cat_id" label="accident_cat_id" />
  82. <el-table-column prop="fieldType" label="fieldType" />
  83. <el-table-column prop="key" label="key" />
  84. <el-table-column prop="nullable" label="nullable" />
  85. <el-table-column label="操作" width="200" align="center">
  86. <template #default>
  87. <el-button type="danger" size="small" plain>
  88. 删除
  89. </el-button>
  90. </template>
  91. </el-table-column>
  92. </el-table>
  93. <el-pagination v-model:current-page="state.curPage" :total="100" layout="total, sizes, ->, prev, pager, next, jumper" style="padding:10px 0" />
  94. </div>
  95. </layoutcontainer>
  96. </div>
  97. </template>
  98. <style lang="scss" scoped>
  99. .container {
  100. height: 100%;
  101. display: flex;
  102. flex-direction: column;
  103. }
  104. .page-main {
  105. :deep(.left-side) {
  106. display: flex;
  107. flex-direction: column;
  108. height: 100%;
  109. .tree {
  110. flex: 1;
  111. overflow-y: auto;
  112. .el-tree {
  113. .el-tree-node__content {
  114. height: 26px;
  115. }
  116. .el-tree-node__expand-icon.is-leaf{
  117. padding: 0;
  118. }
  119. .is-current > .el-tree-node__content {
  120. background-color: var(--el-color-primary-light-9);
  121. }
  122. .custom-tree-node {
  123. flex: 1;
  124. position: relative;
  125. width: 0;
  126. height: 100%;
  127. display: flex;
  128. flex-direction: column;
  129. justify-content: center;
  130. .label {
  131. display: inline-flex;
  132. align-items: center;
  133. width: calc(100% - 10px);
  134. color: var(--el-text-color-primary);
  135. .text {
  136. @include text-overflow;
  137. }
  138. }
  139. &:hover {
  140. .actions {
  141. display: block;
  142. }
  143. }
  144. .actions {
  145. display: none;
  146. position: absolute;
  147. right: 10px;
  148. top: 50%;
  149. transform: translateY(-50%);
  150. .el-button {
  151. padding: 5px 8px;
  152. }
  153. }
  154. }
  155. }
  156. }
  157. }
  158. .rightSide{
  159. padding: 0 10px;
  160. flex: 1;
  161. max-height: calc(100vh - 180px);
  162. overflow-y: auto;
  163. background-color: var(--g-app-bg);
  164. .toolBar{
  165. text-align: right;
  166. .el-icon {
  167. color: #606266;
  168. margin: 0 20px;
  169. font-size: 1.5em;
  170. vertical-align: middle;
  171. }
  172. }
  173. }
  174. }
  175. </style>