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 + + + + + + + + + + \ 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#59&#;7|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-wqb 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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 literal 0 HcmV?d00001 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;