MySQL数据库课程设计——订餐系统(MySQL数据库+Qt5用户界面+python)

Edmund_Dgw807 2024-06-30 10:35:04 阅读 88

目录

一、系统定义

二、需求分析

三、系统设计

四、详细设计

五、参考文献


一、系统定义

订餐系统是一种基于网络技术的在线点餐平台,旨在为用户提供方便快捷的订餐服务。该系统主要包括用户登录、用户管理、菜单管理、订单管理、支付管理、评价管理等功能模块,用户可以通过系统浏览菜品、下单、支付、评价等操作,商家可以通过系统管理菜品、接收订单、配送等操作。(#系统采用python连接MySQL数据库的形式,前端使用QT Designer等技术,后端使python语言,数据库采用MySQL。)系统具有安全、稳定、高效、易用等特点,可以满足用户对订餐服务的需求。

二、需求分析

系统综合需求

用户需求

易用性:订餐系统的操作应该简单易懂,用户可以快速完成订餐、支付等操作。安全性:用户的个人信息应该得到保护,系统应该采用安全的加密技术,防止用户信息被窃取。多样性:系统应该支持多种支付方式,满足不同用户的需求。反馈机制:用户可以对订餐体验进行评价和反馈,系统应该及时处理用户的反馈意见。商家需求

管理功能:商家可以对菜品、订单、库存等进行管理,方便商家进行经营管理。数据分析功能:系统应该提供数据分析功能,帮助商家了解用户的消费习惯和需求,为商家提供决策依据。营销功能:系统应该提供多种营销功能,如优惠券、满减等,吸引用户进行消费。订单管理:商家可以通过系统对订单进行管理,方便商家进行配送和服务。技术需求

稳定性:系统应该具备高稳定性,能够保证系统的正常运行。安全性:系统应该采用安全的技术手段,保护用户的个人信息和交易安全。扩展性:系统应该具备良好的扩展性,能够满足未来的业务发展需求。兼容性:系统应该具备良好的兼容性,能够适应不同的操作系统和浏览器。系统逻辑模型

1.数据流图:

图1 系统数据流图

2.数据字典

表1 系统数据字典

编号

属性名

类型

解释

备注

1

员工号

varchar(10)

5位数字

2

员工姓名

varchar(10)

3

登陆密码

varchar(100)

8位密码

4

职位

tinyint(1)

0:管理人员 1:员工 2:厨师

5

在职情况

bit(1)

是否在职(0/1)

6

顾客编号

varchar(10)

6位编号

7

顾客姓名

varchar(20)

8

顾客性别

varchar(5)

9

顾客电话

varchar(15)

10

顾客消费金额

decimal

11

菜品编号

bigint(8)

4位编号

12

菜品名称

varchar(30)

13

类别

varchar(6)

14

菜品价格

float

15

库存量

int(5)

16

订单编号

bigint(8)

来自订单表的编号

17

菜品编号

bigint(8)

来自菜单表的编号

18

菜品名称

Varchar(20)

19

菜品数量

int(10)

20

订单编号

bigint(8)

4位编号

21

顾客编号

bigint(8)

来自顾客表的编号

22

消费金额

float

23

折扣金额

float

通过折扣表计算后的金额

24

下单时间

datetime

25

销售编号

bigint(10)

6位编号

26

菜品编号

bigint(8)

来自菜单表的编号

27

销售价格

decimal

28

销售数量

int(5)

29

销售日期

varchar(19)

30

消费金额

float

31

折扣

float

三、系统设计

(一)概念结构设计

图2 E-R图

(二)逻辑结构设计

员工信息表  Employee *

字段名

类型

NULL

其他

备注

e_id

varchar(10)

PK

员工号

e_name

varchar(10)

Index

员工姓名

e_pwd

varchar(100)

Y

登陆密码

e_position

tinyint(1)

职位(ad:管理人员 yg:员工 cs:厨师)

e_state

bit(1)

在职情况

顾客信息表  Tomer *

字段名

类型

NULL

其他

备注

T_id

varchar(10)

PK

顾客编号

T_name

varchar(50)

Index

顾客姓名

T_gender

varchar(10)

顾客性别

T_tel

varchar(20)

顾客电话

T_consume

decimal

顾客消费金额

菜单信息表  Menu *

字段名

类型

NULL

其他

备注

M_id

bigint(8)

PK

菜品编号

M_name

varchar(30)

Index

菜品名称

M_class

varchar(6)

类别

M_price

float

菜品价格

M_qty

int(5)

Index

库存量

点菜记录表  Menus_Oder *

字段名

类型

NULL

其他

备注

O_id

bigint(8)

Index,FK

订单编号

M_id

bigint(8)

Index,FK

菜品编号

M_name

Varchar(20)

菜品名称

M_number

int(10)

菜品数量

订单信息表  Orders *

字段名

类型

NULL

其他

备注

O_id

bigint(8)

PK

订单编号

T_id

bigint(8)

Index,FK

顾客编号

O_price

float

消费金额

O_priceafter

float

折扣金额

O_time

datetime

下单时间

销售记录表  Sell *

字段名

类型

NULL

其他

备注

S_id

bigint(10)

PK

销售编号

M_id

bigint(8)

Index,FK

菜品编号

S_price

decimal

销售价格

S_qty

int(5)

销售数量

S_time

varchar(19)

销售日期

优惠规则表  Discount *

字段名

类型

NULL

其他

备注

D_xfje

float

消费金额

D_zk

float

折扣

(三)子模块划分及功能概述

图4 系统功能划分

系统设置两种权限:用户和店内人员(店内人员又划分为员工、厨师和管理人员)。登陆后,可以进入不同的功能模块,在登陆界面可以修改登陆密码。子模块划分如下:

        1.用户登录

用户登录界面拥有登录、注册功能,用户登录后便可进入菜单页面进行

线上订餐,菜品选择完并进行结账后便可进行订单的查看。

图5 用户登录、点餐流程

        2.店员登录

店内人员登录,分为厨师,员工和管理人员,需输入相应账号和密码,管理人员账户只有唯一一个。

图6 店员登录流程

        3.厨师操作

厨师操作界面可接受订单并查看订餐菜品和菜谱来进行制作,菜品制作完后可更新完成状态,将信息传送给员工并提醒上菜。

图7 厨师操作流程

        4.查询修改菜单(需要权限:管理人员)

管理人员拥有对菜单查询和修改的权限,进入管理人员界面后即可对该功能进行操作。

图8 查询修改菜单流程

        5.查询订单信息(需要权限:管理人员)

管理人员拥有对订单进行查询的权限。

图9 查询流程

        6.管理人员变动(需要权限:管理人员)

管理人员拥有对店员变动和信息修改的权限。

图10 管理人员变动流程

        7.修改优惠规则(需要权限:管理人员)

管理人员拥有对优惠规则进行修改的功能。先对优惠规则表进行查询,再对表中信息进行修改。

图11 修改优惠规则流程

        8.查询销售记录(需要权限:管理人员)

管理人员拥有对销售记录查询的权限。

图12 查询销售记录流程

        9.管理顾客信息(需要权限:管理人员)

管理人员拥有对顾客信息进行查询和修改的权限。

图13 管理顾客信息流程

        其他附加功能:

        修改密码,重新登陆

        订单的生成与查询

        各种形式的查询

        公告的显示与编辑

        折扣信息公告自动读入

四、详细设计

(一) 开发平台及工具

开发工具: PythonDBMS:MySQL Server建模工具: Qt Designer第三方库: PyMySQL, PyQT5

说明:为了在Windows平台上更好地进行数据处理和管理,选择了适中的MySQL Server作为数据库管理系统。同时,为了提升Python做界面的体验,采用了Qt Designer进行可视化的快速开发和设计。在开发过程中,使用PyMySQL和PyQt5等第三方库,加快了开发进程。

(二) 存储过程

作为数据库应用系统,数据的一致性需要得到保证,通过单纯的手工编码方式,工作烦琐,容易出错,而且不易于扩展。采用DBMS的外码约束,Unique约束,DEFAUT默认值和AUTO_INCREMENT自增来解决这一问题。

在查询效率方面,连接查询的过程用存储过程实现。

对菜单、订单、订单详情的外码没有强制级联删除和级联修改。

查询公告信息的存储过程

def get_notice(self):

    db = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='123456', db='osystem')

    cursor = db.cursor()

    sql = "SELECT notice_content FROM notice"

    cursor.execute(sql)

    result = cursor.fetchone()

    db.close()

    if result:  # 如果结果不为空

        notice_text = result[0]  # 获取公告内容

        discounts = self.get_discounts()  # 获取折扣信息

        notice_with_discounts = f"{notice_text}\n\n折扣信息:\n{discounts}"  # 将折扣信息添加到公告内容中

        return notice_with_discounts

    else:

        return ""

查询订单信息的存储过程

def refresh_order(self):

    global userid_now

    model = QStandardItemModel()

    db = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='123456', db='osystem')

    cursor = db.cursor()

    customer_id = userid_now

    sql = f"select * from orders where customer_id='{customer_id}'"

    cursor.execute(sql)

    result = cursor.fetchall()

    for row in result:

        qrow = []

        for item in row:

            qrow.append(QStandardItem(str(item)))

查询菜单信息的存储过程

def refresh_menu(self):

    model = QStandardItemModel()

    db = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='123456', db='osystem')

    cursor = db.cursor()

    sql = "SELECT * FROM menu"

    cursor.execute(sql)

    result = cursor.fetchall()

    for row in result:

        qrow = []

        for item in row:

            qrow.append(QStandardItem(str(item)))

        model.appendRow(qrow)

    model.setHorizontalHeaderLabels(["菜品编号", "菜品名称", "类别", "菜价", "库存量"])

    self.ui.tableView_3.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)

    self.ui.tableView_3.setModel(model)

    db.close()

查询顾客信息的存储过程

def refresh_customers(self):

    model = QStandardItemModel()

    db = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='123456', db='osystem')

    cursor = db.cursor()

    sql = "SELECT * FROM gk_personal_info"

    cursor.execute(sql)

    result = cursor.fetchall()

    for row in result:

        qrow = []

        for item in row:

            qrow.append(QStandardItem(str(item)))

        # 添加一个按钮

        qrow.append(QStandardItem('修改密码'))

        model.appendRow(qrow)

    model.setHorizontalHeaderLabels(['ID', '账户', '姓名', '性别', '电话', ''])

    self.ui.tableView_2.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)

    self.ui.tableView_2.setModel(model)

    db.close()

查询折扣信息的存储过程

def load_discounts(self):

    db = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='123456', db='osystem')

    cursor = db.cursor()

    sql = "SELECT * FROM discount"

    cursor.execute(sql)

    result = cursor.fetchall()

    self.ui.tableWidget.setRowCount(len(result))

    for row_idx, (amount, discount) in enumerate(result):

        amount_item = QtWidgets.QTableWidgetItem(str(amount))

        discount_item = QtWidgets.QTableWidgetItem(str(discount))

        amount_item.setTextAlignment(Qt.AlignCenter)

        discount_item.setTextAlignment(Qt.AlignCenter)

        self.ui.tableWidget.setItem(row_idx, 0, amount_item)

        self.ui.tableWidget.setItem(row_idx, 1, discount_item)

    db.close()

(三)编码设计

系统采用pycharm应用程序以方便开发,pycharm对常用API做了很好的封装。每个对话框对应一个类,每个数据库表对应一个类。根据程序需要,自己再一次做了封装。

运用qtDesighner程序对界面进行设计在使用qt工具将ui文件转换为py文件,在一个主体函数中实现对各个界面的连接。

1. 连接数据库格式

db = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='123456', db='osystem')

cursor = db.cursor()

sql = "SELECT * FROM discount"

cursor.execute(sql)

result = cursor.fetchall()

db.close()

2. main文件中包含三个大类,LoginWindow类、GKMainWindow类和AdMainWindow类,每个类即是一个界面,其中包含界面中所需要的各种功能的实现。

3. 在需要的地方采用多线程。

        菜品出售后库存量自动更新

        后台监控菜品库存

        选择菜品时根据菜品数量、种类进行实时的总价和折扣价的计算与显示

(四) 界面设计

登陆界面:

顾客订餐主界面:

管理员主界面:

五、参考文献

1. 《Python灵活可扩展的架构》[中] 吴浩麟 著,电子工业出版社

2. 《数据库系统概论(第三版)》 萨师煊等 高等教育出版社

3. 《基于Qt的GUI开发》 刘均 著,机械工业出版社

4. 《Python GUI编程教程》(第二版) [荷] Boudewijn Rempt著,刘红艳等译,人民邮电出版社

5. 《MySQL必知必会》[美] Ben Forta著,刘洋等译,人民邮电出版社

演示视频:MySQL数据库课设——订餐系统演示视频(Python+Qt5)_哔哩哔哩_bilibili



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。