| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- """
- 短信验证码路由
- """
- from fastapi import APIRouter, Depends, HTTPException, Request
- from pydantic import BaseModel
- from sqlalchemy.orm import Session
- from app.database import get_db
- from app.services.sms_service import sms_code_service
- router = APIRouter(prefix="/api/sms", tags=["短信验证码"])
- class SendCodeRequest(BaseModel):
- phone: str
- scene: str = "register" # register / login / reset_password
- @router.post("/send-code")
- async def send_code(body: SendCodeRequest, request: Request, db: Session = Depends(get_db)):
- """发送验证码"""
- phone = body.phone.strip()
- if not phone or len(phone) != 11 or not phone.isdigit():
- raise HTTPException(status_code=400, detail="手机号格式不正确")
- # 注册场景:提前检查手机号是否已被注册,避免用户浪费验证码
- if body.scene == "register":
- from app.models.user import User
- if db.query(User).filter(User.phone == phone).first():
- raise HTTPException(status_code=409, detail="该手机号已被注册")
- ok, msg = await sms_code_service.send_code(phone)
- if not ok:
- raise HTTPException(status_code=429, detail=msg)
- return {"code": 200, "message": msg}
- class VerifyCodeRequest(BaseModel):
- phone: str
- sms_code: str
- @router.post("/verify-code")
- async def verify_code(body: VerifyCodeRequest):
- """验证验证码是否正确(不删除,供两步流程第一步使用)"""
- phone = body.phone.strip()
- if not phone or len(phone) != 11 or not phone.isdigit():
- raise HTTPException(status_code=400, detail="手机号格式不正确")
- ok = await sms_code_service.verify_code(phone, body.sms_code, delete_after=False)
- if not ok:
- raise HTTPException(status_code=400, detail="验证码错误或已过期")
- return {"code": 200, "message": "验证成功"}
|