数据库课程设计—超市零售信息管理系统(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:如果同学们想要完整的课程设计报告可以私聊笔者获取小尝获取。

  • 290
    点赞
  • 1997
    收藏
    觉得还不错? 一键收藏
  • 375
    评论
本系统为中小型超市销售管理系统,因此系统需求分析阶段主要采取实地采访、调查学校周边超市,网上查找相关资料,请教老师等多种方式,尤其是仔细思考、分析超市购物发票。这一阶段大概了解了目前超市销售管理的现状,了解了超市销售方面的业务,同时也发现了其中存在的一些问题。经过近两天时间的实践,了解了很多关于超市的知识,收获挺多的。 需求分析成果如下。 系统要处理的基本对象包括营业员基本信息、会员基本信息、管理员基本信息、商品基本信息、货架基本信息、销售单基本信息、退货单基本信息等多个对象。各个基本对象包含信息如下所示: 营业员(营业员号,姓名,收银台位置,上班时间,下班时间,月薪,联系电话); 会员(会员卡号,会员姓名,卡密码,注册时间,累计消费); 商品(商品编号,货架编号,条形码,商品名称,商品价格,现有存量,存量底线,生产日期,保质期,供货商); 销售单(销售单编号,营业员编号,会员卡号,打印时间,有无折扣); 销售商品(销售单号,商品编号,销售数量); 货架(货架编号,管理员号,货架名称); 管理员(管理员号,姓名,联系电话,上班时间,下班时间,月薪); 退货单(退货单号,商品编号,退货数量); 打印(退货单号,销售单号,营业员号,打印时间)。 本中小型超市销售管理系统大体上包含三个模块,为前台收银业务处理,前台退货业务处理以及后台销售处理功能模块,具体如下所述。
超市零售信息管理系统可以用Python编写,数据库可以使用SQLServer。下面是一个简单的操作SQLServer数据库Python示例代码,以便快速开始: ```python import pyodbc def create_table(cursor): cursor.execute('CREATE TABLE Product(ProductID INT PRIMARY KEY, ProductName VARCHAR(20), Price FLOAT)') def insert_data(cursor): cursor.execute("INSERT INTO Product VALUES(1, 'apple', 5.0)") cursor.execute("INSERT INTO Product VALUES(2, 'banana', 2.0)") cursor.execute("INSERT INTO Product VALUES(3, 'orange', 3.0)") def update_data(cursor): cursor.execute("UPDATE Product SET Price = 4.0 WHERE ProductID = 2") def delete_data(cursor): cursor.execute("DELETE FROM Product WHERE ProductID = 3") def print_data(cursor): cursor.execute('SELECT * FROM Product') for row in cursor: print(row) # 连接数据库 cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=server_name;DATABASE=database_name;UID=username;PWD=password') cursor = cnxn.cursor() # 创建表 create_table(cursor) # 插入数据 insert_data(cursor) # 打印数据 print_data(cursor) # 更新数据 update_data(cursor) # 删除数据 delete_data(cursor) # 打印数据 print_data(cursor) # 关闭连接 cnxn.close() ``` 在上面的示例代码中,我们使用pyodbc库来连接SQLServer数据库,创建表,插入数据,更新数据以及删除数据。我们也定义了一个函数来打印表中的数据。你可以根据你的需求修改代码。请注意,你需要将示例代码中的server_name,database_name,username以及password更改为实际值。
评论 375
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值