文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

基于python+mysql超市信息管理系统(附完整源代码)

2023-09-28 14:59

关注

(参考的是这篇文章(5条消息) 数据库课程设计—超市零售信息管理系统(Python实现)_小桃在改bug的博客-CSDN博客_超市管理系统数据库设计但是这篇文章里没有完整的代码,所以我自己补全了ui界面和相关的代码,并进行了二创,框架也有改动,更主要的是写出来自己在编写过程中的一些错误,希望可以帮助排雷)

先放几张效果图

登录界面:

e5fa4e9d21844bc4b3bcdec126c18898.png

 

主界面:

99bcb2e818964225801d8e4ecc744f2c.png

 

添加信息界面:

 

 518abc6b0eba4452bbc62589d946b7ea.png

添加员工信息界面:

92fb0323b3b84e09a49d20a365dbe7c6.png

 

输入一个示例数据并添加:

 

5b5cde8fc1c94f019f53dcf5a3ff8cda.png

首先进行需求分析,想要做的是一个商城的信息管理系统(是一个类似大型的超市),可以帮助管理进货、销售、人员、库存信息,那么就要有进货,售货,员工,仓库,安全问题等方面的考虑,根据上述分析出下面的框架(由于空间有限,这是部分的框架图)

12f5d2308f7742de9f6b6ec0ff72b7ea.png

 

 

根据上面的分析绘制ER图,由于每次绘制时图形数量的限制,E-R图分三部分,通过带颜色的连接两个ER图

13036135ccad4de38d3473b51b0954db.png

4cb8e78e5bef4d87bdc69bd6cb4b504b.png

855158e959b54e848214c7442167d12a.png 根据上面的ER图进行逻辑结构设计消除依赖:

 

 

 

1.员工(员工编号,员工姓名,员工性别,员工年龄,员工工龄,员工电话,身份证号,工资,核酸情况);

2.商品(商品编号,商品名称,商品类别,商品单价,商品成本,供货商);

3.会员(会员卡卡号,会员姓名,电话,注册日期,累计金额,余额);

4.供货商(供货商编号,供货商名称,供货商电话,供货商地址);

5.仓库(仓库编号,仓库管理员编号,仓库名称,仓库地址);

6.退货信息(交易流水号,商品编号,退货数量,退款金额,退货日期);

7.销售(员工编号,商品编号,销售日期,销售数量,销售金额);

8.购买(会员卡卡号,商品编号,购买日期,购买数量);

9.供货(供货商编号,商品编号,供货日期,供货数量);

10.库存(仓库编号,商品编号,库存量);

11.安全问题(健康码,灭火器,自动灭火喷淋装置,检察人员编号);

形成如下表:

员工表Staff

属性名

含义

类型

说明

Snum

员工编号

varchar

主键

Sname

员工姓名

varchar

 

Ssex

员工性别

varchar

‘男’或‘女’

Sage

员工年龄

int

>=18

Sseniority

员工工龄

int

>=0

Sphone

员工电话

varchar

 

Sid

身份证号

varchar

 

Ssalary

工资

int

>=0

Syard

健康码

varchar

‘红码’‘绿码’‘黄码’

 

商品表Goods

属性名

含义

类型

说明

Gnum

商品编号

varchar

主键

Gname

商品名称

varchar

 

Gtype

商品类别

varchar

 

Gprice

商品售价

int

>=0

Gbid

商品进价

int

>=0

Gstock

库存量

int

>=0

Galarm

告警量

int

>=0

Gplan

计划库存量

int

>=0

Vnum

供货商编号

varchar

是表Vecdor的外键

 

会员表Member

属性名

含义

类型

说明

Mnum

会员卡号

varchar

主键

Mname

会员姓名

varchar

 

Mphone

会员电话

varchar

 

Mdate

注册日期

datetime

 

Mtotal

累计金额

int

>=0

Mbalance

卡内余额

int

>=0

Mpassword

会员密码

varchar

 

 

供货商Vendor

属性名

含义

类型

说明

Vnum

供货商编号

varchar

主键

Vname

供货商名称

varchar

 

Vphone

供货商电话

varchar

 

Vplace

供货商地址

varchar

 

仓库Ware

属性名

含义

类型

说明

Wnum

仓库编号

varchar

主键

Wname

仓库名称

varchar

 

Wplace

仓库地址

varchar

 

Snum

仓库管理员编号

varchar

是表Staff的外键

 

退货信息Infer

属性名

含义

类型

说明

Tnum

交易流水号

varchar

是表Trade的外键

Gnum

商品编号

varchar

是表Goods的外键

Iamount

退货数量

int

>=0

Imoney

退款金额

int

>=0

Idate

退货日期

datetime

 

 

商品交易表Trade

属性名

含义

类型

说明

Tnum

交易流水号

varchar

主键

Tdate

交易日期

datetime

 

Snum

员工编号

varchar

是表Staff的外键

Gnum

商品编号

varchar

是表Goods的外键

Tamount

交易数量

int

>=0

Tmoney

交易金额

int

>=0

Mnum

会员卡号

varchar

是表Member的外键

 

入库信息表Entry

属性名

含义

类型

说明

Enum

入库单编号

varchar

主键

Gnum

商品编号

varchar

是表Goods的外键

Eamount

入库量

int

>=0

Emoney

总金额

int

>=0

Vnum

供货商编号

varchar

是表Ventor的外键

Edate

入库日期

datetime

 

Snum

入库员编号

varchar

是表Staff的外键

 

出库信息表Exits

属性名

含义

类型

说明

Xnum

出库单编号

varchar

主键

Gnum

商品编号

varchar

是表Goods的外键

Xamount

出库量

int

>=0

Xmoney

总金额

int

>=0

Xdate

出库日期

datetime

 

Snum

出库员编号

varchar

是表Staff的外键

 

安全问题Check1

属性名

含义

类型

说明

Cdate

检查日期

date

主键

Cyard

顾客健康码

varchar

‘红码’‘绿码’‘黄码’

Cfire

灭火器

varchar

‘是’‘否’

Cspary

自动灭火喷洒装置

varchar

‘是’‘否’

下面附上我使用的版本python3.6+mysql8.0

需要手动在mysql 里创建一个数据库 sqlwork(什么名称都可以)

执行init.py进行初始化操作,也就是建表,插入初始数据,建立触发器,增加级联约束(之所以是这个顺序,是因为如果建表的时候就加入级联约束,外键约束就会导致插入数据失败)下面是init.py的代码

import pymysql#数据库初始化#创建表connect = pymysql.connect(host="localhost", user="root",password="mysql", database="sqlwork")  # 建立连接if connect:    print("连接成功!")cursor = connect.cursor()   # 创建一个游标对象,python里的sql语句都要通过cursor来执行#创建表及其约束cursor.execute("create table Staff(Snum  varchar(10) primary key,Sname varchar(20) not null,Ssex varchar(5) check(Ssex in('男','女')),Sage int not null check(Sage>=18),Sseniority int not null check(Sseniority>=0),Sphone varchar(20) not null,Sid varchar(25) not null,Ssalary int check(Ssalary>=0),Syard varchar(20) check(Syard in('红码','黄码','绿码')) )")cursor.execute("create table Vendor(Vnum varchar(10) primary key,Vname varchar(10) not null,Vphone varchar(20) not null,Vpalce varchar(10) not null)")#  on delete cascadecursor.execute("create table Goods(Gnum varchar(10) primary key,Gname varchar(10) not null,Gtype varchar(10) not null,Gprice int check(Gprice>=0),Gbid int check(Gbid>=0),Gstock int check(Gstock>=0),Galarm int check(Galarm>=0), Gplan int check(Gplan>=0),Vnum varchar(10) not null)")cursor.execute("create table Member(Mnum varchar(10) primary key,Mname varchar(10) not null,Mphone varchar(20) not null,Mdate datetime,Mtotal int check(Mtotal>=0),Mbalance int check(Mbalance>=0),Mpassword varchar(25) not null)")# on delete set nullcursor.execute("create table Ware(Wnum varchar(10) primary key,Wname varchar(10) not null,Wplace varchar(10) not null,Snum varchar(10) not null)")cursor.execute("create table Trade(Tnum varchar(10) primary key,Tdate datetime  not null,Snum varchar(10) not null,Gnum varchar(10) not null,Tamount int check(Tamount>=0),Tmoney int check(Tmoney>=0),Mnum varchar(10) not null)")cursor.execute("create table Infer(Tnum varchar(10) not null,Gnum varchar(10) not null,Iamount int check(Iamount>=0),Imoney int check(Imoney>=0),Idate datetime not null)")# on delete cascadecursor.execute("create table Entry(Enum varchar(10) primary key,Gnum varchar(10) not null,Eamount int check(Eamount>=0),Emoney int check(Emoney>=0),Vnum varchar(10) not null,Edate datetime not null,Snum varchar(10) not null)")cursor.execute("create table Exits(Xnum varchar(10) primary key,Gnum varchar(10) not null,Xamount int check(Xamount>=0),Xmoney int check(Xmoney>=0),Xdate datetime not null,Snum varchar(10) not null)")cursor.execute("create table Check1(Cdate date primary key,Cyard varchar(10) check(Cyard in('红码','黄码','绿码')),Cfire varchar(10) check(Cfire in('是','否')),Cspary varchar(10) check(Cspary in('是','否')))")connect.commit()  #提交cursor.close()  # 关闭游标connect.close()#初始化数据(两条数据或一条数据,为了后续增加约束)connect = pymysql.connect(host="localhost", user="root",password="mysql", database="sqlwork")  # 建立连接cursor = connect.cursor()  # 创建一个游标对象,python里的sql语句都要通过cursor来执行cursor.execute("insert into Goods values ('200001','薯片','零食',8,5,500,100,600,'100002')")cursor.execute("insert into Goods values ('200002','可乐','饮料',3,2,1000,100,1200,'100001')")cursor.execute("insert into Vendor values ('100001','可口','123456','杭州')")cursor.execute("insert into Vendor values ('100002','乐事','135790','西安')")cursor.execute("insert into Vendor values ('100003','牧场','246800','武汉')")cursor.execute("insert into Staff values ('0001','张三','男',30,5,'139820117','411481320301',5000,'绿码')")cursor.execute("insert into Staff values ('0002','熊大','女',32,3,'178883132','411481310302',3000,'绿码')")cursor.execute("insert into Member values ('300001','迪迦','179320118',20220830194422,1050,300,'321336')")cursor.execute("insert into Ware values('400001','一号','上海','0001')")cursor.execute("insert into Check1 values(20220620,'绿码','是','是')")connect.commit()  # 提交cursor.close()connect.close()#创建触发器 满足顾客买商品的一个场景connect = pymysql.connect(host="localhost", user="root",password="mysql", database="sqlwork")  # 建立连接# 创建光标cursor = connect.cursor()#购买的商品数量要在库存里减去cursor.execute("create trigger update_Goods before insert on Trade for each row update Goods set Gstock=Gstock-new.Tamount where Gnum=new.Gnum;")#要在会员卡的总消费和余额里改变相应的数值cursor.execute("create trigger update_Member before insert on Trade for each row update Member set Mtotal=Mtotal+new.Tmoney,Mbalance=Mbalance-new.Tmoney where Mnum=new.Mnum;")connect.commit()cursor.close()connect.close()connect = pymysql.connect(host="localhost", user="root",password="mysql", database="sqlwork")  # 建立连接cursor = connect.cursor()cursor.execute("alter table Goods add foreign key(Vnum) references Vendor(Vnum) on delete cascade")cursor.execute("alter table Ware add foreign key(Snum) references Staff(Snum)")cursor.execute("alter table Trade add foreign key(Snum) references Staff(Snum)")cursor.execute("alter table Trade add foreign key(Gnum) references Goods(Gnum)")cursor.execute("alter table Trade add foreign key(Mnum) references Member(Mnum)")cursor.execute("alter table Infer add foreign key(Tnum) references Trade(Tnum)")cursor.execute("alter table Infer add foreign key(Gnum) references Goods(Gnum)")cursor.execute("alter table Entry add foreign key(Snum) references Staff(Snum)")cursor.execute("alter table Entry add foreign key(Gnum) references Goods(Gnum)")cursor.execute("alter table Entry add foreign key(Vnum) references Vendor(Vnum)")cursor.execute("alter table Exits add foreign key(Snum) references Staff(Snum)")cursor.execute("alter table Exits add foreign key(Gnum) references Goods(Gnum)")connect.commit()# 关闭数据库连接,防止泄露connect.close()

接下来是主体部分(ui界面,sql查询)main.py代码如下(代码有1700行左右)

使用的是pymysql库实现数据库的连接以及相关sql语句执行操作

Tkinter库是用来实现ui界面,PIL库是用来放置图片背景使用

总体框架如下:

  1. 登录界面      login()
  2. 主界面(增删改查)    mainpage()
  3. 选择界面(对哪个表进行增删改查的界面,4个)    如all_add()
  4. 对某个表进行操作的界面(40个左右,因为有10个表,每个表几乎都要增删改查)    如Staff_add()
  5. 40个具体的sql语句执行的函数    如add_Staff()
import tkinter as tkimport tkinter.messageboxfrom tkinter import *import pymysqlfrom PIL import Image, ImageTk#增删改查之后进去每个都可以对员工信息 商品信息 安全信息 仓库信息 供货信息 退货信息 会员信息进行操作#################################################################################################################数据库添加操作def add_Goods():    # 连接数据库    connect = pymysql.connect(host="localhost", user="root",password="mysql", database="sqlwork")  # 建立连接    # 创建光标    cursor = connect.cursor()    # 编写SQL语句    sql = "insert into Goods(Gnum,Gname,Gtype,Gprice,Gbid,Gstock,Galarm,Gplan,Vnum) values(%s,%s,%s,%s,%s,%s,%s,%s,%s)"    # 执行SQL语句,并且输出完成提示信息,否则回滚    try:        cursor.execute(sql,(g1.get(), g2.get(), g3.get(), g4.get(), g5.get(), g6.get(), g7.get(), g8.get(), g9.get()))        connect.commit()        tkinter.messagebox.showinfo("提示", "数据添加成功")    except:        connect.rollback()    # 关闭数据库连接,防止泄露    connect.close()def add_Staff():    # 连接数据库    connect = pymysql.connect(host="localhost", user="root",password="mysql", database="sqlwork")  # 建立连接    # 创建光标    cursor = connect.cursor()    # 编写SQL语句    sql = "insert into Staff(Snum,Sname,Ssex,Sage,Sseniority,Sphone,Sid,Ssalary,Syard) values(%s,%s,%s,%s,%s,%s,%s,%s,%s)"    # 执行SQL语句,并且输出完成提示信息,否则回滚    try:        cursor.execute(sql,(s1.get(), s2.get(), s3.get(), s4.get(), s5.get(), s6.get(), s7.get(), s8.get(), s9.get()))        connect.commit()        tkinter.messagebox.showinfo("提示", "数据添加成功")    except:        connect.rollback()    # 关闭数据库连接,防止泄露    connect.close()def add_Check1():    # 连接数据库    connect = pymysql.connect(host="localhost", user="root", password="mysql", database="sqlwork")  # 建立连接    # 创建光标    cursor = connect.cursor()    # 编写SQL语句    sql = "insert into Check(Cdate,Cyard,Cfire,Cspary) values(%s,%s,%s,%s)"    # 执行SQL语句,并且输出完成提示信息,否则回滚    try:        cursor.execute(sql, (c1.get(), c2.get(), c3.get(), c4.get()))        connect.commit()        tkinter.messagebox.showinfo("提示", "数据添加成功")    except:        connect.rollback()    # 关闭数据库连接,防止泄露    connect.close()def add_Ware():    # 连接数据库    connect = pymysql.connect(host="localhost", user="root", password="mysql", database="sqlwork")  # 建立连接    # 创建光标    cursor = connect.cursor()    # 编写SQL语句    sql = "insert into Ware(Wnum,Wname,Wplace,Snum) values(%s,%s,%s,%s)"    # 执行SQL语句,并且输出完成提示信息,否则回滚    try:        cursor.execute(sql, (w1.get(), w2.get(), w3.get(), w4.get()))        connect.commit()        tkinter.messagebox.showinfo("提示", "数据添加成功")    except:        connect.rollback()    # 关闭数据库连接,防止泄露    connect.close()def add_Vendor():    # 连接数据库    connect = pymysql.connect(host="localhost", user="root", password="mysql", database="sqlwork")  # 建立连接    # 创建光标    cursor = connect.cursor()    # 编写SQL语句    sql = "insert into Vendor(Vnum,Vname,Vphone,Vplace) values(%s,%s,%s,%s)"    # 执行SQL语句,并且输出完成提示信息,否则回滚    try:        cursor.execute(sql, (v1.get(), v2.get(), v3.get(), v4.get()))        connect.commit()        tkinter.messagebox.showinfo("提示", "数据添加成功")    except:        connect.rollback()    # 关闭数据库连接,防止泄露    connect.close()def add_Infer():    # 连接数据库    connect = pymysql.connect(host="localhost", user="root", password="mysql", database="sqlwork")  # 建立连接    # 创建光标    cursor = connect.cursor()    # 编写SQL语句    sql = "insert into Infer(Tnum,Gnum,Iamount,Imoney,Idate) values(%s,%s,%s,%s,%s)"    # 执行SQL语句,并且输出完成提示信息,否则回滚    try:        cursor.execute(sql, (i1.get(), i2.get(), i3.get(), i4.get(), i5.get()))        connect.commit()        tkinter.messagebox.showinfo("提示", "数据添加成功")    except:        connect.rollback()    # 关闭数据库连接,防止泄露    connect.close()def add_Member():    # 连接数据库    connect = pymysql.connect(host="localhost", user="root", password="mysql", database="sqlwork")  # 建立连接    # 创建光标    cursor = connect.cursor()    # 编写SQL语句    sql = "insert into Member(Mnum,Mname,Mphone,Mdate,Mtotal,Mbalance,Mpassword) values(%s,%s,%s,%s,%s,%s,%s)"    # 执行SQL语句,并且输出完成提示信息,否则回滚    try:        cursor.execute(sql, (m1.get(), m2.get(), m3.get(), m4.get(), m5.get(),m6.get(),m7.get()))        connect.commit()        tkinter.messagebox.showinfo("提示", "数据添加成功")    except:        connect.rollback()    # 关闭数据库连接,防止泄露    connect.close()def add_Trade():    # 连接数据库    connect = pymysql.connect(host="localhost", user="root", password="mysql", database="sqlwork")  # 建立连接    # 创建光标    cursor = connect.cursor()    # 编写SQL语句    sql = "insert into Trade(Tnum,Tdate,Snum,Gnum,Tamount,Tmoney,Mnum) values(%s,%s,%s,%s,%s,%s,%s)"    # 执行SQL语句,并且输出完成提示信息,否则回滚    try:        cursor.execute(sql, (t1.get(), t2.get(), t3.get(), t4.get(), t5.get(),t6.get(),t7.get()))        connect.commit()        tkinter.messagebox.showinfo("提示", "数据添加成功")        sql = "select Gstock from Goods where Gnum=%s"        cursor.execute(sql, (t4.get()))        result1=cursor.fetchall()        sql = "select Galarm from Goods where Gnum=%s"        cursor.execute(sql, (t4.get()))        result2 = cursor.fetchall()        if(result1

 

PS:想要源代码以及源文件的私信我,给出你的邮箱地址,最近比较忙,如果没有发你再提醒我一下

 

 

 

 

 

来源地址:https://blog.csdn.net/qq_56864896/article/details/128400236

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯