家庭点菜小程序 - 毕业设计项目方案

家庭点菜小程序 - 毕业设计项目方案

一、 项目背景与意义

随着生活节奏加快,家庭饮食健康问题日益突出。尤其是有老人、小孩、孕妇的家庭,更需要科学合理的饮食搭配。本设计旨在开发一款家庭点菜小程序,帮助用户便捷地完成一日三餐的点餐需求,并提供个性化的养生菜单推荐,提升家庭饮食健康水平。

二、 项目目标

  • 开发一款操作简便、界面友好的家庭点菜小程序。
  • 提供丰富的菜品库,涵盖家常菜、养生菜、孕妇餐、儿童餐等。
  • 支持家庭成员管理,记录每个成员的饮食偏好和禁忌。
  • 根据家庭成员信息和健康状况,智能推荐每日菜谱。
  • 提供食材采购清单功能,方便用户购买食材。
  • 支持菜品收藏、评价、分享等功能,提升用户互动体验。

三、 功能模块设计

1. 用户模块

  • 用户注册/登录:支持手机号、微信等方式注册登录。
  • 家庭成员管理:添加、编辑、删除家庭成员,设置年龄、性别、健康状况、饮食偏好等信息。
  • 个人中心:查看个人信息、历史点餐记录、收藏的菜品等。

2. 菜品模块

  • 菜品分类:按菜系、口味、烹饪方式、适用人群等进行分类。
  • 菜品详情:展示菜品图片、名称、简介、食材、做法、营养价值等信息。
  • 菜品搜索:支持按关键词、分类、食材等条件搜索菜品。
  • 菜品收藏:用户可收藏喜欢的菜品,方便下次点餐。
  • 菜品评价:用户可对已点菜品进行评价,分享用餐体验。

3. 点餐模块

  • 智能推荐:根据家庭成员信息和健康状况,推荐每日菜谱。
  • 手动点餐:用户可手动选择菜品,添加到每日菜谱。
  • 食材清单:根据所选菜品,自动生成食材采购清单。
  • 点餐记录:记录用户历史点餐记录,方便查看和再次点餐。

4. 养生模块

  • 健康资讯:提供饮食健康、营养搭配等方面的资讯文章。
  • 营养分析:分析用户点餐记录,提供营养摄入情况报告。
  • 健康提醒:根据用户健康状况,提供饮食建议和提醒。

5. 后台管理模块

  • 菜品管理:添加、编辑、删除菜品信息。
  • 用户管理:管理用户信息、权限等。
  • 数据统计:统计用户数量、点餐数据、菜品销量等。

四、 技术方案

  • 前端:微信小程序开发框架(WXML、WXSS、JavaScript)
  • 后端:Node.js + Express 框架
  • 数据库:MySQL
  • 人工智能:利用机器学习算法,实现智能推荐功能。

五、 可行性分析

  • 技术可行性:所选技术成熟稳定,开发资源丰富。
  • 经济可行性:开发成本可控,后期维护成本低。
  • 社会可行性:符合当前家庭饮食健康需求,市场前景广阔。

六、 项目进度安排

  • 第1-2周:需求分析,完成项目需求文档。
  • 第3-4周:系统设计,完成系统架构设计和数据库设计。
  • 第5-8周:编码实现,完成各功能模块开发。
  • 第9-10周:测试调试,修复bug,优化系统性能。
  • 第11-12周:部署上线,进行用户测试和反馈收集。

七、 预期成果

  • 一款功能完善、操作简便的家庭点菜小程序。
  • 一份完整的毕业设计论文,包括需求分析、系统设计、技术实现、测试结果等内容。

八、 创新点

  • 针对不同家庭成员,提供个性化的养生菜单推荐。
  • 利用人工智能技术,实现智能点餐和营养分析。
  • 提供食材采购清单功能,方便用户购买食材。

九、 未来展望

  • 与生鲜电商平台合作,实现食材一键购买。
  • 开发智能语音点餐功能,提升用户体验。
  • 拓展更多健康管理功能,打造家庭健康管理平台。

十、以下是详细的实现步骤:

为了帮助你更详细地实现一个可以直接搭建的家庭点菜小程序,我将分步骤提供完整的代码和配置说明。以下是详细的实现步骤:


1. 环境准备

1.1 安装开发工具

1.2 创建项目

  1. 打开微信开发者工具,创建一个新的小程序项目。
  2. 项目名称:家庭点菜小程序
  3. 选择项目目录,AppID 可以选择测试号。

2. 后端实现

2.1 初始化后端项目

  1. 在项目根目录下创建 server 文件夹。
  2. server 文件夹中初始化 Node.js 项目:
    cd server
    npm init -y
    npm install express mysql body-parser cors
    

2.2 后端代码

server 文件夹中创建以下文件:

server/app.js
const express = require('express');
const bodyParser = require('body-parser');
const cors = require('cors');
const mysql = require('mysql');
const app = express();

// 数据库连接
const db = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: 'password', // 替换为你的 MySQL 密码
    database: 'family_food'
});

db.connect((err) => {
    if (err) throw err;
    console.log('MySQL connected...');
});

// 中间件
app.use(cors());
app.use(bodyParser.json());

// 获取菜品列表
app.get('/api/dishes', (req, res) => {
    const sql = 'SELECT * FROM dishes';
    db.query(sql, (err, results) => {
        if (err) throw err;
        res.json(results);
    });
});

// 获取单个菜品详情
app.get('/api/dishes/:id', (req, res) => {
    const dishId = req.params.id;
    const sql = 'SELECT * FROM dishes WHERE id = ?';
    db.query(sql, [dishId], (err, result) => {
        if (err) throw err;
        res.json(result[0]);
    });
});

// 提交点餐订单
app.post('/api/orders', (req, res) => {
    const { user_id, dish_id, order_date } = req.body;
    const sql = 'INSERT INTO orders (user_id, dish_id, order_date) VALUES (?, ?, ?)';
    db.query(sql, [user_id, dish_id, order_date], (err, result) => {
        if (err) throw err;
        res.json({ message: 'Order placed successfully!' });
    });
});

// 启动服务器
const PORT = 5000;
app.listen(PORT, () => {
    console.log(`Server running on port ${PORT}`);
});
server/init_db.js

用于初始化数据库表结构:

const mysql = require('mysql');

const db = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: 'password' // 替换为你的 MySQL 密码
});

db.connect((err) => {
    if (err) throw err;
    console.log('MySQL connected...');

    // 创建数据库
    db.query('CREATE DATABASE IF NOT EXISTS family_food', (err) => {
        if (err) throw err;
        console.log('Database created or already exists');

        // 使用数据库
        db.query('USE family_food', (err) => {
            if (err) throw err;

            // 创建表
            const sql = `
                CREATE TABLE IF NOT EXISTS dishes (
                    id INT AUTO_INCREMENT PRIMARY KEY,
                    name VARCHAR(100) NOT NULL,
                    description TEXT,
                    ingredients TEXT,
                    cooking_method TEXT,
                    nutrition_info TEXT,
                    category ENUM('家常菜', '养生菜', '孕妇餐', '儿童餐'),
                    suitable_for VARCHAR(255)
                );
                CREATE TABLE IF NOT EXISTS orders (
                    id INT AUTO_INCREMENT PRIMARY KEY,
                    user_id INT,
                    dish_id INT,
                    order_date DATE
                );
            `;
            db.query(sql, (err) => {
                if (err) throw err;
                console.log('Tables created or already exist');
                db.end();
            });
        });
    });
});

运行以下命令初始化数据库:

node init_db.js

3. 前端实现

3.1 小程序页面结构

在微信开发者工具中,创建以下页面:

  • index(首页)
  • detail(菜品详情页)
pages/index/index.wxml
<view class="container">
    <view class="header">
        <text>家庭点菜小程序</text>
    </view>
    <view class="menu">
        <block wx:for="{{dishes}}" wx:key="id">
            <view class="dish-item" bindtap="viewDishDetail" data-id="{{item.id}}">
                <text>{{item.name}}</text>
            </view>
        </block>
    </view>
</view>
pages/index/index.js
Page({
    data: {
        dishes: []
    },
    onLoad() {
        // 获取菜品列表
        wx.request({
            url: 'http://localhost:5000/api/dishes',
            success: (res) => {
                this.setData({ dishes: res.data });
            }
        });
    },
    viewDishDetail(e) {
        const dishId = e.currentTarget.dataset.id;
        wx.navigateTo({
            url: `/pages/detail/detail?id=${dishId}`
        });
    }
});
pages/detail/detail.wxml
<view class="container">
    <view class="dish-detail">
        <text>{{dish.name}}</text>
        <text>{{dish.description}}</text>
        <text>食材: {{dish.ingredients}}</text>
        <text>做法: {{dish.cooking_method}}</text>
        <button bindtap="placeOrder">点餐</button>
    </view>
</view>
pages/detail/detail.js
Page({
    data: {
        dish: {}
    },
    onLoad(options) {
        const dishId = options.id;
        wx.request({
            url: `http://localhost:5000/api/dishes/${dishId}`,
            success: (res) => {
                this.setData({ dish: res.data });
            }
        });
    },
    placeOrder() {
        const { dish } = this.data;
        wx.request({
            url: 'http://localhost:5000/api/orders',
            method: 'POST',
            data: {
                user_id: 1, // 假设用户 ID 为 1
                dish_id: dish.id,
                order_date: new Date().toISOString().split('T')[0]
            },
            success: (res) => {
                wx.showToast({
                    title: '点餐成功!',
                    icon: 'success'
                });
            }
        });
    }
});

4. 运行项目

  1. 启动后端服务:
    cd server
    node app.js
    
  2. 在微信开发者工具中运行小程序。

5. 测试数据

在 MySQL 中插入一些测试数据:

INSERT INTO dishes (name, description, ingredients, cooking_method, category, suitable_for)
VALUES 
('番茄炒蛋', '经典家常菜', '番茄、鸡蛋', '炒', '家常菜', '所有人'),
('红枣枸杞鸡汤', '养生汤品', '鸡肉、红枣、枸杞', '炖', '养生菜', '老人、孕妇');

6. 扩展功能

为了进一步扩展家庭点菜小程序的功能,我们可以从以下几个方面进行增强:


1. 用户系统

1.1 用户注册与登录

后端实现

server/app.js 中添加用户注册和登录接口:

const bcrypt = require('bcryptjs'); // 安装 bcryptjs:npm install bcryptjs

// 用户注册
app.post('/api/register', (req, res) => {
    const { username, password, phone } = req.body;
    const hashedPassword = bcrypt.hashSync(password, 10);
    const sql = 'INSERT INTO users (username, password, phone) VALUES (?, ?, ?)';
    db.query(sql, [username, hashedPassword, phone], (err, result) => {
        if (err) throw err;
        res.json({ message: 'User registered successfully!' });
    });
});

// 用户登录
app.post('/api/login', (req, res) => {
    const { username, password } = req.body;
    const sql = 'SELECT * FROM users WHERE username = ?';
    db.query(sql, [username], (err, results) => {
        if (err) throw err;
        if (results.length > 0) {
            const user = results[0];
            if (bcrypt.compareSync(password, user.password)) {
                res.json({ message: 'Login successful!', user });
            } else {
                res.status(401).json({ message: 'Invalid password' });
            }
        } else {
            res.status(404).json({ message: 'User not found' });
        }
    });
});
前端实现

pages/login/login.wxml 中创建登录页面:

<view class="container">
    <view class="form">
        <input placeholder="用户名" bindinput="inputUsername" />
        <input placeholder="密码" password bindinput="inputPassword" />
        <button bindtap="login">登录</button>
        <button bindtap="navigateToRegister">注册</button>
    </view>
</view>

pages/login/login.js 中实现登录逻辑:

Page({
    data: {
        username: '',
        password: ''
    },
    inputUsername(e) {
        this.setData({ username: e.detail.value });
    },
    inputPassword(e) {
        this.setData({ password: e.detail.value });
    },
    login() {
        const { username, password } = this.data;
        wx.request({
            url: 'http://localhost:5000/api/login',
            method: 'POST',
            data: { username, password },
            success: (res) => {
                if (res.data.message === 'Login successful!') {
                    wx.setStorageSync('user', res.data.user); // 存储用户信息
                    wx.switchTab({ url: '/pages/index/index' });
                } else {
                    wx.showToast({ title: res.data.message, icon: 'none' });
                }
            }
        });
    },
    navigateToRegister() {
        wx.navigateTo({ url: '/pages/register/register' });
    }
});

2. 智能推荐

2.1 基于用户点餐记录的推荐

后端实现

server/app.js 中添加推荐接口:

// 获取推荐菜品
app.get('/api/recommendations/:userId', (req, res) => {
    const userId = req.params.userId;
    const sql = `
        SELECT d.* FROM dishes d
        JOIN orders o ON d.id = o.dish_id
        WHERE o.user_id = ?
        GROUP BY d.id
        ORDER BY COUNT(*) DESC
        LIMIT 5
    `;
    db.query(sql, [userId], (err, results) => {
        if (err) throw err;
        res.json(results);
    });
});
前端实现

pages/index/index.js 中调用推荐接口:

Page({
    data: {
        dishes: [],
        recommendations: []
    },
    onLoad() {
        const user = wx.getStorageSync('user');
        if (user) {
            // 获取推荐菜品
            wx.request({
                url: `http://localhost:5000/api/recommendations/${user.id}`,
                success: (res) => {
                    this.setData({ recommendations: res.data });
                }
            });
        }

        // 获取所有菜品
        wx.request({
            url: 'http://localhost:5000/api/dishes',
            success: (res) => {
                this.setData({ dishes: res.data });
            }
        });
    }
});

3. 食材采购清单

3.1 根据点餐记录生成采购清单

后端实现

server/app.js 中添加采购清单接口:

// 获取采购清单
app.get('/api/shopping-list/:userId', (req, res) => {
    const userId = req.params.userId;
    const sql = `
        SELECT DISTINCT ingredients FROM dishes d
        JOIN orders o ON d.id = o.dish_id
        WHERE o.user_id = ?
    `;
    db.query(sql, [userId], (err, results) => {
        if (err) throw err;
        const ingredients = results.map(r => r.ingredients).join(',').split(',').filter((v, i, a) => a.indexOf(v) === i);
        res.json(ingredients);
    });
});
前端实现

pages/shopping-list/shopping-list.wxml 中显示采购清单:

<view class="container">
    <view class="header">
        <text>采购清单</text>
    </view>
    <view class="list">
        <block wx:for="{{ingredients}}" wx:key="index">
            <text>{{item}}</text>
        </block>
    </view>
</view>

pages/shopping-list/shopping-list.js 中获取采购清单:

Page({
    data: {
        ingredients: []
    },
    onLoad() {
        const user = wx.getStorageSync('user');
        if (user) {
            wx.request({
                url: `http://localhost:5000/api/shopping-list/${user.id}`,
                success: (res) => {
                    this.setData({ ingredients: res.data });
                }
            });
        }
    }
});

4. 健康提醒

4.1 根据用户健康状况推送提醒

后端实现

server/app.js 中添加健康提醒接口:

// 获取健康提醒
app.get('/api/health-reminders/:userId', (req, res) => {
    const userId = req.params.userId;
    const sql = 'SELECT health_condition FROM family_members WHERE user_id = ?';
    db.query(sql, [userId], (err, results) => {
        if (err) throw err;
        const reminders = results.map(r => `注意:${r.health_condition}`);
        res.json(reminders);
    });
});
前端实现

pages/index/index.js 中显示健康提醒:

Page({
    data: {
        dishes: [],
        recommendations: [],
        reminders: []
    },
    onLoad() {
        const user = wx.getStorageSync('user');
        if (user) {
            // 获取健康提醒
            wx.request({
                url: `http://localhost:5000/api/health-reminders/${user.id}`,
                success: (res) => {
                    this.setData({ reminders: res.data });
                }
            });
        }
    }
});

5. 部署与优化

  • 部署后端: 使用云服务器(如阿里云、腾讯云)部署 Node.js 服务。
  • 优化性能: 使用 Redis 缓存热门菜品数据。
  • 安全性: 添加 JWT 鉴权,保护用户数据。

十一、 参考文献

  • [1] 微信小程序开发文档. https://developers.weixin.qq.com/miniprogram/dev/framework/
  • [2] Node.js 官方文档. https://nodejs.org/en/docs/
  • [3] Express 框架文档. https://expressjs.com/
  • [4] MySQL 官方文档. https://dev.mysql.com/doc/

备注:

  • 以上方案仅供参考,具体内容可根据实际情况进行调整。
  • 开发过程中需注意代码规范、注释清晰、文档齐全。
  • 项目完成后需进行充分的测试,确保系统稳定可靠。

赶紧收藏+点赞+关注,获取更多 Python 爬虫实战教程! 希望以上方案能够帮助你顺利完成毕业设计!🔥

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值