您现在的位置是:首页 > 技术教程 正文

基于Python的图书馆管理系统的开发

admin 阅读: 2024-03-20
后台-插件-广告管理-内容页头部广告(手机)

开发工具: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)相关代码如下:

  1. path = os.getenv('temp')
  2. filename = os.path.join(path, 'info.txt')
  3. # 在窗口上创建标签组件
  4. labelname = tkinter.Label(self.window, text='账号', font=('华文中宋', 16))
  5. labelname.place(x=200, y=120, width=80, height=30)
  6. # 创建字符串变量和文本框组件,同时设置关联的变量
  7. global varname
  8. varname = tkinter.StringVar(self.window, value='')
  9. self.account = tkinter.Entry(self.window, width=30, font=tkinter.font.Font(size=16), bg='Ivory',
  10. textvariable=varname)
  11. self.account.place(x=300, y=120, width=160, height=30)
  12. labelpwd = tkinter.Label(self.window, text='密码', font=('华文中宋', 16))
  13. labelpwd.place(x=200, y=180, width=80, height=30)
  14. # 创建密码文本框
  15. global varpwd
  16. varpwd = tkinter.StringVar(self.window, value='')
  17. self.password = tkinter.Entry(self.window, width=30, font=tkinter.font.Font(size=16), bg='Ivory', show='*',
  18. textvariable=varpwd)
  19. self.password.place(x=300, y=180, width=160, height=30)
  20. # 尝试自动填写用户名和密码
  21. try:
  22. with open(filename) as fp:
  23. n, p = fp.read().strip().split(',')
  24. varname.set(n)
  25. varpwd.set(p)
  26. except:
  27. pass
  28. # 记住我,复选框
  29. global rememberme
  30. rememberme = tkinter.IntVar(self.window, value=1)
  31. # 选中时变量值为1,未选中时变量值为0,默认选中
  32. checkremember = tkinter.Checkbutton(self.window,
  33. text='自动保存',
  34. font=tkinter.font.Font(size=12),
  35. variable=rememberme,
  36. onvalue=1, offvalue=0)
  37. checkremember.place(x=200, y=240, width=100, height=20)
  38. # 登录按钮
  39. Button(self.window, text='登录', width=8, font=tkinter.font.Font(size=12), command=self.login).place(x=200, y=300)
  40. # 登录按钮事件处理函数
  41. def login(self):
  42. # _password = None
  43. # 获取账号和密码
  44. global account
  45. account = self.account.get()
  46. pwd = self.password.get()
  47. # 数据库操作 查询管理员信息表
  48. with sqlite3.connect("Library.db") as conn: # 创建连接
  49. cursor = conn.cursor() # 获取游标对象
  50. cursor.execute('SELECT * FROM Administrator')
  51. li = cursor.fetchall()
  52. p = 0
  53. for i in li:
  54. if account == i[0] and pwd == i[2]:
  55. tkinter.messagebox.showinfo(title='恭喜',
  56. message='登录成功!')
  57. ActionSelectionInterface(self.window) # 进入操作选择页面
  58. if rememberme.get() == 1:
  59. # 把登录成功的信息写入临时文件
  60. with open(filename, 'w') as fp:
  61. fp.write(','.join((account, pwd)))
  62. else:
  63. try:
  64. os.remove(filename)
  65. except:
  66. pass
  67. p = 1
  68. break
  69. # else:
  70. if p == 0:
  71. tkinter.messagebox.showerror('警告', message='用户名或密码错误')
  72. # 注册按钮
  73. Button(self.window, text='注册', width=8, font=tkinter.font.Font(size=12), command=self.regi).place(x=400, y=300)
  74. # 注册按钮事件处理函数
  75. def regi(self):
  76. # 获取账号和密码
  77. global account
  78. account = self.account.get()
  79. pwd = self.password.get()
  80. # 将数据插入数据库
  81. with sqlite3.connect("Library.db") as conn:
  82. cur = conn.cursor()
  83. cur.execute('SELECT * FROM Administrator')
  84. li = cur.fetchall()
  85. flag = 0
  86. for i in li:
  87. if account == i[0]:
  88. tkinter.messagebox.showerror('警告', message='该账号已存在!')
  89. flag = 1
  90. break
  91. if flag == 0:
  92. cur.execute("insert into Administrator(A_ID, Apassword) values (?, ?)", (account, pwd))
  93. tkinter.messagebox.showinfo(title='恭喜',
  94. message='注册成功!')

5.2  添加功能

该功能主要完成图书信息、读者信息的添加。

(1)添加图书信息功能测试:

(2)添加读者信息功能测试:

(3)相关代码如下(以添加读者信息为例):

  1. # 添加读者信息按钮事件
  2. def buttonAddClick():
  3. # 检查ID
  4. global rid
  5. rid = entryId.get().strip()
  6. if rid == '':
  7. tkinter.messagebox.showerror(title='很抱歉', message='必须输入ID')
  8. return
  9. # ID不能重复
  10. with sqlite3.connect("Library.db") as conn:
  11. cur = conn.cursor()
  12. cur.execute('SELECT COUNT(R_ID) from Reader where R_ID="' + rid + '"')
  13. c = cur.fetchone()[0]
  14. if c != 0:
  15. tkinter.messagebox.showerror(title='很抱歉', message='ID不能重复')
  16. return
  17. # 检查姓名
  18. name = entryName.get().strip()
  19. if name == '':
  20. tkinter.messagebox.showerror(title='很抱歉', message='必须输入姓名')
  21. return
  22. # 检查性别
  23. sex = entrySex.get()
  24. if sex not in ('男', '女'):
  25. tkinter.messagebox.showerror(title='很抱歉', message='性别不合法')
  26. return
  27. # 检查出生日期
  28. birth = entryBirth.get().strip()
  29. if birth == '':
  30. tkinter.messagebox.showerror(title='很抱歉', message='必须输入出生日期')
  31. return
  32. # 检查电话号码
  33. telephone = entryTelephone.get().strip()
  34. if telephone == '' or (not telephone.isdigit()):
  35. tkinter.messagebox.showerror(title='很抱歉', message='电话号码必须是数字')
  36. return
  37. # 检查家庭住址
  38. address = entryAddress.get().strip()
  39. if address == '':
  40. tkinter.messagebox.showerror(title='很抱歉', message='必须输入家庭住址')
  41. return
  42. # 所有输入都通过检查,插入数据库
  43. # print(rid, name, sex, birth, telephone, address)
  44. sql = 'INSERT INTO Reader(R_ID, Rname, "Rsex", Rbirth, Rtelephone, Raddress) VALUES("' \
  45. + rid + '","' + name + '","' + sex + '","' + birth + '","' \
  46. + telephone + '","' + address + '")'
  47. doSql(sql)
  48. tkinter.messagebox.showinfo('恭喜', '添加成功')
  49. # 添加记录后,更新表格中的数据
  50. bindData()
  51. buttonAdd = tkinter.Button(self.window, text='添加', command=buttonAddClick)
  52. buttonAdd.place(x=50, y=130, width=80, height=20)

5.3  删除功能

该功能主要完成图书信息删除、读者信息删除。

(1)删除功能测试(以删除一条读者信息为例):

(2)相关代码如下(以删除读者信息为例):

  1. def doSql(sql):
  2. # 用来执行SQL语句,尤其是INSERT和DELETE语句
  3. with sqlite3.connect("Library.db") as conn:
  4. cur = conn.cursor()
  5. cur.execute(sql)
  6. conn.commit()
  7. # 定义Treeview组件的左键单击事件,并绑定到Treeview组件上
  8. # 单击鼠标左键,设置变量nameToDelete的值,然后可以使用“删除”按钮来删除
  9. idToDelete = tkinter.StringVar() #
  10. def treeviewClick(event):
  11. if not treeAddressList.selection():
  12. return
  13. item = treeAddressList.selection()[0]
  14. idToDelete.set(treeAddressList.item(item, 'values')[0])
  15. treeAddressList.bind('', treeviewClick)
  16. # 删除读者信息按钮事件
  17. def buttonDeleteClick():
  18. rid = idToDelete.get()
  19. if rid == '':
  20. tkinter.messagebox.showerror(title='很抱歉', message='请选择一条记录')
  21. return
  22. # 如果已经选择了一条信息,执行SQL语句将其删除
  23. sql = 'DELETE FROM Reader WHERE R_ID="' + rid + '"'
  24. doSql(sql)
  25. tkinter.messagebox.showinfo('恭喜', '删除成功')
  26. # 重新设置变量为空字符串
  27. idToDelete.set('')
  28. # 更新表格中的数据
  29. bindData()
  30. buttonDelete = tkinter.Button(self.window, text='删除', command=buttonDeleteClick)
  31. buttonDelete.place(x=170, y=130, width=80, height=20)

5.4  修改功能

该功能主要完成管理员、图书、读者信息的修改

(1)修改信息测试(以修改读者信息为例:)

        选中待修改信息,点击“修改”按钮;

        获取到待修改信息后,即可在输入框进行修改,修改完成点击“保存修改”按钮(此次测试修改了性别、出生日期);

(2)相关代码如下(以修改读者信息为例)

  1. # 修改读者信息
  2. def buttonEditClick():
  3. ide = idToDelete.get()
  4. if ide == '':
  5. tkinter.messagebox.showerror(title='很抱歉', message='请选择一条要修改的记录')
  6. return
  7. with sqlite3.connect("Library.db") as conn: # 创建连接
  8. cursor = conn.cursor() # 获取游标对象
  9. sql = 'SELECT * FROM Reader where R_ID ="' + ide + '"'
  10. cursor.execute(sql)
  11. lli = cursor.fetchall()
  12. name = lli[0][1]
  13. sex = lli[0][2]
  14. birth = lli[0][3]
  15. telephone = lli[0][4]
  16. address = lli[0][5]
  17. varRid.set(ide)
  18. varName.set(name)
  19. varSex.set(sex)
  20. varBirth.set(birth)
  21. varTelephone.set(telephone)
  22. varAddress.set(address)
  23. tkinter.messagebox.showinfo('恭喜', '获取成功')
  24. buttonEdit = tkinter.Button(self.window, text='修改', command=buttonEditClick)
  25. buttonEdit.place(x=410, y=130, width=80, height=20)
  26. # 保存修改
  27. def buttonSaveClick():
  28. rde = entryId.get().strip()
  29. name = entryName.get().strip()
  30. sex = entrySex.get().strip()
  31. birth = entryBirth.get().strip()
  32. telephone = entryTelephone.get().strip()
  33. address = entryAddress.get().strip()
  34. sql = "update Reader set Rname = '%s', Rsex = '%s', Rbirth = '%s', Rtelephone = '%s', Raddress = '%s' WHERE R_ID = '%s'" % (
  35. name, sex, birth, telephone, address, rde)
  36. doSql(sql)
  37. tkinter.messagebox.showinfo('恭喜', '修改保存成功')
  38. # 修改记录后,更新表格中的数据
  39. bindData()
  40. buttonEdit = tkinter.Button(self.window, text='保存修改', command=buttonSaveClick)
  41. buttonEdit.place(x=530, y=130, width=80, height=20)

5.5  查询功能

(1)查询功能测试如下:

        按性别查询读者信息:

        按书名作者查询图书信息:

        按书名作者查询图书信息:

(2)查询相关代码(以查询图书为例)

  1. # 查询
  2. def buttonSeekClick():
  3. # 获取
  4. bid = entryId.get()
  5. name = entryName.get()
  6. author = entryAuthor.get()
  7. publish = entryPublish.get()
  8. state = entryState.get()
  9. # 数据库操作 查询图书信息表
  10. with sqlite3.connect("Library.db") as conn: # 创建连接
  11. cursor = conn.cursor() # 获取游标对象
  12. cursor.execute('SELECT * FROM Books')
  13. results = cursor.fetchall()
  14. flag = 0
  15. if bid == "" and name == "" and author == "" and publish == "" and state == "":
  16. tkinter.messagebox.showerror(title='很抱歉', message='请至少输入一条查询信息')
  17. else:
  18. for row in results:
  19. if bid == row[0] and name == row[1] and author == row[2] and publish == row[3] and state == row[6]:
  20. sql = "SELECT * FROM Books where (B_ID = '%s') and (Bname = '%s') and (Bauthor = '%s') and (Bpublish = '%s' and (Bstate == '%s'))" % (
  21. bid, name, author, publish, state)
  22. bindDatas(sql)
  23. flag = 1
  24. break
  25. elif bid == row[0] and name == row[1] and author == row[2] and publish == row[3]:
  26. sql = "SELECT * FROM Books where (B_ID = '%s') and (Bname = '%s') and (Bauthor = '%s') and (Bpublish = '%s')" % (
  27. bid, name, author, publish)
  28. bindDatas(sql)
  29. flag = 1
  30. break
  31. elif bid == row[0] and name == row[1] and author == row[2]:
  32. sql = "SELECT * FROM Books where (B_ID = '%s') and (Bname = '%s') and (Bauthor = '%s')" % (
  33. bid, name, author)
  34. bindDatas(sql)
  35. flag = 1
  36. break
  37. elif bid == row[0] and name == row[1]:
  38. sql = "SELECT * FROM Books where (B_ID = '%s') and (Bname = '%s')" % (bid, name)
  39. bindDatas(sql)
  40. flag = 1
  41. break
  42. elif bid == row[0]:
  43. sql = "SELECT * FROM Books where B_ID = '%s'" % (bid)
  44. bindDatas(sql)
  45. flag = 1
  46. break
  47. elif name == row[1]:
  48. sql = "SELECT * FROM Books where Bname = '%s'" % (name)
  49. bindDatas(sql)
  50. flag = 1
  51. break
  52. elif author == row[2]:
  53. sql = "SELECT * FROM Books where Bauthor = '%s'" % (author)
  54. bindDatas(sql)
  55. flag = 1
  56. break
  57. elif publish == row[3]:
  58. sql = "SELECT * FROM Books where Bpublish = '%s'" % (publish)
  59. bindDatas(sql)
  60. flag = 1
  61. break
  62. elif state == row[6]:
  63. sql = "SELECT * FROM Books where Bstate = '%s'" % (state)
  64. bindDatas(sql)
  65. flag = 1
  66. break
  67. if flag == 0:
  68. tkinter.messagebox.showerror(title='很抱歉', message='未找到符合条件的图书!')
  69. buttonSeek = tkinter.Button(self.window, text='查询', command=buttonSeekClick)
  70. buttonSeek.place(x=520, y=130, width=80, height=20)

6  总结

        在本次基于Python的图书馆管理系统开发中,经过系统需求分析、功能需求分析、数据库物理结构设计、系统功能设计和数据库初始装载、python程序代码设计,最终编译并运行成功。实现了管理员的注册、登录,个人信息的查看与修改、图书与读者信息的管理以及查看借阅信息的功能,提高了图书馆管理员的管理效率。

        对于界面的设计,在设计方面采取的是简约原则,并未过度追求设计感,但是充分考虑了用户的使用体验,最终所实现的界面虽然简单,但是功能齐全。开发过程中我不断完善本系统功能,将知识学以致用,取得了很大的收获,也对Python程序开发有了更多的兴趣。

ps:任何建议和想法欢迎评论交流~

标签:
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

在线投稿:投稿 站长QQ:1888636

后台-插件-广告管理-内容页尾部广告(手机)
关注我们

扫一扫关注我们,了解最新精彩内容

搜索