# PRD:博客 /posts 页面添加「隐藏AI日报」筛选功能 ## 1. 需求概述 在 `https://blog.ephron.ren/posts` 页面的搜索区域左侧,新增一个勾选框 **「隐藏AI日报」**。 勾选后,文章列表(含搜索结果)中不再显示标题以 `AI日报` 开头、或 slug 以 `ai-` 开头的文章。 ## 2. 背景与现状 ### 2.1 页面结构 - `/posts` 路由由 `blog/src/routes/pages.py` 中的 `posts_list()` 处理。 - 同一页面承担「全部文章列表」和「搜索结果展示」两种状态。 - 前端模板:`blog/templates/index.html` ### 2.2 当前搜索参数 | 参数 | 说明 | 示例 | |------|------|------| | `q` | 搜索关键词 | `RAG` | | `mode` | 搜索模式:`simple` / `fulltext` | `simple` | ### 2.3 AI日报特征 - **标题格式**:`AI日报 · YYYY-MM-DD`,前两个字固定为 `AI日报` - **Slug 格式**:`ai-YYYY-MM-DD`,以 `ai-` 开头 - **数据规模**:目前共 70 篇文章,其中 AI日报约占 40+ 篇,占比超过一半 ## 3. 功能需求 ### 3.1 交互 - 在搜索框左侧(`page-header` 区域)增加一个 checkbox: ```html ``` - 勾选状态变化时,自动重新请求列表(无需额外「确认」按钮)。 - 当页面存在搜索词 `q` 时,勾选框与搜索条件共存;URL 同时携带 `q`、`mode`、`hide_ai_daily`。 ### 3.2 筛选规则 后端过滤条件(**OR 逻辑**): ```python if hide_ai_daily: posts = [ p for p in posts if not (p.title.startswith("AI日报") or p.slug.startswith("ai-")) ] ``` ### 3.3 持久化 - **不**使用 Cookie / 本地存储记住勾选状态。 - 仅通过 URL 参数传递,用户刷新或分享链接时状态自然保持或丢失。 ## 4. 技术方案 ### 4.1 前端修改(`blog/templates/index.html`) 在 `.search-box` 左侧插入 checkbox 容器: ```html
共 {{ posts | length }} 篇文章