2023-02-07 08:48:41 +08:00
|
|
|
|
import base64
|
|
|
|
|
|
|
|
|
|
from fastapi import APIRouter, Depends, HTTPException
|
|
|
|
|
from sqlalchemy.orm import Session
|
|
|
|
|
|
2023-02-10 13:54:44 +08:00
|
|
|
|
from Context.common import ctx
|
2023-02-08 14:57:34 +08:00
|
|
|
|
from Crud.UserCrud import get_user_by_email, create_user, rest_user_password
|
2023-02-08 16:26:25 +08:00
|
|
|
|
from Crud import AppCrud
|
2023-02-20 10:19:16 +08:00
|
|
|
|
from CrudModel.AllowedEmail import allowed_email_crud, AllowedEmailQuery
|
2023-02-07 08:48:41 +08:00
|
|
|
|
from Schemas import UserSchemas
|
2023-02-10 13:54:44 +08:00
|
|
|
|
from Schemas.ApiCommonSchemas import CommonRes
|
2023-02-08 16:26:25 +08:00
|
|
|
|
from Utils.AuthUtils import Token, token_data_depend, create_token
|
2023-02-07 08:48:41 +08:00
|
|
|
|
from Utils.EncyptUtil import get_encrypt_password
|
|
|
|
|
from Utils.SqlAlchemyUtils import get_db
|
2023-02-08 14:57:34 +08:00
|
|
|
|
from Utils.VerifyCodeUtils import EmailVerifyCode, ImageCaptchaVerify, EmailVerifyType
|
2023-02-07 08:48:41 +08:00
|
|
|
|
|
|
|
|
|
router = APIRouter(
|
|
|
|
|
tags=["用户注册操作"],
|
2023-02-20 14:55:25 +08:00
|
|
|
|
prefix="/api/user_mod/user_register",
|
2023-02-07 08:48:41 +08:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@router.get("/get_image_captcha", summary="获取图片验证码", response_model=UserSchemas.ImageCaptchaRes)
|
|
|
|
|
def get_image_captcha():
|
|
|
|
|
# 是否加上时间对ip的时间验证
|
2023-02-10 13:54:44 +08:00
|
|
|
|
captcha_id, image_bytes, captcha_code = ImageCaptchaVerify.make_captcha_image()
|
2023-02-07 08:48:41 +08:00
|
|
|
|
img_data = "data:image/png;base64," + base64.b64encode(image_bytes).decode()
|
2023-02-10 13:54:44 +08:00
|
|
|
|
# 注意,测试时才传入captcha_code
|
|
|
|
|
if ctx.env == 'test':
|
|
|
|
|
return UserSchemas.ImageCaptchaRes(captcha_id=captcha_id, img_data=img_data, captcha_code=captcha_code)
|
|
|
|
|
else:
|
|
|
|
|
return UserSchemas.ImageCaptchaRes(captcha_id=captcha_id, img_data=img_data)
|
2023-02-07 08:48:41 +08:00
|
|
|
|
|
|
|
|
|
|
2023-02-10 13:54:44 +08:00
|
|
|
|
# return UserSchemas.ImageCaptchaRes(captcha_id=captcha_id, img_data=img_data)
|
2023-02-07 08:48:41 +08:00
|
|
|
|
|
2023-02-10 13:54:44 +08:00
|
|
|
|
|
|
|
|
|
@router.post("/get_register_email_verify_code", summary="获取邮箱验证码", response_model=CommonRes)
|
2023-02-08 14:57:34 +08:00
|
|
|
|
def get_register_email_verify_code(body: UserSchemas.EmailSendReqBody):
|
2023-02-07 16:09:57 +08:00
|
|
|
|
email = body.email
|
|
|
|
|
EmailVerifyCode.send_register_code(email)
|
2023-02-10 13:54:44 +08:00
|
|
|
|
return {"msg": "验证码已发送至邮箱,请查看", "state": 1}
|
2023-02-07 16:09:57 +08:00
|
|
|
|
|
|
|
|
|
|
2023-02-07 08:48:41 +08:00
|
|
|
|
@router.post("/login", summary="登录", response_model=UserSchemas.LoginResBody)
|
|
|
|
|
def login(body: UserSchemas.LoginReqBody, db: Session = Depends(get_db)):
|
|
|
|
|
# 图片验证码校验
|
|
|
|
|
check_res = ImageCaptchaVerify.check_code(body.captcha_id, body.captcha_code)
|
|
|
|
|
if not check_res:
|
|
|
|
|
raise HTTPException(status_code=202, detail="验证码过期或错误")
|
|
|
|
|
# 密码验证
|
|
|
|
|
# 是否在前端传输时进行一次base64处理
|
2023-02-07 16:09:57 +08:00
|
|
|
|
user_obj = get_user_by_email(db, body.email)
|
2023-02-07 08:48:41 +08:00
|
|
|
|
if user_obj is None:
|
|
|
|
|
raise HTTPException(status_code=404, detail="用户未注册")
|
|
|
|
|
encrypt_password = get_encrypt_password(body.password)
|
|
|
|
|
if encrypt_password != user_obj.password:
|
|
|
|
|
raise HTTPException(status_code=202, detail="密码错误")
|
|
|
|
|
if user_obj.disable:
|
|
|
|
|
raise HTTPException(status_code=202, detail="该账户被禁用")
|
|
|
|
|
|
|
|
|
|
user_info = user_obj.as_info()
|
|
|
|
|
# 生成&加密token信息
|
2023-02-14 14:06:25 +08:00
|
|
|
|
token = create_token({"uid": user_obj.id, "role": user_obj.role,
|
|
|
|
|
"name": user_obj.name, 'post': user_obj.post, "auth_data": user_obj.auth_data})
|
2023-02-07 16:09:57 +08:00
|
|
|
|
return UserSchemas.LoginResBody(**user_info, access_token=token, token_type='bearer')
|
2023-02-07 08:48:41 +08:00
|
|
|
|
|
|
|
|
|
|
2023-02-08 16:26:25 +08:00
|
|
|
|
@router.post("/login_to_app", summary="授权应用登录", response_model=UserSchemas.LoginResBody)
|
|
|
|
|
def login(body: UserSchemas.LoginReqBody, db: Session = Depends(get_db)):
|
|
|
|
|
if not body.app_id:
|
|
|
|
|
raise HTTPException(status_code=202, detail="未传入应用ID")
|
2023-02-20 10:19:16 +08:00
|
|
|
|
app = AppCrud.get_app_by_id(db, body.app_id)
|
2023-02-08 16:26:25 +08:00
|
|
|
|
if not app:
|
|
|
|
|
raise HTTPException(status_code=202, detail="应用信息错误")
|
|
|
|
|
# 图片验证码校验
|
|
|
|
|
check_res = ImageCaptchaVerify.check_code(body.captcha_id, body.captcha_code)
|
|
|
|
|
if not check_res:
|
|
|
|
|
raise HTTPException(status_code=202, detail="验证码过期或错误")
|
|
|
|
|
# 密码验证
|
|
|
|
|
# 是否在前端传输时进行一次base64处理
|
|
|
|
|
user_obj = get_user_by_email(db, body.email)
|
|
|
|
|
if user_obj is None:
|
|
|
|
|
raise HTTPException(status_code=404, detail="用户未注册")
|
|
|
|
|
encrypt_password = get_encrypt_password(body.password)
|
|
|
|
|
if encrypt_password != user_obj.password:
|
|
|
|
|
raise HTTPException(status_code=202, detail="密码错误")
|
|
|
|
|
if user_obj.disable:
|
|
|
|
|
raise HTTPException(status_code=202, detail="该账户被禁用")
|
|
|
|
|
|
|
|
|
|
user_info = user_obj.as_info()
|
|
|
|
|
# 生成&加密token信息
|
2023-02-14 14:06:25 +08:00
|
|
|
|
token = create_token({"uid": user_obj.id, "role": user_obj.role,
|
|
|
|
|
"name": user_obj.name, 'post': user_obj.post, "auth_data": user_obj.auth_data}, app.token_key)
|
2023-02-08 16:26:25 +08:00
|
|
|
|
return UserSchemas.LoginResBody(**user_info, access_token=token, token_type='bearer', app_id=app.id)
|
|
|
|
|
|
|
|
|
|
|
2023-02-10 13:54:44 +08:00
|
|
|
|
@router.post("/register", summary="注册", response_model=CommonRes)
|
2023-02-07 08:48:41 +08:00
|
|
|
|
def register(body: UserSchemas.RegisterReqBody, db: Session = Depends(get_db)):
|
|
|
|
|
# 用户是否存在
|
2023-02-07 16:09:57 +08:00
|
|
|
|
user_obj = get_user_by_email(db, body.email)
|
2023-02-07 08:48:41 +08:00
|
|
|
|
if user_obj is not None:
|
|
|
|
|
raise HTTPException(status_code=202, detail="该邮箱已注册")
|
2023-02-20 10:19:16 +08:00
|
|
|
|
# 判断邮箱是否合规
|
|
|
|
|
count, item_list = allowed_email_crud.query(db, AllowedEmailQuery())
|
|
|
|
|
email_checked = False
|
|
|
|
|
for item in item_list:
|
|
|
|
|
if body.email.endswith(item.email):
|
|
|
|
|
email_checked = True
|
|
|
|
|
break
|
|
|
|
|
if not email_checked:
|
|
|
|
|
raise HTTPException(status_code=202, detail="该域名邮箱不允许注册")
|
|
|
|
|
|
2023-02-07 08:48:41 +08:00
|
|
|
|
# 邮箱验证码校验
|
|
|
|
|
check_res = EmailVerifyCode.check_code(body.email, body.email_verify_code)
|
|
|
|
|
if not check_res:
|
|
|
|
|
raise HTTPException(status_code=202, detail="验证码过期或错误")
|
|
|
|
|
create_user(db, body.email, body.password)
|
|
|
|
|
return {"state": 1, "msg": "注册成功"}
|
2023-02-08 14:57:34 +08:00
|
|
|
|
|
|
|
|
|
|
2023-02-10 13:54:44 +08:00
|
|
|
|
@router.post("/rest_password", summary="密码重置", response_model=CommonRes)
|
2023-02-08 14:57:34 +08:00
|
|
|
|
def rest_password(body: UserSchemas.RestPasswordReqBody, db: Session = Depends(get_db)):
|
|
|
|
|
# 用户是否存在
|
|
|
|
|
user_obj = get_user_by_email(db, body.email)
|
|
|
|
|
if user_obj is None:
|
|
|
|
|
raise HTTPException(status_code=202, detail="该邮箱未注册")
|
|
|
|
|
# 邮箱验证码校验
|
|
|
|
|
check_res = EmailVerifyCode.check_code(body.email, body.email_verify_code, EmailVerifyType.reset_password)
|
|
|
|
|
if not check_res:
|
|
|
|
|
raise HTTPException(status_code=202, detail="验证码过期或错误")
|
|
|
|
|
rest_user_password(db, body.email, body.password)
|
|
|
|
|
return {"state": 1, "msg": "密码修改成功"}
|
|
|
|
|
|
|
|
|
|
|
2023-02-10 13:54:44 +08:00
|
|
|
|
@router.post("/get_rest_password_email_verify_code", summary="获取邮箱验证码", response_model=CommonRes)
|
2023-02-08 14:57:34 +08:00
|
|
|
|
def get_rest_password_email_verify_code(body: UserSchemas.EmailSendReqBody):
|
2023-02-10 13:54:44 +08:00
|
|
|
|
EmailVerifyCode.send_rest_code(body.email)
|
|
|
|
|
return {"msg": "验证码已发送至邮箱,请查看", "state": 1}
|