sms_router.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. """
  2. 短信验证码路由
  3. """
  4. from fastapi import APIRouter, Depends, HTTPException, Request
  5. from pydantic import BaseModel
  6. from sqlalchemy.orm import Session
  7. from app.database import get_db
  8. from app.services.sms_service import sms_code_service
  9. router = APIRouter(prefix="/api/sms", tags=["短信验证码"])
  10. class SendCodeRequest(BaseModel):
  11. phone: str
  12. scene: str = "register" # register / login / reset_password
  13. @router.post("/send-code")
  14. async def send_code(body: SendCodeRequest, request: Request, db: Session = Depends(get_db)):
  15. """发送验证码"""
  16. phone = body.phone.strip()
  17. if not phone or len(phone) != 11 or not phone.isdigit():
  18. raise HTTPException(status_code=400, detail="手机号格式不正确")
  19. # 注册场景:提前检查手机号是否已被注册,避免用户浪费验证码
  20. if body.scene == "register":
  21. from app.models.user import User
  22. if db.query(User).filter(User.phone == phone).first():
  23. raise HTTPException(status_code=409, detail="该手机号已被注册")
  24. ok, msg = await sms_code_service.send_code(phone)
  25. if not ok:
  26. raise HTTPException(status_code=429, detail=msg)
  27. return {"code": 200, "message": msg}
  28. class VerifyCodeRequest(BaseModel):
  29. phone: str
  30. sms_code: str
  31. @router.post("/verify-code")
  32. async def verify_code(body: VerifyCodeRequest):
  33. """验证验证码是否正确(不删除,供两步流程第一步使用)"""
  34. phone = body.phone.strip()
  35. if not phone or len(phone) != 11 or not phone.isdigit():
  36. raise HTTPException(status_code=400, detail="手机号格式不正确")
  37. ok = await sms_code_service.verify_code(phone, body.sms_code, delete_after=False)
  38. if not ok:
  39. raise HTTPException(status_code=400, detail="验证码错误或已过期")
  40. return {"code": 200, "message": "验证成功"}