blob: 8eb48e3b98c6d3c607197acfea3c62020ac4d5fa [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([])
trm9984ee52025-06-20 15:16:56 +000022 const [unauthorized, setUnauthorized] = useState(false)
TRM-codingd1cbf672025-06-18 15:15:08 +080023
24 useEffect(() => {
25 async function load() {
26 try {
wu70fc8c52025-06-19 15:55:03 +080027 // 调用接口获取用户列表
28 const data = await fetchUserList(superAdminId)
trm9984ee52025-06-20 15:16:56 +000029
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-codingd1cbf672025-06-18 15:15:08 +080049 } catch (e) {
wu70fc8c52025-06-19 15:55:03 +080050 console.error(e)
trm9984ee52025-06-20 15:16:56 +000051 if (e.message === 'Unauthorized') {
52 setUnauthorized(true)
53 setUsers([])
54 } else {
55 message.error('获取用户列表失败:' + e.message)
56 }
TRM-codingd1cbf672025-06-18 15:15:08 +080057 }
58 }
TRM-codingd1cbf672025-06-18 15:15:08 +080059
wu70fc8c52025-06-19 15:55:03 +080060 // 只有当 superAdminId 有值时才发请求
61 if (superAdminId) {
62 load()
63 }
64 }, [superAdminId])
65
66 // 处理角色变更
TRM-codingd1cbf672025-06-18 15:15:08 +080067 const handleRoleChange = async (userId, newRole) => {
68 try {
trm9984ee52025-06-20 15:16:56 +000069 let result
wu70fc8c52025-06-19 15:55:03 +080070 if (newRole === '用户') {
trm9984ee52025-06-20 15:16:56 +000071 result = await giveUser(userId)
wu70fc8c52025-06-19 15:55:03 +080072 } else if (newRole === '管理员') {
trm9984ee52025-06-20 15:16:56 +000073 result = await giveAdmin(userId)
wu70fc8c52025-06-19 15:55:03 +080074 } else if (newRole === '超级管理员') {
trm9984ee52025-06-20 15:16:56 +000075 result = await giveSuperAdmin(userId)
wu70fc8c52025-06-19 15:55:03 +080076 }
trm9984ee52025-06-20 15:16:56 +000077
78 // 检查返回结果是否有权限错误
79 if (result && result.status === 'error' && result.message === 'Unauthorized') {
80 setUnauthorized(true)
81 message.error('权限不足,无法执行此操作')
82 return
83 }
84
wu70fc8c52025-06-19 15:55:03 +080085 // 本地更新状态
86 setUsers(us =>
87 us.map(u => (u.id === userId ? { ...u, role: newRole } : u))
88 )
89 message.success('修改成功')
TRM-codingd1cbf672025-06-18 15:15:08 +080090 } catch (e) {
wu70fc8c52025-06-19 15:55:03 +080091 console.error(e)
trm9984ee52025-06-20 15:16:56 +000092 if (e.message === 'Unauthorized') {
93 setUnauthorized(true)
94 message.error('权限不足,无法执行此操作')
95 } else {
96 message.error('修改失败:' + e.message)
97 }
TRM-codingd1cbf672025-06-18 15:15:08 +080098 }
wu70fc8c52025-06-19 15:55:03 +080099 }
TRM-codingd1cbf672025-06-18 15:15:08 +0800100
wu70fc8c52025-06-19 15:55:03 +0800101 // 表格列定义
TRM-codingd1cbf672025-06-18 15:15:08 +0800102 const columns = [
103 { title: '用户名', dataIndex: 'username', key: 'username' },
wu70fc8c52025-06-19 15:55:03 +0800104 { title: '角色', dataIndex: 'role', key: 'role' },
TRM-codingd1cbf672025-06-18 15:15:08 +0800105 {
106 title: '操作',
107 key: 'action',
108 render: (_, record) => {
wu70fc8c52025-06-19 15:55:03 +0800109 // 当前角色排第一
110 const orderedRoles = [
111 record.role,
112 ...ROLE_LIST.filter(r => r !== record.role)
113 ]
TRM-codingd1cbf672025-06-18 15:15:08 +0800114 return (
115 <Select
116 value={record.role}
117 style={{ width: 120 }}
118 onChange={value => handleRoleChange(record.id, value)}
119 >
120 {orderedRoles.map(r => (
wu70fc8c52025-06-19 15:55:03 +0800121 <Option key={r} value={r}>
122 {r}
123 </Option>
TRM-codingd1cbf672025-06-18 15:15:08 +0800124 ))}
125 </Select>
wu70fc8c52025-06-19 15:55:03 +0800126 )
127 }
128 }
129 ]
TRM-codingd1cbf672025-06-18 15:15:08 +0800130
131 return (
132 <div className="admin-container">
trm9984ee52025-06-20 15:16:56 +0000133 {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-codingd1cbf672025-06-18 15:15:08 +0800150 </div>
wu70fc8c52025-06-19 15:55:03 +0800151 )
TRM-codingd1cbf672025-06-18 15:15:08 +0800152}