feat(public): 首页增加「热门网址」分类(访问量 TOP12)
跨分类聚合:按 NavClick 总点击数倒序,取前 12 个有效 nav。 实现要点: - applications/view/public/nav.py: 新增 _top_navs(limit=12), 复用 get_nav_visit_counts() 的 60s 进程内缓存;同点击数按 id asc 稳定排序; 0 点击返回空列表(前端整段不渲染) - _render_index() 注入 top_navs 到模板 - templates/public/index.html: 在 groups 循环前渲染 .section-hot,标题「🔥 热门网址」, meta 显示「近期访问量最大的 N 个」;卡片复用 .card,新增 .card-top 类 - templates/public/base.html: - .card-top:左侧 3px 品牌色边框 + 浅色背景渐变 + hover 增强阴影 - .section-hot h2 图标用 brand-orange #ff6b35 - .cat-nav-inner a.cat-nav-hot 顶部导航热门入口用品牌色 - 抽屉:首页 top_navs 非空时插入「🔥 热门」区段,链接到 #cat-top 边界: - 没有任何点击时整段隐藏(包括抽屉和顶部 nav),不出现「0 个」空标题 - 同一 nav 不会重复(按 nav.id 维度聚合) - Nav.enable=0 的不会进 TOP12 验证: - 15 个 nav 各灌入 20..6 次点击,前 12 个按降序显示访问数 20..9 - 清空所有 NavClick 后首页 section-hot / #cat-top / .cat-drawer-hot 三处全不渲染 - 测试数据已清理
This commit is contained in:
@@ -85,9 +85,38 @@ def _render_index():
|
||||
total=total,
|
||||
site_name='旺珂 · 导航',
|
||||
cat_meta=_category_meta(),
|
||||
top_navs=_top_navs(12),
|
||||
)
|
||||
|
||||
|
||||
def _top_navs(limit: int = 12) -> "list[dict]":
|
||||
"""跨分类聚合:返回点击数 TOP N 的有效 nav 列表(按点击数降序)。
|
||||
|
||||
- 复用 get_nav_visit_counts() 的 60s 进程内缓存
|
||||
- 0 点击时返回空列表(调用方负责隐藏整个分类块)
|
||||
- 同一个 nav 不可能重复出现(按 nav.id 维度)
|
||||
"""
|
||||
counts = get_nav_visit_counts()
|
||||
if not counts:
|
||||
return []
|
||||
# 取点击数最高的 N 个 nav_id(点击数相同的按 id asc 稳定排序)
|
||||
top_ids = sorted(counts.items(), key=lambda kv: (-kv[1], kv[0]))[:limit]
|
||||
nav_ids = [nid for nid, _ in top_ids]
|
||||
rows = (
|
||||
Nav.query
|
||||
.filter(Nav.id.in_(nav_ids), Nav.enable == 1)
|
||||
.all()
|
||||
)
|
||||
by_id = {n.id: n.to_dict() for n in rows}
|
||||
out = []
|
||||
for nid in nav_ids:
|
||||
if nid in by_id:
|
||||
d = by_id[nid]
|
||||
d['visit_count'] = counts.get(nid, 0)
|
||||
out.append(d)
|
||||
return out
|
||||
|
||||
|
||||
def _grouped_navs() -> "OrderedDict[str, list]":
|
||||
"""按 category 分组,组内按 sort asc 排序;分组顺序优先按 NavCategory.sort 排列"""
|
||||
# 先取启用的分类,按 sort 排好序
|
||||
|
||||
Reference in New Issue
Block a user