""" 地址管理视图 """ 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/', 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/', 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/', 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] })