一款基于 Android 的智能食谱管理应用,帮助用户管理食材、记录食谱,并根据现有食材智能推荐今日菜谱。
- 根据用户现有食材,智能推荐可制作的食谱
- 支持按餐类型(早餐、午餐、晚餐、夜宵)筛选
- 优先推荐使用即将过期食材的菜谱,减少浪费
- 模糊匹配食材名称,提高匹配成功率
- 添加、编辑、删除食谱
- 支持设置烹饪时间、难度等级
- 支持添加食谱图片
- 按餐类型分类管理
- 记录食材名称、数量、单位
- 设置购买日期和保质期
- 支持存储位置标记(冰箱、冷冻室、储藏室等)
- 食材过期提醒
- 根据推荐结果自动生成缺失食材清单
- 一键添加待购食材
- 标记已购买状态
应用采用 MVVM + Clean Architecture 架构模式,分为三层:
┌─────────────────────────────────────────────────────────┐
│ Presentation Layer │
│ (UI Components, ViewModels, Navigation, Theme) │
├─────────────────────────────────────────────────────────┤
│ Domain Layer │
│ (Models, Repositories Interface, UseCases) │
├─────────────────────────────────────────────────────────┤
│ Data Layer │
│ (Room Database, DAOs, Entities, Repository Impl) │
└─────────────────────────────────────────────────────────┘
app/src/main/java/com/dailyeat/
├── data/ # 数据层
│ ├── local/ # 本地数据源
│ │ ├── database/ # Room 数据库
│ │ │ ├── converter/ # 类型转换器
│ │ │ ├── dao/ # 数据访问对象
│ │ │ └── entity/ # 数据库实体
│ │ ├── mapper/ # 数据映射器
│ │ └── ShoppingListRepository.kt
│ └── repository/ # 仓库实现
├── di/ # 依赖注入模块
│ ├── DatabaseModule.kt # 数据库相关依赖
│ └── RepositoryModule.kt # 仓库依赖绑定
├── domain/ # 领域层
│ ├── model/ # 领域模型
│ │ ├── Ingredient.kt # 食材模型
│ │ ├── Recipe.kt # 食谱模型
│ │ ├── RecipeIngredient.kt # 食谱食材关联
│ │ ├── MealType.kt # 餐类型枚举
│ │ └── RecommendationResult.kt # 推荐结果
│ ├── repository/ # 仓库接口
│ └── usecase/ # 用例
│ ├── CheckExpiringIngredientsUseCase.kt
│ ├── GetIngredientsUseCase.kt
│ ├── GetRecipeByIdUseCase.kt
│ ├── GetRecipesUseCase.kt
│ ├── ManageIngredientUseCase.kt
│ └── ManageRecipeUseCase.kt
├── presentation/ # 表现层
│ ├── navigation/ # 导航
│ │ ├── DailyEatNavGraph.kt # 导航图
│ │ └── Screen.kt # 页面路由定义
│ ├── screen/ # 页面
│ │ ├── home/ # 首页
│ │ ├── ingredient/ # 食材管理页面
│ │ ├── recipe/ # 食谱管理页面
│ │ ├── recommend/ # 推荐页面
│ │ └── shopping/ # 购物清单页面
│ ├── theme/ # 主题配置
│ └── viewmodel/ # 视图模型
├── recommendation/ # 推荐引擎
│ ├── engine/
│ │ └── RecommendationEngine.kt # 核心推荐算法
│ ├── matcher/
│ │ └── FuzzyIngredientMatcher.kt # 模糊食材匹配
│ └── scorer/
│ ├── ExpiryWeightCalculator.kt # 过期权重计算
│ └── MatchScoreCalculator.kt # 匹配分数计算
├── util/
│ └── Logger.kt # 日志工具
├── DailyEatApplication.kt # Application 类
└── MainActivity.kt # 主 Activity
| 类别 | 技术 |
|---|---|
| UI 框架 | Jetpack Compose + Material 3 |
| 架构模式 | MVVM + Clean Architecture |
| 依赖注入 | Hilt |
| 数据库 | Room |
| 异步处理 | Kotlin Coroutines |
| 序列化 | Kotlinx Serialization |
| 日期时间 | Kotlinx DateTime |
| 图片加载 | Coil |
| 数据存储 | DataStore Preferences |
| 导航 | Jetpack Navigation Compose |
推荐引擎基于多维度评分系统:
-
基础匹配分数 (60%权重)
- 计算用户拥有食材与食谱所需食材的匹配比例
- 区分必需食材和可选食材
-
过期奖励分数 (30%权重)
- 优先推荐使用即将过期食材的食谱
- 减少食材浪费
-
餐类型匹配 (10%权重)
- 根据用户选择的餐类型筛选合适食谱
finalScore = baseMatchScore * 0.6f +
normalizedExpiryBonus * 0.3f +
mealTypeMatchBonus * 0.1f- Android SDK: minSdk 26, targetSdk 34
- Kotlin: 1.9.20
- Gradle: 8.2.0
- JDK: 17
# 克隆项目
git clone https://github.com/your-username/dailyEat.git
# 进入项目目录
cd dailyEat
# 构建项目
./gradlew build
# 运行调试版本
./gradlew installDebug| 字段 | 类型 | 描述 |
|---|---|---|
| id | Long | 主键 |
| name | String | 食谱名称 |
| description | String | 描述 |
| mealTypes | Set | 适用餐类型 |
| cookTime | Int | 烹饪时间(分钟) |
| difficulty | Int | 难度等级 (1-5) |
| imageUri | String? | 图片 URI |
| ingredients | List | 所需食材列表 |
| 字段 | 类型 | 描述 |
|---|---|---|
| id | Long | 主键 |
| name | String | 食材名称 |
| category | String | 分类 |
| quantity | Float | 数量 |
| unit | String | 单位 |
| purchaseDate | Instant? | 购买日期 |
| expiryDate | Instant? | 过期日期 |
| storageLocation | String | 存储位置 |
MIT License