DatasourceData.jsx 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. import React, { useEffect, useMemo, useState } from 'react'
  2. import styled from 'styled-components'
  3. import { Tree, Tabs, Table, Input } from 'antd'
  4. import { getTableData, getTableSchema } from '../services'
  5. import PropTypes from 'prop-types'
  6. const { DirectoryTree } = Tree
  7. const { TabPane } = Tabs
  8. const DatasourceWrapper = styled.div`
  9. display: flex;
  10. width: 100%;
  11. height: 700px;
  12. .datasource__tree {
  13. width: 30%;
  14. overflow: auto;
  15. background: #f3f3f3;
  16. // margin-top: 40px;
  17. padding-top: 20px;
  18. }
  19. .datasource__table {
  20. flex: 1;
  21. height: 100%;
  22. margin-left: 15px;
  23. overflow: auto;
  24. }
  25. `
  26. const { Search } = Input
  27. const DatasourceData = props => {
  28. const { data, datasourceId } = props
  29. // 表内容表头
  30. const [contentCols, setContentCols] = useState([])
  31. // 表内容表数据
  32. const [contentData, setContentData] = useState([])
  33. // 表内容表格Loading状态
  34. const [contentLoading, setContentLoading] = useState(false)
  35. // 表结构表头
  36. const [schemaCols, setScheamCols] = useState([])
  37. // 表结构表数据
  38. const [schemaData, setScheamData] = useState([])
  39. // 表结构表格Loading状态
  40. const [schemaLoading, setSchemaLoading] = useState(false)
  41. const [treeData, setTreeData] = useState([])
  42. const [baseData, setBaseData] = useState([])
  43. useMemo(() => {
  44. const treeList = data.map(item => {
  45. return {
  46. key: item,
  47. title: item,
  48. isLeaf: true,
  49. }
  50. })
  51. setTreeData(treeList)
  52. setBaseData(treeList)
  53. }, [data])
  54. useEffect(() => {
  55. if (treeData[0]) {
  56. onSelect(treeData[0].key)
  57. }
  58. }, [treeData])
  59. const onSelect = selectedKeys => {
  60. const params = {
  61. id: datasourceId,
  62. table_name: selectedKeys,
  63. }
  64. fetchTableData(params)
  65. fetchTableSchema(params)
  66. }
  67. const fetchTableData = async params => {
  68. setContentLoading(true)
  69. const { data } = await getTableData(params)
  70. if (data.code) {
  71. handleContent(data.data)
  72. }
  73. setContentLoading(false)
  74. }
  75. const fetchTableSchema = async params => {
  76. setSchemaLoading(true)
  77. const { data } = await getTableSchema(params)
  78. if (data.code) {
  79. handleSchema(data.data)
  80. }
  81. setSchemaLoading(false)
  82. }
  83. const handleContent = contentData => {
  84. const colsList = contentData?.header?.map(item => {
  85. return {
  86. title: item,
  87. dataIndex: item,
  88. key: item,
  89. }
  90. })
  91. const dataList = contentData?.content?.map((item, index) => {
  92. const row = {}
  93. row['key'] = index + 1
  94. item.forEach((val, index) => {
  95. const title = contentData.header[index]
  96. row[title] = val
  97. })
  98. return row
  99. })
  100. setContentCols(colsList)
  101. setContentData(dataList)
  102. }
  103. const handleSchema = schemaData => {
  104. const colsList = [
  105. {
  106. title: '序号',
  107. dataIndex: 'order',
  108. key: 'order',
  109. },
  110. {
  111. title: '字段',
  112. dataIndex: 'field',
  113. key: 'field',
  114. },
  115. {
  116. title: '属性',
  117. dataIndex: 'attribute',
  118. key: 'attribute',
  119. },
  120. ]
  121. const dataList = schemaData?.map((item, index) => {
  122. const row = {}
  123. row['key'] = index + 1
  124. const [order, field, attribute] = item.split(':')
  125. row['order'] = order
  126. row['field'] = field
  127. row['attribute'] = attribute
  128. return row
  129. })
  130. setScheamCols(colsList)
  131. setScheamData(dataList)
  132. }
  133. const onSearch = val => {
  134. const list = [...baseData]
  135. const filterData = list.filter(item => item.title.indexOf(val) > -1)
  136. setTreeData(filterData)
  137. }
  138. const tree = (
  139. <div className="datasource__tree">
  140. <Search
  141. style={{
  142. marginBottom: 8,
  143. }}
  144. placeholder="Search"
  145. onSearch={onSearch}
  146. />
  147. <DirectoryTree
  148. treeData={treeData}
  149. style={{
  150. background: '#f3f3f3',
  151. }}
  152. height={600}
  153. defaultSelectedKeys={[treeData[0]?.key]}
  154. onSelect={onSelect}
  155. />
  156. </div>
  157. )
  158. return (
  159. <DatasourceWrapper>
  160. {tree}
  161. <Tabs className="datasource__table" size={'small'}>
  162. <TabPane tab="预览表内容" key="content">
  163. <Table
  164. columns={contentCols}
  165. dataSource={contentData}
  166. bordered
  167. loading={contentLoading}
  168. scroll={{ x: 3500 }}
  169. />
  170. </TabPane>
  171. <TabPane tab="预览表结构" key="schema">
  172. <Table
  173. columns={schemaCols}
  174. dataSource={schemaData}
  175. bordered
  176. loading={schemaLoading}
  177. scroll={{ x: 3500 }}
  178. />
  179. </TabPane>
  180. </Tabs>
  181. </DatasourceWrapper>
  182. )
  183. }
  184. DatasourceData.propTypes = {
  185. data: PropTypes.array,
  186. datasourceId: PropTypes.number,
  187. }
  188. export default DatasourceData