diff --git a/static/js/analysis.js b/static/js/analysis.js index 6b368b4..762c9d5 100644 --- a/static/js/analysis.js +++ b/static/js/analysis.js @@ -1,8 +1,8 @@ -// 分析功能脚本 +// 钀ュ吇鍒嗘瀽鍔熻兘鑴氭湰 let currentUserId = null; -// DOM元素 +// DOM鍏冪礌 const loginSection = document.getElementById('loginSection'); const requestSection = document.getElementById('requestSection'); const analysisSection = document.getElementById('analysisSection'); @@ -14,27 +14,28 @@ const analyzeBtn = document.getElementById('analyzeBtn'); const mealDataTextarea = document.getElementById('mealData'); const analysisResult = document.getElementById('analysisResult'); -// 显示消息 +// 鏄剧ず娑堟伅 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(); if (!userId) { - showMessage('请输入用户ID', 'error'); + showMessage('璇疯緭鍏ョ敤鎴稩D', 'error'); return; } loginBtn.disabled = true; - loginBtn.textContent = '登录中...'; + loginBtn.textContent = '鐧诲綍涓...'; try { const response = await fetch('/api/user/login', { @@ -53,30 +54,30 @@ loginBtn.addEventListener('click', async () => { currentUserId = userId; loginSection.style.display = 'none'; requestSection.style.display = 'block'; - showMessage(`欢迎,${data.name || userId}!`, 'success'); + showMessage(`娆㈣繋锛${data.name || userId}锛乣, 'success'); } else { - showMessage(data.message || '登录失败', 'error'); + showMessage(data.message || '鐧诲綍澶辫触', 'error'); } } catch (error) { - console.error('登录失败:', error); - showMessage('登录失败,请检查网络连接', 'error'); + console.error('鐧诲綍澶辫触:', error); + showMessage('鐧诲綍澶辫触锛岃妫鏌ョ綉缁滆繛鎺', 'error'); } finally { loginBtn.disabled = false; - loginBtn.textContent = '登录'; + loginBtn.textContent = '鐧诲綍'; } }); -// 开始分析 +// 寮濮嬪垎鏋 analyzeBtn.addEventListener('click', async () => { const mealDataText = mealDataTextarea.value.trim(); if (!mealDataText) { - showMessage('请输入餐食信息', 'error'); + showMessage('璇疯緭鍏ラ椋熶俊鎭', 'error'); return; } analyzeBtn.disabled = true; - analyzeBtn.textContent = '分析中...'; + analyzeBtn.textContent = '鍒嗘瀽涓...'; try { const response = await fetch('/api/analysis/nutrition', { @@ -97,37 +98,47 @@ analyzeBtn.addEventListener('click', async () => { if (data.success && data.analysis) { displayAnalysis(data.analysis); analysisSection.style.display = 'block'; - showMessage('分析完成!', 'success'); + showMessage('鍒嗘瀽瀹屾垚锛', 'success'); } else { - showMessage(data.message || '分析失败', 'error'); + showMessage(data.message || '鍒嗘瀽澶辫触', 'error'); } } catch (error) { - console.error('分析失败:', error); - showMessage('分析失败,请检查网络连接', 'error'); + console.error('鍒嗘瀽澶辫触:', error); + showMessage('鍒嗘瀽澶辫触锛岃妫鏌ョ綉缁滆繛鎺', 'error'); } finally { analyzeBtn.disabled = false; - analyzeBtn.textContent = '开始分析'; + analyzeBtn.textContent = '寮濮嬪垎鏋'; } }); -// 显示分析结果 +// 鏄剧ず鍒嗘瀽缁撴灉 function displayAnalysis(analysis) { analysisResult.innerHTML = ''; if (typeof analysis === 'string') { - // 如果是字符串,直接显示 - analysisResult.innerHTML = `
${analysis.replace(/\n/g, '
')}
${escapeHtml(analysis).replace(/\n/g, '
')}
${analysis.analysis.replace(/\n/g, '
')}
${escapeHtml(analysis.analysis).replace(/\n/g, '
')}
${typeof value === 'string' ? value.replace(/\n/g, '
') : JSON.stringify(value, null, 2)}
${displayValue}
`; analysisResult.appendChild(section); } } } +// HTML杞箟鍑芥暟锛岄槻姝SS鏀诲嚮 +function escapeHtml(text) { + const div = document.createElement('div'); + div.textContent = text; + return div.innerHTML; +} diff --git a/static/js/data_collection.js b/static/js/data_collection.js index b1fa46c..5e172b6 100644 --- a/static/js/data_collection.js +++ b/static/js/data_collection.js @@ -1,8 +1,8 @@ -// 数据采集功能脚本 +// 鏁版嵁閲囬泦鍔熻兘鑴氭湰 let currentUserId = null; -// DOM元素 +// DOM鍏冪礌 const loginSection = document.getElementById('loginSection'); const basicQuestionnaire = document.getElementById('basicQuestionnaire'); const mealRecord = document.getElementById('mealRecord'); @@ -15,28 +15,29 @@ 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'); + showMessage('璇疯緭鍏ョ敤鎴稩D鍜屽鍚', 'error'); return; } loginBtn.disabled = true; - loginBtn.textContent = '登录中...'; + loginBtn.textContent = '鐧诲綍涓...'; try { const response = await fetch('/api/user/register', { @@ -57,20 +58,20 @@ loginBtn.addEventListener('click', async () => { loginSection.style.display = 'none'; basicQuestionnaire.style.display = 'block'; mealRecord.style.display = 'block'; - showMessage('登录成功!', 'success'); + showMessage('娉ㄥ唽鎴愬姛锛', 'success'); } else { - showMessage(data.message || '登录失败', 'error'); + showMessage(data.message || '娉ㄥ唽澶辫触', 'error'); } } catch (error) { - console.error('登录失败:', error); - showMessage('登录失败,请检查网络连接', 'error'); + console.error('娉ㄥ唽澶辫触:', error); + showMessage('娉ㄥ唽澶辫触锛岃妫鏌ョ綉缁滆繛鎺', 'error'); } finally { loginBtn.disabled = false; - loginBtn.textContent = '登录/注册'; + loginBtn.textContent = '鐧诲綍/娉ㄥ唽'; } }); -// 提交基础信息 +// 鎻愪氦鍩虹淇℃伅 submitBasicBtn.addEventListener('click', async () => { const age = document.getElementById('age').value; const gender = document.getElementById('gender').value; @@ -79,12 +80,12 @@ submitBasicBtn.addEventListener('click', async () => { const activityLevel = document.getElementById('activityLevel').value; if (!age || !gender || !height || !weight || !activityLevel) { - showMessage('请填写完整的基础信息', 'error'); + showMessage('璇峰~鍐欏畬鏁寸殑鍩虹淇℃伅', 'error'); return; } submitBasicBtn.disabled = true; - submitBasicBtn.textContent = '提交中...'; + submitBasicBtn.textContent = '鎻愪氦涓...'; try { const response = await fetch('/api/questionnaire/submit', { @@ -108,20 +109,20 @@ submitBasicBtn.addEventListener('click', async () => { const data = await response.json(); if (data.success) { - showMessage('基础信息提交成功!', 'success'); + showMessage('鍩虹淇℃伅鎻愪氦鎴愬姛锛', 'success'); } else { - showMessage(data.message || '提交失败', 'error'); + showMessage(data.message || '鎻愪氦澶辫触', 'error'); } } catch (error) { - console.error('提交失败:', error); - showMessage('提交失败,请检查网络连接', 'error'); + console.error('鎻愪氦澶辫触:', error); + showMessage('鎻愪氦澶辫触锛岃妫鏌ョ綉缁滆繛鎺', 'error'); } finally { submitBasicBtn.disabled = false; - submitBasicBtn.textContent = '提交基础信息'; + submitBasicBtn.textContent = '鎻愪氦鍩虹淇℃伅'; } }); -// 记录餐食 +// 璁板綍椁愰 submitMealBtn.addEventListener('click', async () => { const mealDate = document.getElementById('mealDate').value || new Date().toISOString().split('T')[0]; const mealType = document.getElementById('mealType').value; @@ -130,20 +131,20 @@ submitMealBtn.addEventListener('click', async () => { const satisfaction = document.getElementById('satisfaction').value; if (!foodsText || !calories) { - showMessage('请填写完整的餐食信息', 'error'); + showMessage('璇峰~鍐欏畬鏁寸殑椁愰淇℃伅', 'error'); return; } - // 解析食物列表 + // 瑙f瀽椋熺墿鍒楄〃 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(' ') : '适量'; + return parts.length > 1 ? parts.slice(1).join(' ') : '閫傞噺'; }); const foodNames = foods.map(f => f.trim().split(/\s+/)[0]); submitMealBtn.disabled = true; - submitMealBtn.textContent = '记录中...'; + submitMealBtn.textContent = '璁板綍涓...'; try { const response = await fetch('/api/meal/record', { @@ -166,28 +167,27 @@ submitMealBtn.addEventListener('click', async () => { const data = await response.json(); if (data.success) { - showMessage('餐食记录成功!', 'success'); - // 清空表单 + showMessage('椁愰璁板綍鎴愬姛锛', 'success'); + // 娓呯┖琛ㄥ崟 document.getElementById('foods').value = ''; document.getElementById('calories').value = ''; document.getElementById('satisfaction').value = '3'; } else { - showMessage(data.message || '记录失败', 'error'); + showMessage(data.message || '璁板綍澶辫触', 'error'); } } catch (error) { - console.error('记录失败:', error); - showMessage('记录失败,请检查网络连接', 'error'); + console.error('璁板綍澶辫触:', error); + showMessage('璁板綍澶辫触锛岃妫鏌ョ綉缁滆繛鎺', 'error'); } finally { submitMealBtn.disabled = false; - submitMealBtn.textContent = '记录餐食'; + submitMealBtn.textContent = '璁板綍椁愰'; } }); -// 设置默认日期为今天 +// 璁剧疆榛樿鏃ユ湡涓轰粖澶 document.addEventListener('DOMContentLoaded', () => { const mealDateInput = document.getElementById('mealDate'); if (mealDateInput) { mealDateInput.value = new Date().toISOString().split('T')[0]; } }); - diff --git a/static/js/recommendation.js b/static/js/recommendation.js index a9fafaa..39555be 100644 --- a/static/js/recommendation.js +++ b/static/js/recommendation.js @@ -1,8 +1,8 @@ -// 推荐功能脚本 +// 鎺ㄨ崘鍔熻兘鑴氭湰 let currentUserId = null; -// DOM元素 +// DOM鍏冪礌 const loginSection = document.getElementById('loginSection'); const requestSection = document.getElementById('requestSection'); const recommendationsSection = document.getElementById('recommendationsSection'); @@ -14,27 +14,28 @@ const getRecommendationBtn = document.getElementById('getRecommendationBtn'); const mealTypeSelect = document.getElementById('mealType'); const recommendationsList = document.getElementById('recommendationsList'); -// 显示消息 +// 鏄剧ず娑堟伅 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(); if (!userId) { - showMessage('请输入用户ID', 'error'); + showMessage('璇疯緭鍏ョ敤鎴稩D', 'error'); return; } loginBtn.disabled = true; - loginBtn.textContent = '登录中...'; + loginBtn.textContent = '鐧诲綍涓...'; try { const response = await fetch('/api/user/login', { @@ -53,25 +54,25 @@ loginBtn.addEventListener('click', async () => { currentUserId = userId; loginSection.style.display = 'none'; requestSection.style.display = 'block'; - showMessage(`欢迎,${data.name || userId}!`, 'success'); + showMessage(`娆㈣繋锛${data.name || userId}锛乣, 'success'); } else { - showMessage(data.message || '登录失败', 'error'); + showMessage(data.message || '鐧诲綍澶辫触', 'error'); } } catch (error) { - console.error('登录失败:', error); - showMessage('登录失败,请检查网络连接', 'error'); + console.error('鐧诲綍澶辫触:', error); + showMessage('鐧诲綍澶辫触锛岃妫鏌ョ綉缁滆繛鎺', 'error'); } finally { loginBtn.disabled = false; - loginBtn.textContent = '登录'; + loginBtn.textContent = '鐧诲綍'; } }); -// 获取推荐 +// 鑾峰彇鎺ㄨ崘 getRecommendationBtn.addEventListener('click', async () => { const mealType = mealTypeSelect.value; getRecommendationBtn.disabled = true; - getRecommendationBtn.textContent = '获取中...'; + getRecommendationBtn.textContent = '鑾峰彇涓...'; try { const response = await fetch('/api/recommendation/get', { @@ -92,20 +93,20 @@ getRecommendationBtn.addEventListener('click', async () => { if (data.success && data.recommendations && data.recommendations.length > 0) { displayRecommendations(data.recommendations); recommendationsSection.style.display = 'block'; - showMessage('推荐获取成功!', 'success'); + showMessage('鎺ㄨ崘鑾峰彇鎴愬姛锛', 'success'); } else { - showMessage(data.message || '暂无推荐,请先完善个人数据', 'info'); + showMessage(data.message || '鏆傛棤鎺ㄨ崘鍐呭锛岃鍏堝畬鍠勪釜浜烘暟鎹', 'info'); } } catch (error) { - console.error('获取推荐失败:', error); - showMessage('获取推荐失败,请检查网络连接', 'error'); + console.error('鑾峰彇鎺ㄨ崘澶辫触:', error); + showMessage('鑾峰彇鎺ㄨ崘澶辫触锛岃妫鏌ョ綉缁滆繛鎺', 'error'); } finally { getRecommendationBtn.disabled = false; - getRecommendationBtn.textContent = '获取推荐'; + getRecommendationBtn.textContent = '鑾峰彇鎺ㄨ崘'; } }); -// 显示推荐结果 +// 鏄剧ず鎺ㄨ崘缁撴灉 function displayRecommendations(recommendations) { recommendationsList.innerHTML = ''; @@ -120,16 +121,34 @@ function displayRecommendations(recommendations) { foods = [rec.food]; } + const foodsHtml = foods.map(food => + `AI营虢
+AI鏅鸿兘钀ュ吇鍒嗘瀽