diff --git a/.env.development b/.env.development
index 14639df..2d4393a 100644
--- a/.env.development
+++ b/.env.development
@@ -1,2 +1,3 @@
VITE_API_URL=http://localhost:8080
-VITE_API_TOKEN_URL=${VITE_API_URL}/token
\ No newline at end of file
+VITE_API_TOKEN_URL=${VITE_API_URL}/token
+VITE_TURNSTILE_SITE_KEY=${TURNSTILE_SITE_KEY}
\ No newline at end of file
diff --git a/.env.production b/.env.production
index 245e99d..5062b96 100644
--- a/.env.production
+++ b/.env.production
@@ -1,2 +1,3 @@
VITE_API_URL=${PRODUCT_API_URL}
-VITE_API_TOKEN_URL=${VITE_API_URL}/token
\ No newline at end of file
+VITE_API_TOKEN_URL=${VITE_API_URL}/token
+VITE_TURNSTILE_SITE_KEY=${TURNSTILE_SITE_KEY}
\ No newline at end of file
diff --git a/.env.testing b/.env.testing
index ecf602a..7475bc2 100644
--- a/.env.testing
+++ b/.env.testing
@@ -1,3 +1,4 @@
NODE_ENV=development
VITE_API_URL=${TEST_API_URL}
-VITE_API_TOKEN_URL=${VITE_API_URL}/token
\ No newline at end of file
+VITE_API_TOKEN_URL=${VITE_API_URL}/token
+VITE_TURNSTILE_SITE_KEY=${TURNSTILE_SITE_KEY}
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index 971b8f1..a071142 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -9,6 +9,7 @@
"version": "0.0.0",
"dependencies": {
"@ant-design/icons": "^5.2.6",
+ "@marsidev/react-turnstile": "^0.4.0",
"antd": "^5.12.1",
"axios": "^1.6.2",
"dayjs": "^1.11.10",
@@ -1231,6 +1232,15 @@
"@jridgewell/sourcemap-codec": "^1.4.14"
}
},
+ "node_modules/@marsidev/react-turnstile": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@marsidev/react-turnstile/-/react-turnstile-0.4.0.tgz",
+ "integrity": "sha512-U0lwTWQhP04AnIdWEbLpF/phpqtblNbrnE4yJMdvGyeOZOTmuHW3wB+V8X+BO55pTXZitp2GgJsrGkbUjwJIeQ==",
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0"
+ }
+ },
"node_modules/@nodelib/fs.scandir": {
"version": "2.1.5",
"resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
diff --git a/package.json b/package.json
index bd89530..8257e58 100644
--- a/package.json
+++ b/package.json
@@ -15,6 +15,7 @@
},
"dependencies": {
"@ant-design/icons": "^5.2.6",
+ "@marsidev/react-turnstile": "^0.4.0",
"antd": "^5.12.1",
"axios": "^1.6.2",
"dayjs": "^1.11.10",
diff --git a/src/constants/common.constants.ts b/src/constants/common.constants.ts
index dbc1338..abbdd71 100644
--- a/src/constants/common.constants.ts
+++ b/src/constants/common.constants.ts
@@ -29,6 +29,7 @@ export const SYSTEM_ERROR = 10050
export const SYSTEM_TIMEOUT = 10051
export const SYSTEM_REQUEST_ILLEGAL = 10052
export const SYSTEM_ARGUMENT_NOT_VALID = 10053
+export const SYSTEM_INVALID_CAPTCHA_CODE = 10054
export const PERMISSION_LOGIN_SUCCESS = 20000
export const PERMISSION_PASSWORD_CHANGE_SUCCESS = 20001
@@ -73,3 +74,5 @@ export const DATABASE_NO_RECORD_FOUND = 30052
export const API_AVATAR_SUCCESS = 50100
export const API_AVATAR_ERROR = 50150
+
+export const H_CAPTCHA_SITE_KEY = import.meta.env.VITE_TURNSTILE_SITE_KEY
diff --git a/src/global.d.ts b/src/global.d.ts
index 54720b5..bb13ebf 100644
--- a/src/global.d.ts
+++ b/src/global.d.ts
@@ -4,6 +4,7 @@
interface ImportMetaEnv {
readonly VITE_API_URL: string
readonly VITE_API_TOKEN_URL: string
+ readonly VITE_TURNSTILE_SITE_KEY: string
}
interface ImportMeta {
@@ -81,6 +82,7 @@ interface RetrieveParam {
interface LoginParam {
account: string
password: string
+ captchaCode: string
}
interface UserWithPowerInfoVo {
diff --git a/src/pages/Sign.tsx b/src/pages/Sign.tsx
index 131afbf..d8c720c 100644
--- a/src/pages/Sign.tsx
+++ b/src/pages/Sign.tsx
@@ -1,10 +1,12 @@
import React, { useState } from 'react'
import { useNavigate } from 'react-router'
import Icon from '@ant-design/icons'
+import { Turnstile } from '@marsidev/react-turnstile'
import '@/assets/css/pages/sign.scss'
import {
COLOR_BACKGROUND,
DATABASE_DUPLICATE_KEY,
+ H_CAPTCHA_SITE_KEY,
PERMISSION_ACCOUNT_NEED_INIT,
PERMISSION_FORGET_SUCCESS,
PERMISSION_LOGIN_SUCCESS,
@@ -15,7 +17,8 @@ import {
PERMISSION_RETRIEVE_SUCCESS,
PERMISSION_USER_DISABLE,
PERMISSION_USER_NOT_FOUND,
- PERMISSION_USERNAME_NOT_FOUND
+ PERMISSION_USERNAME_NOT_FOUND,
+ SYSTEM_INVALID_CAPTCHA_CODE
} from '@/constants/common.constants.ts'
import { getLoginStatus, getUserInfo, requestUserInfo, setToken } from '@/util/auth'
import { AppContext } from '@/App'
@@ -67,22 +70,9 @@ const SignUp: React.FC = () => {
const response = res.data
switch (response.code) {
case PERMISSION_REGISTER_SUCCESS:
- void r_auth_login({
- account: registerParam.email,
- password: registerParam.password
- }).then((res_) => {
- const response_ = res_.data
- switch (response_.code) {
- case PERMISSION_LOGIN_SUCCESS:
- setToken(response_.data?.token ?? '')
- void message.success('恭喜,您快要完成注册了')
- setIsFinish(true)
- break
- default:
- void message.success('出错了,请稍后重试')
- setIsSigningUp(false)
- }
- })
+ setToken(response.data?.token ?? '')
+ void message.success('恭喜,您快要完成注册了')
+ setIsFinish(true)
break
case DATABASE_DUPLICATE_KEY:
void message.error('用户名或邮箱已被注册,请重试')
@@ -632,6 +622,11 @@ const SignIn: React.FC = () => {
const navigate = useNavigate()
const [searchParams] = useSearchParams()
const [isSigningIn, setIsSigningIn] = useState(false)
+ const [captchaCode, setCaptchaCode] = useState('')
+
+ const handleOnTurnstileSuccess = (token: string) => {
+ setCaptchaCode(token)
+ }
const handleOnFinish = (loginParam: LoginParam) => {
if (isSigningIn) {
@@ -639,7 +634,17 @@ const SignIn: React.FC = () => {
}
setIsSigningIn(true)
- void r_auth_login({ account: loginParam.account, password: loginParam.password })
+ if (!captchaCode) {
+ void message.warning('请先通过验证')
+ setIsSigningIn(false)
+ return
+ }
+
+ void r_auth_login({
+ account: loginParam.account,
+ password: loginParam.password,
+ captchaCode
+ })
.then((res) => {
const response = res.data
const { code, data } = response
@@ -696,6 +701,9 @@ const SignIn: React.FC = () => {
)
setIsSigningIn(false)
break
+ case SYSTEM_INVALID_CAPTCHA_CODE:
+ void message.error('验证码有误,请刷新重试')
+ break
default:
void message.error(
<>
@@ -739,6 +747,13 @@ const SignIn: React.FC = () => {
disabled={isSigningIn}
/>
+
+
+
记住密码
request.post(URL_REGISTER, param)
+export const r_auth_register = (param: RegisterParam) => request.post(URL_REGISTER, param)
export const r_auth_resend = () => request.post(URL_RESEND)