""" 收藏管理视图 """ 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/') @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)})