一、项目背景与痛点
当下美食爱好者、家庭主厨、餐饮从业者获取菜谱、采购食材的需求十分普遍。主流美食平台大多广告繁杂、教程碎片化,同时菜谱与食材相互割裂,存在诸多现实痛点:
- 菜谱资源杂乱无章:各类食谱分散在不同平台、短视频中,无统一分类体系,家常菜、烘焙、川菜等内容混杂,查找目标教程效率极低;
- 图文教程体验差:多数平台步骤简略,缺少分步配图、用料明细,新手难以跟着实操;
- 菜谱与食材脱节:看到心仪菜品后,需要单独去商超、线上平台采购食材,无法一键配齐,流程繁琐;
- 缺少个人收藏与整理:用户无法收藏常用菜谱、搭建个人食谱库,再次查阅需要重复搜索;
- 社区互动薄弱:没有点评、晒作品功能,用户无法交流做菜心得、反馈菜品口感;
- 食材售卖管理简陋:小型生鲜商户、食材摊主缺少轻量化线上售卖渠道,无法关联菜谱精准引流;
- 无智能推荐能力:不能根据用户浏览、收藏记录推送相似菜谱,个性化体验不足。
针对食谱分享与食材采购割裂的行业痛点,本次基于Python+Django4.2+富文本编辑器+图片托管+Ajax 搭建一体化美食平台,实现菜谱发布、图文教程、收藏点赞、食材商城、购物车、订单结算、美食点评、智能推荐全套能力。本项目开辟内容社区+轻电商融合全新赛道,和往期所有项目无功能、代码、业务场景重合。
二、核心目标与定位
本项目核心目标:搭建食谱分享+食材采购一体化轻量化平台,实现用户发布图文菜谱→分类展示与检索→菜谱收藏点赞→食材商城选购→购物车管理→订单提交履约→美食点评互动→基于行为的智能食谱推荐完整闭环,打通"学做菜+买食材"全链路,打造纯净无广告的美食社区与便民食材商城。
项目精准定位:融合内容社区与轻电商的综合Web系统,采用Django原生MVT架构,部署简单、资源占用小;划分普通美食用户、食材商家、平台管理员三类角色,权限分级隔离;面向美食爱好者、家庭用户、小型食材商户,主打食谱内容优质、采购便捷、社区互动活跃、轻量化易运维。
核心设计理念:食谱分类标准化、教程图文可视化、食材采购一体化、社区互动常态化、推荐个性化,解决菜谱查找难、食材选购繁琐、社区体验差的核心问题。
三、整体技术方案
项目基于Django原生MVT分层架构开发,MySQL存储菜谱、分类、食材、订单、评论、用户行为数据,集成富文本编辑器实现图文菜谱发布,Django Media托管菜品/食材图片,Ajax实现购物车、点赞无刷新交互,基于用户浏览记录实现简易协同推荐算法,自定义中间件完成角色权限管控。整体分层架构流程图如下:
plain
┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 菜谱发布层 │────▶│ 内容检索层 │────▶│ 收藏互动层 │────▶│ 食材商城层 │
│ 富文本编辑、分步配图、用料填写 │ 分类/关键词检索菜谱 │ 点赞收藏、作品晒图 │ 食材浏览、规格选择 │
│ │ │ │
▼ ▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 购物车层 │────▶│ 订单履约层 │────▶│ 点评社区层 │
│ 商品添加、数量修改、结算 │ 订单生成、状态流转、发货签收 │ 菜品点评、心得交流 │
│ │ │
▼ ▼
┌─────────────┐
│ 智能推荐层 │
│ 基于浏览/收藏记录推送相似菜谱 │
│
▼
┌─────────────────────────────────────────────────────────────────────────┐
│ 底层技术底座 │
│ - 后端框架:Python3.11 + Django4.2 原生MVT架构 │
│ - 数据存储:MySQL 存储菜谱、食材、订单、评论、用户行为全量数据 │
│ - 富文本:集成开源编辑器,支持图文混排、分步教程编写 │
│ - 图片托管:Django Media 统一管理菜品图、食材图、用户作品图 │
│ 前端交互:Ajax 实现点赞、收藏、购物车无刷新操作 │
│ 推荐算法:基于用户行为的简易协同过滤,实现菜谱个性化推荐 │
│ 权限体系:多角色中间件,区分用户、商家、管理员权限 │
│ 数据统计:ORM聚合查询,统计热门菜谱、热销食材 │
└─────────────────────────────────────────────────────────────────────────
完整技术栈清单:
- Web后端:Python 3.11、Django 4.2 原生MVT轻量化架构
- 数据库:MySQL 8.0,结构化存储社区与电商全业务数据
- 富文本编辑:集成第三方编辑器,支持图文菜谱创作
- 文件管理:Django Media 实现各类图片上传与存储
- 异步交互:Ajax 完成点赞、收藏、购物车无刷新操作
- 推荐逻辑:基于用户行为的简易推荐算法
- 权限控制:自定义中间件,实现三角色权限隔离
- 数据统计:Django ORM 聚合函数完成热度、销量统计
四、核心能力模块详解
1. 菜谱分类与发布模块(核心亮点)
搭建多级菜谱分类体系,支持专业图文教程创作,满足内容分享需求:
- 多级分类:按菜系、菜品类型、烹饪方式划分(川菜/甜品/蒸菜/凉菜等),管理员可自由增删分类;
- 完整菜谱录入:填写菜名、用料配比、烹饪时长、难度等级,支持分步文字+配图教程;
- 富文本创作:支持字体排版、图片插入、段落分隔,还原线下食谱手册效果;
- 菜谱状态:区分公开分享、仅个人可见两种模式,保护私人食谱。
2. 菜谱检索与收藏模块
多样化检索+个人食谱库,方便用户快速查找、整理心仪菜品:
- 多维度检索:支持关键词、菜系、难度、烹饪时间组合筛选;
- 点赞收藏:一键点赞、收藏菜谱,自动归入个人食谱库;
- 个人中心:统一查看已发布、已收藏内容,支持二次编辑菜谱;
- 热门排行:自动统计点赞量,展示全站热门菜谱榜单。
3. 食材商城管理模块
关联菜谱搭建食材线上商城,实现"看菜谱→买食材"一站式体验:
- 食材上架:商家录入食材名称、规格、单价、库存、实拍图,区分生鲜、干货、调料;
- 库存管控:库存不足自动提醒,禁止超量下单;
- 食材关联:后台可将食材绑定对应菜谱,用户查看菜品时自动推荐配套食材;
- 商品上下架:商家自主管理食材在售/下架状态。
4. 购物车与订单模块
标准轻电商购物流程,操作简洁适配家庭采购场景:
- 购物车功能:添加食材、修改数量、单品删除、全选结算;
- 订单生成:结算自动计算总价,生成唯一订单编号;
- 订单状态:待付款、待发货、待签收、已完成、已取消全状态流转;
- 订单台账:用户查看历史订单,商家管理发货、售后记录。
5. 美食点评与社区互动模块
打造交流社区,用户分享做菜心得、成品实拍:
- 菜品点评:用户可对任意菜谱发表评论、打分;
- 作品晒图:上传自己制作的菜品实拍图,互动交流;
- 评论管理:管理员可删除违规言论,维护社区氛围;
- 问答互动:针对用料、步骤进行提问交流。
6. 个性化菜谱推荐模块
基于用户行为实现智能推送,提升平台使用粘性:
- 行为采集:自动记录用户浏览、收藏、点赞的菜谱标签;
- 相似推荐:根据历史行为推送同菜系、同难度菜品;
- 首页推荐:结合全站热度+个人偏好综合展示内容;
- 推荐刷新:支持手动刷新推荐列表。
7. 后台综合运维模块
统一管理内容、商品、用户与数据,适配平台运营需求:
- 内容审核:审核新增菜谱,拦截违规内容;
- 用户管理:账号状态管控,区分普通用户与商家权限;
- 数据统计:统计菜谱总量、食材销量、社区活跃度;
- 分类维护:统一管理菜系、食材分类。
五、创新价值与亮点
- 内容+电商深度融合 打破传统菜谱与食材割裂的痛点,实现学做菜、买食材一站式闭环,场景贴合日常需求;
- 专业图文菜谱体系 富文本+分步配图的教程形式,比普通文本菜谱可读性更强,适配新手学习;
- 轻量化社区电商 摒弃大型电商复杂功能,专注食材零售,部署简单、运维成本低,适合小型商户使用;
- 个性化智能推荐 基于用户行为做简易推荐,提升平台个性化体验;
- 多角色精准分权 普通用户、食材商家、管理员各司其职,数据与操作权限严格隔离。
六、应用前景与落地场景
- 个人美食社区 美食爱好者交流、分享菜谱,整理个人专属食谱库;
- 社区食材小店 小区生鲜、调料商户搭建线上售卖渠道,依托菜谱引流;
- 餐饮培训机构 用于教学菜谱展示、学员食材统一采购;
- 毕业设计/求职项目 内容社区+轻电商融合场景,区别于纯管理系统、纯商城,差异化优势突出。
七、完整代码结构示例
1. 项目整体目录结构
python
django-food-recipe-shop/
├── manage.py
├── food_project/ # 项目全局配置
│ ├── settings.py # 数据库、富文本、图片、权限配置
│ ├── urls.py # 全局路由分发
│ └── middleware.py # 角色权限拦截中间件
├── apps/ # 模块化业务拆分
│ ├── user_auth/ # 用户、商家、管理员账号权限模块
│ ├── recipe_category/ # 菜谱菜系分类模块
│ ├── recipe_publish/ # 菜谱发布、图文编辑、收藏点赞模块
│ ├── food_goods/ # 食材商品、库存、上架模块
│ ├── shop_cart/ # 购物车管理模块
│ ├── trade_order/ # 订单生成、状态流转模块
│ ├── food_comment/ # 菜谱点评、作品晒图模块
│ └── recipe_recommend/ # 智能菜谱推荐模块
├── core/ # 公共工具类
│ ├── img_handle.py # 图片压缩、格式处理工具
│ ├── recommend_algo.py # 简易推荐算法工具
│ ├── order_calc.py # 订单金额计算工具
│ └── data_stat.py # 热度、销量统计工具
├── static/ # 样式、富文本、前端脚本
├── templates/ # 前台、后台所有页面模板
├── media/ # 菜谱图、食材图、用户作品图存储
├── requirements.txt # 项目依赖包
└── readme.md # 部署与使用文档
</pre>
### 2. 核心可运行代码片段
#### 示例1:菜谱、食材、购物车、订单核心数据模型
```python
from django.db import models
from django.contrib.auth.models
# 菜谱难度枚举
DIFFICULTY_CHOICE = (
("easy", "简单"),
("normal", "中等"),
("hard", "困难"),
)
# 订单状态枚举
ORDER_STATUS = (
("unpay", "待付款"),
("send", "待发货"),
("receive", "待签收"),
("finish", "已完成"),
("cancel", "已取消"),
)
class RecipeCategory(models.Model):
"""菜谱分类(菜系)"""
name = models.CharField(max=50, verbose_name="分类名称")
create_time = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.name
class Recipe(models.Model):
"""菜谱主模型"""
author = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="发布者")
category = models.ForeignKey(RecipeCategory, on_delete=models.CASCADE, verbose_name="所属菜系")
title = models.CharField(max=100, verbose_name="菜品名称")
material = models.TextField(verbose_name="用料明细")
cook_time = models.IntegerField(verbose_name="烹饪时长(分钟)")
difficulty = models.CharField(max=10, choices=DIFFICULTY_CHOICE, verbose_name="难度")
content = models.TextField(verbose_name="图文教程内容")
cover_img = models.ImageField(upload="recipe/", verbose_name="菜品封面图")
like_num = models.IntegerField(default=0, verbose_name="点赞数")
collect_num = models.IntegerField(default=0, verbose_name="收藏数")
is_public = models.BooleanField(default=True, verbose_name="是否公开")
create_time = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title
class FoodGoods(models.Model):
"""食材商品模型"""
seller = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="商家")
goods_name = models.CharField(max=60, verbose_name="食材名称")
goods_img = models.ImageField(upload="goods/", verbose_name="商品图片")
price = models.DecimalField(max_digits=7, decimal_places=2, verbose_name="单价")
stock = models.IntegerField(default=0, verbose_name="库存数量")
unit = models.CharField(max=20, verbose_name="单位(斤/份)")
is_on_sale = models.BooleanField(default=True, verbose_name="是否上架")
create_time = models.DateTimeField(auto_now_add=True)
class ShopCart(models.Model):
"""购物车模型"""
user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="所属用户")
goods = models.ForeignKey(FoodGoods, on_delete=models.CASCADE, verbose_name="关联食材")
num = models.IntegerField(default=1, verbose_name="购买数量")
create_time = models.DateTimeField(auto_now_add=True)
class FoodOrder(models.Model):
"""食材订单模型"""
order_sn = models.CharField(max=32, unique=True, verbose_name="订单编号")
user = models.ForeignKey(User, related="buy_order", on_delete=models.CASCADE, verbose_name="买家")
total_price = models.DecimalField(max_digits=8, decimal_places=2, verbose_name="订单总价")
status = models.CharField(max=10, choices=ORDER_STATUS, default="unpay", verbose_name="订单状态")
create_time = models.DateTimeField(auto_now_add=True)
示例2:菜谱点赞收藏工具类(core/like_collect.py)
python
from apps.recipe_publish.models import Recipe
from apps.recipe_publish.models import UserCollect
class RecipeOperate:
"""菜谱点赞、收藏工具类"""
@classmethod
def add_like(cls, user, recipe_id):
"""点赞操作"""
try:
recipe = Recipe.objects.get(id=recipe_id)
recipe.like_num += 1
recipe.save()
return True, "点赞成功"
except Recipe.DoesNotExist:
return False, "菜谱不存在"
@classmethod
def add_collect(cls, user, recipe_id):
"""收藏操作"""
recipe = Recipe.objects.get(id=recipe_id)
# 去重判断
if UserCollect.objects.filter(user=user, recipe=recipe).exists():
return False, "已收藏,无需重复操作"
UserCollect.objects.create(user=user, recipe=recipe)
recipe.collect_num += 1
recipe.save()
return True, "收藏成功"
示例3 食材商品列表视图
python
from django.views import View
from django.shortcuts import render
from apps.food_goods.models import FoodGoods
class GoodsListView(View):
"""食材商品列表视图"""
def get(self, request):
# 仅查询上架商品
goods_list = FoodGoods.objects.filter(is_on_sale=True).order_by("-create_time")
return render(request, "goods_list.html", {"goods_list": goods_list})
八、总结与展望
本篇博客聚焦美食内容社区+轻食材电商 融合赛道,和日志、天气、在线考试、图书、网盘、考勤、租赁、驾校、兼职、二手等所有往期项目完全独立。项目融合富文本编辑、图片处理、Ajax交互、简易推荐算法、电商订单流转、多角色权限等技术,打通"菜谱学习+食材采购"完整场景,业务贴近日常生活,代码规范且具备很强的落地性。
该项目既可以学习Django内容类站点+轻电商的综合开发思路,也是毕业设计、求职简历中辨识度很高的融合型实战项目。
后续迭代规划
- 新增菜谱标签功能,按口味、季节等标签细化分类与推荐;
- 接入短信通知,订单状态、评论回复主动推送提醒;
- 新增食材套餐功能,将常用搭配食材组合售卖;
- 开发移动端适配页面,支持手机端浏览菜谱、下单采购。