Role.vue 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. <script setup lang="ts">
  2. import type { BasicForm, ICRUD } from '@/types/form'
  3. import { getUserList } from '@/api/user'
  4. import { createRole, getRoleList, delRole, createRoleUser, getRoleUserList, delRoleUser } from '@/api/role'
  5. const CRUD: ICRUD = {
  6. create(data: any) {
  7. return createRole(data)
  8. },
  9. update(data: any) {
  10. return createRole(data)
  11. },
  12. getList(data: any) {
  13. return getRoleList({
  14. name: '',
  15. ...data
  16. })
  17. },
  18. delete(data: any) {
  19. return delRole({ ids: data.id })
  20. },
  21. deleteBatch(data: any) {
  22. return delRole(data)
  23. }
  24. }
  25. const formConfig = reactive<BasicForm>({
  26. span: 24,
  27. formItems: [
  28. {
  29. label: '角色名称',
  30. value: '',
  31. name: 'name',
  32. type: 'input',
  33. rules: [{ required: true, message: '请输入角色名称', trigger: 'blur' }],
  34. search: true
  35. },
  36. {
  37. label: '英文名称',
  38. value: '',
  39. name: 'enname',
  40. type: 'input',
  41. rules: [{ required: true, message: '请输入角色英文名称', trigger: 'blur' }]
  42. }
  43. ]
  44. })
  45. const curRole = ref<any>(null)
  46. // const handleRole = (row: any) => {
  47. // curRole.value = row
  48. // }
  49. const handleUser = (row: any) => {
  50. curRole.value = row
  51. userRef.value?.refresh()
  52. }
  53. // 用户table
  54. const UserCRUD: ICRUD = {
  55. create(data: any) {
  56. return createRoleUser(data)
  57. },
  58. update(data: any) {
  59. return createRoleUser(data)
  60. },
  61. getList(data: any) {
  62. return getRoleUserList({ id: curRole.value.id, ...data }).then((res: any) => {
  63. slectedUser.value = res.rows.map((item: any) => item.id)
  64. return res
  65. })
  66. },
  67. delete(data: any) {
  68. return delRoleUser({ roleId: curRole.value.id, userId: data.id })
  69. }
  70. }
  71. const userFormConfig = reactive<BasicForm>({
  72. span: 24,
  73. formItems: []
  74. })
  75. const dialogVisible = ref(false)
  76. const slectedUser = ref<any>([])
  77. const userList = ref<any>([])
  78. const userRef = ref<any>(null)
  79. const handleAddUser = () => {
  80. dialogVisible.value = true
  81. getUserList({
  82. pageSize: -1
  83. }).then((res: any) => {
  84. userList.value = res.rows
  85. })
  86. }
  87. const closeDialog = () => {
  88. dialogVisible.value = false
  89. }
  90. const handleSubmit = () => {
  91. createRoleUser({
  92. role: { id: curRole.value.id },
  93. ids: slectedUser.value
  94. }).then(() => {
  95. userRef.value.refresh()
  96. dialogVisible.value = false
  97. })
  98. }
  99. </script>
  100. <template>
  101. <el-row :gutter="16" class="h-full">
  102. <el-col :span="curRole ? 12 : 24" class="h-full">
  103. <pro-table :crud="CRUD" :formConfig="formConfig" :tableConfig="{ operateWidth: 220 }">
  104. <vxe-column field="name" title="角色名称"></vxe-column>
  105. <vxe-column field="enname" title="英文名称"></vxe-column>
  106. <template #operateBefore="{ row }">
  107. <!-- <el-button type="primary" size="small" @click="handleRole(row)">角色授权</el-button> -->
  108. <el-button type="primary" size="small" @click="handleUser(row)">分配用户</el-button>
  109. </template>
  110. </pro-table>
  111. </el-col>
  112. <el-col :span="12" v-if="curRole">
  113. <el-card class="h-full" shadow="never" :body-style="{ height: '100%', padding: 0 }">
  114. <template #header>
  115. <div class="flex justify-between">
  116. <div>分配用户</div>
  117. <el-button icon="back" link @click="curRole = null">关闭</el-button>
  118. </div>
  119. </template>
  120. <pro-table
  121. ref="userRef"
  122. height="calc(100% - 53px)"
  123. :crud="UserCRUD"
  124. :formConfig="userFormConfig"
  125. :showToolbar="false"
  126. :tableConfig="{ operateWidth: 100, showEdit: false }"
  127. :selection="false"
  128. >
  129. <template #header>
  130. <div class="mb-20px">
  131. <el-button type="primary" @click="handleAddUser">添加用户</el-button>
  132. </div>
  133. </template>
  134. <vxe-column field="name" title="登录名"></vxe-column>
  135. <vxe-column field="name" title="姓名"></vxe-column>
  136. <vxe-column field="phone" title="手机号"></vxe-column>
  137. </pro-table>
  138. </el-card>
  139. </el-col>
  140. </el-row>
  141. <el-dialog v-model="dialogVisible" title="添加用户" @close="closeDialog">
  142. <el-transfer
  143. v-model="slectedUser"
  144. :data="userList"
  145. :titles="['用户列表', '已选用户']"
  146. :props="{ key: 'id', label: 'name' }"
  147. />
  148. <template #footer>
  149. <el-button icon="Close" @click="closeDialog">取消</el-button>
  150. <el-button icon="Check" type="primary" @click="handleSubmit">保存</el-button>
  151. </template>
  152. </el-dialog>
  153. </template>
  154. <style lang="scss" scoped></style>