精华内容
下载资源
问答
  • 图书管理系统数据库设计

    热门讨论 2012-12-03 15:19:12
    图书管理系统数据库设计 文档 自己总结的一个简单的数据库功能及数据库设计
  • 图书管理系统数据库设计

    热门讨论 2008-12-16 13:23:48
    图书管理系统数据库设计 课程设计 1、系统简要分析 1.1图书资料基本管理 (1)、新书编号、登记、入库:将新购入的书籍按照国家统一的分类编号;登记书号、书名、作者、出版社等基本信息,将新购图书入库。 (2...
  • 数据库系统设计大作业:图书管理系统

    千次阅读 多人点赞 2020-12-04 09:12:45
    针对图书馆的图书管理系统数据库设计,分别对图书馆的读者、一般工作人员和部门负责人进行详细地分析,总结出如下的需求信息: (1)图书馆中的图书具有书号、书名、作者、馆藏册数、在馆册数、价格、出版社及摘要等...

    数据库系统设计大作业:图书馆管理系统

    参考https://blog.csdn.net/dimo__/article/details/84936685中的设计思路,设计了本系统

    1 需求分析

    针对图书馆的图书管理系统数据库设计,分别对图书馆的读者、一般工作人员和部门负责人进行详细地分析,总结出如下的需求信息:
    (1)图书馆中的图书具有书号、书名、作者、馆藏册数、在馆册数、价格、出版社及摘要等必要信息。其中每种书具有唯一的书号,即一个书号对应一种书而不是一本书。书名可以重复,但如果只是两本书重名,则这两本书具有不同的书号。馆藏册数和在馆册数可以用于让读者判断是否可以借,另外,馆藏册数必须要大于等于在馆册数。
    (2)图书馆中的读者具有卡号、姓名、性别、单位、类型、级别和在借册数这些必要信息。卡号用于唯一地标识读者身份,每个读者对应一个卡号,同样每个卡号也不能对应多个读者。类型这个属性可以用于区分教员、学员,区分他们的意义在于不同类型的读者可同时借阅的书籍数大不相同。
    (3)从读者的角度,可以查阅图书馆相应的图书资料(也可以按要求查找,如输入一些关键字)以及每本书的在馆册数;同时可以提交借书和还书的申请;能判断自己是否因超期而欠款,若超期则自动显示出所需的罚款金额。
    (4)图书馆中的工作人员可以分为图书管理员和系统管理员。
    (5)图书管理员是图书馆中最普通的工作人员,图书管理员可以实现读者的借书和还书操作;也可以实现在读者交罚款之后取消罚款记录。另外,图书管理员在执行借书或还书操作时,应根据不同读者类型的借书限制册和还书日期等约束条件来实现。
    (6)系统管理员主要管理各类人员信息,包括读者信息和图书馆管理员信息这两项。
    (7)图书馆中应当有书架,书架具有书架号和类型两个属性,不同的书架号对应的图书类型也应该不同;另外还需要在图书中增加存放位置这个属性。

    2 系统设计

    2.1 概念结构设计

    图书这个实体型由书号、书名、作者、价格、出版社、摘要、馆藏册数、在馆册数、存放位置和被借次数这些属性组成,其中书号这个属性为主属性。
    在这里插入图片描述
    读者这个实体型由学号、姓名、性别、单位、类型、可借册数、在借册数、登陆密码和欠款这些属性组成,其中学号这个属性为主属性。
    在这里插入图片描述
    书架这个实体型由书架号和类型这两个属性组成,其中书架号这个属性为主属性,类型为本书架中存放书籍的类型,与之前读者中的表示读者身份的类型完全不同。

    在这里插入图片描述
    图书管理员和系统管理员这两个实体型由工作号,姓名和登录密码这些属性组成,其中工作号为主属性。

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

    借还申请这个实体型由学号、书号、提交时间和借还类型这些属性组成,这些属性均为主属性。

    在这里插入图片描述

    2.2 整体ER图

    在这里插入图片描述

    2.3逻辑结构设计

    (一)关系模式的设计与优化
    首先:将E-R图中的6个实体型转换成6个最基本的关系模式
    1、图书(书号,书名,作者,价格,出版社,摘要,馆藏册数,在馆册数,存放位置,被借次数)
    2、读者(卡号,姓名,性别,单位,类型,在借册数,可借册数,密码,欠款)
    3、书架(书架号,类型)
    4、图书管理员(工作号,姓名,密码)
    5、系统管理员(工作号,姓名,密码)
    6、借还申请(学号,书号,提交时间,类型)
    然后:将实体型之间的联系转换成关系模式,因为是m:n联系,因此直接将与该联系相连的各实体的码以及联系本身的属性转换为关系的属性
    1、借阅(书号,卡号,借书时间)
    最后,根据实际的需要将关系模式进行合理的优化
    1、图书(书号,书名,作者,价格,出版社,摘要,馆藏册数,在馆册数,存放位置,被借次数)
    因为只有一个候选码(书号),因此不存在非主属性部分依赖的情况;另外,由于除了候选码以外的所有非主属性每一个都是只有通过候选码推出,因此,不存在传递依赖,而且因为候选码书号是唯一的决定因素,所以该关系模式不仅满足3NF,也满足BCNF。
    2、读者(卡号,姓名,性别,单位,类型,在借册数)
    因为只有一个候选码(卡号),因此该关系模式中也不存在非主属性部分依赖的情况;另外,由于除了候选码以外的所有非主属性每一个都是只有通过候选码推出,因此,也不存在传递依赖,而且因为候选码卡号是唯一的决定因素,所以该关系模式也满足BCNF。
    3、类型(类型,借书时间,最多在借册数)
    与上一个关系模式相同,由于只有一个候选码(类型),因此该关系模式中也不存在非主属性部分依赖的情况;另外,由于除了候选码以外的所有非主属性每一个都是只有通过候选码推出,因此,也不存在传递依赖,而且因为候选码类型是唯一的决定因素,所以该关系模式也满足BCNF。
    4、借阅(书号,卡号,借书时间)
    这个关系模式中包含三个主属性(书号、卡号和借书时间),该关系模式也满足BCNF。
    5、书架(书架号,类型)
    因为只有一个候选码(书架号),因此该关系模式中也不存在非主属性部分依赖的情况;另外,由于除了候选码以外的所有非主属性只有一个,也就是类型,只有通过候选码推出,因此,也不存在传递依赖,而且因为候选码书架号是唯一的决定因素,所以该关系模式也满足BCNF。
    6、工作人员(工作号,姓名,职务)
    与上一个关系模式相同,该关系模式只有一个候选码(工作号),因此该关系模式中也不存在非主属性部分依赖的情况;另外,由于除了候选码以外的所有非主属性每一个都是只有通过候选码推出,因此,也不存在传递依赖,而且因为候选码工作号是唯一的决定因素,所以该关系模式也满足BCNF。
    (二)设计合适的视图
    首先,由于所需要查看该数据库的人员分为读者、一般工作人员和部门负责人。而这三种人员在不同情况下需要看到的信息不同,因此需要根据这三种不同的人员建立所需要的不同视图。
    对于读者而言:
    1、读者在需要借书时只需要看到书号、书名、作者、价格、出版社、摘要、馆藏册数和存放位置,可以建立一个视图。
    2、当读者需要查看自己的信息时,可以查看读者表的的全部信息以及类型表中的最多在借册数,以便于知道自己还能借几本书,这也需要建立一个视图。
    对于图书管理员而言:
    1、当图书管理员需要查看自己的信息时,只需要查看工作人员表中的前三项即可。
    2、当图书管理员需要审批借阅/归还信息时,可根据职责分工单独查看其中一类申请。
    对于系统管理员而言:
    1、系统管理员除了可以查看所有信息外,还可以专门建立一个视图以方便查看图书的借阅情况以及每本书的借阅次数。
    2、系统管理员可以查看登陆日志,通过日期信息来建立视图。

    2.4数据库设计

    主要设计了8个表,具体表结构如下:
    Books(书)
    在这里插入图片描述
    Bookshelfs(书架)
    在这里插入图片描述
    Borrow(借书信息)
    在这里插入图片描述

    Item(借还申请)
    在这里插入图片描述
    Loginrecord(登陆日志)
    在这里插入图片描述
    Readers(读者)
    在这里插入图片描述
    Readertype(读者类型)
    在这里插入图片描述
    Workers(工作人员)
    在这里插入图片描述

    2.5 图形化界面设计

    本系统的UI设计使用Python第三方库PyQt5。 Pyqt5是一套Python绑定Digia QT5应用的框架。它可用于Python 2和3。Qt库是最强大的GUI库之一。pyqt5做为Python的一个模块,它有620多个类和6000个函数和方法。这是一个跨平台的工具包,它可以运行在所有主要的操作系统,包括UNIX,Windows,Mac OS。
    安装好PyQt5后,系统会默认安装QtDesigner工具。Qtdesigner是Python设计里面一个非常实用的工具,使得人们编写qt界面可以不仅仅是使用纯代码,而可以在可视化的基础上设置。
    根据需求我们设计了以下4个界面:
    1、登陆界面:
    在这里插入图片描述

    2、读者系统界面:
    在这里插入图片描述

    3、图书管理员界面:
    在这里插入图片描述

    4、系统管理员界面:
    在这里插入图片描述

    2.5系统功能实现思路

    设计好UI后,具体功能的实现是将UI中各种控件的信号连接到相应的槽函数上。我们的思路是将这四个UI定义为类,实现功能的槽函数定义为类中的方法。在主函数中导入这几个类并实例化,这样在之后的优化中只需要对UI的类进行修改。
    槽函数的实现需调用pymysql库,将需要数据库提供的数据转换为SQL语句,用库中的游标来执行,并返回相应值,进而实现具体功能。

    需要源码的话请移步
    https://download.csdn.net/download/qq_21548021/13405013
    说明文档
    https://download.csdn.net/download/qq_21548021/14928244

    mysql版本我用的是8.0,如果版本过低(例如mysql5.6)会导致sql导入失败,遇到这种情况可以私我,我弄了个低版本的sql文件。

    展开全文
  • 图书管理系统 包括需求分析 开发背景 系统功能要求 系统概念模型设计 系统逻辑设计 系统物理设计和相关SQL语言 及总结
  • 数据库课程设计实验报告--图书管理系统

    千次阅读 多人点赞 2020-06-26 22:19:59
    数据库课设图书管理系统 目录 一、系统背景 二、需求分析 (一)系统综合需求 (二)系统逻辑模型 三、系统设计 (一)概念结构设计 (二) 逻辑结构设计 (三)子模块划分及功能概述 四、详细设计 (一)开发...

    数据库课设图书管理系统

    目录

    一、系统背景
    二、需求分析
    (一)系统综合需求
    (二)系统逻辑模型
    三、系统设计
    (一)概念结构设计
    (二) 逻辑结构设计
    (三)子模块划分及功能概述
    四、详细设计
    (一)开发平台及工具
    (二)存储过程及触发器
    (三)应用程序设计
    (四)用户界面设计
    五、课程设计总结
    六、参考文献
    七、附录

    一.系统背景

    图书馆信息管理系统数据库用以收集、存储书籍信息、人员(读者、图书管理员)信息、图书借阅信息以及意外处理信息,及时记录存储各个环节信息的变更,以便管理、查询、显示、输出,节约大量人力物力把人们从繁杂的手工记录方式中解脱出来的同时,有力保障图书馆日常事务的高效运作。

    二.需求分析

    (一)系统综合需求

    作为一个图书管理系统,应该给用户提供方便、友好而简洁的界面进行应用,以便于收集图书信息。
    对于图书管理来说,分为读者和图书,要实现的功能有管理和查询图书信息,读者的借还书信息,以及借书逾期或者丢失的罚款处理。
    读者的基本数据有图书证号,姓名,性别,单位,借书日期,还书日期。
    图书的基本数据有书籍编号,书籍名称,作者,出版社,购买日期,借阅次数,状态(是/否借出、库存)。还有基本数据罚款金额。
    此外,一个成熟的管理系统不仅应该具有基本的处理、查询功能,还应该有一些分析、后台监控的功能。应该限制用户对数据的访问范围,限制用户操作级别(普通用户、管理员),限制对数据表修改权限。
    最后,要求在进行设计系统中同时注意性能要求,响应各种操作的时间尽可能少。

    (二)系统逻辑模型

    1.数据流图

    在这里插入图片描述

    2.数据字典

    在这里插入图片描述

    三.系统设计

    (一)概念结构设计

    在这里插入图片描述

    (二)逻辑结构设计

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    部分表关系图:
    在这里插入图片描述

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

    在这里插入图片描述
    系统设置二种权限:读者和管理员。登陆后,可以进入不同的功能模块,在登陆界面可以修改登陆密码。子模块划分如下:

    • 借书(需要权限:读者)
      读者在输入账号密码登录以后,填写姓名性别单位,进行借书,填写借书时间,借书日期,还书时间,然后经过管理员同意,便可借书成功。
      在这里插入图片描述
    • 还书(需要权限:读者)
      读者登陆系统进行还书,管理员接受到还书信息,查看是否逾期,不逾期就直接还书成功,逾期进行罚款处理,管理员发布罚款信息。
      在这里插入图片描述
    • 交罚款(需要权限:读者)
      管理员发布罚款信息后,读者接受信息,进行确认是否补交罚款,不补交就停止读者借书功能,补交成功后恢复借书功能。
      在这里插入图片描述
    • 管理图书信息(需要权限:管理员)
      管理员登录系统,对未录入的图书填写图书的书籍编号,书籍名称,作者,出版社,购买日期,借阅次数,状态等,对已录入的图书修改借阅次数及状态。
      在这里插入图片描述
    • 管理借书信息(需要权限:管理员)
      管理员登录系统,查看到读者发送的借书信息,根据读者是否有罚款未交来判断是否借给读者,借给读者后,修改图书借阅次数及状态。
      在这里插入图片描述
    • 管理罚款信息(需要权限:管理员)
      管理员查看读者还书信息,对比读者借书日期及时间,查看是否逾期,不逾期,则修改图书借阅状态,还书成功,逾期就给读者发送罚款信息,读者进行罚款补交。
      在这里插入图片描述

    四.详细设计

    (一)开发工具及平台

    • 开发工具 Microsoft Visual Studio 2019
    • DBMS: Microsoft SQL Server 2005
    • 建模工具: Microsoft Visual Studio 2019
      说明:用Microsoft Visual Studio 2019实现用户界面设计,再连接SQL Server 2005数据库中的内容,部分算法实现来源于www.csdn.net。

    (二)数据库存储过程

    • 读者信息表
      create table Reader
      (
      id varchar(20),
      name varchar(20),
      sex varchar(20),
      workplace varchar(20),
      B_date datetime,
      R_date datetime,
      )

    • 图书信息表
      create table Book
      (
      book_num varchar(20),
      book_name varchar(20),
      Book_writer varchar(20) not null,
      Book_house varchar(20),
      Book_time datetime,
      Book_sum int,
      Book_state int,
      )

    • 触发器:读者借书后,自动增长借阅次数
      alter trigger Book
      on Borrow for insert
      as begin
      declare @book_id varchar(20)
      declare @id varchar(20)
      select @book_id=book_id,@id=sum
      from inserted
      update Book set book_sum=book_sum-1 where @book_id=id
      end
      go

    (三)应用程序设计

    系统采用MFC对话框应用程序以方便开发,MFC对常用API做了很好的封装。每个对话框对应一个类,每个数据库表对应一个类。
    void CAppDlg::OnBnClickedButton1()
    {
    CString sun, spwd;
    GetDlgItemText(IDC_EDIT1, sun);
    GetDlgItemText(IDC_EDIT2, spwd);
    BOOL isSuccess = !sun.CompareNoCase(_T(“admin”))
    && !spwd.CompareNoCase(_T(“201314”));
    if (isSuccess)
    {
    ShowWindow(SW_HIDE);
    M m;
    m.DoModal();
    }
    else
    {
    MessageBox(_T(“爬”));
    }
    }

    (四)用户界面设计

    • 登录界面
      在这里插入图片描述
    • 读者界面
      在这里插入图片描述
    • 管理员界面
      在这里插入图片描述
    • 罚款界面
      在这里插入图片描述

    五.课程设计总结

    这在本次的设计过程中,首先必须要清楚我们所需要的设计的图书管理系统的结构。一个完善的图书管理系统所需要的基本模块都必须要先设计好才能让我们的设计过程不会被各种突然遇到的问题打断。
    而在本次的锻炼实践中,我们也得到了从理论到实践的机会。在课程中学到的很多东西都可以有所得,有所悟,而不只是单纯的纸上谈兵。
    同时,借此机会,我们也学到了很多课堂上学不到的东西,掌握了许多实用的工具,例如学会了SQL Server的基本使用,Visual Stdio 2019 的基本使用,它们都是非常有用的工具,不仅仅是在课堂作业中,更会在我们日后的职业生涯中有着不可估摸的作用。其次本次系统的设计也对我学习用户界面设计有所启发,一个系统不仅仅需要具有合理的功能模块设计,而且也需要有更加人性化的界面设计,便于用户学习使用和掌握,这样才能使系统能够让更多的人接受!

    六.参考文献

    1. MATTISON R. Web仓库工程与知识管理. 高军,等,译. 北京: 清华大学出版社, 2003.
    2. INMON W H. 数据仓库. 王志海,等,译. 北京: 机械工业出版社, 2000.
    3. INMON W H, et al. 数据仓库管理. 王天佑,译. 北京: 电子工业出版社, 2000.
    4. IMHOFF C, et al. 数据仓库设计. 于戈,等,译. 北京: 机械工业出版社, 2004.
    5. KRISH K. Data Warehousing in the Age of the Big Date. Morgan Kaufmann, 2013.
    展开全文
  • 本次资源为南阳理工学院大二下学期完成的数据库课程设计,主要是基于高校图书管理系统。具体内容有系统需求分析(引言、系统最终用户介绍、安全性和完整性要求、数据字典、数据流图分析、分析总结)和概念设计(概念...
  • 4.2.1数据库设计 12 4.2.2数据库表设计 13 4.2.3系统结构设计 14 第5章 系统实现与测试 16 5.1管理员功能实现 16 5.1.1登录首页 16 5.1.2后台管理主界面 16 5.1.3会员管理 17 5.1.4图书管理 17 5.1.5网站信息管理 18...
  • 数据库原理课程设计-图书管理系统(附源代码) 一、需求分析 二、概念结构设计 三、逻辑结构设计 四、数据库物理设计 五、数据库的实施 六、系统运行结果 七、总结
  • 4.2.4图书管理页面的实现 26 4.2.5座位管理页面的实现 27 4.3日志功能模块 29 4.4安装部署 30 5 系统测试 31 5.1系统调试的目的和意义 31 5.2功能测试用例 32 6总结 33 参考文献: 34 致 谢 35
  • 1.2目前图书管理系统存在的问题 1)检索速度慢、效率低 因为图书馆的藏书种类多、数量多,将藏书准确地分门别类,快速检索,手工进行非常困难往往是终于查到了二伟的信息,馆中没有此书或已被别人借走。图书馆的规模...
  • 1 绪论....3.1 数据库设计. 5 3.1.1 用户E-R图. 5 3.1.2 书籍E-R图. 5 3.1.3 银行账户E-R图. 6 3.1.4 用户信息E-R图. 6 3.1.5 银行账户交易信息E-R图. 7 3.1.6 图书销售记录E-R图. 7 3.1....

    1  绪论. 

    1.1 开发背景. 

    1.2 开发目的和意义. 

    1.2.1 开发目的. 

    1.2.2开发意义. 

    2  系统分析. 

    2.1 需求分析. 

    2.2 可行性分析. 

    3  系统概要设计. 

    3.1 数据库设计. 

    3.1.1 用户E-R图. 

    3.1.2 书籍E-R图. 

    3.1.3 银行账户E-R图. 

    3.1.4 用户信息E-R图. 

    3.1.5 银行账户交易信息E-R图. 

    3.1.6 图书销售记录E-R图. 

    3.1.7 总体E-R图. 

    3.2数据库实现. 

    3.2.1 账户密码表. 

    3.2.2 书籍表. 

    3.2.3 书籍统计表. 

    3.2.4 用户信息表. 

    3.2.5 银行账户信息表. 

    3.2.6 银行卡交易信息表. 

    4  数据库对象及源代码. 

    4.1 数据表的限制. 

    4.2 管理员重置学生用户密码的游标. 

    4.3 删除用户的存储过程. 

    4.4 随机命名账号的函数. 

    4.5 银行账户交易触发器. 

    4.6 查询学生用户视图. 

    4.7 书号序列.

    5  系统详细设计. 

    5.1 排队系统. 

    5.2 登录注册功能模块. 

    5.3 用户界面. 

    5.3.1 借书界面. 

    5.3.2 信息管理界面. 

    5.3.3 账户管理界面. 

    5.4 管理员界面. 

    5.4.1 书籍管理. 

    5.4.2 用户管理. 

    6  功能汇总.

     

    绪论

    1.1 开发背景

    基于电子化信息技术的发展,信息技术已经影响到人类生活和学习的方方面面,而对于大学生这个特殊的群体,生活中的信息化也应用的日益广泛。随着大学生人数的不断的增加,图书馆针对于图书管理的手工记录的模式的局限性也越发突出。这篇博客主要是基于Oracle数据库的图书管理系统,应用了信息化的管理图书的模式,对于用户和书籍等信息进行管理和维护,使复杂的手工管理变得信息化与智能化。

    图书管理系统通过计算机信息管理技术的应用,除了使得工序上简化,从而减轻了工作量,缓解工作负担,更重要的是建立一个智能化的自助服务平台,确保信息的通畅与沟通渠道的通顺,提供准确信息的管理与维护,以及及时对信息进行智能化的处理。

    1.2 开发目的和意义

    1.2.1 开发目的

    随着大学生人数的众多以及对于书籍的需求量日益扩大化,需要一个更为人性化和信息化的管理软件对图书、用户信息进行管理与维护。因而设计一款合理的图书管理系统,可以提高工作效率,缓解工作压力,有效的对信息进行处理,确保信息的正确性与沟通渠道的通畅。

    通过基于Oracle数据库的图书管理系统,熟悉掌握Oracle Database 11g和Java等工具软件,并且在实现连接数据库时熟悉掌握Oracle Database 11g数据库的简单查询和高级查询语句、存储过程、触发器、视图等,掌握索引、游标、序列等。在软件开发生命周期的过程中,系统地掌握需求分析、数据库设计、代码实现和软件测试等开发流程,提高对于Oracle Database 11g的认识和软件实际开发的能力与水平。

    1.2.2开发意义

    通过使用Oracle Database 11g和Java开发工具,将优化图书管理系统,进行信息化的用户、图书等信息的管理与维护,将进一步优化图书管理人工的工作量和工作任务,在相当大的程度上代替了人工作业,从而减少了人员工作量,减少工作中因为人为原因而产生的错误从而避免不必要的损失,并且能够在图书管理系统中建立准确畅通、简便的信息流通渠道,为工作的准确性和信息的安全性和信息化建立一个必要连接途径。

    基于Oracle Database 11g开发来说,在程序开发过程中,能够熟悉Oracle数据库的连接以及使用方法,掌握Oracle数据库的开发特性,方便日后对于数据库开发的应用。

     

    系统分析

    2.1 需求分析

    基于Oracle Database 11g的图书管理系统在提高信息化水平具有重要作用,而这一系统开发的目的主要为提高管理效果,提供智能化服务平台。通过对于数据信息的整理、收集、统计、分析,实现了对于图书、用户信息管理的简单规划,提高了工作效率,改善用户体验。

    通过系统需求分析,确定了图书管理系统的主要包括以下功能:

    (1)排队管理功能

    当进入到图书管理系统之前,进行排队系统,确定进入图书管理系统前用户的顺序性,保证信息的流畅。

    (2)登录管理功能

    用户需注册合法账号后方可登录到图书管理系统,用户共分为两种角色:学生和管理员。管理员可以管理学生的信息和图书的信息,可以调整书籍的数量和名称等具体信息,学生可对自身的详细信息进行管理,并能够借书和购书。

    (3)用户管理功能

    管理员登录后,查询学生账号密码后,可进行增加用户,修改用户密码和删除用户操作。

    (4)图书管理功能

    管理员登录后,查询相关书籍信息,可添加书籍并显示在学生用户的借书界面,修改书籍信息,删除书籍信息等操作。

    (5)借书购书管理功能

    学生用户登录后,查询到管理员添加的书籍后,选择相应的书籍,确定数量,可以借阅书籍和购买书籍,而借阅时间到期后可以自主进行还书操作。

    (6)学生信息管理功能

    学生用户登录后,可添加修改查询自己的个人信息,并且可以添加虚拟银行账户信息,并对账户信息进行增加、修改、删除操作。

    2.2 可行性分析

    在新系统的开发之前,要进行系统的可行性研究,主要包括技术可行性、经济可行性和社会可行性等3个方面。

    技术可行性研究

    技术发展是当今时代经济进步的一大表现,先进的软件技术、数据库技术和网络技术作为计算机技术的主要部分已在现今时代进行广泛的发展,这为本系统的开发提供了技术后盾。本系统采用基于Oracle Database 11g和Java软件的图书管理信息系统架构,开发环境采用微软公司的Eclipse,数据库选择微软公司的Oracle Database 11g,应用成熟的技术增加计算机软件技术可行性。

     

    系统概要设计

    3.1 数据库设计

    根据需求分析得到数据库设计,可得到该系统的E-R图。

    3.1.1 用户E-R图

    图3.1-1 用户E-R图

    3.1.2 书籍E-R图

    图3.1-2 书籍E-R图

    3.1.3 银行账户E-R图

    图3.1-3 银行账户E-R图

    3.1.4 用户信息E-R图

    图3.1-4 用户信息E-R图

    3.1.5 银行账户交易信息E-R图

    图3.1-5 银行账户交易信息E-R图

    3.1.6 图书销售记录E-R图

    图3.1-6 图书销售记录E-R图

    3.1.7 总体E-R图

    图3.1-7 总体E-R图

    3.2数据库实现

    根据数据库概念设计,将E-R图转换成为关系模型,数据库包括以下6个表:账户密码表userinfo,书籍表bookinfo,书籍统计表returnrecord,用户信息表customer,银行账户信息表cardinfo,银行交易信息表traninfo。

    3.2.1 账户密码表

    账户密码表包括卡号、密码和身份。

    建表代码如下:

    create table userinfo(
    
      username varchar2(20),
    
      password varchar2(20),
    
      identity varchar2(10),
    
      constraints pk_username primary key(username)
    
    );

    3.2.2 书籍表

    书籍表包括书号、类别、书名、作者、出版社、定价、进价、库存。

    建表代码如下:

    create table bookinfo (
    
      bookid varchar2(20) not null,
    
      category varchar2(20),
    
      bookname varchar2(50) not null,
    
      author varchar2(30),
    
      press varchar2(30),
    
      bid numeric(4,2),
    
      price numeric(4,2),
    
      storage int,
    
      constraints pk_book_id primary key(bookid)
    
    );

    3.2.3 书籍统计表

    书籍统计表包括书号、书名、定价、进价、数量、总价、购买日期、返还日期。

    建表代码如下:

    create table returnrecord (
    
      bookid varchar2(20) not null,
    
      bookname varchar2(50) not null,
    
      bid numeric(4,2),
    
      price numeric(4,2),
    
      quantity int not null,
    
      totalquantity numeric(8,2),
    
      buydate date not null,
    
      returndate date not null,
    
      constraints fk_sellrecord_bookid foreign key (bookid) references bookinfo (bookid)
    
    );

    3.2.4 用户信息表

    用户信息表包括账号、用户编号、用户名、身份证号、联系电话、地址。

    建表代码如下:

    create table customer(
    
      username varchar2(20),
    
      customerID number(4) not  null,
    
      customerName varchar2(20) not null,
    
      pid varchar2(18) not null,
    
      telephone varchar2(13) not null,
    
      address varchar2(50),
    
      constraints pk_customer_id primary key(customerID),
    
      constraints fk_customer_username foreign key (username) references userinfo (username)
    
    );

    3.2.5 银行账户信息表

    银行账户信息表包括卡号、货币类型、开户日期、开户金额、余额、账号。

    建表代码如下:

    create table cardinfo(
    
      cardID varchar2(20),
    
      curType varchar2(20),
    
      openDate varchar2(50),
    
      openMoney number(8),
    
      balance number(8),
    
      username varchar2(20)
    
    );

    3.2.6 银行卡交易信息表

    银行卡交易信息表包括交易日期、卡号、交易类型、交易金额、账号。

    建表代码如下:

    create table traninfo(
    
      transDate varchar2(20),
    
      cardID varchar2(20),
    
      transType varchar2(20),
    
      transMoney number(4),
    
      username varchar2(20)
    
    );

     

     

    数据库对象及源代码

    由于Oracle Database 11g提供了存储过程、触发器、游标、索引、函数等功能,在数据库对象模块进行如下的分析:

    4.1 数据表的限制

    alter table bookinfo modify(press varchar2(50));
    
    alter table bookinfo modify(bookname varchar2(100));
    
    alter table cardinfo
    
      add constraints pk_card_id primary key(username);
    
    
    
    alter table traninfo
    
      add constraints pk_card_username primary key(username)
    
      add constraint fk_cardID foreign key(username) references cardinfo(username)
    
      add constraint ck_transType check(transType in('收入','支出'))
    
      add constraint ck_transMoney check(transMoney>0);
    
    
    
    create unique index username_index on userinfo(username);

    4.2 管理员重置学生用户密码的游标

    declare
    
      cursor cursor_userinfo is
    
      select password from userinfo where identity='学生' for update;
    
      v_pwd userinfo.password%type;
    
    begin
    
      open cursor_userinfo;
    
      loop
    
        fetch cursor_userinfo into v_pwd;
    
        exit when cursor_userinfo%NOTFOUND;
    
          update userinfo set password=123 where current of cursor_userinfo;
    
      end loop;
    
      close cursor_userinfo;
    
    end;
    
    /

    4.3 删除用户的存储过程

    create or replace procedure proc_deluser(
    
      temp_username varchar2,
    
      temp_pass varchar2
    
    )
    
    as
    
      not_data_found EXCEPTION;
    
      num NUMBER:=0;
    
    begin
    
      select count(*) into num from userinfo where username=temp_username and password=temp_pass;
    
      if num>0 then
    
      delete from userinfo where username=temp_username;
    
      else
    
         RAISE not_data_found;
    
      end if;
    
         EXCEPTION
    
           when not_data_found then
    
           dbms_output.put_line('该账户不存在!');
    
    end;
    
    /

    4.4 随机命名账号的函数

    create or replace function random_username
    
      return varchar2
    
      as
    
        user_name varchar2(20):='2013 0000';
    
        tem char(5);
    
        re_username number:=0;
    
    begin
    
      loop
    
        tem:=to_char(dbms_random.value(1000,9999),'0000');
    
        user_name:=user_name||tem;
    
        tem:=to_char(dbms_random.value(1000,9999),'0000');
    
        user_name:=user_name||tem;
    
        select count(*) into re_username from userinfo where username=user_name;
    
        exit when re_username=0;
    
      end loop;
    
      return user_name;
    
    end;
    
    /

    4.5 银行账户交易触发器

    create or replace trigger tri_translation
    
      before insert or update
    
    on traninfo for each row
    
    declare
    
      my_balance NUMBER;
    
      rate_exception EXCEPTION;
    
    begin
    
      select balance into my_balance from cardinfo where username=:NEW.username;
    
      if :NEW.transType='支出' then
    
         if my_balance<:NEW.transMoney-1 then
    
            dbms_output.put_line('对不起余额不足!');
    
            return;
    
         elsif my_balance<:NEW.transMoney-1 then
    
            update cardinfo set balance=balance-:NEW.transMoney where username=:NEW.username;
    
         end if;
    
      elsif :NEW.transType='收入' then
    
         update cardinfo set balance=balance+:NEW.transMoney where username=:NEW.username;
    
      end if;
    
      dbms_output.put_line('交易成功!');
    
      EXCEPTION
    
          WHEN rate_exception then
    
            RAISE_APPLICATION_ERROR(-20001,'交易失败!');
    
    end;
    
    /

    4.6 查询学生用户视图

    create or replace view view_username
    
    as
    
      select username as 用户名,password as 密码 from userinfo  where identity='学生';

    4.7 书号序列

    create sequence sequence_bookid
    
       start with 1001
    
       increment by 1;

     

     

    系统详细设计

    根据Oracle Database 11g数据库设计,将确定系统详细设计。按功能模块具体划分为如下:

    5.1 排队系统

    在进入到图书管理系统之前将进行排队操作,使用Java线程实现功能,具体运行结果如下图所示:

    这个就是类似于之前的银行系统中的排队取号,所以我只改了改界面。哈哈哈哈哈哈

    图5-1 排队系统

    排队系统模拟进入图书馆的排队功能,使用Java线程完成的,在排队系统使用时间线程不断获取当前的时间,并显示在排队系统的主窗体中,学生需排队进入到图书馆中,主要实现的Java代码:

    //调用时间类
    NowTime time = new NowTime();
    time.addComponent(); 
    time.showTime();
    //调用线程
    public void run() {
    	BankWaiting.this.dispose();
    	new LoginBegin("图书管理系统");
    }

    5.2 登录注册功能模块

    排队进入之后,将进入到登录功能模块,若没有合法账户,需要注册合法账户后登录,若有合法账户直接登录,通过判断身份的不通,可分别进入到相应权限的学生用户和管理员身份,具体运行结果如下图所示:

    图5-2 登录界面

    当用户进入到登录注册页面时,将显示相应的窗体布局,程序main中调用Java皮肤,并插入背景图片,主要代码如下:

    //图片存放路径为images文件夹下的login.jpg图片
    
    private JLabel img = new JLabel(new ImageIcon("images/login.jpg"));
    
    //为登录界面天界背景图片
    
                 this.img.setBounds(0, 0, 560, 480);
    
                 this.add(img);

    在登录调用proc_login存储过程,实现判断用户名是否存在和密码是否与正确密码一致,验证成功后,可登录到主界面。

    图5-3 注册界面

    注册界面,调用存储过程proc_user,判断用户名是否存在,若不存在重名时,且密码与确认密码一致时可通过验证,实现对于账号的成功注册,并可返回到登录界面,实现对于系统的登录。

    5.3 用户界面

    当用户通过身份验证之后,选择身份为“学生”,登录到学生用户界面,可以进行书籍借阅与购买功能模块,个人信息管理功能模块和个人虚拟银行账户管理功能模块,主界面运行结果如下图所示:

    图5-4 用户主界面

    当用户登录进入之后,可通过查询按钮,查询所有的书籍,也可通过“书名”、“作者”查询相应的书籍,并显示在Java程序界面的中间部分。

    5.3.1 借书界面

    借书界面可以通过查询查看到所有书籍信息,在下部的按钮“借入书籍”、“购买书籍”、“归还书籍”和“退出系统”的监听器中可以实现相应的功能。当选择一本书进行借入、购入时,则书籍数量相应减少,同时将扣除银行账户的金额,归还书籍时,则书籍数量增加,具体运行结果如下图所示:

    图5-5 借入界面

    当用户选中一行记录后,可以进行确认,判断用户是否借入操作,核心代码如下:

    if(row == -1) {
    
                JOptionPane.showMessageDialog(dialog, "请选中一行数据!");
    
               return;
    
             }else {
    
                    if( arg0.getSource() == dialog.getBtnSell() &&
    
                                  JOptionPane.showConfirmDialog(dialog, "确定借入吗?", "提示", 2) == 0) {
    
                           SelectNum sDialog = new SelectNum(dialog, "借入", true,"借入");
    
                          this.initSellBookDialog(sDialog);
    
                    }
    
             }

    图5-6 确认借入信息

    当用户确认借书时,可输入借入的数量,而书号、书名、作者、单价不可以进行修改,确认借入数量后,可修改数据库中的信息,并将库存减少一本,借入书籍时调用存储过程proc_borrow,实现对于判断库存和书号进行书籍的借入。

    图5-7 购入书籍界面

    用户在确认书籍信息后,可购买书籍,购买书籍时库存同时进行相应的变化,并能够使得用户具有相应的书籍购入记录。定义监听器类,实现当点击“确定”按钮时可以进行相应的监听器的应答策略。

    图5-8 还书界面

    用户可以对已借入满30天的书籍进行还书操作,当进行还书操作后可对书籍的原有库存进行增加操作。

    5.3.2 信息管理界面

    用户信息界面可增加用户个人信息,同时可对用户账号进行挂失,挂失后需要持本人学生证到图书馆取证。

    图5-9 信息管理界面

    用户信息界面,用户可以通过点击查询按钮进行所有信息的查询,也可以通过索引进行查询,用户可添加一条自己相关的详细信息,由于用户名为主键,所有具有唯一性,一个用户只可以添加一条详细的信息记录。

    图5-10 挂失界面

    用户在借书证丢失之后可以通过挂失,提示管理员对用户借书证进行补办,并提示用户可持本人学生去图书管理领取。

    图5-11 图书馆取证界面

    5.3.3 账户管理界面

    账户管理界面,用户可根据自身需要增加虚拟银行账户,进行资产虚拟化管理,当购买书籍时,需对自身所支付的金额进行虚拟记账,记录用户购买书籍的花销。用户同时可以对虚拟银行账户进行修改和删除,同时通过触发器tri_translation进行交易金额的记录。具体运行结果如下图所示:

    图5-12 开户界面

    用户可以自行添加虚拟银行账户,用户记录书籍购买的耗费信息,确定相应的信息,可以实现增加的操作,并显示在Java程序的主体中。

    图5-13 修改银行账户信息界面

    用户在修改信息时,触发触发器,不能对卡号进行修改,其余信息可以进行修改,当用户修改银行账户信息之后,可以实现更新信息,并显示在Java的程序中。

    图5-14 删除银行账户界面

    5.4 管理员界面

    当用户通过身份验证之后,选择身份为“管理员”,登录到管理员界面,可以进行书籍管理与用户管理功能模块,主界面运行结果如下图所示:

    图5-15 管理员界面

    用户可以通过管理员身份登录到管理员用户主界面,进行对于用户信息和书籍的管理,通过点击相应的按钮可以进行相关的操作。

    5.4.1 书籍管理

    在书籍管理模块中,管理员可对书籍进行管理,增加书籍、修改书籍信息和删除书籍,增加的书籍信息会显示在普通用户借书模块中,对于已经删除了的信息将无法进行查看,对于存在借阅记录的书籍不能执行删除操作,具体运行结果如下图所示:

    图5-16 书籍管理界面

    当增加书籍信息时,管理员通过向bookinfo表中插入相关的数据,并显示在页面中,调用proc_addbook和porc_updatebook存储过程,可以实现相关的操作。

    图5-17 修改图书信息界面

    图5-18 删除图书界面

    管理员删除书籍时,触发tri_storage触发器,当库存不等于0时,不能对书籍进行删除操作,且当用户存在借阅时,也不可以进行书籍的删除操作。

    5.4.2 用户管理

    当进行用户管理操作时,管理员可通过查询按钮显示所有用户信息,通过下部的“修改密码”、“添加用户”、“删除用户”等按钮的监听器类实现相应的操作,在修改密码时通过触发器判断两次密码是否一致,当输入的两次密码一致时方可修改密码成功,具体运行结果如下图所示:

    图5-19 用户管理界面

    图5-20 修改密码界面

    当管理员修改用户密码时,调用proc_pass存储过程,判断账号是否存在,当账号存在时,判断原密码输入是否正确,且判断新密码和确认密码是否一致,通过全部验证后,管理员可成功修改用户的密码。

    图5-21 删除用户界面

    当管理员删除用户时,判断用户是否存在图书借阅记录,若存在未还书籍,不可以对用户进行删除,若可以对该用户执行删除操作,确认操作后,该用户相关信息将被级联删除在数据库表中。

     

    6  功能汇总

    通过书写Java代码以及连接Oracle Database 11g数据库,实现了简单的图书管理系统,根据对于数据库的分析,完成了如下工作:

    Java代码

    LibraryManage

    实现了简单的图书管理系统,完成对于学生用户和管理员双重角色的功能实现

    建表

    Library

    实现对于表的建立

    修改表的结构

    alter_table

    实现创建外键,主键以及索引

    存储过程

    proc_deluser

    proc_login

    proc_pass

    proc_user

    实现了创建存储过程,分别用于删除用户、登录验证、修改密码验证和用户名验证

    函数

    Random_username

    实现了随机产生用户名

    序列

    Sequence_customID

    Sequence_bookid

    实现了用户编号和书号的自增

    触发器

    Tri_bookid

    Tri_bookinfo

    Tri_insertbookid

    Tri_storage

    Tri_Sunday

    Tri_translation

    Tri_username

    实现了触发器对于书号、书籍信息、库存、不能周日进行数据库操作、银行交易和用户名不同操作

    视图

    View_username

    实现学生身份的视图创建

     

    展开全文
  • 1.1图书管理系统简介…………………………………………………1 1.2 数据需求……………………………………………………………1 1.3 事务需求……………………………………………………………1 1.4 系统开发平台……...
  • 详细设计主要包括系统数据库访问的实现,主要功能模块的具体实现,模块实现关键代码等。最后对系统进行功能测试,并对测试结果进行分析总结。 包括程序毕设程序源代码一份,数据库一份,完美运行。配置环境里面有...
  • 图书管理系统是以实际运用为开发背景,运用软件工程原理和开发方法,采用JSP技术构建的一个管理系统。整个开发过程首先对软件系统进行需求分析,得出系统的主要功能。接着对系统进行总体设计和详细设计。总体设计...
  • 1.2数据库系统设计目标及具体功能………………………………………4. 2数据库概念结构设计………………………………………………4 2.1实体及属性说明………………………………………………………….4 2.2 E-R图设计...
  • 详细设计主要包括系统数据库访问的实现,主要功能模块的具体实现,模块实现关键代码等。最后对系统进行功能测试,并对测试结果进行分析总结。 包括程序毕设程序源代码一份,数据库一份,完美运行。配置环境里面有...
  • 详细设计主要包括系统数据库访问的实现,主要功能模块的具体实现,模块实现关键代码等。最后对系统进行功能测试,并对测试结果进行分析总结。 包括程序毕设程序源代码一份,数据库一份,完美运行。配置环境里面有...
  • 本论文的第一章简要地综述图书(销售)管理系统的开发背景和实现该系统所需的功能;第二章是对系统的需求进行综合地分析;第三章从系统功能设计、数据库设计和界面设计等方面详细介绍该系统的设计;第四章介绍相关...
  • 院 系 专业 学生姓名 学号 课程名称 数据库原理与设计方法 授课时间 周学时 学分 简 要 评 语 考核论题 图书管理信息数据库系统设计 总评成绩 含平时成绩 备注 任课教师签名 日期 注1.以论文或大作业为考核方式的...
  • Python实现带GUI和连接数据库图书管理系统

    千次阅读 多人点赞 2020-12-04 17:51:01
    文章目录前言二、建立数据库library2.1 book表2.2 borrow表2.3 user表三、各个模块...大三上学期的程序设计实训大作业,挑了其中一个我认为最简单的的《图书管理系统》来写。用python写是因为py有自带的GUI,即tkint


    前言

    大三上学期的程序设计实训大作业,挑了其中一个我认为最简单的的《图书管理系统》来写。用python写是因为py有自带的GUI,即tkinter模块,对初次接触GUI的新手会比较友好。编译器我用的是Pycharm,你需要检查你的编译器是否带了tkinter模块和pymysql模块,没有的话需要下载安装,具体方法可以百度,很简单。界面很丑,凑合看哦!如果你没有了解过tkinter,建议先去知乎,csdn上面搜索自学一下入门教程,这样就比较容易理解我的东西啦!
    ** 特别注意:数据库表是我后来根据记忆建的,可能跟代码中的SQL语句的顺序有出入,实际数据库的字段值属性值顺序按照代码里的为准,修改一下数据库就好啦!代码是没问题的o( ̄︶ ̄)o **
    在这里插入图片描述

    二、建立数据库library

    ** 特别注意:这个表是我后来根据记忆建的,可能跟代码中的SQL语句的顺序有出入,实际数据库的字段值属性值顺序按照代码里的为准,修改一下数据库就好啦!代码是没问题的o( ̄︶ ̄)o **
    在这里插入图片描述
    如图所示,软件是Navicat,给library建表。

    2.1 book表

    存储图书的相关信息,包括书名,作者,类型,数量。主码是name和author。
    在这里插入图片描述

    2.2 borrow表

    借书单,存储借书人ID,书名,作者,借书时间。主码是name和author。
    在这里插入图片描述

    2.3 user表

    使用者,包括ID,password,job是个只有1位的数字,0表示读者,1表示管理员,登录的时候通过检测其job然后选择是跳转到读者界面还是管理员界面。
    在这里插入图片描述

    三、各个模块介绍

    在这里插入图片描述

    3.1 初始界面initial

    import tkinter as tk
    import reader
    import manager
    
    def frame():#初始界面
        global root
        root=tk.Tk()
        root.geometry('900x700')
        root.title('西电图书管理系统')
        lable0=tk.Label(root,text='欢迎来到XDU图书馆',bg='pink',font=('微软雅黑',50)).pack()#上
    	#canvas是个画布,想要插入图片的话首先要定义个canvas
        canvas=tk.Canvas(root,height=500,width=500)#中
        image_file=tk.PhotoImage(file='2.gif')
        #图片文件的后缀必须是.gif,且亲测不能自行鼠标右键重命名更改成.gif,要用win10里内置的画图功能,打开图片然后另存为的时候选择.gif
        #图片文件必须放到你的项目目录里边才有效
        image=canvas.create_image(250,100,image=image_file)
        canvas.place(x=170,y=170)
    
        lable1=tk.Label(root,text='请选择用户类型:',font=('微软雅黑',20)).place(x=80,y=500)#下
        tk.Button(root, text='读  者',font=('微软雅黑',15),width=10, height=2,command=exit_reader).place(x=350, y=420)
        tk.Button(root, text='管理员',font=('微软雅黑',15),width=10, height=2,command=exit_manager).place(x=350, y=550)
    
        root.mainloop()#必须要有这句话,你的页面才会动态刷新循环,否则页面不会显示 
    
    def exit_reader():#跳转至读者界面
        root.destroy()
        reader.frame()
    
    def exit_manager():#跳转至管理员界面
        root.destroy()
        manager.frame()
    
    if __name__ == '__main__':
        frame()
    
    

    在这里插入图片描述
    效果就是上面这样的。
    这个初始界面就比较简单,点击读者跳转到读者界面,点击管理员跳转到管理员界面。

    3.2 manager登录注册模块

    当我们从初始界面选择“管理员”,那么这时候调用exit_manager()函数,来到了管理员界面

    import tkinter as tk
    import tkinter.messagebox as msg #这个是会弹出一个警告/提示小框
    import initial
    import pymysql
    import ID
    
    def frame():#管理员界面
        global root
        root= tk.Tk()
        root.geometry('900x700')
        root.title('西电图书管理系统')
        lable0 = tk.Label(root, text='管理员登录', bg='pink', font=('微软雅黑', 50)).pack()  # 上
    
        canvas = tk.Canvas(root, height=500, width=500)  # 中
        image_file = tk.PhotoImage(file='2.gif')
        image = canvas.create_image(250, 100, image=image_file)
        canvas.place(x=190, y=170)
    
        lable1 = tk.Label(root, text='请选择:', font=('微软雅黑', 20)).place(x=80, y=400)  # 下
        tk.Button(root, text='登录', font=('微软雅黑', 15), width=10, height=2, command=login).place(x=150, y=500)
        tk.Button(root, text='注册', font=('微软雅黑', 15), width=10, height=2, command=register).place(x=350, y=500)
        tk.Button(root, text='退出', font=('微软雅黑', 15), width=10, height=2, command=exit_manager).place(x=550, y=500)
        root.mainloop()
    
    def login():#登录小窗口
        global root1
        root1=tk.Tk()
        root1.wm_attributes('-topmost', 1)#将登录窗口置顶不至于被遮到下面
        root1.title('管理员登录')
        root1.geometry('500x300')
    
        lable1 = tk.Label(root1, text='账号:', font=25).place(x=100,y=50)
        lable2 = tk.Label(root1, text='密码:', font=25).place(x=100, y=100)
    
        global entry_name, entry_key
        name=tk.StringVar()
        key = tk.StringVar()
    
        entry_name = tk.Entry(root1, textvariable=name, font=25)
        entry_name.place(x=180, y=50)
        entry_key = tk.Entry(root1, textvariable=key, font=25,show='*')
        entry_key.place(x=180,y=100)
        # 百度:tkinter要求由按钮(或者其它的插件)触发的控制器函数不能含有参数,若要给函数传递参数,需要在函数前添加lambda:
        button1 = tk.Button(root1, text='确定', height=2, width=10, command=lambda: ID.id_check('1'))
        button1.place(x=210, y=180)
    #当我们输入账号和密码,点击确定时候,会调用ID模块里的id_check()函数,1是参数,表示其身份是管理员
    def register():#注册小窗口
        global root2
        root2 = tk.Tk()
        root2.wm_attributes('-topmost', 1)
        root2.title('管理员注册')
        root2.geometry('500x300')
    
        lable1 = tk.Label(root2, text='账号:', font=25).place(x=100, y=50)
        lable2 = tk.Label(root2, text='密码:', font=25).place(x=100, y=100)
        lable2 = tk.Label(root2, text='确认密码:', font=25).place(x=80, y=150)
    
        global entry_name, entry_key, entry_confirm
        name = tk.StringVar()
        key = tk.StringVar()
        confirm = tk.StringVar()
        entry_name = tk.Entry(root2, textvariable=name, font=25)
        entry_name.place(x=180, y=50)
        entry_key = tk.Entry(root2, textvariable=key, font=25, show='*')
        entry_key.place(x=180, y=100)
        entry_confirm = tk.Entry(root2, textvariable=confirm,font=25, show='*')
        entry_confirm.place(x=180, y=150)
        # 百度:tkinter要求由按钮(或者其它的插件)触发的控制器函数不能含有参数,若要给函数传递参数,需要在函数前添加lambda:
        button1 = tk.Button(root2, text='确定', height=2, width=10, command=lambda: ID.id_write('1'))
        button1.place(x=210, y=200)
    #当我们点击确定的时候,会调用ID模块里的id_write()函数,1是参数,表示其身份是管理员
    def exit_manager():#退出管理员界面,跳转至初始界面
        root.destroy()
        initial.frame()
    
    

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

    3.3 ID模块

    ID模块相当于后端了,主要实现连接数据库,检查账号的有无,核对密码,注册等功能。

    import tkinter as tk
    import tkinter.messagebox as msg
    import pymysql
    import initial
    import manager
    import reader
    import m_operation
    import r_operation
    def id_check(a):#检查账号
        global id
        if a == '1':#在管理员界面下登录,参数是1
        #把账号/密码框框里输入的字符串赋值给id/password
            id = manager.entry_name.get()
            password = manager.entry_key.get()
        else:#在读者界面下登录,参数是0
            id = reader.entry_name.get()
            password = reader.entry_key.get()
        getid()#最后得到id
        #连接数据库,root是你数据库的用户名,应该是默认的是root,qwer是你数据库的密码,library是你要连接的数据库名字
        db = pymysql.connect("localhost", "root", "qwer", "library")
        #建立游标cursor,这个游标可以类比指针,这样理解比较直观
        cursor = db.cursor()
        sql = "SELECT password FROM user WHERE id='%s' AND job='%s'" % (id,a)
        cursor.execute(sql) #sql语句被执行
        result = cursor.fetchone()#得到的结果返回给result数组
        if result:#如果查询到了账号存在
                if password == result[0]:#result[0]是数组中的第一个结果
                    success_login(a)#密码对上了,进入对应的读者/管理员操作界面
                else:#有账号但密码没对上
                   msg._show(title='错误!',message='账号或密码输入错误!')
        else:#没有账号
            msg._show(title='错误!',message='您输入的用户不存在!请先注册!')
            if a=='1':
                manager.root1.destroy()#关闭登录小窗口,回到管理员界面
            elif a=='0':
                reader.root1.destroy()
        db.close()#查询完一定要关闭数据库啊
    
    def success_login(a):#成功登录
        if a == '1':
            manager.root1.destroy()
            m_operation.frame()#销毁登录注册界面,跳转到管理员的操作界面
    
        elif a == '0':
            reader.root1.destroy()
            r_operation.frame()#销毁登录注册界面,跳转到读者的操作界面
    
    def id_write(a):#写入(注册)账号
        db = pymysql.connect("localhost", "root", "qwer", "library")
        cursor = db.cursor()
        if a=='1':#跟check函数里边十分类似
            id = manager.entry_name.get()#得到输入的账号
            password = manager.entry_key.get()#得到输入的密码
            confirm = manager.entry_confirm.get()#得到输入的确认密码
        elif a=='0':
            id = reader.entry_name.get()
            password = reader.entry_key.get()
            confirm = reader.entry_confirm.get()
    
        sql0 = "SELECT id FROM user WHERE id='%s' AND job='%s'" % (id,a)
        sql1 = "INSERT INTO user VALUES(%s,%s,%s) " % (id, password, a)
    #首先检查两次输入的密码是否一致,一致后再检查注册的账号是否已经存在
        if password == confirm:
            cursor.execute(sql0)
            result = cursor.fetchone()
            if result:
                msg.showerror(title='错误!', message='该账号已被注册,请重新输入!')
            else:
                cursor.execute(sql1)
                db.commit()
                db.close()
                msg.showinfo(title='成功!', message='注册成功,请登录!')
    
        else:
            msg.showerror(title='错误!', message='两次密码不一致,请重新输入!')
    
    def getid():
        return id
    

    3.4 reader登录注册模块

    同2.2,如法炮(pao二声)制。
    (咳咳学好语文也好重要呀!)

    import tkinter as tk
    import initial
    import ID
    def frame():
        global root
        root= tk.Tk()
        root.geometry('900x700')
        root.title('西电图书管理系统')
        lable0 = tk.Label(root, text='读者登录', bg='pink', font=('微软雅黑', 50)).pack()  # 上
    
        canvas = tk.Canvas(root, height=500, width=500)  # 中
        image_file = tk.PhotoImage(file='2.gif')
        image = canvas.create_image(250, 100, image=image_file)
        canvas.place(x=190, y=170)
    
        lable1 = tk.Label(root, text='请选择:', font=('微软雅黑', 20)).place(x=80, y=400)  # 下
        tk.Button(root, text='登录', font=('微软雅黑', 15), width=10, height=2, command=login).place(x=150, y=500)
        tk.Button(root, text='注册', font=('微软雅黑', 15), width=10, height=2, command=register).place(x=350, y=500)
        tk.Button(root, text='退出', font=('微软雅黑', 15), width=10, height=2, command=exit_reader).place(x=550, y=500)
        root.mainloop()
    
    def login():
        global root1
        root1=tk.Tk()
        root1.wm_attributes('-topmost', 1)
        root1.title('读者登录')
        root1.geometry('500x300')
    
        lable1 = tk.Label(root1, text='账号:', font=25).place(x=100, y=50)
        lable2 = tk.Label(root1, text='密码:', font=25).place(x=100, y=100)
    
        global entry_name, entry_key
        name=tk.StringVar()
        key = tk.StringVar()
    
        entry_name=tk.Entry(root1,textvariable=name,font=25)
        entry_name.place(x=180,y=50)
        entry_key=tk.Entry(root1, textvariable=key, font=25,show='*')
        entry_key.place(x=180,y=100)
        # 百度:tkinter要求由按钮(或者其它的插件)触发的控制器函数不能含有参数,若要给函数传递参数,需要在函数前添加lambda
        button1=tk.Button(root1,text='确定',height=2,width=10,command=lambda :ID.id_check('0'))
        button1.place(x=210,y=180)
    
    def register():
        global root2
        root2 = tk.Tk()
        root2.wm_attributes('-topmost', 1)
        root2.title('读者注册')
        root2.geometry('500x300')
    
        lable1 = tk.Label(root2, text='账号:', font=25).place(x=100, y=50)
        lable2 = tk.Label(root2, text='密码:', font=25).place(x=100, y=100)
        lable2 = tk.Label(root2, text='确认密码:', font=25).place(x=80, y=150)
    
        global entry_name, entry_key, entry_confirm
        name = tk.StringVar()
        key = tk.StringVar()
        confirm = tk.StringVar()
        entry_name = tk.Entry(root2, textvariable=name, font=25)
        entry_name.place(x=180, y=50)
        entry_key = tk.Entry(root2, textvariable=key, font=25, show='*')
        entry_key.place(x=180, y=100)
        entry_confirm = tk.Entry(root2, textvariable=confirm,font=25, show='*')
        entry_confirm.place(x=180, y=150)
        # 百度:tkinter要求由按钮(或者其它的插件)触发的控制器函数不能含有参数,若要给函数传递参数,需要在函数前添加lambda
        button1 = tk.Button(root2, text='确定', height=2, width=10, command=lambda: ID.id_write('0'))
        button1.place(x=210, y=200)
    
    def exit_reader():#退出管理员界面,跳转至初始界面
        root.destroy()
        initial.frame()
    
    

    3.5 m_operation管理员操作界面

    当我们终于成功注册/登录之后,来到了管理员的操作界面。
    在这里插入图片描述

    import tkinter as tk
    import tkinter.messagebox as msg
    import search
    from tkinter import ttk
    import pymysql
    def frame():
        window=tk.Tk()
        window.title('管理员')
        window.geometry('900x700')
        lable0 = tk.Label(window, text='欢迎来到XDU图书馆', bg='pink', font=('微软雅黑', 50)).pack()  # 上
    
        lable1 = tk.Label(window, text='请选择操作:', font=('微软雅黑', 20)).place(x=80, y=400)  # 下
        tk.Button(window, text='进购图书', font=('微软雅黑', 15), width=10, height=2,command=purchase).place(x=350, y=250)
        tk.Button(window, text='注销图书', font=('微软雅黑', 15), width=10, height=2,command=cancel).place(x=350, y=350)
        tk.Button(window, text='信息查询', font=('微软雅黑', 15), width=10, height=2,command=search.frame).place(x=350, y=450)
        window.mainloop()
    
    def purchase():#进购图书
        global win
        win = tk.Tk()
        win.title('管理员')
        win.geometry('900x300')
        win.wm_attributes('-topmost', 1)
        lable1 = tk.Label(win, text='请填写进购图书的信息:', font=('微软雅黑', 20)).place(x=30, y=100)
    
        tk.Label(win, text='图书类目:', font=('宋体', 12)).place(x=30, y=200)
        global list#这个是一个下拉页表项,只能从下面的list['values']里边选
        comvalue = tk.StringVar()
        list = ttk.Combobox(win, textvariable=comvalue, height=10, width=10)
        list.place(x=100, y=200)
        list['values'] = ('全部', '人文', '艺术', '计算机', '科技', '杂志')
        list.current(0)#默认显示'全部'
    
        global b_name
        tk.Label(win, text='书名:', font=('宋体', 12)).place(x=200, y=200)
        b_name = tk.Entry(win, font=('宋体', 12), width=10)
        b_name.place(x=250, y=200)
    
        global author
        tk.Label(win, text='作者:', font=('宋体', 12)).place(x=350, y=200)
        author = tk.Entry(win, font=('宋体', 12), width=10)
        author.place(x=400, y=200)
    
        global price
        tk.Label(win, text='价格:', font=('宋体', 12)).place(x=460, y=200)
        price = tk.Entry(win, font=('宋体', 12), width=10)
        price.place(x=510, y=200)
    
        global amount
        tk.Label(win, text='数量:', font=('宋体', 12)).place(x=560, y=200)
        amount = tk.Entry(win, font=('宋体', 12), width=5)
        amount.place(x=610, y=200)
    
        tk.Button(win, text='确认添加', font=('宋体', 12), width=10, command=add).place(x=700, y=195)
        
    def add():#添加图书信息到数据库中
        sql="INSERT INTO book VALUES('%s','%s','%s','%s','%s')"% (list.get(),b_name.get(),author.get(),price.get(),amount.get())
        db = pymysql.connect("localhost", "root", "qwer", "library")
        cursor = db.cursor()
        cursor.execute(sql)
        db.commit()#这句不可或缺,当我们修改数据完成后必须要确认才能真正作用到数据库里
        db.close()
        msg.showinfo(title='成功!', message='新书已入库!')
    def cancel():#撤销图书
        global win
        win = tk.Tk()
        win.title('管理员')
        win.geometry('900x300')
        win.wm_attributes('-topmost', 1)
        lable1 = tk.Label(win, text='请填写注销图书的信息:', font=('微软雅黑', 20)).place(x=30, y=100)
    
        tk.Label(win, text='图书类目:', font=('宋体', 12)).place(x=30, y=200)
        global list
        comvalue = tk.StringVar()
        list = ttk.Combobox(win, textvariable=comvalue, height=10, width=10)
        list.place(x=100, y=200)
        list['values'] = ('全部', '人文', '艺术', '计算机', '科技', '杂志')
        list.current(0)
    
        global b_name
        tk.Label(win, text='书名:', font=('宋体', 12)).place(x=200, y=200)
        b_name = tk.Entry(win, font=('宋体', 12), width=10)
        b_name.place(x=250, y=200)
    
        global author
        tk.Label(win, text='作者:', font=('宋体', 12)).place(x=350, y=200)
        author = tk.Entry(win, font=('宋体', 12), width=10)
        author.place(x=400, y=200)
    
        tk.Button(win, text='确认注销', font=('宋体', 12), width=10, command=delete).place(x=600, y=195)
    
    def delete():删除图书
        sql = "DELETE FROM book WHERE type='%s' AND name='%s' AND author='%s'" % (list.get(),b_name.get(),author.get())
        db = pymysql.connect("localhost", "root", "qwer", "library")
        cursor = db.cursor()
        cursor.execute(sql)
        db.commit()#这句不可或缺,当我们修改数据完成后必须要确认才能真正作用到数据库里
        msg.showinfo(title='成功!', message='该书已删除!')
    
    

    在这里插入图片描述

    3.6 r_operation读者操作模块

    如2.5,如法炮制。但是要引入py内置的datetime模块

    import tkinter as tk
    import tkinter.messagebox as msg
    from tkinter import ttk
    import search
    import ID
    import datetime as dt#datetime
    import pymysql
    
    def frame():
        window2=tk.Tk()
        window2.title('读者')
        window2.geometry('700x600')
        lable0 = tk.Label(window2, text='欢迎来到XDU图书馆', bg='pink', font=('微软雅黑', 50)).pack()  # 上
    
        lable1 = tk.Label(window2, text='请选择操作:', font=('微软雅黑', 20)).place(x=80, y=400)  # 下
        tk.Button(window2, text=' 借  书', font=('微软雅黑', 15), width=10, height=2,command=borrow).place(x=350, y=250)
        tk.Button(window2, text=' 还  书', font=('微软雅黑', 15), width=10, height=2,command=turnback).place(x=350, y=350)
        tk.Button(window2, text='信息查询', font=('微软雅黑', 15), width=10, height=2,command=search.frame).place(x=350, y=450)
        window2.mainloop()
    
    def borrow():
        global win
        win = tk.Tk()
        win.title('读者')
        win.geometry('900x300')
        win.wm_attributes('-topmost', 1)
        lable1 = tk.Label(win, text='请填写所借图书的信息:(书名作者都要填写正确无误!)', bg='pink',font=('微软雅黑', 20)).place(x=30, y=100)
    
        global b_name
        tk.Label(win, text='书名:', font=('宋体', 12)).place(x=200, y=200)
        b_name = tk.Entry(win, font=('宋体', 12), width=10)
        b_name.place(x=250, y=200)
    
        global author
        tk.Label(win, text='作者:', font=('宋体', 12)).place(x=350, y=200)
        author = tk.Entry(win, font=('宋体', 12), width=10)
        author.place(x=400, y=200)
    
        tk.Button(win, text='确认借书', font=('宋体', 12), width=10, command=confirm_borrow).place(x=600, y=195)
    
    def confirm_borrow():
        db = pymysql.connect("localhost", "root", "qwer", "library")
        cursor = db.cursor()
        sql0="SELECT amount FROM book WHERE name='%s' AND author='%s'" % (b_name.get(),author.get())
        cursor.execute(sql0)
        result=cursor.fetchone()
        if result:
            if result != '0':
                time = dt.datetime.now().strftime('%F')#得到的时间不是字符串型,我们要把时间转化成字符串型
                sql = "INSERT INTO borrow VALUES('%s','%s','%s','%s')" % (ID.getid(),b_name.get(),author.get(),time)
                sql1="UPDATE book SET amount=amount-1 WHERE name='%s' AND author='%s'" % (b_name.get(),author.get())
                cursor.execute(sql)
                cursor.execute(sql1)
                db.commit()
                db.close()
                msg.showinfo(title='成功!', message='借书成功!请一个月之内归还')
            else:
                msg.showinfo(title='失败!', message='您借的书库存不足!')
        else:
            msg.showinfo(title='错误!', message='未找到该书!')
    
    def turnback():#还书
        global win
        win = tk.Tk()
        win.title('读者')
        win.geometry('550x600')
    
        db = pymysql.connect("localhost", "root", "qwer", "library")
        cursor = db.cursor()
        sql0 = "SELECT COUNT(*) FROM borrow WHERE id='%s'" % (ID.getid())
        cursor.execute(sql0)
        result = cursor.fetchone()
        if result[0]==0:
            msg.showinfo(title='错误', message='您还没借过书呢!')
        else :
            lable1 = tk.Label(win, text='查询到您有以下书目未还:', bg='pink', font=('微软雅黑', 20)).place(x=80, y=20)
            tree = ttk.Treeview(win, columns=('1', '2'), show="headings")
            tree.column('1', width=150, anchor='center')
            tree.column('2', width=150, anchor='center')
            tree.heading('1', text='书名')
            tree.heading('2', text='作者')
            tree.place(x=100, y=100)
    
            sql1 = "SELECT bookname,author FROM borrow WHERE id='%s'" % (ID.getid())
            cursor.execute(sql1)
            result1 = cursor.fetchall()
            for i in range(0,result[0]):
                tree.insert('', i, values=(result1[i]))
    
            lable2 = tk.Label(win, text='请输入还书信息:', bg='pink', font=('微软雅黑', 20)).place(x=80, y=360)
            lable22=tk.Label(win, text='书名作者都要填写正确无误!', bg='pink', font=('微软雅黑', 20)).place(x=80, y=400)
            global b_name
            tk.Label(win, text='书名:', font=('宋体', 12)).place(x=80, y=480)
            b_name = tk.Entry(win, font=('宋体', 12), width=10)
            b_name.place(x=130, y=480)
    
            global author
            tk.Label(win, text='作者:', font=('宋体', 12)).place(x=230, y=480)
            author = tk.Entry(win, font=('宋体', 12), width=10)
            author.place(x=280, y=480)
    
            tk.Button(win, text='确认还书', font=('宋体', 12), width=10, command=confirm_turnback).place(x=395, y=480)
        db.close()
    
    def confirm_turnback():
        db = pymysql.connect("localhost", "root", "qwer", "library")
        cursor = db.cursor()
    
        sql1 = "UPDATE book SET amount=amount+1 WHERE name='%s' AND author='%s'" % (b_name.get(), author.get())
        cursor.execute(sql1)
        db.commit()
    
        time1=dt.datetime.now()#获取现在的时间
        sql2="SELECT date FROM borrow WHERE bookname='%s' AND author='%s'"%(b_name.get(),author.get())
        cursor.execute(sql2)
        result = cursor.fetchone()
        day=(time1-result[0]).days#得到时间差,检查图书是否超期
        print(day)
        if day>30:
            msg.showinfo(title='还书成功', message='还书成功,但您已经超期!请下次按时归还')
        else:
            msg.showinfo(title='还书成功', message='还书成功,且未超过30天')
    
        sql0 = "DELETE FROM borrow WHERE bookname='%s' AND author='%s'"%(b_name.get(), author.get())
        cursor.execute(sql0)
        db.commit()
        db.close()
        win.destroy()
    

    3.7 search模块(动态查询)

    由于管理员和读者都有查询图书的功能,故为了减少代码,尽量代码重用,将该功能做成模块。search中要有动态查询,即查询条件的个数是可以改变的。

    import tkinter as tk
    import tkinter.messagebox as msg
    from tkinter import ttk
    import pymysql
    
    def frame():
        global window
        window = tk.Tk()
        window.title('图书查询')
        window.geometry('1200x700')
    
        tk.Label(window,text='图书类目:',font=('宋体',12)).place(x=220,y=30)
    
        global list
        comvalue=tk.StringVar()
        list=ttk.Combobox(window,textvariable=comvalue,height=10,width=10)
        list.place(x=300,y=30)
        list['values']=('全部','人文','艺术','计算机','科技','杂志')
        list.current(0)
    
        global b_name
        tk.Label(window, text='书名:', font=('宋体', 12)).place(x=450, y=30)
        b_name=tk.Entry(window,font=('宋体', 12),width=15)
        b_name.place(x=500,y=30)
    
        global author
        tk.Label(window, text='作者:', font=('宋体', 12)).place(x=650, y=30)
        author = tk.Entry(window, font=('宋体', 12), width=15)
        author.place(x=700, y=30)
    
        tk.Button(window,text='搜索',font=('宋体', 12), width=10,command=search).place(x=900,y=25)
        global tree#建立树形图
        yscrollbar = ttk.Scrollbar(window, orient='vertical')#右边的滑动按钮
        tree = ttk.Treeview(window, columns=('1', '2', '3', '4', '5'), show="headings",yscrollcommand=yscrollbar.set)
        tree.column('1', width=150, anchor='center')
        tree.column('2', width=150, anchor='center')
        tree.column('3', width=150, anchor='center')
        tree.column('4', width=150, anchor='center')
        tree.column('5', width=150, anchor='center')
        tree.heading('1', text='类目')
        tree.heading('2', text='书名')
        tree.heading('3', text='作者')
        tree.heading('4', text='价格')
        tree.heading('5', text='库存')
        tree.place(x=200, y=150)
        yscrollbar.place(x=955,y=150)
        window.mainloop()
    
    def search():
    #我用了最原始的方法来动态查询
        if list.get()=='全部'and b_name.get()=='' and author.get()=='' :
            sql="SELECT * FROM book "
        elif list.get()=='全部'and b_name.get()=='' and author.get()!='' :
            sql="SELECT * FROM book WHERE author='%s'"%(author.get())
        elif list.get()=='全部'and b_name.get()!='' and author.get()=='' :
            sql = "SELECT * FROM book WHERE name='%s'" % (b_name.get())
        elif list.get() != '全部'  and b_name.get() =='' and author.get() == '' :
            sql = "SELECT * FROM book WHERE type='%s'" % (list.get())
        elif list.get()=='全部'and b_name.get() !='' and author.get()!= '' :
            sql = "SELECT * FROM book WHERE name='%s' AND author='%s'" % (b_name.get(),author.get())
        elif list.get() != '全部' and b_name.get() !='' and author.get() == '' :
            sql = "SELECT * FROM book WHERE type='%s' AND name='%s'" % (list.get(),b_name.get())
        elif list.get() != '全部' and b_name.get() =='' and author.get() != '' :
            sql = "SELECT * FROM book WHERE type='%s' AND author ='%s'" % (list.get(), author.get())
        else :
            sql = "SELECT * FROM book WHERE type='%s' AND name='%s' AND author ='%s'" % (list.get(),b_name.get(), author.get())
    
        db = pymysql.connect("localhost", "root", "qwer", "library")
        cursor = db.cursor()
        cursor.execute(sql)
        results=cursor.fetchall()
        if results:
            l= len(results)
            for i in range(0,l):#查询到的结果依次插入到表格中
                tree.insert('',i,values=(results[i]))
        else :
            tree.insert('', 0,values=('查询不到结果','查询不到结果','查询不到结果','查询不到结果','查询不到结果'))
    
        db.close()
    

    四、总结

    这是一个较为简单的图书管理系统,其中仍有一些不足。比如人人都能注册管理员账号然后修改图书信息,这会造成系统的不安全。还有就是我们默认的读者借书时候会先查询图书信息,得到图书信息后填写的书名和作者必定是正确的,我没有加上相应的错误处理。然后读者借书超期后有惩罚措施,比如无法借书或限制借书的数量,这个我没有实现,仅仅是提醒了读者有图书已超期。如果有相关问题,欢迎私信作者共同探讨。

    提示:转发应得到作者同意,注明出处。

    展开全文
  • Java项目实战-基于I/O流设计图书管理系统项目总结 由于目前学习进度的原因,我还未开始学习数据库等知识,所以为了完成项目要求,这次就使用I/O流的知识来进行存储,将书籍信息,用户信息和日志都保存到各自的...
  • 5.1创建图书管理系统数据库和库中的各表……………………………………………9 5.2 向图书管理系统数据库中插入数据………………………………………………11 5.3各表之间的联系图如图5—1所示……………………...
  • 包括图书管理系统分析与设计和 数据库设计以及窗体设计,最后是总结
  • 详细设计主要包括系统数据库访问的实现,主要功能模块的具体实现,模块实现关键代码等。最后对系统进行功能测试,并对测试结果进行分析总结,得出系统中存在的不足及需要改进的地方,为以后的系统维护提供了方便,...

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 210
精华内容 84
关键字:

图书管理系统数据库设计总结