""" 短信验证码路由 """ 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": "验证成功"}