2025-07-04 19:07:35 +08:00

221 lines
8.0 KiB
Python

"""
地址管理视图
"""
from flask import Blueprint, render_template, request, jsonify, session, redirect, url_for, flash
from app.models.address import UserAddress
from app.models.user import User
from app.forms import AddressForm
from app.utils.decorators import login_required
from config.database import db
address_bp = Blueprint('address', __name__, url_prefix='/address')
@address_bp.route('/')
@login_required
def index():
"""地址管理页面"""
user_id = session['user_id']
addresses = UserAddress.get_user_addresses(user_id)
return render_template('user/addresses.html', addresses=addresses)
@address_bp.route('/add', methods=['GET', 'POST'])
@login_required
def add():
"""添加地址"""
form = AddressForm()
if request.method == 'POST':
# 手动验证必填字段
if not all([
form.receiver_name.data,
form.receiver_phone.data,
form.province.data,
form.city.data,
form.district.data,
form.detail_address.data
]):
flash('请填写所有必填信息', 'error')
return render_template('user/address_form.html', form=form, action='add')
# 验证手机号格式
import re
if not re.match(r'^1[3-9]\d{9}$', form.receiver_phone.data):
flash('请输入有效的手机号', 'error')
return render_template('user/address_form.html', form=form, action='add')
try:
user_id = session['user_id']
# 如果是第一个地址或设为默认,处理默认地址
if form.is_default.data or not UserAddress.query.filter_by(user_id=user_id).first():
UserAddress.query.filter_by(user_id=user_id).update({'is_default': 0})
is_default = 1
else:
is_default = 0
address = UserAddress(
user_id=user_id,
receiver_name=form.receiver_name.data.strip(),
receiver_phone=form.receiver_phone.data.strip(),
province=form.province.data.strip(),
city=form.city.data.strip(),
district=form.district.data.strip(),
detail_address=form.detail_address.data.strip(),
postal_code=form.postal_code.data.strip() if form.postal_code.data else None,
is_default=is_default
)
db.session.add(address)
db.session.commit()
flash('地址添加成功', 'success')
return redirect(url_for('address.index'))
except Exception as e:
db.session.rollback()
flash(f'添加失败: {str(e)}', 'error')
return render_template('user/address_form.html', form=form, action='add')
@address_bp.route('/edit/<int:address_id>', methods=['GET', 'POST'])
@login_required
def edit(address_id):
"""编辑地址"""
user_id = session['user_id']
address = UserAddress.query.filter_by(id=address_id, user_id=user_id).first_or_404()
form = AddressForm()
if request.method == 'GET':
# 预填充表单数据
form.receiver_name.data = address.receiver_name
form.receiver_phone.data = address.receiver_phone
form.province.data = address.province
form.city.data = address.city
form.district.data = address.district
form.detail_address.data = address.detail_address
form.postal_code.data = address.postal_code
form.is_default.data = bool(address.is_default)
elif request.method == 'POST':
# 手动验证必填字段
if not all([
form.receiver_name.data,
form.receiver_phone.data,
form.province.data,
form.city.data,
form.district.data,
form.detail_address.data
]):
flash('请填写所有必填信息', 'error')
return render_template('user/address_form.html', form=form, action='edit', address=address)
# 验证手机号格式
import re
if not re.match(r'^1[3-9]\d{9}$', form.receiver_phone.data):
flash('请输入有效的手机号', 'error')
return render_template('user/address_form.html', form=form, action='edit', address=address)
try:
# 如果设为默认地址,先取消其他默认地址
if form.is_default.data and not address.is_default:
UserAddress.query.filter_by(user_id=user_id).update({'is_default': 0})
address.is_default = 1
elif not form.is_default.data and address.is_default:
# 如果取消当前默认地址,需要检查是否还有其他地址
other_addresses = UserAddress.query.filter(
UserAddress.user_id == user_id,
UserAddress.id != address_id
).first()
if other_addresses:
address.is_default = 0
else:
flash('至少需要保留一个默认地址', 'warning')
return render_template('user/address_form.html', form=form, action='edit', address=address)
# 更新地址信息
address.receiver_name = form.receiver_name.data.strip()
address.receiver_phone = form.receiver_phone.data.strip()
address.province = form.province.data.strip()
address.city = form.city.data.strip()
address.district = form.district.data.strip()
address.detail_address = form.detail_address.data.strip()
address.postal_code = form.postal_code.data.strip() if form.postal_code.data else None
db.session.commit()
flash('地址更新成功', 'success')
return redirect(url_for('address.index'))
except Exception as e:
db.session.rollback()
flash(f'更新失败: {str(e)}', 'error')
return render_template('user/address_form.html', form=form, action='edit', address=address)
@address_bp.route('/delete/<int:address_id>', methods=['POST'])
@login_required
def delete(address_id):
"""删除地址"""
try:
user_id = session['user_id']
address = UserAddress.query.filter_by(id=address_id, user_id=user_id).first()
if not address:
return jsonify({'success': False, 'message': '地址不存在'})
# 检查是否是唯一地址
address_count = UserAddress.query.filter_by(user_id=user_id).count()
if address_count <= 1:
return jsonify({'success': False, 'message': '至少需要保留一个地址'})
# 如果删除的是默认地址,需要设置新的默认地址
if address.is_default:
other_address = UserAddress.query.filter(
UserAddress.user_id == user_id,
UserAddress.id != address_id
).first()
if other_address:
other_address.is_default = 1
db.session.delete(address)
db.session.commit()
return jsonify({'success': True, 'message': '地址删除成功'})
except Exception as e:
db.session.rollback()
return jsonify({'success': False, 'message': f'删除失败: {str(e)}'})
@address_bp.route('/set_default/<int:address_id>', methods=['POST'])
@login_required
def set_default(address_id):
"""设置默认地址"""
try:
user_id = session['user_id']
success = UserAddress.set_default_address(user_id, address_id)
if success:
return jsonify({'success': True, 'message': '默认地址设置成功'})
else:
return jsonify({'success': False, 'message': '地址不存在'})
except Exception as e:
return jsonify({'success': False, 'message': f'设置失败: {str(e)}'})
@address_bp.route('/api/list')
@login_required
def api_list():
"""获取用户地址列表API"""
user_id = session['user_id']
addresses = UserAddress.get_user_addresses(user_id)
return jsonify({
'success': True,
'addresses': [addr.to_dict() for addr in addresses]
})