diff --git a/offer_backend/apps/accounts/views.py b/offer_backend/apps/accounts/views.py index 73cfccd..1d552f5 100644 --- a/offer_backend/apps/accounts/views.py +++ b/offer_backend/apps/accounts/views.py @@ -50,11 +50,25 @@ class SendCodeView(APIView): class CustomTokenObtainPairView(TokenObtainPairView): - """自定义邮箱验证码登入视图""" - serializer_class = LoginSerializer + """自定义登入视图,支持邮箱验证码和用户名密码两种方式""" def post(self, request, *args, **kwargs): - serializer = self.get_serializer(data=request.data) + # 判断是否是邮箱验证码登入(有 email 和 code)还是用户名密码登入(有 username 和 password) + if 'email' in request.data and 'code' in request.data: + # 邮箱验证码登入 + return self._login_with_code(request) + elif 'username' in request.data and 'password' in request.data: + # 用户名密码登入 + return self._login_with_password(request) + else: + return Response( + {'error': '请提供正确的登入方式'}, + status=status.HTTP_400_BAD_REQUEST + ) + + def _login_with_code(self, request): + """邮箱验证码登入""" + serializer = LoginSerializer(data=request.data) serializer.is_valid(raise_exception=True) user = serializer.validated_data['user'] @@ -64,17 +78,19 @@ class CustomTokenObtainPairView(TokenObtainPairView): vc.mark_as_verified() # 生成 JWT token - refresh = self.get_token(user) + from rest_framework_simplejwt.tokens import RefreshToken + refresh = RefreshToken.for_user(user) return Response({ 'refresh': str(refresh), 'access': str(refresh.access_token), }, status=status.HTTP_200_OK) - @classmethod - def get_token(cls, user): - """使用 TokenObtainPairSerializer 生成 token""" - token = super().get_token(user) - return token + def _login_with_password(self, request): + """用户名密码登入""" + from rest_framework_simplejwt.serializers import TokenObtainPairSerializer + serializer = TokenObtainPairSerializer(data=request.data) + serializer.is_valid(raise_exception=True) + return Response(serializer.validated_data, status=status.HTTP_200_OK) class RegisterView(APIView): diff --git a/offer_frontend/src/views/auth/LoginView.vue b/offer_frontend/src/views/auth/LoginView.vue index a7a4bac..d60bc9a 100644 --- a/offer_frontend/src/views/auth/LoginView.vue +++ b/offer_frontend/src/views/auth/LoginView.vue @@ -1,12 +1,30 @@