From 39e9aa20bd8ad4a39ba6b847619e0d15abb2479e Mon Sep 17 00:00:00 2001
From: luxiaotao1123 <t1341870251@gmail.com>
Date: 星期四, 13 二月 2025 22:17:23 +0800
Subject: [PATCH] #

---
 rsf-admin/src/api/auth/index.js                                                       |   11 ++++-
 rsf-server/src/main/java/com/vincent/rsf/server/common/service/EmailService.java      |   15 ++++++-
 rsf-server/src/main/java/com/vincent/rsf/server/system/controller/AuthController.java |    5 ++
 rsf-admin/src/page/login/Register.jsx                                                 |   61 +++++++++++++++++++++---------
 rsf-framework/src/main/java/com/vincent/rsf/framework/common/BaseRes.java             |    4 +-
 5 files changed, 70 insertions(+), 26 deletions(-)

diff --git a/rsf-admin/src/api/auth/index.js b/rsf-admin/src/api/auth/index.js
index 6cd4d6f..e61d2f0 100644
--- a/rsf-admin/src/api/auth/index.js
+++ b/rsf-admin/src/api/auth/index.js
@@ -9,7 +9,7 @@
 }
 
 export async function tenants(_params) {
-    const res = await request.get('/tenant/list', _params);
+    const res = await request.get('/tenant/list', { params: _params });
     if (res.data.code === 200) {
         return res.data.data;
     }
@@ -25,7 +25,7 @@
 }
 
 export async function menus(_params) {
-    return await request.get('/auth/menu', _params);
+    return await request.get('/auth/menu', { params: _params });
     if (res.data.code === 200) {
         return res.data.data;
     }
@@ -33,7 +33,7 @@
 }
 
 export async function queryUserInfo(_params) {
-    const res = await request.get('/auth/user', _params);
+    const res = await request.get('/auth/user', { params: _params });
     if (res.data.code === 200) {
         return res.data.data;
     }
@@ -51,4 +51,9 @@
 export async function requestResetPassword(_params) {
     const res = await request.post('/auth/reset/password', _params);
     return res.data;
+}
+
+export async function sendEmailCode(_params) {
+    const res = await request.get('/email/code', { params: _params });
+    return res.data;
 }
\ No newline at end of file
diff --git a/rsf-admin/src/page/login/Register.jsx b/rsf-admin/src/page/login/Register.jsx
index 881f5be..f927d52 100644
--- a/rsf-admin/src/page/login/Register.jsx
+++ b/rsf-admin/src/page/login/Register.jsx
@@ -15,11 +15,13 @@
     useTranslate,
     useLogin,
     useNotify,
+    email as validEmail,
 } from 'react-admin';
 import { useForm, Controller } from 'react-hook-form';
 import ProviderChoices from "./ProviderChoices";
 import Visibility from '@mui/icons-material/Visibility';
 import VisibilityOff from '@mui/icons-material/VisibilityOff';
+import { sendEmailCode } from '@/api/auth';
 
 const Register = (props) => {
     const translate = useTranslate();
@@ -28,7 +30,7 @@
     const location = useLocation();
     const { systemInfo } = props;
 
-    const { control, watch, handleSubmit, setValue } = useForm();
+    const { control, watch, handleSubmit, setValue, setError, clearErrors } = useForm();
 
     const email = watch('email');
     const username = watch('username');
@@ -36,20 +38,40 @@
     const confirmPassword = watch('confirmPassword');
 
     const [loading, setLoading] = useState(false);
+    const [codeLoading, setCodeLoading] = useState(false);
     const [showPassword, setShowPassword] = useState(true);
-
-
     const [isCounting, setIsCounting] = useState(false);
     const [countdown, setCountdown] = useState(60);
 
-    // 澶勭悊楠岃瘉鐮佹寜閽偣鍑�
     const handleSendCode = async () => {
-        // 杩欓噷鍋囪鍙戦�侀獙璇佺爜鐨勮姹�
-        const response = await fetch('/api/send-code');
-        if (response.ok) {
-            setIsCounting(true);
-            localStorage.setItem('codeCountdown', 60); // 瀛樺偍鍊掕鏃跺埌鏈湴
+        if (!email) {
+            setError("email", {
+                message: translate('ra.validation.required')
+            })
+            return;
         }
+        const emailError = validEmail()(email);
+        if (emailError) {
+            setError("email", {
+                message: translate("ra.validation.email")
+            })
+            return;
+        }
+        clearErrors("email");
+        setCodeLoading(true);
+        sendEmailCode({ email }).then(res => {
+            setCodeLoading(false);
+            const { code, msg, data } = res;
+            if (code === 200) {
+                notify(msg, { type: 'success', messageArgs: { _: msg } });
+            } else {
+                notify(msg, { type: 'error', messageArgs: { _: msg } });
+            }
+        }).catch((error) => {
+            setCodeLoading(false);
+            notify(error.message, { type: 'error', messageArgs: { _: error.message } });
+            console.error(error);
+        })
     };
 
     // 鍊掕鏃跺姛鑳�
@@ -260,19 +282,22 @@
                         <Button
                             variant="outlined"
                             onClick={handleSendCode}
-                            disabled={isCounting || loading}
+                            disabled={codeLoading || isCounting}
                             sx={{
+                                width: '35%',
                                 mt: 1,
+                                whiteSpace: 'nowrap',
                             }}
                         >
-                            {isCounting ? (
-                                <>
-                                    <CircularProgress size={20} color="primary" sx={{ marginRight: 1 }} />
-                                    {`${countdown}s`}
-                                </>
-                            ) : (
-                                translate('page.login.button.code')
-                            )}
+                            {codeLoading ? (
+                                <CircularProgress size={20} color="primary" sx={{ marginRight: 1 }} />
+                            ) :
+                                isCounting ? (
+                                    `${countdown}s`
+                                ) : (
+                                    translate('page.login.button.code')
+                                )
+                            }
                         </Button>
                     </Box>
 
diff --git a/rsf-framework/src/main/java/com/vincent/rsf/framework/common/BaseRes.java b/rsf-framework/src/main/java/com/vincent/rsf/framework/common/BaseRes.java
index d3fba2c..3eaf4f4 100644
--- a/rsf-framework/src/main/java/com/vincent/rsf/framework/common/BaseRes.java
+++ b/rsf-framework/src/main/java/com/vincent/rsf/framework/common/BaseRes.java
@@ -5,7 +5,7 @@
     String OK = "200-Success";
     String EMPTY = "201-Empty Data";
     String LIMIT = "202-No Authority";
-    String PARAM = "401-Parameters Cannot Be Empty";
+    String PARAM = "203-Parameters Cannot Be Empty";
     String DENIED = "403-Please Re-Login";
     String REPEAT = "407-Already Exist";
     String NO_ACTIVATION = "409-Please Activate The System First";
@@ -14,7 +14,7 @@
 //    String OK = "200-鎿嶄綔鎴愬姛";
 //    String EMPTY = "201-鏆傛棤鏁版嵁";
 //    String LIMIT = "202-鏃犳潈闄�";
-//    String PARAM = "401-鍙傛暟涓虹┖";
+//    String PARAM = "203-鍙傛暟涓虹┖";
 //    String DENIED = "403-璇烽噸鏂扮櫥褰�";
 //    String REPEAT = "407-宸插瓨鍦�";
 //    String NO_ACTIVATION = "409-璇峰厛婵�娲荤郴缁�";
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/common/service/EmailService.java b/rsf-server/src/main/java/com/vincent/rsf/server/common/service/EmailService.java
index fa55f03..0d0dc2f 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/common/service/EmailService.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/common/service/EmailService.java
@@ -15,15 +15,17 @@
 import javax.mail.MessagingException;
 import javax.mail.internet.MimeMessage;
 import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 @Slf4j
 @Service
 public class EmailService {
 
+    private static final String EMAIL_REGEX = "^[a-zA-Z0-9_+&*-]+(?:\\.[a-zA-Z0-9_+&*-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,7}$";
+
     @Value("${spring.mail.username}")
     private String from;
-
-    private final static String TEMPLATE = "Your verification code is: ${code}";
 
     @Autowired
     @SuppressWarnings("all")
@@ -65,4 +67,13 @@
         }
     }
 
+    public boolean isValid(String email) {
+        if (Cools.isEmpty(email)) {
+            return false;
+        }
+        Pattern pattern = Pattern.compile(EMAIL_REGEX);
+        Matcher matcher = pattern.matcher(email);
+        return matcher.matches();
+    }
+
 }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/controller/AuthController.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/controller/AuthController.java
index 5b20e70..f0239f8 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/system/controller/AuthController.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/controller/AuthController.java
@@ -83,10 +83,13 @@
     }
 
     @GetMapping("/email/code")
-    public R emailCode(@RequestParam("email") String email) {
+    public R emailCode(@RequestParam(value = "email", required = false) String email) {
         if (Cools.isEmpty(email)) {
             return R.parse(BaseRes.PARAM);
         }
+        if (!emailService.isValid(email)) {
+            return R.error("Please enter a valid email address");
+        }
         if (null != userService.getByEmail(email, null)) {
             return R.error("Email Already Exist");
         }

--
Gitblit v1.9.1