diff --git a/.gitignore b/.gitignore index c66bf9086..bb50d5836 100644 --- a/.gitignore +++ b/.gitignore @@ -35,4 +35,5 @@ yarn-error.log* *.tsbuildinfo next-env.d.ts public/trainData/ -.vscode/ \ No newline at end of file +.vscode/ +platform.json \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 972de549c..8f9e8fecd 100644 --- a/Dockerfile +++ b/Dockerfile @@ -55,5 +55,12 @@ USER nextjs EXPOSE 3000 ENV PORT 3000 +ENV MAX_USER '' +ENV AXIOS_PROXY_HOST '' +ENV AXIOS_PROXY_PORT '' +ENV MONGODB_UR '' +ENV MY_MAIL '' +ENV MAILE_CODE '' +ENV TOKEN_KEY '' CMD ["node", "server.js"] diff --git a/src/pages/api/user/sendEmail.ts b/src/pages/api/user/sendEmail.ts index c89e6ba24..6ff5ee2cb 100644 --- a/src/pages/api/user/sendEmail.ts +++ b/src/pages/api/user/sendEmail.ts @@ -2,13 +2,13 @@ import type { NextApiRequest, NextApiResponse } from 'next'; import { jsonRes } from '@/service/response'; import { AuthCode } from '@/service/models/authCode'; -import { connectToDatabase } from '@/service/mongo'; +import { connectToDatabase, User } from '@/service/mongo'; import { sendCode } from '@/service/utils/sendEmail'; import { EmailTypeEnum } from '@/constants/common'; export default async function handler(req: NextApiRequest, res: NextApiResponse) { try { - const { email, type } = req.query; + const { email, type } = req.query as { email: string; type: `${EmailTypeEnum}` }; if (!email || !type) { throw new Error('缺少参数'); @@ -16,6 +16,16 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) await connectToDatabase(); + // 注册人数限流 + if (type === EmailTypeEnum.register) { + const maxCount = process.env.MAX_USER ? +process.env.MAX_USER : Infinity; + const userCount = await User.count(); + + if (userCount >= maxCount) { + throw new Error('当前注册用户已满,请等待名额~'); + } + } + let code = ''; for (let i = 0; i < 6; i++) { code += Math.floor(Math.random() * 10); diff --git a/src/pages/login/components/RegisterForm.tsx b/src/pages/login/components/RegisterForm.tsx index 8851b13af..480cc52e3 100644 --- a/src/pages/login/components/RegisterForm.tsx +++ b/src/pages/login/components/RegisterForm.tsx @@ -1,19 +1,12 @@ import React, { useState, Dispatch, useCallback } from 'react'; -import { - FormControl, - Box, - Input, - Button, - FormErrorMessage, - useToast, - Flex -} from '@chakra-ui/react'; +import { FormControl, Box, Input, Button, FormErrorMessage, Flex } from '@chakra-ui/react'; import { useForm } from 'react-hook-form'; import { PageTypeEnum } from '@/constants/user'; import { postRegister } from '@/api/user'; import { useSendCode } from '@/hooks/useSendCode'; import type { ResLogin } from '@/api/response/user'; import { useScreen } from '@/hooks/useScreen'; +import { useToast } from '@/hooks/useToast'; interface Props { loginSuccess: (e: ResLogin) => void; @@ -28,7 +21,7 @@ interface RegisterType { } const RegisterForm = ({ setPageType, loginSuccess }: Props) => { - const toast = useToast(); + const { toast } = useToast(); const { mediaLgMd } = useScreen(); const { register, @@ -66,15 +59,15 @@ const RegisterForm = ({ setPageType, loginSuccess }: Props) => { ); toast({ title: `注册成功`, - status: 'success', - position: 'top' + status: 'success' }); } catch (error) { typeof error === 'string' && toast({ title: error, status: 'error', - position: 'top' + duration: 4000, + isClosable: true }); } setRequesting(false);