基于 Spring Boot 的网上订餐系统毕业设计
摘要:随着互联网技术的飞速发展和人们生活节奏的加快,网上订餐成为了一种便捷的餐饮消费方式。本毕业设计旨在开发一个基于 Spring Boot 框架的网上订餐系统,为用户提供便捷的订餐服务,为商家提供高效的订单管理功能。系统采用前后端分离架构,前端使用 Vue.js 框架,后端基于 Spring Boot 开发,数据库选用 MySQL。通过系统的设计与实现,实现了用户注册登录、菜品浏览与搜索、在线订餐、订单管理、商家菜品管理等功能。经过测试,系统功能完善,运行稳定,能够满足用户和商家的实际需求,为网上订餐业务的开展提供了有效的技术支持。
一、引言
1.1 项目背景
在当今数字化时代,人们对于生活便利性的追求日益增长。网上订餐系统作为一种新兴的餐饮服务模式,逐渐成为人们日常生活中不可或缺的一部分。它打破了传统线下订餐的时间和空间限制,用户可以随时随地浏览菜品、下单订餐,极大地提高了订餐效率。同时,对于商家而言,网上订餐系统能够帮助其拓展业务渠道,提高客户满意度,增加销售额。然而,现有的一些网上订餐系统存在功能不完善、用户体验不佳等问题,因此开发一个功能齐全、操作便捷的网上订餐系统具有重要的现实意义。
1.2 项目目标
本系统的主要目标是构建一个功能完善、性能稳定、用户体验良好的网上订餐平台。具体目标如下:
- 为用户提供便捷的注册登录功能,方便用户管理个人信息和订单记录。
- 实现丰富的菜品展示功能,包括菜品分类浏览、搜索、详情查看等,帮助用户快速找到心仪的菜品。
- 支持在线订餐功能,用户可以选择菜品、填写送餐地址、选择支付方式等完成订餐流程。
- 为商家提供订单管理功能,包括订单查看、处理、配送状态更新等,提高商家的运营效率。
- 实现商家菜品管理功能,商家可以添加、修改、删除菜品信息,及时更新菜品库存。
- 确保系统的安全性和稳定性,保护用户和商家的信息安全。
二、系统需求分析
2.1 功能性需求
- 用户功能模块
-
- 注册登录:用户通过手机号或邮箱注册账号,设置密码,登录系统。支持第三方账号登录,如微信、QQ 等。
-
- 个人信息管理:用户可以修改个人基本信息,如姓名、性别、联系方式、收货地址等。查看个人订单记录,包括订单状态、订单详情、支付记录等。
-
- 菜品浏览与搜索:用户可以按照菜品分类浏览菜品,如中餐、西餐、快餐、甜品等。通过关键词搜索菜品,查看菜品的图片、名称、价格、描述、评价等信息。
-
- 在线订餐:用户将心仪的菜品添加到购物车,在购物车中可以修改菜品数量、删除菜品。确认订单信息,包括送餐地址、联系电话、送餐时间、备注信息等,选择支付方式进行支付,支付成功后生成订单。
-
- 订单评价:用户在收到餐品后,可以对订单进行评价,包括菜品口味、包装、配送速度等方面的评价,并可以上传图片。评价信息将展示在菜品详情页面,供其他用户参考。
- 商家功能模块
-
- 商家登录:商家通过专属账号登录系统,进行订单和菜品管理。
-
- 订单管理:商家可以查看所有订单信息,包括订单编号、用户信息、菜品信息、订单金额、订单状态(待接单、已接单、配送中、已完成、已取消)等。对订单进行处理,如接单、拒单,更新订单配送状态。
-
- 菜品管理:商家可以添加新菜品,包括菜品名称、分类、图片、价格、库存、描述等信息。修改已有菜品的信息,如价格调整、库存更新、菜品描述修改等。删除不再销售的菜品。
- 管理员功能模块
-
- 用户管理:对用户账号进行管理,包括查看用户信息、冻结或解冻用户账号、删除违规用户等。
-
- 商家管理:对商家账号进行管理,包括审核商家入驻申请、查看商家信息、冻结或解冻商家账号、处理商家违规行为等。
-
- 系统设置:设置系统参数,如配送费用规则、支付方式管理、菜品分类管理等。
-
- 数据统计分析:统计系统的运营数据,如订单数量、销售额、用户增长数、商家数量等,生成报表,为系统优化提供数据支持。
2.2 非功能性需求
- 性能需求
-
- 系统响应时间应小于 3 秒,确保用户操作的流畅性。在高并发情况下,系统能够快速响应,保证用户体验。
-
- 系统应能支持至少 1000 个并发用户同时访问,满足不同规模用户的使用需求。
- 安全性需求
-
- 采用安全可靠的加密算法对用户和商家的密码进行加密存储,防止密码泄露。
-
- 对敏感数据进行脱敏处理,如用户的联系方式、身份证号码等,保护用户隐私。
-
- 系统应具备完善的权限管理机制,不同用户角色拥有不同的操作权限,确保数据安全。
-
- 防止网络攻击和恶意访问,如 SQL 注入、XSS 攻击等,保障系统的稳定性和安全性。
- 易用性需求
-
- 系统界面设计应简洁美观,操作流程简单易懂,方便用户和商家使用。
-
- 提供操作指南和帮助文档,帮助用户快速上手系统的各项功能。
-
- 支持多语言界面,满足不同地区用户的使用需求。
- 可维护性需求
-
- 系统采用分层架构设计,各模块之间耦合度低,便于后期维护和升级。
-
- 代码应具备良好的可读性和可扩展性,方便开发人员进行二次开发。
-
- 建立完善的日志管理系统,记录系统运行过程中的关键信息,便于故障排查和系统优化。
三、系统设计
3.1 系统架构设计
本系统采用前后端分离的架构模式。前端使用 Vue.js 框架进行开发,通过 Axios 库与后端进行数据交互。Vue.js 具有轻量级、组件化、数据驱动等优点,能够快速构建出用户界面友好的单页应用程序。后端基于 Spring Boot 框架开发,Spring Boot 提供了自动配置、起步依赖等功能,大大简化了 Spring 应用的开发过程。同时,Spring Boot 集成了 Spring MVC 框架,用于处理 HTTP 请求和响应。系统架构图如下所示:
[此处插入系统架构图]
3.2 功能模块设计
- 用户模块
-
- 注册登录子模块:负责用户账号的注册和登录验证,与数据库中的用户表进行交互。支持第三方登录功能,通过 OAuth2.0 协议实现与微信、QQ 等第三方平台的对接。
-
- 个人信息管理子模块:实现用户个人信息的修改和查看功能,包括基本信息、收货地址管理、订单记录查看等操作,涉及与用户表、地址表、订单表的交互。
-
- 菜品浏览搜索子模块:提供菜品分类浏览和搜索功能,从菜品表中查询菜品信息,并根据用户输入的关键词进行模糊查询。同时,获取菜品的评价信息,展示在菜品详情页面。
-
- 在线订餐子模块:用户将菜品添加到购物车,在购物车中进行菜品数量调整、删除等操作。生成订单时,根据用户选择的菜品、收货地址、支付方式等信息,在订单表、订单详情表中插入数据,并调用支付接口进行支付处理。
-
- 订单评价子模块:用户在订单完成后,对订单进行评价。评价信息存储在评价表中,并关联订单表和菜品表,以便在菜品详情页面展示评价内容。
- 商家模块
-
- 商家登录子模块:商家通过账号密码登录系统,验证身份后进入商家管理界面。
-
- 订单管理子模块:查询订单表获取所有订单信息,根据订单状态进行分类展示。对订单进行接单、拒单操作,更新订单状态。在订单配送过程中,更新订单配送状态,如已发货、配送中、已送达等。
-
- 菜品管理子模块:实现菜品的添加、修改、删除功能。添加菜品时,将菜品信息插入菜品表,包括菜品名称、分类、图片、价格、库存、描述等。修改菜品信息时,更新菜品表中的相应记录。删除菜品时,从菜品表中删除对应数据,并处理与该菜品相关的订单详情和评价信息。
- 管理员模块
-
- 用户管理子模块:对用户表进行操作,包括查看用户信息、冻结或解冻用户账号、删除用户等功能。
-
- 商家管理子模块:审核商家入驻申请,将审核通过的商家信息插入商家表。对商家账号进行管理,如查看商家信息、冻结或解冻商家账号、处理商家违规行为等,涉及与商家表的交互。
-
- 系统设置子模块:设置配送费用规则,存储在系统参数表中。管理支付方式,包括添加、修改、删除支付方式信息,与支付方式表进行交互。维护菜品分类信息,对菜品分类表进行增删改查操作。
-
- 数据统计分析子模块:从订单表、用户表、商家表等数据库表中获取数据,进行统计分析,如计算订单数量、销售额、用户增长数、商家数量等。生成报表,如柱状图、折线图、饼图等,直观展示系统运营数据。
3.3 数据库设计
本系统选用 MySQL 数据库进行数据存储。主要数据库表设计如下:
- 用户表(user)
-
- 字段:用户 ID(user_id,主键)、用户名(username)、密码(password)、手机号(phone_number)、邮箱(email)、性别(gender)、头像(avatar)、注册时间(register_time)。
- 地址表(address)
-
- 字段:地址 ID(address_id,主键)、用户 ID(user_id,外键关联 user 表的 user_id)、收货人姓名(receiver_name)、收货地址(receiver_address)、联系电话(receiver_phone)、是否默认地址(is_default,0 代表否,1 代表是)。
- 菜品表(dish)
-
- 字段:菜品 ID(dish_id,主键)、菜品名称(dish_name)、菜品分类 ID(category_id,外键关联菜品分类表的 category_id)、图片(image)、价格(price)、库存(stock)、描述(description)、上架状态(is_on_sale,0 代表下架,1 代表上架)。
- 菜品分类表(category)
-
- 字段:分类 ID(category_id,主键)、分类名称(category_name)。
- 订单表(order)
-
- 字段:订单 ID(order_id,主键)、用户 ID(user_id,外键关联 user 表的 user_id)、商家 ID(merchant_id,外键关联商家表的 merchant_id)、订单金额(order_amount)、订单状态(order_status,0 代表待接单,1 代表已接单,2 代表配送中,3 代表已完成,4 代表已取消)、下单时间(order_time)、送餐地址 ID(address_id,外键关联 address 表的 address_id)、备注信息(remark)。
- 订单详情表(order_detail)
-
- 字段:订单详情 ID(order_detail_id,主键)、订单 ID(order_id,外键关联 order 表的 order_id)、菜品 ID(dish_id,外键关联 dish 表的 dish_id)、菜品数量(quantity)、菜品单价(unit_price)。
- 评价表(comment)
-
- 字段:评价 ID(comment_id,主键)、用户 ID(user_id,外键关联 user 表的 user_id)、订单 ID(order_id,外键关联 order 表的 order_id)、菜品 ID(dish_id,外键关联 dish 表的 dish_id)、评价内容(comment_content)、评价星级(star_rating,1 - 5 星)、评价时间(comment_time)、图片(images,JSON 格式存储评价图片路径)。
- 商家表(merchant)
-
- 字段:商家 ID(merchant_id,主键)、商家名称(merchant_name)、商家账号(merchant_account)、密码(password)、联系电话(phone_number)、地址(address)、营业执照图片(business_license_image)、审核状态(audit_status,0 代表未审核,1 代表审核通过,2 代表审核不通过)。
- 系统参数表(system_parameter)
-
- 字段:参数 ID(parameter_id,主键)、参数名称(parameter_name)、参数值(parameter_value),用于存储配送费用规则、支付方式等系统参数。
- 支付方式表(payment_method)
-
- 字段:支付方式 ID(payment_method_id,主键)、支付方式名称(payment_method_name)、支付接口地址(payment_interface_url)、是否启用(is_enabled,0 代表否,1 代表是)。
[此处插入数据库 ER 图]
四、系统实现
4.1 开发环境搭建
- 后端开发环境
-
- JDK:采用 Java Development Kit 1.8,它具有稳定的性能和广泛的兼容性,是开发 Java 应用程序的基础环境。
-
- Maven:项目构建工具,用于管理项目依赖和构建项目。在 pom.xml 文件中添加 Spring Boot 相关依赖,如 spring-boot-starter-web、spring-boot-starter-data-jpa、spring-boot-starter-security、spring-boot-starter-thymeleaf 等。同时,添加 MySQL 数据库驱动依赖,以便与 MySQL 数据库进行连接。
-
- 开发工具:使用 IntelliJ IDEA 作为开发工具,它具有强大的代码智能提示、调试等功能,能够提高开发效率。通过创建 Spring Boot 项目模板,快速搭建项目框架。
- 前端开发环境
-
- Node.js:JavaScript 运行环境,用于安装前端依赖包。在项目目录下,通过 npm(Node Package Manager)命令安装 Vue.js 相关依赖,如 vue、vue-router、vuex、axios 等。
-
- Vue CLI:Vue.js 的官方脚手架工具,通过命令行创建 Vue 项目。使用 Vue CLI 创建一个基于 webpack 模板的项目,并进行项目结构初始化。
-
- 开发工具:使用 Visual Studio Code 进行前端开发,它支持丰富的插件,方便进行代码编写和调试。安装 Vue.js 相关插件,如 Vetur,提供语法高亮、代码智能提示等功能。
4.2 后端功能实现
- 用户模块实现
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@Autowired
private BCryptPasswordEncoder passwordEncoder;
@PostMapping("/register")
public ResponseEntity<String> registerUser(@RequestBody User user) {
String password = user.getPassword();
String encodedPassword = passwordEncoder.encode(password);
user.setPassword(encodedPassword);
userService.registerUser(user);
return ResponseEntity.ok("注册成功");
}
}
@PostMapping("/login")
public ResponseEntity<String> loginUser(@RequestBody LoginRequest loginRequest) {
String username = loginRequest.getUsername();
String password = loginRequest.getPassword();
User user = userService.findUserByUsername(username);
if (user!= null && passwordEncoder.matches(password, user.getPassword())) {
// 生成JWT令牌
String token = jwtTokenUtil.generateToken(user);
return ResponseEntity.ok(token);
} else {
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("用户名或密码错误");
}
}
-
- 注册功能:在后端创建 UserController 类,定义注册接口。接收前端传来的用户注册信息,通过 UserService 类调用 UserRepository 进行数据库插入操作。在注册过程中,对密码进行加密处理,使用 Spring Security 提供的 BCryptPasswordEncoder 类。
-
- 登录功能:在 UserController 类中定义登录接口,验证用户输入的用户名和密码。通过 UserService 类调用 UserRepository 查询数据库中的用户信息,使用 Spring Security 进行身份验证。若身份验证成功,生成 JWT(JSON Web Token)令牌,返回给前端,用于后续请求的身份验证。
- 菜品模块实现
@RestController
@RequestMapping("/dish")
public class DishController {
@Autowired
private DishService dishService;
@GetMapping("/list")
public ResponseEntity<List<Dish>> getDishList(@RequestParam(required = false) Long categoryId, @RequestParam(required = false) String keyword) {
List<Dish> dishList = dishService.getDishList(categoryId, keyword);
return ResponseEntity.ok(dishList);
}
}
@GetMapping("/detail/{dishId}")
public ResponseEntity<DishDetail> getDishDetail(@PathVariable Long dishId) {
DishDetail dishDetail
-
- 菜品浏览功能:在 DishController 类中定义接口,通过 DishService 类调用 DishRepository 查询菜品信息。根据前端传递的菜品分类 ID 或关键词,进行菜品查询,并返回菜品列表数据。
-
- 菜品详情功能:在 DishController 类中定义接口,根据菜品 ID 查询菜品详情信息,包括菜品的基本信息、评价信息等。通过 DishService 类调用 DishRepository 和 CommentRepository 获取相关数据,并返回给前端。