AuthSet.vue 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. <script setup>
  2. import { apiSystemRole } from '@/api/system'
  3. // 获取角色
  4. const roleId = ref('')
  5. const roleArr = ref([])
  6. async function getRoleList() {
  7. const res = await apiSystemRole.roleAllList()
  8. if (res.Ret !== 200) return
  9. const list = res.Data.List || []
  10. roleArr.value = list
  11. roleId.value = list[0].SysRoleId
  12. handlRoleChange()
  13. }
  14. getRoleList()
  15. const isAdmin=computed(()=>{
  16. if(!roleArr.value.length) return false
  17. return roleArr.value.filter(item=>item.SysRoleId===roleId.value)[0].SysRoleName==='admin'
  18. })
  19. function disabledTree(arr){
  20. arr.forEach(item => {
  21. item.Disabled=true
  22. if(item.Children){
  23. disabledTree(item.Children)
  24. }
  25. });
  26. return arr
  27. }
  28. const checkboxTree=ref(null)
  29. const loading=ref(false)
  30. const defaultCheckedKeys = ref([])
  31. const authList = ref([])
  32. async function getRoleAuthData(){
  33. loading.value=true
  34. const res=await apiSystemRole.roleAuthList({
  35. SysRoleId:roleId.value
  36. })
  37. loading.value=false
  38. if(res.Ret!==200) return
  39. const allArr=res.Data?.List||[]
  40. if(isAdmin.value){
  41. console.log(disabledTree(allArr));
  42. authList.value=disabledTree(allArr)
  43. }else{
  44. authList.value=allArr
  45. }
  46. const arr=res.Data?.ChoiceList||[]
  47. const hArr=res.Data?.HalfChoiceList||[]
  48. defaultCheckedKeys.value=arr.filter(i=>{
  49. return !hArr.includes(i)
  50. })
  51. checkboxTree.value.setCheckedKeys(defaultCheckedKeys.value)
  52. }
  53. function handlRoleChange(){
  54. getRoleAuthData()
  55. }
  56. function handleSave(){
  57. const keys=checkboxTree.value.getCheckedKeys()
  58. const halfKeys=checkboxTree.value.getHalfCheckedKeys()
  59. if(!keys.length&&!halfKeys.length){
  60. ElMessage.warning('请至少选择一个权限')
  61. return
  62. }
  63. const cArr=Array.from(new Set([...keys,...halfKeys]))
  64. apiSystemRole.roleAuthSet({
  65. SysRoleId:roleId.value,
  66. SysMenuIds:cArr,
  67. HalfMenuIds:halfKeys
  68. }).then(res=>{
  69. if(res.Ret!==200) return
  70. ElMessage.success('保存成功')
  71. handlRoleChange()
  72. })
  73. }
  74. </script>
  75. <template>
  76. <div class="system-authset-page">
  77. <div class="shadow-box top-box">
  78. <div style="width: 300px; display: flex; align-items: center">
  79. <span style="flex-shrink: 0; margin-right: 20px">角色</span>
  80. <el-select v-model="roleId" placeholder="分配角色" @change="handlRoleChange">
  81. <el-option
  82. v-for="item in roleArr"
  83. :key="item.SysRoleId"
  84. :label="item.SysRoleName"
  85. :value="item.SysRoleId"
  86. >
  87. </el-option>
  88. </el-select>
  89. </div>
  90. <div v-if="!isAdmin">
  91. <el-button v-permission="'permission:cancel'" type="primary" plain @click="$router.back()">取消</el-button>
  92. <el-button v-permission="'permission:save'" type="primary" :disabled="loading" @click="handleSave">保存</el-button>
  93. </div>
  94. </div>
  95. <div class="shadow-box content-box" v-loading="loading" element-loading-text="loading...">
  96. <el-tree
  97. ref="checkboxTree"
  98. :data="authList"
  99. :props="{ label: 'Name', children: 'Children', disabled: 'Disabled' }"
  100. :default-expand-all="false"
  101. show-checkbox
  102. node-key="SysMenuId"
  103. :default-checked-keys="defaultCheckedKeys"
  104. >
  105. </el-tree>
  106. </div>
  107. </div>
  108. </template>
  109. <style lang="scss">
  110. .system-authset-page{
  111. .top-box {
  112. display: flex;
  113. justify-content: space-between;
  114. }
  115. .content-box {
  116. margin-top: 20px;
  117. .el-tree {
  118. border-top: 1px solid #e5e7ed;
  119. border-left: 1px solid #e5e7ed;
  120. border-right: 1px solid #e5e7ed;
  121. width: 98%;
  122. margin-bottom: 40px;
  123. .el-tree-node__label {
  124. margin: 10px;
  125. }
  126. .el-tree-node__content {
  127. min-width: 200px;
  128. width: 200px;
  129. white-space: normal;
  130. box-sizing: border-box;
  131. }
  132. .el-tree-node {
  133. .el-tree-node {
  134. .el-tree-node__children {
  135. width: 100%;
  136. }
  137. .el-tree-node {
  138. &:not(:first-child) {
  139. /* .el-tree-node__content{
  140. border-right: 1px solid #E5E7ED;
  141. } */
  142. border-top: 1px solid #e5e7ed;
  143. }
  144. .el-tree-node__content {
  145. border-right: 1px solid #e5e7ed;
  146. }
  147. }
  148. }
  149. }
  150. .el-tree-node__content {
  151. padding: 5px 10px !important;
  152. height: auto;
  153. .el-tree-node__expand-icon.el-icon-caret-right {
  154. //display: none;
  155. }
  156. }
  157. > .el-tree-node {
  158. padding: 0 !important;
  159. display: flex;
  160. border-bottom: 1px solid #e5e7ed;
  161. > .el-tree-node__children {
  162. width: 100%;
  163. > .el-tree-node {
  164. &:not(:first-child) {
  165. border-top: 1px solid #e5e7ed;
  166. }
  167. > .el-tree-node__content {
  168. border-left: 1px solid #e5e7ed;
  169. border-right: 1px solid #e5e7ed;
  170. }
  171. }
  172. }
  173. }
  174. .el-tree-node__children {
  175. display: flex;
  176. flex-direction: column;
  177. .el-tree-node {
  178. display: flex;
  179. flex: 1;
  180. padding: 0px !important;
  181. .el-tree-node__content {
  182. border-bottom: none;
  183. .custom-tree-node {
  184. height: 24px;
  185. display: flex;
  186. align-items: center;
  187. .tree-btn {
  188. margin-left: 10px;
  189. display: none;
  190. }
  191. .el-button {
  192. padding: 0px !important;
  193. border-radius: 4px;
  194. background: #363554;
  195. color: #ffffff;
  196. }
  197. }
  198. }
  199. .el-tree-node__children {
  200. .el-tree-node {
  201. &:not(:first-child) {
  202. .el-tree-node__content {
  203. //border-left: none;
  204. }
  205. }
  206. }
  207. }
  208. }
  209. }
  210. }
  211. }
  212. }
  213. </style>