懂吃·应用演示以及介绍

📖 项目概述

懂吃 (DongChi) 是一款基于 HarmonyOS (鸿蒙) 原生开发 的单机美食决策应用,包名 com.example.dongchi,面向 API 12+ (SDK 6.1.1) 运行环境。该应用旨在解决困扰亿万用户的世纪难题——“今天吃什么?”,通过一套独创的 “三问决策” 机制,帮助用户在 10 秒内从迷茫到确定,高效完成每日饮食决策。

项目完全采用 ArkTS 语言 开发,遵循 ArkTS/Stage 模型规范,主打 100% 本地运行、零联网依赖,所有推荐算法、数据存储均在设备端完成,最大程度保护用户隐私的同时确保应用在任何网络环境下均可正常使用。


🎯 开发背景与市场洞察

痛点发现

在这里插入图片描述

在项目启动前,开发者通过深入的市场调研和自我生活体悟,发现了一个普遍存在却长期未被很好解决的问题:

“今天吃什么?”——每个人每天至少面对 3 次的核心决策。

随着餐饮行业的蓬勃发展,用户面临的选择不是太少而是太多。外卖平台动辄上千家店铺、超市里上万种食材,选择过载导致决策疲劳。市场调研显示:

  • 超过 70% 的年轻人每天花费 15 分钟以上思考"吃什么"
  • 约 30% 的人因选择困难而长期只吃固定的几种食物
  • 现有解决方案(转盘、随机推荐)过于粗暴,完全不考虑用户的实际偏好和条件

核心洞察

开发者发现,用户需要的不只是一个"随机答案",而是一套 能够逐步缩小选择范围、结合自身条件、最终给出精准且可执行建议的决策系统。这就是"懂吃"诞生的核心理念。


💡 设计理念:AI 驱动的"三问决策"体系

为什么是"三问"?

区别于传统应用粗暴地直接给答案,"懂吃"采用 渐进式决策 设计,引导用户依次回答三个问题,在不知不觉中完成决策:

第一问:今天想吃"什么感觉"的?
    ↓
第二问:今天有哪些"限制条件"?
    ↓
第三问:家里现在"有什么食材"?
    ↓
  终极输出:3 道精准推荐的菜品

为什么是"3 个推荐"?

这是基于认知心理学研究的科学决策数字:

  • 1 个选项:用户产生抵触心理——“凭什么让我吃这个”
  • 2 个选项:用户陷入二选一的纠结——“算了还是不吃了吧”
  • 3 个选项:大脑最容易快速决策,决策满意度最高

核心差异化:"自己做 VS 点外卖"智能对比

每道推荐菜品都附带 完整可执行的决策信息,帮助用户在"自己动手"和"坐享其成"之间做出理性选择:

对比项 👨‍🍳 自己做 🛵 点外卖
耗时 具体烹饪时间 预计送达时间
花费 食材成本(精确到元) 外卖价格(含配送费)
食材检查 自动判断家里食材是否足够 无需食材
缺食材提示 自动列出需补买的食材
操作入口 "看教程"按钮(本地弹窗) "点外卖"按钮(本地弹窗)

🏗️ 技术架构与开发工具

技术栈选型

层面 技术选型 说明
操作系统 HarmonyOS 4.0+ 纯国产操作系统
开发框架 ArkTS + Stage 模型 鸿蒙原生声明式 UI
开发工具 DevEco Studio 6.1.1 官方 IDE
编程语言 ArkTS(TypeScript 超集) 静态类型、UI 即代码
本地存储 鸿蒙 relationalStore(SQLite) 关系型数据库
AI 辅助 DeepSeek API(已注释备留) API 优先→本地降级
辅助工具 AtomCode(AI 编码代理) 辅助代码生成与调试

项目架构概览

DongChi/
├── AppScope/                    # 应用全局配置
│   └── app.json5               # 应用名、图标、版本
├── entry/
│   └── src/main/
│       ├── ets/
│       │   ├── pages/          # 9 个页面
│       │   │   ├── Index.ets         # 首页引导
│       │   │   ├── StepOne.ets       # 第一问:口味选择
│       │   │   ├── StepTwo.ets       # 第二问:条件限制
│       │   │   ├── StepThree.ets     # 第三问:食材选择
│       │   │   ├── Recommend.ets     # 推荐结果
│       │   │   ├── Profile.ets       # 个人中心
│       │   │   ├── ProfileDetail.ets # 个人资料
│       │   │   ├── Favorites.ets     # 我的收藏
│       │   │   └── DecisionRecords.ets # 决策记录
│       │   └── service/
│       │       ├── RecommendService.ets # 核心推荐引擎
│       │       └── DbService.ets        # 数据库服务
│       ├── module.json5         # 模块配置与权限声明
│       └── resources/           # 资源文件
│           ├── base/
│           │   ├── element/     # 颜色、字符串、浮点数
│           │   ├── media/       # 图标、图片
│           │   └── profile/     # 页面路由配置
│           └── dark/            # 暗色模式覆盖

页面路由链路

Index(首页引导)
  └── StepOne(选口味方向:4 类)
        └── StepTwo(选限制条件:时间/预算/忌口)
              └── StepThree(选现有食材:7 大类)
                    └── Recommend(推荐结果展示)
                          └── 收藏 / 换一批 / 重新选择 / 重新开始

Profile(个人中心)
  ├── DecisionRecords(决策记录 → 可重复操作)
  └── Favorites(收藏菜品)

🗺️ 开发历程(10 天全景回顾)

📅 第一天(2026.6.9):应用选题与初步设计

开发目标:市场调研 + 应用选题 + 设计方案确定

关键成果

  • 与豆包 AI 深度交流,完成 《Preliminary Design》 初步设计方案
  • 确立了"三问决策"的核心产品理念
  • 设计了"自己做 vs 点外卖"的差异化功能
  • 完成了第三方平台(抖音/美团/下厨房)跳转的技术可行性分析
  • 设计了完整的产品功能架构和变现方案
    在这里插入图片描述

📅 第二天(2026.6.10):项目创建与 UI 骨架

开发目标:在 DevEco Studio 创建项目,搭建 UI 框架

关键成果

  • 使用 Empty Ability 模板创建项目,命名为 DongChi
  • 设定 Compatible SDK 为 6.1.1(24)
  • 利用 AtomCode 根据 Preliminary Design.txt 生成初步应用
  • 创建了核心页面骨架:
    • Index.ets — 品牌展示 + “开始决策” 按钮
    • StepOne.ets — 选口味方向(4 类)
    • StepTwo.ets — 选限制条件(时间/预算/忌口 多选)
    • Recommend.ets — 推荐结果展示页
  • 使用 Pura 90 0604 模拟器首次运行验证
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述

在这里插入图片描述

📅 第三天(2026.6.11):API 接入与本地推荐引擎

开发目标:接入 DeepSeek API,实现 AI 推荐功能

开发过程

  1. 在 DeepSeek 开放平台注册账号,创建 API Key
  2. 通过 AtomCode 集成 API 到应用
  3. 遇到 ArkTS 编译器错误
    • arkts-no-obj-literals-as-types — 不允许内联对象字面量作为类型
    • arkts-no-standalone-this — static 方法中不能使用 this
    • 需要为所有匿名对象声明显式接口
  4. API 返回 402 错误(余额不足)
  5. 策略调整:不充值,转向构建 完整本地推荐引擎
  6. 本地菜品库扩展到 60+ 道菜(后持续扩充至 260 道)
  7. 实现 API 优先→本地降级 的优雅降级策略
  8. 添加 “本地推荐” 提示 UI,告知用户当前为本地模式

📅 第四天(2026.6.13):第三方跳转功能实现

开发目标:实现"看教程"跳转抖音、"点外卖"跳转美团

技术挑战

  • 鸿蒙模拟器无法安装第三方 App
  • 用户设备可能未安装目标 App
  • 鸿蒙上 getBundleInfo 只能查询自身,不能查第三方

解决方案

  • 改用 canOpenLink() API(API 12+)通过自定义 URL Scheme 检测 App
  • 未安装时弹出确认对话框 → 用户确认后跳转浏览器
  • 支持抖音 Scheme:snssdk1128://douyin://aweme://
  • 支持美团 Scheme:meituanwaimai://imeituan://
  • 修复了对话框"取消"后仍然跳转的 bug

📅 第五天(2026.6.14):食材选择页面与过渡动画

开发目标:添加"第三问"食材选择页面,优化全流程体验

关键成果

  • 新增 StepThree.ets 食材选择页面
  • 7 大类食材分类体系:蔬菜、肉禽、豆制品、海鲜、主食、调味、乳制品
  • "家里没有食材"快捷选项
  • 添加 三步骤进度指示器(Step 1→2→3)
  • 添加 页面过渡动画(淡入 + 上移)
  • 所有页面数据联动更新(StepOne → StepTwo → StepThree 参数传递)
    在这里插入图片描述

📅 第六天(2026.6.15):UI 美化与交互优化

开发目标:全面提升视觉设计质量

关键成果

  • 重新设计所有页面的 颜色方案(#FF6B35 橙色主题)
  • 12 种自定义颜色定义:app_primary、app_bg、text_primary 等
  • 卡片圆角设计(14px~16px)+ 柔和阴影
  • 推荐页卡片动画:逐条淡入入场
  • 菜品卡片内 “自己做 vs 外卖” 对比布局
  • 收藏红心动画交互
  • 空状态友好提示(收藏、记录为空时)

📅 第七天(2026.6.16):推荐算法深度优化

开发目标:升级菜品库至 260 道,完善评分算法

关键成果

  • 菜品库从 60+ 道 扩充到 260 道,覆盖 4 大类别
  • 每道菜新增字段:timeRank(耗时等级)、budgetRank(价格等级)、requiredIngredients(核心食材列表)
  • 评分算法优化:
    • 分类匹配:40 分
    • 时间匹配:30 分(精确/更快/更慢三级)
    • 预算匹配:30 分(预算内/超出)
    • 食材匹配:最高 30 分(按比例折算)
  • 食材匹配算法:60% 核心食材阈值判断
  • "换一批"轮换机制:偏移量 +3,确保每次完全更新 3 道菜
  • 推荐理由动态生成:根据食材匹配率自动生成个性化理由
    在这里插入图片描述

📅 第八天(2026.6.17):数据库与持久化

开发目标:实现 SQLite 本地数据持久化

关键成果

  • 创建 DbService.ets 数据库服务层
  • 3 张核心数据表:
    • decision_records — 决策记录
    • favorites — 收藏管理
    • session — 登录会话
  • 完整的 CRUD 操作实现
  • 数据库初始化与版本管理

在这里插入图片描述

📅 第九天(2026.6.18):个人中心与全功能集成

开发目标:完成个人中心及剩余页面

关键成果

  • Profile.ets 个人中心:
    • 本地登录系统(admin/000000)
    • 登录会话持久化(数据库)
    • 功能菜单:决策记录、收藏、意见反馈、关于
  • ProfileDetail.ets 个人资料页
  • DecisionRecords.ets 决策记录页:
    • 从 DbService 加载历史记录
    • 删除确认弹窗
    • "重复此决策"一键跳转
    • 条件摘要 + 菜品标签展示
  • Favorites.ets 我的收藏页:
    • 从 DbService 加载收藏
    • 取消收藏功能
    • “自己做” vs "外卖"对比卡片
    • 收藏时间展示
  • 修复登录状态页面切换不保持的问题
  • 修复数据更新不及时的生命周期问题
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

📅 第十天(2026.6.20):单机化改造与全量测试

开发目标:确保应用完全离线可用,全功能验证

单机化改造

  1. RecommendService.ets — 注释 DeepSeek API 代码块(保留完整以备恢复),HTTP 模块导入注释
  2. module.json5 — 注释 INTERNET 网络权限声明
  3. ProfileDetail.ets — 注释第三方绑定 UI 代码
  4. Recommend.ets — “看教程”/"点外卖"按钮替换为本地弹窗提示

全量测试

  • 情景测试:4 个完整用户情景模拟
    • 情景一:家常清淡 + 半小时 + 不花钱 + 有食材 → 酸辣土豆丝 / 醋溜白菜 / 蛋炒饭 ✅
    • 情景二:不满意换一批 → 蒜蓉西兰花 / 蚂蚁上树 / 麻婆豆腐 ✅
    • 情景三:决策记录重复操作 → 通过"我的决策记录"找到 ✅
    • 情景四:收藏菜品 → 在"我的收藏"找到 ✅
  • 联网检测:6 项扫描确认无任何活动联网代码

🧠 本地推荐引擎深度解析

260 道菜品数据库

本地菜品库 LOCAL_DISHES 包含 260 道覆盖中国各大菜系的菜品,每道菜包含丰富元数据:

interface LocalDish extends AiDish {
  category: number;           // 口味分类(0-家常清淡 / 1-重口过瘾 / 2-健康轻食 / 3-快餐速食)
  isSpicy: boolean;           // 是否辣菜
  hasCoriander: boolean;      // 是否有香菜
  isSeafood: boolean;         // 是否海鲜
  isVegetarian: boolean;      // 是否素食
  timeRank: number;           // 耗时等级(0=10分钟 / 1=30分钟 / 2=1小时以上)
  budgetRank: number;         // 价格等级(0=10元 / 1=20元 / 2=50元 / 3=不限)
  requiredIngredients: string[]; // 核心食材列表(用于食材匹配)
}

智能评分算法

推荐结果通过 多维度加权打分 排序选出:

总得分 = 分类匹配(40分) + 时间匹配(30分) + 预算匹配(30分) + 食材匹配(最高30分)
维度 分值 子规则
🏷️ 口味分类 40 精确匹配 40 分 / 跨分类 10 分
⏱️ 时间限制 30 无限制 30 分 / 精确匹配 30 分 / 更快 15 分 / 更慢 5 分
💰 预算限制 30 无限制 30 分 / 预算内 30 分 / 超出 5 分
🥬 食材匹配 30 按匹配率 (0~1) × 30 折算

食材智能匹配

匹配率 = 用户拥有的核心食材数 ÷ 菜品所需核心食材总数
  • 匹配率 ≥ 60% → hasIngredients = true(家里食材基本够)
  • 自动生成个性化推荐理由:
    • 匹配率 ≥ 80%:“你家里已有大部分食材,只需补买XX就能做!”
    • 匹配率 40%~80%:“家里有部分食材,再买XX就能复刻这道美味”
    • 匹配率 < 40%:保留通用推荐理由

忌口过滤链

用户选择不吃辣
  → 遍历所有菜品 isSpicy 标记
  → 标记为辣的菜品全部过滤
  → 剩余菜品进入评分阶段

支持 4 种忌口的任意组合过滤:不吃辣 / 不吃香菜 / 不吃海鲜 / 素食

"换一批"轮换机制

轮换采用 偏移量 +3 策略:

// 每次点击"换一批",偏移量 +3
RecommendService.refreshOffset += 3;

// 从排序后的候选池中按偏移量轮选取
const offset = refreshOffset % pool.length;
// 从 offset 位置开始选取,跳过已选的菜品

特点:确保每次换一批推荐 3 道完全不同的菜品,而非滑动窗口只更新 1 道。

兜底策略

在极端情况(如用户全部忌口同时开启 + 指定稀有食材)下,筛选后的候选池可能不足 3 道。引擎设计了 3 级兜底

  1. 优先从同分类补充
  2. 其次从高分异类补充
  3. 最后从全菜品库补充(跳过忌口过滤)

确保 永远有 3 道菜可推荐


🗄️ 数据持久化设计

本地数据库架构

数据库使用鸿蒙原生 relationalStore(基于 SQLite 封装),包含 3 张表:

1. decision_records — 决策记录表
CREATE TABLE IF NOT EXISTS decision_records (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  category INTEGER NOT NULL,
  time INTEGER NOT NULL,
  budget INTEGER NOT NULL,
  diet TEXT NOT NULL,          -- JSON 数组存储
  ingredients TEXT NOT NULL,   -- JSON 数组存储
  hasNoIngredients INTEGER NOT NULL DEFAULT 0,
  results TEXT NOT NULL,       -- JSON 存储推荐结果
  createdAt TEXT NOT NULL      -- ISO 时间戳
);
2. favorites — 收藏表
CREATE TABLE IF NOT EXISTS favorites (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  dishName TEXT NOT NULL,
  dishIcon TEXT,
  difficulty TEXT,
  time TEXT,
  cost TEXT,
  cookTime TEXT,
  deliveryTime TEXT,
  cookCost REAL DEFAULT 0,
  deliveryCost REAL DEFAULT 0,
  reason TEXT,
  createdAt TEXT NOT NULL,
  recordId INTEGER,            -- 关联决策记录
  FOREIGN KEY (recordId) REFERENCES decision_records(id)
);
3. session — 登录会话表
CREATE TABLE IF NOT EXISTS session (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  isLoggedIn INTEGER NOT NULL DEFAULT 0,
  account TEXT NOT NULL,
  username TEXT NOT NULL
);

登录系统

采用 本地硬编码账号 模式:

账号:admin
密码:000000
用户名:本地测试

登录成功后,会话信息持久化到 session 表。应用重启或页面切换后,从数据库恢复登录状态,实现"一次登录,持续有效"。


🔌 单机化改造详解

改造策略

采用 注释备留 而非删除的方式,确保代码完整性:

文件 改造内容 恢复方式
RecommendService.ets DeepSeek API 调用代码块 /* */ 注释 取消注释 API 代码 + 恢复 import http
module.json5 ohos.permission.INTERNET 权限申明注释 取消注释权限申明行
ProfileDetail.ets 第三方绑定 UI 代码注释 取消注释 UI 代码
Recommend.ets “看教程”/“点外卖” → 本地弹窗提示 恢复 App 检测 + URL Scheme 跳转

二次联网检测清单

经过 6 项全量扫描 确认无遗留联网功能:

  1. ✅ 所有 @ohos.net.http / @ohos.socket 等网络模块导入均已注释
  2. ✅ 所有 ohos.permission.INTERNET 权限均已注释
  3. ✅ 所有 https?://.com 等 URL 相关代码均已注释
  4. ✅ 所有 fetch / XMLHttpRequest 网络请求代码均已注释
  5. ✅ 所有第三方 App Scheme 跳转均已替换为本地弹窗
  6. ✅ 所有资源文件(media/*)中的第三方图标保留但 UI 代码已注释

🎨 UI/UX 设计亮点

色彩系统

色名 色值 用途
app_primary #FF6B35 主色调橙
app_secondary #FF8C5A 辅助橙
app_bg #FFF5F0 暖白背景
text_primary #2D2D2D 主文字
text_secondary #666666 次文字
text_light #999999 浅文字
category_home #FFE8D0 家常分类色
category_spicy #FFD0D0 重口分类色
category_healthy #D0FFE0 轻食分类色
category_fast #D0E8FF 快餐分类色

动效细节

  • 步骤过渡动画:页面切换使用 Curve.Smooth 曲线 + 上移淡入
  • 推荐卡片动画:3 张卡片依次入场,每张延迟 150ms,持续时间 500ms
  • 收藏红心动效:点击收藏时红心图标切换
  • 按钮交互反馈:点击按钮有缩放/颜色反馈

🔍 质量保证

编译器兼容

项目经历了多次 ArkTS 严格类型检查 的考验,解决了以下编译器错误:

  • arkts-no-obj-literals-as-types — 声明显式接口替代匿名对象
  • arkts-no-standalone-this — 类名引用替代 this
  • arkts-no-any-unknown — 明确类型替代 any
  • arkts-no-untyped-obj-literals — 对象字面量必须匹配类型声明
  • Property 'limit' does not exist on type 'RdbPredicates' — 方法名修正为 limitAs

核心功能链路验证

Index → StepOne → StepTwo → StepThree → Recommend
  ↓                                            ↓
Profile ←──────────────────────────── Favorites / DecisionRecords

完整链路闭环:首页 → 三步决策 → 推荐结果 → 收藏/记录 → 个人中心查看 ← 可用"重复此决策"回到推荐


🚀 未来展望与扩展方向

近期可恢复功能(代码已保留)

功能 恢复方式 预期效果
atomcode AI 推荐 取消注释 + 充值 API Key 基于大模型的智能推荐
"看教程"跳转 恢复 URL Scheme 检测 跳转抖音/下厨房看教程
"点外卖"跳转 恢复 URL Scheme 检测 跳转美团/饿了么下单
第三方平台绑定 恢复 UI 代码 账号关联与快速跳转

中长期规划

  1. AI 智能推荐增强:接入 DeepSeek API 后实现个性化推荐 + 用户偏好学习
  2. 每周菜谱生成:一键生成一周食谱和购物清单
  3. 卡路里计算:显示每道菜的热量和营养成分
  4. 拍照识别食材:调用相机识别冰箱食材
  5. 家庭共享:家庭成员共享冰箱食材和菜谱
  6. 商家优惠聚合:集成外卖平台优惠信息
  7. 联盟佣金变现:通过跳转推广获得交易佣金

📊 项目统计数据

指标 数据
页面总数 9 个
服务类 2 个
菜品库大小 260 道
口味分类 4 类
食材分类 7 大类
数据库表 3 张
自定义颜色 12 色
资源图标 11 个
代码文件 ~15 个
开发周期 10 天
SDK 版本 API 12+ (6.1.1)

🏁 结语

懂吃 (DongChi) 是一个完整的、可运行的鸿蒙原生应用,它不仅仅是一个"随机选饭"的小工具,而是一套 科学决策系统

从市场调研到产品设计,从原型搭建到 260 道菜的本地推荐引擎,从数据持久化到全量测试,项目覆盖了应用开发的完整生命周期。其 AI 优先→本地降级 的架构设计、"三问决策"的产品理念、"自己做 VS 点外卖"的差异化功能,使其在同类产品中独树一帜。

更重要的是,项目设计时充分考虑了 离线场景下的可用性,所有核心功能(推荐、收藏、历史记录、登录)均可完全离线运行,联网功能代码以注释方式完整保留,后续可无缝恢复。这种设计理念体现了对用户实际使用场景的深刻理解。


项目开发时间:2026 年 6 月 9 日 — 2026 年 6 月 20 日
开发工具:DevEco Studio 6.1.1 + AtomCode
运行环境:HarmonyOS API 12+ / Pura 90 模拟器

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐