| |
|
| | 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()
|
| |
|
| |
|