From e50a55ee1195f92eea832d7425f79ffd156eccda Mon Sep 17 00:00:00 2001 From: fujie Date: Wed, 11 Feb 2026 12:13:29 +0800 Subject: [PATCH] feat: enhance Mermaid visualizations with multi-series trends, distribution pie, and impact analysis --- scripts/openwebui_stats.py | 74 ++++++++++++++++++++++++++------------ 1 file changed, 51 insertions(+), 23 deletions(-) diff --git a/scripts/openwebui_stats.py b/scripts/openwebui_stats.py index 519980c..6e81c99 100644 --- a/scripts/openwebui_stats.py +++ b/scripts/openwebui_stats.py @@ -269,31 +269,59 @@ class OpenWebUIStats: print(f"⚠️ 无法从 Token 解析用户 ID: {e}") return "" - def generate_mermaid_chart(self) -> str: - """生成 Mermaid 增长趋势图""" + def generate_mermaid_chart(self, stats: dict = None) -> str: + """生成多维度的 Mermaid 可视化图表集""" history = self.load_history() - if len(history) < 3: # 数据太少不显示图表 - return "" + charts = [] - # 只取最近 14 天的数据用于展示 - data = history[-14:] - dates = [item["date"][-5:] for item in data] # 只取 MM-DD - dates_str = ", ".join([f'"{d}"' for d in dates]) - downloads = [str(item["total_downloads"]) for item in data] - downloads_str = ", ".join(downloads) + # 1. 增长趋势图 (XY Chart) + if len(history) >= 3: + # 只取最近 14 天 + data = history[-14:] + dates = [item["date"][-5:] for item in data] + dates_str = ", ".join([f'"{d}"' for d in dates]) + dls = [str(item["total_downloads"]) for item in data] + vws = [str(item["total_views"]) for item in data] - mm = [] - mm.append("### 📈 增长趋势 (14天)") - mm.append("") - mm.append("```mermaid") - mm.append("xychart-beta") - mm.append(f' title "Downloads Trend"') - mm.append(f" x-axis [{dates_str}]") - mm.append(f' y-axis "Downloads"') - mm.append(f" line [{downloads_str}]") - mm.append("```") - mm.append("") - return "\n".join(mm) + charts.append("### 📈 增长与趋势 (Last 14 Days)") + charts.append("```mermaid") + charts.append("xychart-beta") + charts.append(' title "Engagement & Downloads Trend"') + charts.append(f" x-axis [{dates_str}]") + charts.append(f' y-axis "Total Counts"') + charts.append(f" line [{', '.join(dls)}]") + charts.append(f" line [{', '.join(vws)}]") + charts.append("```") + charts.append("\n> *蓝色: 总下载量 | 紫色: 总浏览量*") + charts.append("") + + # 2. 插件类型分布 (Pie Chart) + if stats and stats.get("by_type"): + charts.append("### 📂 内容分类占比 (Distribution)") + charts.append("```mermaid") + charts.append("pie title Plugin Types") + for p_type, count in stats["by_type"].items(): + charts.append(f' "{p_type}" : {count}') + charts.append("```") + charts.append("") + + # 3. 影响力分析 (Bar Chart for Top 6) + if stats and stats.get("posts"): + top6 = stats["posts"][:6] + labels = [f'"{p["title"][:15]}..."' for p in top6] + values = [str(p["downloads"]) for p in top6] + + charts.append("### 🏆 影响力排行 (Top 6 Downloads)") + charts.append("```mermaid") + charts.append("xychart-beta") + charts.append(' title "Top 6 Plugins Comparison"') + charts.append(f" x-axis [{', '.join(labels)}]") + charts.append(f' y-axis "Downloads"') + charts.append(f" bar [{', '.join(values)}]") + charts.append("```") + charts.append("") + + return "\n".join(charts) def get_user_posts(self, sort: str = "new", page: int = 1) -> list: """ @@ -514,7 +542,7 @@ class OpenWebUIStats: md.append("") # 插入趋势图 - chart = self.generate_mermaid_chart() + chart = self.generate_mermaid_chart(stats) if chart: md.append(chart) md.append("")