103 lines
2.9 KiB
JavaScript
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();
|