From fcd256a84b99bbe267f765decc0e395cbb9070f3 Mon Sep 17 00:00:00 2001 From: yang fan Date: Wed, 19 Jul 2023 11:04:46 +0000 Subject: [PATCH] main --- controller/misc.go | 5 ++- web/src/components/LoginForm.js | 20 ++++----- web/src/components/PasswordResetConfirm.js | 47 +++++++++++++++++++--- web/src/components/PasswordResetForm.js | 30 ++++++++------ web/src/components/PersonalSetting.js | 20 ++++++++- web/src/components/RegisterForm.js | 18 +++++---- web/src/pages/About/index.js | 4 +- web/src/pages/TopUp/index.js | 37 ++++++++++------- 8 files changed, 125 insertions(+), 56 deletions(-) diff --git a/controller/misc.go b/controller/misc.go index 755ccbd4..958a3716 100644 --- a/controller/misc.go +++ b/controller/misc.go @@ -127,8 +127,9 @@ func SendPasswordResetEmail(c *gin.Context) { link := fmt.Sprintf("%s/user/reset?email=%s&token=%s", common.ServerAddress, email, code) subject := fmt.Sprintf("%s密码重置", common.SystemName) content := fmt.Sprintf("

您好,你正在进行%s密码重置。

"+ - "

点击此处进行密码重置。

"+ - "

重置链接 %d 分钟内有效,如果不是本人操作,请忽略。

", common.SystemName, link, common.VerificationValidMinutes) + "

点击 此处 进行密码重置。

"+ + "

如果链接无法点击,请尝试点击下面的链接或将其复制到浏览器中打开:
%s

"+ + "

重置链接 %d 分钟内有效,如果不是本人操作,请忽略。

", common.SystemName, link, link, common.VerificationValidMinutes) err := common.SendEmail(subject, email, content) if err != nil { c.JSON(http.StatusOK, gin.H{ diff --git a/web/src/components/LoginForm.js b/web/src/components/LoginForm.js index bcc2df65..71ffc15f 100644 --- a/web/src/components/LoginForm.js +++ b/web/src/components/LoginForm.js @@ -25,7 +25,9 @@ const LoginForm = () => { const { username, password } = inputs; const [userState, userDispatch] = useContext(UserContext); let navigate = useNavigate(); - + function handleNavigateTo(url) { + navigate(url); + } const [status, setStatus] = useState({}); const logo = getLogo(); @@ -119,20 +121,18 @@ const LoginForm = () => { value={password} onChange={handleChange} /> - - 忘记密码? - - 点击重置 - - ; 没有账户? - - 点击注册 - + + {status.github_oauth || status.wechat_login ? ( <> diff --git a/web/src/components/PasswordResetConfirm.js b/web/src/components/PasswordResetConfirm.js index 72d3b41f..d82ae895 100644 --- a/web/src/components/PasswordResetConfirm.js +++ b/web/src/components/PasswordResetConfirm.js @@ -12,6 +12,11 @@ const PasswordResetConfirm = () => { const [loading, setLoading] = useState(false); + const [disableButton, setDisableButton] = useState(false); + const [countdown, setCountdown] = useState(30); + + const [newPassword, setNewPassword] = useState(''); + const [searchParams, setSearchParams] = useSearchParams(); useEffect(() => { let token = searchParams.get('token'); @@ -22,7 +27,21 @@ const PasswordResetConfirm = () => { }); }, []); + useEffect(() => { + let countdownInterval = null; + if (disableButton && countdown > 0) { + countdownInterval = setInterval(() => { + setCountdown(countdown - 1); + }, 1000); + } else if (countdown === 0) { + setDisableButton(false); + setCountdown(30); + } + return () => clearInterval(countdownInterval); + }, [disableButton, countdown]); + async function handleSubmit(e) { + setDisableButton(true); if (!email) return; setLoading(true); const res = await API.post(`/api/user/reset`, { @@ -32,14 +51,15 @@ const PasswordResetConfirm = () => { const { success, message } = res.data; if (success) { let password = res.data.data; + setNewPassword(password); await copy(password); - showNotice(`密码已重置并已复制到剪贴板:${password}`); + showNotice(`新密码已复制到剪贴板:${password}`); } else { showError(message); } setLoading(false); } - + return ( @@ -57,20 +77,37 @@ const PasswordResetConfirm = () => { value={email} readOnly /> + {newPassword && ( + { + e.target.select(); + navigator.clipboard.writeText(newPassword); + showNotice(`密码已复制到剪贴板:${newPassword}`); + }} + /> + )} - ); + ); }; export default PasswordResetConfirm; diff --git a/web/src/components/PasswordResetForm.js b/web/src/components/PasswordResetForm.js index 8de95d6c..3d3e3ca9 100644 --- a/web/src/components/PasswordResetForm.js +++ b/web/src/components/PasswordResetForm.js @@ -13,24 +13,29 @@ const PasswordResetForm = () => { const [turnstileEnabled, setTurnstileEnabled] = useState(false); const [turnstileSiteKey, setTurnstileSiteKey] = useState(''); const [turnstileToken, setTurnstileToken] = useState(''); - + const [disableButton, setDisableButton] = useState(false); + const [countdown, setCountdown] = useState(30); + useEffect(() => { - let status = localStorage.getItem('status'); - if (status) { - status = JSON.parse(status); - if (status.turnstile_check) { - setTurnstileEnabled(true); - setTurnstileSiteKey(status.turnstile_site_key); - } + let countdownInterval = null; + if (disableButton && countdown > 0) { + countdownInterval = setInterval(() => { + setCountdown(countdown - 1); + }, 1000); + } else if (countdown === 0) { + setDisableButton(false); + setCountdown(30); } - }, []); + return () => clearInterval(countdownInterval); + }, [disableButton, countdown]); function handleChange(e) { const { name, value } = e.target; - setInputs((inputs) => ({ ...inputs, [name]: value })); + setInputs(inputs => ({ ...inputs, [name]: value })); } async function handleSubmit(e) { + setDisableButton(true); if (!email) return; if (turnstileEnabled && turnstileToken === '') { showInfo('请稍后几秒重试,Turnstile 正在检查用户环境!'); @@ -78,13 +83,14 @@ const PasswordResetForm = () => { <> )} diff --git a/web/src/components/PersonalSetting.js b/web/src/components/PersonalSetting.js index 6c6ea49f..f201a3cd 100644 --- a/web/src/components/PersonalSetting.js +++ b/web/src/components/PersonalSetting.js @@ -17,6 +17,8 @@ const PersonalSetting = () => { const [turnstileSiteKey, setTurnstileSiteKey] = useState(''); const [turnstileToken, setTurnstileToken] = useState(''); const [loading, setLoading] = useState(false); + const [disableButton, setDisableButton] = useState(false); + const [countdown, setCountdown] = useState(30); useEffect(() => { let status = localStorage.getItem('status'); @@ -30,6 +32,19 @@ const PersonalSetting = () => { } }, []); + useEffect(() => { + let countdownInterval = null; + if (disableButton && countdown > 0) { + countdownInterval = setInterval(() => { + setCountdown(countdown - 1); + }, 1000); + } else if (countdown === 0) { + setDisableButton(false); + setCountdown(30); + } + return () => clearInterval(countdownInterval); // Clean up on unmount + }, [disableButton, countdown]); + const handleInputChange = (e, { name, value }) => { setInputs((inputs) => ({ ...inputs, [name]: value })); }; @@ -78,6 +93,7 @@ const PersonalSetting = () => { }; const sendVerificationCode = async () => { + setDisableButton(true); if (inputs.email === '') return; if (turnstileEnabled && turnstileToken === '') { showInfo('请稍后几秒重试,Turnstile 正在检查用户环境!'); @@ -195,8 +211,8 @@ const PersonalSetting = () => { name='email' type='email' action={ - } /> diff --git a/web/src/components/RegisterForm.js b/web/src/components/RegisterForm.js index d70869e6..fedc272c 100644 --- a/web/src/components/RegisterForm.js +++ b/web/src/components/RegisterForm.js @@ -45,7 +45,9 @@ const RegisterForm = () => { }); let navigate = useNavigate(); - + function handleNavigateTo(url) { + navigate(url); + } function handleChange(e) { const { name, value } = e.target; console.log(name, value); @@ -178,21 +180,23 @@ const RegisterForm = () => { <> )} - 已有账户? - - 点击登录 - + + diff --git a/web/src/pages/About/index.js b/web/src/pages/About/index.js index 6a05f526..ec13f151 100644 --- a/web/src/pages/About/index.js +++ b/web/src/pages/About/index.js @@ -46,9 +46,7 @@ const About = () => { about.startsWith('https://') ?