From d25c8fa670a8fea0977c85f67b13917b3bdefa89 Mon Sep 17 00:00:00 2001
From: verou <857149855@qq.com>
Date: 星期五, 14 三月 2025 17:01:24 +0800
Subject: [PATCH] fix:增加datagrid

---
 rsf-admin/src/page/settings/BaseSettings.jsx |  292 ++++++++++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 254 insertions(+), 38 deletions(-)

diff --git a/rsf-admin/src/page/settings/BaseSettings.jsx b/rsf-admin/src/page/settings/BaseSettings.jsx
index 78edbda..3a7ff59 100644
--- a/rsf-admin/src/page/settings/BaseSettings.jsx
+++ b/rsf-admin/src/page/settings/BaseSettings.jsx
@@ -1,57 +1,273 @@
 import React, { useState, useRef, useEffect, useMemo } from "react";
-import { useNavigate } from 'react-router-dom';
 import {
-    Edit,
-    SimpleForm,
-    FormDataConsumer,
     useTranslate,
-    TextInput,
-    NumberInput,
-    BooleanInput,
-    SaveButton,
-    SelectInput,
-    Toolbar,
-    Labeled,
-    NumberField,
-    required,
-    useRecordContext,
-    useTheme,
-    useAuthProvider,
+    useNotify,
 } from 'react-admin';
-import { useWatch, useFormContext } from "react-hook-form";
+import { useForm, Controller, useWatch, FormProvider, useFormContext } from "react-hook-form";
 import {
     Stack,
     Grid,
     Box,
     Typography,
-    Card,
-    CardContent,
+    TextField,
+    Button,
+    FormControl,
+    InputLabel,
+    Select,
+    MenuItem,
+    FormHelperText,
+    CircularProgress,
+    LinearProgress,
 } from '@mui/material';
+import { updateUserInfo } from '@/api/auth';
+import avatar from '/avatar.jpg'
 
 const BaseSettings = (props) => {
-    const { children, value, ...other } = props;
+    const translate = useTranslate();
+    const notify = useNotify();
+    const { children, userInfo } = props;
+
+    const {
+        control,
+        handleSubmit,
+        watch,
+        setValue,
+        getValues,
+        reset,
+        formState: {
+            errors,
+            isDirty,
+        },
+        setError,
+        clearErrors,
+    } = useForm();
+
+    const [loading, setLoading] = useState(false);
+
+    useEffect(() => {
+        if (userInfo) {
+            setValue("username", userInfo.username || "", { shouldDirty: false });
+            setValue("nickname", userInfo.nickname || "", { shouldDirty: false });
+            setValue("sex", userInfo.sex ?? "", { shouldDirty: false });
+            setValue("code", userInfo.code || "", { shouldDirty: false });
+            setValue("phone", userInfo.phone || "", { shouldDirty: false });
+            setValue("email", userInfo.email || "", { shouldDirty: false });
+            setValue("realName", userInfo.realName || "", { shouldDirty: false });
+            setValue("idCard", userInfo.idCard || "", { shouldDirty: false });
+        }
+    }, [userInfo, setValue])
+
+    const onSubmit = (data) => {
+        setLoading(true);
+        updateUserInfo({ id: userInfo.id, ...data }).then(res => {
+            setLoading(false);
+            const { code, msg, data } = res;
+            if (code === 200) {
+                notify(msg, { type: 'success', messageArgs: { _: msg } });
+                const userToPersist = {
+                    avatar: avatar,
+                    fullName: data.nickname,
+                    id: data.id,
+                    username: data.username
+                }
+                localStorage.setItem("user", JSON.stringify(userToPersist));
+            } else if (code === 10005 || code === 10006) {
+                setError('email', {
+                    message: msg
+                })
+            } else {
+                notify(msg, { type: 'error', messageArgs: { _: msg } });
+            }
+        }).catch((error) => {
+            setLoading(false);
+            notify(error.message, { type: 'error', messageArgs: { _: error.message } });
+            console.error(error);
+        })
+    }
 
     return (
-        <Box
-            hidden={value !== 0}
-            sx={{ p: 3 }}
-            {...other}
-        >
-            <Grid container spacing={6}>
-                <Grid item xs={12}>
-                    {/* https://github.com/themeselection/materio-mui-nextjs-admin-template-free/blob/main/javascript-version/src/views/account-settings/account/AccountDetails.jsx */}
-                    <Card>
-                        <CardContent className='mbe-5'>
-                            <Typography>
-                                Base Settings
-                            </Typography>
-                        </CardContent>
-                    </Card>
+        <Box sx={{
+            position: 'relative',
+            p: 3,
+            flex: 1,
+            overflow: 'auto',
+        }}>
+            {!userInfo && (
+                <LinearProgress
+                    sx={{
+                        height: "2px",
+                        position: 'absolute',
+                        top: 0,
+                        left: 0,
+                        right: 0,
+                    }}
+                />
+            )}
+            <form onSubmit={handleSubmit(onSubmit)} noValidate>
+                <Stack
+                    direction='column'
+                    spacing={3}
+                    sx={{
+                        width: '30%',
+                        pt: 1
+                    }}
+                >
+                    <Controller
+                        name="username"
+                        control={control}
+                        defaultValue=""
+                        rules={{ required: true }}
+                        render={({ field, fieldState: { error } }) => (
+                            <TextField
+                                {...field}
+                                label={translate('table.field.user.username')}
+                                variant="outlined"
+                                autoComplete="off"
+                                helperText={error ? translate('ra.validation.required') : ""}
+                                disabled
+                            />
+                        )}
+                    />
+                    <Controller
+                        name="nickname"
+                        control={control}
+                        defaultValue=""
+                        rules={{ required: true }}
+                        render={({ field, fieldState: { error } }) => (
+                            <TextField
+                                {...field}
+                                label={translate('table.field.user.nickname')}
+                                variant="outlined"
+                                autoComplete="off"
+                                error={!!error}
+                                helperText={error ? translate('ra.validation.required') : ""}
+                            />
+                        )}
+                    />
+                    <Controller
+                        name="sex"
+                        control={control}
+                        defaultValue=""
+                        rules={{ required: true }}
+                        render={({ field, fieldState: { error } }) => (
+                            <FormControl fullWidth variant="outlined" error={!!error}>
+                                <InputLabel>{translate('table.field.user.sex')}</InputLabel>
+                                <Select
+                                    {...field}
+                                    label={translate('table.field.user.sex')}
+                                >
+                                    <MenuItem value={0}>
+                                        <em>{translate('table.field.user.sexes.unknown')}</em>
+                                    </MenuItem>
+                                    <MenuItem value={1}>{translate('table.field.user.sexes.male')}</MenuItem>
+                                    <MenuItem value={2}>{translate('table.field.user.sexes.female')}</MenuItem>
+                                </Select>
+                                {error && <FormHelperText>{translate('ra.validation.required')}</FormHelperText>}
+                            </FormControl>
+                        )}
+                    />
+                    <Controller
+                        name="code"
+                        control={control}
+                        defaultValue=""
+                        rules={{ required: false }}
+                        render={({ field, fieldState: { error } }) => (
+                            <TextField
+                                {...field}
+                                label={translate('table.field.user.code')}
+                                variant="outlined"
+                                autoComplete="off"
+                                error={!!error}
+                                helperText={error ? translate('ra.validation.required') : ""}
+                            />
+                        )}
+                    />
+                    <Controller
+                        name="phone"
+                        control={control}
+                        defaultValue=""
+                        rules={{ required: false }}
+                        render={({ field, fieldState: { error } }) => (
+                            <TextField
+                                {...field}
+                                label={translate('table.field.user.phone')}
+                                variant="outlined"
+                                autoComplete="off"
+                                error={!!error}
+                                helperText={error ? translate('ra.validation.required') : ""}
+                            />
+                        )}
+                    />
+                    <Controller
+                        name="email"
+                        control={control}
+                        defaultValue=""
+                        rules={{
+                            required: false,
+                            pattern: {
+                                value: /^[^\s@]+@[^\s@]+\.[^\s@]+$/,
+                                message: translate("ra.validation.email"),
+                            },
+                        }}
+                        render={({ field, fieldState: { error } }) => (
+                            <TextField
+                                {...field}
+                                label={translate('table.field.user.email')}
+                                variant="outlined"
+                                autoComplete="off"
+                                error={!!error}
+                                helperText={error ? error.message : ""}
+                            />
+                        )}
+                    />
+                    <Controller
+                        name="realName"
+                        control={control}
+                        defaultValue=""
+                        rules={{ required: false }}
+                        render={({ field, fieldState: { error } }) => (
+                            <TextField
+                                {...field}
+                                label={translate('table.field.user.realName')}
+                                variant="outlined"
+                                autoComplete="off"
+                                error={!!error}
+                                helperText={error ? translate('ra.validation.required') : ""}
+                            />
+                        )}
+                    />
+                    <Controller
+                        name="idCard"
+                        control={control}
+                        defaultValue=""
+                        rules={{ required: false }}
+                        render={({ field, fieldState: { error } }) => (
+                            <TextField
+                                {...field}
+                                label={translate('table.field.user.idCard')}
+                                variant="outlined"
+                                autoComplete="off"
+                                error={!!error}
+                                helperText={error ? translate('ra.validation.required') : ""}
+                            />
+                        )}
+                    />
+                    <Button
+                        type="submit"
+                        variant="contained"
+                        disabled={loading || !isDirty}
+                        sx={{
+                            alignSelf: 'flex-start',
+                            width: '120px'
+                        }}
+                    >
+                        {loading && <CircularProgress size={25} thickness={2} />}
+                        {translate('ra.action.save')}
+                    </Button>
+                </Stack>
+            </form>
 
-                </Grid>
-            </Grid>
         </Box>
-
     )
 }
 

--
Gitblit v1.9.1