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-coding | d1cbf67 | 2025-06-18 15:15:08 +0800 | [diff] [blame] | 22 | |
| 23 | useEffect(() => { |
| 24 | async function load() { |
| 25 | try { |
wu | 70fc8c5 | 2025-06-19 15:55:03 +0800 | [diff] [blame^] | 26 | // 调用接口获取用户列表 |
| 27 | const data = await fetchUserList(superAdminId) |
| 28 | setUsers(data) |
TRM-coding | d1cbf67 | 2025-06-18 15:15:08 +0800 | [diff] [blame] | 29 | } catch (e) { |
wu | 70fc8c5 | 2025-06-19 15:55:03 +0800 | [diff] [blame^] | 30 | console.error(e) |
| 31 | message.error('获取用户列表失败:' + e.message) |
TRM-coding | d1cbf67 | 2025-06-18 15:15:08 +0800 | [diff] [blame] | 32 | } |
| 33 | } |
TRM-coding | d1cbf67 | 2025-06-18 15:15:08 +0800 | [diff] [blame] | 34 | |
wu | 70fc8c5 | 2025-06-19 15:55:03 +0800 | [diff] [blame^] | 35 | // 只有当 superAdminId 有值时才发请求 |
| 36 | if (superAdminId) { |
| 37 | load() |
| 38 | } |
| 39 | }, [superAdminId]) |
| 40 | |
| 41 | // 处理角色变更 |
TRM-coding | d1cbf67 | 2025-06-18 15:15:08 +0800 | [diff] [blame] | 42 | const handleRoleChange = async (userId, newRole) => { |
| 43 | try { |
wu | 70fc8c5 | 2025-06-19 15:55:03 +0800 | [diff] [blame^] | 44 | if (newRole === '用户') { |
| 45 | await giveUser(superAdminId, userId) |
| 46 | } else if (newRole === '管理员') { |
| 47 | await giveAdmin(superAdminId, userId) |
| 48 | } else if (newRole === '超级管理员') { |
| 49 | await giveSuperAdmin(superAdminId, userId) |
| 50 | } |
| 51 | // 本地更新状态 |
| 52 | setUsers(us => |
| 53 | us.map(u => (u.id === userId ? { ...u, role: newRole } : u)) |
| 54 | ) |
| 55 | message.success('修改成功') |
TRM-coding | d1cbf67 | 2025-06-18 15:15:08 +0800 | [diff] [blame] | 56 | } catch (e) { |
wu | 70fc8c5 | 2025-06-19 15:55:03 +0800 | [diff] [blame^] | 57 | console.error(e) |
| 58 | message.error('修改失败:' + e.message) |
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 | } |
TRM-coding | d1cbf67 | 2025-06-18 15:15:08 +0800 | [diff] [blame] | 61 | |
wu | 70fc8c5 | 2025-06-19 15:55:03 +0800 | [diff] [blame^] | 62 | // 表格列定义 |
TRM-coding | d1cbf67 | 2025-06-18 15:15:08 +0800 | [diff] [blame] | 63 | const columns = [ |
| 64 | { title: '用户名', dataIndex: 'username', key: 'username' }, |
wu | 70fc8c5 | 2025-06-19 15:55:03 +0800 | [diff] [blame^] | 65 | { title: '角色', dataIndex: 'role', key: 'role' }, |
TRM-coding | d1cbf67 | 2025-06-18 15:15:08 +0800 | [diff] [blame] | 66 | { |
| 67 | title: '操作', |
| 68 | key: 'action', |
| 69 | render: (_, record) => { |
wu | 70fc8c5 | 2025-06-19 15:55:03 +0800 | [diff] [blame^] | 70 | // 当前角色排第一 |
| 71 | const orderedRoles = [ |
| 72 | record.role, |
| 73 | ...ROLE_LIST.filter(r => r !== record.role) |
| 74 | ] |
TRM-coding | d1cbf67 | 2025-06-18 15:15:08 +0800 | [diff] [blame] | 75 | return ( |
| 76 | <Select |
| 77 | value={record.role} |
| 78 | style={{ width: 120 }} |
| 79 | onChange={value => handleRoleChange(record.id, value)} |
| 80 | > |
| 81 | {orderedRoles.map(r => ( |
wu | 70fc8c5 | 2025-06-19 15:55:03 +0800 | [diff] [blame^] | 82 | <Option key={r} value={r}> |
| 83 | {r} |
| 84 | </Option> |
TRM-coding | d1cbf67 | 2025-06-18 15:15:08 +0800 | [diff] [blame] | 85 | ))} |
| 86 | </Select> |
wu | 70fc8c5 | 2025-06-19 15:55:03 +0800 | [diff] [blame^] | 87 | ) |
| 88 | } |
| 89 | } |
| 90 | ] |
TRM-coding | d1cbf67 | 2025-06-18 15:15:08 +0800 | [diff] [blame] | 91 | |
| 92 | return ( |
| 93 | <div className="admin-container"> |
| 94 | <Table |
| 95 | dataSource={users} |
| 96 | columns={columns} |
| 97 | rowKey="id" |
| 98 | pagination={false} |
| 99 | /> |
| 100 | </div> |
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 | } |