import Table from '@mui/material/Table'; import TableBody from '@mui/material/TableBody'; import TableCell from '@mui/material/TableCell'; import TableContainer from '@mui/material/TableContainer'; import TableHead from '@mui/material/TableHead'; import TableRow from '@mui/material/TableRow'; import Paper from '@mui/material/Paper'; import useTitle from '@/hooks/useTitle'; import { useRequest } from 'ahooks'; import { ListUser, editUser } from '@/apis/apis'; import { useEffect, useRef, useState } from 'react'; import { useAtomValue } from 'jotai'; import { token } from '@/store/store'; import TablePagination from '@mui/material/TablePagination'; import Alert from '@mui/material/Alert'; import Snackbar from '@mui/material/Snackbar'; import Button from '@mui/material/Button'; import TextField from '@mui/material/TextField'; import Box from '@mui/material/Box'; import Chip from '@mui/material/Chip'; import Dialog from '@mui/material/Dialog'; import DialogTitle from '@mui/material/DialogTitle'; import DialogContent from '@mui/material/DialogContent'; import DialogActions from '@mui/material/DialogActions'; import { EditUser, UserInfo } from '@/apis/model'; import { produce } from 'immer' import Checkbox from '@mui/material/Checkbox'; import FormGroup from '@mui/material/FormGroup'; import FormControlLabel from '@mui/material/FormControlLabel'; import SkinViewUUID from '@/components/SkinViewUUID'; import Loading from '@/components/Loading'; export default function UserAdmin() { useTitle("用户管理") const [page, setPage] = useState(1) const nowtoken = useAtomValue(token) const [err, setErr] = useState("") const [email, setEmail] = useState("") const [name, setName] = useState("") const [open, setOpen] = useState(false); const [row, setRow] = useState(null) const handleOpen = (row: UserInfo) => { setRow(row) setOpen(true) } const uq = new URLSearchParams("/api/v1/admin/users") uq.set("page", String(page)) uq.set("email", email) uq.set("name", name) const { data, run } = useRequest(ListUser, { cacheKey: uq.toString(), debounceWait: 300, onError: e => { setErr(String(e)) } }) useEffect(() => { run(page, nowtoken, email, name) }, [page, nowtoken, run, email, name]) return (<> setEmail(v.target.value)} label="邮箱" variant="standard" /> setName(v.target.value)} label="用户名" variant="standard" /> 邮箱 用户名 注册 ip uuid {data?.list.map((row) => ( {row.email} {row.name} {row.reg_ip} {row.uuid} ))}
setPage(page + 1)} />
setErr("")} severity="error">{err} run(page, nowtoken, email, name)} /> ); } interface MyDialogProp { open: boolean setOpen: (b: boolean) => void row: UserInfo | null onUpdate: () => void } function MyDialog({ open, row, setOpen, onUpdate }: MyDialogProp) { const handleClose = () => { setOpen(false) } const [erow, setErow] = useState({ email: "", name: "", password: "", is_admin: false, is_disable: false, del_textures: false, }) const [load, setLoad] = useState(false) const nowToken = useAtomValue(token) const [err, setErr] = useState("") const editValue = useRef({}); useEffect(() => { if (!row) return setErow({ email: row.email, name: row.name, password: "", is_admin: row.is_admin, is_disable: row.is_disable, del_textures: false, }) editValue.current = {} }, [row, open]) const handleOpen = () => { if (load) return setLoad(true) editUser(editValue.current, nowToken, String(row?.uid)).then(() => [setOpen(false), onUpdate(), editValue.current = {}]).finally(() => setLoad(false)). catch(e => setErr(String(e))) } type StringKeys = { [K in keyof T]: T[K] extends string ? K : never; }[keyof T]; function handleSetValue(key: StringKeys>, value: string) { setErow(produce(v => { v[key] = value editValue.current[key] = value })) } type BoolKeys = { [K in keyof T]: T[K] extends boolean ? K : never; }[keyof T]; function handleSetChecked(key: BoolKeys>, value: boolean) { setErow(produce(v => { v[key] = value editValue.current[key] = value })) } return (<> 修改用户信息 handleSetValue('email', e.target.value)} /> handleSetValue('name', e.target.value)} /> handleSetValue('password', e.target.value)} /> handleSetChecked('is_admin', e.target.checked)} />} label="管理权限" /> handleSetChecked('is_disable', e.target.checked)} />} label="禁用" /> handleSetChecked('del_textures', e.target.checked)} />} label="清空材质" /> {load && } setErr("")} severity="error">{err} ) }