| <!DOCTYPE html>
|
| <html lang="en">
|
| <head>
|
| <meta charset="utf-8">
|
| <meta name="viewport" content="width=device-width, initial-scale=1">
|
| <title>GitHub Token 权限配置助手</title>
|
| <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
|
| <style>
|
| .permission-card {
|
| border-left: 4px solid #007bff;
|
| transition: all 0.3s ease;
|
| }
|
| .permission-required {
|
| border-left-color: #28a745;
|
| background-color: #f8fff9;
|
| }
|
| .permission-optional {
|
| border-left-color: #ffc107;
|
| background-color: #fefdf5;
|
| }
|
| .permission-not-needed {
|
| border-left-color: #dc3545;
|
| background-color: #fff5f5;
|
| }
|
| .step-number {
|
| background: linear-gradient(45deg, #007bff, #0056b3);
|
| color: white;
|
| border-radius: 50%;
|
| width: 40px;
|
| height: 40px;
|
| display: flex;
|
| align-items: center;
|
| justify-content: center;
|
| font-weight: bold;
|
| }
|
| .checklist-item {
|
| padding: 8px 0;
|
| border-bottom: 1px solid #eee;
|
| }
|
| .token-example {
|
| font-family: monospace;
|
| background: #f8f9fa;
|
| padding: 4px 8px;
|
| border-radius: 4px;
|
| border: 1px solid #dee2e6;
|
| }
|
| </style>
|
| </head>
|
| <body>
|
| <div class="container mt-4">
|
| <div class="row">
|
| <div class="col-md-10 mx-auto">
|
| <div class="text-center mb-5">
|
| <h1 class="display-4">🔑 GitHub Token 权限配置助手</h1>
|
| <p class="lead">为 VvvebJs 配置正确的 GitHub 访问权限</p>
|
| </div>
|
|
|
|
|
| <div class="card mb-4 border-primary">
|
| <div class="card-header bg-primary text-white">
|
| <h3 class="mb-0">⚡ 快速开始</h3>
|
| </div>
|
| <div class="card-body">
|
| <div class="row">
|
| <div class="col-md-6">
|
| <h5>👈 我是新手</h5>
|
| <p class="text-muted">第一次配置 GitHub Token</p>
|
| <a href="https://github.com/settings/tokens/new" target="_blank" class="btn btn-outline-primary">
|
| 🚀 创建新 Token
|
| </a>
|
| </div>
|
| <div class="col-md-6">
|
| <h5>🔧 我需要排查问题</h5>
|
| <p class="text-muted">Token 已创建但有问题</p>
|
| <a href="github-test.php" class="btn btn-outline-warning">
|
| 🧪 测试现有配置
|
| </a>
|
| </div>
|
| </div>
|
| </div>
|
| </div>
|
|
|
|
|
| <div class="row">
|
|
|
| <div class="col-md-6 mb-4">
|
| <div class="card h-100">
|
| <div class="card-body">
|
| <div class="d-flex align-items-center mb-3">
|
| <div class="step-number me-3">1</div>
|
| <h4 class="mb-0">访问 GitHub 设置</h4>
|
| </div>
|
| <ol>
|
| <li>登录 <a href="https://github.com" target="_blank">GitHub</a></li>
|
| <li>点击右上角头像 → Settings</li>
|
| <li>左侧菜单 → Developer settings</li>
|
| <li>Personal access tokens → Tokens (classic)</li>
|
| <li>Generate new token (classic)</li>
|
| </ol>
|
| <a href="https://github.com/settings/tokens" target="_blank" class="btn btn-primary btn-sm">
|
| 🔗 直接跳转
|
| </a>
|
| </div>
|
| </div>
|
| </div>
|
|
|
|
|
| <div class="col-md-6 mb-4">
|
| <div class="card h-100">
|
| <div class="card-body">
|
| <div class="d-flex align-items-center mb-3">
|
| <div class="step-number me-3">2</div>
|
| <h4 class="mb-0">填写基本信息</h4>
|
| </div>
|
| <div class="mb-3">
|
| <label class="form-label"><strong>Note (描述):</strong></label>
|
| <div class="token-example">VvvebJs Website Editor</div>
|
| </div>
|
| <div class="mb-3">
|
| <label class="form-label"><strong>Expiration (过期时间):</strong></label>
|
| <div class="text-success">推荐: 90 days</div>
|
| <small class="text-muted">平衡安全性和便利性</small>
|
| </div>
|
| </div>
|
| </div>
|
| </div>
|
| </div>
|
|
|
|
|
| <div class="card mb-4">
|
| <div class="card-header">
|
| <div class="d-flex align-items-center">
|
| <div class="step-number me-3">3</div>
|
| <h3 class="mb-0">选择权限范围 (Scopes)</h3>
|
| </div>
|
| </div>
|
| <div class="card-body">
|
| <div class="alert alert-warning">
|
| <strong>⚠️ 重要:</strong> 必须勾选 <code>repo</code> 权限,这是 VvvebJs 保存文件的基础要求。
|
| </div>
|
|
|
|
|
| <div class="permission-card permission-required card mb-3">
|
| <div class="card-header">
|
| <h5 class="text-success mb-0">✅ 必需权限</h5>
|
| </div>
|
| <div class="card-body">
|
| <div class="form-check">
|
| <input class="form-check-input" type="checkbox" checked disabled>
|
| <label class="form-check-label">
|
| <strong>repo</strong> - Full control of private repositories
|
| </label>
|
| </div>
|
| <small class="text-muted ms-4">
|
| 包含: repo:status, repo_deployment, public_repo, repo:invite<br>
|
| <strong>用途:</strong> 创建、读取、更新网页文件
|
| </small>
|
| </div>
|
| </div>
|
|
|
|
|
| <div class="permission-card permission-optional card mb-3">
|
| <div class="card-header">
|
| <h5 class="text-warning mb-0">⚠️ 可选权限</h5>
|
| </div>
|
| <div class="card-body">
|
| <div class="form-check mb-2">
|
| <input class="form-check-input" type="checkbox">
|
| <label class="form-check-label">
|
| <strong>workflow</strong> - Update GitHub Action workflows
|
| </label>
|
| </div>
|
| <small class="text-muted ms-4 d-block mb-3">
|
| <strong>用途:</strong> 如果您计划使用 GitHub Actions 自动部署
|
| </small>
|
|
|
| <div class="form-check mb-2">
|
| <input class="form-check-input" type="checkbox">
|
| <label class="form-check-label">
|
| <strong>write:packages / read:packages</strong> - Package registry access
|
| </label>
|
| </div>
|
| <small class="text-muted ms-4 d-block">
|
| <strong>用途:</strong> 如果您需要管理 GitHub Packages
|
| </small>
|
| </div>
|
| </div>
|
|
|
|
|
| <div class="permission-card permission-not-needed card">
|
| <div class="card-header">
|
| <h5 class="text-danger mb-0">❌ 不需要的权限</h5>
|
| </div>
|
| <div class="card-body">
|
| <div class="row">
|
| <div class="col-md-6">
|
| <ul class="list-unstyled">
|
| <li>❌ admin:repo_hook</li>
|
| <li>❌ admin:org</li>
|
| <li>❌ admin:public_key</li>
|
| <li>❌ gist</li>
|
| </ul>
|
| </div>
|
| <div class="col-md-6">
|
| <ul class="list-unstyled">
|
| <li>❌ notifications</li>
|
| <li>❌ user</li>
|
| <li>❌ delete_repo</li>
|
| <li>❌ admin:org_hook</li>
|
| </ul>
|
| </div>
|
| </div>
|
| <small class="text-muted">
|
| <strong>原因:</strong> VvvebJs 只需要读写文件,不需要管理权限
|
| </small>
|
| </div>
|
| </div>
|
| </div>
|
| </div>
|
|
|
|
|
| <div class="card mb-4">
|
| <div class="card-header">
|
| <div class="d-flex align-items-center">
|
| <div class="step-number me-3">4</div>
|
| <h3 class="mb-0">配置环境变量</h3>
|
| </div>
|
| </div>
|
| <div class="card-body">
|
| <div class="alert alert-info">
|
| <strong>📋 获取 Token 后,在 Hugging Face Space Settings 中添加这些环境变量:</strong>
|
| </div>
|
|
|
| <div class="row">
|
| <div class="col-md-6">
|
| <h5>🔑 GitHub 认证</h5>
|
| <div class="bg-light p-3 rounded">
|
| <code>GITHUB_TOKEN=ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</code><br>
|
| <code>GITHUB_OWNER=your_username</code><br>
|
| <code>GITHUB_REPO=your_repo_name</code><br>
|
| </div>
|
| </div>
|
| <div class="col-md-6">
|
| <h5>⚙️ 存储配置</h5>
|
| <div class="bg-light p-3 rounded">
|
| <code>GITHUB_BRANCH=main</code><br>
|
| <code>GITHUB_PATH=pages/</code><br>
|
| <code>STORAGE_TYPE=github</code><br>
|
| </div>
|
| </div>
|
| </div>
|
|
|
| <div class="mt-3">
|
| <h6>📝 配置说明:</h6>
|
| <ul>
|
| <li><code>GITHUB_TOKEN</code>: 刚创建的 40 字符 Token (以 ghp_ 开头)</li>
|
| <li><code>GITHUB_OWNER</code>: 您的 GitHub 用户名</li>
|
| <li><code>GITHUB_REPO</code>: 存储网页的仓库名</li>
|
| <li><code>GITHUB_PATH</code>: 网页保存的目录 (可以为空)</li>
|
| </ul>
|
| </div>
|
| </div>
|
| </div>
|
|
|
|
|
| <div class="card mb-4">
|
| <div class="card-header">
|
| <div class="d-flex align-items-center">
|
| <div class="step-number me-3">5</div>
|
| <h3 class="mb-0">验证配置</h3>
|
| </div>
|
| </div>
|
| <div class="card-body">
|
| <h5>✅ 配置检查清单</h5>
|
| <div id="checklist">
|
| <div class="checklist-item">
|
| <input type="checkbox" class="form-check-input me-2" id="check1">
|
| <label for="check1">Token 已创建且有 <code>repo</code> 权限</label>
|
| </div>
|
| <div class="checklist-item">
|
| <input type="checkbox" class="form-check-input me-2" id="check2">
|
| <label for="check2">环境变量已在 Hugging Face Space 中配置</label>
|
| </div>
|
| <div class="checklist-item">
|
| <input type="checkbox" class="form-check-input me-2" id="check3">
|
| <label for="check3">GitHub 仓库已创建且可访问</label>
|
| </div>
|
| <div class="checklist-item">
|
| <input type="checkbox" class="form-check-input me-2" id="check4">
|
| <label for="check4">分支名称正确 (通常是 main 或 master)</label>
|
| </div>
|
| <div class="checklist-item">
|
| <input type="checkbox" class="form-check-input me-2" id="check5">
|
| <label for="check5">已通过测试页面验证</label>
|
| </div>
|
| </div>
|
|
|
| <div class="mt-4">
|
| <a href="github-test.php" class="btn btn-success me-2">🧪 测试配置</a>
|
| <a href="config.php" class="btn btn-secondary me-2">⚙️ 查看状态</a>
|
| <a href="editor.html" class="btn btn-primary">🎨 开始使用编辑器</a>
|
| </div>
|
| </div>
|
| </div>
|
|
|
|
|
| <div class="card">
|
| <div class="card-header">
|
| <h3>🔧 常见问题和解决方案</h3>
|
| </div>
|
| <div class="card-body">
|
| <div class="accordion" id="troubleshootingAccordion">
|
|
|
| <div class="accordion-item">
|
| <h5 class="accordion-header">
|
| <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#trouble1">
|
| 403 Forbidden - 权限不足
|
| </button>
|
| </h5>
|
| <div id="trouble1" class="accordion-collapse collapse" data-bs-parent="#troubleshootingAccordion">
|
| <div class="accordion-body">
|
| <strong>原因:</strong> Token 权限不足<br>
|
| <strong>解决:</strong>
|
| <ol>
|
| <li>确保勾选了 <code>repo</code> 权限</li>
|
| <li>重新生成 Token 并更新环境变量</li>
|
| <li>检查仓库是否为私有仓库(需要完整 repo 权限)</li>
|
| </ol>
|
| </div>
|
| </div>
|
| </div>
|
|
|
|
|
| <div class="accordion-item">
|
| <h5 class="accordion-header">
|
| <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#trouble2">
|
| 401 Unauthorized - 认证失败
|
| </button>
|
| </h5>
|
| <div id="trouble2" class="accordion-collapse collapse" data-bs-parent="#troubleshootingAccordion">
|
| <div class="accordion-body">
|
| <strong>原因:</strong> Token 无效或过期<br>
|
| <strong>解决:</strong>
|
| <ol>
|
| <li>检查 Token 是否正确复制(40个字符,以 ghp_ 开头)</li>
|
| <li>检查 Token 是否过期</li>
|
| <li>重新生成新的 Token</li>
|
| </ol>
|
| </div>
|
| </div>
|
| </div>
|
|
|
|
|
| <div class="accordion-item">
|
| <h5 class="accordion-header">
|
| <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#trouble3">
|
| 404 Not Found - 仓库不存在
|
| </button>
|
| </h5>
|
| <div id="trouble3" class="accordion-collapse collapse" data-bs-parent="#troubleshootingAccordion">
|
| <div class="accordion-body">
|
| <strong>原因:</strong> 仓库不存在或 Token 无访问权限<br>
|
| <strong>解决:</strong>
|
| <ol>
|
| <li>检查 <code>GITHUB_OWNER</code> 是否是正确的用户名</li>
|
| <li>检查 <code>GITHUB_REPO</code> 是否是正确的仓库名</li>
|
| <li>确保仓库存在且 Token 有访问权限</li>
|
| <li>如果是组织仓库,确保 Token 有组织权限</li>
|
| </ol>
|
| </div>
|
| </div>
|
| </div>
|
| </div>
|
| </div>
|
| </div>
|
| </div>
|
| </div>
|
| </div>
|
|
|
| <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
|
| <script>
|
|
|
| document.addEventListener('DOMContentLoaded', function() {
|
| const checkboxes = document.querySelectorAll('#checklist input[type="checkbox"]');
|
|
|
| checkboxes.forEach(checkbox => {
|
| checkbox.addEventListener('change', function() {
|
| localStorage.setItem(this.id, this.checked);
|
| });
|
|
|
|
|
| const saved = localStorage.getItem(checkbox.id);
|
| if (saved === 'true') {
|
| checkbox.checked = true;
|
| }
|
| });
|
| });
|
| </script>
|
| </body>
|
| </html> |