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