From 275f725927bc548f7a1592cc2073c850911e584a Mon Sep 17 00:00:00 2001 From: xyz20020922 <3555033204@qq.com> Date: Wed, 29 May 2024 22:12:07 +0800 Subject: [PATCH] 5/28 --- .../.idea/.gitignore | 6 +- .../StudentInformationManagementSystem.iml | 6 +- .../inspectionProfiles/profiles_settings.xml | 0 {pythonProject100 => Student}/.idea/misc.xml | 4 +- Student/.idea/modules.xml | 8 + Student/dao/MysqlConfig.py | 28 + Student/dao/StudentDao.py | 27 + Student/dao/UserDao.py | 21 + Student/dao/__init__.py | 0 .../__pycache__/MysqlConfig.cpython-310.pyc | Bin 0 -> 1357 bytes .../__pycache__/MysqlConfig.cpython-312.pyc | Bin 0 -> 1977 bytes .../__pycache__/StudentDao.cpython-310.pyc | Bin 0 -> 1236 bytes .../__pycache__/StudentDao.cpython-312.pyc | Bin 0 -> 1897 bytes .../dao/__pycache__/UserDao.cpython-310.pyc | Bin 0 -> 996 bytes .../dao/__pycache__/UserDao.cpython-312.pyc | Bin 0 -> 1432 bytes .../dao/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 193 bytes .../dao/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 150 bytes Student/main.py | 6 + Student/service/StudentService.py | 95 ++++ Student/service/UserService.py | 29 + Student/service/__init__.py | 0 .../StudentService.cpython-310.pyc | Bin 0 -> 3476 bytes .../StudentService.cpython-312.pyc | Bin 0 -> 5584 bytes .../__pycache__/UserService.cpython-310.pyc | Bin 0 -> 1272 bytes .../__pycache__/UserService.cpython-312.pyc | Bin 0 -> 1550 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 166 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 154 bytes Student/ui/StudentUI.py | 204 +++++++ Student/ui/__init__.py | 0 .../ui/__pycache__/StudentUI.cpython-310.pyc | Bin 0 -> 7942 bytes .../ui/__pycache__/StudentUI.cpython-312.pyc | Bin 0 -> 17496 bytes .../ui/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 161 bytes .../ui/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 149 bytes Student/utils/ExcelUtils.py | 23 + Student/utils/__init__.py | 0 .../__pycache__/ExcelUtils.cpython-310.pyc | Bin 0 -> 849 bytes .../__pycache__/ExcelUtils.cpython-312.pyc | Bin 0 -> 1177 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 164 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 152 bytes pythonProject100/.idea/modules.xml | 8 - .../__pycache__/pymysql.cpython-312.pyc | Bin 162 -> 0 bytes pythonProject100/main.py | 532 ------------------ pythonProject100/pymysql.py | 4 - ...设计课程设计报告模板 2024年.doc | Bin 764353 -> 730053 bytes 功能模块图.eddx | Bin 0 -> 10584 bytes 课程设计报告/功能模块图.eddx | Bin 22046 -> 0 bytes 46 files changed, 448 insertions(+), 553 deletions(-) rename {pythonProject100 => Student}/.idea/.gitignore (63%) rename pythonProject100/.idea/pythonProject100.iml => Student/.idea/StudentInformationManagementSystem.iml (54%) rename {pythonProject100 => Student}/.idea/inspectionProfiles/profiles_settings.xml (100%) rename {pythonProject100 => Student}/.idea/misc.xml (52%) create mode 100644 Student/.idea/modules.xml create mode 100644 Student/dao/MysqlConfig.py create mode 100644 Student/dao/StudentDao.py create mode 100644 Student/dao/UserDao.py create mode 100644 Student/dao/__init__.py create mode 100644 Student/dao/__pycache__/MysqlConfig.cpython-310.pyc create mode 100644 Student/dao/__pycache__/MysqlConfig.cpython-312.pyc create mode 100644 Student/dao/__pycache__/StudentDao.cpython-310.pyc create mode 100644 Student/dao/__pycache__/StudentDao.cpython-312.pyc create mode 100644 Student/dao/__pycache__/UserDao.cpython-310.pyc create mode 100644 Student/dao/__pycache__/UserDao.cpython-312.pyc create mode 100644 Student/dao/__pycache__/__init__.cpython-310.pyc create mode 100644 Student/dao/__pycache__/__init__.cpython-312.pyc create mode 100644 Student/main.py create mode 100644 Student/service/StudentService.py create mode 100644 Student/service/UserService.py create mode 100644 Student/service/__init__.py create mode 100644 Student/service/__pycache__/StudentService.cpython-310.pyc create mode 100644 Student/service/__pycache__/StudentService.cpython-312.pyc create mode 100644 Student/service/__pycache__/UserService.cpython-310.pyc create mode 100644 Student/service/__pycache__/UserService.cpython-312.pyc create mode 100644 Student/service/__pycache__/__init__.cpython-310.pyc create mode 100644 Student/service/__pycache__/__init__.cpython-312.pyc create mode 100644 Student/ui/StudentUI.py create mode 100644 Student/ui/__init__.py create mode 100644 Student/ui/__pycache__/StudentUI.cpython-310.pyc create mode 100644 Student/ui/__pycache__/StudentUI.cpython-312.pyc create mode 100644 Student/ui/__pycache__/__init__.cpython-310.pyc create mode 100644 Student/ui/__pycache__/__init__.cpython-312.pyc create mode 100644 Student/utils/ExcelUtils.py create mode 100644 Student/utils/__init__.py create mode 100644 Student/utils/__pycache__/ExcelUtils.cpython-310.pyc create mode 100644 Student/utils/__pycache__/ExcelUtils.cpython-312.pyc create mode 100644 Student/utils/__pycache__/__init__.cpython-310.pyc create mode 100644 Student/utils/__pycache__/__init__.cpython-312.pyc delete mode 100644 pythonProject100/.idea/modules.xml delete mode 100644 pythonProject100/__pycache__/pymysql.cpython-312.pyc delete mode 100644 pythonProject100/main.py delete mode 100644 pythonProject100/pymysql.py rename 课程设计报告/python程序设计课程设计报告模板 2024年.doc => python程序设计课程设计报告模板 2024年.doc (83%) create mode 100644 功能模块图.eddx delete mode 100644 课程设计报告/功能模块图.eddx diff --git a/pythonProject100/.idea/.gitignore b/Student/.idea/.gitignore similarity index 63% rename from pythonProject100/.idea/.gitignore rename to Student/.idea/.gitignore index 35410ca..73f69e0 100644 --- a/pythonProject100/.idea/.gitignore +++ b/Student/.idea/.gitignore @@ -1,8 +1,8 @@ -# 默认忽略的文件 +# Default ignored files /shelf/ /workspace.xml -# 基于编辑器的 HTTP 客户端请求 -/httpRequests/ # Datasource local storage ignored files /dataSources/ /dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/pythonProject100/.idea/pythonProject100.iml b/Student/.idea/StudentInformationManagementSystem.iml similarity index 54% rename from pythonProject100/.idea/pythonProject100.iml rename to Student/.idea/StudentInformationManagementSystem.iml index 2c80e12..41b8950 100644 --- a/pythonProject100/.idea/pythonProject100.iml +++ b/Student/.idea/StudentInformationManagementSystem.iml @@ -1,10 +1,8 @@ - - - - + + \ No newline at end of file diff --git a/pythonProject100/.idea/inspectionProfiles/profiles_settings.xml b/Student/.idea/inspectionProfiles/profiles_settings.xml similarity index 100% rename from pythonProject100/.idea/inspectionProfiles/profiles_settings.xml rename to Student/.idea/inspectionProfiles/profiles_settings.xml diff --git a/pythonProject100/.idea/misc.xml b/Student/.idea/misc.xml similarity index 52% rename from pythonProject100/.idea/misc.xml rename to Student/.idea/misc.xml index 4bc8c6c..2a01189 100644 --- a/pythonProject100/.idea/misc.xml +++ b/Student/.idea/misc.xml @@ -1,7 +1,7 @@ - - + \ No newline at end of file diff --git a/Student/.idea/modules.xml b/Student/.idea/modules.xml new file mode 100644 index 0000000..f41ac7b --- /dev/null +++ b/Student/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/Student/dao/MysqlConfig.py b/Student/dao/MysqlConfig.py new file mode 100644 index 0000000..718bfad --- /dev/null +++ b/Student/dao/MysqlConfig.py @@ -0,0 +1,28 @@ +import pymysql + +class MysqlConfig: + user = 'root' # MySQL用户名 + password = '123456' # MySQL密码 + db = None + cursor = None + + @staticmethod + def create_mysql(): + try: + db = pymysql.connect(host="localhost", user=MysqlConfig.user, password=MysqlConfig.password, + database=None) # 数据库链接,不指明具体的数据库 + cursor = db.cursor() # 获得游标对象 + sql_1 = "CREATE DATABASE IF NOT EXISTS python_test;" # 创建名为python_test的数据库 + sql_2 = "CREATE TABLE IF NOT EXISTS t_student( sid bigint(20) PRIMARY KEY AUTO_INCREMENT ," \ + " sno varchar(20) , sname varchar(20), " \ + "sex varchar(20), age int, phone varchar(20), dormNo varchar(20)); " + sql_3 = "CREATE TABLE IF NOT EXISTS t_user( uid bigint(20) PRIMARY KEY AUTO_INCREMENT ," \ + " user_name varchar(20) , user_password varchar(20),UNIQUE INDEX (user_name));" + cursor.execute(sql_1) # 执行语句 + MysqlConfig.db = pymysql.connect(host="localhost", user=MysqlConfig.user, password=MysqlConfig.password, + database="python_test") # 数据库链接,指定名为python_test的数据库 + MysqlConfig.cursor = MysqlConfig.db.cursor() # 使用 cursor() 方法创建一个游标对象 cursor + MysqlConfig.cursor.execute(sql_2) # 执行语句 + MysqlConfig.cursor.execute(sql_3) + except Exception as ex: + print("出现异常:%s" % ex) diff --git a/Student/dao/StudentDao.py b/Student/dao/StudentDao.py new file mode 100644 index 0000000..e9d83d0 --- /dev/null +++ b/Student/dao/StudentDao.py @@ -0,0 +1,27 @@ + +from dao.MysqlConfig import MysqlConfig + + +class StudentDao: + + @staticmethod # 增删改的方法 + def update_student(sql, *params): + try: + MysqlConfig.cursor.execute(sql, params) + except Exception as ex: + print("出现异常:%s" % ex) + MysqlConfig.db.rollback() + + @staticmethod # 查询学生的方法 + def query_student(sno): + sql = "SELECT * FROM t_student WHERE sno = %s" % repr(sno) + MysqlConfig.cursor.execute(sql) # 执行语句 + MysqlConfig.db.commit() # 提交 + return MysqlConfig.cursor.fetchone() # 返回查询到的结果 + + @staticmethod # 查询全部学生的方法 + def query_all(): + sql = 'SELECT * FROM t_student;' + MysqlConfig.cursor.execute(sql) # 执行语句 + MysqlConfig.db.commit() # 提交 + return MysqlConfig.cursor.fetchall() # 返回查询到的结果 diff --git a/Student/dao/UserDao.py b/Student/dao/UserDao.py new file mode 100644 index 0000000..6fde8bb --- /dev/null +++ b/Student/dao/UserDao.py @@ -0,0 +1,21 @@ + +from dao.MysqlConfig import MysqlConfig + + +class UserDao: + + @staticmethod # 增删改的方法 + def update_user(sql, *params): + try: + MysqlConfig.cursor.execute(sql, params) + except Exception as ex: + print("出现异常:%s" % ex) + MysqlConfig.db.rollback() + + @staticmethod # 查询用户的方法 + def query_user(user_name): + sql = "SELECT * FROM t_user WHERE user_name = %s" % repr(user_name) + MysqlConfig.cursor.execute(sql) # 执行语句 + MysqlConfig.db.commit() # 提交 + return MysqlConfig.cursor.fetchone() # 返回查询到的结果 + diff --git a/Student/dao/__init__.py b/Student/dao/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Student/dao/__pycache__/MysqlConfig.cpython-310.pyc b/Student/dao/__pycache__/MysqlConfig.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b1768bf357a2775969088d32c2e6e75fece0d1be GIT binary patch literal 1357 zcmb7D&2Jk;6rY*>@H%l)=mAwd%>|T26~c+cfmBsZ;ueeArLiNLm8I2YXPUUOcio+F z6I*fBFF`8-;=qXywdQ~X;!EOEXeEyP4|Ao7)e|Sq;mw-1n;eij>-Xl(o8No>&3iNP z%*+&mapT&b>|Gn7zw{zI3|O275ywF>#BdvV=qzG{8MhHLZV?YNTt}|?1olxa)H*w! z#m|A4BS0gMFzgwOcqTJE3&iF*W-{wGx`jQ58Ia9Z)78GX(q4+AORWuMCUGo1yEwl9 zzk~k)oRL1k5{UR7)L>Df%fLyJ%La%EoXIEV5bdD*)(8zTGlqnjLxWjEa|hqIcgP51 zbSTEwF_QQ>$dJ=**8nlJ zu2~v4v9|CQa-Eu&Z^vQK-i(EGO=ap?nLWW1<#Yofw&H|AMFJVD2Z9e?Us@@b8fCg% zYLwn7)yuSUhSttEX!&BL-l)@VUv9>cFS(G5gWvwc0`lBpp!9|8F&@b|Dq4)Lw>DZ} z&%f!?_g5;_(#jfrue?S}tBv!1r3QJbv6K#!1or=lK`p=CTqqWcZ#DNuA3yo}o92Y;?vLM&Kfm|*kI~+ZpT|Fq#-DvS{`KMb z;k|0Ve&O8s?w!4_erVPw7orkff|dlDLp6w?bse}R^}dk2(_}&1%sk3Bx_wm$6COzJ zr-#+AP`n0;kXcNyz3&hc!)HvTYiGYe3iv3V#mBL8o$L>eWs_wSxq0RIX~TS9P5FK& zX1z8CyWsm*dO=&a()XWN^Ldd}K}aAUb~wBQmgx4R#mT6bv`=@#1QD~K9F)=os+xGZ e=aMA%6qkwBbxw2w<(!<5I)z~+bSeiOHU0%1uypeP literal 0 HcmV?d00001 diff --git a/Student/dao/__pycache__/MysqlConfig.cpython-312.pyc b/Student/dao/__pycache__/MysqlConfig.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..610239ac66168eb9d9ffb79b38da39b67e773631 GIT binary patch literal 1977 zcmcIlT}&fY6u$GCQ}r z5^BhXL^i?QY<$3<2UlOz-~*4V;gL6AY{aw~c_1o5pTtF@Szo+&+OY-9MjxDH&N=to zbI$$F&)oU4xw#3TXZO2Tt|e^%e2*8_L)U}@4hgFO0!U;)43OYO0Ldi)sWq}{5hDr& zPyd7$LZYgw(%L>a@T2uAkU@-qAVxwWMnN)0Ln_9g*CyK`y#&^3o-s#(;u*s=UeIo2 zhLr5JRMMbTMbQo0#hyz~_x2q=1EB^KdJit6(^i2K=tM0LNL%My3dA9yTX}&r_C4}6 z>^hEYp(O;Lk!v;oB3J-v*Kr#wk0Jr7A_?gt1(_nfK%|?G+b)o6HMGS4i`!PmUC&Uo zTZrnqbc>~{^G9V__Y@h+qpnMv(`D(a{2%K;HPoTrpMUF3*S!ni6wn{DPCO0N_9CM{ zZmpqxftg2LuiHmaPm9bOOrgeSiCHj5MZqk=I|Rd-Q4&&STG4c#HfYQZIEQ01K|)iI?M@IB3$U|XgCt)as_=_$%?wH=>zkh z*KCpH<)enWsOfnqXZ21_OF?cbl}sVI=K{~YG%-3Jn22&?p(q!aj9d{%1r%pIBt$qr zr)3rHbxBQ3OR8y%HPVdSs6#4w?yy2i${Y&s=W+<#5o4&RGs2;u`~Wxq{v)B|>U47X z|9~5Nh)0p4d`!Jn=0l(-h0&KMQPqTC=qlIww?EGh7_NpY=iR97yKjE6cYA$zYj3$B7Qmwh>tb`?TBX z-*&gJcHHf_cYVWE?jI@jk8FisD~FS%aI(^M{#T0dTv#65X>D7L-i^Nf>hf^qi5Heb z`y|;KB@nj}tq}1Y)^kU=CA`zS#rn3NI{kt8uDIU4IaUrvO2NpMm@bQ2Nz^KRLnxj% zM68Uh2tWAzAA3LamVJFCU*Ffh{*|#U*1OHNm053z^_JPQCHCyS{1$uenC=_)+#lN~ z+8+P{foI)cdCq)7mONc$w!6f3|G7^g^+T;4C3th_`5*~4NoVjBwdraJdZ|q>gJj-m zI7D-rMA2vx#Tf8Zqwj6PGSK8X(b6dWK5)RUN) zBZ3M3*=U`JEP;y4y%?;VXj>eqIGYy-E6wi3;T^{P3+Z9}2NbY*OiAUCvFXo~D!yK; qu{yA1ZsGV39nV&=KBxN768{x6JY6Vfg7_A+{7#=F{0{&krq5qg#=|ZE literal 0 HcmV?d00001 diff --git a/Student/dao/__pycache__/StudentDao.cpython-310.pyc b/Student/dao/__pycache__/StudentDao.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..56f46e161e1cb17d119cfe95eea52d9325ddad95 GIT binary patch literal 1236 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 b-QMw34^v1SwiG|tt?2?j6CWi?(qZEd6ORFZ literal 0 HcmV?d00001 diff --git a/Student/dao/__pycache__/UserDao.cpython-312.pyc b/Student/dao/__pycache__/UserDao.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..02c562283183d497654bef4844ef82b853468cf0 GIT binary patch literal 1432 zcmah}PiP!f82{eP&So~5?3k_48rXK4G^rEQfD{Bpg_3Mlv|DHtX;>JxJFj-PyE~gV zZ%8&IQc6H`u)$NnQ_)K$9(pXAgPsa{>0o4F$e|!1_T;vUDD~p^W_LDe1pQ#XfA9Og z_rCZ2-uyH;*bhjLy!-a&62Py*h$+!k+NV(202^#lg&LV71SEJ1Y-ts2c@wh)%}LFK zsXP*@Ny32(O?SRJ?bNT9KPm}dOxOEU&%4Q<$ z`@p4ars$MNTn(jyUmt$$ACYZ93OLFRRpQNJ2g-_wKSay0OyV{OG+`8YG7dQf?3ERX zr()YC%hD3AZg$T=4(=CSWgOX&mBD9iVa06`xQv&&B7H11yK;dnz@mH^7Kkb3y&;U< z{p8!dTX%Q2ZtmW@_xsitW3Ji9Wb}v0lE++!g?)69mOM_wRBo|E8@%k)L#4sWbskFg zl~83)wR)vkx^Bv$j3Wt?jUp@7+)$#6t|(*}#vd=EoPMn!uGcO6cK6G@TWfpkpA}}P zd!0Lt!Yub}TIU73=tMC%f~iI`9Pk=;kyFdVw5226*-Ra9im|wPWH+FdNTkMhw4;G` z+}Dl=+PJTc-*)eu|3y3d*N%Sd2}ojj=s{-ej^t-1wzZcqcs;+C542HV8x6EEUmN?o zrC``o_jxRN(-?)XQs+kGZzj)W zj1S+=UCJ3^ELOc(qsAMCfK8ZSw80|qFwqhdr)A=Jh$W|1EAvpjN_pv;Q>UgBrh55I z9K#h|8U}k##P`p8lr=kp&%}e@_vs@39b`A)VfxjrneSit?xLT5_fvUCJrbzHzB(MJ zBfdIv`|P%Q8hz{OwRE6neKotSp4icc1O240pA7T~U!V9{pM0QBwy_xG&19%rQA?H; z_FGoXvArrqU9+rtuUHk$3d`k1UM|%rzvkFXJR)`!+1J3130-u+#9ts{LUCV2wh9lG zp~sScGFQbG=dZtk|Nr<5TtZ&T-#l bCvZWa$IT#X$%K$yIQ?f*Cug1jvMA>tRt_!b literal 0 HcmV?d00001 diff --git a/Student/dao/__pycache__/__init__.cpython-310.pyc b/Student/dao/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9558e5ae1fe75179f85bb47ccdeeb42f8c085850 GIT binary patch literal 193 zcmd1j<>g`k0y(eaDIoeWh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o1Ty$aS%bF*Ydt*u;=C6MKJ}HB^mj7PuDJcK4t!s{R^Kpu7AF6;qwV?&o}RWzI%R5a7k%OYF>$F zURr)pZemGhex7e)USfJ`E>JMIvbZEQHzp-9KPEmtGcU6wK3=b&@)n0pZhlH>PO2Tq L_F^U=!NLFlv4uPX literal 0 HcmV?d00001 diff --git a/Student/dao/__pycache__/__init__.cpython-312.pyc b/Student/dao/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a97b2f52b94edc52b6a6abca2a5dfeaa34057892 GIT binary patch literal 150 zcmX@j%ge<81ae--Q$X}%5P=Rpvj9b=GgLBYGWxA#C}INgK7-VJH3AaORxzQ)sYS&x zFE%WC-q-oOzcKq%TZlX-=wL W5i8IDMj$Q*F+MUgGBOr116cs|r6s5U literal 0 HcmV?d00001 diff --git a/Student/main.py b/Student/main.py new file mode 100644 index 0000000..1cc90b0 --- /dev/null +++ b/Student/main.py @@ -0,0 +1,6 @@ +from dao.MysqlConfig import MysqlConfig +from ui.StudentUI import * + +if __name__ == '__main__': + MysqlConfig.create_mysql() + StudentUI.init_login() diff --git a/Student/service/StudentService.py b/Student/service/StudentService.py new file mode 100644 index 0000000..bf9caeb --- /dev/null +++ b/Student/service/StudentService.py @@ -0,0 +1,95 @@ +from tkinter import END, INSERT +from tkinter.messagebox import * + +from dao.StudentDao import StudentDao +from utils.ExcelUtils import ExcelUtils + + +class StudentService: + + @staticmethod + def add_student(list_entry): + sno = list_entry[0].get() + if sno == '': + showwarning(title="警告", message="学号不能为空!\n加入失败!") + return + result = StudentDao.query_student(sno) # 根据学号查询学生 + if result is not None: + showwarning(title="警告", message="学号重复!\n加入失败!") + return + sql = "INSERT INTO t_student(sno,sname,sex,age,phone,dormNo) VALUES(%s,%s,%s,%s,%s,%s)" + StudentDao.update_student(sql, list_entry[0].get(), list_entry[1].get(), list_entry[2].get(), + list_entry[3].get(), list_entry[4].get(), list_entry[5].get()) + showinfo(title="提示", message="加入成功!") + return True + + @staticmethod + def delete_student(sno): + result = StudentDao.query_student(sno) # 根据学号查询学生 + if result is None: + showerror(title="错误", message="不存在该学生!") + return + sql = "DELETE FROM t_student WHERE sno = %s" + StudentDao.update_student(sql, sno) + showinfo(title="提示", message="删除成功!") + return True + + @staticmethod + def query_student(sno, list_entry): + result = StudentDao.query_student(sno) # 根据学号查询学生 + if result is None: + showwarning(title="警告", message="未查询到相关学生信息!") + return + list_entry[0].insert(INSERT, result[2]) + list_entry[1].insert(INSERT, result[3]) + list_entry[2].insert(INSERT, result[4]) + list_entry[3].insert(INSERT, result[5]) + list_entry[4].insert(INSERT, result[6]) + + @staticmethod + def update_student(sno, list_entry): + result = StudentDao.query_student(sno) # 根据学号查询学生 + if result is None: + showerror(title="错误", message="不存在该学生!") + return + sql = "UPDATE t_student SET sname = %s,sex = %s,age = %s,phone = %s,dormNo = %s WHERE sno = %s" + StudentDao.update_student(sql, list_entry[0].get(), list_entry[1].get(), list_entry[2].get(), + list_entry[3].get(), list_entry[4].get(), sno) + showinfo(title="提示", message="修改成功!") + return True + + @staticmethod + def query_all(lb): + result = StudentDao.query_all() + for row in result: + lb.insert(END, + "ID:%s 学号:%s 姓名:%s 性别:%s 年龄:%s 电话:%s 宿舍号:%s" % ( + row[0], row[1], row[2], row[3], row[4], row[5], row[6])) + + @staticmethod + def to_excel(): + data = {} + list_Id = [] + list_sno = [] + list_name = [] + list_sex = [] + list_age = [] + list_phone = [] + list_dormNo = [] + for row in StudentDao.query_all(): + list_Id.append(row[0]) + list_sno.append(row[1]) + list_name.append(row[2]) + list_sex.append(row[3]) + list_age.append(row[4]) + list_phone.append(row[5]) + list_dormNo.append(row[6]) + data['ID'] = list_Id + data['学号'] = list_sno + data['姓名'] = list_name + data['性别'] = list_sex + data['年龄'] = list_age + data['电话'] = list_phone + data['宿舍'] = list_dormNo + ExcelUtils.to_excel(data) + showinfo(title="提示", message="导出成功!") diff --git a/Student/service/UserService.py b/Student/service/UserService.py new file mode 100644 index 0000000..77c409e --- /dev/null +++ b/Student/service/UserService.py @@ -0,0 +1,29 @@ +from tkinter.messagebox import * + +from dao.UserDao import UserDao + + +class UserService: + + @staticmethod + def login_dispose(user_name, password): + user = UserDao.query_user(user_name) + if user is None: + showwarning(title="警告", message="不存在当前用户!\n请先注册!") + return + if password != user[2]: + showwarning(title="警告", message="密码错误!") + return + showinfo(title="提示", message="登录成功!") + return True + + @staticmethod + def register_dispose(user_name, password): + user = UserDao.query_user(user_name) + if user is not None: + showwarning(title="警告", message="该用户名已使用!") + return + sql = "INSERT INTO t_user(user_name,user_password) VALUES (%s,%s);" + UserDao.update_user(sql, user_name, password) + showinfo(title="提示", message="注册成功!") + return True diff --git a/Student/service/__init__.py b/Student/service/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Student/service/__pycache__/StudentService.cpython-310.pyc b/Student/service/__pycache__/StudentService.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..62cb528be6ba8b87d10359bc0314b2de630123ca GIT binary patch literal 3476 zcmai1-)|d59-rA=uh)*_rlFLUqu@JQQCCr<9uf~#LB|opMQUBBQ;@8jER)$53;#%F z*KHFy(xH|kR2NZ1AFfbT2em-&j^<8qx>5>#k{t87=I`6y?vFcA^asi+EN{4`;KDf1&hfkj-V~PNBjA-9 z7`MSkg`>u!;A0}LcnAEDNGLughM{OONQTOKO%-jGTeC^&NGsgbbx?8u+go3^?B>V3-x_qTVOx<*S%ZIYv;bd zck6cN#_jue-ify^G+XapZ(aMx+BerB-!OuRU-HXt5UseLS3Kp`pX#sezPH@Ew!Fov zg=5;ksmbirv6Nr%w0rk^)!LX>Emqty&pkVa&BkWms#V=FQInNyEuDJ(#Um#&x&8aR zv5kM}E*+t35TOX@k{h}a5Ot{b2NyfnZr8U#*6O#HF19XQgi{?z^Sv+3D+ALoOiJD0BBySvhUXSH*4rE~F*ov**^ ze0TNeeD1X)o%fg8SN=8~hTJ4RC@V$3RI45>R$-tDzM7l&e77>~>2T~#4Wn~>c0L#? z3ei)Xg3}{~5{APQ+~RSrdyDVoPjc&F!m#+l;~PVKd|-nO;ZDXTTdQyh zf}Pcw-0mBce8TJnyRa4w%rYAW<{<%mB!aNR_X-KJ%4yw8m)BNTA3Tap5reI-{@l9q z<=X0XZ7jG>(n%KfPGpW`rZTCQj~_d_9!RM-ewR6(Nx>DV=TrMUIf|*;{Y%a6{gb=nB5SwK`zjr>l)q3~q!BFn` zNWqK59m3==5lTZzCX(Ahx`aCE0XN7U7zpfA74hs#GDXh^yTEHlZ1jQh9wC-Te(o85 z2iLz{eBp^rrr(g+8!S(;Ovh7}_rd&s%Ojpm70-ZhvV7B8A&ZjbHAlA999dLz1lPo| z5R&7#WORlkVB_JeBoLJ;A}Y+^IPvPliwN^RRHky7Da1FRQbjo7rDlK$no-E9Sq-0x z-<%nQo7yePLF>Nhr_8;(H`|xK9Y`5_J!K?Cflii3h*KG3>5N(T))r}_)*QqVkG$P; z89~s_9t3U9myP)QGZdoGQeJx%40%moxD)L6PvKf+O~XeKfZQ;4Gf-1eWQ@)hQ1}ZJ zz5<1xPDXdCn4hy%)W@>**Rk*9#G!p&Dy476`*%K8!WSR4F5;3?Li-P2w3hzbd-Lr# z-5<_}Lg&&y*H%C6y}5aJZD|>|tCDqssNC4(1WFM3G)UUgmr_iJZn0dJd+8maM%oOF z@|!9#0#nw`Y(gkWnejZDf+YvAWOIWbfSK)w*29HeTjmBnFoPxihjOBiNdJLQVvFn) zN*Xi+%|x@%B4{>RRC@r{e|FJn@TSpls0>=+KpR6z@Pm>}CBYv`vXlhBC@G>OLNi)t zD+zv5QdCKVYIrxdqk&sTIES%26+`H$P>Q3s&<~-HpiiK;(GR1KqE8-XzKNnr?SaB* zn-~$>d-qg&R2N2DW=G#KfiXEzCkWFqp;;9Xiq-L;M^!W^R>y)KRgo}oL9O0ty?48x zZ7TcIVaAao1G_jo>sE!NZw8KEE4Wk)>&%M<7HX7YKC0@GNs)IHLlsF(afBDWLHBIP z0WtErf>Dr>A5v2_X2@sonau%p0Am?6@7Ev}%7wvSf+q)lBPcEge{nv-7arRba=k-j z)A7J56iCTJA&3_Wm71uRiBA*?bM<05e3S5eR6sKo7sZp1Pm+eeB0`tA1|zbRBsB+A zS9b>;JJR$EmHi(k*Zf>qEal!0ZwBk1*6{MuLx;{{xq1 Bi6{U7 literal 0 HcmV?d00001 diff --git a/Student/service/__pycache__/StudentService.cpython-312.pyc b/Student/service/__pycache__/StudentService.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ca7538effbd3d2e7c175d0bf7ae8e22ce3b443b0 GIT binary patch literal 5584 zcmcIoZBP`+8SdHHk6CtDSWx@|T|mH12zSOLUOetnMlfRG5(GbvV769fRB&N&X7&^c zs=SIYGoRj zRzrh}Y*O6}bz@T90(BT}ygvtZb5h-k2d~<-5!Q*)+s#d46O%MB zJee%qPwqhL1=Iyowg###$u^p~{+4d0ixCXRHz6e172KCx0*vgYNuM?bbs)v0KWj1T zDDl6G8PeX-ZRj$*lj_Nw>PfJ4vq|2#gcluku`e@nu;G^bIE7L7uimB)+p6j_=Kac(RY@i5W3}ElCrbo}s{pdH-qjzR+ z-1*|}J87}A1F?6n$F6-k_xW|G-!P~qrCITbs-;zwW$#fjup!=e{=IXtYv-QRtFwki zg0sq9U*l9fG7W@Ha+|+YZu7Q^rLuUc6r7c|AM>|~rGj5-b^Be;{oAYeRn~1Pl1o$n zT=SR_^Y}aFF|X!vJkMhmk&l|`?VG)JCy)VkI{cYnU+nCMFtB=;S!IukifWUO`A?qo zN^Q+;M<2xwz2_P$MESVlZ*SCMtq~sMVAJbb?3J~5 zs5Y-4=mY3nn;M&CNzZU-%41NRMi1?)Lyn%-heiEF5=~1%b;z_XOD~E-S+2hq?TL!hz0_ z{HxuOlGnl|uZ@>%8{K{X#O*zi@;%}5J>%syW3@jRYdjRL{b8i`aJcsHc&!jEC>^Z5 z`n5>GmT>fLC@DF<;)rZ2>hsLWt|701fmzm}= z`%aCywoP)cM>DdYz&D{36~dECR44@C0#f4Y)1vDp?xI~?D6Sl!M5pZuWe`A@ZnDW5 zBpAC5N#35PLk94ty#->-s=q}r3FZ`EprmfX!};_5bHl?=SAr#kRqR$Mc6o4a_&NmI z?0L*aDIK14Zmg)RuB@+g?%Z3mClMRY1G_5sRyu)Q&NrMzvV@&bMh6Gx`>!Q2+C=y( ztp)?tidia3l3$XrTu5u7aIsP@#(B6{4~2{;5C|&a$W`rv=o1q}@621ov((4fp}Y%< z(`fox4h7$w;#Y=tjg?hS@;eEIzL82Hd4l`uRLT-d`QWT6dGT-DSm zUSimcj6_5=p@jFuFD1TJbQuH_wn{8D^fSLyKg%=yh^Ln2-bc2Yl=l%&%l0GNPf9sP z`3e+EQjsWL-6UU+smNvZZSF~raJgYF_wxRM{e#=DzBR$U@_%ig#OXhVt>nHZ+NPkqvroYLh0|Qe>BRrMsm< z_!em+E{L`s*!TU4?Vzpkl*3t9Sr4KLDF=~NoOe(F$p-}_1EG+nAp|d$V=P#d_#^}p z?2qg8^u14J&fiYbX>&rSCCpu_&^Z_pnKn|Hj>iMlY8)z{)l{rWmuD0@HB;FP9psBp zEEyK53Vk$Hp}*u!eh1#xYZqbkQ3>{zWH z`TTFs;6^-0TI1~bU(O9*!HrmK18};}bN0 z@Mm7aju1V`pJfRe)5o7|y6J!RIPLKtV z9U~>4nzY0duK3!*ZwiUAC7oe2gv^_cM5sZSWzjS2a|IYj1fjobsHzBH0iY2`A&ENz zX|&N+5@Q6?$fB(zo{|#p;k&W-?!*P1Y%nfO)N#P5W^a4D*d|E$8&yv6dqn&T4;6Q- zYJ}sYSGAC%W0jzC1mMG?l_0z&>5bwk4Z)_Q9X83Xq}qrn-Ik;>c#Vv=P1qgiMG|`H z>(JD>YEkg&qp8H5vS4N5sF>jh8lzb&f|h9Z${-hAkrT91M5-%S1=FHAtAnJ zNjSS?JlpjcS*#^Ey0d%TJ?_w!(24$UP4ER#enoFhPfcjY0Moy7f-j8nD z4LJJuPw*R`wOHIEC&K52`MglmKz{#`3BD-GuZr;N!~FV?Jg~X{?Mc3PAp>5%kco2g zg2rHdPg-;ckZxM>ghl481&kKf1A1iO;%$HyR**KU=~c}R&_a&ZruVgi z9c?q2>KM%s!v#CBTw^LHjgJg~=&TYs z7rp*6ja=|UCf#8&1NdjmvcxZ%BnHTLO5efm@^OKWoB!d;>5RT9RX`O>jEoPap#2Q< aH?(02Ib*2kuc+i-<^v2<{utqsbpJ1krva1z literal 0 HcmV?d00001 diff --git a/Student/service/__pycache__/UserService.cpython-310.pyc b/Student/service/__pycache__/UserService.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..626446441e9aba98f76945958c4f1b357076cdda GIT binary patch literal 1272 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 A1ONa4 literal 0 HcmV?d00001 diff --git a/Student/ui/__pycache__/StudentUI.cpython-312.pyc b/Student/ui/__pycache__/StudentUI.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..47cecd539935e3a8ba9ca5f7c718cde6191cb221 GIT binary patch literal 17496 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 literal 0 HcmV?d00001 diff --git a/Student/ui/__pycache__/__init__.cpython-312.pyc b/Student/ui/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1289d7e1f71624c5c7751739b16273c0bfbbfb10 GIT binary patch literal 149 zcmX@j%ge<81YBi@Q$X}%5P=Rpvj9b=GgLBYGWxA#C}INgK7-VJH3SmQRxzQ)sYS&x zFE%WC-q-oOzcKq%PO4oI VD^Ncp5Ep|OADI~$8H<>KECAL$C1n5r literal 0 HcmV?d00001 diff --git a/Student/utils/ExcelUtils.py b/Student/utils/ExcelUtils.py new file mode 100644 index 0000000..69ba5e0 --- /dev/null +++ b/Student/utils/ExcelUtils.py @@ -0,0 +1,23 @@ +import os + +import pandas as pd + + +class ExcelUtils: + file_path = 'output.xlsx' + + @staticmethod + def red_excel(): + if not os.path.exists(ExcelUtils.file_path): + return + # 从Excel文件中读取数据 + data = pd.read_excel('output.xlsx') + return data + + @staticmethod + def to_excel(data): + # 将数据转换为DataFrame + df = pd.DataFrame(data) + # 导出到Excel文件 + df.to_excel(ExcelUtils.file_path, index=False) + print("导出成功!") diff --git a/Student/utils/__init__.py b/Student/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Student/utils/__pycache__/ExcelUtils.cpython-310.pyc b/Student/utils/__pycache__/ExcelUtils.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f85518ee3aa8aafc919181e30efe6d6dd3372750 GIT binary patch literal 849 zcmY*WO^Xvj5bf%jOeVA0_45aa2idtS1i^zWBDh98m`m_71co8iaVN}2?Cyc=5)ZNq ziYWL8#KfB?@3Kda;t!asWMNO9ym+#D#_Yz1dea{@_3FLKH#a>->&N$RxXl^+X%6el zqQiX(b&~)YLc)Uj3ju$`kfU|X&^qFQh0tfdeMWh#H#E4u&g*Q`tzZEl3phex3A?Uw z1VMxLHa3nK?HzQeTC?;XPKP3Ss^dic*~kk$DfG@XQPckjfNC0o2NdcCfo5Zvb8U_7 z1*jIXKGTi4gRp=XY(^)a_oVrO2zahadlKpW(h<{GX(h=9R<=fQBEssPPcZPLh%gkU z7avL+BOQHa(pdMqOR#r$aJ$p#+!>rM-kyEX(|etu*;NOoiUhQMOk+Yusi?vTDE>WVn?{bD0gC sd%&ApP^s{3Y1|8(Nt9uvD$TXLs=@`BTBW;NcXiK9pi<;AmtVF10#7Hz)c^nh literal 0 HcmV?d00001 diff --git a/Student/utils/__pycache__/ExcelUtils.cpython-312.pyc b/Student/utils/__pycache__/ExcelUtils.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..55934e976ce5825d1cbabcecd0c3b8d51a73a8b1 GIT binary patch literal 1177 zcmb7DO=uHQ5T3W$-ERJxri~|Qn}UZdV$ljchY-3;^<*`Q(39`&PZGh44>I%3H~VJh%}id0!vSFD z?VDFPApq=g!#ko2nh6G$0Ru*PNI4p%1OYAs7M1|}R@qH{Qobru#jhMDGhBMd^+WSC zW0t{y6vB`aFiQChk;hndzf4KY_I22DRa7M_aH*0p@{=^1Cr80znU>0QxRNK8zmoV^ z4E}50vy)IaBtXtf-(naibr>$Bvd85V54H6waxg(vph1t%g*?>O7R~AU9~Sl%AkvY!qm^%sZ8CH*L67wfv^x#+;3Hcv`HVg(kyH zEW)Qqv@uhkX)M$i9_O|PMm7dUwjyVDLcQEEU!PyOwi!8D6L%tgwP2IofQ;K4j)A|( zp2KYhmVvf>|C+-bw0ec+(Em>bqvwLReyC$EY$@Hm2&$lp$#K?6DO@D4yN6D@jx)NQ@klxE)O^A0XAV9Ya*T;XA42E@`1hdiw;V-7KY$7Q F+8^Vz_~HNn literal 0 HcmV?d00001 diff --git a/Student/utils/__pycache__/__init__.cpython-310.pyc b/Student/utils/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0c09f033c4029b7294ba14fd269ea9363c6bee02 GIT binary patch literal 164 zcmd1j<>g`k0^g%YQb6=$5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!>?kn3U zXcqHqVb9CCi(-OHN>ftvN<8z@@{4j4OEUBGd=v8$(^GSSg29!=C8@bFr6rj;#WC^m fnR%Hd@$q^EmA5!-a`RJ4b5iX<78El92^Izbv>YiH literal 0 HcmV?d00001 diff --git a/Student/utils/__pycache__/__init__.cpython-312.pyc b/Student/utils/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6d840e18aca166f05b5f1d90ae31598450df0e81 GIT binary patch literal 152 zcmX@j%ge<81inX)q=4whAOanHW&w&!XQ*V*Wb|9fP{ah}eFmxdY62vjtztrpQ;UjY zUTj$Oysz_le{YOSYH@Z+enCudNoh)IUP(-8NoG!QOniK1US>&ryk0@&FAkgB{FKt1 YRJ$Tppb?BfTnu7-WM*V!EMf+-0JwoCP5=M^ literal 0 HcmV?d00001 diff --git a/pythonProject100/.idea/modules.xml b/pythonProject100/.idea/modules.xml deleted file mode 100644 index 5c58315..0000000 --- a/pythonProject100/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/pythonProject100/__pycache__/pymysql.cpython-312.pyc b/pythonProject100/__pycache__/pymysql.cpython-312.pyc deleted file mode 100644 index 3877040043b71eba8eab0e20aa52aef9f6f6b460..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 162 zcmX@j%ge<81Vwj3(>Q?iV-N=&d}aZPOlPQM&}8&m$xy@uJmtkIamWj77{q765`gD);~Z diff --git a/pythonProject100/main.py b/pythonProject100/main.py deleted file mode 100644 index 07bcc46..0000000 --- a/pythonProject100/main.py +++ /dev/null @@ -1,532 +0,0 @@ -import pymysql -from tkinter import ttk -import tkinter as tk -import tkinter.font as tkFont -from tkinter import * # 图形界面库 -import tkinter.messagebox as messagebox # 弹窗 - - -class StartPage: - def __init__(self, parent_window): - parent_window.destroy() # 销毁子界面 - - self.window = tk.Tk() # 初始框的声明 - self.window.title('学生信息管理系统') - self.window.geometry('300x470') # 这里的乘是小x - - label = Label(self.window, text="学生信息管理系统", font=("Verdana", 20)) - label.pack(pady=100) # pady=100 界面的长度 - - Button(self.window, text="管理员登陆", font=tkFont.Font(size=16), command=lambda: AdminPage(self.window), - width=30, height=2, - fg='white', bg='gray', activebackground='black', activeforeground='white').pack() - Button(self.window, text="学生登陆", font=tkFont.Font(size=16), command=lambda: StudentPage(self.window), - width=30, - height=2, fg='white', bg='gray', activebackground='black', activeforeground='white').pack() - Button(self.window, text="关于", font=tkFont.Font(size=16), command=lambda: AboutPage(self.window), width=30, - height=2, - fg='white', bg='gray', activebackground='black', activeforeground='white').pack() - Button(self.window, text='退出系统', height=2, font=tkFont.Font(size=16), width=30, command=self.window.destroy, - fg='white', bg='gray', activebackground='black', activeforeground='white').pack() - - self.window.mainloop() # 主消息循环 - - -# 管理员登陆页面 -class AdminPage: - def __init__(self, parent_window): - parent_window.destroy() # 销毁主界面 - - self.window = tk.Tk() # 初始框的声明 - self.window.title('管理员登陆页面') - self.window.geometry('300x450') # 这里的乘是小x - - label = tk.Label(self.window, text='管理员登陆', bg='green', font=('Verdana', 20), width=30, height=2) - label.pack() - - Label(self.window, text='管理员账号:', font=tkFont.Font(size=14)).pack(pady=25) - self.admin_username = tk.Entry(self.window, width=30, font=tkFont.Font(size=14), bg='Ivory') - self.admin_username.pack() - - Label(self.window, text='管理员密码:', font=tkFont.Font(size=14)).pack(pady=25) - self.admin_pass = tk.Entry(self.window, width=30, font=tkFont.Font(size=14), bg='Ivory', show='*') - self.admin_pass.pack() - - Button(self.window, text="登陆", width=8, font=tkFont.Font(size=12), command=self.login).pack(pady=40) - Button(self.window, text="返回首页", width=8, font=tkFont.Font(size=12), command=self.back).pack() - - self.window.protocol("WM_DELETE_WINDOW", self.back) # 捕捉右上角关闭点击 - self.window.mainloop() # 进入消息循环 - - def login(self): - print(str(self.admin_username.get())) - print(str(self.admin_pass.get())) - admin_pass = None - - # 数据库操作 查询管理员表 - db = pymysql.connect("localhost", "root", "123456", "student") # 打开数据库连接 - cursor = db.cursor() # 使用cursor()方法获取操作游标 - sql = "SELECT * FROM admin_login_k WHERE admin_id = '%s'" % (self.admin_username.get()) # SQL 查询语句 - try: - # 执行SQL语句 - cursor.execute(sql) - # 获取所有记录列表 - results = cursor.fetchall() - for row in results: - admin_id = row[0] - admin_pass = row[1] - # 打印结果 - print("admin_id=%s,admin_pass=%s" % (admin_id, admin_pass)) - except: - print("Error: unable to fecth data") - messagebox.showinfo('警告!', '用户名或密码不正确!') - db.close() # 关闭数据库连接 - - print("正在登陆管理员管理界面") - print("self", self.admin_pass) - print("local", admin_pass) - - if self.admin_pass.get() == admin_pass: - AdminManage(self.window) # 进入管理员操作界面 - else: - messagebox.showinfo('警告!', '用户名或密码不正确!') - - def back(self): - StartPage(self.window) # 显示主窗口 销毁本窗口 - - -# 学生登陆页面 -class StudentPage: - def __init__(self, parent_window): - parent_window.destroy() # 销毁主界面 - - self.window = tk.Tk() # 初始框的声明 - self.window.title('学生登陆') - self.window.geometry('300x450') # 这里的乘是小x - - label = tk.Label(self.window, text='学生登陆', bg='green', font=('Verdana', 20), width=30, height=2) - label.pack() - - Label(self.window, text='学生账号:', font=tkFont.Font(size=14)).pack(pady=25) - self.student_id = tk.Entry(self.window, width=30, font=tkFont.Font(size=14), bg='Ivory') - self.student_id.pack() - - Label(self.window, text='学生密码:', font=tkFont.Font(size=14)).pack(pady=25) - self.student_pass = tk.Entry(self.window, width=30, font=tkFont.Font(size=14), bg='Ivory', show='*') - self.student_pass.pack() - - Button(self.window, text="登陆", width=8, font=tkFont.Font(size=12), command=self.login).pack(pady=40) - Button(self.window, text="返回首页", width=8, font=tkFont.Font(size=12), command=self.back).pack() - - self.window.protocol("WM_DELETE_WINDOW", self.back) # 捕捉右上角关闭点击 - self.window.mainloop() # 进入消息循环 - - def login(self): - print(str(self.student_id.get())) - print(str(self.student_pass.get())) - stu_pass = None - - # 数据库操作 查询管理员表 - db = pymysql.connect("localhost", "root", "123456", "student") # 打开数据库连接 - cursor = db.cursor() # 使用cursor()方法获取操作游标 - sql = "SELECT * FROM stu_login_k WHERE stu_id = '%s'" % (self.student_id.get()) # SQL 查询语句 - try: - # 执行SQL语句 - cursor.execute(sql) - # 获取所有记录列表 - results = cursor.fetchall() - for row in results: - stu_id = row[0] - stu_pass = row[1] - # 打印结果 - print("stu_id=%s,stu_pass=%s" % (stu_id, stu_pass)) - except: - print("Error: unable to fecth data") - messagebox.showinfo('警告!', '用户名或密码不正确!') - db.close() # 关闭数据库连接 - - print("正在登陆学生信息查看界面") - print("self", self.student_pass.get()) - print("local", stu_pass) - - if self.student_pass.get() == stu_pass: - StudentView(self.window, self.student_id.get()) # 进入学生信息查看界面 - else: - messagebox.showinfo('警告!', '用户名或密码不正确!') - - def back(self): - StartPage(self.window) # 显示主窗口 销毁本窗口 - - -# 管理员操作界面 -class AdminManage: - def __init__(self, parent_window): - parent_window.destroy() # 销毁主界面 - - self.window = Tk() # 初始框的声明 - self.window.title('管理员操作界面') - - self.frame_left_top = tk.Frame(width=300, height=200) - self.frame_right_top = tk.Frame(width=200, height=200) - self.frame_center = tk.Frame(width=500, height=400) - self.frame_bottom = tk.Frame(width=650, height=50) - - # 定义下方中心列表区域 - self.columns = ("学号", "姓名", "性别", "年龄") - self.tree = ttk.Treeview(self.frame_center, show="headings", height=18, columns=self.columns) - self.vbar = ttk.Scrollbar(self.frame_center, orient=VERTICAL, command=self.tree.yview) - # 定义树形结构与滚动条 - self.tree.configure(yscrollcommand=self.vbar.set) - - # 表格的标题 - self.tree.column("学号", width=150, anchor='center') # 表示列,不显示 - self.tree.column("姓名", width=150, anchor='center') - self.tree.column("性别", width=100, anchor='center') - self.tree.column("年龄", width=100, anchor='center') - - # 调用方法获取表格内容插入 - self.tree.grid(row=0, column=0, sticky=NSEW) - self.vbar.grid(row=0, column=1, sticky=NS) - - self.id = [] - self.name = [] - self.gender = [] - self.age = [] - # 打开数据库连接 - db = pymysql.connect("localhost", "root", "root", "student") - cursor = db.cursor() # 使用cursor()方法获取操作游标 - sql = "SELECT * FROM student_k" # SQL 查询语句 - try: - # 执行SQL语句 - cursor.execute(sql) - # 获取所有记录列表 - results = cursor.fetchall() - for row in results: - self.id.append(row[0]) - self.name.append(row[1]) - self.gender.append(row[2]) - self.age.append(row[3]) - # print(self.id) - # print(self.name) - # print(self.gender) - # print(self.age) - except: - print("Error: unable to fetch data") - messagebox.showinfo('警告!', '数据库连接失败!') - db.close() # 关闭数据库连接 - - print("test***********************") - for i in range(min(len(self.id), len(self.name), len(self.gender), len(self.age))): # 写入数据 - self.tree.insert('', i, values=(self.id[i], self.name[i], self.gender[i], self.age[i])) - - for col in self.columns: # 绑定函数,使表头可排序 - self.tree.heading(col, text=col, - command=lambda _col=col: self.tree_sort_column(self.tree, _col, False)) - - # 定义顶部区域 - # 定义左上方区域 - self.top_title = Label(self.frame_left_top, text="学生信息:", font=('Verdana', 20)) - self.top_title.grid(row=0, column=0, columnspan=2, sticky=NSEW, padx=50, pady=10) - - self.left_top_frame = tk.Frame(self.frame_left_top) - self.var_id = StringVar() # 声明学号 - self.var_name = StringVar() # 声明姓名 - self.var_gender = StringVar() # 声明性别 - self.var_age = StringVar() # 声明年龄 - # 学号 - self.right_top_id_label = Label(self.frame_left_top, text="学号:", font=('Verdana', 15)) - self.right_top_id_entry = Entry(self.frame_left_top, textvariable=self.var_id, font=('Verdana', 15)) - self.right_top_id_label.grid(row=1, column=0) # 位置设置 - self.right_top_id_entry.grid(row=1, column=1) - # 姓名 - self.right_top_name_label = Label(self.frame_left_top, text="姓名:", font=('Verdana', 15)) - self.right_top_name_entry = Entry(self.frame_left_top, textvariable=self.var_name, font=('Verdana', 15)) - self.right_top_name_label.grid(row=2, column=0) # 位置设置 - self.right_top_name_entry.grid(row=2, column=1) - # 性别 - self.right_top_gender_label = Label(self.frame_left_top, text="性别:", font=('Verdana', 15)) - self.right_top_gender_entry = Entry(self.frame_left_top, textvariable=self.var_gender, - font=('Verdana', 15)) - self.right_top_gender_label.grid(row=3, column=0) # 位置设置 - self.right_top_gender_entry.grid(row=3, column=1) - # 年龄 - self.right_top_gender_label = Label(self.frame_left_top, text="年龄:", font=('Verdana', 15)) - self.right_top_gender_entry = Entry(self.frame_left_top, textvariable=self.var_age, - font=('Verdana', 15)) - self.right_top_gender_label.grid(row=4, column=0) # 位置设置 - self.right_top_gender_entry.grid(row=4, column=1) - - # 定义右上方区域 - self.right_top_title = Label(self.frame_right_top, text="操作:", font=('Verdana', 20)) - - self.tree.bind('', self.click) # 左键获取位置 - self.right_top_button1 = ttk.Button(self.frame_right_top, text='新建学生信息', width=20, command=self.new_row) - self.right_top_button2 = ttk.Button(self.frame_right_top, text='更新选中学生信息', width=20, - command=self.updata_row) - self.right_top_button3 = ttk.Button(self.frame_right_top, text='删除选中学生信息', width=20, - command=self.del_row) - - # 位置设置 - self.right_top_title.grid(row=1, column=0, pady=10) - self.right_top_button1.grid(row=2, column=0, padx=20, pady=10) - self.right_top_button2.grid(row=3, column=0, padx=20, pady=10) - self.right_top_button3.grid(row=4, column=0, padx=20, pady=10) - - # 整体区域定位 - self.frame_left_top.grid(row=0, column=0, padx=2, pady=5) - self.frame_right_top.grid(row=0, column=1, padx=30, pady=30) - self.frame_center.grid(row=1, column=0, columnspan=2, padx=4, pady=5) - self.frame_bottom.grid(row=2, column=0, columnspan=2) - - self.frame_left_top.grid_propagate(0) - self.frame_right_top.grid_propagate(0) - self.frame_center.grid_propagate(0) - self.frame_bottom.grid_propagate(0) - - self.frame_left_top.tkraise() # 开始显示主菜单 - self.frame_right_top.tkraise() # 开始显示主菜单 - self.frame_center.tkraise() # 开始显示主菜单 - self.frame_bottom.tkraise() # 开始显示主菜单 - - self.window.protocol("WM_DELETE_WINDOW", self.back) # 捕捉右上角关闭点击 - self.window.mainloop() # 进入消息循环 - - def back(self): - StartPage(self.window) # 显示主窗口 销毁本窗口 - - def click(self, event): - self.col = self.tree.identify_column(event.x) # 列 - self.row = self.tree.identify_row(event.y) # 行 - - print(self.col) - print(self.row) - self.row_info = self.tree.item(self.row, "values") - self.var_id.set(self.row_info[0]) - self.var_name.set(self.row_info[1]) - self.var_gender.set(self.row_info[2]) - self.var_age.set(self.row_info[3]) - self.right_top_id_entry = Entry(self.frame_left_top, state='disabled', textvariable=self.var_id, - font=('Verdana', 15)) - - print('') - - def tree_sort_column(self, tv, col, reverse): # Treeview、列名、排列方式 - l = [(tv.set(k, col), k) for k in tv.get_children('')] - l.sort(reverse=reverse) # 排序方式 - # rearrange items in sorted positions - for index, (val, k) in enumerate(l): # 根据排序后索引移动 - tv.move(k, '', index) - tv.heading(col, command=lambda: self.tree_sort_column(tv, col, not reverse)) # 重写标题,使之成为再点倒序的标题 - - def new_row(self): - print('123') - print(self.var_id.get()) - print(self.id) - if str(self.var_id.get()) in self.id: - messagebox.showinfo('警告!', '该学生已存在!') - else: - if self.var_id.get() != '' and self.var_name.get() != '' and self.var_gender.get() != '' and self.var_age.get() != '': - # 打开数据库连接 - db = pymysql.connect("localhost", "root", "root", "student") - cursor = db.cursor() # 使用cursor()方法获取操作游标 - sql = "INSERT INTO student_k(id, name, gender, age) \ - VALUES ('%s', '%s', '%s', '%s')" % \ - (self.var_id.get(), self.var_name.get(), self.var_gender.get(), self.var_age.get()) # SQL 插入语句 - try: - cursor.execute(sql) # 执行sql语句 - db.commit() # 提交到数据库执行 - except: - db.rollback() # 发生错误时回滚 - messagebox.showinfo('警告!', '数据库连接失败!') - db.close() # 关闭数据库连接 - - self.id.append(self.var_id.get()) - self.name.append(self.var_name.get()) - self.gender.append(self.var_gender.get()) - self.age.append(self.var_age.get()) - self.tree.insert('', len(self.id) - 1, values=( - self.id[len(self.id) - 1], self.name[len(self.id) - 1], self.gender[len(self.id) - 1], - self.age[len(self.id) - 1])) - self.tree.update() - messagebox.showinfo('提示!', '插入成功!') - else: - messagebox.showinfo('警告!', '请填写学生数据') - - def updata_row(self): - res = messagebox.askyesnocancel('警告!', '是否更新所填数据?') - if res == True: - if self.var_id.get() == self.row_info[0]: # 如果所填学号 与 所选学号一致 - # 打开数据库连接 - db = pymysql.connect("localhost", "root", "root", "student") - cursor = db.cursor() # 使用cursor()方法获取操作游标 - sql = "UPDATE student_k SET name = '%s', gender = '%s', age = '%s' \ - WHERE id = '%s'" % ( - self.var_name.get(), self.var_gender.get(), self.var_age.get(), self.var_id.get()) # SQL 插入语句 - try: - cursor.execute(sql) # 执行sql语句 - db.commit() # 提交到数据库执行 - messagebox.showinfo('提示!', '更新成功!') - except: - db.rollback() # 发生错误时回滚 - messagebox.showinfo('警告!', '更新失败,数据库连接失败!') - db.close() # 关闭数据库连接 - - id_index = self.id.index(self.row_info[0]) - self.name[id_index] = self.var_name.get() - self.gender[id_index] = self.var_gender.get() - self.age[id_index] = self.var_age.get() - - self.tree.item(self.tree.selection()[0], values=( - self.var_id.get(), self.var_name.get(), self.var_gender.get(), - self.var_age.get())) # 修改对于行信息 - else: - messagebox.showinfo('警告!', '不能修改学生学号!') - - def del_row(self): - res = messagebox.askyesnocancel('警告!', '是否删除所选数据?') - if res == True: - print(self.row_info[0]) # 鼠标选中的学号 - print(self.tree.selection()[0]) # 行号 - print(self.tree.get_children()) # 所有行 - # 打开数据库连接 - db = pymysql.connect("localhost", "root", "root", "student") - cursor = db.cursor() # 使用cursor()方法获取操作游标 - sql = "DELETE FROM student_k WHERE id = '%s'" % (self.row_info[0]) # SQL 插入语句 - try: - cursor.execute(sql) # 执行sql语句 - db.commit() # 提交到数据库执行 - messagebox.showinfo('提示!', '删除成功!') - except: - db.rollback() # 发生错误时回滚 - messagebox.showinfo('警告!', '删除失败,数据库连接失败!') - db.close() # 关闭数据库连接 - - id_index = self.id.index(self.row_info[0]) - print(id_index) - del self.id[id_index] - del self.name[id_index] - del self.gender[id_index] - del self.age[id_index] - print(self.id) - self.tree.delete(self.tree.selection()[0]) # 删除所选行 - print(self.tree.get_children()) - - -# 学生查看信息界面 -class StudentView: - def __init__(self, parent_window, student_id): - parent_window.destroy() # 销毁主界面 - - self.window = tk.Tk() # 初始框的声明 - self.window.title('关于') - self.window.geometry('300x450') # 这里的乘是小x - - label = tk.Label(self.window, text='学生信息查看', bg='green', font=('Verdana', 20), width=30, height=2) - label.pack(pady=20) - - self.id = '学号:' + '' - self.name = '姓名:' + '' - self.gender = '性别:' + '' - self.age = '年龄:' + '' - # 打开数据库连接 - db = pymysql.connect("localhost", "root", "root", "student") - cursor = db.cursor() # 使用cursor()方法获取操作游标 - sql = "SELECT * FROM student_k WHERE id = '%s'" % (student_id) # SQL 查询语句 - try: - # 执行SQL语句 - cursor.execute(sql) - # 获取所有记录列表 - results = cursor.fetchall() - for row in results: - self.id = '学号:' + row[0] - self.name = '姓名:' + row[1] - self.gender = '性别:' + row[2] - self.age = '年龄:' + row[3] - except: - print("Error: unable to fetch data") - db.close() # 关闭数据库连接 - - Label(self.window, text=self.id, font=('Verdana', 18)).pack(pady=5) - Label(self.window, text=self.name, font=('Verdana', 18)).pack(pady=5) - Label(self.window, text=self.gender, font=('Verdana', 18)).pack(pady=5) - Label(self.window, text=self.age, font=('Verdana', 18)).pack(pady=5) - - Button(self.window, text="返回首页", width=8, font=tkFont.Font(size=16), command=self.back).pack(pady=25) - - self.window.protocol("WM_DELETE_WINDOW", self.back) # 捕捉右上角关闭点击 - self.window.mainloop() # 进入消息循环 - - def back(self): - StartPage(self.window) # 显示主窗口 销毁本窗口 - - -# About页面 -class AboutPage: - def __init__(self, parent_window): - parent_window.destroy() # 销毁主界面 - - self.window = tk.Tk() # 初始框的声明 - self.window.title('关于') - self.window.geometry('300x450') # 这里的乘是小x - - label = tk.Label(self.window, text='学生信息管理系统', bg='green', font=('Verdana', 20), width=30, height=2) - label.pack() - - Label(self.window, text='作者:清晨的光明', font=('Verdana', 18)).pack(pady=30) - Label(self.window, text='blog.csdn.net/kdongyi', font=('Verdana', 18)).pack(pady=5) - - Button(self.window, text="返回首页", width=8, font=tkFont.Font(size=12), command=self.back).pack(pady=100) - - self.window.protocol("WM_DELETE_WINDOW", self.back) # 捕捉右上角关闭点击 - self.window.mainloop() # 进入消息循环 - - def back(self): - StartPage(self.window) # 显示主窗口 销毁本窗口 - - -if __name__ == '__main__': - try: - # 打开数据库连接 连接测试 - db = pymysql.connect("localhost", "root", "root", "student") - # 使用cursor()方法获取操作游标 - cursor = db.cursor() - # 如果数据表不存在则创建表 若存在则跳过 - # 设置主键唯一 - sql = """CREATE TABLE IF NOT EXISTS student_k( - id char(20) NOT NULL, - name char(20) default NULL, - gender char(5) default NULL, - age char(5) default NULL, - PRIMARY KEY (id) - - ) ENGINE = InnoDB - DEFAULT CHARSET = utf8 - """ - cursor.execute(sql) - # 如果数据表不存在则创建表 若存在则跳过 - sql = """CREATE TABLE IF NOT EXISTS admin_login_k( - admin_id char(20) NOT NULL, - admin_pass char(20) default NULL, - PRIMARY KEY (admin_id) - ) ENGINE = InnoDB - DEFAULT CHARSET = utf8 - """ - cursor.execute(sql) - # 如果数据表不存在则创建表 若存在则跳过 - sql = """CREATE TABLE IF NOT EXISTS stu_login_k( - stu_id char(20) NOT NULL, - stu_pass char(20) default NULL, - PRIMARY KEY (stu_id) - ) ENGINE = InnoDB - DEFAULT CHARSET = utf8 - """ - cursor.execute(sql) - - # 关闭数据库连接 - db.close() - - # 实例化Application - window = tk.Tk() - StartPage(window) - except: - messagebox.showinfo('错误!', '连接数据库失败!') diff --git a/pythonProject100/pymysql.py b/pythonProject100/pymysql.py deleted file mode 100644 index fd40910..0000000 --- a/pythonProject100/pymysql.py +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/课程设计报告/python程序设计课程设计报告模板 2024年.doc b/python程序设计课程设计报告模板 2024年.doc similarity index 83% rename from 课程设计报告/python程序设计课程设计报告模板 2024年.doc rename to python程序设计课程设计报告模板 2024年.doc index 781bd694fb8b68c4a981b4fa88ffc496db8e8ae3..b0fbd1cf2d6b29768a1607356a4f73cbff21a138 100644 GIT binary patch delta 14273 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ϱZWSyQJ1{*6NhfaZZ*WK$jA&Wfe;BxB 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 E2h4r{UH||9 delta 49169 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 literal 0 HcmV?d00001 diff --git a/课程设计报告/功能模块图.eddx b/课程设计报告/功能模块图.eddx deleted file mode 100644 index 0e4b12f0bb190754b9aefd96943c8968688cb85c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22046 zcmb@sV~}P|^Wc58t!Z1+wrykDwr$(CZQJf?PusR_TRZo2$3E}=--!LT@r$ZBbs{RW zDo>uuipZ3c0s%z<005AHdFf6yv8Ms^6CeOU7!&}2{rlF)*3jA7*v5(0&DttDY0@T> zA0_xX`3>Iei5(;aLvvA$(;gayQ9FK0zAMfMm&9!z}QTL9{iC^!Fk)B|IHxnJMIgoiHOieupx@TRW`F z7QEa@RnG*{lhH z=)2zWc+7EF;6#-ujdVDmP$Gw*oVQVb5_^|RW3R`AYtLU{u3)n-0X%6` z78;-KHy=0O5nS19eZ6{KA0PKGk8N9XyO|HVzsMCkcw6{RJl?!Ozh!MkKto5%l>2%r zql-r@4UC7*OqRbvyzjB){)b0Ya`H~xVgmqU9l!vDzaC+yZ))sF_fOC8k5gP`Ydda; zx`bRSCV$fpcEvXwA#UR~==Cp8e?w!nWG9SVA#6YP7891}u^ys#u6j z-jXiuve~|2+q#8uEtp0#ocgPj@1&KJdEjmAvAWslZtS*q_3T4v{nu8vyCu!Q$m5f? z2RH?>_c{kosuz2OB1CSY%g>@Y;vxTBoz`EFg+P@A z5}(D1i5(732c#P1*avo&t%u68sdEwsv>PPH51PsrF-8Pv11X6H(K%*@%U>R)o12b~ zu9^r~n$KCf)?1F?GBdN-*iDw9eCB&4jt4nS0@t*21Vt)v*JwnOG_UD3t{#^J`!4U3 zK<0%4p-SZJ$`zPp*bCjh$nJ%T^my4H%h$4aK0BWs&gOle(}IRw>ub+b+n7%4QONU& zJ!@xp^Ckp^E5*Upmzm)u1?o%LTY2?coF`8BS{iM$gslVdLN-g;XyuE71C{`XRqRTc zWkQhcY34V&)dML3k~YecAk_E0^W#`vXev=l#(5T|e#E;eRl2Xs$~qI(wb1IXoxDx# z3BAXUt?Q*}*t1rbnKP$>v)3Mzb`zBqvYyYoRfOCupNGkNvfL06k!anQWunV&MYb&Gg7_^eA@KM!m+ zEn6Y92kEQ!jUl|uIcQ-qp-x)UNe|gJla=_%|>L)(kj%% z*~N9`O$nCMvxeE!k=+-_&~167w#{N5bv^N?+Ee(pR3SChOE+*^hxA&f!1sOg7g1`K zP8|JNJd*!O_vX{Ayj=M%n{BSoWA5<<^esM#b{pWK>V)WT%}x=5+p(gO2ussE=n+jn<)t`FRQxqQ-sV-KeCr8(~7 zCW%(GcGJQLJ9l&($)IlR?7~f_S=FoGGDCdJ+G~jAFDJPx>EDl6~mqZL4Cp z+=#)t>}OT6d|fwIz4t}W!-ToC@sNHICm4;Nx;&-*!j5_5>pcH9WL9zNp2hB7HYo`z zuWeraO&D+9ETS18-Y?)%GP$HTbM^eunVlZJ7ntm`{fatC0(NKX#C}IBWE;!JR846f z_L~&fTtz*BX0q$Ee?^iOi@~L~S!~L%v#;HId9k>m<{HatU&{Y6-ZIf0ETxM-+uKQQqb{jCAAgap-mZ5aE|8>}IoY zVR3vm?jVw(pjZ0oMPMK<`7m1oxX37R5Jt1M==F`1%qE(zAsz{t+ZmIpx@GEpDcc^7 z8&c1G69Z;4MF!zxLRLE0a7o+W9dnl#iS5Ibm`7{g2$yc!W7td5fzrgSnyxM2@Uw?# zjfpdgq&6(;pSmtAD%Z_#)!GKN_LnVeH*fPpiTL<@-@Buc-!G-;vcAI^Oh?&niCL~a z+nm4Av)s;Sx)?s8vUHW%Rvw?0xIPPkCWU<3?pt=QGq)yU&}=SS=vpO+TMDFfxAx5SPRf5-W!J6ZhjaS%{~ka43(%3FRo*<*%E#4(2uy?9rI=T zJghe6;=yhEIJ~{go({Ome&0PjoSKeH1rFGwrNTERNZ1;Bo|DYvurgK^N4P=!h<~zJ z=P*Nf%YGU$J1XVYOW&|Fa~oMo$4)Yi8LeA$j#=|GG&l^|?@y^G-EhB1W7@F0YHiJ~ zIyzACXJ(6?E5J-;tez|5l=o%CGNG79jD<0@>1bpcTf7s*Q<_0eQ%Oz5cvg0!cgLQ) zH8;L~+%FWkF(M_&)^&XItbOe2Bp7rovl~5x)lkk7kQY-{`6h*1!H>m&z29AtRF!Y`EGTX1Lhba~*p z2jFnSv;fL+17F6i5NU!U3?KZFj(^a*cxN!8f5)Sb78j_4K56fd4M!bqI%Xg+|k zm1n+WW+5#}?f|s318x)-a#uvy^GP~|=}>EXu*pmg(hl)LFi@0H0Wct+QM#Ih?g#vZ z9wNx!aH0S#q2B8*$luZnI`SsEKtDd|C;23rR%A07%#XJI_I>C9+uWSr-|ktoepD}* zXMLz{q4Ko;B90OE!Gd2C2r4_4?u6)+Cs2*Os8N{v&=Vv-?jg_s@c&SN41`m}1cU>? z`NIhK+XHZdWEOC7vObRP(eZtO>;QH%0CoWT4g4|`P8;!;m49HCD}f*U|H&Tazav31 z(m?nG<@mJG{fX6M=G8k{6qD5ElPmY9DPo74{&J#>W z^dx6PDwFH;^l?jE2hJzNqXzOU&ROk^4*kl+SEmpCPAlC_HUVr| zW>Gm@k-||%xfN@+5J;#O4}!+whx-rACSkb$4lx&UFh8DnY=ePczY`I9aDAQ*Z@TdN z;6Gp=^&r$r1qwh{T=#@+lz#?1GxjawX0zd>bb-o(C4NIjMK*l9fRlr5d-)Sz2X3| ze<@=SyU|g*>Fv9zE}icF_IU~Y2I9J5^23FE2XUbnKtD>vC2xHC3Mhy^6R8W_Azu+V z!Ce9R7h<3bz<t{enb)I`+ zFwI4fD?If?VS37-NKQkfq4BT`7?GfD7y-suhL`~rjA&$kaz!wLApMUyrOCGwvYD*8UaO_k>0xc? zX!s61S+}|78%{2Nmm66~6m@jd-$Ieh0VI)!hY_;DOpLz7T4R^`tP|$+D(T;E#5-t) z2EWlzHlndpe*RIg9I=lPRkbeggiH56rAEGg)a7A$c$5tDqi`s{fC;XXf+~kh$Jq9J zDNh+_aFcjYZWUaYNR&CLlslM&tkI#@qlJ~o;9O66Wh`g+1r`12$ zQF5tE@H$kR=Ba{iMsKO_-^b&=N>3c-(E>rIQFs+q$qH0blhmW5nnr19G?*5=ohYrD z_6o`MW&7A+Fi+iQ3+-`tdwb})<+LCY;=u#HjV)JPU#v(IyTAWwhV`zYJd17d#!TLa zM!Ei@ld(l_jC4iN39An5zXYps)CI>A>A^@3_o5ldOn_^yc+s~VKLF4H=)ZsV2H%MS zp;rXLC|hT06Kc^b_XeLZ`@#Hw)I0dW5Q_lN(_(;V|74}Xwbi|SjOOP0KBAofp9G|W zcF1j!p9nfT7^fiM}&o_2k#TE>93oosMBp#MUs0&k~Z1i1q|&(Is3hTI5*UUv+i1>$m;)(e$5K-lNLZLj0}i2i4D3<4p%F!iw9l2O1|EKkQ46j2L3mK zRX8X8;z%=KC5Cx03}hyOw0iSkJHf&~ZUo&6dtnxL!5qPF18nqe|Jrs3?7#fA?ap7@ z_Wrf4ANoJG)#5FdoX0=tiPA;iJft)T3xlo;a#L!!R+NJalTX+Vf!0c zt8ZEkp{AFo;LeODLq3WU<=)gM4_I{^#$8T8HVv#mZdHs3Lor^WN@eCTO6j^`Bx>Qs z5E^qF#l$0BaO*Mhcjg!tSTHhi)*v+4S4saJC_N~B5Qjb_jv*S2-0L1_&MgHsQ5~be zPy?ukU|nDuGSdLO44;q3-2gs6+~25_2mageWMPR2<@T@MK4ul7e_|bgg`V>LO-N*+ zR}O*>vL7ykR+y(-2SgPlf6d z25!%$aBWcvN}Q3(z)eV?i(4&g2P-;H>u_J}ApLVps;4P6jQzb%SF^+Y7})6^27Lim z!*|Fb*mQ7i=arUGM6$TTXht%5^M1p*z}OJ>|xreIY;{V^aFQ(TH0wlV%Ua{lhebIdjd19 z#e#PNSw$S^!OOn|s!p z%jXg1`e#OB2Eu(f|MMQn!254^{1Qr85NW;N?v2kRhyI2wAogvqS- z>0~q0@ik8V_|5N~NK)M1?!a`r?u)nbySj_n!Ah*tEglJBPtlE-zD+T|k6&#hWoe=^ zKZUVO1UxxaH0F|A9lUEZ7KN$Qr{G9(JXhpbN=7hq9EEB>9rgO>n~1)j{&+E9sDS8n zusbFH%oLQt%tWL8a>*x&@8Y5LRK&!ER|P0q8IVA=G!ds2r&Z6Cr8=72xvVJ4hvuoW zH=Mba!OB##M@=X6yBWpfpF-P#qL-c7dESy|Y*M29d7=OV@{%aDR zFM$!Y_*9bC5k8spR75UAE<+wTi8P6H-b}<{I+CrK1+EyA@)z5TkU2EPp zIUj%JIRBM1$EnEa8IGwHWqu-M&YM(>L&g6Fmqe0eoCGk2G9G1yjz%@72E&q)GhDTx zom5n45Yr#QGj^bqTG293F1BcPv$Dc^W7f~Ha_|~|#i67Hi-3us$^i_54GuDEz{%Yg z{L-coG8UywY|fuCQZ{MwusvLQqDoz^(OI_xlS4e$xg%Op+bm1dNJkc~qM`0;u@COF zGFauc-Mx#|G!~&NnK4?e5G)vt&@wU3t*9{0X~B}L53TOd7IGibDnxf8Rsq7jgT13p z0l0&^4>4P)Hb4a8TUuDIMO(?4bqmgyl+8$X>E<)&xQ!6|`xj6>hJf|--N5}2nJm|Z zo{)g0C$o3#HS9~jU}~|!I(O+XJ97rBHqV>nh7=_)=<`% zB>b9!nvBtcrh`r@kJxS5zS+fQLoaU>6pqk_j%dN2bZJ`2Bvv&|V--+iiU$goZ(|hI z?LXb2S^fRjBFOly1*{pORR-p#U=RHFQRh?t>VJ>Cj4NPhp+;ItO=Q5h0xCS>rb`IlIxmE+qqtB<`hmuQ^OOq}{ z<*6^uFR4k%XE4NSeEX~-j&@hEjWSDM2C0o2(cn2qua>r@$mNLLgN1n|nA(FvG(|L( zE?gACDro1}LkjHR!m1WMQa62cOCO+rFfO8_IlXB8iPI`uKeSS+rlu`3q}PTT zO?$X7Et%ek@lLO~ai%a`nO(-=kFbjRBUObY_ik}=2g;SuoWimgj~e|wt=5HA_r5s2 zv53Tz>^N_{9$GCfB`&2NR9s42szlz~$?v`@f@gE_4s=U>wRvinEMfd?49m)yXTM`k zF6s7>N#Pn8JId7`?n^cH-l_QSuhB8L9q=w~Tui90n3&wa>02?^yFM(Jd<$A8SteOB zYq5YE&d|&Z^9$2_?2N4ip7~InMuFKX-n-hlT5k6)5{0B1JV2VM^ylzMHlM8l>^58o zMkE=3lt9$qk69S80Z^3fj5CbKsq{g&?5piEkD9K966zksfCbGp#%gDg=9yN;n07?{ z8Xi{I+F~m>0^R!65;-DSoKPIzVuX^C9ATX7;bw*2?^WYco!MaIn?!qJR|V|m25XEd z>(>y}V1$*tsv!NcsMlHIf=Vq3n{52(shaC+Od(Z~r8&3|Ne;a)f)f1Qm8xYbihw(rz^oziS%AehXnlYO(lP+w?kSCm_L-k}Rof=}|-_?R{IeYF# z^ZKe_zzaLF@8#b~_5dEYrAG-ec~Rb)psb*{D`V`|u5$3D= zP-{7Xp8eO%`rBYH3V`CZo>P)#TxvY9nav5@&lGzBQTn86~rFQA* zm7Zn!U@GwpVOP|T zU0s=|oqY!OID1g;bA2#L>*_dWBCtknNUs0*qmtN&?A95`7E-e6DjO*mQI>EASNx1N zQWaqfswj{yq=eR0Myap3*^Io^(K^v#=72z!FvZ%b3{+`@C!q};Qb(#E&;L7{^Z1h% zN_j9%R2gB&*9;IWd@Gg2sPyw1H<2x7PAp{qN1yMYdiG4=qO-x5Vmqn zBD4^nf3$p*6Lu@iloLdUKt-g=D7^&a>nO7XW)ZPEsJrvZ8oB6oMcDTX`nr)gU~j-g zL@pfcz(qu=OmD$N`YQf;yzn`OiNI9E?~bqw5pJ$3YJ4fszso@H#>twMLru^`(`81f zf;Qz=8npS*otJje9bDOuiNcbk5m-P9qa18IN2P{3B~eT2RJ-DJtNnKg zx0|0KHa5y9jtu~J8anHiCvCK+@Bf({{CTtf!udBV_)mlX+Z>Fo9O-ob>HkR%HrCgU zOv;l>(NIoJOgAbsE-=X{h)+sQ$&OA)wJKB6NX$3OHMH&@Hb6;EN>Bq;P)vKf!XfdBx8_y7RZUsX}Rr8~dlb1s zt>Opk1J-i2CdWk3b`2X3M@F}u)BOqwCN^eGF?cQ z_$+2Rm<~<4>73rhvMjb9(T z$Bv`6wv_oV8KIQY42nr3=J|#NEtNx;c+(Efs>w^PW4f0b@(g2lk?qKLhM(`VB=u&J zAIv14N??;_SQ>rLDm25@K}V$F5t&(mc!l1*R}~~5kXOVDF?;!meh|~ZuC@D7&sJ?( zdqx|V1h8O^*LK3pu7&hBMpf>9eM0p}oCG7@WT#sFLDzI_#GPHZdd!bDL${D%p8|r> zl~mxEB?~G;-Mdlbwp>mLt5IAs33(WekmH}GRp({+JI(AdPncvBr8YMKpj8aoM#!G% z$a?++`56!}q`kK*BD?~B3_u$C$@)1NM*JC9sDYJfbEHja9t9%~q^mTz)lCgYv5`-N z7o?0O`zPcUDzYVR!Hj$v*0}$K{ra&7AS)WCya#=st1PGp74(%vs+jxwosOOSq>=oT z8ilB+o;(1y9GtEkY%`~> zJeaH$9Ol9l=`v8%_y!#pPTfTC1xi$MuYoSi)j#?=U+g%$Cm>J5dAL-Iyj}I&Ak`!l zq54DJK5MuyA#2J&`b3yz(zi>Vdy0XOcqI!qvM%Px37sMD9M0P!v1bDPLlmGWE@ z@2maC`TOx`r)r{YEmY=xQ>HNSQs_8l&T{69p*-&nK70NCj{&`N1|}i`bxDN6^(lHt z1nU*34R$OsAK)DJXSukN7|PjpA*ClnQ)Y2z8-3f(Rt9&?LVmA20qyS z=P7b!)_8Bo006Ww{d-n9nK@e<*yx*E(OTFUn-+IK$sw!1)8VKJ2aS*d3vM6+F%$yJ z_Z}#NW9k7`!Gd5pM@UUj;=%~48-f;p6B7_?f(F$=#%m*nA*QHe3cJ7wqTzrM&Q<@= zXxM!6wcRW}t9VzbFh6%~e0;Dq{eCXsW4>B=2W?`k>?~xc=qPnQ-|~bfW2^h! z>#Oq{2NydxEz9FRg$i-1>-%_M_%&E|Cbf23^4eI+zoeDR~lU-uAwzHg{rV`$*cio0~c~8NX#G0-bt%w)` ze1h+_BVRpWF2~=hM&C?z->B&5&DH~)Ki#nxdbwoU% z#o-x?r;+AwIzjYsLc4fU@+db6JEvoM9jbX94lLv(&v8VfFI@2Max^r+3WJqGcJit< zX%2rf3m5VPQS%vXdwmGnC7c;de&%^R%yX0jldvs-u^dXAoLYfNW|r_R5Bq>mbCIes?6&wI=qkxT zWL50JUvU(f6zAMC)L%DsREkX{CP#9;PpoBWB|mT1TDKp6|5-0O)LA@QMVC3srs>uV zzkLxaJ~iQxm7GT?_=+vGytnkzg=ao1^5rVu4pqe`)Dpc8+VoiWj!?T9>{e$1JDXAl zt9Un+^aE7?>ONf-cf`+UhYnjiV6We9OCtDLPJ1K<*Gw<9^Jjj4vf|ChFx1j;GPcIs z=T+d9=i;WZO3FXN=)8y6G2lnmJLGu=U?sMCQ+S(z2MA8QHFLC;R!NZX;?bjj&TP%W2Q`*CEMFJ&5u$ z=RyoSvLP4?sea+@aJZ=`GBgffX+&n*r84C%^?F%H`ipIDxvp3k0)QkU@PPA>6gEj} zb4PFV`i|GeGQl{>c6&`URs;Efg2O8oQi7pF$PP3XV~D#J|Pwb5B*Zv>ivW=bTl?U`|U+9Ju6!KBHa;hc{sa};x0-Mwd z6=BfJoQAZ%?0iqb)C8)ro++O-puJeT5(go3bxkq#jv6tkhXO;#ii)c5s8J3+9pzVp zlb4I7!sU!e3^W~`;NoJbeP`>h_Sj+0%yrE*Q{Vzsjk!Z8hTo?^x1}y^(q;S z1J9q+CrtZiZ}$YRr{>o)2U|IUznxver)8UJ5{y&3ncU3NE50e8Ys_NJrOiKo6X>|&X!LlIiNEUjhRqL_`aQCv)DKVH4A z;?TLiQ(=_py)rerdjR<0VLOQx7L)an9h0Q!l41g)grNDbx}K#!qE z;{^6aej6`KpD{~h9A4s8Bn1)^d}Vmz5d_rQ8s5K)qRE`tfROG2Z|^#kVy6Jw^Iyh>yKK?r#^Sn{Lq%m;465eBTk(}D~F{94LZG`)T{pilJ`Uz%!c0vw^ zaAAe!SwvY^@%703Spy;46e%VDZG*f&ETW=zIIY^S$SwnLt(sS)kx5-D>qYf)J_clz zNLR+)*eKa4kCc!8;q*`kJZNe%T^nMXQOxuW0@iImk9Wxx1k<`W`hKtNb#h7Nkj1RD zv{5Vr73`HdMv%e|4&KXc?^lJ@!$g#`I6V`O(DDpd>Z}#S-oIO{N2uv8P{UKfAKcJB zeDsFj&5J%H>MSe<^N31533!u1%2A9voL zun|>QMX9TTUw#;~hgLG6&eXLn18X5=Eyp`SaN^=y6hMKG|1%g(z*P(t4WFy^D60=M z8Gf9hJ1nf;qw%B{dp|6Ecqz=P$uCU5h?#~C)CXHmXYEJkO91n1&LG-}S3bsNgw*l4 z{xLq+Lzff|@8LjdNL%v6VSJoQ&2vE7{HdZYUy1&8kEfbSw~tpHy}U8Fl#B+WJS@A4 z^W?3bs_B~hWV4Yf1W+ION^b1YHs!-i$+SO8K`qlgbi&9dnF(w)5%NNgpw9tlDCbf7 z5j-zL2|X$4j^W#797KGeqGvYs%j`GjrCu#hz@1|`rm#&R&w%={)(5XnZ-KQwWx{N@ z#PN0JarkMZLeF?-bYxQB(&1f|*aY3pWy*Rf<|$3T2WwIlGn2h|w6L(SZowQmA^}7q z9R(Ed3F~t{Ff+%PPS)U4A2lOwg<8wkMtsT;Ut(9uHHp|)62akNt7wR$@4-u8oEvUb zYjXGlCXf zgX@bMBDID{g?qCGU4J{xS@`h(9^KOIoI8a)m#(f!q)9r&pJe7(G`Y6G(%*W%BmX=h zcdB)?8Xqt0PB(s!gl5!=@BwBb6DQJ%VXP)*K77cJ{M~9gT%heMsh&_@E~A{brv)7EXTc@sfynR zokTBFF>71r)28dcMh%BLXIsyb;lkWBc2<-jct6h#FDQQ=G_P@aY4sFlyb~;+Kq~!t z#&P$mnb!sEOrg;07i~W0YpBRz0FCgVlxM^yUNF*2_i5NJ(=LF`3imp!;@Lj&sbj+v zKlAX#<#eqRB=z{{xrd=6Z;@As>gKrSlO|87HWSPHodPHi1U<{0@s!TqGE0ktyaAu?PxylnVP58nwC)da z8O56hg9-*`&|0VvT7d*WIiAxetGLh(<|AA+2uK&G_J@yqE)E3vqHc83N8}Hva~LC+ ztP?v{Ni1B2Llt0CPg$K7ZY0OJ=lia{M%mTJ1cXx|^sVJ#ovwt+_lEK>JL#|y&2Pc* z*r%G%!A(cs?S%&c*6etsV~fuw(K*I<;KbQtVo!3u z3Gw2qz}ORNd&CmR&?ry!CO0R>FY@$L_HZ#_>sI%hdC|C;o+_DJ@KScIJ0!4*(Kht^r$Txg ziJt@~W1$Ri@S9aM_ZZpmY>2;t{FF4g;(j_ICrPcxDCl<>csfShP}F)o*IP$VKE=zkyQ!E=@TaxK%s+&#!pepT_qxOBgw5L;aO zm;vgNCPsIS{nL%i^U7k1wK3>>`27xzsOOFfeX|7gNBU&P`pxg zO!+jJ%|mmv;v|t1!g8HFq#3Qo`BjBY^f6GA-c{6A79@FsIc~%lJb4= z-FQ`EWup5x`fx;XzumEyM6{}cztqkxRwBs$DjdxP5N8JG=#o;N;K>G@7i>ZoBDht* zRAL9eus!Gp+Rq2OQ;;HQyps#@RTV4PRR1boJkF3J66cGcLXz$k*c6djc?sL`wM`W- zl~sdt?^~mjRe9(ZPC@QfM$+%I@oze#Bfh?Uy^ezgqLNv{TSSMP!czW6a11kO(t}Y5 zhj_`@z=bq~;!*-FI(Z=vtP7GdCrr?gMuFAZvn6140B} zK#2}Nz8t4|)xt(k1& zmbnfek*}+P4?Ua7_n_`4w25o6=2ufiVp4byePn7AXq()bQB7Qnb1{Ckxa5?7n3~GQ z&(7SI@}TWoW5LC!9J1JRxF0b+Ljvi?S|$hRNbyJ=nMU`04LLAoBRAPLNjN1kbsjrc zeMuB-D$S4Pse-%2Br?bY*}MwIESvqk01f?$kM{hW-&5UFJ)n|DeRkd~_2%R~5L1t8 zhtFP!j7sNBY0CE*-i=W3diOAz1o)Q(~2Rx zkmR^R0~_PbgahVd3$Jv2^ZV8g?W_NkiCHqjtlkkkup#Iu6}MJ{K`D{%X&iwFnJ?2n z-TQLof#bjtV`h_h+0y58UCm|~59o$;%}2@N;pJenWs*hobCPh@Fk#o!Si zwFO8+TNu5iG~;dpM>#}~VNrOoq|5nHGr2@_L8s|r-`Bcy&#SsnT(Xg6kWzF? z4v#6uuhH8YlQ#*L2fNW4-g&Z#E5fLS>1MCQPp zwJpE9gE3MP-R^Hhf~BX)tTyD_ z$T^FC!4tRXk_*oC0L05b)k1v-7x4@mkXa6}v~1LExA zZs7*)06(WfRhihYD|%yO6dheywI8VwWUFwJ&Dx}j*INae1P%G+@RDmT=%SU`6EwXW zEaP#?Lcj@W&z`j#VxN)xs0z&f15iDn>bDBy^bH$Czo2I#d;1lCl&xwIB92qRKyIos zweK3M#woUB@F|+1EIiDev3|B5nS9#Yc_w;~xAmsglDk zB!#Mf2TlooBeTBbSJ5L>>v+{4f$e7T>B@}{)5wj7#es;lh^ z>!296Xb%PtYon3T^ABR3u>4I&D2FwCI2XVF;-C;b=Kwt@n z_3?`eFSM@DVPwL(DZD=CL;-hoEB9AKO_nW02~D;{R|V%Z5ZrI*V81k7PPR299Y5Bv z+&-HR;}!P99BcYEa@AYWv$b6)FX#-x105=fCNcI8mGF6E5bcM|cn#DWI!*niqVqF7 zi5@LD8NfJr1Ou_cK2{Idt4Z$ryDl4r95MCEfza!s7*cQIq_MmstFVR(AUU#iWBEFh zuSwGL#bW`El{BK;)>4V2JxUJe2jxaV^9effet{&>)#~sNrIbtZrSUqs91{5PPE=!q zf|O&{O})+&Y!!tnYAb91q_l%iKjDoh@u6;H1PV=`#DN2jl-TD zm)E_oFU1kBnQ}B5m?{|AL5B3x1NYr*r|(XDRTj67u@?Ih)6~Kir{I8$5gClq+fc3c zJ+Hc5&DD_6U0=8~@ps7>Ln^fXs(G~5uwsq~e9f8(-ZW(e#Ckyedut2yL3D&CQGFlp>_vL=Gfe5(Z5H^(Q5>~-dhU})v zXtH)cA+~>;V@xYd%()5q`17=*x1s@)6`=So9gkpzE~9j*7^j?{rHWJ$3I&#Xz|^R! z9%3VjVv7;n8DD)AY>24!MSdSa->)ajK7F!QpbF@kRzAJMv3mu$p%=3zw`o(AiY3J1 zqp>(=2D%F()5Hu`l|hye))+Yr9TXkPeXW#lfW+B9*91-vd>r1QuVfF4!X&IUnk$YW zRnaPIbG-rU7{t$KeB+%71)*IXJ50hr9nXppsoqw_r{C5J_gTYC`~>U4tmpjs)pA+( zAR#%(%>LboX3KyOa@r>VV7V8qi@DCnzxUP=Y|v%z$l8-)=BF(iB(=%fpRZFZvMsK1 zw0zWV^nFvjiMtfr%B9=o;{MDgR18;hFs84pYIc>04--IRX2%N&g;|zC5QIah% z7r>|Qy}ANfe%`Kw>0;+|Ny?*eqbGP1Pikx+Y7TfEnc!2BQ-WLC>Wjy@wGGcBrl{oJ z9}I2sBgpy36ZKDpp-`!S6}3~e$2JfrMZiyx4@Q^9TLpq9_F+ln5$IJyz%#Nzn-{X- zi7gB$+_m08H)!1E^3(yftv}rpQ`3__i1{49crlx;3!P78BqrGx&$@quq2!sCST+f> zhx{)>d!nL!ma#8fKLpZ^$f)gE4Ulc<8%KZOgE7`*AefE42CTdKV^sg1lb$e^K1WH* zZ!64Nnife8M_Z@2N??+sD5saIyWZY(OK#9%WQi88PS%kM8k38lnu#Cf>Re7dvBuQO zu4wD7%zlbZ$ps@i-)-HnpV$S~)%I66^|_@6G3E%r!nf7^g=TvPQGOLCRYV<^YCb@x znNJ52T35$8-L7uvb~z43jvxypJ~yyp?rZ6=py0Bxb~V&4t;lQ&X)>wOagCmbocKC-M7>r7%M61_fO5Rz6csZKOKH{u4g#I*dz*WLRCuxDU zE49lF?}(&%2L%&afv0ApCK(vA0t67Qe`RM-BrSYcMJF*^X$*352mM_-pVm(xNc$|Y zFhf+imcf8&P$$lJA_(NM0dwJVxNT z$(+(d3q!GBF`8#O-L?aT*`G?k*#;+;Z{uc{hc~xbz%tF7BO5d0pp-a@ZAU#tQlUP4 zkA2H3Fopl5Vnv;5D^ii)$L{#|WJT0mRQi!@)%F}pgY$LqS=8JH?{BgzTe=HAOqccO z8uZS1doLF8@h;5$V5;r5SLjs04lp|2?o)Ln)+twAKFhYuE#uHW`|3N#PtCy)5WWg0 z%*C$9o78nXa-)IF&r07%D{c^j=>xu;H^wiBlu`Ol7wJx+C$Ucv{e{$Dchjv> zzQjw&nO*QHZUFL*G7T}X-NFmKD}&*uB1A2JbQPq zP~0|bSFq#bj*EGNky-&Q)6sF_$=t@Ci>LWSPcyccj9KW@jb-AR@hdNt+8CV3B7SUcj20q2Iat3>Mkh<&3ESVACIesd>-=f1M#Z;-+p@GE<%|OQJ5*4h2di(Qcl1M{j{#4og&5H~-Mn-SoeW@Ohbe(5sm#Mi;(+s+v#EdGH-U-0KgLrh)_4F?522-b-cft52( zpFb7@5@-jAvIpdP5$KKjw!DMWHU3;&IegIsAXKK~)2-35w9z~1_|Dw6|xVIz5G!GXK_eB2UY#IX7X3_iO&{zd&oj|AHH~L zS}^}?K*v&>nnfp-B8J&Ury*m`NOiR~M}5#aE|Ax?g_&|LZEFa=QfOz2;srv;)(r#Z zG^72J+_j_B1XMvZgSlH#^wa$A??C?Rx!}ozTRzpE`*Q0E$7WQ_( z_ljk>bY^$p*DwJ6Ckr2i-1iCLP#OV8zmKQ1|6TtEpF@bE zNBsJ3Lff|-dvP+`&MT@3W?jSdDqTf- zCrXvxBqD+cNEhk7OA$f~5I{g7fOG-rT_hp&-g_^RB1-QNIw7E;ZvTDOKFfcf^{;hi zE@sWe_pEQ`YA)t^MOXILCHexQ*MEFn3C!NETL(nx*EJZPIYgL{nzC!Yw}F45BYQa< z`wTY$E;X7%yAYq51PdK*<#dsv^0M=+#_voX^v9J=Kty0#DV|*k#+{RWH|*N3Urf-^ z4BC|7l=@W6_(GgYs32p5%B_s1L;6}2)NOJLBjrP8pP^h_&h;tLjG{UcwW*MEdB0Gh zsL#5NOYZAooFV<55Xk4vv4?aT;S6SYlw<7{nd*QpAoY~-Ae>n@qgt^QU?X;yn3z6j z9DBn5z&aaaFE18yEC{Lv!NrV??!xHRkg_MbJzYwK*tT#XL zd9A1TWzu#;XI1VBWU2(Iby&U4d)K0(^k$5~d%kkQ_Gbe@V@+I_TuLWxY1T}dxG9A6ADW{{; zErs;g>RKw^j9c{^X;dyOZj8x43WD)_Ib@`@!&N=Emquxv0fA59{XAF{F`L{9zU_-0 z-k}G-2+tZb?)Kgb>e%9`miV6cp;S6t$Zp97HC|zXz~DLRGnsMehx_FwE;*a10M(OM zsSa&g<=$%?$W{*Q`)f0deZNKwDH3HeNW6ZN4#grx&KTHmWCYSwHFbjQMph1VsfJYU zd>Q567U=R(h$kVDeEP`*N0Tw$|-t%%&Gu9N+iqIOmu4spL4&4*jp=6Ou1y6TD}SdkfPo|dVQCP z-vvzwl{A-{mYtIps4O59JS6$G@oyezW98Pk&uk49=dE=sV-8okD&VzxtdwFU*^sgnby;} z@zMG8Uli=Bb~g-B$HKa61IwdMRr&pt2F{CvY>gLe>9fj*E_8@bt>QY$T0I`(%ps3&0L9OqsVxn4y-eZvdpV<${xI*AKW%F zx|iTADTUlm3Ag#8Q?ILNsSY$#ZhD%c6-lVkC|TGX{!KLeBljM``K6I>2no?oM@vYk z#PPoAxG^(Awaz!UI9pDesquA|oQZr-P4fV8I#PFZx)IrS>st+evAXJ6g)^NlL0*1r zS)kGg6WX9sOlhaveszY1qC^C@QN4D>rAC$sCxI&52ppt@58fZFQ z3TdT(y|u$F0ju}4JYokGdv-~~<<9>HonnkuLP z7}(C7>#3`ldLOb1-C9KRJw8!54LZ^QYZva6nQJW*vs+G^D!}$z>Tp(bq3utQX-7CBFS#-O+ODQI6@&qB4h`|;bj3V z@J$<=M3LN%lJwFNL9zhg11=t9mn^cpZG?W+dWEvdN4dxf(}$(9kDHleb%JS z%g?mV(<+CR;z|sYORPgOU!`BS^>NkB!oRf+!8d!rApxHqRxW}mKf2C31$Vu^%&+rF zidZwZ8hby%>#I_*tNxRb*IpK3QZQ*LYsg`Y-mZvZ+!QaVCi2_D46duYu74OOK*Yn=-);-(!IxdivUZ72o>mA>Cj zt)cH2i4z)O1q((+^?r$Gxy)T^7U#{-vJQa6W;QW0S26NUC;rs(8v+T+B6_NE!!~_Z zx1dp+trY0TJOPZei}SIWb^{hb88)QN1)Z#`373P#k|uRcP{2Yf1fRW4tmm?IfnZ>4HGnc^uw2)8V~1-2VDE@gSD2Q-X7{7`^zmTimDe zPkKJ8BVlxzf=cl5i{O@NFS2E}n%mfstTbp=pNp3sf0Irpw#Q93@pT&MV;`|aA`%f! zIb3{6p63$CuGJP=(PxI8cuX?C+n$!ecV1*h_})u++X zhW6NLc^IrR2PnzlUAByEBx7htQ{?hs@xVp|6B!L z&)ctCF#vUKk1GfK-#6Cq`|h&o*9q5ZWUW3X|D<~Q)4!7y!+x}weuOcGjg6Xtu*8GGR<7ieay;%J^SBtI}s%VHJ=BNxc zVZ0bd)tj*l#}f^)7((WMe^|7cbofMM4Ytl{sx+O$Gr47+Om6m~{d{;EC;0QpM8ttT z5uarOVytS4ikomFr(ynZkF}eh^ujwI*>;PV6AuLQdg1fjJ`E z-R+RH+j<$J@-mfz!D*Mspsj^bVs_W~e4A}XrSE{Q3>60hh{5}Yj>@i6rn6-ZVLX8I zmL&&iKYfeu08w`Cjzz9Um1S<8h7vhupqC~tIDd64p zLmY7qf?;oIiT6uk>>R6lH`aUkrAa+HDolemo*XWk32o$i+NwX6E{#LT+=x7U*ZZu@ z8c4hDoGtj&y0{~qL$Bn7E5U&#bV}-FyKgc*hmr6*TcZ?4u8g&{+<^>1Z7r@(B7UtM zk{{)D*F2||qqYUw3CV|kw6MV+&=hG8t@jp)pwgmUbcb*QsWxfx2&$*ehz|x>eB;c` zXQ`5JTKzFu7D_St3=e>B_Id$C+xG}Z%=kjl>n369gMER$M9Vl1=@c3K+W8RdbwYC3 z%kErg?IICadwIz6y(ib;k1PL%n#?@ft@wD2B+LXfSlQ8?_)}G1wbqG)e))MLt&@I< zDh)lWK2WFxT_&4E>7LWa_U6t$*-23QHzzVXpH0(gfy@iYj$I?FHnq2J=kwhh^SdZ2 zK4R~W()#qGVF!$azSD(ZCK>twCKilZD3o>P6L0q$cq?b1nP)k%sTgWDA!ocD4U>q&zJ>USEbl8%t@XKv2@sPBe7 z)hJ-rV{(P^PAd&BIL9L{UE`@_oFLi_4 zY8Da{PRLuNPRux#-@}f6Ri++DEG`g0?NHxYA3y5>6{TJM$unfckB5^f+aa9tWJ z@b+Sj&B|r0bn7K5$Ioe>O-5NIl?K5gJ5$279I0kF)qdxGGXHZyS}EnRRXN)CUoZZcKdPJD z_<3nc4$2a!Rg10zTFHcD-%K?$+?x^S-GDwKt4?CUlu5S<%oDDoMSr~J#0EJrfAKVk zTBG~yTGCx@g0gl%=Fw-w+D!FFrtlZ~bes`d%7-l3zyHB17q%H~f(4BB_)*7x{!y+V zvDT!uiU%l!>BOyMFgx5|o~Z;4w4J#f*x^|6XZ1VV~263sqL^kF!ePQYxPt1S+d7uq|$5nLA9VRwVI&MMY_I5z~Yiq1C z&zG3`i(o6s{VOl($mBo(>-ikq3Y1x2X4>nA)QZa~jUC-;@WK(+Gqq3b>N4L!o7}qHZt&{oVGl==n6__QVlUcIcA1lc* z1Yyg`{`zPH!2}-r?g4fG>gq3nlSnZsx2M2^y}O*imiB|(M6bKi#`;cUGgFbKk8`rmno?NgG{_BLL?=mF4c7@* z32UH%GBStRZE&5?R{qv2BN{jUlPPFwy=qa3{a7f?`S}WTgqkG_|3&I`VJpvp&{dsq zoNV$O-SyWkVSu_f|68{n3iR+j=r}%kkA*`0);j?UyzR4*{e4plV1*Z6=P|zCXwQ_8 zH#n<@m$o3Zo>L{8xcI=!DJRsWskpS^{k}&Hk4eD&2|usi-UTQP$u;f@>Q(7?M};y0 zx+85}8)KtWT zw)RjK3Aa}stZ9qu-f#CX<5CvH&ci)pe=!yCG%aScu?aSPJ2!dR=8s|DDuxgCtB9$? z{S!Mk6cQPmTcD*JXO@& zs(j<`M4hg)s~7x``XXaJg>pn_HEJE`CfJzJ!6h%64%a)d(P45IE_@eb11Ya>?rTWR z1puy=yH9U~iH(oX+Htkjaq({B|5MoLU$)i%jJlA&)<2_1^JdH35ot{nCSP+!o|UHe)-q#U#jU-CIA2c