email_router.py 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. """
  2. 邮箱验证码路由
  3. """
  4. import re
  5. from fastapi import APIRouter, HTTPException
  6. from pydantic import BaseModel
  7. from app.services.email_service import email_code_service
  8. router = APIRouter(prefix="/api/email", tags=["邮箱验证码"])
  9. EMAIL_RE = re.compile(r"^[^@\s]+@[^@\s]+\.[^@\s]+$")
  10. class SendEmailCodeRequest(BaseModel):
  11. email: str
  12. scene: str = "register" # register / login / reset_password
  13. @router.post("/send-code")
  14. async def send_email_code(body: SendEmailCodeRequest):
  15. """发送邮箱验证码"""
  16. email = body.email.strip().lower()
  17. if not EMAIL_RE.match(email):
  18. raise HTTPException(status_code=400, detail="邮箱格式不正确")
  19. ok, msg = await email_code_service.send_code(email, body.scene)
  20. if not ok:
  21. raise HTTPException(status_code=429, detail=msg)
  22. return {"code": 200, "message": msg}
  23. class VerifyEmailCodeRequest(BaseModel):
  24. email: str
  25. email_code: str
  26. @router.post("/verify-code")
  27. async def verify_email_code(body: VerifyEmailCodeRequest):
  28. """验证邮箱验证码(不删除,供两步流程第一步使用)"""
  29. email = body.email.strip().lower()
  30. if not EMAIL_RE.match(email):
  31. raise HTTPException(status_code=400, detail="邮箱格式不正确")
  32. ok = await email_code_service.verify_code(email, body.email_code, delete_after=False)
  33. if not ok:
  34. raise HTTPException(status_code=400, detail="验证码错误或已过期")
  35. return {"code": 200, "message": "验证成功"}