wu | 70fc8c5 | 2025-06-19 15:55:03 +0800 | [diff] [blame] | 1 | // src/components/UserManagement.jsx |
TRM-coding | d1cbf67 | 2025-06-18 15:15:08 +0800 | [diff] [blame] | 2 | |
wu | 70fc8c5 | 2025-06-19 15:55:03 +0800 | [diff] [blame] | 3 | import React, { useState, useEffect } from 'react' |
| 4 | import { useParams } from 'react-router-dom' |
| 5 | import { Table, Select, message } from 'antd' |
| 6 | import { |
| 7 | fetchUserList, |
| 8 | giveUser, |
| 9 | giveAdmin, |
| 10 | giveSuperAdmin |
| 11 | } from '../api/posts_trm' |
| 12 | import '../style/Admin.css' |
TRM-coding | d1cbf67 | 2025-06-18 15:15:08 +0800 | [diff] [blame] | 13 | |
wu | 70fc8c5 | 2025-06-19 15:55:03 +0800 | [diff] [blame] | 14 | const { Option } = Select |
| 15 | const ROLE_LIST = ['用户', '管理员', '超级管理员'] |
| 16 | |
| 17 | export default function UserManagement() { |
| 18 | // 直接从 URL 参数里拿到 superAdminId |
| 19 | const { userId: superAdminId } = useParams() |
| 20 | |
| 21 | const [users, setUsers] = useState([]) |
trm | 9984ee5 | 2025-06-20 15:16:56 +0000 | [diff] [blame] | 22 | const [unauthorized, setUnauthorized] = useState(false) |
TRM-coding | d1cbf67 | 2025-06-18 15:15:08 +0800 | [diff] [blame] | 23 | |
| 24 | useEffect(() => { |
| 25 | async function load() { |
| 26 | try { |
wu | 70fc8c5 | 2025-06-19 15:55:03 +0800 | [diff] [blame] | 27 | // 调用接口获取用户列表 |
| 28 | const data = await fetchUserList(superAdminId) |
trm | 9984ee5 | 2025-06-20 15:16:56 +0000 | [diff] [blame] | 29 | |
| 30 | // 检查是否是权限错误 |
| 31 | if (data && data.status === 'error' && data.message === 'Unauthorized') { |
| 32 | setUnauthorized(true) |
| 33 | setUsers([]) |
| 34 | return |
| 35 | } |
| 36 | |
| 37 | // 确保数据是数组格式 |
| 38 | let userList = [] |
| 39 | if (Array.isArray(data)) { |
| 40 | userList = data |
| 41 | } else if (Array.isArray(data.data)) { |
| 42 | userList = data.data |
| 43 | } else if (Array.isArray(data.users)) { |
| 44 | userList = data.users |
| 45 | } |
| 46 | |
| 47 | setUsers(userList) |
| 48 | setUnauthorized(false) |
TRM-coding | d1cbf67 | 2025-06-18 15:15:08 +0800 | [diff] [blame] | 49 | } catch (e) { |
wu | 70fc8c5 | 2025-06-19 15:55:03 +0800 | [diff] [blame] | 50 | console.error(e) |
trm | 9984ee5 | 2025-06-20 15:16:56 +0000 | [diff] [blame] | 51 | if (e.message === 'Unauthorized') { |
| 52 | setUnauthorized(true) |
| 53 | setUsers([]) |
| 54 | } else { |
| 55 | message.error('获取用户列表失败:' + e.message) |
| 56 | } |
TRM-coding | d1cbf67 | 2025-06-18 15:15:08 +0800 | [diff] [blame] | 57 | } |
| 58 | } |
TRM-coding | d1cbf67 | 2025-06-18 15:15:08 +0800 | [diff] [blame] | 59 | |
wu | 70fc8c5 | 2025-06-19 15:55:03 +0800 | [diff] [blame] | 60 | // 只有当 superAdminId 有值时才发请求 |
| 61 | if (superAdminId) { |
| 62 | load() |
| 63 | } |
| 64 | }, [superAdminId]) |
| 65 | |
| 66 | // 处理角色变更 |
TRM-coding | d1cbf67 | 2025-06-18 15:15:08 +0800 | [diff] [blame] | 67 | const handleRoleChange = async (userId, newRole) => { |
| 68 | try { |
trm | 9984ee5 | 2025-06-20 15:16:56 +0000 | [diff] [blame] | 69 | let result |
wu | 70fc8c5 | 2025-06-19 15:55:03 +0800 | [diff] [blame] | 70 | if (newRole === '用户') { |
trm | 9984ee5 | 2025-06-20 15:16:56 +0000 | [diff] [blame] | 71 | result = await giveUser(userId) |
wu | 70fc8c5 | 2025-06-19 15:55:03 +0800 | [diff] [blame] | 72 | } else if (newRole === '管理员') { |
trm | 9984ee5 | 2025-06-20 15:16:56 +0000 | [diff] [blame] | 73 | result = await giveAdmin(userId) |
wu | 70fc8c5 | 2025-06-19 15:55:03 +0800 | [diff] [blame] | 74 | } else if (newRole === '超级管理员') { |
trm | 9984ee5 | 2025-06-20 15:16:56 +0000 | [diff] [blame] | 75 | result = await giveSuperAdmin(userId) |
wu | 70fc8c5 | 2025-06-19 15:55:03 +0800 | [diff] [blame] | 76 | } |
trm | 9984ee5 | 2025-06-20 15:16:56 +0000 | [diff] [blame] | 77 | |
| 78 | // 检查返回结果是否有权限错误 |
| 79 | if (result && result.status === 'error' && result.message === 'Unauthorized') { |
| 80 | setUnauthorized(true) |
| 81 | message.error('权限不足,无法执行此操作') |
| 82 | return |
| 83 | } |
| 84 | |
wu | 70fc8c5 | 2025-06-19 15:55:03 +0800 | [diff] [blame] | 85 | // 本地更新状态 |
| 86 | setUsers(us => |
| 87 | us.map(u => (u.id === userId ? { ...u, role: newRole } : u)) |
| 88 | ) |
| 89 | message.success('修改成功') |
TRM-coding | d1cbf67 | 2025-06-18 15:15:08 +0800 | [diff] [blame] | 90 | } catch (e) { |
wu | 70fc8c5 | 2025-06-19 15:55:03 +0800 | [diff] [blame] | 91 | console.error(e) |
trm | 9984ee5 | 2025-06-20 15:16:56 +0000 | [diff] [blame] | 92 | if (e.message === 'Unauthorized') { |
| 93 | setUnauthorized(true) |
| 94 | message.error('权限不足,无法执行此操作') |
| 95 | } else { |
| 96 | message.error('修改失败:' + e.message) |
| 97 | } |
TRM-coding | d1cbf67 | 2025-06-18 15:15:08 +0800 | [diff] [blame] | 98 | } |
wu | 70fc8c5 | 2025-06-19 15:55:03 +0800 | [diff] [blame] | 99 | } |
TRM-coding | d1cbf67 | 2025-06-18 15:15:08 +0800 | [diff] [blame] | 100 | |
wu | 70fc8c5 | 2025-06-19 15:55:03 +0800 | [diff] [blame] | 101 | // 表格列定义 |
TRM-coding | d1cbf67 | 2025-06-18 15:15:08 +0800 | [diff] [blame] | 102 | const columns = [ |
| 103 | { title: '用户名', dataIndex: 'username', key: 'username' }, |
wu | 70fc8c5 | 2025-06-19 15:55:03 +0800 | [diff] [blame] | 104 | { title: '角色', dataIndex: 'role', key: 'role' }, |
TRM-coding | d1cbf67 | 2025-06-18 15:15:08 +0800 | [diff] [blame] | 105 | { |
| 106 | title: '操作', |
| 107 | key: 'action', |
| 108 | render: (_, record) => { |
wu | 70fc8c5 | 2025-06-19 15:55:03 +0800 | [diff] [blame] | 109 | // 当前角色排第一 |
| 110 | const orderedRoles = [ |
| 111 | record.role, |
| 112 | ...ROLE_LIST.filter(r => r !== record.role) |
| 113 | ] |
TRM-coding | d1cbf67 | 2025-06-18 15:15:08 +0800 | [diff] [blame] | 114 | return ( |
| 115 | <Select |
| 116 | value={record.role} |
| 117 | style={{ width: 120 }} |
| 118 | onChange={value => handleRoleChange(record.id, value)} |
| 119 | > |
| 120 | {orderedRoles.map(r => ( |
wu | 70fc8c5 | 2025-06-19 15:55:03 +0800 | [diff] [blame] | 121 | <Option key={r} value={r}> |
| 122 | {r} |
| 123 | </Option> |
TRM-coding | d1cbf67 | 2025-06-18 15:15:08 +0800 | [diff] [blame] | 124 | ))} |
| 125 | </Select> |
wu | 70fc8c5 | 2025-06-19 15:55:03 +0800 | [diff] [blame] | 126 | ) |
| 127 | } |
| 128 | } |
| 129 | ] |
TRM-coding | d1cbf67 | 2025-06-18 15:15:08 +0800 | [diff] [blame] | 130 | |
| 131 | return ( |
| 132 | <div className="admin-container"> |
trm | 9984ee5 | 2025-06-20 15:16:56 +0000 | [diff] [blame] | 133 | {unauthorized ? ( |
| 134 | <div style={{ |
| 135 | textAlign: 'center', |
| 136 | padding: '50px', |
| 137 | fontSize: '18px', |
| 138 | color: '#ff4d4f' |
| 139 | }}> |
| 140 | 权限不足,无法访问用户管理功能 |
| 141 | </div> |
| 142 | ) : ( |
| 143 | <Table |
| 144 | dataSource={users} |
| 145 | columns={columns} |
| 146 | rowKey="id" |
| 147 | pagination={false} |
| 148 | /> |
| 149 | )} |
TRM-coding | d1cbf67 | 2025-06-18 15:15:08 +0800 | [diff] [blame] | 150 | </div> |
wu | 70fc8c5 | 2025-06-19 15:55:03 +0800 | [diff] [blame] | 151 | ) |
TRM-coding | d1cbf67 | 2025-06-18 15:15:08 +0800 | [diff] [blame] | 152 | } |