介绍:这是一份比较简陋的数据库大作业,文章末尾有源码资源,并且有视频讲解如何使用该源码。
(1)对选定的实验做简单的需求分析
- 管理员管控所有的菜品状态
- 学生、教师注册帐号
- 学生、教师修改密码
- 学生、教师查看个人信息
- 学生、教师查看”我的收藏”并且在该界面可以选择取消收藏
- 学生、教师查看菜单界面,并且在该页面可以查询菜品、收藏菜品
- 学生、教师查看功能界面,并且在功能界面可以选择”随机选餐”并且系统自动配备主食和饮料(或者汤)
- 管理员登陆查看基本信息
- 管理员登陆修改密码
- 管理员修改菜单:增加菜品、删除菜品、查询菜品、修改菜单、下架或者上架菜品、修改窗口类型
(2)在数据流图和字典的基础上做出E-R图(概念结构设计)
- E-R图:
(3)在E-R图基础上进行关系模式设计(至少满足3NF)(逻辑结构设计)
- 管理员(admin):
管理员admin(工号ano,密码password)
- 用户(student):
用户student(学号/工号sno,姓名sname,密码password)(函数依赖:sno->sname,sno->password)
- 食物(food):
食物food(食物名称fname,窗口号wno,价格price,状态state)(函数依赖:fname->wno,fname->price,fname->state)
- 窗口(windows):
窗口windows(窗口号wno,窗口类型wname)(函数依赖:wno->wname)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rKkyWISk-1646309495510)(…/AppData/Local/Temp/ksohtml3588/wps50.jpg)]
- 收藏(collection):
收藏collection(学号/工号sno,食物名称fname)(同时学号/工号sno,食物名称fname)(函数依赖:无)
(注意:sno是student的主键,fname是food的主键,所以这里的sno和fname同时是外键,并且这里外键会使用级联删除)
基于上述的关系模式设置该逻辑结构满足BCNF的范式。
(4)根据需求分析中的各种数据请求得出各种视图以及各种约束、规则、触发器脚本描述
-
主键约束:
- 管理员admin的主键是工号ano
- 用户student的主键是学号/工号sno
- 食物food的主键是食物名称fname
- 窗口windows的主键是窗口号wno
- 收藏collection的主键是学号/工号sno和食物名称fname
-
主键约束:
- 管理员admin的主键是工号ano
- 用户student的主键是学号/工号sno
- 食物food的主键是食物名称fname
- 窗口windows的主键是窗口号wno
- 收藏collection的主键是学号/工号sno和食物名称fname
-
触发器:
-
设置一些简单的触发器,作为实验过程的需要:
-
当管理员加入新的菜品的时候,管理员不需要关心菜品的状态,触发器一旦检测到有新的菜品的加入,就会默认将它的状态改为在售:
-
当管理员删除菜品的时候,就会级联删除collection表中的对应数据:(比如删除三鲜汤这一菜品,如果有用户收藏了该菜品,那么收藏的也会删除)
-
触发器等均由PyQt5中的功能代替实现:在python中使用if……else……进行判断,使用PyQt5中的QMessageBox进行错误信息提示。
比如在进行菜品收藏时,由python代码执行sql语句来判断该菜品是否已经收藏了,如果已经收藏了,就会有错误提示;如果没有收藏就可以成功收藏:
比如在修改密码时,如果没有输入旧密码就会出现错误提示;如果输入的旧密码和真实的旧密码不同也会出现错误提示;如果匹配上了但是两次新密码不同也会报错:
比如在每次加入新的菜品收藏之后就会对应的增加用户的收藏数,并且在取消菜品的收藏之后也会对应的减少用户的收藏数:
-
-
-
索引:
- 管理员admin的索引是主键索引:工号ano
- 用户student的索引是主键索引:学号/工号sno
- 食物food的索引是主键索引:食物名称fname
- 窗口windows的索引是主键索引:窗口号wno
- 收藏collection的索引是主键索引:学号/工号sno和食物名称fname
- 管理员admin的索引是主键索引:工号ano
-
视图:
-
制作了菜单视图menu:该视图将用于用户查看菜单信息以及它对应的窗口以及它所属的菜品类型。
create VIEW `menu` AS select `food`.`fname` AS `fname`,`food`.`wno` AS `wno`,`food`.`price` AS `price`,`windows`.`wname` AS `wname`,`food`.`state` AS `state` from (`food` join `windows`) where (`food`.`wno` = `windows`.`wno`);
-
-
存储过程:
- 收藏操作对应的存储过程:由于需要检测该菜品是否被收藏过,所以可以设置一个存储过程,在该存储过程中查询对应的收藏信息,在collection的函数体中调用该存储过程:
- 信息界面对应的存储过程:在信息界面需要得到用户的基本信息,可以在设置show_information存储过程完成获取操作,并返回。在源函数体中对该存储过程进行调用即可。
- 收藏界面对应的存储过程:在收藏界面需要展示该用户的所有收藏的菜品,可以在设置show_collection存储过程完成获取操作,并返回。在源函数体中对该存储过程进行调用即可。
- 查询对应的存储过程:在查询界面需要进行一些对菜品的查询操作,可以在设置search_sql存储过程完成查询操作,并返回。在源函数体中对该存储过程进行调用即可。
- 收藏操作对应的存储过程:由于需要检测该菜品是否被收藏过,所以可以设置一个存储过程,在该存储过程中查询对应的收藏信息,在collection的函数体中调用该存储过程:
(5)测试运行
使用python(结合Qt5)实现SQL调用和用户交互:
运行main.py,启动餐厅菜品管理系统程序:进入登陆界面
如果用户没有帐号,需要点击”学生/教师注册”然后进行账号的注册:
输入学号/工号、姓名、密码(输入:123),然后点击注册,显示注册成功,请登录,然后回到登陆界面:输入刚才的学号和密码进行登陆。
登陆之后会进去用户界面:在该界面的个人信息中可以查看用户的基本信息,并且可以修改密码。
这里实验把用户的密码改为123456:先输入旧密码123,再输入新密码123456,然后再次输入123456,最后点击确定修改,可以看到程序提示修改成功。
接下来点击菜单选项:可以看到有一系列的菜品信息:
选择其中的一个菜品(百事可乐),用鼠标点击,然后再点击收藏:可以发现收藏成功,然后再查看我的收藏
可以看到我的收藏中收藏了百事可乐的相关信息,并且在个人信息中可以查看用户的收藏的数量:
同时我们可以点击百事可乐,再点击取消收藏,就可以取消对百事可乐的收藏
菜单中提供了菜品查询功能,比如输入窗口号14,就可以查询窗口号14的所有菜品;在价格一栏输入8就可以查询所有价格为8的菜品;用户想吃干锅了,在类型中输入干锅类就可以查询所有的干锅菜品。
用户如果纠结吃什么,可以在功能中选择随机选餐,那么系统就会为用户选择一道主食菜品,然后再搭配饮料或者汤。
接下来是以管理员的身份登陆(帐号:1 密码:1)进入之后就可以看到管理员的基本信息,并且可以和用户一样的方式进行密码的修改:
管理员的可以再修改菜品界面进行菜品的修改:可以点击一道菜品进行删除,或者在上方的表格中填入新的菜品的菜名、窗口号、价格、窗口名(状态默认在售)然后点击增加就可以增加新的菜品。查询功能和用户一样。修改菜单主要是输入在上面表格输入菜名、价格(或者窗口号)然后就可以针对菜品进行价格或者窗口的修改。修改窗口类型需要输入窗口号以及对应的修改窗口类型。
比如小炒肉现在窗口号为6,是炒菜类,将窗口号改位17:
(6)演示视频
菜单管理系统
(7)源代码:
main.py
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import sys
from PyQt5.uic import loadUiType
import random
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMessageBox
import sql
import user
from login import Ui_login as login
from logon import Ui_logon as logon
from student import Ui_student as student
from admin import Ui_admin as admin
class Login(QMainWindow,login):
def __init__(self):
QMainWindow.__init__(self)
self.setupUi(self)
self.lineEdit.setPlaceholderText("请输入学号/工号")#帐号框中的内容
self.lineEdit_2.setPlaceholderText("请输入密码")#密码框中的内容
self.lineEdit_2.setEchoMode(QLineEdit.Password)#密码显示为黑点
self.pushButton.clicked.connect(self.user_login)#push框 连接 学生/教师登陆框
self.pushButton_2.clicked.connect(self.admin_login)#push框2 连接 管理员登陆框
self.pushButton_3.clicked.connect(self.user_logon)#push框3 连接 学生/教师注册框
def user_login(self):#学生/教师登陆
try:
#初始状态下帐号和密码为空
username = None
password = None
username=self.lineEdit.text()
user.current_user=username
results=sql.do("select password from student where sno='%s'" % (username))
(password,)=results[0]#results存储的是密码
if self.lineEdit_2.text() == password:#密码正确
self.window2=Student()#转到Student的界面
self.close()#关闭当前的界面
self.window2.show()#展示Student的界面
else:#密码错误
# self.lineEdit.clear() #根据需要来判断是否需要清空帐号框,实际上为了方便用户输入,即使密码错误,也没有必要删除帐号框
self.lineEdit_2.clear()#清空密码框的内容
QMessageBox.information(self,"错误提示","学号/工号或密码错误!")
except:
pass
def admin_login(self):#管理员登陆
try:
#初始状态下帐号和密码为空
username = None
password = None
#这段代码的实现和上面 学生/教师登陆 对应位置的实现思路一样
username=self.lineEdit.text()
user.current_admin=username
results=sql.do("select password from admin where ano='%s'" % (username))
(password,)=results[0]#results存储的是密码
if self.lineEdit_2.text() == password:#密码正确
self.window4 = Admin()#转到管理员的界面
self.close()#关闭当前的界面
self.window4.show()#展示管理员的界面
else:#密码错误
# self.lineEdit.clear()#根据需要来判断是否需要清空帐号框,实际上为了方便管理员输入,即使密码错误,也没有必要删除帐号框
self.lineEdit_2.clear()#清空密码框的内容
QMessageBox.information(self, "错误提示", "工号或密码错误!")
except:
pass
def user_logon(self):#学生/教师注册
self.window3=Logon()#跳转到注册界面
self.window3.show()#展示注册界面,注意不需要关闭之前的界面
class Logon(QDialog,logon):#学生/教师注册界面
def __init__(self):#初始化设置
QDialog.__init__(self)
self.setupUi(self)#初始化窗口
self.lineEdit_2.setEchoMode(QLineEdit.Password) #设置 密码: 密码显示为黑点
self.lineEdit_3.setEchoMode(QLineEdit.Password) #设置 再次确定密码: 密码显示为黑点
self.pushButton.clicked.connect(self.register) #下面的方框 连接 注册
def register(self):
try:
sno=self.lineEdit.text() #学号
sname=self.lineEdit_4.text() #姓名
password1=self.lineEdit_2.text()#密码
password2=self.lineEdit_3.text()#再次确定密码
if len(sno)==0:#如果没有输入学号
QMessageBox.information(self,"提示","请输入学号!")
else:#输入学号之后需要查询是否存在这个学号
results=sql.do("select * from student where sno=%s" % sno)#尝试查询该学号,并存储结果
if len(results)==0:#如果不存在该学号
if password1==password2:#两次输入的密码一致
sql.do("insert into student values(%s,'%s','%s')" % (sno,sname,password1))#添加该学生的信息
QMessageBox.information(self,"成功提示","注册成功,请登录!")
else:#如果两次输入的密码不一致
QMessageBox.information(self,"错误提示","两次密码不同,请重新输入密码!")
else:#如果存在该学号,无法注册
QMessageBox.information(self,"错误提示","该学号已注册!")
except:
pass
class Student(QDialog,student):
def __init__(self):
QDialog.__init__(self)
self.setupUi(self)#初始化窗口
self.show_information()#分别调用show_information、show_collection、show_menu
self.show_collection()
self.show_menu()
self.lineEdit_4.setEchoMode(QLineEdit.Password)#设置 旧密码: 密码显示为黑点
self.lineEdit_5.setEchoMode(QLineEdit.Password)#设置 新密码: 密码显示为黑点
self.lineEdit_6.setEchoMode(QLineEdit.Password)#设置 新密码: 密码显示为黑点
self.pushButton_5.clicked.connect(self.change_password)#确定修改窗口 连接 change_password函数
self.pushButton.clicked.connect(self.search_food)#查询窗口 连接 search_food函数
self.pushButton_2.clicked.connect(self.collection)#收藏窗口 连接 collection函数
self.pushButton_3.clicked.connect(self.cancel_collection)#取消收藏窗口 连接 cancel_collection函数
self.pushButton_4.clicked.connect(self.random_food)
def show_information(self):#基本信息 界面
# results=sql.do("select * from student where sno=%s" % user.current_user)#results按序存储当前用户的学号、姓名、收藏数 形如:((),())
results=sql.do("call show_information(%s)"% user.current_user)#results按序存储当前用户的学号、姓名、收藏数 形如:((),()) 这里调用了存储过程show_information
# print(results)
sno=str(results[0][0])
sname=str(results[0][1])#全部转化成string的形式
results=sql.do("select count(*) from collection where sno=%s" % user.current_user)
cnum=str(results[0][0])
self.lineEdit.setText(sno)#第一个框显示学号
self.lineEdit_2.setText(sname)#第一个框显示姓名
self.lineEdit_3.setText(cnum)#第一个框显示收藏数
def show_collection(self):#我的收藏 界面
# results = sql.do("select food.fname,food.wno,food.price,windows.wname,food.state"#存储:饭菜名、窗口号、价格、窗口名、状态
# " from collection,food,windows"
# " where collection.sno=%s"
# " and food.wno=windows.wno"
# " and collection.fname=food.fname" % (user.current_user))
results=sql.do("call show_collection(%s)"%(user.current_user))#调用show_collection存储过程
# print(results)
self.tableWidget_2.setColumnCount(5)#设置表格的列数为5
self.tableWidget_2.setRowCount(len(results) + 1)#行数为results中的结果数目+1
for i in range(len(results)):
self.tableWidget_2.setVerticalHeaderItem(i + 1, QTableWidgetItem(str(i + 1)))#从第1行到最后一行(result中的数目+1)设置序号
for i in range(len(results)):#设置第i行
for j in range(len(results[i])):#设置第i行第j列
self.tableWidget_2.setItem(i + 1, j, QTableWidgetItem(str(results[i][j])))#第i+1行第j列的内容显示
def show_menu(self):#菜单 界面
results=sql.do("select * from menu")#results存储菜单的所有信息
# print(results)
#菜单列表
self.tableWidget.setColumnCount(5)#菜单列表设置为5列
self.tableWidget.setRowCount(len(results)+1)#菜单列表设置行数
for i in range(len(results)):#设置每行的序号
self.tableWidget.setVerticalHeaderItem(i+1,QTableWidgetItem(str(i+1)))
for i in range(len(results)):#设置第i行
for j in range(len(results[i])):#设置第i行第j列
self.tableWidget.setItem(i+1,j,QTableWidgetItem(str(results[i][j])))#第i+1行第j列的内容显示
#搜索列表
self.tableWidget_4.setColumnCount(5)#搜索列表设置为5列
self.tableWidget_4.setRowCount(2)#搜索列表设置行数
for i in range(5):#初始该表信息为空
self.tableWidget_4.setItem(1,i,QTableWidgetItem(''))
def show_function(self):#功能 界面
pass
def change_password(self):#修改密码 执行的操作
old_password=self.lineEdit_4.text()#得到旧密码
new_password=self.lineEdit_5.text()#得到新密码
new_password_1=self.lineEdit_6.text()#得到新密码的确认密码
if len(old_password)==0:#如果没有输入旧密码
QMessageBox.information(self,"提示","请输入旧密码!")
else:#输入了旧密码之后
results=sql.do("select password from student where sno=%s" % user.current_user)#需要查询对应用户的真实的旧密码 形如((),())
# print(results)
now_password=str(results[0][0])#将真实的旧密码转成string
if now_password==old_password:#如果输入的旧密码和真实旧密码一致
if len(new_password)!=0:#并且输入了新密码
if new_password_1!=new_password:#但是输入两次新密码不一致
QMessageBox.information(self,"错误提示","两次密码不同,请确认!")
else:#输入两次新密码一致
sql.do("update student set password='%s' where sno=%s" % (new_password,user.current_user))#修改密码
QMessageBox.information(self,"成功提示","修改成功!")
else:#没有输入新密码
QMessageBox.information(self,"错误提示","新密码不能为空,请输入!")
else:#如果输入的旧密码和真实旧密码不一致
QMessageBox.information(self,"错误提示","旧密码错误,请重新输入!")
def cancel_collection(self):#取消收藏 执行的操作
try:
current_food=self.tableWidget_2.item(self.tableWidget_2.currentRow(),0).text()#鼠标点击之后的行在 收藏表 中的行列信息 的第一列信息是当前食物名称
# print(current_food)
sql.do("delete from collection where fname='%s'" % (current_food))#从collection表中删除当前 取消收藏的 食物
QMessageBox.information(self,"提示","取消收藏%s成功!" % (current_food))
self.show_collection()#更新收藏界面
self.show_information()#更新基本信息
except:
pass
def collection(self):#收藏 执行的操作
try:
current_food=self.tableWidget.item(self.tableWidget.currentRow(),0).text()#鼠标点击之后的行在 菜单表 中的行列信息 的第一列信息是当前食物名称
if len(current_food)!=0:#当前点击到了食物行
# results=sql.do("select * from collection where fname='%s' and sno=%s" % (current_food,user.current_user))#results存储对应食物和用户在收藏表中的信息
results=sql.do("call collection('%s',%s)"%(current_food,user.current_user))#调用储存过程collection,返回在collection中对应的信息
# print(results)
if len(results)==0:#如果该食物在用户的收藏表中不存在,说明可以添加到收藏表中
sql.do("insert into collection values(%s,'%s')" % (user.current_user,current_food))
QMessageBox.information(self,"成功提示","收藏%s成功!" %(current_food))
self.show_collection()#更新收藏表
self.show_information()#更新基本信息
else:#如果该食物在用户的收藏表中存在,说明不可以添加到收藏表中
QMessageBox.information(self,"错误提示","%s已收藏,请勿重复收藏!" %(current_food))
except:
pass
def search_food(self):#查询 执行的操作
fname=self.tableWidget_4.item(1,0).text()#饭菜名
wno=self.tableWidget_4.item(1,1).text()#窗口号
price=self.tableWidget_4.item(1,2).text()#价格
wname=self.tableWidget_4.item(1,3).text()#窗口名
state=self.tableWidget_4.item(1,4).text()#状态
print(fname,wno,price,wname,state)
#动态生成sql查询语句
search_sql="select * from menu where " \
"(fname like '%{0}%' or '{0}'='') " \
"and (wno='{1}' or '{1}'='') " \
"and (price='{2}' or '{2}'='') " \
"and (wname='{3}' or '{3}'='') " \
"and (state='{4}' or '{4}'='')".format(fname,wno,price,wname,state)#根据条件进行查询,如果全空就是查询所有的菜名信息
results=sql.do(search_sql)#results存储查询结果
# search_sql="call search_sql('{0}','{1}','{2}','{3}','{4}')".format(fname,wno,price,wname,state)
# results=sql.do("call search_sql('%s',%s,%s,'%s','%s')"%(fname,wno,price,wname,state))
self.tableWidget.setColumnCount(5)#查询结果表 设置 列数:5
self.tableWidget.setRowCount(len(results) + 1)#查询结果表 设置 行数:结果数+1
for i in range(len(results)):
self.tableWidget.setVerticalHeaderItem(i + 1, QTableWidgetItem(str(i + 1)))#设置行序号
for i in range(len(results)):
for j in range(len(results[i])):
self.tableWidget.setItem(i + 1, j, QTableWidgetItem(str(results[i][j])))#设置第i+1行第j列的属性值
def random_food(self):
try:
results=sql.do("select * from menu where wname='水煮类' or wname='炒菜类' or wname='粉蒸类' or wname='铁板/煲类' or wname='凉菜类' or wname='干锅类'")#results存储主食的菜名信息
# results=sql.do("select * from menu where state='在售'")#results存储所有状态为“在售”的菜名信息
random_one_main=random.choice(results)#主食随机从中选择一个
results=sql.do("select * from menu where wname='饮料类' or wname='汤类'")#results存储饮料/汤类的菜名信息
random_one_drink=random.choice(results)#饮料/汤随机从中选择一个
self.tableWidget_3.setColumnCount(5)#随机菜单 设置 列数:5
self.tableWidget_3.setRowCount(3)#随机菜单 设置 行数:2
for i in range(3):
self.tableWidget_3.setVerticalHeaderItem(i + 1, QTableWidgetItem(str(i + 1)))#设置行序号
for i in range(5):
self.tableWidget_3.setItem(1, i, QTableWidgetItem(str(random_one_main[i])))
self.tableWidget_3.setItem(2, i, QTableWidgetItem(str(random_one_drink[i])))
# self.tableWidget_3.setItem(2, i, QTableWidgetItem(str(results[1][i])))
# self.tableWidget_3.setItem(3, i, QTableWidgetItem(str(results[2][i])))
except:
pass
class Admin(QDialog,admin):
def __init__(self):#初始化
QDialog.__init__(self)
self.setupUi(self)
self.show_information()#基本信息 界面展示
self.show_menu()#菜单信息 界面显示
self.lineEdit_2.setEchoMode(QLineEdit.Password) # 密码显示为黑点
self.lineEdit_3.setEchoMode(QLineEdit.Password) # 密码显示为黑点
self.lineEdit_4.setEchoMode(QLineEdit.Password) # 密码显示为黑点
self.pushButton_5.clicked.connect(self.change_password)#确定修改框 连接 change_password函数
self.pushButton.clicked.connect(self.change_food)#修改菜单框 连接 change_food函数
self.pushButton_3.clicked.connect(self.add_food)#增加框 连接 add_food函数
self.pushButton_2.clicked.connect(self.change_state)#下架/上架 连接 change_state函数
self.pushButton_4.clicked.connect(self.search_food)#查询框 连接 search_food函数
self.pushButton_6.clicked.connect(self.delete_food)#删除框 连接 delete_food函数
self.pushButton_7.clicked.connect(self.change_wname)#修改窗口名 连接 change_wname函数
def show_information(self):#基本信息 界面
self.lineEdit.setText(str(user.current_admin))#显示管理员的工号
def show_menu(self):#菜单 界面
results=sql.do("select * from menu")#results存储菜单中的所有信息
self.tableWidget_2.setColumnCount(5)#菜单表 设置 列数:5
self.tableWidget_2.setRowCount(len(results)+1)#菜单表 设置 行数
for i in range(len(results)):
self.tableWidget_2.setVerticalHeaderItem(i+1,QTableWidgetItem(str(i+1)))#菜单表 设置 行序号
for i in range(len(results)):
for j in range(len(results[i])):
self.tableWidget_2.setItem(i+1,j,QTableWidgetItem(str(results[i][j])))#菜单表 设置 第i+1行第j列 的属性值
self.tableWidget.setColumnCount(5)#菜单查询表 设置 列数:5
self.tableWidget.setRowCount(2)#菜单查询表 设置 行数
for i in range(1):
self.tableWidget.setVerticalHeaderItem(i+1,QTableWidgetItem(str(i+1)))#菜单查询表 设置 行序号
for i in range(5):
self.tableWidget.setItem(1, i, QTableWidgetItem(''))#菜单查询表 设置 第i+1行第j列 的属性值为空
def change_password(self):#管理员-修改密码 执行的操作
old_password = self.lineEdit_2.text()#旧密码
new_password = self.lineEdit_3.text()#新密码
new_password_1 = self.lineEdit_4.text()#确定新密码
if len(old_password) == 0:#未输入旧密码
QMessageBox.information(self, "错误提示", "请输入旧密码!")
else:#输入了旧密码
results = sql.do("select password from admin where ano=%s" % user.current_admin)#查询该管理员的真实旧密码 形如((),())
now_password = str(results[0][0])#提取结果
if now_password == old_password:#如果输入的旧密码匹配
if len(new_password) != 0:#并且输入了新密码
if new_password_1 != new_password:#但是两次输入的新密码不同
QMessageBox.information(self, "错误提示", "两次密码不同,请确认!")
else:#两次输入的新密码相同,允许修改
sql.do("update admin set password='%s' where ano=%s" % (new_password, user.current_admin))
QMessageBox.information(self, "成功提示", "修改成功!")
else:#没有输入新密码
QMessageBox.information(self, "提示", "新密码不能为空,请输入!")
else:#如果输入的旧密码不匹配
QMessageBox.information(self, "错误提示", "旧密码错误,请重新输入!")
# print("change password")
# pass
def search_food(self):#查询 执行的操作
#查询窗口的5个属性:
fname = self.tableWidget.item(1, 0).text()#饭菜名
wno = self.tableWidget.item(1, 1).text()#窗口号
price = self.tableWidget.item(1, 2).text()#价格
wname = self.tableWidget.item(1, 3).text()#窗口名
state = self.tableWidget.item(1, 4).text()#状态
# print(fname)
# 动态生成sql查询语句
search_sql="select * from menu where " \
"(fname like '%{0}%' or '{0}'='') " \
"and (wno='{1}' or '{1}'='') " \
"and (price='{2}' or '{2}'='') " \
"and (wname='{3}' or '{3}'='') " \
"and (state='{4}' or '{4}'='')".format(fname,wno,price,wname,state)#根据条件进行查询,如果全空就是查询所有的菜名信息
results = sql.do(search_sql)#results存储查询的菜单信息
# print(results)
self.tableWidget_2.setColumnCount(5)#查询菜单结果 设置 列数:5
self.tableWidget_2.setRowCount(len(results) + 1)#查询菜单结果 设置 行数
for i in range(len(results)):
self.tableWidget_2.setVerticalHeaderItem(i + 1, QTableWidgetItem(str(i + 1)))#查询菜单结果 设置 行序号
for i in range(len(results)):
for j in range(len(results[i])):
self.tableWidget_2.setItem(i + 1, j, QTableWidgetItem(str(results[i][j])))#查询菜单结果 设置 第i+1行第j列的属性值
# print("search")
# pass
def add_food(self):#增加菜 执行的操作
try:
#增加窗口的属性提取:
fname = self.tableWidget.item(1, 0).text()#菜名
wno = self.tableWidget.item(1, 1).text()#窗口号
price = self.tableWidget.item(1, 2).text()#价格
# wname = self.tableWidget.item(1, 3).text()#窗口名
add_sql = "insert into food values('%s',%s,%s,'')" % (fname,wno,price)
sql.do(add_sql)#执行该sql语句
QMessageBox.information(self,"成功提示","{0}添加成功!".format(fname))
self.show_menu()#更新菜单界面
except:
pass
def change_food(self):#修改菜单 执行的操作
try:
#增加窗口的属性提取:
fname = self.tableWidget.item(1, 0).text()#菜名
wno = self.tableWidget.item(1, 1).text()#窗口号
price = self.tableWidget.item(1, 2).text()#价格
if len(fname)==0:#如果没有输入菜名
QMessageBox.information(self,"提示","请输入想要修改属性的饭菜名!")
else:#如果输入了菜名
if len(wno)!=0:
sql.do("update food set wno=%s where fname='%s'" % (wno,fname))
QMessageBox.information(self, "成功提示", "窗口修改成功!")
if len(price)!=0:
sql.do("update food set price=%s where fname='%s'" % (price, fname))
QMessageBox.information(self, "成功提示", "价格修改成功!")
self.show_menu()#更新菜单 界面
except:
pass
def change_state(self):#修改状态 执行的操作
try:
current_food_fname=self.tableWidget_2.item(self.tableWidget_2.currentRow(),0).text()#鼠标点击之后的行在 菜单表 中的行列信息 的第一列信息是当前食物名称
results=sql.do("select state from food where fname='%s'" % (current_food_fname))#查询当前食物的状态
current_food_state=str(results[0][0])#提取结果
if current_food_state!="在售":#如果当前是“下架”就需要修改“在售”
sql.do("update food set state='%s' where fname='%s'" % ("在售",current_food_fname))
QMessageBox.information(self,"成功提示","上架成功!")
else:#如果当前是“在售”就需要修改“下架”
sql.do("update food set state='%s' where fname='%s'" % ("下架", current_food_fname))
QMessageBox.information(self, "成功提示", "下架成功!")
self.show_menu()#更新菜单 界面
# print(current_food_state)
except:
pass
def delete_food(self):#删除 执行的操作
try:
current_food_fname=self.tableWidget_2.item(self.tableWidget_2.currentRow(),0).text()#鼠标点击之后的行在 菜单表 中的行列信息 的第一列信息是当前食物名称
sql.do("delete from food where fname='%s'" % (current_food_fname))#删除该菜品
QMessageBox.information(self,"成功提示","删除成功!")
self.show_menu()#更新菜单 界面
except:
pass
def change_wname(self):#修改窗口名 执行的操作
try:
#修改窗口的属性提取:
current_wno = self.tableWidget.item(1, 1).text()#窗口号
current_wname=self.tableWidget.item(1, 3).text()#窗口名
# print(current_wno,current_wname)
if len(current_wname)==0:#如果没有输入窗口名
QMessageBox.information(self,"提示","请输入窗口号!")
else:
sql.do("update windows set wname='%s' where wno=%s" % (current_wname,current_wno))
QMessageBox.information(self, "成功提示", "修改窗口名成功!")
self.show_menu()#更新菜单 界面
except:
pass
def main():
app=QApplication(sys.argv)
window=Login()
palette = QPalette()
pix=QPixmap("./222.png")
pix = pix.scaled(window.width(),window.height())
palette.setBrush(QPalette.Background,QBrush(pix))
window.setPalette(palette)
window.show()
sys.exit(app.exec_())
if __name__=='__main__':
main()
sql.py
import pymysql
def do(sql):
db = pymysql.connect(host="localhost", port=3306, user="root", password="123456", \
database="yun", charset="utf8")
cur=db.cursor()
cur.execute(sql)
results =cur.fetchall()
cur.close()
db.commit()
db.close()
return results
(8)资源链接
餐厅菜品管理系统