目录
一、 需求分析 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;*//*}*/