基于Springboot前后端分离餐厅点餐系统毕业设计【附源码+文档】

简介:

  1. 项目名称:基于Springboot前后端分离餐厅点餐系统

  1. 技术栈:Springboot+Mybatis+Vue+Mysql

  1. 功能描述:前台:登录注册、菜品信息、菜品资讯、个人中心

后台:个人中心、用户管理、菜品分离管理、菜品信息管理、餐桌管理、订单管理、菜品 评价管理、轮播图管理和收藏管理等等

  1. 运行环境:Idea+Jdk+Tomcat+Mysql+Navicat

  1. 项目视频:基于Springboot前后端分离餐厅点餐系统-哔哩哔哩


毕设帮助,指导,本源码分享,调试部署(见文末)

摘 要

目前,市场上的网络订餐系统不仅为消费者提供了舒适的用餐环境,还需要提高和加强餐饮业的管理水平。餐饮企业的核心是其深厚的文化内涵和鲜明的主题特征。主题餐厅应选择合适的营销策略,解决生存压力,培养核心竞争优势。设计一个系统,确保信息的准确性和及时性,并通过计算机随时对系统进行管理,使餐厅的点餐信息能够合理地传达给顾客和餐厅工作人员,并确保其具有用餐人数和桌号的选择、点餐、下单、添加、结账等功能。它为餐厅订餐信息管理提供了一种更高效、更实用的管理方法。它为餐厅订餐信息的交换提供了一个更安全、更快的信息平台。

关键词:前后端分离餐厅点餐系统;MySQL数据库;SpringBoot框架;Vue

第一章绪论

1.1 背景及意义

以往的餐厅点餐系统相关信息管理,都是工作人员手工统计。这种方式不但时效性低,而且需要查找和变更的时候很不方便。随着科学的进步,技术的成熟,计算机信息化也日新月异的发展,社会也已经深刻的认识,计算机功能非常的强大,计算机已经进入了人类社会发展的各个领域,并且发挥着十分重要的作用。本系统利用网络沟通、计算机信息存储管理,有着与传统的方式所无法替代的优点。比如计算检索速度特别快、可靠性特别高、存储容量特别大、保密性特别好、可保存时间特别长、成本特别低等。在工作效率上,能够得到极大地提高,延伸至服务水平也会有好的收获,有了网络,在线餐厅点餐系统的各方面的管理更加科学和系统,更加规范和简便。

1.2 国内外研究现况

一些发达国家,网络发展比较快,已经很大程度上完成了从人工到计算机管理的转变。我国计算机应用起步比较晚,而且发展区域不平衡,还有很多用户或学校使用传统的方式进行管理,但是目前计算机发展较快,包括网络也已经普及,很多学校和用户也开始慢慢接触网络管理系统。截至如今,互联网已经深入人们的生活,智能手机、笔记本电脑等已经是人们获取信息的主要工具,这是一个沟通无限的时代,因此,利用网络来进行在线餐厅点餐系统的管理也成为大势所趋,所以,开发一个餐厅点餐系统是必须的。

  1. 关键技术的研究

2.1 B/S架构

系统采用B/S模式,是WEB兴起后的一种网络结构模式。B/S结构主要有三层,分别为数据层、控制逻辑层和视图层。用户通过视图层,让控制层调用数据层的数据,从而达到整个访问过程。三层相互独立,维护方便,使用安全,三层有互相调用,提高效率。

2.2 Mysql数据库

Mysql是一个多用户、多线程的服务器,采用SQL的数据库,数据库管理系统是基于SQL的用户以及服务器模式的关系,它的优点有强大的功能、操作简单、管理方便、可靠安全、运行较快、多线程、跨平台性、完全网络化、稳定性等,非常适合Web站点或者其他应用软件,在数据库后端的开发。

2.3 SpringBoot框架

SpringBoot是一个与Spring框架紧密合作的工具,它可以改善Spring开发人员的体验,并不打算取代Spring作为解决方案。它有许多常见的第三方库配置,其中Spring Boot应用程序具有开箱即用的零配置。

2.4 Vue技术

Vue是一套与其它大型框架不同用于构建用户界面的渐进式JavaScript框架,Vue 被设计为可以自底向上逐层应用。Vue 不仅易于上手,还便于与第三方库或既有项目整合,因为它的核心库只关注视图层。具有高性能、好上手、插件化、便于测试、运行速度快、轻量级的优点,同时达到了视图、数据和结构分离,这样在更改数据的审核只需要操作数据,不需要进行修改逻辑代码。

第三章系统分析

3.1 系统设计目标

本系统采用软件工程的方法进行设计,使系统的实现和管理更加结构化、立体化。设计思想是将系统的总体规划作为系统生产的初级阶段,采用模块化、结构化的设计模式对系统的生命周期进行设计,进行科学的总体规划。从管理者和消费者的角度出发,结合系统的整体设计,完成了重要的功能阶段。

3.2 系统可行性分析

3.3.1技术可行性

餐厅订餐系统是基于B/S模式,使用Mysql数据库存储数据,市场易于购买所需的硬件和软件环境,程序开发主要是管理系统的维护和开发。该系统的开发为餐厅订餐系统的效率带来了质的飞跃。开发该系统所需的设备可以在现有条件下实现,只需要少量的投资资本,因此在经济上是可行的。

3.3.2经济可行性

餐厅预订系统主要采用springboot和vue技术,基于B/S结构和Mysql数据库,用于开发功能齐全、易于使用的应用程序需求,并建立了完整的数据安全和稳定的数据库。餐厅订餐系统的开发技术具有很强的可行性,开发人员已经掌握了一定的开发技术,因此系统的开发是可行的。

3.2.3操作可行性

操作可行性是指正在开发的系统界面的外观和适当性。在过程中,您需要询问是否可以自动生成或更新相关信息。该系统不仅具有简单的界面,而且使用了可视化界面。用户可以使用鼠标和键盘修改、删除和添加相关信息。

3.2.4法律可行性

餐厅订餐系统是其自身设计的管理系统,具有重要的现实意义。由于软件和数据库都是开源代码,因此该系统的开发和设计在法律上是可行的,没有侵权和其他问题。

3.3 系统功能分析和描述

使用餐厅点餐系统的用户分为两部分:管理员和普通用户。

前台系统有首页、菜品信息、个人中心、登入和注册、菜品资讯。

后台管理系统,管理员有的功能有修改密码、个人信息、餐桌管理、菜品订单管理、菜品资讯、轮播图管理、用户管理、菜品分类管理、菜品信息管理和菜品评价管理;普通用户的功能有修改密码、个人信息、菜品点的管理、菜品评价管理和我的收藏管理

3.4 系统UML用例分析

3.4.1前台首页

前台管理功能有:首页、菜品信息、个人中心、登入和注册、菜品资讯。如图3-1所示。

图3-1前台首页用例图

3.5 系统流程分析

3.5.1修改信息流程

管理员选择要修改的信息,进行对数据进行修改后点击保存,数据便会输入数据库,成功将数据修改。修改信息的流程如图3-5所示。

图3-4 修改信息流程图

3.5.2删除信息流程

管理员选择要删除的信息,点击删除按钮,并进行确认,便可以成功删除。删除信息的流程如图3-5所示。

图3-4 删除信息流程图

第四章系统设计

4.1 系统体系结构

餐厅订餐管理系统的结构图4-1所示:

图4-1 系统结构

登录系统结构图如图4-2所示:

图4-2 登录结构图

该系统功能全面,这些功能已经满足餐厅订餐系统的需求,如下图所示。系统功能结构如图4-4所示。

图4-4系统功能结构图

4.2 数据库设计原则

用户信息:用户id、注册时间、用户名称、用户名、照片、性别、密码、照片、联系方式;操作实体E-R图,如图所示。

菜品订单信息:订单id、创建时间、订单编号、餐桌号、菜品类别、菜品分类、总计、下单时间、图片、菜品价格、下单数量;操作E-R图,如图所示。

菜品评价信息:评价id、创建时间、评分、图片、评价内容、订单编号、菜品名称、菜品分类、评价日期、评价人、是否审核;实体E-R图,如图所示。

轮播图信息:轮播图id、照片、内容、创建时间、标题、简绍;E-R图,如图所示。

4.3 数据表

将数据库概念设计的E-R图转换为关系数据库。在关系数据库中,数据关系由数据表组成,但表的结构在表的字段中表示。部分表如下:

表格: caipinxinxi

名称

类型

默认值

备注

id

bigint

<auto_increment>

主键

addtime

timestamp

<INSERT-TimeStamp>

创建时间

caipinmingcheng

varchar(200)

菜品名称

caipinfenlei

varchar(200)

菜品分类

tupian

varchar(200)

图片

caipinjiage

int

菜品价格

cailiao

varchar(200)

<空>

材料

fenliang

varchar(200)

<空>

份量

caipinjieshao

longtext

菜品介绍

clicktime

datetime

<空>

最近点击时间

clicknum

int

0

点击次数

表格: canzhuo

名称

类型

默认值

备注

id

bigint

<auto_increment>

主键

addtime

timestamp

<INSERT-TimeStamp>

创建时间

canzhuohao

varchar(200)

餐桌号

weizhi

varchar(200)

<空>

位置

zuoweishu

int

<空>

座位数

表格: storeup

名称

类型

默认值

备注

id

bigint

<auto_increment>

主键

addtime

timestamp

<INSERT-TimeStamp>

创建时间

userid

bigint

用户id

refid

bigint

<空>

收藏id

tablename

varchar(200)

<空>

表名

name

varchar(200)

收藏名称

picture

varchar(200)

收藏图片

表格: yonghu

名称

类型

默认值

备注

id

bigint

<auto_increment>

主键

addtime

timestamp

<INSERT-TimeStamp>

创建时间

yonghuming

varchar(200)

用户名

mima

varchar(200)

密码

xingming

varchar(200)

<空>

姓名

touxiang

varchar(200)

<空>

头像

xingbie

varchar(200)

<空>

性别

lianxidianhua

varchar(200)

<空>

联系电话

第五章系统实现

5.1 前台功能模块

登入模块。用户在系统的主页面点击登录按钮进入登入界面,在指点的输入框里面输入正确的用户名和密码,并选择角色后点击登入,便可以成功进入系统。

菜品信息功能模块。用户进入菜品信息界面后可以查看到所有菜品的信息,如菜品的图片和菜品的名称,用户可以通过对菜品名称进行关键词进行搜索。

菜品详细信息模块。用户在菜品信息中点击具体一个菜品,可以继而菜品的详细界面,可以看到菜品基本信息,同时可以在下面进行评论和下单。如图所示。

个人中心模块,用户在进入个人中心界面可以查看到个人的具体信息,同时可以在此界面进行对个人信息的修改,修改后按更新信息便可成功修改。如图所示。

5.2 后台功能模块

用户管理,管理员进入后台管理中的用户管理。如图5-7所示。

菜品添加功能模块,管理员在菜品信息界面点击添加按钮便可成功进入添加菜品信息界面,在此界面准确填写好菜品相关信息,点击确认便可成功添加菜品信息,同时跳转到菜品信息展示界面。

轮播图管理模块。当管理员进入轮播图管理界面后,查看到所有轮播图的名称和照片,管理员可以对轮播图进行添加、查询、删除、修改和查看详情的操作。

菜品评价管理模块。管理员进入菜品评价管理界面,可以查看到所有评价的相关信息,管理员可以对评论进行添加、修改、查询、删除、查看详情和审核的操作。

菜品评分统计报表模块。管理员进入菜品评价管理界面,点击统计报表,可以查看可以对菜品对评论的比例饼图。

相关部分代码:

@RestController
@RequestMapping("/caipinxinxi")
public class CaipinxinxiController {
    @Autowired
    private CaipinxinxiService caipinxinxiService;
    

    @RequestMapping("/page")
    public R page(@RequestParam Map<String, Object> params,CaipinxinxiEntity caipinxinxi,
        HttpServletRequest request){
        EntityWrapper<CaipinxinxiEntity> ew = new EntityWrapper<CaipinxinxiEntity>();
        PageUtils page = caipinxinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, caipinxinxi), params), params));

        return R.ok().put("data", page);
    }
    

    @IgnoreAuth
    @RequestMapping("/list")
    public R list(@RequestParam Map<String, Object> params,CaipinxinxiEntity caipinxinxi, HttpServletRequest request){
        EntityWrapper<CaipinxinxiEntity> ew = new EntityWrapper<CaipinxinxiEntity>();
        PageUtils page = caipinxinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, caipinxinxi), params), params));
        return R.ok().put("data", page);
    }

    @RequestMapping("/lists")
    public R list( CaipinxinxiEntity caipinxinxi){
           EntityWrapper<CaipinxinxiEntity> ew = new EntityWrapper<CaipinxinxiEntity>();
          ew.allEq(MPUtil.allEQMapPre( caipinxinxi, "caipinxinxi")); 
        return R.ok().put("data", caipinxinxiService.selectListView(ew));
    }

    @RequestMapping("/query")
    public R query(CaipinxinxiEntity caipinxinxi){
        EntityWrapper< CaipinxinxiEntity> ew = new EntityWrapper< CaipinxinxiEntity>();
         ew.allEq(MPUtil.allEQMapPre( caipinxinxi, "caipinxinxi")); 
        CaipinxinxiView caipinxinxiView =  caipinxinxiService.selectView(ew);
        return R.ok("查询菜品信息成功").put("data", caipinxinxiView);
    }
    
    @RequestMapping("/info/{id}")
    public R info(@PathVariable("id") Long id){
        CaipinxinxiEntity caipinxinxi = caipinxinxiService.selectById(id);
        caipinxinxi.setClicknum(caipinxinxi.getClicknum()+1);
        caipinxinxi.setClicktime(new Date());
        caipinxinxiService.updateById(caipinxinxi);
        return R.ok().put("data", caipinxinxi);
    }

    @IgnoreAuth
    @RequestMapping("/detail/{id}")
    public R detail(@PathVariable("id") Long id){
        CaipinxinxiEntity caipinxinxi = caipinxinxiService.selectById(id);
        caipinxinxi.setClicknum(caipinxinxi.getClicknum()+1);
        caipinxinxi.setClicktime(new Date());
        caipinxinxiService.updateById(caipinxinxi);
        return R.ok().put("data", caipinxinxi);
    }
    
    @RequestMapping("/save")
    public R save(@RequestBody CaipinxinxiEntity caipinxinxi, HttpServletRequest request){
        caipinxinxi.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
        //ValidatorUtils.validateEntity(caipinxinxi);
        caipinxinxiService.insert(caipinxinxi);
        return R.ok();
    }
    
     @RequestMapping("/add")
    public R add(@RequestBody CaipinxinxiEntity caipinxinxi, HttpServletRequest request){
        caipinxinxi.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
        //ValidatorUtils.validateEntity(caipinxinxi);
        caipinxinxiService.insert(caipinxinxi);
        return R.ok();
    }

    @RequestMapping("/update")
    public R update(@RequestBody CaipinxinxiEntity caipinxinxi, HttpServletRequest request){
        //ValidatorUtils.validateEntity(caipinxinxi);
        caipinxinxiService.updateById(caipinxinxi);//全部更新
        return R.ok();
    }
    
    @RequestMapping("/delete")
    public R delete(@RequestBody Long[] ids){
        caipinxinxiService.deleteBatchIds(Arrays.asList(ids));
        return R.ok();
    }
    
     @RequestMapping("/remind/{columnName}/{type}")
    public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, 
                         @PathVariable("type") String type,@RequestParam Map<String, Object> map) {
        map.put("column", columnName);
        map.put("type", type);
        
        if(type.equals("2")) {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            Calendar c = Calendar.getInstance();
            Date remindStartDate = null;
            Date remindEndDate = null;
            if(map.get("remindstart")!=null) {
                Integer remindStart = Integer.parseInt(map.get("remindstart").toString());
                c.setTime(new Date()); 
                c.add(Calendar.DAY_OF_MONTH,remindStart);
                remindStartDate = c.getTime();
                map.put("remindstart", sdf.format(remindStartDate));
            }
            if(map.get("remindend")!=null) {
                Integer remindEnd = Integer.parseInt(map.get("remindend").toString());
                c.setTime(new Date());
                c.add(Calendar.DAY_OF_MONTH,remindEnd);
                remindEndDate = c.getTime();
                map.put("remindend", sdf.format(remindEndDate));
            }
        }
        
        Wrapper<CaipinxinxiEntity> wrapper = new EntityWrapper<CaipinxinxiEntity>();
        if(map.get("remindstart")!=null) {
            wrapper.ge(columnName, map.get("remindstart"));
        }
        if(map.get("remindend")!=null) {
            wrapper.le(columnName, map.get("remindend"));
        }


        int count = caipinxinxiService.selectCount(wrapper);
        return R.ok().put("count", count);
    }
    
    @IgnoreAuth
    @RequestMapping("/autoSort")
    public R autoSort(@RequestParam Map<String, Object> params,CaipinxinxiEntity caipinxinxi, HttpServletRequest request,String pre){
        EntityWrapper<CaipinxinxiEntity> ew = new EntityWrapper<CaipinxinxiEntity>();
        Map<String, Object> newMap = new HashMap<String, Object>();
        Map<String, Object> param = new HashMap<String, Object>();
        Iterator<Map.Entry<String, Object>> it = param.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry<String, Object> entry = it.next();
            String key = entry.getKey();
            String newKey = entry.getKey();
            if (pre.endsWith(".")) {
                newMap.put(pre + newKey, entry.getValue());
            } else if (StringUtils.isEmpty(pre)) {
                newMap.put(newKey, entry.getValue());
            } else {
                newMap.put(pre + "." + newKey, entry.getValue());
            }
        }
        params.put("sort", "clicknum");
        params.put("order", "desc");
        PageUtils page = caipinxinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, caipinxinxi), params), params));
        return R.ok().put("data", page);
    }


}

第六章 测试

6.1测试定义及目的

测试的目的是纠正错误。系统测试是在查询实际运行之前编译查询的过程,使用编译器和手动检查方法来测试查询并纠正逻辑和语法错误,它是保证计算机信息系统正确性的重要步骤。计算机程序写好后,必须把它送到计算机上进行测试。根据测试过程中发现的错误,进行进一步诊断,以确定原因和需要纠正的具体位置。

6.2测试模块

为了方便用户使用“餐厅订餐管理系统”,尽量减少系统测试错误的发生,我们对系统进行了相应的测试。为了测试系统的所有功能接口,我们只需要输入一些数据并提交,然后查看每个页面上的反馈,看看页面的相关功能是否完全实现。

6.2.1 登入模块测试用例

假设存管理员abo,密码也为abo

用例编号

用例模块

用例标题

前置条件

优先级

输入数据

操作步骤

预期结果

实际结果

login_001

登入

输入正确姓名和密码,并选择角色

用户存在数据库中

P1

abo、abo、管理员

点击登入按钮

成功进入管理系统

成功进入管理系统

login_002

输入错误姓名和密码,并选择角色

用户存在数据库中

P2

abo、abo1、管理员

点击登入按钮

显示请求失败

显示请求失败

login_003

不输入用户名

用户存在数据库中

p3

Null,abo、管理员

点击登入按钮

显示请求失败

显示请求失败

login_004

输入用户名,不输入密码

用户存在数据库中

p3

abo2,NULL、管理员

点击登入按钮

显示请求失败

显示请求失败

login_005

输入用户名和密码

不选择用户角色

p2

abo,abo,NULL

点击登入按钮

系统需要提示选择角色

系统需要提示选择角色

5.2.2修改密码测试用例

当存在用户admin、123456

用例编号

用例模块

用例标题

前置条件

优先级

输入数据

操作步骤

预期结果

实际结果

changePassword_001

修改密码

输入原密码、新密码、确认密码

登入管理系统、再进入修改密码界面

p1

123456、1234567、1234567

输入数据后面点击保存按钮

显示注册成功并跳转到登入界面

显示注册成功并跳转到登入界面

changePassword_003

输入错误原密码、新密码、确认密码

登入管理系统、再进入修改密码界面

p2

1234568、1234567、1234567

输入数据后面点击保存按钮

系统提示原密码错误

系统显示原密码错误

changePassword_004

且输入的原密码和确认密码不同

登入管理系统、再进入修改密码界面

p2

123456、1234567、1234568

输入数据后面点击保存按钮

系统提示确认密码和新密码不同

系统提示确认密码和新密码不同

changePassword_005

不输入原密码

登入管理系统、再进入修改密码界面

p3

Null、1234567、1234567

输入数据后面点击保存按钮

系统提示输入原密码

系统提示输入原密码

6.4 测试结果

测试的结果是,订餐系统满足所有要求,处理了大多数错误情况,修复了大多数错误,通过了测试。在线动漫信息平台的基本功能是可行的,无论是系统中的功能还是界面的设计都值得推广。

致 谢

大学的学习生活在这个季节将结束,但是在我的生命这仅仅只是一个逗号,通过这次毕业设计的整个开发过程,从需求分析到具体功能实现,再到最终测试和维护的理解有了很大的进步,让我对系统开发有了更深刻的认识,对我个人的实践能力和解决问题的能力,都有了很大的帮助。这是这次毕业设计最大的收获。

首先要感谢我的指导老师,他在论文写作上,给予了我各种无私的帮助,治学严谨,严格要求,使我获得了很大的收获。老师深厚的理论知识和丰富的实践经验,都深深的影响到我,在这方面,我谨表示衷心的感谢。

其次,我还要对所有的老师和同学表示感谢,他们在我学习的过程中,都积极的提供了很多帮助,无论是专业知识,还是实践操作技能,也能够让我在论文写作中,遇到的一些难题迎刃而解。

最后,对阅读和评审本论文的各位老师表示衷心的感谢!

参考文献

[1]张继东.Mysql数据库基于JSP的访问技术[JOL].电子技术与软件工程,2017,(15): 169 (2017-08-03).

[2]李春燕,李根.基于JSP技术的网络信息用户平台设计[J/OL].电子技术与软件工程,2017,(20) : 9 (2017-10-26) .

[3]王浩.基于JSP技术的在线技能评测系统的设计与实现[J.数字技术与应用,2018,(12) : 171-172.

[4]王金龙,张静.基于JSP+Mysql的高校慕课(MOOC)用户系统设计H[J].通讯世界,2017,(20): 276-277.

该毕业设计相关详细配套资料、配套论文和源代码进行评论或者私聊领取!

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值