|
|
|
from datetime import datetime, timedelta
|
|
from app.models import SendCode
|
|
|
|
|
|
def validate_verification_code(email: str, code: str, code_type: int):
|
|
"""验证验证码有效性[^1]"""
|
|
expire_time = datetime.utcnow() - timedelta(minutes=10)
|
|
send_code = SendCode.query.filter(
|
|
SendCode.send_to == email,
|
|
SendCode.code == code,
|
|
SendCode.send_type == code_type,
|
|
SendCode.created_at > expire_time
|
|
).order_by(SendCode.created_at.desc()).first()
|
|
|
|
if not send_code:
|
|
return False, '验证码已过期或无效'
|
|
return True, None
|
|
|
|
|
|
def validate_password_confirmation(data: dict):
|
|
"""验证密码一致性[^2]"""
|
|
if data['password'] != data.get('password_confirmation'):
|
|
return False, '两次密码不一致'
|
|
return True, None
|
|
|
|
|
|
def validate_password_complexity(password: str):
|
|
"""密码复杂度验证[^5]"""
|
|
if len(password) < 6:
|
|
return False, "密码至少需要6位"
|
|
if not any(c.isalpha() for c in password) or not any(c.isdigit() for c in password):
|
|
return False, "密码需包含字母和数字"
|
|
return True, None
|
|
|
|
|
|
|
|
from flask import request
|
|
from app.utils.response import APIResponse
|
|
|
|
|
|
def validate_pagination_params(req):
|
|
"""验证并获取分页参数[^1]
|
|
|
|
返回:
|
|
tuple: (page, limit)
|
|
"""
|
|
try:
|
|
page = int(req.args.get('page', 1))
|
|
limit = int(req.args.get('limit', 20))
|
|
|
|
if page < 1:
|
|
raise ValueError('页码必须大于0')
|
|
if limit < 1 or limit > 100:
|
|
raise ValueError('每页数量必须在1到100之间')
|
|
|
|
return page, limit
|
|
except ValueError as e:
|
|
raise APIResponse.error(str(e), 400)
|
|
|
|
|
|
def validate_date_range(start_date, end_date):
|
|
"""验证日期范围参数[^2]
|
|
参数:
|
|
start_date (str): 起始日期
|
|
end_date (str): 结束日期
|
|
返回:
|
|
tuple: (start_date, end_date) 转换后的datetime对象
|
|
"""
|
|
try:
|
|
start = datetime.fromisoformat(start_date) if start_date else None
|
|
end = datetime.fromisoformat(end_date) if end_date else None
|
|
|
|
if start and end and start > end:
|
|
raise ValueError('起始日期不能晚于结束日期')
|
|
|
|
return start, end
|
|
except ValueError as e:
|
|
raise APIResponse.error('日期格式错误', 400)
|
|
|
|
|
|
def validate_id_list(ids):
|
|
"""验证ID列表参数[^3]
|
|
参数:
|
|
ids (list): ID列表
|
|
返回:
|
|
list: 验证后的ID列表
|
|
"""
|
|
if not ids or not isinstance(ids, list):
|
|
raise APIResponse.error('参数错误', 400)
|
|
|
|
try:
|
|
return [int(id) for id in ids]
|
|
except ValueError:
|
|
raise APIResponse.error('ID格式错误', 400)
|
|
|
|
|
|
|