feat: 添加公开注册接口,修复邮箱验证链接路径

- 新增 POST /users/register 公开注册接口(无需验证码,直接创建用户)
- 修复邮箱验证邮件中的链接路径(/verify-email → /users/verify-email)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
jayhgq 2026-07-22 06:06:51 +00:00
parent 6751a5c2b2
commit 49f7022c1b
2 changed files with 580 additions and 538 deletions

View File

@ -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="验证令牌"),

View File

@ -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>