数据库课程设计—超市零售信息管理系统(Python实现)

数据库课程设计

超市零售信息管理系统(Python实现)SQLServer


前言

(一)设计目的

学生根据所学的数据库系统原理与程序设计的知识,能够针对一个数据库管理信息系统,进行系统的需求分析,系统设计,数据库设计,编码,测试等,完成题目要求的功能,从而达到掌握开发一个小型数据库管理信息系统的目的。

(二)设计内容

题目可根据自己熟悉的事物填充和适当变更,例如:校园招聘系统、学生科技成果统计系统等,但不建议图书管理信息系统、学生信息管理系统、酒店管理系统、药品进销存系统,也可以是基于Web的网站或基于移动平台的手机APP、游戏软件等,鼓励创新!要求实现数据的录入、删除、修改、查询等基本功能,提供实体完整性、参照完整性、用户定义完整性等检查,可根据自己对不同事物主要的管理需求进行扩充,例如增加登录、报表等相应功能。

一、需求分析

(一)设计概念

该超市零售管理信息系统旨在为超市的会员管理工作提供一个比较系统的零售管理平台,它帮助超市存储及管理进货、销售、库存以及人员信息,是一套管理工具、极大提高超市管理的效率。很大程度上帮助了超市管理者对超市的掌握与管理。

(二)功能说明

1. 进货管理

根据销售情况及库存情况,自动制定进货计划(亦可手工制定修改),可以避免盲目进货造成商品积压。 按计划单有选择性地进行自动入库登记。 综合查询打印计划进货与入库记录及金额。

2. 销售管理

商品正常销售、促销与限量、限期及禁止销售控制。 综合查询各种销售明细记录、各地收银员收银记录以及交结帐情况等。 按多种方式统计生成销售排行榜,灵活察看和打印商品销售日、月、年报表。

3. 库存管理

综合查询库存明细记录。 库存状态自动告警提示。如库存过剩、少货、缺货等。软件为您预警,避免库存商品积压损失和缺货。

4.人员管理

员工、会员、供货商、厂商等基本信息登记管理。 员工操作权限管理。 客户销售权限管理。

(三)功能模块图

在这里插入图片描述

二、概念结构设计

在这里插入图片描述

三、逻辑结构设计

1.员工(员工编号,员工姓名,员工性别,员工年龄,工龄,电话,身份证号,所属部门,工资);
2.商品(商品编号,商品名称,商品类别,商品单价,商品成本,供货商);
3.会员(会员卡卡号,会员姓名,电话,注册日期,累计金额,当前余额);
4.供货商(供货商编号,供货商名称,供货商电话,供货商地址);
5.仓库(仓库编号,仓库名称,仓库地址);
6.退货信息(交易流水号,商品编号,退货数量,退款金额,退货日期);
7.销售(员工编号,商品编号,销售日期,销售数量);
8.购买(会员卡卡号,商品编号,购买日期,购买数量);
9.供货(供货商编号,商品编号,供货日期,供货数量);
10.库存(仓库编号,商品编号,库存量);

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、代码实现

(一)实现Python 连接 SQL Severe 数据库

import pymssql  #引入pymssql模块

def conn():
    connect = pymssql.connect(host = "127.0.0.1:1433",database = "Manager",charset="utf8")  
    if connect:
        print("连接成功!")
    return connect

if __name__ == '__main__':
    conn = conn()

假如与数据库连接成功,则以上代码块运行会出现如下结果:
在这里插入图片描述
这里简单介绍下pymssal模块:
pymssql是python用来连接Microsoft SQL Server的一个工具库(package)。
和数据库登录一样,分为用户验证登录和windows身份认证登陆,而以上代码中,我采用的是后者,因此不需要账号密码,其核心代码为:

conn = pymssql.connect(host='host',database='db_name',user='user',password='pwd',charset='utf8')
#host为数据库的IP地址,,通过自己电脑进行查询
#database为数据库的名称
#charset表示在此程序中,字符编码采用“utf8编码”模式

(二)创建数据库表

数据库中表的创建可以直接在SQLServer中手动建表,也可以通过Python程序进行建表,其语法规则和SQL一样,代码如下:

import pymssql

connect = pymssql.connect(host = "127.0.0.1:1433",database = "Manager",charset="utf8")  # 建立连接
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),Sstand int not null check(Sstand>=0),Sphone varchar(20) not null,Sid varchar(25) not null,Spart varchar(10) not null,Ssalary money check(Ssalary>=0))")
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)")
cursor.execute("create table Goods(Gnum varchar(10) primary key,Gname varchar(10) not null,Gtype varchar(10) not null,Gprice money check(Gprice>=0),Gbid money check(Gbid>=0),Gstock int check(Gstock>=0),Galarm int check(Galarm>=0), Gplan int check(Gplan>=0),Vnum varchar(10) not null,foreign key(Vnum) references Vendor(Vnum))")
cursor.execute("create table Menber(Mnum varchar(10) primary key,Mname varchar(10) not null,Mphone varchar(20) not null,Mdate datetime,Mtotal money check(Mtotal>=0),Mbalance money check(Mbalance>=0),Mcip varchar(25) not null)")
cursor.execute("create table Ware(Wnum varchar(10) primary key,Wname varchar(10) not null,Wplace 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 money check(Tmoney>=0),Mnum varchar(10) not null,foreign key(Snum) references Staff(Snum),foreign key(Gnum) references Goods(Gnum),foreign key(Mnum) references Menber(Mnum))")
cursor.execute("create table Infor(Tnum varchar(10) not null,Gnum varchar(10) not null,Iamount int check(Iamount>=0),Imoney money check(Imoney>=0),Idate datetime not null,foreign key(Tnum) references Trade(Tnum),foreign key(Gnum) references Goods(Gnum))")
cursor.execute("create table Entry(Enum varchar(10) primary key,Gnum varchar(10) not null,Eamount int check(Eamount>=0),Emoney money check(Emoney>=0),Vnum varchar(10) not null,Edate datetime not null,Snum varchar(10) not null,foreign key(Snum) references Staff(Snum),foreign key(Gnum) references Goods(Gnum),foreign key(Vnum) references Vendor(Vnum))")
cursor.execute("create table Exits(Xnum varchar(10) primary key,Gnum varchar(10) not null,Xamount int check(Xamount>=0),Xmoney money check(Xmoney>=0),Xdate datetime not null,Snum varchar(10) not null,foreign key(Snum) references Staff(Snum),foreign key(Gnum) references Goods(Gnum))")
connect.commit()  #提交
cursor.close()  # 关闭游标
connect.close()  # 关闭连接

(三)插入数据

在Goods表中批量插入数据:

import pymssql

connect = pymssql.connect(host = "127.0.0.1:1433",database = "Manager",charset="utf8")
if connect:
    print("连接成功!")

cursor = connect.cursor()  # 创建一个游标对象,python里的sql语句都要通过cursor来执行
sql = "insert into Goods(Gnum,Gname,Gtype,Gprice,Gbid,Gstock,Galarm,Gplan,Vnum) values ('200001','薯片','零食',8,5,500,100,600,'100002')"
sql = "insert into Goods(Gnum,Gname,Gtype,Gprice,Gbid,Gstock,Galarm,Gplan,Vnum) values ('200002','可乐','饮料',4,2,1000,200,1500,'100001')"
sql = "insert into Goods(Gnum,Gname,Gtype,Gprice,Gbid,Gstock,Galarm,Gplan,Vnum) values ('200003','猪肉','肉类',32,20,400,50,500,'100003')"
cursor.execute(sql)
connect.commit()  # 提交
cursor.close()
connect.close()

在Vendor表中批量插入数据:

import pymssql

connect = pymssql.connect(host = "127.0.0.1:1433",database = "Manager",charset="utf8")
if connect:
    print("连接成功!")

cursor = connect.cursor()  # 创建一个游标对象,python里的sql语句都要通过cursor来执行
sql = "insert into Vendor(Vnum,Vname,Vphone,Vpalce) values ('100001','number1','12698577456','浙江')"
sql = "insert into Vendor(Vnum,Vname,Vphone,Vpalce) values ('100002','number2','72798567498','湖北')"
sql = "insert into Vendor(Vnum,Vname,Vphone,Vpalce) values ('100003','number3','69795867463','广州')"
cursor.execute(sql)
connect.commit()  # 提交
cursor.close()
connect.close()

(四)创建界面按钮,并实现数据库的“增删改查”

import pymssql
import tkinter as tk
import tkinter.messagebox

#数据库添加操作
def add():
    # 连接数据库
    connect = pymssql.connect(host = "127.0.0.1:1433",database = "Manager",charset="utf8")
    # 创建光标
    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)" % (v1.get(), v2.get(), v3.get(), v4.get(), v5.get(), v6.get(), v7.get(), v8.get(), v9.get())
    # 执行SQL语句,并且输出完成提示信息,否则回滚
    try:
        cursor.execute(sql)
        connect.commit()
        tkinter.messagebox.showinfo("提示", "数据添加成功")
    except:
        connect.rollback()
    # 关闭数据库连接,防止泄露
    connect.close()

#数据库删除操作
def delete():
    connect = pymssql.connect(host = "127.0.0.1:1433",database = "Manager",charset="utf8")
    cursor=connect.cursor()
    sql = "delete from Goods where Gnum='%s'" % (v10.get())
    try:
        cursor.execute(sql)
        connect.commit()
        tkinter.messagebox.showinfo("提示","数据删除成功")
    except:
        connect.rollback()
    connect.close()

#数据库更新操作
def update():
    connect = pymssql.connect(host = "127.0.0.1:1433",database = "Manager",charset="utf8")
    cursor = connect.cursor()
    sql="update Goods set Gstock='%s' where Gnum='%s'"%(v11.get(),v12.get())
    try:
        cursor.execute(sql)
        connect.commit()
        tkinter.messagebox.showinfo("提示","数据更新成功!")
    except:
        connect.rollback()
    connect.close()

#数据库模糊条件查询
def select():
    connect = pymssql.connect(host = "127.0.0.1:1433",database = "Manager",charset="utf8")
    cursor = connect.cursor()
    sql = "select Vname from Vendor,Goods where Goods.Vnum=Vendor.Vnum and Goods.Gnum like'%s'"%('%'+v13.get()+'%')
    try:
        cursor.execute(sql)
        results = cursor.fetchall()
        for row in results:
            Vname = row[0]
            tkinter.messagebox.showinfo("提示","Vname=%s" % (Vname))
    except:
        return

#添加商品界面
def Staff_add():
    #构建全集变量,方便上面的函数调用
    global window_function
    global v1,v2,v3,v4,v5,v6,v7,v8,v9
    #生成窗口
    window_function=tk.Tk()
    #窗口标题
    window_function.title("超市零售信息管理系统")
    #窗口大小
    window_function.geometry('400x700')
    #生成标签
    tk.Label(window_function, text="添加新商品", font=("黑体", 20)).grid(row=0,column=1,pady=10)
    tk.Label(window_function, text="请输入商品编号:").grid(row=1, column=0, padx=20, pady=20)
    tk.Label(window_function,text="请输入商品名称:").grid(row = 2,column =0,padx=20,pady=20)
    tk.Label(window_function,text="请输入商品类别:").grid(row = 3,column =0,padx=20,pady=20)
    tk.Label(window_function,text="请输入商品售价:").grid(row = 4,column =0,padx=20,pady=20)
    tk.Label(window_function, text="请输入商品成本:").grid(row=5, column=0, padx=20, pady=20)
    tk.Label(window_function, text="请输入库存量:").grid(row=6, column=0, padx=20, pady=20)
    tk.Label(window_function, text="请输入告警量:").grid(row=7, column=0, padx=20, pady=20)
    tk.Label(window_function, text="请输入计划库存量:").grid(row=8, column=0, padx=20, pady=20)
    tk.Label(window_function, text="请输入供货商编号:").grid(row=9, column=0, padx=20, pady=20)
    #定义变量记录输入信息
    v1 = tk.StringVar()
    v2 = tk.StringVar()
    v3 = tk.StringVar()
    v4 = tk.StringVar()
    v5 = tk.StringVar()
    v6 = tk.StringVar()
    v7 = tk.StringVar()
    v8 = tk.StringVar()
    v9 = tk.StringVar()
    #生成输入框
    entry1 = tk.Entry(window_function,show=None,textvariable=v1).grid(row = 1,column =1)
    entry2 = tk.Entry(window_function,show=None,textvariable=v2).grid(row = 2,column =1)
    entry3 = tk.Entry(window_function,show=None,textvariable=v3).grid(row = 3,column =1)
    entry4 = tk.Entry(window_function, show=None, textvariable=v4).grid(row=4, column=1)
    entry5 = tk.Entry(window_function, show=None, textvariable=v5).grid(row=5, column=1)
    entry6 = tk.Entry(window_function, show=None, textvariable=v6).grid(row=6, column=1)
    entry7 = tk.Entry(window_function, show=None, textvariable=v7).grid(row=7, column=1)
    entry8 = tk.Entry(window_function, show=None, textvariable=v8).grid(row=8, column=1)
    entry9 = tk.Entry(window_function, show=None, textvariable=v9).grid(row=9, column=1)
    #生成按钮
    button = tk.Button(window_function, text="添加", command=add).place(relx=0.3,rely=0.9)

    button2 = tk.Button(window_function, text="返回", command=chaneg_main).place(relx=0.5,rely=0.9)
    #显示窗口
    window_function.mainloop()

#删除商品界面
def Staff_delete():
    global window_function
    global v10
    window_function=tk.Tk()
    window_function.title("超市零售信息管理系统")
    window_function.geometry('500x400')
    tk.Label(window_function, text="删除商品", font=("黑体", 20)).grid(row=0,column=1,pady=20)
    tk.Label(window_function,text="请输入商品编号:").grid(row = 1,column =0,padx=20)
    v10 =tk.StringVar()
    entry1=tk.Entry(window_function,show=None,textvariable=v10).grid(row = 1,column =1,pady=40)
    button = tk.Button(window_function, text="删除", command=delete,anchor = 's').place(relx=0.2,rely=0.5)
    button2 = tk.Button(window_function, text="返回", command=chaneg_main).place(relx=0.4,rely=0.5)
    window_function.mainloop()

#更新商品信息界面
def Staff_update():
    global window_function
    global v11,v12
    window_function=tk.Tk()
    window_function.title("超市零售信息管理系统")
    window_function.geometry('500x400')
    tk.Label(window_function, text="更新商品信息", font=("黑体", 20)).grid(row=0,column=1,pady=20)
    tk.Label(window_function,text="请输入商品库存:").grid(row = 1,column =0,padx=20,pady=20)
    tk.Label(window_function,text="请输入商品编号:").grid(row = 2,column =0,padx=20,pady=20)
    v11=tk.StringVar()
    v12=tk.StringVar()
    entry1=tk.Entry(window_function,show=None,textvariable=v11).grid(row = 1,column =1)
    entry2=tk.Entry(window_function,show=None,textvariable=v12).grid(row = 2,column =1)
    button = tk.Button(window_function, text="更新", command=update).place(relx=0.3,rely=0.5)
    button2 = tk.Button(window_function, text="返回", command=chaneg_main).place(relx=0.5,rely=0.5)
    window_function.mainloop()

#条件查找商品界面
def Staff_select():
    global window_function
    global v13
    window_function=tk.Tk()
    window_function.title("超市零售信息管理系统")
    window_function.geometry('500x400')
    tk.Label(window_function, text="查找商品的供货商名称", font=("黑体", 20)).grid(row=0,column=1,pady=20)
    tk.Label(window_function,text="请输入商品编号:").grid(row = 1,column =0,padx=20)
    v13 =tk.StringVar()
    entry1=tk.Entry(window_function,show=None,textvariable=v13).grid(row = 1,column =1,pady=40)
    button = tk.Button(window_function, text="查找", command=select).place(relx=0.3,rely=0.5)
    button2 = tk.Button(window_function, text="返回", command=chaneg_main).place(relx=0.5,rely=0.5)
    window_function.mainloop()

#添加商品界面跳转
def change_add():
    #销毁画布
    window.destroy()
    #生成新界面
    Staff_add()

#删除商品界面跳转
def change_delete():
    window.destroy()
    Staff_delete()

#更新商品界面跳转
def change_update():
    window.destroy()
    Staff_update()

#条件查询商品界面跳转
def change_select():
    window.destroy()
    Staff_select()

#主界面跳转
def chaneg_main():
    window_function.destroy()
    mainpage()

#主界面
def mainpage():
    global window
    window = tk.Tk()
    window.title("超市零售信息管理系统")
    window.geometry('500x400')
    #生成画布,销毁后生成新的画布实现跳转
    page = tk.Frame(window)
    page.pack()
    tk.Label(window, text="欢迎使用超市零售信息管理系统", font=("黑体", 20)).pack(pady=10)
    button1 = tk.Button(window, text="添加商品信息", command=change_add).pack(pady=10)
    button2 = tk.Button(window, text="删除商品信息", command=change_delete).pack(pady=10)
    button3 = tk.Button(window, text="修改商品信息", command=change_update).pack(pady=10)
    button4 = tk.Button(window, text="查找商品供货商名称", command=change_select).pack(pady=10)
    window.mainloop()

#主函数生成主界面
if __name__ == '__main__':
    mainpage()

五、总结

对于数据库课程设计其实本身难度并不大,这里作者总结了一下在操作过程中的几个难点:
1.需求分析。很多同学确定了自己要做一个什么数据库后很兴奋,觉得自己找到属于自己的题目了,但却发现自己很难走出第一步,因为我们没有进行数据库的需求分析,并不了解自己的数据库具体要实现什么样的功能。这里的需求分析可以通过画功能模块图来实现,当然也可以文字叙述,但远不如画图来的直观。
2.数据库的逻辑结构设计。因为每一个数据中需要建立许多表,大家很容易混乱各个表之间的逻辑关系,因此可以把概念结构设计放在逻辑结构设计之前进行。
3.数据库与程序设计语言的建立和界面的创建。选择一门合适的高级语言来进行课设是非常重要的,各程序之间没有太大的优劣之分,只能说各有特点,作者在这里选择了Python语言,原因是代码简洁直观,并通过Python的第三方库可以非常方便快速的连接数据库和制作界面。

PS:如果同学们想要完整的课程设计报告可以私聊笔者免费获取。

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
青葱年少的头像青葱年少普通用户
上一篇 2023年3月8日
下一篇 2023年3月8日

相关推荐

此站出售,如需请站内私信或者邮箱!