225 lines
7.3 KiB
Python
225 lines
7.3 KiB
Python
"""
|
||
收藏管理视图
|
||
"""
|
||
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)})
|