课程需求分析

课题意义

近年来,随着 Internet 的迅速发展,互联网已日益成为收集提供信息的最佳渠道。于是网上购物开始流行起来,越来越多的商家在网上建起在线商店,向消费者展现出一种新颖的购物理念。网络书店系统提供网上购书的渠道,在其商务活动中起着举足轻重的作用。而网络书店的后台信息管理无疑是重中之重。有了一个好的信息管理系统,不仅能方便地查阅网上书店的收入营收情况,更是能有效地分析用户数据情况,得到有效的的改善。该课程设计要求设计一个网络书店信息管理系统,数据库中要求包含书籍、订单和用户的一些信息。同时还要设计它们之间的关系,如用户与购买书籍之间的关系等,最后还要对数据进行查询,如查询书籍、订单和用户的信息等。本人们通过该课程设计,应该达到的目的是把数据库理论知识更加的巩固加深,加强动手能力与实践能力,学以致用,与现实生活中的应用充分的结合起来。

课题目的

应用对数据库系统原理的理论学习,通过上机实践的方式将理论知识与实践更好的结合起来,巩固所学知识。

数据库应用课程实践

实践和巩固在课堂教学中学习的关于数据库的有关知识,熟练掌握对数据库的创建、基本操作、程序系统的建立和调试以及系统评价。

数据库原理软件设计实践

实践和巩固在课堂教学中学习的关于关系数据库原理的有关知识和数据库系统的建立方法,熟练掌握对于给定实际问题,为了建立一个关系数据库信息管理系统,必须得经过系统调研、需求分析、概念设计、逻辑设计、物理设计、系统调试、维护以及系统评价的一般过程。

系统分析

总体需求简单介绍

需求分析阶段是数据库应用系统开发的最重要阶段。需求分析要求应用系统的开发人员按照系统的思想,根据收集的资料,对系统目标进行分析,对业务的信息需求、功能需求以及管理中存在的问题等进行分析,抽取本质的、整体的需求,为设计一个结构良好的数据库应用系统的逻辑模型奠定坚实的基础。网上书店信息管理系统是网上书店不可缺少的一部分。一个功能齐全、简单易用的信息管理系统不仅能有效减轻管理人员的工作量,其内容对网上书店的决策者来说也非常重要。因此,网上书店信息管理系统应该能够为用户提供足够的信息和快速的查询手段。然而,人们一直使用传统的手动方式来管理文件、统计数据和查询数据。随着科学技术的不断进步,计算机科学越来越成熟。它强大的功能已经被人们深深地认识到。它已经进入人类社会的各个领域,发挥着越来越重要的作用。作为计算机应用的一部分,利用计算机管理网上书店信息具有人工管理无法比拟的优势。本系统完成网上书店中书籍、订单和用户的信息查询和创建。

用户总体业务构造

网上书店信息管理系统,包括 3 个主要部分:书籍信息的管理;订单信息的管理;用户的管理;各部分具体的内容:

  1. 书籍信息的管理包括:管理员管理书籍信息,如若要加入新书,则创建新书,并返回相应的出版商。
  2. 订单信息的管理包括:管理员管理订单信息,可以通过录入订单中的用户和书籍编号,直接插入数据。
  3. 用户信息的管理包括:后台管理员管理用户信息,如若有用户需求创建新用户。则可以批改审核后然后创建新用户。

数据库设计

概念结构设计

实体

概念设计就是通过对需求分析阶段所得到的信息需求进行综合、归纳与抽象,形成一个独立于具体数据库管理系统的概念模型,主要的手段为 ER 图。在概念设计阶段,主要采用的设计手段目前还是实体联系模型(E-R Model)。绘制 E-R 图的关键是确定 E-R 图的各种结构,包括实体、属性和联系。大部分的流行建模工具(PowerDesigner、Oracle Designer、ERwin 等)也都包含了对 E-R 设计手段的支持。要建立系统的 E-R 模型的描述,需进一步从数据流图和数据字典中提取系统所有的实体及其属性。这种提出实体的指导原则如下:

  1. 属性必须是不可分的数据项,即属性中不能包含其它的属性或实体
  2. E-R 图中的关联必须是实体之间的关联,属性不能和其它实体之间有关联由前面分析得到的数据流图和数据字典,可以抽象得到实体主要有 4 个:图书、订单、用户和出版商。 1. 图书实体属性有:书籍编号、书籍类型、书籍名称、作者、书籍单价、出版商编号。 2. 订单实体属性有:订单编号、用户编号、书籍编号、支付方式、购买日期、用户姓名、书籍名称。 3. 用户实体属性有:用户编号、用户名称、用户电话、用户性别、用户年龄。 4. 出版商实体属性有:出版商编号、出版商地址、出版商电话、出版商名称。

逻辑结构设计

关系模式

在概念设计阶段得到的数据模型,是独立于具体 DBMS 产品的信息模型。在逻辑设计阶段就是将这种模型进一步转化为某一种(某些类)DBMS 产品支持的数据模型。目前大部分的流行的数据库管理系统(SQL Server、Sybase、Oracle、DB2 等)基本上都是基于关系的数据模型,包括该系统将采用的 MySQL 数据库系统,因此,应将概念设计阶段的 E-R 图模型转化为关系数据模型。首先,书籍实体以及他们的联系。用户与书籍之间的是多对多的联系类型,因此,将书籍、用户联系分别设计成如下的关系模式:

  • 书籍(书籍编号,书籍类型,书籍名称,作者,书籍单价,出版商编号)
  • 用户(用户编号,用户名称,用户电话,用户性别,用户年龄)

并加入订单来保存多对多联系:

  • 订单(订单编号,用户编号,书籍编号,支付方式,购买日期,用户姓名,书籍名称)

出版商实体和书籍之间是一对多的联系类型,所以只要两个关系表就可表示,其中出版商编号可以放到书籍的实体中:

  • 出版商(出版商编号,出版商地址,出版商电话,出版商名称)

详细设计

Python 连接数据库

MySQLdb 是提供 Python 数据库 API 的流行 MySQL 数据库服务器的接口,能够执行 SQL 语句。它由一组用 Python 语言编写的类和接口组成。各种不同类型的数据库都有相应的实现,本文中的代码都是采用 MySQL 数据库实现的。连接数据库代码如下:

class Db:
    def __init__(self, database: str):
        """
        初始化,输入数据库名字
        :param database:
        """
        self.host = "localhost"
        self.user = "root"
        self.password = "zyf1593577852"
        self.database = database
        print('正在连接' + self.database + '数据库...')
        self.mdb = MySQLdb.connect(
            host=self.host,
            user=self.user,
            passwd=self.password,
            database=self.database,
        )
        print('连接成功!')
        return

登陆界面

登录界面代码主要包括验证和主窗口设计以及各功能按钮的设计,用户输入密码后可以点击 “确定”按钮,调用数据库信息进行登录验证,验证成功后进入用户主界面;

登录界面设计代码

def get_login():
    """
    获取登录界面
    :return:
    """
    login_col = [
        [sg.Image(filename='title_little.png')],
    ]
    col1 = [
        [sg.Text('输入管理员账号:')],
        [sg.Text('输入管理员密码:')],
    ]
    col2 = [
        [sg.InputText(k='manager_id', size=(30, 1))],
        [sg.InputText(k='manager_pw', size=(30, 1))],
    ]
    login = [
        [sg.Column(login_col, justification='center')],
        [sg.Column(col1), sg.Column(col2)],
        [sg.Button('确定', k='check')],
    ]
return login

登陆界面逻辑设计代码

def check():
    """
    验证管理员账号和密码是否正确
    id:root
    password: password
    :return:
    """
    global flag
    win_login = sg.Window('管理员登录', layout=get_login(), finalize=True)
    while True:
        event1, value1 = win_login.read()
        print(event1, value1)
        if event1 == sg.WIN_CLOSED:
            break
        elif event1 == 'check':
            if value1['manager_id'] == 'root' and value1['manager_pw'] == 'password':
                flag = 'Verified'
                sg.popup('验证成功')
                win_login._active_windows = False
                break
            else:
                flag = '验证失败'
                sg.popup(flag)
                win_login['manager_id'].update('')
                win_login['manager_pw'].update('')
win_login.close()

登录界面验证代码

if __name__ == "__main__":
    flag = ''
    check()
    if flag == 'Verified':
        main()

主界面模块

系统管理员登录后将进入主界面,可以选择接下来要进行的操作,点击按钮后主页面不会消失,可以同时打开多个操作页面。关闭主页面时会结束程序。

主界面设计代码

def get_main():
    """
    获取主界面
    :return:
    """
    main_col = [
        [sg.Image(filename='title_large.png')],
    ]
    main_col2 = [
        [sg.Text('1.图书管理'), sg.Button('书籍创建', k='书籍创建'), sg.Button('书籍查询', k='书籍查询')],
        [sg.Text('2.订单管理'), sg.Button('订单创建', k='订单创建'), sg.Button('订单查询', k='订单查询')],
        [sg.Text('3.用户管理'), sg.Button('用户创建', k='用户创建'), sg.Button('用户查询', k='用户查询')],
    ]
    main = [
        [sg.Column(main_col, justification='center')],
        [sg.Text('欢迎使用网上书店信息管理系统,这里为您提供书籍管理服务')],
        [sg.Text('您可以使用该系统来管理网上书店的相关信息。')],
        [sg.Text('具体有如下几种操作:')],
        [sg.Column(main_col2, justification='left')],
    ]
return main

主界面逻辑设计代码

def main():
    """
    主界面
    可以跳转到操作界面,并且主界面不会消失
    界面逻辑:
    主页面->书籍查询
    主页面->书籍创建
    主页面->订单查询
    主页面->订单创建
    主页面->用户查询
    主页面->用户创建
    :return:
    """
    global kind, find_str
    win_main = sg.Window('主页面', layout=get_main(), finalize=True)
    while True:
        event, value = win_main.read()
        print(event, value)
        if event == sg.WIN_CLOSED:
            break
        elif event == '书籍查询' or event == '订单查询' or event == '用户查询':
            pass
        elif event == '书籍创建':
            pass
        elif event == '订单创建':
            pass
        elif event == '用户创建':
            pass

查询模块

查询界面可以查询书籍、订单和用户的信息。可以输入相应的编号来查询,也可以输入相应的姓名来进行查询。如果输入栏中没有输入,则默认搜索全部实例。最终返回结果为编号和名称的结果的交集。

搜索界面设计代码

def get_find(kind: str):
    """
    获取查找页面
    kind为查找操作执行的表的名称
    :param kind:
    :return:
    """
    global heading, find_id, find_name
    if kind == 'book':
        heading = ['书籍编号', '类型', '名称', '作者', '单价']
        find_id = '输入书籍编号:'
        find_name = '输入书籍的名称'
    elif kind == 'orders':
        heading = ['订单编号', '用户姓名', '书籍名称', '支付方式', '购买日期']
        find_id = '输入订单编号:'
        find_name = '输入订单中用户的名称'
    elif kind == 'customer':
        heading = ['用户编号', '用户姓名', '用户电话', '用户性别', '用户年龄']
        find_id = '输入用户编号:'
        find_name = '输入用户的姓名'
    result = [['                   '] * 5] * 1
    find_col1 = [
        [sg.Image(filename='title_little.png')],
    ]
    find_col2 = [
        [sg.Text('填入所需查找的值,如果没有填入,则默认搜索所有实体。')],
        [sg.Text(find_id), sg.InputText(k='find_id', size=(10, 1)), sg.Text(find_name),
         sg.InputText(k='find_name', size=(10, 1)), sg.Ok()],
    ]

    find = [
        [sg.Column(find_col1, justification='center')],
        [sg.Column(find_col2, justification='center')],
        [sg.Table(values=result, k='find_table', headings=heading,auto_size_columns=True, justification='left', background_color='white', text_color='black',num_rows=20, tooltip='find_table'), ],
    ]
    return find

搜索页面逻辑设计代码

elif event == '书籍查询' or event == '订单查询' or event == '用户查询':

    if event == '书籍查询':
        kind = 'book'
        find_str = '书籍查询'
    elif event == '订单查询':
        kind = 'orders'
        find_str = '查询订单'
    elif event == '用户查询':
        kind = 'customer'
        find_str = '查询用户'

    win_find = sg.Window(
        find_str, layout=get_find(kind), finalize=True)

    print('你正在访问' + kind + '表')

    while True:
        event, value = win_find.read()
        print(event, value)
        if event == sg.WIN_CLOSED:
            break

        elif event == 'Ok':

            find_id = value['find_id'] if value['find_id'] != '' else None
            find_name = value['find_name'] if value['find_name'] != '' else None

            res = db.Find(kind=kind, id=find_id, name=find_name)
            win_find['find_table'].update(res)

Python 数据库操作代码

def Find(self, kind: str, id=None, name=None):
    """
    kind 为需要查询的类型,有book、orders、customer三种类型
    id 为需要查询的编号,如果不填写则返回全部实体
    name 为需要查询的名称,如果不填写则返回全部实体
    结果为id 和 name 为交集
    :param kind:
    :param id:
    :param name:
    :return:
    """
    cursor = self.mdb.cursor()
    kind_id = res = kind_name = ''
    if kind == 'book':
        kind_id = 'bid'
        kind_name = 'bname'
        res = 'bid,bkind,bname,author,bprice'
    elif kind == 'orders':
        kind_id = 'oid'
        kind_name = 'cname'
        res = 'oid,cname,bname,pay_way,odate'
    elif kind == 'customer':
        kind_id = 'cid'
        kind_name = 'cname'
        res = 'cid,cname,cphone,csex,cage'
    sql = '''select {_res} from {_kind} '''.format(_kind=kind, _res=res)
    if id or name:
        sql += 'where '
        if id:
            sql += kind_id + ' = ' + id
        if name:
            if id:
                sql += ' and '
            sql += kind_name + ' = \'%s\'' % name
    cursor.execute(sql)
    res = []
    results = cursor.fetchall()
    for item in results:
        res.append(list(item))
    return res

创建模块

创建界面可以创建书籍、订单和用户的实例。每次创建需要输入相应实例的详细信息,某些信息(如编号,和订单中的用户姓名和书籍名称不用填写)。如果输入栏中没有输入,则会认为输入格式错误。创建书籍时会依据出版商编号返回出版商基本信息。

创建界面设计代码

def get_book_create():
    """
    获取书籍创建界面
    :return:
    """
    image_col = [
        [sg.Image(filename='title_little.png')],
    ]
    col1 = [
        [sg.Text('输入书籍类型:')],
        [sg.Text('输入书籍名称:')],
        [sg.Text('输入书籍作者:')],
        [sg.Text('输入书籍单价:')],
        [sg.Text('输入出版商编号:')],
    ]
    col2 = [
        [sg.InputText(k='bkind')],
        [sg.InputText(k='bname')],
        [sg.InputText(k='author')],
        [sg.InputText(k='bprice')],
        [sg.InputText(k='pid')],
    ]
    book_create = [
        [sg.Column(image_col, justification='center')],
        [sg.Text('创建一个书籍实体:')],
        [sg.Column(col1), sg.Column(col2)],
        [sg.Ok()],
    ]
return book_create

创建界面逻辑代码

elif event == '书籍创建':
    win_book_create = sg.Window('书籍创建', layout=get_book_create(), finalize=True)
    while True:
        event, value = win_book_create.read()
        print(event, value)
        if event == sg.WIN_CLOSED:
            break
        elif event == 'Ok':

            bkind = value['bkind'] if value['bkind'] != '' else None
            bname = value['bname'] if value['bname'] != '' else None
            author = value['author'] if value['author'] != '' else None
            bprice = value['bprice'] if value['bprice'] != '' else None
            pid = value['pid'] if value['pid'] != '' else None
            res = db.create_book(bkind=bkind, bname=bname, author=author, bprice=bprice, pid=pid)
            publisher = db.Find_publisher(pid=pid)
            if res == -1:
                sg.popup('输入信息格式不正确!')
            else:
                sg.popup('操作成功!', '请尽快联系出版商!', '\n出版商名称:' + publisher[0][0],'出版商电话:' + publisher[0][2], '出版商地址:' + publisher[0][1])

Python 数据库操作代码

def create_book(self, bkind=None, bname=None, author=None, bprice=None, pid=None):
    """
    创建书籍实体
    将会自动设置书籍实体的编号
    :param bkind:
    :param bname:
    :param author:
    :param bprice:
    :param pid:
    :return:
    """
    cursor = self.mdb.cursor()
    if bkind and bname and author and bprice and pid:
        res = self.Find('book')
        bid = str(len(res) + 1)
        string = "'%s','%s','%s','%s','%s','%s'" % (bid, bkind, bname, author, bprice, pid)
        sql = 'INSERT INTO book (bid,bkind,bname,author,bprice,pid) VALUES (%s)' % string
        print('sql:', sql)
        cursor.execute(sql)
        self.mdb.commit()
        return 1
    else:
        return -1

def Find_publisher(self, pid):
    """
    根据出版商编号查找出版商信息
    :param pid:
    :return:
    """
    cursor = self.mdb.cursor()
    sql = '''select pname,paddress,pphone from publisher where pid = '%s' ''' % pid
    cursor.execute(sql)
    res = []
    results = cursor.fetchall()
    for item in results:
        res.append(list(item))
    return res

总结

在课程设计设计过程中,本人学到的知识是有限的,面对的实践应用是多种多样的,所学很可能无法满足所用,必须在实践中、在应用中不断学习不断提高,这次完成设计的过程中本人学到了许多从前闻所未闻的知识和技能。课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践 能力的重要环节,是对学生实际工作能力的具体训练和考察过程。本次课程设计虽然很 辛苦,实在是受益匪浅。本来这门课的知识学的就不够扎实,本次课程设计,在设计过 程中碰到了很多问题,刚开始要设计的时候,还真不知道从哪里下手但最终在图书、同学和老师的帮助下都得到了解决,让我学会了好多书本上没有的东西,通过本次课程设 计我也能将课本上的知识融会贯通,起到了很好的辅助学习的效果。理论和实践的相结合是学习最有效的方法。在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,通过这次课程设计之后,一定把以前所学过的知识重新温故。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。由于我的知识浅薄,经验不足及资历尚浅,因此在该程序的设计方面还有很多不足,比如功能过少,只是简单的实现了数据的添加,对数据的删除和查询等操作均未实现,因此需要今后更加深入的学习和努力总之,这次设计是本人受益匪浅。对本人以后的工作、学习打下了坚实的基础。尤其是软件的设计过程和思路的开拓益处更多。

致谢

经过了这次的学习和实践,此次课程设计终于完成,虽然这次设计网上书店信息管理系统可能还有待改善,但无论其设计如何,至少让本人学到了很多本人所忽略以及以前未触及的东西。在此,对学校提供此次课程设计表示感谢,还有为此次课程设计出谋划策的老师们,是你们让本人们所学有一定的方向性。在此要感谢我的同学的帮助。在开始编写程序的时候,我看到别人的程序功能非常的详细,而且界面非常的漂亮,总希望自己的程序也多一些功能更加的完善。但是渐渐的我发现编写一个优秀的程序决不是一蹴而就的事情,需要长时间的积累和经验而这个方面又是我的弱项。因此在同学的帮助下,我认识到自己的不足和劣势,不要贪图大而全,只要尽我所能,编制一个实用简单的程序也是一件很不容易的事情。在同学的帮助和自己的努力之下,我终于做出了一个简单的程序。虽然程序的功能简单,而且我想在实际的运用中,肯定会有所不足因为学生信息管理系统工作的内容非常的丰富,我涉及到的仅仅是学生信息管理的一部分简单内容,离实际的客户需求肯定还有一定的差距。但是它毕竟代表着我对这段时间所学的知识的掌握。

Python 源代码

Windows.py(表现层)

import PySimpleGUI as sg


def get_login():
 """
 获取登录界面
 :return:
 """
 login_col = [
  [sg.Image(filename='title_little.png')],
 ]
 col1 = [
  [sg.Text('输入管理员账号:')],
  [sg.Text('输入管理员密码:')],
 ]
 col2 = [
  [sg.InputText(k='manager_id', size=(30, 1))],
  [sg.InputText(k='manager_pw', size=(30, 1))],
 ]
 login = [
  [sg.Column(login_col, justification='center')],
  [sg.Column(col1), sg.Column(col2)],
  [sg.Button('确定', k='check')],
 ]
 return login


def get_main():
 """
 获取主界面
 :return:
 """
 main_col = [
  [sg.Image(filename='title_large.png')],
 ]
 main_col2 = [
  [sg.Text('1.图书管理'), sg.Button('书籍创建', k='书籍创建'), sg.Button('书籍查询', k='书籍查询')],
  [sg.Text('2.订单管理'), sg.Button('订单创建', k='订单创建'), sg.Button('订单查询', k='订单查询')],
  [sg.Text('3.用户管理'), sg.Button('用户创建', k='用户创建'), sg.Button('用户查询', k='用户查询')],
 ]
 main = [
  [sg.Column(main_col, justification='center')],
  [sg.Text('欢迎使用网上书店信息管理系统,这里为您提供书籍管理服务')],
  [sg.Text('您可以使用该系统来管理网上书店的相关信息。')],
  [sg.Text('具体有如下几种操作:')],
  [sg.Column(main_col2, justification='left')],
 ]
 return main


def get_find(kind: str):
 """
 获取查找页面
 kind为查找操作执行的表的名称
 :param kind:
 :return:
 """
 global heading, find_id, find_name
 if kind == 'book':
  heading = ['书籍编号', '类型', '名称', '作者', '单价']
  find_id = '输入书籍编号:'
  find_name = '输入书籍的名称'
 elif kind == 'orders':
  heading = ['订单编号', '用户姓名', '书籍名称', '支付方式', '购买日期']
  find_id = '输入订单编号:'
  find_name = '输入订单中用户的名称'
 elif kind == 'customer':
  heading = ['用户编号', '用户姓名', '用户电话', '用户性别', '用户年龄']
  find_id = '输入用户编号:'
  find_name = '输入用户的姓名'
 result = [['                   '] * 5] * 1
 find_col1 = [
  [sg.Image(filename='title_little.png')],
 ]
 find_col2 = [
  [sg.Text('填入所需查找的值,如果没有填入,则默认搜索所有实体。')],
  [sg.Text(find_id), sg.InputText(k='find_id', size=(10, 1)), sg.Text(find_name),
   sg.InputText(k='find_name', size=(10, 1)), sg.Ok()],
 ]

 find = [
  [sg.Column(find_col1, justification='center')],
  [sg.Column(find_col2, justification='center')],
  [sg.Table(values=result, k='find_table', headings=heading,
            auto_size_columns=True, justification='left', background_color='white', text_color='black',
            num_rows=20, tooltip='find_table'), ],
 ]
 return find


def get_book_create():
 """
 获取书籍创建界面
 :return:
 """
 image_col = [
  [sg.Image(filename='title_little.png')],
 ]
 col1 = [
  [sg.Text('输入书籍类型:')],
  [sg.Text('输入书籍名称:')],
  [sg.Text('输入书籍作者:')],
  [sg.Text('输入书籍单价:')],
  [sg.Text('输入出版商编号:')],
 ]
 col2 = [
  [sg.InputText(k='bkind')],
  [sg.InputText(k='bname')],
  [sg.InputText(k='author')],
  [sg.InputText(k='bprice')],
  [sg.InputText(k='pid')],
 ]
 book_create = [
  [sg.Column(image_col, justification='center')],
  [sg.Text('创建一个书籍实体:')],
  [sg.Column(col1), sg.Column(col2)],
  [sg.Ok()],
 ]
 return book_create


def get_orders_create():
 """
 获取订单创建界面
 :return:
 """
 image_col = [
  [sg.Image(filename='title_little.png')],
 ]
 col1 = [
  [sg.Text('输入订单中书籍编号:')],
  [sg.Text('输入订单中用户编号:')],
  [sg.Text('输入支付方式:')],
  [sg.Text('输入购买日期:')],
 ]
 col2 = [
  [sg.InputText(k='bid')],
  [sg.InputText(k='cid')],
  [sg.InputText(k='pay_way')],
  [sg.InputText(k='odate')],
 ]
 orders_create = [
  [sg.Column(image_col, justification='center')],
  [sg.Text('创建一个订单实体:')],
  [sg.Column(col1), sg.Column(col2)],
  [sg.Ok()],
 ]
 return orders_create


def get_customer_change():
 """
 获取用户创建界面
 :return:
 """
 image_col = [
  [sg.Image(filename='title_little.png')],
 ]
 col1 = [
  [sg.Text('输入用户姓名:')],
  [sg.Text('输入用户电话:')],
  [sg.Text('输入用户性别:')],
  [sg.Text('输入用户年龄:')],
 ]
 col2 = [
  [sg.InputText(k='cname')],
  [sg.InputText(k='cphone')],
  [sg.InputText(k='csex')],
  [sg.InputText(k='cage')],
 ]
 customer_change = [
  [sg.Column(image_col, justification='center')],
  [sg.Text('创建一个用户实体:')],
  [sg.Column(col1), sg.Column(col2)],
  [sg.Ok()],
 ]
 return customer_change

main.py(功能层)

from db import Db
from windows import *


def check():
 """
 验证管理员账号和密码是否正确
 id:root
 password: password
 :return:
 """
 global flag
 win_login = sg.Window('管理员登录', layout=get_login(), finalize=True)
 while True:
  event1, value1 = win_login.read()
  print(event1, value1)
  if event1 == sg.WIN_CLOSED:
   break
  elif event1 == 'check':
   if value1['manager_id'] == 'root' and value1['manager_pw'] == 'password':
    flag = 'Verified'
    sg.popup('验证成功')
    win_login._active_windows = False
    break
   else:
    flag = '验证失败'
    sg.popup(flag)
    win_login['manager_id'].update('')
    win_login['manager_pw'].update('')
 win_login.close()


def main():
 """
 主界面
 可以跳转到操作界面,并且主界面不会消失
 界面逻辑:
 主页面->书籍查询
 主页面->书籍创建
 主页面->订单查询
 主页面->订单创建
 主页面->用户查询
 主页面->用户创建
 :return:
 """
 global kind, find_str
 win_main = sg.Window('主页面', layout=get_main(), finalize=True)
 while True:
  event, value = win_main.read()
  print(event, value)
  if event == sg.WIN_CLOSED:
   break

  elif event == '书籍查询' or event == '订单查询' or event == '用户查询':

   if event == '书籍查询':
    kind = 'book'
    find_str = '书籍查询'
   elif event == '订单查询':
    kind = 'orders'
    find_str = '查询订单'
   elif event == '用户查询':
    kind = 'customer'
    find_str = '查询用户'

   win_find = sg.Window(
    find_str, layout=get_find(kind), finalize=True)

   print('你正在访问' + kind + '表')

   while True:
    event, value = win_find.read()
    print(event, value)
    if event == sg.WIN_CLOSED:
     break

    elif event == 'Ok':

     find_id = value['find_id'] if value['find_id'] != '' else None
     find_name = value['find_name'] if value['find_name'] != '' else None

     res = db.Find(kind=kind, id=find_id, name=find_name)
     win_find['find_table'].update(res)

  elif event == '书籍创建':
   win_book_create = sg.Window('书籍创建', layout=get_book_create(), finalize=True)
   while True:
    event, value = win_book_create.read()
    print(event, value)
    if event == sg.WIN_CLOSED:
     break
    elif event == 'Ok':

     bkind = value['bkind'] if value['bkind'] != '' else None
     bname = value['bname'] if value['bname'] != '' else None
     author = value['author'] if value['author'] != '' else None
     bprice = value['bprice'] if value['bprice'] != '' else None
     pid = value['pid'] if value['pid'] != '' else None
     res = db.create_book(bkind=bkind, bname=bname, author=author, bprice=bprice, pid=pid)
     publisher = db.Find_publisher(pid=pid)
     if res == -1:
      sg.popup('输入信息格式不正确!')
     else:
      sg.popup(
       '操作成功!', '请尽快联系出版商!', '\n出版商名称:' + publisher[0][0],
                             '出版商电话:' + publisher[0][2], '出版商地址:' + publisher[0][1])

  elif event == '订单创建':
   win_orders_create = sg.Window('订单创建', layout=get_orders_create(), finalize=True)
   while True:
    event, value = win_orders_create.read()
    print(event, value)
    if event == sg.WIN_CLOSED:
     break
    elif event == 'Ok':

     bid = value['bid'] if value['bid'] != '' else None
     cid = value['cid'] if value['cid'] != '' else None
     pay_way = value['pay_way'] if value['pay_way'] != '' else None
     odate = value['odate'] if value['odate'] != '' else None

     res = db.create_orders(bid=bid, cid=cid, pay_way=pay_way, odate=odate)
     if res == -1:
      sg.popup('输入信息格式不正确!')
     else:
      sg.popup('操作成功!')

  elif event == '用户创建':
   win_customer_change = sg.Window('用户创建', layout=get_customer_change(), finalize=True)
   while True:
    event, value = win_customer_change.read()
    print(event, value)
    if event == sg.WIN_CLOSED:
     break
    elif event == 'Ok':

     cname = value['cname'] if value['cname'] != '' else None
     cphone = value['cphone'] if value['cphone'] != '' else None
     csex = value['csex'] if value['csex'] != '' else None
     cage = value['cage'] if value['cage'] != '' else None

     res = db.create_customer(cname=cname, cphone=cphone, csex=csex, cage=cage)
     if res == -1:
      sg.popup('输入信息格式不正确!')
     else:
      sg.popup('操作成功!')


if __name__ == "__main__":
 db = Db('books')
 flag = ''
 check()

 if flag == 'Verified':
  main()

db.py(数据层)

import MySQLdb


class Db:
 def __init__(self, database: str):
  """
  初始化,输入数据库名字
  :param database:
  """
  self.host = "localhost"
  self.user = "root"
  self.password = "zyf1593577852"
  self.database = database
  print('正在连接' + self.database + '数据库...')
  self.mdb = MySQLdb.connect(
   host=self.host,
   user=self.user,
   passwd=self.password,
   database=self.database,
  )
  print('连接成功!')
  return

 def Find_publisher(self, pid):
  """
  根据出版商编号查找出版商信息
  :param pid:
  :return:
  """
  cursor = self.mdb.cursor()
  sql = '''select pname,paddress,pphone from publisher where pid = '%s' ''' % pid
  cursor.execute(sql)
  res = []
  results = cursor.fetchall()
  for item in results:
   res.append(list(item))
  return res

 def Find(self, kind: str, id=None, name=None):
  """
  kind 为需要查询的类型,有book、orders、customer三种类型
  id 为需要查询的编号,如果不填写则返回全部实体
  name 为需要查询的名称,如果不填写则返回全部实体
  结果为id 和 name 为交集
  :param kind:
  :param id:
  :param name:
  :return:
  """
  cursor = self.mdb.cursor()
  kind_id = res = kind_name = ''
  if kind == 'book':
   kind_id = 'bid'
   kind_name = 'bname'
   res = 'bid,bkind,bname,author,bprice'
  elif kind == 'orders':
   kind_id = 'oid'
   kind_name = 'cname'
   res = 'oid,cname,bname,pay_way,odate'
  elif kind == 'customer':
   kind_id = 'cid'
   kind_name = 'cname'
   res = 'cid,cname,cphone,csex,cage'
  sql = '''select {_res} from {_kind} '''.format(_kind=kind, _res=res)
  if id or name:
   sql += 'where '
   if id:
    sql += kind_id + ' = ' + id
   if name:
    if id:
     sql += ' and '
    sql += kind_name + ' = \'%s\'' % name
  cursor.execute(sql)
  res = []
  results = cursor.fetchall()
  for item in results:
   res.append(list(item))
  return res

 def create_book(self, bkind=None, bname=None, author=None, bprice=None, pid=None):
  """
  创建书籍实体
  将会自动设置书籍实体的编号
  :param bkind:
  :param bname:
  :param author:
  :param bprice:
  :param pid:
  :return:
  """
  cursor = self.mdb.cursor()
  if bkind and bname and author and bprice and pid:
   res = self.Find('book')
   bid = str(len(res) + 1)
   string = "'%s','%s','%s','%s','%s','%s'" % (bid, bkind, bname, author, bprice, pid)
   sql = 'INSERT INTO book (bid,bkind,bname,author,bprice,pid) VALUES (%s)' % string
   print('sql:', sql)
   cursor.execute(sql)
   self.mdb.commit()
   return 1
  else:
   return -1

 def create_orders(self, bid=None, cid=None, pay_way=None, odate=None):
  """
  创建订单实体
  将会自动设置订单实体的编号
  以及根据书籍编号和用户编号设置书籍名称和用户名称
  :param bid:
  :param cid:
  :param pay_way:
  :param odate:
  :return:
  """
  cursor = self.mdb.cursor()
  if bid and cid and pay_way and odate:
   res = self.Find('book', id=bid)
   bname = res[0][2]
   res = self.Find('customer', id=cid)
   cname = res[0][1]
   res = self.Find('orders')
   oid = str(len(res) + 1)
   string = "'%s','%s','%s','%s','%s','%s','%s'" % (oid, bid, cid, pay_way, odate, bname, cname)
   sql = 'INSERT INTO orders (oid,bid,cid,pay_way,odate,bname,cname) VALUES (%s)' % string
   print('sql:', sql)
   cursor.execute(sql)
   self.mdb.commit()
   return 1
  else:
   return -1

 def create_customer(self, cname=None, cphone=None, csex=None, cage=None):
  """
  创建用户实体
  将会自动设置用户实体的编号
  :param cname:
  :param cphone:
  :param csex:
  :param cage:
  :return:
  """
  cursor = self.mdb.cursor()
  if cname and cphone and csex and cage:
   res = self.Find('customer')
   cid = str(len(res) + 1)
   string = "'%s','%s','%s','%s','%s'" % (cid, cname, cphone, csex, cage)
   sql = 'INSERT INTO customer (cid,cname,cphone,csex,cage) VALUES (%s)' % string
   print('sql:', sql)
   cursor.execute(sql)
   self.mdb.commit()
   return 1
  else:
   return -1


正是你花费在玫瑰上的时间才使得你的玫瑰花珍贵无比