Skip to content

datawhalechina/members-visualization

Repository files navigation

banner

🌟 Datawhale 贡献者可视化平台

智能化的开源社区贡献者分析与展示系统

GitHub stars GitHub forks GitHub issues GitHub license

Vue.js VitePress ECharts GitHub Actions


📖 项目简介

Datawhale 贡献者可视化平台 是一个现代化的开源社区贡献者分析与展示系统,专为开源组织和技术社区设计。通过智能化的数据收集和精美的可视化展示,帮助社区管理者和成员更好地了解社区生态和发展趋势。

🎯 核心价值

  • 📊 数据驱动决策 - 基于真实的 GitHub 数据,提供科学的社区分析
  • 🔍 深度洞察 - 多维度分析成员活跃度、研究方向和贡献模式
  • 🎨 直观展示 - 丰富的图表类型和交互式界面,让数据说话
  • ⚡ 自动化运维 - 全自动数据更新和部署,零维护成本
  • 🌐 开箱即用 - 简单配置即可适配任何 GitHub 组织

✨ 功能特性

📋 开源年报

  • 🔍 用户搜索 - 输入 GitHub 用户名生成专属报告
  • 📊 百分位排名 - 仓库数、Stars、贡献次数、关注者排名
  • 🏅 成就徽章 - 自动计算多维度成就徽章
  • 📷 图片导出 - 一键复制高清 PNG 或下载
  • 🔗 嵌入代码 - 生成 iframe 嵌入代码

🏅 成就徽章 & 新人引导

  • 🌟 7 类徽章 - Star 收割机、高产贡献者、多面手、社区影响力等
  • 🥇 三级评定 - 铜牌、银牌、金牌分级展示
  • 🗺️ 五步引导 - 了解组织→选择方向→找到项目→开始贡献→持续成长
  • 📊 动态数据 - 基于真实成员数据的方向分布饼图

📊 OSS Insight 集成

  • Stars 统计 - 组织 Stars 增长趋势和热门仓库排行
  • 👥 参与者分析 - 活跃/新增参与者趋势和排名
  • 🤝 参与度分析 - 最活跃贡献者和代码提交时间分布
  • 📈 生产力分析 - PR、Code Review、Issues 统计
  • 🔄 时间范围切换 - 支持 7天/28天/90天/12个月数据视图
  • 🎨 主题自适应 - 自动适配明亮/暗黑模式

🔍 强大搜索筛选

  • 实时搜索 - 毫秒级响应,支持模糊匹配
  • 🎯 精确筛选 - 多维度条件组合筛选
  • 📋 智能建议 - 搜索关键词自动补全
  • 📊 结果统计 - 实时显示筛选结果数量
  • 🔖 标签过滤 - 按研究方向快速定位
  • 💾 搜索历史 - 记住常用搜索条件

👥 GitHub 深度集成

  • 🖼️ 头像管理 - 自动下载缓存,支持默认头像
  • 🔗 一键跳转 - 直达 GitHub 个人主页
  • 📈 仓库统计 - Stars、Forks、仓库数实时统计
  • 👥 社交数据 - 关注者、关注数动态展示
  • 📦 最新项目 - 展示成员最近更新的仓库
  • 🏃 活跃分析 - Commit 频率和活跃度评估

🛠️ 现代化技术架构

  • 🚀 自动化流水线 - GitHub Actions 全自动部署
  • 📱 响应式设计 - 完美适配桌面端和移动端
  • 极速加载 - VitePress 静态生成,CDN 加速
  • 🔄 实时更新 - 每日自动拉取最新数据
  • 🎨 主题定制 - 支持亮色/暗色主题切换
  • 📊 性能监控 - API 调用统计和性能分析

🏗️ 技术架构

🛠️ 核心技术栈

Vue.js VitePress ECharts Python

层级 技术选型 说明
前端框架 Vue 3 + VitePress 现代化静态站点生成,极速开发体验
数据可视化 ECharts 5.x 丰富的图表类型,强大的交互能力
UI 组件 自研组件库 轻量级定制组件,完美适配业务需求
数据处理 Python 3.8+ GitHub API 集成,智能数据分析
自动化部署 GitHub Actions CI/CD 流水线,零配置自动部署
数据存储 CSV + JSON 轻量级数据格式,便于版本控制

📂 项目结构

📦 members-visualization/
├── 🤖 .github/workflows/           # GitHub Actions 工作流
│   ├── daily-data-update.yml      # 每日数据自动更新
│   ├── quarterly-contributors.yml # 季度贡献者统计工作流
│   └── deploy.yml                 # 自动构建部署
├── 📄 docs/                       # VitePress 文档站点
│   ├── .vitepress/                # VitePress 配置
│   │   ├── config.mjs             # 站点配置
│   │   └── theme/                 # 自定义主题
│   │       ├── members/           # 成员可视化组件目录
│   │       ├── organization/      # 组织可视化组件目录
│   │       ├── projects/          # 项目可视化组件目录
│   │       ├── quarterly/         # 季度贡献者组件目录
│   │       ├── rankings/          # 排名可视化组件目录
│   │       ├── stats/             # 组织统计组件目录
│   │       ├── badges/            # 成就徽章组件目录
│   │       ├── guide/             # 新人引导组件目录
│   │       ├── report/            # 开源年报组件目录
│   │       └── utils/             # 共享工具模块
│   ├── public/                    # 静态资源
│   │   ├── data/                  # 数据文件
│   │   │   ├── members.json       # 贡献者基础数据
│   │   │   ├── commits_weekly.json # 提交活跃度数据
│   │   │   └── datawhalechina/    # 组织专属数据
│   │   │       └── quarterly_contributors_*.json # 季度贡献者数据
│   │   └── avatars/               # 成员头像缓存
│   ├── index.md                   # 首页
│   ├── members.md                 # 成员列表页面
│   ├── rankings.md                # 贡献者榜单页面
│   ├── quarterly.md               # 季度贡献者页面
│   ├── rewards.md                 # 开源荣誉页面
│   ├── stats.md                   # 组织统计页面
│   ├── organization.md            # 成员与协作分析页面
│   ├── projects.md                # 项目统计页面
│   ├── badges.md                  # 成就徽章页面
│   ├── guide.md                   # 新人引导页面
│   └── report.md                  # 开源年报页面
├── 🐍 scripts/                    # Python 数据处理脚本
│   ├── bot_filter.py              # 机器人账户过滤模块(共享)
│   ├── fetch_members/             # 成员数据获取脚本
│   ├── fetch_organization/        # 组织数据获取脚本
│   └── quarterly_contributors/    # 季度贡献者统计脚本
│       └── quarterly_contributors.py
├── 📋 package.json                # Node.js 项目配置
├── 🔧 .env.example               # 环境变量模板
└── 📖 README.md                  # 项目文档

📊 页面导航

页面 路径 说明
🏠 首页 / 项目介绍和功能展示
👥 贡献者列表 /members 成员信息卡片展示,支持搜索筛选
🏆 贡献者榜单 /rankings Commit 活跃度排行和卷王榜单
📅 季度贡献者 /quarterly 按季度统计的贡献者分级展示
🎖️ 开源荣誉 /rewards 开源贡献荣誉展示
📊 组织统计 /stats OSS Insight 集成统计面板
👍🏻 项目统计 /projects 组织项目 Stars 统计
📚 成员与协作 /organization 成员与协作分析
🏅 成就徽章 /badges 基于贡献数据的多维度成就徽章
🗺️ 新人引导 /guide 五步开启开源之旅
📋 开源年报 /report 输入用户名生成专属开源报告
⭐ 点 Star /star 项目推荐页面

📊 数据模型

📋 贡献者数据结构 (members.json)

[
  {
    "id": "logan-zou",
    "name": "Logan Zou",
    "github": "https://github.com/logan-zou",
    "domain": "深度学习;LLM",
    "repositories": "llm-cookbook;self-llm;llm-universe",
    "public_repos": 18,
    "total_stars": 571,
    "followers": 246,
    "following": 5,
    "avatar": "avatars/logan-zou.jpg",
    "bio": "",
    "location": "Beijing, China",
    "company": "rednote"
  }
]
字段 类型 说明
id String GitHub 用户名(唯一标识符)
name String 成员真实姓名或昵称
github URL GitHub 个人主页链接
domain String 研究方向,多个用 ; 分隔
repositories String 参与的组织仓库列表
public_repos Number 个人公开仓库数量
total_stars Number 获得的总 Star 数
followers Number GitHub 关注者数量
following Number 关注的用户数量
avatar String 头像文件相对路径
bio String 个人简介
location String 地理位置
company String 所属公司或组织

📈 活跃度数据结构 (commits_weekly.json)

{
  "update_time": "2025-01-19T06:00:00Z",
  "days_range": 7,
  "total_commits": 156,
  "total_repos": 12,
  "user_commits": {
    "logan-zou": {
      "total_commits": 23,
      "repos": ["happy-llm", "llm-cookbook"],
      "daily_commits": {
        "2025-01-13": 5,
        "2025-01-14": 8,
        "2025-01-15": 10
      }
    }
  }
}

📅 季度贡献者数据结构 (quarterly_contributors_YYYY_QN.json)

{
  "meta": {
    "year": 2025,
    "quarter": 4,
    "generated_at": "2026-02-06T07:30:00",
    "total_contributors": 105,
    "outstanding_count": 6,
    "excellent_count": 13,
    "active_count": 86,
    "thresholds": {
      "outstanding": 50,
      "excellent": 10,
      "valid_commit_threshold": 10
    }
  },
  "contributors": {
    "outstanding": [...],
    "excellent": [...],
    "active": [...]
  }
}
字段 类型 说明
meta.year Number 统计年份
meta.quarter Number 统计季度 (1-4)
meta.thresholds Object 分级阈值配置
contributors.outstanding Array 卓越贡献者 (有效commit >= 50)
contributors.excellent Array 优秀贡献者 (有效commit >= 10)
contributors.active Array 活跃贡献者 (有效commit < 10)

每个贡献者对象包含:

字段 类型 说明
username String GitHub 用户名
verified Boolean 用户名是否经过 GitHub API 验证
valid_commits Number 有效 commit 次数
repos_count Number 参与的仓库数量
repos Array 参与的仓库列表
recent_commits Array 最近的 commit 详情(最多10条)

🚀 快速开始

📋 环境要求

环境 版本要求 说明
Node.js >= 16.0.0 推荐使用 LTS 版本
Python >= 3.8.0 数据收集脚本依赖
Git >= 2.0.0 版本控制工具

🛠️ 本地开发

📦 1. 项目初始化
# 克隆项目
git clone https://github.com/datawhalechina/members-visualization.git
cd members-visualization

# 安装前端依赖
npm install

# 安装 Python 依赖(可选)
pip install requests python-dotenv
🔧 2. 环境配置
# 编辑 .env 文件
vim .env

环境变量说明:

# GitHub API Token(推荐配置,避免速率限制)
GITHUB_TOKEN=ghp_your_personal_access_token_here

# 目标组织名称(默认:datawhalechina)
GITHUB_ORG=your_organization_name

# 数据收集配置
MIN_CONTRIBUTIONS=10        # 最小贡献阈值
COMMIT_DAYS_RANGE=7        # 统计最近N天的提交

💡 获取 GitHub Token:访问 GitHub Settings > Developer settings > Personal access tokens 创建新的 Token

🚀 3. 启动开发服务器
# 启动开发服务器
npm run docs:dev

🌐 访问地址http://localhost:5173

📊 数据管理

🔄 手动更新数据
# 完整数据收集(推荐)
python scripts/fetch_members/fetch_members.py

# 快速测试模式(处理较少数据,适合开发调试)
python scripts/fetch_members/fetch_members.py --test

数据收集说明:

  • 📊 数据范围:自动获取组织所有公开仓库的贡献者信息
  • 🤖 智能过滤:自动过滤机器人账户,确保数据质量
  • 🖼️ 头像管理:自动下载并缓存成员头像
📅 季度贡献者统计
# 统计上季度贡献者
python scripts/quarterly_contributors/quarterly_contributors.py --last

# 统计当前季度贡献者
python scripts/quarterly_contributors/quarterly_contributors.py --current

# 统计指定季度(如 2025年 Q4)
python scripts/quarterly_contributors/quarterly_contributors.py 2025 4

统计说明:

  • 📊 统计范围:遍历组织所有公开非 fork 仓库的 commit 记录
  • 🤖 机器人过滤:使用 bot_filter.py 共享模块自动过滤机器人账户
  • 💾 本地缓存:commit 详情缓存在 docs/public/data/cache/ 目录,避免重复 API 调用
  • 📧 用户名解析:多级回退策略(GitHub API -> noreply 邮箱解析 -> 邮箱搜索 -> 作者名)
  • 📁 输出文件docs/public/data/datawhalechina/quarterly_contributors_YYYY_QN.json
🏗️ 构建部署
# 构建生产版本
npm run docs:build

# 本地预览构建结果
npm run docs:dev

部署说明:

  • 自动部署:推送到 main 分支自动触发 GitHub Actions
  • 🕐 构建时间:通常 2-3 分钟完成构建和部署
  • 🌐 访问地址https://your-username.github.io/members-visualization/

🔧 使用指南

🔄 自动化数据更新

系统采用全自动化的数据更新机制:

更新方式 触发时机 说明
每日数据更新 每日凌晨 6:00 (北京时间) 自动拉取成员数据并重新部署
季度贡献者统计 手动触发 (workflow_dispatch) 支持上季度/当前季度/自定义季度模式
代码推送部署 Push 到 main 分支 代码变更时自动构建部署
手动触发部署 随时 Actions 页面手动触发部署

⚙️ 自定义配置

🎨 界面定制
// .vitepress/config.mjs - 站点配置
export default {
  title: "你的组织名称 成员可视化",
  description: "自定义描述信息",
  themeConfig: {
    nav: [
      { text: "首页", link: "/" },
      { text: "成员", link: "/members" },
    ],
  },
};
📊 图表样式
<!-- .vitepress/theme/stats/Charts.vue - 图表组件 -->
<script setup>
// 自定义图表配置
const chartOptions = {
  color: ["#ff6b6b", "#4ecdc4", "#45b7d1"], // 自定义颜色
  animation: true, // 启用动画
  // 更多配置...
};
</script>
🤖 数据收集配置
# .env - 环境变量配置
GITHUB_ORG=your-organization           # 目标组织
MIN_CONTRIBUTIONS=10                   # 最小贡献阈值
COMMIT_DAYS_RANGE=7                   # 统计天数范围
MAX_CONTRIBUTORS_PER_REPO=100         # 每个仓库最大贡献者数

🎯 核心功能详解

📊 OSS Insight 统计面板

集成 OSS Insight 专业分析平台,提供以下统计维度:

  • ⭐ 受欢迎程度 - Stars 增长趋势、热门仓库排行
  • 👥 参与者分析 - 活跃/新增参与者趋势和排名
  • 🤝 参与度分析 - 最活跃贡献者、代码提交时间分布
  • 📈 生产力分析 - PR、Code Review、Issues 统计

🏆 GitHub 活跃度分析

  • 📈 Commit 活跃度排行榜 - 展示最近一周的代码贡献情况
  • 📅 每日提交分布图 - 可视化成员的工作节奏和活跃时段
  • 🔥 卷王指数计算 - 基于多维度指标的综合活跃度评分
  • 📊 仓库贡献统计 - 展示成员在不同项目中的参与度

📅 季度贡献者统计

按季度统计组织内所有成员的有效贡献,并按等级分类展示:

  • 🏅 卓越贡献者 - 有效 commit >= 50 次
  • ⭐ 优秀贡献者 - 有效 commit >= 10 次
  • 👥 活跃贡献者 - 有效 commit < 10 次
  • 📋 一键复制 - 支持复制贡献者名单,方便汇报使用
  • 🤖 智能过滤 - 自动过滤机器人账户(bot_filter 共享模块)
  • 📧 用户名解析 - 多级回退策略解析 GitHub 用户名(API、邮箱、搜索)

有效 commit 定义:至少包含一个文件新增行数 >= 10 行

🔍 智能搜索与筛选

  • ⚡ 实时搜索 - 毫秒级响应,支持拼音和模糊匹配
  • 🎯 多条件筛选 - 按研究方向、活跃度、地区等维度筛选
  • 📋 搜索建议 - 智能提示,快速定位目标成员
  • 💾 历史记录 - 记住常用搜索条件,提升使用效率

🔧 开发指南

🎨 添加新的图表类型

📊 创建自定义图表组件
<!-- 1. 在 .vitepress/theme/ 目录下创建新组件 -->
<template>
  <div ref="chartRef" class="custom-chart"></div>
</template>

<script setup>
import { ref, onMounted } from "vue";
import * as echarts from "echarts";

const chartRef = ref(null);

onMounted(() => {
  const chart = echarts.init(chartRef.value);
  const option = {
    // 你的图表配置
  };
  chart.setOption(option);
});
</script>
🔄 修改数据源
// 在组件中修改数据获取逻辑
const fetchData = async () => {
  try {
    // 从 API 获取数据
    const response = await fetch("/api/your-endpoint");
    const data = await response.json();

    // 处理数据
    return processData(data);
  } catch (error) {
    console.error("数据获取失败:", error);
    // 降级到本地数据
    return await import("/data/fallback.json");
  }
};

🤝 贡献指南

我们热烈欢迎社区贡献!无论是 Bug 修复、新功能开发还是文档改进,都是对项目的宝贵贡献。

📄 许可证

本项目采用 MIT 许可证 - 您可以自由使用、修改和分发本项目。

🏆 贡献者

感谢所有为本项目做出贡献的开发者们!您的每一份贡献都让这个项目变得更好。

📊 项目统计

GitHub repo size GitHub code size GitHub commit activity GitHub last commit

⭐ Star History

Star History Chart


🌟 如果这个项目对您有帮助,请给我们一个 Star!

Datawhale 开源社区用 ❤️ 维护