目录
1 项目需求分析
1.1 项目名称
高校餐厅管理系统
1.2 项目功能
设计管理系统可以减少管理工作方面的工作量,减少工作人员的高负荷工作量,降低餐厅管理人员在信息管理精力上的投入,也有效减少费用算错等一系列措施,使餐厅获得更大的利润。同时,给各大高校学生用户带来方便,他们可以通过在网上预定自己喜欢的饭菜,不必再为吃饭拥挤而苦恼,节省了很多的等待时间。设计该系统目的在于高效、便捷、快速的管理餐厅。
学生信息功能模块:每位学生都有唯一的学号并被分配到指定的宿舍楼和宿舍,有姓名、年龄、联系方式等。学生首先查看餐厅的基本信息,比如是否营业,客流量,好评度,哪些窗口和出售的菜名等,然后选择合适的餐厅进行就餐,在选择窗口和菜时,可以根据自己的喜好选择,也可以根据好评度选择。学生也可通过外卖系统来订外卖,订完时,系统会生成订单信息。学生也可对餐厅,窗口和菜的质量进行打分。
餐厅工作人员功能模块:餐厅工作人员分为餐厅管理员、窗口管理员和一般员工。餐厅的工作人员能查询自己工作的餐厅和窗口的相关信息,包括餐厅拥有的窗口,该窗口所有菜的信息,正在出售的菜的信息,该窗口的外卖单的信息,销售状况,好评度等,有利于对餐厅和窗口更好的管理,对好评度低的餐厅进行整改。当窗口的菜单信息发生变化时,工作人员对其进行整改,比如,某些菜销售完毕,或者某些菜的价格改变,记录中价格的信息也要做相应的改变等。当有学生在该窗口点餐时,工作人员可以统计销售额,合计总额。当有学生订外卖时,可以及时生成订单的详细信息,确保准确无误的送到指定地点。
窗口信息功能模块:每个窗口都有编号和所属食堂编号,并对此窗口出售的菜进行编号,另外还有此窗口的营业状况,以及学生对其的评价。
菜单信息功能模块:每道菜都有自己的编号、菜名和价钱、所属餐厅的编号和窗口编号,同时有此时的销售状况,以及学生对其的评价。
就餐信息功能模块:主要是记录学生在餐厅的就餐情况,统计使用某道菜的人数、时间,统计某人食用的菜名。可查询餐厅就餐的同学的信息,如查询同学的姓名、住址、学号、性别等。
外卖信息功能模块:每个外卖都有订单号以及订此外卖的学生的学号。可查询外卖号,订外卖的同学的相关信息,送餐的员工的相关信息,是否送餐以及送餐时间。
收入信息功能模块:每道菜会有对应的销售总量和总价,可定期查看收入信息。
评价信息功能模块:该功能主要是学生可对某个餐厅、某个窗口、某道菜进行评价。将评价记录在系统中,并为评价的学生生成一个编号。评价的内容可供其他学生参考。
1.3 项目系统结构图
2 数据库的设计
2.1 概念结构设计
1.实体属性
餐厅信息:餐厅编号、营业状况、好评度、客流量、员工号
窗口信息:窗口编号、餐厅编号、好评度、营业状况、工作人员
菜单信息:菜编号、窗口编号、餐厅编号、菜名、好评度、状况、价钱
评价信息:评价编号、学号、餐厅编号、窗口编号、菜编号、餐厅分数、窗口分数、菜分数
学生信息:学号、姓名、性别、年龄、住址、联系方式
就餐信息:学号、菜编号、就餐时间
菜收入信息:销售编号、菜编号、数量、收入
员工信息:员工号、姓名、性别、年龄、职位、联系方式
外卖信息:学号、订餐号
订餐信息:订餐号、餐厅编号、窗口编号、菜编号、数量、总价
送餐信息:订餐号、员工号、状况、送餐时间
2.实体联系
一个餐厅有多个窗口,每个窗口属于一个餐厅。一个窗口有多道菜,一道菜只在一个窗口销售。销售收入和菜是一对一关系。一个餐厅有多个员工,一个员工在一个餐厅工作。一个窗口可有多个员工,一个员工工作在一个窗口。一个学生可以选多道菜,一道菜可被多个学生选择。学生和订餐是多对多关系,员工和订餐是多对多关系,学生和评价是一对一关系。
3.实体图
局部E-R见文档。
2.2 逻辑结构设计
将E-R图转换为关系模型。并进行优化,最终达到第三范式。
餐厅(餐厅编号,营业状况,好评度,客流量,员工号)
窗口(窗口编号,餐厅编号,好评度,营业状况,员工号)
菜(菜编号,窗口编号,餐厅编号,状况,价钱,好评度)
学生评价(评价编号,餐厅编号,餐厅分数,窗口编号,窗口分数,菜编号,菜分数,学号)
销售收入(销售编号,菜编号,收入)
员工(员工号,姓名,年龄,性别,职位,联系方式)
学生(学号,姓名,性别,年龄,住址,联系方式)
就餐(菜编号,学号,就餐时间)
外卖(学号,订餐号)
订餐(订餐号,餐厅编号,窗口编号,菜编号,数量,总价)
送餐(员工号,订餐号,状况,送餐时间)
2.3 物理结构设计
部分表如下:
(1)餐厅信息表
列名 |
数据类型 |
长度 |
约束 |
说明 |
Cno |
varchar |
10 |
Primary key |
餐厅编号 |
Ccondition |
char |
1 |
是否营业 |
|
Cevaluation |
tinyint |
CHECK |
好评度 |
|
Ccustomer |
smallint |
客流量 |
||
Eno |
varchar |
10 |
NOT NULL Foreign key |
员工号 |
(2)窗口信息表
(3)菜单信息表
(4)学生评价表
(5)菜收入信息表
(6)员工数据信息表
(7)学生信息表
(8)学生就餐信息表
(9)外卖信息表
(10)订餐信息表
(11)送餐信息表
3 数据库的实现
3.1 数据库
数据库名 |
定义数据库语句 |
说明 |
Ctsystem |
create database if not exists Ctsystem; |
创建餐厅数据库Ctsystem |
3.2 表
表名 |
定义表语句 |
说明 |
Canting |
create table Canting (Cno varchar(10) not null primary key, Ccondition char(1), Cevaluation tinyint check(Cevaluation between 0 and 100), Ccustomer smallint, Eno varchar(10) not null, foreign key(Eno) references Employee(Eno) ); |
餐厅信息表 |
Chuangkou |
create table Chuangkou (Wno varchar(10) not null primary key, Wcondition char(1), Eno varchar(10) not null, Cno varchar(10) not null, Wevaluation tinyint check(Wevaluation between 0 and 100), foreign key(Eno) references Employee(Eno), foreign key(Cno) references Canting(Cno) ); |
窗口信息表 |
Caidan |
create table Caidan (Dno varchar(10) not null primary key, Dcondition char(1), Devaluation tinyint check(Devaluation between 0 and 100), price float, Dname varchar(30) not null unique, Wno varchar(10) not null, Cno varchar(10) not null, foreign key(Wno) references Chuangkou(Wno), foreign key(Cno) references Canting(Cno) ); |
菜单信息表 |
Pingjia |
create table Pingjia (Pno varchar(10) not null primary key, Cno varchar(10) not null, Cpoint tinyint check(Cpoint between 0 and 100), Wno varchar(10) not null, Wpoint tinyint check(Wpoint between 0 and 100), Dno varchar(10) not null, Dpoint tinyint check(Dpoint between 0 and 100), Sno varchar(20) not null, foreign key(Wno) references Chuangkou(Wno), foreign key(Cno) references Canting(Cno), foreign key(Dno) references Caidan(Dno), foreign key(Sno) references Student(Sno) ); |
学生评价表 |
Income |
create table Income (Ino varchar(10) not null primary key, Dno varchar(10) not null , Income float, foreign key(Dno) references Caidan(Dno) ); |
菜收入信息表 |
Employee |
create table Employee (Eno varchar(10) not null primary key, Ename varchar(20) not null, sex char(2) not null, age tinyint not null, Epos varchar(20) not null , Ephone varchar(20) not null ); |
员工数据信息表 |
Student |
create table Student (Sno varchar(20) not null primary key, Sname varchar(20) not null, sex char(2) not null, age tinyint not null, Sadd varchar(20) not null, Sphone char(11) not null ); |
学生信息表 |
Jiucan |
create table Jiucan (Sno varchar(20) not null , Dno varchar(10) not null , Sdate datetime not null, foreign key(Dno) references Caidan(Dno), foreign key(Sno) references Student(Sno), primary key(Sno,Dno) ); |
学生就餐信息表 |
Waimai |
create table Waimai (Tno varchar(10) not null, Sno varchar(20) not null, primary key(Sno,Tno) ); |
外卖信息表 |
Dingcan |
create table Dingcan (Tno varchar(10) not null primary key, Cno varchar(10) not null, Wno varchar(10) not null, Dno varchar(10) not null, Tcount int not null, sum float not null, foreign key(Wno) references Chuangkou(Wno), foreign key(Cno) references Canting(Cno), foreign key(Dno) references Caidan(Dno) ); |
订餐信息表 |
Songcan |
create table Songcan (Tno varchar(10) not null , Eno varchar(10) not null, Tcondition varchar(10) not null, Jdate datetime not null, foreign key(Tno) references Dingcan(Tno), foreign key(Eno) references Employee(Eno), primary key(Tno,Eno) ); |
送餐信息表 |
3.3 数据操纵
内容太多,见文档
3.4 视图
视图名 |
定义视图和查询视图语句 |
说明 |
view_waimai |
create view view_waimai as select Sname,Cno,Wno,Dno,Tcount,sum from Student,Waimai,Dingcan Where Student.Sno=Waimai.Sno and Waimai.Tno=Dingcan.Tno; select * from view_waimai; |
建立视图查询学生信息表、外卖信息表、订餐信息表中的学生姓名、餐厅号、窗口号、菜单号,订餐的数量、总价 |
view_employee |
create view view_employee(员工号,姓名,性别,年龄,职位,联系方式) as select Eno,Ename,sex,age,Epos,Ephone from Employee where sex='男'; select * from view_employee; |
创建视图view_employee,包含所有男员工的编号、姓名、密码、性别、年龄、电话和职位,字段名用中文表示,并查询。 |
view_student |
create view view_student(学号,姓名,性别,年龄,住址,联系方式) as select * from Student with check option; select * from view_student; |
便于查询学生信息 |
view_canting |
create view view_canting(餐厅编号,是否营业,好评度,客流量,员工号) as select * from Canting with check option; select * from view_canting; |
查询餐厅信息 |
view_caidan |
create view view_caidan(菜编号,是否供应,好评度,价钱,菜名,窗口编号,餐厅编号) as select * from Caidan with check option; select * from view_caidan; |
查询菜单信息 |
view_income |
create view view_income(销售编号,菜编号,收入) as select * from Income with check option; select * from view_income; |
查询收入信息 |
view_songcan |
create view view_songcan(订餐号,员工号,状况,送餐时间) as select * from Songcan with check option; select * from view_songcan; |
查询送餐信息 |
view_dingcan |
create view view_dingcan(订餐号,餐厅编号,窗口编号,菜编号,数量,总价) as select * from Dingcan with check option; select * from view_dingcan; |
查询订餐信息 |
view_chuangkou |
create view view_chuangkou(窗口编号,是否营业,员工编号,餐厅编号,好评度) as select * from Chuangkou with check option; select * from view_chuangkou ; |
查询窗口信息 |
view_pingjia |
create view view_pingjia(评价编号,餐厅编号,餐厅分数,窗口编号,窗口分数,菜单编号,菜单分数,学号) as select * from Pingjia with check option; select * from view_pingjia ; |
查询评价信息 |
view_jiucan |
create view view_jiucan(学号,菜编号,就餐时间) as select * from Jiucan with check option; select * from view_jiucan; |
查询就餐信息 |
3.5 索引
索引名 |
定义索引语句 |
说明 |
index_chuangkou |
create unique index index_chuangkou on Chuangou(Wevaluation); |
建立窗口评价的唯一索引 |
index_canting |
create index index_canting on Canting(Cno); |
建立餐厅信息表的索引 |
index_caidan |
create index index_caidan on Caidan(Dno); |
建立菜单信息表的索引 |
index_pingjia |
create index index_pingjia on Pingjia(Pno); |
建立学生评价信息表的索引 |
index_income |
create index index_income on Income(Ino); |
建立菜收入信息表的索引 |
index_employee |
create index index_employee on Employee(Eno); |
建立员工信息表的索引 |
index_student |
create index index_student on Student(Sno); |
建立学生信息表的索引 |
index_jiucan |
create unique index index_jiucan on Jiucan(Sno,Dno); |
在学号和菜编号上建立学生就餐信息表的唯一索引 |
index_waimai |
create unique index index_waimai on Waimai(Sno,Tno); |
在学号和订餐号上建立学生就餐信息表的唯一索引 |
index_dingcan |
create index index_dingcan on Dingcan(Tno); |
建立订餐信息表的索引 |
index_songcan |
create unique index index_songcan on Songcan(Tno,Eno); |
在订餐号和员工号上建立学生就餐信息表的唯一索引 |
3.6 存储过程
存储过程名 |
定义及调用存储过程语句 |
说明 |
pro_income |
delimiter // create procedure pro_income() begin declare inos varchar(10); declare incomes float; declare cursor_text CURSOR FOR select Ino,Income from Income; declare continue handler for not found set @cur=0; set @cur=1; open cursor_text; fetch cursor_text into inos,incomes; while @cur do select inos,incomes; fetch cursor_text into inos,incomes; end while; close cursor_text; end // delimiter ; call pro_income(); |
创建存储过程pro_income,利用循环语句控制fetch语句来检索菜收入表中的销售编号和收入。 查询结果为编号为1,收入为12。 |
cai_price |
delimiter // create procedure cai_price(in dno1 varchar(10), in dno2 varchar(10),p varchar(20)) begin declare price1,price2 float; select price into price1 from Caidan where Dno=dno1; select price into price2 from Caidan where Dno=dno2; if price1>price2 then set p=’菜太贵'; else set p=’菜比较便宜’; end if; end // delimiter ; call cai_price('2号菜','3号菜',@p); select @p; drop procedure cai_price; |
创建一个存储过程cai_price,输入两个菜编号,获取菜价进行比较,如果大则输出菜太贵,如果小则输出菜比较便宜,并输出菜价。 输出结果为菜太贵。 |
pro_stu |
delimiter // create procedure pro_stu(in sex1 char(2) ) begin select Sno as '学号',Sname as '姓名',sex as '性别',age as '年龄', Sadd as '住址',Sphone as '联系方式' from Student where sex=sex1; end // delimiter ; call pro_stu('女'); drop procedure pro_stu; |
输入性别,可查询对应性别的所有学生信息。 |
pro_employee |
delimiter // create procedure pro_employee(in i int,in eno varchar(10),in ename varchar(20),in ssex char(2),in aage tinyint, in epos varchar(20),in pho varchar(20)) begin if i = 1 then select * from Employee; else insert into Employee values(eno,ename,ssex,aage,epos,pho); end if; end // delimiter ; call pro_employee(1,null,null,null,null,null,null); call pro_employee(3,'127','张一','男',18,'员工','22345678910'); drop procedure pro_employee; |
如果i为1为查询所有员工信息,否则插入员工信息 |
3.7 存储函数
存储函数名 |
定义及调用存储函数语句 |
说明 |
f_date |
delimiter // create function f_date(sno varchar(20) ,dname varchar(30)) returns datetime DETERMINISTIC begin return ( select Sdate from Jiucan,Student,Caidan where Student.Sno=Jiucan.Sno and Caidan.Dno=Jiucan.Dno and Student.Sno=sno and Dname=dname ); end // delimiter ; select f_date('20201415120','馒头'); |
创建存储函数f_date,返回给定学生,给定菜名。调用存储函数,返回学号为20201415120的学生就餐时间。 输出结果为:2022-11-18 00:00:00 |
f_no |
delimiter // create function f_no() returns float DETERMINISTIC begin declare s float; select sum(Income) into s from Income,Dingcan where Income.Dno=Dingcan.Dno and Tcount>=10; return s; end // delimiter ; select f_no(); drop function f_no; |
创建一个存储函数f_no,在查询Dingcan表数量大于等于10的菜的总收入。 经查询Tount>=10的菜编号为3、4号菜,总收入为320+500=820 |
f_cai |
delimiter // create function f_cai() returns int DETERMINISTIC begin declare count1 int ; select count(*) into count1 from Caidan; return count1; end // delimiter ; select f_cai(); drop function f_cai; |
调用存储函数可以返回菜的个数 |
3.8 触发器
触发器名 |
定义及使用触发器语句 |
说明 |
dc_wm |
delimiter // create trigger dc_wm after delete on Dingcan for each row begin delete from Waimai where Tno=old.Tno; delete from Dingcan where Tno='59'; end // delimiter ; select * from Waimai where Tno='59'; drop trigger dc_wm; |
创建触发器dc_wm,在Dingcan表中当删除客户信息时将Waimai表中与该客户有关的数据同时全部删除。 查询订餐号Tno为59的客户为空。 |
cd_in |
delimiter // create trigger cd_in after update on Caidan for each row begin update Dingcan set sum=new.price*Tcount where Dno=old.Dno; end // delimiter ; 触发: update Caidan set price=20 where Dno='3号菜'; select * from Dingcan where Dno='3号菜'; |
当Caidan表中的菜价发生改变时,相应Income表中的收入也会发生改变。 |
3.9 事件
事件名 |
定义事件语句 |
说明 |
event_waimai |
set @@global.event_scheduler=true; delimiter // create event event_waimai on schedule every 1 month starts curdate()+interval 1 day ends '2023-01-01' do begin truncate table Waimai; end // delimiter ; drop event event_waimai ; |
创建事件event_waimai,要求从明天开始,每月都清空Waimai表,并且在2023年1月1日结束。 |
event_dingcan |
set @@global.event_scheduler=true; create event event_dingcan on schedule every 7 day do truncate table Waimai; alter event event_dingcan enable; alter event event_dingcan on schedule every 1 day; alter event event_dingcan rename to event_dingcan11; show create event event_dingcan\G |
1. 创建event_dingcan事件并开启event_dingcan事件,将每周清空Dingcan表。 2.改为每天清空一次,并重命名event_dingcan事件为event_dingcan11。 |
event_jc |
set @@global.event_scheduler=true; delimiter // create event event_jc on schedule every 1 year do begin delete Jiucan,Student from Jiucan,Student where Jiucan.Sno=Student.Sno and (datediff(now(),Jiucan.Sdate)/365)>1; end // delimiter ; |
将就餐信息表中就餐时间超过一年的学生信息删掉。 |
3.10 事务(在存储过程中使用事务)
存储过程名 |
定义及调用存储过程语句 |
说明 |
p_jw |
delimiter // create procedure p_jw(in no varchar(20)) begin declare exit handler for sqlexception rollback; start transaction; delete from Jiucan where Sno=no; delete from Waimai where Sno=no; commit; end // delimiter ; call p_jw('20201415124'); select * from Jiucan where Sno=’20201415124’; Select * from Waimai where Sno=’20201415124’; |
创建存储过程p_jw,在存储过程中使用事务,实现同时删除给定学生在Jiucan表和Waimai表中的数据。Sno作为输入参数。 |
p_sj |
delimiter // create procedure p_sj(in sno varchar(20)) begin declare exit handler for sqlexception rollback; start transaction; delete from Student where Sno=sno; delete from Jiucan where Sno=sno; commit; end // delimiter ; call p_sj('20201415124'); |
当删除学生信息时,同时删除对应就餐信息。 |
3.11 数据库用户及权限分配
用户名 |
定义用户语句 |
权限分配与回收语句 |
说明 |
admin |
select user from mysql.user; create user 'admin'@'localhost' identified by 'qqq'; |
Show grants for admin@localhost; grant all on Ctsystem.* to admin@localhost; revoke delete on Ctsystem.Student from admin@localhost; |
创建管理用户admin,密码为qqq。授予用户admin对Ctsystem库的所有表具有所有权限。 收回对Student表的delete操作权限。 |
com |
create user 'com'@'localhost' identified by '123'; |
Show grants for com@localhost; grant select,update,delete on Ctsystem.* to com@localhost with grant option; grant insert(Eno,Ename,sex,age,Epos,Ephone) on Ctsystem.Employee to com@localhost; |
创建普通用户com,密码为123。 授予用户com对Ctsystem库中所有表有select操作权限,并允许其将该权限授予其他用户。 授予用户com对库中Employee表的所有列有insert权限。 |
3.12 备份与恢复
操作类型 |
对应操作的SQL语句 |
说明 |
备份 |
mysqldump -u root -p Ctsystem >D:/Ctsystem_b.sql; |
使用mysqldump命令备份数据库Ctsystem中的所有表,将其备份到D:\,备份文件名为Ctsystem_b.sql |
恢复 |
Drop table Canting; mysql -u root -p Ctsystem < D:/Ctsystem_b.sql; source D:/D:/Ctsystem_b.sql; Show tables; |
删除Canting表,使用mysql命令将备份文件Ctsystem_b.sql恢复到数据库Ctsystem中。 使用source命令将备份文件Ctsystem_b.sql恢复到数据库Ctsystem中。 |
导出 |
select * from Student into outfile 'D:/stu/Student.txt' fields terminated by '\,' optionally enclosed by '\"' lines terminated by '\r\n'; |
将 Ctsystem 数据库Student表中的数据导出到D盘stu目录中,字段值用双引号标注,字段值之间用逗号隔开,每行以回车换行为结束标志。 |
导入 |
select * from Student; truncate table Student; load data infile 'D:/stu/Student.txt' into table Student fields terminated by '\,' optionally enclosed by '\"' lines terminated by '\r\n'; |
删除Student表中的数据,然后将导出后的数据导入到Student表中。 |
4 项目总结及心得
见文档。