This is an automated email from the ASF dual-hosted git repository.

lidongdai pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/seatunnel-website.git


The following commit(s) were added to refs/heads/main by this push:
     new 49a0159602b8 [Improve] Display of team members avatars (#407)
49a0159602b8 is described below

commit 49a0159602b823f2a317839d2b402c3e367d3076
Author: Jast <[email protected]>
AuthorDate: Tue Dec 30 20:09:17 2025 +0800

    [Improve] Display of team members avatars (#407)
---
 README.md                          |  30 +++++++-
 README_ZH.md                       |  30 +++++++-
 src/pages/team/github-avatars.json | 146 ++++++++++++++++++++++++++++++++++++
 src/pages/team/index.js            |  14 +++-
 src/pages/team/languages.json      | 148 ++++++++++++++++++-------------------
 tools/fetch-team-avatars.js        | 125 +++++++++++++++++++++++++++++++
 6 files changed, 415 insertions(+), 78 deletions(-)

diff --git a/README.md b/README.md
index 416f41150e49..f8c3c1d5c564 100644
--- a/README.md
+++ b/README.md
@@ -134,9 +134,37 @@ Located in `src/pages/team`
 ├── team
         ├── index.js
         ├── index.less
-        └── languages.json
+        ├── languages.json
+        └── github-avatars.json
+```
+
+#### Update Team Member Avatars
+
+Team member avatars are stored as Base64 encoded strings, independent of 
external GitHub resources. When adding new members or updating avatars:
+
+1. Modify `languages.json`, add new member info to `pmc` or `committer` array:
+
+```json
+{
+  "apacheId": "newmember",
+  "githubId": "newmember",
+  "name": "New Member",
+  "userId": "12345678"
+}
 ```
 
+2. Run the avatar fetch script:
+
+```bash
+node tools/fetch-team-avatars.js
+```
+
+The script will:
+- Download all member avatars from GitHub
+- Convert to Base64 and save to `github-avatars.json`
+- Update `userId` field in `languages.json`
+
+
 ### 3.7 User list page modification
 
 Visit the page https://seatunnel.apache.org/user
diff --git a/README_ZH.md b/README_ZH.md
index cbed303ff820..d12a3adea23b 100644
--- a/README_ZH.md
+++ b/README_ZH.md
@@ -134,9 +134,37 @@ css等样式文件放在`src/css`目录下
 ├── team
         ├── index.js
         ├── index.less
-        └── languages.json
+        ├── languages.json
+        └── github-avatars.json
+```
+
+#### 更新团队成员头像
+
+团队成员头像使用 Base64 编码存储,不依赖外部 GitHub 资源。当有新成员加入或需要更新头像时:
+
+1. 修改 `languages.json`,在 `pmc` 或 `committer` 数组中添加新成员信息:
+
+```json
+{
+  "apacheId": "newmember",
+  "githubId": "newmember",
+  "name": "New Member",
+  "userId": "12345678"  // GitHub 用户 ID(从 
https://api.github.com/users/{githubId} 获取)
+}
 ```
 
+2. 运行头像获取脚本:
+
+```bash
+node tools/fetch-team-avatars.js
+```
+
+该脚本会:
+- 从 GitHub 下载所有成员头像
+- 转换为 Base64 并保存到 `github-avatars.json`
+- 更新 `languages.json` 中的 `userId` 字段
+
+
 ### 3.7  用户 列表页面修改
 
 访问页面  https://seatunnel.apache.org/zh-CN/user/
diff --git a/src/pages/team/github-avatars.json 
b/src/pages/team/github-avatars.json
new file mode 100644
index 000000000000..30705ea10b24
--- /dev/null
+++ b/src/pages/team/github-avatars.json
@@ -0,0 +1,146 @@
+[
+  {
+    "id": "219644",
+    "avatar_base64": 
"/9j/4AAQSkZJRgABAQEAYABgAAD//gA7Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJSkcgSlBFRyB2NjIpLCBxdWFsaXR5ID0gOTAK/9sAQwADAgIDAgIDAwMDBAMDBAUIBQUEBAUKBwcGCAwKDAwLCgsLDQ4SEA0OEQ4LCxAWEBETFBUVFQwPFxgWFBgSFBUU/9sAQwEDBAQFBAUJBQUJFA0LDRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU/8AAEQgBzAHMAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERU
 [...]
+  },
+  {
+    "id": "15965696",
+    "avatar_base64": 
"/9j/4AAQSkZJRgABAQEAYABgAAD//gA7Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJSkcgSlBFRyB2NjIpLCBxdWFsaXR5ID0gOTAK/9sAQwADAgIDAgIDAwMDBAMDBAUIBQUEBAUKBwcGCAwKDAwLCgsLDQ4SEA0OEQ4LCxAWEBETFBUVFQwPFxgWFBgSFBUU/9sAQwEDBAQFBAUJBQUJFA0LDRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU/8AAEQgBzAHMAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERU
 [...]
+  },
+  {
+    "id": "25520639",
+    "avatar_base64": 
"/9j/2wCEAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDIBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAcwBzAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5e
 [...]
+  },
+  {
+    "id": "1346010",
+    "avatar_base64": 
"/9j/2wCEAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDIBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAcwBzAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5e
 [...]
+  },
+  {
+    "id": "158903",
+    "avatar_base64": 
"iVBORw0KGgoAAAANSUhEUgAAAaQAAAGkCAIAAADxLsZiAAAF9ElEQVR4nOzXsY3jMBBA0fPBVbgn98Se1JNilnCBgU0v0ZKQ/3sNzAADf1PPOecfgG/3d/cCACuIHZAgdkCC2AEJYgckiB2QIHZAgtgBCWIHJIgdkCB2QILYAQliBySIHZAgdkCC2AEJYgckiB2QIHZAgtgBCWIHJIgdkCB2QILYAQliBySIHZAgdkCC2AEJYgckiB2QIHZAgtgBCWIHJIgdkPDcvcCNHePcvcL13uO1e4UruRE/vOyABLEDEsQOSBA7IEHsgASxAxLEDkgQOyBB7IAEsQMSxA5IEDsgQeyABLEDEsQOSBA7IEHsgASxAxLEDkgQOyBB7IAEsQMSxA5IEDsgQeyABLEDEsQOSBA7IEHsgASxAxLEDkgQOyBB7IAEsQMSxA5IEDsgQeyABLEDEsQOSBA7IEHsgA
 [...]
+  },
+  {
+    "id": "10952755",
+    "avatar_base64": 
"/9j/2wCEAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDIBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAcwBzAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5e
 [...]
+  },
+  {
+    "id": "15833811",
+    "avatar_base64": 
"iVBORw0KGgoAAAANSUhEUgAAAcwAAAHMCAIAAADXuQ/RAACAAElEQVR4nOy9Z5Rc55nn94abKld1zhHdCN0AGhlEIkECJAGSEoMoaUaj0cremR3b67G/+ct+mHN2j/1pz8wHn7V9LMvanZnlkBJFiqIIBhAkQCLnHDrnWNWV64Y37Ln3VnVXNxokQLIJhvcnCKdR7Kq6Fe7/Pu/zPs//kTjnQCAQCATLA3rYByAQCATfZYTICgQCwTIiRFYgEAiWESGyAoFAsIwIkRUIBIJlRIisQCAQLCNCZAUCgWAZESIrEAgEy4gQWYFAIFhGhMgKBALBMiJEViAQCJYRIbICgUCwjAiRFQgEgmVEiKxAIBAsI0JkBQKBYBkRIisQCATLiBBZgUAgWEaEyAoEAsEyIkRWIBAIlhEhsgKBQLCMCJEVCASCZUSIrEAgECwjQmQFAoFgGREiKxAIBMuIEFmBQC
 [...]
+  },
+  {
+    "id": "16631152",
+    "avatar_base64": 
"/9j/2wCEAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDIBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAZABkAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5e
 [...]
+  },
+  {
+    "id": "18550072",
+    "avatar_base64": 
"/9j/2wCEAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDIBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAcwBzAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5e
 [...]
+  },
+  {
+    "id": "2291859",
+    "avatar_base64": 
"iVBORw0KGgoAAAANSUhEUgAAAcwAAAHMCAYAAABY25iGAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAgAElEQVR42oy9W5ItSZIcZmpx8t5br+meGQJDIQnhD9fFbWAJWB52ABFAAAiFD2Aw/ahbmSdc+eFuZmoecbJ6REBWV2XmiRPh4W6mpg/8u3/7f9JgBsAGaWY0wMxIAw9zHjb8aWZmBM0AM5rBYA4zo5kZjBg2/w6Nw+bfMTPDYfOnLX7YCBroZoC508aw+X+kGeb/A4YBMJoZifkX6OY8bP4xGv005N/OTzSYW/xLN86/Gz+D+c/uMBJmBhtGM85fcPi8BjNzPowc8y/7YVifcNppZoeZuZmd5hgG0IxHfY6hvu+6R/O6YFzX4+D6OZjhjAucP2PDDLQHH/MeGOc91k+I5zbmNwWO9XvDgHPeY8P8b3bY29ev9uMffrbnr+/G82k8323wY/
 [...]
+  },
+  {
+    "id": "41584238",
+    "avatar_base64": 
"/9j/2wCEAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDIBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAcwBzAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5e
 [...]
+  },
+  {
+    "id": "53861852",
+    "avatar_base64": 
"iVBORw0KGgoAAAANSUhEUgAAAcwAAAHMCAIAAADXuQ/RAACAAElEQVR4nOz9B3ccR7IljmdkZlV7eA+QcAToREmckZk3+9/d83bP+X+t97He7r43s7MaGcpQ9B4EQBCO8L5NVWb+TkVkVlU3QIqiRNFViAKb3Y3u6uqqW5ERN+6VWmuWRRa/NcCY6C+NYYwBYFJ6AAwgeVIQhIwxzgVjBp8VhRDcvYKhp0WP0X/GRD8Y3m9Y9ARgHLhxAfjqkHoPwLcEAM65EFxwbhgorbTWdE/0SoYppejXOef4dIjeIHoHE7+Ouz+LLH5TyDe9AVm81QHmpZ6mCZwiPDQIe8z+MNFD+C9DGIYQiNCplYrAVB8e1hEDVai0UmF0n8JboVLRUxShdhiGxrDoaWGEj5wTPHIERPeWjHmeR2DqeV4ul8/l/OgfeBcwC9Oe9IS9M0LhaIMY/hfDLEIu8BMhFmH/2H
 [...]
+  },
+  {
+    "id": "15820530",
+    "avatar_base64": 
"/9j/2wCEAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDIBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAcwBzAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5e
 [...]
+  },
+  {
+    "id": "22415594",
+    "avatar_base64": 
"/9j/2wCEAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDIBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAcwBzAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5e
 [...]
+  },
+  {
+    "id": "32387433",
+    "avatar_base64": 
"/9j/2wCEAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDIBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAcwBzAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5e
 [...]
+  },
+  {
+    "id": "51053924",
+    "avatar_base64": 
"/9j/2wCEAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDIBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAcwBzAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5e
 [...]
+  },
+  {
+    "id": "32193458",
+    "avatar_base64": 
"iVBORw0KGgoAAAANSUhEUgAAAVYAAAFWCAIAAAC9zSLUAACAAElEQVR4nOS9W5Pi2Lbdj0CQQAJ5q6ruPm1728dPDkfYH8Of3k/2y/Y14uwd3V1VWZlJcknu+gf6aQ2GlgRFZnX1bsdfZ0cdmgQhLa15G3PMOdP/8l/+S6PRSPKDF438yMKxC8d2u93tdryT8SoczWaz2+22Wi2+uN1ukyRptVrNZlMnSZIkzY9Op5OmaavVStP0Ij86+XFxcdHv9weDwXV+jEajfr/fbrezLNtsNqvVarlcLhaL1Wq1Xq+z3a4ZztBut1utFlfebDbb7TY/5K+5GN2dLl/XqbtulI/qOzrJOQe/0qic5OgRHsTpX3zVNVROn5x/ziRJtDg6drudXlfX5/QRf75YoIZflf/Lr+vauJ5iE+an0oskSXa73cvLy3w+n81m/Pv4+Pjbb799+vTp8+fP8/mcz6zX69
 [...]
+  },
+  {
+    "id": "19817318",
+    "avatar_base64": 
"/9j/2wCEAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDIBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAcwBzAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5e
 [...]
+  },
+  {
+    "id": "14371345",
+    "avatar_base64": 
"/9j/2wCEAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDIBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAKgAqAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5e
 [...]
+  },
+  {
+    "id": "83933160",
+    "avatar_base64": 
"/9j/2wCEAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDIBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAcwBzAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5e
 [...]
+  },
+  {
+    "id": "48236177",
+    "avatar_base64": 
"/9j/2wCEAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDIBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAcwBzAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5e
 [...]
+  },
+  {
+    "id": "28497357",
+    "avatar_base64": 
"/9j/2wCEAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDIBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAcwBzAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5e
 [...]
+  },
+  {
+    "id": "95013770",
+    "avatar_base64": 
"/9j/2wCEAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDIBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAMwAzAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5e
 [...]
+  },
+  {
+    "id": "13284744",
+    "avatar_base64": 
"iVBORw0KGgoAAAANSUhEUgAAAcwAAAHMCAIAAADXuQ/RAACAAElEQVR4nJz967YjO3IdjEYgWVvyef+3Oa/jP1K3PWTJUlctJhDfSMRtBgCuKpkt1eYik5m4zphxxetf/u1fiYiJROT5z/YS0f/M/5H9+/zDcAX+ae9Ev2G9Nj+zayU/8NuUW0rcqrFfps/m+beIP8O/ez5fmyIyiFlEGC6ef7LQ86/9cL6G2COHt/C5Ur+VeDjbz2XwbIl9Pv9nLZ4tsedaq6g9P7G26j312zGG/cR7LSSN2/FivS30TrQXrbWn/cOaNGhoB2kdT2u/eHO9+UQxRzl9jKO+T9LoY84O6y/HGD5cA58IPy2f2HhR0y7EMNoym7cSeYYiBoGI7n7nHfzDuDiXq61nZrkYxhbf4299LfWyOmebZ5OOO6N0BlslQ8pXcuh+fOcTkUvZB2GU1vqUDRkxer6G13FmmL
 [...]
+  },
+  {
+    "id": "29206593",
+    "avatar_base64": 
"/9j/2wCEAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDIBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAcwBzAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5e
 [...]
+  },
+  {
+    "id": "8814185",
+    "avatar_base64": 
"iVBORw0KGgoAAAANSUhEUgAAAcwAAAHMCAIAAADXuQ/RAABD90lEQVR4nOzdd3xUVd4/8FunTwqhBUJHelNcG01iQdBVUUFBhd2VR3TxWV3LPvvo6j62FV1/rsvuWtB17WBHxVVpAtItAekECCC9hWTqndt+L3LZEJNJMnPn3LllPu8/8tJk5sxJmPnMmXPP+R5OVVUKwAyqqsqyXPtVVVVFUWr/g6Io7av2FG34RKVpuvYrwzDaV7pG7X+wLFv71aTfEnIdjZAF4pT/qM3N2v+tm6RZ7lW9/GVq1H6H+Y8s9wocDyELBMiyLIqiJEmyLEuSZN8nFU3THMexLMtxHM/zLMua3SOwPYQspEGWZUVRGn41u18GYhiGZdmGX83uF9gGQhaaIctyIpGQJCmRSODZoqFp2uVycRzncrkQuNA0hCwkJ8uyIAhavJrdF0vTotbtdiNtISmELFC18wC1k6
 [...]
+  },
+  {
+    "id": "18065113",
+    "avatar_base64": 
"/9j/2wCEAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDIBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAcwBzAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5e
 [...]
+  },
+  {
+    "id": "36807946",
+    "avatar_base64": 
"/9j/2wCEAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDIBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAcwBzAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5e
 [...]
+  },
+  {
+    "id": "67902676",
+    "avatar_base64": 
"iVBORw0KGgoAAAANSUhEUgAAAaQAAAGkCAIAAADxLsZiAAAF60lEQVR4nOzXwY3bMAAF0WygLlyYOlER6kSF6c4SclhggZxyiC3Knvca4AdkjMlljPEL4NP9nj0A4ApiBySIHZAgdkCC2AEJYgckiB2QIHZAgtgBCWIHJIgdkCB2QILYAQliBySIHZAgdkCC2AEJYgckiB2QIHZAgtgBCWIHJIgdkCB2QILYAQliBySIHZAgdkCC2AEJYgckiB2QIHZAgtgBCWIHJCyzB3Aj57rNnvB8j2OfPYFbcLMDEsQOSBA7IEHsgASxAxLEDkgQOyBB7IAEsQMSxA5IEDsgQeyABLEDEsQOSBA7IEHsgASxAxLEDkgQOyBB7IAEsQMSxA5IEDsgQeyABLEDEsQOSBA7IEHsgASxAxLEDkgQOyBB7IAEsQMSxA5IEDsgQeyABLEDEsQOSBA7IEHsgASxAx
 [...]
+  },
+  {
+    "id": "8068247",
+    "avatar_base64": 
"/9j/2wCEAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDIBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAZkBmQMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5e
 [...]
+  },
+  {
+    "id": "45089228",
+    "avatar_base64": 
"/9j/2wCEAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDIBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAcwBzAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5e
 [...]
+  },
+  {
+    "id": "18141150",
+    "avatar_base64": 
"iVBORw0KGgoAAAANSUhEUgAAAcwAAAHMCAIAAADXuQ/RAACAAElEQVR4nOz92bYkubEmBpsBcI+IvXOoLBbJ7r+7/1fRWrrRs2rpRi8ktS7UTTZ5WJXjjgh3B0wLgw2Ae2QlD6t4mlzHKyszwsMHjB8+GxH+9//j/3QOARAx/5//5s+Qz0L+hwjK+XKm/uoAwDl05Ts65I/1Ar4XMXjng/P5HQT7o1xZP/UnsP5F+cglaP8D2psPHjgeBK0q8rV/f/l/fGj7P19cauW8d2iusHdxXQFMu3Fd8ucYY0wxEQHx6+2H8in/XT6T/EraCNLMrYUd5pZ3DhF86QNu7XKbvL+2HEBKKUaSAuTTlL+2li1fCbR3ufv4H4D8MudMo9JRX9ZqHHQzytA56h7+9LXelFJp0+1evTuPrb5AqVyR9hcclgR2YxK60hPpT9yKXPWui+UjJoJUi4Jga8GltqWnXT
 [...]
+  },
+  {
+    "id": "5720433",
+    "avatar_base64": 
"/9j/2wCEAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDIBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAQwBDAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5e
 [...]
+  },
+  {
+    "id": "29418975",
+    "avatar_base64": 
"/9j/2wCEAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDIBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAcwBzAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5e
 [...]
+  },
+  {
+    "id": "39961809",
+    "avatar_base64": 
"iVBORw0KGgoAAAANSUhEUgAAAcwAAAHMCAIAAADXuQ/RAACAAElEQVR4nNS9e7PtyW0dBvTZM+RIJmnaVv5JynFe5VTs/JNUvv93iOy4KiqKpBiVGYaumCItkZw5jdTuBhYW0L3PvSNRtrPJuffcfX6PbjQaWHj240c/+0sxERURUYuf1l/7H6pq+xsVEx3rZ1vf72tk/6xmzwts3RsPeV4iOk10v2CKyNB4z75ZxMyeD1e/6/nN+u16+zATfhGebGb88/Mh4tftQZRf7ZGYtI/FO8ca+vq/4UX7FWtygteZ08p/Oh9pNlWfd82557Sp8/xZ9xAsCNJetKnsj5yb4nsx4gLd1NrX7jmvsc24yG+wmNieOwaPT7zLLxIi/vmx5AnbSy+bIBp3i/NFTGf9Ph55GYD5/5xTjOeq+8ntLhXirOTTTno9JnKbqdG6Kf0ZAxB7W9xna43X+k/xf0gO+v
 [...]
+  },
+  {
+    "id": "73771213",
+    "avatar_base64": 
"/9j/2wCEAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDIBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAZABkAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5e
 [...]
+  }
+]
\ No newline at end of file
diff --git a/src/pages/team/index.js b/src/pages/team/index.js
index ad6a48aa2c57..220ab0d6346d 100644
--- a/src/pages/team/index.js
+++ b/src/pages/team/index.js
@@ -1,9 +1,19 @@
 import React from 'react';
 import useIsBrowser from '@docusaurus/useIsBrowser';
 import config from "./languages.json";
+import avatarSrc from "./github-avatars.json";
 import Layout from '@theme/Layout';
 import './index.less';
 
+// Get avatar URL by user ID from Base64 data
+function avatarUrl(id) {
+    const avatarObj = avatarSrc.find((item) => item.id === id);
+    if (avatarObj) {
+        return "data:image/png;base64," + avatarObj.avatar_base64;
+    }
+    return "";
+}
+
 export default function () {
     const isBrowser = useIsBrowser();
     const language = isBrowser && location.pathname.indexOf('/zh-CN/') === 0 ? 
'zh-CN' : 'en';
@@ -22,7 +32,7 @@ export default function () {
                         config.pmc.map((item, i) => (
                             <a href={'https://github.com/' + item.githubId} 
key={i} target="_blank">
                                 <li className="character_item text_center" 
style={{'listStyle': 'none'}}>
-                                    <img className="character_avatar" 
src={item.avatarUrl} alt={item.name}/>
+                                    <img className="character_avatar" 
src={avatarUrl(item.userId)} alt={item.name}/>
                                     <div className="character_desc">
                                         <h3 className="character_id"><span 
className="githubId">githubId:</span>{item.githubId}</h3>
                                     </div>
@@ -39,7 +49,7 @@ export default function () {
                       config.committer.map((item, i) => (
                       <a href={'https://github.com/' + item.githubId} key={i} 
target="_blank">
                         <li className="character_item text_center" 
style={{'listStyle': 'none'}}>
-                          <img className="character_avatar" 
src={item.avatarUrl} alt={item.name}/>
+                          <img className="character_avatar" 
src={avatarUrl(item.userId)} alt={item.name}/>
                           <div className="character_desc">
                             <h3 className="character_id"><span 
className="githubId">githubId:</span>{item.githubId}</h3>
                           </div>
diff --git a/src/pages/team/languages.json b/src/pages/team/languages.json
index 4b9a2e60b58b..a8068faeba99 100644
--- a/src/pages/team/languages.json
+++ b/src/pages/team/languages.json
@@ -14,221 +14,221 @@
   "pmc": [
     {
       "apacheId": "ningjiang",
-      "avatarUrl": "https://avatars.githubusercontent.com/u/219644?v=4";,
       "githubId": "WillemJiang",
-      "name": "Willem Ning Jiang"
+      "name": "Willem Ning Jiang",
+      "userId": "219644"
     },
     {
       "apacheId": "kezhenxu94",
-      "avatarUrl": "https://avatars.githubusercontent.com/u/15965696?v=4";,
       "githubId": "kezhenxu94",
-      "name": "Zhenxu Ke"
+      "name": "Zhenxu Ke",
+      "userId": "15965696"
     },
     {
       "apacheId": "guowei",
-      "avatarUrl": "https://avatars.githubusercontent.com/u/25520639?v=4";,
       "githubId": "William-GuoWei",
-      "name": "Guo William"
+      "name": "Guo William",
+      "userId": "25520639"
     },
     {
       "apacheId": "djkevincr",
-      "avatarUrl": "https://avatars.githubusercontent.com/u/1346010?v=4";,
       "githubId": "djkevincr",
-      "name": "Kevin Ratnasekera"
+      "name": "Kevin Ratnasekera",
+      "userId": "1346010"
     },
     {
       "apacheId": "jbonofre",
-      "avatarUrl": "https://avatars.githubusercontent.com/u/158903?v=4";,
       "githubId": "jbonofre",
-      "name": "Jean-Baptiste Onofré"
+      "name": "Jean-Baptiste Onofré",
+      "userId": "158903"
     },
     {
       "apacheId": "tedliu",
-      "avatarUrl": "https://avatars.githubusercontent.com/u/10952755?v=4";,
       "githubId": "tedliu1",
-      "name": "Ted Liu"
+      "name": "Ted Liu",
+      "userId": "10952755"
     },
     {
       "apacheId": "lidongdai",
-      "avatarUrl": "https://avatars.githubusercontent.com/u/15833811?v=4";,
       "githubId": "dailidong",
-      "name": "Lidong Dai"
+      "name": "Lidong Dai",
+      "userId": "15833811"
     },
     {
       "apacheId": "kirs",
-      "avatarUrl": "https://avatars.githubusercontent.com/u/16631152?v=4";,
       "githubId": "CalvinKirs",
-      "name": "Calvin Kirs"
+      "name": "Calvin Kirs",
+      "userId": "16631152"
     },
     {
       "apacheId": "rickyhuo",
-      "avatarUrl": "https://avatars.githubusercontent.com/u/18550072?v=4";,
       "githubId": "RickyHuo",
-      "name": "Ricky Huo"
+      "name": "Ricky Huo",
+      "userId": "18550072"
     },
     {
       "apacheId": "gaoyingju",
-      "avatarUrl": "https://avatars.githubusercontent.com/u/2291859?v=4";,
       "githubId": "garyelephant",
-      "name": "Gary Gao"
+      "name": "Gary Gao",
+      "userId": "2291859"
     },
     {
       "apacheId": "ridxiong",
-      "avatarUrl": "https://avatars.githubusercontent.com/u/41584238?v=4";,
       "githubId": "kid-xiong",
-      "name": "kid Xiong"
+      "name": "kid Xiong",
+      "userId": "41584238"
     },
     {
       "apacheId": "nielifeng",
-      "avatarUrl": "https://avatars.githubusercontent.com/u/53861852?v=4";,
       "githubId": "nielifeng",
-      "name": "LiFeng Nie"
+      "name": "LiFeng Nie",
+      "userId": "53861852"
     },
     {
       "apacheId": "zhongjiajie",
-      "avatarUrl": "https://avatars.githubusercontent.com/u/15820530?v=4";,
       "githubId": "zhongjiajie",
-      "name": "Jiajie Zhong"
+      "name": "Jiajie Zhong",
+      "userId": "15820530"
     },
     {
       "apacheId": "wenjun",
-      "avatarUrl": "https://avatars.githubusercontent.com/u/22415594?v=4";,
       "githubId": "ruanwenjun",
-      "name": "Wenjun Ruan"
+      "name": "Wenjun Ruan",
+      "userId": "22415594"
     },
     {
       "apacheId": "fanjia",
-      "avatarUrl": "https://avatars.githubusercontent.com/u/32387433?v=4";,
       "githubId": "Hisoka-X",
-      "name": "Hisoka"
+      "name": "Hisoka",
+      "userId": "32387433"
     },
     {
       "apacheId": "tyrantlucifer",
-      "avatarUrl": "https://avatars.githubusercontent.com/u/51053924?v=4";,
       "githubId": "tyrantlucifer",
-      "name": "Chao Tian"
+      "name": "Chao Tian",
+      "userId": "51053924"
     },
     {
       "apacheId": "gaojun2048",
-      "avatarUrl": "https://avatars.githubusercontent.com/u/32193458?v=4";,
       "githubId": "EricJoy2048",
-      "name": "Jun Gao"
+      "name": "Jun Gao",
+      "userId": "32193458"
     },
     {
       "apacheId": "dijiekstra",
-      "avatarUrl": "https://avatars.githubusercontent.com/u/19817318?v=4";,
       "githubId": "dijiekstra",
-      "name": "Jinxin Shen"
+      "name": "Jinxin Shen",
+      "userId": "19817318"
     },
     {
       "apacheId": "wanghailin",
-      "avatarUrl": "https://avatars.githubusercontent.com/u/14371345?v=4";,
       "githubId": "hailin0",
-      "name": "Hailin Wang"
+      "name": "Hailin Wang",
+      "userId": "14371345"
     },
     {
       "apacheId": "ic4y",
-      "avatarUrl": "https://avatars.githubusercontent.com/u/83933160?v=4";,
       "githubId": "ic4y",
-      "name": "Li Liu"
+      "name": "Li Liu",
+      "userId": "83933160"
     },
     {
       "apacheId": "liugddx",
-      "avatarUrl": "https://avatars.githubusercontent.com/u/48236177?v=4";,
       "githubId": "liugddx",
-      "name": "Guangdong Liu"
+      "name": "Guangdong Liu",
+      "userId": "48236177"
     },
     {
       "apacheId": "jarvis",
-      "avatarUrl": "https://avatars.githubusercontent.com/u/28497357?v=4";,
       "githubId": "liunaijie",
-      "name": "Naijie Liu"
-    }    
+      "name": "Naijie Liu",
+      "userId": "28497357"
+    }
   ],
   "committer": [
     {
       "apacheId": "leo65535",
-      "avatarUrl": "https://avatars.githubusercontent.com/u/95013770?v=4";,
       "githubId": "leo65535",
-      "name": "Lei Xie"
+      "name": "Lei Xie",
+      "userId": "95013770"
     },
     {
       "apacheId": "benjobs",
-      "avatarUrl": "https://avatars.githubusercontent.com/u/13284744?v=4";,
       "githubId": "wolfboys",
-      "name": "Huajie Wang"
+      "name": "Huajie Wang",
+      "userId": "13284744"
     },
     {
       "apacheId": "wuchunfu",
-      "avatarUrl": "https://avatars.githubusercontent.com/u/29206593?v=4";,
       "githubId": "wuchunfu",
-      "name": "ChunFu Wu"
+      "name": "ChunFu Wu",
+      "userId": "29206593"
     },
     {
       "apacheId": "yangxiang",
-      "avatarUrl": "https://avatars.githubusercontent.com/u/8814185?v=4";,
       "githubId": "yx91490",
-      "name": "Yang Xiang"
+      "name": "Yang Xiang",
+      "userId": "8814185"
     },
     {
       "apacheId": "ming",
-      "avatarUrl": "https://avatars.githubusercontent.com/u/18065113?v=4";,
       "githubId": "simon824",
-      "name": "Simon"
+      "name": "Simon",
+      "userId": "18065113"
     },
     {
       "apacheId": "zongwen",
-      "avatarUrl": "https://avatars.githubusercontent.com/u/36807946?v=4";,
       "githubId": "ashulin",
-      "name": "Zongwen Li"
+      "name": "Zongwen Li",
+      "userId": "36807946"
     },
     {
       "apacheId": "zhouyao2023",
-      "avatarUrl": "https://avatars.githubusercontent.com/u/67902676?v=4";,
       "githubId": "Carl-Zhou-CN",
-      "name": "Yao Zhou"
+      "name": "Yao Zhou",
+      "userId": "67902676"
     },
     {
       "apacheId": "machengy",
-      "avatarUrl": "https://avatars.githubusercontent.com/u/8068247?v=4";,
       "githubId": "rewerma",
-      "name": "Chengyuan Ma"
+      "name": "Chengyuan Ma",
+      "userId": "8068247"
     },
     {
       "apacheId": "taozex",
-      "avatarUrl": "https://avatars.githubusercontent.com/u/45089228?v=4";,
       "githubId": "TaoZex",
-      "name": "Bingye Chen"
+      "name": "Bingye Chen",
+      "userId": "45089228"
     },
     {
       "apacheId": "dailai",
-      "avatarUrl": "https://avatars.githubusercontent.com/u/18141150?v=4";,
       "githubId": "dailai",
-      "name": "Lai Dai"
+      "name": "Lai Dai",
+      "userId": "18141150"
     },
     {
       "apacheId": "arshad",
-      "avatarUrl": "https://avatars.githubusercontent.com/u/5720433?v=4";,
       "githubId": "arshadmohammad",
-      "name": "Mohammad Arshad"
+      "name": "Mohammad Arshad",
+      "userId": "5720433"
     },
     {
       "apacheId": "shenghang",
-      "avatarUrl": "https://avatars.githubusercontent.com/u/29418975?v=4";,
       "githubId": "zhangshenghang",
-      "name": "Shenghang Zhang"
+      "name": "Shenghang Zhang",
+      "userId": "29418975"
     },
     {
       "apacheId": "zhangdonghao",
-      "avatarUrl": "https://avatars.githubusercontent.com/u/39961809?v=4";,
       "githubId": "hawk9821",
-      "name": "Donghao Zhang"
+      "name": "Donghao Zhang",
+      "userId": "39961809"
     },
     {
       "apacheId": "corgy",
-      "avatarUrl": "https://avatars.githubusercontent.com/u/73771213?v=4";,
       "githubId": "corgy-w",
-      "name": "Chao Wang"
+      "name": "Chao Wang",
+      "userId": "73771213"
     }
   ]
-}
+}
\ No newline at end of file
diff --git a/tools/fetch-team-avatars.js b/tools/fetch-team-avatars.js
new file mode 100644
index 000000000000..eb925b1e028b
--- /dev/null
+++ b/tools/fetch-team-avatars.js
@@ -0,0 +1,125 @@
+/**
+ * Fetch team avatars from GitHub and convert to Base64
+ * This script downloads avatars and creates github-avatars.json
+ */
+
+const https = require('https');
+const http = require('http');
+const fs = require('fs');
+const path = require('path');
+
+// File paths
+const LANGUAGES_JSON_PATH = path.resolve(__dirname, '..', 'src', 'pages', 
'team', 'languages.json');
+const AVATARS_JSON_PATH = path.resolve(__dirname, '..', 'src', 'pages', 
'team', 'github-avatars.json');
+
+/**
+ * Extract GitHub user ID from avatar URL
+ * @param {string} avatarUrl - GitHub avatar URL (e.g., 
https://avatars.githubusercontent.com/u/219644?v=4)
+ * @returns {string|null} - GitHub user ID or null
+ */
+function extractUserId(avatarUrl) {
+  const match = avatarUrl.match(/\/u\/(\d+)/);
+  return match ? match[1] : null;
+}
+
+/**
+ * Download image and convert to Base64
+ * @param {string} url - Image URL
+ * @returns {Promise<string>} - Base64 encoded image
+ */
+function downloadAndConvertToBase64(url) {
+  return new Promise((resolve, reject) => {
+    const protocol = url.startsWith('https') ? https : http;
+
+    protocol.get(url, (response) => {
+      if (response.statusCode !== 200) {
+        reject(new Error(`Failed to download: ${response.statusCode}`));
+        return;
+      }
+
+      const chunks = [];
+      response.on('data', (chunk) => chunks.push(chunk));
+      response.on('end', () => {
+        const buffer = Buffer.concat(chunks);
+        const base64 = buffer.toString('base64');
+        resolve(base64);
+      });
+    }).on('error', reject);
+  });
+}
+
+/**
+ * Main function
+ */
+async function main() {
+  console.log('📥 Fetching team avatars from GitHub...\n');
+
+  // Read languages.json
+  const languagesData = JSON.parse(fs.readFileSync(LANGUAGES_JSON_PATH, 
'utf-8'));
+
+  // Collect all unique user IDs
+  const userIds = new Set();
+  [...languagesData.pmc, ...languagesData.committer].forEach(member => {
+    let userId = member.userId;
+    if (!userId && member.avatarUrl) {
+      userId = extractUserId(member.avatarUrl);
+    }
+    if (userId) {
+      userIds.add(userId);
+    }
+  });
+
+  console.log(`📊 Found ${userIds.size} unique team members\n`);
+
+  // Download avatars
+  const avatars = [];
+  let successCount = 0;
+  let failCount = 0;
+
+  for (const userId of userIds) {
+    const avatarUrl = `https://avatars.githubusercontent.com/u/${userId}?v=4`;
+    process.stdout.write(`⏳ Downloading avatar for user ${userId}... `);
+
+    try {
+      const base64 = await downloadAndConvertToBase64(avatarUrl);
+      avatars.push({
+        id: userId,
+        avatar_base64: base64
+      });
+      successCount++;
+      console.log('✅');
+    } catch (error) {
+      failCount++;
+      console.log(`❌ Error: ${error.message}`);
+    }
+  }
+
+  console.log(`\n📈 Summary: ${successCount} succeeded, ${failCount} failed\n`);
+
+  // Write github-avatars.json
+  fs.writeFileSync(AVATARS_JSON_PATH, JSON.stringify(avatars, null, 2), 
'utf-8');
+  console.log(`✅ Avatars saved to: ${AVATARS_JSON_PATH}`);
+  console.log(`📁 File size: ${(fs.statSync(AVATARS_JSON_PATH).size / 
1024).toFixed(2)} KB\n`);
+
+  // Update languages.json to use userId instead of avatarUrl
+  // If userId already exists, skip re-extraction (support re-run)
+  languagesData.pmc = languagesData.pmc.map(member => {
+    const userId = member.userId || extractUserId(member.avatarUrl);
+    const { avatarUrl, ...rest } = member;
+    return { ...rest, userId };
+  });
+
+  languagesData.committer = languagesData.committer.map(member => {
+    const userId = member.userId || extractUserId(member.avatarUrl);
+    const { avatarUrl, ...rest } = member;
+    return { ...rest, userId };
+  });
+
+  // Write updated languages.json
+  fs.writeFileSync(LANGUAGES_JSON_PATH, JSON.stringify(languagesData, null, 
2), 'utf-8');
+  console.log(`✅ Updated languages.json with userId fields\n`);
+
+  console.log('🎉 Done! You can now use the avatarUrl() function in index.js');
+}
+
+main().catch(console.error);


Reply via email to