校园食堂智能推荐与反馈系统
中北大学Java+数据库课程设计
基于 Spring Boot 的智能食堂管理系统,提升学生就餐体验,助力食堂精细化运营。
✨ 如果你觉得这个项目对你有帮助,欢迎点个 ⭐ Star 支持一下!也欢迎提出建议或交流学习~
本项目仅供借鉴学习,请勿抄袭

完整项目代码已传至:
github rannn-1127/school-canteen-service
文章目录
一.功能简介
本系统面向高校食堂场景,提供:
- 智能菜品推荐:基于口味偏好、历史点单、热销榜、高评分四维推荐
- 评价反馈机制:学生可对菜品打分评论,食堂实时查看
- 多角色管理:学生、食堂员工、管理员各司其职
- 数据可视化:热销菜、差评预警等
二.技术栈
后端:Java 21 + Spring Boot + MyBatis
数据库:MySQL 8.0
构建工具:Maven 3.9.4
前端:HTML/CSS/JavaScript(轻量无框架)
开发工具:IntelliJ IDEA, DataGrip,vsCode
引入的依赖
| 依赖类型 | Group ID | Artifact ID | 版本 | 作用说明 |
|---|---|---|---|---|
| 核心框架 | org.springframework.boot |
spring-boot-starter-webmvc |
(由 parent 管理) | 提供 Spring MVC + 内嵌 Tomcat,用于构建 Web 应用和 REST API |
| 持久层 | org.mybatis.spring.boot |
mybatis-spring-boot-starter |
4.0.1 |
集成 MyBatis 到 Spring Boot,简化 DAO 层开发 |
| 数据库驱动 | com.mysql |
mysql-connector-j |
(由 parent 管理) | MySQL 8+ 官方 JDBC 驱动,运行时使用 |
| 工具库 | org.projectlombok |
lombok |
(由 parent 管理) | 通过注解自动生成 getter/setter/构造函数等,减少样板代码(编译期生效) |
| 测试依赖 | org.springframework.boot |
spring-boot-starter-webmvc-test |
(由 parent 管理) | Spring Web MVC 单元测试支持(如 MockMvc) |
| 测试依赖 | org.mybatis.spring.boot |
mybatis-spring-boot-starter-test |
4.0.1 |
MyBatis 测试支持(如 @MybatisTest) |
三.项目结构
txt
school-canteen-service/
├── src/
│ ├── main/
│ │ ├── java/com.r/ # Java 源码包(包名:com.r)
│ │ │ ├── controller/ # 控制层:处理 HTTP 请求,返回 JSON 响应
│ │ │ ├── mapper/ # MyBatis 映射接口:定义 SQL 查询方法
│ │ │ ├── pojo/ # 实体类(POJO):对应数据库表结构
│ │ │ └── service/ # 业务逻辑层:实现核心功能(如推荐算法)
│ │ │ └── StudentService.java # 示例:学生相关服务
│ │ │
│ │ └── resources/ # 资源文件
│ │ ├── application.yml # Spring Boot 配置文件(数据库连接等)
│ │ └── static/ # 静态资源(HTML、CSS、JS 文件,可选)
│ │
│ └── test/ # 单元测试代码
│
├── target/ # 编译输出目录(Maven 自动生成)
│ ├── classes/ # 编译后的 .class 文件
│ └── generated-sources/ # 自动生成的代码(如 MyBatis 注解)
├── pom.xml #Maven 项目配置文件(依赖管理)
四.快速使用
4.1 构建数据库
1.运行数据库建库与建表语句(完整文件见sql\build.sql)
sql
create database school_canteen;
use school_canteen;
-- 建表
create table Canteen (
canteen_id int primary key comment '食堂ID',
canteen_name varchar(50) not null comment '食堂名称',
area ENUM('西区', '东区') not null comment '所属区域'
);
create table CanteenWindow(
window_id int primary key comment '窗口id',
window_name varchar(50) not null comment '窗口名称',
canteen_id int not null comment '所属食堂',
foreign key (canteen_id) references Canteen(canteen_id) on delete cascade
);
create table Dishes(
dish_id int primary key auto_increment comment '菜品id',
name varchar(20) not null comment '菜名',
price decimal(5,2) not null comment '单价',-- 总共5位,2位小数
tastes varchar(100) comment '口味',
ingredients varchar(200) comment '主要食材',
window_id int not null comment '所属窗口',
initial_quantity int not null default 0 comment '每日初始供应份数', -- 默认值为0
foreign key (window_id) references CanteenWindow(window_id) on delete cascade -- 级联删除
);
create table Students(
student_id int primary key comment '学号',
name varchar(20) not null comment '姓名',
preferred_tastes varchar(20) comment '偏好口味',
allergens varchar(20) comment '忌口食材'
);
create table ConsumptionRecord(
record_id int primary key auto_increment comment '记录id',
student_id int not null comment '学号',
dish_id int not null comment '菜品id',
consume_time datetime not null default current_timestamp comment '消费时间',-- 默认为执行插入操作时的当前系统时间
rating int check (rating >= 1 and rating <= 5) comment '评分',
comment varchar(200) comment '评价',
foreign key (student_id) references Students(student_id) on delete cascade,
foreign key (dish_id) references Dishes(dish_id) on delete cascade
);
create table DailyStock (
dish_id int comment '菜品id',
stock_date date comment '库存日期',
initial_quantity int not null comment '每日初始供应量',
remaining_quantity int not null comment '当日剩余份数',
primary key (dish_id, stock_date) comment '唯一标识每日菜品库存记录', -- 复合主键 菜品id+库存日期
foreign key (dish_id) references Dishes(dish_id) on delete cascade
);
2.向数据库内添加数据
项目的sql\data.sql文件仅供参考,可自行定义数据进行插入
4.2 配置数据库账号密码
1.打开项目里的src/main/resources/application.yml文件
2.修改 spring.datasource.username 和 password
yml
#mysql连接配置
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver # 使用 MySQL 8.0+ 官方提供的 JDBC 驱动类来连接数据库
url: jdbc:mysql://localhost:3306/school_canteen
username: #你的用户名
password: #你的密码
4.3使用项目
1.启动项目
2.在浏览器地址栏输入http://localhost:8080/login.html进入登录页面
3.输入初始密码(后续还会优化登录时的密码操作)
javascript
// 预设账号(存在 JS 中)
const users = {
student: { username: 's001', password: '123' },
staff: { username: 'c001', password: '123' },
admin: { username: 'a001', password: '123' }
};
| 用户名 | 密码 | 身份 |
|---|---|---|
| s001 | 123 | 学生 |
| c001 | 123 | 食堂员工 |
| a001 | 123 | 管理员 |
4.以不同身份登录后可以看到对应功能的页面

五.项目亮点
-
低耦合架构:Spring Boot + MyBatis 分层清晰,Controller → Service → Mapper
通过
@Autowired自动注入需要的对象,实现代码的低耦合 -
智能推荐算法 : 基于
FIND_IN_SET的口味标签匹配 结合高频购买、热销、高评分多维度 -
动态过滤忌口食材(Service 层 Java 过滤,避免 SQL 复杂化)
-
RESTful API :统一返回
Result封装,规范前后端交互
六.工程搭建过程
-
引入web开发起步依赖mybatis,mysql驱动,Lombok

-
创建数据库,在application.yml中配置数据库的基本信息
-
准备基础代码结构,引入实体类,统一响应结果封装类Result
如果实体类属性名和数据库表查询返回的字段名不一致,不能自动封装
解决方法:开启驼峰命名
-
开发后端代码,同步开发前端网页
-
用Apifox测试后端是否开发完毕
-
前后端连接
项目运行过程

-
前端网页发送请求
-
Controller层:
- 接收请求参数
- 调用service层
- 响应结果
-
Service层:调用Mapper接口方法
-
Mapper层:执行SQL语句操作数据库
七.部分详解
1.Spring Boot
- 是什么 ?
Spring Boot 是 Spring 框架的"快速启动"版本,自动配置大量常用功能(如 Web 服务器、数据库连接、JSON 转换等),让开发者专注业务逻辑。 - 在项目中怎么用?
- 通过
@SpringBootApplication启动整个应用; - 使用
@RestController编写 RESTful 接口(返回 JSON); - 自动内嵌 Tomcat 服务器,无需部署 WAR 包,直接
java -jar或 IDEA 运行即可; - 通过
application.yml配置数据库、端口等,无需 XML
- 通过
优势:开箱即用、简化配置、快速开发
2. MyBatis
-
是什么 ?
一个 ORM(对象关系映射)框架,让你用 Java 对象操作数据库,而不用写原生 JDBC。
-
在项目中怎么用?
-
在
mapper包中定义接口(如StudentMapper); -
用
@Select,@Insert,@Update,@Delete注解直接写 SQL,eg:
java@Select("SELECT * FROM students WHERE student_id = #{id}") Student getStudentById(Integer id); -
实体类(
pojo/Student.java)自动映射查询结果(需开启驼峰命名); -
支持复杂查询(如多表联查、动态 SQL)
-
优势:SQL 可控性强、学习成本低、适合中小型项目
3.Maven
- 是什么 ?
Java 项目的构建与依赖管理工具。 - 在项目中怎么用?
- 通过
pom.xml声明依赖(如 Spring Boot、MyBatis、MySQL 驱动); - 自动下载 JAR 包,解决"jar"问题;
- 执行命令如
mvn clean package打包成可运行的 JAR
- 通过
优势:统一依赖、自动化构建、标准化项目结构
4. 关键注解说明
| 注解 | 作用 | 项目中的使用场景 |
|---|---|---|
@Autowired |
自动注入 Bean(对象) | 在 Service 中注入 Mapper,在 Controller 中注入 Service,实现层间解耦 |
@RestController |
标记这是一个 REST 控制器,方法返回 JSON | 所有 Controller 类上都加了它 |
@RequestMapping / @GetMapping 等 |
定义 URL 路径 和 HTTP 方法 | 如 @GetMapping("/recommend/{id}") |
@Select |
MyBatis 中用于 写查询 SQL | 在 Mapper 接口中直接写 SQL,避免 XML 文件 |
@Data (Lombok) |
自动生成 getter/setter/toString 等 | 所有 pojo 实体类都用了它,代码更简洁 |
5. 其他关键技术点
分层架构(MVC 变种)
txt
Controller → Service → Mapper → Database
- Controller :接收请求、调用 Service、返回
Result封装结果; - Service:实现业务逻辑(如推荐算法、忌口过滤);
- Mapper:只负责数据库操作;
- 优点:高内聚、低耦合、易测试、易维护。
统一响应格式Result
java
public class Result<T> {
private int code;
private String msg;
private T data;
}
- 前端无论成功失败,都按固定格式解析,提升健壮性。
驼峰命名自动映射
-
数据库字段:
student_id -
Java 属性:
studentId -
在
application.yml中开启:ymlmybatis: configuration: map-underscore-to-camel-case: true
前端轻量交互
- 用原生 JS 发送
fetch请求到后端 API; - 登录校验暂由前端 JS 简单处理(后续可升级为 JWT + 后端鉴权)
八.致谢
如果你觉得这个项目对你有帮助可以点个 ⭐ Star吗
祝大家后端学习顺利,期末高分通过! 😊