|
|
|
from flask import request
|
|
from flask_restful import Resource
|
|
from flask_jwt_extended import create_access_token
|
|
from datetime import datetime, timedelta
|
|
|
|
from app import db
|
|
from app.models import Customer, SendCode
|
|
from app.utils.security import hash_password, verify_password
|
|
from app.utils.response import APIResponse
|
|
from app.utils.mail_service import EmailService
|
|
import random
|
|
|
|
from app.utils.validators import (
|
|
validate_verification_code,
|
|
validate_password_confirmation
|
|
)
|
|
|
|
|
|
|
|
|
|
class SendRegisterCodeResource(Resource):
|
|
def post(self):
|
|
"""发送注册验证码接口[^1]"""
|
|
email = request.form.get('email')
|
|
if Customer.query.filter_by(email=email).first():
|
|
return APIResponse.error('邮箱已存在', 400)
|
|
|
|
code = ''.join(random.choices('0123456789', k=6))
|
|
send_code = SendCode(
|
|
send_type=1,
|
|
send_to=email,
|
|
code=code,
|
|
created_at=datetime.utcnow()
|
|
)
|
|
db.session.add(send_code)
|
|
try:
|
|
EmailService.send_verification_code(email, code)
|
|
db.session.commit()
|
|
return APIResponse.success()
|
|
except Exception as e:
|
|
db.session.rollback()
|
|
return APIResponse.error('邮件发送失败', 500)
|
|
|
|
|
|
class UserRegisterResource(Resource):
|
|
def post(self):
|
|
"""用户注册接口[^2]"""
|
|
data = request.form
|
|
|
|
required_fields = ['email', 'password', 'code']
|
|
if not all(field in data for field in required_fields):
|
|
return APIResponse.error('缺少必要参数', 400)
|
|
|
|
|
|
is_valid, msg = validate_verification_code(
|
|
data['email'], data['code'], 1
|
|
)
|
|
if not is_valid:
|
|
return APIResponse.error(msg, 400)
|
|
|
|
customer = Customer(
|
|
email=data['email'],
|
|
password=hash_password(data['password']),
|
|
created_at=datetime.utcnow(),
|
|
updated_at=datetime.utcnow()
|
|
)
|
|
db.session.add(customer)
|
|
db.session.commit()
|
|
|
|
|
|
|
|
return APIResponse.success(message='注册成功!',data={
|
|
|
|
'email': data['email']
|
|
})
|
|
|
|
|
|
class UserLoginResource(Resource):
|
|
def post(self):
|
|
"""用户登录接口[^3]"""
|
|
data = request.form
|
|
customer = Customer.query.filter_by(email=data['email']).first()
|
|
|
|
if not customer or not verify_password(customer.password, data['password']):
|
|
return APIResponse.error('账号或密码错误')
|
|
|
|
access_token = create_access_token(identity=str(customer.id))
|
|
return APIResponse.success({
|
|
'token': access_token,
|
|
'email': data['email'],
|
|
'level': customer.level
|
|
})
|
|
|
|
|
|
class SendResetCodeResource(Resource):
|
|
def post(self):
|
|
"""发送密码重置验证码接口[^4]"""
|
|
email = request.form.get('email')
|
|
if not Customer.query.filter_by(email=email).first():
|
|
return APIResponse.not_found('用户不存在')
|
|
|
|
code = ''.join(random.choices('0123456789', k=6))
|
|
send_code = SendCode(
|
|
send_type=2,
|
|
send_to=email,
|
|
code=code,
|
|
created_at=datetime.utcnow()
|
|
)
|
|
db.session.add(send_code)
|
|
try:
|
|
EmailService.send_verification_code(email, code)
|
|
db.session.commit()
|
|
return APIResponse.success()
|
|
except Exception as e:
|
|
db.session.rollback()
|
|
return APIResponse.error('邮件发送失败', 500)
|
|
|
|
|
|
class ResetPasswordResource(Resource):
|
|
def post(self):
|
|
"""重置密码接口[^5]"""
|
|
data = request.form
|
|
|
|
|
|
is_valid, msg = validate_password_confirmation(data)
|
|
if not is_valid:
|
|
return APIResponse.error(msg, 400)
|
|
|
|
|
|
is_valid, msg = validate_verification_code(
|
|
data['email'], data['code'], 2
|
|
)
|
|
if not is_valid:
|
|
return APIResponse.error(msg, 400)
|
|
|
|
customer = Customer.query.filter_by(email=data['email']).first()
|
|
customer.password = hash_password(data['password'])
|
|
customer.updated_at = datetime.utcnow()
|
|
db.session.commit()
|
|
return APIResponse.success()
|
|
|
|
|