From 2bd1b3dafc83f5b805cb7635a9b4fe5d548b7a3e Mon Sep 17 00:00:00 2001 From: aaron <> Date: Sun, 19 Jan 2025 23:02:58 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BF=AE=E6=94=B9=E5=AF=86?= =?UTF-8?q?=E7=A0=81=E7=9A=84=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/endpoints/user.py | 34 +++++++++++++++++++++++++++++++--- app/models/user.py | 4 ++++ 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/app/api/endpoints/user.py b/app/api/endpoints/user.py index 06ffcb2..8c273b6 100644 --- a/app/api/endpoints/user.py +++ b/app/api/endpoints/user.py @@ -1,6 +1,6 @@ from fastapi import APIRouter, HTTPException, Depends, Response, Body from sqlalchemy.orm import Session -from app.models.user import UserLogin ,UserInfo, ResetPasswordRequest,PhoneLoginRequest,VerifyCodeRequest, UserDB, UserUpdate, UserRole, UserPasswordLogin, ReferralUserInfo, generate_user_code +from app.models.user import UserLogin ,UserInfo, ResetPasswordRequest,PhoneLoginRequest,VerifyCodeRequest, UserDB, UserUpdate, UserRole, UserPasswordLogin, ReferralUserInfo, generate_user_code, ChangePasswordRequest from app.models.coupon import CouponDB, UserCouponDB, CouponStatus from app.api.deps import get_current_user, get_admin_user from app.models.database import get_db @@ -16,7 +16,7 @@ from app.core.response import success_response, error_response, ResponseModel from pydantic import BaseModel, Field from typing import List from typing import Optional -from datetime import datetime +from datetime import datetime, timedelta from sqlalchemy import text from app.models.community import CommunityDB @@ -465,4 +465,32 @@ async def update_user_community( ) except Exception as e: db.rollback() - return error_response(code=500, message=f"更新失败: {str(e)}") \ No newline at end of file + return error_response(code=500, message=f"更新失败: {str(e)}") + +@router.post("/change-password", response_model=ResponseModel) +async def change_password( + request: ChangePasswordRequest, + db: Session = Depends(get_db), + current_user: UserDB = Depends(get_current_user) # 获取当前登录用户 +): + """通过短信验证码修改密码""" + # 验证短信验证码 + redis_code = redis_client.get(f"verify_code:{current_user.phone}") + if not redis_code: + return error_response(message="验证码已过期") + + if redis_code.decode() != request.verify_code: + return error_response(message="验证码错误") + + try: + # 更新密码 + current_user.password = get_password_hash(request.new_password) + db.commit() + + # 删除验证码 + redis_client.delete(f"verify_code:{current_user.phone}") + + return success_response(message="密码修改成功") + except Exception as e: + db.rollback() + return error_response(code=500, message=f"修改密码失败: {str(e)}") \ No newline at end of file diff --git a/app/models/user.py b/app/models/user.py index d88609f..937a7c1 100644 --- a/app/models/user.py +++ b/app/models/user.py @@ -87,6 +87,10 @@ class UserPasswordLogin(BaseModel): phone: str = Field(..., pattern="^1[3-9]\d{9}$") password: str = Field(..., min_length=6, max_length=20) +class ChangePasswordRequest(BaseModel): + verify_code: str = Field(..., min_length=6, max_length=6) + new_password: str = Field(..., min_length=6, max_length=20) + def generate_user_code(db=None) -> str: """生成6位大写字母+数字的用户编码""" chars = string.ascii_uppercase + string.digits