实验名称
一、 实验目的
1. 掌握数据库应用开发程序设计方法。
二、 系统需求
这部分我针对实验指导中做了一些小修改,考虑实际情况加了点
自己的理解。
比如借书证增加了一个属性是“已借书的数量”,上限为 10,防止
一个借书证借太多的书
再比如,借书记录里面多了一条属性“是否可以续借”。因为现实
中经常有这种需求。我在程序中规定,借书时限为 30 天,允许续借
一次延长 30 天。
1.基本数据对象
对象名称 属性
书
书号,书名,类别,出版社,作者,年份,价格,总藏书量,库存
借书证
借书证号,姓名,单位(学院),类别(教师、学生),已借书的数量
借书记录 书号,借书证号,借书时间,归还期限,是否可以续借
2.基本功能模块
模块名
称
功能描述
图书入库
(修改)
1. 单本入库
在单本入库的模式下同时支持修改图书的信息
2. 批量入库 (方便最后测试)
图书信息存放在文件中, 每条图书信息为一行. 一行中的内容如下
( 书号, 类别, 书名, 出版社, 年份, 作者, 价格, 数量 )
Note: 其中 年份、数量是整数类型; 价格是两位小数类型; 其余为字符串类型
Sample:
( book_no_1, Computer Science, Computer Architecture, xxx, 2004, xxx, 90.00, 2 )
图书查询 要求可以对书的 类别, 书名, 出版社, 年份(年份区间), 作者, 价格(区间) 进行
查询. 每条图书信息包括以下内容:
( 书号, 类别, 书名, 出版社, 年份, 作者, 价格, 总藏书量, 库存 )
借书证管
理
增加或删除一个借书证,同时支持修改已有的借书证(例如修改所在单位/学院)
借书 1.输入借书证卡号
显示该借书证所有已借书籍 (返回, 格式同查询模块)
2.输入书号
如果该书还有库存,则借书成功,同时库存数减一。
否则输出该书无库存,且输出最近归还的时间。
还书 1.输入借书证卡号
显示该借书证所有已借书籍 (返回, 格式同查询模块)
2.输入书号
如果该书在已借书籍列表内, 则还书成功, 同时库存加一.
否则输出出错信息
3.用户界面
图形界面,采用 python 的原生 tkinter 及 ttk 构建
4.数据库
在 MySQL 中建立 library 数据库,并且按照第四部分中的数据库逻辑
结构建立相应的 table。登录数据库的账号密码默认为我个人的账号
密码(root,0309miku0831)。可以在 config.txt 中改成运行程序的
电脑上的账号和密码。
三、 实验环境
1.数据库管理系统:MySQL
2.开发语言:python(通过 pymysql 于 mysql 连接)
3.图形界面:tkinter
4.开发工具:vscode+anaconda
四、 系统设计及实现
1. 实体之间的关系 E-R 图
2. 数据库逻辑结构设计
Book:
create table book
(bnum char(20),
bclass varchar(50),
bname varchar(50),
publisher varchar(50),
year int,
author varchar(20),
price decimal(7,2),
total int,
collection int,
primary key(bnum)
);
分别对应前文基本数据对象描述中,书的各个属性。其中 total 代
表图书馆一共有藏书多少本,collection 代表图书馆目前所剩的这
本书的数量
Card:
create table card
(cnum char(7), -- 注意卡号长度为 7
name varchar(20),
department varchar(40),
type char(1),
numbers int,
primary key(cnum),
check(type in ('T','S'))
);
分别于前文中提到的借书证的属性相对应,分别代表借书证号,
持证者姓名,单位(学院),类型,以及当前借书数量(限制为 10
本)
Borrow:
create table borrow
(cnum char(7),
bnum char(20),
btime datetime,
rtime datetime,
times int, -- 用于记录可续借的次数
primary key(cnum,bnum),
foreign key(cnum) references card(cnum),
foreign key(bnum) references book(bnum)
);
对应前文中提到的借书记录的各个属性,与实验指导中给出的示
例不同,我将借书时间和归还期限统统设成了 datetime 类型,因
为这样更加贴近现实中的情况,也可以很方便的和 python 交互,
可以直接调用 python 中的 datetime 模块然后稍加转换就可以直接