基于vue+Java实现的餐厅订餐点餐管理系统
【代码】基于vue+Java实现的餐厅订餐点餐管理系统。
·
目录
一、 需求分析 1
- 需求描述 1
- 数据流图 2
- 数据元素表 3
二、 数据库概念模式设计 5 - 系统初步E-R图 5
- 系统基本E-R图 7
三、 数据库逻辑模式设计 8 - 数据库关系模式 8
(1)实体 8
(2)实体间联系 8 - 关系模式范式等级的判定与规范化 8
(1) 函数依赖分析 8
(2) 范式等级判定与规范化 10 - 数据库设计优化 10
四、系统结构设计 11 - 体系结构 11
- 功能结构 11
五、数据库基本表的定义 13
六、系统重要功能实现方法 15 - 用户管理 15
- 管理端 16
- 顾客端 19
七、系统实现结果 22 - 用户管理(DBMS)功能 22
- 顾客功能 23
- 管理员功能 26
总结 34
一、需求分析
1.需求描述
在这次大作业的设计过程中,我们计划实现一个餐厅订餐系统,其内部存储了如食品、套餐、订单等和顾客点餐的相关信息,以及部分独属于餐厅本身的信息,如员工、餐厅地址等。使用这个系统,顾客可以根据餐厅提供的菜品随时下单,也可以对每次的订单进行反馈;而数据库管理员则可以通过增删查改等操作完成对整个系统的维护。
我们对整个餐厅订餐系统进行如下描述:
系统内包括若干餐厅,每个餐厅有若干员工在职。系统中有若干顾客账号,每个顾客账号可以有多个取餐信息。每个顾客账号都可以提交多个订单,每个订单都需要唯一的对应一个餐厅,订单内容可以有食品或套餐,其中每个套餐都由若干食品组成。在提交订单后,顾客账户可以对某个订单进行评价反馈。
根据以上描述,我们可以明确,本系统的主要设计目标是给顾客提供一个高效的下单系统,同时给餐厅提供数据库管理系统。进而,我们可以相应的进行功能设计,主要功能如下:
(1)用户管理:整个系统存在管理员、顾客两种用户,管理员的用户信息在系统初始化时已经存储在数据库中,而顾客用户则需要进行注册。
(2)数据管理:餐厅、员工、食品、套餐等系统“静态”信息的管理全部由管理员进行实现,而订单、评价反馈、取餐信息等顾客相关信息则由顾客用户“动态”的进行增删改等操作。
(3)数据查询:对于数据库管理员,系统中的所有数据均可以进行查询,而对于顾客,除了系统中的“静态”信息外,只有属于自己用户的信息才可以查询。
根据以上功能设计,本系统的管理员可以查询系统内的全部数据并对所有“静态”数据进行增删改,而顾客用户则可以查询系统内的“静态”数据以及属于本用户的全部数据,同时可以对属于本用户的数据进行增删改操作。
三、数据库逻辑模式设计
1.数据库关系模式
根据E-R图向关系模式的转换规则,我们可以将上文中得到的系统基本E-R图转化为如下关系模式:
(1)实体
餐厅(餐厅编号,地点,容纳人数,餐厅电话)
员工(员工编号,姓名,年龄,职位,薪资)
顾客(顾客编号,姓名)
订单(订单编号,下单时间,订单金额)
食品(食品编号,名称,售价)
套餐(套餐编号,名称,售价)
评价反馈(反馈编号,反馈内容,反馈时间)
取餐信息(取餐信息编号,联系人,联系电话,地址)
(2)实体间联系
员工入职记录(员工编号,餐厅编号,入职时间,职位,离职时间)
顾客取餐信息(顾客编号,取餐信息编号)
订单取餐信息(订单编号,取餐信息编号)
订单餐厅(餐厅编号,订单编号)
食品订单(订单编号,食品编号)
套餐订单(订单编号,套餐编号)
顾客评价反馈(反馈编号,订单编号,顾客编号)
组成套餐(套餐编号,食品编号,食品数量)
注:关系模式中含有下划线的属性组为主码。
2.关系模式范式等级的判定与规范化
(1)函数依赖分析
餐厅表:
候选码:餐厅编号,地点
函数依赖:餐厅编号容纳人数,餐厅编号地点,餐厅编号餐厅电话,地点餐厅编号
员工表:
候选码:员工编号
函数依赖:员工编号姓名,员工编号年龄,员工编号职位,员工编号薪资,职位薪资
顾客表:
候选码:顾客编号
函数依赖:顾客编号姓名
食品表:
候选码:食品编号,名称
函数依赖:食品编号名称,食品编号售价,食品编号数量,名称食品编号
套餐表:
候选码:套餐编号,名称
函数依赖:套餐编号名称,套餐编号售价,名称套餐编号
评价反馈表:
候选码:反馈编号
函数依赖:反馈编号反馈内容,反馈编号反馈时间
取餐信息表:
候选码:取餐信息编号
函数依赖:取餐信息编号联系人,取餐信息编号联系电话,取餐信息编号地址
订单表:
候选码:订单编号
函数依赖:订单编号下单时间,订单编号订单金额
员工入职记录表:
候选码:(员工编号,餐厅编号,入职时间)
函数依赖:(员工编号,餐厅编号,入职时间) 职位,(员工编号,餐厅编号,入职时间) 离职时间
顾客取餐信息表:
候选码:(顾客编号,取餐信息编号)
函数依赖:无
订单取餐信息表:
候选码:(订单编号,取餐信息编号)
函数依赖:无
订单餐厅表:
候选码:(订单编号,餐厅编号)
函数依赖:无
食品订单表:
候选码:(订单编号,食品编号)
函数依赖:无
套餐订单表:
候选码:(套餐编号,食品编号)
函数依赖:无
顾客评价反馈表:
候选码:(反馈编号,订单编号,顾客编号)
函数依赖:无
组成套餐表:
候选码:(套餐编号,食品编号)
函数依赖:(套餐编号,食品编号) 食品数量
(2)范式等级判定与规范化
根据上述函数依赖关系,我们不难发现,所有关系模式中的每个非主属性都完全依赖于码,因此以上关系模式属于2NF。
对于员工表,我们发现它的码“员工编号”到属性“薪资”的函数依赖关系为传递依赖(存在函数依赖:“员工编号职位”和“职位薪资”),因此上述关系模式不属于3NF。
为了将关系模式规范到3NF,我们使用投影分解的方法将员工表分解为如下两个表:
员工(员工编号,姓名,年龄,职位)
职位表(职位,薪资)
经过进一步函数依赖分析,我们可以发现,规范化后的关系模式达到了3NF的标准。
本文来转载自:http://www.biyezuopin.vip/onews.asp?id=16535
<template>
<div id="registerBackground">
<div class="front">
<h1 class="centerAlign">买当劳™订餐系统</h1>
<div class="radio">
选择您的身份:
<el-radio-group v-model="userType">
<el-radio :label="1">顾客</el-radio>
<!-- <el-radio :label="2">员工</el-radio>-->
<el-radio :label="2">管理员</el-radio>
</el-radio-group>
</div>
<el-input v-model="userName" placeholder="输入您的用户名" class="myInput"></el-input>
<el-input v-model="userPassword" placeholder="输入您的密码" show-password class="myInput"></el-input>
<el-button id="loginButton" v-on:click="login(userType, userName, userPassword)" type="primary">登录</el-button>
<el-button id="registerButton" v-on:click="jumpToRegister">注册</el-button>
</div>
</div>
</template>
<script>
export default {
name: "Login",
data() {
return {
userName: '',
userPassword: '',
userType: 1 //1:顾客,2:管理员
}
},
methods: {
login(userType, userName, userPassword) {
if (userName === '' || userPassword === '') {
this.$message.error('请完整填写信息');
}
else {
axios
.post(
'http://localhost:8080/login',
{
'userType': userType.toString(),
'username': userName,
'password': userPassword
}
)
.then(
(response) => {
if (response.data === 1) {
if (userType === 1) { //顾客
window.location = '/customer';
}
else if (userType === 2) { //管理员
window.location = '/administrator'
}
}
else if (response.data === -1) { //密码错误
this.$message.error('密码错误')
}
else {
this.$message.error('用户不存在');
}
}
)
}
},
jumpToRegister() {
window.location = '/register';
}
}
}
</script>
<style>
#registerBackground {
background: url("../images/seaside_background.png");
width: 100%;
height: 100%;
position: fixed;
background-size: 100% 100%;
}
.front {
position: absolute;
background: rgba(255, 255, 255, 0.8);
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
padding: 10px 15px 10px;
border-radius: 10px;
}
#loginButton {
margin-top: 10px;
position: relative;
left: 150px;
}
#registerButton {
margin: 10px;
position: relative;
right: 150px;
}
.centerAlign {
text-align: center;
}
.radio {
padding-left: 15px;
}
.myInput {
margin-top: 10px;
width: 400px;
}
.sureButton {
margin-top: 10px;
position: relative;
left: 50%;
transform: translate(-50%);
}
</style>
/*.background {*/
/* border: 0;*/
/* margin: 0;*/
/* padding: 0;*/
/* background: url("../images/seaside_background.png");*/
/* width: 100%;*/
/* height: 100%; !**宽高100%是为了图片铺满屏幕 *!*/
/* background-size: 100% 100%;*/
/* z-index: -1;*/
/* position: fixed;*/
/*}*/
更多推荐
已为社区贡献7条内容
所有评论(0)