From d1637267562ecce4c352f5ca12820c719ce9cb8b Mon Sep 17 00:00:00 2001 From: zhouzhongping Date: Mon, 6 Nov 2023 15:32:51 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=87=E6=A1=A3=EF=BC=9A=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=20README.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 主题开发 - 文档完善 --- README.md | 166 ++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 117 insertions(+), 49 deletions(-) diff --git a/README.md b/README.md index 9ecc083..cd92672 100644 --- a/README.md +++ b/README.md @@ -8,9 +8,9 @@ EndOfYear 点燃个人博客的年度辉煌! ### 要求 -- RSS 源必须输出文章全部内容,否则数据分析不准确。 +- **RSS 源务必输出文章全部内容**,否则数据分析不准确。 - Github 运行可能无法访问 RSS 源,请使用本地 Docker 运行。 -- 如果生成年度报告,请结合博客实际情况设置 RSS 输出文章数量。 +- 如果生成年度报告,请结合博客实际情况**设置 RSS 输出文章数量。** ### Github @@ -22,8 +22,8 @@ EndOfYear 点燃个人博客的年度辉煌! 4. 在 **Workflow permissions** 中,选择 **Read and write permissions**(读写权限)。 5. 最后点击 **Save**(保存)。 3. 在仓库首页打开目录下的 `config.ini` 配置文件,点击右上角工具栏的 **🖋️(钢笔)** 图标,在线编辑文件。 - - `web`:配置为 `false`。 - - `rss`:配置为 RSS 地址。 + - `web`:默认为 true,Github 运行需要配置为 `false` 静态网站模式。 + - `rss`:配置为 RSS 源地址。 ```ini [default] @@ -31,13 +31,12 @@ web = false [blog] rss = https://blog.7wate.com/rss.xml -data = ``` 4. 点击右上角的 **Commit changes** 提交到 `main` 分支,会自动运行 Actions。 5. 等待 Actions 运行成功,将会部署静态网站文件至 `html` 分支。 -6. 开启 GitHub 仓库的 Pages 功能,默认为根目录。 -7. 访问个人网址,就可以看到啦~ +6. 开启 GitHub 仓库的 Pages 功能,设置 `html`分支,默认为根目录。 +7. 稍等访问个人网址,就可以看到啦~ ### Docker @@ -70,7 +69,11 @@ docker run -p 7777:7777 --env rss=https://blog.7wate.com/rss.xml sevenwate/endof ### 博客数据分析不准确 -目前会根据个人时间进一步迭代,可以点个 Watch 订阅进度。 +目前博客的数据分析已经相对丰富,准确,未来会结合 AI 进行分析。 + +### 主题不够丰富 + +个人时间有限,不过目前可以**保证每年更新一款默认主题**,希望给各位的写作之路带来快乐 ~ ## 流程 @@ -78,50 +81,115 @@ EndOfYear 通过 RSS 获取博客文章数据,对文章数据进行统计、 ```mermaid sequenceDiagram - actor User - participant Flask - participant Config - participant Generator - participant Scraper - participant Analyzer + participant User + participant Flask as Flask Server + participant Config as Configuration + participant Generator as Data Generator + participant Scraper as Data Scraper + participant Analyzer as Data Analyzer + + User->>Flask: Access Service + Flask->>User: Redirect to painting theme + User->>Flask: Request painting theme + Flask->>Config: Invoke Data Generator + Config->>Generator: Run Data Scraper + Generator->>Scraper: Fetch RSS data + Scraper->>Analyzer: Analyze Data + Analyzer->>Scraper: Return Analyzed Data + Scraper->>Generator: Send Structured Data + Generator->>Flask: Return Data to Flask + Flask->>Flask: Render HTML Page with Data + Flask->>User: Return Rendered HTML Page - User ->> Flask: Access service - Flask ->> Config: Check cache - activate Config - alt Cache exists - Config -->> Flask: Return cached data - else Cache does not exist - Config ->> Generator: Run data generator - activate Generator - Generator ->> Scraper: Run data scraping - activate Scraper - Scraper -->> Generator: Return scraped data - deactivate Scraper - Generator ->> Analyzer: Run data analysis - activate Analyzer - Analyzer -->> Generator: Return analyzed data - deactivate Analyzer - Generator -->> Config: Return organized data - deactivate Generator - Config -->> Flask: Return data - end - Flask -->> User: Return HTML page - deactivate Config ``` 1. 用户访问 Flask 服务。 -2. Flask 检查缓存是否存在。 - - 如果缓存存在,Flask直接返回缓存数据。 - - 如果缓存不存在,继续下一步。 +2. Flask 根路由跳转 painting 主题。 3. Config 模块运行数据生成器(Generator)。 4. Generator 模块运行数据抓取器(Scraper)来获取RSS数据。 -5. Scraper 将抓取的数据返回给 Generator。 -6. Generator 运行数据分析器(Analyzer)对数据进行分析。 -7. Analyzer 将分析后的数据返回给 Generator。 -8. Generator 整理结构化数据后将其返回给 Flask,Config 模块。 -9. Flask 使用整理后的数据渲染 HTML 页面。 -10. Flask 返回渲染后的 HTML 页面给用户。 +5. Scraper 将抓取的数据结合(Analyzer)对数据进行分析。 +6. Analyzer 将分析后的数据返回给 Scraper。 +7. Generator 整理(Scraper)结构化数据后将其返回给 Flask。 +8. Flask 使用(Generator)的数据渲染 HTML 页面。 +9. Flask 返回渲染后的 HTML 页面给用户。 +## 主题开发 + +EndOfYear 使用 Python 结合 Flask 利用 Jinja2 模板进行数据渲染,目前提供四个数据模型。 + +```mermaid +erDiagram + Site ||--o{ Generator : contains + Blog ||--o{ Generator : contains + Post ||--o{ Generator : contains + Custom ||--o{ Generator : contains + + Site { + string service + string title + } + + Blog { + string name + string link + int life + int article_count + int article_word_count + string top_post_keys + string category + } + + Post { + string title + string content + string[] keys + string time + string date + + } + + Custom { + string yiyan + } + + Generator { + Site site + Blog blog + Post special_post + Post sentiment_post + Post long_post + Post short_post + Custom custom + } + +``` + +如果进行主题开发可以使用 Jinja2 的模板语言,结合下面的数据定制一款专属主题。 + +| 数据 | 描述 | +| -------------- | -------------- | +| site | 站点数据 | +| blog | 博客数据 | +| special_post | 特殊日期文件 | +| sentiment_post | 情感分最高文章 | +| long_post | 篇幅最长文章 | +| short_post | 篇幅最短文章 | +| custom | 自定义数据 | + +如果有额外数据需求,可以修改 `custom` 模型,并在 `main.py` 中传参,最后在 HTML 模板中使用。以下是一个简单的模板示例: + +```html + + + + + {{ site.title }} + + + 亲爱的{{ blog.name }} + + +``` ## 路线图 @@ -129,10 +197,10 @@ EndOfYear 目前处于初始阶段,如果您有兴趣,可以为其做出贡 ### V1 -- [ ] 对博客系统的数据源进行全面、规模性的测试。 -- [ ] 进一步细化数据分析维度和数据颗粒度,精准描绘用户画像。 -- [ ] 渲染数据的规范,约束主题开发,提高主题的兼容性。 -- [ ] 剥离数据分析和主题,提供更好地适用方式。 +- [x] 结合互联网公开博客的数据源对 EndOfYear 进行全面、规模性的测试。 +- [x] 默认主题进一步细化数据分析维度和数据颗粒度,精准描绘用户画像。 +- [x] EndOfYear 渲染数据的规范,约束主题开发,提高主题的兼容性。 +- [ ] 剥离主题,提供更好地主题开发方式。 ### V2