// API文档页面JavaScript let apiSpec = null; let currentToken = null; // 初始化 document.addEventListener('DOMContentLoaded', async () => { await loadToken(); await loadAPISpec(); if (apiSpec) { renderAPIDocs(); } }); // 加载token async function loadToken() { try { const authData = localStorage.getItem('cyberstrike-auth'); if (authData) { const parsed = JSON.parse(authData); if (parsed && parsed.token) { const expiry = parsed.expiresAt ? new Date(parsed.expiresAt) : null; if (!expiry || expiry.getTime() > Date.now()) { currentToken = parsed.token; return; } } } currentToken = localStorage.getItem('swagger_auth_token'); } catch (e) { console.error('加载token失败:', e); } } // 加载OpenAPI规范 async function loadAPISpec() { try { let url = '/api/openapi/spec'; if (currentToken) { url += '?token=' + encodeURIComponent(currentToken); } const response = await fetch(url); if (!response.ok) { if (response.status === 401) { showError('需要登录才能查看API文档。请先在前端页面登录,然后刷新此页面。'); return; } throw new Error('加载API规范失败: ' + response.status); } apiSpec = await response.json(); } catch (error) { console.error('加载API规范失败:', error); showError('加载API文档失败: ' + error.message); } } // 显示错误 function showError(message) { const main = document.getElementById('api-docs-main'); main.innerHTML = `
`; } // 渲染API文档 function renderAPIDocs() { if (!apiSpec || !apiSpec.paths) { showError('API规范格式错误'); return; } // 显示认证说明 renderAuthInfo(); // 渲染侧边栏分组 renderSidebar(); // 渲染API端点 renderEndpoints(); } // 渲染认证说明 function renderAuthInfo() { const authSection = document.getElementById('auth-info-section'); if (!authSection) return; // 显示认证说明部分 authSection.style.display = 'block'; // 检查是否有token const tokenStatus = document.getElementById('token-status'); if (currentToken && tokenStatus) { tokenStatus.style.display = 'block'; } else if (tokenStatus) { // 如果没有token,显示提示 tokenStatus.style.display = 'block'; tokenStatus.style.background = 'rgba(255, 152, 0, 0.1)'; tokenStatus.style.borderLeftColor = '#ff9800'; tokenStatus.innerHTML = '⚠ 未检测到 Token - 请先在前端页面登录,然后刷新此页面。测试接口时需要在请求头中添加 Authorization: Bearer token
'; } } // 渲染侧边栏 function renderSidebar() { const groups = new Set(); Object.keys(apiSpec.paths).forEach(path => { Object.keys(apiSpec.paths[path]).forEach(method => { const endpoint = apiSpec.paths[path][method]; if (endpoint.tags && endpoint.tags.length > 0) { endpoint.tags.forEach(tag => groups.add(tag)); } }); }); const groupList = document.getElementById('api-group-list'); const allGroups = Array.from(groups).sort(); allGroups.forEach(group => { const li = document.createElement('li'); li.className = 'api-group-item'; li.innerHTML = `${group}`; groupList.appendChild(li); }); // 绑定点击事件 groupList.querySelectorAll('.api-group-link').forEach(link => { link.addEventListener('click', (e) => { e.preventDefault(); groupList.querySelectorAll('.api-group-link').forEach(l => l.classList.remove('active')); link.classList.add('active'); const group = link.dataset.group; renderEndpoints(group === 'all' ? null : group); }); }); } // 渲染API端点 function renderEndpoints(filterGroup = null) { const main = document.getElementById('api-docs-main'); main.innerHTML = ''; const endpoints = []; Object.keys(apiSpec.paths).forEach(path => { Object.keys(apiSpec.paths[path]).forEach(method => { const endpoint = apiSpec.paths[path][method]; const tags = endpoint.tags || []; if (!filterGroup || filterGroup === 'all' || tags.includes(filterGroup)) { endpoints.push({ path, method, ...endpoint }); } }); }); // 按分组排序 endpoints.sort((a, b) => { const tagA = a.tags && a.tags.length > 0 ? a.tags[0] : ''; const tagB = b.tags && b.tags.length > 0 ? b.tags[0] : ''; if (tagA !== tagB) return tagA.localeCompare(tagB); return a.path.localeCompare(b.path); }); if (endpoints.length === 0) { main.innerHTML = '该分组下没有API端点
| 参数名 | 类型 | 描述 | 必需 |
|---|
${escapeHtml(String(prop.example))}` : '-'}| 参数名 | 类型 | 描述 | 必需 | 示例 |
|---|
${escapeHtml(example)}
${escapeHtml(example)}