开发工具:python3.10
数据库:Python内置的SQLite3数据库,SQLite是一种嵌入式数据库,体积很小,它的数据库就是一个文件。本文建立了Library数据库,存储系统内的管理员、图书、读者、借阅相关信息。
1 绪论
传统人工方式管理文件档案存在着许多缺点,如:效率低、保密性差等,而且随着时间的积累,将产生大量的文件和数据,这对于查找、更新和维护都带来了不便。随着科学技术的不断提高,互联网与计算机技术的日渐成熟,为我们共享数据提供了前所未有的方便。作为计算机应用的一部分,使用计算机对图书馆进行管理具有手工管理无法比拟的优点,如:检索迅速、查找方便、可靠性高,存储量大、保密性好、寿命长、成本低等,这些优点能够极大的提高图书信息、读者信息管理的效率,也是科学化、正规化的体现。
本次开发的图书馆管理系统主要包括以下四大模块:(1)个人信息管理,包括查看个人信息以及修改个人信息,可对登录密码等个人信息进行修改。(2)图书信息管理,可对图书信息进行增、删、改、查、浏览操作。(3)读者信息管理,涉及读者信息的增、删、改、查、浏览操作。(4)查看借阅信息,可查看借阅时间、借阅读者借书证号等信息。
2 需求分析
2.1 功能分析
根据用户调查,系统应有以下功能需求:
(1)管理员使用工作证号进行注册,完成注册后可根据工作证号和密码登录系统。
(2)管理员查看、修改个人信息,包括手机号、家庭住址、登录密码等。
(3)图书的信息管理:包括添加、删除、信息修改、浏览、查询等。
(4)读者的信息管理:包括添加、删除、信息修改、浏览、查询等。
(5)查看借阅信息,并可分别依据图书ID、借书证号、借阅时间、归还时间进行查询;也可以依据图书ID和借书证号的组合查询相关纪录。
2.2 技术分析
系统采用Python语言设计实现,使用python3.10为开发工具,利用Python内置的SQLite3数据库建立了Library数据库。使用了Python自带的tkinter模块,tkinter模块是一种流行的面向对象的GUI工具包 TK 的Python编程接口,提供了快速便利地创建GUI应用程序的方法。使用了os模块,os模块提供了各种 Python 程序与操作系统进行交互的接口,通过os模块,一方面可以方便地与操作系统进行交互,另一方面页可以极大增强代码的可移植性。如果该模块中相关功能出错,会抛出OSError异常或其子类异常。
3 总体设计
3.1 功能设计
3.2 数据库设计
4 详细设计
4.1 注册模块程序流程图
4.2 登录模块程序流程图
5 系统实现
5.1 登录、注册功能
(1)注册测试:
(2)登录测试:
(3)相关代码如下:
path = os.getenv('temp')filename = os.path.join(path, 'info.txt')# 在窗口上创建标签组件labelname = tkinter.Label(self.window, text='账号', font=('华文中宋', 16))labelname.place(x=200, y=120, width=80, height=30)# 创建字符串变量和文本框组件,同时设置关联的变量global varnamevarname = tkinter.StringVar(self.window, value='')self.account = tkinter.Entry(self.window, width=30, font=tkinter.font.Font(size=16), bg='Ivory', textvariable=varname)self.account.place(x=300, y=120, width=160, height=30)labelpwd = tkinter.Label(self.window, text='密码', font=('华文中宋', 16))labelpwd.place(x=200, y=180, width=80, height=30)# 创建密码文本框global varpwdvarpwd = tkinter.StringVar(self.window, value='')self.password = tkinter.Entry(self.window, width=30, font=tkinter.font.Font(size=16), bg='Ivory', show='*', textvariable=varpwd)self.password.place(x=300, y=180, width=160, height=30)# 尝试自动填写用户名和密码try: with open(filename) as fp: n, p = fp.read().strip().split(',') varname.set(n) varpwd.set(p)except: pass# 记住我,复选框global remembermerememberme = tkinter.IntVar(self.window, value=1)# 选中时变量值为1,未选中时变量值为0,默认选中checkremember = tkinter.Checkbutton(self.window, text='自动保存', font=tkinter.font.Font(size=12), variable=rememberme, onvalue=1, offvalue=0)checkremember.place(x=200, y=240, width=100, height=20)# 登录按钮Button(self.window, text='登录', width=8, font=tkinter.font.Font(size=12), command=self.login).place(x=200, y=300) # 登录按钮事件处理函数def login(self): # _password = None # 获取账号和密码 global account account = self.account.get() pwd = self.password.get() # 数据库操作 查询管理员信息表 with sqlite3.connect("Library.db") as conn: # 创建连接 cursor = conn.cursor() # 获取游标对象 cursor.execute('SELECT * FROM Administrator') li = cursor.fetchall() p = 0 for i in li: if account == i[0] and pwd == i[2]: tkinter.messagebox.showinfo(title='恭喜', message='登录成功!') ActionSelectionInterface(self.window) # 进入操作选择页面 if rememberme.get() == 1: # 把登录成功的信息写入临时文件 with open(filename, 'w') as fp: fp.write(','.join((account, pwd))) else: try: os.remove(filename) except: pass p = 1 break # else: if p == 0: tkinter.messagebox.showerror('警告', message='用户名或密码错误')# 注册按钮Button(self.window, text='注册', width=8, font=tkinter.font.Font(size=12), command=self.regi).place(x=400, y=300)# 注册按钮事件处理函数def regi(self): # 获取账号和密码 global account account = self.account.get() pwd = self.password.get() # 将数据插入数据库 with sqlite3.connect("Library.db") as conn: cur = conn.cursor() cur.execute('SELECT * FROM Administrator') li = cur.fetchall() flag = 0 for i in li: if account == i[0]: tkinter.messagebox.showerror('警告', message='该账号已存在!') flag = 1 break if flag == 0: cur.execute("insert into Administrator(A_ID, Apassword) values (?, ?)", (account, pwd)) tkinter.messagebox.showinfo(title='恭喜', message='注册成功!')
5.2 添加功能
该功能主要完成图书信息、读者信息的添加。
(1)添加图书信息功能测试:
(2)添加读者信息功能测试:
(3)相关代码如下(以添加读者信息为例):
# 添加读者信息按钮事件def buttonAddClick(): # 检查ID global rid rid = entryId.get().strip() if rid == '': tkinter.messagebox.showerror(title='很抱歉', message='必须输入ID') return # ID不能重复 with sqlite3.connect("Library.db") as conn: cur = conn.cursor() cur.execute('SELECT COUNT(R_ID) from Reader where R_ID="' + rid + '"') c = cur.fetchone()[0] if c != 0: tkinter.messagebox.showerror(title='很抱歉', message='ID不能重复') return # 检查姓名 name = entryName.get().strip() if name == '': tkinter.messagebox.showerror(title='很抱歉', message='必须输入姓名') return # 检查性别 sex = entrySex.get() if sex not in ('男', '女'): tkinter.messagebox.showerror(title='很抱歉', message='性别不合法') return # 检查出生日期 birth = entryBirth.get().strip() if birth == '': tkinter.messagebox.showerror(title='很抱歉', message='必须输入出生日期') return # 检查电话号码 telephone = entryTelephone.get().strip() if telephone == '' or (not telephone.isdigit()): tkinter.messagebox.showerror(title='很抱歉', message='电话号码必须是数字') return # 检查家庭住址 address = entryAddress.get().strip() if address == '': tkinter.messagebox.showerror(title='很抱歉', message='必须输入家庭住址') return # 所有输入都通过检查,插入数据库 # print(rid, name, sex, birth, telephone, address) sql = 'INSERT INTO Reader(R_ID, Rname, "Rsex", Rbirth, Rtelephone, Raddress) VALUES("' \ + rid + '","' + name + '","' + sex + '","' + birth + '","' \ + telephone + '","' + address + '")' doSql(sql) tkinter.messagebox.showinfo('恭喜', '添加成功') # 添加记录后,更新表格中的数据 bindData()buttonAdd = tkinter.Button(self.window, text='添加', command=buttonAddClick)buttonAdd.place(x=50, y=130, width=80, height=20)
5.3 删除功能
该功能主要完成图书信息删除、读者信息删除。
(1)删除功能测试(以删除一条读者信息为例):
(2)相关代码如下(以删除读者信息为例):
def doSql(sql): # 用来执行SQL语句,尤其是INSERT和DELETE语句 with sqlite3.connect("Library.db") as conn: cur = conn.cursor() cur.execute(sql) conn.commit()# 定义Treeview组件的左键单击事件,并绑定到Treeview组件上# 单击鼠标左键,设置变量nameToDelete的值,然后可以使用“删除”按钮来删除idToDelete = tkinter.StringVar() #def treeviewClick(event): if not treeAddressList.selection(): return item = treeAddressList.selection()[0] idToDelete.set(treeAddressList.item(item, 'values')[0])treeAddressList.bind('<Button-1>', treeviewClick)# 删除读者信息按钮事件def buttonDeleteClick(): rid = idToDelete.get() if rid == '': tkinter.messagebox.showerror(title='很抱歉', message='请选择一条记录') return # 如果已经选择了一条信息,执行SQL语句将其删除 sql = 'DELETE FROM Reader WHERE R_ID="' + rid + '"' doSql(sql) tkinter.messagebox.showinfo('恭喜', '删除成功') # 重新设置变量为空字符串 idToDelete.set('') # 更新表格中的数据 bindData()buttonDelete = tkinter.Button(self.window, text='删除', command=buttonDeleteClick)buttonDelete.place(x=170, y=130, width=80, height=20)
5.4 修改功能
该功能主要完成管理员、图书、读者信息的修改。
(1)修改信息测试(以修改读者信息为例:)
选中待修改信息,点击“修改”按钮;
获取到待修改信息后,即可在输入框进行修改,修改完成点击“保存修改”按钮(此次测试修改了性别、出生日期);
(2)相关代码如下(以修改读者信息为例):
# 修改读者信息def buttonEditClick(): ide = idToDelete.get() if ide == '': tkinter.messagebox.showerror(title='很抱歉', message='请选择一条要修改的记录') return with sqlite3.connect("Library.db") as conn: # 创建连接 cursor = conn.cursor() # 获取游标对象 sql = 'SELECT * FROM Reader where R_ID ="' + ide + '"' cursor.execute(sql) lli = cursor.fetchall() name = lli[0][1] sex = lli[0][2] birth = lli[0][3] telephone = lli[0][4] address = lli[0][5] varRid.set(ide) varName.set(name) varSex.set(sex) varBirth.set(birth) varTelephone.set(telephone) varAddress.set(address) tkinter.messagebox.showinfo('恭喜', '获取成功')buttonEdit = tkinter.Button(self.window, text='修改', command=buttonEditClick)buttonEdit.place(x=410, y=130, width=80, height=20)# 保存修改def buttonSaveClick(): rde = entryId.get().strip() name = entryName.get().strip() sex = entrySex.get().strip() birth = entryBirth.get().strip() telephone = entryTelephone.get().strip() address = entryAddress.get().strip() sql = "update Reader set Rname = '%s', Rsex = '%s', Rbirth = '%s', Rtelephone = '%s', Raddress = '%s' WHERE R_ID = '%s'" % ( name, sex, birth, telephone, address, rde) doSql(sql) tkinter.messagebox.showinfo('恭喜', '修改保存成功') # 修改记录后,更新表格中的数据 bindData()buttonEdit = tkinter.Button(self.window, text='保存修改', command=buttonSaveClick)buttonEdit.place(x=530, y=130, width=80, height=20)
5.5 查询功能
(1)查询功能测试如下:
按性别查询读者信息:
按书名作者查询图书信息:
按书名作者查询图书信息:
(2)查询相关代码(以查询图书为例):
# 查询def buttonSeekClick(): # 获取 bid = entryId.get() name = entryName.get() author = entryAuthor.get() publish = entryPublish.get() state = entryState.get() # 数据库操作 查询图书信息表 with sqlite3.connect("Library.db") as conn: # 创建连接 cursor = conn.cursor() # 获取游标对象 cursor.execute('SELECT * FROM Books') results = cursor.fetchall() flag = 0 if bid == "" and name == "" and author == "" and publish == "" and state == "": tkinter.messagebox.showerror(title='很抱歉', message='请至少输入一条查询信息') else: for row in results: if bid == row[0] and name == row[1] and author == row[2] and publish == row[3] and state == row[6]: sql = "SELECT * FROM Books where (B_ID = '%s') and (Bname = '%s') and (Bauthor = '%s') and (Bpublish = '%s' and (Bstate == '%s'))" % ( bid, name, author, publish, state) bindDatas(sql) flag = 1 break elif bid == row[0] and name == row[1] and author == row[2] and publish == row[3]: sql = "SELECT * FROM Books where (B_ID = '%s') and (Bname = '%s') and (Bauthor = '%s') and (Bpublish = '%s')" % ( bid, name, author, publish) bindDatas(sql) flag = 1 break elif bid == row[0] and name == row[1] and author == row[2]: sql = "SELECT * FROM Books where (B_ID = '%s') and (Bname = '%s') and (Bauthor = '%s')" % ( bid, name, author) bindDatas(sql) flag = 1 break elif bid == row[0] and name == row[1]: sql = "SELECT * FROM Books where (B_ID = '%s') and (Bname = '%s')" % (bid, name) bindDatas(sql) flag = 1 break elif bid == row[0]: sql = "SELECT * FROM Books where B_ID = '%s'" % (bid) bindDatas(sql) flag = 1 break elif name == row[1]: sql = "SELECT * FROM Books where Bname = '%s'" % (name) bindDatas(sql) flag = 1 break elif author == row[2]: sql = "SELECT * FROM Books where Bauthor = '%s'" % (author) bindDatas(sql) flag = 1 break elif publish == row[3]: sql = "SELECT * FROM Books where Bpublish = '%s'" % (publish) bindDatas(sql) flag = 1 break elif state == row[6]: sql = "SELECT * FROM Books where Bstate = '%s'" % (state) bindDatas(sql) flag = 1 break if flag == 0: tkinter.messagebox.showerror(title='很抱歉', message='未找到符合条件的图书!')buttonSeek = tkinter.Button(self.window, text='查询', command=buttonSeekClick)buttonSeek.place(x=520, y=130, width=80, height=20)
6 总结
在本次基于Python的图书馆管理系统开发中,经过系统需求分析、功能需求分析、数据库物理结构设计、系统功能设计和数据库初始装载、python程序代码设计,最终编译并运行成功。实现了管理员的注册、登录,个人信息的查看与修改、图书与读者信息的管理以及查看借阅信息的功能,提高了图书馆管理员的管理效率。
对于界面的设计,在设计方面采取的是简约原则,并未过度追求设计感,但是充分考虑了用户的使用体验,最终所实现的界面虽然简单,但是功能齐全。开发过程中我不断完善本系统功能,将知识学以致用,取得了很大的收获,也对Python程序开发有了更多的兴趣。
ps:任何建议和想法欢迎评论交流~