Files
Suanming-Web/public/app.js
2026-01-08 17:40:59 +08:00

103 lines
2.9 KiB
JavaScript

const form = document.getElementById('fortune-form');
const statusEl = document.getElementById('status');
const aiTextEl = document.getElementById('ai-text');
const warningsEl = document.getElementById('warnings');
const submitBtn = document.getElementById('submit-btn');
const fillDemoBtn = document.getElementById('fill-demo');
const STATUS_CLASS = ['idle', 'info', 'success', 'error'];
function setStatus(text, variant = 'idle') {
statusEl.textContent = text;
STATUS_CLASS.forEach((cls) => statusEl.classList.remove(cls));
statusEl.classList.add(variant);
}
function buildPayload() {
const formData = new FormData(form);
return {
type: formData.get('type') || 'bazi',
name: (formData.get('name') || '').trim(),
birth_date: formData.get('birth_date'),
birth_time: formData.get('birth_time'),
gender: formData.get('gender'),
is_lunar: formData.get('is_lunar') === 'on',
question: (formData.get('question') || '').trim(),
extra_options: {},
};
}
async function submitForm(event) {
event.preventDefault();
const payload = buildPayload();
setStatus('⏳ 正在分析 ...', 'info');
submitBtn.disabled = true;
try {
const response = await fetch('/api/fortune', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload),
});
const data = await response.json();
if (!response.ok || !data.success) {
throw new Error(data.error?.message || '后端服务异常');
}
renderResult(data.data);
setStatus('✅ 分析完成', 'success');
} catch (error) {
console.error(error);
setStatus(`${error.message}`, 'error');
} finally {
submitBtn.disabled = false;
}
}
function renderResult(result) {
aiTextEl.textContent = (result.ai_text || '').trim();
const warnings = result.meta?.warnings?.filter(Boolean) || [];
if (warnings.length) {
warningsEl.classList.remove('hidden');
warningsEl.innerHTML = warnings.map((w) => `<p>⚠️ ${w}</p>`).join('');
} else {
warningsEl.classList.add('hidden');
warningsEl.textContent = '';
}
}
function fillDemo() {
const now = new Date();
const date = now.toISOString().slice(0, 10);
const time = '08:30';
form.type.value = 'bazi';
form.name.value = '李清扬';
form.gender.value = 'female';
form.birth_date.value = date;
form.birth_time.value = time;
form.is_lunar.checked = false;
form.question.value = '想了解未来三个月的事业机会和财务规划建议。';
setStatus('示例数据已填充,可直接提交。', 'info');
}
function init() {
const defaultDate = '1990-01-01';
const defaultTime = '12:00';
if (!form.birth_date.value) {
form.birth_date.value = defaultDate;
}
if (!form.birth_time.value) {
form.birth_time.value = defaultTime;
}
form.addEventListener('submit', submitForm);
fillDemoBtn.addEventListener('click', fillDemo);
}
init();