2025-01-31 21:36:31 +08:00

118 lines
4.5 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, 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 # 传递是否有结果的标志
)