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
30 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, createBlock as _createBlock, resolveDirective as _resolveDirective, 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: \"pagination\"\n};\nconst _hoisted_7 = {\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(() => [_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 }) => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(row.roles, role => {\n return _openBlock(), _createBlock(_component_el_tag, {\n key: role,\n type: $setup.getRoleTagType(role),\n class: \"role-tag\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($setup.getRoleLabel(role)), 1 /* TEXT */)]),\n _: 2 /* DYNAMIC */\n }, 1032 /* PROPS, DYNAMIC_SLOTS */, [\"type\"]);\n }), 128 /* KEYED_FRAGMENT */))]),\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 })]),\n _: 1 /* STABLE */\n }, 8 /* PROPS */, [\"data\"])), [[_directive_loading, $setup.loading]]), _createElementVNode(\"div\", _hoisted_6, [_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 total: $setup.total,\n \"page-sizes\": [10, 20, 50],\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_7, [_createVNode(_component_el_button, {\n onClick: _cache[6] || (_cache[6] = $event => $setup.dialogVisible = false)\n }, {\n default: _withCtx(() => _cache[11] || (_cache[11] = [_createTextVNode(\"取消\")])),\n _: 1 /* STABLE */\n }), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $setup.confirmUpdateRole\n }, {\n default: _withCtx(() => _cache[12] || (_cache[12] = [_createTextVNode(\"确定\")])),\n _: 1 /* STABLE */\n })])]),\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_select, {\n modelValue: $setup.roleForm.roleCode,\n \"onUpdate:modelValue\": _cache[5] || (_cache[5] = $event => $setup.roleForm.roleCode = $event),\n placeholder: \"请选择角色\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_option, {\n label: \"普通用户\",\n value: \"ROLE_USER\",\n disabled: $setup.currentUser?.realName === '普通用户'\n }, null, 8 /* PROPS */, [\"disabled\"]), _createVNode(_component_el_option, {\n label: \"仓库管理员\",\n value: \"ROLE_WAREHOUSE_ADMIN\",\n disabled: $setup.currentUser?.realName === '仓库管理员'\n }, null, 8 /* PROPS */, [\"disabled\"]), _createVNode(_component_el_option, {\n label: \"物流管理员\",\n value: \"ROLE_LOGISTICS_ADMIN\",\n disabled: $setup.currentUser?.realName === '物流管理员'\n }, null, 8 /* PROPS */, [\"disabled\"]), _createVNode(_component_el_option, {\n label: \"超级管理员\",\n value: \"ROLE_ADMIN\",\n disabled: $setup.currentUser?.realName === '系统管理员'\n }, null, 8 /* PROPS */, [\"disabled\"])]),\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","_createBlock","_component_el_table","data","userList","style","_component_el_table_column","prop","width","row","roles","_component_el_tag","getRoleTagType","_toDisplayString","getRoleLabel","status","loading","_hoisted_6","_component_el_pagination","currentPage","pageSize","total","layout","onSizeChange","handleSizeChange","onCurrentChange","handleCurrentChange","_createCommentVNode","_component_el_dialog","dialogVisible","title","footer","_hoisted_7","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 <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 v-for=\"role in row.roles\" \r\n :key=\"role\"\r\n :type=\"getRoleTagType(role)\"\r\n class=\"role-tag\"\r\n >\r\n {{ getRoleLabel(role) }}\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>\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 :total=\"total\"\r\n :page-sizes=\"[10, 20, 50]\"\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-select v-model=\"roleForm.roleCode\" placeholder=\"请选择角色\">\r\n <el-option \r\n label=\"普通用户\" \r\n value=\"ROLE_USER\"\r\n :disabled=\"currentUser?.realName === '普通用户'\"\r\n />\r\n <el-option \r\n label=\"仓库管理员\" \r\n value=\"ROLE_WAREHOUSE_ADMIN\"\r\n :disabled=\"currentUser?.realName === '仓库管理员'\"\r\n />\r\n <el-option \r\n label=\"物流管理员\" \r\n value=\"ROLE_LOGISTICS_ADMIN\"\r\n :disabled=\"currentUser?.realName === '物流管理员'\"\r\n />\r\n <el-option \r\n label=\"超级管理员\" \r\n value=\"ROLE_ADMIN\"\r\n :disabled=\"currentUser?.realName === '系统管理员'\"\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 type=\"primary\" @click=\"confirmUpdateRole\">确定</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 = (role) => {\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[role] || 'info'\r\n}\r\n\r\n// 获取角色显示文本\r\nconst getRoleLabel = (role) => {\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[role] || role\r\n}\r\n\r\nconst loadUsers = async () => {\r\n loading.value = true\r\n try {\r\n const res = await getUserList({\r\n pageNum: currentPage.value,\r\n pageSize: pageSize.value,\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) {\r\n userList.value = res.data.records\r\n total.value = res.data.total\r\n currentPage.value = res.data.current\r\n pageSize.value = res.data.size\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 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 handleSearch()\r\n}\r\n\r\n// 处理分页\r\nconst handleSizeChange = (val) => {\r\n pageSize.value = val\r\n loadUsers()\r\n}\r\n\r\nconst handleCurrentChange = (val) => {\r\n currentPage.value = val\r\n loadUsers()\r\n}\r\n\r\n// 修改角色相关\r\nconst dialogVisible = ref(false)\r\nconst currentUser = ref(null)\r\nconst roleForm = reactive({\r\n roleCode: '' // 改回使用 roleCode\r\n})\r\n\r\nconst handleUpdateRole = (user) => {\r\n currentUser.value = user\r\n roleForm.roleCode = getRoleCodeByName(user.realName)\r\n dialogVisible.value = true\r\n}\r\n\r\nconst confirmUpdateRole = async () => {\r\n try {\r\n // 检查是否选择了相同的角色\r\n if (getRoleCodeByName(currentUser.value.realName) === roleForm.roleCode) {\r\n ElMessage.warning('用户已经是该角色')\r\n return\r\n }\r\n\r\n const newRoleName = getRoleNameByCode(roleForm.roleCode)\r\n\r\n await ElMessageBox.confirm(\r\n `确定要将用户 ${currentUser.value.username} 的角色从 ${currentUser.value.realName} 更改为 ${newRoleName} 吗?`,\r\n '提示',\r\n {\r\n type: 'warning',\r\n confirmButtonText: '确定',\r\n cancelButtonText: '取消'\r\n }\r\n )\r\n \r\n const res = await updateUserRole(currentUser.value.id, roleForm.roleCode)\r\n if (res.code === 200) {\r\n ElMessage.success('角色更新成功')\r\n dialogVisible.value = false\r\n // 直接更新当前用户的角色名称\r\n currentUser.value.realName = res.data.realName\r\n // 更新列表中对应用户的数据\r\n const index = userList.value.findIndex(user => user.id === currentUser.value.id)\r\n if (index !== -1) {\r\n userList.value[index].realName = res.data.realName\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 === 400) {\r\n if (error.response.data?.message) {\r\n ElMessage.error(error.response.data.message)\r\n } else {\r\n ElMessage.error('用户已有该角色或角色不存在')\r\n }\r\n } else {\r\n ElMessage.error(error.message || '更新角色失败')\r\n }\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</style> "],"mappings":"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","ignoreList":[]},"metadata":{},"sourceType":"module","externalDependencies":[]}