from flask import Blueprint, render_template, request, redirect, url_for, flash, session from extensions import db from models import Movie, Genre, CategorySearch, Search from helpers import get_recommendations # 导入辅助函数 dashboard_bp = Blueprint('dashboard', __name__) @dashboard_bp.route('/dashboard', methods=['GET', 'POST']) def dashboard(): # 检查用户是否登录 if 'user_id' not in session: flash("Please log in to access this page.") return redirect(url_for('auth')) user_id = session['user_id'] search_results = None # 默认值设为 None,以便在模板中判断是否有搜索结果 per_page = 12 # 每页显示12部电影 page = request.args.get('page', 1, type=int) # 获取当前页码,默认是第1页 # 查询所有类别 genres = Genre.query.all() # 检查是否存在搜索类型和参数 search_type = request.form.get('search_type') or request.args.get('search_type') selected_genres = request.form.getlist('genres') or request.args.getlist('genres') keyword = (request.form.get('keyword') or request.args.get('keyword') or '').strip() # 默认查询所有电影 query = Movie.query # 处理搜索请求 if request.method == 'POST' or search_type: if search_type == 'category': # 按类别检索 if selected_genres: # 根据类别筛选电影 query = Movie.query.filter( *[Movie.genres.contains(genre_id) for genre_id in selected_genres] ) # 更新类别搜索次数 for genre_id in selected_genres: category_search = CategorySearch.query.filter_by(user_id=user_id, category_id=genre_id).first() if category_search: category_search.search_times += 1 else: new_category_search = CategorySearch(user_id=user_id, category_id=genre_id, search_times=1) db.session.add(new_category_search) db.session.commit() elif search_type == 'keyword': # 关键词为空时展示所有电影 if not keyword: query = Movie.query else: # 按关键词筛选 query = Movie.query.filter( Movie.title.contains(keyword) | Movie.actor.contains(keyword) ) # 更新关键词搜索次数 if keyword: # 仅在关键词不为空时更新搜索记录 search_record = Search.query.filter_by(user_id=user_id, keyword=keyword).first() if search_record: search_record.search_times += 1 else: new_search = Search(user_id=user_id, keyword=keyword, search_times=1) db.session.add(new_search) db.session.commit() # 分页查询并排序 search_results = query.order_by(Movie.average_rating.desc()).paginate(page=page, per_page=per_page) # 如果有搜索结果,格式化每部电影的 genres 列表 if search_results.total > 0: for movie in search_results.items: # 将 genres 字段从 "2,4,9" 转换为名称列表 genre_ids = movie.genres.split(",") if movie.genres else [] genre_names = Genre.query.filter(Genre.id.in_(genre_ids)).all() movie.genre_names = ", ".join([genre.name for genre in genre_names]) else: # 如果没有结果,把分页页码设为默认值,避免错误跳转 total_pages = 1 start_page = 1 end_page = 1 # 获取“猜你喜欢”数据 recommendations_data = get_recommendations(user_id, page, per_page) # 设置起始、结束页码,一次最多显示10个页码 total_pages = search_results.pages if search_results.total > 0 else 1 start_page = max(1, page - 5) end_page = min(total_pages, page + 4) # 如果页码不足10个,调整start_page和end_page范围 if end_page - start_page < 9: if start_page == 1: end_page = min(10, total_pages) else: start_page = max(1, total_pages - 9) # 渲染模板 return render_template( 'dashboard.html', genres=genres, search_results=search_results, search_type=search_type, selected_genres=selected_genres, keyword=keyword, **recommendations_data, start_page=start_page, end_page=end_page, page=page, no_results=search_results.total == 0 # 传递是否有结果的标志 )