176 lines
8.8 KiB
JavaScript
176 lines
8.8 KiB
JavaScript
/**
|
|
* 全量食材库:key 用于消除匹配,img 为 Twemoji PNG(小程序可用)
|
|
*/
|
|
import { getFoodImgUrl } from './gameFoodImg.js'
|
|
|
|
export const GI_LABEL = { low: '低血糖', mid: '中血糖', high: '高血糖' }
|
|
|
|
/** 若实际食用时的升糖幅度(教育提示用,正值=升糖) */
|
|
export function getEatVal(food) {
|
|
if (food.eatVal != null) return food.eatVal
|
|
if (food.gi === 'high') return Math.abs(food.val)
|
|
if (food.gi === 'mid') return Math.max(1, food.val)
|
|
return Math.max(1, Math.abs(food.val))
|
|
}
|
|
|
|
/** 从餐盘消除该食物后的血糖变化(负值=控糖有益) */
|
|
export function getClearVal(food) {
|
|
if (food.clearVal != null) return food.clearVal
|
|
const eat = getEatVal(food)
|
|
if (food.gi === 'high') return -Math.max(8, Math.round(eat * 0.5))
|
|
if (food.gi === 'mid') return -1
|
|
return 0
|
|
}
|
|
|
|
/** 点击食材时的升糖说明文案 */
|
|
export function formatEatLabel(food) {
|
|
if (food.gi === 'low') return '升糖低'
|
|
return `若食用 +${getEatVal(food)}`
|
|
}
|
|
|
|
/** 含糖等级简称:低糖 / 中糖 / 高糖 */
|
|
export const GI_SHORT = { low: '低糖', mid: '中糖', high: '高糖' }
|
|
|
|
/** 含糖等级对应的提示主色(绿 / 橙 / 红) */
|
|
export const GI_COLOR = { low: '#16a34a', mid: '#ea580c', high: '#dc2626' }
|
|
|
|
/** 部分代表食物的专属科普文案(一句话,便于老人记忆) */
|
|
const FOOD_TIP_OVERRIDE = {
|
|
whiteRice: '精制主食,升糖快,建议小份',
|
|
stickyRice: '糯米黏软,升糖很快,要少吃',
|
|
whiteBread: '精制面食,升糖快',
|
|
mantou: '白面馒头,升糖快,配菜一起吃更稳',
|
|
youtiao: '油炸又高糖,少吃为好',
|
|
sugar: '纯糖,升糖最快,尽量不吃',
|
|
maltose: '糖分很高,升糖快',
|
|
soda: '含糖饮料,升糖很快,不建议喝',
|
|
orangeJuice: '果汁含糖高,吃整果更好',
|
|
watermelon: '很甜,升糖快,一次别吃太多',
|
|
donut: '又甜又油,升糖高',
|
|
banana: '偏甜水果,适量吃',
|
|
sweetPotato: '粗粮但有糖,可代替部分主食',
|
|
corn: '粗粮主食,适量吃',
|
|
honey: '本质是糖,别当健康品多吃',
|
|
broccoli: '新鲜蔬菜,升糖很慢,可多吃',
|
|
cucumber: '清爽蔬菜,几乎不升糖',
|
|
lettuce: '绿叶菜,升糖很低,可多吃',
|
|
celery: '高纤维蔬菜,升糖低',
|
|
apple: '带皮整果,升糖较慢',
|
|
milk: '低糖,含蛋白,适量喝好',
|
|
fish: '优质蛋白,升糖低',
|
|
beef: '蛋白为主,升糖低'
|
|
}
|
|
|
|
/** 含糖等级通用科普文案 */
|
|
const GI_TIP_DEFAULT = {
|
|
low: '升糖慢,相对放心,可常吃',
|
|
mid: '升糖中等,注意分量',
|
|
high: '含糖高、升糖快,要少吃'
|
|
}
|
|
|
|
/** 点击食物时展示的一句话科普(认知教育用) */
|
|
export function getFoodTip(food) {
|
|
if (!food) return ''
|
|
if (food.tip) return food.tip
|
|
if (FOOD_TIP_OVERRIDE[food.key]) return FOOD_TIP_OVERRIDE[food.key]
|
|
return GI_TIP_DEFAULT[food.gi] || ''
|
|
}
|
|
|
|
const RAW_FOODS = [
|
|
// 低 GI
|
|
{ key: 'lettuce', icon: '🥬', name: '生菜', gi: 'low', val: -3, color: '#8BC34A' },
|
|
{ key: 'broccoli', icon: '🥦', name: '西兰花', gi: 'low', val: -3, color: '#4E8A3A' },
|
|
{ key: 'apple', icon: '🍎', name: '苹果', gi: 'low', val: -2, color: '#E53935' },
|
|
{ key: 'cucumber', icon: '🥒', name: '黄瓜', gi: 'low', val: -4, color: '#66A82F' },
|
|
{ key: 'eggplant', icon: '🍆', name: '茄子', gi: 'low', val: -3, color: '#7E57C2' },
|
|
{ key: 'tomato', icon: '🍅', name: '番茄', gi: 'low', val: -2, color: '#EF5350' },
|
|
{ key: 'pepper', icon: '🫑', name: '青椒', gi: 'low', val: -3, color: '#43A047' },
|
|
{ key: 'onion', icon: '🧅', name: '洋葱', gi: 'low', val: -2, color: '#CDA06B' },
|
|
{ key: 'pear', icon: '🍐', name: '雪梨', gi: 'low', val: -2, color: '#C0CA33' },
|
|
{ key: 'orange', icon: '🍊', name: '橙子', gi: 'low', val: -2, color: '#FB8C00' },
|
|
{ key: 'peach', icon: '🍑', name: '桃子', gi: 'low', val: -2, color: '#FF8A65' },
|
|
{ key: 'cherry', icon: '🍒', name: '樱桃', gi: 'low', val: -2, color: '#C2185B' },
|
|
{ key: 'grape', icon: '🍇', name: '葡萄', gi: 'low', val: -1, color: '#8E24AA' },
|
|
{ key: 'strawberry', icon: '🍓', name: '草莓', gi: 'low', val: -2, color: '#EC407A' },
|
|
{ key: 'soybean', icon: '🫘', name: '黄豆', gi: 'low', val: -3, color: '#C9A063' },
|
|
{ key: 'milk', icon: '🥛', name: '牛奶', gi: 'low', val: -2, color: '#B0BEC5' },
|
|
{ key: 'tea', icon: '🍵', name: '红茶', gi: 'low', val: -1, color: '#A1573B' },
|
|
{ key: 'mushroom', icon: '🍄', name: '香菇', gi: 'low', val: -3, color: '#8D6E63' },
|
|
{ key: 'celery', icon: '🌿', name: '芹菜', gi: 'low', val: -4, color: '#7CB342' },
|
|
{ key: 'greenBean', icon: '🫛', name: '四季豆', gi: 'low', val: -3, color: '#689F38' },
|
|
|
|
// 中 GI
|
|
{ key: 'brownRice', icon: '🍙', name: '糙米饭', gi: 'mid', val: 4, color: '#C9A26B' },
|
|
{ key: 'sweetPotato', icon: '🍠', name: '番薯', gi: 'mid', val: 5, color: '#C75B39' },
|
|
{ key: 'taro', icon: '🥔', name: '芋头', gi: 'mid', val: 5, color: '#B39DDB' },
|
|
{ key: 'fish', icon: '🐟', name: '鱼肉', gi: 'mid', val: 2, color: '#4FA3C7' },
|
|
{ key: 'chicken', icon: '🍗', name: '鸡肉', gi: 'mid', val: 3, color: '#D6A15A' },
|
|
{ key: 'beef', icon: '🥩', name: '牛肉', gi: 'mid', val: 3, color: '#C0504D' },
|
|
{ key: 'leanMeat', icon: '🍖', name: '瘦肉', gi: 'mid', val: 3, color: '#B5654D' },
|
|
{ key: 'shrimp', icon: '🦐', name: '虾仁', gi: 'mid', val: 2, color: '#FF7043' },
|
|
{ key: 'crab', icon: '🦀', name: '螃蟹', gi: 'mid', val: 2, color: '#F4623A' },
|
|
{ key: 'banana', icon: '🍌', name: '香蕉', gi: 'mid', val: 6, color: '#FDD835' },
|
|
{ key: 'mango', icon: '🥭', name: '芒果', gi: 'mid', val: 6, color: '#FFB300' },
|
|
{ key: 'pineapple', icon: '🍍', name: '菠萝', gi: 'mid', val: 6, color: '#FBC02D' },
|
|
{ key: 'kiwi', icon: '🥝', name: '奇异果', gi: 'mid', val: 4, color: '#9CCC65' },
|
|
{ key: 'melon', icon: '🍈', name: '哈密瓜', gi: 'mid', val: 6, color: '#AED581' },
|
|
{ key: 'honey', icon: '🍯', name: '蜂蜜', gi: 'mid', val: 6, color: '#F9A825' },
|
|
{ key: 'wine', icon: '🍷', name: '红酒', gi: 'mid', val: 4, color: '#9B2C3B' },
|
|
{ key: 'beer', icon: '🍺', name: '啤酒', gi: 'mid', val: 5, color: '#E0A83E' },
|
|
{ key: 'coffee', icon: '☕', name: '咖啡', gi: 'mid', val: 2, color: '#6F4E37' },
|
|
{ key: 'corn', icon: '🌽', name: '玉米', gi: 'mid', val: 5, color: '#F9C513' },
|
|
{ key: 'udon', icon: '🍲', name: '乌冬面', gi: 'mid', val: 5, color: '#D9B88F' },
|
|
|
|
// 高 GI
|
|
{ key: 'whiteRice', icon: '🍚', name: '白米饭', gi: 'high', val: 18, color: '#E0E0E0' },
|
|
{ key: 'whiteBread', icon: '🍞', name: '白面包', gi: 'high', val: 16, color: '#D9A85C' },
|
|
{ key: 'mantou', icon: '🥯', name: '馒头', gi: 'high', val: 17, color: '#ECE0C8' },
|
|
{ key: 'youtiao', icon: '🥖', name: '油条', gi: 'high', val: 20, color: '#D4943F' },
|
|
{ key: 'donut', icon: '🍩', name: '甜甜圈', gi: 'high', val: 22, color: '#E87FB0' },
|
|
{ key: 'popcorn', icon: '🍿', name: '爆米花', gi: 'high', val: 18, color: '#F5E6B3' },
|
|
{ key: 'ramen', icon: '🍜', name: '拉面', gi: 'high', val: 17, color: '#E0A96D' },
|
|
{ key: 'pumpkin', icon: '🎃', name: '南瓜', gi: 'high', val: 15, color: '#EF6C00' },
|
|
{ key: 'bakedPotato', icon: '🍟', name: '焗薯', gi: 'high', val: 20, color: '#F2C14E' },
|
|
{ key: 'watermelon', icon: '🍉', name: '西瓜', gi: 'high', val: 16, color: '#F0506A' },
|
|
{ key: 'sugar', icon: '🍭', name: '砂糖', gi: 'high', val: 25, color: '#FF79B0' },
|
|
{ key: 'maltose', icon: '🍬', name: '麦芽糖', gi: 'high', val: 24, color: '#FFA726' },
|
|
{ key: 'soda', icon: '🥤', name: '汽水', gi: 'high', val: 25, color: '#C62828' },
|
|
{ key: 'orangeJuice', icon: '🧃', name: '柳橙汁', gi: 'high', val: 22, color: '#FF9F1C' },
|
|
{ key: 'stickyRice', icon: '🍡', name: '糯米饭', gi: 'high', val: 19, color: '#F2A7B8' }
|
|
]
|
|
|
|
export const FOOD_LIBRARY = RAW_FOODS.map((f, i) => {
|
|
const eatVal = getEatVal(f)
|
|
const clearVal = getClearVal({ ...f, eatVal })
|
|
return {
|
|
id: i + 1,
|
|
...f,
|
|
eatVal,
|
|
clearVal,
|
|
giLabel: GI_LABEL[f.gi],
|
|
get img() {
|
|
return getFoodImgUrl(f.icon)
|
|
}
|
|
}
|
|
})
|
|
|
|
/** 按 key 查找食材(目标栏等用) */
|
|
export function getFoodByKey(key) {
|
|
return FOOD_LIBRARY.find((f) => f.key === key) || null
|
|
}
|
|
|
|
/** 为棋盘 tile 使用的 plain 对象(img 预计算,避免 getter 在响应式里反复触发) */
|
|
export function cloneFoodType(food) {
|
|
return {
|
|
id: food.id,
|
|
key: food.key,
|
|
icon: food.icon,
|
|
name: food.name,
|
|
gi: food.gi,
|
|
giLabel: food.giLabel,
|
|
val: food.val,
|
|
color: food.color,
|
|
img: getFoodImgUrl(food.icon)
|
|
}
|
|
}
|