feat: 添加公开注册接口,修复邮箱验证链接路径
- 新增 POST /users/register 公开注册接口(无需验证码,直接创建用户) - 修复邮箱验证邮件中的链接路径(/verify-email → /users/verify-email) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
6751a5c2b2
commit
49f7022c1b
@ -461,6 +461,48 @@ async def init_email_registration(
|
|||||||
return EmailRegisterInitResponse()
|
return EmailRegisterInitResponse()
|
||||||
|
|
||||||
|
|
||||||
|
@router.post("/register", response_model=RegisterSuccessResponse)
|
||||||
|
async def register(
|
||||||
|
req: UserCreateRequest,
|
||||||
|
db: AsyncSession = Depends(get_db),
|
||||||
|
):
|
||||||
|
"""用户注册(公开接口,直接创建用户)"""
|
||||||
|
# 检查用户名是否已存在
|
||||||
|
result = await db.execute(select(User).filter(User.username == req.username))
|
||||||
|
if result.scalar_one_or_none():
|
||||||
|
raise HTTPException(status_code=400, detail="用户名已存在")
|
||||||
|
|
||||||
|
# 检查邮箱是否已被注册
|
||||||
|
if req.email:
|
||||||
|
result = await db.execute(select(User).filter(User.email == req.email))
|
||||||
|
if result.scalar_one_or_none():
|
||||||
|
raise HTTPException(status_code=400, detail="该邮箱已被注册")
|
||||||
|
|
||||||
|
# 检查手机号是否已被注册
|
||||||
|
if req.phone:
|
||||||
|
result = await db.execute(select(User).filter(User.phone == req.phone))
|
||||||
|
if result.scalar_one_or_none():
|
||||||
|
raise HTTPException(status_code=400, detail="该手机号已被注册")
|
||||||
|
|
||||||
|
# 创建用户
|
||||||
|
hashed_pw = get_password_hash(req.password)
|
||||||
|
new_user = User(
|
||||||
|
username=req.username,
|
||||||
|
nickname=req.nickname,
|
||||||
|
email=req.email,
|
||||||
|
phone=req.phone,
|
||||||
|
password_hash=hashed_pw,
|
||||||
|
role_id=req.role_id or 2,
|
||||||
|
)
|
||||||
|
db.add(new_user)
|
||||||
|
await db.commit()
|
||||||
|
await db.refresh(new_user)
|
||||||
|
|
||||||
|
return RegisterSuccessResponse(
|
||||||
|
id=new_user.id, username=new_user.username, nickname=new_user.nickname
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@router.get("/verify-email")
|
@router.get("/verify-email")
|
||||||
async def verify_email(
|
async def verify_email(
|
||||||
token: str = Query(..., description="验证令牌"),
|
token: str = Query(..., description="验证令牌"),
|
||||||
|
|||||||
@ -6,7 +6,7 @@ from email.mime.multipart import MIMEMultipart
|
|||||||
|
|
||||||
def _build_verification_email(token: str) -> str:
|
def _build_verification_email(token: str) -> str:
|
||||||
"""构建验证邮件HTML内容"""
|
"""构建验证邮件HTML内容"""
|
||||||
verify_url = f"{email_settings.base_url.rstrip('/')}/verify-email?token={token}"
|
verify_url = f"{email_settings.base_url.rstrip('/')}/users/verify-email?token={token}"
|
||||||
return f"""<!DOCTYPE html>
|
return f"""<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<head><meta charset="utf-8"></head>
|
<head><meta charset="utf-8"></head>
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user