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 0000000..5283b5a
Binary files /dev/null and b/book-management-system/__pycache__/AddPart.cpython-311.pyc differ
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 0000000..3a2b0a6
Binary files /dev/null and b/book-management-system/__pycache__/AddPart.cpython-37.pyc differ
diff --git a/book-management-system/__pycache__/BorrowPart.cpython-311.pyc b/book-management-system/__pycache__/BorrowPart.cpython-311.pyc
new file mode 100644
index 0000000..101dc8b
Binary files /dev/null and b/book-management-system/__pycache__/BorrowPart.cpython-311.pyc differ
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 0000000..e804da5
Binary files /dev/null and b/book-management-system/__pycache__/BorrowPart.cpython-37.pyc differ
diff --git a/book-management-system/__pycache__/CardPart.cpython-311.pyc b/book-management-system/__pycache__/CardPart.cpython-311.pyc
new file mode 100644
index 0000000..61d3da5
Binary files /dev/null and b/book-management-system/__pycache__/CardPart.cpython-311.pyc differ
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 0000000..f72d2e1
Binary files /dev/null and b/book-management-system/__pycache__/CardPart.cpython-37.pyc differ
diff --git a/book-management-system/__pycache__/QueryPart.cpython-311.pyc b/book-management-system/__pycache__/QueryPart.cpython-311.pyc
new file mode 100644
index 0000000..a392c7c
Binary files /dev/null and b/book-management-system/__pycache__/QueryPart.cpython-311.pyc differ
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 0000000..992a5ed
Binary files /dev/null and b/book-management-system/__pycache__/QueryPart.cpython-37.pyc differ
diff --git a/book-management-system/__pycache__/ReturnPart.cpython-311.pyc b/book-management-system/__pycache__/ReturnPart.cpython-311.pyc
new file mode 100644
index 0000000..72c1cb3
Binary files /dev/null and b/book-management-system/__pycache__/ReturnPart.cpython-311.pyc differ
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 0000000..1cd0593
Binary files /dev/null and b/book-management-system/__pycache__/ReturnPart.cpython-37.pyc differ
diff --git a/book-management-system/bg.jpg b/book-management-system/bg.jpg
new file mode 100644
index 0000000..1906a76
Binary files /dev/null and b/book-management-system/bg.jpg differ
diff --git a/book-management-system/config.txt b/book-management-system/config.txt
new file mode 100644
index 0000000..f0d2c42
--- /dev/null
+++ b/book-management-system/config.txt
@@ -0,0 +1,2 @@
+user: root
+password: 123456
\ No newline at end of file
diff --git a/book-management-system/data.txt b/book-management-system/data.txt
new file mode 100644
index 0000000..8fba993
--- /dev/null
+++ b/book-management-system/data.txt
@@ -0,0 +1,17 @@
+( book_no_1, Computer Science,《计算机网络自顶向下方法》, 机械工业出版社, 2018, 詹姆斯, 89.00, 3 )
+( book_no_2, Computer Science, 《深入理解计算机系统》, 机械工业出版社, 2016, 兰德尔, 139.00, 2 )
+( book_no_3, Computer Science, 《图解HTTP》, 人民邮电出版社, 2014, 上野宣, 49.00, 5)
+( book_no_4, 青春小说, 《余生,请多指教》, 百花洲文艺出版社, 2016, 柏林石匠, 32.00, 1 )
+( book_no_5, Computer Science, 《AI传奇,人工智能通俗史》, 机械工业出版社, 2017, 陈宗周, 59.00, 6 )
+( book_no_6, 青春小说, 《致我们单纯的小美好 上+下》, 江苏凤凰文艺出版社, 2015, 赵乾乾, 48.00, 4 )
+( book_no_7, 文学, 《津轻》, 四川文艺出版社, 2017, 太宰治, 39.8, 2 )
+( book_no_8, 外国名著, 《人间失格》, 浙江文艺出版社, 2016, 太宰治, 25.00, 2 )
+( book_no_9, 文学,《追风筝的人》, 上海人民出版社, 2006, 卡勒德, 29.00, 2 )
+( book_no_10, 外国名著, 《老人与海》, 延边人民出版社, 2000, 海明威, 90.00, 2 )
+( book_no_11, Computer Science, 《Computer Architecture》, xxx, 2003, xxx, 90.00, 2 )
+( book_no_12, Computer Science,《Computer Architecture》, xxx, 2003, xxx, 90.00, 2 )
+( book_no_13, Computer Science, 《Computer Architecture》, xxx, 2003, xxx, 90.00, 2 )
+( book_no_14, Computer Science, 《Computer Architecture》, xxx, 2003, xxx, 90.00, 2 )
+( book_no_15, Computer Science, 《Computer Architecture》, xxx, 2003, xxx, 90.00, 2 )
+( book_no_16, Computer Science, 《Computer Architecture》, xxx, 2003, xxx, 90.00, 2 )
+( book_no_17, Computer Science, 《Computer Architecture》, xxx, 2003, xxx, 90.00, 2 )
\ No newline at end of file
diff --git a/book-management-system/data2.txt b/book-management-system/data2.txt
new file mode 100644
index 0000000..b6895b6
--- /dev/null
+++ b/book-management-system/data2.txt
@@ -0,0 +1,7 @@
+( book_no_1, Computer Science, Computer Architecture, xxx, 2003, xxx, 90.00, 2 )
+( book_no_1, Computer Science, Computer Architecture, xxx, 2003, xxx, 90.00, 2 )
+( book_no_1, Computer Science, Computer Architecture, xxx, 2003, xxx, 90.00, 2 )
+( book_no_1, Computer Science, Computer Architecture, xxx, 2003, xxx, 90.00, 2 )
+( book_no_1, Computer Science, Computer Architecture, xxx, 2003, xxx, 90.00, 2 )
+( book_no_1, Computer Science, Computer Architecture, xxx, 2003, xxx, 90.00, 2 )
+( book_no_1, Computer Science, Computer Architecture, xxx, 2003, xxx, 90.00, 2 )
\ No newline at end of file
diff --git a/book-management-system/succeed_log.txt b/book-management-system/succeed_log.txt
new file mode 100644
index 0000000..e69de29
diff --git a/library.sql b/library.sql
new file mode 100644
index 0000000..7fa38a1
--- /dev/null
+++ b/library.sql
@@ -0,0 +1,102 @@
+/*
+ Navicat Premium Data Transfer
+
+ Source Server : JDBC
+ Source Server Type : MySQL
+ Source Server Version : 80027
+ Source Host : localhost:3306
+ Source Schema : library
+
+ Target Server Type : MySQL
+ Target Server Version : 80027
+ File Encoding : 65001
+
+ Date: 25/05/2024 17:43:04
+*/
+
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- Table structure for book
+-- ----------------------------
+DROP TABLE IF EXISTS `book`;
+CREATE TABLE `book` (
+ `bnum` char(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
+ `bclass` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
+ `bname` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
+ `publisher` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
+ `year` int(0) NULL DEFAULT NULL,
+ `author` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
+ `price` decimal(7, 2) NULL DEFAULT NULL,
+ `total` int(0) NULL DEFAULT NULL,
+ `collection` int(0) NULL DEFAULT NULL,
+ PRIMARY KEY (`bnum`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of book
+-- ----------------------------
+INSERT INTO `book` VALUES (' 21401202727', '计算机', 'python基础', '长春出版社', 2021, '李四', 500.00, 49, 3);
+INSERT INTO `book` VALUES ('1', '1', '1', '1', 1, '1', 1.00, 49, 1);
+INSERT INTO `book` VALUES ('111', '卷心菜', 'python入门到精通', '工信出版社', 2022, '小白', 54.00, 49, 0);
+INSERT INTO `book` VALUES ('21401202727', '计算机', 'python基础', '长春出版社', 2022, '张三', 50.00, 49, 1);
+INSERT INTO `book` VALUES ('book_no_1', 'Computer Science', '《计算机网络自顶向下方法》', '机械工业出版社', 2018, '詹姆斯', 89.00, 49, 3);
+INSERT INTO `book` VALUES ('book_no_10', '外国名著', '《老人与海》', '延边人民出版社', 2000, '海明威', 90.00, 49, 2);
+INSERT INTO `book` VALUES ('book_no_11', 'Computer Science', '《Computer Architecture》', 'xxx', 2003, 'xxx', 90.00, 49, 2);
+INSERT INTO `book` VALUES ('book_no_12', 'Computer Science', '《Computer Architecture》', 'xxx', 2003, 'xxx', 90.00, 49, 2);
+INSERT INTO `book` VALUES ('book_no_13', 'Computer Science', '《Computer Architecture》', 'xxx', 2003, 'xxx', 90.00, 49, 2);
+INSERT INTO `book` VALUES ('book_no_14', 'Computer Science', '《Computer Architecture》', 'xxx', 2003, 'xxx', 90.00, 49, 2);
+INSERT INTO `book` VALUES ('book_no_15', 'Computer Science', '《Computer Architecture》', 'xxx', 2003, 'xxx', 90.00, 49, 2);
+INSERT INTO `book` VALUES ('book_no_16', 'Computer Science', '《Computer Architecture》', 'xxx', 2003, 'xxx', 90.00, 49, 2);
+INSERT INTO `book` VALUES ('book_no_17', 'Computer Science', '《Computer Architecture》', 'xxx', 2003, 'xxx', 90.00, 49, 2);
+INSERT INTO `book` VALUES ('book_no_2', 'Computer Science', '《深入理解计算机系统》', '机械工业出版社', 2016, '兰德尔', 139.00, 49, 2);
+INSERT INTO `book` VALUES ('book_no_3', 'Computer Science', '《图解HTTP》', '人民邮电出版社', 2014, '上野宣', 49.00, 49, 5);
+INSERT INTO `book` VALUES ('book_no_4', '青春小说', '《余生,请多指教》', '百花洲文艺出版社', 2016, '柏林石匠', 32.00, 49, 1);
+INSERT INTO `book` VALUES ('book_no_5', 'Computer Science', '《AI传奇,人工智能通俗史》', '机械工业出版社', 2017, '陈宗周', 59.00, 49, 6);
+INSERT INTO `book` VALUES ('book_no_6', '青春小说', '《致我们单纯的小美好 上+下》', '江苏凤凰文艺出版社', 2015, '赵乾乾', 48.00, 49, 4);
+INSERT INTO `book` VALUES ('book_no_7', '文学', '《津轻》', '四川文艺出版社', 2017, '太宰治', 39.80, 49, 2);
+INSERT INTO `book` VALUES ('book_no_8', '外国名著', '《人间失格》', '浙江文艺出版社', 2016, '太宰治', 25.00, 49, 2);
+INSERT INTO `book` VALUES ('book_no_9', '文学', '《追风筝的人》', '上海人民出版社', 2006, '卡勒德', 29.00, 49, 2);
+
+-- ----------------------------
+-- Table structure for borrow
+-- ----------------------------
+DROP TABLE IF EXISTS `borrow`;
+CREATE TABLE `borrow` (
+ `cnum` char(7) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
+ `bnum` char(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
+ `btime` datetime(0) NULL DEFAULT NULL,
+ `rtime` datetime(0) NULL DEFAULT NULL,
+ `times` int(0) NULL DEFAULT NULL,
+ PRIMARY KEY (`cnum`, `bnum`) USING BTREE,
+ INDEX `bnum`(`bnum`) USING BTREE,
+ CONSTRAINT `borrow_ibfk_1` FOREIGN KEY (`cnum`) REFERENCES `card` (`cnum`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+ CONSTRAINT `borrow_ibfk_2` FOREIGN KEY (`bnum`) REFERENCES `book` (`bnum`) ON DELETE RESTRICT ON UPDATE RESTRICT
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of borrow
+-- ----------------------------
+INSERT INTO `borrow` VALUES ('1231231', '111', '2024-05-20 19:07:24', '2024-05-27 19:07:24', 1);
+
+-- ----------------------------
+-- Table structure for card
+-- ----------------------------
+DROP TABLE IF EXISTS `card`;
+CREATE TABLE `card` (
+ `cnum` char(7) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
+ `name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
+ `department` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
+ `type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
+ `numbers` int(0) NULL DEFAULT NULL,
+ PRIMARY KEY (`cnum`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of card
+-- ----------------------------
+INSERT INTO `card` VALUES ('1231231', '试试', '计算机', 'T', 1);
+INSERT INTO `card` VALUES ('1234567', '小白', '信息工程', 'S', 0);
+
+SET FOREIGN_KEY_CHECKS = 1;