RoleManage.vue 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. <template>
  2. <div class="RoleManage">
  3. <header_local />
  4. <div style="padding: 0.5em">
  5. <br />
  6. <el-form :inline="true" :model="dataCol" class="demo-form-inline">
  7. <el-form-item label="用户名">
  8. <el-input
  9. v-model="dataCol.keyword"
  10. placeholder="请输入用户名"
  11. clearable
  12. />
  13. </el-form-item>
  14. <el-form-item>
  15. <el-button type="primary" @click="getRoleList">查询</el-button>
  16. <el-button type="primary" @click="showRoleD">新增角色</el-button>
  17. </el-form-item>
  18. </el-form>
  19. <br />
  20. <el-table
  21. :data="dataCol.roleList"
  22. style="width: 100%"
  23. :header-cell-style="{
  24. backgroundColor: '#f4f5f7',
  25. color: '#606266',
  26. }"
  27. ref="table1"
  28. align="center"
  29. empty-text="暂无数据"
  30. >
  31. <el-table-column prop="name" label="角色" />
  32. <el-table-column fixed="right" label="权限">
  33. <template #default="scoped">
  34. {{ scoped.row.menus.map(v => v.title).join(',') }}
  35. </template>
  36. </el-table-column>
  37. <el-table-column fixed="right" label="操作">
  38. <template #default="scoped">
  39. <el-popconfirm
  40. @confirm="() => deleteRole(scoped)"
  41. title="确定删除角色?"
  42. >
  43. <template #reference>
  44. <el-button type="primary" link>删除</el-button>
  45. </template>
  46. </el-popconfirm>
  47. <el-button
  48. link
  49. type="primary"
  50. @click.prevent="() => showRoleD(scoped)"
  51. >
  52. 修改
  53. </el-button>
  54. </template>
  55. </el-table-column>
  56. </el-table>
  57. </div>
  58. <el-pagination
  59. @current-change="e => changePageDisseminate(e)"
  60. background
  61. layout="prev, pager, next"
  62. :page-count="Math.ceil(dataCol.total / dataCol.size) || 1"
  63. />
  64. <!-- 新增/修改角色 -->
  65. <el-dialog v-model="showRole" title="角色">
  66. <el-form :model="dataCol" label-width="120px" status-icon>
  67. <el-form-item label="角色名">
  68. <el-input v-model="dataCol.roleName" />
  69. </el-form-item>
  70. <el-form-item label="菜单" prop="menu">
  71. <el-select
  72. multiple
  73. collapse-tags
  74. v-model="dataCol.menu"
  75. class="m-2"
  76. placeholder="选择菜单"
  77. >
  78. <el-option
  79. :label="item.title"
  80. :value="item.id"
  81. v-for="item in dataCol.menuList"
  82. :key="item.id"
  83. />
  84. </el-select>
  85. </el-form-item>
  86. <el-form-item>
  87. <el-button type="primary" @click="saveRole"> 确定 </el-button>
  88. </el-form-item>
  89. </el-form>
  90. </el-dialog>
  91. </div>
  92. </template>
  93. <script setup>
  94. import { reactive, ref } from 'vue';
  95. import header_local from './components/header.vue';
  96. import { ElMessage } from 'element-plus';
  97. import {
  98. getRoleListApi,
  99. deleteUserApi,
  100. getMenuApi,
  101. addRoleApi,
  102. chagneRoleApi,
  103. } from '@/api/index';
  104. const showRole = ref(false);
  105. const dataCol = reactive({
  106. keyword: '',
  107. roleName: '',
  108. roleList: [],
  109. page: 1,
  110. size: 15,
  111. total: 0,
  112. menu: [],
  113. menuList: [],
  114. });
  115. getMenuApi().then(r => {
  116. dataCol.menuList = r || [];
  117. });
  118. const getRoleList = () => {
  119. getRoleListApi({
  120. keyword: dataCol.keyword,
  121. page: dataCol.page,
  122. pageSize: dataCol.size,
  123. }).then(r => {
  124. dataCol.roleList = r && r.records ? r.records : [];
  125. dataCol.total = r && r.total ? r.total : 0;
  126. });
  127. };
  128. const changePageDisseminate = page => {
  129. dataCol.page = page;
  130. getRoleList();
  131. };
  132. const showRoleD = data => {
  133. showRole.value = true;
  134. dataCol.id = !data ? '' : data.row.roleId;
  135. dataCol.menu = !data ? [] : data.row.menus.map(v => v.id);
  136. dataCol.roleName = !data ? '' : data.row.name;
  137. };
  138. const deleteRole = scoped => {
  139. deleteUserApi({
  140. id: scoped.row.roleId,
  141. }).then(() => {
  142. getRoleList();
  143. });
  144. };
  145. const saveRole = () => {
  146. if (!dataCol.roleName || !dataCol.menu.length)
  147. return ElMessage.error('请输入角色名或选择对应权限');
  148. if (!dataCol.id)
  149. addRoleApi({
  150. name: dataCol.roleName,
  151. menuId: dataCol.menu,
  152. }).then(() => {
  153. showRole.value = false;
  154. dataCol.menu = [];
  155. dataCol.roleName = '';
  156. getRoleList();
  157. });
  158. else
  159. chagneRoleApi({
  160. id: dataCol.id,
  161. name: dataCol.roleName,
  162. menuId: dataCol.menu,
  163. }).then(() => {
  164. showRole.value = false;
  165. dataCol.menu = [];
  166. dataCol.roleName = '';
  167. getRoleList();
  168. });
  169. };
  170. getRoleList();
  171. document.title = '角色管理';
  172. </script>
  173. <style scoped></style>