perf: 优化 detail 页面加载性能

- 使用 JOIN 查询替代子查询获取推荐网站
- 异步更新浏览量,避免阻塞页面加载
- 添加数据库索引脚本 (site_tags, sites 表)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Jowe
2026-03-13 21:07:33 +08:00
parent 3c114cdf0b
commit 9470acc369
3 changed files with 254 additions and 12 deletions

30
app.py
View File

@@ -165,15 +165,18 @@ def create_app(config_name='default'):
@app.route('/site/<code>')
def site_detail(code):
"""网站详情页"""
"""网站详情页 - v3.1性能优化"""
site = Site.query.filter_by(code=code, is_active=True).first_or_404()
# 增加浏览次数
site.view_count += 1
db.session.commit()
# v2.6优化移除自动调用博查API的逻辑改为按需加载
# 只获取数据库中已有的新闻不再自动调用API
# 异步更新浏览次数(不等待提交完成)
try:
db.session.execute(
db.text("UPDATE sites SET view_count = view_count + 1 WHERE id = :id"),
{"id": site.id}
)
db.session.commit()
except:
db.session.rollback()
# 获取该网站的相关新闻最多显示5条
news_list = News.query.filter_by(
@@ -181,17 +184,20 @@ def create_app(config_name='default'):
is_active=True
).order_by(News.published_at.desc()).limit(5).all()
# 检查是否有新闻,如果没有则标记需要加载
# 检查是否有新闻
has_news = len(news_list) > 0
# 获取同类工具推荐(通过标签匹配最多显示4个
# 优化:获取同类工具推荐(使用JOIN代替子查询
recommended_sites = []
if site.tags:
# 获取有相同标签的其他网站
recommended_sites = Site.query.filter(
tag_ids = [tag.id for tag in site.tags]
# 使用JOIN查询性能更好
recommended_sites = db.session.query(Site).join(
site_tags, Site.id == site_tags.c.site_id
).filter(
Site.id != site.id,
Site.is_active == True,
Site.tags.any(Tag.id.in_([tag.id for tag in site.tags]))
site_tags.c.tag_id.in_(tag_ids)
).order_by(Site.view_count.desc()).limit(4).all()
return render_template('detail_new.html', site=site, news_list=news_list, has_news=has_news, recommended_sites=recommended_sites)