205 lines
5.9 KiB
JavaScript
205 lines
5.9 KiB
JavaScript
// 代码解释与修复助手 - 前端JavaScript交互逻辑
|
||
|
||
// DOM元素
|
||
const codeInput = document.getElementById('codeInput');
|
||
const languageSelect = document.getElementById('languageSelect');
|
||
const taskTypeSelect = document.getElementById('taskTypeSelect');
|
||
const depthSelect = document.getElementById('depthSelect');
|
||
const depthGroup = document.getElementById('depthGroup');
|
||
const startBtn = document.getElementById('startBtn');
|
||
const clearBtn = document.getElementById('clearBtn');
|
||
const statusIndicator = document.getElementById('statusIndicator');
|
||
const loadingIndicator = document.getElementById('loadingIndicator');
|
||
const resultContent = document.getElementById('resultContent');
|
||
|
||
// 任务类型切换
|
||
function toggleDepthOption() {
|
||
if (taskTypeSelect.value === 'explain') {
|
||
depthGroup.style.display = 'block';
|
||
} else {
|
||
depthGroup.style.display = 'none';
|
||
}
|
||
}
|
||
|
||
// 初始化事件监听
|
||
function initEventListeners() {
|
||
// 任务类型选择变化
|
||
taskTypeSelect.addEventListener('change', toggleDepthOption);
|
||
|
||
// 开始分析按钮
|
||
startBtn.addEventListener('click', analyzeCode);
|
||
|
||
// 清空按钮
|
||
clearBtn.addEventListener('click', clearAll);
|
||
|
||
// 键盘快捷键
|
||
codeInput.addEventListener('keydown', (e) => {
|
||
// Ctrl+Enter 或 Cmd+Enter 触发分析
|
||
if ((e.ctrlKey || e.metaKey) && e.key === 'Enter') {
|
||
e.preventDefault();
|
||
analyzeCode();
|
||
}
|
||
});
|
||
}
|
||
|
||
// 更新状态显示
|
||
function updateStatus(status, message) {
|
||
statusIndicator.className = `status status-${status}`;
|
||
statusIndicator.innerHTML = `<i class="fas fa-circle"></i> ${message}`;
|
||
}
|
||
|
||
// 显示加载状态
|
||
function showLoading() {
|
||
loadingIndicator.style.display = 'flex';
|
||
resultContent.style.display = 'none';
|
||
}
|
||
|
||
// 隐藏加载状态
|
||
function hideLoading() {
|
||
loadingIndicator.style.display = 'none';
|
||
resultContent.style.display = 'block';
|
||
}
|
||
|
||
// 显示结果
|
||
function showResult(data) {
|
||
if (data.success) {
|
||
resultContent.innerHTML = `
|
||
<div class="result-header">
|
||
<h3>
|
||
<i class="fas fa-check-circle success-icon"></i>
|
||
分析完成
|
||
</h3>
|
||
<div class="task-info">
|
||
<span class="language-tag">${getLanguageName(languageSelect.value)}</span>
|
||
<span class="task-type">${taskTypeSelect.value === 'explain' ? '代码解释' : '代码修复'}</span>
|
||
</div>
|
||
</div>
|
||
<div class="result-body">
|
||
${formatResult(data.result)}
|
||
</div>
|
||
`;
|
||
} else {
|
||
resultContent.innerHTML = `
|
||
<div class="error-state">
|
||
<i class="fas fa-exclamation-circle error-icon"></i>
|
||
<h3>分析失败</h3>
|
||
<p class="error-message">${data.error || '发生未知错误'}</p>
|
||
</div>
|
||
`;
|
||
}
|
||
}
|
||
|
||
// 格式化结果为HTML
|
||
function formatResult(result) {
|
||
if (!result) return '<p>无结果</p>';
|
||
|
||
// 简单的Markdown到HTML转换
|
||
let html = result
|
||
.replace(/^# (.*$)/gm, '<h3>$1</h3>')
|
||
.replace(/^## (.*$)/gm, '<h4>$1</h4>')
|
||
.replace(/`(.*?)`/g, '<code>$1</code>')
|
||
.replace(/```([\s\S]*?)```/g, '<pre><code>$1</code></pre>')
|
||
.replace(/\n/g, '<br>');
|
||
|
||
return html;
|
||
}
|
||
|
||
// 获取语言名称
|
||
function getLanguageName(langCode) {
|
||
const languages = {
|
||
'python': 'Python',
|
||
'javascript': 'JavaScript',
|
||
'typescript': 'TypeScript',
|
||
'java': 'Java',
|
||
'cpp': 'C++',
|
||
'c': 'C',
|
||
'go': 'Go',
|
||
'rust': 'Rust',
|
||
'ruby': 'Ruby',
|
||
'php': 'PHP'
|
||
};
|
||
return languages[langCode] || langCode;
|
||
}
|
||
|
||
// 分析代码
|
||
async function analyzeCode() {
|
||
const code = codeInput.value.trim();
|
||
const language = languageSelect.value;
|
||
const taskType = taskTypeSelect.value;
|
||
const depth = taskType === 'explain' ? depthSelect.value : undefined;
|
||
|
||
// 验证输入
|
||
if (!code) {
|
||
alert('请输入代码后再进行分析');
|
||
codeInput.focus();
|
||
return;
|
||
}
|
||
|
||
// 更新状态
|
||
updateStatus('loading', '正在分析...');
|
||
showLoading();
|
||
|
||
try {
|
||
// 发送请求
|
||
const response = await fetch('/auto', {
|
||
method: 'POST',
|
||
headers: {
|
||
'Content-Type': 'application/json'
|
||
},
|
||
body: JSON.stringify({
|
||
code: code,
|
||
language: language,
|
||
task_type: taskType,
|
||
depth: depth
|
||
})
|
||
});
|
||
|
||
const data = await response.json();
|
||
|
||
// 显示结果
|
||
hideLoading();
|
||
showResult(data);
|
||
updateStatus(data.success ? 'success' : 'error', data.success ? '分析完成' : '分析失败');
|
||
} catch (error) {
|
||
hideLoading();
|
||
updateStatus('error', '请求失败');
|
||
resultContent.innerHTML = `
|
||
<div class="error-state">
|
||
<i class="fas fa-exclamation-circle error-icon"></i>
|
||
<h3>网络错误</h3>
|
||
<p class="error-message">无法连接到服务器,请检查网络连接</p>
|
||
</div>
|
||
`;
|
||
console.error('请求错误:', error);
|
||
}
|
||
}
|
||
|
||
// 清空所有内容
|
||
function clearAll() {
|
||
codeInput.value = '';
|
||
languageSelect.value = 'python';
|
||
taskTypeSelect.value = 'explain';
|
||
depthSelect.value = 'detailed';
|
||
toggleDepthOption();
|
||
|
||
resultContent.innerHTML = `
|
||
<div class="empty-state">
|
||
<i class="fas fa-lightbulb"></i>
|
||
<p>输入代码并点击"开始分析"按钮,获取AI分析结果</p>
|
||
</div>
|
||
`;
|
||
updateStatus('idle', '就绪');
|
||
|
||
codeInput.focus();
|
||
}
|
||
|
||
// 初始化应用
|
||
function initApp() {
|
||
toggleDepthOption();
|
||
initEventListeners();
|
||
codeInput.focus();
|
||
}
|
||
|
||
// 页面加载完成后初始化
|
||
document.addEventListener('DOMContentLoaded', initApp);
|