آموزش ساخت ابزار محاسبهگر میزان ویتامین دریافتی از ترکیب میوه خشکها.
- محمد یاسر گنجی دوست
- No Comments
آموزش ساخت ابزار “محاسبهگر ویتامین” برای سایت خشکبار: وقتی کدنویسی، مشاور تغذیه میشود
در بازاریابی محتوایی، ابزارهایی که به کاربر “اطلاعات شخصیسازی شده” میدهند، پادشاه هستند. مشتری شما میداند “برگه زردآلو” خوب است، اما نمیداند اگر ۳ عدد زردآلو را با ۵ عدد گردو بخورد، دقیقاً چه اتفاقی در بدنش میافتد.
ابزار “محاسبهگر ویتامین”، به کاربر اجازه میدهد بشقاب مجازی خود را پر کند و در لحظه ببیند که چه ویتامینهایی دریافت کرده است. این ابزار نه تنها جذاب و سرگرمکننده است، بلکه اعتماد مشتری به تخصص شما را نیز بالا میبرد.
در این مقاله تخصصی، ما مراحل ساخت این ابزار را از جمعآوری داده (Data) تا کدنویسی (Development) و بصریسازی (Visualization) بررسی میکنیم.
فاز ۱: معماری دادهها (Database Structure)
قبل از کدنویسی، به داده نیاز داریم. ما باید بدانیم هر ۱۰۰ گرم از هر میوه، چقدر ویتامین دارد. برای سادگی، ما یک آبجکت جاوااسکریپت (JSON) میسازیم که نقش دیتابیس کوچک ما را بازی میکند.
دادههای نمونه (بر اساس USDA):
-
واحدها: ویتامینها بر اساس میلیگرم (mg) یا میکروگرم (mcg) هستند، اما ما برای سادگی محاسبات، همه را نسبت به نیاز روزانه (DV) نرمالسازی میکنیم یا در کد تبدیل میکنیم.
const nutritionData = {
"apricot": {
name: "برگه زردآلو",
vitA: 3604, // IU (واحد بینالمللی)
vitC: 1, // mg
iron: 2.7, // mg
potassium: 1162 // mg
},
"fig": {
name: "انجیر خشک",
vitA: 10,
vitC: 1.2,
iron: 2.0,
potassium: 680
},
"raisin": {
name: "کشمش/مویز",
vitA: 0,
vitC: 2.3,
iron: 1.9,
potassium: 749
},
"walnut": {
name: "گردو",
vitA: 20,
vitC: 1.3,
iron: 2.9,
potassium: 441
},
"kiwi": {
name: "چیپس کیوی",
vitA: 87,
vitC: 150, // بسیار بالا
iron: 0.5,
potassium: 310
}
};
// نیاز روزانه متوسط یک فرد بالغ (Approximate Daily Value)
const dailyNeeds = {
vitA: 5000, // IU
vitC: 90, // mg
iron: 18, // mg
potassium: 4700 // mg
};
فاز ۲: طراحی رابط کاربری (UI)
ما به فضایی نیاز داریم که کاربر میوه را انتخاب کند، وزن را وارد کند و دکمه “افزودن به لیست” را بزند. سپس نمودارهای ویتامین پر شوند.
کد HTML:
<div class="vitamin-tool-wrapper">
<h3>🧪 آزمایشگاه ویتامین خشکبار</h3>
<div class="input-section">
<select id="fruit-selector">
<option value="apricot">برگه زردآلو 🍑</option>
<option value="fig">انجیر خشک</option>
<option value="raisin">کشمش/مویز 🍇</option>
<option value="walnut">گردو 🌰</option>
<option value="kiwi">چیپس کیوی 🥝</option>
</select>
<input type="number" id="fruit-weight" placeholder="وزن (گرم)" value="30">
<button onclick="addItem()" class="add-btn">افزودن به بشقاب</button>
</div>
<div id="selected-list">
<p class="empty-msg">هنوز چیزی انتخاب نکردهاید...</p>
</div>
<div class="results-section">
<h4>📊 ویتامینهای دریافتی (درصد از نیاز روزانه):</h4>
<div class="nutrient-row">
<span>ویتامین A (چشم و پوست)</span>
<div class="progress-bg"><div id="bar-vitA" class="progress-fill" style="width:0%">0%</div></div>
</div>
<div class="nutrient-row">
<span>ویتامین C (ایمنی)</span>
<div class="progress-bg"><div id="bar-vitC" class="progress-fill" style="width:0%">0%</div></div>
</div>
<div class="nutrient-row">
<span>آهن (انرژی و خون)</span>
<div class="progress-bg"><div id="bar-iron" class="progress-fill" style="width:0%">0%</div></div>
</div>
<div class="nutrient-row">
<span>پتاسیم (فشار خون)</span>
<div class="progress-bg"><div id="bar-potassium" class="progress-fill" style="width:0%">0%</div></div>
</div>
</div>
<div class="total-weight-box">
وزن کل مخلوط: <span id="total-grams">0</span> گرم
</div>
</div>
فاز ۳: استایلدهی (CSS)
ظاهر ابزار باید مدرن و جذاب باشد.
.vitamin-tool-wrapper {
background: #fff;
padding: 30px;
border-radius: 12px;
box-shadow: 0 10px 30px rgba(0,0,0,0.05);
font-family: 'Vazir', sans-serif;
max-width: 600px;
margin: 20px auto;
border: 1px solid #eee;
}
.input-section {
display: flex;
gap: 10px;
margin-bottom: 20px;
}
.input-section select, .input-section input {
padding: 10px;
border: 1px solid #ddd;
border-radius: 8px;
flex: 1;
}
.add-btn {
background: #FF9800;
color: white;
border: none;
padding: 10px 20px;
border-radius: 8px;
cursor: pointer;
font-weight: bold;
}
.add-btn:hover { background: #e68900; }
#selected-list {
background: #f9f9f9;
padding: 15px;
border-radius: 8px;
margin-bottom: 20px;
min-height: 50px;
}
.list-item {
display: flex;
justify-content: space-between;
border-bottom: 1px solid #eee;
padding: 5px 0;
font-size: 14px;
}
.remove-item { color: red; cursor: pointer; margin-right: 10px; }
.nutrient-row { margin-bottom: 15px; }
.nutrient-row span { display: block; margin-bottom: 5px; font-size: 14px; color: #555; }
.progress-bg {
background: #eee;
border-radius: 20px;
height: 20px;
width: 100%;
overflow: hidden;
}
.progress-fill {
height: 100%;
background: #4CAF50; /* سبز ویتامین */
color: white;
font-size: 12px;
text-align: center;
line-height: 20px;
transition: width 0.5s ease;
}
/* رنگهای مختلف برای هر ویتامین */
#bar-vitA { background: #FFC107; } /* نارنجی */
#bar-vitC { background: #FF5722; } /* قرمز */
#bar-iron { background: #795548; } /* قهوهای */
#bar-potassium { background: #2196F3; } /* آبی */
فاز ۴: مغز متفکر (JavaScript Logic)
این اسکریپت، محاسبات ریاضی را انجام میدهد و نمودارها را آپدیت میکند.
<script>
// آرایه برای ذخیره اقلامی که کاربر اضافه کرده
let userMix = [];
function addItem() {
const selector = document.getElementById('fruit-selector');
const weightInput = document.getElementById('fruit-weight');
const fruitKey = selector.value;
const weight = parseFloat(weightInput.value);
if (weight <= 0 || isNaN(weight)) {
alert("لطفاً وزن معتبر وارد کنید!");
return;
}
// اضافه کردن به آرایه
userMix.push({
key: fruitKey,
name: nutritionData[fruitKey].name,
weight: weight
});
renderList();
calculateTotals();
}
function removeItem(index) {
userMix.splice(index, 1); // حذف از آرایه
renderList();
calculateTotals();
}
function renderList() {
const listDiv = document.getElementById('selected-list');
listDiv.innerHTML = ""; // پاک کردن لیست قبلی
if (userMix.length === 0) {
listDiv.innerHTML = '<p class="empty-msg">هنوز چیزی انتخاب نکردهاید...</p>';
return;
}
userMix.forEach((item, index) => {
const div = document.createElement('div');
div.className = 'list-item';
div.innerHTML = `
<span>${item.name} (${item.weight} گرم)</span>
<span class="remove-item" onclick="removeItem(${index})">× حذف</span>
`;
listDiv.appendChild(div);
});
}
function calculateTotals() {
// مقادیر اولیه صفر
let totals = { vitA: 0, vitC: 0, iron: 0, potassium: 0, weight: 0 };
// حلقه روی آیتمهای کاربر
userMix.forEach(item => {
const data = nutritionData[item.key];
// فرمول: (مقدار در ۱۰۰ گرم * وزن کاربر) / ۱۰۰
totals.vitA += (data.vitA * item.weight) / 100;
totals.vitC += (data.vitC * item.weight) / 100;
totals.iron += (data.iron * item.weight) / 100;
totals.potassium += (data.potassium * item.weight) / 100;
totals.weight += item.weight;
});
// نمایش وزن کل
document.getElementById('total-grams').innerText = totals.weight;
// محاسبه درصد نیاز روزانه و آپدیت نمودارها
updateBar('bar-vitA', totals.vitA, dailyNeeds.vitA);
updateBar('bar-vitC', totals.vitC, dailyNeeds.vitC);
updateBar('bar-iron', totals.iron, dailyNeeds.iron);
updateBar('bar-potassium', totals.potassium, dailyNeeds.potassium);
}
function updateBar(elementId, currentVal, dailyNeed) {
// محاسبه درصد
let percentage = (currentVal / dailyNeed) * 100;
// محدود کردن به ۱۰۰٪ (برای گرافیک) یا گذاشتن سقف
let displayPercent = Math.round(percentage);
// انتخاب المان
const bar = document.getElementById(elementId);
// آپدیت عرض و متن
bar.style.width = Math.min(displayPercent, 100) + "%"; // عرض از ۱۰۰ بیشتر نشود که بزند بیرون
bar.innerText = displayPercent + "%";
// تغییر رنگ اگر بیش از حد نیاز باشد (مثلاً سبز پررنگ)
if(displayPercent > 100) {
bar.innerText = displayPercent + "% (عالی!)";
bar.style.backgroundColor = "#2E7D32";
}
}
</script>
فاز ۵: ادغام در وردپرس (نحوه استفاده)
امیررضا جان، برای اینکه این ابزار در سایت وردپرسی مشتری کار کند:
-
روش شورتکد (Shortcode):
-
تمام کدهای HTML، CSS (داخل تگ
<style>) و JS (داخل تگ<script>) را در یک فایل متنی کپی کن. -
در فایل
functions.phpقالب چایلد، یک تابع بساز که این محتوا راreturnکند و آن را به یک شورتکد مثل[vitamin_calculator]وصل کن.
-
-
روش المنتور:
-
از ویجت HTML المنتور استفاده کن و کل کدها را یکجا در آن بریز.
-
تکنیکهای UX برای جذابیت بیشتر
-
پیشنهاد هوشمند (Smart Suggestion):
-
در کد JS شرطی بگذار: اگر “آهن” کاربر زیر ۳۰٪ بود، یک پیام زیر نمودار نشان بده: “آهن شما کم است! پیشنهاد میکنیم مویز یا برگه زردآلو اضافه کنید.”
-
این یعنی فروش مکمل (Cross-sell) هوشمندانه.
-
-
دکمه “خرید این ترکیب”:
-
دکمهای بگذار که کاربر وقتی ترکیب دلخواهش را ساخت (مثلاً ۵۰ گرم گردو + ۵۰ گرم کشمش)، با یک کلیک این اقلام را به سبد خرید ووکامرس اضافه کند. (نیاز به کار با URL پارامترهای ووکامرس دارد:
?add-to-cart=ID&quantity=...).
-
بخش پرسش و پاسخ فنی (FAQ)
۱. آیا این اعداد دقیق هستند؟ این اعداد بر اساس دیتابیس USDA (میانگین جهانی) هستند. شما میتوانید در زیر ابزار بنویسید: “این مقادیر تقریبی است و بسته به نوع محصول ممکن است متفاوت باشد.”
۲. آیا این ابزار سایت را کند میکند؟ خیر. این فقط چند کیلوبایت کد HTML و JS است و هیچ درخواستی به دیتابیس (Database Query) ارسال نمیکند. تمام محاسبات در مرورگر کاربر (Client-side) انجام میشود و فوقالعاده سریع است.
۳. آیا میتوانم ویتامینهای بیشتری اضافه کنم؟ بله، به سادگی. کافیست در آرایه nutritionData و dailyNeeds پارامترهای جدید (مثلاً کلسیم یا منیزیم) را اضافه کنید و یک div جدید برای نمودار آن در HTML بسازید.
جمعبندی: ارزشآفرینی با کد
ساخت “محاسبهگر ویتامین”، فقط یک کار فنی نیست؛ یک استراتژی بازاریابی است. شما با این ابزار به کاربر میگویید: “ما فقط آجیلفروش نیستیم؛ ما به سلامتی شما اهمیت میدهیم و ابزار اندازهگیری آن را به شما میدهیم.”
این ابزار باعث میشود کاربران بارها به سایت شما برگردند تا رژیم غذایی خود را چک کنند و این یعنی وفاداری.
🍑 طعم سلامتی با میوههای خشک AsanFruits
انواع میوههای خشک طبیعی و بدون افزودنی، تهیهشده از بهترین محصولات باغی ایران. میانوعدهای سالم، خوشطعم و مغذی برای هر ساعتی از روز.
مشاهده محصولات میوه خشک