跳转至

美食偏好推荐器 - 商业级开发方案

项目概述

项目 详情
产品名称 美食偏好推荐器
目标平台 iOS App Store + Android Google Play + 微信小程序
商业模式 付费下载 + 应用内购买
核心功能 多维度美食偏好筛选与智能推荐

一、技术架构选型

1.1 跨平台方案对比

方案 开发成本 性能 上架难度 推荐度
Flutter 接近原生 中等 ⭐⭐⭐⭐⭐
React Native 良好 中等 ⭐⭐⭐⭐
原生开发 最佳 ⭐⭐⭐

推荐:Flutter - Google官方支持,长期维护有保障 - 一套代码同时生成iOS、Android、Web(小程序可复用逻辑) - UI渲染性能接近原生 - 热重载开发效率高

1.2 系统架构图

┌─────────────────────────────────────────────────────────────┐
│                        客户端层                              │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐  ┌──────────┐    │
│  │ iOS App  │  │AndroidApp│  │ 小程序   │  │ 管理后台 │    │
│  │ (Flutter)│  │ (Flutter)│  │(Taro/uni)│  │ (Web)    │    │
│  └────┬─────┘  └────┬─────┘  └────┬─────┘  └────┬─────┘    │
└───────┼─────────────┼─────────────┼─────────────┼──────────┘
        │             │             │             │
        └─────────────┴─────────────┴─────────────┘
┌─────────────────────────▼───────────────────────────────────┐
│                      API 网关层                              │
│              (Nginx + Kong / AWS API Gateway)                │
└─────────────────────────┬───────────────────────────────────┘
┌─────────────────────────▼───────────────────────────────────┐
│                      业务服务层                              │
│  ┌────────────┐ ┌────────────┐ ┌────────────┐ ┌──────────┐ │
│  │ 用户服务   │ │ 推荐服务   │ │ 商品服务   │ │ 支付服务 │ │
│  │ (Node.js)  │ │ (Python)   │ │ (Node.js)  │ │ (Stripe) │ │
│  └────────────┘ └────────────┘ └────────────┘ └──────────┘ │
└─────────────────────────┬───────────────────────────────────┘
┌─────────────────────────▼───────────────────────────────────┐
│                      数据存储层                              │
│  ┌────────────┐ ┌────────────┐ ┌────────────┐ ┌──────────┐ │
│  │ PostgreSQL │ │   Redis    │ │ Elasticsearch│ │  CDN   │ │
│  │ (主数据库) │ │  (缓存)    │ │  (搜索)    │ │(静态资源)│ │
│  └────────────┘ └────────────┘ └────────────┘ └──────────┘ │
└─────────────────────────────────────────────────────────────┘

二、核心功能设计

2.1 多维度筛选体系

┌─────────────────────────────────────────────────────────┐
│                    筛选维度架构                          │
├─────────────────────────────────────────────────────────┤
│  基础维度                                                │
│  ├── 口味偏好 (甜/咸/酸/辣/鲜)                          │
│  ├── 口感偏好 (软糯/酥脆/嫩滑/Q弹)                      │
│  └── 温度偏好 (热食/常温/冷食/冰品)                     │
├─────────────────────────────────────────────────────────┤
│  健康维度                                                │
│  ├── 热量控制 (低卡/适中/高热量)                        │
│  ├── 营养成分 (高蛋白/低脂/低碳水/高纤维)               │
│  ├── 特殊需求 (素食/清真/无麸质/低钠)                   │
│  └── 过敏原 (无坚果/无海鲜/无乳制品)                    │
├─────────────────────────────────────────────────────────┤
│  场景维度                                                │
│  ├── 用餐场景 (早餐/午餐/晚餐/下午茶/夜宵)              │
│  ├── 社交场景 (独自用餐/约会/聚会/商务)                 │
│  ├── 时间约束 (15分钟内/30分钟内/不限时)                │
│  └── 预算范围 (经济型/适中/高端)                        │
├─────────────────────────────────────────────────────────┤
│  个性化维度                                              │
│  ├── 历史偏好 (基于用户选择记录学习)                    │
│  ├── 地理位置 (附近餐厅/全城推荐)                       │
│  └── 季节时令 (当季推荐/全年可选)                       │
└─────────────────────────────────────────────────────────┘

2.2 推荐算法设计

# 推荐算法核心逻辑
class FoodRecommender:
    def calculate_match_score(self, item, user_prefs):
        """
        计算美食与偏好的匹配分数
        """
        score = 0
        weights = {
            'taste': 0.25,      # 口味权重
            'health': 0.25,     # 健康权重
            'scene': 0.20,      # 场景权重
            'personal': 0.30    # 个性化权重
        }

        # 1. 口味匹配 (25%)
        taste_score = self.match_taste(item, user_prefs.taste)

        # 2. 健康匹配 (25%)
        health_score = self.match_health(item, user_prefs.health)

        # 3. 场景匹配 (20%)
        scene_score = self.match_scene(item, user_prefs.scene)

        # 4. 个性化匹配 (30%)
        personal_score = self.match_personal(item, user_prefs.history)

        # 加权总分
        final_score = (
            taste_score * weights['taste'] +
            health_score * weights['health'] +
            scene_score * weights['scene'] +
            personal_score * weights['personal']
        )

        return final_score

2.3 功能模块清单

模块 功能点 优先级 预估工时
用户系统 注册/登录/找回密码 P0 3天
个人资料管理 P0 2天
偏好设置保存 P0 2天
核心推荐 多维度筛选器 P0 5天
智能推荐算法 P0 5天
推荐结果展示 P0 3天
历史记录 P1 2天
内容管理 美食数据库 P0 4天
图片资源管理 P0 2天
分类标签系统 P1 2天
商业化 应用内购买 P0 3天
订阅管理 P1 3天
支付集成(Apple/Google/微信) P0 4天
小程序 小程序适配 P1 5天
分享功能 P1 2天
其他 数据分析 P2 3天
推送通知 P2 2天
合计 52天

三、数据库设计

3.1 核心表结构

-- 用户表
CREATE TABLE users (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    email VARCHAR(255) UNIQUE NOT NULL,
    phone VARCHAR(20),
    nickname VARCHAR(50),
    avatar_url TEXT,
    subscription_type VARCHAR(20) DEFAULT 'free', -- free/premium/annual
    subscription_expires_at TIMESTAMP,
    created_at TIMESTAMP DEFAULT NOW(),
    updated_at TIMESTAMP DEFAULT NOW()
);

-- 用户偏好表
CREATE TABLE user_preferences (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    user_id UUID REFERENCES users(id),
    taste_sweet INT CHECK (taste_sweet BETWEEN 0 AND 5),
    taste_salty INT CHECK (taste_salty BETWEEN 0 AND 5),
    taste_sour INT CHECK (taste_sour BETWEEN 0 AND 5),
    taste_spicy INT CHECK (taste_spicy BETWEEN 0 AND 5),
    taste_umami INT CHECK (taste_umami BETWEEN 0 AND 5),
    health_calorie_preference VARCHAR(20), -- low/medium/high
    health_dietary_restrictions JSONB, -- ["vegetarian", "halal"]
    health_allergens JSONB, -- ["nuts", "seafood"]
    scene_meal_time VARCHAR(20), -- breakfast/lunch/dinner
    scene_budget VARCHAR(20), -- budget/moderate/premium
    created_at TIMESTAMP DEFAULT NOW(),
    updated_at TIMESTAMP DEFAULT NOW()
);

-- 美食项目表
CREATE TABLE food_items (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    name VARCHAR(100) NOT NULL,
    name_en VARCHAR(100),
    category VARCHAR(50) NOT NULL, -- burger/milktea/coffee/etc
    emoji VARCHAR(10),
    description TEXT,
    image_urls JSONB,

    -- 口味属性
    taste_sweet INT CHECK (taste_sweet BETWEEN 0 AND 5),
    taste_salty INT CHECK (taste_salty BETWEEN 0 AND 5),
    taste_sour INT CHECK (taste_sour BETWEEN 0 AND 5),
    taste_spicy INT CHECK (taste_spicy BETWEEN 0 AND 5),
    taste_umami INT CHECK (taste_umami BETWEEN 0 AND 5),

    -- 健康属性
    calories INT,
    protein DECIMAL(5,2),
    fat DECIMAL(5,2),
    carbs DECIMAL(5,2),
    is_vegetarian BOOLEAN DEFAULT FALSE,
    is_halal BOOLEAN DEFAULT FALSE,
    is_gluten_free BOOLEAN DEFAULT FALSE,
    allergens JSONB, -- ["milk", "eggs", "nuts"]

    -- 场景属性
    suitable_meal_times JSONB, -- ["breakfast", "lunch"]
    price_range VARCHAR(20), -- budget/moderate/premium
    prep_time_minutes INT,

    -- 元数据
    popularity_score DECIMAL(3,2) DEFAULT 0,
    is_active BOOLEAN DEFAULT TRUE,
    created_at TIMESTAMP DEFAULT NOW()
);

-- 用户选择历史表
CREATE TABLE user_selection_history (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    user_id UUID REFERENCES users(id),
    food_item_id UUID REFERENCES food_items(id),
    selected_at TIMESTAMP DEFAULT NOW(),
    rating INT CHECK (rating BETWEEN 1 AND 5),
    feedback TEXT
);

-- 应用内购买记录表
CREATE TABLE purchase_records (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    user_id UUID REFERENCES users(id),
    product_id VARCHAR(100) NOT NULL, -- premium_monthly/premium_annual
    platform VARCHAR(20) NOT NULL, -- ios/android/wechat
    transaction_id VARCHAR(255) UNIQUE NOT NULL,
    amount DECIMAL(10,2) NOT NULL,
    currency VARCHAR(3) DEFAULT 'CNY',
    status VARCHAR(20) DEFAULT 'completed', -- pending/completed/failed/refunded
    purchased_at TIMESTAMP DEFAULT NOW(),
    expires_at TIMESTAMP
);

四、商业化方案

4.1 定价策略

项目 iOS Android 小程序
下载价格 ¥12 / $1.99 免费下载 免费
高级版订阅 ¥18/月 或 ¥128/年 ¥15/月 或 ¥98/年 ¥12/月
永久解锁 ¥198 ¥168 ¥128

4.2 功能分层

┌─────────────────────────────────────────────────────────────┐
│                      免费版功能                              │
│  ├── 基础筛选 (口味、温度)                                  │
│  ├── 5个品类 (汉堡、奶茶、咖啡、披萨、火锅)                 │
│  ├── 每日3次推荐                                            │
│  └── 基础美食数据库 (100+ 条目)                             │
├─────────────────────────────────────────────────────────────┤
│                      高级版功能                              │
│  ├── 全部筛选维度 (健康、场景、个性化)                      │
│  ├── 全部9个品类                                            │
│  ├── 无限次推荐                                             │
│  ├── 完整美食数据库 (500+ 条目)                             │
│  ├── 历史记录与偏好学习                                     │
│  ├── 附近餐厅推荐 (LBS)                                     │
│  └── 无广告                                                 │
└─────────────────────────────────────────────────────────────┘

五、开发计划

5.1 里程碑规划

M1: 基础版本 (4周)
├── Week 1-2: 项目搭建 + 用户系统 + 基础UI
├── Week 3: 核心推荐功能 + 5个品类数据
└── Week 4: 测试优化 + iOS/Android打包

M2: 商业化版本 (3周)
├── Week 5: 支付系统 + 订阅管理
├── Week 6: 完整筛选维度 + 全部品类
└── Week 7: 测试 + 应用商店准备

M3: 小程序 + 优化 (3周)
├── Week 8-9: 小程序开发
├── Week 10: 数据分析 + 推荐算法优化
└── 上线发布

5.2 成本估算

项目 费用 说明
开发成本 ¥80,000-120,000 外包或自建团队2-3人,2-3个月
服务器 ¥500-2000/月 初期配置,随用户增长扩容
应用商店 $99/年 + $25一次性 Apple开发者 + Google Play
支付手续费 15-30% Apple/Google 抽成
设计资源 ¥10,000-20,000 UI设计、图标、插画
推广预算 ¥20,000-50,000 初期ASO、广告投放
合计首年 ¥15-25万

六、上架准备清单

6.1 iOS App Store

  • [ ] Apple Developer账号 ($99/年)
  • [ ] 应用截图 (6.5寸、5.5寸、iPad各3-5张)
  • [ ] 应用预览视频 (可选但推荐)
  • [ ] 应用描述 (关键词优化)
  • [ ] 隐私政策页面
  • [ ] 用户协议
  • [ ] 应用分级问卷
  • [ ] 沙盒测试账号

6.2 Android Google Play

  • [ ] Google Play开发者账号 ($25一次性)
  • [ ] 应用截图 (手机、平板、折叠屏)
  • [ ] 应用描述 (多语言)
  • [ ] 隐私政策
  • [ ] 内容分级问卷
  • [ ] 64位架构支持

6.3 微信小程序

  • [ ] 企业主体小程序账号
  • [ ] ICP备案 (如含支付)
  • [ ] 微信认证 (¥300/年)
  • [ ] 隐私保护指引
  • [ ] 用户授权说明

七、技术栈总结

层级 技术选型
前端 Flutter 3.x (iOS/Android) + Taro (小程序)
后端 Node.js + Express / NestJS
推荐引擎 Python + scikit-learn
数据库 PostgreSQL + Redis
搜索 Elasticsearch
文件存储 AWS S3 / 阿里云OSS
支付 Apple IAP + Google Billing + 微信支付
分析 Firebase Analytics + 神策数据
CI/CD GitHub Actions + Fastlane

八、下一步行动

  1. 确认技术方案 - 是否采用Flutter方案?
  2. 准备设计稿 - 需要UI/UX设计资源
  3. 申请开发者账号 - Apple/Google/微信
  4. 组建开发团队 - 确定外包或自建
  5. 制定详细排期 - 确认各里程碑交付时间

文档版本: v1.0
创建日期: 2025-05-19
更新日期: 2025-05-19