taibai_shopping/app/views/favorite.py
2025-07-09 05:22:28 +08:00

225 lines
7.3 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 import Blueprint, render_template, request, redirect, url_for, flash, jsonify, session
from app.models.favorite import UserFavorite
from app.models.product import Product
from app.utils.decorators import login_required
from config.database import db
favorite_bp = Blueprint('favorite', __name__, url_prefix='/favorite')
@favorite_bp.route('/')
@login_required
def index():
"""收藏夹首页"""
page = request.args.get('page', 1, type=int)
per_page = 20
# 获取用户收藏列表
favorites = UserFavorite.get_user_favorites(session['user_id'], page, per_page)
# 获取收藏总数
total_count = UserFavorite.get_user_favorites_count(session['user_id'])
return render_template('user/favorites.html',
favorites=favorites,
total_count=total_count)
@favorite_bp.route('/add', methods=['POST'])
@login_required
def add():
"""添加收藏"""
try:
data = request.get_json()
product_id = data.get('product_id')
# 调试信息
print(f"收到添加收藏请求用户ID: {session['user_id']}, 商品ID: {product_id}")
if not product_id:
return jsonify({'success': False, 'message': '商品ID不能为空'})
# 确保product_id是整数
try:
product_id = int(product_id)
except (ValueError, TypeError):
return jsonify({'success': False, 'message': '商品ID格式错误'})
success, message = UserFavorite.add_favorite(session['user_id'], product_id)
if success:
# 获取更新后的收藏数量
favorite_count = UserFavorite.get_user_favorites_count(session['user_id'])
return jsonify({
'success': True,
'message': message,
'favorite_count': favorite_count
})
else:
return jsonify({'success': False, 'message': message})
except Exception as e:
print(f"添加收藏失败: {str(e)}")
return jsonify({'success': False, 'message': f'添加收藏失败: {str(e)}'})
@favorite_bp.route('/remove', methods=['POST'])
@login_required
def remove():
"""取消收藏"""
try:
data = request.get_json()
product_id = data.get('product_id')
# 调试信息
print(f"收到取消收藏请求用户ID: {session['user_id']}, 商品ID: {product_id}")
if not product_id:
return jsonify({'success': False, 'message': '商品ID不能为空'})
# 确保product_id是整数
try:
product_id = int(product_id)
except (ValueError, TypeError):
return jsonify({'success': False, 'message': '商品ID格式错误'})
success, message = UserFavorite.remove_favorite(session['user_id'], product_id)
if success:
# 获取更新后的收藏数量
favorite_count = UserFavorite.get_user_favorites_count(session['user_id'])
return jsonify({
'success': True,
'message': message,
'favorite_count': favorite_count
})
else:
return jsonify({'success': False, 'message': message})
except Exception as e:
print(f"取消收藏失败: {str(e)}")
return jsonify({'success': False, 'message': f'取消收藏失败: {str(e)}'})
@favorite_bp.route('/toggle', methods=['POST'])
@login_required
def toggle():
"""切换收藏状态"""
try:
data = request.get_json()
product_id = data.get('product_id')
# 调试信息
print(f"收到切换收藏请求用户ID: {session['user_id']}, 商品ID: {product_id}, 数据类型: {type(product_id)}")
if not product_id:
return jsonify({'success': False, 'message': '商品ID不能为空'})
# 确保product_id是整数
try:
product_id = int(product_id)
except (ValueError, TypeError):
return jsonify({'success': False, 'message': '商品ID格式错误'})
# 检查当前是否已收藏
is_favorited = UserFavorite.is_favorited(session['user_id'], product_id)
if is_favorited:
success, message = UserFavorite.remove_favorite(session['user_id'], product_id)
action = 'removed'
else:
success, message = UserFavorite.add_favorite(session['user_id'], product_id)
action = 'added'
if success:
favorite_count = UserFavorite.get_user_favorites_count(session['user_id'])
return jsonify({
'success': True,
'message': message,
'action': action,
'is_favorited': not is_favorited,
'favorite_count': favorite_count
})
else:
return jsonify({'success': False, 'message': message})
except Exception as e:
print(f"切换收藏状态失败: {str(e)}")
return jsonify({'success': False, 'message': f'操作失败: {str(e)}'})
@favorite_bp.route('/check/<int:product_id>')
@login_required
def check(product_id):
"""检查商品是否已收藏"""
try:
is_favorited = UserFavorite.is_favorited(session['user_id'], product_id)
return jsonify({
'success': True,
'is_favorited': is_favorited
})
except Exception as e:
print(f"检查收藏状态失败: {str(e)}")
return jsonify({'success': False, 'message': str(e)})
@favorite_bp.route('/batch-remove', methods=['POST'])
@login_required
def batch_remove():
"""批量取消收藏"""
try:
data = request.get_json()
product_ids = data.get('product_ids', [])
if not product_ids:
return jsonify({'success': False, 'message': '请选择要取消的商品'})
success_count = 0
fail_count = 0
for product_id in product_ids:
try:
product_id = int(product_id)
success, _ = UserFavorite.remove_favorite(session['user_id'], product_id)
if success:
success_count += 1
else:
fail_count += 1
except (ValueError, TypeError):
fail_count += 1
message = f'成功取消收藏 {success_count} 个商品'
if fail_count > 0:
message += f',失败 {fail_count}'
# 获取更新后的收藏数量
favorite_count = UserFavorite.get_user_favorites_count(session['user_id'])
return jsonify({
'success': True,
'message': message,
'favorite_count': favorite_count
})
except Exception as e:
print(f"批量操作失败: {str(e)}")
return jsonify({'success': False, 'message': f'批量操作失败: {str(e)}'})
@favorite_bp.route('/count')
@login_required
def count():
"""获取收藏数量"""
try:
favorite_count = UserFavorite.get_user_favorites_count(session['user_id'])
return jsonify({
'success': True,
'favorite_count': favorite_count
})
except Exception as e:
print(f"获取收藏数量失败: {str(e)}")
return jsonify({'success': False, 'message': str(e)})