From 079c35c7194b88e41192c718ac71a6cc83990f2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AE=8B=E5=A5=87=E5=B3=B0?= Date: Sat, 11 Oct 2025 12:59:39 +0800 Subject: [PATCH] sqf commit --- .idea/.gitignore | 8 ++ .idea/copilot.data.migration.agent.xml | 6 ++ .idea/copilot.data.migration.ask.xml | 6 ++ .idea/copilot.data.migration.ask2agent.xml | 6 ++ .idea/copilot.data.migration.edit.xml | 6 ++ .idea/libraries/lib.xml | 19 +++++ .idea/misc.xml | 6 ++ .idea/modules.xml | 8 ++ .idea/vcs.xml | 6 ++ data/sqf/2025-10-02-11-29-36.txt | 20 ----- data/users.cfg | 4 +- mathStudyApp.iml | 2 - out/production/mathStudyApp/Main.class | Bin 1027 -> 1027 bytes .../controller/FunctionController.class | Bin 1697 -> 1697 bytes .../mathStudyApp/model/Create.class | Bin 5925 -> 5455 bytes .../model/ExpressionEvaluator.class | Bin 4806 -> 4842 bytes .../mathStudyApp/model/Generator$1.class | Bin 723 -> 723 bytes .../mathStudyApp/model/Generator.class | Bin 7382 -> 7418 bytes .../mathStudyApp/model/LanguageSwitch$1.class | Bin 738 -> 738 bytes .../mathStudyApp/model/LanguageSwitch.class | Bin 1302 -> 1302 bytes .../mathStudyApp/model/LoadFile.class | Bin 4496 -> 4516 bytes .../mathStudyApp/model/Login$Account.class | Bin 737 -> 737 bytes .../mathStudyApp/model/Login$Level.class | Bin 1136 -> 1136 bytes out/production/mathStudyApp/model/Login.class | Bin 6739 -> 6877 bytes out/production/mathStudyApp/model/Paper.class | Bin 826 -> 826 bytes out/production/mathStudyApp/model/Save.class | Bin 3209 -> 3213 bytes .../mathStudyApp/view/ExamFrame.class | Bin 6266 -> 6282 bytes .../mathStudyApp/view/ExamSetupFrame.class | Bin 4341 -> 4349 bytes .../mathStudyApp/view/LoginFrame.class | Bin 3593 -> 3593 bytes .../MainMenuFrame$ChangePasswordDialog.class | Bin 3822 -> 3882 bytes .../mathStudyApp/view/MainMenuFrame.class | Bin 2963 -> 2987 bytes .../mathStudyApp/view/RegisterFrame$1.class | Bin 827 -> 827 bytes .../mathStudyApp/view/RegisterFrame.class | Bin 7547 -> 7556 bytes .../mathStudyApp/view/ResultFrame.class | Bin 3323 -> 3323 bytes src/Main.java | 1 + src/controller/AssignController.java | 18 ---- src/controller/FunctionController.java | 5 +- src/model/Create.java | 52 +++++------- src/model/ExpressionEvaluator.java | 56 +++++++++---- src/model/Generator.java | 40 ++++++--- src/model/LanguageSwitch.java | 1 + src/model/LoadFile.java | 25 ++++-- src/model/Login.java | 25 +++++- src/model/Paper.java | 1 + src/model/Save.java | 11 ++- src/view/ExamFrame.java | 56 +++++++++---- src/view/ExamSetupFrame.java | 25 ++++-- src/view/LoginFrame.java | 22 +++-- src/view/MainMenuFrame.java | 78 +++++++++++++----- src/view/RegisterFrame.java | 29 +++++-- src/view/ResultFrame.java | 18 ++-- 51 files changed, 388 insertions(+), 172 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 .idea/copilot.data.migration.agent.xml create mode 100644 .idea/copilot.data.migration.ask.xml create mode 100644 .idea/copilot.data.migration.ask2agent.xml create mode 100644 .idea/copilot.data.migration.edit.xml create mode 100644 .idea/libraries/lib.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml delete mode 100644 data/sqf/2025-10-02-11-29-36.txt delete mode 100644 src/controller/AssignController.java diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..35410ca --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml +# 基于编辑器的 HTTP 客户端请求 +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/copilot.data.migration.agent.xml b/.idea/copilot.data.migration.agent.xml new file mode 100644 index 0000000..4ea72a9 --- /dev/null +++ b/.idea/copilot.data.migration.agent.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/copilot.data.migration.ask.xml b/.idea/copilot.data.migration.ask.xml new file mode 100644 index 0000000..7ef04e2 --- /dev/null +++ b/.idea/copilot.data.migration.ask.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/copilot.data.migration.ask2agent.xml b/.idea/copilot.data.migration.ask2agent.xml new file mode 100644 index 0000000..1f2ea11 --- /dev/null +++ b/.idea/copilot.data.migration.ask2agent.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/copilot.data.migration.edit.xml b/.idea/copilot.data.migration.edit.xml new file mode 100644 index 0000000..8648f94 --- /dev/null +++ b/.idea/copilot.data.migration.edit.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/libraries/lib.xml b/.idea/libraries/lib.xml new file mode 100644 index 0000000..7f1aa7e --- /dev/null +++ b/.idea/libraries/lib.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..31e1ebc --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..831f033 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/data/sqf/2025-10-02-11-29-36.txt b/data/sqf/2025-10-02-11-29-36.txt deleted file mode 100644 index 0f1fc7c..0000000 --- a/data/sqf/2025-10-02-11-29-36.txt +++ /dev/null @@ -1,20 +0,0 @@ -1. 37 + 35 - -2. 82 * 28 - -3. (16 / 56) + 42 - -4. 6 * 52 + 35 - -5. (99 + 26) + 37 - -6. 40 * 63 - -7. 52 - 61 - 16 - 70 * 51 - -8. 65 + 83 - -9. 84 / 64 - -10. 24 - 47 + 21 + 1 - 33 - diff --git a/data/users.cfg b/data/users.cfg index 7842a5d..a790fcf 100644 --- a/data/users.cfg +++ b/data/users.cfg @@ -1,10 +1,12 @@ 王五3 123 HIGH wangwu3@example.com 王五2 123 HIGH wangwu2@example.com +123 Aa123456 PRIMARY 2571400460@qq.com 王五1 123 HIGH wangwu1@example.com +scb Aa123456 PRIMARY 3110858122@qq.com 张三3 123 PRIMARY zhangsan3@example.com 张三1 123 PRIMARY zhangsan1@example.com 张三2 123 PRIMARY zhangsan2@example.com 李四3 123 MIDDLE lishi3@example.com -sqf Aa123456 PRIMARY sqf090815@hnu.edu.cn +sqf Qq123456 PRIMARY sqf090815@hnu.edu.cn 李四1 123 MIDDLE lishi1@example.com 李四2 123 MIDDLE lishi2@example.com diff --git a/mathStudyApp.iml b/mathStudyApp.iml index 8a266dd..fb8e866 100644 --- a/mathStudyApp.iml +++ b/mathStudyApp.iml @@ -8,7 +8,5 @@ - - \ No newline at end of file diff --git a/out/production/mathStudyApp/Main.class b/out/production/mathStudyApp/Main.class index 2880209cfe01fbd5c28c706ca7cd0c2901e2440e..50bd932f753124267ed6002d8cd8a024fc49e5cd 100644 GIT binary patch delta 29 kcmZqXXy(`uz|6=oIgr_bm79TsfoJkGW(P*@$=8{60Ad;je*gdg delta 29 kcmZqXXy(`uz|6=#Igr_bm5YIcfqU{aW(P*D$=8{60Ac0^djJ3c diff --git a/out/production/mathStudyApp/controller/FunctionController.class b/out/production/mathStudyApp/controller/FunctionController.class index 099f7029d7e195953301fe0f74037278ab0fd7a4..621af2e8c61b458249f8dded444ffcf52b7666d0 100644 GIT binary patch delta 63 zcmZ3;yO4K7F)ODa0}F!?11E#<zS`~BMG$9tdmdEe*j z|9rgn$zd;tj2AB-Jpo{X$a=si^%~HTpusSa2-Dsr#wGfYq#@aaA1U_hVpL)p0vggy z3_yk*ROV)93M8#;s*N_3PL4K4TOw^uEe0$EO}LS5?^KF)3)h&)#X$RnQkXahgEi!v z7=i-(tTL#wNFa4ZWObx;Ra;#{>A04b$elClTH6d1!j*_YC^0b7BF%s@FtY8Yjrf`Q!S$`hmQ-L6berHLCc z#(vf{Ik_?g3M%Er2_`0DlAW%G^m0r#F$GiYDQbm22-8i>z|Hn{HJ2x|Ow7g{`+!=M zScQ2SZZUBy=G*V7d3qJ9O)SJ0>?C)FsId#(!Pp`h!0ni>VTpkEzcE%t+cYqgxXVu1 zb0dwlO)Cx5#zjgbRcB%a>IJmM=-RfajctUWaB9(1d9>0*BMJl(<x-KNe^X};TaPLakGFYddI3r zL#u%@{J_Lv9I z{rf*U_6T=|ebUVFnTGHRpC*!6d?MLCXTBm*?UUX-b$~#=o#V~-Xu=Z6A(<0n2s4_R z>Q^;mAWKtm(%=D2K(4*qm-1Wi+Z{Rrae#z^A9Iz*fDg}eHRBg>5l0Rv$qq?2*i3fn!EkbCv4>y??()JZ`xIdUp(^3Z6q* zIKfKj!u1tK2j+!M?KnAJ%j>cdsw}T+B^<>K07N3=Z)pKN;G5MUMr0UWm>D)R3`xx0v8)RV(s0|uk3v&J9Z+56-X1KXyNkm<%V(M0 zh)}!-wPY;~C%MX#Enhd5+4m=B#g?m!w^jJ9q{C=vM>xa3ro!I=$3VYI=d39Wt@TMu zI*=}Ju1b=2dA_#33+w7D{B*>>q#`vVRk{_R$w1s>N8e`0634(Ej0$+$k(yyxNy)}x zEZ1wdQD2O*QY8)CU7xgU30?7J_^IYI1-+KfMew?@QNp?0fEL%=??iG;P=*AA2%b=vbESww}R!p~yxO_+7Te1`^y$kmI4g|vbGx&z3 zAI9TH@g&%9-|4}=YRgTF+7Ue6$--NJ8qSxnIHMFOA*xoLI=;XO4L%_{GLecb{sobb zY!t8|h9eK7Isd0&Fr^Dn6T@{>QOM~R;=C+IGfJ?YPsY6%#wk>ahbXd}Z^d4WKqqIy zL5##vgz+jW@g@!Z8DsD<3+V3{$L=04bW9Xp+$1ba76UOw6k&$Ao^xdaW{L%vEov}F zEX7>Wj4IKJTSV+`+$uI>zOb=CJb`M_iG|`IZWFy&Bwj#`IEBUH4MfB{7$nYMxj2hD zB^fJ}Ow=pcXiy5!%-B~dC1_G^K#S~NF$_6G#)X&gGJAIgrs9{_3NHgm!zr9*kJn-r zUSSYsjGiXrSG?$_e;NH$4WH{@lb1?g4ZOxS4$wKT!}HV89rz7-2{UK9B)tI9a1`D zj2ku>aXJ2ocgZWEtMB1Y%q-^yp+C($OX>{XmotgfU+@9zLRZG)uas~hRT+s7@i$gR zmQqU7?{W+dCw3o`@?f-*6vJ8irqM6365Rbh{{y~$v*&3nuI@b5#g&}DqU4`c@-IrB zM&L3EH1NlS#q~1M9r_c|$67OlhEFy4t{nHDX)GsEp&@(`vt1XF&HY#kD&Ui?7g4;;-n`rtTw!}sbimi@& zxxAyW3uFmOSAzYnNa`|g$6YbNbSc75l<7!}zv=psi?SS~SZK(Q|9ut`<-QAtI#asT z<4~$y+#jv#!n2)M-10dgY$tj%;3z^jH6DcB%4f`p-17j_bE;2+Wtp5O!mRsNe literal 5925 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 delta 311 zcmWNM&o9Dp7{_1FXEJ>g>43&oB0{286El{L3i;J4rHO+!*KQm*I@)}1PBte_wwxW< z%wORTaLJq z@M{JbWrPSp<{2YRh&_Wl6CjIaYaBVgd&dG4{FpS{_=`(=_!X2DHeiN><@H1#Ga$rYdZyLY@lS(#4Jp zvMXWs^xeK>DM*>3R4GY=vixyida0NoRg>hZZhT>(}EH$Ek7~x86rzCzg_Y TICYezQ(dgnO%b>K<_-S?D3>!# diff --git a/out/production/mathStudyApp/model/Generator$1.class b/out/production/mathStudyApp/model/Generator$1.class index d64e0b34545df51f59faa396329ec9e5e09117f5..2f8516da545a49203daca4924f53c044fc467c3a 100644 GIT binary patch delta 13 Ucmcc2dYN@YJrkqJn+a diff --git a/out/production/mathStudyApp/model/Generator.class b/out/production/mathStudyApp/model/Generator.class index c58172cd32c6d4534011d5d4b1afc74143a94717..58ca8287993a1056523569e98b0d15b4f1482d05 100644 GIT binary patch delta 510 zcmXYuO-q$w5QeWuEHXRl@!0#GudKAR#4O7cJw;_7M>H*?G!ity4ks(pu#Ef&%gRd4 z8iRrsf`1@v83eA{MvImS{R3B`8@&TJ&pZrs&CGqzpW3zBuYTc~1iiir;DCCl~oeGs}uAT(;4jvu?yfUZwA;A6#WC*T_|mFxMsEhP8X?tWIUS z*uhPki}|+X#oel{`%&}!mf|8wh8|Vi5|_dwt&MJL^Fr*%W!}84-z=mRQsPz zZ*qO&`o%pEHz4kzxJTj!#XS}`IOSwEt#rrk@?yh99 delta 470 zcmXYt%S+T@6o#KKx=rIiznN*ATVv@2N;=;1GF|LKDS0cy#>g^*(kbw6gqfBiI7ltx zxM|a-e?V#(2tv>(o_8<1m0f%31w0NC#7Bs7!nWjf zxwLJ1%k^~>0mU38$}wUjh?CNtCP^hHxuI7#r|97{{gg67+E#;~UAZ-fKE^7=R1qe_ zHL7W+hC9^KN5*zTZEojlT{z&{TJbcZkwY|boUGcO=NuQfsB?=;0B`vBRDQ??vB=750=B^gX*>b6 qmfdrlVV(-!X!p1D%8z?2@|Yz%kl1hq`<@tZ@2o62jQ{`u delta 13 UcmaFF`iONy9}^?%%MntD^Rp?+Y>~VVgGEXvgSyeAY!;=AWb_VfG8*l~ z^(>#^S=&4NaMmT{UG%h6j}Lt>vn3V~Mk9jZXA#B5q)3cDaRww9lVnPY1!-1f*pOxG zUng>0ak!D^PJt&SUX*!L;X{=lH3?7`gNB$i#le&gE$RC1;mQ!D$%MAdQO9pki73wv FjsA}KA2a{} delta 159 zcmWNK!3qIk7)8&wWAWDv%`lh-lPSZPXHb-~vypfTOB*E*pk`^MY-FRREXmRv*vTWz zUh(hlt#i*k`aAz}Q=*c)^2ANw>MZLeHNYT;iA{k9MSLtm-A0s{P-c$9iV9n*>@|PD z<%-9HI#0cL(d0vmjDRm~euQGv5r?h>Skk8_1D%ING9~7u9~b1cbCbG8BoZfMbM^-> CIvfrF diff --git a/out/production/mathStudyApp/model/Login$Account.class b/out/production/mathStudyApp/model/Login$Account.class index f9a637f181eaa31d8f5a212d3f832afc6846053a..aa24861a6c77b8aeade85b876d7a52afa6c83287 100644 GIT binary patch delta 33 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 literal 6739 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 B*Pj3Y diff --git a/out/production/mathStudyApp/model/Paper.class b/out/production/mathStudyApp/model/Paper.class index 8e5f9524fe139e44829f7cc2cde701584406fded..ee327760426720fe9ec38d9debf1dd93088739b4 100644 GIT binary patch delta 35 qcmdnRwu@~;CzBu_0}BH`11Ez310RDRgD`{8aAWWU?Hy3;=Zb1>FDu diff --git a/out/production/mathStudyApp/model/Save.class b/out/production/mathStudyApp/model/Save.class index c21ca61f6ac9f34333641931dc5f7753d835a0f5..e08888b613bc9f5dc9e75ef4207d697475f83805 100644 GIT binary patch delta 109 zcmeB_?3LW`j+2ph@_SBsMw`w2T#}5zK@1`c3=9Gcd<;Sik_^HON(|x*stlqGY7Alw z77P*$K0whZ1}TON25E*e1{sEa23dwF3~~%Jf&BRl3Jhz2a>s$XP663x7!(;EFeq;> I=N4iF0Pu7YZvX%Q delta 105 zcmeB`?3CQ_j+2pl@_SBsMvKk-T#}6behk743=F&sd<^^yN(@2_stf`QY7Bx57C>p5D8BPJ&XBcD{9x%vluI3hE F1OT;25#0a) diff --git a/out/production/mathStudyApp/view/ExamFrame.class b/out/production/mathStudyApp/view/ExamFrame.class index dadb4671d5c9cc6b6e303ebda263a7921a59ca2f..e37f665387c6f7a584f82f3fdec5a93699253d63 100644 GIT binary patch delta 419 zcmWlVO-s~K7{z~Agi@iLH%C%ILvS2M(=@bl(rKts$q8}{HKQgfQz*%xB$Zku)zpmg zzxb|XZZbt^<;HEFK-}^#Xa{t&pppMPqr>q|LfTGE%RHgW3=_8#?!)SYZ1mvfE*^TRqEEv8#2FBKpQP?V z9`b^ubv)hXpZ)6@YrV!<5TC;{1sTG}Fn-}Oo^xKk0Y(&SRJL9b>P#6bB+ZnS(NsYmbWZ7D}-6Ket*AloZ?cO@dr)k3HT$>;S|69 E528p_qyPW_ delta 406 zcmW-dw@L&+6h+U7U;9;u~>IvS~`g9b+AoT8aoTJ)8%O}*(4qboZLACP-D zI*FuO(Q3Ae$!4-M3jgvA zUrx^Xm|ydB(-t9A!gw(V5Fv_5R<=ZpDsdbV%t^8&#hNr*GVFvnlH*LC3q`I%-zoE; z!V`-ZHQo&QF;!F?*V1ie;;wW<*YE%%DcblLyL){TucOf*NK?u!DYYrk5mR6KT`~3K J9k?_9;SX76AEN*O delta 169 zcmWNKyAHu%07g%fhFDs0zm~cS(zvupQ;Er7H`r`m!pZ~uRI!<;Nj4A$h>l4mEaBSp@XxKQCrl{+;a z)Oph2MT<8sKRiWcBy4@6jKxYf{5}-G6$gD&w$NlHMF*3veCT0e%QcW)hrYyPC}zR^ EAOBb#ivR!s diff --git a/out/production/mathStudyApp/view/LoginFrame.class b/out/production/mathStudyApp/view/LoginFrame.class index 02d6b246234d7c6e95c4db03a1560ac64b1c2d78..b8a107004d36496a64a9b18e02cd9070e56bce8d 100644 GIT binary patch delta 175 zcmWNKI}1T!0EQpMz+p4E9M_P$nrQ(+q2+$(Pm=IIK%!#lf%98{vxF9e9 delta 175 zcmWNKI}1T^7{-5!fkV0F)*=ev@}wT89>0A-prB$2Wa(e=_Au1wH3GP_QR( delta 133 zcmZ1__fB?0D>vhW$!*-9t*sdN7#J9o88{eJ7=##98N?aX7<3ra8LSyJ7$O-o8Oj;7 z7^X64GwcM4?q|?txX576aEHNy;UR0?pE65Ma<} iP+%|sLPG{e1|x<524jXe1`~z?22+MI2D8awd{+P@9vTn; diff --git a/out/production/mathStudyApp/view/MainMenuFrame.class b/out/production/mathStudyApp/view/MainMenuFrame.class index 4f406ae099ec07181f5158ebfae01b975f5576d5..de0d46412888d46146cac3672dcc2748625593aa 100644 GIT binary patch delta 151 zcmXYpxeftg7y#!F#qQ4%3hUf;#IcT$=tLvYI1-VlbQ(I92T*C0U!w5{B9V9~r8mG| zXlEuP?#+FCEH#v`b)QX10x80{BuJAZLy;_1@(d_2#$$oc+RzOpc9hvu;b4j*0cVFixHPm&pzQOG*c0 delta 19 bcmdnZwwrCkVkX9>$xE0b7+WU)WwHYRN;(HY diff --git a/out/production/mathStudyApp/view/RegisterFrame.class b/out/production/mathStudyApp/view/RegisterFrame.class index 65dca4fe3ebd66ebc24ecedcdf4cd8b08f26aa6a..eecd276e3978fc9c8fe2c6b58b8c678662ee975c 100644 GIT binary patch delta 419 zcmWlVPe{`N6vsc0AZjteifT0vl7d3A!b;j)GN;Zzp^dfvFtZ44MavRfDV9qe^XI{T zO+;%_GZ2L_k|AEab?72?Q0UOXE^~O>HR{mo^4{a|_ zgKQFETR*VFFh3b#m#DZwT})bkNuAVd|3BT3KqhgfKuT|Fh+9~>tt59SA)plPv~gES OI<(%WlLztd*3>`pR%C1d delta 384 zcmWNNNhkzx6okL^YV+$dSt%)(VFxKqZvxdeN#*!GuJ`R+N8>Og8E^ZDk za-k>(CtO|S;vHYT_xpX{Tg&}3UZ47D626blzZ|!p`#bI{Kb>Ythc^)f5J@mmBoj>@ zF_aTa1A01$V*~>;#IsByyCiWbTQ{U|PbyEO@k%2`)2l)hN1%xEbQUW+`f VOr~BBzK@N0}F!)gCK(_gEWH}g93v%gDQh0gEfN`gEvqlkwJ!`ltGqZGJ`zB zVxa6g21SOQ3`z_K8I&1LGN>?IWKd(c!Jy9Yh(Uwl9fK~zX9m5=tGK6fY64BwV&G-a Pp6tOBz^FcXCQlLob>kK3 delta 113 zcmew@`CD>BBzGV;0}BHWgCGMhgERvlg8~CTgDQ|`%^<|!%^=K>$RNT{${@-xnL(Uk zF@prdItEFGoeWY82Z5?jGRQDoWRPRH!647@2&nTNQ0Hd`waKfvr*bL+O;rM#sXW<( MCxB6Y@=Ts207 we need to close paren - // Simple approach: for each "Math.sin(Math.toRadians(", there will be following number or parenthesis, we close later with "))" - // Replace our .pow2 placeholder into Math.pow(x,2) - // Handle pow2: we earlier converted x^2 -> x.pow2, so replace (\d+|...) .pow2 to Math.pow(that,2) - // For simplicity, replace pattern "([0-9)]+)\\.pow2" with "Math.pow($1,2)" — approximate - s = s.replaceAll("(\\d+)\\.pow2", "Math.pow($1,2)"); - // If there are parentheses before .pow2: ") .pow2" unlikely; accept some limitations. - // For sin/cos/tan we changed 'sin(' -> 'Math.sin(Math.toRadians(' so must add two closing ) after the argument. - // To keep it simple, replace "Math.sin(Math.toRadians(" -> "Math.sin(Math.toRadians(" and later we will ensure parentheses in evaluation by appending "))" when needed. - // We'll also replace any leftover "^2" directly - s = s.replaceAll("\\^2", ""); - // Finally, replace any multiple spaces - s = s.replaceAll("\\s+", ""); - return s; - } - - // 评估表达式数值(double),若失败抛异常 // 评估表达式数值(double),若失败抛异常 private static double evalExpression(String expr) throws ScriptException { return ExpressionEvaluator.evaluate(expr); } - /** * 生成试卷:返回 Paper 对象(questions, options, correctIndex) */ @@ -78,7 +57,6 @@ public class Create { // 判断是否为整数答案 boolean isIntAnswer = Math.abs(correctVal - Math.round(correctVal)) < 1e-6; - // 产生三个干扰值 Set optsSet = new LinkedHashSet<>(); optsSet.add(correctStr); @@ -90,7 +68,9 @@ public class Create { if (isIntAnswer) { // 整数题:干扰项也是整数(偏差 ±1~±10) delta = r.nextInt(10) + 1; - if (r.nextBoolean()) delta = -delta; + if (r.nextBoolean()) { + delta = -delta; + } } else { // 小数题:随机偏差比例 delta = (Math.abs(correctVal) < 1e-6) @@ -122,7 +102,9 @@ public class Create { try { // 为保存,我们保存原题干列表(文本) java.util.List raw = new ArrayList<>(); - for (String s : paper) raw.add(s); + for (String s : paper) { + raw.add(s); + } Save.savePaper(user.username, raw); } catch (RuntimeException re) { // 抛给 UI 处理(但仍返回 Paper) @@ -143,13 +125,17 @@ public class Create { } private static int findIndex(String[] arr, String target) { - for (int i = 0; i < arr.length; i++) if (arr[i].equals(target)) return i; + for (int i = 0; i < arr.length; i++) { + if (arr[i].equals(target)) { + return i; + } + } return 0; } private static String formatNumber(double v) { if (Math.abs(v - Math.round(v)) < 1e-6) { - return String.valueOf((long)Math.round(v)); + return String.valueOf((long) Math.round(v)); } else { return String.format("%.3f", v); } diff --git a/src/model/ExpressionEvaluator.java b/src/model/ExpressionEvaluator.java index db5a20a..0fc214d 100644 --- a/src/model/ExpressionEvaluator.java +++ b/src/model/ExpressionEvaluator.java @@ -1,9 +1,17 @@ package model; -import java.util.*; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Stack; +import java.util.StringTokenizer; + public class ExpressionEvaluator { private static final Map PRECEDENCE = new HashMap<>(); + static { PRECEDENCE.put("+", 1); PRECEDENCE.put("-", 1); @@ -26,12 +34,12 @@ public class ExpressionEvaluator { private static List toRPN(String expr) { List output = new ArrayList<>(); Stack stack = new Stack<>(); - - // 正则拆分 token(数字、函数、符号、括号) StringTokenizer tokenizer = new StringTokenizer(expr, "+-*/^() ", true); while (tokenizer.hasMoreTokens()) { String token = tokenizer.nextToken().trim(); - if (token.isEmpty()) continue; + if (token.isEmpty()) { + continue; + } if (token.matches("[0-9.]+")) { // 数字 output.add(token); @@ -52,7 +60,6 @@ public class ExpressionEvaluator { if (!stack.isEmpty() && stack.peek().equals("(")) { stack.pop(); } - // 如果栈顶是函数,弹出函数 if (!stack.isEmpty() && stack.peek().matches("[a-zA-Z]+")) { output.add(stack.pop()); } @@ -76,20 +83,39 @@ public class ExpressionEvaluator { double b = stack.pop(); double a = stack.pop(); switch (token) { - case "+": stack.push(a + b); break; - case "-": stack.push(a - b); break; - case "*": stack.push(a * b); break; - case "/": stack.push(a / b); break; - case "^": stack.push(Math.pow(a, b)); break; + case "+": + stack.push(a + b); + break; + case "-": + stack.push(a - b); + break; + case "*": + stack.push(a * b); + break; + case "/": + stack.push(a / b); + break; + case "^": + stack.push(Math.pow(a, b)); + break; } } else { // 函数 double a = stack.pop(); switch (token.toLowerCase()) { - case "sin": stack.push(Math.sin(Math.toRadians(a))); break; - case "cos": stack.push(Math.cos(Math.toRadians(a))); break; - case "tan": stack.push(Math.tan(Math.toRadians(a))); break; - case "sqrt": stack.push(Math.sqrt(a)); break; - default: throw new RuntimeException("未知函数: " + token); + case "sin": + stack.push(Math.sin(Math.toRadians(a))); + break; + case "cos": + stack.push(Math.cos(Math.toRadians(a))); + break; + case "tan": + stack.push(Math.tan(Math.toRadians(a))); + break; + case "sqrt": + stack.push(Math.sqrt(a)); + break; + default: + throw new RuntimeException("未知函数: " + token); } } } diff --git a/src/model/Generator.java b/src/model/Generator.java index b26584a..da2f306 100644 --- a/src/model/Generator.java +++ b/src/model/Generator.java @@ -1,6 +1,11 @@ package model; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Random; +import java.util.Set; import java.util.stream.Collectors; /** @@ -31,7 +36,8 @@ public class Generator extends QuestionGenerator { } } if (generated.size() < n) { - System.out.println("注意:无法生成足够的不重复题目,已生成 " + generated.size() + " 道题(请求 " + n + " 道)"); + System.out.println( + "注意:无法生成足够的不重复题目,已生成 " + generated.size() + " 道题(请求 " + n + " 道)"); } return new ArrayList<>(generated); } @@ -59,7 +65,8 @@ public class Generator extends QuestionGenerator { boolean useParens = RAND.nextBoolean(); if (useParens && operands >= 3 && RAND.nextBoolean()) { sb.append("("); - sb.append(randInt(1, 100)).append(" ").append(randomChoice(ops)).append(" ").append(randInt(1, 100)); + sb.append(randInt(1, 100)).append(" ").append(randomChoice(ops)).append(" ") + .append(randInt(1, 100)); sb.append(")"); for (int i = 2; i < operands; i++) { sb.append(" ").append(randomChoice(ops)).append(" ").append(randInt(1, 100)); @@ -75,8 +82,11 @@ public class Generator extends QuestionGenerator { public String genMiddle(int operands) { String expr = genPrimary(operands); - if (RAND.nextBoolean()) expr = applySquare(expr); - else expr = applySqrt(expr); + if (RAND.nextBoolean()) { + expr = applySquare(expr); + } else { + expr = applySqrt(expr); + } return expr; } @@ -88,7 +98,9 @@ public class Generator extends QuestionGenerator { public String applySquare(String expr) { List spans = findNumberSpans(expr); - if (spans.isEmpty()) return expr + "^2"; + if (spans.isEmpty()) { + return expr + "^2"; + } int[] s = spans.get(RAND.nextInt(spans.size())); String before = expr.substring(0, s[0]); String num = expr.substring(s[0], s[1]); @@ -98,7 +110,9 @@ public class Generator extends QuestionGenerator { public String applySqrt(String expr) { List spans = findNumberSpans(expr); - if (spans.isEmpty()) return "sqrt(" + expr + ")"; + if (spans.isEmpty()) { + return "sqrt(" + expr + ")"; + } int[] s = spans.get(RAND.nextInt(spans.size())); String before = expr.substring(0, s[0]); String num = expr.substring(s[0], s[1]); @@ -109,7 +123,9 @@ public class Generator extends QuestionGenerator { public String applyTrig(String expr) { List spans = findNumberSpans(expr); String func = randomChoice(Arrays.asList("sin", "cos", "tan")); - if (spans.isEmpty()) return func + "(" + expr + ")"; + if (spans.isEmpty()) { + return func + "(" + expr + ")"; + } int[] s = spans.get(RAND.nextInt(spans.size())); String before = expr.substring(0, s[0]); String num = expr.substring(s[0], s[1]); @@ -124,10 +140,14 @@ public class Generator extends QuestionGenerator { while (i < n) { if (Character.isDigit(chs[i])) { int j = i; - while (j < n && (Character.isDigit(chs[j]))) j++; + while (j < n && (Character.isDigit(chs[j]))) { + j++; + } spans.add(new int[]{i, j}); i = j; - } else i++; + } else { + i++; + } } return spans; } diff --git a/src/model/LanguageSwitch.java b/src/model/LanguageSwitch.java index 50bb180..a3c0501 100644 --- a/src/model/LanguageSwitch.java +++ b/src/model/LanguageSwitch.java @@ -1,6 +1,7 @@ package model; public class LanguageSwitch { + public static String levelToChinese(Login.Level l) { return switch (l) { case PRIMARY -> "小学"; diff --git a/src/model/LoadFile.java b/src/model/LoadFile.java index be1c88e..cb8a7a5 100644 --- a/src/model/LoadFile.java +++ b/src/model/LoadFile.java @@ -1,12 +1,16 @@ package model; -import java.nio.charset.StandardCharsets; -import java.util.*; -import java.nio.file.*; import java.io.IOException; +import java.nio.charset.StandardCharsets; import java.nio.file.DirectoryStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; import java.util.stream.Collectors; + /** * 读取用户文件夹下已有题目的所有题目文本(用于查重) */ @@ -24,7 +28,9 @@ public class LoadFile { StringBuilder cur = new StringBuilder(); for (String line : lines) { if (line.matches("^\\s*\\d+\\..*")) { - if (!cur.isEmpty()) all.add(cur.toString().trim()); + if (!cur.isEmpty()) { + all.add(cur.toString().trim()); + } cur.setLength(0); cur.append(line.replaceFirst("^\\s*\\d+\\.", "").trim()); } else { @@ -34,16 +40,21 @@ public class LoadFile { cur.setLength(0); } } else { - if (!cur.isEmpty()) cur.append(" "); + if (!cur.isEmpty()) { + cur.append(" "); + } cur.append(line.trim()); } } } - if (!cur.isEmpty()) all.add(cur.toString().trim()); + if (!cur.isEmpty()) { + all.add(cur.toString().trim()); + } } } catch (IOException e) { throw new RuntimeException("读取题目文件失败:" + e.getMessage(), e); } - return all.stream().map(String::trim).filter(s -> !s.isEmpty()).distinct().collect(Collectors.toList()); + return all.stream().map(String::trim).filter(s -> !s.isEmpty()).distinct() + .collect(Collectors.toList()); } } diff --git a/src/model/Login.java b/src/model/Login.java index 25a0269..54192f2 100644 --- a/src/model/Login.java +++ b/src/model/Login.java @@ -1,10 +1,14 @@ package model; -import java.util.Map; -import java.util.HashMap; -import java.io.*; +import java.io.BufferedWriter; +import java.io.IOException; +import java.io.Serializable; import java.nio.charset.StandardCharsets; -import java.nio.file.*; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.HashMap; +import java.util.Map; /** @@ -61,17 +65,30 @@ public class Login { } // 注册(GUI 调用),若用户名已存在返回 false + // 注册(GUI 调用),若用户名或邮箱已存在返回 false public static synchronized boolean register(String username, String password, Level level, String email) { + // 检查用户名是否重复 if (accounts.containsKey(username)) { return false; } + + // 检查邮箱是否重复 + for (Account existing : accounts.values()) { + if (existing.email != null && existing.email.equalsIgnoreCase(email)) { + // 邮箱重复,不区分大小写 + return false; + } + } + + // 都不重复,则注册成功 Account acc = new Account(username, password, level, email); accounts.put(username, acc); persistToFile(); return true; } + // 修改密码(需提供原密码),返回是否成功 public static synchronized boolean changePassword(String username, String oldPwd, String newPwd) { Account acc = accounts.get(username); diff --git a/src/model/Paper.java b/src/model/Paper.java index dc09a27..f2e73a4 100644 --- a/src/model/Paper.java +++ b/src/model/Paper.java @@ -6,6 +6,7 @@ import java.util.List; * 试卷封装:每一道题为字符串(题干),每题有四个选项(字符串),且标记正确选项索引 */ public class Paper { + public final List questions; public final List options; // 每题 options[i] 长度为4 public final int[] correctIndex; // 每题正确选项下标 0..3 diff --git a/src/model/Save.java b/src/model/Save.java index 23f2a9a..8b5cd7d 100644 --- a/src/model/Save.java +++ b/src/model/Save.java @@ -2,17 +2,22 @@ package model; import java.io.BufferedWriter; import java.io.IOException; -import java.nio.file.*; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; -import java.nio.charset.StandardCharsets; public class Save { + public static String savePaper(String username, List paper) { Path userDir = Paths.get("data", username); try { - if (!Files.exists(userDir)) Files.createDirectories(userDir); + if (!Files.exists(userDir)) { + Files.createDirectories(userDir); + } } catch (IOException e) { throw new RuntimeException("无法创建用户文件夹:" + e.getMessage(), e); } diff --git a/src/view/ExamFrame.java b/src/view/ExamFrame.java index 424b579..eda873e 100644 --- a/src/view/ExamFrame.java +++ b/src/view/ExamFrame.java @@ -1,7 +1,20 @@ package view; -import javax.swing.*; -import java.awt.*; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JRadioButton; +import javax.swing.ButtonGroup; +import javax.swing.BorderFactory; +import javax.swing.SwingConstants; + +import java.awt.BorderLayout; +import java.awt.FlowLayout; +import java.awt.Font; +import java.awt.GridLayout; + import model.Paper; import model.Login; @@ -9,6 +22,7 @@ import model.Login; * 答题界面(选择题,四选一) */ public class ExamFrame extends JFrame { + private Paper paper; private Login.Account user; private int index = 0; @@ -35,12 +49,12 @@ public class ExamFrame extends JFrame { qLabel = new JLabel("", SwingConstants.LEFT); qLabel.setFont(new Font("Serif", Font.PLAIN, 16)); JPanel top = new JPanel(new BorderLayout()); - top.setBorder(BorderFactory.createEmptyBorder(10,10,10,10)); + top.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); top.add(qLabel, BorderLayout.CENTER); - centerPanel = new JPanel(new GridLayout(4,1,6,6)); + centerPanel = new JPanel(new GridLayout(4, 1, 6, 6)); group = new ButtonGroup(); - for (int i=0;i<4;i++){ + for (int i = 0; i < 4; i++) { radioBtns[i] = new JRadioButton(); group.add(radioBtns[i]); centerPanel.add(radioBtns[i]); @@ -63,33 +77,43 @@ public class ExamFrame extends JFrame { setVisible(true); } - /** 显示一道题 */ + /** + * 显示一道题 + */ private void showQuestion() { if (index >= paper.size()) { showSubmitPage(); return; } String q = paper.questions.get(index); - qLabel.setText("第 " + (index+1) + " 题: " + q + ""); + qLabel.setText("第 " + (index + 1) + " 题: " + q + ""); String[] opts = paper.options.get(index); - for (int i=0;i<4;i++) { + for (int i = 0; i < 4; i++) { radioBtns[i].setText(opts[i]); } // 清除上一次选择 group.clearSelection(); } - /** 提交当前题 */ + /** + * 提交当前题 + */ private void submitAnswer() { int selected = -1; - for (int i=0;i<4;i++) if (radioBtns[i].isSelected()) selected = i; + for (int i = 0; i < 4; i++) { + if (radioBtns[i].isSelected()) { + selected = i; + } + } if (selected == -1) { JOptionPane.showMessageDialog(this, "请选择一个选项后再提交"); return; } // 判断对错 - if (selected == paper.correctIndex[index]) score++; + if (selected == paper.correctIndex[index]) { + score++; + } index++; if (index < paper.size()) { @@ -100,7 +124,9 @@ public class ExamFrame extends JFrame { } } - /** 做完所有题目后显示确认提交界面 */ + /** + * 做完所有题目后显示确认提交界面 + */ private void showSubmitPage() { // 移除中间题目区域和按钮 getContentPane().remove(centerPanel); @@ -134,10 +160,12 @@ public class ExamFrame extends JFrame { repaint(); } - /** 完成考试 → 进入成绩界面 */ + /** + * 完成考试 → 进入成绩界面 + */ private void finishExam() { int total = paper.size(); - double percent = total==0 ? 0 : (100.0 * score / total); + double percent = total == 0 ? 0 : (100.0 * score / total); dispose(); new ResultFrame(user, score, total, percent); } diff --git a/src/view/ExamSetupFrame.java b/src/view/ExamSetupFrame.java index a67fcf4..0da4e57 100644 --- a/src/view/ExamSetupFrame.java +++ b/src/view/ExamSetupFrame.java @@ -1,7 +1,16 @@ package view; -import javax.swing.*; -import java.awt.*; +import javax.swing.JButton; +import javax.swing.JComboBox; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JTextField; +import javax.swing.BorderFactory; + +import java.awt.GridLayout; + import controller.FunctionController; import model.Login; import model.LanguageSwitch; @@ -10,6 +19,7 @@ import model.LanguageSwitch; * 出题设置:选择/切换难度(显示当前账户默认难度),输入题数(10-30) */ public class ExamSetupFrame extends JFrame { + private JTextField numberField; private JComboBox levelBox; private FunctionController controller; @@ -24,10 +34,10 @@ public class ExamSetupFrame extends JFrame { setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - JPanel p = new JPanel(new GridLayout(4,2,8,8)); - p.setBorder(BorderFactory.createEmptyBorder(8,8,8,8)); + JPanel p = new JPanel(new GridLayout(4, 2, 8, 8)); + p.setBorder(BorderFactory.createEmptyBorder(8, 8, 8, 8)); p.add(new JLabel("当前难度:")); - levelBox = new JComboBox<>(new String[]{"小学","初中","高中"}); + levelBox = new JComboBox<>(new String[]{"小学", "初中", "高中"}); levelBox.setSelectedItem(LanguageSwitch.levelToChinese(user.level)); p.add(levelBox); @@ -56,7 +66,10 @@ public class ExamSetupFrame extends JFrame { } }); - backBtn.addActionListener(e -> { dispose(); new LoginFrame(); }); + backBtn.addActionListener(e -> { + dispose(); + new LoginFrame(); + }); setVisible(true); } diff --git a/src/view/LoginFrame.java b/src/view/LoginFrame.java index 01cea47..bda2dbb 100644 --- a/src/view/LoginFrame.java +++ b/src/view/LoginFrame.java @@ -1,9 +1,17 @@ package view; -import javax.swing.*; -import java.awt.*; +import java.awt.GridLayout; + +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JTextField; +import javax.swing.JPasswordField; +import javax.swing.BorderFactory; + import model.Login; -import controller.AssignController; /** * 登录窗口 @@ -20,7 +28,7 @@ public class LoginFrame extends JFrame { setLocationRelativeTo(null); JPanel p = new JPanel(new GridLayout(4, 2, 8, 8)); - p.setBorder(BorderFactory.createEmptyBorder(10,10,10,10)); + p.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); p.add(new JLabel("用户名:")); usernameField = new JTextField(); p.add(usernameField); @@ -44,7 +52,8 @@ public class LoginFrame extends JFrame { String u = usernameField.getText().trim(); String pwd = new String(passwordField.getPassword()).trim(); if (u.isEmpty() || pwd.isEmpty()) { - JOptionPane.showMessageDialog(this, "请输入用户名和密码", "提示", JOptionPane.INFORMATION_MESSAGE); + JOptionPane.showMessageDialog(this, "请输入用户名和密码", "提示", + JOptionPane.INFORMATION_MESSAGE); return; } Login.Account acc = Login.login(u, pwd); @@ -52,7 +61,8 @@ public class LoginFrame extends JFrame { dispose(); new MainMenuFrame(acc); // 登录后先进入主菜单 } else { - JOptionPane.showMessageDialog(this, "用户名或密码错误", "登录失败", JOptionPane.ERROR_MESSAGE); + JOptionPane.showMessageDialog(this, "用户名或密码错误", "登录失败", + JOptionPane.ERROR_MESSAGE); } }); diff --git a/src/view/MainMenuFrame.java b/src/view/MainMenuFrame.java index f80f3ac..7fdc377 100644 --- a/src/view/MainMenuFrame.java +++ b/src/view/MainMenuFrame.java @@ -1,56 +1,94 @@ package view; -import javax.swing.*; -import java.awt.*; +import java.awt.GridLayout; + +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JPasswordField; +import javax.swing.BorderFactory; + import model.Login; + /** - * 登录成功后的主菜单(可修改密码、开始出题、登出) - * 现在由 ExamSetupFrame 直接替代,但保留此类可拓展 + * 登录成功后的主菜单(可修改密码、开始出题、登出) 现在由 ExamSetupFrame 直接替代,但保留此类可拓展 */ public class MainMenuFrame extends JFrame { + public MainMenuFrame(Login.Account user) { setTitle("主菜单 - " + user.username); - setSize(400,200); + setSize(400, 200); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - JPanel p = new JPanel(new GridLayout(3,1,10,10)); + JPanel p = new JPanel(new GridLayout(3, 1, 10, 10)); JButton changePwd = new JButton("修改密码"); JButton start = new JButton("出题设置"); JButton logout = new JButton("退出登录"); - p.add(start); p.add(changePwd); p.add(logout); + p.add(start); + p.add(changePwd); + p.add(logout); add(p); - start.addActionListener(e -> { new ExamSetupFrame(user); dispose(); }); + start.addActionListener(e -> { + new ExamSetupFrame(user); + dispose(); + }); changePwd.addActionListener(e -> new ChangePasswordDialog(this, user)); - logout.addActionListener(e -> { dispose(); new LoginFrame(); }); + logout.addActionListener(e -> { + dispose(); + new LoginFrame(); + }); setVisible(true); } // 内部类:修改密码对话框 static class ChangePasswordDialog extends JDialog { + public ChangePasswordDialog(JFrame owner, Login.Account user) { super(owner, "修改密码", true); - setSize(350,200); + setSize(350, 200); setLocationRelativeTo(owner); - JPanel p = new JPanel(new GridLayout(4,2,6,6)); - p.setBorder(BorderFactory.createEmptyBorder(6,6,6,6)); - p.add(new JLabel("旧密码:")); JPasswordField oldp = new JPasswordField(); p.add(oldp); - p.add(new JLabel("新密码:")); JPasswordField newp = new JPasswordField(); p.add(newp); - p.add(new JLabel("再次输入新密码:")); JPasswordField newp2 = new JPasswordField(); p.add(newp2); - JButton ok = new JButton("确定"); JButton cancel = new JButton("取消"); p.add(ok); p.add(cancel); + JPanel p = new JPanel(new GridLayout(4, 2, 6, 6)); + p.setBorder(BorderFactory.createEmptyBorder(6, 6, 6, 6)); + p.add(new JLabel("旧密码:")); + JPasswordField oldp = new JPasswordField(); + p.add(oldp); + p.add(new JLabel("新密码:")); + JPasswordField newp = new JPasswordField(); + p.add(newp); + p.add(new JLabel("再次输入新密码:")); + JPasswordField newp2 = new JPasswordField(); + p.add(newp2); + JButton ok = new JButton("确定"); + JButton cancel = new JButton("取消"); + p.add(ok); + p.add(cancel); add(p); ok.addActionListener(a -> { String oldPwd = new String(oldp.getPassword()).trim(); String np = new String(newp.getPassword()).trim(); String np2 = new String(newp2.getPassword()).trim(); - if (!np.equals(np2)) { JOptionPane.showMessageDialog(this, "两次密码不一致"); return; } - if (!Login.validatePasswordRules(np)) { JOptionPane.showMessageDialog(this, "密码不满足规则"); return; } + if (!np.equals(np2)) { + JOptionPane.showMessageDialog(this, "两次密码不一致"); + return; + } + if (!Login.validatePasswordRules(np)) { + JOptionPane.showMessageDialog(this, "密码不满足规则"); + return; + } boolean okr = Login.changePassword(user.username, oldPwd, np); - if (okr) { JOptionPane.showMessageDialog(this, "修改成功"); dispose(); } - else JOptionPane.showMessageDialog(this, "旧密码错误"); + if (okr) { + JOptionPane.showMessageDialog(this, "修改成功"); + dispose(); + } else { + JOptionPane.showMessageDialog(this, "旧密码错误"); + } }); cancel.addActionListener(a -> dispose()); setVisible(true); diff --git a/src/view/RegisterFrame.java b/src/view/RegisterFrame.java index a9627c6..a08c1a6 100644 --- a/src/view/RegisterFrame.java +++ b/src/view/RegisterFrame.java @@ -1,11 +1,28 @@ package view; -import javax.swing.*; -import java.awt.*; +import java.awt.GridLayout; import java.util.Properties; import java.util.Random; -import jakarta.mail.*; -import jakarta.mail.internet.*; + +import javax.swing.JButton; +import javax.swing.JComboBox; +import javax.swing.JDialog; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JPasswordField; +import javax.swing.JTextField; +import javax.swing.BorderFactory; + +import jakarta.mail.Authenticator; +import jakarta.mail.Message; +import jakarta.mail.PasswordAuthentication; +import jakarta.mail.Session; +import jakarta.mail.Transport; +import jakarta.mail.internet.InternetAddress; +import jakarta.mail.internet.MimeMessage; + import model.Login; import model.LanguageSwitch; @@ -13,6 +30,7 @@ import model.LanguageSwitch; * 注册界面(使用 QQ 邮箱发送验证码) */ public class RegisterFrame extends JDialog { + private JTextField usernameField; private JTextField emailField; private JComboBox levelBox; @@ -106,7 +124,7 @@ public class RegisterFrame extends JDialog { Login.Level lv = LanguageSwitch.chineseToLevel(levelStr); boolean ok = Login.register(u, pwd, lv, email); if (!ok) { - JOptionPane.showMessageDialog(this, "用户名已存在,请换一个用户名"); + JOptionPane.showMessageDialog(this, "用户名或邮箱已存在,请换一个用户名"); return; } JOptionPane.showMessageDialog(this, "注册成功,请用新用户登录"); @@ -126,7 +144,6 @@ public class RegisterFrame extends JDialog { props.put("mail.smtp.auth", "true"); props.put("mail.smtp.ssl.enable", "true"); // ← 开启 SSL - Session session = Session.getInstance(props, new Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(FROM_EMAIL, AUTH_CODE); diff --git a/src/view/ResultFrame.java b/src/view/ResultFrame.java index 1e424d2..a5186c4 100644 --- a/src/view/ResultFrame.java +++ b/src/view/ResultFrame.java @@ -1,21 +1,29 @@ package view; -import javax.swing.*; -import java.awt.*; +import java.awt.FlowLayout; +import java.awt.GridLayout; + +import javax.swing.BorderFactory; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JPanel; + import model.Login; /** * 显示成绩并提供“退出或继续做题”的选择 */ public class ResultFrame extends JFrame { + public ResultFrame(Login.Account user, int score, int total, double percent) { setTitle("成绩 - " + user.username); - setSize(360,220); + setSize(360, 220); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - JPanel p = new JPanel(new GridLayout(5,1,6,6)); - p.setBorder(BorderFactory.createEmptyBorder(10,10,10,10)); + JPanel p = new JPanel(new GridLayout(5, 1, 6, 6)); + p.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); p.add(new JLabel("用户名: " + user.username)); p.add(new JLabel("得分: " + score + " / " + total)); p.add(new JLabel(String.format("百分比: %.2f%%", percent)));