当前位置:   article > 正文

基于python+mysql的可视化图书管理系统(文末附源码)_python图书管理系统源码

python图书管理系统源码

该项目主要功能,图书的增删查改,借阅证的增、删;借阅证用于结借书管理;借阅证分为老师和学生,numbers为借阅状态:

项目使用mysql数据库,表为3张:

先看运行主界面及功能:

 主页面实现代码:

  1. initwin(): #主窗口
  2. def __init__(self,master):
  3. global im
  4. global image
  5. self.master=master
  6. self.master.config(bg='Magenta')
  7. self.initwin=tk.Frame(self.master,)
  8. self.initwin.pack()
  9. self.canvas = tk.Canvas(self.initwin,
  10. width = 1000,
  11. height = 700,
  12. bg = 'green')
  13. image=Image.open('bg.jpg')
  14. im=ImageTk.PhotoImage(image)
  15. self.canvas.create_image(0,0,anchor='nw',image = im) # 使用create_image将图片添加到Canvas组件中
  16. self.canvas.pack() # 将Canvas添加到主窗口
  17. btn_add=ttk.Button(self.initwin,text="图书入库或修改信息",command=self.add)
  18. btn_query=ttk.Button(self.initwin,text="查询图书信息",command=self.query)
  19. btn_card=ttk.Button(self.initwin,text="借书证管理",command=self.card)
  20. btn_borrow=ttk.Button(self.initwin,text="借书",command=self.borrow)
  21. btn_return=ttk.Button(self.initwin,text="还书",command=self.returnbook)#return是保留字。。。
  22. self.canvas.create_window(100,50,width=200,height=40,window=btn_add)
  23. self.canvas.create_window(100,100,width=200,height=40,window=btn_query)
  24. self.canvas.create_window(100,250,width=200,height=40,window=btn_card)
  25. self.canvas.create_window(100,150,width=200,height=40,window=btn_borrow)
  26. self.canvas.create_window(100,200,width=200,height=40,window=btn_return)
  27. self.title=tk.Label(self.initwin,text="图书管理系统",font=("宋体",30))
  28. self.author=tk.Label(self.initwin,text="源代码+QQ:3125841747",font=("宋体",24))
  29. self.canvas.create_window(400,150,anchor="nw",width=300,height=70,window=self.title)
  30. self.canvas.create_window(400,350,anchor="nw",window=self.author)
  31. def add(self,): #add窗口,实现的功能:选择批量入库或者单本入库,添加或是修改
  32. self.initwin.destroy()
  33. addwin(self.master)
  34. def query(self):
  35. self.initwin.destroy()
  36. querywin(self.master)
  37. def card(self):
  38. self.initwin.destroy()
  39. cardwin(self.master)
  40. def borrow(self):
  41. self.initwin.destroy()
  42. borrowwin(self.master)
  43. def returnbook(self):
  44. self.initwin.destroy()
  45. returnwin(self.master)

图书入库:分为单本入库和读取记事本批量入库:

单本入库:实现对图书的增、改:

 

批量入库成功后,会在文件夹中生成日志文件:

入库图书代码实现:

  1. addwin():
  2. def __init__(self,master):
  3. global im
  4. global image
  5. self.master=master
  6. self.master.config(bg='GhostWhite')
  7. self.str="此处输出状态信息"
  8. self.addwin=tk.Frame(self.master,)
  9. self.addwin.pack()
  10. self.canvas = tk.Canvas(self.addwin,
  11. width = 1000,
  12. height = 700,
  13. bg = 'white')
  14. image=Image.open('bg.jpg')
  15. im=ImageTk.PhotoImage(image)
  16. self.canvas.create_image(0,0,anchor='nw',image = im) # 使用create_image将图片添加到Canvas组件中
  17. self.canvas.pack() # 将Canvas添加到窗口
  18. self.btn_back=ttk.Button(self.addwin,text="返回主菜单",command=self.back)
  19. #btn_back.pack()
  20. self.canvas.create_window(100,50,width=200,height=40,window=self.btn_back)
  21. self.mode=tk.IntVar() #选择入库模式(单本或者批量)
  22. self.style_radio=ttk.Style()
  23. self.style_radio.configure("radio.TRadiobutton",font=("微软雅黑",12),background="Aqua")
  24. self.r1=ttk.Radiobutton(self.addwin,text="单本入库(或修改信息)",variable=self.mode,value=1,command=self.display1,style="radio.TRadiobutton")
  25. self.r2=ttk.Radiobutton(self.addwin,text="批量入库",variable=self.mode,value=2,command=self.display2,style="radio.TRadiobutton")
  26. self.canvas.create_window(400,50,window=self.r1)
  27. self.canvas.create_window(400,100,window=self.r2)
  28. self.style_label=ttk.Style()
  29. self.style_label.configure("label.TLabel",font=("微软雅黑",14))
  30. self.s_title=ttk.Label(self.addwin,text="状态栏",style="label.TLabel", width=30,anchor="center")
  31. self.state=tk.Message(self.addwin,text=self.str,width=300,font=("微软雅黑",12))
  32. self.canvas.create_window(800,100,height=50,window=self.s_title)
  33. self.canvas.create_window(650,150,anchor="nw",width=300,window=self.state)
  34. self.flag1=0#标记“批量入库”的控件是否存在的flag
  35. self.flag2=0#标记“单本入库”的控件是否存在的flag
  36. self.cflag=0#change flag,用来区分是添加一本书还是修改书的信息.为1时代表修改

查询图书可以分为:类别、书名、出版社、年份、作者、价格这几种进行查询:

 按类别查询:

按书名查询:

 按出版社查询:

 其他功能不一一演示,​​​​​​​

查询图书的代码:

  1. ef show(self,result):
  2. #美观方面的问题还需要改进。。。现在先大体实现功能
  3. #重构此部分,由label改为ttk的Treeview
  4. self.query_list=ttk.Treeview(self.querywin,columns=["书号","类别","书名","出版社","年份","作者","价格","库存数"],show="headings")#show设为headings可以隐藏首列
  5. self.query_list.column("书号",width=100)
  6. self.query_list.column("类别",width=150)
  7. self.query_list.column("书名",width=200)
  8. self.query_list.column("出版社",width=150)
  9. self.query_list.column("年份",width=50)
  10. self.query_list.column("作者",width=100)
  11. self.query_list.column("价格",width=80)
  12. self.query_list.column("库存数",width=80)
  13. self.query_list.heading("书号",text="书号",)
  14. self.query_list.heading("类别",text="类别",)
  15. self.query_list.heading("书名",text="书名",)
  16. self.query_list.heading("出版社",text="出版社")
  17. self.query_list.heading("年份",text="年份")
  18. self.query_list.heading("作者",text="作者")
  19. self.query_list.heading("价格",text="价格")
  20. self.query_list.heading("库存数",text="库存数")
  21. self.canvas.create_window(50,250,height=300,anchor="nw",window=self.query_list)
  22. self.query_bar=ttk.Scrollbar(self.querywin,orient='vertical',command=self.query_list.yview)
  23. self.query_list.configure(yscrollcommand=self.query_bar.set)
  24. self.canvas.create_window(960,250,height=300,anchor="nw",window=self.query_bar)
  25. self.btn_list=ttk.Button(self.querywin,text="返回",command=self.destroy_search)
  26. self.canvas.create_window(480,580,height=30,width=50,window=self.btn_list)
  27. if type(result)!=type(()):
  28. return
  29. i=0#临时变量
  30. for item in result:
  31. self.bnum_str=item[0]
  32. self.class_str=item[1]
  33. self.bname_str=item[2]
  34. self.pub_str=item[3]
  35. self.year_str=item[4]
  36. self.auth_str=item[5]
  37. self.pri_str=item[6]
  38. self.coll_str=item[7]
  39. self.query_list.insert("",i,values=(item[0],item[1],item[2],item[3],item[4],item[5],item[6],item[7]))
  40. i+=1

借书需要有借阅证,借阅证添加操作:

拥有借阅的证号,才可以借书:

 还书 :​​​​​​​

  借书代码实现如下:

程序完整代码看主页联系

或访问:

腾讯文档腾讯文档-在线文档https://docs.qq.com/doc/p/71239d69a76f56cf1521717ae6b22c27cf876f10

  1. import pymysql
  2. import logging
  3. import datetime
  4. def ShowList(conn,CardNum):
  5. if(CardNum==""):
  6. return "借书证号不能为空"
  7. try:
  8. cursor=conn.cursor()
  9. sql="select * from card where cnum=%s"
  10. cursor.execute(sql,CardNum)
  11. result=cursor.fetchone()
  12. #要看输入的卡号是不是有效的
  13. if result is None:
  14. return "无效的借书证号"
  15. sql="select bnum,bname,btime,rtime,times from book natural join borrow where cnum=%s"
  16. cursor.execute(sql,CardNum)
  17. result=cursor.fetchall()
  18. return result
  19. except Exception as e:
  20. logging.exception(e)
  21. return e
  22. def Borrow(conn,CardNum,BookNum):
  23. if(CardNum=="" or BookNum==""):
  24. return "不能为空"
  25. try:
  26. cursor=conn.cursor()
  27. sql="select times,rtime from borrow where cnum=%s and bnum=%s"
  28. cursor.execute(sql,(CardNum,BookNum))
  29. times=cursor.fetchone()
  30. if times is None:
  31. pass
  32. elif times[0]==1:
  33. r_time=times[1]
  34. r_time=r_time+datetime.timedelta(days=30)
  35. r_time=r_time.strftime("%Y-%m-%d %H:%M:%S")
  36. sql="update borrow set times=0,rtime=%s where cnum=%s and bnum=%s"
  37. cursor.execute(sql,(r_time,CardNum,BookNum))
  38. conn.commit()
  39. return (1,r_time)
  40. elif times[0]==0:
  41. return "续借次数已达上限"
  42. #前面要判断是否是续借,允许续借一次
  43. #判断完不是续借之后,还要判断是否借书数量已经达到上限
  44. sql="select numbers from card where cnum=%s"
  45. cursor.execute(sql,CardNum)
  46. result=cursor.fetchone()
  47. if result[0]>=10:
  48. return "借书数量超出上限"
  49. else:
  50. numbers=result[0]+1
  51. #
  52. sql="select bname,collection from book where bnum=%s"
  53. cursor.execute(sql,BookNum)
  54. result=cursor.fetchone()
  55. #此处的判断逻辑其实不是很好。。。先判断了是否超出上限,再判断的书是否存在。可能会导致用户为了借一本不存在的书,先去还书,回来才发现根本没有这本书
  56. if result is None:
  57. return "借书失败,书号不存在"
  58. if result[1]!=0:
  59. #借书成功
  60. bname=result[0]
  61. collection=result[1]-1
  62. sql="update book set collection=%s where bnum=%s"
  63. cursor.execute(sql,(collection,BookNum))
  64. b_time= datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
  65. r_time=(datetime.datetime.now()+datetime.timedelta(days=30)).strftime("%Y-%m-%d %H:%M:%S")
  66. sql="insert into borrow values(%s,%s,%s,%s,1)"
  67. cursor.execute(sql,(CardNum,BookNum,b_time,r_time))
  68. sql="update card set numbers=%s where cnum=%s"
  69. cursor.execute(sql,(numbers,CardNum))
  70. conn.commit()
  71. return (0,r_time,bname)
  72. else:
  73. sql="select min(rtime) from borrow where bnum=%s"
  74. cursor.execute(sql,BookNum)
  75. result=cursor.fetchone()
  76. r_time=result[0]
  77. r_time=r_time.strftime('%Y-%m-%d %H:%M:%S')
  78. return (2,r_time)
  79. except Exception as e:
  80. logging.exception(e)
  81. conn.rollback()
  82. return e

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/747772
推荐阅读
相关标签
  

闽ICP备14008679号