users.vue 6.7 KB

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