You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1 lines
32 KiB
1 lines
32 KiB
{"ast":null,"code":"import { createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createTextVNode as _createTextVNode, toDisplayString as _toDisplayString, resolveDirective as _resolveDirective, createBlock as _createBlock, withDirectives as _withDirectives, createCommentVNode as _createCommentVNode } from \"vue\";\nconst _hoisted_1 = {\n class: \"user-management\"\n};\nconst _hoisted_2 = {\n class: \"card-header\"\n};\nconst _hoisted_3 = {\n class: \"search-area\"\n};\nconst _hoisted_4 = {\n class: \"search-row\"\n};\nconst _hoisted_5 = {\n class: \"search-buttons\"\n};\nconst _hoisted_6 = {\n class: \"table-container\"\n};\nconst _hoisted_7 = {\n class: \"pagination\"\n};\nconst _hoisted_8 = {\n class: \"dialog-footer\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_form_item = _resolveComponent(\"el-form-item\");\n const _component_el_option = _resolveComponent(\"el-option\");\n const _component_el_select = _resolveComponent(\"el-select\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_form = _resolveComponent(\"el-form\");\n const _component_el_table_column = _resolveComponent(\"el-table-column\");\n const _component_el_tag = _resolveComponent(\"el-tag\");\n const _component_el_table = _resolveComponent(\"el-table\");\n const _component_el_pagination = _resolveComponent(\"el-pagination\");\n const _component_el_card = _resolveComponent(\"el-card\");\n const _component_el_dialog = _resolveComponent(\"el-dialog\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createVNode(_component_el_card, null, {\n header: _withCtx(() => [_createElementVNode(\"div\", _hoisted_2, [_cache[10] || (_cache[10] = _createElementVNode(\"span\", {\n class: \"title\"\n }, \"用户管理\", -1 /* HOISTED */)), _createElementVNode(\"div\", _hoisted_3, [_createVNode(_component_el_form, {\n inline: true,\n model: $setup.searchForm,\n class: \"search-form\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_4, [_createVNode(_component_el_form_item, {\n label: \"用户名\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $setup.searchForm.username,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $setup.searchForm.username = $event),\n placeholder: \"请输入用户名\",\n clearable: \"\",\n onClear: $setup.handleSearch\n }, null, 8 /* PROPS */, [\"modelValue\"])]),\n _: 1 /* STABLE */\n }), _createVNode(_component_el_form_item, {\n label: \"真实姓名\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $setup.searchForm.realName,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => $setup.searchForm.realName = $event),\n placeholder: \"请输入真实姓名\",\n clearable: \"\",\n onClear: $setup.handleSearch\n }, null, 8 /* PROPS */, [\"modelValue\"])]),\n _: 1 /* STABLE */\n }), _createVNode(_component_el_form_item, {\n label: \"用户角色\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_select, {\n modelValue: $setup.searchForm.roleCode,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $setup.searchForm.roleCode = $event),\n placeholder: \"请选择角色\",\n clearable: \"\",\n onClear: $setup.handleSearch\n }, {\n default: _withCtx(() => [(_openBlock(), _createElementBlock(_Fragment, null, _renderList($setup.roleOptions, role => {\n return _createVNode(_component_el_option, {\n key: role.value,\n label: role.label,\n value: role.value\n }, null, 8 /* PROPS */, [\"label\", \"value\"]);\n }), 64 /* STABLE_FRAGMENT */))]),\n _: 1 /* STABLE */\n }, 8 /* PROPS */, [\"modelValue\"])]),\n _: 1 /* STABLE */\n }), _createElementVNode(\"div\", _hoisted_5, [_createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $setup.handleSearch\n }, {\n default: _withCtx(() => _cache[8] || (_cache[8] = [_createTextVNode(\"搜索\")])),\n _: 1 /* STABLE */\n }), _createVNode(_component_el_button, {\n onClick: $setup.resetSearch\n }, {\n default: _withCtx(() => _cache[9] || (_cache[9] = [_createTextVNode(\"重置\")])),\n _: 1 /* STABLE */\n })])])]),\n _: 1 /* STABLE */\n }, 8 /* PROPS */, [\"model\"])])])]),\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_6, [_withDirectives((_openBlock(), _createBlock(_component_el_table, {\n data: $setup.userList,\n style: {\n \"width\": \"100%\"\n }\n }, {\n default: _withCtx(() => [_createVNode(_component_el_table_column, {\n prop: \"id\",\n label: \"ID\",\n width: \"80\"\n }), _createVNode(_component_el_table_column, {\n prop: \"username\",\n label: \"用户名\"\n }), _createVNode(_component_el_table_column, {\n prop: \"realName\",\n label: \"真实姓名\"\n }), _createVNode(_component_el_table_column, {\n prop: \"email\",\n label: \"邮箱\"\n }), _createVNode(_component_el_table_column, {\n prop: \"roles\",\n label: \"角色\"\n }, {\n default: _withCtx(({\n row\n }) => [_createVNode(_component_el_tag, {\n type: $setup.getRoleTagType(row.roleCode),\n class: \"role-tag\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($setup.getRoleLabel(row.roleCode)), 1 /* TEXT */)]),\n _: 2 /* DYNAMIC */\n }, 1032 /* PROPS, DYNAMIC_SLOTS */, [\"type\"])]),\n _: 1 /* STABLE */\n }), _createVNode(_component_el_table_column, {\n prop: \"status\",\n label: \"状态\",\n width: \"100\"\n }, {\n default: _withCtx(({\n row\n }) => [_createVNode(_component_el_tag, {\n type: row.status === 1 ? 'success' : 'danger'\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(row.status === 1 ? '启用' : '禁用'), 1 /* TEXT */)]),\n _: 2 /* DYNAMIC */\n }, 1032 /* PROPS, DYNAMIC_SLOTS */, [\"type\"])]),\n _: 1 /* STABLE */\n }), _createVNode(_component_el_table_column, {\n prop: \"createTime\",\n label: \"创建时间\",\n width: \"180\"\n }), _createVNode(_component_el_table_column, {\n label: \"操作\",\n width: \"150\",\n fixed: \"right\"\n }, {\n default: _withCtx(({\n row\n }) => [_createVNode(_component_el_button, {\n type: \"primary\",\n link: \"\",\n onClick: $event => $setup.handleUpdateRole(row)\n }, {\n default: _withCtx(() => _cache[11] || (_cache[11] = [_createTextVNode(\" 修改角色 \")])),\n _: 2 /* DYNAMIC */\n }, 1032 /* PROPS, DYNAMIC_SLOTS */, [\"onClick\"])]),\n _: 1 /* STABLE */\n })]),\n _: 1 /* STABLE */\n }, 8 /* PROPS */, [\"data\"])), [[_directive_loading, $setup.loading]])]), _createElementVNode(\"div\", _hoisted_7, [_createVNode(_component_el_pagination, {\n \"current-page\": $setup.currentPage,\n \"onUpdate:currentPage\": _cache[3] || (_cache[3] = $event => $setup.currentPage = $event),\n \"page-size\": $setup.pageSize,\n \"onUpdate:pageSize\": _cache[4] || (_cache[4] = $event => $setup.pageSize = $event),\n \"page-sizes\": [10, 20, 50],\n total: $setup.total,\n layout: \"total, sizes, prev, pager, next\",\n onSizeChange: $setup.handleSizeChange,\n onCurrentChange: $setup.handleCurrentChange\n }, null, 8 /* PROPS */, [\"current-page\", \"page-size\", \"total\"])])]),\n _: 1 /* STABLE */\n }), _createCommentVNode(\" 添加修改角色的对话框 \"), _createVNode(_component_el_dialog, {\n modelValue: $setup.dialogVisible,\n \"onUpdate:modelValue\": _cache[7] || (_cache[7] = $event => $setup.dialogVisible = $event),\n title: \"修改用户角色\",\n width: \"400px\"\n }, {\n footer: _withCtx(() => [_createElementVNode(\"span\", _hoisted_8, [_createVNode(_component_el_button, {\n onClick: _cache[6] || (_cache[6] = $event => $setup.dialogVisible = false)\n }, {\n default: _withCtx(() => _cache[12] || (_cache[12] = [_createTextVNode(\"取消\")])),\n _: 1 /* STABLE */\n }), _createVNode(_component_el_button, {\n type: \"primary\",\n loading: $setup.submitting,\n onClick: $setup.confirmUpdateRole\n }, {\n default: _withCtx(() => _cache[13] || (_cache[13] = [_createTextVNode(\" 确定 \")])),\n _: 1 /* STABLE */\n }, 8 /* PROPS */, [\"loading\"])])]),\n default: _withCtx(() => [_createVNode(_component_el_form, {\n model: $setup.roleForm,\n \"label-width\": \"80px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"用户\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"span\", null, _toDisplayString($setup.currentUser?.username), 1 /* TEXT */)]),\n _: 1 /* STABLE */\n }), _createVNode(_component_el_form_item, {\n label: \"当前角色\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_tag, {\n type: $setup.getRoleTagType($setup.currentUser?.roleCode)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($setup.getRoleLabel($setup.currentUser?.roleCode)), 1 /* TEXT */)]),\n _: 1 /* STABLE */\n }, 8 /* PROPS */, [\"type\"])]),\n _: 1 /* STABLE */\n }), _createVNode(_component_el_form_item, {\n label: \"新角色\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_select, {\n modelValue: $setup.roleForm.roleCode,\n \"onUpdate:modelValue\": _cache[5] || (_cache[5] = $event => $setup.roleForm.roleCode = $event),\n placeholder: \"请选择角色\"\n }, {\n default: _withCtx(() => [(_openBlock(), _createElementBlock(_Fragment, null, _renderList($setup.roleOptions, role => {\n return _createVNode(_component_el_option, {\n key: role.value,\n label: role.label,\n value: role.value,\n disabled: role.value === $setup.currentUser?.roleCode\n }, null, 8 /* PROPS */, [\"label\", \"value\", \"disabled\"]);\n }), 64 /* STABLE_FRAGMENT */))]),\n _: 1 /* STABLE */\n }, 8 /* PROPS */, [\"modelValue\"])]),\n _: 1 /* STABLE */\n })]),\n _: 1 /* STABLE */\n }, 8 /* PROPS */, [\"model\"])]),\n _: 1 /* STABLE */\n }, 8 /* PROPS */, [\"modelValue\"])]);\n}","map":{"version":3,"names":["class","_createElementBlock","_hoisted_1","_createVNode","_component_el_card","header","_withCtx","_createElementVNode","_hoisted_2","_hoisted_3","_component_el_form","inline","model","$setup","searchForm","default","_hoisted_4","_component_el_form_item","label","_component_el_input","modelValue","username","_cache","$event","placeholder","clearable","onClear","handleSearch","_","realName","_component_el_select","roleCode","_Fragment","_renderList","roleOptions","role","_component_el_option","key","value","_hoisted_5","_component_el_button","type","onClick","_createTextVNode","resetSearch","_hoisted_6","_createBlock","_component_el_table","data","userList","style","_component_el_table_column","prop","width","row","_component_el_tag","getRoleTagType","_toDisplayString","getRoleLabel","status","fixed","link","handleUpdateRole","loading","_hoisted_7","_component_el_pagination","currentPage","pageSize","total","layout","onSizeChange","handleSizeChange","onCurrentChange","handleCurrentChange","_createCommentVNode","_component_el_dialog","dialogVisible","title","footer","_hoisted_8","submitting","confirmUpdateRole","roleForm","currentUser","disabled"],"sources":["D:\\language\\VScode\\Front-end logistics\\src\\views\\admin\\UserManagement.vue"],"sourcesContent":["<template>\r\n <div class=\"user-management\">\r\n <el-card>\r\n <template #header>\r\n <div class=\"card-header\">\r\n <span class=\"title\">用户管理</span>\r\n <div class=\"search-area\">\r\n <el-form :inline=\"true\" :model=\"searchForm\" class=\"search-form\">\r\n <div class=\"search-row\">\r\n <el-form-item label=\"用户名\">\r\n <el-input\r\n v-model=\"searchForm.username\"\r\n placeholder=\"请输入用户名\"\r\n clearable\r\n @clear=\"handleSearch\"\r\n />\r\n </el-form-item>\r\n \r\n <el-form-item label=\"真实姓名\">\r\n <el-input\r\n v-model=\"searchForm.realName\"\r\n placeholder=\"请输入真实姓名\"\r\n clearable\r\n @clear=\"handleSearch\"\r\n />\r\n </el-form-item>\r\n \r\n <el-form-item label=\"用户角色\">\r\n <el-select \r\n v-model=\"searchForm.roleCode\"\r\n placeholder=\"请选择角色\"\r\n clearable\r\n @clear=\"handleSearch\"\r\n >\r\n <el-option\r\n v-for=\"role in roleOptions\"\r\n :key=\"role.value\"\r\n :label=\"role.label\"\r\n :value=\"role.value\"\r\n />\r\n </el-select>\r\n </el-form-item>\r\n \r\n <div class=\"search-buttons\">\r\n <el-button type=\"primary\" @click=\"handleSearch\">搜索</el-button>\r\n <el-button @click=\"resetSearch\">重置</el-button>\r\n </div>\r\n </div>\r\n </el-form>\r\n </div>\r\n </div>\r\n </template>\r\n \r\n <div class=\"table-container\">\r\n <el-table\r\n v-loading=\"loading\"\r\n :data=\"userList\"\r\n style=\"width: 100%\"\r\n >\r\n <el-table-column prop=\"id\" label=\"ID\" width=\"80\" />\r\n <el-table-column prop=\"username\" label=\"用户名\" />\r\n <el-table-column prop=\"realName\" label=\"真实姓名\" />\r\n <el-table-column prop=\"email\" label=\"邮箱\" />\r\n <el-table-column prop=\"roles\" label=\"角色\">\r\n <template #default=\"{ row }\">\r\n <el-tag \r\n :type=\"getRoleTagType(row.roleCode)\"\r\n class=\"role-tag\"\r\n >\r\n {{ getRoleLabel(row.roleCode) }}\r\n </el-tag>\r\n </template>\r\n </el-table-column>\r\n <el-table-column prop=\"status\" label=\"状态\" width=\"100\">\r\n <template #default=\"{ row }\">\r\n <el-tag :type=\"row.status === 1 ? 'success' : 'danger'\">\r\n {{ row.status === 1 ? '启用' : '禁用' }}\r\n </el-tag>\r\n </template>\r\n </el-table-column>\r\n <el-table-column prop=\"createTime\" label=\"创建时间\" width=\"180\" />\r\n <el-table-column label=\"操作\" width=\"150\" fixed=\"right\">\r\n <template #default=\"{ row }\">\r\n <el-button \r\n type=\"primary\" \r\n link\r\n @click=\"handleUpdateRole(row)\"\r\n >\r\n 修改角色\r\n </el-button>\r\n </template>\r\n </el-table-column>\r\n </el-table>\r\n </div>\r\n \r\n <div class=\"pagination\">\r\n <el-pagination\r\n v-model:current-page=\"currentPage\"\r\n v-model:page-size=\"pageSize\"\r\n :page-sizes=\"[10, 20, 50]\"\r\n :total=\"total\"\r\n layout=\"total, sizes, prev, pager, next\"\r\n @size-change=\"handleSizeChange\"\r\n @current-change=\"handleCurrentChange\"\r\n />\r\n </div>\r\n </el-card>\r\n\r\n <!-- 添加修改角色的对话框 -->\r\n <el-dialog\r\n v-model=\"dialogVisible\"\r\n title=\"修改用户角色\"\r\n width=\"400px\"\r\n >\r\n <el-form :model=\"roleForm\" label-width=\"80px\">\r\n <el-form-item label=\"用户\">\r\n <span>{{ currentUser?.username }}</span>\r\n </el-form-item>\r\n <el-form-item label=\"当前角色\">\r\n <el-tag :type=\"getRoleTagType(currentUser?.roleCode)\">\r\n {{ getRoleLabel(currentUser?.roleCode) }}\r\n </el-tag>\r\n </el-form-item>\r\n <el-form-item label=\"新角色\">\r\n <el-select v-model=\"roleForm.roleCode\" placeholder=\"请选择角色\">\r\n <el-option\r\n v-for=\"role in roleOptions\"\r\n :key=\"role.value\"\r\n :label=\"role.label\"\r\n :value=\"role.value\"\r\n :disabled=\"role.value === currentUser?.roleCode\"\r\n />\r\n </el-select>\r\n </el-form-item>\r\n </el-form>\r\n <template #footer>\r\n <span class=\"dialog-footer\">\r\n <el-button @click=\"dialogVisible = false\">取消</el-button>\r\n <el-button \r\n type=\"primary\" \r\n :loading=\"submitting\"\r\n @click=\"confirmUpdateRole\"\r\n >\r\n 确定\r\n </el-button>\r\n </span>\r\n </template>\r\n </el-dialog>\r\n </div>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, computed, onMounted, reactive } from 'vue'\r\nimport { useRouter } from 'vue-router'\r\nimport { useStore } from 'vuex'\r\nimport { ElMessage, ElMessageBox } from 'element-plus'\r\nimport { Search } from '@element-plus/icons-vue'\r\nimport { getAllUsers, updateUserRole, deleteUser, getUserList } from '@/api/auth'\r\n\r\nconst router = useRouter()\r\nconst store = useStore()\r\nconst loading = ref(false)\r\nconst userList = ref([])\r\nconst currentPage = ref(1)\r\nconst pageSize = ref(10)\r\nconst total = ref(0)\r\n\r\n// 搜索表单\r\nconst searchForm = reactive({\r\n username: '',\r\n realName: '',\r\n roleCode: ''\r\n})\r\n\r\n// 角色选项\r\nconst roleOptions = [\r\n { label: '系统管理员', value: 'ROLE_ADMIN' },\r\n { label: '物流管理员', value: 'ROLE_LOGISTICS_ADMIN' },\r\n { label: '仓库管理员', value: 'ROLE_WAREHOUSE_ADMIN' },\r\n { label: '普通用户', value: 'ROLE_USER' }\r\n]\r\n\r\n// 获取角色标签类型\r\nconst getRoleTagType = (roleCode) => {\r\n const typeMap = {\r\n 'ROLE_ADMIN': 'danger',\r\n 'ROLE_LOGISTICS_ADMIN': 'warning',\r\n 'ROLE_WAREHOUSE_ADMIN': 'success',\r\n 'ROLE_USER': 'info'\r\n }\r\n return typeMap[roleCode] || 'info'\r\n}\r\n\r\n// 获取角色显示文本\r\nconst getRoleLabel = (roleCode) => {\r\n const labelMap = {\r\n 'ROLE_ADMIN': '系统管理员',\r\n 'ROLE_LOGISTICS_ADMIN': '物流管理员',\r\n 'ROLE_WAREHOUSE_ADMIN': '仓库管理员',\r\n 'ROLE_USER': '普通用户'\r\n }\r\n return labelMap[roleCode] || roleCode\r\n}\r\n\r\n// 添加一个缓存变量\r\nconst allRecords = ref([])\r\n\r\nconst loadUsers = async () => {\r\n loading.value = true\r\n try {\r\n // 获取所有数据\r\n const res = await getUserList({\r\n pageNum: 1,\r\n pageSize: 999,\r\n username: searchForm.username || undefined,\r\n realName: searchForm.realName || undefined,\r\n roleCode: searchForm.roleCode || undefined\r\n })\r\n \r\n if (res.code === 200 && res.data) {\r\n // 缓存所有记录\r\n allRecords.value = res.data.records || []\r\n \r\n // 计算分页\r\n const start = (currentPage.value - 1) * pageSize.value\r\n const end = start + pageSize.value\r\n \r\n // 设置当前页的数据\r\n userList.value = allRecords.value.slice(start, end)\r\n // 设置总记录数\r\n total.value = allRecords.value.length\r\n }\r\n } catch (error) {\r\n console.error('加载用户列表失败:', error)\r\n ElMessage.error(error.message || '加载用户列表失败')\r\n } finally {\r\n loading.value = false\r\n }\r\n}\r\n\r\n// 处理每页条数变化\r\nconst handleSizeChange = (val) => {\r\n pageSize.value = val\r\n currentPage.value = 1\r\n // 直接从缓存中切割数据\r\n const start = 0\r\n const end = pageSize.value\r\n userList.value = allRecords.value.slice(start, end)\r\n}\r\n\r\n// 处理页码变化\r\nconst handleCurrentChange = (val) => {\r\n currentPage.value = val\r\n // 直接从缓存中切割数据\r\n const start = (currentPage.value - 1) * pageSize.value\r\n const end = start + pageSize.value\r\n userList.value = allRecords.value.slice(start, end)\r\n}\r\n\r\n// 处理搜索\r\nconst handleSearch = () => {\r\n currentPage.value = 1 // 搜索时重置为第一页\r\n loadUsers()\r\n}\r\n\r\n// 重置搜索\r\nconst resetSearch = () => {\r\n searchForm.username = ''\r\n searchForm.realName = ''\r\n searchForm.roleCode = ''\r\n currentPage.value = 1 // 重置时回到第一页\r\n pageSize.value = 10 // 重置每页条数\r\n loadUsers()\r\n}\r\n\r\n// 修改角色相关\r\nconst dialogVisible = ref(false)\r\nconst currentUser = ref(null)\r\nconst submitting = ref(false)\r\nconst roleForm = reactive({\r\n roleCode: ''\r\n})\r\n\r\n// 处理修改角色\r\nconst handleUpdateRole = (user) => {\r\n currentUser.value = user\r\n roleForm.roleCode = '' // 清空选择\r\n dialogVisible.value = true\r\n}\r\n\r\n// 确认修改角色\r\nconst confirmUpdateRole = async () => {\r\n if (!roleForm.roleCode) {\r\n ElMessage.warning('请选择新角色')\r\n return\r\n }\r\n\r\n try {\r\n submitting.value = true\r\n const res = await updateUserRole(currentUser.value.id, roleForm.roleCode)\r\n \r\n if (res.code === 200) {\r\n ElMessage.success('角色修改成功')\r\n dialogVisible.value = false\r\n \r\n // 更新本地数据\r\n const index = allRecords.value.findIndex(u => u.id === currentUser.value.id)\r\n if (index > -1) {\r\n allRecords.value[index].roleCode = roleForm.roleCode\r\n allRecords.value[index].realName = getRoleLabel(roleForm.roleCode)\r\n }\r\n \r\n // 重新计算当前页数据\r\n const start = (currentPage.value - 1) * pageSize.value\r\n const end = start + pageSize.value\r\n userList.value = allRecords.value.slice(start, end)\r\n }\r\n } catch (error) {\r\n console.error('修改角色失败:', error)\r\n ElMessage.error(error.response?.data?.message || '修改角色失败')\r\n } finally {\r\n submitting.value = false\r\n }\r\n}\r\n\r\n// 判断当前用户是否是超级管理员\r\nconst isAdmin = computed(() => {\r\n return store.state.userInfo?.roles?.includes('ROLE_ADMIN')\r\n})\r\n\r\n// 处理删除用户\r\nconst handleDelete = async (user) => {\r\n try {\r\n await ElMessageBox.confirm(\r\n `确定要删除用户 ${user.username} 吗?此操作不可恢复!`,\r\n '警告',\r\n {\r\n type: 'warning',\r\n confirmButtonText: '确定',\r\n cancelButtonText: '取消',\r\n confirmButtonClass: 'el-button--danger'\r\n }\r\n )\r\n \r\n const res = await deleteUser(user.id)\r\n if (res.code === 200) {\r\n ElMessage.success('用户删除成功')\r\n // 从列表中移除该用户\r\n userList.value = userList.value.filter(item => item.id !== user.id)\r\n // 更新总数\r\n total.value -= 1\r\n // 如果当前页没有数据了,且不是第一页,则跳转到上一页\r\n if (userList.value.length === 0 && currentPage.value > 1) {\r\n currentPage.value -= 1\r\n loadUsers()\r\n }\r\n }\r\n } catch (error) {\r\n if (error === 'cancel') return\r\n \r\n console.error('删除用户失败:', error)\r\n if (error.response?.status === 401) {\r\n ElMessage.error('登录已过期,请重新登录')\r\n router.push('/login')\r\n } else if (error.response?.status === 403) {\r\n ElMessage.error('没有权限执行此操作')\r\n } else if (error.response?.status === 404) {\r\n ElMessage.error('用户不存在')\r\n } else {\r\n ElMessage.error(error.response?.data?.message || '删除用户失败')\r\n }\r\n }\r\n}\r\n\r\nonMounted(() => {\r\n loadUsers()\r\n})\r\n</script>\r\n\r\n<style scoped>\r\n.user-management {\r\n min-height: 100%;\r\n}\r\n\r\n.card-header {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 20px;\r\n}\r\n\r\n.title {\r\n font-size: 18px;\r\n font-weight: bold;\r\n}\r\n\r\n.search-area {\r\n background-color: #f8f9fa;\r\n padding: 15px;\r\n border-radius: 4px;\r\n}\r\n\r\n.search-form {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 15px;\r\n}\r\n\r\n.search-row {\r\n display: flex;\r\n align-items: center;\r\n gap: 20px;\r\n}\r\n\r\n.search-row :deep(.el-form-item) {\r\n margin-bottom: 0;\r\n margin-right: 0;\r\n}\r\n\r\n.search-buttons {\r\n margin-left: auto;\r\n}\r\n\r\n:deep(.el-input),\r\n:deep(.el-select) {\r\n width: 200px;\r\n}\r\n\r\n.role-tag {\r\n margin-right: 5px;\r\n}\r\n\r\n.pagination {\r\n margin-top: 20px;\r\n display: flex;\r\n justify-content: flex-end;\r\n}\r\n\r\n.table-container {\r\n height: calc(100vh - 200px); /* 减去其他元素的高度 */\r\n overflow: auto;\r\n}\r\n\r\n.el-table {\r\n height: 100%;\r\n}\r\n</style> "],"mappings":"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","ignoreList":[]},"metadata":{},"sourceType":"module","externalDependencies":[]}
|