128 lines
5.2 KiB
Python
128 lines
5.2 KiB
Python
from flask_wtf import FlaskForm
|
||
from wtforms import StringField, PasswordField, BooleanField, SubmitField
|
||
from wtforms.validators import DataRequired, Length, Email, ValidationError, Regexp, EqualTo
|
||
from app.models.user import User
|
||
from wtforms import TextAreaField, SelectField, DecimalField, IntegerField, HiddenField
|
||
|
||
class LoginForm(FlaskForm):
|
||
username = StringField('用户名/手机号/邮箱', validators=[
|
||
DataRequired(message='请输入用户名、手机号或邮箱'),
|
||
Length(min=3, max=50, message='长度必须在3-50个字符之间')
|
||
])
|
||
password = PasswordField('密码', validators=[
|
||
DataRequired(message='请输入密码'),
|
||
Length(min=6, max=20, message='密码长度必须在6-20个字符之间')
|
||
])
|
||
remember_me = BooleanField('记住我')
|
||
submit = SubmitField('登录')
|
||
|
||
|
||
class RegisterForm(FlaskForm):
|
||
username = StringField('用户名', validators=[
|
||
DataRequired(message='请输入用户名'),
|
||
Length(min=3, max=20, message='用户名长度必须在3-20个字符之间'),
|
||
Regexp(r'^[a-zA-Z0-9_]+$', message='用户名只能包含字母、数字和下划线')
|
||
])
|
||
email = StringField('邮箱', validators=[
|
||
DataRequired(message='请输入邮箱'),
|
||
Email(message='请输入有效的邮箱地址')
|
||
])
|
||
email_code = StringField('邮箱验证码', validators=[
|
||
DataRequired(message='请输入邮箱验证码'),
|
||
Length(min=6, max=6, message='验证码为6位数字')
|
||
])
|
||
phone = StringField('手机号', validators=[
|
||
DataRequired(message='请输入手机号'),
|
||
Regexp(r'^1[3-9]\d{9}$', message='请输入有效的手机号')
|
||
])
|
||
password = PasswordField('密码', validators=[
|
||
DataRequired(message='请输入密码'),
|
||
Length(min=6, max=20, message='密码长度必须在6-20个字符之间'),
|
||
Regexp(r'^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d@$!%*#?&]{6,}$',
|
||
message='密码必须包含至少一个字母和一个数字')
|
||
])
|
||
confirm_password = PasswordField('确认密码', validators=[
|
||
DataRequired(message='请确认密码'),
|
||
EqualTo('password', message='两次输入的密码不一致')
|
||
])
|
||
submit = SubmitField('注册')
|
||
|
||
def validate_username(self, username):
|
||
user = User.query.filter_by(username=username.data).first()
|
||
if user:
|
||
raise ValidationError('用户名已存在')
|
||
|
||
def validate_email(self, email):
|
||
user = User.query.filter_by(email=email.data).first()
|
||
if user:
|
||
raise ValidationError('邮箱已被注册')
|
||
|
||
def validate_phone(self, phone):
|
||
user = User.query.filter_by(phone=phone.data).first()
|
||
if user:
|
||
raise ValidationError('手机号已被注册')
|
||
|
||
|
||
class SendEmailCodeForm(FlaskForm):
|
||
"""发送邮箱验证码表单"""
|
||
email = StringField('邮箱', validators=[
|
||
DataRequired(message='请输入邮箱'),
|
||
Email(message='请输入有效的邮箱地址')
|
||
])
|
||
submit = SubmitField('发送验证码')
|
||
|
||
|
||
class AddressForm(FlaskForm):
|
||
"""地址表单"""
|
||
receiver_name = StringField('收货人', validators=[
|
||
DataRequired(message='请输入收货人姓名'),
|
||
Length(min=2, max=20, message='收货人姓名长度必须在2-20个字符之间')
|
||
])
|
||
receiver_phone = StringField('手机号', validators=[
|
||
DataRequired(message='请输入手机号'),
|
||
Regexp(r'^1[3-9]\d{9}$', message='请输入有效的手机号')
|
||
])
|
||
province = SelectField('省份', validators=[
|
||
DataRequired(message='请选择省份')
|
||
], choices=[])
|
||
city = SelectField('城市', validators=[
|
||
DataRequired(message='请选择城市')
|
||
], choices=[])
|
||
district = SelectField('区县', validators=[
|
||
DataRequired(message='请选择区县')
|
||
], choices=[])
|
||
detail_address = StringField('详细地址', validators=[
|
||
DataRequired(message='请输入详细地址'),
|
||
Length(min=5, max=200, message='详细地址长度必须在5-200个字符之间')
|
||
])
|
||
postal_code = StringField('邮政编码', validators=[
|
||
Length(max=10, message='邮政编码长度不能超过10个字符')
|
||
])
|
||
is_default = BooleanField('设为默认地址')
|
||
submit = SubmitField('保存地址')
|
||
|
||
|
||
class CheckoutForm(FlaskForm):
|
||
"""结算表单"""
|
||
address_id = SelectField('收货地址', validators=[
|
||
DataRequired(message='请选择收货地址')
|
||
], coerce=int, choices=[])
|
||
shipping_method = SelectField('配送方式', validators=[
|
||
DataRequired(message='请选择配送方式')
|
||
], choices=[
|
||
('standard', '标准配送(免费)'),
|
||
('express', '次日达(+10元)'),
|
||
('same_day', '当日达(+20元)')
|
||
], default='standard')
|
||
payment_method = SelectField('支付方式', validators=[
|
||
DataRequired(message='请选择支付方式')
|
||
], choices=[
|
||
('wechat', '微信支付'),
|
||
('alipay', '支付宝'),
|
||
('bank', '银行卡支付')
|
||
], default='wechat')
|
||
remark = TextAreaField('订单备注', validators=[
|
||
Length(max=200, message='备注长度不能超过200个字符')
|
||
])
|
||
selected_items = HiddenField('选中商品')
|
||
submit = SubmitField('提交订单') |