2022-12-04 21:42:59 +08:00

68 lines
2.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/python
# -*- coding: utf-8 -*-
# @version : 1.0
# @Creaet Time : 2022/11/9 10:15
# @File : login.py
# @IDE : PyCharm
# @desc : 登录验证装饰器
from fastapi import Request, Depends
from pydantic import BaseModel, validator
from sqlalchemy.ext.asyncio import AsyncSession
from apps.vadmin.auth import models, crud, schemas
from core.database import db_getter
from core.validator import vali_telephone
from typing import Optional
class LoginForm(BaseModel):
telephone: str
password: str
method: str = '0' # 认证方式0密码登录1短信登录
platform: str = '0' # 登录平台0PC端管理系统1移动端管理系统
# validators
_normalize_telephone = validator('telephone', allow_reuse=True)(vali_telephone)
class LoginResult(BaseModel):
status: Optional[bool] = False
user: Optional[schemas.UserOut] = None
msg: Optional[str] = None
class Config:
arbitrary_types_allowed = True
class LoginValidation:
"""
验证用户登录时提交的数据是否有效
"""
def __init__(self, func):
self.func = func
async def __call__(self, data: LoginForm, db: AsyncSession, request: Request) -> LoginResult:
self.result = LoginResult()
options = [models.VadminUser.roles, "roles.menus"]
user = await crud.UserDal(db).get_data(telephone=data.telephone, v_return_none=True, options=options)
if not user:
self.result.msg = "该手机号不存在!"
return self.result
result = await self.func(self, data=data, user=user, request=request)
if not result.status:
self.result.msg = result.msg
elif not user.is_active:
self.result.msg = "此手机号已被冻结!"
elif user.is_cancel:
self.result.msg = "此手机号已被注销!"
elif user:
self.result.msg = "OK"
self.result.status = True
self.result.user = schemas.UserOut.from_orm(user)
await user.update_login_info(db, request.client.host)
return self.result