From c99d6998ea4f288a32b745c0883ea50239456c72 Mon Sep 17 00:00:00 2001 From: archer <545436317@qq.com> Date: Wed, 24 May 2023 14:37:01 +0800 Subject: [PATCH] feat: google auth --- package.json | 3 +- pnpm-lock.yaml | 129 ++++-------------- src/api/system.ts | 3 +- src/api/user.ts | 8 +- src/hooks/useSendCode.ts | 8 +- src/pages/_app.tsx | 25 ++-- .../api/openapi/text/gptMessagesSlice.ts | 2 +- .../system/{getFiling.ts => getInitData.ts} | 10 +- src/pages/api/user/sendAuthCode.ts | 16 ++- src/pages/chat/index.tsx | 2 +- src/pages/index.tsx | 9 +- src/pages/kb/components/InputDataModal.tsx | 3 +- src/store/global.ts | 16 +++ src/styles/reset.scss | 28 ++-- src/types/index.d.ts | 6 +- src/utils/plugin/google.ts | 33 +++++ 16 files changed, 150 insertions(+), 151 deletions(-) rename src/pages/api/system/{getFiling.ts => getInitData.ts} (56%) create mode 100644 src/utils/plugin/google.ts diff --git a/package.json b/package.json index a4daf1211..617069c00 100644 --- a/package.json +++ b/package.json @@ -50,10 +50,10 @@ "react-hook-form": "^7.43.1", "react-markdown": "^8.0.5", "react-syntax-highlighter": "^15.5.0", - "redis": "^4.6.5", "rehype-katex": "^6.0.2", "remark-gfm": "^3.0.1", "remark-math": "^5.1.1", + "request-ip": "^3.3.0", "sass": "^1.58.3", "sharp": "^0.31.3", "tunnel": "^0.0.6", @@ -73,6 +73,7 @@ "@types/react": "18.0.28", "@types/react-dom": "18.0.11", "@types/react-syntax-highlighter": "^15.5.6", + "@types/request-ip": "^0.0.37", "@types/tunnel": "^0.0.3", "eslint": "8.34.0", "eslint-config-next": "13.1.6", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a9056797b..9357f950e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -25,6 +25,7 @@ specifiers: '@types/react': 18.0.28 '@types/react-dom': 18.0.11 '@types/react-syntax-highlighter': ^15.5.6 + '@types/request-ip': ^0.0.37 '@types/tunnel': ^0.0.3 axios: ^1.3.3 cookie: ^0.5.0 @@ -58,10 +59,10 @@ specifiers: react-hook-form: ^7.43.1 react-markdown: ^8.0.5 react-syntax-highlighter: ^15.5.0 - redis: ^4.6.5 rehype-katex: ^6.0.2 remark-gfm: ^3.0.1 remark-math: ^5.1.1 + request-ip: ^3.3.0 sass: ^1.58.3 sharp: ^0.31.3 tunnel: ^0.0.6 @@ -109,10 +110,10 @@ dependencies: react-hook-form: registry.npmmirror.com/react-hook-form/7.43.1_react@18.2.0 react-markdown: registry.npmmirror.com/react-markdown/8.0.5_pmekkgnqduwlme35zpnqhenc34 react-syntax-highlighter: registry.npmmirror.com/react-syntax-highlighter/15.5.0_react@18.2.0 - redis: registry.npmmirror.com/redis/4.6.5 rehype-katex: registry.npmmirror.com/rehype-katex/6.0.2 remark-gfm: registry.npmmirror.com/remark-gfm/3.0.1 remark-math: registry.npmmirror.com/remark-math/5.1.1 + request-ip: 3.3.0 sass: registry.npmmirror.com/sass/1.58.3 sharp: registry.npmmirror.com/sharp/0.31.3 tunnel: registry.npmmirror.com/tunnel/0.0.6 @@ -132,6 +133,7 @@ devDependencies: '@types/react': registry.npmmirror.com/@types/react/18.0.28 '@types/react-dom': registry.npmmirror.com/@types/react-dom/18.0.11 '@types/react-syntax-highlighter': registry.npmmirror.com/@types/react-syntax-highlighter/15.5.6 + '@types/request-ip': 0.0.37 '@types/tunnel': registry.npmmirror.com/@types/tunnel/0.0.3 eslint: registry.npmmirror.com/eslint/8.34.0 eslint-config-next: registry.npmmirror.com/eslint-config-next/13.1.6_7kw3g6rralp5ps6mg3uyzz6azm @@ -302,6 +304,19 @@ packages: '@types/unist': 2.0.6 dev: false + /@types/node/14.18.42: + resolution: {integrity: sha512-xefu+RBie4xWlK8hwAzGh3npDz/4VhF6icY/shU+zv/1fNn+ZVG7T7CRwe9LId9sAYRPxI+59QBPuKL3WpyGRg==} + dev: false + + /@types/node/18.14.0: + resolution: {integrity: sha512-5EWrvLmglK+imbCJY0+INViFWUHg1AHel1sq4ZVSfdcNqGy9Edv3UB9IIzzg+xPaUcAgZYcfVs2fBcwDeZzU0A==} + + /@types/request-ip/0.0.37: + resolution: {integrity: sha512-uw6/i3rQnpznxD7LtLaeuZytLhKZK6bRoTS6XVJlwxIOoOpEBU7bgKoVXDNtOg4Xl6riUKHa9bjMVrL6ESqYlQ==} + dependencies: + '@types/node': 18.14.0 + dev: true + /@types/unist/2.0.6: resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==} dev: false @@ -347,6 +362,10 @@ packages: engines: {node: '>=0.10.0'} dev: false + /request-ip/3.3.0: + resolution: {integrity: sha512-cA6Xh6e0fDBBBwH77SLJaJPBmD3nWVAcF9/XAcsrIHdjhFzFiB5aNQFytdjCGPezU3ROwrR11IddKAM08vohxA==} + dev: false + /saslprep/1.0.3: resolution: {integrity: sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==} engines: {node: '>=6'} @@ -4897,72 +4916,6 @@ packages: version: 2.11.6 dev: false - registry.npmmirror.com/@redis/bloom/1.2.0_@redis+client@1.5.6: - resolution: {integrity: sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@redis/bloom/-/bloom-1.2.0.tgz} - id: registry.npmmirror.com/@redis/bloom/1.2.0 - name: '@redis/bloom' - version: 1.2.0 - peerDependencies: - '@redis/client': ^1.0.0 - dependencies: - '@redis/client': registry.npmmirror.com/@redis/client/1.5.6 - dev: false - - registry.npmmirror.com/@redis/client/1.5.6: - resolution: {integrity: sha512-dFD1S6je+A47Lj22jN/upVU2fj4huR7S9APd7/ziUXsIXDL+11GPYti4Suv5y8FuXaN+0ZG4JF+y1houEJ7ToA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@redis/client/-/client-1.5.6.tgz} - name: '@redis/client' - version: 1.5.6 - engines: {node: '>=14'} - dependencies: - cluster-key-slot: registry.npmmirror.com/cluster-key-slot/1.1.2 - generic-pool: registry.npmmirror.com/generic-pool/3.9.0 - yallist: registry.npmmirror.com/yallist/4.0.0 - dev: false - - registry.npmmirror.com/@redis/graph/1.1.0_@redis+client@1.5.6: - resolution: {integrity: sha512-16yZWngxyXPd+MJxeSr0dqh2AIOi8j9yXKcKCwVaKDbH3HTuETpDVPcLujhFYVPtYrngSco31BUcSa9TH31Gqg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@redis/graph/-/graph-1.1.0.tgz} - id: registry.npmmirror.com/@redis/graph/1.1.0 - name: '@redis/graph' - version: 1.1.0 - peerDependencies: - '@redis/client': ^1.0.0 - dependencies: - '@redis/client': registry.npmmirror.com/@redis/client/1.5.6 - dev: false - - registry.npmmirror.com/@redis/json/1.0.4_@redis+client@1.5.6: - resolution: {integrity: sha512-LUZE2Gdrhg0Rx7AN+cZkb1e6HjoSKaeeW8rYnt89Tly13GBI5eP4CwDVr+MY8BAYfCg4/N15OUrtLoona9uSgw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@redis/json/-/json-1.0.4.tgz} - id: registry.npmmirror.com/@redis/json/1.0.4 - name: '@redis/json' - version: 1.0.4 - peerDependencies: - '@redis/client': ^1.0.0 - dependencies: - '@redis/client': registry.npmmirror.com/@redis/client/1.5.6 - dev: false - - registry.npmmirror.com/@redis/search/1.1.2_@redis+client@1.5.6: - resolution: {integrity: sha512-/cMfstG/fOh/SsE+4/BQGeuH/JJloeWuH+qJzM8dbxuWvdWibWAOAHHCZTMPhV3xIlH4/cUEIA8OV5QnYpaVoA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@redis/search/-/search-1.1.2.tgz} - id: registry.npmmirror.com/@redis/search/1.1.2 - name: '@redis/search' - version: 1.1.2 - peerDependencies: - '@redis/client': ^1.0.0 - dependencies: - '@redis/client': registry.npmmirror.com/@redis/client/1.5.6 - dev: false - - registry.npmmirror.com/@redis/time-series/1.0.4_@redis+client@1.5.6: - resolution: {integrity: sha512-ThUIgo2U/g7cCuZavucQTQzA9g9JbDDY2f64u3AbAoz/8vE2lt2U37LamDUVChhaDA3IRT9R6VvJwqnUfTJzng==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@redis/time-series/-/time-series-1.0.4.tgz} - id: registry.npmmirror.com/@redis/time-series/1.0.4 - name: '@redis/time-series' - version: 1.0.4 - peerDependencies: - '@redis/client': ^1.0.0 - dependencies: - '@redis/client': registry.npmmirror.com/@redis/client/1.5.6 - dev: false - registry.npmmirror.com/@rushstack/eslint-patch/1.2.0: resolution: {integrity: sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz} name: '@rushstack/eslint-patch' @@ -5287,16 +5240,11 @@ packages: version: 12.20.55 dev: false - registry.npmmirror.com/@types/node/14.18.42: - resolution: {integrity: sha512-xefu+RBie4xWlK8hwAzGh3npDz/4VhF6icY/shU+zv/1fNn+ZVG7T7CRwe9LId9sAYRPxI+59QBPuKL3WpyGRg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/node/-/node-14.18.42.tgz} - name: '@types/node' - version: 14.18.42 - dev: false - registry.npmmirror.com/@types/node/18.14.0: resolution: {integrity: sha512-5EWrvLmglK+imbCJY0+INViFWUHg1AHel1sq4ZVSfdcNqGy9Edv3UB9IIzzg+xPaUcAgZYcfVs2fBcwDeZzU0A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/node/-/node-18.14.0.tgz} name: '@types/node' version: 18.14.0 + dev: true registry.npmmirror.com/@types/nodemailer/6.4.7: resolution: {integrity: sha512-f5qCBGAn/f0qtRcd4SEn88c8Fp3Swct1731X4ryPKqS61/A3LmmzN8zaEz7hneJvpjFbUUgY7lru/B/7ODTazg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/nodemailer/-/nodemailer-6.4.7.tgz} @@ -5395,7 +5343,7 @@ packages: name: '@types/whatwg-url' version: 8.2.2 dependencies: - '@types/node': registry.npmmirror.com/@types/node/18.14.0 + '@types/node': 18.14.0 '@types/webidl-conversions': registry.npmmirror.com/@types/webidl-conversions/7.0.0 dev: false @@ -5404,7 +5352,7 @@ packages: name: '@types/xml2js' version: 0.4.11 dependencies: - '@types/node': registry.npmmirror.com/@types/node/18.14.0 + '@types/node': 18.14.0 dev: false registry.npmmirror.com/@typescript-eslint/parser/5.52.0_7kw3g6rralp5ps6mg3uyzz6azm: @@ -6117,13 +6065,6 @@ packages: version: 0.0.1 dev: false - registry.npmmirror.com/cluster-key-slot/1.1.2: - resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz} - name: cluster-key-slot - version: 1.1.2 - engines: {node: '>=0.10.0'} - dev: false - registry.npmmirror.com/color-convert/1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz} name: color-convert @@ -7514,13 +7455,6 @@ packages: version: 1.2.3 dev: true - registry.npmmirror.com/generic-pool/3.9.0: - resolution: {integrity: sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/generic-pool/-/generic-pool-3.9.0.tgz} - name: generic-pool - version: 3.9.0 - engines: {node: '>= 4'} - dev: false - registry.npmmirror.com/gensync/1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz} name: gensync @@ -7926,7 +7860,7 @@ packages: name: httpx version: 2.2.7 dependencies: - '@types/node': registry.npmmirror.com/@types/node/14.18.42 + '@types/node': 14.18.42 debug: registry.npmmirror.com/debug/4.3.4 transitivePeerDependencies: - supports-color @@ -10515,19 +10449,6 @@ packages: picomatch: registry.npmmirror.com/picomatch/2.3.1 dev: false - registry.npmmirror.com/redis/4.6.5: - resolution: {integrity: sha512-O0OWA36gDQbswOdUuAhRL6mTZpHFN525HlgZgDaVNgCJIAZR3ya06NTESb0R+TUZ+BFaDpz6NnnVvoMx9meUFg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/redis/-/redis-4.6.5.tgz} - name: redis - version: 4.6.5 - dependencies: - '@redis/bloom': registry.npmmirror.com/@redis/bloom/1.2.0_@redis+client@1.5.6 - '@redis/client': registry.npmmirror.com/@redis/client/1.5.6 - '@redis/graph': registry.npmmirror.com/@redis/graph/1.1.0_@redis+client@1.5.6 - '@redis/json': registry.npmmirror.com/@redis/json/1.0.4_@redis+client@1.5.6 - '@redis/search': registry.npmmirror.com/@redis/search/1.1.2_@redis+client@1.5.6 - '@redis/time-series': registry.npmmirror.com/@redis/time-series/1.0.4_@redis+client@1.5.6 - dev: false - registry.npmmirror.com/reflect-metadata/0.1.13: resolution: {integrity: sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz} name: reflect-metadata diff --git a/src/api/system.ts b/src/api/system.ts index c42102495..34f62e7c6 100644 --- a/src/api/system.ts +++ b/src/api/system.ts @@ -1,6 +1,7 @@ import { GET, POST, PUT } from './request'; import type { ChatModelItemType } from '@/constants/model'; +import type { InitDateResponse } from '@/pages/api/system/getInitData'; -export const getFilling = () => GET<{ beianText: string }>('/system/getFiling'); +export const getInitData = () => GET('/system/getInitData'); export const getSystemModelList = () => GET('/system/getModels'); diff --git a/src/api/user.ts b/src/api/user.ts index 72fedb196..0d156f153 100644 --- a/src/api/user.ts +++ b/src/api/user.ts @@ -6,13 +6,11 @@ import { UserBillType, UserType, UserUpdateParams } from '@/types/user'; import type { PagingData, RequestPaging } from '@/types'; import { PaySchema } from '@/types/mongoSchema'; -export const sendAuthCode = ({ - username, - type -}: { +export const sendAuthCode = (data: { username: string; type: `${UserAuthTypeEnum}`; -}) => GET('/user/sendAuthCode', { username, type }); + googleToken: string; +}) => POST('/user/sendAuthCode', data); export const getTokenLogin = () => GET('/user/tokenLogin'); diff --git a/src/hooks/useSendCode.ts b/src/hooks/useSendCode.ts index c770e7903..92ae6f29c 100644 --- a/src/hooks/useSendCode.ts +++ b/src/hooks/useSendCode.ts @@ -3,8 +3,13 @@ import { sendAuthCode } from '@/api/user'; import { UserAuthTypeEnum } from '@/constants/common'; let timer: any; import { useToast } from './useToast'; +import { getClientToken } from '@/utils/plugin/google'; +import { useGlobalStore } from '@/store/global'; export const useSendCode = () => { + const { + initData: { googleVerKey } + } = useGlobalStore(); const { toast } = useToast(); const [codeSending, setCodeSending] = useState(false); const [codeCountDown, setCodeCountDown] = useState(0); @@ -24,7 +29,8 @@ export const useSendCode = () => { try { await sendAuthCode({ username, - type + type, + googleToken: await getClientToken(googleVerKey) }); setCodeCountDown(60); timer = setInterval(() => { diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index fef78b9cc..6968709fa 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -10,7 +10,7 @@ import NProgress from 'nprogress'; //nprogress module import Router from 'next/router'; import 'nprogress/nprogress.css'; import '../styles/reset.scss'; -import { useToast } from '@/hooks/useToast'; +import { useGlobalStore } from '@/store/global'; //Binding events. Router.events.on('routeChangeStart', () => NProgress.start()); @@ -29,23 +29,20 @@ const queryClient = new QueryClient({ }); export default function App({ Component, pageProps }: AppProps) { - const { toast } = useToast(); - // 校验是否支持 click 事件 + const { + loadInitData, + initData: { googleVerKey } + } = useGlobalStore(); + useEffect(() => { - if (typeof document.createElement('div').click !== 'function') { - toast({ - title: '你的浏览器版本过低', - status: 'warning' - }); - } - }, [toast]); + loadInitData(); + }, []); return ( <> Fast GPT - + {googleVerKey && ( + + )} diff --git a/src/pages/api/openapi/text/gptMessagesSlice.ts b/src/pages/api/openapi/text/gptMessagesSlice.ts index e423b8244..07bf71703 100644 --- a/src/pages/api/openapi/text/gptMessagesSlice.ts +++ b/src/pages/api/openapi/text/gptMessagesSlice.ts @@ -62,5 +62,5 @@ export function gpt_chatItemTokenSlice({ } } - return result; + return result.length === 0 && messages[0] ? [messages[0]] : result; } diff --git a/src/pages/api/system/getFiling.ts b/src/pages/api/system/getInitData.ts similarity index 56% rename from src/pages/api/system/getFiling.ts rename to src/pages/api/system/getInitData.ts index 1b9e273c0..8a31e0cd7 100644 --- a/src/pages/api/system/getFiling.ts +++ b/src/pages/api/system/getInitData.ts @@ -2,10 +2,16 @@ import type { NextApiRequest, NextApiResponse } from 'next'; import { jsonRes } from '@/service/response'; +export type InitDateResponse = { + beianText: string; + googleVerKey: string; +}; + export default async function handler(req: NextApiRequest, res: NextApiResponse) { - jsonRes(res, { + jsonRes(res, { data: { - beianText: process.env.SAFE_BEIAN_TEXT || '' + beianText: process.env.SAFE_BEIAN_TEXT || '', + googleVerKey: process.env.CLIENT_GOOGLE_VER_TOKEN || '' } }); } diff --git a/src/pages/api/user/sendAuthCode.ts b/src/pages/api/user/sendAuthCode.ts index 7653260b0..17f272c54 100644 --- a/src/pages/api/user/sendAuthCode.ts +++ b/src/pages/api/user/sendAuthCode.ts @@ -7,15 +7,29 @@ import { sendPhoneCode, sendEmailCode } from '@/service/utils/sendNote'; import { UserAuthTypeEnum } from '@/constants/common'; import { customAlphabet } from 'nanoid'; const nanoid = customAlphabet('123456789', 6); +import { authGoogleToken } from '@/utils/plugin/google'; +import requestIp from 'request-ip'; export default async function handler(req: NextApiRequest, res: NextApiResponse) { try { - const { username, type } = req.query as { username: string; type: `${UserAuthTypeEnum}` }; + const { username, type, googleToken } = req.body as { + username: string; + type: `${UserAuthTypeEnum}`; + googleToken: string; + }; if (!username || !type) { throw new Error('缺少参数'); } + // google auth + process.env.SERVICE_GOOGLE_VER_TOKEN && + (await authGoogleToken({ + secret: process.env.SERVICE_GOOGLE_VER_TOKEN, + response: googleToken, + remoteip: requestIp.getClientIp(req) || undefined + })); + await connectToDatabase(); const code = nanoid(); diff --git a/src/pages/chat/index.tsx b/src/pages/chat/index.tsx index bd544c4a9..3e86d68b1 100644 --- a/src/pages/chat/index.tsx +++ b/src/pages/chat/index.tsx @@ -291,7 +291,7 @@ const Chat = ({ modelId, chatId }: { modelId: string; chatId: string }) => { }, 100); try { - await gptChatPrompt(newChatList.slice(-2)); + await gptChatPrompt(newChatList.slice(newChatList.length - 2)); } catch (err: any) { toast({ title: typeof err === 'string' ? err : err?.message || '聊天出错了~', diff --git a/src/pages/index.tsx b/src/pages/index.tsx index fcdd2cbc7..db83505cb 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -2,8 +2,6 @@ import React, { useEffect } from 'react'; import { Card, Box, Link, Flex, Image, Button } from '@chakra-ui/react'; import Markdown from '@/components/Markdown'; import { useMarkdown } from '@/hooks/useMarkdown'; -import { getFilling } from '@/api/system'; -import { useQuery } from '@tanstack/react-query'; import { useRouter } from 'next/router'; import { useGlobalStore } from '@/store/global'; @@ -13,7 +11,10 @@ const Home = () => { const router = useRouter(); const { inviterId } = router.query as { inviterId: string }; const { data } = useMarkdown({ url: '/intro.md' }); - const { isPc } = useGlobalStore(); + const { + isPc, + initData: { beianText } + } = useGlobalStore(); useEffect(() => { if (inviterId) { @@ -21,8 +22,6 @@ const Home = () => { } }, [inviterId]); - const { data: { beianText = '' } = {} } = useQuery(['init'], getFilling); - /* 加载动画 */ useEffect(() => { setTimeout(() => { diff --git a/src/pages/kb/components/InputDataModal.tsx b/src/pages/kb/components/InputDataModal.tsx index 7ebbb41cb..839b97552 100644 --- a/src/pages/kb/components/InputDataModal.tsx +++ b/src/pages/kb/components/InputDataModal.tsx @@ -124,7 +124,8 @@ const InputDataModal = ({ Promise; loading: boolean; setLoading: (val: boolean) => null; screenWidth: number; @@ -13,6 +17,18 @@ type State = { export const useGlobalStore = create()( devtools( immer((set, get) => ({ + initData: { + beianText: '', + googleVerKey: '' + }, + async loadInitData() { + try { + const res = await getInitData(); + set((state) => { + state.initData = res; + }); + } catch (error) {} + }, loading: false, setLoading: (val: boolean) => { set((state) => { diff --git a/src/styles/reset.scss b/src/styles/reset.scss index 976f74464..8de5ad988 100644 --- a/src/styles/reset.scss +++ b/src/styles/reset.scss @@ -25,10 +25,6 @@ svg { margin: 0; } -#__next { - height: 100%; -} - ::-webkit-scrollbar { width: 8px; height: 8px; @@ -65,16 +61,26 @@ textarea::placeholder { font-size: 0.85em; } +* { + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + -webkit-focus-ring-color: rgba(0, 0, 0, 0); + outline: none; +} + +#__next { + height: 100%; +} +#nprogress .bar { + background: '#85b1ff' !important; //自定义颜色 +} + .textEllipsis { text-overflow: ellipsis; white-space: nowrap; overflow: hidden; } - -* { - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); - -webkit-focus-ring-color: rgba(0, 0, 0, 0); - outline: none; +.grecaptcha-badge { + display: none !important; } @media (max-width: 900px) { @@ -93,7 +99,3 @@ textarea::placeholder { padding-bottom: env(safe-area-inset-bottom); } } - -#nprogress .bar { - background: '#85b1ff' !important; //自定义颜色 -} diff --git a/src/types/index.d.ts b/src/types/index.d.ts index 4f00b8930..b347922d5 100644 --- a/src/types/index.d.ts +++ b/src/types/index.d.ts @@ -1,18 +1,16 @@ import type { Mongoose } from 'mongoose'; -import type { RedisClientType } from 'redis'; import type { Agent } from 'http'; import type { Pool } from 'pg'; declare global { var mongodb: Mongoose | string | null; - var redisClient: RedisClientType | null; var pgClient: Pool | null; var generatingQA: boolean; - var generatingAbstract: boolean; var generatingVector: boolean; - var QRCode: any; var httpsAgent: Agent; var particlesJS: any; + var grecaptcha: any; + var QRCode: any; interface Window { ['pdfjs-dist/build/pdf']: any; diff --git a/src/utils/plugin/google.ts b/src/utils/plugin/google.ts new file mode 100644 index 000000000..341b6e563 --- /dev/null +++ b/src/utils/plugin/google.ts @@ -0,0 +1,33 @@ +import axios from 'axios'; +import { Obj2Query } from '../tools'; + +export const getClientToken = (googleVerKey: string) => { + if (!grecaptcha?.ready) return ''; + return new Promise((resolve, reject) => { + grecaptcha.ready(async () => { + try { + const token = await grecaptcha.execute(googleVerKey, { + action: 'submit' + }); + resolve(token); + } catch (error) { + reject(error); + } + }); + }); +}; + +// service run +export const authGoogleToken = async (data: { + secret: string; + response: string; + remoteip?: string; +}) => { + const res = await axios.post<{ score?: number }>( + `https://www.recaptcha.net/recaptcha/api/siteverify?${Obj2Query(data)}` + ); + if (res.data.score && res.data.score >= 0.9) { + return Promise.resolve(''); + } + return Promise.reject('非法环境'); +};