users.vue 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. <template>
  2. <div class="mainContentBox">
  3. <avue-crud
  4. ref="crudRef"
  5. v-model="form"
  6. v-model:page="page"
  7. v-model:search="search"
  8. :data="data"
  9. :option="option"
  10. @search-change="searchChange"
  11. @search-reset="resetChange"
  12. @size-change="dataList"
  13. @current-change="dataList"
  14. @row-save="createRow"
  15. >
  16. <template #menu="{ row }">
  17. <el-button text type="primary" @click="editPermission(row)"
  18. >分配角色
  19. </el-button>
  20. </template>
  21. </avue-crud>
  22. <!-- 分配菜单弹窗 -->
  23. <el-dialog v-model="menuDialogVisible" title="权限分配" width="700px">
  24. <el-scrollbar v-loading="loading" max-height="600px">
  25. <el-button type="primary" @click="toggleCheckAll">全选</el-button>
  26. <el-button @click="resetChecked">清空</el-button>
  27. <el-tree
  28. ref="treeRef"
  29. :data="menuList"
  30. :default-expand-all="false"
  31. :props="{
  32. children: 'childs',
  33. label: 'roleName',
  34. value: 'id',
  35. disabled: '',
  36. }"
  37. node-key="id"
  38. show-checkbox
  39. style="margin-top: 20px"
  40. >
  41. <template #default="{ data }">
  42. {{ data.roleName }}
  43. </template>
  44. </el-tree>
  45. </el-scrollbar>
  46. <template #footer>
  47. <div class="dialog-footer">
  48. <el-button type="primary" @click="handleRoleMenuSubmit"
  49. >确 定
  50. </el-button>
  51. <el-button @click="menuDialogVisible = false">取 消</el-button>
  52. </div>
  53. </template>
  54. </el-dialog>
  55. </div>
  56. </template>
  57. <script setup>
  58. import { ref } from "vue";
  59. import { useCrud } from "@/hooks/userCrud";
  60. import {
  61. addSystemUserMenu,
  62. allRoleList,
  63. bindedUserRoleList,
  64. bindRoleMenuList,
  65. bindRoleUserList,
  66. systemMenuList,
  67. systemUserMenuList,
  68. treeList,
  69. } from "@/api/user/index";
  70. // 传入一个url,后面不带/
  71. const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
  72. useCrud({
  73. src: "/api/v1/syn/user/info",
  74. });
  75. const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } =
  76. Methords; //增删改查
  77. const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
  78. const { checkBtnPerm, downloadTemplate, exportData } = Utils; //按钮权限等工具
  79. const crudRef = ref(null); //crudRef.value 获取avue-crud对象
  80. const deptList = ref([]); //部门列表
  81. const getDeptList = async () => {
  82. let res = await treeList();
  83. if (res && res.code == 200) {
  84. deptList.value = res.data ?? []; //获取部门列表
  85. }
  86. };
  87. // 设置表格列或者其他自定义的option
  88. option.value = Object.assign(option.value, {
  89. editBtn: false, //是否显示编辑按钮
  90. delBtn: false, //是否显示删除按钮
  91. addBtn: true, //是否显示新增按钮
  92. viewBtn: false, //是否显示查看按钮
  93. menu: false, //是否显示操作列
  94. column: [
  95. {
  96. label: "昵称",
  97. prop: "nickName",
  98. rules: [
  99. {
  100. required: true,
  101. message: "请输入昵称",
  102. trigger: "blur",
  103. },
  104. ],
  105. search: true,
  106. },
  107. {
  108. label: "账号编码",
  109. prop: "employeeCode",
  110. rules: [
  111. {
  112. required: true,
  113. message: "请输入账号编码",
  114. trigger: "blur",
  115. },
  116. ],
  117. search: true,
  118. },
  119. {
  120. label: "账号",
  121. prop: "userName",
  122. rules: [
  123. {
  124. required: true,
  125. message: "请输入账号",
  126. trigger: "blur",
  127. },
  128. ],
  129. search: true,
  130. },
  131. {
  132. label: "账号装填",
  133. prop: "state",
  134. type: "select", //类型为单选框
  135. dicData: [
  136. {
  137. label: "启用",
  138. value: 0,
  139. },
  140. {
  141. label: "禁用",
  142. value: 1,
  143. },
  144. {
  145. label: "锁定",
  146. value: 2,
  147. },
  148. ],
  149. value: 0,
  150. },
  151. {
  152. label: "性别",
  153. prop: "sex",
  154. search: true,
  155. type: "select", //类型为单选框
  156. dicData: [
  157. {
  158. label: "未知",
  159. value: 0,
  160. },
  161. {
  162. label: "男",
  163. value: 1,
  164. },
  165. {
  166. label: "女",
  167. value: 2,
  168. },
  169. ],
  170. value: 0,
  171. },
  172. {
  173. label: "部门名称",
  174. prop: "deptIds",
  175. type: "tree",
  176. dicData: deptList, // 使用树形结构数据
  177. props: {
  178. label: "deptName", // 显示的字段
  179. value: "id", // 传递给后端的字段
  180. children: "children", // 子节点字段
  181. },
  182. checkStrictly: true,
  183. multiple: true, // 支持多选
  184. showCheckbox: true, // 显示复选框
  185. search: true,
  186. valueformat: "array", // 确保值是数组格式
  187. },
  188. {
  189. label: "操作",
  190. prop: "menu",
  191. span: 24,
  192. },
  193. ],
  194. });
  195. // 编辑权限
  196. const currentUserId = ref("");
  197. const treeRef = ref(null);
  198. const menuDialogVisible = ref(false);
  199. const loading = ref(false);
  200. const menuList = ref([]);
  201. const editPermission = async (row) => {
  202. currentUserId.value = row.id;
  203. menuDialogVisible.value = true;
  204. treeRef.value && treeRef.value.setCheckedKeys([]);
  205. let allMenu = await allRoleList();
  206. menuList.value = allMenu.data ?? [];
  207. let selectMenu = await bindedUserRoleList(row.id);
  208. if (selectMenu.data && selectMenu.data.length > 0) {
  209. treeRef.value && treeRef.value.setCheckedKeys(selectMenu.data);
  210. }
  211. };
  212. const handleRoleMenuSubmit = async () => {
  213. loading.value = true;
  214. bindRoleUserList({
  215. userId: currentUserId.value,
  216. roleIds: treeRef.value.getCheckedKeys(),
  217. })
  218. .then(() => {
  219. ElMessage.success("权限分配成功");
  220. })
  221. .finally(() => {
  222. loading.value = false;
  223. menuDialogVisible.value = false;
  224. });
  225. };
  226. const toggleCheckAll = () => {
  227. const allKeys = menuList.value.map((item) => item.id);
  228. treeRef.value.setCheckedKeys(allKeys);
  229. };
  230. const resetChecked = () => {
  231. treeRef.value.setCheckedKeys([], false);
  232. };
  233. onMounted(() => {
  234. getDeptList(); //获取部门列表
  235. dataList();
  236. });
  237. </script>