LabelConfigDetails.vue 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. <template>
  2. <div
  3. v-if="dialogFormVisible"
  4. class="inner-container"
  5. >
  6. <el-page-header
  7. style="padding-top: 8px"
  8. @back="goBack"
  9. />
  10. <el-divider content-position="left">
  11. 属性信息
  12. </el-divider>
  13. <el-row :gutter="5">
  14. <el-col
  15. :span="8"
  16. class="attrInfo"
  17. >
  18. <el-tooltip
  19. v-if="dataForm.labelName.length > 20"
  20. :content="dataForm.labelName"
  21. class="item"
  22. effect="dark"
  23. placement="bottom-start"
  24. >
  25. <span>标签名称: {{ ellipsis(dataForm.labelName, 20) }}</span>
  26. </el-tooltip>
  27. <span v-else>标签名称: {{ ellipsis(dataForm.labelName, 20) }}</span>
  28. </el-col>
  29. <el-col
  30. :span="8"
  31. class="attrInfo"
  32. >
  33. <el-tooltip
  34. v-if="dataForm.labelType.length > 20"
  35. :content="dataForm.labelType"
  36. class="item"
  37. effect="dark"
  38. placement="bottom-start"
  39. >
  40. <span>标签类型: {{ ellipsis(dataForm.labelType, 20) }}</span>
  41. </el-tooltip>
  42. <span v-else>标签类型: {{ ellipsis(dataForm.labelType, 20) }}</span>
  43. </el-col>
  44. <el-col
  45. :span="8"
  46. class="attrInfo"
  47. >
  48. <el-tooltip
  49. v-if="dataForm.labelDesc.length > 20"
  50. :content="dataForm.labelDesc"
  51. class="item"
  52. effect="dark"
  53. placement="bottom-start"
  54. >
  55. <span>标签说明: {{ ellipsis(dataForm.labelDesc, 20) }}</span>
  56. </el-tooltip>
  57. <span v-else>标签说明: {{ ellipsis(dataForm.labelDesc, 20) }}</span>
  58. </el-col>
  59. <el-col
  60. :span="8"
  61. class="attrInfo"
  62. >
  63. <el-tooltip
  64. v-if="dataForm.createBy && dataForm.createBy.length > 20"
  65. :content="dataForm.createBy"
  66. class="item"
  67. effect="dark"
  68. placement="bottom-start"
  69. >
  70. <span>创建人: {{ ellipsis(dataForm.createBy, 20) }}</span>
  71. </el-tooltip>
  72. <span v-else>创建人: {{ ellipsis(dataForm.createBy, 20) }}</span>
  73. </el-col>
  74. <el-col
  75. :span="16"
  76. class="attrInfo"
  77. >
  78. <el-tooltip
  79. v-if="dataForm.createDate.length > 20"
  80. :content="dataForm.createDate"
  81. class="item"
  82. effect="dark"
  83. placement="bottom-start"
  84. >
  85. <span>创建时间: {{ ellipsis(dataForm.createDate, 20) }}</span>
  86. </el-tooltip>
  87. <span v-else>创建时间: {{ ellipsis(dataForm.createDate, 20) }}</span>
  88. </el-col>
  89. <el-col
  90. :span="8"
  91. class="attrInfo"
  92. >
  93. <el-tooltip
  94. v-if="dataForm.updateBy && dataForm.updateBy.length > 20"
  95. :content="dataForm.updateBy"
  96. class="item"
  97. effect="dark"
  98. placement="bottom-start"
  99. >
  100. <span>修改人: {{ ellipsis(dataForm.updateBy, 20) }}</span>
  101. </el-tooltip>
  102. <span v-else>修改人: {{ ellipsis(dataForm.updateBy, 20) }}</span>
  103. </el-col>
  104. <el-col
  105. :span="8"
  106. class="attrInfo"
  107. >
  108. <el-tooltip
  109. v-if="dataForm.updateDate.length > 20"
  110. :content="dataForm.updateDate"
  111. class="item"
  112. effect="dark"
  113. placement="bottom-start"
  114. >
  115. <span>修改时间: {{ ellipsis(dataForm.updateDate, 20) }}</span>
  116. </el-tooltip>
  117. <span v-else>修改时间: {{ ellipsis(dataForm.updateDate, 20) }}</span>
  118. </el-col>
  119. </el-row>
  120. <el-divider content-position="left">
  121. 关联数据集信息
  122. </el-divider>
  123. <div style="width:90%" id="container" />
  124. </div>
  125. </template>
  126. <script>
  127. import G6 from '@antv/g6'
  128. import { getLabelDetail } from 'packages/js/utils/LabelConfigService'
  129. export default {
  130. name: 'LabelConfigDetails',
  131. data () {
  132. return {
  133. dialogFormVisible: false,
  134. dataForm: {
  135. createBy: '',
  136. createDate: '',
  137. updateBy: '',
  138. updateDate: '',
  139. labelDesc: '',
  140. labelName: '',
  141. labelType: ''
  142. },
  143. jsonData: {},
  144. chartHeight: 0,
  145. chartWidth: 0
  146. }
  147. },
  148. methods: {
  149. ellipsis (value, len) {
  150. if (!value) return ''
  151. if (value.length > len) {
  152. return value.slice(0, len) + '...'
  153. }
  154. return value
  155. },
  156. init (row) {
  157. this.dialogFormVisible = true
  158. getLabelDetail(row.id).then((r) => {
  159. this.jsonData = r.jsonData
  160. if (r.jsonData.nodes.length > 1) {
  161. this.chartHeight = r.jsonData.nodes.length * 100
  162. } else {
  163. this.chartHeight = 200
  164. }
  165. this.dataForm = r
  166. this.chartWidth = r.labelName.length * 20
  167. this.$nextTick(() => {
  168. this.initG6(r.jsonData)
  169. })
  170. })
  171. },
  172. goBack () {
  173. this.dialogFormVisible = false
  174. this.$nextTick(() => {
  175. this.$parent.labelVisible = true
  176. this.$parent.getDataList()
  177. })
  178. },
  179. nodeEach (nodes) {
  180. nodes.forEach(node => {
  181. if (!node.style) {
  182. node.style = {}
  183. }
  184. switch (node.class) {
  185. case 'c1': {
  186. node.shape = 'circle'
  187. node.size = 40
  188. break
  189. }
  190. case 'c3': {
  191. node.shape = 'rect'
  192. // node.size = [80, 50];
  193. node.style = {
  194. stroke: '#FFFFFF',
  195. fill: '#DFE1E3'
  196. }
  197. break
  198. }
  199. case 'c0': {
  200. node.shape = 'ellipse'
  201. node.size = [80, 40]
  202. break
  203. }
  204. case 'c2': {
  205. node.shape = 'diamond'
  206. node.size = [60, 60]
  207. break
  208. }
  209. }
  210. })
  211. },
  212. // 初始化G6
  213. initG6 (json) {
  214. const data = json
  215. const width = document.getElementById('container').scrollWidth
  216. this.nodeEach(data.nodes)
  217. const tooltip = new G6.Tooltip({
  218. offsetX: 10,
  219. offsetY: 0,
  220. fixToNode: [1, 0],
  221. itemTypes: ['node', 'edge'],
  222. getContent: (e) => {
  223. const outDiv = document.createElement('div')
  224. outDiv.style.width = 'fit-content'
  225. outDiv.innerHTML = `<div style='width: 200px;'>${e.item.getModel()._label}</div>`
  226. return outDiv
  227. },
  228. shouldBegin: (e) => {
  229. let res = true
  230. if (e.item.getModel()._label && e.item.getModel()._label.length > 12) {
  231. res = true
  232. } else {
  233. res = false
  234. }
  235. return res
  236. }
  237. })
  238. const graph = new G6.Graph({
  239. container: 'container',
  240. // width: '800',
  241. height: this.chartHeight,
  242. plugins: [tooltip],
  243. // modes: {
  244. // default: ['drag-canvas', 'zoom-canvas', 'click-select']
  245. // },
  246. defaultNode: {
  247. type: 'rect',
  248. size: [150, 50],
  249. style: {
  250. fill: '#9ACAFF',
  251. stroke: '#FFFFFF'
  252. }
  253. },
  254. // 连线类型及样式
  255. defaultEdge: {
  256. type: 'line',
  257. style: {
  258. offset: 25,
  259. endArrow: true,
  260. lineWidth: 2,
  261. stroke: '#333'
  262. }
  263. }
  264. })
  265. data.nodes.forEach(node => {
  266. node._label = node.label
  267. if (node.label.length > 12) {
  268. node.label = node.label.substr(0, 9) + '...'
  269. }
  270. })
  271. graph.data(data)
  272. graph.render()
  273. }
  274. }
  275. }
  276. </script>
  277. <style scoped>
  278. .inner-container{
  279. overflow-x: hidden;
  280. }
  281. .el-col {
  282. height: 35px;
  283. }
  284. .attrInfo {
  285. padding-left: 20px !important;
  286. }
  287. </style>