
鸿蒙智能冰箱管家应用开发指南 原创
鸿蒙智能冰箱管家应用开发指南
一、系统架构设计
基于HarmonyOS的分布式能力和AI技术,我们设计了一套智能冰箱管理系统,主要功能包括:
食品识别:通过图像识别记录放入冰箱的食品
库存管理:实时跟踪冰箱内食品库存状态
过期提醒:智能预测食品保质期并提前提醒
多设备协同:家庭成员共享冰箱库存信息
食谱推荐:根据现有食材推荐合适食谱
!https://example.com/harmony-smart-fridge-arch.png
二、核心代码实现
食品识别服务
// FoodRecognitionService.ets
import camera from ‘@ohos.multimedia.camera’;
import image from ‘@ohos.multimedia.image’;
import foodai from ‘@ohos.ai.food’;
class FoodRecognitionService {
private static instance: FoodRecognitionService;
private cameraManager: camera.CameraManager;
private foodDetector: foodai.FoodDetector;
private cameraInput: camera.CameraInput | null = null;
private previewOutput: camera.PreviewOutput | null = null;
private photoOutput: camera.PhotoOutput | null = null;
private constructor() {
this.cameraManager = camera.getCameraManager();
this.foodDetector = foodai.createFoodDetector();
public static getInstance(): FoodRecognitionService {
if (!FoodRecognitionService.instance) {
FoodRecognitionService.instance = new FoodRecognitionService();
return FoodRecognitionService.instance;
public async initCamera(previewSurfaceId: string): Promise<void> {
const cameras = this.cameraManager.getSupportedCameras();
if (cameras.length === 0) {
throw new Error('No camera available');
this.cameraInput = this.cameraManager.createCameraInput(cameras[0]);
await this.cameraInput.open();
const previewProfile = this.cameraManager.getSupportedOutputCapability(
cameras[0],
camera.ProfileMode.PROFILE_MODE_DEFAULT
).previewProfiles[0];
this.previewOutput = this.cameraManager.createPreviewOutput(
previewProfile,
previewSurfaceId
);
const photoProfiles = this.cameraManager.getSupportedOutputCapability(
cameras[0],
camera.ProfileMode.PROFILE_MODE_DEFAULT
).photoProfiles;
this.photoOutput = this.cameraManager.createPhotoOutput(
photoProfiles[0]
);
public async recognizeFood(image: image.Image): Promise<FoodItem[]> {
const detectionOptions = {
featureType: foodai.FeatureType.FEATURE_TYPE_FOOD_RECOGNITION,
processMode: foodai.ProcessMode.PROCESS_MODE_FAST
};
return new Promise((resolve, reject) => {
this.foodDetector.detect(image, detectionOptions, (err, result) => {
if (err) {
reject(err);
else {
resolve(this.processFoodResult(result));
});
});
private processFoodResult(rawData: any): FoodItem[] {
if (!rawData || !rawData.foods) return [];
return rawData.foods.map((food: any) => ({
id: generateId(),
name: food.name || '未知食品',
category: food.category || '其他',
confidence: food.confidence || 0,
expirationDays: food.expirationDays || 7,
image: food.image || null,
recognizedAt: Date.now()
}));
public async takeFoodPhoto(): Promise<image.Image> {
if (!this.photoOutput) {
throw new Error('Photo output not initialized');
const photoSettings = {
quality: camera.QualityLevel.QUALITY_LEVEL_HIGH,
rotation: camera.ImageRotation.ROTATION_0
};
return new Promise((resolve, reject) => {
this.photoOutput!.capture(photoSettings, (err, image) => {
if (err) {
reject(err);
else {
resolve(image);
});
});
}
export const foodRecognitionService = FoodRecognitionService.getInstance();
库存管理服务
// InventoryService.ets
import distributedData from ‘@ohos.data.distributedData’;
class InventoryService {
private static instance: InventoryService;
private kvManager: distributedData.KVManager;
private kvStore: distributedData.KVStore;
private constructor() {
this.initKVStore();
private async initKVStore(): Promise<void> {
const config = {
bundleName: 'com.example.smartFridge',
userInfo: { userId: 'currentUser' }
};
this.kvManager = distributedData.createKVManager(config);
this.kvStore = await this.kvManager.getKVStore('fridge_inventory', {
createIfMissing: true
});
this.kvStore.on('dataChange', (data) => {
this.handleRemoteUpdate(data);
});
public static getInstance(): InventoryService {
if (!InventoryService.instance) {
InventoryService.instance = new InventoryService();
return InventoryService.instance;
public async addFoodItem(item: FoodItem): Promise<void> {
const inventory = await this.getInventory();
inventory.items.push(item);
await this.kvStore.put('inventory', JSON.stringify(inventory));
public async removeFoodItem(itemId: string): Promise<void> {
const inventory = await this.getInventory();
inventory.items = inventory.items.filter(item => item.id !== itemId);
await this.kvStore.put('inventory', JSON.stringify(inventory));
public async updateFoodItem(updatedItem: FoodItem): Promise<void> {
const inventory = await this.getInventory();
const index = inventory.items.findIndex(item => item.id === updatedItem.id);
if (index >= 0) {
inventory.items[index] = updatedItem;
await this.kvStore.put('inventory', JSON.stringify(inventory));
}
public async getInventory(): Promise<FridgeInventory> {
const value = await this.kvStore.get(‘inventory’);
return value ? JSON.parse(value) : { items: [] };
public async getFoodItem(itemId: string): Promise<FoodItem | null> {
const inventory = await this.getInventory();
return inventory.items.find(item => item.id === itemId) || null;
public async getExpiringSoonItems(days: number = 3): Promise<FoodItem[]> {
const inventory = await this.getInventory();
const now = Date.now();
return inventory.items.filter(item => {
const expirationDate = item.addedAt + item.expirationDays 24 60 60 1000;
return expirationDate - now <= days 24 60 60 1000;
});
private handleRemoteUpdate(data: distributedData.ChangeInfo): void {
if (data.deviceId === deviceInfo.deviceId) return;
if (data.key === 'inventory') {
const inventory = JSON.parse(data.value);
EventBus.emit('inventoryUpdated', inventory);
}
export const inventoryService = InventoryService.getInstance();
过期提醒服务
// ExpirationService.ets
import reminderAgent from ‘@ohos.reminderAgent’;
class ExpirationService {
private static instance: ExpirationService;
private constructor() {}
public static getInstance(): ExpirationService {
if (!ExpirationService.instance) {
ExpirationService.instance = new ExpirationService();
return ExpirationService.instance;
public async checkExpirations(): Promise<void> {
const expiringItems = await inventoryService.getExpiringSoonItems();
if (expiringItems.length > 0) {
await this.scheduleExpirationReminders(expiringItems);
}
private async scheduleExpirationReminders(items: FoodItem[]): Promise<void> {
await this.cancelAllReminders();
for (const item of items) {
const expirationDate = new Date(item.addedAt + item.expirationDays 24 60 60 1000);
const reminderTime = new Date(expirationDate);
reminderTime.setDate(reminderTime.getDate() - 1); // 提前1天提醒
const reminderRequest: reminderAgent.ReminderRequest = {
reminderType: reminderAgent.ReminderType.REMINDER_TYPE_TIMER,
actionButton: [{ title: '已处理' }, { title: '稍后提醒' }],
wantAgent: {
pkgName: 'com.example.smartFridge',
abilityName: 'ExpirationReminderAbility'
},
triggerTime: reminderTime.getTime(),
title: ${item.name}即将过期,
content: {item.name}将在{formatDate(expirationDate)}过期,请尽快食用,
expiredContent: ${item.name}已过期
};
await reminderAgent.publishReminder(reminderRequest);
}
public async cancelAllReminders(): Promise<void> {
const reminders = await reminderAgent.getValidReminders();
await Promise.all(reminders.map(rem =>
reminderAgent.cancelReminder(rem.id)
));
public async getFoodExpirationInfo(item: FoodItem): Promise<ExpirationInfo> {
const now = Date.now();
const addedDate = new Date(item.addedAt);
const expirationDate = new Date(item.addedAt + item.expirationDays 24 60 60 1000);
const remainingDays = Math.ceil((expirationDate.getTime() - now) / (24 60 60 * 1000));
return {
addedDate: formatDate(addedDate),
expirationDate: formatDate(expirationDate),
remainingDays,
status: remainingDays <= 0 ? 'expired' : remainingDays <= 3 ? 'soon' : 'good'
};
}
export const expirationService = ExpirationService.getInstance();
function formatDate(date: Date): string {
return {date.getFullYear()}-{date.getMonth() + 1}-${date.getDate()};
三、主界面实现
冰箱库存界面
// FridgeView.ets
@Component
struct FridgeView {
@State inventory: FridgeInventory = { items: [] };
@State isAdding: boolean = false;
@State selectedCategory: string = ‘全部’;
aboutToAppear() {
this.loadInventory();
EventBus.on(‘inventoryUpdated’, () => this.loadInventory());
build() {
Column() {
// 标题和添加按钮
Row() {
Text('我的冰箱')
.fontSize(24)
.fontWeight(FontWeight.Bold)
.layoutWeight(1)
Button('添加食品')
.onClick(() => this.isAdding = true)
.margin({ top: 16 })
// 分类筛选
Picker({ range: this.getCategories(), selected: this.getCategoryIndex() })
.onChange((index: number) => {
this.selectedCategory = this.getCategories()[index];
})
.margin({ top: 8 })
// 库存列表
if (this.inventory.items.length === 0) {
Text('冰箱是空的,添加一些食品吧')
.fontSize(16)
.margin({ top: 32 })
else {
List({ space: 10 }) {
ForEach(this.getFilteredItems(), (item) => {
ListItem() {
FoodItemView({
item,
onRemove: () => this.removeItem(item.id),
onUpdate: (updated) => this.updateItem(updated)
})
})
.layoutWeight(1)
}
.padding(16)
// 添加食品弹窗
if (this.isAdding) {
AddFoodDialog({
onAdd: (item) => this.addItem(item),
onCancel: () => this.isAdding = false
})
}
private async loadInventory(): Promise<void> {
this.inventory = await inventoryService.getInventory();
private async addItem(item: FoodItem): Promise<void> {
await inventoryService.addFoodItem(item);
this.isAdding = false;
expirationService.checkExpirations();
private async removeItem(itemId: string): Promise<void> {
await inventoryService.removeFoodItem(itemId);
private async updateItem(updatedItem: FoodItem): Promise<void> {
await inventoryService.updateFoodItem(updatedItem);
expirationService.checkExpirations();
private getCategories(): string[] {
const categories = new Set<string>(['全部']);
this.inventory.items.forEach(item => categories.add(item.category));
return Array.from(categories);
private getCategoryIndex(): number {
return this.getCategories().indexOf(this.selectedCategory);
private getFilteredItems(): FoodItem[] {
const items = this.inventory.items;
return this.selectedCategory === '全部'
items
items.filter(item => item.category === this.selectedCategory);
}
@Component
struct FoodItemView {
private item: FoodItem;
private onRemove: () => void;
private onUpdate: (item: FoodItem) => void;
@State expirationInfo: ExpirationInfo | null = null;
aboutToAppear() {
this.loadExpirationInfo();
build() {
Row() {
// 食品图片
if (this.item.image) {
Image(this.item.image)
.width(60)
.height(60)
.borderRadius(8)
.margin({ right: 12 })
else {
Image('resources/food_placeholder.png')
.width(60)
.height(60)
.borderRadius(8)
.margin({ right: 12 })
// 食品信息
Column() {
Text(this.item.name)
.fontSize(18)
.fontWeight(FontWeight.Bold)
if (this.expirationInfo) {
Text(this.getExpirationText())
.fontSize(14)
.fontColor(this.getExpirationColor())
.margin({ top: 4 })
}
.layoutWeight(1)
// 操作按钮
Button('...')
.onClick(() => this.showActionMenu())
.type(ButtonType.Circle)
.padding(12)
private async loadExpirationInfo(): Promise<void> {
this.expirationInfo = await expirationService.getFoodExpirationInfo(this.item);
private getExpirationText(): string {
if (!this.expirationInfo) return '';
switch (this.expirationInfo.status) {
case 'expired': return '已过期';
case 'soon': return 剩余${this.expirationInfo.remainingDays}天;
default: return 保质期至 ${this.expirationInfo.expirationDate};
}
private getExpirationColor(): string {
if (!this.expirationInfo) return ‘#000000’;
switch (this.expirationInfo.status) {
case 'expired': return '#F44336';
case 'soon': return '#FF9800';
default: return '#4CAF50';
}
private showActionMenu(): void {
const options = [‘修改数量’, ‘修改保质期’, ‘删除’];
const menus = [
value: ‘edit’,
action: () => this.editItem()
},
value: ‘remove’,
action: () => this.onRemove()
];
ActionMenu.show({
title: this.item.name,
buttons: menus
});
private editItem(): void {
// 实现编辑食品逻辑
}
食品添加界面
// AddFoodView.ets
@Component
struct AddFoodView {
@State foodName: string = ‘’;
@State category: string = ‘蔬菜’;
@State quantity: number = 1;
@State expirationDays: number = 7;
@State capturedImage: image.Image | null = null;
@State isRecognizing: boolean = false;
build() {
Column() {
Text(‘添加食品’)
.fontSize(20)
.fontWeight(FontWeight.Bold)
.margin({ bottom: 16 })
// 食品图片
if (this.capturedImage) {
Image(this.capturedImage)
.width(120)
.height(120)
.borderRadius(8)
.margin({ bottom: 8 })
else {
Button('拍照识别')
.onClick(() => this.captureAndRecognize())
.margin({ bottom: 8 })
// 食品名称
TextInput({ placeholder: '食品名称' })
.onChange((value: string) => this.foodName = value)
.margin({ bottom: 8 })
// 食品分类
Picker({ range: this.getCategories(), selected: this.getCategoryIndex() })
.onChange((index: number) => {
this.category = this.getCategories()[index];
})
.margin({ bottom: 8 })
// 数量
Row() {
Text('数量:')
.fontSize(16)
.margin({ right: 8 })
Stepper({
value: this.quantity,
min: 1,
max: 10
})
.onChange((value: number) => {
this.quantity = value;
})
.margin({ bottom: 8 })
// 保质期
Row() {
Text('保质期(天):')
.fontSize(16)
.margin({ right: 8 })
TextInput({ text: this.expirationDays.toString() })
.onChange((value: string) => {
const days = parseInt(value);
if (!isNaN(days)) {
this.expirationDays = days;
})
.width(60)
.margin({ bottom: 16 })
// 操作按钮
Row() {
Button('取消')
.onClick(() => this.onCancel?.())
.layoutWeight(1)
Button('确定')
.onClick(() => this.addFoodItem())
.layoutWeight(1)
.margin({ left: 16 })
}
.padding(16)
private getCategories(): string[] {
return ['蔬菜', '水果', '肉类', '乳制品', '饮料', '其他'];
private getCategoryIndex(): number {
return this.getCategories().indexOf(this.category);
private async captureAndRecognize(): Promise<void> {
this.isRecognizing = true;
this.capturedImage = await foodRecognitionService.takeFoodPhoto();
const recognizedItems = await foodRecognitionService.recognizeFood(this.capturedImage);
if (recognizedItems.length > 0) {
const item = recognizedItems[0];
this.foodName = item.name;
this.category = item.category;
this.expirationDays = item.expirationDays;
this.isRecognizing = false;
private addFoodItem(): void {
const newItem: FoodItem = {
id: generateId(),
name: this.foodName,
category: this.category,
quantity: this.quantity,
expirationDays: this.expirationDays,
addedAt: Date.now(),
image: this.capturedImage
};
this.onAdd?.(newItem);
}
function generateId(): string {
return Math.random().toString(36).substring(2) + Date.now().toString(36);
过期提醒界面
// ExpirationView.ets
@Component
struct ExpirationView {
@State expiringItems: FoodItem[] = [];
@State expiredItems: FoodItem[] = [];
aboutToAppear() {
this.loadExpiringItems();
EventBus.on(‘inventoryUpdated’, () => this.loadExpiringItems());
build() {
Column() {
Text('过期提醒')
.fontSize(24)
.fontWeight(FontWeight.Bold)
.margin({ top: 16 })
if (this.expiredItems.length > 0) {
Text('已过期食品')
.fontSize(18)
.fontColor('#F44336')
.margin({ top: 16 })
ForEach(this.expiredItems, (item) => {
ExpiringItem({ item, status: 'expired' })
.margin({ top: 8 })
})
if (this.expiringItems.length > 0) {
Text('即将过期')
.fontSize(18)
.fontColor('#FF9800')
.margin({ top: 16 })
ForEach(this.expiringItems, (item) => {
ExpiringItem({ item, status: 'soon' })
.margin({ top: 8 })
})
if (this.expiredItems.length = 0 && this.expiringItems.length = 0) {
Text('没有即将过期的食品')
.fontSize(16)
.margin({ top: 32 })
}
.padding(16)
private async loadExpiringItems(): Promise<void> {
this.expiringItems = await inventoryService.getExpiringSoonItems(3);
this.expiredItems = await inventoryService.getExpiringSoonItems(0);
}
@Component
struct ExpiringItem {
private item: FoodItem;
private status: ‘expired’ | ‘soon’;
@State expirationInfo: ExpirationInfo | null = null;
aboutToAppear() {
this.loadExpirationInfo();
build() {
Row() {
if (this.item.image) {
Image(this.item.image)
.width(50)
.height(50)
.borderRadius(8)
.margin({ right: 12 })
Column() {
Text(this.item.name)
.fontSize(16)
.fontWeight(FontWeight.Bold)
if (this.expirationInfo) {
Text(this.getExpirationText())
.fontSize(14)
.fontColor(this.getExpirationColor())
.margin({ top: 4 })
}
.layoutWeight(1)
Button('处理')
.onClick(() => this.handleItem())
.padding(12)
.backgroundColor('#FFF3E0')
.borderRadius(8)
private async loadExpirationInfo(): Promise<void> {
this.expirationInfo = await expirationService.getFoodExpirationInfo(this.item);
private getExpirationText(): string {
if (!this.expirationInfo) return '';
if (this.status === 'expired') {
return 已于 ${this.expirationInfo.expirationDate} 过期;
else {
return 剩余 {this.expirationInfo.remainingDays} 天 ({this.expirationInfo.expirationDate});
}
private getExpirationColor(): string {
return this.status === ‘expired’ ? ‘#F44336’ : ‘#FF9800’;
private handleItem(): void {
const options = [
title: ‘已食用’,
action: () => this.markAsConsumed()
},
title: ‘丢弃’,
action: () => this.markAsDiscarded()
},
title: ‘延期’,
action: () => this.extendExpiration()
];
ActionMenu.show({
title: 处理 ${this.item.name},
buttons: options
});
private async markAsConsumed(): Promise<void> {
await inventoryService.removeFoodItem(this.item.id);
EventBus.emit('inventoryUpdated');
private async markAsDiscarded(): Promise<void> {
await inventoryService.removeFoodItem(this.item.id);
EventBus.emit('inventoryUpdated');
private async extendExpiration(): Promise<void> {
const newItem = { ...this.item, expirationDays: this.item.expirationDays + 3 };
await inventoryService.updateFoodItem(newItem);
EventBus.emit('inventoryUpdated');
}
四、高级功能实现
多设备库存同步
// FridgeSyncService.ets
import deviceManager from ‘@ohos.distributedHardware.deviceManager’;
class FridgeSyncService {
private static instance: FridgeSyncService;
private constructor() {}
public static getInstance(): FridgeSyncService {
if (!FridgeSyncService.instance) {
FridgeSyncService.instance = new FridgeSyncService();
return FridgeSyncService.instance;
public async syncInventoryToDevice(deviceId: string): Promise<void> {
const inventory = await inventoryService.getInventory();
const ability = await featureAbility.startAbility({
bundleName: 'com.example.smartFridge',
abilityName: 'FridgeSyncAbility',
deviceId
});
await ability.call({
method: 'receiveInventory',
parameters: [inventory]
});
public async syncAllDevices(): Promise<void> {
const devices = await deviceManager.getTrustedDevices();
await Promise.all(devices.map(device =>
this.syncInventoryToDevice(device.id)
));
public async requestInventoryFromDevice(deviceId: string): Promise<FridgeInventory> {
const ability = await featureAbility.startAbility({
bundleName: 'com.example.smartFridge',
abilityName: 'FridgeRequestAbility',
deviceId
});
const result = await ability.call({
method: 'getInventory',
parameters: []
});
return JSON.parse(result);
}
export const fridgeSyncService = FridgeSyncService.getInstance();
智能食谱推荐
// RecipeService.ets
import http from ‘@ohos.net.http’;
class RecipeService {
private static instance: RecipeService;
private httpClient: http.HttpRequest;
private apiKey = ‘YOUR_RECIPE_API_KEY’;
private constructor() {
this.httpClient = http.createHttp();
public static getInstance(): RecipeService {
if (!RecipeService.instance) {
RecipeService.instance = new RecipeService();
return RecipeService.instance;
public async getRecipesByIngredients(ingredients: string[]): Promise<Recipe[]> {
return new Promise((resolve, reject) => {
this.httpClient.request(
'https://recipe-api.example.com/byIngredients',
method: ‘POST’,
header: { 'Content-Type': 'application/json' },
extraData: JSON.stringify({
ingredients,
api_key: this.apiKey
})
},
(err, data) => {
if (err) {
reject(err);
else {
const result = JSON.parse(data.result);
resolve(this.processRecipes(result));
}
);
});
private processRecipes(rawData: any): Recipe[] {
if (!rawData || !rawData.recipes) return [];
return rawData.recipes.map((recipe: any) => ({
id: recipe.id || generateId(),
title: recipe.title || '未知食谱',
ingredients: recipe.ingredients || [],
instructions: recipe.instructions || [],
prepTime: recipe.prepTime || 0,
cookTime: recipe.cookTime || 0,
image: recipe.image || null,
source: recipe.source || '未知来源'
}));
public async getRecipesForExpiringItems(items: FoodItem[]): Promise<Recipe[]> {
const ingredients = items.map(item => item.name);
return this.getRecipesByIngredients(ingredients);
public async getRandomRecipe(): Promise<Recipe | null> {
try {
const response = await this.httpClient.request(
'https://recipe-api.example.com/random',
method: ‘GET’ }
);
const result = JSON.parse(response.result);
return this.processRecipes([result])[0] || null;
catch (error) {
console.error('获取随机食谱失败:', error);
return null;
}
export const recipeService = RecipeService.getInstance();
购物清单管理
// ShoppingListService.ets
import distributedData from ‘@ohos.data.distributedData’;
class ShoppingListService {
private static instance: ShoppingListService;
private kvManager: distributedData.KVManager;
private kvStore: distributedData.KVStore;
private constructor() {
this.initKVStore();
private async initKVStore(): Promise<void> {
const config = {
bundleName: 'com.example.smartFridge',
userInfo: { userId: 'currentUser' }
};
this.kvManager = distributedData.createKVManager(config);
this.kvStore = await this.kvManager.getKVStore('shopping_list', {
createIfMissing: true
});
this.kvStore.on('dataChange', (data) => {
this.handleRemoteUpdate(data);
});
public static getInstance(): ShoppingListService {
if (!ShoppingListService.instance) {
ShoppingListService.instance = new ShoppingListService();
return ShoppingListService.instance;
public async addItem(item: ShoppingItem): Promise<void> {
const list = await this.getList();
list.items.push(item);
await this.kvStore.put('list', JSON.stringify(list));
public async removeItem(itemId: string): Promise<void> {
const list = await this.getList();
list.items = list.items.filter(item => item.id !== itemId);
await this.kvStore.put('list', JSON.stringify(list));
public async updateItem(updatedItem: ShoppingItem): Promise<void> {
const list = await this.getList();
const index = list.items.findIndex(item => item.id === updatedItem.id);
if (index >= 0) {
list.items[index] = updatedItem;
await this.kvStore.put('list', JSON.stringify(list));
}
public async getList(): Promise<ShoppingList> {
const value = await this.kvStore.get(‘list’);
return value ? JSON.parse(value) : { items: [] };
public async generateFromInventory(inventory: FridgeInventory): Promise<void> {
const commonItems = await this.getCommonItems();
const currentItems = inventory.items.map(item => item.name.toLowerCase());
const suggestedItems = commonItems.filter(item =>
!currentItems.includes(item.name.toLowerCase())
);
const list: ShoppingList = {
items: suggestedItems.map(item => ({
id: generateId(),
name: item.name,
category: item.category,
quantity: 1,
isPurchased: false
}))
};
await this.kvStore.put('list', JSON.stringify(list));
private async getCommonItems(): Promise<CommonItem[]> {
// 从本地存储获取常用物品列表
const value = await preferences.getPreferences('common_items');
return value ? JSON.parse(value) : [];
private handleRemoteUpdate(data: distributedData.ChangeInfo): void {
if (data.deviceId === deviceInfo.deviceId) return;
if (data.key === 'list') {
const list = JSON.parse(data.value);
EventBus.emit('shoppingListUpdated', list);
}
export const shoppingListService = ShoppingListService.getInstance();
五、总结
本智能冰箱管家应用实现了以下核心价值:
智能识别:准确识别放入冰箱的食品并记录
库存管理:实时跟踪冰箱内食品数量和状态
过期预警:提前提醒即将过期的食品
多设备协同:家庭成员共享冰箱库存信息
智能推荐:根据现有食材推荐合适食谱
扩展方向:
增加条形码扫描识别功能
开发智能购物清单生成
集成在线生鲜配送服务
增加营养分析和饮食建议
注意事项:
需要申请ohos.permission.CAMERA权限
食品识别准确率受拍摄质量影响
多设备协同需保持网络连接
过期提醒仅供参考,实际保质期可能因储存条件变化
首次使用建议完成引导设置
