role.vue 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. <!-- -->
  2. <template>
  3. <div class="hc-layout-box role-page">
  4. <hc-card :scrollbar="false" action-size="lg">
  5. <template #extra>
  6. <el-button color="#20C98B" type="primary" @click="addClick">
  7. <hc-icon name="add" class="text-white" />
  8. <span class="text-white">新增</span>
  9. </el-button>
  10. <el-button color="#FF6C6C" :disabled="tableCheckedKeys.length === 0" @click="batchDelClick">
  11. <hc-icon name="delete-bin-2" class="text-white" />
  12. <span class="text-white">删除</span>
  13. </el-button>
  14. </template>
  15. <template #header>
  16. <div class="relative w-[300px]">
  17. <hc-search-input v-model="searchForm.roleName" color="#151921" text="搜索" @search="searchClick" />
  18. </div>
  19. </template>
  20. <hc-table
  21. :check-style="{ fixed: true, width: 29 }" :index-style="{ fixed: true, width: 60 }" is-check is-index is-children
  22. class="role-page-table" :column="tableColumn" :datas="tableData" @selection-change="tableSelectionChange"
  23. >
  24. <template #action="{ row }">
  25. <el-link type="success" @click="rowEditClick(row)">
  26. <hc-icon name="edit" />编辑
  27. </el-link>
  28. <el-link type="success" @click="rowDelClick(row)">
  29. <hc-icon name="delete-bin-2" />删除
  30. </el-link>
  31. </template>
  32. </hc-table>
  33. <template #action>
  34. <hc-pages :pages="searchForm" @change="pageChange" />
  35. </template>
  36. </hc-card>
  37. </div>
  38. <hc-dialog v-model="addModal" :title="modalTitle" widths="50rem" :loading="addsaveLoading" @save="modalSave">
  39. <div class="hc-flex">
  40. <hc-icon name="user" style="font-size: 18px;" class="font-bold" />
  41. <span class="ml-1 font-bold">基础信息</span>
  42. </div>
  43. <el-divider style="margin-top: 10px;" />
  44. <el-form ref="formRef" :inline="true" :model="baseForm" label-width="auto" :rules="baseFormRules">
  45. <div class="hc-form-item">
  46. <el-form-item label="角色名称:" prop="roleName">
  47. <el-input v-model="baseForm.roleName" placeholder="请输入" clearable />
  48. </el-form-item>
  49. </div>
  50. </el-form>
  51. <div class="hc-flex mt-4">
  52. <hc-icon name="user-settings" style="font-size: 18px;" class="font-bold" />
  53. <span class="ml-1 font-bold">权限设置</span>
  54. </div>
  55. <el-divider class="mt-[10px]" />
  56. <el-tree ref="treeRef" style="max-width: 600px" :data="roleTreedata" show-checkbox node-key="id" highlight-current :props="defaultProps" :default-checked-keys="defaultCheckedKeys" />
  57. </hc-dialog>
  58. </template>
  59. <script setup>
  60. import { onMounted, ref } from 'vue'
  61. import { HcDelMsg } from 'hc-vue3-ui'
  62. import { getList, getRole, grant, remove } from '~api/system/role.js'
  63. import { arrToId, formValidate, getArrValue } from 'js-fast-way'
  64. import menuApi from '~api/system/menu'
  65. onMounted(()=>{
  66. getTableData()
  67. })
  68. const tableColumn = [
  69. { key: 'roleName', name: '角色名称' },
  70. { key: 'action', name: '操作', align:'center', width: 200 },
  71. ]
  72. const tableData = ref([])
  73. const addModal = ref(false)
  74. const modalTitle = ref('新增')
  75. const addClick = ()=>{
  76. modalTitle.value = '新增'
  77. addModal.value = true
  78. baseForm.value = {}
  79. defaultCheckedKeys.value = []
  80. getRoleTreedata()
  81. }
  82. const baseForm = ref({ roleName:'' })
  83. const baseFormRules = {
  84. roleName: {
  85. required: true,
  86. trigger: 'blur',
  87. message: '请输入角色名称',
  88. },
  89. }
  90. const tableCheckedKeys = ref([])
  91. //多选事件
  92. const tableSelectionChange = (rows) => {
  93. tableCheckedKeys.value = rows
  94. }
  95. //搜索表单
  96. //搜索表单
  97. const searchForm = ref({ roleName: null, current: 1, size: 20 })
  98. const tableLoading = ref(false)
  99. const getTableData = async () => {
  100. tableLoading.value = true
  101. const { error, code, data } = await getList({
  102. ...searchForm.value,
  103. })
  104. tableLoading.value = false
  105. if (!error && code === 200) {
  106. tableData.value = getArrValue(data)
  107. } else {
  108. tableData.value = []
  109. }
  110. }
  111. const searchClick = () => {
  112. getTableData()
  113. }
  114. //分页被点击
  115. const pageChange = ({ current, size }) => {
  116. searchForm.value.current = current
  117. searchForm.value.size = size
  118. getTableData()
  119. }
  120. const rowEditClick = (row)=>{
  121. modalTitle.value = '编辑'
  122. addModal.value = true
  123. baseForm.value = { ...row }
  124. getRoleDetail(row.id)
  125. getRoleTreedata()
  126. }
  127. const getRoleDetail = async (id)=>{
  128. const { error, code, data } = await getRole(id)
  129. if (!error && code === 200) {
  130. defaultCheckedKeys.value = data['menu']
  131. } else {
  132. defaultCheckedKeys.value = []
  133. }
  134. }
  135. const rowDelClick = (row)=>{
  136. HcDelMsg( async ( resolve) => {
  137. await removeRole(row.id)
  138. resolve() //关闭弹窗的回调
  139. })
  140. }
  141. const batchDelClick = ()=>{
  142. let ids = arrToId(tableCheckedKeys.value)
  143. HcDelMsg(async (resolve) => {
  144. await removeRole(ids)
  145. resolve() //关闭弹窗的回调
  146. })
  147. }
  148. const removeRole = async (ids) => {
  149. const { error, code, msg } = await remove(ids)
  150. if (!error && code === 200) {
  151. window?.$message?.success('删除成功')
  152. getTableData()
  153. } else {
  154. window.$message.error(msg ?? '操作失败')
  155. }
  156. }
  157. const treeRef = ref(null)
  158. const defaultProps = {
  159. children: 'children',
  160. label: 'title',
  161. }
  162. const defaultCheckedKeys = ref([])
  163. const roleTreedata = ref([])
  164. const getRoleTreedata = async () => {
  165. const { error, code, data } = await menuApi.getMenuTree()
  166. if (!error && code === 200) {
  167. roleTreedata.value = getArrValue(data)
  168. } else {
  169. roleTreedata.value = []
  170. }
  171. }
  172. const addsaveLoading = ref(false)
  173. const formRef = ref(null)
  174. const modalSave = async ()=>{
  175. let menuIds = treeRef.value.getCheckedKeys()
  176. const isValidate = await formValidate(formRef.value)
  177. if (!isValidate) return false
  178. addsaveLoading.value = true
  179. const { error, code, msg } = await grant({
  180. roleName:baseForm.value.roleName,
  181. roleIds:[baseForm.value.id],
  182. menuIds:menuIds,
  183. })
  184. //判断状态
  185. addsaveLoading.value = false
  186. if (!error && code === 200) {
  187. window?.$message?.success(msg)
  188. addModal.value = false
  189. getTableData()
  190. } else {
  191. window.$message.error(msg ?? '操作失败')
  192. }
  193. }
  194. </script>
  195. <style lang='scss' scoped>
  196. .hc-layout-box{
  197. position: relative;
  198. height: 100%;
  199. width: 100%;
  200. }
  201. </style>