From 9af56f878cc3e22d3bce6ab53d67f3753470a7ac Mon Sep 17 00:00:00 2001
From: vincentlu <t1341870251@gmail.com>
Date: 星期五, 14 二月 2025 08:59:22 +0800
Subject: [PATCH] #

---
 rsf-admin/src/api/auth/index.js                                                              |    5 +
 rsf-server/src/main/java/com/vincent/rsf/server/system/controller/AuthController.java        |   17 +++--
 rsf-admin/src/page/settings/SecuritySettings.jsx                                             |    6 +-
 rsf-server/src/main/java/com/vincent/rsf/server/common/domain/BusinessRes.java               |   11 +++
 rsf-admin/src/page/settings/BaseSettings.jsx                                                 |    5 +
 rsf-framework/src/main/java/com/vincent/rsf/framework/common/R.java                          |    6 +-
 rsf-admin/src/config/authProvider.js                                                         |    2 
 rsf-server/src/main/resources/application-prod.yml                                           |    2 
 rsf-admin/src/page/login/Register.jsx                                                        |   65 ++++++++++-----------
 rsf-server/src/main/java/com/vincent/rsf/server/system/service/impl/TenantServiceImpl.java   |    4 +
 rsf-server/src/main/java/com/vincent/rsf/server/common/config/ConfigProperties.java          |    5 +
 rsf-server/src/main/resources/application.yml                                                |    3 
 rsf-server/src/main/java/com/vincent/rsf/server/common/exception/GlobalExceptionHandler.java |    2 
 rsf-server/src/main/resources/application-dev.yml                                            |   29 +++------
 14 files changed, 91 insertions(+), 71 deletions(-)

diff --git a/rsf-admin/src/api/auth/index.js b/rsf-admin/src/api/auth/index.js
index e61d2f0..99d1cf5 100644
--- a/rsf-admin/src/api/auth/index.js
+++ b/rsf-admin/src/api/auth/index.js
@@ -24,6 +24,11 @@
     return Promise.reject(new Error(res.data.msg));
 }
 
+export async function register(_params) {
+    const res = await request.post('/register', _params);
+    return res.data;
+}
+
 export async function menus(_params) {
     return await request.get('/auth/menu', { params: _params });
     if (res.data.code === 200) {
diff --git a/rsf-admin/src/config/authProvider.js b/rsf-admin/src/config/authProvider.js
index 38cf41d..ee3f976 100644
--- a/rsf-admin/src/config/authProvider.js
+++ b/rsf-admin/src/config/authProvider.js
@@ -11,6 +11,8 @@
       username: username,
       password: password,
       tenantId: tenantId,
+    }).catch((error) => {
+      console.error(error);
     });
 
     if (user && accessToken) {
diff --git a/rsf-admin/src/page/login/Register.jsx b/rsf-admin/src/page/login/Register.jsx
index f927d52..e8a0822 100644
--- a/rsf-admin/src/page/login/Register.jsx
+++ b/rsf-admin/src/page/login/Register.jsx
@@ -21,7 +21,7 @@
 import ProviderChoices from "./ProviderChoices";
 import Visibility from '@mui/icons-material/Visibility';
 import VisibilityOff from '@mui/icons-material/VisibilityOff';
-import { sendEmailCode } from '@/api/auth';
+import { sendEmailCode, register } from '@/api/auth';
 
 const Register = (props) => {
     const translate = useTranslate();
@@ -36,6 +36,7 @@
     const username = watch('username');
     const password = watch('password');
     const confirmPassword = watch('confirmPassword');
+    const code = watch('code');
 
     const [loading, setLoading] = useState(false);
     const [codeLoading, setCodeLoading] = useState(false);
@@ -43,6 +44,7 @@
     const [isCounting, setIsCounting] = useState(false);
     const [countdown, setCountdown] = useState(60);
 
+    // send code
     const handleSendCode = async () => {
         if (!email) {
             setError("email", {
@@ -64,6 +66,9 @@
             const { code, msg, data } = res;
             if (code === 200) {
                 notify(msg, { type: 'success', messageArgs: { _: msg } });
+                setIsCounting(true);
+                setCountdown(60);
+                localStorage.setItem('codeCountdown', 60);
             } else {
                 notify(msg, { type: 'error', messageArgs: { _: msg } });
             }
@@ -74,7 +79,7 @@
         })
     };
 
-    // 鍊掕鏃跺姛鑳�
+    // countdown
     useEffect(() => {
         const savedCountdown = localStorage.getItem('codeCountdown');
         if (savedCountdown && !isCounting) {
@@ -89,43 +94,35 @@
             } else if (countdown <= 0) {
                 clearInterval(interval);
                 setIsCounting(false);
-                localStorage.removeItem('codeCountdown'); // 閲嶇疆
+                localStorage.removeItem('codeCountdown');
             }
         }, 1000);
 
         return () => clearInterval(interval);
     }, [countdown, isCounting]);
 
-
-    const onSubmit = (data) => {
-        notify("Registration is not open yet");
-        return;
+    // register
+    const onSubmit = (params) => {
+        // console.log(params);
         setLoading(true);
-        // js native confirm && root
-        login(
-            data,
-            location.state ? (location.state).nextPathname : '/'
-        ).catch((error) => {
+        register(params).then(res => {
             setLoading(false);
-            notify(
-                typeof error === 'string'
-                    ? error
-                    : typeof error === 'undefined' || !error.message
-                        ? 'ra.auth.sign_in_error'
-                        : error.message,
-                {
-                    type: 'error',
-                    messageArgs: {
-                        _:
-                            typeof error === 'string'
-                                ? error
-                                : error && error.message
-                                    ? error.message
-                                    : undefined,
-                    },
-                }
-            );
-        });
+            const { code, msg, data } = res;
+            if (code === 200) {
+                console.log(data);
+                notify(msg, { type: 'success', messageArgs: { _: msg } });
+            } else if (code === 10002) {
+                setError("username", {
+                    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 (
@@ -142,7 +139,7 @@
                         control={control}
                         defaultValue=""
                         rules={{ required: true }}
-                        render={({ field }) => (
+                        render={({ field, fieldState: { error } }) => (
                             <TextField
                                 {...field}
                                 label={translate("page.login.username")}
@@ -150,6 +147,8 @@
                                 disabled={loading}
                                 autoFocus
                                 autoComplete="off"
+                                error={!!error}
+                                helperText={error?.message || ""}
                             />
                         )}
                     />
@@ -306,7 +305,7 @@
                     <Button
                         type="submit"
                         variant="contained"
-                        disabled={loading || !(email && username && password && confirmPassword)}
+                        disabled={loading || !(email && username && password && confirmPassword && code)}
                         sx={{
                             backgroundColor: "#3D4BA7"
                         }}
diff --git a/rsf-admin/src/page/settings/BaseSettings.jsx b/rsf-admin/src/page/settings/BaseSettings.jsx
index de2e62a..0758826 100644
--- a/rsf-admin/src/page/settings/BaseSettings.jsx
+++ b/rsf-admin/src/page/settings/BaseSettings.jsx
@@ -37,7 +37,9 @@
         formState: {
             errors,
             isDirty,
-        }
+        },
+        setError,
+        clearErrors,
     } = useForm();
 
     const [loading, setLoading] = useState(false);
@@ -97,7 +99,6 @@
                     }}
                 />
             )}
-            {/* https://github.com/themeselection/materio-mui-nextjs-admin-template-free/blob/main/javascript-version/src/views/account-settings/account/AccountDetails.jsx */}
             <form onSubmit={handleSubmit(onSubmit)} noValidate>
                 <Stack
                     direction='column'
diff --git a/rsf-admin/src/page/settings/SecuritySettings.jsx b/rsf-admin/src/page/settings/SecuritySettings.jsx
index 265e616..42aeaad 100644
--- a/rsf-admin/src/page/settings/SecuritySettings.jsx
+++ b/rsf-admin/src/page/settings/SecuritySettings.jsx
@@ -38,15 +38,15 @@
         }
     }, [userInfo, setValue])
 
-    const onSubmit = (data) => {
+    const onSubmit = (params) => {
         setLoading(true);
-        requestResetPassword(data).then(res => {
+        requestResetPassword(params).then(res => {
             setLoading(false);
             const { code, msg, data } = res;
             if (code === 200) {
                 notify(msg, { type: 'success', messageArgs: { _: msg } });
                 reset();
-            } else if (code === 408) {
+            } else if (code === 10001) {
                 setError('oldPassword', {
                     message: msg,
                 });
diff --git a/rsf-framework/src/main/java/com/vincent/rsf/framework/common/R.java b/rsf-framework/src/main/java/com/vincent/rsf/framework/common/R.java
index df80b60..08e9772 100644
--- a/rsf-framework/src/main/java/com/vincent/rsf/framework/common/R.java
+++ b/rsf-framework/src/main/java/com/vincent/rsf/framework/common/R.java
@@ -52,9 +52,9 @@
             return parse(BaseRes.ERROR);
         }
         String[] msg = message.split("-");
-        if(msg.length==2){
-            return new R(Integer.parseInt(msg[0]),msg[1]);
-        }else{
+        if (msg.length == 2) {
+            return new R(Integer.parseInt(msg[0].replaceAll(" ", "")), msg[1]);
+        } else {
             return parse("500-".concat(message));
         }
     }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/common/config/ConfigProperties.java b/rsf-server/src/main/java/com/vincent/rsf/server/common/config/ConfigProperties.java
index 2510154..d0443c4 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/common/config/ConfigProperties.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/common/config/ConfigProperties.java
@@ -65,6 +65,11 @@
      */
     private Integer codeTime = 300;
 
+    /**
+     * 瓒呯骇楠岃瘉鐮�
+     */
+    private String securityCode;
+
     public List<String> getSuperUserList() {
         return Arrays.stream(superUsername.split(",")).collect(Collectors.toList());
     }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/common/domain/BusinessRes.java b/rsf-server/src/main/java/com/vincent/rsf/server/common/domain/BusinessRes.java
new file mode 100644
index 0000000..46c7329
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/common/domain/BusinessRes.java
@@ -0,0 +1,11 @@
+package com.vincent.rsf.server.common.domain;
+
+import com.vincent.rsf.framework.common.BaseRes;
+
+public class BusinessRes implements BaseRes {
+
+    public final static String INVALID_PASSWORD = "10001 - The Current Password Was Incorrect";
+
+    public final static String USERNAME_EXIST = "10002 - The username already exist";
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/common/exception/GlobalExceptionHandler.java b/rsf-server/src/main/java/com/vincent/rsf/server/common/exception/GlobalExceptionHandler.java
index 8ea1e24..1c1bbc5 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/common/exception/GlobalExceptionHandler.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/common/exception/GlobalExceptionHandler.java
@@ -44,7 +44,7 @@
     @ExceptionHandler(BusinessException.class)
     public R businessExceptionHandler(BusinessException e, HttpServletResponse response) {
         CommonUtil.addCrossHeaders(response);
-        return R.error(e.getMessage());
+        return R.parse(e.getMessage());
     }
 
     @ResponseBody
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 a985253..efef6cd 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
@@ -8,6 +8,7 @@
 import com.vincent.rsf.framework.exception.CoolException;
 import com.vincent.rsf.server.common.annotation.OperationLog;
 import com.vincent.rsf.server.common.config.ConfigProperties;
+import com.vincent.rsf.server.common.domain.BusinessRes;
 import com.vincent.rsf.server.common.security.JwtSubject;
 import com.vincent.rsf.server.common.service.EmailService;
 import com.vincent.rsf.server.common.service.RedisService;
@@ -111,12 +112,14 @@
             return R.parse(BaseRes.PARAM);
         }
         // verify code
-        String cacheCode = redisService.getValue(EmailType.REGISTER_VERIFY.toString(), param.getEmail());
-        if (Cools.isEmpty(cacheCode)) {
-            return R.error("The verification code has expired.");
-        }
-        if (!cacheCode.equals(param.getCode())) {
-            return R.error("The verification code is incorrect.");
+        if (!param.getCode().equals(configProperties.getSecurityCode())) {
+            String cacheCode = redisService.getValue(EmailType.REGISTER_VERIFY.toString(), param.getEmail());
+            if (Cools.isEmpty(cacheCode)) {
+                return R.error("The verification code has expired.");
+            }
+            if (!cacheCode.equals(param.getCode())) {
+                return R.error("The verification code is incorrect.");
+            }
         }
 
         // register
@@ -195,7 +198,7 @@
             return R.error("Please Login First");
         }
         if (!userService.comparePassword(userService.getById(userId).getPassword(), param.getOldPassword())) {
-            return R.parse("408-The Current Password Was Incorrect");
+            return R.parse(BusinessRes.INVALID_PASSWORD);
         }
         User user = new User();
         user.setId(userId);
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/service/impl/TenantServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/service/impl/TenantServiceImpl.java
index 546f5a3..ea68f4a 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/system/service/impl/TenantServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/service/impl/TenantServiceImpl.java
@@ -4,6 +4,8 @@
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.vincent.rsf.framework.common.Cools;
 import com.vincent.rsf.framework.exception.CoolException;
+import com.vincent.rsf.server.common.domain.BusinessRes;
+import com.vincent.rsf.server.common.exception.BusinessException;
 import com.vincent.rsf.server.common.service.EmailService;
 import com.vincent.rsf.server.system.controller.param.TenantInitParam;
 import com.vincent.rsf.server.system.entity.*;
@@ -48,7 +50,7 @@
         }
 
         if (null != userService.getByUsername(param.getUsername(), null)) {
-            throw new CoolException("the username already exist");
+            throw new BusinessException(BusinessRes.USERNAME_EXIST);
         }
         if (!Cools.isEmpty(param.getEmail())) {
             if (!emailService.isValid(param.getEmail())) {
diff --git a/rsf-server/src/main/resources/application-dev.yml b/rsf-server/src/main/resources/application-dev.yml
index db9d200..9259007 100644
--- a/rsf-server/src/main/resources/application-dev.yml
+++ b/rsf-server/src/main/resources/application-dev.yml
@@ -44,32 +44,21 @@
   jmx:
     enabled: false
   mail:
-    # 163
-#    from: t1731253606@163.com
-#    host: smtp.163.com
-#    port: 465
-#    username: t1731253606@163.com
-#    password: FCqETysH8TfuPqkY
-#    properties:
-#      mail:
-#        smtp:
-#          auth: true
-#          ssl: true
-#          socketFactory:
-#            class: javax.net.ssl.SSLSocketFactory
-    # gmail
-    from: whatsflow.team@gmail.com
-    host: smtp.gmail.com
-    port: 587
-    username: whatsflow.team@gmail.com
-    password: elpc vfwk twnu uoyy
+    from: t1731253606@163.com
+    host: smtp.163.com
+    port: 465
+    username: t1731253606@163.com
+    password: FCqETysH8TfuPqkY
     properties:
       mail:
         smtp:
           auth: true
-          starttls.enable: true
+          ssl: true
           connectiontimeout: 5000
           timeout: 5000
+          socketFactory:
+            class: javax.net.ssl.SSLSocketFactory
+
 
 redis:
   host: 127.0.0.1
diff --git a/rsf-server/src/main/resources/application-prod.yml b/rsf-server/src/main/resources/application-prod.yml
index 74876c3..8ca151c 100644
--- a/rsf-server/src/main/resources/application-prod.yml
+++ b/rsf-server/src/main/resources/application-prod.yml
@@ -54,6 +54,8 @@
         smtp:
           auth: true
           starttls.enable: true
+          connectiontimeout: 5000
+          timeout: 5000
 
 redis:
   host: 127.0.0.1
diff --git a/rsf-server/src/main/resources/application.yml b/rsf-server/src/main/resources/application.yml
index d237769..f2bd85e 100644
--- a/rsf-server/src/main/resources/application.yml
+++ b/rsf-server/src/main/resources/application.yml
@@ -34,4 +34,5 @@
   token-key: KUHSMcYQ4lePt3r6bckz0P13cBJyoonYqInThvQlUnbsFCIcCcZZAbWZ6UNFztYNYPhGdy6eyb8WdIz8FU2Cz396TyTJk3NI2rtXMHBOehRb4WWJ4MdYVVg2oWPyqRQ2
   super-username: root
   code-length: 6
-  code-time: 300
\ No newline at end of file
+  code-time: 300
+  security-code: 951123
\ No newline at end of file

--
Gitblit v1.9.1