project structure: elm.py, db.py, prompts.py, diagnose.py, web UI (Flask), config
This commit is contained in:
@@ -0,0 +1,104 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Elmer — Диагностика авто</title>
|
||||
<link rel="stylesheet" href="/static/style.css">
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<h1>🔧 Elmer</h1>
|
||||
<p class="subtitle">Диагностика через ELM327 + ИИ</p>
|
||||
|
||||
<button id="btn-diagnose" onclick="runDiagnose()">
|
||||
🚗 Подключить и диагностировать
|
||||
</button>
|
||||
|
||||
<div id="status"></div>
|
||||
|
||||
<div id="result" style="display:none;">
|
||||
<div class="card" id="vin-card">
|
||||
<h2>📋 VIN</h2>
|
||||
<code id="vin-value"></code>
|
||||
</div>
|
||||
|
||||
<div class="card" id="dtc-card">
|
||||
<h2>⚠️ Коды ошибок</h2>
|
||||
<div id="dtc-list"></div>
|
||||
</div>
|
||||
|
||||
<div class="card" id="params-card">
|
||||
<h2>📊 Параметры</h2>
|
||||
<div id="params-list"></div>
|
||||
</div>
|
||||
|
||||
<div class="card diagnosis-card">
|
||||
<h2>🧠 Диагноз</h2>
|
||||
<div id="diagnosis-text"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
async function runDiagnose() {
|
||||
const btn = document.getElementById('btn-diagnose');
|
||||
const status = document.getElementById('status');
|
||||
const result = document.getElementById('result');
|
||||
|
||||
btn.disabled = true;
|
||||
btn.textContent = '⏳ Читаю данные с ЭБУ...';
|
||||
status.innerHTML = '<div class="spinner"></div> Идёт диагностика...';
|
||||
|
||||
try {
|
||||
const resp = await fetch('/api/diagnose', { method: 'POST' });
|
||||
const data = await resp.json();
|
||||
|
||||
if (!resp.ok) {
|
||||
status.innerHTML = `<div class="error">❌ ${data.error}</div>`;
|
||||
btn.disabled = false;
|
||||
btn.textContent = '🔄 Попробовать снова';
|
||||
return;
|
||||
}
|
||||
|
||||
// VIN
|
||||
document.getElementById('vin-value').textContent = data.vin;
|
||||
|
||||
// DTC
|
||||
const dtcList = document.getElementById('dtc-list');
|
||||
if (data.dtc_codes.length === 0) {
|
||||
dtcList.innerHTML = '<p class="ok">✅ Ошибок нет</p>';
|
||||
} else {
|
||||
dtcList.innerHTML = data.dtc_codes
|
||||
.map(d => `<span class="dtc-badge ${d.status}">${d.code} [${d.status}]</span>`)
|
||||
.join('');
|
||||
}
|
||||
|
||||
// Parameters
|
||||
const paramsList = document.getElementById('params-list');
|
||||
paramsList.innerHTML = data.parameters
|
||||
.map(p => `<div class="param-row"><span>${p.name}</span><strong>${p.value} ${p.unit}</strong></div>`)
|
||||
.join('');
|
||||
|
||||
// Diagnosis — markdown to html (simple)
|
||||
document.getElementById('diagnosis-text').innerHTML =
|
||||
data.diagnosis
|
||||
.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>')
|
||||
.replace(/^### (.+)$/gm, '<h3>$1</h3>')
|
||||
.replace(/^## (.+)$/gm, '<h2>$1</h2>')
|
||||
.replace(/\*\*(.+?)\*\*/g, '<strong>$1</strong>')
|
||||
.replace(/\n/g, '<br>');
|
||||
|
||||
result.style.display = 'block';
|
||||
status.innerHTML = '<div class="ok">✅ Диагностика завершена. Сохранено в базу.</div>';
|
||||
btn.textContent = '🔄 Диагностировать заново';
|
||||
|
||||
} catch (err) {
|
||||
status.innerHTML = `<div class="error">❌ Ошибка: ${err.message}</div>`;
|
||||
}
|
||||
|
||||
btn.disabled = false;
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user