Upload 10 files
Browse files- GITHUB-TOKEN-GUIDE.md +198 -0
- README-DEPLOY.md +112 -0
- check-github-token.sh +105 -0
- editor.html +3 -2
- font-fix.html +100 -0
- github-token-helper.html +400 -0
- index.html +109 -28
- test-current-token.php +247 -0
GITHUB-TOKEN-GUIDE.md
ADDED
|
@@ -0,0 +1,198 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# GitHub Token 权限设置完整指南
|
| 2 |
+
|
| 3 |
+
## 第一步:访问 GitHub Token 设置页面
|
| 4 |
+
|
| 5 |
+
1. 登录 GitHub
|
| 6 |
+
2. 点击右上角头像 -> Settings
|
| 7 |
+
3. 左侧菜单选择 "Developer settings"
|
| 8 |
+
4. 选择 "Personal access tokens" -> "Tokens (classic)"
|
| 9 |
+
5. 点击 "Generate new token" -> "Generate new token (classic)"
|
| 10 |
+
|
| 11 |
+
## 第二步:配置 Token 基本信息
|
| 12 |
+
|
| 13 |
+
### Token 名称和过期时间
|
| 14 |
+
```
|
| 15 |
+
Token Name: VvvebJs-WebEditor (建议使用描述性名称)
|
| 16 |
+
Expiration:
|
| 17 |
+
- 推荐:90 days (3个月)
|
| 18 |
+
- 安全考虑:30 days (1个月)
|
| 19 |
+
- 便利性:No expiration (永不过期,但不推荐)
|
| 20 |
+
```
|
| 21 |
+
|
| 22 |
+
### Note 字段示例
|
| 23 |
+
```
|
| 24 |
+
VvvebJs Website Editor - Full repo access for saving pages
|
| 25 |
+
Created: 2024-01-XX
|
| 26 |
+
Purpose: File management for visual website builder
|
| 27 |
+
```
|
| 28 |
+
|
| 29 |
+
## 第三步:权限选择(重要!)
|
| 30 |
+
|
| 31 |
+
### 必需权限 ✅
|
| 32 |
+
```bash
|
| 33 |
+
✅ repo (Full control of private repositories)
|
| 34 |
+
├── ✅ repo:status (Access commit status)
|
| 35 |
+
├── ✅ repo_deployment (Access deployment status)
|
| 36 |
+
├── ✅ public_repo (Access public repositories)
|
| 37 |
+
└── ✅ repo:invite (Access repository invitations)
|
| 38 |
+
```
|
| 39 |
+
|
| 40 |
+
### 可选但推荐的权限
|
| 41 |
+
```bash
|
| 42 |
+
✅ workflow (Update GitHub Action workflows)
|
| 43 |
+
✅ write:packages (Upload packages to GitHub Package Registry)
|
| 44 |
+
✅ read:packages (Download packages from GitHub Package Registry)
|
| 45 |
+
```
|
| 46 |
+
|
| 47 |
+
### 不需要的权限 ❌
|
| 48 |
+
```bash
|
| 49 |
+
❌ admin:repo_hook (不需要 webhook 管理)
|
| 50 |
+
❌ admin:org (不需要组织管理)
|
| 51 |
+
❌ admin:public_key (不需要公钥管理)
|
| 52 |
+
❌ admin:org_hook (不需要组织 webhook)
|
| 53 |
+
❌ gist (不需要 Gist 权限)
|
| 54 |
+
❌ notifications (不需要通知权限)
|
| 55 |
+
❌ user (不需要用户信息权限)
|
| 56 |
+
❌ delete_repo (不需要删除仓库权限)
|
| 57 |
+
```
|
| 58 |
+
|
| 59 |
+
## 权限详细说明
|
| 60 |
+
|
| 61 |
+
### repo 权限包含的子权限:
|
| 62 |
+
|
| 63 |
+
| 权限名称 | 说明 | VvvebJs 是否需要 |
|
| 64 |
+
|---------|------|----------------|
|
| 65 |
+
| `repo:status` | 读取仓库提交状态 | ✅ 需要 |
|
| 66 |
+
| `repo_deployment` | 读取部署状态 | ✅ 需要 |
|
| 67 |
+
| `public_repo` | 访问公开仓库 | ✅ 需要 |
|
| 68 |
+
| `repo:invite` | 管理仓库邀请 | ✅ 需要 |
|
| 69 |
+
| `security_events` | 读取安全事件 | ❌ 不需要 |
|
| 70 |
+
|
| 71 |
+
### 为什么需要完整的 repo 权限?
|
| 72 |
+
|
| 73 |
+
1. **读取文件** - 检查文件是否存在,获取文件 SHA
|
| 74 |
+
2. **创建文件** - 保存新的网页文件
|
| 75 |
+
3. **更新文件** - 修改现有网页内容
|
| 76 |
+
4. **分支操作** - 检查分支是否存在
|
| 77 |
+
5. **提交操作** - 创建提交记录
|
| 78 |
+
|
| 79 |
+
## 第四步:Token 安全最佳实践
|
| 80 |
+
|
| 81 |
+
### 1. Token 存储安全
|
| 82 |
+
```bash
|
| 83 |
+
# ✅ 正确方式:环境变量
|
| 84 |
+
GITHUB_TOKEN=ghp_xxxxxxxxxxxxxxxxxxxx
|
| 85 |
+
|
| 86 |
+
# ❌ 错误方式:硬编码在文件中
|
| 87 |
+
$token = "ghp_xxxxxxxxxxxxxxxxxxxx"; // 不要这样做!
|
| 88 |
+
```
|
| 89 |
+
|
| 90 |
+
### 2. Token 权限最小化
|
| 91 |
+
```bash
|
| 92 |
+
# 只为特定仓库创建 Token
|
| 93 |
+
# 而不是给所有仓库权限
|
| 94 |
+
```
|
| 95 |
+
|
| 96 |
+
### 3. 定期轮换 Token
|
| 97 |
+
```bash
|
| 98 |
+
建议周期:
|
| 99 |
+
- 生产环境:30-90 天
|
| 100 |
+
- 开发环境:90-180 天
|
| 101 |
+
- 测试环境:可以更长
|
| 102 |
+
```
|
| 103 |
+
|
| 104 |
+
## 第五步:验证 Token 权限
|
| 105 |
+
|
| 106 |
+
### 使用 curl 测试
|
| 107 |
+
```bash
|
| 108 |
+
# 测试 Token 基本权限
|
| 109 |
+
curl -H "Authorization: token YOUR_TOKEN" \
|
| 110 |
+
-H "User-Agent: VvvebJs/1.0" \
|
| 111 |
+
https://api.github.com/user
|
| 112 |
+
|
| 113 |
+
# 测试仓库访问权限
|
| 114 |
+
curl -H "Authorization: token YOUR_TOKEN" \
|
| 115 |
+
-H "User-Agent: VvvebJs/1.0" \
|
| 116 |
+
https://api.github.com/repos/YOUR_USERNAME/YOUR_REPO
|
| 117 |
+
|
| 118 |
+
# 测试文件创建权限
|
| 119 |
+
curl -X PUT \
|
| 120 |
+
-H "Authorization: token YOUR_TOKEN" \
|
| 121 |
+
-H "User-Agent: VvvebJs/1.0" \
|
| 122 |
+
-H "Content-Type: application/json" \
|
| 123 |
+
-d '{"message":"test","content":"VGVzdCBmaWxl"}' \
|
| 124 |
+
https://api.github.com/repos/YOUR_USERNAME/YOUR_REPO/contents/test.txt
|
| 125 |
+
```
|
| 126 |
+
|
| 127 |
+
## 第六步:在 VvvebJs 中配置
|
| 128 |
+
|
| 129 |
+
### Hugging Face Space 环境变量
|
| 130 |
+
```bash
|
| 131 |
+
# 在 Settings -> Variables and secrets 中添加:
|
| 132 |
+
GITHUB_TOKEN=ghp_your_40_character_token_here
|
| 133 |
+
GITHUB_OWNER=your_github_username
|
| 134 |
+
GITHUB_REPO=your_repository_name
|
| 135 |
+
GITHUB_BRANCH=main
|
| 136 |
+
GITHUB_PATH=pages/
|
| 137 |
+
STORAGE_TYPE=github
|
| 138 |
+
```
|
| 139 |
+
|
| 140 |
+
### 本地开发环境
|
| 141 |
+
```bash
|
| 142 |
+
# .env 文件
|
| 143 |
+
GITHUB_TOKEN=ghp_your_40_character_token_here
|
| 144 |
+
GITHUB_OWNER=your_github_username
|
| 145 |
+
GITHUB_REPO=your_repository_name
|
| 146 |
+
```
|
| 147 |
+
|
| 148 |
+
## 常见权限问题排查
|
| 149 |
+
|
| 150 |
+
### 问题 1: 403 Forbidden
|
| 151 |
+
```
|
| 152 |
+
原因:Token 权限不足
|
| 153 |
+
解决:确保勾选了 repo 权限
|
| 154 |
+
```
|
| 155 |
+
|
| 156 |
+
### 问题 2: 401 Unauthorized
|
| 157 |
+
```
|
| 158 |
+
原因:Token 无效或过期
|
| 159 |
+
解决:重新生成 Token
|
| 160 |
+
```
|
| 161 |
+
|
| 162 |
+
### 问题 3: 404 Not Found
|
| 163 |
+
```
|
| 164 |
+
原因:仓库不存在或 Token 无访问权限
|
| 165 |
+
解决:检查仓库名称和权限设置
|
| 166 |
+
```
|
| 167 |
+
|
| 168 |
+
### 问题 4: 422 Unprocessable Entity
|
| 169 |
+
```
|
| 170 |
+
原因:请求格式错误或文件内容问题
|
| 171 |
+
解决:检查 API 请求格式和文件编码
|
| 172 |
+
```
|
| 173 |
+
|
| 174 |
+
## Token 权限检查清单
|
| 175 |
+
|
| 176 |
+
在配置完成后,请确认:
|
| 177 |
+
|
| 178 |
+
- [ ] Token 有 `repo` 完整权限
|
| 179 |
+
- [ ] Token 未过期
|
| 180 |
+
- [ ] 目标仓库存在且可访��
|
| 181 |
+
- [ ] 环境变量配置正确
|
| 182 |
+
- [ ] 可以通过 API 访问仓库
|
| 183 |
+
- [ ] 可以创建和修改文件
|
| 184 |
+
- [ ] User-Agent 头部已设置
|
| 185 |
+
|
| 186 |
+
## 安全提醒
|
| 187 |
+
|
| 188 |
+
1. **永远不要在代码中硬编码 Token**
|
| 189 |
+
2. **定期检查 Token 使用情况**
|
| 190 |
+
3. **及时删除不使用的 Token**
|
| 191 |
+
4. **使用最小权限原则**
|
| 192 |
+
5. **在 GitHub Settings -> Personal access tokens 中监控 Token 活动**
|
| 193 |
+
|
| 194 |
+
## 相关链接
|
| 195 |
+
|
| 196 |
+
- [GitHub Token 设置页面](https://github.com/settings/tokens)
|
| 197 |
+
- [GitHub API 文档](https://docs.github.com/en/rest)
|
| 198 |
+
- [Token 权限说明](https://docs.github.com/en/developers/apps/building-oauth-apps/scopes-for-oauth-apps)
|
README-DEPLOY.md
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# VvvebJs - Hugging Face Deployment Guide
|
| 2 |
+
|
| 3 |
+
## Environment Variables Configuration
|
| 4 |
+
|
| 5 |
+
Configure these environment variables in your Hugging Face Space settings:
|
| 6 |
+
|
| 7 |
+
### Authentication (Required)
|
| 8 |
+
```
|
| 9 |
+
USER_1_NAME=admin
|
| 10 |
+
USER_1_PASSWORD=your_secure_password
|
| 11 |
+
USER_2_NAME=editor
|
| 12 |
+
USER_2_PASSWORD=another_secure_password
|
| 13 |
+
```
|
| 14 |
+
Add more users by incrementing the number (USER_3_NAME, USER_3_PASSWORD, etc.)
|
| 15 |
+
|
| 16 |
+
### Storage Configuration
|
| 17 |
+
```
|
| 18 |
+
STORAGE_TYPE=github
|
| 19 |
+
# Options: 'github', 'kv', 'both'
|
| 20 |
+
```
|
| 21 |
+
|
| 22 |
+
### GitHub Storage (Recommended)
|
| 23 |
+
```
|
| 24 |
+
GITHUB_TOKEN=ghp_your_github_token
|
| 25 |
+
GITHUB_OWNER=your_username
|
| 26 |
+
GITHUB_REPO=your_repo_name
|
| 27 |
+
GITHUB_BRANCH=main
|
| 28 |
+
GITHUB_PATH=pages/
|
| 29 |
+
```
|
| 30 |
+
|
| 31 |
+
### EdgeOne KV Storage (Optional)
|
| 32 |
+
```
|
| 33 |
+
EDGEONE_KV_API_KEY=your_api_key
|
| 34 |
+
EDGEONE_KV_SECRET_KEY=your_secret_key
|
| 35 |
+
EDGEONE_KV_ZONE_ID=your_zone_id
|
| 36 |
+
EDGEONE_KV_NAMESPACE=vvvebjs
|
| 37 |
+
EDGEONE_KV_ENDPOINT=https://edgeone.tencentcloudapi.com
|
| 38 |
+
```
|
| 39 |
+
|
| 40 |
+
## Setup Instructions
|
| 41 |
+
|
| 42 |
+
1. Create a new Hugging Face Space with Docker
|
| 43 |
+
2. Upload this repository
|
| 44 |
+
3. Configure environment variables in Space Settings
|
| 45 |
+
4. Deploy and access via Basic Authentication
|
| 46 |
+
|
| 47 |
+
## Features
|
| 48 |
+
|
| 49 |
+
- ✅ Docker deployment on Hugging Face
|
| 50 |
+
- ✅ GitHub repository as permanent storage
|
| 51 |
+
- ✅ EdgeOne KV storage support
|
| 52 |
+
- ✅ Multi-user authentication via environment variables
|
| 53 |
+
- ✅ Automatic fallback to local storage
|
| 54 |
+
- ✅ Dual storage support (GitHub + KV)
|
| 55 |
+
|
| 56 |
+
## Usage
|
| 57 |
+
|
| 58 |
+
1. Access your Space URL
|
| 59 |
+
2. Enter username/password (configured in environment variables)
|
| 60 |
+
3. Create and edit pages using the visual editor
|
| 61 |
+
4. Pages are automatically saved to external storage
|
| 62 |
+
|
| 63 |
+
## 🔧 紧急修复:GitHub 用户名配置错误
|
| 64 |
+
|
| 65 |
+
### 问题诊断
|
| 66 |
+
- ✅ GitHub Token 验证成功
|
| 67 |
+
- ❌ 仓库访问失败 (HTTP 404)
|
| 68 |
+
- **原因**: `GITHUB_OWNER` 配置错误
|
| 69 |
+
|
| 70 |
+
### 当前配置问题
|
| 71 |
+
```bash
|
| 72 |
+
GITHUB_OWNER=CaPaCatptain # ❌ 错误 - 中间是 "Cat"
|
| 73 |
+
```
|
| 74 |
+
|
| 75 |
+
### 正确配置
|
| 76 |
+
```bash
|
| 77 |
+
GITHUB_OWNER=CaPaCaptain # ✅ 正确 - 中间是 "Capt"
|
| 78 |
+
```
|
| 79 |
+
|
| 80 |
+
### 立即修复步骤
|
| 81 |
+
|
| 82 |
+
1. **在 Hugging Face Space Settings 中更新环境变量**:
|
| 83 |
+
```
|
| 84 |
+
GITHUB_OWNER=CaPaCaptain
|
| 85 |
+
```
|
| 86 |
+
|
| 87 |
+
2. **重启 Space**:
|
| 88 |
+
- 修改环境变量后
|
| 89 |
+
- Space 会自动重启
|
| 90 |
+
- 等待 1-2 分钟
|
| 91 |
+
|
| 92 |
+
3. **重新测试**:
|
| 93 |
+
- 访问高级诊断页面
|
| 94 |
+
- 运行完整诊断
|
| 95 |
+
- 应该会看到所有测试通过 ✅
|
| 96 |
+
|
| 97 |
+
### 验证步骤
|
| 98 |
+
|
| 99 |
+
修复后,诊断结果应该显示:
|
| 100 |
+
- ✅ GitHub Token 验证:有效
|
| 101 |
+
- ✅ 仓库访问检查:可访问
|
| 102 |
+
- ✅ 分支检查:分支存在
|
| 103 |
+
- ✅ 文件创建权限测试:可以创建文件
|
| 104 |
+
|
| 105 |
+
### 仓库信息确认
|
| 106 |
+
- **正确的仓库 URL**: `https://github.com/CaPaCaptain/VvvebJs_huggingface_db_01`
|
| 107 |
+
- **用户名**: CaPaCaptain (注意大小写)
|
| 108 |
+
- **仓库名**: VvvebJs_huggingface_db_01
|
| 109 |
+
|
| 110 |
+
---
|
| 111 |
+
|
| 112 |
+
**注意**: 这个错误很容易被忽略,因为差异很小(Cat vs Capt),但 GitHub API 对大小写和拼写非常敏感。
|
check-github-token.sh
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/bin/bash
|
| 2 |
+
|
| 3 |
+
# GitHub Token 权限快速检查脚本
|
| 4 |
+
# 使用方法: ./check-github-token.sh YOUR_TOKEN YOUR_OWNER YOUR_REPO
|
| 5 |
+
|
| 6 |
+
TOKEN=$1
|
| 7 |
+
OWNER=$2
|
| 8 |
+
REPO=$3
|
| 9 |
+
|
| 10 |
+
if [ -z "$TOKEN" ] || [ -z "$OWNER" ] || [ -z "$REPO" ]; then
|
| 11 |
+
echo "❌ 用法: $0 <github_token> <owner> <repo>"
|
| 12 |
+
echo "例如: $0 ghp_xxxxxxxxxxxx myusername myrepo"
|
| 13 |
+
exit 1
|
| 14 |
+
fi
|
| 15 |
+
|
| 16 |
+
echo "🔍 检查 GitHub Token 权限..."
|
| 17 |
+
echo "Token: ${TOKEN:0:8}..."
|
| 18 |
+
echo "仓库: $OWNER/$REPO"
|
| 19 |
+
echo "=" * 50
|
| 20 |
+
|
| 21 |
+
# 1. 检查 Token 基本权限
|
| 22 |
+
echo "📋 1. 检查 Token 基本权限..."
|
| 23 |
+
USER_RESPONSE=$(curl -s -H "Authorization: token $TOKEN" \
|
| 24 |
+
-H "User-Agent: VvvebJs-Check/1.0" \
|
| 25 |
+
https://api.github.com/user)
|
| 26 |
+
|
| 27 |
+
if echo "$USER_RESPONSE" | grep -q '"login"'; then
|
| 28 |
+
USERNAME=$(echo "$USER_RESPONSE" | grep '"login"' | sed 's/.*"login": *"\([^"]*\)".*/\1/')
|
| 29 |
+
echo "✅ Token 有效 - 用户: $USERNAME"
|
| 30 |
+
else
|
| 31 |
+
echo "❌ Token 无效或无权限"
|
| 32 |
+
echo "详情: $USER_RESPONSE"
|
| 33 |
+
exit 1
|
| 34 |
+
fi
|
| 35 |
+
|
| 36 |
+
# 2. 检查仓库访问权限
|
| 37 |
+
echo "📁 2. 检查仓库访问权限..."
|
| 38 |
+
REPO_RESPONSE=$(curl -s -H "Authorization: token $TOKEN" \
|
| 39 |
+
-H "User-Agent: VvvebJs-Check/1.0" \
|
| 40 |
+
https://api.github.com/repos/$OWNER/$REPO)
|
| 41 |
+
|
| 42 |
+
if echo "$REPO_RESPONSE" | grep -q '"full_name"'; then
|
| 43 |
+
echo "✅ 仓库可访问"
|
| 44 |
+
|
| 45 |
+
# 检查权限详情
|
| 46 |
+
if echo "$REPO_RESPONSE" | grep -q '"permissions"'; then
|
| 47 |
+
ADMIN=$(echo "$REPO_RESPONSE" | grep '"admin"' | sed 's/.*"admin": *\([^,]*\).*/\1/')
|
| 48 |
+
PUSH=$(echo "$REPO_RESPONSE" | grep '"push"' | sed 's/.*"push": *\([^,]*\).*/\1/')
|
| 49 |
+
PULL=$(echo "$REPO_RESPONSE" | grep '"pull"' | sed 's/.*"pull": *\([^,]*\).*/\1/')
|
| 50 |
+
|
| 51 |
+
echo " - Admin: $ADMIN"
|
| 52 |
+
echo " - Push: $PUSH"
|
| 53 |
+
echo " - Pull: $PULL"
|
| 54 |
+
|
| 55 |
+
if [ "$PUSH" = "true" ]; then
|
| 56 |
+
echo "✅ 有写入权限"
|
| 57 |
+
else
|
| 58 |
+
echo "❌ 缺少写入权限"
|
| 59 |
+
fi
|
| 60 |
+
fi
|
| 61 |
+
else
|
| 62 |
+
echo "❌ 仓库不存在或无访问权限"
|
| 63 |
+
echo "详情: $REPO_RESPONSE"
|
| 64 |
+
exit 1
|
| 65 |
+
fi
|
| 66 |
+
|
| 67 |
+
# 3. 测试文件创建
|
| 68 |
+
echo "✏️ 3. 测试文件创建权限..."
|
| 69 |
+
TEST_FILE="vvvebjs-test-$(date +%s).txt"
|
| 70 |
+
TEST_CONTENT=$(echo "VvvebJs Test - $(date)" | base64)
|
| 71 |
+
|
| 72 |
+
CREATE_RESPONSE=$(curl -s -X PUT \
|
| 73 |
+
-H "Authorization: token $TOKEN" \
|
| 74 |
+
-H "User-Agent: VvvebJs-Check/1.0" \
|
| 75 |
+
-H "Content-Type: application/json" \
|
| 76 |
+
-d "{\"message\":\"VvvebJs permission test\",\"content\":\"$TEST_CONTENT\"}" \
|
| 77 |
+
https://api.github.com/repos/$OWNER/$REPO/contents/$TEST_FILE)
|
| 78 |
+
|
| 79 |
+
if echo "$CREATE_RESPONSE" | grep -q '"sha"'; then
|
| 80 |
+
echo "✅ 文件创建成功"
|
| 81 |
+
|
| 82 |
+
# 清理测试文件
|
| 83 |
+
SHA=$(echo "$CREATE_RESPONSE" | grep '"sha"' | head -1 | sed 's/.*"sha": *"\([^"]*\)".*/\1/')
|
| 84 |
+
curl -s -X DELETE \
|
| 85 |
+
-H "Authorization: token $TOKEN" \
|
| 86 |
+
-H "User-Agent: VvvebJs-Check/1.0" \
|
| 87 |
+
-H "Content-Type: application/json" \
|
| 88 |
+
-d "{\"message\":\"Clean up test file\",\"sha\":\"$SHA\"}" \
|
| 89 |
+
https://api.github.com/repos/$OWNER/$REPO/contents/$TEST_FILE > /dev/null
|
| 90 |
+
echo "🧹 测试文件已清理"
|
| 91 |
+
else
|
| 92 |
+
echo "❌ 文件创建失败"
|
| 93 |
+
echo "详情: $CREATE_RESPONSE"
|
| 94 |
+
fi
|
| 95 |
+
|
| 96 |
+
echo ""
|
| 97 |
+
echo "🎉 权限检查完成!"
|
| 98 |
+
echo ""
|
| 99 |
+
echo "📋 配置建议:"
|
| 100 |
+
echo "GITHUB_TOKEN=$TOKEN"
|
| 101 |
+
echo "GITHUB_OWNER=$OWNER"
|
| 102 |
+
echo "GITHUB_REPO=$REPO"
|
| 103 |
+
echo "GITHUB_BRANCH=main"
|
| 104 |
+
echo "GITHUB_PATH=pages/"
|
| 105 |
+
echo "STORAGE_TYPE=github"
|
editor.html
CHANGED
|
@@ -1775,8 +1775,9 @@ Vvveb.themeBaseUrl = 'demo/landing/';
|
|
| 1775 |
|
| 1776 |
<!-- components-->
|
| 1777 |
<!-- script src="libs/builder/components-server.js"></script -->
|
| 1778 |
-
|
| 1779 |
-
|
|
|
|
| 1780 |
<script src="libs/builder/plugin-aos.js"></script>
|
| 1781 |
<script src="libs/builder/components-html.js"></script>
|
| 1782 |
<script src="libs/builder/components-elements.js"></script>
|
|
|
|
| 1775 |
|
| 1776 |
<!-- components-->
|
| 1777 |
<!-- script src="libs/builder/components-server.js"></script -->
|
| 1778 |
+
<!-- Disable Google Fonts plugin to fix loading error -->
|
| 1779 |
+
<!-- script src="libs/builder/plugin-google-fonts.js"></script -->
|
| 1780 |
+
<script src="libs/builder/components-common.js"></script>
|
| 1781 |
<script src="libs/builder/plugin-aos.js"></script>
|
| 1782 |
<script src="libs/builder/components-html.js"></script>
|
| 1783 |
<script src="libs/builder/components-elements.js"></script>
|
font-fix.html
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="utf-8">
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
| 6 |
+
<title>VvvebJs - 本地字体替代方案</title>
|
| 7 |
+
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
|
| 8 |
+
<style>
|
| 9 |
+
/* 本地字体系统 - 替代 Google Fonts */
|
| 10 |
+
.font-system {
|
| 11 |
+
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
|
| 12 |
+
}
|
| 13 |
+
|
| 14 |
+
.font-serif {
|
| 15 |
+
font-family: Georgia, "Times New Roman", Times, serif;
|
| 16 |
+
}
|
| 17 |
+
|
| 18 |
+
.font-mono {
|
| 19 |
+
font-family: "SF Mono", Monaco, "Cascadia Code", "Roboto Mono", Consolas, "Courier New", monospace;
|
| 20 |
+
}
|
| 21 |
+
|
| 22 |
+
.font-display {
|
| 23 |
+
font-family: "Segoe UI", -apple-system, BlinkMacSystemFont, Roboto, sans-serif;
|
| 24 |
+
font-weight: 600;
|
| 25 |
+
}
|
| 26 |
+
</style>
|
| 27 |
+
</head>
|
| 28 |
+
<body>
|
| 29 |
+
<div class="container mt-5">
|
| 30 |
+
<div class="row">
|
| 31 |
+
<div class="col-md-8 mx-auto">
|
| 32 |
+
<h1 class="mb-4 font-display">🎨 VvvebJs 本地字体方案</h1>
|
| 33 |
+
|
| 34 |
+
<div class="alert alert-info">
|
| 35 |
+
<h5>✅ 问题已解决</h5>
|
| 36 |
+
<p>Google 字体插件已被禁用,编辑器现在使用系统默认字体,避免了网络加载问题。</p>
|
| 37 |
+
</div>
|
| 38 |
+
|
| 39 |
+
<div class="card mb-4">
|
| 40 |
+
<div class="card-header">
|
| 41 |
+
<h3>📝 可用字体系统</h3>
|
| 42 |
+
</div>
|
| 43 |
+
<div class="card-body">
|
| 44 |
+
<div class="mb-3">
|
| 45 |
+
<h5 class="font-system">系统字体 (System Font)</h5>
|
| 46 |
+
<p class="font-system">这是默认的系统字体,适用于大部分内容。在不同操作系统上会显示为最适合的字体。</p>
|
| 47 |
+
</div>
|
| 48 |
+
|
| 49 |
+
<div class="mb-3">
|
| 50 |
+
<h5 class="font-serif">衬线字体 (Serif Font)</h5>
|
| 51 |
+
<p class="font-serif">适用于正式文档和传统风格的内容,提供更好的可读性。</p>
|
| 52 |
+
</div>
|
| 53 |
+
|
| 54 |
+
<div class="mb-3">
|
| 55 |
+
<h5 class="font-mono">等宽字体 (Monospace Font)</h5>
|
| 56 |
+
<p class="font-mono">适用于代码显示和需要对齐的内容。</p>
|
| 57 |
+
</div>
|
| 58 |
+
|
| 59 |
+
<div class="mb-3">
|
| 60 |
+
<h5 class="font-display">标题字体 (Display Font)</h5>
|
| 61 |
+
<p class="font-display">适用于标题和重要内容的显示。</p>
|
| 62 |
+
</div>
|
| 63 |
+
</div>
|
| 64 |
+
</div>
|
| 65 |
+
|
| 66 |
+
<div class="card mb-4">
|
| 67 |
+
<div class="card-header">
|
| 68 |
+
<h3>🔧 技术说明</h3>
|
| 69 |
+
</div>
|
| 70 |
+
<div class="card-body">
|
| 71 |
+
<ul>
|
| 72 |
+
<li><strong>禁用了 Google 字体插件</strong> - 避免网络加载问题</li>
|
| 73 |
+
<li><strong>使用系统字体栈</strong> - 确保在所有环境下都能正常显示</li>
|
| 74 |
+
<li><strong>保持编辑器功能</strong> - 所有其他功能正常工作</li>
|
| 75 |
+
<li><strong>提高加载速度</strong> - 无需等待外部字体资源</li>
|
| 76 |
+
</ul>
|
| 77 |
+
</div>
|
| 78 |
+
</div>
|
| 79 |
+
|
| 80 |
+
<div class="card">
|
| 81 |
+
<div class="card-header">
|
| 82 |
+
<h3>🚀 继续使用编辑器</h3>
|
| 83 |
+
</div>
|
| 84 |
+
<div class="card-body text-center">
|
| 85 |
+
<p>Google 字体加载问题已解决,您可以正常使用编辑器了。</p>
|
| 86 |
+
<div class="mt-3">
|
| 87 |
+
<a href="editor.html" class="btn btn-primary btn-lg">
|
| 88 |
+
🎨 返回编辑器
|
| 89 |
+
</a>
|
| 90 |
+
<a href="config.php" class="btn btn-secondary">
|
| 91 |
+
⚙️ 查看配置
|
| 92 |
+
</a>
|
| 93 |
+
</div>
|
| 94 |
+
</div>
|
| 95 |
+
</div>
|
| 96 |
+
</div>
|
| 97 |
+
</div>
|
| 98 |
+
</div>
|
| 99 |
+
</body>
|
| 100 |
+
</html>
|
github-token-helper.html
ADDED
|
@@ -0,0 +1,400 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="utf-8">
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
| 6 |
+
<title>GitHub Token 权限配置助手</title>
|
| 7 |
+
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
|
| 8 |
+
<style>
|
| 9 |
+
.permission-card {
|
| 10 |
+
border-left: 4px solid #007bff;
|
| 11 |
+
transition: all 0.3s ease;
|
| 12 |
+
}
|
| 13 |
+
.permission-required {
|
| 14 |
+
border-left-color: #28a745;
|
| 15 |
+
background-color: #f8fff9;
|
| 16 |
+
}
|
| 17 |
+
.permission-optional {
|
| 18 |
+
border-left-color: #ffc107;
|
| 19 |
+
background-color: #fefdf5;
|
| 20 |
+
}
|
| 21 |
+
.permission-not-needed {
|
| 22 |
+
border-left-color: #dc3545;
|
| 23 |
+
background-color: #fff5f5;
|
| 24 |
+
}
|
| 25 |
+
.step-number {
|
| 26 |
+
background: linear-gradient(45deg, #007bff, #0056b3);
|
| 27 |
+
color: white;
|
| 28 |
+
border-radius: 50%;
|
| 29 |
+
width: 40px;
|
| 30 |
+
height: 40px;
|
| 31 |
+
display: flex;
|
| 32 |
+
align-items: center;
|
| 33 |
+
justify-content: center;
|
| 34 |
+
font-weight: bold;
|
| 35 |
+
}
|
| 36 |
+
.checklist-item {
|
| 37 |
+
padding: 8px 0;
|
| 38 |
+
border-bottom: 1px solid #eee;
|
| 39 |
+
}
|
| 40 |
+
.token-example {
|
| 41 |
+
font-family: monospace;
|
| 42 |
+
background: #f8f9fa;
|
| 43 |
+
padding: 4px 8px;
|
| 44 |
+
border-radius: 4px;
|
| 45 |
+
border: 1px solid #dee2e6;
|
| 46 |
+
}
|
| 47 |
+
</style>
|
| 48 |
+
</head>
|
| 49 |
+
<body>
|
| 50 |
+
<div class="container mt-4">
|
| 51 |
+
<div class="row">
|
| 52 |
+
<div class="col-md-10 mx-auto">
|
| 53 |
+
<div class="text-center mb-5">
|
| 54 |
+
<h1 class="display-4">🔑 GitHub Token 权限配置助手</h1>
|
| 55 |
+
<p class="lead">为 VvvebJs 配置正确的 GitHub 访问权限</p>
|
| 56 |
+
</div>
|
| 57 |
+
|
| 58 |
+
<!-- 快速开始 -->
|
| 59 |
+
<div class="card mb-4 border-primary">
|
| 60 |
+
<div class="card-header bg-primary text-white">
|
| 61 |
+
<h3 class="mb-0">⚡ 快速开始</h3>
|
| 62 |
+
</div>
|
| 63 |
+
<div class="card-body">
|
| 64 |
+
<div class="row">
|
| 65 |
+
<div class="col-md-6">
|
| 66 |
+
<h5>👈 我是新手</h5>
|
| 67 |
+
<p class="text-muted">第一次配置 GitHub Token</p>
|
| 68 |
+
<a href="https://github.com/settings/tokens/new" target="_blank" class="btn btn-outline-primary">
|
| 69 |
+
🚀 创建新 Token
|
| 70 |
+
</a>
|
| 71 |
+
</div>
|
| 72 |
+
<div class="col-md-6">
|
| 73 |
+
<h5>🔧 我需要排查问题</h5>
|
| 74 |
+
<p class="text-muted">Token 已创建但有问题</p>
|
| 75 |
+
<a href="github-test.php" class="btn btn-outline-warning">
|
| 76 |
+
🧪 测试现有配置
|
| 77 |
+
</a>
|
| 78 |
+
</div>
|
| 79 |
+
</div>
|
| 80 |
+
</div>
|
| 81 |
+
</div>
|
| 82 |
+
|
| 83 |
+
<!-- 步骤指导 -->
|
| 84 |
+
<div class="row">
|
| 85 |
+
<!-- 步骤1 -->
|
| 86 |
+
<div class="col-md-6 mb-4">
|
| 87 |
+
<div class="card h-100">
|
| 88 |
+
<div class="card-body">
|
| 89 |
+
<div class="d-flex align-items-center mb-3">
|
| 90 |
+
<div class="step-number me-3">1</div>
|
| 91 |
+
<h4 class="mb-0">访问 GitHub 设置</h4>
|
| 92 |
+
</div>
|
| 93 |
+
<ol>
|
| 94 |
+
<li>登录 <a href="https://github.com" target="_blank">GitHub</a></li>
|
| 95 |
+
<li>点击右上角头像 → Settings</li>
|
| 96 |
+
<li>左侧菜单 → Developer settings</li>
|
| 97 |
+
<li>Personal access tokens → Tokens (classic)</li>
|
| 98 |
+
<li>Generate new token (classic)</li>
|
| 99 |
+
</ol>
|
| 100 |
+
<a href="https://github.com/settings/tokens" target="_blank" class="btn btn-primary btn-sm">
|
| 101 |
+
🔗 直接跳转
|
| 102 |
+
</a>
|
| 103 |
+
</div>
|
| 104 |
+
</div>
|
| 105 |
+
</div>
|
| 106 |
+
|
| 107 |
+
<!-- 步骤2 -->
|
| 108 |
+
<div class="col-md-6 mb-4">
|
| 109 |
+
<div class="card h-100">
|
| 110 |
+
<div class="card-body">
|
| 111 |
+
<div class="d-flex align-items-center mb-3">
|
| 112 |
+
<div class="step-number me-3">2</div>
|
| 113 |
+
<h4 class="mb-0">填写基本信息</h4>
|
| 114 |
+
</div>
|
| 115 |
+
<div class="mb-3">
|
| 116 |
+
<label class="form-label"><strong>Note (描述):</strong></label>
|
| 117 |
+
<div class="token-example">VvvebJs Website Editor</div>
|
| 118 |
+
</div>
|
| 119 |
+
<div class="mb-3">
|
| 120 |
+
<label class="form-label"><strong>Expiration (过期时间):</strong></label>
|
| 121 |
+
<div class="text-success">推荐: 90 days</div>
|
| 122 |
+
<small class="text-muted">平衡安全性和便利性</small>
|
| 123 |
+
</div>
|
| 124 |
+
</div>
|
| 125 |
+
</div>
|
| 126 |
+
</div>
|
| 127 |
+
</div>
|
| 128 |
+
|
| 129 |
+
<!-- 权限选择 -->
|
| 130 |
+
<div class="card mb-4">
|
| 131 |
+
<div class="card-header">
|
| 132 |
+
<div class="d-flex align-items-center">
|
| 133 |
+
<div class="step-number me-3">3</div>
|
| 134 |
+
<h3 class="mb-0">选择权限范围 (Scopes)</h3>
|
| 135 |
+
</div>
|
| 136 |
+
</div>
|
| 137 |
+
<div class="card-body">
|
| 138 |
+
<div class="alert alert-warning">
|
| 139 |
+
<strong>⚠️ 重要:</strong> 必须勾选 <code>repo</code> 权限,这是 VvvebJs 保存文件的基础要求。
|
| 140 |
+
</div>
|
| 141 |
+
|
| 142 |
+
<!-- 必需权限 -->
|
| 143 |
+
<div class="permission-card permission-required card mb-3">
|
| 144 |
+
<div class="card-header">
|
| 145 |
+
<h5 class="text-success mb-0">✅ 必需权限</h5>
|
| 146 |
+
</div>
|
| 147 |
+
<div class="card-body">
|
| 148 |
+
<div class="form-check">
|
| 149 |
+
<input class="form-check-input" type="checkbox" checked disabled>
|
| 150 |
+
<label class="form-check-label">
|
| 151 |
+
<strong>repo</strong> - Full control of private repositories
|
| 152 |
+
</label>
|
| 153 |
+
</div>
|
| 154 |
+
<small class="text-muted ms-4">
|
| 155 |
+
包含: repo:status, repo_deployment, public_repo, repo:invite<br>
|
| 156 |
+
<strong>用途:</strong> 创建、读取、更新网页文件
|
| 157 |
+
</small>
|
| 158 |
+
</div>
|
| 159 |
+
</div>
|
| 160 |
+
|
| 161 |
+
<!-- 可选权限 -->
|
| 162 |
+
<div class="permission-card permission-optional card mb-3">
|
| 163 |
+
<div class="card-header">
|
| 164 |
+
<h5 class="text-warning mb-0">⚠️ 可选权限</h5>
|
| 165 |
+
</div>
|
| 166 |
+
<div class="card-body">
|
| 167 |
+
<div class="form-check mb-2">
|
| 168 |
+
<input class="form-check-input" type="checkbox">
|
| 169 |
+
<label class="form-check-label">
|
| 170 |
+
<strong>workflow</strong> - Update GitHub Action workflows
|
| 171 |
+
</label>
|
| 172 |
+
</div>
|
| 173 |
+
<small class="text-muted ms-4 d-block mb-3">
|
| 174 |
+
<strong>用途:</strong> 如果您计划使用 GitHub Actions 自动部署
|
| 175 |
+
</small>
|
| 176 |
+
|
| 177 |
+
<div class="form-check mb-2">
|
| 178 |
+
<input class="form-check-input" type="checkbox">
|
| 179 |
+
<label class="form-check-label">
|
| 180 |
+
<strong>write:packages / read:packages</strong> - Package registry access
|
| 181 |
+
</label>
|
| 182 |
+
</div>
|
| 183 |
+
<small class="text-muted ms-4 d-block">
|
| 184 |
+
<strong>用途:</strong> 如果您需要管理 GitHub Packages
|
| 185 |
+
</small>
|
| 186 |
+
</div>
|
| 187 |
+
</div>
|
| 188 |
+
|
| 189 |
+
<!-- 不需要的权限 -->
|
| 190 |
+
<div class="permission-card permission-not-needed card">
|
| 191 |
+
<div class="card-header">
|
| 192 |
+
<h5 class="text-danger mb-0">❌ 不需要的权限</h5>
|
| 193 |
+
</div>
|
| 194 |
+
<div class="card-body">
|
| 195 |
+
<div class="row">
|
| 196 |
+
<div class="col-md-6">
|
| 197 |
+
<ul class="list-unstyled">
|
| 198 |
+
<li>❌ admin:repo_hook</li>
|
| 199 |
+
<li>❌ admin:org</li>
|
| 200 |
+
<li>❌ admin:public_key</li>
|
| 201 |
+
<li>❌ gist</li>
|
| 202 |
+
</ul>
|
| 203 |
+
</div>
|
| 204 |
+
<div class="col-md-6">
|
| 205 |
+
<ul class="list-unstyled">
|
| 206 |
+
<li>❌ notifications</li>
|
| 207 |
+
<li>❌ user</li>
|
| 208 |
+
<li>❌ delete_repo</li>
|
| 209 |
+
<li>❌ admin:org_hook</li>
|
| 210 |
+
</ul>
|
| 211 |
+
</div>
|
| 212 |
+
</div>
|
| 213 |
+
<small class="text-muted">
|
| 214 |
+
<strong>原因:</strong> VvvebJs 只需要读写文件,不需要管理权限
|
| 215 |
+
</small>
|
| 216 |
+
</div>
|
| 217 |
+
</div>
|
| 218 |
+
</div>
|
| 219 |
+
</div>
|
| 220 |
+
|
| 221 |
+
<!-- 配置示例 -->
|
| 222 |
+
<div class="card mb-4">
|
| 223 |
+
<div class="card-header">
|
| 224 |
+
<div class="d-flex align-items-center">
|
| 225 |
+
<div class="step-number me-3">4</div>
|
| 226 |
+
<h3 class="mb-0">配置环境变量</h3>
|
| 227 |
+
</div>
|
| 228 |
+
</div>
|
| 229 |
+
<div class="card-body">
|
| 230 |
+
<div class="alert alert-info">
|
| 231 |
+
<strong>📋 获取 Token 后,在 Hugging Face Space Settings 中添加这些环境变量:</strong>
|
| 232 |
+
</div>
|
| 233 |
+
|
| 234 |
+
<div class="row">
|
| 235 |
+
<div class="col-md-6">
|
| 236 |
+
<h5>🔑 GitHub 认证</h5>
|
| 237 |
+
<div class="bg-light p-3 rounded">
|
| 238 |
+
<code>GITHUB_TOKEN=ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</code><br>
|
| 239 |
+
<code>GITHUB_OWNER=your_username</code><br>
|
| 240 |
+
<code>GITHUB_REPO=your_repo_name</code><br>
|
| 241 |
+
</div>
|
| 242 |
+
</div>
|
| 243 |
+
<div class="col-md-6">
|
| 244 |
+
<h5>⚙️ 存储配置</h5>
|
| 245 |
+
<div class="bg-light p-3 rounded">
|
| 246 |
+
<code>GITHUB_BRANCH=main</code><br>
|
| 247 |
+
<code>GITHUB_PATH=pages/</code><br>
|
| 248 |
+
<code>STORAGE_TYPE=github</code><br>
|
| 249 |
+
</div>
|
| 250 |
+
</div>
|
| 251 |
+
</div>
|
| 252 |
+
|
| 253 |
+
<div class="mt-3">
|
| 254 |
+
<h6>📝 配置说明:</h6>
|
| 255 |
+
<ul>
|
| 256 |
+
<li><code>GITHUB_TOKEN</code>: 刚创建的 40 字符 Token (以 ghp_ 开头)</li>
|
| 257 |
+
<li><code>GITHUB_OWNER</code>: 您的 GitHub 用户名</li>
|
| 258 |
+
<li><code>GITHUB_REPO</code>: 存储网页的仓库名</li>
|
| 259 |
+
<li><code>GITHUB_PATH</code>: 网页保存的目录 (可以为空)</li>
|
| 260 |
+
</ul>
|
| 261 |
+
</div>
|
| 262 |
+
</div>
|
| 263 |
+
</div>
|
| 264 |
+
|
| 265 |
+
<!-- 验证清单 -->
|
| 266 |
+
<div class="card mb-4">
|
| 267 |
+
<div class="card-header">
|
| 268 |
+
<div class="d-flex align-items-center">
|
| 269 |
+
<div class="step-number me-3">5</div>
|
| 270 |
+
<h3 class="mb-0">验证配置</h3>
|
| 271 |
+
</div>
|
| 272 |
+
</div>
|
| 273 |
+
<div class="card-body">
|
| 274 |
+
<h5>✅ 配置检查清单</h5>
|
| 275 |
+
<div id="checklist">
|
| 276 |
+
<div class="checklist-item">
|
| 277 |
+
<input type="checkbox" class="form-check-input me-2" id="check1">
|
| 278 |
+
<label for="check1">Token 已创建且有 <code>repo</code> 权限</label>
|
| 279 |
+
</div>
|
| 280 |
+
<div class="checklist-item">
|
| 281 |
+
<input type="checkbox" class="form-check-input me-2" id="check2">
|
| 282 |
+
<label for="check2">环境变量已在 Hugging Face Space 中配置</label>
|
| 283 |
+
</div>
|
| 284 |
+
<div class="checklist-item">
|
| 285 |
+
<input type="checkbox" class="form-check-input me-2" id="check3">
|
| 286 |
+
<label for="check3">GitHub 仓库已创建且可访问</label>
|
| 287 |
+
</div>
|
| 288 |
+
<div class="checklist-item">
|
| 289 |
+
<input type="checkbox" class="form-check-input me-2" id="check4">
|
| 290 |
+
<label for="check4">分支名称正确 (通常是 main 或 master)</label>
|
| 291 |
+
</div>
|
| 292 |
+
<div class="checklist-item">
|
| 293 |
+
<input type="checkbox" class="form-check-input me-2" id="check5">
|
| 294 |
+
<label for="check5">已通过测试页面验证</label>
|
| 295 |
+
</div>
|
| 296 |
+
</div>
|
| 297 |
+
|
| 298 |
+
<div class="mt-4">
|
| 299 |
+
<a href="github-test.php" class="btn btn-success me-2">🧪 测试配置</a>
|
| 300 |
+
<a href="config.php" class="btn btn-secondary me-2">⚙️ 查看状态</a>
|
| 301 |
+
<a href="editor.html" class="btn btn-primary">🎨 开始使用编辑器</a>
|
| 302 |
+
</div>
|
| 303 |
+
</div>
|
| 304 |
+
</div>
|
| 305 |
+
|
| 306 |
+
<!-- 故障排除 -->
|
| 307 |
+
<div class="card">
|
| 308 |
+
<div class="card-header">
|
| 309 |
+
<h3>🔧 常见问题和解决方案</h3>
|
| 310 |
+
</div>
|
| 311 |
+
<div class="card-body">
|
| 312 |
+
<div class="accordion" id="troubleshootingAccordion">
|
| 313 |
+
<!-- 问题1 -->
|
| 314 |
+
<div class="accordion-item">
|
| 315 |
+
<h5 class="accordion-header">
|
| 316 |
+
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#trouble1">
|
| 317 |
+
403 Forbidden - 权限不足
|
| 318 |
+
</button>
|
| 319 |
+
</h5>
|
| 320 |
+
<div id="trouble1" class="accordion-collapse collapse" data-bs-parent="#troubleshootingAccordion">
|
| 321 |
+
<div class="accordion-body">
|
| 322 |
+
<strong>原因:</strong> Token 权限不足<br>
|
| 323 |
+
<strong>解决:</strong>
|
| 324 |
+
<ol>
|
| 325 |
+
<li>确保勾选了 <code>repo</code> 权限</li>
|
| 326 |
+
<li>重新生成 Token 并更新环境变量</li>
|
| 327 |
+
<li>检查仓库是否为私有仓库(需要完整 repo 权限)</li>
|
| 328 |
+
</ol>
|
| 329 |
+
</div>
|
| 330 |
+
</div>
|
| 331 |
+
</div>
|
| 332 |
+
|
| 333 |
+
<!-- 问题2 -->
|
| 334 |
+
<div class="accordion-item">
|
| 335 |
+
<h5 class="accordion-header">
|
| 336 |
+
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#trouble2">
|
| 337 |
+
401 Unauthorized - 认证失败
|
| 338 |
+
</button>
|
| 339 |
+
</h5>
|
| 340 |
+
<div id="trouble2" class="accordion-collapse collapse" data-bs-parent="#troubleshootingAccordion">
|
| 341 |
+
<div class="accordion-body">
|
| 342 |
+
<strong>原因:</strong> Token 无效或过期<br>
|
| 343 |
+
<strong>解决:</strong>
|
| 344 |
+
<ol>
|
| 345 |
+
<li>检查 Token 是否正确复制(40个字符,以 ghp_ 开头)</li>
|
| 346 |
+
<li>检查 Token 是否过期</li>
|
| 347 |
+
<li>重新生成新的 Token</li>
|
| 348 |
+
</ol>
|
| 349 |
+
</div>
|
| 350 |
+
</div>
|
| 351 |
+
</div>
|
| 352 |
+
|
| 353 |
+
<!-- 问题3 -->
|
| 354 |
+
<div class="accordion-item">
|
| 355 |
+
<h5 class="accordion-header">
|
| 356 |
+
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#trouble3">
|
| 357 |
+
404 Not Found - 仓库不存在
|
| 358 |
+
</button>
|
| 359 |
+
</h5>
|
| 360 |
+
<div id="trouble3" class="accordion-collapse collapse" data-bs-parent="#troubleshootingAccordion">
|
| 361 |
+
<div class="accordion-body">
|
| 362 |
+
<strong>原因:</strong> 仓库不存在或 Token 无访问权限<br>
|
| 363 |
+
<strong>解决:</strong>
|
| 364 |
+
<ol>
|
| 365 |
+
<li>检查 <code>GITHUB_OWNER</code> 是否是正确的用户名</li>
|
| 366 |
+
<li>检查 <code>GITHUB_REPO</code> 是否是正确的仓库名</li>
|
| 367 |
+
<li>确保仓库存在且 Token 有访问权限</li>
|
| 368 |
+
<li>如果是组织仓库,确保 Token 有组织权限</li>
|
| 369 |
+
</ol>
|
| 370 |
+
</div>
|
| 371 |
+
</div>
|
| 372 |
+
</div>
|
| 373 |
+
</div>
|
| 374 |
+
</div>
|
| 375 |
+
</div>
|
| 376 |
+
</div>
|
| 377 |
+
</div>
|
| 378 |
+
</div>
|
| 379 |
+
|
| 380 |
+
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
|
| 381 |
+
<script>
|
| 382 |
+
// 保存检查状态
|
| 383 |
+
document.addEventListener('DOMContentLoaded', function() {
|
| 384 |
+
const checkboxes = document.querySelectorAll('#checklist input[type="checkbox"]');
|
| 385 |
+
|
| 386 |
+
checkboxes.forEach(checkbox => {
|
| 387 |
+
checkbox.addEventListener('change', function() {
|
| 388 |
+
localStorage.setItem(this.id, this.checked);
|
| 389 |
+
});
|
| 390 |
+
|
| 391 |
+
// 恢复状态
|
| 392 |
+
const saved = localStorage.getItem(checkbox.id);
|
| 393 |
+
if (saved === 'true') {
|
| 394 |
+
checkbox.checked = true;
|
| 395 |
+
}
|
| 396 |
+
});
|
| 397 |
+
});
|
| 398 |
+
</script>
|
| 399 |
+
</body>
|
| 400 |
+
</html>
|
index.html
CHANGED
|
@@ -4,43 +4,124 @@
|
|
| 4 |
<meta charset="utf-8">
|
| 5 |
<meta name="viewport" content="width=device-width, initial-scale=1">
|
| 6 |
<title>VvvebJs - Visual Website Builder</title>
|
| 7 |
-
<link href="css/editor.css" rel="stylesheet">
|
| 8 |
<style>
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 13 |
text-align: center;
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
}
|
| 18 |
-
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 23 |
display: inline-block;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 24 |
}
|
| 25 |
-
.btn-primary { background: #007bff; color: white; }
|
| 26 |
-
.btn-secondary { background: #6c757d; color: white; }
|
| 27 |
-
.btn:hover { opacity: 0.8; }
|
| 28 |
</style>
|
| 29 |
</head>
|
| 30 |
<body>
|
| 31 |
-
|
| 32 |
-
|
| 33 |
-
<
|
| 34 |
-
<p
|
| 35 |
-
|
| 36 |
-
<div style="margin: 30px 0;">
|
| 37 |
-
<a href="config.php" class="btn btn-secondary">⚙️ Check Configuration</a>
|
| 38 |
-
<a href="editor.html" class="btn btn-primary">🚀 Launch Editor</a>
|
| 39 |
-
</div>
|
| 40 |
|
| 41 |
-
<div
|
| 42 |
-
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 43 |
</div>
|
| 44 |
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 45 |
</body>
|
| 46 |
</html>
|
|
|
|
| 4 |
<meta charset="utf-8">
|
| 5 |
<meta name="viewport" content="width=device-width, initial-scale=1">
|
| 6 |
<title>VvvebJs - Visual Website Builder</title>
|
|
|
|
| 7 |
<style>
|
| 8 |
+
body {
|
| 9 |
+
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
| 10 |
+
min-height: 100vh;
|
| 11 |
+
display: flex;
|
| 12 |
+
flex-direction: column;
|
| 13 |
+
justify-content: center;
|
| 14 |
+
align-items: center;
|
| 15 |
+
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
|
| 16 |
+
margin: 0;
|
| 17 |
+
padding: 20px;
|
| 18 |
+
}
|
| 19 |
+
|
| 20 |
+
.cyber-card {
|
| 21 |
+
background: rgba(255, 255, 255, 0.1);
|
| 22 |
+
backdrop-filter: blur(20px);
|
| 23 |
+
border: 1px solid rgba(255, 255, 255, 0.2);
|
| 24 |
+
border-radius: 20px;
|
| 25 |
+
padding: 40px;
|
| 26 |
text-align: center;
|
| 27 |
+
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.3);
|
| 28 |
+
margin-bottom: 30px;
|
| 29 |
+
min-width: 400px;
|
| 30 |
+
}
|
| 31 |
+
|
| 32 |
+
.repo-title {
|
| 33 |
+
color: #fff;
|
| 34 |
+
font-size: 2.5em;
|
| 35 |
+
font-weight: 700;
|
| 36 |
+
margin: 0 0 10px 0;
|
| 37 |
+
text-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);
|
| 38 |
+
}
|
| 39 |
+
|
| 40 |
+
.repo-subtitle {
|
| 41 |
+
color: rgba(255, 255, 255, 0.8);
|
| 42 |
+
font-size: 1.2em;
|
| 43 |
+
margin: 0 0 20px 0;
|
| 44 |
+
}
|
| 45 |
+
|
| 46 |
+
.repo-info {
|
| 47 |
+
display: flex;
|
| 48 |
+
justify-content: space-around;
|
| 49 |
+
margin: 20px 0;
|
| 50 |
+
}
|
| 51 |
+
|
| 52 |
+
.info-item {
|
| 53 |
+
color: rgba(255, 255, 255, 0.9);
|
| 54 |
+
font-size: 0.9em;
|
| 55 |
+
}
|
| 56 |
+
|
| 57 |
+
.info-value {
|
| 58 |
+
display: block;
|
| 59 |
+
color: #fff;
|
| 60 |
+
font-weight: 600;
|
| 61 |
+
margin-top: 5px;
|
| 62 |
+
}
|
| 63 |
+
|
| 64 |
+
.login-btn {
|
| 65 |
+
background: linear-gradient(45deg, #ff6b6b, #4ecdc4);
|
| 66 |
+
color: white;
|
| 67 |
+
border: none;
|
| 68 |
+
padding: 15px 40px;
|
| 69 |
+
font-size: 1.1em;
|
| 70 |
+
font-weight: 600;
|
| 71 |
+
border-radius: 50px;
|
| 72 |
+
cursor: pointer;
|
| 73 |
+
text-decoration: none;
|
| 74 |
display: inline-block;
|
| 75 |
+
transition: all 0.3s ease;
|
| 76 |
+
box-shadow: 0 10px 20px rgba(0, 0, 0, 0.2);
|
| 77 |
+
}
|
| 78 |
+
|
| 79 |
+
.login-btn:hover {
|
| 80 |
+
transform: translateY(-2px);
|
| 81 |
+
box-shadow: 0 15px 30px rgba(0, 0, 0, 0.3);
|
| 82 |
+
}
|
| 83 |
+
|
| 84 |
+
@media (max-width: 480px) {
|
| 85 |
+
.cyber-card {
|
| 86 |
+
min-width: auto;
|
| 87 |
+
margin: 0 10px 30px 10px;
|
| 88 |
+
padding: 30px 20px;
|
| 89 |
+
}
|
| 90 |
+
.repo-title {
|
| 91 |
+
font-size: 2em;
|
| 92 |
+
}
|
| 93 |
+
.repo-info {
|
| 94 |
+
flex-direction: column;
|
| 95 |
+
gap: 15px;
|
| 96 |
+
}
|
| 97 |
}
|
|
|
|
|
|
|
|
|
|
| 98 |
</style>
|
| 99 |
</head>
|
| 100 |
<body>
|
| 101 |
+
<!-- 赛博信息卡片仓库 -->
|
| 102 |
+
<div class="cyber-card">
|
| 103 |
+
<h1 class="repo-title">🔮 VvvebJs</h1>
|
| 104 |
+
<p class="repo-subtitle">赛博视觉网站构建器</p>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 105 |
|
| 106 |
+
<div class="repo-info">
|
| 107 |
+
<div class="info-item">
|
| 108 |
+
<span>存储类型</span>
|
| 109 |
+
<span class="info-value">GitHub</span>
|
| 110 |
+
</div>
|
| 111 |
+
<div class="info-item">
|
| 112 |
+
<span>认证状态</span>
|
| 113 |
+
<span class="info-value">🔐 安全</span>
|
| 114 |
+
</div>
|
| 115 |
+
<div class="info-item">
|
| 116 |
+
<span>版本</span>
|
| 117 |
+
<span class="info-value">v2.0</span>
|
| 118 |
+
</div>
|
| 119 |
</div>
|
| 120 |
</div>
|
| 121 |
+
|
| 122 |
+
<!-- 登录按钮 -->
|
| 123 |
+
<a href="editor.html" class="login-btn">
|
| 124 |
+
🚀 进入编辑器
|
| 125 |
+
</a>
|
| 126 |
</body>
|
| 127 |
</html>
|
test-current-token.php
ADDED
|
@@ -0,0 +1,247 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<?php
|
| 2 |
+
// 测试当前 GitHub Token 配置
|
| 3 |
+
// 根据截图中的信息进行测试
|
| 4 |
+
|
| 5 |
+
// 从截图推断的配置
|
| 6 |
+
$config = [
|
| 7 |
+
'owner' => 'CaPaCaptain', // 从截图中的仓库访问看到
|
| 8 |
+
'repo' => 'VvvebJs_huggingface_db_01', // 从截图中看到
|
| 9 |
+
'branch' => 'main',
|
| 10 |
+
'path' => 'pages/',
|
| 11 |
+
'token' => $_ENV['GITHUB_TOKEN'] ?? getenv('GITHUB_TOKEN') ?: ''
|
| 12 |
+
];
|
| 13 |
+
|
| 14 |
+
function testGitHubAPI($url, $token, $method = 'GET', $data = null) {
|
| 15 |
+
$ch = curl_init();
|
| 16 |
+
curl_setopt($ch, CURLOPT_URL, $url);
|
| 17 |
+
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
| 18 |
+
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
|
| 19 |
+
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
|
| 20 |
+
curl_setopt($ch, CURLOPT_HTTPHEADER, [
|
| 21 |
+
'Authorization: token ' . $token,
|
| 22 |
+
'User-Agent: VvvebJs-TokenTest/1.0',
|
| 23 |
+
'Accept: application/vnd.github.v3+json',
|
| 24 |
+
'Content-Type: application/json'
|
| 25 |
+
]);
|
| 26 |
+
|
| 27 |
+
if ($data) {
|
| 28 |
+
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
|
| 29 |
+
}
|
| 30 |
+
|
| 31 |
+
$response = curl_exec($ch);
|
| 32 |
+
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
| 33 |
+
$error = curl_error($ch);
|
| 34 |
+
curl_close($ch);
|
| 35 |
+
|
| 36 |
+
return [
|
| 37 |
+
'success' => $httpCode >= 200 && $httpCode < 300,
|
| 38 |
+
'code' => $httpCode,
|
| 39 |
+
'response' => $response,
|
| 40 |
+
'error' => $error
|
| 41 |
+
];
|
| 42 |
+
}
|
| 43 |
+
|
| 44 |
+
$results = [];
|
| 45 |
+
|
| 46 |
+
if ($_POST['test'] ?? false) {
|
| 47 |
+
// 测试 1: Token 有效性
|
| 48 |
+
$results['token'] = testGitHubAPI('https://api.github.com/user', $config['token']);
|
| 49 |
+
|
| 50 |
+
// 测试 2: 仓库访问
|
| 51 |
+
$repoUrl = "https://api.github.com/repos/{$config['owner']}/{$config['repo']}";
|
| 52 |
+
$results['repo'] = testGitHubAPI($repoUrl, $config['token']);
|
| 53 |
+
|
| 54 |
+
// 测试 3: 分支检查
|
| 55 |
+
$branchUrl = "https://api.github.com/repos/{$config['owner']}/{$config['repo']}/branches/{$config['branch']}";
|
| 56 |
+
$results['branch'] = testGitHubAPI($branchUrl, $config['token']);
|
| 57 |
+
|
| 58 |
+
// 测试 4: 写入权限测试
|
| 59 |
+
$testFile = 'token-test-' . date('Y-m-d-H-i-s') . '.html';
|
| 60 |
+
$testContent = '<!DOCTYPE html><html><head><title>Token Test</title></head><body><h1>GitHub Token 测试</h1><p>创建时间: ' . date('Y-m-d H:i:s') . '</p></body></html>';
|
| 61 |
+
$createUrl = "https://api.github.com/repos/{$config['owner']}/{$config['repo']}/contents/{$config['path']}{$testFile}";
|
| 62 |
+
|
| 63 |
+
$results['write'] = testGitHubAPI($createUrl, $config['token'], 'PUT', [
|
| 64 |
+
'message' => 'VvvebJs Token 测试文件',
|
| 65 |
+
'content' => base64_encode($testContent),
|
| 66 |
+
'branch' => $config['branch']
|
| 67 |
+
]);
|
| 68 |
+
}
|
| 69 |
+
?>
|
| 70 |
+
|
| 71 |
+
<!DOCTYPE html>
|
| 72 |
+
<html lang="en">
|
| 73 |
+
<head>
|
| 74 |
+
<meta charset="utf-8">
|
| 75 |
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
| 76 |
+
<title>当前 GitHub Token 测试</title>
|
| 77 |
+
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
|
| 78 |
+
</head>
|
| 79 |
+
<body>
|
| 80 |
+
<div class="container mt-5">
|
| 81 |
+
<div class="row">
|
| 82 |
+
<div class="col-md-8 mx-auto">
|
| 83 |
+
<h1 class="mb-4">🔑 当前 GitHub Token 配置测试</h1>
|
| 84 |
+
|
| 85 |
+
<!-- 配置信息 -->
|
| 86 |
+
<div class="card mb-4">
|
| 87 |
+
<div class="card-header bg-info text-white">
|
| 88 |
+
<h3 class="mb-0">📋 从截图推断的配置</h3>
|
| 89 |
+
</div>
|
| 90 |
+
<div class="card-body">
|
| 91 |
+
<div class="row">
|
| 92 |
+
<div class="col-md-6">
|
| 93 |
+
<p><strong>GitHub Owner:</strong> <code><?= htmlspecialchars($config['owner']) ?></code></p>
|
| 94 |
+
<p><strong>Repository:</strong> <code><?= htmlspecialchars($config['repo']) ?></code></p>
|
| 95 |
+
<p><strong>Token 状态:</strong> <?= !empty($config['token']) ? '✅ 已配置' : '❌ 未找到' ?></p>
|
| 96 |
+
</div>
|
| 97 |
+
<div class="col-md-6">
|
| 98 |
+
<p><strong>Branch:</strong> <code><?= htmlspecialchars($config['branch']) ?></code></p>
|
| 99 |
+
<p><strong>Path:</strong> <code><?= htmlspecialchars($config['path']) ?></code></p>
|
| 100 |
+
<p><strong>完整 URL:</strong><br><small><code>https://github.com/<?= htmlspecialchars($config['owner']) ?>/<?= htmlspecialchars($config['repo']) ?></code></small></p>
|
| 101 |
+
</div>
|
| 102 |
+
</div>
|
| 103 |
+
</div>
|
| 104 |
+
</div>
|
| 105 |
+
|
| 106 |
+
<?php if (!empty($config['token'])): ?>
|
| 107 |
+
<!-- 测试按钮 -->
|
| 108 |
+
<div class="card mb-4">
|
| 109 |
+
<div class="card-body text-center">
|
| 110 |
+
<form method="POST">
|
| 111 |
+
<button type="submit" name="test" value="1" class="btn btn-primary btn-lg">
|
| 112 |
+
🧪 测试 Token 权限
|
| 113 |
+
</button>
|
| 114 |
+
</form>
|
| 115 |
+
</div>
|
| 116 |
+
</div>
|
| 117 |
+
|
| 118 |
+
<?php if (!empty($results)): ?>
|
| 119 |
+
<!-- 测试结果 -->
|
| 120 |
+
<div class="card mb-4">
|
| 121 |
+
<div class="card-header">
|
| 122 |
+
<h3>🔬 测试结果</h3>
|
| 123 |
+
</div>
|
| 124 |
+
<div class="card-body">
|
| 125 |
+
|
| 126 |
+
<!-- Token 测试 -->
|
| 127 |
+
<div class="mb-4">
|
| 128 |
+
<h5>1. Token 验证</h5>
|
| 129 |
+
<?php $test = $results['token']; ?>
|
| 130 |
+
<div class="alert alert-<?= $test['success'] ? 'success' : 'danger' ?>">
|
| 131 |
+
<strong>结果:</strong> <?= $test['success'] ? '✅ Token 有效' : '❌ Token 无效' ?> (HTTP <?= $test['code'] ?>)
|
| 132 |
+
|
| 133 |
+
<?php if ($test['success'] && $test['response']): ?>
|
| 134 |
+
<?php $user = json_decode($test['response'], true); ?>
|
| 135 |
+
<br><strong>当前用户:</strong> <?= htmlspecialchars($user['login'] ?? 'Unknown') ?>
|
| 136 |
+
<br><strong>用户名:</strong> <?= htmlspecialchars($user['name'] ?? 'N/A') ?>
|
| 137 |
+
<br><strong>用户类型:</strong> <?= htmlspecialchars($user['type'] ?? 'N/A') ?>
|
| 138 |
+
<?php endif; ?>
|
| 139 |
+
</div>
|
| 140 |
+
</div>
|
| 141 |
+
|
| 142 |
+
<!-- 仓库测试 -->
|
| 143 |
+
<div class="mb-4">
|
| 144 |
+
<h5>2. 仓库访问测试</h5>
|
| 145 |
+
<?php $test = $results['repo']; ?>
|
| 146 |
+
<div class="alert alert-<?= $test['success'] ? 'success' : 'danger' ?>">
|
| 147 |
+
<strong>结果:</strong> <?= $test['success'] ? '✅ 仓库可访问' : '❌ 仓库无法访问' ?> (HTTP <?= $test['code'] ?>)
|
| 148 |
+
|
| 149 |
+
<?php if ($test['success'] && $test['response']): ?>
|
| 150 |
+
<?php $repo = json_decode($test['response'], true); ?>
|
| 151 |
+
<br><strong>仓库全名:</strong> <?= htmlspecialchars($repo['full_name'] ?? 'Unknown') ?>
|
| 152 |
+
<br><strong>私有仓库:</strong> <?= ($repo['private'] ?? false) ? '是' : '否' ?>
|
| 153 |
+
<br><strong>默认分支:</strong> <?= htmlspecialchars($repo['default_branch'] ?? 'Unknown') ?>
|
| 154 |
+
|
| 155 |
+
<?php if (isset($repo['permissions'])): ?>
|
| 156 |
+
<br><strong>权限:</strong>
|
| 157 |
+
- Admin: <?= $repo['permissions']['admin'] ? '✅' : '❌' ?>
|
| 158 |
+
- Push: <?= $repo['permissions']['push'] ? '✅' : '❌' ?>
|
| 159 |
+
- Pull: <?= $repo['permissions']['pull'] ? '✅' : '❌' ?>
|
| 160 |
+
<?php endif; ?>
|
| 161 |
+
<?php endif; ?>
|
| 162 |
+
</div>
|
| 163 |
+
</div>
|
| 164 |
+
|
| 165 |
+
<!-- 分支测试 -->
|
| 166 |
+
<div class="mb-4">
|
| 167 |
+
<h5>3. 分支检查</h5>
|
| 168 |
+
<?php $test = $results['branch']; ?>
|
| 169 |
+
<div class="alert alert-<?= $test['success'] ? 'success' : 'warning' ?>">
|
| 170 |
+
<strong>结果:</strong> <?= $test['success'] ? '✅ 分支存在' : '⚠️ 分支问题' ?> (HTTP <?= $test['code'] ?>)
|
| 171 |
+
|
| 172 |
+
<?php if ($test['success'] && $test['response']): ?>
|
| 173 |
+
<?php $branch = json_decode($test['response'], true); ?>
|
| 174 |
+
<br><strong>分支名:</strong> <?= htmlspecialchars($branch['name'] ?? 'Unknown') ?>
|
| 175 |
+
<br><strong>最新提交:</strong> <?= htmlspecialchars(substr($branch['commit']['sha'] ?? '', 0, 8)) ?>
|
| 176 |
+
<?php elseif ($test['code'] == 404): ?>
|
| 177 |
+
<br><strong>提示:</strong> 分支 "<?= $config['branch'] ?>" 不存在。可能需要使用 "master" 分支。
|
| 178 |
+
<?php endif; ?>
|
| 179 |
+
</div>
|
| 180 |
+
</div>
|
| 181 |
+
|
| 182 |
+
<!-- 写入测试 -->
|
| 183 |
+
<div class="mb-4">
|
| 184 |
+
<h5>4. 文件写入权限测试</h5>
|
| 185 |
+
<?php $test = $results['write']; ?>
|
| 186 |
+
<div class="alert alert-<?= $test['success'] ? 'success' : 'danger' ?>">
|
| 187 |
+
<strong>结果:</strong> <?= $test['success'] ? '✅ 写入成功' : '❌ 写入失败' ?> (HTTP <?= $test['code'] ?>)
|
| 188 |
+
|
| 189 |
+
<?php if ($test['success']): ?>
|
| 190 |
+
<br><strong>🎉 恭喜!Token 配置完全正确,可以正常保存文件到 GitHub。</strong>
|
| 191 |
+
<br>您可以开始使用 VvvebJs 编辑器了!
|
| 192 |
+
<?php else: ?>
|
| 193 |
+
<br><strong>错误详情:</strong>
|
| 194 |
+
<pre style="font-size: 12px; max-height: 200px; overflow-y: auto;"><?= htmlspecialchars($test['response']) ?></pre>
|
| 195 |
+
<?php endif; ?>
|
| 196 |
+
</div>
|
| 197 |
+
</div>
|
| 198 |
+
|
| 199 |
+
</div>
|
| 200 |
+
</div>
|
| 201 |
+
|
| 202 |
+
<!-- 建议配置 -->
|
| 203 |
+
<div class="card">
|
| 204 |
+
<div class="card-header">
|
| 205 |
+
<h3>⚙️ 推荐的环境变量配置</h3>
|
| 206 |
+
</div>
|
| 207 |
+
<div class="card-body">
|
| 208 |
+
<p>在您的 Hugging Face Space Settings 中设置以下环境变量:</p>
|
| 209 |
+
<div class="bg-light p-3 rounded">
|
| 210 |
+
<code>GITHUB_TOKEN=your_token_here</code><br>
|
| 211 |
+
<code>GITHUB_OWNER=<?= htmlspecialchars($config['owner']) ?></code><br>
|
| 212 |
+
<code>GITHUB_REPO=<?= htmlspecialchars($config['repo']) ?></code><br>
|
| 213 |
+
<code>GITHUB_BRANCH=<?= $results['branch']['success'] ? $config['branch'] : 'master' ?></code><br>
|
| 214 |
+
<code>GITHUB_PATH=<?= htmlspecialchars($config['path']) ?></code><br>
|
| 215 |
+
<code>STORAGE_TYPE=github</code><br>
|
| 216 |
+
</div>
|
| 217 |
+
|
| 218 |
+
<?php if (!$results['branch']['success'] && $results['branch']['code'] == 404): ?>
|
| 219 |
+
<div class="alert alert-warning mt-3">
|
| 220 |
+
<strong>⚠️ 注意:</strong> 检测到分支 "main" 不存在,建议使用 "master" 分支。
|
| 221 |
+
</div>
|
| 222 |
+
<?php endif; ?>
|
| 223 |
+
</div>
|
| 224 |
+
</div>
|
| 225 |
+
|
| 226 |
+
<?php endif; ?>
|
| 227 |
+
|
| 228 |
+
<?php else: ?>
|
| 229 |
+
<!-- Token 未配置 -->
|
| 230 |
+
<div class="alert alert-danger">
|
| 231 |
+
<h5>❌ GitHub Token 未配置</h5>
|
| 232 |
+
<p>请在环境变量中设置 <code>GITHUB_TOKEN</code>。</p>
|
| 233 |
+
<p>Token 应该是您在 GitHub 截图中创建的那个。</p>
|
| 234 |
+
</div>
|
| 235 |
+
<?php endif; ?>
|
| 236 |
+
|
| 237 |
+
<!-- 导航 -->
|
| 238 |
+
<div class="text-center mt-4">
|
| 239 |
+
<a href="config.php" class="btn btn-secondary me-2">🔙 返回配置</a>
|
| 240 |
+
<a href="github-token-helper.html" class="btn btn-info me-2">📖 Token 指南</a>
|
| 241 |
+
<a href="editor.html" class="btn btn-primary">🎨 打开编辑器</a>
|
| 242 |
+
</div>
|
| 243 |
+
</div>
|
| 244 |
+
</div>
|
| 245 |
+
</div>
|
| 246 |
+
</body>
|
| 247 |
+
</html>
|