Role.vue 4.6 KB

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