基于SSM的智能校内点餐系统设计与实现
一、项目背景与意义
随着智能手机的普及和互联网技术的飞速发展,外卖行业已成为大学生生活中不可或缺的一部分。但校外外卖存在诸多痛点:食品安全无保障、配送费用高昂、配送时效不稳定,甚至出现外卖人员威胁消费者等安全问题。与此同时,学校食堂虽具备价格优惠、食材安全的优势,却面临下课后就餐排队冗长、学生就餐体验差的问题。
为解决上述矛盾,本项目设计了一款智能分析的校内点餐系统。该系统以校园食堂为核心,通过移动端点餐、食堂接单配送的模式,既保证了菜品的质量与卫生,又大幅提升了配送效率,同时省去校外外卖的高额配送费,为学生节省时间与金钱成本,也为食堂提升服务效率、降低运营成本提供了有效解决方案。
二、技术栈选型
本系统采用B/S架构,前后端分离设计,技术栈选型如下:
- 后端框架:SSM(Spring + Spring MVC + MyBatis),轻量级且高效,便于数据库交互与业务逻辑分层实现
- 开发语言:Java,跨平台特性强,面向对象设计更贴合复杂业务场景
- 开发工具:Eclipse 2020-03,支持多插件扩展,占用内存小、运行流畅
- 数据库:MySQL 5.7.26,开源免费、安装便捷,配合Navicat 12管理工具实现数据可视化操作
- 前端技术:HTML5 + CSS + jQuery,结合Bootstrap、EasyUI框架实现响应式界面设计,提升用户操作体验
- 服务器:Tomcat 9,稳定可靠,适配Java Web项目部署
- 推荐算法:协同过滤算法(余弦相似度),实现个性化菜品推荐
三、系统核心功能
3.1 用户端功能(移动端)
- 注册登录:支持学生、教师等多角色注册,登录时验证账号密码合法性,注册需满足用户名格式规范(英文字母开头,支持字母、数字、_、/)
- 菜品浏览:按分类展示食堂菜品(凉菜、热菜、主食、酒水饮料等),显示菜品名称、价格、销量等信息
- 购物车操作:支持菜品添加、数量修改、清空等功能,本地缓存购物车数据,刷新页面不丢失
- 订单管理:填写收货地址、联系方式后提交订单,支持查看待发货、已发货、已完成等状态的历史订单
- 个性化推荐:基于用户购买历史,通过余弦相似度算法推荐相似用户喜爱的菜品
3.2 管理员端功能(PC端)
- 登录验证:管理员专属登录入口,需输入用户名、密码及验证码
- 菜品管理:支持菜品分类添加/编辑/删除,菜品信息(名称、价格、图片、库存)维护
- 订单管理:查看所有用户订单,支持订单发货操作、订单详情查看、历史订单查询
- 用户管理:维护系统用户信息,支持权限配置与管理
- 日志记录:自动记录系统操作日志,便于问题排查与系统维护
四、系统架构设计
4.1 整体架构(MVC模式)
- Model(模型):负责数据存储与业务逻辑,包括实体类(用户、菜品、订单等)、Service层业务处理、Dao层数据库交互
- View(视图):用户交互界面,包括移动端用户界面与PC端管理员后台界面
- Controller(控制器):接收用户请求,调用Service层处理业务,返回数据或跳转页面,由Spring MVC统一调度
4.2 推荐算法架构
采用协同过滤算法中的余弦相似度模型,核心逻辑如下:
- 采集用户订单数据,提取用户-菜品关联关系
- 计算两个用户之间的相似度(余弦值越接近1,相似度越高)
- 将高相似度用户购买过的、当前用户未浏览的菜品作为推荐内容
- 实时更新推荐列表,提升用户发现心仪菜品的效率
五、数据库设计
系统核心数据表设计如下(部分关键表):
| 表名 | 核心字段 | 功能描述 |
|---|---|---|
| account | id、name、password、realName、phone、address | 存储用户(学生/教师)基本信息 |
| food | id、categoryId、name、price、sels、imageUrl | 存储菜品信息,关联菜品分类 |
| food_category | id、name | 菜品分类表(如凉菜、热菜等) |
| orders | id、accountId、money、productNum、status、createTime | 订单主表,记录订单整体信息 |
| order_item | id、orderId、foodId、foodName、price、foodNum | 订单明细表,记录订单中的菜品信息 |
| user | id、username、password、roleId | 管理员信息表,关联权限角色 |
六、核心模块实现
6.1 用户注册登录模块
注册功能通过异步刷新实现,前端验证用户名格式、密码一致性,后端接收数据后存入数据库并返回结果;登录功能同样采用异步请求,验证账号密码正确性,成功则跳转至主页,失败则提示错误信息。
核心代码片段(前端登录):
javascript
$("#loginSubmit").click(function(){
$.ajax({
url:'login',
data:$("#login-form").serialize(),
type:'post',
dataType:'json',
success:function(data){
if(data.type == 'success'){
alert('登录成功');
window.location.href = '../index/index';
}else{
alert(data.msg);
}
}
});
});
6.2 购物车实现
基于jQuery与localStorage实现购物车数据本地缓存,支持菜品数量增减、总价实时计算,核心逻辑如下:
- 点击"添加购物车"按钮时,将菜品信息存入本地缓存
- 购物车页面读取缓存数据,动态渲染菜品列表与总价
- 数量修改时实时更新缓存与页面展示
6.3 推荐算法实现
通过余弦相似度计算用户相似度,核心代码如下:
java
public static double CalUserSimilarity(int UserIdA,int UserIdB,List<RelationObject> relationObjectBase){
List<Integer> AList=Lists.newArrayList();
List<Integer> BList=Lists.newArrayList();
double numerator = 0.0;
double denomiator = 0.0;
// 提取A、B用户购买的菜品ID
for (RelationObject relationObject : relationObjectBase) {
if (relationObject.getUserId() == UserIdA)
AList.add(relationObject.getItemId());
if (relationObject.getUserId() == UserIdB)
BList.add(relationObject.getItemId());
}
// 无购买记录则相似度为-1
if(AList.size()==0||BList.size()==0)
return -1;
// 计算余弦相似度
denomiator = Math.sqrt(AList.size() * BList.size());
AList.retainAll(BList); // 求交集
if(AList.size()==0)
return -1;
numerator = AList.size();
return numerator * 1.0 / denomiator;
}
七、系统测试与部署
7.1 测试环境
- 操作系统:Windows 7/10
- 浏览器:Android手机浏览器、Edge浏览器
- 测试方法:黑盒测试、白盒测试、单元测试、集成测试相结合
7.2 关键测试用例
| 测试模块 | 测试场景 | 预期结果 | 实际结果 |
|---|---|---|---|
| 注册功能 | 用户名以数字开头 | 提示"用户名不符合标准" | 符合预期 |
| 购物车 | 添加菜品后刷新页面 | 购物车数据不丢失 | 符合预期 |
| 推荐功能 | 相似用户购买过A菜品 | 向当前用户推荐A菜品 | 符合预期 |
| 订单管理 | 管理员点击"发货" | 订单状态更新为"已发货" | 符合预期 |
7.3 部署流程
- 安装JDK 14并配置环境变量(JAVA_HOME、Path)
- 安装Tomcat 9,配置Catalina_HOME环境变量,修改server.xml支持中文编码
- Eclipse中配置Tomcat服务器,导入项目并打包为WAR文件
- 将WAR文件复制到Tomcat的webapps目录下,启动Tomcat服务
- 浏览器访问http://localhost:8080/项目名 即可使用系统
八、总结与展望
本系统基于SSM框架实现了校内点餐的核心需求,解决了校外外卖安全隐患与食堂排队问题,同时通过个性化推荐提升用户体验。系统测试结果表明,各项功能运行稳定,界面操作便捷,能够满足学生与食堂的双重需求。
项目源码
附录中包含系统核心源代码(MyBatis映射文件、控制器代码、前端交互代码等),如需完整项目源码,可私信联系。