taibai_shopping/app/forms.py
2025-07-04 19:07:35 +08:00

128 lines
5.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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('提交订单')