From cc4f4c253c1e6a7839665cc940ed04649ad3dba0 Mon Sep 17 00:00:00 2001 From: superlishunqin <852326703@qq.com> Date: Thu, 29 Aug 2024 02:06:09 +0800 Subject: [PATCH] 1-version upload system --- .DS_Store | Bin 0 -> 8196 bytes .env | 22 +- .idea/.name | 1 + .idea/AWS-sure.iml | 2 +- .idea/misc.xml | 2 +- __pycache__/app_function.cpython-311.pyc | Bin 0 -> 47454 bytes app.py | 247 +----- app.txt | 223 ----- app_function.py | 781 ++++++++++++++++++ ccc.py | 69 ++ database.py | 280 +++++++ edit_admin_info.py | 46 ++ .../0f9028b75157442ffeb13d3d89859e37 | Bin 0 -> 67 bytes .../121e2e6237f93addcf2c8d3d0f754de5 | Bin 0 -> 67 bytes .../1bcc7dc1ae94d369f266fc6c335f304f | Bin 0 -> 72 bytes .../1dd18bd3439eb0ac9a5742e2231f6172 | Bin 0 -> 67 bytes .../2029240f6d1128be89ddc32729463129 | Bin 0 -> 9 bytes .../230a5611f6ae17aede03b96deb47fff3 | Bin 0 -> 67 bytes .../32dcb849af4ca45626677d9fb3bd4768 | Bin 0 -> 198 bytes .../3378eb0eec6e11aefe392c5e676e8238 | Bin 0 -> 68 bytes .../35f86e813ab1fdd9f718aef70f2447b1 | Bin 0 -> 115 bytes .../37ddbf9efe72bdf64d50c9a4ca92bc2e | Bin 0 -> 68 bytes .../3ba267ea541c85852c864ec0a198c77b | Bin 0 -> 68 bytes .../3d315f20ae346ffe9e4a7b40ce7fef37 | Bin 0 -> 68 bytes .../3eafc0e8b084dcd91b81fbed0438bade | Bin 0 -> 67 bytes .../4661f790eca664fbdf71fa25c7c45a1e | Bin 0 -> 548 bytes .../4c88942d540c4b0697beb6fc71d0e515 | Bin 0 -> 67 bytes .../4feab7ace0e99d4bd4371560894aaa18 | Bin 0 -> 48 bytes .../543c69174ee1c6787e710d1656d1672a | Bin 0 -> 67 bytes .../5ef0a832f26e148c61d14e95f03b6a33 | Bin 0 -> 67 bytes .../66d1db5c2c79975bb6a80d14fa67dbfe | Bin 0 -> 67 bytes .../6c904875ff094c84e40eb4cb5ba58586 | Bin 0 -> 548 bytes .../6cafcac3319918665aaf1772f04b8432 | Bin 0 -> 67 bytes .../6f977085e9c72d687e7a132ccfbf6f88 | Bin 0 -> 67 bytes .../6fecf9b935f7299d56f4a6324bc1b56c | Bin 0 -> 28 bytes .../70195a82b9eb0295dc9eb356241021e7 | Bin 0 -> 67 bytes .../777d3de3359fadd58752eff37b828bd3 | Bin 0 -> 67 bytes .../7e37cff998297dd71a9e4b115e258f12 | Bin 0 -> 67 bytes .../870fe179fe41bf8bd2828724b80ca924 | Bin 0 -> 67 bytes .../8f3bbee347151cfa1f698678c74250be | Bin 0 -> 67 bytes .../90f85e48b946465ec01b5b9f7883ebc9 | Bin 0 -> 68 bytes .../95231a9ec2e3d104ce75bd0dd780d736 | Bin 0 -> 67 bytes .../95bb16dcb3c2e0f7a547ef0127e36165 | Bin 0 -> 72 bytes .../9b87431787e796d1ee5b357cca183fff | Bin 0 -> 120 bytes .../a7a737b402857b6db6a1d193fa8e823d | Bin 0 -> 189 bytes .../b8202bf4ccda274d60e685c1d1f84ad2 | Bin 0 -> 548 bytes .../be31830b82505a6516b3904fdc7aeddf | Bin 0 -> 91 bytes .../c1026cac75c91141eaf02c773ef7e6a4 | Bin 0 -> 67 bytes .../cbfce63dc9c13b155891bad9f6d33232 | Bin 0 -> 138 bytes .../ceaa5b464cc4cd0d247143a82f99a170 | Bin 0 -> 67 bytes .../cee8af23a1270f20c6b07ab921837c69 | Bin 0 -> 67 bytes .../d1ab18f8f028a3781bf8a8cffc4d4f24 | Bin 0 -> 67 bytes .../dfb04ede4cc875e045b57e7e1d40d602 | Bin 0 -> 67 bytes .../e1f855cdb1992a356fe2d07262ff56a1 | Bin 0 -> 72 bytes .../e58189118050886d22b23b51e8651460 | Bin 0 -> 76 bytes .../e6d467bfcddb3a16f2ad5a28d8bd7d36 | Bin 0 -> 67 bytes .../e7f114dcf7f3868fb06d972494494b13 | Bin 0 -> 67 bytes .../ee13c570a79dffb0127559fd9e0dfca7 | Bin 0 -> 548 bytes .../f93924e17b9f01a5729553789b9857a5 | Bin 0 -> 209 bytes .../fba9a66c8591f2a7d6baee089322217e | Bin 0 -> 67 bytes .../feca8e10607ef23e8d1acfd652b20ac2 | Bin 0 -> 67 bytes generate_presigned_url.py | 31 - generate_secret_key.py | 2 + index.html | 342 -------- index.txt | 342 -------- insert_data_to_database.py | 39 + main.py | 16 - output_files_content.docx | Bin 0 -> 57419 bytes requirements.txt | 12 + scp_to_remote_host.txt | 1 + static/admin.css | 99 +++ static/base.css | 119 +++ static/class_detail.js | 38 + static/dogking.jpg | Bin 0 -> 203385 bytes image.jpg => static/image.jpg | Bin static/index.css | 312 +++++++ static/index.js | 275 ++++++ submissions.csv | 20 - submissions.xlsx | Bin 6394 -> 0 bytes templates/admin_login.html | 33 + templates/admin_panel.html | 160 ++++ templates/class_detail.html | 79 ++ templates/index.html | 86 ++ templates/login.html | 121 +++ templates/reset_password.html | 131 +++ templates/teacher_login.html | 34 + templates/teacher_panel.html | 40 + ~$tput_files_content.docx | Bin 0 -> 162 bytes 88 files changed, 2818 insertions(+), 1187 deletions(-) create mode 100644 .DS_Store create mode 100644 .idea/.name create mode 100644 __pycache__/app_function.cpython-311.pyc delete mode 100644 app.txt create mode 100644 app_function.py create mode 100644 ccc.py create mode 100644 database.py create mode 100644 edit_admin_info.py create mode 100644 flask_session/0f9028b75157442ffeb13d3d89859e37 create mode 100644 flask_session/121e2e6237f93addcf2c8d3d0f754de5 create mode 100644 flask_session/1bcc7dc1ae94d369f266fc6c335f304f create mode 100644 flask_session/1dd18bd3439eb0ac9a5742e2231f6172 create mode 100644 flask_session/2029240f6d1128be89ddc32729463129 create mode 100644 flask_session/230a5611f6ae17aede03b96deb47fff3 create mode 100644 flask_session/32dcb849af4ca45626677d9fb3bd4768 create mode 100644 flask_session/3378eb0eec6e11aefe392c5e676e8238 create mode 100644 flask_session/35f86e813ab1fdd9f718aef70f2447b1 create mode 100644 flask_session/37ddbf9efe72bdf64d50c9a4ca92bc2e create mode 100644 flask_session/3ba267ea541c85852c864ec0a198c77b create mode 100644 flask_session/3d315f20ae346ffe9e4a7b40ce7fef37 create mode 100644 flask_session/3eafc0e8b084dcd91b81fbed0438bade create mode 100644 flask_session/4661f790eca664fbdf71fa25c7c45a1e create mode 100644 flask_session/4c88942d540c4b0697beb6fc71d0e515 create mode 100644 flask_session/4feab7ace0e99d4bd4371560894aaa18 create mode 100644 flask_session/543c69174ee1c6787e710d1656d1672a create mode 100644 flask_session/5ef0a832f26e148c61d14e95f03b6a33 create mode 100644 flask_session/66d1db5c2c79975bb6a80d14fa67dbfe create mode 100644 flask_session/6c904875ff094c84e40eb4cb5ba58586 create mode 100644 flask_session/6cafcac3319918665aaf1772f04b8432 create mode 100644 flask_session/6f977085e9c72d687e7a132ccfbf6f88 create mode 100644 flask_session/6fecf9b935f7299d56f4a6324bc1b56c create mode 100644 flask_session/70195a82b9eb0295dc9eb356241021e7 create mode 100644 flask_session/777d3de3359fadd58752eff37b828bd3 create mode 100644 flask_session/7e37cff998297dd71a9e4b115e258f12 create mode 100644 flask_session/870fe179fe41bf8bd2828724b80ca924 create mode 100644 flask_session/8f3bbee347151cfa1f698678c74250be create mode 100644 flask_session/90f85e48b946465ec01b5b9f7883ebc9 create mode 100644 flask_session/95231a9ec2e3d104ce75bd0dd780d736 create mode 100644 flask_session/95bb16dcb3c2e0f7a547ef0127e36165 create mode 100644 flask_session/9b87431787e796d1ee5b357cca183fff create mode 100644 flask_session/a7a737b402857b6db6a1d193fa8e823d create mode 100644 flask_session/b8202bf4ccda274d60e685c1d1f84ad2 create mode 100644 flask_session/be31830b82505a6516b3904fdc7aeddf create mode 100644 flask_session/c1026cac75c91141eaf02c773ef7e6a4 create mode 100644 flask_session/cbfce63dc9c13b155891bad9f6d33232 create mode 100644 flask_session/ceaa5b464cc4cd0d247143a82f99a170 create mode 100644 flask_session/cee8af23a1270f20c6b07ab921837c69 create mode 100644 flask_session/d1ab18f8f028a3781bf8a8cffc4d4f24 create mode 100644 flask_session/dfb04ede4cc875e045b57e7e1d40d602 create mode 100644 flask_session/e1f855cdb1992a356fe2d07262ff56a1 create mode 100644 flask_session/e58189118050886d22b23b51e8651460 create mode 100644 flask_session/e6d467bfcddb3a16f2ad5a28d8bd7d36 create mode 100644 flask_session/e7f114dcf7f3868fb06d972494494b13 create mode 100644 flask_session/ee13c570a79dffb0127559fd9e0dfca7 create mode 100644 flask_session/f93924e17b9f01a5729553789b9857a5 create mode 100644 flask_session/fba9a66c8591f2a7d6baee089322217e create mode 100644 flask_session/feca8e10607ef23e8d1acfd652b20ac2 delete mode 100644 generate_presigned_url.py create mode 100644 generate_secret_key.py delete mode 100644 index.html delete mode 100644 index.txt create mode 100644 insert_data_to_database.py delete mode 100644 main.py create mode 100644 output_files_content.docx create mode 100644 requirements.txt create mode 100644 scp_to_remote_host.txt create mode 100644 static/admin.css create mode 100644 static/base.css create mode 100644 static/class_detail.js create mode 100644 static/dogking.jpg rename image.jpg => static/image.jpg (100%) create mode 100644 static/index.css create mode 100644 static/index.js delete mode 100644 submissions.csv delete mode 100644 submissions.xlsx create mode 100644 templates/admin_login.html create mode 100644 templates/admin_panel.html create mode 100644 templates/class_detail.html create mode 100644 templates/index.html create mode 100644 templates/login.html create mode 100644 templates/reset_password.html create mode 100644 templates/teacher_login.html create mode 100644 templates/teacher_panel.html create mode 100644 ~$tput_files_content.docx diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..ae5d85d1662f4815c9cc2a2fab02575cdf0b6f00 GIT binary patch literal 8196 zcmeHMzi-n(6n<{g#*u{-iKcX_EWv_|mhQoq>mUkd+DN9lgg~SYsAxt5KsUcGgLzrXS zmU<;Ahe8T-GGy{$NY94MP>j$!*0)1-GDIWFd`JWsgAmdNHC(tvcEf7GaA>oXWtKVBCZMRcG)P#KWnS; zzTxqnq9^1cQlGXEr;liTTn;hv8hyVf**R?VT*nUzh0n&!Y-(;kozA4K^rPw~>sNz% zu;Z8O+Yk7syNtPwqkg?{&uRB-*@fH83+j&7-VP0%RvRi0?>kYx$vVRZL_u zW~P=sGZ#>)72RN7I`Hjt}bB=HuLCWPz&wZxKxF{>ni292 zrcU1CV6a+T&)WsgU2*kl9Ct7H<`TH$+$uX#*s>P4#^Eg#&Ta4#0eIwIXb>YPgmz(?wubxLe}+|DDP2|EC+2_NEcg2uu|LBUPzZ%5Zt~+icuB&$VsT$Edt; xy`hky37Rk+hYZtk$lre$qHjZ$+mxgn3W*Vv>Awij&;QZSAN~9fzl0~S`32JF_=W%g literal 0 HcmV?d00001 diff --git a/.env b/.env index 6b614fa..92796f5 100644 --- a/.env +++ b/.env @@ -1,4 +1,24 @@ +SECRET_KEY=6c9d28c778888d3fc7c459155e6593f8 + +# 邮箱配置 +EMAIL_HOST=mail.sq0715.com +EMAIL_PORT=465 +MAIL_USE_SSL=True +EMAIL_USERNAME=vip@sq0715.com +EMAIL_PASSWORD=Lsq12350501. +EMAIL_FROM_NAME=Qin +EMAIL_FROM=vip@sq0715.com + +# AWS 配置 AWS_ACCESS_KEY_ID=AKIAZQ3DT3KLI6N5LQUM AWS_SECRET_ACCESS_KEY=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 AWS_REGION=ap-northeast-1 -S3_BUCKET_NAME=sure-ae-upload +S3_BUCKET_NAME=qin-test-file-system + +# MySQL 配置 +MYSQL_HOST=8.218.165.242 +MYSQL_USER=sure_001 +MYSQL_PASSWORD=EKKWLMmrGmG7sdPf +MYSQL_DB=sure_001 + + diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..aa15e3e --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +app.py \ No newline at end of file diff --git a/.idea/AWS-sure.iml b/.idea/AWS-sure.iml index 0ed9eec..efb8c9e 100644 --- a/.idea/AWS-sure.iml +++ b/.idea/AWS-sure.iml @@ -4,7 +4,7 @@ - + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index ec6a681..a971a2c 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/__pycache__/app_function.cpython-311.pyc b/__pycache__/app_function.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..03e1fb2e763b7ffd9b6f43c5f3d48a81e4e0a0b1 GIT binary patch literal 47454 zcmeHw33wall^AXe0T2KQk^l*cf<%!Nchu#9ExX=tE!%3hU+K?I*VWgr?R)=V z1~UVIf?~Jb!$a_4j{m|x?|;|-{`db$ZmvZG$F_(6s{g5Rjppz0LOgO3Cm(5a8qFmQ zt)aC;nqh6Xc39V~8`gL0hYj6^VPm&(*wk$rHg}tcscvdGr#nZBX>~)EVQaT_*w$?$ z*ZQH{VSBfooEwH5-A+hj7|QF;gKy(d{;;dtm3UUrT|k}{b{CTGqV6K{?e6x#w`r(& zxTL#;q%}i(yxrbJzS8becuoy17%uBB(?X*IC9l9w_^$YSG~}LLd9QmRq$?QoiHYc( zSG14^{)MA^k?Ofc^?b4FxmESNT=m?hdcFjn=M7ef_0hS3MS;Zu%;lo(R~^dKSDmjI zp>^<|Xk8_p_q3+Fip~ePly(91(**#l=|X@tbP>Q>+6}Od_5iG>ivc#!B>C-cTTJ4hDk3fzgq8?r`t% zKo1iLj*X54194+N6nf0BiyLt&f8VZb@fXkd9RMXQxFcf%I8#kV0ddGtCyvBo_J&n!Ht(~1cJ6jL;Y;TDd;;qis z=6$VQvL|s1-rm=`b^Gp)xV>{_Pt*S9osgoVaaU_x7hD-P1XrF|1-0Y_2ab;PhQ^sd z&xrtozrt^b=k=Zp_Vo7kL3?|S2Tu14(D6dN6%6z-fspJ;+{y%wLY|(H-r+#p)JJ|w zU*bKIFAAU@{y&NVxTFb@n*tb=@G%NwG4%+UllKM<;yJBVVo!!tx~x*^vr1)9rn+i; z1zPi6sYQTCrjEE}*Wu2+?LFIecXo;A`#W3r#qGlVJ&m262Y2sliBrOLOB3|7;n*nP znqfQ`VB*wRZ!marl%eAk-5csX(i;r;jdA1f>EPo-@f_&c5kNw~K6BzUt{V-;O-BQW zEw5@m!tS}dwP8OL6>Jz92p$_Bd3<1`p(PMJ9vU5M2!_V#(+y*%`;IZa!@ehcCIuaeKJoXgSJ%0JW?ZKjVA z%xR296H^aG_aU~32lg?+o>hP=fISk%Xf#TScSb*9b5{WXdLVQHd_f%bYOMhGOZ) zgsRPqZo=3J{0cDB*wF>#!$J>`ciYRH4ln6!ZEtPv@>ToV_U+!~L(B+_go3_<+gkUv z`UYs<1HOtNQwfE?Y9enP#`QQ8MAQqM3iOQw!K3;Ep}u3IBS7N%hDL$Xx%!R;`i}RA zDBN=l>7FTWNfZtQgcKMz9U*itZa~ChRzn>?JQEEt!Ih63Oane}p6DGKfT0lRNu*#l z!|iJL4}JvzqF^a!E#s|alP$5_yyqS|_fWJY@(`En=X3p&Z83x8nU1GASl9Y%JFY#z z8MgC=?W|#Y%wF)^=($nOzL2*soZO13+MjBFvg7HF$&Q$TdS=H{JDzNRx_z=eX1331 zv_|*Tnp>{Ao36U)qcekiedG0YoU5I8wUcKtM^VHcvpOQH1k{y~2HGc~?&f=;t`1&u zwy29}F0TbD5{?Y0tIrB`4Oye4E=$xkFy$d4gbA&S;>%4rCJgsLVqnoC5;H3xdw7`= zcYEpKfsuh=i0K8&C}J>DQ)EX;JocLj9us_H)<8MTS_JD5Y(%gg01#VB%u0}z*@TY> zjv7ftK^%!P1hq>DN**&!@EA+KKlE(9L0$g>XXxY&ovfiVX3KwW_qpAiZ2@mvFxi?J zJ>N0g5CscgD7uwbb2G1Ix^!RZ64`1$u!RO6V9E2H7u(i_9vh3rM4p+!qjy;9wHl%wh?dDPkf8(*}h#!~gxE z+@@>e*N$<9t-N6?YuK7KMSSP?pop@LC5)Uf^EtRXFEiInXtJh=+6iqYil`LZfbnXx zqJ}z1mmMS5WSLF}jM&i8C7?^O5?$!PST7SAMi%_4QAMW`jJ9`Zh!88kUPhCwvW!9O zR-jA*<18fHxd(Ff$kH%7AU7x>H=w&>Bm?#Eyq4K5nf#MHF zfz-EZPCQY**1Y6v6?5)|O7NB5-+Qg*3^lx=hBee=P1R%8{K<~b-z&aUIMna8Ncmnx z&Yb#UDe;l=&E_ZHteAl5f_etw|NdTW4QHt34YjPHHs&aN?u+NX$T@tx!#BBYK0@r8 z+%3FXxqcyuejh_4=HO&as!@x%AI(IU6))C9soC-3YGTmq&s$R@9>e^U;-qvp06+D+YR?1Ge~-Up?cxz04?Pa zlxujB$N?HLkqJox0h4^`!!1lp`E>e~Ow46FKljXCFELh-CAP zQ72+KuBk_&+gPgZL!;gZa|{3w;Y>)Ya-P}w)Xpb&J-uskS7za95^TUkc53T0K&9d# zp<4$KDkVb`kmD6V#_vi9s?~&~bM;I>W<*mVq;W#eluQ`Y3rsX1B-WgYlq1C%^N<{A z5jk4~HKw1JP_~>PeA@X7bvlB``i^k_{yi;?U9B=44uWXbB}Yw=n+P7(`b3l>l2l^; zB8lk2-Nud2;XwKU6a0)viiu#Z%BsWk0x}6>#YDymgBBU44?sM(Z<`B z0a`Xz5bsa`6h%M}4wg}-XM9YUB9X>Ca}-j}z<==j0AQ>b7F-^juDj;p3{AYDi8VCc zPMJ4Jj2?5roW^Wi8Kdma+0WTywooj$a4H;qfVD0E(5TB<`LPDTToO>49EXrH7|V5E zUNB9iNeN=+{f)OfPP=Lr5a)q$6n*qt0GBj5idp1L3Q9;eYH@tfx+@?uUezndC(avo zYRWYs?BB$(M8hvC2E=gT z?4%lQ#yzh7*6xZ(zfB@G#Is((Xp{~jA%pxb+CBSD43#3i<+LI2Rl@4~-r@Ixun+?9~hdQ-FGyY=M~) zi_l2Pt$?*UqYTVa zj`O)}QS)0XuRZ?8nm5Wn#KskV7a z&AmsdRK`;6=}V;@_xSZW8B281c~GWK{npW?N%dPT8Ov}fi3_?wsq$Jg<}Fm_1#APS zDP?Zu)frpHvfLSZ$8(Pob2FA$oW6GmZj`9s;u(9!a=e+!iD>(E-~y(?vNMj1B`rwz z8^L)@)n{j%8B180t^{a@7F^HN?a0em%A$0opu?K#ZRKYypr$(natDDdafH?G$_A5~JtNM;OMZ6b46$FD3`cw1(%O4nd zRnMRR#F!AE0QRarZs=u>g3sCUljK|5pD=Y#3P#C%I?y+Y5(qdgCS1wFEhwc5r81-7 zITWnlG&I`RI~3eppSTPDmLSW}$@{6L+=SYL=%Vq-q~;w*@yl-3u@pYD?u9R#r*k>q z8s4{tbFbyyYgy;on5$rF`4r8%DlYc}z>lqh=y6Ow{t6xQW%y#A!7|ZY{aC`JYFD-= zyfoXEb5O`fs{lajW^?S3$Ip7sd**cdoJ!C)<={iT#*!~SqBPFMEVYONFONJ6mhn4pJ31H>cgS4nG=K4NDyazs&)6EyTAKBpY2 zbZF$4$<@i^G@w-)&pBMmex3%jm4vJ1`eX8)f&Pe(<<=8_ctMNwPJQr-K`;-F6W`kY@u8v9-~cCFiNkNK zcO)?Ms)fORjvK(?csQf}$XFpwa)`qG@pE_s2@-K!QqDyIip%k9eiWCd{A(yL_$+`) z&F@Sar~CZG1e4Jx3?^ql$#PSL+c`taMUvP0j#FWq=S$Few`uahR+Qn15 zSZY^{vOQ-#XFZ#HJ~xt!X>8|gXYJ?h;6n#bEaxm|ZRc$f+bosK+UurIbJTjCTF+AJ zXC3ZunWMR!r=IuJbB+ey(ZEs-!q{=j#txYh|9q7EqZlQp1HDYRLOx0ahXvnKe4-p6 zo~`Huk!EZ#Q;5mWBS5P&;P=E+?+L#%tvhk9+!x{oygz~eP%-8=WeVX_^I`7#cZm~l@(8g(E~qPQ*> z)@9>JDT_gWh=(kVVmzKTrgx~wP`+%OD)BA-s0679sK<9DjpmF_Zt+x(7_zz|ixEg> zG}4Yh8ca_a$2O`LDTlHJWNhPFqLd>goj#gXI)&V4qRlB|yD(W*$elc=DP_MYuV8HF z2xFURfjq>&_pWg~)L*wQ{GfbHCooAG)WjXQ)+er@NI#fMx)S~-sbXZ3RlaH?q9gNF zs9$dH1u}rki^$rHxCzxPSj4sr8;L&df?s?uo)N!zm1JoWsDt#IlGK5C&P%-#dP!1?kDlyaPzG%CAkat!@j4@a7E!VP}u4O-Tzg~K6 zkYB!?bM4?=J8rr5-gNC{_Z{Y3-Mp(i3o3FLsYoCSRHPoM$TFlN%aDpJyB{i2J-wZy z*6`FCmRd6(NB7962oX%gWecC4mfRSTT_6X@ z37>+NJP2h7%LKlKXSn(<3=U|?>3#(^0X-2Hu_TE}tuHaeK(a_rSbUB0l{E893x5bL z@SB(iu{D(luu1o#2YC_+5b-`-Bi-srwGAbtcQG-nqL$N!0p_F zB9?nf7{_8BUv%m84%WREX~TM?4eOCMtiK=HuxtjT{Y^ZziKRBpM;j#j5AgyM$)P$%Ctna5lF6~O5!JB}N@a;d?uP)H zDg2hCEU&!k)F@Ej3=-@-sIQI{0SIpCVEz@w&tJTeEGmlYdLEzpLLgAoQUq=-3^g#it~cS(RI^@ zxPmo&!J0@btfmB~=-f52%9`nxmyW++zHH%~kU8Bf#BFCGTU0ZBkaMo)ovT^r>RCq_ zyKp(@Siw71u+$2{cA1+*RG1t|kEArTSLtRZQx~?7Rcj7rN>SFdH=t6+QfSCcHBoJ~GMXw21X4vvlvG0)=AJXp4j{==rr(8Q=X+2O5q|PKk}YD^QIwntyB`DQ z!)y--LWAs3h<$XNqfYSD2^M^o@56YR?ev(bf$(0%V3c%;C*X(8XRu6&K!2ECyh*Pe zsQFAL;V47yRAYn84HIeXS+xTv3Qn6;f|CVaR^p&_h#c_Tn4HFtN2Z`nM6k*g(}R%Z zNS=dP5c+5y!Ahnx&=j3>)uQCbAbKfMC`$w0U`>ct=rS*eIMaAW#+Xg?WyTQ{w?bHp z6M>!q2t9S`t|ci^jiYVh_V-@7{oIe*Iv~UAuJ(sG2g+0 zzX~9(hv+^en2K8HBJ!3&@JX)32%maxeco;_x{-96PB3H5R zO6jd)|IK3mbS+oBmM>l#*+FElTkfix?y6}E=U&OXSAsxRR2dD=th;uAD{A43S|VE^ z<_ZK0%I(s|mNv{7uI7RqX5*X{vFhbBl~)_!%Fa2fGDv0a%IE~UaUbjMiA0-M=yZ)r($%#4;BtuD~z5g9rG(i z3Q0Z4FalH_JfC{}hz)}8q-v6(?$jxP`^l|xp1>7)%$!_G8kD3kwZbx?OVFBMXGpIa zhZCAa`q$(tkxD|tiAEGWQVvx*<5_D|rko{{PpGI-`iTYgguofogfS|kTFLV0oC)xk zO=A%;L}e5!nO@mW5EhJ4nF2UZIzx8pLP?USp)Iuasx5_j$y4N#(0vNk5$Kz&MauTh zGa2N(nx~|MXN(#93_KmvT9J%V8O_er7vM?!8TZ+QnfWd4ioz0w)FXsmdx>MvDW1^< zbm7$^WzVX9JvBiolzqaJCNzqB=1ou_EPW^!%Z1Qp?g=e;mV1rQl|93*inB8xNj1g>#WpgINTv^x+0^8Iu@X4c9P<>_k|Yqzt$A2ILxF20&oo zw}14f??t9=pL_AnGta*N*7yJ0o991x?MLsv^|SXcPQUlH86nO4U;oMNw_fmTi6JoT z5*i}bL6pqjp(JzXJCOHDNhn}`4EGX|XjZ0QN~(+m=ff3L$sk5?P293<`HGdRRet2 zB?8v%3+IJO-@W$i?elNk`O>p~k1*LP30KTdAhjS@;p-IUR$s)kD1tQzdJ&LWRus5M zFtWH|aCBfKZen^z=+R*a@_1}?0K#uFNaNy$Bct?bh}a3gfeB&`6ex&n$DDvOf36_0 zA;L00Mes8ONH2u&WeyC-2X46{atLDGb$A}v4+oDjU%-?o<;4vctSX3=lF3{FOeTar zyAs9bvmPr`qQxrsD;UO~$i+YoEN^MWKrk=2-zr#gvtUW|AXiYw7t}>siGRo~SNTm> zd9;ml)u5wD%dB_tl})$2H8;IA(;b|5Bk$c9X@})KbDBlDv=*~$1li72%e!i43^!e? zSl6nz+;4i>)`Q&oL;U(f?8E&x*Y~sQ`)9qioVT9$)=#y>7A$)4p>I6&^+&EeGSwEV zti4s)e6zCodOKISm#^G=tMbsz%0uko$GFN~zOr{}cdVe~Qpbf3w!Diy*v}qg*aJbX zAjB7h*n&{3z;kKmg`Lmuy0~j<7ba}K(EfbK#g3^Ce6r)hj_2DiwokRsdaI{5v5i62 z8{)hn-iujpd#l-+2ia|hS#LMz?dHARY(e*J_fpPX&AY3o46)(`FM7Y>oiSYYa>c9p z;?+~8n6v1T{eqoc2rcPl`;M^(1~}&+?;K>EgRv6diw)ms;7V%vlA0+qCbeC#J#W8g zpR&iC1(z%rEYI66+NNwVSIL~lo=0nAi^~7R{YUQa68Qe!+S#%Sw(@}+t8Y}XW&60YeSF!z%lcUP zp&L8c@f&)=5TiNzj-}Oar^uO5;r|{uCTY1k`*0WV8m2Dqq7oOl2p5Par zU_I(jV*M8s3};{&E3F~@euVY*ao#@O+s7945fj)d&as+ztY)dzLFDo`);DUmZ`Azj zjh3AT{cnt`c5KoAX1x~Aw-^D2^Ff6GZ+IHQtBQ-U6hdo)LGSA)|B3|VQ)=nzp0^fCv*hrL1r?Zp=kRAp6SlyOyt0Q2a)&m zAce^s4JItKQz<*0u})ZnRdQ#hL7Ujov`QieIZ*c7;9cgWv@V~#ORrc0SXrRgA*QG6 zYJoC9vZ}1Y2`gQ6MTMIneYraXKK3IhF>Xm(lF7Pefz_uUT1BM7S7Fg` zFa*)PgK^9F7zr;9OLG18#M%OkaW04|L})=8qIL*di}#4A@;II)1&^a}>9@rV7^^z@ z+L&9I3MrjT{IDcxpdd+$>-OW;{?Q?fq>ctI<|O6{0|+8g%H)s43Y|QGqRPTU%;!Rq zlK2G_LVgMWWDvC5!s-Q>yM8EI$`#i0h4tVR0@HwBh;HWGD|q(`h?`nieCg1ILzjoR z!WzD?CSr-X+?Uo}Sa*4cI5h%mkT}tsqRqMe{DO^$xJE z0oFEfJ7vMdv|-B2<<;?db+Tm>Ju%PXC^(-qp!3OcbUs;*B`<%c(0i%pLJwD1$rn~a zi!v^uc*k0Z>-0OdvBlNTZk^h}*%l@mwUhO>bFN*yYuAk+>)OZK_Ca74Zw2daf)7~7 z$oI^k@D06C)Hu`47B#{rVvTvq*}_%ui4FJ;2)_g1`fb`nR&)ZJcX6@7jK2CF|;7Z5_8MU$kVp`;KMl{m^Fk;?@mo6Ui$y25J z2h7$WrUFx$#QdVN+{x!DW^S#VTq+p=&h4jnd7<^NKp4tT8kmWvttnYg@(ev_)2y)4 zr)Pnx7GQv9)HPBLWjbJKx-8QffZ59o3N(1orZ5PKurC9hlhnG;7->s-V^;>YWTkCa zbCqmN)ngzA$PKKt9a$?FPh`K9c944t&qdma_rRbcV_e^{fzb;`^p`M_KQ3bw}MiqZ?f-NIyPq5FW3HB+N1?CGQk6s|+48{8w zUwrpx-+u4O*WSDGo%hcE6!iFki-7!sqx3HzA@fTFze4affVd;cI0S1;q3lMIL&xQ} zlVSs@R^Z73i*ZH7g_AqXN!vRR_vTLcD6cq<~UU{oM;Gc9;|9l^gt@C5`s zfFK%_B_5hk;B!TyNqRF}m3j6?k?;+8Nx|;`_yky|if5wx*R8^en}rooV3aHQ!j%zA zmQ1ek`i|=laMWI&+RIXV714zw=6P5f&i`n0T0}0piS<6fxi<5z&DZs;tC_VmzvFaY zHuFv&IExp$FCDya@LLD2JUZQet&v@@nOm@#2Uxg;FWdqQw4&izGwWQ$QHx_WtMRmo zqn64}=M3hY1KQdAVzy*C1kFCm=C^VAZG3)Pq&enpziwgO?eK{-pWhaXmFa)AU`<=G z{%w~Q&fhLJ0u0+5!~piGOcYrV5{{1^21fYl_0x=cr%DR|R++tqs?VVHs#t1b9!|@w zoyepot7fjG9I*XHhB{OZcTx_cBE2L~&}Ox#7R-*IUPmd?OG1a*2@g}E1_-(zFi>)) zL;V--TPKWgUw_6dpNSd7_eT!eHepW77G%t8!c41J>=~Gm08LRgw=*b-542s$fK?36 zLEBSUjFV`Ja@`bzmKo?gV71Uk$*pvtEV(5k*?$l|Ny(HmrZi@q(v+GK-nUdI%&)kJ z*gz@n72rJuOD~+D(&@8`G>-I)7qnhEdljs={~0P^{tJS?N6?4huMzwRK^(z<01z(P znh5zs`;y_9Hu#wTh$&_fAonGVs*Cv>IE@#G10LL8BzKs&Cvg|zJt?C?jUyHb^AOBC zSk%uE!~poMg4vs}JG2uBX7BIe88WZ9VPFJSt`nV+G=gwGqBG{iZHY~`FwkH^cO3kt=KB z%bIRFn>c4v`ny>B7or=cL!5gR?_L$z7AsrIdiTTUduy+5oOyz)Y2$0!ggZA%gl{l# zm$Y6hVM|)!6WJLntzwJU!DqTw_>Szj4VqUwTfBLu8UTDa+ZNuog|%(DoxgOtgk8Ox z%iqK2?};?O;{r~q%k9+8!uqOQw(LR9*~mK^S!W}t!cjBp-^ng)=iIw^H|mP+eXMgI ztjo%+h<4AETsy?>Kg`;?Ia@bx>xL72QgD7J>+w&o;%v)!+cMU+40#*eYM3eDY-@Pi z8rHTZ&8=Adx@Wht1=XCbCbnWVp4M}=24H;AW7qmvZxehtS2Is|`)xtBUc-9Va;|l} zYu&YS)`jY&pcg_kfU$vwq?D+PnIUP0KA4LjapV9A#N!n>kr@I1*=<45qIskmwM)5& zIpbAcXV6kr>~RF#jxiq+!t*t9KlBL|J13frq%mnUpxNw!$a*rDs6oldNShSKOBEAG z76w7bQ&(xC_?$R^naWv=s)Q7#lq2aq5S=egY(7h3!;W!OQY;ebNt`4!pp^UgIC!j{ zpr8;+)z{eRd+*Yp-?{X9tuIq@(IQ6D5;GzwA@6mk}&BBEiLE^Vt{n)7|DPO zhSeYhOi#%No8-0b^EDk-cVkOyXEJ;?b~BJ1U{9oH@8(q;uB#ZXtDt=q+cs3}+ECFM zE)iya2Sy+?Vn}8+3~unjlr$AM)d$XWz@#K52~16;xow9Ei1jlLVUn5t&;Xbz2`5XZ zr5R-=PpgasLCnPQBSbS(1wxEFR1FLJ=hMg(zu|u(5343TY|c=evvSt8gmYE$uF6OY z8ZIBY@X&P2)I(h1a=vhRqz!kK>Np3H-Yuoh4>gwDypIvUC4eH0cTsY35I72?Z9ms8 zs4=M3>^QgMZ2S54NIMt`J>{T#gB`JU^S0e^LKLExJE!x$ec+`7EKJUh|l4UCy9SeyDIDn%WqR!yx_sz8F)n~4n9rcK`5*x8D{IzU&)k6v~_I6(v-mj8orK)_b?U1?(O>cz1zzy*0fp!a*@BP7-Zh!fQ8S2^H*bcO}btzUO za;jQiRh2)PUt(7&Emc|vgDKCO_wDZN^buwuniX5NcXn;>fGsMM;}E%$iuVNlzTTA5 z+FRSYgu-ML82g8?A7OtE{24MfM5gvsJrAr25-F-rsVd2*pjeoVoF{qMr{G1has~1N zO4~mGCd*inB_k`!%zz9E21MwVpkkp_P;}rq%)x7#5^uS{acxLotk&AnL0S z!PiifH5;-b8?quB0x(B_Cu=s8Ef;BhtMhu^8wcJzAm~c$o-Qz&akl+DF`a!{HllAb zX?||9H2d^FcQzWEz4~7iYT@D+UL!z==tqy99Ki`!nFB}$F46`Thkvw|O*#Af#qDL=RCI%(Wqf!$MiZ)8z4{TfJ ztEy$Tt2N-|tWWQ?44Y2o(3Y!KWpHxzFd3B8C&e@x`o734cw*mx&B~^>L`0++Ge{QF4jN^LJ}cn^Q-+D5G9n&m*pPU?i<=@?pF3xD9{?@a#wS?suT0W z+bWr_gcK>pD@iftC(J~Ofp3`H8Znm07xL3(mm z-?E|QuD*3cD+8<@7Vyi&sCumRZll~m>BId7}m5{AuTdU``4*gOprK^VLQw-g#m4TGYMy9tCBN^+BwLe`)Z zvFTNJMzJZb8>8bnEnsnOL+`M-6*ii|oik9UkL&0V^FQF{LR^EOplHJ?`(a#1-pe0pSOqPF7jOLe*WQ$4@cUBvdf~T=?OM(6PLG%&)YPo$;n-I9sHv6 zFIg{GFSkuUaee=km2>XoojX}4Sk4z;*)?6ym#&}6f#UN@ZaJ6SbS{bRp9X_{1Mh5L zoeeQ(@&A>(b1rBaX&(U}VoN_pki3`f42&4*Zi5L2HgVl~Zs%pKV70mJDg_tsSlQxO z*|J#i!*j5;hW$egfR7R2>Ph=2zq4ta;J&8V&?RAhX?d&py7rB>H`~~f7WmuPG z*2UXEfbRPJ<>nSZ<)@mLZ#8Ltv9hV4&82_aY=eupU4}Nd`E9oz&r7s;?yZLNUz;r3 zeEMI5aJ|i|zfq`#iyK}ez_2$dTqiY{c?~rk)xAip0pqmtJ8i);<#IhduhaR4_$n<_-uZ;-gg9QR{&fm* ze8GGrq=@5X_YlVyisE<+^n8l_=(9H}rkAIi<>tF2!6Yv9RUM-;Bb#8*6J*Q`rohj{ z`Zg!OG3+87&NB2@_&$q-AhX%cOL!N8470cNO373EX%qzLqk2eK+8=l_Mxz{qV( z1%gThRS1ZYGgVwJk;LDW+QO?cTRSu7LRYWg7XhH?ydrDS`O}#^^IR&ydGV5$%4T#k zoB3r;+@fY4KW(=b?Y_BaH@l~gTSW7VXpo$r;A~|H(fK%AfFC|@DAIJh&@Bqivrw{H zY_=%GX11aE#%h$C_wvrYtaC4so7w8keCd||_kweJfqbqInvAoV0>Bwg5U0h<6&eenVTG z`RzJAo-fnl`SNNw|8=Ql+Zz3^D?y%KuD?;Eg^L@@jR1)=nPP$yr?`pp=OGwapXK&L z^Mq4Fe;bg}Q;#%jByhJHnVVoTkJ`Koa*j6razd3ER|n}N19P&xG&>AvvP&oTaiLAH z@1)9e1swli4}c9&74s&5gkOD4LMEsd=DLy;3%n;puLxQUyk#Ng93iTrmU#$Dfk;2Z z7Z3d+$ev9Ztsx|&97I+`7aqZz9P=w9D_(;;^F^1F#UuJQ(!?o9KdE`g>i*VA)>;Xl zS(o=)TccaK(ptVWF-_0f>QZCxrdv7*vTqZdZGqAI?q3Kk({T=Yaj z`CRj|j#kdm$~!Qx;1y=ZAXphAEItP91`lUIb@50p5>ldx(&to;%(QBqt5Vd3m#ym{ z@7bRSuxRWXf?ZHDhgdWT4Gv>4v<&;02r0gYJ&$H>@MXkpFV8y8J0cDto}!uaEag2* zIftKj_*u$NIzutgalny*{!2Jf_JQ)3pMl|-?3MJ}5`aBDHP-LFbEVmyDT}(&Y{oGG z8>~Vs-mtfkY_3#?o2N3PLv@WqL!&3_b~6KDB#mpU!=-7T?-KUd3NM6kv9&(jc?;lv z04=TUtzE6PzTJDew(suf%#eK>j7nH=8nz|2Y^@`Ew(1!aqT=Rb!qd1OUZ)>?k03n4 z*yuHnI6{DOy<+(+b-lR&|1skrx?x+v)6t1sRKH11V@F++1@Kg^=^{5_QgD34g)y`57 zbHN>P5cC3bw2?&f_Lsn~9UCKyQAlhF<}5UUxrpErf^Q=DHiAD!@G^oY5quxP^9X*3 z0Ldfs?-6`};J+gH2*LkE@V^l(g>Gc(5g^TCR^Zt>0KpQt^gZ?%DgtQ^!JZ1CIh8|< z*#uc}X-;qi#>Xe0pqytiE}qj!z^O6iJahP|!>prnrf7zmJj@x_^TzctqYJmOMI)YZ z8SM6EDtP)){MrD|<_!3tNXocqx@~$LW?aP^S7pk$8lK%dqYY~WAgfWxh!0Ao8q25q zrw?I`Yk1=tQlprWUJEyZ4!EX!zW?LuSk~{%JBWeqxoLD6{`Ut%PIT{d{83Rb}CviT@+o2zhXIWTt26> z8tX8d3}68(q-SDI*5R98JySW|fLWp74RgAs@P0I@0P}B@5_DB?yj)(8z+F{kqyapjU4V)m8E=NqI7Rk;@%H_vGRB-7)aZOPgeamK|w zj5A#czFGj7vRt~ePAa&HGcM(gOXqZMOb7rI`lUN7q=c26v5GfV&FNNSLI9W$vL^0~ zB?^pOLu_v2_rrdeDcw!AH`AL23>&=6T&!8+!6sI9XWKxmDst=53^{N>K{RvfZPs%$rB&LeFT`Jp(1$ z?@?mrjiVjuN~E3Y@*qq{rhW!HZfcuoS4s&MvIT9yKg%s>$qpj%TyawbkZcD=n5O_A znLhxa*kzV%+#247JX=hz-aJIQpT*X)Z=r0o9x4GY|Bl1^@>w|ykK%zn9dX$W^i0~W4HCy75j1v0kH#tZft@j`MHU}-x6S7#m2jDV^oFtk$^C~78 z2N2E|-!Z{j`5p(!fV)f^CReHE=usx9;fCZ^VN5ID-3UPR*A$j+GmY>fh2;TaeVNdn zv;%{!1-}Hv0A4HiI>6v+Q8!=UhnQ;eeGeea?)dbvYbLH}3tzM)5oQ;6J5WT~O+PTw z?{=_~bFAVWxYMP8zYaP6X4J-MXtYujP3oPXVWxP6$=8c2G;-Bcr;?3y!e$oGqs&$8 zZuG|@O%xOYyV%2mh8?cXX3Pp{Z(_GsLveyOZk=k6F5##uo~mN0DnTiCaGqtnXBp>M z&O4T~)N=LMPTl4Jl#s+yY&e0g0Vp1-{heiU!-Q)8ab<`w*sWQ6Rj-^01LfJ!K`3z& zr<3~?K$yurP%D^>2pS)Ra{+mEBnx>+XkWrjg=xteVM!&ou;&_}RI)!o(Spkl^M%zA zUM3$yLFcdJ^H;*I1h^H!%4-Kx4Ll1Z)FS)jG;A6e32hK}+u7U)O_2^0oDtHPifC#2 zY`z{Y{b-FrK4fjwDl9=i-(V0}zvxlq+n(A!4nXE+o_a4fZj{aw2`~uAe@}6|Loq*1|3j zuBvH@b1mmx%M&|3thjDv4?M~aJkB~8&cW~w+^k2y)!KPGTks&478fh}URpTwV|XJ< zOqLJwVrZgpWZY{`zWa_&J|bl0$amjSgbGl}o){)t_MXMM)wW*}q8Q$7>OsR&et7q= z-Bo|ePUBEEGUJp(*#@vvX9#;d$U7QYs!=_v1N4A=X^22flT#7k zH=v}blCXJdo>862WUR!kGeAX|XXI>LiT@;$R@yPBN{5@$r5$(3`O=19&vFwvC^x%# zB3*Xrr;}2xq7aKK-|lQ5b4O zq;-nhd5L+1kPpJnT|$JTpJ0w<2v#E?VUBw74B3m|?rLC;z_}3cPbz2=KE^Dfc$+YO zJ5)#~MD`Pht(v8&68{5^Nko7|JO|Yl61JGtJ*P3}tVmrW`}`vpACXqaLWCW5-=pkf z!|dJ>&Nj;1Mp@e^E`SBk%Co!9?~3foyfhYPakoVWSno1{i?X)m5WeoRnOy|&>k^@3 zXM(I_150fX##_C_Md`p01gn%S#!5Hh;wE7pLcvdQBoJ8!Ju;L+vuZrxj47l^Jyhv1 zQXTYW>VX?vrHMYL&4zOVchg0)7`0@!Hmh{;4AZ^ zw4R`}jM1Rj0E|Z9GI=R4GF&$wgGotlfZ~EfP$b}SN}R~&7hGH*ix9c_`U3XBJ;~@< zS#BK!I7vnQEbRZ~sN)@VELBIaky#JO0n6Vv!k28urU@?_5wsydk)AMPW+$F?AlM5a zh^nm5_Zaj9IfU-WPyOx8K1lsz9IfZ!1XNS?#7e$ox?MP3F;g^6Eaf=0g7*H^Xz!N+ zw5SprJ9#Er{=rht85i-!MQD0mfu`3Lm=G+>i94d{pLHzcj4&hMix~^&bOs|DbP;0e zBHmbt-%yTk&On~oq^8w##s=QlkjNG!*@B8}%iu9)gJ;QX58N=JZ&I!R2gm$MEUk<3sg*qa!1MzR)PcEXBLVBcq|wm2n4t z!7ON?zHbP(3}8@{Woi(hq)$TU#Z90!(!D{Z7!V0IGan5FMoutJd`uQ$EWq12{o^B0 z`Y3EhiBwXUg{;LhFM?783lJ~>;-*AxV|a(qfz5cwg zG@czr@HhgTNF+F~GBMnxHVu!`<3oYX%p;HlKAIqsU5I|J)y6bK?5F$0G)vfYpO|JL ztNg??MXdOVX>60^FQ!?{DnBtz&LsJZY3!5aFQ&Z+ ze)NvUI%$0}_h~3Mmg9&No%NjeOq#%bt*~sW>Ed>_ED>jk)#SxIi!SS~^cLnsPzv2JkV0$(*@-lhy>2f+EPz(K=z`M+6=Vo=KoYIwSWyW-Uq{ zBFHyuAvmrC;L?Sc2>_P`c$onC4tyYi#a1ju0;P6LCxIn7T3ALc0gnSOm0*blb0|T{ XF|!t?p=9uYW1m(Fq#`{eRO0^tKuFgZ literal 0 HcmV?d00001 diff --git a/app.py b/app.py index 19779eb..bda5c19 100644 --- a/app.py +++ b/app.py @@ -1,223 +1,50 @@ -from flask import Flask, request, jsonify, send_from_directory, make_response, send_file +from flask import Flask, request, jsonify, redirect, url_for, render_template, session, make_response from flask_cors import CORS -import boto3 -from botocore.exceptions import NoCredentialsError, ClientError, EndpointConnectionError -import os +from flask_mail import Mail +from flask_bcrypt import Bcrypt +from flask_session import Session from dotenv import load_dotenv +import os import logging -import datetime -import pytz -from botocore.client import Config -import csv -import pandas as pd +import app_function # 引入新的文件 + +# 载入环境变量 +load_dotenv() + +# 初始化 Flask 应用 +app = Flask(__name__, static_url_path='', static_folder='.') +CORS(app, resources={r"/*": {"origins": "*", "methods": "GET,POST,PUT,DELETE,OPTIONS"}}) +bcrypt = Bcrypt(app) + +# 确保 SECRET_KEY 被设置 +app.secret_key = os.getenv('SECRET_KEY', 'you_will_never_guess') +app.config['SESSION_TYPE'] = 'filesystem' +app.config['SESSION_PERMANENT'] = False +Session(app) + + + +# 配置邮件 +app.config.update( + MAIL_SERVER=os.getenv('EMAIL_HOST'), + MAIL_PORT=os.getenv('EMAIL_PORT'), + MAIL_USE_SSL=True, + MAIL_USERNAME=os.getenv('EMAIL_USERNAME'), + MAIL_PASSWORD=os.getenv('EMAIL_PASSWORD'), + MAIL_DEFAULT_SENDER=(os.getenv('EMAIL_FROM_NAME'), os.getenv('EMAIL_FROM')) +) +mail = Mail(app) -# 配置日志 logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s') -load_dotenv() # 从.env文件加载环境变量 - -app = Flask(__name__, static_url_path='', static_folder='.') -CORS(app, resources={r"/*": {"origins": "*", "methods": "GET,POST,PUT,DELETE,OPTIONS"}}) # 添加 CORS 支持 - -aws_access_key_id = os.getenv('AWS_ACCESS_KEY_ID') -aws_secret_access_key = os.getenv('AWS_SECRET_ACCESS_KEY') -region_name = os.getenv('AWS_REGION') -bucket_name = os.getenv('S3_BUCKET_NAME') - -# 打印环境变量 (仅用于调试,生产环境中请移除) -print(f"AWS_ACCESS_KEY_ID: {aws_access_key_id}") -print(f"AWS_SECRET_ACCESS_KEY: {'*' * len(aws_secret_access_key) if aws_secret_access_key else 'Not set'}") -print(f"AWS_REGION: {region_name}") -print(f"S3_BUCKET_NAME: {bucket_name}") - -s3_client = boto3.client( - 's3', - aws_access_key_id=aws_access_key_id, - aws_secret_access_key=aws_secret_access_key, - region_name=region_name, - config=Config(signature_version='s3v4') # 使用 S3v4 签名版本 -) - -# 跟踪学生提交信息 -submissions_file = 'submissions.csv' - -# 创建或者加载提交文件 -if not os.path.exists(submissions_file): - with open(submissions_file, 'w', newline='') as file: - writer = csv.writer(file) - writer.writerow(['ID', '学生姓名', '学号', '作业', '提交的文件']) - - -def add_submission(student, student_id, assignment, filename): - with open(submissions_file, 'a', newline='') as file: - writer = csv.writer(file) - writer.writerow([datetime.datetime.now().isoformat(), student, student_id, assignment, filename]) - - -def generate_presigned_url(object_key, content_type, expiration=3600): - try: - current_time = datetime.datetime.now(pytz.UTC) - logging.info(f"Current UTC time before generating URL: {current_time}") - - response = s3_client.generate_presigned_url('put_object', - Params={ - 'Bucket': bucket_name, - 'Key': object_key, - 'ContentType': content_type - }, - ExpiresIn=expiration, - HttpMethod='PUT' - ) - logging.info(f"Generated presigned URL: {response}") - return response - except (NoCredentialsError, ClientError, EndpointConnectionError) as e: - logging.error(f"Error generating presigned URL: {str(e)}", exc_info=True) - return None - - -@app.route('/generate-url', methods=['GET']) -def get_presigned_url(): - student = request.args.get('student') - student_id = request.args.get('student_id') - filename = request.args.get('filename') - content_type = request.args.get('content_type', 'application/octet-stream') - assignment = request.args.get('assignment') - logging.info( - f"Received request for student: {student}, student_id: {student_id}, filename: {filename}, content_type: {content_type}, assignment: {assignment}") - - if not student or not filename or not student_id or not assignment: - logging.warning("Missing student, student_id, assignment or filename parameter") - return jsonify({'error': 'Student, student_id, assignment and filename parameters are required'}), 400 - - folder_name = f'sure_homework_define_by_qin/{assignment}' - new_filename = f'{student}_{student_id}_{filename}' - object_key = f'{folder_name}/{new_filename}' - - url = generate_presigned_url(object_key, content_type) - if not url: - logging.error("Failed to generate presigned URL") - return jsonify({'error': 'Failed to generate presigned URL'}), 500 - - return jsonify({'url': url, 'content_type': content_type}) - - -@app.route('/record-submission', methods=['POST']) -def record_submission(): - data = request.json - student = data.get('student') - student_id = data.get('student_id') - assignment = data.get('assignment') - filename = data.get('filename') - - if not student or not filename or not student_id or not assignment: - return jsonify({'error': 'Student, student_id, assignment and filename parameters are required'}), 400 - - add_submission(student, student_id, assignment, filename) - - return jsonify({'status': 'success'}) - - -@app.route('/') -def serve_index(): - return send_from_directory('.', 'index.html') - - -@app.route('/health') -def health_check(): - logging.info("Health check initiated") - try: - local_time = datetime.datetime.now() - utc_time = datetime.datetime.now(pytz.UTC) - logging.info(f"Local time: {local_time}, UTC time: {utc_time}") - - logging.info("Attempting to list S3 buckets") - response = s3_client.list_buckets() - logging.info(f"Successfully listed buckets: {[bucket['Name'] for bucket in response['Buckets']]}") - return jsonify({ - 'status': 'healthy', - 'message': 'AWS credentials are valid', - 'local_time': local_time.isoformat(), - 'utc_time': utc_time.isoformat() - }), 200 - except NoCredentialsError: - logging.error("AWS credentials not found", exc_info=True) - return jsonify({'status': 'unhealthy', 'message': 'AWS credentials not found'}), 500 - except ClientError as e: - error_code = e.response['Error']['Code'] - error_message = e.response['Error']['Message'] - logging.error(f"AWS client error: {error_code} - {error_message}", exc_info=True) - return jsonify({'status': 'unhealthy', 'message': f'AWS client error: {error_code} - {error_message}'}), 500 - except Exception as e: - logging.error(f"Unexpected error during health check: {str(e)}", exc_info=True) - return jsonify({'status': 'unhealthy', 'message': f'Unexpected error: {str(e)}'}), 500 - - -@app.route('/download-submissions') -def download_submissions(): - try: - # 使用 csv 模块读取文件,这样可以处理不一致的行 - with open(submissions_file, 'r', newline='') as file: - csv_reader = csv.reader(file) - headers = next(csv_reader) # 读取标题行 - data = list(csv_reader) # 读取所有数据行 - - # 确定最大列数 - max_columns = max(len(headers), max(len(row) for row in data)) - - # 创建一个新的数据列表,确保每行都有相同数量的列 - normalized_data = [] - for row in data: - normalized_data.append(row + [''] * (max_columns - len(row))) - - # 创建 DataFrame - df = pd.DataFrame(normalized_data, columns=headers + [''] * (max_columns - len(headers))) - - # 重命名列(如果需要) - expected_columns = ['ID', '学生姓名', '学号', '作业', '提交的文件'] - df.columns = expected_columns + [f'额外列{i+1}' for i in range(len(df.columns) - len(expected_columns))] - - # 删除完全为空的行和列 - df = df.dropna(how='all', axis=0).dropna(how='all', axis=1) - - output_file = 'submissions.xlsx' - df.to_excel(output_file, index=False) - return send_file(output_file, as_attachment=True) - except Exception as e: - logging.error(f"Error in download_submissions: {str(e)}", exc_info=True) - return jsonify({'error': str(e)}), 500 - +# 添加路由 +app_function.add_admin_routes(app, mail, bcrypt) +app_function.add_teacher_routes(app, mail, bcrypt) @app.before_request def before_request_func(): if request.method == 'OPTIONS': - return _build_cors_preflight_response() - - -def _build_cors_preflight_response(): - response = make_response() - response.headers.add("Access-Control-Allow-Origin", "*") - response.headers.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS") - response.headers.add("Access-Control-Allow-Headers", "Content-Type") - return response - + return app_function._build_cors_preflight_response() if __name__ == '__main__': - local_time = datetime.datetime.now() - utc_time = datetime.datetime.now(pytz.UTC) - logging.info(f"Application starting. Local time: {local_time}, UTC time: {utc_time}") - - try: - logging.info("Validating AWS credentials on startup") - sts = boto3.client('sts', - aws_access_key_id=aws_access_key_id, - aws_secret_access_key=aws_secret_access_key, - region_name=region_name) - response = sts.get_caller_identity() - logging.info(f"AWS credentials validated successfully. Account ID: {response['Account']}") - except Exception as e: - logging.error(f"Failed to validate AWS credentials: {str(e)}", exc_info=True) - # 如果你想在凭证验证失败时退出程序,取消注释下面两行 - # import sys - # sys.exit(1) - app.run(debug=True) diff --git a/app.txt b/app.txt deleted file mode 100644 index 19779eb..0000000 --- a/app.txt +++ /dev/null @@ -1,223 +0,0 @@ -from flask import Flask, request, jsonify, send_from_directory, make_response, send_file -from flask_cors import CORS -import boto3 -from botocore.exceptions import NoCredentialsError, ClientError, EndpointConnectionError -import os -from dotenv import load_dotenv -import logging -import datetime -import pytz -from botocore.client import Config -import csv -import pandas as pd - -# 配置日志 -logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s') - -load_dotenv() # 从.env文件加载环境变量 - -app = Flask(__name__, static_url_path='', static_folder='.') -CORS(app, resources={r"/*": {"origins": "*", "methods": "GET,POST,PUT,DELETE,OPTIONS"}}) # 添加 CORS 支持 - -aws_access_key_id = os.getenv('AWS_ACCESS_KEY_ID') -aws_secret_access_key = os.getenv('AWS_SECRET_ACCESS_KEY') -region_name = os.getenv('AWS_REGION') -bucket_name = os.getenv('S3_BUCKET_NAME') - -# 打印环境变量 (仅用于调试,生产环境中请移除) -print(f"AWS_ACCESS_KEY_ID: {aws_access_key_id}") -print(f"AWS_SECRET_ACCESS_KEY: {'*' * len(aws_secret_access_key) if aws_secret_access_key else 'Not set'}") -print(f"AWS_REGION: {region_name}") -print(f"S3_BUCKET_NAME: {bucket_name}") - -s3_client = boto3.client( - 's3', - aws_access_key_id=aws_access_key_id, - aws_secret_access_key=aws_secret_access_key, - region_name=region_name, - config=Config(signature_version='s3v4') # 使用 S3v4 签名版本 -) - -# 跟踪学生提交信息 -submissions_file = 'submissions.csv' - -# 创建或者加载提交文件 -if not os.path.exists(submissions_file): - with open(submissions_file, 'w', newline='') as file: - writer = csv.writer(file) - writer.writerow(['ID', '学生姓名', '学号', '作业', '提交的文件']) - - -def add_submission(student, student_id, assignment, filename): - with open(submissions_file, 'a', newline='') as file: - writer = csv.writer(file) - writer.writerow([datetime.datetime.now().isoformat(), student, student_id, assignment, filename]) - - -def generate_presigned_url(object_key, content_type, expiration=3600): - try: - current_time = datetime.datetime.now(pytz.UTC) - logging.info(f"Current UTC time before generating URL: {current_time}") - - response = s3_client.generate_presigned_url('put_object', - Params={ - 'Bucket': bucket_name, - 'Key': object_key, - 'ContentType': content_type - }, - ExpiresIn=expiration, - HttpMethod='PUT' - ) - logging.info(f"Generated presigned URL: {response}") - return response - except (NoCredentialsError, ClientError, EndpointConnectionError) as e: - logging.error(f"Error generating presigned URL: {str(e)}", exc_info=True) - return None - - -@app.route('/generate-url', methods=['GET']) -def get_presigned_url(): - student = request.args.get('student') - student_id = request.args.get('student_id') - filename = request.args.get('filename') - content_type = request.args.get('content_type', 'application/octet-stream') - assignment = request.args.get('assignment') - logging.info( - f"Received request for student: {student}, student_id: {student_id}, filename: {filename}, content_type: {content_type}, assignment: {assignment}") - - if not student or not filename or not student_id or not assignment: - logging.warning("Missing student, student_id, assignment or filename parameter") - return jsonify({'error': 'Student, student_id, assignment and filename parameters are required'}), 400 - - folder_name = f'sure_homework_define_by_qin/{assignment}' - new_filename = f'{student}_{student_id}_{filename}' - object_key = f'{folder_name}/{new_filename}' - - url = generate_presigned_url(object_key, content_type) - if not url: - logging.error("Failed to generate presigned URL") - return jsonify({'error': 'Failed to generate presigned URL'}), 500 - - return jsonify({'url': url, 'content_type': content_type}) - - -@app.route('/record-submission', methods=['POST']) -def record_submission(): - data = request.json - student = data.get('student') - student_id = data.get('student_id') - assignment = data.get('assignment') - filename = data.get('filename') - - if not student or not filename or not student_id or not assignment: - return jsonify({'error': 'Student, student_id, assignment and filename parameters are required'}), 400 - - add_submission(student, student_id, assignment, filename) - - return jsonify({'status': 'success'}) - - -@app.route('/') -def serve_index(): - return send_from_directory('.', 'index.html') - - -@app.route('/health') -def health_check(): - logging.info("Health check initiated") - try: - local_time = datetime.datetime.now() - utc_time = datetime.datetime.now(pytz.UTC) - logging.info(f"Local time: {local_time}, UTC time: {utc_time}") - - logging.info("Attempting to list S3 buckets") - response = s3_client.list_buckets() - logging.info(f"Successfully listed buckets: {[bucket['Name'] for bucket in response['Buckets']]}") - return jsonify({ - 'status': 'healthy', - 'message': 'AWS credentials are valid', - 'local_time': local_time.isoformat(), - 'utc_time': utc_time.isoformat() - }), 200 - except NoCredentialsError: - logging.error("AWS credentials not found", exc_info=True) - return jsonify({'status': 'unhealthy', 'message': 'AWS credentials not found'}), 500 - except ClientError as e: - error_code = e.response['Error']['Code'] - error_message = e.response['Error']['Message'] - logging.error(f"AWS client error: {error_code} - {error_message}", exc_info=True) - return jsonify({'status': 'unhealthy', 'message': f'AWS client error: {error_code} - {error_message}'}), 500 - except Exception as e: - logging.error(f"Unexpected error during health check: {str(e)}", exc_info=True) - return jsonify({'status': 'unhealthy', 'message': f'Unexpected error: {str(e)}'}), 500 - - -@app.route('/download-submissions') -def download_submissions(): - try: - # 使用 csv 模块读取文件,这样可以处理不一致的行 - with open(submissions_file, 'r', newline='') as file: - csv_reader = csv.reader(file) - headers = next(csv_reader) # 读取标题行 - data = list(csv_reader) # 读取所有数据行 - - # 确定最大列数 - max_columns = max(len(headers), max(len(row) for row in data)) - - # 创建一个新的数据列表,确保每行都有相同数量的列 - normalized_data = [] - for row in data: - normalized_data.append(row + [''] * (max_columns - len(row))) - - # 创建 DataFrame - df = pd.DataFrame(normalized_data, columns=headers + [''] * (max_columns - len(headers))) - - # 重命名列(如果需要) - expected_columns = ['ID', '学生姓名', '学号', '作业', '提交的文件'] - df.columns = expected_columns + [f'额外列{i+1}' for i in range(len(df.columns) - len(expected_columns))] - - # 删除完全为空的行和列 - df = df.dropna(how='all', axis=0).dropna(how='all', axis=1) - - output_file = 'submissions.xlsx' - df.to_excel(output_file, index=False) - return send_file(output_file, as_attachment=True) - except Exception as e: - logging.error(f"Error in download_submissions: {str(e)}", exc_info=True) - return jsonify({'error': str(e)}), 500 - - -@app.before_request -def before_request_func(): - if request.method == 'OPTIONS': - return _build_cors_preflight_response() - - -def _build_cors_preflight_response(): - response = make_response() - response.headers.add("Access-Control-Allow-Origin", "*") - response.headers.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS") - response.headers.add("Access-Control-Allow-Headers", "Content-Type") - return response - - -if __name__ == '__main__': - local_time = datetime.datetime.now() - utc_time = datetime.datetime.now(pytz.UTC) - logging.info(f"Application starting. Local time: {local_time}, UTC time: {utc_time}") - - try: - logging.info("Validating AWS credentials on startup") - sts = boto3.client('sts', - aws_access_key_id=aws_access_key_id, - aws_secret_access_key=aws_secret_access_key, - region_name=region_name) - response = sts.get_caller_identity() - logging.info(f"AWS credentials validated successfully. Account ID: {response['Account']}") - except Exception as e: - logging.error(f"Failed to validate AWS credentials: {str(e)}", exc_info=True) - # 如果你想在凭证验证失败时退出程序,取消注释下面两行 - # import sys - # sys.exit(1) - - app.run(debug=True) diff --git a/app_function.py b/app_function.py new file mode 100644 index 0000000..36c1e8e --- /dev/null +++ b/app_function.py @@ -0,0 +1,781 @@ +from flask import Flask, request, jsonify, redirect, url_for, render_template, session, make_response, flash +from flask_mail import Mail, Message +from flask_bcrypt import Bcrypt +import mysql.connector +import boto3 +from botocore.client import Config +import os +import logging +import random +import pandas as pd +from dotenv import load_dotenv +from flask import send_file +import io +from functools import wraps + +load_dotenv() +bcrypt = Bcrypt() + +# 配置 AWS S3 +aws_access_key_id = os.getenv('AWS_ACCESS_KEY_ID') +aws_secret_access_key = os.getenv('AWS_SECRET_ACCESS_KEY') +region_name = os.getenv('AWS_REGION') +bucket_name = os.getenv('S3_BUCKET_NAME') +s3_client = boto3.client( + 's3', + aws_access_key_id=aws_access_key_id, + aws_secret_access_key=aws_secret_access_key, + region_name=region_name, + config=Config(signature_version='s3v4') +) + +# 数据库连接函数 +def get_db_connection(): + return mysql.connector.connect( + host=os.getenv('MYSQL_HOST'), + user=os.getenv('MYSQL_USER'), + password=os.getenv('MYSQL_PASSWORD'), + database=os.getenv('MYSQL_DB') + ) + +# 验证学生身份 +def validate_student(student_id, password, bcrypt): + conn = get_db_connection() + cursor = conn.cursor(dictionary=True) + cursor.execute('SELECT * FROM students WHERE id = %s', (student_id,)) + student = cursor.fetchone() + cursor.close() + conn.close() + if student and bcrypt.check_password_hash(student['password'], password): + return student + return None + +# 验证管理员身份 +def validate_admin(username, password): + conn = get_db_connection() + cursor = conn.cursor(dictionary=True) + cursor.execute('SELECT * FROM administrators WHERE username = %s', (username,)) + admin = cursor.fetchone() + cursor.close() + conn.close() + + if admin and bcrypt.check_password_hash(admin['password'], password): + return admin + return None + +# 验证教师身份 +def validate_teacher(email, password, bcrypt): + conn = get_db_connection() # 或者其他方法来获取数据库连接 + cursor = conn.cursor(dictionary=True) + cursor.execute('SELECT * FROM teachers WHERE email = %s', (email,)) + teacher = cursor.fetchone() + cursor.close() + conn.close() + + if teacher and bcrypt.check_password_hash(teacher['password'], password): + return teacher + return None + +def fetch_all_departments(): + conn = get_db_connection() + cursor = conn.cursor(dictionary=True) + cursor.execute('SELECT * FROM departments') + departments = cursor.fetchall() + cursor.close() + conn.close() + return departments + +def fetch_all_grades(): + conn = get_db_connection() + cursor = conn.cursor(dictionary=True) + cursor.execute('SELECT * FROM grades') + grades = cursor.fetchall() + cursor.close() + conn.close() + return grades + +def fetch_all_classes(): + conn = get_db_connection() + cursor = conn.cursor(dictionary=True) + cursor.execute('SELECT * FROM classes') + classes = cursor.fetchall() + cursor.close() + conn.close() + return classes + +def fetch_all_teachers(): + conn = get_db_connection() + cursor = conn.cursor(dictionary=True) + cursor.execute('SELECT * FROM teachers') + teachers = cursor.fetchall() + cursor.close() + conn.close() + return teachers + +def fetch_teacher_classes(teacher_id): + conn = get_db_connection() + cursor = conn.cursor(dictionary=True) + + # 假设每个教师和班级的关联存储在一个中间表 `class_teacher` 中 + cursor.execute(''' + SELECT c.id, c.name FROM classes c + JOIN class_teacher ct ON c.id = ct.class_id + WHERE ct.teacher_id = %s + ''', (teacher_id,)) + + classes = cursor.fetchall() + + cursor.close() + conn.close() + return classes + +def fetch_class_assignments(class_id): + conn = get_db_connection() + cursor = conn.cursor(dictionary=True) + pivot_query = ''' + SELECT * FROM assignments + WHERE class_id = %s + ''' + cursor.execute(pivot_query, (class_id,)) + assignments = cursor.fetchall() + cursor.close() + conn.close() + return assignments + + +def fetch_class_students(class_id): + conn = get_db_connection() + cursor = conn.cursor(dictionary=True) + + # 查询属于给定class_id的所有学生 + cursor.execute(''' + SELECT * FROM students + WHERE class_id = %s + ''', (class_id,)) + + students = cursor.fetchall() + + cursor.close() + conn.close() + return students + + +# 添加到提交历史表 +def add_to_submission_history(student_id, assignment_id, filename): + conn = get_db_connection() + cursor = conn.cursor() + cursor.execute( + 'INSERT INTO submission_history (student_id, assignment_id, filename, submit_date) VALUES (%s, %s, %s, NOW())', + (student_id, assignment_id, filename) + ) + conn.commit() + cursor.close() + conn.close() + +# 添加或更新作业提交记录 +def add_or_update_submission(student_id, assignment_id, filename, code_verified=False): + add_to_submission_history(student_id, assignment_id, filename) # 保留历史记录 + + conn = get_db_connection() + cursor = conn.cursor() + if code_verified: + cursor.execute( + 'UPDATE submissions SET submit_date = NOW(), filename = %s WHERE student_id = %s AND assignment_id = %s', + (filename, student_id, assignment_id)) + else: + cursor.execute( + 'INSERT INTO submissions (student_id, assignment_id, filename, submit_date) VALUES (%s, %s, %s, NOW())', + (student_id, assignment_id, filename)) + conn.commit() + cursor.close() + conn.close() + +# 生成预签名URL +def generate_presigned_url(object_key, content_type, expiration=3600): + try: + url = s3_client.generate_presigned_url( + 'put_object', + Params={'Bucket': bucket_name, 'Key': object_key, 'ContentType': content_type}, + ExpiresIn=expiration + ) + return url + except Exception as e: + logging.error(f"Failed to generate presigned URL: {str(e)}") + return None + +# 添加管理员路由 +def add_admin_routes(app, mail, bcrypt): + # 管理员登录装饰器 + def admin_required(f): + @wraps(f) + def decorated_function(*args, **kwargs): + if 'admin_id' not in session: + return redirect(url_for('admin_login')) + return f(*args, **kwargs) + return decorated_function + + @app.route('/admin/add_department', methods=['POST']) + @admin_required + def add_department(): + name = request.form['name'] + conn = get_db_connection() + cursor = conn.cursor() + cursor.execute('INSERT INTO departments (name) VALUES (%s)', (name,)) + conn.commit() + cursor.close() + conn.close() + flash('Department added successfully', 'success') + return redirect(url_for('admin_panel')) + + @app.route('/admin/add_grade', methods=['POST']) + @admin_required + def add_grade(): + year = request.form['year'] + conn = get_db_connection() + cursor = conn.cursor() + cursor.execute('INSERT INTO grades (year) VALUES (%s)', (year,)) + conn.commit() + cursor.close() + conn.close() + flash('Grade added successfully', 'success') + return redirect(url_for('admin_panel')) + + @app.route('/admin/add_class', methods=['POST']) + @admin_required + def add_class(): + name = request.form['name'] + department_id = request.form['department_id'] + grade_id = request.form['grade_id'] + conn = get_db_connection() + cursor = conn.cursor() + cursor.execute('INSERT INTO classes (name, department_id, grade_id) VALUES (%s, %s, %s)', + (name, department_id, grade_id)) + conn.commit() + cursor.close() + conn.close() + flash('Class added successfully', 'success') + return redirect(url_for('admin_panel')) + + @app.route('/admin/add_teacher', methods=['POST']) + @admin_required + def add_teacher(): + name = request.form['name'] + email = request.form['email'] + password = bcrypt.generate_password_hash(request.form['password']).decode('utf-8') + conn = get_db_connection() + cursor = conn.cursor() + cursor.execute('INSERT INTO teachers (name, email, password) VALUES (%s, %s, %s)', + (name, email, password)) + conn.commit() + cursor.close() + conn.close() + flash('Teacher added successfully', 'success') + return redirect(url_for('admin_panel')) + + @app.route('/admin/add_administrator', methods=['POST']) + @admin_required + def add_administrator(): + username = request.form['username'] + password = bcrypt.generate_password_hash(request.form['password']).decode('utf-8') + teacher_id = request.form['teacher_id'] + conn = get_db_connection() + cursor = conn.cursor() + cursor.execute('INSERT INTO administrators (username, password, teacher_id) VALUES (%s, %s, %s)', + (username, password, teacher_id)) + conn.commit() + cursor.close() + conn.close() + flash('Administrator added successfully', 'success') + return redirect(url_for('admin_panel')) + + @app.route('/admin/assign_teacher', methods=['POST']) + @admin_required + def assign_teacher(): + class_id = request.form['class_id'] + teacher_id = request.form['teacher_id'] + conn = get_db_connection() + cursor = conn.cursor() + cursor.execute('INSERT INTO class_teacher (class_id, teacher_id) VALUES (%s, %s)', (class_id, teacher_id)) + conn.commit() + cursor.close() + conn.close() + flash('Teacher assigned to class successfully', 'success') + return redirect(url_for('admin_panel')) + + @app.route('/admin/login', methods=['GET', 'POST']) + def admin_login(): + if request.method == 'POST': + username = request.form['username'] + password = request.form['password'] + admin = validate_admin(username, password) + if admin: + session['admin_id'] = admin['id'] + return redirect(url_for('admin_panel')) + else: + flash('Invalid credentials', 'error') + return render_template('admin_login.html') + + @app.route('/admin/logout') + def admin_logout(): + session.pop('admin_id', None) + return redirect(url_for('admin_login')) + + @app.route('/admin/panel') + @admin_required + def admin_panel(): + # Retrieve necessary data (e.g., departments, grades, classes, etc.) + departments = fetch_all_departments() + grades = fetch_all_grades() + classes = fetch_all_classes() + teachers = fetch_all_teachers() + return render_template('admin_panel.html', departments=departments, grades=grades, classes=classes, teachers=teachers) + + @app.route('/admin/add_assignment', methods=['POST']) + @admin_required + def admin_add_assignment(): + value = request.form['value'] + name = request.form['name'] + deadline = request.form['deadline'] + conn = get_db_connection() + cursor = conn.cursor() + cursor.execute('INSERT INTO assignments (value, name, deadline) VALUES (%s, %s, %s)', (value, name, deadline)) + conn.commit() + cursor.close() + conn.close() + flash('Assignment added successfully', 'success') + return redirect(url_for('admin_panel')) + + @app.route('/login', methods=['GET', 'POST']) + def login(): + if request.method == 'POST': + student_id = request.form.get('student_id') + password = request.form.get('password') + student = validate_student(student_id, password, bcrypt) + if student: + session['student_id'] = student['id'] + session['student_name'] = student['name'] + return redirect(url_for('serve_index')) + else: + return render_template('login.html', error='学号或密码错误') + return render_template('login.html') + + @app.route('/reset-password', methods=['GET', 'POST']) + def reset_password(): + if request.method == 'POST': + student_id = request.form.get('student_id') + email = request.form.get('email') + code = request.form.get('code') + new_password = request.form.get('new_password') + if code: + if session.get('reset_code') == code and session.get('reset_student_id') == student_id: + conn = get_db_connection() + cursor = conn.cursor() + hashed_password = bcrypt.generate_password_hash(new_password).decode('utf-8') + cursor.execute('UPDATE students SET password = %s WHERE id = %s', (hashed_password, student_id)) + conn.commit() + cursor.close() + conn.close() + return render_template('login.html', success='密码已成功重置,请使用新密码登录') + else: + return render_template('reset_password.html', error='验证码错误') + else: + conn = get_db_connection() + cursor = conn.cursor(dictionary=True) + cursor.execute('SELECT * FROM students WHERE id = %s AND email = %s', (student_id, email)) + student = cursor.fetchone() + cursor.close() + conn.close() + if student: + reset_code = ''.join(random.choices('0123456789', k=6)) + session['reset_code'] = reset_code + session['reset_student_id'] = student_id + try: + msg = Message('重置密码验证码', recipients=[email]) + msg.body = f'您用于重置密码的验证码是: {reset_code}' + mail.send(msg) + return render_template('reset_password.html', + success='验证码已发送到您的邮箱,请检查并输入验证码') + except Exception as e: + logging.error(f"Error sending email: {str(e)}") + return render_template('reset_password.html', error='发送验证码失败,请稍后再试') + else: + return render_template('reset_password.html', error='学号和邮箱不匹配') + return render_template('reset_password.html') + + @app.route('/record-submission', methods=['POST']) + def record_submission(): + data = request.json + student_id = session.get('student_id') + student_name = session.get('student_name') + assignment = data.get('assignment') + filename = data.get('filename') + + if not student_id or not filename or not assignment: + return jsonify({'error': 'Student_id, assignment and filename parameters are required'}), 400 + + conn = get_db_connection() + cursor = conn.cursor(dictionary=True) + cursor.execute('SELECT * FROM submissions WHERE student_id = %s AND assignment_id = %s', + (student_id, assignment)) + submission = cursor.fetchone() + cursor.close() + conn.close() + + if submission: + session['filename'] = filename # 将文件名保存到session + return jsonify({'error': '作业已提交过,需要验证码'}), 401 + + # 生成 pre-signed URL 并记录提交 + new_filename = f'{student_id}_{student_name}_{assignment}' + folder_name = f'sure_homework_define_by_qin/{assignment}' + object_key = f'{folder_name}/{new_filename}' + url = generate_presigned_url(object_key, 'application/octet-stream') + + if not url: + logging.error("Failed to generate presigned URL") + return jsonify({'error': 'Failed to generate presigned URL'}), 500 + + add_or_update_submission(student_id, assignment, filename, code_verified=False) + return jsonify({'status': 'success', 'upload_url': url}) + + @app.route('/generate-code', methods=['POST']) + def generate_code(): + student_id = session.get('student_id') + assignment = request.json.get('assignment') + + conn = get_db_connection() + cursor = conn.cursor(dictionary=True) + cursor.execute('SELECT email FROM students WHERE id = %s', (student_id,)) + student = cursor.fetchone() + cursor.close() + conn.close() + + if not student: + return jsonify({'error': '学生信息未找到'}), 404 + + email = student['email'] + reset_code = ''.join(random.choices('0123456789', k=6)) + session['submission_code'] = reset_code + session['submission_student_id'] = student_id + session['submission_assignment'] = assignment + + try: + msg = Message('提交作业验证码', recipients=[email]) + msg.body = f'您用于提交作业的验证码是: {reset_code}' + mail.send(msg) + return jsonify({'status': '验证码已发送到您的邮箱,请检查并输入验证码'}) + except Exception as e: + logging.error(f"Error sending email: {str(e)}") + return jsonify({'error': '发送验证码失败,请稍后再试'}), 500 + + @app.route('/validate-code', methods=['POST']) + def validate_code(): + request_data = request.json + student_id = session.get('student_id') + assignment = request_data.get('assignment') + code = request_data.get('code') + + if (code == session.get('submission_code') and + student_id == session.get('submission_student_id') and + assignment == session.get('submission_assignment')): + + filename = session.pop('filename', None) + new_filename = f'{student_id}_{session.get("student_name")}_{assignment}' + folder_name = f'sure_homework_define_by_qin/{assignment}' + object_key = f'{folder_name}/{new_filename}' + + logging.info(f"Generated object_key: {object_key}") + + url = generate_presigned_url(object_key, 'application/octet-stream') + + if not url: + logging.error("Failed to generate presigned URL") + return jsonify({'error': 'Failed to generate presigned URL'}), 500 + + # 调用 add_or_update_submission 函数来更新数据库记录 + add_or_update_submission(student_id, assignment, filename, code_verified=True) + + # 删除session中的凭据 + session.pop('submission_code', None) + session.pop('submission_student_id', None) + session.pop('submission_assignment', None) + session['validated_assignment'] = assignment + session['validation_presigned_url'] = url + return jsonify({'status': '成功', 'upload_url': url}) + else: + return jsonify({'error': '验证码错误'}), 400 + + @app.route('/api/submissions') + def get_submissions(): + try: + conn = get_db_connection() + cursor = conn.cursor(dictionary=True) + cursor.execute(""" + SELECT + sh.submit_date AS 时间, + sh.filename AS 提交的文件, + s.name AS 姓名, + s.id AS 学号, + sh.assignment_id AS 作业 + FROM submission_history sh + JOIN students s ON sh.student_id = s.id + ORDER BY sh.submit_date DESC + """) + submissions = cursor.fetchall() + cursor.close() + conn.close() + + # 格式化日期时间 + for sub in submissions: + sub['时间'] = sub['时间'].strftime('%Y-%m-%d %H:%M:%S') if sub['时间'] else None + + return jsonify(submissions) + except Exception as e: + logging.error(f"Error in get_submissions: {str(e)}", exc_info=True) + return jsonify({'error': str(e)}), 500 + + @app.route('/api/assignment-status') + def get_assignment_status(): + try: + conn = get_db_connection() + cursor = conn.cursor(dictionary=True) + cursor.execute(""" + SELECT + s.id AS 学号, + s.name AS 姓名, + a.assignment_id AS 作业, + CASE WHEN sub.id IS NOT NULL THEN '已提交' ELSE '未提交' END AS 提交情况, + COALESCE(sub.filename, '') AS 提交的文件 + FROM students s + CROSS JOIN (SELECT DISTINCT assignment_id FROM submissions) a + LEFT JOIN submissions sub ON s.id = sub.student_id AND a.assignment_id = sub.assignment_id + ORDER BY s.id, a.assignment_id + """) + status_data = cursor.fetchall() + cursor.close() + conn.close() + + return jsonify(status_data) + except Exception as e: + logging.error(f"Error in get_assignment_status: {str(e)}", exc_info=True) + return jsonify({'error': str(e)}), 500 + + @app.route('/download-submissions') + def download_submissions(): + try: + conn = get_db_connection() + cursor = conn.cursor(dictionary=True) + cursor.execute(""" + SELECT + sh.submit_date AS 时间, + sh.filename AS 提交的项目, + s.name AS 姓名, + s.id AS 学号, + sh.assignment_id AS 作业 + FROM submission_history sh + JOIN students s ON sh.student_id = s.id + ORDER BY sh.submit_date DESC + """) + submissions = cursor.fetchall() + cursor.close() + conn.close() + + # 创建 DataFrame + df = pd.DataFrame(submissions) + + # 格式化日期时间 + df['时间'] = pd.to_datetime(df['时间']).dt.strftime('%Y-%m-%d %H:%M:%S') + + # 确保列的顺序 + df = df[['时间', '提交的项目', '姓名', '学号', '作业']] + + # 创建一个 BytesIO 对象,用于存储 Excel 文件 + output = io.BytesIO() + + # 使用 ExcelWriter 来设置列宽 + with pd.ExcelWriter(output, engine='xlsxwriter') as writer: + df.to_excel(writer, sheet_name='提交记录', index=False) + worksheet = writer.sheets['提交记录'] + + # 设置列宽 + worksheet.set_column('A:A', 20) # 时间 + worksheet.set_column('B:B', 30) # 提交的项目 + worksheet.set_column('C:C', 15) # 姓名 + worksheet.set_column('D:D', 15) # 学号 + worksheet.set_column('E:E', 20) # 作业 + + output.seek(0) + + return send_file( + output, + as_attachment=True, + download_name='submissions.xlsx', + mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' + ) + except Exception as e: + logging.error(f"Error in download_submissions: {str(e)}", exc_info=True) + return jsonify({'error': str(e)}), 500 + + @app.route('/download-assignment-status') + def download_assignment_status(): + try: + conn = get_db_connection() + cursor = conn.cursor(dictionary=True) + cursor.execute(""" + SELECT + s.id AS 学号, + s.name AS 姓名, + COALESCE(sub.assignment_id, 'No assignment') AS 作业, + CASE WHEN sub.id IS NOT NULL THEN '已提交' ELSE '未提交' END AS 作业提交情况, + COALESCE(sub.filename, '') AS 提交的项目, + COALESCE(sub.submit_date, '') AS 提交时间 + FROM students s + LEFT JOIN submissions sub ON s.id = sub.student_id + ORDER BY s.id, sub.assignment_id + """) + status_data = cursor.fetchall() + cursor.close() + conn.close() + + df = pd.DataFrame(status_data) + + # 格式化日期时间 + df['提交时间'] = pd.to_datetime(df['提交时间']).dt.strftime('%Y-%m-%d %H:%M:%S') + + # 确保列的顺序 + df = df[['学号', '姓名', '作业', '作业提交情况', '提交的项目', '提交时间']] + + output = io.BytesIO() + with pd.ExcelWriter(output, engine='xlsxwriter') as writer: + df.to_excel(writer, sheet_name='作业提交情况', index=False) + worksheet = writer.sheets['作业提交情况'] + + # 设置列宽 + worksheet.set_column('A:A', 15) # 学号 + worksheet.set_column('B:B', 10) # 姓名 + worksheet.set_column('C:C', 15) # 作业 + worksheet.set_column('D:D', 12) # 作业提交情况 + worksheet.set_column('E:E', 30) # 提交的项目 + worksheet.set_column('F:F', 20) # 提交时间 + + output.seek(0) + + return send_file( + output, + as_attachment=True, + download_name='assignment_status.xlsx', + mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' + ) + except Exception as e: + logging.error(f"Error in download_assignment_status: {str(e)}", exc_info=True) + return jsonify({'error': str(e)}), 500 + + @app.route('/') + def serve_index(): + if 'student_id' not in session: + return redirect(url_for('login')) + conn = get_db_connection() + cursor = conn.cursor(dictionary=True) + cursor.execute('SELECT * FROM assignments ORDER BY deadline') + assignments = cursor.fetchall() + cursor.close() + conn.close() + return render_template('index.html', assignments=assignments) + + @app.route('/logout') + def logout(): + session.clear() + return redirect(url_for('login')) + + def _build_cors_preflight_response(): + response = make_response() + response.headers.add("Access-Control-Allow-Origin", "*") + response.headers.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS") + response.headers.add("Access-Control-Allow-Headers", "Content-Type") + return response + +# 教师管理路由 +def add_teacher_routes(app, mail, bcrypt): + # 教师登录装饰器 + def teacher_required(f): + @wraps(f) + def decorated_function(*args, **kwargs): + if 'teacher_id' not in session: + return redirect(url_for('teacher_login')) + return f(*args, **kwargs) + return decorated_function + + # Teacher Login Route + @app.route('/teacher/login', methods=['GET', 'POST']) + def teacher_login(): + if request.method == 'POST': + email = request.form['email'] + password = request.form['password'] + teacher = validate_teacher(email, password, bcrypt) + if teacher: + session['teacher_id'] = teacher['id'] + return redirect(url_for('teacher_panel')) + else: + flash('Invalid credentials', 'error') + return render_template('teacher_login.html') + + @app.route('/teacher/logout') + def teacher_logout(): + session.pop('teacher_id', None) + return redirect(url_for('teacher_login')) + + @app.route('/teacher/panel') + @teacher_required + def teacher_panel(): + # Fetch the classes this teacher is responsible for + teacher_id = session['teacher_id'] + classes = fetch_teacher_classes(teacher_id) + return render_template('teacher_panel.html', classes=classes) + + @app.route('/teacher/class/') + @teacher_required + def view_class(class_id): + # Fetch the assignments and students of the class + assignments = fetch_class_assignments(class_id) + students = fetch_class_students(class_id) + return render_template('class_detail.html', assignments=assignments, students=students, class_id=class_id) + + @app.route('/teacher/class//add_assignment', methods=['POST']) + @teacher_required + def teacher_add_assignment(class_id): + # Adding a new assignment to the class + value = request.form['value'] + name = request.form['name'] + deadline = request.form['deadline'] + conn = get_db_connection() + cursor = conn.cursor() + cursor.execute('INSERT INTO assignments (value, name, deadline, class_id) VALUES (%s, %s, %s, %s)', (value, name, deadline, class_id)) + conn.commit() + cursor.close() + conn.close() + flash('Assignment added successfully', 'success') + return redirect(url_for('view_class', class_id=class_id)) + + @app.route('/teacher/edit_assignment/', methods=['POST']) + def edit_assignment(assignment_id): + new_deadline = request.json.get('deadline') + if new_deadline: + conn = get_db_connection() + cursor = conn.cursor() + cursor.execute('UPDATE assignments SET deadline = %s WHERE id = %s', (new_deadline, assignment_id)) + conn.commit() + cursor.close() + conn.close() + return jsonify({'status': 'success'}) + return jsonify({'error': 'Invalid deadline'}), 400 + + @app.route('/teacher/delete_assignment/', methods=['DELETE']) + def delete_assignment(assignment_id): + conn = get_db_connection() + cursor = conn.cursor() + cursor.execute('DELETE FROM assignments WHERE id = %s', (assignment_id,)) + conn.commit() + cursor.close() + conn.close() + return jsonify({'status': 'success'}) + diff --git a/ccc.py b/ccc.py new file mode 100644 index 0000000..c8aae87 --- /dev/null +++ b/ccc.py @@ -0,0 +1,69 @@ +import os +from docx import Document + + +def find_files(start_path, extensions): + """ + 遍历目录并找到指定扩展名的文件。 + + :param start_path: 起始路径 + :param extensions: 需要查找的文件扩展名列表 + :return: 文件路径列表 + """ + file_list = [] + for root, dirs, files in os.walk(start_path): + for file in files: + if any(file.endswith(ext) for ext in extensions): + file_list.append(os.path.join(root, file)) + return file_list + + +def read_files(file_list): + """ + 读取文件内容。 + + :param file_list: 文件路径列表 + :return: 文件内容字典 + """ + content_dict = {} + for file_path in file_list: + with open(file_path, 'r', encoding='utf-8') as file: + content_dict[file_path] = file.read() + return content_dict + + +def save_to_docx(content_dict, output_file): + """ + 将文件内容字典保存到 DOCX 文件。 + + :param content_dict: 文件内容字典 + :param output_file: 输出的 DOCX 文件名 + """ + doc = Document() + for file_path, content in content_dict.items(): + doc.add_heading(file_path, level=1) + doc.add_paragraph(content) + doc.add_page_break() # 添加分页符 + doc.save(output_file) + + +if __name__ == "__main__": + # 需要遍历的目录 + directory = '/Users/lishunqin/Desktop/study/pychram project/AWS-sure' + + # 需要查找的文件扩展名 + extensions = ['.py', '.html', '.env', '.css', 'js'] + + # 查找文件 + files = find_files(directory, extensions) + + # 读取文件内容 + content_dict = read_files(files) + + # 输出 DOCX 文件名 + output_docx = 'output_files_content.docx' + + # 保存到 DOCX 文件 + save_to_docx(content_dict, output_docx) + + print(f"找到 {len(files)} 个文件,并保存了内容到 {output_docx}") diff --git a/database.py b/database.py new file mode 100644 index 0000000..5c9840a --- /dev/null +++ b/database.py @@ -0,0 +1,280 @@ +import os +import mysql.connector +from flask import Flask, request, jsonify, session, redirect, url_for, render_template +from flask_bcrypt import Bcrypt +from some_module_to_verify_code import verify_code # 假设你有相应的模块 +import datetime +import random +import logging +from flask_mail import Mail, Message +import boto3 +from botocore.client import Config +import csv + +# 初始化 Flask 和 Bcrypt +app = Flask(__name__) +bcrypt = Bcrypt(app) +mail = Mail(app) + +# 配置日志 +logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s') + +# 配置 AWS S3 +aws_access_key_id = os.getenv('AWS_ACCESS_KEY_ID') +aws_secret_access_key = os.getenv('AWS_SECRET_ACCESS_KEY') +region_name = os.getenv('AWS_REGION') +bucket_name = os.getenv('S3_BUCKET_NAME') + +# 初始化S3客户端 +s3_client = boto3.client( + 's3', + aws_access_key_id=aws_access_key_id, + aws_secret_access_key=aws_secret_access_key, + region_name=region_name, + config=Config(signature_version='s3v4') +) + +# 初始化 CSV 文件 +submissions_file = 'submissions.csv' +if not os.path.exists(submissions_file): + with open(submissions_file, 'w', newline='') as file: + writer = csv.writer(file) + writer.writerow(['ID', '学生姓名', '学号', '作业', '提交的文件']) + + +# 数据库连接函数 +def get_db_connection(): + return mysql.connector.connect( + host='8.218.165.242', + user='sure_001', + password='EKKWLMmrGmG7sdPf', + database='sure_001' + ) + + +# 验证学生身份 +def validate_student(student_id, password): + conn = get_db_connection() + cursor = conn.cursor(dictionary=True) + cursor.execute('SELECT * FROM students WHERE id = %s', (student_id,)) + student = cursor.fetchone() + cursor.close() + conn.close() + if student and bcrypt.check_password_hash(student['password'], password): + return student + return None + + +# 检查作业提交 +def check_submission(student_id, assignment_id): + conn = get_db_connection() + cursor = conn.cursor(dictionary=True) + cursor.execute('SELECT * FROM submissions WHERE student_id = %s AND assignment_id = %s', + (student_id, assignment_id)) + submission = cursor.fetchone() + cursor.close() + conn.close() + return submission + + +# 添加或更新作业提交 +def add_or_update_submission(student_id, assignment_id, filename, code_verified=False): + conn = get_db_connection() + cursor = conn.cursor() + if code_verified: + cursor.execute( + 'UPDATE submissions SET submit_date = NOW(), filename = %s WHERE student_id = %s AND assignment_id = %s', + (filename, student_id, assignment_id)) + else: + cursor.execute( + 'INSERT INTO submissions (student_id, assignment_id, filename, submit_date) VALUES (%s, %s, %s, NOW())', + (student_id, assignment_id, filename)) + conn.commit() + cursor.close() + conn.close() + +def fetch_all_departments(): + conn = get_db_connection() + cursor = conn.cursor(dictionary=True) + cursor.execute('SELECT * FROM departments') + departments = cursor.fetchall() + cursor.close() + conn.close() + return departments + +def fetch_all_grades(): + conn = get_db_connection() + cursor = conn.cursor(dictionary=True) + cursor.execute('SELECT * FROM grades') + grades = cursor.fetchall() + cursor.close() + conn.close() + return grades + +def fetch_all_classes(): + conn = get_db_connection() + cursor = conn.cursor(dictionary=True) + cursor.execute('SELECT * FROM classes') + classes = cursor.fetchall() + cursor.close() + conn.close() + return classes + +def fetch_all_teachers(): + conn = get_db_connection() + cursor = conn.cursor(dictionary=True) + cursor.execute('SELECT * FROM teachers') + teachers = cursor.fetchall() + cursor.close() + conn.close() + return teachers + + + +# 生成预签名URL +def generate_presigned_url(object_key, content_type): + try: + url = s3_client.generate_presigned_url( + 'put_object', + Params={'Bucket': bucket_name, 'Key': object_key, 'ContentType': content_type}, + ExpiresIn=3600 + ) + return url + except Exception as e: + logging.error(f"Failed to generate presigned URL: {str(e)}") + return None + + +# 提交作业路由 +@app.route('/submit-assignment', methods=['POST']) +def submit_assignment(): + student_id = request.form.get('student_id') + assignment_id = request.form.get('assignment_id') + filename = request.form.get('filename') + + submission = check_submission(student_id, assignment_id) + + if submission: + # 要求用户输入验证码 + email = request.form.get('email') + code = request.form.get('code') + if verify_code(email, code): + add_or_update_submission(student_id, assignment_id, filename, code_verified=True) + else: + add_or_update_submission(student_id, assignment_id, filename, code_verified=False) + + return 'Submission successful' + + +# 登录路由 +@app.route('/login', methods=['GET', 'POST']) +def login(): + if request.method == 'POST': + student_id = request.form.get('student_id') + password = request.form.get('password') + student = validate_student(student_id, password) + if student: + session['student_id'] = student['id'] + session['student_name'] = student['name'] + return redirect(url_for('serve_index')) + else: + return render_template('login.html', error='学号或密码错误') + return render_template('login.html') + + +# 重置密码路由 +@app.route('/reset-password', methods=['GET', 'POST']) +def reset_password(): + if request.method == 'POST': + student_id = request.form.get('student_id') + email = request.form.get('email') + conn = get_db_connection() + cursor = conn.cursor(dictionary=True) + cursor.execute('SELECT * FROM students WHERE id = %s AND email = %s', (student_id, email)) + student = cursor.fetchone() + cursor.close() + conn.close() + + if student: + reset_code = ''.join(random.choices('0123456789', k=6)) + session['reset_code'] = reset_code + session['reset_student_id'] = student_id + try: + msg = Message('重置密码验证码', recipients=[email]) + msg.body = f'您用于重置密码的验证码是: {reset_code}' + mail.send(msg) + return render_template('reset_password.html', success='验证码已发送到您的邮箱,请检查并输入验证码') + except Exception as e: + logging.error(f"Error sending email: {str(e)}") + return render_template('reset_password.html', error='发送验证码失败,请稍后再试') + else: + return render_template('reset_password.html', error='学号和邮箱不匹配') + return render_template('reset_password.html') + + +# 提交记录路由 +@app.route('/record-submission', methods=['POST']) +def record_submission(): + data = request.json + student_id = session.get('student_id') + student_name = session.get('student_name') + assignment = data.get('assignment') + filename = data.get('filename') + + if not student_id or not filename or not assignment: + return jsonify({'error': 'Student_id, assignment and filename parameters are required'}), 400 + + # Check if the student has already submitted this assignment + submission = check_submission(student_id, assignment) + if submission: + session['filename'] = filename + return jsonify({'error': '作业已提交过,需要验证码'}), 401 + + # 生成 pre-signed URL 并记录提交 + new_filename = f'{student_id}_{student_name}_{assignment}' + folder_name = f'sure_homework_define_by_qin/{assignment}' + object_key = f'{folder_name}/{new_filename}' + url = generate_presigned_url(object_key, 'application/octet-stream') + + if not url: + logging.error("Failed to generate presigned URL") + return jsonify({'error': 'Failed to generate presigned URL'}), 500 + + add_or_update_submission(student_id, assignment, filename) + return jsonify({'status': 'success', 'upload_url': url}) + + +# 生成验证码路由 +@app.route('/generate-code', methods=['POST']) +def generate_code(): + student_id = session.get('student_id') + assignment = request.json.get('assignment') + + conn = get_db_connection() + cursor = conn.cursor(dictionary=True) + cursor.execute('SELECT email FROM students WHERE id = %s', (student_id,)) + student = cursor.fetchone() + cursor.close() + conn.close() + + if not student: + return jsonify({'error': '学生信息未找到'}), 404 + + email = student['email'] + reset_code = ''.join(random.choices('0123456789', k=6)) + session['submission_code'] = reset_code + session['submission_student_id'] = student_id + session['submission_assignment'] = assignment + + try: + msg = Message('提交验证码', recipients=[email]) + msg.body = f'您用于提交作业的验证码是: {reset_code}' + mail.send(msg) + return jsonify({'status': '验证码已发送到您的邮箱'}) + except Exception as e: + logging.error(f"Error sending email: {str(e)}") + return jsonify({'error': '发送验证码失败,请稍后再试'}), 500 + + +if __name__ == '__main__': + app.run(debug=True) diff --git a/edit_admin_info.py b/edit_admin_info.py new file mode 100644 index 0000000..d19315f --- /dev/null +++ b/edit_admin_info.py @@ -0,0 +1,46 @@ +from flask_bcrypt import Bcrypt +import mysql.connector + +# Initialize Bcrypt +bcrypt = Bcrypt() + +# Database connection details +MYSQL_HOST = '8.218.165.242' +MYSQL_USER = 'sure_001' +MYSQL_PASSWORD = 'EKKWLMmrGmG7sdPf' +MYSQL_DB = 'sure_001' + +# Function to get database connection +def get_db_connection(): + return mysql.connector.connect( + host=MYSQL_HOST, + user=MYSQL_USER, + password=MYSQL_PASSWORD, + database=MYSQL_DB + ) + +# Function to update admin password +def update_teacher_password(teacher_id, new_plain_password): + conn = get_db_connection() + cursor = conn.cursor() + + # Generate new hashed password + hashed_password = bcrypt.generate_password_hash(new_plain_password).decode('utf-8') + + # Update password in the database + cursor.execute( + 'UPDATE teachers SET password = %s WHERE id = %s', + (hashed_password, teacher_id) + ) + + # Commit changes and close the connection + conn.commit() + cursor.close() + conn.close() + +# Example: Updating the password for admin with ID 1 +if __name__ == "__main__": + tid = 1 # The ID of the admin to update + new_password = 'xiaoyan99817' # The new plain password you want to set + update_teacher_password(tid, new_password) + print(f"Password for admin with ID {tid} has been updated.") diff --git a/flask_session/0f9028b75157442ffeb13d3d89859e37 b/flask_session/0f9028b75157442ffeb13d3d89859e37 new file mode 100644 index 0000000000000000000000000000000000000000..bf1eb9ce01bc268ee3380c0cc5722e01c59978a1 GIT binary patch literal 67 zcmeyXu`8{Cb*c#i1k_H^=;10ZDNRYuD~ZocnbN~zXkcJ4rH2P5mY0~DI;Ds6+1$RD N3wOPov}{VL9smuq8iW7< literal 0 HcmV?d00001 diff --git a/flask_session/121e2e6237f93addcf2c8d3d0f754de5 b/flask_session/121e2e6237f93addcf2c8d3d0f754de5 new file mode 100644 index 0000000000000000000000000000000000000000..ced0b3035a26f9619a9f78baec7e4f5379dbd04b GIT binary patch literal 67 zcmXrneJHJgb*c#i1k_H^=;10ZDNRYuD~ZocnbN~zXkcJ4rH2P5mY0~DI;Ds6+1$RD N3wOPov}{VL9smIb8dd-R literal 0 HcmV?d00001 diff --git a/flask_session/1bcc7dc1ae94d369f266fc6c335f304f b/flask_session/1bcc7dc1ae94d369f266fc6c335f304f new file mode 100644 index 0000000000000000000000000000000000000000..440f873b9aa070c75af5ba229146392017e6dedb GIT binary patch literal 72 zcmeylZF^b+>r_hy2&kQ+(Zf|-Qks&QR}!C@GNp&d$iT?R(7?a~L;<-lxxB>O)G0k| O&!)9MU*0gKR1W}gWg0^O literal 0 HcmV?d00001 diff --git a/flask_session/1dd18bd3439eb0ac9a5742e2231f6172 b/flask_session/1dd18bd3439eb0ac9a5742e2231f6172 new file mode 100644 index 0000000000000000000000000000000000000000..e4c0bc3f7a880b1ac637297f59c8e0c430b7571b GIT binary patch literal 67 zcmdlHy(_JOb*c#i1k_H^=;10ZDNRYuD~ZocnbN~zXkcJ4rH2P5mY0~DI;Ds6+1$RD N3wOPov}{VL9smf+8gc*t literal 0 HcmV?d00001 diff --git a/flask_session/2029240f6d1128be89ddc32729463129 b/flask_session/2029240f6d1128be89ddc32729463129 new file mode 100644 index 0000000000000000000000000000000000000000..bf37ad61a06b251f22092b4daade76631ba61edd GIT binary patch literal 9 QcmZQzU|?uq^)}E000ayHF8}}l literal 0 HcmV?d00001 diff --git a/flask_session/230a5611f6ae17aede03b96deb47fff3 b/flask_session/230a5611f6ae17aede03b96deb47fff3 new file mode 100644 index 0000000000000000000000000000000000000000..6468b0d90b94cc9b10b37e5752e210de0ef994b2 GIT binary patch literal 67 zcmY!p-j&wCI@N>$0&1sd^l%lIl%}NSmBeSJOzB}UG%zrj(!&E2%S+5nozlbkY;NDn Ng}Yu(S~jIr4*<_^8I}M5 literal 0 HcmV?d00001 diff --git a/flask_session/32dcb849af4ca45626677d9fb3bd4768 b/flask_session/32dcb849af4ca45626677d9fb3bd4768 new file mode 100644 index 0000000000000000000000000000000000000000..5a289aab5788917d19319e74be9c95aac641981a GIT binary patch literal 198 zcmaEvwj-^9b?SBo2&kQ+(Zf|-Qks&QR}!C@GNp&b(7?c8N)HcAEH5!PbxIHCv$=gQ z7w&pFY1xz>j4j>YB8lp03upkQks&QR}!C@ PGNp&b(7?c8N~sa literal 0 HcmV?d00001 diff --git a/flask_session/35f86e813ab1fdd9f718aef70f2447b1 b/flask_session/35f86e813ab1fdd9f718aef70f2447b1 new file mode 100644 index 0000000000000000000000000000000000000000..3689e9a195a3905e62eef42b3078ab3709a21918 GIT binary patch literal 115 zcmbQce|uU3>(mqm2&kQ+(Zf}gTAW%EpPZkPI;Drr*u=ox$aG4N07SI7q%*b_nQ%dy!Bu6Y% literal 0 HcmV?d00001 diff --git a/flask_session/37ddbf9efe72bdf64d50c9a4ca92bc2e b/flask_session/37ddbf9efe72bdf64d50c9a4ca92bc2e new file mode 100644 index 0000000000000000000000000000000000000000..113f7b7d4fe578d1c30326da70208985edcb3c6c GIT binary patch literal 68 zcmdnJb9-6?>r_()2&kQ+(Zf}gTAW%EpPZkPI;Drr#Ms=(*l0?R07SI7q%r_()2&kQ+(Zf}gTAW%EpPZkPI;Drr%-qD>*lbFV07SI7q%AxPR8nbKA$Q?YatPI6D0i}}~w8^;+a^Z|kk ziOVkB_z-;{p>N?$o#|a2zWe(=&iOWbciGL}uh&l}5AS+-*S`?5V_37Y({IV*QS0Q;_;;L@H(xHE|MR;AsO^YL> z=&mh>^V=trNiJn0-W$dhuXKq*>KQLk7i%H0oC<3SC2Z;nR$`jgr6IZ&<6U^nFyj@* z$vReUV<%H%Tszk0t`^KRf3D2~Euz|fG!B8OMebt){cx^FQ?3m z>Kv*BVU6la*l~+jojP)xI#b1kJL4HO9g~ua?ce-+!&O_M)`Z0FoK&qy~!1a;&G;v%C6jNfSHcJ3lkU(m(#P>W8Qx|*(0WI*sa_uaj O7RyrG@d!zWZu$>f{$0&1sd^l%lIl%}NSmBeSJOzB}UG%zrj(!&E2%S+5nozlbkY;NDn Ng}Yu(S~jIr4*=Rf8NUDk literal 0 HcmV?d00001 diff --git a/flask_session/4feab7ace0e99d4bd4371560894aaa18 b/flask_session/4feab7ace0e99d4bd4371560894aaa18 new file mode 100644 index 0000000000000000000000000000000000000000..0d38b2cb2b4e076212f581796d86db57994cdcd7 GIT binary patch literal 48 ucmWI7{*l(eI#rPY0&1sd^l&7m$0&1sd^l%lIl%}NSmBeSJOzB}UG%zrj(!&E2%S+5nozlbkY;NDn Ng}Yu(S~jIr4*=Lw8My!e literal 0 HcmV?d00001 diff --git a/flask_session/6c904875ff094c84e40eb4cb5ba58586 b/flask_session/6c904875ff094c84e40eb4cb5ba58586 new file mode 100644 index 0000000000000000000000000000000000000000..3c3d8128e4f697c59977e2c6fb600b9ab28b1fb7 GIT binary patch literal 548 zcmX|-&uZI15XRlo9$I>Ap)atd7g;N<{#XT3HnD?4l0tAwLoQrP3{jN+*K%-7^Pc z+;^{btYRhf-HX3>KOTPHKm7dDcdxHmAvn{(6Q-27tV%O$B)KeMC7Z9L@7``DLRLxL zz#uZ}wki7ayC7y!yO9-Jsqs>lwrU$lcIF9( zOjMAh>%>gkJ520h?F7vN6iv}&hGr3>4%(wb5xIy4j}GMHxkbwxix!u%5jrnp`eor+ z^AoynE#}nqgLnT0`wa}K2v)@O=#XBVlIa;aIz9|O`NyZ9Pmp`yV%Ni=DyRwWyq z12gA11}HMnmGY7Xu3B^C)^%!vi+6)(jz@grU2J=^Z?!OK#U#LZix!*c=D;{KDqhM; zo0TlRt^tv~Tt3vdE{;=&Ip;{ OB}8lzr5=y^cKi=!F}Mx@ literal 0 HcmV?d00001 diff --git a/flask_session/6cafcac3319918665aaf1772f04b8432 b/flask_session/6cafcac3319918665aaf1772f04b8432 new file mode 100644 index 0000000000000000000000000000000000000000..6578cf16a75ea7001c7c245b1035ca44be649922 GIT binary patch literal 67 zcmey(u`8{Cb*c#i1k_H^=;10ZDNRYuD~ZocnbN~zXkcJ4rH2P5mY0~DI;Ds6+1$RD N3wOPov}{VL9smUG8e#wd literal 0 HcmV?d00001 diff --git a/flask_session/6f977085e9c72d687e7a132ccfbf6f88 b/flask_session/6f977085e9c72d687e7a132ccfbf6f88 new file mode 100644 index 0000000000000000000000000000000000000000..cca7fd626fdda26d69613b91fb2b18b70688f3ae GIT binary patch literal 67 zcmdN$-;vh9I@N>$0&1sd^l%lIl%}NSmBeSJOzB}UG%zrj(!&E2%S+5nozlbkY;NDn Ng}Yu(S~jIr4*=z%8SDT6 literal 0 HcmV?d00001 diff --git a/flask_session/6fecf9b935f7299d56f4a6324bc1b56c b/flask_session/6fecf9b935f7299d56f4a6324bc1b56c new file mode 100644 index 0000000000000000000000000000000000000000..6f778dc454471f5e3d0b681beccb833b02376b65 GIT binary patch literal 28 fcmZp@bSABVbt*3d1k_IHVNFcQ&CHw9QLG05glP#G literal 0 HcmV?d00001 diff --git a/flask_session/70195a82b9eb0295dc9eb356241021e7 b/flask_session/70195a82b9eb0295dc9eb356241021e7 new file mode 100644 index 0000000000000000000000000000000000000000..535a922b8240fcfc99b8274f44cbaf449f6fd48c GIT binary patch literal 67 zcmcb`wJWWGb*c#i1k_H^=;10ZDNRYuD~ZocnbN~zXkcJ4rH2P5mY0~DI;Ds6+1$RD N3wOPov}{VL9svBm8bbg8 literal 0 HcmV?d00001 diff --git a/flask_session/777d3de3359fadd58752eff37b828bd3 b/flask_session/777d3de3359fadd58752eff37b828bd3 new file mode 100644 index 0000000000000000000000000000000000000000..5e6464005c33aad02177d53f095814913b8389da GIT binary patch literal 67 zcmbQoxg)KCb*c#i1k_H^=;10ZDNRYuD~ZocnbN~zXkcJ4rH2P5mY0~DI;Ds6+1$RD N3wOPov}{VL9suk|8Uz3U literal 0 HcmV?d00001 diff --git a/flask_session/7e37cff998297dd71a9e4b115e258f12 b/flask_session/7e37cff998297dd71a9e4b115e258f12 new file mode 100644 index 0000000000000000000000000000000000000000..70e161d8a751d72bcebe649f9ee54881304a7aea GIT binary patch literal 67 zcmca0vMa5Db*c#i1k_H^=;10ZDNRYuD~ZocnbN~zXkcJ4rH2P5mY0~DI;Ds6+1$RD N3wOPov}{VL9svBc8bbg8 literal 0 HcmV?d00001 diff --git a/flask_session/870fe179fe41bf8bd2828724b80ca924 b/flask_session/870fe179fe41bf8bd2828724b80ca924 new file mode 100644 index 0000000000000000000000000000000000000000..57ca09ab2275562920a8605703cca7aa0c0a06fe GIT binary patch literal 67 zcmb$0&1sd^l%lIl%}NSmBeSJOzB}UG%zrj(!&E2%S+5nozlbkY;NDn Ng}Yu(S~jIr4*>er8a)62 literal 0 HcmV?d00001 diff --git a/flask_session/8f3bbee347151cfa1f698678c74250be b/flask_session/8f3bbee347151cfa1f698678c74250be new file mode 100644 index 0000000000000000000000000000000000000000..bb24040923313b69cd761f690182e1a76e109402 GIT binary patch literal 67 zcmb$0&1sd^l%lIl%}NSmBeSJOzB}UG%zrj(!&E2%S+5nozlbkY;NDn Ng}Yu(S~jIr4*>fZ8a@C3 literal 0 HcmV?d00001 diff --git a/flask_session/90f85e48b946465ec01b5b9f7883ebc9 b/flask_session/90f85e48b946465ec01b5b9f7883ebc9 new file mode 100644 index 0000000000000000000000000000000000000000..33627cf2f3057c50dc90b8a84315631fbdd30626 GIT binary patch literal 68 zcmeC!xjn6cb*d=?1k_H^=;10#Elw?oPtH$CozlZ*Y+-6-Y&oSz03upkQks&QR}!C@ PGNp&b(7?c8N~sr_hy2&kQ+(Zf|-Qks&QR}!C@GNp&d$iT?R(7?a~L;<-lxxB>O)G0k| O&!)9MU*0gKR1W}f)*3+o literal 0 HcmV?d00001 diff --git a/flask_session/9b87431787e796d1ee5b357cca183fff b/flask_session/9b87431787e796d1ee5b357cca183fff new file mode 100644 index 0000000000000000000000000000000000000000..471fbd99cf946fe1771050606f4c172f8e159936 GIT binary patch literal 120 zcmb|*Gkr7bb0z^&e;epBJCFX)mdp528`SOM-rFsCbUMp|_ literal 0 HcmV?d00001 diff --git a/flask_session/a7a737b402857b6db6a1d193fa8e823d b/flask_session/a7a737b402857b6db6a1d193fa8e823d new file mode 100644 index 0000000000000000000000000000000000000000..73412d2acd4fac394fa42b81c5c1abd910026da4 GIT binary patch literal 189 zcmWGZ-;vh9I&~cb1k_H^=;10ZDNRYuD~ZocnbN~zXkcJ4rH2P5mY0~DI;Ds6+1$RD z3wOPov}{TbM_Oi1DnyviFST63IU}(|*GR7*FMUc6e{pG2Zf0?DW`16La()U>C!4vE yxrwR8lpaweDVX6v3p1EdWD6gdfpFbSkz3cu}_f+XtK&fLX`tA`% z2=(30Rx5b{efQ+g&DYx>zi+?&?7L^5c`gOlAY!hRJTD95HAq$!u&SC*xbI$U5LuOR z-M|1Dx^43Q^ya~6lxbb7*N$@`OIw4|b}DnQ)mmvN#)^)4!LO>4uhe*16^?2fh_~Uf zfK-+cC+pa_ovngoylSM*iimw! zxc2;r?b(YtBcA{AKd{%p(2C@F#18h^*)g4-(1XK$|DAVu{Qk%yZwVqU3NSV!ukEsG zbOzjPoqB0~f71a+5kW#YJ1=3Gzum-LuW#?6Q`ot%&*vZKTCrb#veX8Wk<8 zQk#`*y{^HcyIFM~J8)c^rlNoX_b4SE1j`VG0t@1W9#4qif-loaf-&JqLi`EhViE>n R>Uw?E{*l(eI@N~(0&1sd^l&8?7p29QXNBKAYS3a^bF*la@{C;YuzpN{cVa&rZ#o(xYKwk(`ufU}9o!U}$0&1sd^l%lIl%}NSmBeSJOzB}UG%zrj(!&E2%S+5nozlbkY;NDn Ng}Yu(S~jIr4*=#Z8SMZ7 literal 0 HcmV?d00001 diff --git a/flask_session/d1ab18f8f028a3781bf8a8cffc4d4f24 b/flask_session/d1ab18f8f028a3781bf8a8cffc4d4f24 new file mode 100644 index 0000000000000000000000000000000000000000..3bdbf91d5795adefedecff2f97e230a64d07817d GIT binary patch literal 67 zcmaFJw=1oIb*c#i1k_H^=;10ZDNRYuD~ZocnbN~zXkcJ4rH2P5mY0~DI;Ds6+1$RD N3wOPov}{VL9svKG8cqNJ literal 0 HcmV?d00001 diff --git a/flask_session/dfb04ede4cc875e045b57e7e1d40d602 b/flask_session/dfb04ede4cc875e045b57e7e1d40d602 new file mode 100644 index 0000000000000000000000000000000000000000..57402b4dc1f7bbf40e1ead1763b83aa3857ad267 GIT binary patch literal 67 zcmZP<+?CeAI@N>$0&1sd^l%lIl%}NSmBeSJOzB}UG%zrj(!&E2%S+5nozlbkY;NDn Ng}Yu(S~jIr4*r_hy2&kQ+(Zf|-Qks&QR}!C@GNp&d$iT?R(7?a~L;<-lxxB>O)G0k| O&!)9MU*0gKR1W}YJsKte literal 0 HcmV?d00001 diff --git a/flask_session/e58189118050886d22b23b51e8651460 b/flask_session/e58189118050886d22b23b51e8651460 new file mode 100644 index 0000000000000000000000000000000000000000..ecbf6782e6563228c84320398fdecc7d8bede5bb GIT binary patch literal 76 zcmZQPa3ZaNb*e1`1k_H^=;10ZDNRYuD~ZocnbN~zXkcJ4rH2P5mY0~DI;Ds6+1$RD W3wOPov}{TbYhp@nX5N&JQau3o3mxqM literal 0 HcmV?d00001 diff --git a/flask_session/e6d467bfcddb3a16f2ad5a28d8bd7d36 b/flask_session/e6d467bfcddb3a16f2ad5a28d8bd7d36 new file mode 100644 index 0000000000000000000000000000000000000000..314369036f55df65247c868256ed29632103df78 GIT binary patch literal 67 zcmc~eyFIOeb*c#i1k_H^=;10ZDNRYuD~ZocnbN~zXkcJ4rH2P5mY0~DI;Ds6+1$RD N3wOPov}{VL9sm$~8j%11 literal 0 HcmV?d00001 diff --git a/flask_session/e7f114dcf7f3868fb06d972494494b13 b/flask_session/e7f114dcf7f3868fb06d972494494b13 new file mode 100644 index 0000000000000000000000000000000000000000..0e480e36de04cfbc690fcd07311be496be99c506 GIT binary patch literal 67 zcmcb~wJWWGb*c#i1k_H^=;10ZDNRYuD~ZocnbN~zXkcJ4rH2P5mY0~DI;Ds6+1$RD N3wOPov}{VL9svA&8bSa7 literal 0 HcmV?d00001 diff --git a/flask_session/ee13c570a79dffb0127559fd9e0dfca7 b/flask_session/ee13c570a79dffb0127559fd9e0dfca7 new file mode 100644 index 0000000000000000000000000000000000000000..817735980780d1676b744c1272dd877fcc2e4562 GIT binary patch literal 548 zcmX|-&2H2%6om%_3lK|?c!3}`nK*WwNsuDsb_Pw=7O9#ds%|2uzG*D-SKGrdl`8cC zA{HntyI{jZ^d)!;q`n1CnW&RhKR+&l@F8Q6=p2 zB5>!2Y}Z}P8K&Wz|At)!0~N{3gzfLK(<3rHCi@3_;YWIK^y$#SA27lJn)uj`ymjkF znF6>y$G3tegSyf|s^DU2kKD9QEx2SGJjRFw7@uzbX5U(AX(c2?Xd^A|(anJiP&zql zYGYS&&AJ7L>=eyI?cn3al1j1+V}$$&Qvjccz=8=VihN2qon$0JLWrEw7z;AVIms}J Q2+t-0XiPKT&->;0AE>gobpQYW literal 0 HcmV?d00001 diff --git a/flask_session/f93924e17b9f01a5729553789b9857a5 b/flask_session/f93924e17b9f01a5729553789b9857a5 new file mode 100644 index 0000000000000000000000000000000000000000..156ec7f214e0bb9f33cb1fc394f85ea5d96014de GIT binary patch literal 209 zcmdmxwj-^9b?PAo2&kQ+(Zf|-Qks&QR}!C@GNp&b(7?c8N)HcAEH5!PbxIHCv$=gQ z7w&pFY1xz>jEqyw%OD`oqc}fp|acNR+ zW^r+5eqMZXehSbuHlP(2mgZA>M3JOm76KiS!Gt1{2-KUNmkV^^lpemc%)G>$_>BDA M)bjkI>?x&s0C1^WhX4Qo literal 0 HcmV?d00001 diff --git a/flask_session/fba9a66c8591f2a7d6baee089322217e b/flask_session/fba9a66c8591f2a7d6baee089322217e new file mode 100644 index 0000000000000000000000000000000000000000..cb9148d4e022703ef10ba310bbb94ae0d344d925 GIT binary patch literal 67 zcmdmKwJWWGb*c#i1k_H^=;10ZDNRYuD~ZocnbN~zXkcJ4rH2P5mY0~DI;Ds6+1$RD N3wOPov}{VL9smG~8d3lN literal 0 HcmV?d00001 diff --git a/flask_session/feca8e10607ef23e8d1acfd652b20ac2 b/flask_session/feca8e10607ef23e8d1acfd652b20ac2 new file mode 100644 index 0000000000000000000000000000000000000000..5687a33f15b7086317df13c9a7df8100b7629f59 GIT binary patch literal 67 zcmXTm*p=46I@N>$0&1sd^l%lIl%}NSmBeSJOzB}UG%zrj(!&E2%S+5nozlbkY;NDn Ng}Yu(S~jIr4*=kO8P@;+ literal 0 HcmV?d00001 diff --git a/generate_presigned_url.py b/generate_presigned_url.py deleted file mode 100644 index 5384d61..0000000 --- a/generate_presigned_url.py +++ /dev/null @@ -1,31 +0,0 @@ -import boto3 -from botocore.exceptions import NoCredentialsError, ClientError - -# 使用获取的访问密钥ID和秘密访问密钥来初始化S3客户端 -aws_access_key_id = 'AKIAZQ3DT3KLN5WGXZOR' # 替换为你的访问密钥ID -aws_secret_access_key = '5UZb8SovTrbroT7yU1pBzaR5myLn+NMA+c87RvLH' # 替换为你的秘密访问密钥 -region_name = 'ap-northeast-1' # 替换为你的S3存储桶所在区域 - -s3_client = boto3.client( - 's3', - aws_access_key_id=aws_access_key_id, - aws_secret_access_key=aws_secret_access_key, - region_name=region_name -) - -# 创建一个模拟“文件夹”的空对象 -def create_s3_folder(bucket_name, folder_name): - try: - s3_client.put_object(Bucket=bucket_name, Key=(folder_name + '/')) - print(f"Folder {folder_name} created in bucket {bucket_name}") - except NoCredentialsError: - print("Credentials not available") - except ClientError as e: - print(f"Error: {e}") - -# Bucket name and folder name -bucket_name = 'sure-ae-upload' -folder_name = 'sure_homework_define_by_qin' - -# Create folder -create_s3_folder(bucket_name, folder_name) diff --git a/generate_secret_key.py b/generate_secret_key.py new file mode 100644 index 0000000..25e0d10 --- /dev/null +++ b/generate_secret_key.py @@ -0,0 +1,2 @@ +import secrets +print(secrets.token_hex(16)) # 生成一个32字符长的随机字符串 diff --git a/index.html b/index.html deleted file mode 100644 index 6d639cb..0000000 --- a/index.html +++ /dev/null @@ -1,342 +0,0 @@ - - - - - - 秀儿文件提交系统 - - - -
-
- 描述性文本 -
-

秀儿文件提交系统

-
-
- - -
-
- - -
-
- - -
-
- -
- -
-
未选择文件
-
- -
-
-
-
-
-
-
0%
-
- 速度: 0 KB/s - 0 KB / 0 KB - 剩余时间: 计算中 -
-
- 下载统计表格 -
- - - - - - diff --git a/index.txt b/index.txt deleted file mode 100644 index 6d639cb..0000000 --- a/index.txt +++ /dev/null @@ -1,342 +0,0 @@ - - - - - - 秀儿文件提交系统 - - - -
-
- 描述性文本 -
-

秀儿文件提交系统

-
-
- - -
-
- - -
-
- - -
-
- -
- -
-
未选择文件
-
- -
-
-
-
-
-
-
0%
-
- 速度: 0 KB/s - 0 KB / 0 KB - 剩余时间: 计算中 -
-
- 下载统计表格 -
- - - - - - diff --git a/insert_data_to_database.py b/insert_data_to_database.py new file mode 100644 index 0000000..a6e9a08 --- /dev/null +++ b/insert_data_to_database.py @@ -0,0 +1,39 @@ +import json +import mysql.connector +from flask_bcrypt import Bcrypt + +bcrypt = Bcrypt() + +# 读取 JSON 数据 +with open('students_config.json', 'r', encoding='utf-8') as f: + students_config = json.load(f) + +# 连接到 MySQL 数据库 +conn = mysql.connector.connect( + host='8.218.165.242', + user='sure_001', + password='EKKWLMmrGmG7sdPf', + database='sure_001' +) + +cursor = conn.cursor() + +# 创建 students 表 +cursor.execute(''' +CREATE TABLE IF NOT EXISTS students ( + id VARCHAR(255) PRIMARY KEY, + name VARCHAR(255) NOT NULL, + email VARCHAR(255) NOT NULL, + password VARCHAR(255) NOT NULL +) +''') + +# 插入数据并哈希默认密码 +default_password_hash = bcrypt.generate_password_hash('skd123456').decode('utf-8') +for student in students_config['students']: + cursor.execute('INSERT INTO students (id, name, email, password) VALUES (%s, %s, %s, %s)', + (student['id'], student['name'], student['email'], default_password_hash)) + +conn.commit() +cursor.close() +conn.close() diff --git a/main.py b/main.py deleted file mode 100644 index 5b25c56..0000000 --- a/main.py +++ /dev/null @@ -1,16 +0,0 @@ -# 这是一个示例 Python 脚本。 - -# 按 ⌃R 执行或将其替换为您的代码。 -# 按 双击 ⇧ 在所有地方搜索类、文件、工具窗口、操作和设置。 - - -def print_hi(name): - # 在下面的代码行中使用断点来调试脚本。 - print(f'Hi, {name}') # 按 ⌘F8 切换断点。 - - -# 按间距中的绿色按钮以运行脚本。 -if __name__ == '__main__': - print_hi('PyCharm') - -# 访问 https://www.jetbrains.com/help/pycharm/ 获取 PyCharm 帮助 diff --git a/output_files_content.docx b/output_files_content.docx new file mode 100644 index 0000000000000000000000000000000000000000..ef13144e90272ea9d21c6932eb845cb84cf9ecb4 GIT binary patch literal 57419 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 literal 0 HcmV?d00001 diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..a4df60b --- /dev/null +++ b/requirements.txt @@ -0,0 +1,12 @@ +Flask +flask-cors +flask-mail +Flask-Bcrypt +Flask-Session +mysql-connector-python +boto3 +botocore +python-dotenv +pytz +pandas +docx~=0.2.4 \ No newline at end of file diff --git a/scp_to_remote_host.txt b/scp_to_remote_host.txt new file mode 100644 index 0000000..958bf19 --- /dev/null +++ b/scp_to_remote_host.txt @@ -0,0 +1 @@ +scp -r /Users/lishunqin/Desktop/study/pychram\ project/AWS-sure root@8.218.165.242:/root \ No newline at end of file diff --git a/static/admin.css b/static/admin.css new file mode 100644 index 0000000..56d0782 --- /dev/null +++ b/static/admin.css @@ -0,0 +1,99 @@ +body { + font-family: Arial, sans-serif; + line-height: 1.6; + margin: 0; + padding: 0; + background-color: #f4f4f4; +} + +.container { + width: 80%; + margin: auto; + overflow: hidden; + padding: 20px; +} + +h1, h2 { + color: #333; +} + +.form-group { + margin-bottom: 15px; +} + +label { + display: block; + margin-bottom: 5px; +} + +input[type="text"], +input[type="password"], +input[type="date"] { + width: 100%; + padding: 8px; + border: 1px solid #ddd; + border-radius: 4px; +} + +button { + display: inline-block; + background: #333; + color: #fff; + padding: 10px 20px; + border: none; + cursor: pointer; +} + +button:hover { + background: #555; +} + +table { + width: 100%; + border-collapse: collapse; + margin-top: 20px; +} + +table, th, td { + border: 1px solid #ddd; +} + +th, td { + text-align: left; + padding: 10px; +} + +th { + background-color: #f4f4f4; +} + +.alert { + padding: 10px; + margin-bottom: 15px; + border-radius: 4px; +} + +.alert-success { + background-color: #d4edda; + border-color: #c3e6cb; + color: #155724; +} + +.alert-error { + background-color: #f8d7da; + border-color: #f5c6cb; + color: #721c24; +} + +.logout-btn { + float: right; + background: #dc3545; + color: #fff; + padding: 5px 10px; + text-decoration: none; + border-radius: 4px; +} + +.logout-btn:hover { + background: #c82333; +} diff --git a/static/base.css b/static/base.css new file mode 100644 index 0000000..30fed4e --- /dev/null +++ b/static/base.css @@ -0,0 +1,119 @@ +/* base.css */ + +body { + font-family: Arial, sans-serif; + line-height: 1.6; + margin: 0; + padding: 0; + background-color: #f4f4f4; + color: #333; +} + +.container { + width: 80%; + max-width: 800px; + margin: 50px auto; + background: #fff; + padding: 20px; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); + border-radius: 8px; +} + +h1, h2 { + color: #111; + margin-bottom: 20px; +} + +.form-group { + margin-bottom: 15px; +} + +label { + display: block; + margin-bottom: 5px; + font-weight: bold; +} + +input[type="text"], +input[type="email"], +input[type="password"], +input[type="number"], +input[type="date"], +select { + width: 100%; + padding: 10px; + border: 1px solid #ddd; + border-radius: 4px; + box-sizing: border-box; +} + +button { + background: #5cb85c; + color: #fff; + padding: 10px 20px; + border: none; + border-radius: 4px; + cursor: pointer; + font-size: 16px; + transition: background 0.3s, transform 0.3s; +} + +button:hover { + background: #4cae4c; + transform: translateY(-2px); +} + +.alert { + padding: 10px; + margin-bottom: 15px; + border-radius: 4px; +} + +.alert-success { + background-color: #d4edda; + border-color: #c3e6cb; + color: #155724; +} + +.alert-error { + background-color: #f8d7da; + border-color: #f5c6cb; + color: #721c24; +} + +.logout-btn { + float: right; + background: #dc3545; + color: #fff; + padding: 8px 16px; + text-decoration: none; + border-radius: 4px; + display: inline-block; +} + +.logout-btn:hover { + background: #c82333; +} + +table { + width: 100%; + margin-top: 20px; + border-collapse: collapse; +} + +th, td { + padding: 10px; + border-bottom: 1px solid #ddd; + text-align: left; +} + +th { + background-color: #f4f4f4; +} + +select { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background: url('data:image/svg+xml;utf8, { + if (response.ok) { + alert('截止日期已更新'); + location.reload(); + } else { + alert('更新失败'); + } + }) + .catch(error => console.error('Error:', error)); + } +} + +function deleteAssignment(assignmentId) { + if (confirm("您确定要删除这个作业吗?")) { + fetch(`/teacher/delete_assignment/${assignmentId}`, { + method: 'DELETE' + }) + .then(response => { + if (response.ok) { + alert('作业已删除'); + location.reload(); + } else { + alert('删除失败'); + } + }) + .catch(error => console.error('Error:', error)); + } +} diff --git a/static/dogking.jpg b/static/dogking.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a55b7431e14a72b2eee0e224486ea19bd4f8c8e5 GIT binary patch literal 203385 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 z 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 Ts_;kqw7pNu_|N_3K8OF=t;&BC literal 0 HcmV?d00001 diff --git a/image.jpg b/static/image.jpg similarity index 100% rename from image.jpg rename to static/image.jpg diff --git a/static/index.css b/static/index.css new file mode 100644 index 0000000..2447fdd --- /dev/null +++ b/static/index.css @@ -0,0 +1,312 @@ +:root { + --primary-color: #1890ff; + --secondary-color: #40a9ff; + --background-color: #f0f2f5; + --text-color: #333; + --border-color: #ddd; +} + +body { + font-family: 'Helvetica Neue', Arial, sans-serif; + background-color: var(--background-color); + margin: 0; + padding: 0; + display: flex; + justify-content: center; + align-items: center; + min-height: 100vh; +} + +.container { + background-color: #ffffff; + border-radius: 12px; + box-shadow: 0 8px 16px rgba(0, 0, 0, 0.1); + padding: 40px; + width: 100%; + max-width: 480px; + text-align: center; + transition: transform 0.3s ease; +} + +.container:hover { + transform: translateY(-5px); +} + +.image-container { + margin-bottom: 30px; + border-radius: 12px; + overflow: hidden; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); +} + +.image-container img { + width: 100%; + height: auto; + display: block; + transition: transform 0.3s ease; +} + +.loading-indicator { + display: none; + margin-top: 15px; + font-size: 16px; + color: #666; + text-align: center; +} + +.image-container:hover img { + transform: scale(1.05); +} + +h1 { + color: var(--text-color); + font-size: 28px; + margin-bottom: 30px; + font-weight: 600; +} + +.form-field { + margin-bottom: 25px; + text-align: left; +} + +label { + display: block; + margin-bottom: 8px; + color: var(--text-color); + font-weight: 500; + font-size: 14px; +} + +select { + width: 100%; + padding: 12px; + border: 2px solid var(--border-color); + border-radius: 6px; + font-size: 16px; + transition: border-color 0.3s ease; +} + +select:focus { + outline: none; + border-color: var(--primary-color); +} + +.file-input-wrapper { + position: relative; + overflow: visible; + display: inline-block; + width: 100%; +} + +.file-input-button { + background-color: #f0f0f0; + border: 2px solid var(--border-color); + color: var(--text-color); + padding: 12px 15px; + border-radius: 6px; + font-size: 16px; + cursor: pointer; + display: inline-block; + width: 100%; + text-align: center; + box-sizing: border-box; + transition: all 0.3s ease; +} + +.file-input-button:hover { + background-color: #e0e0e0; + border-color: var(--primary-color); +} + +.file-input-button input[type="file"] { + display: none; +} + +#file-name { + margin-top: 8px; + font-size: 14px; + color: #666; +} + +button[type="submit"], button[id="verify-submit-button"] { + background-color: var(--primary-color); + color: white; + border: none; + padding: 14px 20px; + border-radius: 6px; + font-size: 16px; + cursor: pointer; + width: 100%; + transition: background-color 0.3s ease, transform 0.3s ease; + margin-top: 25px; + font-weight: 500; +} + +button[type="submit"]:hover, button[id="verify-submit-button"]:hover { + background-color: var(--secondary-color); + transform: translateY(-2px); +} + +button[type="submit"]:disabled, button[id="verify-submit-button"]:disabled { + background-color: #d3d3d3; + cursor: not-allowed; +} + +.progress-container { + margin-top: 25px; + display: none; +} + +.progress { + height: 12px; + background-color: #f0f0f0; + border-radius: 6px; + overflow: hidden; + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); +} + +.progress-bar { + height: 100%; + background-color: var(--primary-color); + width: 0; + transition: width 0.3s ease; +} + +#progress-percentage { + font-size: 14px; + color: #666; + margin-top: 8px; + font-weight: 500; +} + +#status { + margin-top: 20px; + font-size: 16px; + color: #666; + font-weight: 500; +} + +.upload-stats { + margin-top: 15px; + font-size: 14px; + color: #666; + display: flex; + justify-content: space-between; +} + +.upload-stats span { + display: inline-block; +} + +.button-group { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 20px; + margin-top: 30px; +} + +.action-card { + background: white; + border-radius: 12px; + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); + overflow: hidden; + transition: all 0.3s ease; +} + +.action-card:hover { + transform: translateY(-5px); + box-shadow: 0 6px 12px rgba(0, 0, 0, 0.15); +} + +.verification-container { + margin-top: 25px; +} + +.verification-input { + width: 100%; + padding: 12px; + border: 2px solid var(--border-color); + border-radius: 6px; + font-size: 16px; + text-align: center; + margin-bottom: 15px; + transition: border-color 0.3s ease; +} + +.verification-input:focus { + outline: none; + border-color: var(--primary-color); +} + +.download-link-button, .preview-button { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 20px; + width: 100%; + border: none; + cursor: pointer; + transition: all 0.3s ease; + font-weight: 500; + font-size: 14px; + color: white; + background-size: 200% 200%; + animation: rainbow 5s ease infinite; +} + +.download-link-button { + background-image: linear-gradient(45deg, #ff9a9e, #fad0c4, #ffecd2, #fcb69f); +} + +.preview-button { + background-image: linear-gradient(45deg, #a1c4fd, #c2e9fb, #d4fc79, #96e6a1); +} + +.download-link-button:hover, .preview-button:hover { + background-size: 100% 100%; +} + +.logout-button:hover { + background-color: var(--secondary-color); + transform: translateY(-2px); +} + +.logout-button { + background-color: var(--primary-color); + color: white; + border: none; + padding: 14px 20px; + border-radius: 6px; + font-size: 16px; + cursor: pointer; + width: 100%; + transition: background-color 0.3s ease, transform 0.3s ease; + margin-bottom: 25px; /* 适当的间距以与表单分隔开 */ + font-weight: 500; +} + +.button-icon { + font-size: 24px; + margin-bottom: 10px; +} + +@keyframes rainbow { + 0% { background-position: 0% 50% } + 50% { background-position: 100% 50% } + 100% { background-position: 0% 50% } +} + +@media (max-width: 600px) { + .container { + padding: 30px; + max-width: 90%; + } +} + +@media (max-width: 480px) { + .button-group { + grid-template-columns: 1fr; + } +} diff --git a/static/index.js b/static/index.js new file mode 100644 index 0000000..89346e8 --- /dev/null +++ b/static/index.js @@ -0,0 +1,275 @@ +document.querySelector('.file-input-button').addEventListener('click', function() { + document.getElementById('file').click(); +}); + +document.getElementById('file').addEventListener('change', function(e) { + const fileName = e.target.files[0] ? e.target.files[0].name : '未选择文件'; + document.getElementById('file-name').textContent = fileName; +}); + +document.getElementById('upload-form').addEventListener('submit', async (e) => { + e.preventDefault(); + handleSubmission(); +}); + +document.getElementById('verify-submit-button').addEventListener('click', async () => { + await validateCodeAndSubmit(); +}); + +async function handleSubmission() { + const assignment = document.getElementById('assignment').value; + const file = document.getElementById('file').files[0]; + const statusDiv = document.getElementById('status'); + + if (!assignment || !file) { + alert('请选择作业,并选择一个文件。'); + return; + } + + setLoadingState(true); + + try { + const recordResponse = await fetch('/record-submission', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ assignment, filename: file.name }) + }); + + if (recordResponse.status === 401) { + setLoadingState(false); + document.getElementById('verification-container').style.display = 'block'; + + const emailResponse = await fetch('/generate-code', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ assignment }) + }); + + if (emailResponse.ok) { + alert('作业已提交过,请输入验证码提交'); + } else { + const errorData = await emailResponse.json(); + throw new Error(`发送验证码失败: ${errorData.error}`); + } + } else if (!recordResponse.ok) { + const errorRecordData = await recordResponse.json(); + throw new Error(`记录提交信息失败: ${errorRecordData.error}`); + } else { + const data = await recordResponse.json(); + await uploadFile(data.upload_url, file, statusDiv); + alert('文件上传并记录成功'); + } + } catch (error) { + console.error('错误:', error); + statusDiv.textContent = `错误: ${error.message}`; + alert('发生错误: ' + error.message); + } finally { + setLoadingState(false); + } +} + +async function validateCodeAndSubmit() { + const assignment = document.getElementById('assignment').value; + const file = document.getElementById('file').files[0]; + const code = document.getElementById('verification-code').value; + const statusDiv = document.getElementById('status'); + + setLoadingState(true, true); + + try { + const validateResponse = await fetch('/validate-code', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ assignment, code }) + }); + + if (validateResponse.ok) { + const { upload_url } = await validateResponse.json(); + await uploadFile(upload_url, file, statusDiv); + alert('文件上传并记录成功'); + document.getElementById('verification-container').style.display = 'none'; + } else { + const errorData = await validateResponse.json(); + throw new Error(`验证码错误: ${errorData.error}`); + } + } catch (error) { + console.error('错误:', error); + statusDiv.textContent = `错误: ${error.message}`; + alert('发生错误: ' + error.message); + } finally { + setLoadingState(false, true); + } +} + +async function uploadFile(upload_url, file, statusDiv) { + const progressContainer = document.getElementById('progress-container'); + const progressBar = document.getElementById('progress-bar'); + const progressPercentage = document.getElementById('progress-percentage'); + const uploadSpeed = document.getElementById('upload-speed'); + const uploadSize = document.getElementById('upload-size'); + const uploadTime = document.getElementById('upload-time'); + + statusDiv.textContent = '正在上传文件...'; + const totalSize = file.size; + let uploadedSize = 0; + let startTime = Date.now(); + + progressContainer.style.display = 'block'; + + const updateProgress = (additionalProgress = 0) => { + uploadedSize += additionalProgress; + const percentComplete = (uploadedSize / totalSize) * 100; + const elapsedTime = (Date.now() - startTime) / 1000; + const speed = uploadedSize / elapsedTime; + const remainingSize = totalSize - uploadedSize; + const estimatedRemainingTime = speed > 0 ? remainingSize / speed : 0; + + progressBar.style.width = percentComplete + '%'; + progressPercentage.textContent = percentComplete.toFixed(2) + '%'; + uploadSpeed.textContent = `速度: ${formatSize(speed)}/s`; + uploadSize.textContent = `${formatSize(uploadedSize)} / ${formatSize(totalSize)}`; + uploadTime.textContent = `剩余时间: ${formatTime(estimatedRemainingTime)}`; + }; + + const progressInterval = setInterval(() => { + if (uploadedSize < totalSize) { + updateProgress(totalSize / 100); + } + }, 200); + + const uploadResponse = await fetch(upload_url, { + method: 'PUT', + body: file, + headers: { + 'Content-Type': 'application/octet-stream' + } + }); + + clearInterval(progressInterval); + + if (!uploadResponse.ok) { + throw new Error(`上传失败: ${uploadResponse.statusText}`); + } + + updateProgress(totalSize - uploadedSize); +} + +function setLoadingState(isLoading, isVerify = false) { + const submitButton = document.querySelector('button[type="submit"]'); + const verifyButton = document.getElementById('verify-submit-button'); + const container = isVerify ? verifyButton.parentElement : submitButton.parentElement; + + const loadingIndicator = container.querySelector('.loading-indicator') || document.createElement('div'); + loadingIndicator.className = 'loading-indicator'; + loadingIndicator.innerHTML = '加载中...'; + loadingIndicator.style.display = isLoading ? 'block' : 'none'; + + if (!loadingIndicator.parentElement) { + container.appendChild(loadingIndicator); + } + + if (isVerify) { + verifyButton.disabled = isLoading; + } else { + submitButton.disabled = isLoading; + } +} + +function formatSize(bytes) { + if (bytes === 0) return '0 Bytes'; + const k = 1024; + const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB']; + const i = Math.floor(Math.log(bytes) / Math.log(k)); + return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]; +} + +function formatTime(seconds) { + if (isNaN(seconds) || !isFinite(seconds)) { + return '计算中'; + } + if (seconds < 60) return Math.round(seconds) + ' 秒'; + const minutes = Math.floor(seconds / 60); + const remainingSeconds = Math.round(seconds % 60); + return `${minutes} 分 ${remainingSeconds} 秒`; +} + +function previewTable(apiUrl, title) { + fetch(apiUrl) + .then(response => response.json()) + .then(data => { + const newWindow = window.open('', '_blank'); + newWindow.document.write('' + title + ''); + newWindow.document.write('

' + title + '

'); + + const table = newWindow.document.createElement('table'); + + if (data.length > 0) { + let headers; + if (title === '预览统计表格') { + headers = ['时间', '提交的文件', '姓名', '学号', '作业']; + } else { + headers = ['学号', '姓名', '作业', '提交情况', '提交的文件']; + } + + const thead = newWindow.document.createElement('thead'); + const tr = newWindow.document.createElement('tr'); + headers.forEach((header, index) => { + const th = newWindow.document.createElement('th'); + th.textContent = header; + // 设置列宽 + if (title === '预览统计表格') { + if (index === 0) th.style.width = '20%'; // 时间 + else if (index === 1) th.style.width = '30%'; // 提交的文件 + else if (index === 2) th.style.width = '15%'; // 姓名 + else if (index === 3) th.style.width = '15%'; // 学号 + else if (index === 4) th.style.width = '20%'; // 作业 + } else { + if (index === 0) th.style.width = '15%'; // 学号 + else if (index === 1) th.style.width = '15%'; // 姓名 + else if (index === 2) th.style.width = '20%'; // 作业 + else if (index === 3) th.style.width = '15%'; // 提交情况 + else if (index === 4) th.style.width = '35%'; // 提交的文件 + } + tr.appendChild(th); + }); + thead.appendChild(tr); + table.appendChild(thead); + } + + const tbody = newWindow.document.createElement('tbody'); + data.forEach(row => { + const tr = newWindow.document.createElement('tr'); + if (title === '预览统计表格') { + ['时间', '提交的文件', '姓名', '学号', '作业'].forEach(key => { + const td = newWindow.document.createElement('td'); + td.textContent = row[key] || ''; + tr.appendChild(td); + }); + } else { + ['学号', '姓名', '作业', '提交情况', '提交的文件'].forEach(key => { + const td = newWindow.document.createElement('td'); + td.textContent = row[key] || ''; + tr.appendChild(td); + }); + } + tbody.appendChild(tr); + }); + + table.appendChild(tbody); + newWindow.document.body.appendChild(table); + newWindow.document.write(''); + newWindow.document.close(); + }) + .catch(error => console.error('Error fetching data:', error)); +} diff --git a/submissions.csv b/submissions.csv deleted file mode 100644 index 4c6ee6f..0000000 --- a/submissions.csv +++ /dev/null @@ -1,20 +0,0 @@ -ID,学生姓名,学号,提交的文件 -2024-07-02T15:38:06.844568,嗷呜呜汪汪汪钦,12345,fastgpt.txt -2024-07-03T02:01:37.364487,王中王火腿肠,123,mao.png -2024-07-03T02:02:02.087326,王中王火腿肠,123,《移动互联开发》软件设计考查材料.rar -2024-07-03T02:31:23.019179,秀儿,000,SUS 304 Stainless Steel.png -2024-07-03T02:31:55.184382,秀儿,000,阅读1.pdf -2024-07-03T02:35:50.030507,嘿!,324,计算机网络_数据链路层.ppt -2024-07-03T02:37:23.232007,CC,34534,"性学观止 (贺兰特·凯查杜里安, 胡颖翀) (Z-Library).pdf" -2024-07-03T02:40:42.161975,4324,4234,数学分析 陈纪修 第三版 上 by 陈纪修,于崇华,金路 (z-lib.org).pdf -2024-07-03T02:42:47.614487,324,4234,男人来自火星,女人来自金星(套装共4册) (约翰·格雷) (Z-Library).pdf -2024-07-03T02:43:01.033652,534534,543534,数学分析 陈纪修 第三版 上 by 陈纪修,于崇华,金路 (z-lib.org).pdf -2024-07-03T02:46:15.397526,CCC,AAA,"周易译注 (黄寿祺,张善文) (Z-Library).pdf" -2024-07-03T02:48:26.189052,2423,423423,阅读1.pdf -2024-07-03T03:06:53.527517,李顺,342,homework1,计算机网络_数据链路层.ppt -2024-07-03T03:10:31.977965,Sure,324234,homework2,Sure_324234_彩虹易支付纯净源码.zip -2024-07-03T03:15:33.951611,342,453534,homework2,342_453534_男人来自火星,女人来自金星(套装共4册) (约翰·格雷) (Z-Library).pdf -2024-07-03T03:22:12.013752,李无天,983,homework3,李无天_983_真正全集:王阳明全集(以权威的隆庆初刻本《王文成公全书》为底本,增补2卷旧本未刊内容!王阳明的“心学哲理、文治武功、传奇人生”全在这... (Z-Library).pdf -2024-07-03T03:24:24.223088,王刚,324,homework3,王刚_324_期末复习.pptx -2024-07-06T19:16:46.811930,嗷呜呜0706,321,homework1,嗷呜呜0706_321_知行合一王阳明套装 (度阴山) (Z-Library).pdf -2024-07-07T00:28:05.848994,test,432,homework1,期末复习.pptx diff --git a/submissions.xlsx b/submissions.xlsx deleted file mode 100644 index e3a26596fc194dd84ca23ba9936d7dc109020d6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6394 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 + + + + + Admin Login + + + + +
+

Admin Login

+ {% with messages = get_flashed_messages(with_categories=true) %} + {% if messages %} + {% for category, message in messages %} +
{{ message }}
+ {% endfor %} + {% endif %} + {% endwith %} +
+
+ + +
+
+ + +
+ +
+
+ + \ No newline at end of file diff --git a/templates/admin_panel.html b/templates/admin_panel.html new file mode 100644 index 0000000..88b96ef --- /dev/null +++ b/templates/admin_panel.html @@ -0,0 +1,160 @@ + + + + + + 管理面板 + + + + +
+ + + + + + diff --git a/templates/class_detail.html b/templates/class_detail.html new file mode 100644 index 0000000..80f97bf --- /dev/null +++ b/templates/class_detail.html @@ -0,0 +1,79 @@ + + + + + + 班级详情 + + + +
+

班级详情

+ 返回教师面板 + +

作业

+
+
+ + +
+
+ + +
+
+ + +
+ +
+ +

现有作业

+ + + + + + + + + + + {% for assignment in assignments %} + + + + + + + {% endfor %} + +
分值名称截止日期操作
{{ assignment.value }}{{ assignment.name }}{{ assignment.deadline }} + + +
+ +

学生

+ + + + + + + + + + {% for student in students %} + + + + + + {% endfor %} + +
学生 ID学生姓名邮箱
{{ student.id }}{{ student.name }}{{ student.email }}
+
+ + + + diff --git a/templates/index.html b/templates/index.html new file mode 100644 index 0000000..ed94bfc --- /dev/null +++ b/templates/index.html @@ -0,0 +1,86 @@ + + + + + + 秀儿文件提交系统 + + + +
+
+ 描述性文本 +
+ + +

秀儿文件提交系统

+
+
+ + +
+
+ +
+ +
+
未选择文件
+
+ +
+
+
+
+
+
+
0%
+
+ 速度: 0 KB/s + 0 KB / 0 KB + 剩余时间: 计算中 +
+
+ + +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+ + + + diff --git a/templates/login.html b/templates/login.html new file mode 100644 index 0000000..91d94f8 --- /dev/null +++ b/templates/login.html @@ -0,0 +1,121 @@ + + + + + + 登录页面 + + + +
+
+ Dog King +
+

登录

+ {% if error %} +
{{ error }}
+ {% endif %} +
+
+ + +
+
+ + +
+ + +
+
+ + diff --git a/templates/reset_password.html b/templates/reset_password.html new file mode 100644 index 0000000..3fd7bce --- /dev/null +++ b/templates/reset_password.html @@ -0,0 +1,131 @@ + + + + + + 重置密码 + + + +
+

重置密码

+ {% if error %} +
{{ error }}
+ {% endif %} + {% if success %} +
{{ success }}
+ {% endif %} +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ + +
+
+ + diff --git a/templates/teacher_login.html b/templates/teacher_login.html new file mode 100644 index 0000000..7712451 --- /dev/null +++ b/templates/teacher_login.html @@ -0,0 +1,34 @@ + + + + + + Teacher Login + + + + +
+

Teacher Login

+ {% with messages = get_flashed_messages(with_categories=true) %} + {% if messages %} + {% for category, message in messages %} +
{{ message }}
+ {% endfor %} + {% endif %} + {% endwith %} + +
+
+ + +
+
+ + +
+ +
+
+ + diff --git a/templates/teacher_panel.html b/templates/teacher_panel.html new file mode 100644 index 0000000..3accd11 --- /dev/null +++ b/templates/teacher_panel.html @@ -0,0 +1,40 @@ + + + + + + 教师面板 + + + + +
+

教师面板

+ 登出 + {% with messages = get_flashed_messages(with_categories=true) %} + {% if messages %} + {% for category, message in messages %} +
{{ message }}
+ {% endfor %} + {% endif %} + {% endwith %} + +

选择班级

+ + + +
+ + + diff --git a/~$tput_files_content.docx b/~$tput_files_content.docx new file mode 100644 index 0000000000000000000000000000000000000000..1215360c558324f168a348f977b46d5a160ee437 GIT binary patch literal 162 zcmWgj%}g%JFV0UZQSeVo%S=vH2rW)6VjuuS8GIQs8Il=_81fm4fjEt!gh7G9A4sQx Q#Z!U2P@qgIPz9v`0A
+

管理面板

+
登出 + {% with messages = get_flashed_messages(with_categories=true) %} + {% if messages %} + {% for category, message in messages %} +
{{ message }}
+ {% endfor %} + {% endif %} + {% endwith %} + +

添加新专业

+
+
+ + +
+ +
+ +

添加新年级

+
+
+ + +
+ +
+ +

添加新班级

+
+
+ + +
+
+ + +
+
+ + +
+ +
+ +

分配教师到班级

+
+
+ + +
+
+ + +
+ +
+ +

添加新教师

+
+
+ + +
+
+ + +
+
+ + +
+ +
+ +

添加新管理员

+
+
+ + +
+
+ + +
+
+ + +
+ +
+