家庭点菜小程序 - 毕业设计项目方案
一、 项目背景与意义
随着生活节奏加快,家庭饮食健康问题日益突出。尤其是有老人、小孩、孕妇的家庭,更需要科学合理的饮食搭配。本设计旨在开发一款家庭点菜小程序,帮助用户便捷地完成一日三餐的点餐需求,并提供个性化的养生菜单推荐,提升家庭饮食健康水平。
二、 项目目标
- 开发一款操作简便、界面友好的家庭点菜小程序。
- 提供丰富的菜品库,涵盖家常菜、养生菜、孕妇餐、儿童餐等。
- 支持家庭成员管理,记录每个成员的饮食偏好和禁忌。
- 根据家庭成员信息和健康状况,智能推荐每日菜谱。
- 提供食材采购清单功能,方便用户购买食材。
- 支持菜品收藏、评价、分享等功能,提升用户互动体验。
三、 功能模块设计
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 创建项目
- 打开微信开发者工具,创建一个新的小程序项目。
- 项目名称:
家庭点菜小程序
。 - 选择项目目录,AppID 可以选择测试号。
2. 后端实现
2.1 初始化后端项目
- 在项目根目录下创建
server
文件夹。 - 在
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. 运行项目
- 启动后端服务:
cd server node app.js
- 在微信开发者工具中运行小程序。
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 爬虫实战教程! 希望以上方案能够帮助你顺利完成毕业设计!🔥