221 lines
8.0 KiB
Python
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]
|
|
})
|