From 00d37404ff75dd0f44dcbff5a3a86b59ed796902 Mon Sep 17 00:00:00 2001
From: library <2317025768@qq.com>
Date: Sun, 2 Jun 2024 15:04:11 +0800
Subject: [PATCH] first commit
---
.../inspectionProfiles/profiles_settings.xml | 6 +
book-management-system/.idea/misc.xml | 6 +
book-management-system/.idea/modules.xml | 8 +
book-management-system/.idea/source.iml | 8 +
book-management-system/.idea/workspace.xml | 90 ++
book-management-system/AddPart.py | 123 +++
book-management-system/BorrowPart.py | 92 ++
book-management-system/CardPart.py | 54 ++
book-management-system/Gui.py | 825 ++++++++++++++++++
book-management-system/QueryPart.py | 43 +
book-management-system/ReturnPart.py | 40 +
.../__pycache__/AddPart.cpython-311.pyc | Bin 0 -> 6290 bytes
.../__pycache__/AddPart.cpython-37.pyc | Bin 0 -> 2720 bytes
.../__pycache__/BorrowPart.cpython-311.pyc | Bin 0 -> 4287 bytes
.../__pycache__/BorrowPart.cpython-37.pyc | Bin 0 -> 2206 bytes
.../__pycache__/CardPart.cpython-311.pyc | Bin 0 -> 2354 bytes
.../__pycache__/CardPart.cpython-37.pyc | Bin 0 -> 1387 bytes
.../__pycache__/QueryPart.cpython-311.pyc | Bin 0 -> 2312 bytes
.../__pycache__/QueryPart.cpython-37.pyc | Bin 0 -> 1475 bytes
.../__pycache__/ReturnPart.cpython-311.pyc | Bin 0 -> 2067 bytes
.../__pycache__/ReturnPart.cpython-37.pyc | Bin 0 -> 1209 bytes
book-management-system/bg.jpg | Bin 0 -> 56644 bytes
book-management-system/config.txt | 2 +
book-management-system/data.txt | 17 +
book-management-system/data2.txt | 7 +
book-management-system/succeed_log.txt | 0
library.sql | 102 +++
27 files changed, 1423 insertions(+)
create mode 100644 book-management-system/.idea/inspectionProfiles/profiles_settings.xml
create mode 100644 book-management-system/.idea/misc.xml
create mode 100644 book-management-system/.idea/modules.xml
create mode 100644 book-management-system/.idea/source.iml
create mode 100644 book-management-system/.idea/workspace.xml
create mode 100644 book-management-system/AddPart.py
create mode 100644 book-management-system/BorrowPart.py
create mode 100644 book-management-system/CardPart.py
create mode 100644 book-management-system/Gui.py
create mode 100644 book-management-system/QueryPart.py
create mode 100644 book-management-system/ReturnPart.py
create mode 100644 book-management-system/__pycache__/AddPart.cpython-311.pyc
create mode 100644 book-management-system/__pycache__/AddPart.cpython-37.pyc
create mode 100644 book-management-system/__pycache__/BorrowPart.cpython-311.pyc
create mode 100644 book-management-system/__pycache__/BorrowPart.cpython-37.pyc
create mode 100644 book-management-system/__pycache__/CardPart.cpython-311.pyc
create mode 100644 book-management-system/__pycache__/CardPart.cpython-37.pyc
create mode 100644 book-management-system/__pycache__/QueryPart.cpython-311.pyc
create mode 100644 book-management-system/__pycache__/QueryPart.cpython-37.pyc
create mode 100644 book-management-system/__pycache__/ReturnPart.cpython-311.pyc
create mode 100644 book-management-system/__pycache__/ReturnPart.cpython-37.pyc
create mode 100644 book-management-system/bg.jpg
create mode 100644 book-management-system/config.txt
create mode 100644 book-management-system/data.txt
create mode 100644 book-management-system/data2.txt
create mode 100644 book-management-system/succeed_log.txt
create mode 100644 library.sql
diff --git a/book-management-system/.idea/inspectionProfiles/profiles_settings.xml b/book-management-system/.idea/inspectionProfiles/profiles_settings.xml
new file mode 100644
index 0000000..105ce2d
--- /dev/null
+++ b/book-management-system/.idea/inspectionProfiles/profiles_settings.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/book-management-system/.idea/misc.xml b/book-management-system/.idea/misc.xml
new file mode 100644
index 0000000..28a804d
--- /dev/null
+++ b/book-management-system/.idea/misc.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/book-management-system/.idea/modules.xml b/book-management-system/.idea/modules.xml
new file mode 100644
index 0000000..66f3350
--- /dev/null
+++ b/book-management-system/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/book-management-system/.idea/source.iml b/book-management-system/.idea/source.iml
new file mode 100644
index 0000000..d0876a7
--- /dev/null
+++ b/book-management-system/.idea/source.iml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/book-management-system/.idea/workspace.xml b/book-management-system/.idea/workspace.xml
new file mode 100644
index 0000000..c21a6c4
--- /dev/null
+++ b/book-management-system/.idea/workspace.xml
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {
+ "associatedIndex": 5
+}
+
+
+
+
+
+
+ {
+ "keyToString": {
+ "Python.Gui.executor": "Run",
+ "RunOnceActivity.ShowReadmeOnStart": "true"
+ }
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1669031689251
+
+
+ 1669031689251
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/book-management-system/AddPart.py b/book-management-system/AddPart.py
new file mode 100644
index 0000000..347c0c4
--- /dev/null
+++ b/book-management-system/AddPart.py
@@ -0,0 +1,123 @@
+import pymysql
+import logging
+
+
+def AddOne(conn,BookNum,ClassOfBook,BookName,Publisher,Year,Author,Price,flag,num):
+ cursor=conn.cursor()
+
+ try:
+ #获取total
+ sql="select total from book"
+ if(BookNum=="" or ClassOfBook=="" or BookName=="" or Publisher=="" or Year=="" or Author=="" or Price==""):
+ return "不能有空项"
+ Year=int(Year)
+ Price=float(Price)
+ cursor.execute(sql)
+ total=cursor.fetchone()
+ if total is None:#目前还没有书,total为0
+ total=0
+ else:
+ total=total[0]
+
+ #获取collection
+ sql="select collection from book where bnum=%s"
+ cursor.execute(sql,BookNum)
+ collection=cursor.fetchone()
+ except Exception as e:
+ conn.rollback()
+ logging.exception(e)
+ return e
+
+ if collection is None:#书不存在,新增添一条记录
+ if(flag==1):#试图在书不存在的情况下直接修改信息,操作失败
+ return "此书尚未被收录,修改失败"
+ collection=num
+ total+=num
+ sql="insert into book values(%s,%s,%s,%s,%s,%s,%s,%s,%s)"
+
+ try:
+ cursor.execute(sql,(BookNum,ClassOfBook,BookName,Publisher,Year,Author,Price,total,collection))
+ sql="update book set total=%s"
+ cursor.execute(sql,(total))
+ conn.commit()
+ return (total,collection)
+ except Exception as e:
+ logging.exception(e)
+ conn.rollback()
+ return e
+
+ else: #书已经存在,根据flag,修改信息或者是增加一本
+ collection=collection[0]
+ try:
+ old_sql="select bnum,bclass,bname,publisher,year,author,price from book where bnum=%s"
+ cursor.execute(old_sql,BookNum)
+ old_record=cursor.fetchone() #取出原记录
+ sql="update book set bclass=%s,bname=%s,publisher=%s,year=%s,author=%s,price=%s where bnum=%s"#在事务内更新记录,然后再读取出来
+ cursor.execute(sql ,(ClassOfBook,BookName,Publisher,Year,Author,Price,BookNum))
+
+ new_sql="select bnum,bclass,bname,publisher,year,author,price from book where bnum=%s"
+ cursor.execute(new_sql ,BookNum)
+ new_record=cursor.fetchone() #取出新记录
+ if flag==0:#不修改,只添加
+ #比对新老两条记录,如果一样则把数量加一,不一样则报错
+ if old_record==new_record:
+ total+=num
+ collection+=num
+ sql="update book set total=%s,collection=%s where bnum=%s"
+ cursor.execute(sql ,(total,collection,BookNum))
+ sql="update book set total=%s"
+ cursor.execute(sql ,(total))
+ conn.commit()
+ return (total,collection)
+ else:
+ #应该会报错
+ conn.rollback()
+ return "与记录中信息不一致!"
+ else:
+ #要修改信息了
+ conn.commit()
+ return "修改成功"
+ except Exception as e:
+ logging.exception(e)
+ conn.rollback()
+ return e
+
+def AddBatch(conn,file_addr):
+ success_cnt=0
+ fail_cnt=0
+ succeed_list=[]
+ fail_list=[]
+ try:
+ with open(file_addr,"r",encoding="utf8") as f:
+ for line in f.readlines():
+ str1=line.strip('\n')#用来添加到列表里,保持原始格式
+ str2=line.strip('()\n').split(',')#用来取出各个属性值
+ if len(str2)!=8:
+ fail_list.append(str1)
+ break
+ BookNum=str2[0].strip()
+ ClassOfBook=str2[1].strip()
+ BookName=str2[2].strip()
+ Publisher=str2[3].strip()
+ Year=int(str2[4].strip())
+ Author=str2[5].strip()
+ Price=float(str2[6].strip())
+ num=int(str2[7].strip())
+ result=AddOne(conn,BookNum,ClassOfBook,BookName,Publisher,Year,Author,Price,0,num)
+ if type(result)==type(()):
+ succeed_list.append(str1)
+ success_cnt+=num
+ else:
+ fail_list.append(str1)
+ fail_cnt+=num
+
+
+ with open("succeed_log.txt","a") as s_f:
+ for line in succeed_list:
+ s_f.write(line)
+ s_f.write("\n")
+
+ return (len(succeed_list),success_cnt,len(fail_list),fail_cnt,fail_list)
+ except Exception as e:
+ logging.exception(e)
+ return e
\ No newline at end of file
diff --git a/book-management-system/BorrowPart.py b/book-management-system/BorrowPart.py
new file mode 100644
index 0000000..c0c4dae
--- /dev/null
+++ b/book-management-system/BorrowPart.py
@@ -0,0 +1,92 @@
+import pymysql
+import logging
+import datetime
+
+def ShowList(conn,CardNum):
+ if(CardNum==""):
+ return "借书证号不能为空"
+ try:
+ cursor=conn.cursor()
+ sql="select * from card where cnum=%s"
+ cursor.execute(sql,CardNum)
+ result=cursor.fetchone()
+ #要看输入的卡号是不是有效的
+ if result is None:
+ return "无效的借书证号"
+
+ sql="select bnum,bname,btime,rtime,times from book natural join borrow where cnum=%s"
+ cursor.execute(sql,CardNum)
+ result=cursor.fetchall()
+ return result
+
+
+ except Exception as e:
+ logging.exception(e)
+ return e
+
+def Borrow(conn,CardNum,BookNum):
+ if(CardNum=="" or BookNum==""):
+ return "不能为空"
+ try:
+ cursor=conn.cursor()
+ sql="select times,rtime from borrow where cnum=%s and bnum=%s"
+ cursor.execute(sql,(CardNum,BookNum))
+ times=cursor.fetchone()
+ if times is None:
+ pass
+ elif times[0]==1:
+ r_time=times[1]
+ r_time=r_time+datetime.timedelta(days=30)
+ r_time=r_time.strftime("%Y-%m-%d %H:%M:%S")
+ sql="update borrow set times=0,rtime=%s where cnum=%s and bnum=%s"
+ cursor.execute(sql,(r_time,CardNum,BookNum))
+ conn.commit()
+ return (1,r_time)
+ elif times[0]==0:
+ return "续借次数已达上限"
+ #前面要判断是否是续借,允许续借一次
+ #判断完不是续借之后,还要判断是否借书数量已经达到上限
+ sql="select numbers from card where cnum=%s"
+ cursor.execute(sql,CardNum)
+ result=cursor.fetchone()
+ if result[0]>=10:
+ return "借书数量超出上限"
+ else:
+ numbers=result[0]+1
+ #
+ sql="select bname,collection from book where bnum=%s"
+ cursor.execute(sql,BookNum)
+ result=cursor.fetchone()
+ #此处的判断逻辑其实不是很好。。。先判断了是否超出上限,再判断的书是否存在。可能会导致用户为了借一本不存在的书,先去还书,回来才发现根本没有这本书
+ if result is None:
+ return "借书失败,书号不存在"
+ if result[1]!=0:
+ #借书成功
+ bname=result[0]
+ collection=result[1]-1
+ sql="update book set collection=%s where bnum=%s"
+ cursor.execute(sql,(collection,BookNum))
+ b_time= datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
+ r_time=(datetime.datetime.now()+datetime.timedelta(days=30)).strftime("%Y-%m-%d %H:%M:%S")
+ sql="insert into borrow values(%s,%s,%s,%s,1)"
+ cursor.execute(sql,(CardNum,BookNum,b_time,r_time))
+ sql="update card set numbers=%s where cnum=%s"
+ cursor.execute(sql,(numbers,CardNum))
+ conn.commit()
+ return (0,r_time,bname)
+ else:
+ #借书失败,因为库存不足
+ #关于如何返回最早的还书时间这一点明天再说
+ #查到的方法中,最起码可以把两个表join然后比较
+ #但是我比较想用聚合函数来做,因为简单(datatime类型的数据不知道能不能用聚合函数)答案是能!
+ sql="select min(rtime) from borrow where bnum=%s"
+ cursor.execute(sql,BookNum)
+ result=cursor.fetchone()
+ r_time=result[0]
+ r_time=r_time.strftime('%Y-%m-%d %H:%M:%S')
+ return (2,r_time)
+
+ except Exception as e:
+ logging.exception(e)
+ conn.rollback()
+ return e
\ No newline at end of file
diff --git a/book-management-system/CardPart.py b/book-management-system/CardPart.py
new file mode 100644
index 0000000..2a1a51b
--- /dev/null
+++ b/book-management-system/CardPart.py
@@ -0,0 +1,54 @@
+import pymysql
+import logging
+
+def AddCard(conn,CardNum,Name,Dept,Type,flag):
+ #既可以增加借书证,也可以修改原借书证信息
+ #具体可以参考图书入库部分
+ #flag=0代表增加,flag=1代表修改
+ #修改功能是为了考虑到可能会更改单位之类的(比如转专业?)
+ if CardNum=="" or Name=="" or Dept=="" or Type=="":
+ return "不能有空项"
+ try:
+ cursor=conn.cursor()
+ sql="select * from card where cnum=%s"
+ cursor.execute(sql,CardNum)
+ result=cursor.fetchone()
+ #首先排除两个特殊情况:增加一个已经存在的证,或者是修改一个不存在的证
+ if result is None :
+ if flag==1:
+ return "借书证不存在,修改失败"
+ elif flag==0:
+ return "此借书证已存在,增加失败"
+
+ if flag==0:
+ sql="insert into card values(%s,%s,%s,%s,0)"
+ cursor.execute(sql,(CardNum,Name,Dept,Type))
+ conn.commit()
+ return 1
+ else:
+ sql="update card set name=%s,department=%s,type=%s where cnum=%s"
+ cursor.execute(sql,(Name,Dept,Type,CardNum))
+ conn.commit()
+ return 2
+ except Exception as e:
+ conn.rollback()
+ return e
+
+def DeleteCard(conn,CardNum):
+ if CardNum=="":
+ return "卡号不能为空"
+ try:
+ cursor=conn.cursor()
+ sql="select * from card where cnum=%s"
+ cursor.execute(sql,CardNum)
+ result=cursor.fetchone()
+ if result is None:
+ return "借书证不存在"
+
+ sql="delete from card where cnum=%s"
+ cursor.execute(sql,CardNum)
+ conn.commit()
+ return 1
+ except Exception as e:
+ conn.rollback()
+ return e
diff --git a/book-management-system/Gui.py b/book-management-system/Gui.py
new file mode 100644
index 0000000..df31f04
--- /dev/null
+++ b/book-management-system/Gui.py
@@ -0,0 +1,825 @@
+class basedesk():
+ def __init__(self,master):
+
+ self.root=master
+ self.root.title('图书管理系统')
+ self.root.geometry('1000x700')
+
+
+ initwin(self.root)
+
+class initwin(): #主窗口
+ def __init__(self,master):
+ global im
+ global image
+ self.master=master
+ self.master.config(bg='Magenta')
+ self.initwin=tk.Frame(self.master,)
+ self.initwin.pack()
+ self.canvas = tk.Canvas(self.initwin,
+ width = 1000,
+ height = 700,
+ bg = 'green')
+
+ image=Image.open('bg.jpg')
+ im=ImageTk.PhotoImage(image)
+
+ self.canvas.create_image(0,0,anchor='nw',image = im) # 使用create_image将图片添加到Canvas组件中
+
+ self.canvas.pack() # 将Canvas添加到主窗口
+ btn_add=ttk.Button(self.initwin,text="图书入库或修改信息",command=self.add)
+ btn_query=ttk.Button(self.initwin,text="查询图书信息",command=self.query)
+ btn_card=ttk.Button(self.initwin,text="借书证管理",command=self.card)
+ btn_borrow=ttk.Button(self.initwin,text="借书",command=self.borrow)
+ btn_return=ttk.Button(self.initwin,text="还书",command=self.returnbook)#return是保留字。。。
+
+ self.canvas.create_window(100,50,width=200,height=40,window=btn_add)
+ self.canvas.create_window(100,100,width=200,height=40,window=btn_query)
+ self.canvas.create_window(100,250,width=200,height=40,window=btn_card)
+ self.canvas.create_window(100,150,width=200,height=40,window=btn_borrow)
+ self.canvas.create_window(100,200,width=200,height=40,window=btn_return)
+
+ self.title=tk.Label(self.initwin,text="图书管理系统",font=("宋体",30))
+ self.canvas.create_window(400,150,anchor="nw",width=300,height=70,window=self.title)
+
+ def add(self,): #add窗口,实现的功能:选择批量入库或者单本入库,添加或是修改
+ self.initwin.destroy()
+ addwin(self.master)
+ def query(self):
+ self.initwin.destroy()
+ querywin(self.master)
+ def card(self):
+ self.initwin.destroy()
+ cardwin(self.master)
+ def borrow(self):
+ self.initwin.destroy()
+ borrowwin(self.master)
+ def returnbook(self):
+ self.initwin.destroy()
+ returnwin(self.master)
+
+class addwin():
+ def __init__(self,master):
+ global im
+ global image
+ self.master=master
+ self.master.config(bg='GhostWhite')
+ self.str="此处输出状态信息"
+ self.addwin=tk.Frame(self.master,)
+ self.addwin.pack()
+ self.canvas = tk.Canvas(self.addwin,
+ width = 1000,
+ height = 700,
+ bg = 'white')
+
+ image=Image.open('bg.jpg')
+ im=ImageTk.PhotoImage(image)
+
+ self.canvas.create_image(0,0,anchor='nw',image = im) # 使用create_image将图片添加到Canvas组件中
+
+ self.canvas.pack() # 将Canvas添加到窗口
+ self.btn_back=ttk.Button(self.addwin,text="返回主菜单",command=self.back)
+ #btn_back.pack()
+ self.canvas.create_window(100,50,width=200,height=40,window=self.btn_back)
+
+ self.mode=tk.IntVar() #选择入库模式(单本或者批量)
+
+ self.style_radio=ttk.Style()
+ self.style_radio.configure("radio.TRadiobutton",font=("微软雅黑",12),background="Aqua")
+
+ self.r1=ttk.Radiobutton(self.addwin,text="单本入库(或修改信息)",variable=self.mode,value=1,command=self.display1,style="radio.TRadiobutton")
+ self.r2=ttk.Radiobutton(self.addwin,text="批量入库",variable=self.mode,value=2,command=self.display2,style="radio.TRadiobutton")
+ self.canvas.create_window(400,50,window=self.r1)
+ self.canvas.create_window(400,100,window=self.r2)
+
+ self.style_label=ttk.Style()
+ self.style_label.configure("label.TLabel",font=("微软雅黑",14))
+ self.s_title=ttk.Label(self.addwin,text="状态栏",style="label.TLabel", width=30,anchor="center")
+ self.state=tk.Message(self.addwin,text=self.str,width=300,font=("微软雅黑",12))
+ self.canvas.create_window(800,100,height=50,window=self.s_title)
+ self.canvas.create_window(650,150,anchor="nw",width=300,window=self.state)
+ self.flag1=0#标记“批量入库”的控件是否存在的flag
+ self.flag2=0#标记“单本入库”的控件是否存在的flag
+ self.cflag=0#change flag,用来区分是添加一本书还是修改书的信息.为1时代表修改
+
+
+ def display2(self,):
+ if(self.flag2==1):
+ self.bnum_prom.destroy()
+ self.cob_prom.destroy()
+ self.bname_prom.destroy()
+ self.pub_prom.destroy()
+ self.y_prom.destroy()
+ self.auth_prom.destroy()
+ self.pri_prom.destroy()
+ self.btn_conf2.destroy()
+ self.btn_conf3.destroy()
+ self.bnum_input.destroy()
+ self.cob_input.destroy()
+ self.bname_input.destroy()
+ self.pub_input.destroy()
+ self.y_input.destroy()
+ self.auth_input.destroy()
+ self.pri_input.destroy()
+ self.flag2=0
+
+ if(self.flag1==1):
+ return
+
+ self.f_prom=ttk.Label(self.addwin,text="请输入文件名字:",font=('微软雅黑', 12), width=70, style="label.TLabel",anchor="center")
+
+
+ self.f_input=tk.Entry(self.addwin,show=None,font=("微软雅黑",14))
+
+ self.btn_conf1=ttk.Button(self.addwin,text="确认",command=self.onclick1)####此处不输入直接点击会有bug
+
+ self.flag1=1#(用来记录是否创建f_input)
+ self.canvas.create_window(400,150,height=50,width=300,window=self.f_input)
+ self.canvas.create_window(400,250,height=50,window=self.btn_conf1)
+ self.canvas.create_window(150,150,height=50,width=150,window=self.f_prom)
+
+ def display1(self,):
+ if(self.flag1==1):
+ self.f_input.destroy()
+ self.btn_conf1.destroy()
+ self.f_prom.destroy()
+ self.flag1=0
+
+ if(self.flag2==1):
+ return
+
+ self.bnum_prom=ttk.Label(self.addwin,text="书号:",anchor="center",style="label.TLabel", width=50)
+ self.cob_prom=ttk.Label(self.addwin,text="类别:",anchor="center",style="label.TLabel",width=50)
+ self.bname_prom=ttk.Label(self.addwin,text="书名:",anchor="center",style="label.TLabel", width=50)
+ self.pub_prom=ttk.Label(self.addwin,text="出版社:",anchor="center",style="label.TLabel", width=50)
+ self.y_prom=ttk.Label(self.addwin,text="年份:",anchor="center",style="label.TLabel", width=50)
+ self.auth_prom=ttk.Label(self.addwin,text="作者:",anchor="center",style="label.TLabel", width=50)
+ self.pri_prom=ttk.Label(self.addwin,text="价格:",anchor="center",style="label.TLabel", width=50)
+
+ self.btn_conf2=ttk.Button(self.addwin,text="入库",command=self.onclick2)
+ self.btn_conf3=ttk.Button(self.addwin,text="修改",command=self.onclick3)
+
+ self.bnum_input=tk.Entry(self.addwin,show=None,font=("微软雅黑",14),width=20)
+ self.cob_input=tk.Entry(self.addwin,show=None,font=("微软雅黑",14),width=20)
+ self.bname_input=tk.Entry(self.addwin,show=None,font=("微软雅黑",14),width=20)
+ self.pub_input=tk.Entry(self.addwin,show=None,font=("微软雅黑",14),width=20)
+ self.y_input=tk.Entry(self.addwin,show=None,font=("微软雅黑",14),width=20)
+ self.auth_input=tk.Entry(self.addwin,show=None,font=("微软雅黑",14),width=20)
+ self.pri_input=tk.Entry(self.addwin,show=None,font=("微软雅黑",14),width=20)
+
+ self.flag2=1#标记一下上面的东西都被创立了,下面要把它们放在画布上
+
+ self.canvas.create_window(250,150,width=70,window=self.bnum_prom)
+ self.canvas.create_window(410,150,height=30,window=self.bnum_input)
+ self.canvas.create_window(250,200,width=70,window=self.cob_prom)
+ self.canvas.create_window(410,200,height=30,window=self.cob_input)
+ self.canvas.create_window(250,250,width=70,window=self.bname_prom)
+ self.canvas.create_window(410,250,height=30,window=self.bname_input)
+ self.canvas.create_window(250,300,width=70,window=self.pub_prom)
+ self.canvas.create_window(410,300,height=30,window=self.pub_input)
+ self.canvas.create_window(250,350,width=70,window=self.y_prom)
+ self.canvas.create_window(410,350,height=30,window=self.y_input)
+ self.canvas.create_window(250,400,width=70,window=self.auth_prom)
+ self.canvas.create_window(410,400,height=30,window=self.auth_input)
+ self.canvas.create_window(250,450,width=70,window=self.pri_prom)
+ self.canvas.create_window(410,450,height=30,window=self.pri_input)
+
+ self.canvas.create_window(300,500,window=self.btn_conf2)
+ self.canvas.create_window(420,500,window=self.btn_conf3)
+
+ def onclick1(self,):
+ #基本完成,批量入库的部分
+ file_addr=self.f_input.get()
+ result=AddPart.AddBatch(conn,file_addr)
+ self.state.destroy()
+ if type(result)==type(()):
+ self.str="导入完毕\n成功导入 %d 条记录,共 %d 本\n导入记录存至succeed_log.txt中\n导入失败 %d 条记录,共 %d 本\n详见屏幕下方"%(result[0],result[1],result[2],result[3])
+ self.f_list=scrolledtext.ScrolledText(self.addwin,width=700,height=300,font=("微软雅黑",12))
+ self.f_str="以下是导入失败的书的名单\n"
+ self.f_list.insert(END,self.f_str)
+ for _ in result[4]:
+ self.f_list.insert(END,_+"\n")
+ self.f_list.config(state='disabled')
+ self.canvas.create_window(100,280,width=700,height=300,anchor="nw",window=self.f_list)
+ self.btn_list=ttk.Button(self.addwin,text="确认导入失败名单",command=self.destroy_flist)
+ self.canvas.create_window(400,600,anchor="nw",window=self.btn_list)
+ self.r1.config(state="disabled")
+ self.r2.config(state="disabled")
+ else:
+ self.str=result
+ self.state=tk.Message(self.addwin,text=self.str,width=300,font=("微软雅黑",12))
+ self.canvas.create_window(650,150,anchor="nw",width=300,window=self.state)
+
+ def destroy_flist(self):
+ self.addwin.destroy()
+ addwin(self.master)
+
+ def onclick2(self,):
+ bnum=self.bnum_input.get()
+ cob=self.cob_input.get()
+ bname=self.bname_input.get()
+ pub=self.pub_input.get()
+ y=self.y_input.get()
+ auth=self.auth_input.get()
+ pri=self.pri_input.get()
+ result=AddPart.AddOne(conn,bnum,cob,bname,pub,y,auth,pri,self.cflag,1)
+ if type(result)==type(()):
+ self.str="添加成功\n图书馆现有此书%d本\n共有藏书%d本"%(result[1],result[0])
+ elif result!="修改成功":
+ self.str=result
+ else:
+ self.str=result
+ self.state.destroy()
+ self.state=tk.Message(self.addwin,text=self.str,width=300,font=("微软雅黑",12))
+ self.canvas.create_window(650,150,anchor="nw",width=300,window=self.state)
+ self.cflag=0
+
+ def onclick3(self,):
+ self.cflag=1
+ self.onclick2()
+
+
+ def back(self,):
+ self.addwin.destroy()
+ initwin(self.master)
+
+class querywin():
+ def __init__(self,master):
+ global im
+ global image
+ self.master=master
+ self.querywin=tk.Frame(self.master,)
+ self.querywin.pack()
+ self.canvas=tk.Canvas(self.querywin,
+ width=1000,
+ height=700,
+ bg='white')
+
+ image=Image.open('bg.jpg')
+ im=ImageTk.PhotoImage(image)
+
+ self.canvas.create_image(0,0,anchor="nw",image=im)
+
+ self.canvas.pack()
+ self.btn_back=ttk.Button(self.querywin,text="返回主菜单",command=self.back)
+ self.canvas.create_window(100,50,width=200,height=40,window=self.btn_back)
+
+ self.style_l=ttk.Style()
+ self.style_l.configure("l.TLabel",font=("微软雅黑",14))
+
+ self.style_e=ttk.Style()
+ self.style_e.configure("e.TLabel",font=("微软雅黑",14))
+
+ self.sel_title=ttk.Label(self.querywin,text="请选择您的查询方式,并点击确认",width=30,style="l.TLabel",anchor="center")
+ self.canvas.create_window(310,90,height=50,anchor="nw",window=self.sel_title)
+
+ self.btn_sel=ttk.Button(self.querywin,text="确认",command=self.judge)
+ self.canvas.create_window(435,420,anchor="nw",height=40,window=self.btn_sel)
+
+ self.list=tk.Listbox(self.querywin)
+ for i in ["类别","书名","出版社","年份(区间)","作者","价格(区间)"]:
+ self.list.insert(END,i)
+ self.list.config(font=("微软雅黑",16),height=6)
+ self.canvas.create_window(310,200,width=340,anchor="nw",window=self.list)
+
+ def judge(self):
+ self.sel_index=self.list.curselection()
+ if self.sel_index==():
+ pass
+ else:
+ self.query(self.sel_index[0])
+
+ def query(self,index):
+ self.index=index
+ self.search_str=self.list.get(index)
+ self.sel_title.destroy()
+ self.btn_sel.destroy()
+ self.list.destroy()
+ #首先把之前的控件都destroy掉,然后根据index的值来生成不同的控件
+ #如果是单值查询,则只有一个输入框
+ #如果是区间查询,则要两个输入框(index为3或5)
+
+ if index!=3 and index !=5:
+ self.search_prom1=ttk.Label(self.querywin,text="请输入 "+self.search_str+":",style="l.TLabel",width=20,anchor="center")
+ self.search_input1=tk.Entry(self.querywin,show=None,font=("微软雅黑",14))
+ self.btn_search1=ttk.Button(self.querywin,text="查询",command=self.onclick1)
+
+ self.canvas.create_window(150,150,anchor="nw",height=50,window=self.search_prom1)
+ self.canvas.create_window(400,150,anchor="nw",height=50,width=300,window=self.search_input1)
+ self.canvas.create_window(780,150,anchor="nw",height=50,window=self.btn_search1)
+
+ else:
+ #pass
+ self.search_prom2=ttk.Label(self.querywin,text="请输入 "+self.search_str+':',style="l.TLabel",anchor="center",width=20)
+ self.search_input2=tk.Entry(self.querywin,show=None,font=("微软雅黑",14))
+ self.search_link=ttk.Label(self.querywin,text="————")
+ self.search_input3=tk.Entry(self.querywin,show=None,font=("微软雅黑",14))
+ self.btn_search2=ttk.Button(self.querywin,text="查询",command=self.onclick2)
+
+ self.canvas.create_window(150,150,anchor="nw",height=50,window=self.search_prom2)
+ self.canvas.create_window(400,155,anchor="nw",width=100,height=40,window=self.search_input2)
+ self.canvas.create_window(550,165,anchor="nw",window=self.search_link)
+ self.canvas.create_window(650,155,anchor="nw",width=100,height=40,window=self.search_input3)
+ self.canvas.create_window(800,150,anchor="nw",height=50,window=self.btn_search2)
+
+ def onclick1(self):
+ result=QueryPart.QueryBook(conn,self.search_input1.get(),0,self.index)
+ #针对单值查询,把参数传到查询部分中,然后调用show函数显示结果
+ self.show(result)
+
+ def onclick2(self):
+ result=QueryPart.QueryBook(conn,self.search_input2.get(),self.search_input3.get(),self.index)
+ #针对区间查询,把参数传到查询部分中,然后调用show函数显示结果
+ self.show(result)
+
+ def show(self,result):
+ #美观方面的问题还需要改进。。。现在先大体实现功能
+ #重构此部分,由label改为ttk的Treeview
+ self.query_list=ttk.Treeview(self.querywin,columns=["书号","类别","书名","出版社","年份","作者","价格","库存数"],show="headings")#show设为headings可以隐藏首列
+ self.query_list.column("书号",width=100)
+ self.query_list.column("类别",width=150)
+ self.query_list.column("书名",width=200)
+ self.query_list.column("出版社",width=150)
+ self.query_list.column("年份",width=50)
+ self.query_list.column("作者",width=100)
+ self.query_list.column("价格",width=80)
+ self.query_list.column("库存数",width=80)
+ self.query_list.heading("书号",text="书号",)
+ self.query_list.heading("类别",text="类别",)
+ self.query_list.heading("书名",text="书名",)
+ self.query_list.heading("出版社",text="出版社")
+ self.query_list.heading("年份",text="年份")
+ self.query_list.heading("作者",text="作者")
+ self.query_list.heading("价格",text="价格")
+ self.query_list.heading("库存数",text="库存数")
+ self.canvas.create_window(50,250,height=300,anchor="nw",window=self.query_list)
+
+ self.query_bar=ttk.Scrollbar(self.querywin,orient='vertical',command=self.query_list.yview)
+ self.query_list.configure(yscrollcommand=self.query_bar.set)
+ self.canvas.create_window(960,250,height=300,anchor="nw",window=self.query_bar)
+ self.btn_list=ttk.Button(self.querywin,text="返回",command=self.destroy_search)
+ self.canvas.create_window(480,580,height=30,width=50,window=self.btn_list)
+ if type(result)!=type(()):
+ return
+ i=0#临时变量
+ for item in result:
+ self.bnum_str=item[0]
+ self.class_str=item[1]
+ self.bname_str=item[2]
+ self.pub_str=item[3]
+ self.year_str=item[4]
+ self.auth_str=item[5]
+ self.pri_str=item[6]
+ self.coll_str=item[7]
+ self.query_list.insert("",i,values=(item[0],item[1],item[2],item[3],item[4],item[5],item[6],item[7]))
+ i+=1
+ #print(result)
+ #把传过来的结果显示出来,参数没定下来。。。
+
+
+ def destroy_search(self):
+ self.querywin.destroy()
+ querywin(self.master)
+
+ def back(self):
+ self.querywin.destroy()
+ initwin(self.master)
+
+class cardwin():
+ def __init__(self,master):
+ global im
+ global image
+ self.master=master
+ self.cardwin=tk.Frame(self.master)
+ self.cardwin.pack()
+ self.canvas=tk.Canvas(self.cardwin,
+ width=1000,
+ height=700,
+ bg='white')
+
+ image=Image.open('bg.jpg')
+ im=ImageTk.PhotoImage(image)
+
+ self.canvas.create_image(0, 0, anchor="nw", image=im)
+
+ self.canvas.pack()
+ self.btn_back=ttk.Button(self.cardwin,text="返回主菜单",command=self.back)
+ self.canvas.create_window(100,50,width=200,height=40,window=self.btn_back)
+
+ self.mode=tk.IntVar()
+
+ self.style_r=ttk.Style()
+ self.style_r.configure("r.TRadiobutton",font=("微软雅黑",10),background="Aqua")
+ self.r1=ttk.Radiobutton(self.cardwin,text="增添或修改",variable=self.mode,value=1,command=self.Add,style="r.TRadiobutton")
+ self.r2=ttk.Radiobutton(self.cardwin,text="删除借书证",variable=self.mode,value=2,command=self.Delete,style="r.TRadiobutton")
+
+ self.canvas.create_window(400,50,window=self.r1)
+ self.canvas.create_window(400,100,window=self.r2)
+
+ self.flag_add=0
+ self.flag_del=0
+ self.cflag=0
+ self.type="S"
+
+ self.str="状态信息"
+ self.style_l=ttk.Style()
+ self.style_l.configure("l.TLabel",font=("微软雅黑",14))
+ self.s_title=ttk.Label(self.cardwin,text="状态栏",width=30,style="l.TLabel",anchor="center")
+ self.state=tk.Message(self.cardwin,text=self.str,width=300,font=("微软雅黑",12))
+ self.canvas.create_window(800,100,height=50,window=self.s_title)
+ self.canvas.create_window(650,150,anchor="nw",width=300,window=self.state)
+
+ def Add(self):
+ if self.flag_del==1:
+
+ self.cnum_input.destroy()
+ self.cnum_prom.destroy()
+ self.btn_del.destroy()
+
+ self.flag_del=0
+ if self.flag_add==1:
+ return
+
+ self.cnum_prom=ttk.Label(self.cardwin,text="借书证号:",style="l.TLabel",width=50,anchor="center")
+ self.name_prom=ttk.Label(self.cardwin,text="姓名:",style="l.TLabel",width=50,anchor="center")
+ self.dept_prom=ttk.Label(self.cardwin,text="所属单位(学院):",style="l.TLabel",width=50,anchor="center")
+ self.type_prom=ttk.Label(self.cardwin,text="身份类别:",style="l.TLabel",width=50,anchor="center")
+
+ self.canvas.create_window(150,150,anchor="nw",width=150,height=40,window=self.cnum_prom)
+ self.canvas.create_window(150,200,anchor="nw",width=150,height=40,window=self.name_prom)
+ self.canvas.create_window(150,250,anchor="nw",width=150,height=40,window=self.dept_prom)
+ self.canvas.create_window(150,300,anchor="nw",width=150,height=40,window=self.type_prom)
+
+ self.cnum_input=tk.Entry(self.cardwin,show=None,font=("微软雅黑",14))
+ self.name_input=tk.Entry(self.cardwin,show=None,font=("微软雅黑",14))
+ self.dept_input=tk.Entry(self.cardwin,show=None,font=("微软雅黑",14))
+
+ self.style_r1=ttk.Style()
+ self.style_r1.configure("r1.TRadiobutton",font=("微软雅黑",14))
+ self.type_input=tk.IntVar()
+ self.type_input1=ttk.Radiobutton(self.cardwin,text="老师",variable=self.type_input,value=1,command=self.T_type,style="r1.TRadiobutton")
+ self.type_input2=ttk.Radiobutton(self.cardwin,text="学生",variable=self.type_input,value=2,command=self.S_type,style="r1.TRadiobutton")
+
+ self.canvas.create_window(350,150,anchor="nw",height=40,window=self.cnum_input)
+ self.canvas.create_window(350,200,anchor="nw",height=40,window=self.name_input)
+ self.canvas.create_window(350,250,anchor="nw",height=40,window=self.dept_input)
+ self.canvas.create_window(380,305,anchor="nw",window=self.type_input1)
+ self.canvas.create_window(480,305,anchor="nw",window=self.type_input2)
+
+ self.btn_add=ttk.Button(self.cardwin,text="增添",command=self.add)
+ self.btn_change=ttk.Button(self.cardwin,text="修改",command=self.change)
+
+ self.canvas.create_window(250,400,anchor="nw",window=self.btn_add)
+ self.canvas.create_window(400,400,anchor="nw",window=self.btn_change)
+ self.flag_add=1
+
+
+ def add(self):
+ cnum=self.cnum_input.get()
+ name=self.name_input.get()
+ dept=self.dept_input.get()
+ Type=self.type
+ result=CardPart.AddCard(conn,cnum,name,dept,Type,self.cflag)
+ if result==1:
+ self.str="添加成功"
+ elif result==2:
+ self.str="修改成功"
+ else :
+ self.str=result
+ self.state.destroy()
+ self.state=tk.Message(self.cardwin,text=self.str,width=300,font=("微软雅黑",12))
+ self.canvas.create_window(650,150,anchor="nw",width=300,window=self.state)
+ self.cflag=0
+
+
+ def change(self):
+ self.cflag=1
+ self.add()
+
+ def T_type(self):
+ self.type="T"
+
+ def S_type(self):
+ self.type="S"
+
+ def Delete(self):
+ if self.flag_add==1:
+ #destroy
+ self.cnum_prom.destroy()
+ self.cnum_input.destroy()
+ self.name_prom.destroy()
+ self.name_input.destroy()
+ self.dept_prom.destroy()
+ self.dept_input.destroy()
+ self.type_prom.destroy()
+
+ self.type_input1.destroy()
+ self.type_input2.destroy()
+ self.btn_add.destroy()
+ self.btn_change.destroy()
+ self.flag_add=0
+
+ if self.flag_del==1:
+ return
+
+ self.cnum_prom=ttk.Label(self.cardwin,text="请输入借书证号:",style="l.TLabel",width=70,anchor="center")
+ self.cnum_input=tk.Entry(self.cardwin,show=None,font=("微软雅黑",14))
+ self.btn_del=ttk.Button(self.cardwin,text="删除",command=self.dele)
+
+ self.canvas.create_window(150,200,width=150,height=50,anchor="nw",window=self.cnum_prom)
+ self.canvas.create_window(350,205,width=250,height=40,anchor="nw",window=self.cnum_input)
+ self.canvas.create_window(430,300,width=70,height=40,anchor="nw",window=self.btn_del)
+
+ self.flag_del=1
+ def dele(self):
+ cnum=self.cnum_input.get()
+ result=CardPart.DeleteCard(conn,cnum)
+
+ if(result==1):
+ self.str="删除成功"
+ else:
+ self.str=result
+
+ self.state.destroy()
+ self.state=tk.Message(self.cardwin,text=self.str,width=300,font=("微软雅黑",12))
+ self.canvas.create_window(650,150,anchor="nw",width=300,window=self.state)
+
+ def back(self):
+ self.cardwin.destroy()
+ initwin(self.master)
+
+class borrowwin():
+ def __init__(self,master):
+ global im
+ global image
+ self.master=master
+ self.borrowwin=tk.Frame(self.master)
+ self.borrowwin.pack()
+ self.canvas=tk.Canvas(self.borrowwin,
+ width=1000,
+ height=700,
+ bg='white')
+
+ image=Image.open('bg.jpg')
+ im=ImageTk.PhotoImage(image)
+
+ self.canvas.create_image(0,0,anchor="nw",image=im)
+
+ self.canvas.pack()
+ self.btn_back=ttk.Button(self.borrowwin,text="返回主菜单",command=self.back)
+ self.canvas.create_window(100,50,width=200,height=40,window=self.btn_back)
+
+ self.style_l=ttk.Style()
+ self.style_l.configure("l.TLabel",font=("微软雅黑",14))
+
+ self.cnum_prom=ttk.Label(self.borrowwin,text="请输入借书证号:",style="l.TLabel",anchor="center")
+ self.cnum_input=tk.Entry(self.borrowwin,show=None,font=("微软雅黑",14))
+ self.btn_cnum=ttk.Button(self.borrowwin,text="确认",command=self.confirm)
+
+ self.canvas.create_window(100,100,height=40,width=200,anchor="nw",window=self.cnum_prom)
+ self.canvas.create_window(350,100,height=40,width=300,anchor="nw",window=self.cnum_input)
+ self.canvas.create_window(700,100,height=40,width=70,anchor="nw",window=self.btn_cnum)
+
+ def confirm(self):
+ CardNum=self.cnum_input.get()
+ self.cnum=CardNum
+ borrow_list=BorrowPart.ShowList(conn,CardNum)
+ self.borrow_list=borrow_list
+ self.btn_next=ttk.Button(self.borrowwin,text="下一步",command=self.next)
+ self.canvas.create_window(430,550,width=100,height=40,anchor="nw",window=self.btn_next)
+ self.btn_cnum['state']='disabled'
+
+ if type(borrow_list)!=type(()):
+ self.error=ttk.Label(self.borrowwin,text=borrow_list,style="l.TLabel",anchor="center")
+ self.canvas.create_window(400,300,width=200,height=50,anchor="nw",window=self.error)
+ if type(borrow_list)==type(()):
+ self.query_list=ttk.Treeview(self.borrowwin,columns=["书号","书名","借书时间","归还期限","是否可以续借"],show="headings")#show设为headings可以隐藏首列
+ self.query_list.column("书号",width=100)
+ self.query_list.column("书名",width=200)
+ self.query_list.column("借书时间",width=200)
+ self.query_list.column("归还期限",width=200)
+ self.query_list.column("是否可以续借",width=80)
+ self.query_list.heading("书号",text="书号",)
+ self.query_list.heading("书名",text="书名",)
+ self.query_list.heading("借书时间",text="借书时间")
+ self.query_list.heading("归还期限",text="归还期限")
+ self.query_list.heading("是否可以续借",text="是否可以续借")
+ self.canvas.create_window(100,250,height=230,anchor="nw",window=self.query_list)
+ #下面这个滚动条做的不是很成功。。。但是我发现不用滚动条也可以用鼠标滚轮去上下翻滚。那我何必非得弄个滚动条呢。。。
+ #但我还是弄了.jpg
+ # self.query_bar=ttk.Scrollbar(self.borrowwin,orient='vertical',command=self.query_list.yview)
+ # self.query_list.configure(yscrollcommand=self.query_bar.set)
+ # self.canvas.create_window(880,250,height=300,anchor="nw",window=self.query_bar)
+ i=0#临时变量
+ for item in borrow_list:
+ if item[4]==0:
+ self.plus="不可以"
+ else:
+ self.plus="可以"
+ self.query_list.insert("",i,values=(item[0],item[1],item[2],item[3],self.plus))
+ i+=1
+
+
+ def next(self):
+ if type(self.borrow_list)==type(()):
+ self.query_list.destroy()
+ #self.query_bar.destroy()
+ self.cnum_prom.destroy()
+ self.cnum_input.destroy()
+ self.btn_cnum.destroy()
+ self.btn_next.destroy()
+
+ self.bnum_prom=ttk.Label(self.borrowwin,text="请输入书号:",style="l.TLabel",anchor="center")
+ self.bnum_input=tk.Entry(self.borrowwin,show=None,font=("微软雅黑",14))
+ self.btn_bnum=ttk.Button(self.borrowwin,text="借书",command=self.borrow)
+
+ self.canvas.create_window(250,150,height=40,anchor="nw",window=self.bnum_prom)
+ self.canvas.create_window(400,150,anchor="nw",height=40,window=self.bnum_input)
+ self.canvas.create_window(650,150,anchor="nw",height=40,window=self.btn_bnum)
+ else:
+ self.borrowwin.destroy()
+ borrowwin(self.master)
+
+ def borrow(self):
+ self.bnum=self.bnum_input.get()
+ result=BorrowPart.Borrow(conn,self.cnum,self.bnum)
+ if type(result)==type(()):
+ if result[0]==0:
+ self.borrow_str="%s借书成功,请在%s前归还"%(result[2],result[1])
+ elif result[0]==1:
+ self.borrow_str="续借成功,请在%s前归还"%(result[1])
+ elif result[0]==2:
+ self.borrow_str="尚无库存,最早归还日期为%s"%result[1]
+ else:
+ self.borrow_str=result
+ self.borrow_success=ttk.Label(self.borrowwin,text=self.borrow_str,style="l.TLabel",anchor="center")
+ self.btn_borrow_over=tk.Button(self.borrowwin,text="返回上一级菜单",command=self.return_last)
+ self.canvas.create_window(170,300,width=700,anchor="nw",height=50,window=self.borrow_success)
+ self.canvas.create_window(450,400,anchor="nw",width=100,height=40,window=self.btn_borrow_over)
+
+ def return_last(self):
+ self.borrowwin.destroy()
+ borrowwin(self.master)
+
+ def back(self):
+ self.borrowwin.destroy()
+ initwin(self.master)
+
+class returnwin():
+ def __init__(self,master):
+ global im
+ global image
+ self.master=master
+ self.returnwin=tk.Frame(self.master)
+ self.returnwin.pack()
+ self.canvas=tk.Canvas(self.returnwin,
+ width=1000,
+ height=700,
+ bg='white')
+
+ image=Image.open('bg.jpg')
+ im=ImageTk.PhotoImage(image)
+
+ self.canvas.create_image(0,0,anchor="nw",image=im)
+
+ self.canvas.pack()
+ self.btn_back=ttk.Button(self.returnwin,text="返回主菜单",command=self.back)
+ self.canvas.create_window(100,50,width=200,height=40,window=self.btn_back)
+
+ self.style_l=ttk.Style()
+ self.style_l.configure("l.TLabel",font=("微软雅黑",14))
+
+ self.cnum_prom=ttk.Label(self.returnwin,text="请输入借书证号:",style="l.TLabel",anchor="center")
+ self.cnum_input=tk.Entry(self.returnwin,show=None,font=("微软雅黑",14))
+ self.btn_cnum=ttk.Button(self.returnwin,text="确认",command=self.confirm)
+
+ self.canvas.create_window(100,100,height=40,width=200,anchor="nw",window=self.cnum_prom)
+ self.canvas.create_window(350,100,height=40,width=300,anchor="nw",window=self.cnum_input)
+ self.canvas.create_window(700,100,height=40,width=70,anchor="nw",window=self.btn_cnum)
+
+
+ def confirm(self):
+ CardNum=self.cnum_input.get()
+ self.cnum=CardNum
+ borrow_list=BorrowPart.ShowList(conn,CardNum)
+ self.borrow_list=borrow_list
+ self.btn_next=ttk.Button(self.returnwin,text="下一步",command=self.next)
+ self.canvas.create_window(430,550,width=100,height=40,anchor="nw",window=self.btn_next)
+ self.btn_cnum['state']='disabled'
+ if type(borrow_list)!=type(()):
+ self.error=ttk.Label(self.returnwin,text=borrow_list,style="l.TLabel",anchor="center")
+ self.canvas.create_window(400,300,width=200,height=50,anchor="nw",window=self.error)
+
+ if type(borrow_list)==type(()):
+ self.query_list=ttk.Treeview(self.returnwin,columns=["书号","书名","借书时间","归还期限","是否可以续借"],show="headings")#show设为headings可以隐藏首列
+ self.query_list.column("书号",width=100)
+ self.query_list.column("书名",width=200)
+ self.query_list.column("借书时间",width=200)
+ self.query_list.column("归还期限",width=200)
+ self.query_list.column("是否可以续借",width=80)
+ self.query_list.heading("书号",text="书号",)
+ self.query_list.heading("书名",text="书名",)
+ self.query_list.heading("借书时间",text="借书时间")
+ self.query_list.heading("归还期限",text="归还期限")
+ self.query_list.heading("是否可以续借",text="是否可以续借")
+ self.canvas.create_window(100,250,height=230,anchor="nw",window=self.query_list)
+ # #下面这个滚动条做的不是很成功。。。但是我发现不用滚动条也可以用鼠标滚轮去上下翻滚。那我何必非得弄个滚动条呢。。。
+ # #但我还是弄了.jpg
+ # self.query_bar=ttk.Scrollbar(self.returnwin,orient='vertical',command=self.query_list.yview)
+ # self.query_list.configure(yscrollcommand=self.query_bar.set)
+ # self.canvas.create_window(880,250,height=230,anchor="nw",window=self.query_bar)
+ i=0#临时变量
+ for item in borrow_list:
+ if item[4]==0:
+ self.plus="可以"
+ else:
+ self.plus="不可以"
+ self.query_list.insert("",i,values=(item[0],item[1],item[2],item[3],self.plus))
+ i+=1
+
+ def next(self):
+ if type(self.borrow_list)==type(()):
+ self.query_list.destroy()
+ #self.query_bar.destroy()
+ self.cnum_prom.destroy()
+ self.cnum_input.destroy()
+ self.btn_cnum.destroy()
+ self.btn_next.destroy()
+
+ self.bnum_prom=ttk.Label(self.returnwin,text="请输入书号:",style="l.TLabel",anchor="center")
+ self.bnum_input=tk.Entry(self.returnwin,show=None,font=("微软雅黑",14))
+ self.btn_bnum=ttk.Button(self.returnwin,text="还书",command=self.return_book)
+
+ self.canvas.create_window(250,150,height=40,anchor="nw",window=self.bnum_prom)
+ self.canvas.create_window(400,150,anchor="nw",height=40,window=self.bnum_input)
+ self.canvas.create_window(650,150,anchor="nw",height=40,window=self.btn_bnum)
+ else:
+ self.returnwin.destroy()
+ returnwin(self.master)
+
+ def return_book(self):
+ self.bnum=self.bnum_input.get()
+ result=ReturnPart.Return(conn,self.cnum,self.bnum)
+ if type(result)==type(()):
+ name=result[0]
+ if result[1]==0:
+ late=",没有超期"
+ else:
+ late=",超出还书期限"#此处可以为超出还书期限的增加惩罚措施。。。不过由于精力实在有限。。。
+ self.return_str="%s还书成功"%name
+ self.return_str=self.return_str+late
+ else:
+ self.return_str=result
+
+ self.borrow_success=ttk.Label(self.returnwin,text=self.return_str,style="l.TLabel",anchor="center")
+ self.btn_borrow_over=tk.Button(self.returnwin,text="返回上一级菜单",command=self.return_last)
+ self.canvas.create_window(170,300,width=700,anchor="nw",height=50,window=self.borrow_success)
+ self.canvas.create_window(450,400,anchor="nw",width=100,height=40,window=self.btn_borrow_over)
+
+ def return_last(self):
+ self.returnwin.destroy()
+ returnwin(self.master)
+
+ def back(self):
+ self.returnwin.destroy()
+ initwin(self.master)
+
+
+
+def StartGui():
+ root = tk.Tk()
+ basedesk(root)
+ root.mainloop()
+
+
+if __name__ == "__main__":
+ import tkinter as tk
+ from tkinter import scrolledtext,END
+ from tkinter import ttk
+ from PIL import Image, ImageTk
+ import AddPart
+ import QueryPart
+ import CardPart
+ import BorrowPart
+ import ReturnPart
+ import logging
+ import pymysql
+
+ image = None
+ im = None
+
+ with open("config.txt","r") as config:
+ user=config.readline().split(":")[1].strip(" \n")
+ pw=config.readline().split(":")[1].strip(" \n")
+ try:
+ conn = pymysql.connect(
+ host='localhost',
+ port=3306,
+ user=user,
+ password=pw,
+ database='library',
+ charset='utf8'
+ )
+ except Exception as e:
+ logging.exception(e)
+ StartGui()
\ No newline at end of file
diff --git a/book-management-system/QueryPart.py b/book-management-system/QueryPart.py
new file mode 100644
index 0000000..c097a33
--- /dev/null
+++ b/book-management-system/QueryPart.py
@@ -0,0 +1,43 @@
+import pymysql
+import logging
+
+def QueryBook(conn,para1,para2,index):
+ if para1=="" or para2=="":
+ return "输入不能为空"
+ cursor=conn.cursor()
+ ##目前进度:单值查询已做完,区间查询没有做。并且最后return的是一个比较乱的tuple。在show()函数中应该要一层一层的处理
+ try:
+ if index==0:
+ sql="select bnum,bclass,bname,publisher,year,author,price,collection from book where bclass=%s"
+ elif index==1:
+ sql="select bnum,bclass,bname,publisher,year,author,price,collection from book where bname=%s"
+ elif index==2:
+ sql="select bnum,bclass,bname,publisher,year,author,price,collection from book where publisher=%s"
+ elif index==4:
+ sql="select bnum,bclass,bname,publisher,year,author,price,collection from book where author=%s"
+ elif index==3:
+ y1=int(para1)
+ y2=int(para2)
+ sql="select bnum,bclass,bname,publisher,year,author,price,collection from book where year>%s and year<%s"
+ elif index==5:
+ p1=float(para1)
+ p2=float(para2)
+ sql="select bnum,bclass,bname,publisher,year,author,price,collection from book where price>%s and price<%s"
+
+ try:
+ if index==0 or index==1 or index==2 or index==4:
+ cursor.execute(sql,para1)
+ elif index==5:
+ cursor.execute(sql,(p1,p2))
+ else:
+ cursor.execute(sql,(y1,y2))
+
+ conn.commit()
+ result=cursor.fetchall()
+ return result
+ except Exception as e:
+ conn.rollback()
+ return e
+
+ except Exception as e:
+ return e
\ No newline at end of file
diff --git a/book-management-system/ReturnPart.py b/book-management-system/ReturnPart.py
new file mode 100644
index 0000000..29669a6
--- /dev/null
+++ b/book-management-system/ReturnPart.py
@@ -0,0 +1,40 @@
+import pymysql
+import logging
+import datetime
+
+def Return(conn,CardNum,BookNum):
+ if(CardNum=="" or BookNum==""):
+ return "不能为空"
+ try:
+ cursor=conn.cursor()
+ sql="select numbers from card where cnum=%s"
+ cursor.execute(sql,CardNum)
+ num_=cursor.fetchone()
+ num=num_[0]-1
+ sql="select bname,collection,rtime from book natural join borrow where bnum=%s and cnum=%s"
+ cursor.execute(sql,(BookNum,CardNum))
+ result=cursor.fetchone()
+ if result is None:
+ return "您尚未借阅此书,因此无法还书"
+ else:
+ name=result[0]
+ collection=result[1]
+ r_time=result[2]
+ collection+=1
+ n_time=datetime.datetime.now()
+ if(n_time>r_time):
+ late=1
+ else:
+ late=0
+ sql="update book set collection=%s where bnum=%s"
+ cursor.execute(sql,(collection,BookNum))
+ sql="delete from borrow where bnum=%s and cnum=%s"
+ cursor.execute(sql,(BookNum,CardNum))
+ sql="update card set numbers=%s where cnum=%s"
+ cursor.execute(sql,(num,CardNum))
+ conn.commit()
+ return (name,late)
+ except Exception as e:
+ logging.exception(e)
+ conn.rollback()
+ return e
\ No newline at end of file
diff --git a/book-management-system/__pycache__/AddPart.cpython-311.pyc b/book-management-system/__pycache__/AddPart.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..5283b5abfcae5f0781f76acd5c28f2bbba77b67c
GIT binary patch
literal 6290
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
arI`go8;(O(lto|G{Q?I(9wtIF*!dT7gq!yO
literal 0
HcmV?d00001
diff --git a/book-management-system/__pycache__/AddPart.cpython-37.pyc b/book-management-system/__pycache__/AddPart.cpython-37.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..3a2b0a6d518ce3f0d36244e7f0280db65afc4bdf
GIT binary patch
literal 2720
zcmb7GU1(fI6rQ>N_wG-UO^jMlfa9_4k9ud+yQ*g|5OW1_
zEbJ}Zv$-K$=v@)?O;H$NjDWMiMo||otX?tkU}W76v&06wT2|nJF_A94f|7?V
z#O-Fle#597|FXq^GVh`W7Hl(p{i3V5JbK3zVJUPXy<9Ep;$vW*!N9&rHO9&uNY
z@Ovdu6#k>iqSq^Qo*LT}hA@RCY~ctOBuaH(p&>64d8aiSScDsbKWFJ~Qlos?EkQiPHA1cB4R9X&Gggu&kUKb{~6Ugy-2
z?tDgL8u105@-SYgv$VCao~BKS@+o+tJC{D(+xmI;v-kcu`{VxLGQ%*}t&X-tX{@$3
z(&YNSg;OUeqYLXv-g@%hY+uReDp+>UeYtb_>nj&N-TmyFy)VAqJ#+EO&!1fV>4TkL
z&hMVNeC5mU_kQ@Q`%ojvDB}x_gr^$C!W&_n)9k)`v&Db;t9Eb8+a%;*5>PK>baWCh
z-hFX|Q-N7rkK!=P7T1%oMHk!odfdnW>0*b5Y%$FFiIgq2StFwVc9ib%zuOsV1Vclm
zikawD1EpH^L+yH5835*HCv_kGyJmeCYQuF8|6^Bvr@o$#_Re1bPwregxAV(j_pR^X
z!gembx%bWwSATjdSBYlm;N5q(ue|?xHIPn}vn*xO1RqPg9;YF%xpb38Ij1$RPI+`9
zO{nyr+l**iU2V-{aLwys)Rb|`u$?T}h<-5nCs
znw!RC4VG(xVi=85Mrv+CPYov(Gn_n&*gWXE_FDA#>M?j=+3GW-)kqo{XCY77>S3BS
zdD>oWcir9E7}-
zP#X+or-2~s8HQou$FPMx_ySEG!!s>hgl}5URSY$6X&K8f@SVUFwPZ!_m^VFajOHwS
z0Q9NVK<`rfDr0$&bD()JqcpPH070b6mHOQRtprUMor@5YP-+Zl<_79n(Cls8X>+8C
z4>5`Lp}CDe4tmZu-bBLb;{iI1UjGvcirY7cJ-|IrbIt(wP2$4X=a%rdF!7ouJ0a}8
zEj(2kmLcgAd^_qJP<#U5{SjXPJ{a*(5=ddhm$(C?;&22dtPG>lXl;tSFe*>hrnT(U
zWIV$?0fkN!RDlp>F(sx67BgExufly%*}~i>(_0wQGG=qa8e@dwGXo{bIJtBkH?oyzhkqLi#b
zbU(m1xx`_$EUmOn6X`P=lDLu3Oxh4FjW%@cxWT0v!>SXuL5MJ=l_{&qK-vbaiPd
zL^TTlJ*eptD=6bC+cEXbSy>TPzSy)PGm5Bxyrjcumd6~j%37VNsL(DLl3SI42T^<|
zgd}(jM%iH?2qJ9!RUm2uXhom~(BY@X)9@Y8v8Q5l-c%9+KH$#lIkp6Ps+M%y9i3d5
ic8Cg5y>bHxm8aMc$rG)Voa{#Az&!
zd#Onsi#-MGYfHbp`==}Gzx(mp%7=Gv{%rjxf4zJ2*8TTxB|IV@;scVW(-Rb;VNbv>
zaGv;CUf?}}NGv?mA;y}4{odu=y|+{M-+A3EC-I#k?=-CJnvVFxeAl!z3sf*DB4R=8
zbTm5eiTI_M;17A`qO%dtbW{+c@#?L-Hk}H@1TiY;HvT*xh)KLo2YD%QHX14Q{GpIu
z_w4xqe@>c>Ms!;!Ix{mHnbGU`(wvvlt$}C+-W>;JCSzfN1PydTd^x030x!lwl8*Bt
zGOEXDUmpC{z)R?azOX;ypW(xNMDmFXqQr+^8a0mjUB4hbeQrUgr_M&>-<}mEp$WK=
zSn(4eOPFSJWGt^OE-h+Kuj2G>T3n<{bFwRo>BWo5OMmts<Tv8!#F9`vDlkoWCL^Tb?kNp=KnlGVv9;Y?X1@613FhGqIz5CS`I7kGv+6
zoV5jxUT7RytT|_4o~+C#DVdUxhQ&6As+G|=>U~>vCMIAWt%0-c!hfqzldOZWc^#R6J1|+#HEw&l`mLf-
zGI?pPoG&?3ELFT$?YkYuPs5Y%@Hi2@!_!clYg-#Z#>x#4k=94!nQPjXkCyQ*GJU5x
zV3jGkE=WM6v)k_Sf5ewL(jP1P-G%&wo4>IV32^iGBpHdV%*+`m42@-`x`M#XkL64l
zp~6!gPq2c&R?fd5CR`n-eH~$62j}THInXgN&@q)5jGg2B5?=xXA}@K2?S`Hy
zYzWe-5rTOi1J~UD^L2nE_ul{2y|-_yefWpMM>W%qZ|Zq0?`n{OMpE})&OKv08B;wV@T@)PFnl*@7F*0
z&42!~4A`pxywSe<;R_hdRWr
z^0(WYI8+pC=!wJ@wXeu5g1W@vqEg}6$RPu*c}wb;oLfA=26CvEF<_K{Dw}``nNB0u
zA$RF@h;n>L^6NBUqo6TK1)|~btfUi>Xk4g6T*%Y{idmf&z>3rUz`WNkpuiLCXx26g
z7_5ZX(BBSBCyj6b*!CmT5uC=dqEb3(Ku*2BVmqChE-XY@B_g2(gjb}33-MD0OeY+G
z!5*~k3((I5;W9H>;jQ`1yyo1Oy0B>(u0e7q%&=@MH>T|A%F{lT_9?VabGTQc>1f{3
zsybRzq}I@w8q%0X&EAyhUj9Mm<@AfG7d7^&tm{&L>V(F&{Nj+hyX(f+mEFDh-MuPM
zw%3@yJo46v(*Dgn+o!U9Fw;1hI<7HIE0gKT?2#Omi(ic^t$lf>UuF6grXRLg8BdR2
zoLHVnO=#}sOfWN`F#8_a)~B$(O$xL3nicp;D5^EMGHuI8Gt=oI(1AtFtM1*|?n|e#
z{x`={W2?;2j^q>}?Gc4NQWEJ;52glJn~)j2sb{ra`?CH^3pv-Di>c?d#v!w&^;i3p
z)+2eQM`d~xrss3_Ue(=k$L+oC_U7G(RrldL?w;H39;NqW-hE1SpGuvmU2^@T+BN*Q
zQKf4v-!-NJb&uU)pTEsMue`wL*`Ue>k%0%y+uE+$ZcsN~QCf%d%!ta2D9lLh3Z?a#
zJkzZ*-3rrP>wxU{6t-Pq+BX@@HEfcdjpvzzDsxa_4ub!YpY!Z~mECW+J==Ea=$8I3
zyY%5&gL@Mr5X>);T9{8WEB3VgqI21qa&CqBZNQ2!|1gAqX0-pg7VIB&45GVG{}b0y
zp#Nl!kHF(!%rW%l)0X=2UBsvD-ti{lGX{tLXH6tfFR9zkErb`~&s8D65qviO9U1xc
z9`*pnn2~s2(u3hB7Yp&jLMP0j3qqU#vPs}Lu3?TP<74VLmyFM*)s2I;WzuyFN8_!j
I;01~Q1K&>olK=n!
literal 0
HcmV?d00001
diff --git a/book-management-system/__pycache__/BorrowPart.cpython-37.pyc b/book-management-system/__pycache__/BorrowPart.cpython-37.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..e804da55bf09af46c043305313250f295704529e
GIT binary patch
literal 2206
zcmZ`)-EZ4e6u;MBaZNCPp%#D~yU3haSDfk(g6w9OOmJaO)|}f*^vMXgPl3Wz5&YvOokPUPj9zk%$aWiQqCS
zDnsxczSPLkOBi)!j5<@k+*3lij{!*rPq1E;&!Th45zfMj#kmxr
z;26X+xb)@rFJJF{|K8x*-R;e*d+-0gy}7k}YpbJsR?{+l{RzEBU0XK|O7!(ri(0zr
z1oo+d7aRunolko^*FW05ad{l4^LpZ2g`M+N$FQyWs$U05xn#nNVXLm&&>h1MsL|Bd
z+`6MzT}s{cgGUuJkzxkab7_>ZE?8#ZTaj9`d~?-xMw-!VM%kAym{!ZLyH1p8x+^Pn
zXC=y7BU@34B-3@^ztfP+QeaaNGKfU)oo1v^%L|%*gsoeM9s=_}Z<`C1H$97bl^2O!
zcj}%`4d11emn^U0yRAyA?ZfFMyAAFomPW}o9Am|@Eypi;ZO^xCu)u>>JU5`GRaxYj
zyV$HW|fbj
zZjR(roZP4ike%4e^ih)4#ArR9b(-;X>JL>6Cm=(KjkIU^IzR5z)A50Tc5u$e&*AK}`|E8WmYwhVJJ)|0-2G|q
z-o5S3kB6UcbRJK_hnT7`qyNWILpC8}JO?ntE7$h!d@#7Ol^{KpauuT~(`_==0|psY
z1NbSXy(IsDWgWBK;O38eKY#W2Z=V2z#`HP3{n_A)Z#pN^#KD`Ty$`#ebAs2It2;n5
zzFv2HcT}o(jb>nZa|Lfc{XJ9c%q6g#iy3T^{XS+w&7BiTQb1gDoO6q#bjDt862Oo(
zNKxZtNF~rIW28uBua3R0D9a?Vn!XXKz=AbyR7}^l>wY9U?mEpdFO`WbccoCps$n*Y
zla##xI>D@&MIgx$>r&Q`k<8m+S)u2dLK&q+nIx%5<{yqIw_m$ur5bO9?{&=5oT_P_
z`6)5IJ_x$E1_I$cu&Kn^G!Ie*W@TK;m{h_u+@b-q#taLZpv7z}u>YrkeZdC1^Y|fn
z&T?JFIVIi?8rFmvkSeB+!f8c0%Cy@2YYS|o^S|Rj*@tB;Wc8%&lAvil&!)*^
L^vR#J=TY64spUaq*=>cR#I!Zx^
z-D3e%w~FcrCo>UV=TcNrRU+uTPAx#@Tlwtd0foS}xGFJ4JK_qu5Vh(SnJrWZRapj5
zKmZL_)bInSWc`jT>|cpa>x|A0vAZflDY9F;#(yiKkjxGs*}89zdn3<%~uK)4V<8PL-H-CBZ+xM89Z>S#N@$H*M>+IcMi`Lm2-)7^fg7ws~
z(SWL8O&Seo!9wECJid^kHa4iu#a~O))cc`v*`q;0q&8L2q=3h-KxNIcGVZ~eUkPYr
zrA>|#?T+e6NsFAxc|%wYVv|=U6mLjVOkqgTyd%MY0*``z|EOkKPfvK2acwjhFa;d+
z`7V0AV@)=b^#%h0lkbJ(?vUSP-H_a5`@qs<2O*`&4*5L8*a~?}M!n=SIjpE5pJq~u
zO1fPtj%N*h9TzSJgJUQBo`7dqA%&k%Csj@HUm)Q>f|oftK56pZvP{;v2HaV=)pj_8
zD9YK8ASUTArlZqId9LT{k>p6KK26_fOf{zEJ3T*+q(=-<%7{{qK4Pgb#LC2Ue0nA_
z8;Nm-{bY(k-=eV+bVb~uM8p2Emkz#L|^1-5X$Tj;Gp50CK#-+m8p`FIQ9qZ(Tu!#r|T
z^>#6j+9)D-SpdDIR7K7pPphB6Ih4}sOHwA#cZAXDJt&iT0cFw$qD)q2qja96EH4@V
zpajUhken4{hY9`Rass4TaTS5r2vh^8#In$;_y~xmtuG%r--t&+(LjtI
z07Q|&I}2@Sh^~z2%F)jM*=|O@-71e~Dvz((oA>BY_{_`VWiyUhN6bM!^GmPN3-#~<
z@ou`i6Fqb`6YRA09AlQbs-8M#`6xx?ItySEYx3ih{z*b;ye~LBJQ^6z^ARR{v4}PS
zQGTPI37!6+9P%k$SOOjSw@^O>$T1W}8ORyUUqvCu)>6>KMd+a_$a**6S_twl2TVdc
literal 0
HcmV?d00001
diff --git a/book-management-system/__pycache__/CardPart.cpython-37.pyc b/book-management-system/__pycache__/CardPart.cpython-37.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..f72d2e1dd4715f921940326f60088e0b3b0667a6
GIT binary patch
literal 1387
zcmah}&5ImG6tC*8{+P)Gqec&c(!s1aAuBn@4~$vC(;$puTn41mRXaOOe~eYtni+Z*
z#atAFmmnU3?no4Kh@yze2F3rQu1>GJUc7tqy_(6ytcb<*@4Z*`s@|)5zc()(J=!EN
z9{=gdw;l@!`3;S`!vW<*_|!=NPB=};`drd=${p@rChHDo+ym)y+9hrO06a-2@ln9Q
zv++9*pZWu!qMQyL6;;kc!ai#=l=38Zx@7!mMRv%PZ28>X3MzkxRzXFl4ke&FFdtSS
zC&N(oDvvYRwaL9M$y;Fg)(X00p@ax1pM>`7$Dof1ko>k{5r`dE*O9`b2+
z$r~g;#fWCZrkqi-)u3e3f-F5eqiVnzFt^>fK;9&|a{(-Piz6LF$_L=iv)fnpKlo+u
z+K0d2xN|VwokU8cBGJ*QXhRlRl*E!p?`{eyq9iY~=U3DLgC|
zQQ!QmzV^+ZKYu*?_1nFxyY=<&_ka9KT34*k-p%Vv@A}pcOYi#2&+CtN=H8R12DuVa
zM}u4!^T6-KX(`mxE9&&}ccwjgwjA+TLqeFF5<1G`Oh9I*xfsP#XCl{V>G23>4`q+E
zY5T@cN~sEI0&z(sr4}aK5IWf`asf+4mJPINynHDUBRwc`6Urh@FUHBR-83vI^4tXH
zA$X_E4C_Gfb+!hchP?(M4ckcLzVslDan;+Y@ug5@stpx4hUrHDt1yjbZ!h#iAIlW^o?(1>S5`jg=M|%z%(RRg^LjJI?w!BFd;kL%fhGdid_eqAjgi2h*DyMiD}}5*ionnid#&BZ470#yS7!YcGdmC
zl2{efA6N;O2=`#qlPGPPkW1*v7}`S{-)-<=Sug~e(&Q#Eg^*LdwyUrvPn#*PXBJJozn}CwXE9g{e2#
z^a1CndEkMDMnOBWfM*jK1W&9~7*(eMURA7+JUN35R06|xc?_y&b#>0+K?cQBHBX9n
z^mWCI%W`P1CR8UDm`P9up7~T2*q+mR0h^s*Cpn
z+YqpI)Yw8A&buaUZ0?rTlWZQoGe4U0jfgmONJ<7(&{sMR0h_&9P7Dmdr+$~RLRSBX`WrsmKp(Z=it=2Jbwfd@9y
zyCLA~KYsYyfB*WM-(PL-{QGoA!RMZxQw34rv`}2qlaV+lvZ@-1OKehzr1ZF$
zP?rTIk`Y)X!s^gwGhHu{QvjrEC=Qo6p+TsdH_>{Z^Eb=TIVmwx8a{lfixY&~Yitl;_0+Z(s{
zgM$abLGvC=&Dh(+KwlY=o}NZ$flsUu%TKRQo6}bCocVF%c?(je!5oAC+{h1p1l`r>
ztN>%W8&Aca0t*1@6x`v@cZQ=u^k?rx;O-E5G31Rh)Qf99Q6IHS6M%P}4p`px(HJun
z#zAj1OzmDEqJz}#MFQhN8u~D0yHc5C2G^fUl$Vwg(o&^To}wd&gOm%s78%DgTL
kx0C^x;vYlx8gylfAP5U}u2r5oC_6qNAeZ(|xdcxC1Af7H)&Kwi
literal 0
HcmV?d00001
diff --git a/book-management-system/__pycache__/QueryPart.cpython-37.pyc b/book-management-system/__pycache__/QueryPart.cpython-37.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..992a5ed0acdb55be5c7e86510b536c47ef328dbc
GIT binary patch
literal 1475
zcmb_bL2DC16rP#vCYz+Kp@^VX2xt$Lw9p<)Em|vxhoTlWEfLx5Oxq>9v+K;PcFV>~
z^(Ykm1MR^>?;@q32mKd=H!HS(!IN(`X%W3<;LSJRdvCutZ}PG*JX}Gru6(-s>{}6`
zABLPR0*9Mmatt<#C=SqS5AiCdgce?-RYLJHny^kF11))$0a!y|M)x+DY+{5mOmT~pubt&T?B`qAe|Z$a%b#1)C>e!kKK}Cl=bH~l2XBwJ
zKOY?&{@Onj@a|}9MY4c-s@~>F*l2r!D`lh2-H1x%)Ac%g?cY(
z^b1Dc8*~fi=b9gvb(hn+InO~Q+f-tMu9OeMX{nq*tqDgLy+p`J=z`Ccw%3BlRl3AB
znU^RA!6*!UrJXgVybU)9botJv$6_;0+7U2WZP)8e3~9@YIA676SGdzXn9;V+Dcckd
zw4)31d7w!;4K|}m3>eSoqF^!!l*ViyiHnf-`>8kEdL)^Uty?toxi6J)RU}%AOm}UC!A8d}pRb
zF2aUz4O`eDV7T~?Iel)>A_Uj*2%JVqjpQCY3hV+I#o{vPOcZn}PV<}TQV^}L`+PkQ
a19DnX5xl4MNYt3G$dppghZP$p~3Zv6)tXnN^w1`zp$Ou>Clc^DC=6Wd`pH85F!ss+rD>9`qk_-D^MC*S
zU!LdgzTx>Gf)$_rV5rN7(4U^LxyTB$ei)crNJcV|Km!|;7$C|rIY7$f$7q0(iGI{d
zt$HDS5><)x2%sWQUjGO1ZXuJ9iP18$?l;Lz9s^203Lq2Z!FBsu0M*^9+M;C2qD?AK
zR8@71Nt?t1WVpLoKOzwLR;4;u^bD@g^vQH{)j{@6!E`LY?B6jPX%a)^|IEmk%nT_r
z{m5kMGg~akzFH+#0A#jK4w?a|j)&?3hQC@cx>lWho~~(Y+%x?)m5I?wVrOv#Y^O6crPseI^SQR{D`KuV`C(#YyiYHZB$faMheFg;x%nV72_Jl+IR&tz5y!6RCzN&
zstvGLZZ0l=e|zQ2ZRJ#nFf^)gU|0-vyr2<_Zg$G?3Pz|>-nbx4|mr_{Qu*)bD
zij*=GmmN|J>8hpz=hf%U#idkj96YsTa>Q^0-4l{B=1t9I658Bl&X%!Fx7ZW
z8f^`^w4|xvbsmnSFO_teF6b2)%)kI#O8+q7(ootU;DgnV6+M+OKm}*x25aL0%V4<-
zzq&!`1Qg~HiXH+Sam#x8>V;ERypcweF*P=XW*mB(J=yz?rJ=#IW(&*re;<
z5b+_v@LmVq`xMR~hY4lLo6|GX+2I`iY&1LS2nX!zYozFFa)fYZIz2sW%~`hJ;W})}
zVMCcvI+WFOCyQ*P#6}8i#Nor4!SrB}KUm@q+O)$pW}D`Evgc;s27gYf59-PH6!x_j
z*=UK47TBmG?9SXs-zW-VNf04JLz8{R37;*5&pvG0nrYB2zf@dXYO;;*J%#V@~6#dMlOh$yr4%
zTH>MwE()z?E~PKc_RjU%y-wq0fcffqn7GQp2t_MERO(+Y&33SZJWg?k}b
z_~SmIgzYK&W>S+=3FQoqfarZA^iJ5;D1smy
Y6q+eNb&N1me%9y+0sU;>@XHYWFSbVuAOHXW
literal 0
HcmV?d00001
diff --git a/book-management-system/__pycache__/ReturnPart.cpython-37.pyc b/book-management-system/__pycache__/ReturnPart.cpython-37.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..1cd05932cd1efee1887cef12e2462a48f8b6ba70
GIT binary patch
literal 1209
zcmah|QEMAV5Z>K8olde8OerBrQ#eR!;@0kKAS5NV+gDR!3XTvpr`xqH>uy)w-NTkR
zm5?TH3FIZjG=<2elsXUy1cGZ?`ahPw)mH4Myyq#iCs}r%x?*Q$XXd_{`F1r|t(Fn2
zk6&L}o+}{quRR(|)>M{t5D2`EWsBsPFXHp}SQ0E@1ITSCVY4->+(L&@{1?voK
zi$4!r&0vHwOmT~-$&6SnKcr+4b^ggvA8n(aL!F+RIenbD8Qvxsfla_)$O_awk7(f>
z>Uq=~=a3AqkW+cZtVmJIm+Q2+h`@$#dOqj^=n`ljbU7>0!c{nHXWi+$fIg8;WaXAC
zf1!n5g}c=4RcL8kqm+?h4O$-i#&zk$*yoLVLH)uug5LeCvI5h&NPDgFBP^#d>Qyo7
zp4G*^pH;Uppe4-?v5lLrkUrPvsOHin=<$mwx`^i#kd-2MIFYW@Z#6~
zKYn}r=YxZ%eXs{l`h!=G5C7f*=aGF)-OtiC4K)LBD5sbXPP&1f|68m(Lt#=#&L{l8
zcDh$a&^Z+rdPL9(?ueP`vhku+Dj`jgZL%oU%=jxzM{9zEW&5+d7>A1u$P`J^)TZ?H
zX2jZ-HB*em>S~j(ni3oPdJ!l*TU#<-E-kTnlivXCaGI0v(WA>r?ZjHAAfYc905
z4EPZBBvWaujcf15luzh@$g*vt=J8w`H-^RxW;;k;0Hk-{Mc3+Zvr^T+q)C%Em6o9v
zvi=oQEiKyhc1OcNvq=Xk&RV`_laPn2EMZ*Fs*chu0S_oyS0a@WtKVX9{rsCy>d)I9
z;|-6tYc&S~;YsXbf_;z`kQLCApy5ocw7)WJkGOfnMvpT-$RqM1piH}_*zV+AN&B{?
dZ-tHIW1SKofzSBY6G79MePLg+@<8O3$a}(ZWGnyx
literal 0
HcmV?d00001
diff --git a/book-management-system/bg.jpg b/book-management-system/bg.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..1906a7656743a21499953fa103ad22123c8584eb
GIT binary patch
literal 56644
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