Files
recommend/static/js/data_collection.js
赵杰 Jie Zhao (雄狮汽车科技) 20bbda37e9 chore: update code 周一-2025-11 17:11
2025-11-03 17:11:28 +08:00

194 lines
6.5 KiB
JavaScript

// 数据采集功能脚本
let currentUserId = null;
// DOM元素
const loginSection = document.getElementById('loginSection');
const basicQuestionnaire = document.getElementById('basicQuestionnaire');
const mealRecord = document.getElementById('mealRecord');
const messageArea = document.getElementById('messageArea');
const loginBtn = document.getElementById('loginBtn');
const userIdInput = document.getElementById('userId');
const userNameInput = document.getElementById('userName');
const submitBasicBtn = document.getElementById('submitBasicBtn');
const submitMealBtn = document.getElementById('submitMealBtn');
// 显示消息
function showMessage(message, type = 'info') {
messageArea.textContent = message;
messageArea.className = `message-area ${type}`;
messageArea.style.display = 'block';
setTimeout(() => {
messageArea.className = 'message-area';
messageArea.style.display = 'none';
}, 3000);
}
// 用户登录/注册
loginBtn.addEventListener('click', async () => {
const userId = userIdInput.value.trim();
const userName = userNameInput.value.trim();
if (!userId || !userName) {
showMessage('请输入用户ID和姓名', 'error');
return;
}
loginBtn.disabled = true;
loginBtn.textContent = '登录中...';
try {
const response = await fetch('/api/user/register', {
method: 'POST',
headers: {
'Content-Type': 'application/json; charset=utf-8'
},
body: JSON.stringify({
user_id: userId,
name: userName
})
});
const data = await response.json();
if (data.success) {
currentUserId = userId;
loginSection.style.display = 'none';
basicQuestionnaire.style.display = 'block';
mealRecord.style.display = 'block';
showMessage('注册成功!', 'success');
} else {
showMessage(data.message || '注册失败', 'error');
}
} catch (error) {
console.error('注册失败:', error);
showMessage('注册失败,请检查网络连接', 'error');
} finally {
loginBtn.disabled = false;
loginBtn.textContent = '登录/注册';
}
});
// 提交基础信息
submitBasicBtn.addEventListener('click', async () => {
const age = document.getElementById('age').value;
const gender = document.getElementById('gender').value;
const height = document.getElementById('height').value;
const weight = document.getElementById('weight').value;
const activityLevel = document.getElementById('activityLevel').value;
if (!age || !gender || !height || !weight || !activityLevel) {
showMessage('请填写完整的基础信息', 'error');
return;
}
submitBasicBtn.disabled = true;
submitBasicBtn.textContent = '提交中...';
try {
const response = await fetch('/api/questionnaire/submit', {
method: 'POST',
headers: {
'Content-Type': 'application/json; charset=utf-8'
},
body: JSON.stringify({
user_id: currentUserId,
type: 'basic',
answers: {
age: parseInt(age),
gender: gender,
height: parseFloat(height),
weight: parseFloat(weight),
activity_level: activityLevel
}
})
});
const data = await response.json();
if (data.success) {
showMessage('基础信息提交成功!', 'success');
} else {
showMessage(data.message || '提交失败', 'error');
}
} catch (error) {
console.error('提交失败:', error);
showMessage('提交失败,请检查网络连接', 'error');
} finally {
submitBasicBtn.disabled = false;
submitBasicBtn.textContent = '提交基础信息';
}
});
// 记录餐食
submitMealBtn.addEventListener('click', async () => {
const mealDate = document.getElementById('mealDate').value || new Date().toISOString().split('T')[0];
const mealType = document.getElementById('mealType').value;
const foodsText = document.getElementById('foods').value;
const calories = document.getElementById('calories').value;
const satisfaction = document.getElementById('satisfaction').value;
if (!foodsText || !calories) {
showMessage('请填写完整的餐食信息', 'error');
return;
}
// 解析食物列表
const foods = foodsText.split('\n').filter(line => line.trim());
const quantities = foods.map(f => {
const parts = f.trim().split(/\s+/);
return parts.length > 1 ? parts.slice(1).join(' ') : '适量';
});
const foodNames = foods.map(f => f.trim().split(/\s+/)[0]);
submitMealBtn.disabled = true;
submitMealBtn.textContent = '记录中...';
try {
const response = await fetch('/api/meal/record', {
method: 'POST',
headers: {
'Content-Type': 'application/json; charset=utf-8'
},
body: JSON.stringify({
user_id: currentUserId,
date: mealDate,
meal_type: mealType,
foods: foodNames,
quantities: quantities,
calories: parseFloat(calories),
satisfaction_score: parseInt(satisfaction),
notes: ''
})
});
const data = await response.json();
if (data.success) {
showMessage('餐食记录成功!', 'success');
// 清空表单
document.getElementById('foods').value = '';
document.getElementById('calories').value = '';
document.getElementById('satisfaction').value = '3';
} else {
showMessage(data.message || '记录失败', 'error');
}
} catch (error) {
console.error('记录失败:', error);
showMessage('记录失败,请检查网络连接', 'error');
} finally {
submitMealBtn.disabled = false;
submitMealBtn.textContent = '记录餐食';
}
});
// 设置默认日期为今天
document.addEventListener('DOMContentLoaded', () => {
const mealDateInput = document.getElementById('mealDate');
if (mealDateInput) {
mealDateInput.value = new Date().toISOString().split('T')[0];
}
});