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