【Java项目】中北大学Java+数据库课设|校园食堂智能推荐与反馈系统

校园食堂智能推荐与反馈系统

中北大学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.usernamepassword

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层:

    1. 接收请求参数
    2. 调用service层
    3. 响应结果
  • 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中开启:

    yml 复制代码
    mybatis:
      configuration:
        map-underscore-to-camel-case: true
前端轻量交互
  • 用原生 JS 发送 fetch 请求到后端 API;
  • 登录校验暂由前端 JS 简单处理(后续可升级为 JWT + 后端鉴权)

八.致谢

如果你觉得这个项目对你有帮助可以点个 ⭐ Star吗

祝大家后端学习顺利,期末高分通过! 😊

相关推荐
DBA小马哥2 小时前
从Oracle到信创数据库:一场技术迁移的探索之旅
数据库·oracle
2501_944521002 小时前
rn_for_openharmony商城项目app实战-语言设置实现
javascript·数据库·react native·react.js·harmonyos
崔庆才丨静觅2 小时前
Veo API:0 门槛量产商业级视频!2026 视频流量密码,创作者/商家必藏
后端·google·api
NE_STOP2 小时前
SpringBoot-shiro-jwt-dubbo-redis分布式统一权限系统(完结)
java
zfj3212 小时前
java函数式接口 @FunctionalInterface用法
java·函数·function
飞Link2 小时前
【Sqoop】Sqoop 使用教程:从原理到实战的完整指南
数据库·hadoop·sqoop
TracyCoder1232 小时前
并发编程(二):Java原子类(Atomic Classes)全解析
java·原子类·atomic
此生只爱蛋2 小时前
【Redis】事务
数据库·redis·缓存
野犬寒鸦2 小时前
从零起步学习MySQL || 第十六章:MySQL 分库分表的考量策略
java·服务器·数据库·后端·mysql