set-auth-tree.vue 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. <!--
  2. 权限授权树组件
  3. @Author: linqian
  4. @Date: 2021-04-02 15:48
  5. -->
  6. <template>
  7. <div>
  8. <div class="tree">
  9. <p class="tree__title">
  10. {{ treeData.label
  11. }}<span v-if="showCheckbox"
  12. >(<span style="color: red">{{ selectNodesNum }}</span
  13. >/{{ treeData.total }})</span
  14. >
  15. </p>
  16. <div class="tree__content">
  17. <dg-tree
  18. ref="authTree"
  19. node-key="id"
  20. :props="props"
  21. :expand-on-click-node="true"
  22. :show-checkbox="showCheckbox"
  23. v-model="selectkeys"
  24. :data="treeData.nodes"
  25. :highlight-current="false"
  26. :default-expanded-keys="defaultExpandKeys"
  27. @check="handleCheckTree"
  28. >
  29. <span slot-scope="{ data }" class="tree-node">
  30. <span>
  31. <i class="el-icon-folder-opened" v-if="data.treeNode"></i>
  32. <i class="el-icon-document" v-else></i>
  33. <span>
  34. <span class="tree-node__name">{{ data.label }}</span>
  35. <!-- <span
  36. class="tree-node__operate"
  37. v-if="!data.treeNode && tab == 'TABLE'"
  38. @click="handleViewCheckList($event, data)"
  39. >查看数据资源</span
  40. > -->
  41. <el-popover placement="top-start" width="400" trigger="hover" :open-delay="1000">
  42. <div class="tip-box">
  43. <h3>{{ data.label }}</h3>
  44. <p>{{ data.desc }}</p>
  45. </div>
  46. <span slot="reference" v-if="data.desc"> ({{ data.desc }}</span>
  47. </el-popover>
  48. </span>
  49. </span>
  50. </span>
  51. </dg-tree>
  52. </div>
  53. </div>
  54. </div>
  55. </template>
  56. <script>
  57. import tableCheckLayer from "./table-check-layer";
  58. import { reactTree } from "@/api/data-auth"
  59. export default {
  60. props: {
  61. treeData: {
  62. type: Object
  63. },
  64. // true = 可勾选,数据授权使用
  65. // false = 只读。 授权查询使用
  66. showCheckbox: {
  67. type: Boolean,
  68. default: true
  69. },
  70. // 列授权 || 表授权
  71. tab: String,
  72. idcard: {
  73. type: String,
  74. default: ""
  75. },
  76. reactTree: Boolean,
  77. },
  78. activated() {},
  79. components: {},
  80. data() {
  81. return {
  82. props: {
  83. value: "id",
  84. label: "label",
  85. children: "child",
  86. isLeaf(data) {
  87. return data.treeNode !== true;
  88. }
  89. },
  90. selectkeys: [],
  91. selectNodesNum: 0,
  92. // 默认展开的节点
  93. defaultExpandKeys: []
  94. };
  95. },
  96. computed: {},
  97. watch: {
  98. // treeData: {
  99. // deep: true,
  100. // handler(val){
  101. // debugger
  102. // this.selectkeys = val.selectNodes ? val.selectNodes.map((item) => item.dataId) : [];
  103. // this.selectNodesNum = this.selectkeys.length;
  104. // console.log("selectkeys",this.selectkeys)
  105. // }
  106. // }
  107. },
  108. methods: {
  109. /**
  110. * @description: 复选框选中值
  111. * @param {object} data 当前选中数据
  112. * @param {array} checkedKeys 当前选中key集合
  113. */
  114. handleCheckTree(data, params) {
  115. this.getSelectKeys();
  116. // 勾选联动,点击数据资源分类和字段分类的数据会联动,点击其他的不联动
  117. if (data.classifyCode !== "DATA_LEVEL" && data.classifyCode !== "COLUMN_SECURITY_LEVEL" && data.classifyCode !== "COLUMN_RELATION_CATALOG") {
  118. let vo = {
  119. operateType: "",
  120. operateList: [],
  121. authList: []
  122. }
  123. console.log(this.oldSelectNodes)
  124. const currentCheckNodes = this.$refs.authTree.getCheckedNodes(true);
  125. if (currentCheckNodes.length > this.oldSelectNodes.length) {
  126. // 说明是新增节点
  127. vo.operateType = "ADD";
  128. for (let i = 0; i < currentCheckNodes.length; i++) {
  129. const {id, code, classifyCode} = currentCheckNodes[i];
  130. if (this.oldSelectNodes.filter(item => item.id == id) < 1) {
  131. vo.operateList.push({
  132. dataId: id,
  133. dataCode: code,
  134. classifyCode
  135. })
  136. }
  137. }
  138. } else {
  139. // 说明是取消节点
  140. vo.operateType = "DEL";
  141. for (let i = 0; i < this.oldSelectNodes.length; i++) {
  142. const {id, code, classifyCode} = this.oldSelectNodes[i];
  143. if (currentCheckNodes.filter(item => item.id == id) < 1) {
  144. vo.operateList.push({
  145. dataId: id,
  146. dataCode: code,
  147. classifyCode
  148. })
  149. }
  150. }
  151. }
  152. this.oldSelectNodes = currentCheckNodes;
  153. this.$emit("checkChange", vo)
  154. }
  155. },
  156. /**
  157. * @description: 获取选中的节点key
  158. */
  159. getSelectKeys() {
  160. this.selectkeys = this.$refs.authTree.getCheckedKeys(true);
  161. const selectNodes = this.$refs.authTree.getCheckedNodes(true);
  162. this.selectNodesNum = this.selectkeys.length;
  163. const nodes = selectNodes.map((item) => {
  164. return {
  165. dataCode: item.code,
  166. dataId: item.id,
  167. classifyCode: item.classifyCode
  168. };
  169. });
  170. this.$emit("getSelectNodes", {
  171. type: this.treeData.id,
  172. selectNodes: nodes
  173. });
  174. // return nodes
  175. },
  176. // 查看清单
  177. handleViewCheckList(e, data) {
  178. e.stopPropagation();
  179. const vm = this;
  180. const layer = this.$dgLayer({
  181. title: "数据资源列表",
  182. content: tableCheckLayer,
  183. props: {
  184. tab: vm.tab,
  185. resourceId: data.id
  186. },
  187. on: {
  188. success(params) {
  189. layer.close(layer.dialogIndex);
  190. }
  191. },
  192. cancel: function (index, layero) {
  193. // 关闭对应弹窗的ID
  194. layer.close(index);
  195. return false;
  196. },
  197. area: ["900px", "800px"]
  198. });
  199. }
  200. },
  201. created() {
  202. this.selectkeys = this.treeData.selectNodes ? this.treeData.selectNodes.map((item) => item.dataId) : [];
  203. const oldSelectNodes = this.$lodash.cloneDeep(this.treeData.selectNodes || []);
  204. this.oldSelectNodes = oldSelectNodes.map(item => {
  205. return {
  206. id: item.dataId,
  207. code: item.dataCode,
  208. classifyCode: item.classifyCode
  209. }
  210. })
  211. this.selectNodesNum = this.selectkeys.length;
  212. this.defaultExpandKeys = this.treeData.nodes[0] ? [this.treeData.nodes[0].id] : [];
  213. },
  214. mounted() {}
  215. };
  216. </script>
  217. <style lang='scss' scoped>
  218. .tree {
  219. &__title {
  220. font-weight: bold;
  221. font-size: 16px;
  222. line-height: 56px;
  223. }
  224. .tip-box {
  225. h3 {
  226. font-weight: bold;
  227. font-size: 16px;
  228. }
  229. p {
  230. font-size: 14px;
  231. }
  232. }
  233. .tree-node {
  234. text-overflow: ellipsis;
  235. overflow: hidden;
  236. white-space: nowrap;
  237. width: 92%;
  238. &__name {
  239. font-weight: bold;
  240. }
  241. &__operate {
  242. color: #1890ff;
  243. cursor: pointer;
  244. margin-left: 50px;
  245. }
  246. }
  247. }
  248. /deep/ .el-tree {
  249. margin-bottom: 10px;
  250. }
  251. </style>