dfad9eeb50f3655424552d14e7288cd65d8faa7d.svn-base 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. <template>
  2. <a-card :bordered="false">
  3. <template v-if="this.departId">
  4. <a-spin :spinning="loading">
  5. <a-form>
  6. <a-form-item label='所拥有的权限'>
  7. <a-tree
  8. checkable
  9. @check="onCheck"
  10. :checkedKeys="checkedKeys"
  11. :treeData="treeData"
  12. @expand="onExpand"
  13. @select="onTreeNodeSelect"
  14. :selectedKeys="selectedKeys"
  15. :expandedKeys="expandedKeysss"
  16. :checkStrictly="checkStrictly"
  17. style="height:500px;overflow: auto;">
  18. <span slot="hasDatarule" slot-scope="{slotTitle,ruleFlag}">
  19. {{ slotTitle }}
  20. <a-icon v-if="ruleFlag" type="align-left" style="margin-left:5px;color: red;"></a-icon>
  21. </span>
  22. </a-tree>
  23. </a-form-item>
  24. </a-form>
  25. </a-spin>
  26. <div class="anty-form-btn">
  27. <a-dropdown style="float: left" :trigger="['click']" placement="topCenter">
  28. <a-menu slot="overlay">
  29. <!-- 简化Tree逻辑,使用默认checkStrictly为false的行为,即默认父子关联
  30. <a-menu-item key="1" @click="switchCheckStrictly(1)">父子关联</a-menu-item>
  31. <a-menu-item key="2" @click="switchCheckStrictly(2)">取消关联</a-menu-item>
  32. -->
  33. <a-menu-item key="3" @click="checkALL">全部勾选</a-menu-item>
  34. <a-menu-item key="4" @click="cancelCheckALL">取消全选</a-menu-item>
  35. <a-menu-item key="5" @click="expandAll">展开所有</a-menu-item>
  36. <a-menu-item key="6" @click="closeAll">合并所有</a-menu-item>
  37. </a-menu>
  38. <a-button>
  39. 树操作 <a-icon type="up" />
  40. </a-button>
  41. </a-dropdown>
  42. <a-button style="float: right" @click="handleSubmit" type="primary" htmlType="button" icon="form">保存</a-button>
  43. </div>
  44. </template>
  45. <a-card v-else :bordered="false" style="height:200px">
  46. <a-empty>
  47. <span slot="description"> 请先选择一个部门! </span>
  48. </a-empty>
  49. </a-card>
  50. <depart-datarule-modal ref="datarule"/>
  51. </a-card>
  52. </template>
  53. <script>
  54. import {queryTreeListForRole,queryDepartPermission,saveDepartPermission} from '@/api/api'
  55. import DepartDataruleModal from './DepartDataruleModal'
  56. export default {
  57. name: 'DepartAuthModal',
  58. components: { DepartDataruleModal },
  59. data(){
  60. return {
  61. departId:"",
  62. treeData: [],
  63. defaultCheckedKeys:[],
  64. checkedKeys:[],
  65. halfCheckedKeys:[],
  66. expandedKeysss:[],
  67. allTreeKeys:[],
  68. autoExpandParent: true,
  69. checkStrictly: false,
  70. title:"部门权限配置",
  71. visible: false,
  72. loading: false,
  73. selectedKeys:[]
  74. }
  75. },
  76. methods: {
  77. onTreeNodeSelect(id){
  78. if(id && id.length>0){
  79. this.selectedKeys = id
  80. }
  81. this.$refs.datarule.show(this.selectedKeys[0],this.departId)
  82. },
  83. onCheck (checkedKeys, { halfCheckedKeys }) {
  84. // 保存选中的和半选中的,后面保存的时候合并提交
  85. this.checkedKeys = checkedKeys
  86. this.halfCheckedKeys = halfCheckedKeys
  87. },
  88. show(departId){
  89. this.departId=departId
  90. this.loadData();
  91. },
  92. close () {
  93. this.reset()
  94. this.$emit('close');
  95. this.visible = false;
  96. },
  97. onExpand(expandedKeys){
  98. this.expandedKeysss = expandedKeys;
  99. this.autoExpandParent = false
  100. },
  101. reset () {
  102. this.expandedKeysss = []
  103. this.checkedKeys = []
  104. this.defaultCheckedKeys = []
  105. this.loading = false
  106. },
  107. expandAll () {
  108. this.expandedKeysss = this.allTreeKeys
  109. },
  110. closeAll () {
  111. this.expandedKeysss = []
  112. },
  113. checkALL () {
  114. this.checkedKeys = this.allTreeKeys
  115. },
  116. cancelCheckALL () {
  117. this.checkedKeys = []
  118. },
  119. handleCancel () {
  120. this.close()
  121. },
  122. handleSubmit() {
  123. let that = this;
  124. if(!that.departId){
  125. this.$message.warning('请点击选择一个部门!')
  126. }
  127. let checkedKeys = [...that.checkedKeys, ...that.halfCheckedKeys]
  128. const permissionIds = checkedKeys.join(",")
  129. let params = {
  130. departId:that.departId,
  131. permissionIds,
  132. lastpermissionIds:that.defaultCheckedKeys.join(","),
  133. };
  134. that.loading = true;
  135. saveDepartPermission(params).then((res)=>{
  136. if(res.success){
  137. that.$message.success(res.message);
  138. that.loading = false;
  139. that.loadData();
  140. }else {
  141. that.$message.error(res.message);
  142. that.loading = false;
  143. }
  144. })
  145. },
  146. convertTreeListToKeyLeafPairs(treeList, keyLeafPair = []) {
  147. for(const {key, isLeaf, children} of treeList) {
  148. keyLeafPair.push({key, isLeaf})
  149. if(children && children.length > 0) {
  150. this.convertTreeListToKeyLeafPairs(children, keyLeafPair)
  151. }
  152. }
  153. return keyLeafPair;
  154. },
  155. emptyCurrForm() {
  156. this.form.resetFields()
  157. },
  158. loadData(){
  159. this.loading = true;
  160. queryTreeListForRole().then((res) => {
  161. this.treeData = res.result.treeList
  162. this.allTreeKeys = res.result.ids
  163. const keyLeafPairs = this.convertTreeListToKeyLeafPairs(this.treeData)
  164. queryDepartPermission({departId:this.departId}).then((res)=>{
  165. // 过滤出 leaf node 即可,即选中的
  166. // Tree组件中checkStrictly默认为false的时候,选中子节点,父节点会自动设置选中或半选中
  167. // 保存 checkedKeys 以及 halfCheckedKeys 以便于未做任何操作时提交表单数据
  168. const checkedKeys = [...res.result].filter(key => {
  169. const keyLeafPair = keyLeafPairs.filter(item => item.key === key)[0]
  170. return keyLeafPair && keyLeafPair.isLeaf
  171. })
  172. const halfCheckedKeys = [...res.result].filter(key => {
  173. const keyLeafPair = keyLeafPairs.filter(item => item.key === key)[0]
  174. return keyLeafPair && !keyLeafPair.isLeaf
  175. })
  176. this.checkedKeys = [...checkedKeys];
  177. this.halfCheckedKeys = [...halfCheckedKeys]
  178. this.defaultCheckedKeys = [...halfCheckedKeys, ...checkedKeys];
  179. this.expandedKeysss = this.allTreeKeys;
  180. this.loading = false;
  181. })
  182. })
  183. }
  184. },
  185. }
  186. </script>
  187. <style scoped>
  188. </style>