尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Python全栈项目--校园食堂点餐与推荐系统
一、项目简介校园食堂通常存在高峰排队时间长、菜品信息分散、学生不知道吃什么、食堂窗口难以及时了解用户偏好等问题。本项目以“校园食堂点餐与推荐系统”为主题实现一个可运行的 Python 全栈应用学生可以注册登录、浏览菜品、搜索筛选、收藏菜品、加入购物车、提交订单并根据历史订单与收藏偏好获得推荐菜品。项目代码位于project/目录后端使用 FastAPI 提供 REST APISQLite 保存用户、菜品、订单和收藏数据前端使用 Vue 3 Vite 构建交互式单页应用。二、技术栈层次技术作用后端框架FastAPI提供高性能 RESTful API、自动接口文档数据库SQLite轻量级本地数据存储适合课程设计和原型项目ORMSQLAlchemy定义数据模型并完成数据库操作数据校验Pydantic请求体和响应结构校验认证鉴权Passlib PyJWT密码哈希、JWT 登录 token、接口保护前端Vue 3 Vite组件化页面、状态驱动交互、快速开发调试通信方式Fetch API前后端 JSON 数据交互三、系统架构系统采用前后端分离架构浏览器 Vue 3 页面 │ HTTP/JSON Bearer Token ▼ FastAPI 路由层 main.py │ ├── security.pyJWT 生成与解析、密码哈希 ├── schemas.py请求/响应模型 ├── crud.py业务逻辑 ├── models.pySQLAlchemy 数据模型 ▼ SQLite canteen.db后端在启动时自动创建数据表并初始化示例菜品。除注册、登录和健康检查外菜品查询、推荐、收藏、下单、订单查询等核心接口都需要登录 token。四、功能模块用户模块注册、登录、获取当前用户、退出登录。认证模块密码 bcrypt 哈希存储登录后签发 JWT前端请求自动携带 token。菜品模块查看菜品支持关键词搜索和分类筛选。收藏模块学生可收藏或取消收藏菜品作为推荐依据之一。购物车与订单模块菜品加入购物车填写取餐时间提交订单并扣减库存。推荐模块根据用户常点分类、收藏分类或新用户高评分菜品生成推荐。统计模块展示菜品数量、订单数量、收藏数量、累计消费金额。前端交互模块登录状态保持、鉴权请求封装、响应式页面渲染。五、数据库/数据模型设计本项目包含五张核心表表名说明关键字段users用户表username、email、hashed_password、roledishes菜品表name、window、category、tags、price、stock、ratingorders订单主表user_id、pickup_time、status、total_amountorder_items订单明细表order_id、dish_id、quantity、unit_pricefavorites收藏表user_id、dish_idmodels.py中的用户模型示例classUser(Base):__tablename__usersidColumn(Integer,primary_keyTrue,indexTrue)usernameColumn(String(50),uniqueTrue,indexTrue,nullableFalse)emailColumn(String(120),uniqueTrue,indexTrue,nullableFalse)hashed_passwordColumn(String(255),nullableFalse)roleColumn(String(20),defaultstudent)created_atColumn(DateTime,defaultdatetime.utcnow)订单采用主从表结构一个订单可以包含多个菜品明细便于查询历史订单和统计消费金额。六、后端接口设计方法地址功能是否需要登录GET/api/health服务健康检查否POST/api/auth/register用户注册并返回 token否POST/api/auth/login用户登录并返回 token否GET/api/users/me当前登录用户信息是GET/api/dishes菜品列表、搜索、分类筛选是POST/api/dishes管理员新增菜品是GET/api/recommendations获取推荐菜品是POST/api/orders创建订单是GET/api/orders查看我的订单是POST/api/favorites/{dish_id}收藏/取消收藏是GET/api/dashboard首页统计数据是鉴权依赖函数会解析 Bearer token提取用户名并查询数据库defget_current_user(credentials:HTTPAuthorizationCredentialsDepends(security),db:SessionDepends(get_db)):payloaddecode_access_token(credentials.credentials)usernamepayload.get(sub)usercrud.get_user_by_username(db,username)ifnotuser:raiseHTTPException(status_code401,detail用户不存在)returnuser七、前端页面设计前端采用 Vue 3 单文件组件组织页面主要页面区域如下登录/注册卡片未登录时展示注册或登录成功后保存 token。顶部用户栏展示当前用户名与退出按钮。统计卡片显示菜品数量、订单数量、收藏数量和累计消费。智能推荐区展示推荐原因和推荐菜品。菜品列表区支持关键词搜索、分类筛选、加入购物车和收藏。购物车区展示已选菜品、数量、总价和提交订单按钮。我的订单区查看历史订单、状态、取餐时间和菜品明细。API 封装文件frontend/src/api.js负责统一添加鉴权请求头asyncfunctionrequest(path,options{}){constheaders{Content-Type:application/json,...(options.headers||{})}consttokengetToken()if(token)headers.AuthorizationBearer${token}constresawaitfetch(${API_BASE}${path},{...options,headers})constdataawaitres.json().catch(()({}))if(!res.ok)thrownewError(data.detail||请求失败)returndata}八、核心代码讲解1. 密码哈希与 token 生成security.py使用 Passlib 对密码进行 bcrypt 哈希不在数据库中保存明文密码。登录成功后创建 JWT后续请求通过该 token 访问受保护接口。pwd_contextCryptContext(schemes[bcrypt],deprecatedauto)defget_password_hash(password:str)-str:returnpwd_context.hash(password)defcreate_access_token(data:dict,expires_delta:Optional[timedelta]None)-str:to_encodedata.copy()expiredatetime.now(timezone.utc)(expires_deltaortimedelta(minutesACCESS_TOKEN_EXPIRE_MINUTES))to_encode.update({exp:expire})returnjwt.encode(to_encode,SECRET_KEY,algorithmALGORITHM)2. 下单逻辑下单时后端会校验菜品是否存在、是否上架、库存是否充足然后扣减库存并写入订单明细。defcreate_order(db:Session,user_id:int,order:schemas.OrderCreate):db_ordermodels.Order(user_iduser_id,pickup_timeorder.pickup_time)total0.0foriteminorder.items:dishdb.query(models.Dish).filter(models.Dish.iditem.dish_id,models.Dish.is_availableTrue).first()ifnotdish:raiseValueError(菜品不存在或已下架)ifdish.stockitem.quantity:raiseValueError(f菜品{dish.name}库存不足)dish.stock-item.quantity totaldish.price*item.quantity db_order.items.append(models.OrderItem(dish_iddish.id,quantityitem.quantity,unit_pricedish.price))db_order.total_amountround(total,2)db.add(db_order)db.commit()returndb_order3. 推荐策略推荐模块优先统计用户历史订单和收藏中的菜品分类。如果用户经常购买“轻食”则推荐评分较高的轻食菜品如果是新用户则推荐全站高评分菜品。ifcategories:top_categoryCounter(categories).most_common(1)[0][0]dishesdb.query(models.Dish).filter(models.Dish.categorytop_category).order_by(desc(models.Dish.rating)).limit(6).all()returnf根据你常点的「{top_category}」分类推荐,dishes4. Vue 购物车状态前端购物车存储在响应式数组中用户点击“加入购物车”后自动合并同一菜品数量总价由计算属性实时生成。constcartref([])constcartTotalcomputed(()cart.value.reduce((sum,item)sumitem.dish.price*item.quantity,0).toFixed(2))functionaddToCart(dish){constitemcart.value.find(ii.dish.iddish.id)if(item)item.quantity1elsecart.value.push({dish,quantity:1})}九、部署与运行步骤1. 运行后端cdproject/backend python3-mvenv .venvsource.venv/bin/activate pipinstall-rrequirements.txt uvicorn app.main:app--reload--host0.0.0.0--port8000后端默认地址为http://localhost:8000接口文档地址为http://localhost:8000/docs。2. 运行前端cdproject/frontendnpminstallnpmrun dev前端默认地址为http://localhost:5173。前端默认请求http://localhost:8000如需修改后端地址可设置VITE_API_BASE。3. 体验流程注册学生账号。登录后浏览菜品列表。按关键词或分类筛选菜品。收藏喜欢的菜品。将菜品加入购物车并提交订单。再次刷新推荐列表观察推荐原因变化。十、项目总结本项目完整覆盖了 Python 全栈项目中的关键能力后端接口、数据库建模、认证鉴权、业务逻辑、前端组件化、前后端联调和部署运行说明。与普通 CRUD 项目相比校园食堂点餐与推荐系统增加了订单明细、库存扣减、收藏偏好和推荐策略更贴近真实校园业务场景。后续可继续扩展管理员菜品管理后台、食堂窗口接单端、在线支付、排队号、营养分析、协同过滤推荐算法、订单评价和消息通知等功能。项目代码下载链接
RELATED

相关推荐

STM32 MP1 Linux 系统移植实战:从TF卡启动到Qt应用部署的3个核心步骤

STM32 MP1 Linux 系统移植实战:从TF卡启动到Qt应用部署的3个核心步骤

STM32MP1 Linux系统移植实战:从TF卡启动到Qt应用部署全流程解析在嵌入式开发领域,从传统的MCU裸机开发转向基于Linux的MPU系统开发,是许多工程师职业发展的重要转折点。STM32MP1系列作为STMicroelectronics推出的首款通用型微处理器&#xff…

📅 2026/9/20 13:30:44
Unity性能优化与资源管理实战:从Draw Call到Addressables的进阶指南

Unity性能优化与资源管理实战:从Draw Call到Addressables的进阶指南

1. 项目概述:从“滚球”到“超神”的第四步如果你已经跟着这个系列教程走到了Part 4,那说明你已经不是那个对着Unity编辑器界面一脸茫然的小白了。你可能已经完成了场景搭建、学会了基本的C#脚本控制、甚至能让一个球体在平台上滚动起来。Part 4&#xf…

📅 2026/9/15 13:24:20
TPA3138D2音频放大器与STM32L041C6的音频系统设计

TPA3138D2音频放大器与STM32L041C6的音频系统设计

1. TPA3138D2音频放大器的核心特性解析TPA3138D2是德州仪器推出的一款高效率D类立体声音频放大器芯片,专为便携式音频设备设计。这款芯片在3.5V至14.4V的宽电压范围内工作,每通道可提供10W的连续输出功率,特别适合电池供电的音频设备。1.1 无…

📅 2026/8/22 20:14:34
MORE NEWS

更多资讯

📰

云智变AI开题报告:为什么你的开题答辩像一场“审讯”,而别人的像一场“讨论”?

云智变AI官网:www.yunzhibian.cn | 微信公众号搜一搜:云智变AI学术 开题答辩现场有两种人。 第一种人站上去,PPT翻到第三页,评委开始皱眉:“你这个研究问题到底是什么?”“你说的这个变量怎么…

📰

快速做网站详情页还怕没流量?这份保姆级建站教程救急

快速做网站详情页还怕没流量?这份保姆级建站教程救急 网站做好了没人访问,是不是让你头大如斗?别慌,很多前端新手都卡在这一步。其实不是代码写得不够炫,而是没懂搜索引擎怎么“看”你的页面。今天这篇保姆级建站教程,专门教你怎么快速做网站详情页,让…

📰

ROS2 Humble Nav2 从零搭建:A* 全局规划与 DWA 局部避障实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

3步搞定家乡网页模板,保姆级建站教程让流量翻倍

3步搞定家乡网页模板,保姆级建站教程让流量翻倍 网站做好了没人访问,是不是你的常态?别慌,我见过太多人花几千块做个“家乡网页模板”,上线后日UV只有个位数。今天这篇保姆级建站教程,不聊虚的,直接教你怎么从0到1,把一个冷清的家乡主题站,变成…

📰

树莓派OV5647摄像头CSI排线连接与配置避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

融合AI辅助MBTI性格测试的个性化健身小程序(DeepSeek AI 健身计划、AI 饮食方案、MBTI 四维性格测评、体征与营养记录、训练打卡日历、个人健身数据分析、AI方案人工审核、EChar)

融合 AI 辅助 MBTI 性格测试的个性化健身小程序(UniApp Spring Boot DeepSeek) 做这套系统起因挺实在。我自己健身走过不少弯路:跟着别人的计划练,两天就膝盖不舒服;换成随便搜的减脂攻略,又跟自己想增肌…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬