blob: bed6b8fa933526efef7ad860533ae8a238dd7fb1 [file] [log] [blame]
wu70fc8c52025-06-19 15:55:03 +08001// src/components/UserManagement.jsx
TRM-codingd1cbf672025-06-18 15:15:08 +08002
wu70fc8c52025-06-19 15:55:03 +08003import React, { useState, useEffect } from 'react'
4import { useParams } from 'react-router-dom'
5import { Table, Select, message } from 'antd'
6import {
7 fetchUserList,
8 giveUser,
9 giveAdmin,
10 giveSuperAdmin
11} from '../api/posts_trm'
12import '../style/Admin.css'
TRM-codingd1cbf672025-06-18 15:15:08 +080013
wu70fc8c52025-06-19 15:55:03 +080014const { Option } = Select
15const ROLE_LIST = ['用户', '管理员', '超级管理员']
16
17export default function UserManagement() {
18 // 直接从 URL 参数里拿到 superAdminId
19 const { userId: superAdminId } = useParams()
20
21 const [users, setUsers] = useState([])
TRM-codingd1cbf672025-06-18 15:15:08 +080022
23 useEffect(() => {
24 async function load() {
25 try {
wu70fc8c52025-06-19 15:55:03 +080026 // 调用接口获取用户列表
27 const data = await fetchUserList(superAdminId)
28 setUsers(data)
TRM-codingd1cbf672025-06-18 15:15:08 +080029 } catch (e) {
wu70fc8c52025-06-19 15:55:03 +080030 console.error(e)
31 message.error('获取用户列表失败:' + e.message)
TRM-codingd1cbf672025-06-18 15:15:08 +080032 }
33 }
TRM-codingd1cbf672025-06-18 15:15:08 +080034
wu70fc8c52025-06-19 15:55:03 +080035 // 只有当 superAdminId 有值时才发请求
36 if (superAdminId) {
37 load()
38 }
39 }, [superAdminId])
40
41 // 处理角色变更
TRM-codingd1cbf672025-06-18 15:15:08 +080042 const handleRoleChange = async (userId, newRole) => {
43 try {
wu70fc8c52025-06-19 15:55:03 +080044 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-codingd1cbf672025-06-18 15:15:08 +080056 } catch (e) {
wu70fc8c52025-06-19 15:55:03 +080057 console.error(e)
58 message.error('修改失败:' + e.message)
TRM-codingd1cbf672025-06-18 15:15:08 +080059 }
wu70fc8c52025-06-19 15:55:03 +080060 }
TRM-codingd1cbf672025-06-18 15:15:08 +080061
wu70fc8c52025-06-19 15:55:03 +080062 // 表格列定义
TRM-codingd1cbf672025-06-18 15:15:08 +080063 const columns = [
64 { title: '用户名', dataIndex: 'username', key: 'username' },
wu70fc8c52025-06-19 15:55:03 +080065 { title: '角色', dataIndex: 'role', key: 'role' },
TRM-codingd1cbf672025-06-18 15:15:08 +080066 {
67 title: '操作',
68 key: 'action',
69 render: (_, record) => {
wu70fc8c52025-06-19 15:55:03 +080070 // 当前角色排第一
71 const orderedRoles = [
72 record.role,
73 ...ROLE_LIST.filter(r => r !== record.role)
74 ]
TRM-codingd1cbf672025-06-18 15:15:08 +080075 return (
76 <Select
77 value={record.role}
78 style={{ width: 120 }}
79 onChange={value => handleRoleChange(record.id, value)}
80 >
81 {orderedRoles.map(r => (
wu70fc8c52025-06-19 15:55:03 +080082 <Option key={r} value={r}>
83 {r}
84 </Option>
TRM-codingd1cbf672025-06-18 15:15:08 +080085 ))}
86 </Select>
wu70fc8c52025-06-19 15:55:03 +080087 )
88 }
89 }
90 ]
TRM-codingd1cbf672025-06-18 15:15:08 +080091
92 return (
93 <div className="admin-container">
94 <Table
95 dataSource={users}
96 columns={columns}
97 rowKey="id"
98 pagination={false}
99 />
100 </div>
wu70fc8c52025-06-19 15:55:03 +0800101 )
TRM-codingd1cbf672025-06-18 15:15:08 +0800102}