From d7553520ce22940829af051050e7c2b057fbd892 Mon Sep 17 00:00:00 2001 From: Chunyu Date: Fri, 28 Aug 2026 13:44:21 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=8E=B0=E4=BB=A3=E5=8C=96=E7=BF=BB?= =?UTF-8?q?=E9=A1=B5=E7=BB=84=E4=BB=B6=20+=20=E5=AE=8C=E6=95=B4=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 Pagination 通用组件:首页/上一页/页码/下一页/末页导航 - PickModal 和 SwapModal 集成分页功能,每页20项 - 搜索/筛选切换自动回到第1页 - 现代化CSS样式:hover浮起动效、主色高亮、移动端适配 - 新增 dashboard、admin 管理模板 - 菜系(cuisine)模型和迁移 - 构建脚本 build.py 支持 PyInstaller 打包 - 前端资源重新构建 --- .gitignore | 5 + app.ico | Bin 0 -> 58217 bytes backend/config/settings.py | 56 +- backend/config/urls.py | 70 +- backend/meals/admin.py | 39 +- .../0006_cuisine_dish_cuisine_fk.py | 29 + .../0007_seed_cuisines_and_update_dish.py | 93 ++ .../meals/migrations/0008_alter_cuisine_id.py | 18 + backend/meals/models.py | 41 +- backend/meals/serializers.py | 16 +- backend/meals/urls.py | 1 + backend/meals/views.py | 53 +- backend/meals/views_dashboard.py | 90 ++ backend/meals/views_spa.py | 56 ++ backend/requirements.txt | 4 +- backend/templates/admin/index.html | 99 ++ backend/templates/admin/login.html | 35 + backend/templates/dashboard.html | 314 ++++++ backend/templates/index.html | 72 ++ .../registration/password_change_done.html | 91 ++ .../registration/password_change_form.html | 296 ++++++ build.py | 285 ++++++ build_exe.bat | 65 ++ build_installer.bat | 81 ++ debug_server.py | 24 + desktop.py | 296 ++++++ fix_run.py | 21 + frontend/index.html | 6 + frontend/public/favicon.ico | Bin 0 -> 58217 bytes frontend/public/icon.png | Bin 0 -> 34512 bytes frontend/public/icon.svg | 71 ++ frontend/public/icon_512.png | Bin 0 -> 222713 bytes frontend/src/App.jsx | 387 ++++++-- frontend/src/index.css | 932 +++++++++++++----- frontend/vite.config.js | 2 +- manager.py | 282 ++++++ meals/__init__.py | 0 meals/admin.py | 3 - meals/apps.py | 5 - meals/migrations/__init__.py | 0 meals/models.py | 3 - meals/tests.py | 3 - meals/views.py | 3 - run.py | 155 +++ school-meal-setup.iss | 81 ++ school-meal.spec | 366 +++++++ start.bat | 66 +- start_server.ps1 | 8 + test_all.py | 120 +++ test_urls.py | 16 + xxcdn二维码.png | Bin 1505 -> 0 bytes 51 files changed, 4318 insertions(+), 441 deletions(-) create mode 100644 app.ico create mode 100644 backend/meals/migrations/0006_cuisine_dish_cuisine_fk.py create mode 100644 backend/meals/migrations/0007_seed_cuisines_and_update_dish.py create mode 100644 backend/meals/migrations/0008_alter_cuisine_id.py create mode 100644 backend/meals/views_dashboard.py create mode 100644 backend/meals/views_spa.py create mode 100644 backend/templates/admin/index.html create mode 100644 backend/templates/admin/login.html create mode 100644 backend/templates/dashboard.html create mode 100644 backend/templates/index.html create mode 100644 backend/templates/registration/password_change_done.html create mode 100644 backend/templates/registration/password_change_form.html create mode 100644 build.py create mode 100644 build_exe.bat create mode 100644 build_installer.bat create mode 100644 debug_server.py create mode 100644 desktop.py create mode 100644 fix_run.py create mode 100644 frontend/public/favicon.ico create mode 100644 frontend/public/icon.png create mode 100644 frontend/public/icon.svg create mode 100644 frontend/public/icon_512.png create mode 100644 manager.py delete mode 100644 meals/__init__.py delete mode 100644 meals/admin.py delete mode 100644 meals/apps.py delete mode 100644 meals/migrations/__init__.py delete mode 100644 meals/models.py delete mode 100644 meals/tests.py delete mode 100644 meals/views.py create mode 100644 run.py create mode 100644 school-meal-setup.iss create mode 100644 school-meal.spec create mode 100644 start_server.ps1 create mode 100644 test_all.py create mode 100644 test_urls.py delete mode 100644 xxcdn二维码.png diff --git a/.gitignore b/.gitignore index 3df6256..d78fad5 100644 --- a/.gitignore +++ b/.gitignore @@ -29,3 +29,8 @@ git/ # 对象存储上传素材 / 临时静态 静态文件上传/ backend/static/ + +# Build artifacts +dist/ +build/ +installer/ diff --git a/app.ico b/app.ico new file mode 100644 index 0000000000000000000000000000000000000000..590a0ea7caded4bf03c102111306164dc230cf5e GIT binary patch literal 58217 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 z zf~#c!!=~Oy%cZG}?0HLCs~7E=)CiJmEv@mnG^mK-SC1QkO=~N|eiy^RL~CkT^+>p< zqDmCrk=;%A+;#VRNnskIY!vL^21eGeSJKs?-ea_@j#f`S(?SuxT{7>nY4n#f?f13o zQvO&lrk5D*(NGv(a1at*i)4nDr&EeBNpdSzWYrZUYSE`s>0Yj|{jv_%igOam`dHUg zv&(0(o{udX`6r%xHQY3dL!&RumiT;~P_Ql4$u#-Wmt6&GDI@}p+( z@1p2I9V$J!p#$qPDYo1XAPSh~){Fp7=PkBi-?L$IabOpIVvb20($HU7#$zi+8qA1D zQ?9Ukg)SVB@=qQ9V1 zB81HHH!`d=&k4>dm9d0HHS0DGf>1&+Rjx+LO=)1m$6dRb3N)9Zda<9bOpE+XRBq)ma zxMLk185u4j^$$%@R*E*-1V!8x7RJVdn=DRECH%_k&XT#PgwkHK-$Y+3_EzAzFQ~!t z_(Sq|L8RYOtcq-$B_44d7fU+%3O<+R#Fh1{wc+F_GZzQsCV^2$#caAg3P{Wg*K*B5 zG{QE3anzUiKc0*zz=j(T-}1b7CP^M637_Kqt}ZqJ3gdD}e()S)-`yXM{~*cLf8P$CUlUT= zsb2M2ZuIgMcr1<(wmTRQawMb>j;oRrDSb}`rSd#sVTyC(8P>_R47zEI0d|7VrCQ)7 zk8prDpHx3&8~Ae`U8mfSM(0M2wZbt;I`oqM0?d6Q5@V7Y-(|m%koX)>A>QgjTRG3a zs&E7(g&OkU^gL_`jwft^ZF20Dt)MVgRK1BJOR^-f3lzI>dXKf*3k3;a(|XmO?2qz| zjP|{r7g{8AoaLa5sn6tb>0z67RFRuKWj)AZ186VgM=&2AO8Q62bBWWFb0H~X$uyqX z1lHJ%jB=>>?aU!x-^iVy+Hpo*2L{e5$mL?Vi1fgpF1d4xI zT1zPr8bb^HUYvSLG9Tkml-(9n(}6(5=-cH<9 zG;&gj`9}I0?lCV$osA5aaWD`QMgX0#PMv&0>)A{Y(W9L9%NP6_4dyaLdccEFg-|ht z_P9+64Oh5vR~2QVS)zcaz2*`uK}=8jLW!_oGm}F`R;dqfZ}+-HT#*o?T_T%eff)-b zX$4_A%dTF(N|O;qfST%C&mV9-j@x@)cYkf)`=U8(`0h-%f@DxwX8{)un5$|T9kxo> zGDQ5|@&!v5nY6VTmAYg|CnfSjMub1RjjeT(|Dc|XSAEKD=3kfQMg_Chow-fcq-_Br z9EIK=A}G7BUpSXs=g0H+%%}FC-~KELc6K*Yk5TMd$Avnl-h^wdp3N4({rS7n?qhDn zw~ZfMrDJ}uepq&PAww%v?~>rHRx`FEXAVw=QLo(b!)Kr~T=z=8l$7n=80%#2Yboye`mKVLSx*b47oma!W{W&)0kJo}FOdDsDk) zELWHcML}UftC-rEhKa1nQPh#BDYEHuG+1Li`c$kf{=5`UVTOE`x6{t8^-h&Uqb)Q^ zQ^kIV#v)-+X$FW4J`u4pGE}zA$ShO~lTg<9>7U*tnvGmGF}LveC=! z*JpGI(rVPpU+=-o3v0uby95SXK!h_J1R0vfFBEQlw;|ZG^t~2>gY}@XkP~!4tdt$e zP{RZ$j`f9~S;X-N#HK@PQD;`9?m06QYzbTHZOJC_PNq=gU~jJtSy}d+U}Gz}%0EqH zUe89<5nj(g)=1c;h4|pGhwojRs+ablv_-L+xthwl0`iF>PsX>y9mnVv9sTX@Ul%_s z9Q6}4<`eJD4RI;S7C>H4HCBC?jq$yHd#c9gG6yLDk>eYDOKs9qTA%KHU-QN|esb{= z`%pC;S<(~2%Kn_)$~ox_5B`%O5>BN{UJ_(#RGPtKP`G*_@1;Ldrx8`Zdb7icdmb8> zkCql+wlU%R33TRdfZgXM`6no1+%jNQ&ywqwmR^zRL|xMg?$M69We@{rWn>qsbdE-v zNw!&=hE*EMCPH{h&(XaJpYF#kE!4Y9)BS_$?^wU~T?t10dQZJRGC4k0svuMKRZ(^6 zFp+|=8m`sgU&~1qBlRagT;+mwGN1^42r$F5|7-w1fVpMBaE_-$_t|@LaX`9L#;tIv zbCF5|yJy9t9rDAcd;Jj*Kwzs;Tu^G__c2liYCP` ziFC~9)NDB~snxS-Ea!9yBFXMeZ23BtwqI;HzUz7wEt$0^$OK8z8KKBQKq_wxfH2p3 z?9kQhc9B|1hbLFGF+Vgho$^MUqY;iB122gZxiXT)_TS7=CJ$rWeO`zrM6(XT4?FwJ_OdUU+iE#!;Us-zCjCdw^bE=q>!;H2(1+Wpm#IqqwwZhmka!9XS-i#6{%wykty zN^Rg8FHhrsC(8i&I**WsAOOB7hO4uC7lAwEN?NG+#p)Ul_JCzzJN5W!O!1_d~VsbV9DCWK>$2 zI-Y#!;ksJ(pv8F|=}u1s(8PYkqJKNZ+i$7MK^3F-{t^lq<9N4OVx#A2?mS6s39FKh zMl?P?Y(1BQ656<5>8!%;$<+>3w;BS>SK`Apz{VOMG{9F(dJHd{M=Owkq#m zg@-2NPtK<%38M)B7Djh7njFU0GSH2rnqF3hG18e~2ii!b!AKUCx>yczPaju;ptT2W zgdd>EoVGyPneZQEi3T#3?}(;Q)Vof}BZdxAda~jEYDbI1^M#`pgiBVHAF6&~>v~4Z z6`rp!sBckoF=}EC5-HNVfgfwVrW<7fn`wxbH#Lz9pN!FvwAPPIDQN%T-GdbLW#@d` zl97j0uHeDs#W0dm7dhx)BA+R7nL6FMWvj4TF;7(zU$h;TNDrEj+767v64`)s#%c4r z)@Ib!he-=DphfrcJ3ibVHf8XFtyV)znWu%v_oKq+y3y*#G&&U}@a2;q%Tb7uSK>RF zS(_OEV%-)$P+&3{`F{Wy5MK9MMx0JlgnB$9fc|2E?HL*xhaxIcNb(7D_4i7sN^dV0 zRW;I+NyCGY3AIDTgF`;@Gi{hO*&}3I|4L(E``v$+t*q>PnQuk*SwkC%M#RnivDEo~ z|HhF#h+@Z#x|tH^k8U5~)Cn`&j|OO_u|-(UicKb+gJ@#knKG4s|4?4<@WmSA_!A%A zyfVo^@G83Ud+pRmxG4VCv!21z?&pZnyX z=Rq;@(QPq|=CQ^5@1d7CJ?@;q_3+?1(X|I(25EXCqL#m~r_|6){ov*C+NC5StSseD zeHWIgF$sd&3X*FQ1Az_))}iw=70d7DOgD!oK$eo(*bg`3DxW+}eP?7=O41HXy)SWh zhH$G#Q7!7_jPSq7^jP*za(*)i$HTf25tGdUn?iqUj*Z?l;H<6n!Fc4I;N)>P?$_Ok z^VuMGEQUdr5#)FA)W2Bv>S)tL*FN4zI115H73i9kaPpG6jkMnH{On|ij(s`aDr__4 zhUCqs7q8`>868?dnD{4Zi%!y!eMW!a`HK*|DwI5`It9ZD|u$ z3I}A1sq`P>*+rXG)(Di&^cI`aY_h%RiG)n=V>m*Fg{oT`|ZkI zv!r~LXS{eB3LGaqSa|pNG;JlhIYt`6$8C*$&-KilJ7%**u z-5lk>Z`VZBt0mEsve9QLKj#WM|G>Q?Yt_~hFw}>J82YeD)BTm5Yfjr~-<`1C&d`N$ z5G5b^a$Yg&a7pG)2p@*nCc9{Le$&^}T5!N7!j*`)qWe07St*x~mZ}JCcH8LV7p@;4 z427-|ZE&;NqnWeJL67zN=AJ^XR|iXrlWqrAI8pTp&fiizd32F9o)^Rru2>~YprOz=%ToVO!EUXbjHkCK!(`iAb3~ig3SBL zOn5i^eU@>^9coIr4U3Bw76>WagGgfKJthaSZAH|poQ>OA~a+G)m>^|nXJ0+&k!}L4%3!s_ygOWvh)$Z#*wS8GyY{rB}SFn!RDaOG^ zdJ?SUitMw^YiUDo{k$U)Qe73yH63~q^<>kg9O5H@dOa04{Lp3x5Foz3y}Kp%7{uFu zASc|mzOD;hh%;4_SnT!q*pCW1!`7fcyKFlg@)O;l2Roj;-?yEYKO22Zaxsa}?={5R zp8($&VkJQ>g`VR+V1@78>p_xX*Xja3f!Tt}$@0Cp{Jku9-blSXcRbgwL(mZnkx3Tv zpjrGt@Y*#G3Sy`84TvL*nbA0eF41r|qrf!%7eGz>0X(Y~31z$MB(0ABdhQEKvJY_& z3+G)7lz}_{_Jyzgf%e395u5=z9&F&phxt>WFrWHfFFyQkMU-E->mcNu!pJtsOb>{- z83W2*_R-gN<7eXyrY-hq|2@V{H^n!mxH$t_Mc)>w)9KiZ_PY=|=Fm0dtEE0TMfr`B zy9oN}RJ8LHE_?M%?lpIAv1ywCL&QyXnlB7*{-OEL#MRO686AX`h>)vZvwdBU*ARZ8 zZZ2Y*pnaCK-S=Kke(D~q2hH7AARARlW9XY;4_jDXOJ4$xh=yGjm%t@h&bRg3?64%- zjQl~6*&mHSFO^~GnsY;rjx?Pw`{r@N+CTptFHvFd;I zC4E^n1;iRUyyd9Dkmbj5*!1A_tO&4RhwisHYzLgrhF28CaOge3>D2EYYuMBX{>>fD zPg=hjEZq(w^22xBs|uXvfaBBc_RD542YCcUj1&H%{3KjNef~WAuv5o>9nRpreEp$$ zp~p~xDE-GW48DG|asyf}IxOF5O{uCa_4RUQuV`djx$Wp<(}Ip1YL!)PDl6>$x%&sa z7UetK#!bTvk)+ffF60WrZMME2>V0)HCcIo!nLf83P0F~j*83mC8I@onS=s{(5p-3r zEF-`c$DJ%WBa5#Z=&Mq(gkvdzj{Q%DmHkuiKL@a0DU^~d@!G@isyesoHaODSZECoW zJSfiJtoz~&x@n%Q@(4GSsFzCbLlRB)2DroN)o{C!&2dJTsg(+~EGipRA4eG+1&6k% z-e6sp6KRg8C-Mr~n1W=S{-aMl5ZmudJUg9@79mbFSQ%wjA~!>b^cb&LbWLy+932;6 zuWxpdH5WkyId&LZK3A>!v~P`J7Ur?Ud*&jgVTeC-=-PE6A!>DuFtJQA3Eb(76wESUw=I!3_vZEmd^S%EAvp`J0%b7UZv73uQEtP@1t<9J|h0JtS^ zj3RMHz}&K!SJMKY9HWH=VEQC*^hgtj4mR=3Gff;i9OAj>Vljp7`!chckSfvXx|NhVf#h*%li z8HVFkG3t+DY|}WlTsj84c2wMFt_B?3-@>ncxrm1zX=3l*rU;|cI)#)-=5A#@kuU3r z-A%MaF};Y~Y@#XAb^IWe0PQ|^yZG!$a0FV1m=!{xnzV<0}jMKw;Xto*RY4v0*nMZ*)Xnl#wagG zWbBB(xE}b-3CWD(=ga-##1s!P5W|DXEcVd-nS-4u;c8X_m2gOr)9xB^9Z1Xt9@^TZ z-{qnZivM#uVTYuIzaCCyBi!=EqMu;|Jn=*W-}?3(9{hP-*euo={glb9S`vZpzM+cu|LbA#T{9#}egN*`gK&~l01=!{ zM-xI-WZ0+e$cIV5{82ci3)+}g-ihHfk8npaC%%1)yB2GhM@dyiFhm>{B&$VXw*Q;h zDuv+`k8wwQTKxQGXGGOcy?9k`0ZDU8C3%=Lb9%;Kdsgz~R8Xq8vj%bXYB;6MCBsyJUAme)gWM z`H@lJZGTinE0Pws3O?M?rwOGr1Ot|NX z?_3@sZcTwPk{A_v^d3o)$T;g#BRgpz31_j^8^(mcMhrg57MYlBZ$2T2nuG<4GCz9M zD|xn&6Fm!OVF6*V2@7=xC7qhY}|1yhOO>Tjo&G)lDB7C`f^@)7(SH=PIV!yrn zMN|;Y_B@=@w)RE;m^^CbHv6&- z^7Vr)h`meTga^P{`{9H~!D2D+Dvu7*8j2HU#AT2u0i5o2p()k;$I3*o`gaLK`^#2xddAqU#W=J#8ix8 z5!w8kzw+Z?3~EYb-J)V{Ayw!oMIW4vfO{k0?ijdx9=N*>+&d54852IQ2yoG$J6w1_ znl^i%smnY+O}M_0pD{#!RZ~~w>(64_J7ZlyZ(~kdqO{+>tYIItMVNmMnrL6rv$V``JdG~Q3Ma5|bNi6m8y+6#b_H9i8)N2Jg- zJS7t}*tb0~Q=(?y zE2q?C2FnOE(B0)`BGm0M{Pw9uOizcXR?F#bq?vi&8TqEQpK*xsdk5sJs%d$zzv0Le zvR~vEx5pfb`bQqC2?kI{|JhCD>f6s~Fj{_t^P)`G!u}Tbt=spe1(3GXulbZ~T1$e5 zAD&Z3&KS${)VjfL$TugH zdvpN{_4Q(HzjbJ1KQJ}B+54+L3B8I}&UU7(-uXJmBM;AsvB(lOY=f`oteyx3%RP(a z5jfqEugzNhn@R~Qx^!*RSjwJ2&IRP2%90R8Mx`>gXp5J!ha=C1c>IY)lst2G?1le| zX{#9z_|-2LaQI*o56=V_(EF9UkY{!>z%`=;{ctJ zUwmbmJEZFz#0kTmJ+qRnSs`ec;Rb4)ZPa$9X`KgCsiG36x zU$$cr-(a9Fdj$2kR9;#y-WF+9A;+|_+m<0fk`jb*8|@R`C5$Y z6R-M2zS$vTui$PvKO$|6L`c#B~B0-w?=D7ERe6>a}(;Iyv zpFFr!!n7rYc0<1Hqgk0NU5Rh?FukPTE8UlokpTDna0aj6IgV{FtB8GjicZ*iK3@s# zZa&2D=r3yc;SZ+8GZXr?1#X#8y^t^HF0BTpQuBK1e1rIzu_#Un&5XES$WOmfx{9`h z>9o&qe{1z*Tvho5!J9m{>u+=hH6%6W18miTjrTep?)*et7ouBjbh5qNgb$&*Cc^{oG zY1zH{3&w!C-MxVWAbuKG836g|1e4D0?k)E7#O_DucPp1KFQov< zNQb%b0}r41hr`(WbQ42WhKQt0x{~erpb~i6S2~2EI?V9&Qw@CjQ~SiT$;1`y`borR ziBXpR4TMDuokIWC7jD*pGns&0xDI8qeoi!yTAP{8jCay9*E2r#S)DX;F1>hayoC{+XT&fy)xv-N55K|jsSuTFN!U6v?5hJm#&WK{k*^endG_ES z$QR(x^Zxqg^^N0@YYv6DH`qx4NjEt0pjU$s*)nXErw=g*JHC^=Z@qv&pe^bUL z{e060Pw3i)SnhRppe&#Eqf2VIVRsY~-)0V-%qg>aX~*rwS_4B>;Lkp>3D>-O1oQLq zzA{eGue4e1i>V`I=sY2YpWQ!;fB4ihs4b8rC<)?|-Y0=8=Q_0OW}`YIr2aY|+m~ak zx3`ZYwO~e%eH-#S5I>zB<|YHAw@}3BHo#KcX(^x&H6V-E-b1L!zG!bdUxpY!zG9Kn z*KE?(D-o`r*noGvXM<>$wrx)jqdHrBz~u9j8kEbsfZM)$6kq@H5#i?twAfMX4k|O2 zHSsk``nC2mf@Kn2ngAK{ZLyzAC$o^BS`DK4TvBM~lQxR1eeLpTebm{d?1%WeAJP^u zf2ZZ$wAsSf{_ipT`iTYn@kcJgWn0TwtjUEYw2{LZ_Yk?9yrN{*kuipSzpdko|8x+) zcz6~gBeaOr7Y3hR&Xy;>M0s(9uO0bzgwH%_v>5pvh_4od2;^%%F;zgn$hSrzUt$T! zHw2<(gqo5-tO!{7--qiUkg8Z}(OGkcsAKjPtf8e;79O|j^d&KtX6U|G@BU$u{di_iK z*w#RH9%P+G%-dB0ixGwqY70$Vys0D@;Z?6&i{W89%t0+ARSZp zlOLVL_imfQp#ybPhfDB1Pi_dU^nDTW2i5teF-R%pr1s=VrLv7db-r!i2^-)z?``z; ziF|XR%rcN~mQlm6yba9=kytU@sJGB;hPdRi3U>ahb-4Q4ajaYK328tJP-V7F_8R2k zhHp=37pH}J!1Rd_KmYM5-1CDIIPlCOg1|$iLMwXc;pKh;(ydh!tt){1wt-7|WeLbP zJOj~BVu0@G?~eR}zU9jFkNjfdoBhyBpvg<16~t0C5F@mj5!P++@yct)arLX$VDpwL zDnoL689Gx~92BLk3?l@eUYg))o{fm^s~tz`i@?6U3;6j1C-KlvPT|C{7D^=#UEn&`%6N;{@wb?5aNR(-ypt_0Hgw})|a94^Sg89IjgtM@7$BD3~!SNV$~1m zAgB=aIwh6>n=Yx~${l0a_Isn)xT%8SQMoir>^BtZlf$^|0qrT^(#d0z;PmyvT!O;~ z7xDOGv-s7cGdQ?^5v@idh)%>8i0662>*vX#ammP+Z-nS4FDoP!Xf766I`Va$E)38= z@@)oCbNOTo&jjXQn-OU3VY3k;Y(>I@Sid2_=B-t1eaQ$mZ63n;8%n5- zx?-Cax@dcv+FXni#~V1fZxMTcGcOQ-;#gAJO5-bP##Zn~wP3H{=`K@gP8Y!8KmBg`753N=t%Fs?6<7)z( z|DrN3+(>)-a2!3{z=^2_W=_dNsED9JASb41_YFe2JOxy{8Cm$+(j_M0my3L3AD>iG zrNx(ld>wh!_iSf?!I5th%I0*dPaTNckLcF}-EOeRQIiP~N;PQ4P|P6r##a%>n2wo` zg*c5xCXF=mJkN#aIdEJ#StIQMbIv|ba2?M#yU24E{}Pd}r-fCrr`!T=WpuvPwf3c9 z{m$pxjdZg1=_3s;1#9dw`d)(|KVt&>do!V0?z$yADZi8Fcxl%p5&ILAO7g{0S5vkl znlaWB>P?`s$H|tTo5;)O<3imjhbIiw~v)|vLV!mE$Jy`p4OF;T`_?Gw_4;WB4;KOWZpt{U)x{nl*896 z!k0fBO2$)+XYC`xmoi-e@>BLS#?4q8xN^uZ*74DgMnmTBK+5@iHaLQG#B6uhY}4SE{#lyKJz${f@{lCO%!_ zgmO#gcSpWuY;{Gx&E2G4gaoiQBwlgk%OUP{IP+l0A7IyQ!ywAO)zX1mgJOnAZ38X8 zY4ge>-yHv_We{@3k#D0^ofuLu&?|s^bD*WpRUg@Mkw55u`^wgi|Ayr2B+ zq5jA@ogLgX=igTp`E6od{*}kfrJYFI?Raq2l99iJ6E(qCANkgO)WI9H#@|HBsvtk} zI+T~wbinwmWB|oCD~$YZMxO{9Q{I2UsUItYd{b`^cCH><7361QNS{4l8lEYN)9$Yp z^3&%P=Y?_bS)%-Ln!mRCXj7mo@v{b^lfe`Dx$9 zSHk=|?r>nQ+&b0n=jtI}mzRhavvNfq!V3-gT)v~7!L)TRws=o(y!y!3b)_9hOR=%n zaX5Q4^>_K1Kz@<6FE3ID^x`ilLu z@zZ;s3pyW`&KI7I3RR1Pu*4QF`AnWOrSmP~Q_czLPF+xG z+gdWoLT4BGs?X$a5sh2n-0@22f1iGHcJAcf=Rd!mPF?td=M7V>T^ni6k+l=vFE?=-_5?8YBCqg&=&kTfqdmBhzInXFr1r@1LxE9!>(Ps66e-i zSu!yJXL54Wk%Y&e4uVlq3o$#J$nWLnn_^xSqy2KVbDJ&%(F`OGq)@wQD1=Iaa)nr0 z^q~>0KGXjFLKdoJ+$Mc#W9D>cF5Opy8O|Z(8^_7UzB}v?jqkpD#}T4A(O%02cFQfF zWRD&A@MyVJe%x_`3!|vXnKetalXA++Lh2xYMqqSE#aemg3-+}mT*1mCemP`(67tvRpGo1Z= z5UlYyPv|Ivv!nC%FfYZ=H;HE+ZKv;}7?h>5-AwT|VP}q1WfdSlWi(Uv z_igQG_vHzXd~eu`qJ>AtqIIvu#-Fw(CnxmMVsYg|7JS>b2|hWwsqQg;Lmbr)d)^R9 z0vW(Q*O7mwGI{VkKz@?Mu3Pcqq;WWm`3;jl-Bc&q+9I({0?2D(g1e*=Zn$yp_P`sz z%W>QdQMgEJvfCDt{0{m2oI^em9ue^q9v@G_#W&sglWQKInAq)_qQ5Hx*i3L}d*D^R z>$;^)t=4=1*Ux*t}Cr{1?uAKC@NbIb!YST|Lfu9C%}XoYWsm z_^DmJh~Jd~GA7vV-adK7eje_9L)4o4oac?Wu3K`*x-=7B^2Gn0&gZMA^L5+OR-(-l zBZ~2RUeyi5`OnR^o_fQb_wC#-#eQevOIGjWy5$xwqDJ(7;(gEF=&FHpCjQP^!%ZV>0zRnPQs=m+QoJqS}B|1 z!JNr3fS<2E+gA4~`1#0*+tu>((>`XzH$F>2pFNE0I00OzEXqW2{aFTlDTy6%9$ycR*8$k*y5($-zl3(@hz(trU#n*afYRa2M#=s? z4;{mD7Y~(s8P-U*BMwE@zWH;`$T0#Px~-yBxB1Uz^89W%NXg?0Drxi z1PMR@0000l&&+$@!|$8# zo3TBj$1~60H{aNQj6L?evHgq*5~yvA2?8u(B#=NN2?dm6t8)%Fov?SkZ&lT*T2;Hw zx#!+{Zt6Z;x_!>sq0+7uerv5-C16D!Qf%J5HM#WC&0@5R!fyggT zB%CXSI7>=6O@Q1eL9Q1dMx~TPLO{hnB>{x+Kj+vc01)<5O1Z%Ds9ji&@IGBV^C>Uv zr{8Y>b1vm{yt8Y$D|g)8_;eq4b-pDfOasUX0pg$(VlPP8DUxEFEZ~I{lBc9>KYhm? zryT$gUI91UAhV4dx5}+sHy7cxm2hB>SIlwSZ8Ev{-g}e#?t3dEdMQ5ku_NacqIhGP zB(E-{ycR%S3?SB|X|=WLVPZBk(LzmMF0mUJJF2|M0%PaRUR-Wr0l~4Ek6F%%yyc~bL{Cgb4h_#FQ!pm{z z%H{ORfcrJ>J|ifPJ4$>id$#eGGz^mFs1Qkl+G&zhq18HycReDZ_ytVE)A(_u0x@bjd#lO^e^D?m~u;rRfl)sbU6AfaDvZ5PyBg9UHzzgzwYD zamoNTZ@x3#y7iVE2Mh83D?5(d3Q6{F6Oq0?Nh;84Pl7B81oMd@c&~lEOQ2A~xrr1j ztM>^%7ZtfzOb&C9{Iiu8_Ae}_JT9{_6jzoz%8bTd3Ci~+|H>KnnB|gFWhhk*#$I>+?*e03_yz8ZUaG`{MaWB-z<{!-)Cw4 zIyB(5S`&&>3Lz4DFDnCk4lw_Tjrm32H7?BvWFe(YvdV}MkfI^+CppOfw)OKH@5Fmh zIBwa31uQ-+Sab%!Rhy6f%Y!$7sNR+()wkjRwOW&kAt2%R2YU`M{{ZtZ1?Gp+{B+N9 z#-(i*v9ip0WCT#Dj3l5v3g1bJ_Le*DIPJcWc2*$+a7Mo0_>DcAvP%6AAW44*aZs~4 zVF`bJ*poMZfcXcQe>pL~?1QZZJy`%*Hj)(R;ga&ti`L{HZrys$ZVd?*FNVNM-hLja z!eE1u_T}#mhw|r@&TId5{J?9*|7U!*yqxg4 zcsU|+568-}=VpH=)Gj_bT$}J85xKW>`Q^UQxcKF}I{5>@enVc6^A7K8amO$lkFPA^?^UEa~cYRJu*{)PZvb<;=DDvrlxAhBW-O3f zK1KW=Km2=HZR~b{;-t31`bievJ;3|}%-?xFoG6$dda$*SJtxV~HULtdlvT!Wzvb4Q zzlXGjG>5bY3p^HB05w3!kNwNTe_XAMeX`j&R!F7B_{?R1`MbOXtD?@=`rPFWb->o) z1ngC_SUBeQpF5E;fA1O>_6s3F0+s4$(rQlp$<{BN`n#O|VCgjgT{&{1-~7apzpPf) ze6ra*nuCxS!dEKSx2pHb31{Q9VfnpqdVZ2e2h!x!mhG|x=uL8j=ek+@>6vz0s=re6 zqGiSEoNZjnSF7Wn-28!Ee+lp@vLeh|kc)+={Q#eWZ9D$2PgiSe zKGJL)#<=~G%0IyToe$*cX$mmDCQ$~eV@J_jg8pD%LiR%f@pDM{Snry(STDfQBZVT! zG%ZWe{$YOXuY@!as$O(_A3f~X>&jnj$-mTo{{GlnSZHy(T3wU1nnyo-=NC48^tRgo z<{LRE7Gm)G&3}3Dud3B`A8%OV?_G7Ib0=hMzW~6r1!Ln0TzPFBMn=`5MmTn?fX9E< zfTKrpNHcxT?_W?(WL#z&cO|8|Hlviu}}QE!Mx$**0E1psTOit{)|5W?i!zP?z>->Ur$&@ z*amlhIGJbXi@t=WHtOfp$`9L4PCWDw07gVyesvAjt~0Md0IWYrGlWV-sMs*Se{SOO zI{k^$dE9B@ptQZ>syeJ&pV}wapOnH?*VQ4bV!b{TD36WnUvJ~C+ky(Lt~WuJpw45x zS6?@z`&)t`a~XHPT`^*`gWRz^2+Hd|ALHX5j#IDmJ$%NEd#p?|Oi28w34DC>2X_21 z1`Hu>&J_;Ki2>Yp+r8S)|Cdp~4I49slaXjbNj6{1kAH=c!l-#P8=4I9z&7Cdld;~MG^>STeute=`mb4=!PuH| zy$AXBWuMM{AD+55^hYHpm6t5S3>ycR2`6Q}pfch`8J21zkphr^yRjeyrd*JACO zMe=*9p1#MU9gPlP)2W#v{!l7*mi%)c_n1L((`gxCZkupy%l!+-BZc~%+wubXe#ehX$D zLRy7>G60N2M(%Y|w>PfA{WgD}vy*Bz&Y+7cerCC@+CFEY2PC(f(=T)isy3niFjy(t)49qrbT~ zV-_9<_T@?fhVEpP&h;Tp5U%XGV}AcIsz27dpVbR~y+idxsp4g+7}i-j>wV|GaO-%^$s}*FgMA6Jox#$V}5tOo2?~D+U==!wYKK6nfA~hVS*h+yR#fgPm6m# zaqvCW%GmETnn!RcFDk9}o&o0XMe_UOMcBU8mP*RoTg)E{=On>+N_KLAnBTTVxZoe} zUIR4{CZHkNw~fFYZ7seHN9hwnC_|s_Zy935Gy{Ju2bf<*#yzlCrOoEyypoOn&iik9 z`8`Oxv)KbWG62L7cisubZ~fNM4Fb~tA!Qq*5ov`zdwC1NK>Ql##P0iiv8OK?dD;Bv zT|#gJUhk4WF3~JoKw|KLs?u zq^(+oN)~ZuK;)lPQn_8_cme*sQo#*1{AVc`hM0qu_XEs7FO3WB0quOcs8q(!YUlZX z)|2Q{Fee6pQAL=*^EWU{nskSU)zoCJp(`g+%UfRO3+pl5} z3IRi^zkY-x9vBzVY^b#^jOPt7zvw~Za_8LnL?lV8bu<@g{a@dF^Nu$nEhA0$$^gWr zmu{vMM1Pc~RiPFlnHmO|f9{x{e^R(G{*8CUGrO7+XV{(QDQ>jEtdcj-PQ%X=;)JkWBfRP!WP&p|-D@St!?@h{spxa`e5Us=opK z8^(kELZjQPDgj9!gu_~FeU4#WRP!iJwO8|X1mA&tk^G6#NsI$~oRx4$T10FbuYlNccM<|j7qdY{$;%CP~#2`SKMuzB<2 zRSED1I6KIfI2Y_mpC?Rge^35qvi_S@fE58_W0(^@4A#+$g7TJ@uJ~80Y3y9qCbYKD znjveVdWH5~xp8um80`*NFEJkC6*^d_P^%FwvoR7y-|I^olK$vXKmrcOo!X22RDY>} z@$nRLwunpd7!#b7W4%h_adT|o=kJdBb?UU(T(c8O;JzDD6n}s;t+NRElhtDYdNF~J zBjacMdbKioWvex%HtUFC&-wX1=k8aH+__@b^LIO9o(o6l5=KS@RI6oXhh-l*jLU+t zZ&FFmRudVq-w%%=nEtzW#0gfnUENs9#%*lI((9VP!!%;zF{lR#SfxPYN>+^O7FqkzVAu9hIj4W8Iv ztXFNk>y6ck7TYi9iTS(FcMPyn|9#Ts5{xha9Wa2>|L9FwW#qb6Yf2&q8DRc}VSaxl zpnEBZ|0yn>UOY(h#`e!0^Ox)A z_n;OqC9`bkI+5+V$!Gy-i2+=CDLvi(?Ig*ZOrDeE_ZvUJ{F)mh!J(8VZjCq`lX0LX zpj2?BMjJz117K#xsjQ)0r2Dv+Cj^&vDEUXnFy*vASFkQL!p%&Z_H>Xo<@pe5R&iU1 z>hG9d2F=f7y=eVc9stD*{n&o3g7S%fV#N0AV;-14c4#dJ7YfOCJO6Dwb?K#_k{$!l zn-PlQ6Q4M8AwY6dt2Lo)&tX{u%s)TOkA^*EDL0Y_b0rTA>vUZ9JsC+nIf(`_xnS%W zP6}m^OELC98vs4SV0c`D#>6TmeUbtn;mV#Cbs(+q%LYLky@>^@QH5Dm~oNvuN!2I*^^E(Nl zEal3*rX_u)0#M_II4V6AN*$)89R0$cR0g`@xZ%-GoJ6bPZRL6J>+z-OT(Bprx2ioE z<^BRpO-NO*);yeK#_!6-Sn=i10Q1Y)BqSfwRrZsjzu#FEY=@|{d1 z;(d9Jn-gL@F?&&i*#3a{%7>Gv<-Pip8f&C3u6V20)n>3Ibr63~PdSVKLa=9e50+UU zA}Hb$6FxpY8CPljaynu1__z=g8yZTyya&8ZsQx?b@1DayWDLzl-XrGc=T2PAZx18E zaoxV+0LTQ27Lxq?kk-xaLLwozz**;A`5J)aiaejjyxuw))d2I;XhL{!DXOGg4U>3i zs&>-SaOgl|sMpai?h^!-gPOwBB;sKw_2-ZI{jyQ*M=2bxx>JPKmM}S$D~TM|F;~oA zYLTi}=m@|_e-V19m5;Mx@Ax%tSRG(~umfaWcy2W&t`U$4Bv-84c)@G%9;E$b@7{aW zTg*iAu4;80B|obF^Ta@N$5@d&`RkrH_KeqGKIhuSrNZnJ+p8bd{1#$plhdnok1Jmp z<0`_s`S^htd;YLs3*7iMI(oifg%O@F8qbGpWJufjkyGg_Qkj3-sE`q0Q2{b z`4t{BA-AFNE}qG!J9F{fZ1eRuv$h#+gd}ALlCl9ogu~~H`NKAZZ7UsQ8;$lkj`{Tv z;N~LEox#(jpICnW5c3HtpTy*rin@ZUJkeNPA&-ZhdKOIiDXwO)v7fPm485&=+zyT?bqMEFTDIt z_qfeSx|b7b9>{EQ<)X8-gzY|&F~6Wz>Zi!aA|T2087M$r^Zxg5I|pfB6MG78s8mL) zQtDOc_93s*fuA2$Sqh`2F><;7{j~#b?8293V(TN5UcIA|ad7UKKg{8W%~C{zd7N!5 zKA+5HL6OP>;uXm*Hm#xKZ2r@O9ckV9+L|OH{7tMmhvNGmZS%^~s)w)S? z;I*qPVa0KZ`Q2;KIT`hRcwXdbT7@DnUWb?UrgR{$$@3Pzl{C%?%b2(~P8i2uVfm{e zwqIG&5$ETHQP;{6qMPKWzMzCh*O#~Ij%pX6cI+W7VE&jtY?q!O$avfa9PUQ^y>@+S zTy+b>{Qel|dMBr3=l-6Ap~>$4xy1H|8W&-H#RycydpJfX7UmbKSfde`v5_ECboC?6 zqw1A>?B! z`NKM?UQ7wj-HfhYfOV?ga&S_|0SS(>1)s)DuV$Q@$m9K8n=1DtB}eUq`FqtwwSAy~ zmWdw-3A582h2suVlOfXMR(e!cj;AK9@!$+G+s0I^mU?LZAXF)=@?k6Dd5!~(U| zmvFOT{&)^Qgc6t{+h2BzP8xvW5dmx0CMA{Gl{Y))566W1fq^yq_i94)2sM`~FaMgg zCO?6D3g$QNRHt5Aj0sNmb?7fbfHmt-ACn-*7Un6DFxLcg)Yvk%Uu`k%`^|p;LcxZ$R6c z(iro$^d8%9>jhd&wqS&`Bp}X2;xEn|s6j?3ZVBJ8~pf;l^%@Z=FmK z7vvxVzyzXN7R(*- z3aMh}i6CO-&3CUpvOgd(VsZ|e&_-i~p<#e()nBDJAIa~*3v<5Nl5pfuZv6hP9GtkA z9l6RDN6iKE$J!8UD+xqo?r0-8Q82%-aEzW%m-yLvD`HAQO+`afh5ispqp z4I=?h){H3zg5?pjE2DsP|1g)RLE=dizObI>5~;ao6(r}~3Nz#~J3gUrDRcdW6vcPDTx2z53x5aJ*xF41UtlZ)I-Wf6VVo4p%N}0a0Qz$uW^v z^JnLRJNmURZ#p;2AA~-NHMBy04EmaFIp1XO&!z|mfugzUq0`MO%r0b z-s;yqU(6rgqjMGL)Le0GRyvu#U{9zfLq__~6m8ehxp>sL0{;d|w&z6B2nPzsL9>UOcvvV9x__<-M z$ek+(^GC5>xs`rdu{viP7ddAMgfBql1&9=j#xRW96Up2qP`NIKAyvg}Q_?_^V%l)r z8Hl^d=ZE=20@mL#DQP*=B<+Q0v{26uF!%Y`ecU7SKysH9Kh;uA65cQYV1oR8@m)qqSQ`kSDrVH6z{CCA+%BsZtRK9uM zX%zxj1IptT^J8Bz!VP`Qwv=VS{BbF-!+zEJ|6r}Y+RqO&14W1>QfsLVU2!SK8Q?Cx zNNhg+D~#Tl(VLQX>T~a!pnnbRf7D;<6ZILxfTxl1n5e|X#{7J~)1ftMU*pm^J}#J6 z73QZ;Ml-YzV{-gre#sI`>a0D>h55@9NV~<9>&rA(J!^t>FfEwgraLs^`DO4n&Nl8e zK@$^W5RNroN8-nI3V!yk`C$IAw^|b$Mi*oFoawL5NbDrrVq*T;HC?d8ueCJ(zE>gU zx00W92G@TB0ge;Q-{H`M+o`NrowH$2xghL`%|RTF3t=ei);^WsvR$2{zuYdr{CHiR z$K3_{xYc)b(B1$pUw~X7=I0&OyAqF%>SelAp1&u7W{R%;e7!>dF@JbY1gCY|K-p>h zYGW^B6<~g^WYZ@U2*(fRX9E+#puF8NoadL*Z_Mwv3nj7Iq$40iHR*735ZoP@t&W>7 z=I7&19k94tbg%2#K%=fH-^!ER4*ds(A&DtjkCzp_nC;l?G78Le*2@9H6Kz}x$8^<(}R$6pDU-yatw0*rsx3x51@ z$E0i+G1vL%rj>OWcgoRk>J1bRUGFiK5=f6iX_wwkbq1}ANIPxs@YAW4>NR6D-5P;v zHUnpEcn(e)-3^U)9ol&X5|(eVADI8R_Vahd{JKm&h8ayjJYrn1d|vY?`gHh`mlJY4 zM{J!AR}LkSB+Sq8S}2t{VQKdk8qi|py7u_(?^eFUcG_njj#H;`2`2`>2g^VPFgl*9 z_Tm!RFxe&UmdiKr2+Q}!tG98-Z#Xu%Nhj57C$rj=RKhX4DQQf?`C}TEAC5O?Y{&p` zQ_@m@vEG*MFKP%V@!xvUSK!@Oe+EunyB!*>I{fgZ8{msS{8w;rawAmIW@K!;k2_)W z*gTi>p6~j*+XZU&aR~=V&8J{=9p={q7%DgR8H?pvZT|Fd?KNgq+kcCO^>t$nD*J_3 zBj(4AIr!?jcv-PJL&+cBBNvQ4z49e)mRa5{2cJjd-}IDDq|x#D1?26=dXd=pfoeD! z|7?~bSRm$Sht@(h3;B8lZ9{%kw zY=PnGq=E+AE>Lb)OaqKb{`vd)g@t8Aaj>c|zbjT>NqV#H@@p#>^EYPlQf8Uu#{41n zRQNyBnQ+kW&JS!i8pODioG<40>(qB5$rqGyN4_BS_09<*-Lom}ChC~$e8h09dIv1adP#Sk1 zR_f=_m5F^KCa{_?zcYwSX9HNRm_JrNjfdmH%ZvHL9DZaF)2rViyYx;tLtNOVa=Yd* z?ghp~B%UFTOJcM;Smr4fhWUMM()Aa!|ML5=-l>T;OitI~veSPG=broowAyt@Mccd? zLmo*JPF?#lw2N%nFhAe-v0B5#t#m!ctXC-J_iEMG6JMJ3D*4M+UjJN|8M9ci{Q==q zzm~_(&&w;18)9MHAT&&biOs`|!D>A|E5ny)^BZ@i0aP#wFrN5R*K0}$I@GQFa=YAk zlc7xYcZf3ex&uo?jR!Bh>HKd(n$19=wyH2vO7X!0giPVc)OzJ1@W(c6jcy-m35jS! zn&etzh`h^q|GH~jg!!kZb7(d5AVF-0gKM~+bmo|!B)I8x-~9aMoPC~Zb#37+HBg=H zS>BsKdh%Ug+za7GpiacmjT1X#4oU3pyT|y?`jR@t*!~NXJ!Af`ERsMm=tS4c=XF2o zLp~0tHlvXaQ+Jp5(c{Zh=RWRK_Rx?{HWGA0tpQN@pQMNxBjck2Gla#@k-|>ps+|{{+wnOJcOJjk*3z(R!z+2DxHjIz# zhGt_-No>myWeSz70Y82Djj;XDIZ&^lAuxn&?wz9c&?+*x>@fB6Y z9KP_-Z^Ks}{t#5MW{3Az#{AT$n8pxejNLH5<|B;YC7)cRD(RjphCv!Ej%mp7Ir-4@ zoLbS&!J0>JRVMPTMeDbHmqZ%VSc}V+>H}|UMoyUM`gw8O%yS{@tnILOPY}DeQK=@ zTmQ)6`_H`{rkZ2Qpcg9#BLv$;1=b87gm+){IVjo{1qD!hKyQMw1*9#w{`_xuXp4yT zYEI*hpF<;=&M`?6*-RpOn@j5F_v$o-vS+L^Kyd)8#m~>5rSYROR*IiL-apr7eEBN> zy}R3$i7J^gf@@#z!p1#lgVfo6qa%*Z3ZGN&0++u|JD)qBR4PzsG*R*Kmb1@$-2FZyW5EqUT)nPMSt?)@1Czo90v)sr zYIkRi$h92J}0?1t35$rtB^snxFY5#@lUSR`?{IPYIKQ@M)`sv0HQ;KOm%if!P zw=}s-y-Vfir;`kKI_*lAVG@F@e9YfT60Ky+U)D%815iOX7QV1H3ZZrfCUv}DFeDDctEyjzLaH4~jDXUvE5!8e)(|}K+)bX8 zbnVbm5{bFd8iKc7@+CO+q~}x+k#ZwiX^6~i1`ZxR6TbWOJC!C88k%LF*7GZ-zfv*3 z^)!%H;)jad$VzpPlDF|5b$Sw75<5>f3AJjHkE)z2Yu;x4^O$uUGS*@4=0}6gKBp4CW`h1g!~R8o)}%{Mc9|3Yv7Q1@nj3`GOz4 zJ21UnGiHTUTXZWJfRdWM7k_Mf)wrlmBzm2AbN}A*F1<+fxJ9>)*N|&=T`p#Qejs2G0CWlD&T?VZ&FKxb@ZQ~kw^Q`r84ln+gq;V@hkKs*HK(Zy;)XM!%`kQBvKv7NKfAkFa@k=*qm0e9y7Wt^wOcc<_>u}D7r{EVZ`bWrHLrSyI z)JKyap+pPrdh8b1H?c{18kA3*NxSk*5JoF}{D+%*+I@JHFwE)!Um5TZG%UYe7 zpFd0YBE~;-Fo$DD3Kb+n{lGvST$8Wz0VKU`(%DV&^RdED3%rr^cBm&1L}{IZE5NcxKTrJImG=2yl{fOBLqP z<|lfhCp9EpahN|=-fG4C<>z%6Fj~bQeRx_)WMXFf_O{`%ho_Cf%t^huV*dEJ)2=`T z{Ol*wuy>Ej!KIFUdvbX6;hECDeYz~(24CaqC2v15aMU_}`r{TH+qVzSt$!VIS+%pB zpbq-(Tg?%8;Dwu%W}sDEU$a01VWT|^7oGAby!rgEL%Ths-F~KdG_`S#f9WY&pvc*t5R^Q!m~HYtMTMTJ4%4ate@5p<0=QM|WJW41g%Lc>)mISM@`} zFJJLF7_J{y5q}5?sH>Xj)a{rUUz$5r+=-{%_JUo2s4Kb1!s zg@SzKeekG@m7{}FY(^j&Ou|K&v_IYzXE)EE7Y4zw+ouV3I`;E;i-|3(8kE=4Ur* zjY@YQ;`ki{NcD` z|4>D5w(D^Ax~JiaQ-7#@{MuhnSQQrwHDJ%tv*0J&-eUaqZs!uU(8zqEI{)q~J_FTk zQW3ht&r(T$rA54QJ^b*+8)3*u|3$_8vNu1!)*xWnF~4q`dp?O-u$LS2<99TmXg68x zp4qVHO2Yi%b3XR$6f)c&%pcxcW(*<2St#ZY&uQtXpFgJA_{>Z~o>yS~@E&;GtNsZJlj~m# zJv|1frX!aB{tGuTzrWTfiMi!P0z;Kac=r{5t7G~Lwp3hs1u%eUQmq|$WXJ1O?f{hj z;hO$_`uPP(_KtpjCzTz;cLTN*etx>kGD<3&G=N~5!E#}K{tU;-{yn{8PrqH>*+usA zcf*5Q$Xm>+b! zeUhlvf-2OS%fe;A{8Ttyi!29T9?VbQeJOjqV18GQf36Fq&RO!u+SSXr_ZRcir}{HQ zh}n4Fbne$ch&GcWAQ0F8?fVf|Iv0fh?O+(SuL! zzD8UA3n%@{ZS6Adl4&~&!2I0LkC~5VrrJN zW)-WC(woMKq<^C|3~xT~>u~{lbCkR z5bd&H{<7q!W_0iZEG_0QOa8E&Py!7w|4PLCo|a@@eO_enhF5(HhU*6*N2|RpQfrV& z(tw9v`bF43d8$eP%IAWL_s^@aeq;~4>(bkmROgr*uj9Ean}&Ozc{e=2|56)2pz{DM zHRhL{WBUyxS{}?_mi+WgvfP-T<6<84u^{Xjls~}yON9CPZ$Qg`1}6>ghS$C7ZfpFr zH7eZRhN+pg@Pn6rN&D*w`csr+UX;$7c&|SF zemHIX1!%Ti&Oa@YbiDo(dtMFC?Y|tV=?v}wU~LB|44QcjHjQnAcU*i2~8p9|l5^5(#MuyXh615*3#SS>B)*Znl@)A<0F7xU|vreCVt*>`~X zR~_bO?b61-I-GaX<8bN5A41DU{^{$5A>JK_&xN1ucq3HRYCY|`qeP#mJ-lk&v+%YH z|4u~?lIzg5RU7}l@x-mL_t@zsZ(y==Fu#oZ`Ejn-hcdgjpjcweZ|gMoBukC?%j@|W z^C(H60p{-{c{?4;f%)kf-d1h=`z8$4j;Q>9Ry8)nntQ*;-q6n@1KzRoesHW5K(*8@}JI}sHCHv6c1G#cAzbIpVif%;0!wpk(3zru2 z`~6`yfThCxep#GDJ1)zfu$;UX?CC!fI|hFK#lZah86?71QGt_3cED@Tyc_bo<}?RG z{7CSVGwa|7FTVpa(Y6y_S*6u--yt}E!(;H4bHAdr2W>m>n~EC2*Pr+h9GpH`tq<_q zw30BtwDV5G9tn-7Co~Nk(Ps7i5zZPCRc!^Q}oy4QJ_sf@j7RKralqR7w2I~Uw z-fA`l&+NGx9(dthFl3T_tW?Y|n6=+}Il{7+3iF5k(HVi37W4DN`alPme^q0Ceoig> z&8FdvXMY`pG^w(!$x9c2tN6bA!mmP8S@vm5VjVa%(;9|LPx%qN;p}fhvo)*}eUfA( zcq|2c_2<6<$7a^3U4UJ?RvzY;5kJ3NF3j(}GhK#S4Y;(JpK<6!K&6JS8=mYF8x;)=7$yF=MOQzHKkA-!17^!eG1cK zsa1N5aSD zzE_|AJ$TKT|Ew1L2wWGy@H%Y-@{d3Ns7)F|<*r1`4_2Df^UI9+t=8biBUyUP@5;wU zG^Ps`Cr#%En4d`>Z@laqoaH?b#$7x=e^lb4@h`8z#?c+{+B5D^#y_Rrvs=+vcWinC z{9xNnI!_-XT$J{;bQ<1$>EA$>=!76#xT@=wN%-+AZ-t+2f3sQco30AXANBLAuY}K+ z2=klsx_XljV5u>`d!A2Dw;#d$B#>(t?@PIyxQD<$$J^-RX==CYUl0D~NE?nH%+HKT zX#C4-aNX(u45y5}?C`y*6Jz!(=@dM^`*ra0p^Ft1piI4Lci+}9y!Nbn;L1~fpqBos ze1TTVVX}`lOgBg2D?k4YXnUD}RzBv32|0f`a2(GX&#RIZ0%Zkn4dERZTy>pH@@mFo5G9V zhD2Tz75MIp?^bR?ryU?{NMW>g1b*d`zg22Kou^il<^RE#Zh|Lvzs4r|Ec^ZaPG}*# zGBLlvWzMZ!EfZEfT?))kt)aSjPQWF>{I>j1Vh=F?>cjl*vf86BAA*ZE{1h(U@Dt?* z6eZW+47_~kBBcS;Q?p{vNdKAkuwon+pZpWG*B?Er+aVwmEjTu_9=`VEM_AxYT+>=j zm|qsC8M!trI_9SyQC%3dxs;gSn>Fl8D6!^*J%f@uKhwGG<>v?M`R6+BNYK~6>Mp2O zCJZ(=Q`BtFjhTQS+;$Tjnm$<@|BQx+QGRQO_QAU@{!E0RwPsPNOv87d|5bQ)-<43$ zQ2KY$#8xoo7k)kVX)gJf0P~aNr(2TVB!B-fKb33C;o8cavF8BuFAwHt=P(gxUV~Fc zw!y1U|2DMksy`}IXYxHVwGn=>?Hy1_n)an@=|2QFp8F4Q?)slA%RaXo=w};nXkrt5 zv9sK+byDtsqC&^C*CCh>N(e+oWrz#G>Gb9f%|0==!PCBYgym<{? zea5$8i;x6y88|A%Ha!4)}O>C``9?L1KxSz=T*d?*AMk9E*YMNd!Bng zymaUyyWDp*V*ajvezA0zpZ5oEvAY8=F6MWwBW_n<>R-74>}jw0QjF^N%PO}$1a(A82 zKhtA7=~ZHoyaM;X^sCTTfjuUnhp`*H{enB;v^CG_e1O(&Ag$eC@6og2TTg#bTW^Radsp9X-VeC!!@3B{lVC9=bukd^d%%F*OEG!=i~UNGULN;KR881?}5tUb5?#d0}o^ z(Yi>}ub@BHW?}3O`gybi&?F{Eq=_#pOCVor^9irpL=T4(CzSl<$;r#%L=?!wCElyg z5yryyNOa@F)n`XMdQ(uxT=WFd)83Vf8-rp!XdTv?k{$SW1lhKX>SJ1yHD*wNvEA4}k*^{M(jIx1jvG=b3({aLSTVofng zj)ep(`{4Q@A2DJovM69?M#98I0f&#Jur_%HPOJSCS~Eugrgs1|4uEX#2RU;PD(!9X z?5jG0-rJ+wtdUMLA+eV4n=_yZTYz9jBS2jywPHH~l@ zdF3$8AW~|qVSXiHJEP4jmti$=%>X(RGMCi)H&aC{cI}M$!*W7A%@3{?nKLDA!e;=1 z>J=N{=%|$;fHyU48@WAzRB}z=?Y90z{D#uFRs%Tcq*M|0x^)R`+?c{C8&g=fHi5P4 z5_JymL#f;gL0c7%>^3w(BK-=07@1lP$p%E4&gBV_8c_HvSLL0Q=Cm_}D6f)&SP9YaKjnJ)|DcleETm9+pXls_D0zy>P zb6Bq3{DTjYsy2fnSqtkog8Bn2kIlDc3*f+k9QN+bVb9(+y!28FcJFS(uH9`ous?^H zY4@&B^Fm&SIR-5rR<;AiVdc_beoiOWOJcEkcgeqS%!e%y3DU}(C0i4- zB1rsR9R+yq=Ku$HYpIV1e&6vDB$vDfJL=S`ufyV z0XuiLVf*$rJpD`qUfI@yZLhT9$dO#xEpWT}T17K=HJU^SVreixCu9T2-6zBRt{IDj z`GfTn*=!O!l%T|YTx<9tyJCL)Y&YqAO!9|EsPfNO^2ht9hD2{R12YXYcoi@-B;dUB zDsaL16}a@0Dx7mp1}C4KDnl9_IC)SrP*!=aAQ#gh$tcKV7z!~0IWi2Tp%~U80EUJVxZwP% z`g`k*!^(iUZ*Lo(f1wGFKi+_+pJ~F&FSnEp0^vffnkYL0-WSEvR;4cK1YEefd8+#8 zV}46^v`dklh-HZ2%8aP^9=U0T<6-`&1nB?%K7JJaP>7cxaR6Aoc*c_)T-1&Z3WL!12>N=g*ZP7NpTdQeHcV> z2mpyapD=1W61v{zS`!(8WG4;L;_VJ6?MuM`gE2I3zBvQp%!@(1_z1`YJ9QN&oumR0SbouC|L61$l>GnNTP=YfAqcv!f=|%EK=D)4i^!LNRv0ukXFsvO){5Ubf zJgxJg@vyt3?%m4Y3G=()8v2g)qsoYC{54nC;Kmz=;Id0AP_OAhY2{Mc!xTB9Q3*@S zkATPzfN1Roksk!ek63(eC$*>Y#@glo*6m3^BsGnZld6{3NW6-GS)?{?mLc14M==4@ zP#77Asy8x&1U{Ia1Qms|eZ*LLQE3HW>If9CJgH74XI=s@yhd}ms5MWIAO6>pO}ITj z08@YxUmr-KLjdrBB895Jcs?EKtJ|S99yLw{+BGz+h-^twsxLlv>2I%wAVfcNn<-eYa596K8@SegCP6wr9n~-T_O!Me)U>!*4Lt~I!_GW#q)tH6& zsU6Z8_z)Td7(c15Q{RcSMewXdNP%#onAEWXXt+ex-!q2xa^T%sdDRPHS^)VT5UpJx zW}XCz@FzPN(&|}IRL%fM$JA?^QQLE)D^b9!uNzW-kN>;@Telv8pZsJ>5upbYmjLsF zfiSIR4y`6>f@O@*7tBx3vpcfI#{7Qmx)a^BgZ^WFGVnPFa`Wa1&DKFFcVK`1DL0a*g3 zv04Fe`DHb@_~MOl=beY)&O49Ts7fBTy=a)XZ1g{Z@$Q5@nHV8XQI<;sPiO*{^Qr@@&UjucJB8O+u zbAk1XVR$uK1OmzC7ej+*dYWa(k@>VL8&zPD zX?LGU>dMGyZ5EcOc|G0$n9nxIyaBS90hvz%%$$pne`CqA|cKvKmtATX0UGD-q{Nv&pp{9E+r{m|sia4t{>RXE88; za1AeIF>8F^FuyHNcLEodpc=gRe*Q8~MUFl(k;Cp?ZMf*-iVEc|F%(gOeDp1l9{VSN z{E&`hvk)L?Q%I{l{#GCDqmWNM2T5fuh-|GQDrZn50*sA6O)RvstF1P42l5Fh+J~WN z9oG04-%k@Q1N*H<0RwQ*cqbC(VPF$fyWfyeVt@l$qR}{l=ZINrtR&kLAoCX#gDJ8# z02$`*uSA#&l$lD=gd(Q}LlcJhO?<*U$Ft*a`=zazF1if!kvDnL9}g#-0Cw$c!SrGV?GbGf%029&G_Ok#u3Z!-mBqOzAtWB5FV}vkO4% z)tUfGYBUb2=r{_e)r77eHJXBQJ+?p=O(pR$&`5nEp%N3}(83V0irWjqUCRg44D8^r zxnO5%3uN;k$krjlR9u_U#^D$hGW^_YvkER!qKVp?_db55-;r2iroku@Nk$>BUj@bR z)gaUH66})3Fq{ejue{QL$;md1jb<)hMd3)Z4#52G59Tkg=f^bRNcioRIoB`DuV`JT zM6={=`jagt=8whpyM;B29oz3S0KA5gemi!c;cQqfp|$JU?Hf{y(bYsLMs5I6zZ#Op zOCXxhLek!CqWX}~$mJH=G$LcyQL8u478qc26abDg^%1Xew;**Hf4H1^?y#n7V`PgR zG1b4*!6&sbe#Y9bszXN9a8FX(Jnl;BG^@W;TVs-4#7>AvTtM55#Sj#gvq09)hoW*0 z$jTaXt9h37C&B1w6ZExx`wZl0AR?{L+W(dY^QT#&7>{VSRdId8{9e0_SHaLidDuAJ@RPayILSHk+ z1ndFPJ_tgo$&}$1)oe^QVOg2qQ<@QMnelG({1(^Ehy-~TBf)AgcK`fA*p)gc2AOTtA;IaoV3SEV4~QsKjs=@dNz;c4p-KQICkuG#5GNc2SRBkBl*AayV(0KfELD_z@JQ%~4>w`QjwW1m0j@T4 z-By`$Fgs658F6swu29;g5+In-hr&M5AD*2AfPb|MOc{k)0CWTZ*9jmqKqgU4K$0H? zD2&m|tQAo1IyJHVXu7zSKBBsZ%&|MQ@fkVGb$YqIl-I32T*+mhR`oa6aoiNMAmgNl zSBTvais2_H0$;0tr)%^%#Z-eT5WbP88)G_epikrQu5Ig?&%-q_oY7nq<5x0 z0R_DDl4bzP_@mbTJ2a}u57k3lb3)H5LlNf36M6-pnzv5d(1V(&MJa%PRinUL8puK5 zNemti}vK_4g4?{CJPDwM68T(atn3r}WxL>_Qpy zC^w=FaP%LeW`cgNn&-UmLPM<&!Hi6NIW^aUEi_ytKYw+&q8P~ZBx;ZjI`tFtbK1fu z(bOF1dHu!w+|Q3W><|mJY%YNQVSe{q?3`(nO5r8pnP;cqrnirkT5G@aHkmrridx1H zkcsKF|C%Z3Kl3s;=2Q(%jU*fOyTm56CL*+$BZQby>kf3z0Fx&`B?-~r)j4P>_m+hl zOuL}9{BBjEW*j!hfYTcT6`yG$YTdjEuQg$|T1xA+09qY4-xG8LVwf*3YSL@{rE)vg zK$N_s&Rf$2gr=YwRKk`DXRCm%#3ljZDsln7cqQEXU4I=Z&y+>a4(@#&RRP|iw z=^@c$;?@TA5A$2eZLIxh1E6xHWDL@Vp8S`6#W3Q2fH^x+N{x2N!t1IlW z4jF;^hxz$Isjg#nE)4Vg<;2P(CS0i`uybbvw!hMX^UkfROt%IF^nApa0?~N!kOPu;4<6_z>C`&uw(nQT8?YdDycrI>_K7qeZ>4E`L#A=$eG@u zH@^MD{B{A86FG~C`D4#72IhBIO7k?Tcn=9N#z5Kn<@7o+Oml8QKATO|j=A1cda3YuA*G*BQqQVbkqwI5}a58ozfk z)==4bJo|AJ=yL}FKYwCM1&NK1r&c?mIqa!6iyYe@3)AX1=C>_3xe+^N1nLLocjd$h zvOk!g*B?6!a|mYIFb8Vle5$imq`gaG#rPFvWd6T;Cnzd3merZmtiED? z5n_J7jK#qGB>CyL+C?fRb?3WJeCKC;7fko({e9Mb%dg+g&gHRsT`B5EmL+iDKog#L zVhS>|5{%y)N}N^k+k7F91pTH=#dM8+%UOQ&`+0e`{N?WN0)OK>&ji3@k4?b-eNAN> z3g@dn*d*gHhuJg;GnBLkbKc_m*e<;!jg7&R9u%dbShh&AA9zjVlApK94FF}p=GTn| zAQuJmhkkw=N3jHZ^-+EHUS`Qgu7|4ufBchU@a8v-ma$b2Qf=^ib&rQIkrhAu;SsYk zl+ULqjaH#C-B#(rs3qRKoG0d|oP{>|C%dDx8qoHw zPne%Shn>WI0h%+pTZGeh%ujtN=RhYejMwV*RM`Rc9Vpc9J!%ce;5ac36BfR2e-4j6 za#YO)r?!)Hq?@hoxTu&P4U$vGnoekn{$YOotS!(mIDJzRN`6OZc0{^Z@#9k1?nfRx zhn;LTa^q`t!+8&>@%)tHEvPbe$l$&JRamL*!6*LEF(N!>#9Kw?|}a4RQmaSZbt_b(-X zp=UgGfY(FqF+qyFz2-(X1Wv0+78CQwGz(e|zF3&w*J2Ff;uwjrm{Iw@|G*JIjf?gN zT>j}f_*={|Q1c)G_0GTd-Ge3upEg|~(QmTkv#SAlV>BW3 z1M}Mw`DwcmXMZuj-!7vznKtT8AGkZg!2mP@z4&qy&ON89Hk+Kypg1^I_mNAf_J4T( z`5AcR;iFI=N_8xVr!q2az>}nX!2GlL`8`Y2B4B=74?%$Ll0RsPx<;IbJwef3!E>`) z`(v0t_FSB?#LHn^&a+Q=z)l^wU)jHr#4xy+Rq{tPUlB@vF10=Ki%Nd0olqaCy+)JqXu^ImA=ZnD z`8yl#oOaPK%+GTgkOraKWM73naO(=aeT9H(ErI**KMea16_8ahFhs1li97h+pYc$u z-zoz39xULy_a0F1-U@beGmi&x;n|CW`R!a~3(2UIzG8l+SLn9s>-d>0CgzVH?sfDN z^M{h(;Ve?Dn08_QWRXC%n!=9l4S3-GBT&yU4}k3IS0DUdrQ?AcsOO;G@%QdM2-{zo zR>41{8CWfV%^D4x<)UJKswheIu0)FMEF$LTD=G1M5|{jrCC2bQKi3J5vtJ$|+JUmJ zLXy;ub5i}YVSc||ep~r@$5NTFyz8m2d2}cKvbCSv6C8&Q`{2q) zRf~3`p<&c}#ed_j1MvDcj6srN_Mfnv!LeEowdGq1Ffk?JtN*yiqz2Q>U;i+hg3=7M zT4*po7jv(^V*auHWwI$-`)%`Chw$Gndo(W;^9P)d8U09w=`ZG|bB+av9tN*2;_N0K zU}z|VXP%yf`|drgB!$WgKkx~z{zD-4moQuh_|82C;i)H&!O$>Df2Q49Imz*}Ts+Kg zp0TwO<`;{F`TaKW*7@6{^cC}S?ukB0%_bEWq}}8DiutL|@^$}Ub^tXv1_!F>KmlL< z%6>R_s8Cy&`MVemj@5YJJFH{^4jjzk%YVO1ebP@0N%_UV{PsV(pD@2% zEX*I#1e^^30;$<&% z&{xbKNNnqSgxM2?EFANDYDcuKs0LbWL~WA-DwPZlA8NxFKEIoVT6SI|5Y{4l_|4BR z^&hOT_AJ(TlD3I6{Bxh)4u=l4pi$V05$s4?T1Q?z{IGjErg{ zk{z{R1`@Wjr+fG<=Q_jt_*<^9_AJVHs-PbUqoV@;`R+sTgZmG`C~o+fJ8jPs9+EUl zSW?W7f4CoDrHZhG>JWX${I+2{3ecR(NUaVrzfaI~K1QtF@V6`5sr}l*j!Q68485Jk zoojoS{JKrP4is;f{|x_h_u@pLjDV;SnADdtQOkwDc>6B6=;9&RaB`-0Y$aEbZbVSg z;P;9c54DXO&aWEo_S=Hn|8~1F?&`f89i!*Uui(;uDRcM%y2M+a?X9Qv{A~U^%+DZz zndJI6ll<0XK)W4F)BqM5+wY`&tQ`Lwt^NaOwF;P-$~)FEyX23xtBfVe8i2Wzxgg!A z#)o)It(w8^-81mHzum326w|%z!MZp&mho^n9Jd4e^k2RLyLMv8Z$?{-=s(l~jWJr3 zf_(ZD+uzfAe($;d#P+LE@aT@U*|vqWi&7jw|1tm4`1xnU{JeZ(iTqg(*tA;^jWc6o zHF)p`hv2JUJ_y4j4hncy=fU5K83X(m-_gj3fG_{uUikj~2ViWhqLzbeBOk?n;C4cM zvMmkf_ou6)lcmJ`jt=x`FCW0%t^JF+o_{V8e(rqS`#|?QVkcXGdq!_4sG z+tgXn(WmwNTskk_dj6PgF0M*@)XFpr!UoAoU(Y{RKYvWipfdDlsJ2o0j?*e8U^s7< zr3$Y6uRq%cdv>?<_EE-n;@-FOJKiW8Uj?%LIaKl_vCq1nvUyVH~0cl~+7 zTGAX@JU>4(5kw{bqWSr$Eyi9!rv>|xEH>t!?I=s}{$hStUbrTJcw=A-An0NyO~C?$ z{^C!!L#u_W%FusHOn~-q(|?2COFtg?F7TbSniBr>k6(mWUY>&bP{n9`#^P_>yeQ3i z7_d5)3iC%I{A}Ri5@CKzQ>Kh$xiLRAoG(b~FXrc3i3~IX#{?`huoFh_ii_F+V#x9F zDm?b+G5E}<_dvDApb2{+^nLJqX~zSPT1~*;{O|4X$WM>J*mzare$wO+^Q*XzKwQIe zV1E65Xruy}f+$Oi`PmospV}8-IWWJyGtnD%=4~|K6pMiQUAyD$a!f(Rh#R*c{nndD zq1vCo$VdhL>8?F6I+nr*KYTJwPSLj2WmYu!z4+rnLULqSz~}zIo$!sX?o=@xQW^cs zDnI%Rh(Tj_u?(1BYawc`n>v;f^Lw-t?hf1!KYz4wT@J_SWF%C#Tf6-BgqjB#`C<^l z*C715_%$s(P~XRbFkT^n;gJgb!<{>!Ru%C6n>WDZBx4{w_j+(FSCe;BBB=jV6B zowsj;;o+)L`O)W3aUCk<1$&lbaB$LkiTCPjPGfp(vl?{~{rpxax-TRK)q`1YlE0Ir zjbZ-oWDr{W(V*6tF*~7jAlPo@m)qqSNGz+d|Aru<**IvR>ovhaN{z%eCu%wA7e2QG zl0?FLfBj^|1nfH)aDhcVaGX&mQ^Y?a;P39(4WIv;mtbhPqCGiA+Pf6r{&)PJ=7(?) zJ0kfPd9OaxDoxP+i|x1Fu;s=jKiz2e1&9yz;`#XGYM7=)0Ei22J6^ZVz+2mLG(K5==B z0YJ}yRPzg^&KEwj1DeeOHs5**G-hzu8IxpYaPR;m*%(vyxxGYfAAg z%DA6Nf0FHTNie@R+l=0@e3;*P6?8j12tY%%7?{74pI`UI5iVixPC-cv$Na7z<^EAQ zx-EJ`5qeGskO-WFfFaB{!7>;c7V!69*r@`9KKL&-S$7nE4vYeQI&l3+jw|Oh&i(5@ z-wt2>(spH()w%qQp$|1R?)EdU&ME;0|0+qm#F!r#O)e+qr^Zk}vZcoS9Gi#Mev-u9 zas(_K^V2h(Gzo?gO?04TOoj>IDFL|0p*9i@k5u8Vuk41sdm8YY|LP1_w?2jGDZ>N? z$AXWdEn#RlfkOw|@Rxu368!M{`(b3X$|OAn{7{Sl3-&Q;9hdyeg83z`{L`yVwdNt0 z1@k+TgYHe%8T0$n(y3EUJ>dj2o0Yz^&D)~LG1Ry^6kv+@| z8E~+Uggtl3-wQ!wjD4-1svU&&!keh2jKR{D$(lKWHAKRy915 zz|q4w{Qd1a;2U4rsj~T~#2E;`knqjAeql5KEwv3UR@dm28|g=qpU*o8ZAN9)nhsAE zcb-<7z#=@u{$ko?aHTuu_v-awfL9Mw@k{lX>YWusI1PYH>ZO+a-O7&>{9;OeKH~fw zw}B{6wABREA9|-{0Y!l;3iY|kV@){wyb<{DZ=MO4T`>&JCP2GYs2yqsNBO`7J-9ng ztp@Pe&nDn+|M!dV!m|@FI#$(r8c?lGwA9xU-tF#VHE&}8oL%w<1jOe@jDRANy`(WS zp5x3<@e3Zo2Zyhq1cG@kl0WEA=`Ias8UG&3=CBbLC-v@I`M#f-g1ZH{-$jL(FWB5TL)9e{SV1 zHs+5(3|-W*f_xv-{@Z~$V!;ijyK+Tz2T`%ZS_Zz&glX)7<&v)uwftX(~`s}3U zFD>TxbrO#ea1CHZVSehI{k~k1KP*RIa}b0+HPLgefc}&UrmR=mPJr3~u3CG`+cv=4 zZrT8wPQ(2NFn~yF1T=Auw}T9P)oKE@D!{ItE%>Le?Sb#yy&EQuwv=z*ZO)NcNsr;Z zF2avVejDVo@-V-YpzIm-;R;M0Ybu7f5-@-Gkht~3d*w>S{3s#N|2{LF2gJ8jnBRT( z83CT7rOQsLXm#KB7AP+PFeae10jWF%(^ENYIJpXM`Gu3=Ex&LQoN{Vr8G#zF$gT}? z75=6z*6@8+Dge88w&1?I_rbmQ?1BAzXP`cuL6%Z#Y@_N^gdc_Rsl`})n|H$bD-`of zJz+5QJsLMv`1o>Te$oh-rmHl7m4x}-m`F%dyUe$?&Ed*TZRNRFto~(U6LGM6$ZH0-`m1Z#uRE4R`=MUTMPj zzP%6b|IS|6w|g3DLz&u$MVnB}@?FCBM*Y`wO&tw*cB)f#Fu0M9->p$PwHKRN^l_BWtDltL8= z-)zH0gil!C61p0AjPd6YbH>uIB()igmE`BgBbfgy3G@3f!!UrA>gRVVJ}k53@AaTE zOujb-d8h#L7N9zagio3Q5;ommK)aR0^mML>^r6@Kn<=fL{sMAeX3P%}!Msv1zhAl;Im3XI7ht7e{^j@ccf`W_OB_;UoZ?3f=Si*!~X=BEx*DIIJ8%Y*s5N#?niw^*3Jd-=qGbeUZG zbH>0K0(lE`zFPzeC{pp8%0(m#Xtr`_&g9Bpe&(x2;EHR;;qt52z?o+csjN6?B0*I< zZ=>7MFay$#du)BTUeWkq8&MnA``Ll|jtic)y)+GvKYSP-`RO6p{_=#9_SISn)v6BG zp|K>1Ptkgsut|*}^`96%J;Nm(X%5{a|MFmdi9OJU3uE-0#n-<~n4iYOp3)4U_ldr| zetue&$3~(a+oyQktNG`Hkh|MXnY~;XZ}+p#)Ap za|ABBY!oiOd>qa`XBfuUrpn5Wu?2V!8sTuPEJK)uDR3Gff=Bv9)xJ^@keRZN9&W>n z&riWqj~`WkJGMDwJE0&x7T|{N?hU1`tAtvNqsr zKRyi5S^&!dZ=iz8QY=701YB^0E<@a`WZi}uoO9kNoOj^}oOj_EoO*fv6!C@96KCmF36T2^9Pzx=muOZm|rjZ zlc z{qQ5B71(t8Fl;)t2B*Jj1U7D}!^TY&b$#!i7VOOl$uL_H!|LFMW^rwTA<)#!@swenn!-CqB~CI5-z=cj|T$_TBP+q1c-`W(lG&-9A<7nZ}% z5v(1I648bP8S5V_hdtYgSpD-p5BJM+D*kNaV$T`Kp@}y!`hgDmQFob6>Qq!Lwm@xg zuO|`_JzXP-q|=q@#Y?ENqk#~Hb;EGM5(XIIfiAj{QCxH*g7&+uE|u#}Tj!XYjwHUj z=9mCC;?a5bFN@surz-eeq zRkMUL8|I%~4d{0czcSHw%MR@Dee7IslE2JUIE$ZK?nKJf<_up61-dYsh|T({7=a;h z^**$Uj&TE|0y+)A^xu?4Z`_T!HmK6QZi4vvswmg1j?&~>8=n?#9QXvVH08c@&f&+@2obF3cm1LE znYMCLWiC`}cQO6R<}dk|GH*XOr1=uIf*UMKbbF~paUC@azkl?+Uw^D_-d~3mdEyk; z|1#4F`{x&~q$;(6J);<_mArmGID=E6vuaZ73FGqD)4h%(AhAp( zEa3)8ZoWIO&zJp;FVr}(C9x{255urr=EX4oQs?cLX1u!P?RWKRBEw9-Dh+%|NnjFx z0eSn`Ob7&m>nR^6PXF%Bvsde_Nsx{K%r5z7lf3>j%+}+%cjA({1d{A`UQW5K+B48X z4(v&OZ%COW3nhPqFlUkcynnNgOBapEa$<^UXN19Xyi*;jY$SM!{Id^xlF8ny9Bnv> z4a~5U%H5-h!VsKdMl`5KlF%oFJL&ji;(aCP;*Xl$0^7Ek^G@3Nh9vhg?A1qy)vriX z-u7n!dHb1=)a5wLZ`;WG#_dmR>`gV%G09do=8qfaIFVtJ z4Xb6XXw2W){o_W#`Us7b;`RI6nX7wgFGC_@Z&O~rSVX?7CK0NhvOX4mhbH%;cQu4a?W?J zzOY^F9x_gKXis^cH+^n4&4QinaBiM^B--)dhB9U_BT4LOEX0t_UiMZkr?`2unvPTh zRtH_j&qQU{q3~P2b+%b|PuX|aevM&>u2cQpCY&~w-xw?T2q{AG+RVn(yg#`@_UaR) zC$sC}EYRa(Uyyz;ecY?h(TN=iyXw*J4-q&YOV=PCYZ2=Y-JGp9%Y*DC_mq=hjJ+FyK@-c;q+t>=N_bQu zCkZE=XyOvOUVWHfvhnwi;KT~X{C=C+ybd={_a*;qlF`3bmVjI;hNBlse!mT|I?Cr` zxZY8X^Z)a595aaZp*PIm?YUksKhqwpWcMWlr!otHt<<0yMOc;o3H5uE z%xCqPKpFc&{pHK99PYl01gbJg=RdvrF~2YxT=;&yabG2v-=_o&7w;f>S1#rcJ4n~e z^k4!?4P>v9+H%O1hWQ!Scg+kWzmJ0%lP_r-Tr<$Oy9yP6h*aey7Q>#$Ip!D4yW|yb zf2>Z-Ph&&3sW^ZVU+{FCm5=#5`T4_|XDff@V*Z#wv9iiur#T(Urt&K$NkX=Sa5bCh zx9v};p&ZAUUj{A>8mHp~^XszQ&B_Zv+;TNy{$Bk2-87nb`&JX?XVQ=-(_k3ckLqCp z-AZGUw8TNf{y4RQxA=I&{1Oew)f8&O6;E!jcFeD|P@|=UcNi~#DK`{Js{r%Q=I3{H zVSf5Vt&vyz%iH!Gub7`>N+*W&a#vd4&NT+;g8Ac;pR2E2-&>WKAIzCTLRzJmh@fGs z6!ZJ~iqjm(3($&5(bab|Lo zrV}EzuGNeAwTqXHu@%;$g*Jd`Aq1v|A)c~oF@FbRzdDfk^=`aQ{o>{6F*{K(zc2Yu zM9lB%m8E`o?RFx5)na~{d)AhrctRqIqL{|zWfPRxp{s;jMVQ~OGc4DC4LrWxl{LWp z$2;aHNFuBzw(ddwfz9hM(r{_>;zMA$#S z@B!vueVAX@Db?Nvc%aH30n^79=8vQ>(_!H4gNX#WPi?|z>RIiWzf+x#Lxz3A{CJr3 zGN!$B(TE0^e^p|BSFcbx{Pk^46+bR9e@Xih5^27WVqYde>=X$u17#3!m1F)+<&);( zu%_O57m2^Eay#&$?^5^x^RGJ0&t{o=9y3T4xz4ogX)MPl=J)5d1c^(-6M&tl0cAeB}oFAFx>W@kPvgGG&_3NZM zbXl@P|NO$6%|c}rqF8?QXJs2j@tNp;Gd5QC;7c_FfI0lse}Vd;A2IjXHqw0tS=vUi z=e>3L=3dqg+dn(unPjH=Y`uiv-T2scd+*HEqt`pQdTjZ;Y!B~Jd)#>O@u1Y@mOO1r zw_rT%=BQMT4r<~3r80EXqwG9?BI5vd+}Shsow>1g&oRl($HT+??p|Jo)-v2VE!o}s zaViR%*QQ>I=%jJvW6z&qnBTrzq;X^bLc+t?3Kb2Jq{%~hf%`;}Aut@RQ1bhn^0>wP zOqx0V?$eTwkq5E;OO5&Q9VE1Isf7tzN;++pNn~3Wz0u;TE}z635ofG zi!Lj!=>zq^FfrUc*Y4u&#G9YD-;5tg13P3~(s5}xSkFHT=4S&)*D?8PBUf0T1Tfd! zPISyKX#VTA6b9-){O$X%cv10#8*aEaRf?;WcP9yMAB#-m#Kim#2SzZz!d|9qA(deX zCLapR5Z zkpjeBt=3U&YU&f~355BHt9sIzv_j?==aPY>letDppbiT0Z{^Pq*7MH+^Gm59S60y* z!FuzN#+y&V0pj}&E%hL=bERRo<=)tueD;-F#kky?@0mo)tA1o8s+__dyRSbb; z&X!{bQo>3P;Dl&Pq18S#Qqa06D!rt~F2@fmX<*tM4^|?vkJN$Mx0soM?5P&m~_Auvna) zld<>9=d(V~y%-$xb1lZ!%rs^`7M=z#WsxRB$W0$>i=#inQ%L*DJGyzZOz*qzt!)YN zODVbt*xrsO8s_(9ztIdx1MtLo1mc-8P#tZxWEad&TI3*yAD>qia*XKyn!a`eUV5p~R@3Z`M(aomOuH%*Z>fBG7z{58I6qiHzga&o5$<-_$7pDiyUVl}Ub$wfTgjYu45>!2Hk& z^Al+(zg3c??bfkYT4Z-zjN)Tz1`jZQuYP_f z+0_nGh~Y%da^QcqP@UT$df#)I1h_^!|c%nz~mW5ut8B1?ynEqv=6_h0?YZMWT)AkA9_ zfX5S0&`@W8Q4}qK_QDXy4=_K+{7%wYYp%T(!TcnPQA21J_Kb)55qqKag-g8S2J`z^ z+ImQohM+IcOg5q2%#9a~KhJcP62={1ei_C5=9}S|ilznpg{JjSdE$w`A+dQgZX>_z zp-Oe++E!~4r<>Y6h>RJW5!gb4fCHcH>+jYWV%B1Z%*B=CpPPMoZy9FLR!-f^vone< zLocxjrzjM-q5UXa%kRUnn$=>@vE(D8@_ zbn!Nlav>w*;pPOjNqGJ719^0ZZ7Do}DbnUn@5k->%*TTl)G1(y51nC%930C6rN7AY zsh_UdbnWZ5ZUxlrZ7Eg*zypbY>sFDAB>5Awbjl;50p^cmemiMo9P@{96)tvwVSe-0 z(A||LB8vIBKiIwX&@#Mm%x?)XCRv~}<|j?a+AZA7)ZeUjqoqFg^INO7wVU{u-@~_7 zli&nUwtYA)jM@Ietz#BPlLkczw%Fzwvop9u!VMUMf96D|GXlybwA3o zkt^HnsX_>~fqWOqAF?K2D)**A1TArImc0=D$;+En!pBN8gKcGYF!#JK5ti=AtV0Ff zPbPs}Re{uFc$YC-=hk!=Fn?h?FCfQ7N|6Dz?PtY%8k(;(>4Qst*58=qmxZpE_6_0n zqUpFcoWaaQi;ZJ28dlSY4Hum(i#qpO+>7_#m)A^Bg`0!q2PciGzl?#!`eWaf*V^#? z1{Wj!p|D=B8mH2hCb~CGBa+{Yb&(}QNxPVQbnSuqYqmadS~EZoFIx`dcAEEhXvX=SPl2qZjr8}ZEo1;HH~>8YTQ55GOYPR=_tIvT^4gfjR8e=ic|g&o5^2^RofdLo8*UWy5K^J^8)sfAJr` zbQ`#!zpe}bpMBzqtpduiYH)e)Pxvg0I+rI%{giTciw)=14Z8aUzN%@Y5}-+NJzpb zke}ac=8BB%SFfIBH|9g6VF79oZGBH5`PEk`)pg32%O$_nMy<-<-Os<^z4``zes#?1 z=eL9FW*dg`XW3Yaw0rmc*F2y!dbpWs@v|@hcSw;6_)o3o(QQdmPxKlAp9%+C;o6R|#|<#Q z^y54Fj````7e$)Zl2-fJwps@NNsa!NPj#g5F4i-23(6E-2k*aS$9rnkkuT@%DKzou zOqqerQcql(!0y}$*QI=gMYTJHO81^(dF;!rpciYd@@h)+hY?1U9@ztBdUEbZnn}^_ zn8{)(EY=KnCRPmZZ>jknXDSV&yt9qN$N#R%TLkWT%z;}Lsrj1j~R5`582)vS6pa;|+6+Lg+9)@&a7^Lrk6&A-6~ zKM3cc%P}hhklLOgKJ=kyM_Y3I`&nAQtks$*gfbNm{QUFw^E))`;u|{h17Dhl^fxCz z{{kex*LeSSb{{29@o)8h4gCC|hkYS_{!ppOi!2>U+QszGkBl_0|KT^kF#+%?yW(Wt z3;+)_BH-eITW;BT38dKr0I;?w+Q=EuF3?L6v96UQ$9yF}R|U%qxpTojcaIQ8Ow!p5 zHDR&A0}(-FC0)=^ubeMQZ(LUh*qQ*Ko@bmZP=hxQ$Ad@S9=WLZ+%+GH#&w9RK zSC3+bD=BaPz|TMb9Da1o{=;rGZ&ryEnaD&`L@ryujl_?%+6(dXVtYDnxZyjQN+xj2 zEB~=tTlZgEt)n?^wccAuE|(Ys%wHOt0p<^eWPtg5!2EdRm25O^wh#Z_J@>!%{~;QM z9*;RO09q}mjDjE7@yFHb+D|r{N7|HL+!i{B?H^!%K6?k4ANr2@wXLO{DWl)fKe^|D zYk$`m{d5%A;xGXHHaBnHnxJ)Y^9OeRRkgbIjGhF#uJ&xa~F&Tebk){DIw{uGGdq(rln6Ak9jVULe50 z&mSMAh_RAh*1*s2dp}~v%H!J451!<2wU2%F?(bdw(c5lAJDsXvt`_eSxyXJQ}{lPqsp4@<)4_&cZZ19ECf49{<_WNlzoFqw>;Ktgz;kqYYj5`sD?12xh z()Iil&+YYlRpsy-#P)-Izjp8!F>gPcAM_60T+ETCa6L}5eeCy<_%X33r@{Fi3)BG0 zhQar5-gawN8T!*C$xdpuCffia8({t}X4wJecjGXK?bnCTgxhI4lohgdATJvK?wd9^p5L?dQWWi0#({aU#U_ z3y@G?>S(A`)+FurQBUW6-CguM7YWYT$d`^YGf*@TvbLNoxN_${gDH zOfKxcgS{UE%+KBuo8W`ker}U-0~0cW7^vnI{gOEujTZ3u5pO;1cfB)0{*L*posTI!vN&!QgU)%&q{SQQv{0{C5%HAN3uHk=ei6D|IK-bfmMc;9`m+ucvRzr+kcA6#wO zeCy5|q)cwh(%M_`1!2l@)d=)&3^2cU3@|?p#PN&yr9{G)kY+=PfCP%X@ts`eTkg64 z+WSJzuzr(ofcG!G@bh~y4M8SkPTaol+{8jq zT&j6)3H|)w{QOAvm{hloJMH1>y)>zdqG&(ZZclyq_22#b*Anp~jcid%c^9Af6=lLQ z9KLEJ#mzVG{*?mY<5CpwtY%}?qQKnu(>Qc(DT~DAruCIF%aIvtb{uz*!_SVyAcvnF zi>1K)k^sL}9||ELOOiT>qyp{Mu_lQ08wnJD{mt)Q^);HkOQG(s7zPk7Ev7S=ai|5w zW+BsG6Hr`Lsf>%fXhMatI^{xq6FGxL?!du;U0*nl7k$6 zF|rxt@Cz`%3+O~#FJyu#^Ab^m1c|=et)tNzZG-_c!c3K^Q>D z2;3lGQiBbfE`2Q&&36hAZ?&?^dN^HjU!u~8SpnxgBs-Uvj=fAMJ1G`3-?~czf8%Q zTxq9m+zs^z2>BGq^rs?`KW^vA1K+;?iWfO6Lcw<9eK!^wECTVfBz-F&-l9aC$', spa_serve, name='spa_serve_path'), + re_path(r'^assets/(?P.+)$', _serve_fe_assets, name='fe_assets'), path('admin/', admin.site.urls), path('api/', include('meals.urls')), + path('api/dashboard/', dashboard_api, name='dashboard_api'), + path('dashboard/', RedirectView.as_view(url='/admin/', permanent=False), name='dashboard_redirect'), ] + +# When DEBUG is off (e.g. desktop.py / EXE mode), serve static files directly +# so the Django admin and Jazzmin theme load correctly. +if not settings.DEBUG: + from django.contrib.staticfiles import finders as _sf_finders + + def _serve_static(request, path=''): + """Search all static file roots for the requested path.""" + for root in _static_roots: + target = os.path.normpath(os.path.join(root, path)) + if target.startswith(root) and os.path.isfile(target): + return static_serve(request, path, document_root=root) + from django.http import Http404 + raise Http404 + + _static_roots = [] + for _d in settings.STATICFILES_DIRS: + if os.path.isdir(_d): + _static_roots.append(os.path.normpath(_d)) + for _finder in _sf_finders.get_finders(): + for _path, _storage in _finder.list([]): + _loc = getattr(_storage, 'location', None) + if _loc and os.path.isdir(_loc): + _static_roots.append(os.path.normpath(_loc)) + urlpatterns += [ + re_path(r'^static/(?P.+)$', _serve_static), + ] diff --git a/backend/meals/admin.py b/backend/meals/admin.py index 7f098d0..6abbb8c 100644 --- a/backend/meals/admin.py +++ b/backend/meals/admin.py @@ -1,7 +1,32 @@ from django.contrib import admin from django.utils.html import format_html, mark_safe -from .models import Dish +from .models import Cuisine, Dish + + +@admin.action(description='启用所选菜系') +def activate_cuisines(modeladmin, request, queryset): + queryset.update(is_active=True) + + +@admin.action(description='停用所选菜系') +def deactivate_cuisines(modeladmin, request, queryset): + queryset.update(is_active=False) + + +@admin.register(Cuisine) +class CuisineAdmin(admin.ModelAdmin): + list_display = ('name', 'description', 'sort_order', 'is_active', 'dish_count_display', 'created_at') + list_editable = ('sort_order', 'is_active') + list_filter = ('is_active',) + search_fields = ('name',) + list_per_page = 50 + actions = [activate_cuisines, deactivate_cuisines] + + @admin.display(description='菜品数') + def dish_count_display(self, obj): + count = obj.dishes.count() + return format_html('{}', count) @admin.action(description='启用所选菜品(参与自动生成)') @@ -16,10 +41,10 @@ def deactivate_dishes(modeladmin, request, queryset): @admin.register(Dish) class DishAdmin(admin.ModelAdmin): - list_display = ('name', 'cuisine', 'dish_type_display', 'ingredient_detail', 'protein', 'fat', 'calorie', 'nutri_badge', 'is_active', 'created_at') + list_display = ('name', 'cuisine_display', 'dish_type_display', 'ingredient_detail', 'protein', 'fat', 'calorie', 'nutri_badge', 'is_active', 'created_at') list_filter = ('dish_type', 'cuisine', 'is_active') - search_fields = ('name', 'ingredient_detail', 'cuisine', 'pinyin') - list_editable = ('cuisine', 'ingredient_detail', 'protein', 'fat', 'calorie', 'is_active') + search_fields = ('name', 'ingredient_detail', 'cuisine__name', 'pinyin') + list_editable = ('ingredient_detail', 'protein', 'fat', 'calorie', 'is_active') list_per_page = 50 actions = [activate_dishes, deactivate_dishes] fieldsets = ( @@ -28,6 +53,12 @@ class DishAdmin(admin.ModelAdmin): ('其他', {'fields': ('description',), 'classes': ('collapse',)}), ) + @admin.display(description='菜系', ordering='cuisine') + def cuisine_display(self, obj): + if obj.cuisine: + return obj.cuisine.name + return '—' + @admin.display(description='营养提示', ordering='calorie') def nutri_badge(self, obj): badges = [] diff --git a/backend/meals/migrations/0006_cuisine_dish_cuisine_fk.py b/backend/meals/migrations/0006_cuisine_dish_cuisine_fk.py new file mode 100644 index 0000000..f99bf6c --- /dev/null +++ b/backend/meals/migrations/0006_cuisine_dish_cuisine_fk.py @@ -0,0 +1,29 @@ +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + """Step 1: Create the Cuisine table (no changes to Dish yet).""" + + dependencies = [ + ('meals', '0005_dish_pinyin'), + ] + + operations = [ + migrations.CreateModel( + name='Cuisine', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=50, unique=True, verbose_name='菜系名称')), + ('description', models.CharField(blank=True, default='', max_length=200, verbose_name='描述')), + ('sort_order', models.IntegerField(default=0, help_text='数值越小越靠前', verbose_name='排序')), + ('is_active', models.BooleanField(default=True, verbose_name='启用')), + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), + ], + options={ + 'verbose_name': '菜系', + 'verbose_name_plural': '菜系', + 'ordering': ['sort_order', 'id'], + }, + ), + ] diff --git a/backend/meals/migrations/0007_seed_cuisines_and_update_dish.py b/backend/meals/migrations/0007_seed_cuisines_and_update_dish.py new file mode 100644 index 0000000..2f52615 --- /dev/null +++ b/backend/meals/migrations/0007_seed_cuisines_and_update_dish.py @@ -0,0 +1,93 @@ +import django.db.models.deletion +from django.db import migrations, models + + +CUISINE_SEEDS = [ + ('家常菜', 0), + ('本帮菜', 10), + ('江浙菜', 20), + ('川菜', 30), + ('粤菜', 40), + ('鲁菜', 50), + ('湘菜', 60), + ('西北菜', 70), + ('面点小吃', 80), +] + + +def seed_cuisines(apps, schema_editor): + """Create Cuisine rows and save dish->cuisine mapping to a temp table.""" + Cuisine = apps.get_model('meals', 'Cuisine') + + name_to_id = {} + for name, order in CUISINE_SEEDS: + obj, _ = Cuisine.objects.get_or_create(name=name, defaults={'sort_order': order}) + name_to_id[name] = obj.pk + + from django.db import connection + with connection.cursor() as cursor: + cursor.execute("SELECT id, cuisine FROM meals_dish WHERE cuisine IS NOT NULL AND cuisine != ''") + rows = cursor.fetchall() + + for _, cuisine_name in rows: + if cuisine_name not in name_to_id: + obj, _ = Cuisine.objects.get_or_create(name=cuisine_name, defaults={'sort_order': 90}) + name_to_id[cuisine_name] = obj.pk + + with connection.cursor() as cursor: + cursor.execute("CREATE TABLE _temp_dish_cuisine (dish_id INTEGER, cuisine_id INTEGER)") + for dish_id, cuisine_name in rows: + cuisine_id = name_to_id.get(cuisine_name) + if cuisine_id: + cursor.execute( + "INSERT INTO _temp_dish_cuisine (dish_id, cuisine_id) VALUES (%s, %s)", + [dish_id, cuisine_id], + ) + + +def update_cuisine_fk(apps, schema_editor): + """Populate Dish.cuisine_id from the temp table, then clean up.""" + from django.db import connection + with connection.cursor() as cursor: + cursor.execute( + "UPDATE meals_dish SET cuisine_id = " + "(SELECT cuisine_id FROM _temp_dish_cuisine " + "WHERE _temp_dish_cuisine.dish_id = meals_dish.id) " + "WHERE EXISTS (SELECT 1 FROM _temp_dish_cuisine " + "WHERE _temp_dish_cuisine.dish_id = meals_dish.id)" + ) + cursor.execute("DROP TABLE _temp_dish_cuisine") + + +def reverse_seed(apps, schema_editor): + """Reverse: clean up temp table and delete Cuisine rows.""" + from django.db import connection + with connection.cursor() as cursor: + cursor.execute("DROP TABLE IF EXISTS _temp_dish_cuisine") + Cuisine = apps.get_model('meals', 'Cuisine') + Cuisine.objects.all().delete() + + +class Migration(migrations.Migration): + """Step 2: Seed cuisines from existing data, then alter Dish.cuisine to FK.""" + + dependencies = [ + ('meals', '0006_cuisine_dish_cuisine_fk'), + ] + + operations = [ + migrations.RunPython(seed_cuisines, reverse_seed), + migrations.AlterField( + model_name='dish', + name='cuisine', + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name='dishes', + to='meals.cuisine', + verbose_name='菜系', + ), + ), + migrations.RunPython(update_cuisine_fk, migrations.RunPython.noop), + ] diff --git a/backend/meals/migrations/0008_alter_cuisine_id.py b/backend/meals/migrations/0008_alter_cuisine_id.py new file mode 100644 index 0000000..7df1d03 --- /dev/null +++ b/backend/meals/migrations/0008_alter_cuisine_id.py @@ -0,0 +1,18 @@ +# Generated by Django 6.0.8 on 2026-08-27 06:28 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('meals', '0007_seed_cuisines_and_update_dish'), + ] + + operations = [ + migrations.AlterField( + model_name='cuisine', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + ] diff --git a/backend/meals/models.py b/backend/meals/models.py index b916d56..7648803 100644 --- a/backend/meals/models.py +++ b/backend/meals/models.py @@ -3,6 +3,23 @@ from django.db import models from pypinyin import Style, lazy_pinyin +class Cuisine(models.Model): + """菜系:可动态管理的菜系分类""" + name = models.CharField('菜系名称', max_length=50, unique=True) + description = models.CharField('描述', max_length=200, blank=True, default='') + sort_order = models.IntegerField('排序', default=0, help_text='数值越小越靠前') + is_active = models.BooleanField('启用', default=True) + created_at = models.DateTimeField('创建时间', auto_now_add=True) + + class Meta: + ordering = ['sort_order', 'id'] + verbose_name = '菜系' + verbose_name_plural = '菜系' + + def __str__(self): + return self.name + + class Dish(models.Model): TYPE_CHOICES = [ ('meat', '荤菜'), @@ -10,21 +27,17 @@ class Dish(models.Model): ('soup', '汤'), ('staple', '主食'), ] - CUISINE_CHOICES = [ - ('家常菜', '家常菜'), - ('本帮菜', '本帮菜'), - ('江浙菜', '江浙菜'), - ('川菜', '川菜'), - ('粤菜', '粤菜'), - ('鲁菜', '鲁菜'), - ('湘菜', '湘菜'), - ('西北菜', '西北菜'), - ('面点小吃', '面点小吃'), - ] name = models.CharField('菜名', max_length=100, unique=True) dish_type = models.CharField('类型', max_length=10, choices=TYPE_CHOICES) - cuisine = models.CharField('菜系', max_length=20, choices=CUISINE_CHOICES, blank=True, default='家常菜') + cuisine = models.ForeignKey( + Cuisine, + on_delete=models.SET_NULL, + null=True, + blank=True, + related_name='dishes', + verbose_name='菜系', + ) ingredient_detail = models.CharField('配料明细', max_length=200, blank=True, help_text='例如:牛心菜85g五花肉片15g') protein = models.DecimalField('蛋白质(g)', max_digits=6, decimal_places=1, default=0) fat = models.DecimalField('脂肪(g)', max_digits=6, decimal_places=1, default=0) @@ -42,6 +55,10 @@ class Dish(models.Model): def __str__(self): return f'{self.get_dish_type_display()}: {self.name}' + @property + def cuisine_name(self): + return self.cuisine.name if self.cuisine else '' + def save(self, *args, **kwargs): if self.name: full = ''.join(lazy_pinyin(self.name)) diff --git a/backend/meals/serializers.py b/backend/meals/serializers.py index 234a2d2..1e9f563 100644 --- a/backend/meals/serializers.py +++ b/backend/meals/serializers.py @@ -1,11 +1,23 @@ from rest_framework import serializers -from .models import Dish +from .models import Cuisine, Dish + + +class CuisineSerializer(serializers.ModelSerializer): + dish_count = serializers.SerializerMethodField() + + class Meta: + model = Cuisine + fields = ['id', 'name', 'description', 'sort_order', 'is_active', 'dish_count', 'created_at'] + + def get_dish_count(self, obj): + return obj.dishes.count() class DishSerializer(serializers.ModelSerializer): dish_type_display = serializers.CharField(source='get_dish_type_display', read_only=True) + cuisine_name = serializers.CharField(read_only=True) class Meta: model = Dish - fields = ['id', 'name', 'dish_type', 'dish_type_display', 'cuisine', 'ingredient_detail', 'protein', 'fat', 'calorie', 'description', 'is_active', 'created_at'] + fields = ['id', 'name', 'dish_type', 'dish_type_display', 'cuisine', 'cuisine_name', 'ingredient_detail', 'protein', 'fat', 'calorie', 'description', 'is_active', 'created_at'] diff --git a/backend/meals/urls.py b/backend/meals/urls.py index 527e30b..ab9cbff 100644 --- a/backend/meals/urls.py +++ b/backend/meals/urls.py @@ -5,6 +5,7 @@ from . import views router = DefaultRouter() router.register('dishes', views.DishViewSet) +router.register('cuisines', views.CuisineViewSet) urlpatterns = [ path('dishes/bulk/', views.bulk_create_dishes, name='bulk_create_dishes'), diff --git a/backend/meals/views.py b/backend/meals/views.py index 146f6c1..9a2f629 100644 --- a/backend/meals/views.py +++ b/backend/meals/views.py @@ -8,13 +8,14 @@ from openpyxl.utils import get_column_letter from rest_framework import status, viewsets from rest_framework.decorators import api_view, permission_classes from rest_framework.permissions import IsAdminUser +from rest_framework.permissions import AllowAny from rest_framework.response import Response -from .models import Dish -from .serializers import DishSerializer +from .models import Cuisine, Dish +from .serializers import DishSerializer, CuisineSerializer WEEKDAYS = ['周一', '周二', '周三', '周四', '周五'] -SCHOOL_NAME = '上海外国语大学附属宝山双语学校' +SCHOOL_NAME = '学校菜单' COLOR_HEADER = PatternFill('solid', fgColor='2F5597') COLOR_DAY = PatternFill('solid', fgColor='D9E2F3') @@ -27,9 +28,16 @@ BORDER = Border(left=THIN, right=THIN, top=THIN, bottom=THIN) CENTER = Alignment(horizontal='center', vertical='center', wrap_text=True) +class CuisineViewSet(viewsets.ModelViewSet): + queryset = Cuisine.objects.all() + serializer_class = CuisineSerializer + permission_classes = [AllowAny] + + class DishViewSet(viewsets.ModelViewSet): queryset = Dish.objects.all() serializer_class = DishSerializer + permission_classes = [AllowAny] def get_queryset(self): qs = Dish.objects.all() @@ -59,9 +67,14 @@ def bulk_create_dishes(request): if not name or dish_type not in ('meat', 'veg', 'soup', 'staple'): skipped.append(name or '未命名') continue + # Resolve cuisine FK by name + cuisine_name = str(raw.get('cuisine', '') or '').strip() + cuisine_obj = None + if cuisine_name: + cuisine_obj, _ = Cuisine.objects.get_or_create(name=cuisine_name) defaults = { 'dish_type': dish_type, - 'cuisine': str(raw.get('cuisine', '家常菜') or '家常菜'), + 'cuisine': cuisine_obj, 'ingredient_detail': str(raw.get('ingredient_detail', '') or raw.get('ingredient', '')), 'protein': float(raw.get('protein', 0) or 0), 'fat': float(raw.get('fat', 0) or 0), @@ -94,7 +107,7 @@ def _pop_next(pool, shuffle_src): def _serialize_dish(d): return { 'id': d.id, 'name': d.name, 'ingredient': d.ingredient_detail, 'dish_type': d.dish_type, - 'cuisine': d.cuisine, 'protein': float(d.protein), 'fat': float(d.fat), 'calorie': d.calorie, + 'cuisine': d.cuisine_name, 'protein': float(d.protein), 'fat': float(d.fat), 'calorie': d.calorie, } @@ -211,19 +224,19 @@ def generate_week_menu(payload, menu_key='a'): week.append({ 'day': day, - 'meats': [{'id': d.id, 'name': d.name, 'ingredient': d.ingredient_detail, 'dish_type': d.dish_type, 'cuisine': d.cuisine, + 'meats': [{'id': d.id, 'name': d.name, 'ingredient': d.ingredient_detail, 'dish_type': d.dish_type, 'cuisine': d.cuisine_name, 'protein': float(d.protein), 'fat': float(d.fat), 'calorie': d.calorie} for d in day_meat_list], - 'vegs': [{'id': d.id, 'name': d.name, 'ingredient': d.ingredient_detail, 'dish_type': d.dish_type, 'cuisine': d.cuisine, + 'vegs': [{'id': d.id, 'name': d.name, 'ingredient': d.ingredient_detail, 'dish_type': d.dish_type, 'cuisine': d.cuisine_name, 'protein': float(d.protein), 'fat': float(d.fat), 'calorie': d.calorie} for d in day_veg], - 'soup': {'id': soup.id, 'name': soup.name, 'ingredient': soup.ingredient_detail, 'dish_type': soup.dish_type, 'cuisine': soup.cuisine, + 'soup': {'id': soup.id, 'name': soup.name, 'ingredient': soup.ingredient_detail, 'dish_type': soup.dish_type, 'cuisine': soup.cuisine_name, 'protein': float(soup.protein), 'fat': float(soup.fat), 'calorie': soup.calorie} if soup else None, - 'staple': {'id': staple.id, 'name': staple.name, 'ingredient': staple.ingredient_detail, 'dish_type': staple.dish_type, 'cuisine': staple.cuisine, + 'staple': {'id': staple.id, 'name': staple.name, 'ingredient': staple.ingredient_detail, 'dish_type': staple.dish_type, 'cuisine': staple.cuisine_name, 'protein': float(staple.protein), 'fat': float(staple.fat), 'calorie': staple.calorie} if staple else None, }) return week -def build_menu_title(label, school_name=None, week_no=None): +def build_menu_title(label, school_name=None, week_no=None, date_start=None, date_end=None): school_name = school_name or SCHOOL_NAME iso = date.today().isocalendar() try: @@ -232,12 +245,16 @@ def build_menu_title(label, school_name=None, week_no=None): week_no = iso.week if not 1 <= week_no <= 53: week_no = iso.week - try: - monday = date.fromisocalendar(iso.year, week_no, 1) - except ValueError: - monday = date.today() - timedelta(days=date.today().weekday()) - friday = monday + timedelta(days=4) - date_range = f'{monday.month}.{monday.day}--{friday.month}.{friday.day}' + # Use custom dates if provided, otherwise compute from week number + if date_start and date_end: + date_range = f'{date_start}--{date_end}' + else: + try: + monday = date.fromisocalendar(iso.year, week_no, 1) + except ValueError: + monday = date.today() - timedelta(days=date.today().weekday()) + friday = monday + timedelta(days=4) + date_range = f'{monday.month}.{monday.day}--{friday.month}.{friday.day}' return f'{school_name}[第{week_no}周]{date_range}营养{label}菜单' @@ -246,11 +263,13 @@ def generate_menu(request): data = request.data school = data.get('school_name') or SCHOOL_NAME week_no = data.get('week_no') + date_start = data.get('date_start') + date_end = data.get('date_end') menus = {} for label in ('A', 'B'): key = label.lower() menus[key] = { - 'title': build_menu_title(label, school, week_no), + 'title': build_menu_title(label, school, week_no, date_start, date_end), 'week': generate_week_menu(data, menu_key=key), } return Response(menus) diff --git a/backend/meals/views_dashboard.py b/backend/meals/views_dashboard.py new file mode 100644 index 0000000..bdbd49e --- /dev/null +++ b/backend/meals/views_dashboard.py @@ -0,0 +1,90 @@ +"""Dashboard API & view – visualization panel for the school meal planner.""" +import json +from collections import Counter + +from django.http import JsonResponse +from django.shortcuts import render +from django.db.models import Avg, Count, Max, Min, Sum + +from .models import Dish + + +def _dashboard_stats(): + """Return aggregate statistics for the dashboard.""" + total = Dish.objects.count() + active = Dish.objects.filter(is_active=True).count() + inactive = total - active + + # Count by type + type_counts = dict( + Dish.objects.values_list('dish_type').annotate(c=Count('id')).values_list('dish_type', 'c') + ) + + # Count by cuisine + cuisine_counts = dict( + Dish.objects.values_list('cuisine').annotate(c=Count('id')).values_list('cuisine', 'c') + ) + + # Nutrition averages (active dishes only, meat + veg only for meaningful stats) + nutrition = Dish.objects.filter(is_active=True, dish_type__in=('meat', 'veg')).aggregate( + avg_protein=Avg('protein'), + avg_fat=Avg('fat'), + avg_calorie=Avg('calorie'), + max_calorie=Max('calorie'), + min_calorie=Min('calorie'), + ) + + # Per-type nutrition averages + type_nutrition = {} + for dt in ('meat', 'veg', 'soup', 'staple'): + agg = Dish.objects.filter(is_active=True, dish_type=dt).aggregate( + avg_protein=Avg('protein'), + avg_fat=Avg('fat'), + avg_calorie=Avg('calorie'), + count=Count('id'), + ) + type_nutrition[dt] = agg + + # Recent 10 dishes + recent = list( + Dish.objects.order_by('-created_at')[:10].values( + 'id', 'name', 'dish_type', 'cuisine', 'protein', 'fat', 'calorie', 'is_active', 'created_at', + ) + ) + for r in recent: + r['created_at'] = r['created_at'].strftime('%Y-%m-%d %H:%M') if r['created_at'] else '' + + return { + 'total': total, + 'active': active, + 'inactive': inactive, + 'type_counts': type_counts, + 'cuisine_counts': cuisine_counts, + 'nutrition': { + 'avg_protein': round(float(nutrition['avg_protein'] or 0), 1), + 'avg_fat': round(float(nutrition['avg_fat'] or 0), 1), + 'avg_calorie': round(float(nutrition['avg_calorie'] or 0)), + 'max_calorie': int(nutrition['max_calorie'] or 0), + 'min_calorie': int(nutrition['min_calorie'] or 0), + }, + 'type_nutrition': { + k: { + 'avg_protein': round(float(v['avg_protein'] or 0), 1), + 'avg_fat': round(float(v['avg_fat'] or 0), 1), + 'avg_calorie': round(float(v['avg_calorie'] or 0)), + 'count': v['count'], + } + for k, v in type_nutrition.items() + }, + 'recent': recent, + } + + +def dashboard_api(request): + """GET /api/dashboard/ -> JSON stats for the dashboard.""" + return JsonResponse(_dashboard_stats()) + + +def dashboard_view(request): + """GET /dashboard/ -> serve the dashboard HTML page.""" + return render(request, 'dashboard.html') diff --git a/backend/meals/views_spa.py b/backend/meals/views_spa.py new file mode 100644 index 0000000..d96e777 --- /dev/null +++ b/backend/meals/views_spa.py @@ -0,0 +1,56 @@ +import mimetypes +import os + +from django.http import FileResponse, HttpResponseNotFound +from django.views.decorators.csrf import ensure_csrf_cookie + +_FE_DIR_CACHE = None +_INDEX_CACHE = None + + +def _get_frontend_dir(): + global _FE_DIR_CACHE + if _FE_DIR_CACHE is None: + import sys + if getattr(sys, 'frozen', False): + _FE_DIR_CACHE = os.path.join(sys._MEIPASS, 'backend', 'static', 'frontend') + else: + env_dir = os.environ.get('FRONTEND_DIR') + if env_dir and os.path.isdir(env_dir): + _FE_DIR_CACHE = env_dir + else: + _FE_DIR_CACHE = os.path.join( + os.path.dirname(os.path.dirname(os.path.abspath(__file__))), + 'static', 'frontend', + ) + return _FE_DIR_CACHE + + +def _get_index_path(): + global _INDEX_CACHE + if _INDEX_CACHE is None: + p = os.path.join(_get_frontend_dir(), 'index.html') + _INDEX_CACHE = p if os.path.isfile(p) else '' + return _INDEX_CACHE + + +def _serve_file(filepath): + ct, _ = mimetypes.guess_type(filepath) + return FileResponse(open(filepath, 'rb'), content_type=ct or 'application/octet-stream') + + +@ensure_csrf_cookie +def spa_serve(request, path=None): + """Serve built React assets or fall back to index.html.""" + fdir = _get_frontend_dir() + req_path = (path or '').lstrip('/') + + if req_path: + target = os.path.normpath(os.path.join(fdir, req_path)) + if target.startswith(os.path.normpath(fdir)) and os.path.isfile(target): + return _serve_file(target) + + index = _get_index_path() + if index: + return _serve_file(index) + return HttpResponseNotFound('Frontend not built. Run build.py first.') diff --git a/backend/requirements.txt b/backend/requirements.txt index 6d9a980..bfb9624 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -4,4 +4,6 @@ django-cors-headers==4.9.0 openpyxl==3.1.5 gunicorn==23.0.0 django-jazzmin==3.0.5 -pypinyin==0.54.0 + pypinyin==0.54.0 + rich==13.9.4 +pywebview>=5.0 diff --git a/backend/templates/admin/index.html b/backend/templates/admin/index.html new file mode 100644 index 0000000..7d816a3 --- /dev/null +++ b/backend/templates/admin/index.html @@ -0,0 +1,99 @@ +{% extends "admin/base_site.html" %} +{% load i18n static %} + +{% block extrastyle %} +{{ block.super }} + +{% endblock %} + +{% block coltype %}colMS{% endblock %} +{% block bodyclass %}{{ block.super }} dashboard{% endblock %} +{% block footer %}{% endblock %} + +{% block content %} +
+
+
+

{% trans "菜品类型分布" %}

+

{% trans "菜系分布" %}

+
+
+

{% trans "各类型营养对比" %}

+

{% trans "各类型菜品数量" %}

+
+
+
+

{% trans "最近添加的菜品" %}

+
{% trans "菜品名称" %}{% trans "类型" %}{% trans "菜系" %}{% trans "蛋白质" %}{% trans "脂肪" %}{% trans "热量" %}{% trans "状态" %}{% trans "创建时间" %}
+
+
+{% endblock %} + +{% block extrahead %} +{{ block.super }} + + +{% endblock %} diff --git a/backend/templates/admin/login.html b/backend/templates/admin/login.html new file mode 100644 index 0000000..8ad627d --- /dev/null +++ b/backend/templates/admin/login.html @@ -0,0 +1,35 @@ +{% extends "registration/base.html" %} + +{% block title %}登录 | {{ jazzmin_settings.site_title }}{% endblock %} + +{% block content %} + +
+ {% csrf_token %} +
+ +
+
+ {% if form.username.errors %} +
{{ form.username.errors.0 }}
+ {% endif %} +
+ +
+
+ {% if form.password.errors %} +
{{ form.password.errors.0 }}
+ {% endif %} + + {% if form.non_field_errors %} + {% for error in form.non_field_errors %} +
{{ error }}
+ {% endfor %} + {% endif %} +
+
+ +
+
+
+{% endblock %} \ No newline at end of file diff --git a/backend/templates/dashboard.html b/backend/templates/dashboard.html new file mode 100644 index 0000000..13e8b9f --- /dev/null +++ b/backend/templates/dashboard.html @@ -0,0 +1,314 @@ + + + + + +学校订餐菜单 - 可视化管理面板 + + + + +
+
+
+
正在加载数据...
+
+
+ + + + diff --git a/backend/templates/index.html b/backend/templates/index.html new file mode 100644 index 0000000..1a73eb8 --- /dev/null +++ b/backend/templates/index.html @@ -0,0 +1,72 @@ + + + + + +学校订餐菜单系统 + + + +
+ + +
+
+
+
菜单生成器
+
自选菜品、生成营养 A/B 两套周菜单,支持替换与导出 Excel
+
+
+
+
后台管理
+
管理菜品数据、查看统计面板、系统配置
+
+
+
+ + + + \ No newline at end of file diff --git a/backend/templates/registration/password_change_done.html b/backend/templates/registration/password_change_done.html new file mode 100644 index 0000000..55cbb41 --- /dev/null +++ b/backend/templates/registration/password_change_done.html @@ -0,0 +1,91 @@ +{% extends "admin/base.html" %} +{% load i18n static jazzmin %} +{% get_jazzmin_settings request as jazzmin_settings %} +{% get_jazzmin_ui_tweaks as jazzmin_ui %} + +{% block title %}{% trans "Password change successful" %} | {{ jazzmin_settings.site_title }}{% endblock %} + +{% block bodyclass %}password-done-page{% endblock %} + +{% block extrastyle %} + +{% endblock %} + +{% block page_content %} +
+
+
+

{% trans "Password change successful" %}

+

{% trans "Your password has been updated." %}

+ + + {% trans "Back to admin" %} + +
+
+{% endblock %} diff --git a/backend/templates/registration/password_change_form.html b/backend/templates/registration/password_change_form.html new file mode 100644 index 0000000..71c0792 --- /dev/null +++ b/backend/templates/registration/password_change_form.html @@ -0,0 +1,296 @@ +{% extends "admin/base.html" %} +{% load i18n static jazzmin %} +{% get_jazzmin_settings request as jazzmin_settings %} +{% get_jazzmin_ui_tweaks as jazzmin_ui %} + +{% block title %}{% trans "Change password" %} | {{ jazzmin_settings.site_title }}{% endblock %} + +{% block bodyclass %}password-change-page{% endblock %} + +{% block extrastyle %} + +{% endblock %} + +{% block page_content %} +
+
+
+
+
+

{% trans "Change password" %}

+
{{ request.user }}
+
+
+
+ {% if form.errors %} + {% if form.non_field_errors %} +
+ {% for error in form.non_field_errors %}{{ error }}{% endfor %} +
+ {% endif %} + {% endif %} + +
+ {% csrf_token %} + +
+ +
+ + +
+ {% if form.old_password.errors %}
    {% for e in form.old_password.errors %}
  • {{ e }}
  • {% endfor %}
{% endif %} +
+ +
+ +
+ + +
+
+
+
+ 至小8位 + 含大写字母 + 含小写字母 + 含数字 +
+ {% if form.new_password1.errors %}
    {% for e in form.new_password1.errors %}
  • {{ e }}
  • {% endfor %}
{% endif %} +
+ +
+ +
+ + +
+
+ {% if form.new_password2.errors %}
    {% for e in form.new_password2.errors %}
  • {{ e }}
  • {% endfor %}
{% endif %} +
+ + +
+
+
+
+{% endblock %} + +{% block extrajs %} + +{% endblock %} diff --git a/build.py b/build.py new file mode 100644 index 0000000..2258089 --- /dev/null +++ b/build.py @@ -0,0 +1,285 @@ +#!/usr/bin/env python +""" +Build script: compile frontend, then package everything into a distributable +folder via PyInstaller. Optionally build a Windows installer via Inno Setup. + +Usage: + python build.py # full build (windowed desktop EXE) + python build.py --clean # clean previous build artifacts first + python build.py --installer # build EXE then compile installer +""" +import argparse +import glob +import os +import shutil +import subprocess +import sys +from PyInstaller.utils.hooks import collect_submodules + +ROOT = os.path.dirname(os.path.abspath(__file__)) +BACKEND = os.path.join(ROOT, "backend") +FRONTEND = os.path.join(ROOT, "frontend") +DIST = os.path.join(ROOT, "dist") +BUILD = os.path.join(ROOT, "build") +INSTALLER_DIR = os.path.join(ROOT, "installer") +ISS_SCRIPT = os.path.join(ROOT, "school-meal-setup.iss") +FRONTEND_BUILD = os.path.join(FRONTEND, "dist") +STATIC_FE = os.path.join(BACKEND, "static", "frontend") +SPEC_FILE = os.path.join(ROOT, "school-meal.spec") + + +def run(cmd, cwd=None, shell=False): + print(f" > {cmd if isinstance(cmd, str) else ' '.join(cmd)}") + result = subprocess.run(cmd, cwd=cwd, shell=shell) + if result.returncode != 0: + print(f"ERROR: command failed with exit code {result.returncode}") + sys.exit(1) + + +def clean(): + print("[clean] Removing previous build artifacts...") + for d in [DIST, BUILD, STATIC_FE]: + if os.path.isdir(d): + shutil.rmtree(d) + for f in glob.glob(os.path.join(ROOT, "*.spec")): + os.remove(f) + + +def build_frontend(): + print("\n[1/3] Building React frontend...") + run("npm run build", cwd=FRONTEND, shell=True) + if not os.path.isdir(FRONTEND_BUILD): + print("ERROR: frontend/dist not found after build") + sys.exit(1) + print(" Copying to backend/static/frontend/") + if os.path.isdir(STATIC_FE): + shutil.rmtree(STATIC_FE) + shutil.copytree(FRONTEND_BUILD, STATIC_FE) + + +venv_site = ( + os.path.join(ROOT, ".venv", "Lib", "site-packages") + if os.path.isdir(os.path.join(ROOT, ".venv")) + else "" +) + + +def create_spec(): + """Generate the PyInstaller .spec file dynamically.""" + print("\n[2/3] Creating PyInstaller spec...") + + # Collect Jazzmin admin theme static files + jazzmin_static = os.path.join(venv_site, "jazzmin", "static") + datas_extra = [] + if os.path.isdir(jazzmin_static): + for root, dirs, files in os.walk(jazzmin_static): + rel = os.path.relpath(root, jazzmin_static) + for f in files: + src = os.path.join(root, f) + dst = os.path.join("static", rel) if rel != "." else "static" + datas_extra.append((src, dst)) + + datas = [ + (os.path.join(BACKEND, "static"), "backend/static"), + (os.path.join(BACKEND, "templates"), "backend/templates"), + (os.path.join(BACKEND, "meals", "migrations"), "backend/meals/migrations"), + (os.path.join(BACKEND, "config"), "backend/config"), + (os.path.join(BACKEND, "meals", "management"), "backend/meals/management"), + ] + datas_extra + + # Hidden imports + hidden = [] + for pkg in ["rest_framework", "corsheaders", "jazzmin", "rich"]: + try: + hidden.extend(collect_submodules(pkg)) + except Exception: + pass + hidden += [ + "meals.views_dashboard", "meals", "meals.apps", "meals.models", + "meals.admin", "meals.urls", "meals.views", "meals.views_spa", + "meals.serializers", "meals.management", "meals.management.commands", + "meals.management.commands.seed_dishes", + "meals.management.commands.import_dishes", + "config", "config.settings", "config.wsgi", "config.asgi", "config.urls", + "django.contrib.admin", "django.contrib.auth", + "django.contrib.contenttypes", "django.contrib.sessions", + "django.contrib.messages", "django.contrib.staticfiles", + "pypinyin", "openpyxl", + "tkinter", "tkinter.messagebox", "tkinter.constants", + "webview", "webview.window", "webview.platforms.edgechromium", + "pythonnet", "clr_loader", "cffi", "bottle", + ] + seen = set() + unique_hidden = [h for h in hidden if not (h in seen or seen.add(h))] + + # Build spec content using list of lines to avoid f-string quoting issues + desktop_py = os.path.join(ROOT, "desktop.py").replace("\\", "/") + root_path = ROOT.replace("\\", "/") + backend_path = BACKEND.replace("\\", "/") + icon_path = os.path.join(ROOT, "app.ico").replace("\\", "/") + + lines = [ + "# -*- mode: python ; coding: utf-8 -*-", + "# Auto-generated by build.py", + "block_cipher = None", + "", + "a = Analysis(", + f" [r'{desktop_py}'],", + f" pathex=[r'{root_path}', r'{backend_path}'],", + " binaries=[],", + " datas=[", + ] + for src, dst in datas: + lines.append(f" (r'{src}', r'{dst}'),") + lines += [ + " ],", + " hiddenimports=[", + ] + for h in unique_hidden: + lines.append(f" '{h}',") + lines += [ + " ],", + " hookspath=[],", + " hooksconfig={},", + " runtime_hooks=[],", + " excludes=[],", + " win_no_prefer_redirects=False,", + " win_private_assemblies=False,", + " cipher=block_cipher,", + " noarchive=False,", + ")", + "", + "pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)", + "", + "exe = EXE(", + " pyz,", + " a.scripts,", + " [],", + " exclude_binaries=True,", + " name='school-meal',", + " debug=False,", + " bootloader_ignore_signals=False,", + " strip=False,", + " upx=True,", + " console=False,", + " disable_windowed_traceback=False,", + " target_arch=None,", + " codesign_identity=None,", + " entitlements_file=None,", + f" icon=r'{icon_path}',", + ")", + "", + "coll = COLLECT(", + " exe,", + " a.binaries,", + " a.zipfiles,", + " a.datas,", + " strip=False,", + " upx=True,", + " upx_exclude=[],", + " name='school-meal',", + ")", + "", + ] + + with open(SPEC_FILE, "w", encoding="utf-8") as f: + f.write("\n".join(lines)) + print(f" Spec written to {SPEC_FILE}") + + +def run_pyinstaller(): + print("\n[3/3] Running PyInstaller...") + run([sys.executable, "-m", "PyInstaller", "--clean", "--noconfirm", SPEC_FILE]) + + out_dir = os.path.join(DIST, "school-meal") + bat_path = os.path.join(out_dir, "school-meal.bat") + with open(bat_path, "w", encoding="utf-8") as f: + f.write("@echo off\n") + f.write("chcp 65001 >nul\n") + f.write("cd /d %~dp0\n") + f.write('echo Starting school meal planner...\n') + f.write('start "" school-meal.exe\n') + + size_mb = sum( + os.path.getsize(os.path.join(dp, fn)) + for dp, _, fnames in os.walk(out_dir) + for fn in fnames + ) / (1024 * 1024) + print(f"\nBuild complete! Output: {out_dir}") + print(f"Total size: {size_mb:.1f} MB") + + +def find_iscc(): + """Locate the Inno Setup command-line compiler.""" + candidates = [ + os.path.join(os.environ.get("ProgramFiles(x86)", ""), "Inno Setup 6", "ISCC.exe"), + os.path.join(os.environ.get("ProgramFiles", ""), "Inno Setup 6", "ISCC.exe"), + os.path.join(os.environ.get("ProgramFiles(x86)", ""), "Inno Setup 5", "ISCC.exe"), + os.path.join(os.environ.get("ProgramFiles", ""), "Inno Setup 5", "ISCC.exe"), + ] + for path in candidates: + if os.path.isfile(path): + return path + from shutil import which + path = which("iscc") + if path: + return path + return None + + +def build_installer(): + """Compile the Inno Setup .iss script to produce an installer .exe.""" + print("\n[installer] Building Windows installer...") + + if not os.path.isfile(ISS_SCRIPT): + print(f"ERROR: {ISS_SCRIPT} not found. Cannot build installer.") + sys.exit(1) + + iscc = find_iscc() + if not iscc: + print("ERROR: Inno Setup compiler (ISCC.exe) not found.") + print("Please install Inno Setup 6 from https://jrsoftware.org/isdl.php") + sys.exit(1) + + print(f" Using: {iscc}") + run([iscc, ISS_SCRIPT]) + + if os.path.isdir(INSTALLER_DIR): + size_mb = sum( + os.path.getsize(os.path.join(dp, fn)) + for dp, _, fnames in os.walk(INSTALLER_DIR) + for fn in fnames + ) / (1024 * 1024) + print(f"\nInstaller built! Output: {INSTALLER_DIR}") + print(f"Installer size: {size_mb:.1f} MB") + else: + print("ERROR: Installer output directory not created.") + sys.exit(1) + + +def main(): + parser = argparse.ArgumentParser(description="Build school-meal package") + parser.add_argument("--clean", action="store_true", help="Clean previous build artifacts") + parser.add_argument("--installer", action="store_true", help="Also build Windows installer after EXE build") + args = parser.parse_args() + + if args.clean: + clean() + print("Clean done. Exiting.\n") + return + + os.chdir(ROOT) + build_frontend() + create_spec() + run_pyinstaller() + + if args.installer: + build_installer() + print("\nDone! Installer at installer/学校订餐菜单生成器-安装包.exe") + else: + print("\nDone! Run dist/school-meal/school-meal.exe to launch the desktop app.") + + +if __name__ == "__main__": + main() + diff --git a/build_exe.bat b/build_exe.bat new file mode 100644 index 0000000..b3da7c3 --- /dev/null +++ b/build_exe.bat @@ -0,0 +1,65 @@ +@echo off +chcp 65001 >nul +echo ========================================== +echo 学校订餐菜单生成器 - 一键打包 EXE +echo ========================================== +cd /d %~dp0 + +echo. +echo [1/4] 检查 Python 环境... +python --version >nul 2>&1 +if errorlevel 1 ( + echo 错误: 未找到 Python,请先安装 Python 3.10+ + echo 下载地址: https://www.python.org/downloads/ + pause + exit /b 1 +) +python --version + +echo. +echo [2/4] 安装/更新构建依赖... +pip install -r backend\requirements.txt pyinstaller --quiet +if errorlevel 1 ( + echo 依赖安装失败,请检查网络连接 + pause + exit /b 1 +) + +echo. +echo [3/4] 检查 Node.js 环境(构建前端需要)... +node --version >nul 2>&1 +if errorlevel 1 ( + echo 错误: 未找到 Node.js,请先安装 Node.js 18+ + echo 下载地址: https://nodejs.org/ + pause + exit /b 1 +) +node --version +cd frontend +if not exist node_modules ( + echo 安装前端依赖... + call npm install +) +cd .. + +echo. +echo [4/4] 开始构建 EXE(可能需要 2-5 分钟)... +echo. +python build.py +if errorlevel 1 ( + echo. + echo 构建失败!请检查上方错误信息。 + pause + exit /b 1 +) + +echo. +echo ========================================== +echo 构建完成! +echo ========================================== +echo 输出目录: dist\school-meal\ +echo 运行方式: 双击 dist\school-meal\school-meal.exe +echo 或双击: dist\school-meal\启动菜单生成器.bat +echo ========================================== +echo. +pause diff --git a/build_installer.bat b/build_installer.bat new file mode 100644 index 0000000..e6a9a5b --- /dev/null +++ b/build_installer.bat @@ -0,0 +1,81 @@ +@echo off +chcp 65001 >nul +echo ========================================== +echo 学校订餐菜单生成器 - 一键打包安装包 +echo ========================================== +cd /d %~dp0 + +echo. +echo [1/4] 检查 Python 环境... +python --version >nul 2>&1 +if errorlevel 1 ( + echo 错误: 未找到 Python,请先安装 Python 3.10+ + pause + exit /b 1 +) +python --version + +echo. +echo [2/4] 构建 EXE(如已构建可跳过)... +if not exist "dist\school-meal\school-meal.exe" ( + echo 未找到已构建的 EXE,开始构建... + python build.py + if errorlevel 1 ( + echo. + echo EXE 构建失败! + pause + exit /b 1 + ) +) else ( + echo 已检测到 dist\school-meal\school-meal.exe,跳过构建。 + echo 如需重新构建,请先执行 python build.py --clean +) + +echo. +echo [3/4] 检查 Inno Setup 编译器... +set "ISCC=" +if exist "C:\Program Files (x86)\Inno Setup 6\ISCC.exe" ( + set "ISCC=C:\Program Files (x86)\Inno Setup 6\ISCC.exe" +) else if exist "C:\Program Files\Inno Setup 6\ISCC.exe" ( + set "ISCC=C:\Program Files\Inno Setup 6\ISCC.exe" +) else if exist "C:\Program Files (x86)\Inno Setup 5\ISCC.exe" ( + set "ISCC=C:\Program Files (x86)\Inno Setup 5\ISCC.exe" +) else ( + where iscc >nul 2>&1 + if not errorlevel 1 ( + set "ISCC=iscc" + ) +) + +if "%ISCC%"=="" ( + echo. + echo 错误: 未找到 Inno Setup 编译器! + echo. + echo 请安装 Inno Setup 6: + echo https://jrsoftware.org/isdl.php + echo. + echo 安装完成后请重新运行此脚本。 + pause + exit /b 1 +) +echo 找到 Inno Setup: %ISCC% + +echo. +echo [4/4] 编译安装包... +"%ISCC%" school-meal-setup.iss +if errorlevel 1 ( + echo. + echo 安装包编译失败!请检查上方错误信息。 + pause + exit /b 1 +) + +echo. +echo ========================================== +echo 安装包构建完成! +echo ========================================== +echo 输出目录: installer\ +echo 安装包: installer\学校订餐菜单生成器-安装包.exe +echo ========================================== +echo. +pause diff --git a/debug_server.py b/debug_server.py new file mode 100644 index 0000000..0f16860 --- /dev/null +++ b/debug_server.py @@ -0,0 +1,24 @@ +import os, sys, traceback +os.environ['DJANGO_SETTINGS_MODULE'] = 'config.settings' +os.environ['DJANGO_DB_PATH'] = r'C:\Users\12914\Desktop\school-meal\backend\db.sqlite3' +os.environ['DJANGO_SECRET_KEY'] = 'test-key' +os.environ['DJANGO_ALLOWED_HOSTS'] = '*' +os.environ['DJANGO_DEBUG'] = 'True' +os.environ['DJANGO_STATIC_URL'] = '/static' +sys.path.insert(0, r'C:\Users\12914\Desktop\school-meal\backend') + +import django +django.setup() + +from django.core.handlers.wsgi import WSGIHandler +from http.server import HTTPServer + +class DebugHandler(WSGIHandler): + def handle_exception(self, exc_info): + traceback.print_exception(*exc_info) + return super().handle_exception(exc_info) + +handler = DebugHandler() +server = HTTPServer(('127.0.0.1', 8001), handler) +print('Debug server on http://127.0.0.1:8001') +server.serve_forever() diff --git a/desktop.py b/desktop.py new file mode 100644 index 0000000..0eb39e5 --- /dev/null +++ b/desktop.py @@ -0,0 +1,296 @@ +#!/usr/bin/env python +""" +Desktop launcher: run school meal planner inside a native window. +Starts Django backend (background thread), then opens a pywebview window. +""" +import os +import sys +import socket +import threading +import time +import traceback + +# --------------------------------------------------------------------------- +# Logging +# --------------------------------------------------------------------------- + +_app_dir = None + + +def _get_app_dir(): + global _app_dir + if _app_dir is None: + if getattr(sys, "frozen", False): + _app_dir = os.path.dirname(sys.executable) + else: + _app_dir = os.path.dirname(os.path.abspath(__file__)) + return _app_dir + + +def _get_log_dir(): + """Return a writable directory for log files. + In frozen mode, prefer %LOCALAPPDATA% to avoid write errors in Program Files.""" + if getattr(sys, "frozen", False): + local = os.environ.get("LOCALAPPDATA", "") + if local: + d = os.path.join(local, "学校订餐菜单生成器") + try: + os.makedirs(d, exist_ok=True) + # quick write test + t = os.path.join(d, ".write_test") + with open(t, "w") as f: + f.write("") + os.remove(t) + return d + except Exception: + pass + return _get_app_dir() + + +def _log(msg): + try: + path = os.path.join(_get_log_dir(), "desktop.log") + with open(path, "a", encoding="utf-8") as f: + f.write(msg + "\n") + except Exception: + pass + + +def _excepthook(exc_type, exc_value, exc_tb): + _log("FATAL: " + "".join(traceback.format_exception(exc_type, exc_value, exc_tb))) + + +sys.excepthook = _excepthook + +# --------------------------------------------------------------------------- +# Fix for console=False mode: ensure stdout/stderr are never None +# --------------------------------------------------------------------------- + +def _ensure_stdio(): + """Redirect stdout/stderr to log file if they are None (console=False).""" + if sys.stdout is None or sys.stderr is None: + log_path = os.path.join(_get_log_dir(), "django.log") + try: + log_file = open(log_path, "a", encoding="utf-8", buffering=1) + except Exception: + log_file = open(os.path.join(_get_app_dir(), "django.log"), "a", encoding="utf-8", buffering=1) + if sys.stdout is None: + sys.stdout = log_file + if sys.stderr is None: + sys.stderr = log_file + + +_ensure_stdio() + +# --------------------------------------------------------------------------- +# Environment +# --------------------------------------------------------------------------- + + +def _frozen_dir(): + if getattr(sys, "frozen", False): + return sys._MEIPASS + return os.path.dirname(os.path.abspath(__file__)) + + +def setup_environment(): + base = _frozen_dir() + data_dir = _get_log_dir() + sys.path.insert(0, base) + backend_dir = os.path.join(base, "backend") + if os.path.isdir(backend_dir) and backend_dir not in sys.path: + sys.path.insert(0, backend_dir) + + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings") + os.environ["DJANGO_DEBUG"] = "False" + os.environ["DJANGO_SECRET_KEY"] = "exe-local-secret-key-do-not-use-in-production" + os.environ["DJANGO_ALLOWED_HOSTS"] = "127.0.0.1,localhost" + os.environ["DJANGO_DB_PATH"] = os.path.join(data_dir, "db.sqlite3") + os.environ["DJANGO_STATIC_URL"] = "/static/" + os.environ["EXE_MODE"] = "1" + + static_fe = os.path.join(base, "backend", "static", "frontend") + if not os.path.isdir(static_fe): + static_fe = os.path.join(base, "static", "frontend") + os.environ["FRONTEND_DIR"] = static_fe + + +def _ensure_database(): + """Copy the bundled db.sqlite3 to the data directory if missing or outdated. + + In the frozen EXE, migrations cannot be discovered from the PyInstaller + data directory, so we ship a pre-migrated db.sqlite3 and copy it on first + run. If the user's existing database has the wrong schema (e.g. upgraded + from an older EXE), replace it with the bundled one. + """ + if not getattr(sys, "frozen", False): + return + + data_dir = _get_log_dir() + target_db = os.path.join(data_dir, "db.sqlite3") + bundled_db = os.path.join(_get_app_dir(), "db.sqlite3") + + if not os.path.isfile(bundled_db): + return + + need_copy = False + if not os.path.isfile(target_db): + need_copy = True + else: + import sqlite3 + try: + conn = sqlite3.connect(target_db) + cols = [r[1] for r in conn.execute("PRAGMA table_info(meals_dish)").fetchall()] + conn.close() + if "cuisine_id" not in cols: + need_copy = True + except Exception: + need_copy = True + + if need_copy: + os.makedirs(data_dir, exist_ok=True) + import shutil + shutil.copy2(bundled_db, target_db) + _log(f"Copied bundled db.sqlite3 to {target_db}") + + +def init_database(): + _ensure_database() + + import django + django.setup() + from django.core.management import call_command + call_command("migrate", "--run-syncdb", verbosity=0) + + from meals.models import Dish + if Dish.objects.count() == 0: + try: + call_command("seed_dishes", verbosity=0) + except Exception: + pass + + from django.contrib.auth import get_user_model + User = get_user_model() + if not User.objects.filter(username="admin").exists(): + User.objects.create_superuser("admin", "admin@example.com", "admin123") + + +# --------------------------------------------------------------------------- +# Django server +# --------------------------------------------------------------------------- + +PORT = 8000 + + +def _port_in_use(port): + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + return s.connect_ex(("127.0.0.1", port)) == 0 + + +def start_django_server(): + try: + _log("start_django_server: calling django.setup()") + import django + django.setup() + _log("start_django_server: calling runserver") + from django.core.management import call_command + call_command("runserver", f"127.0.0.1:{PORT}", "--noreload", verbosity=0) + _log("start_django_server: runserver returned") + except Exception: + _log("start_django_server CRASHED:\n" + traceback.format_exc()) + + +def wait_for_server(timeout=30): + deadline = time.time() + timeout + while time.time() < deadline: + if _port_in_use(PORT): + return True + time.sleep(0.3) + return False + + +# --------------------------------------------------------------------------- +# Main +# --------------------------------------------------------------------------- + +WINDOW_TITLE = "学校订餐菜单生成器" +WINDOW_WIDTH = 1280 +WINDOW_HEIGHT = 800 + + +def _get_icon_path(): + """Return the path to the application icon file.""" + return os.path.join(_get_app_dir(), "app.ico") + + +def main(): + _log("=== desktop.py main() starting ===") + + setup_environment() + _log("Environment setup done") + + init_database() + _log("Database init done") + + server_thread = threading.Thread(target=start_django_server, daemon=True) + server_thread.start() + _log("Django thread started, waiting for port 8000...") + + if not wait_for_server(): + _log("ERROR: Django server startup timed out!") + sys.exit(1) + + _log("Django server ready, opening webview...") + + import webview + + url = f"http://127.0.0.1:{PORT}" + + # --------------------------------------------------------------------------- + # JS API: opens new native windows from the index page + # --------------------------------------------------------------------------- + _child_windows = [] + + class JsApi: + """Exposed to JavaScript as window.pywebview.api.""" + + def open_page(self, path, title=None, width=1280, height=800): + """Open a new pywebview window for the given path.""" + full_url = f"http://127.0.0.1:{PORT}{path}" + win_title = title or WINDOW_TITLE + w = webview.create_window( + win_title, + full_url, + width=int(width), + height=int(height), + min_size=(900, 600), + resizable=True, + text_select=True, + ) + _child_windows.append(w) + return True + + js_api = JsApi() + + window = webview.create_window( + WINDOW_TITLE, + url, + width=WINDOW_WIDTH, + height=WINDOW_HEIGHT, + min_size=(900, 600), + resizable=True, + text_select=True, + js_api=js_api, + ) + + _log("Starting webview event loop...") + webview.start(debug=False) + _log("Webview closed.") + + +if __name__ == "__main__": + try: + main() + except Exception: + _log("UNHANDLED: " + traceback.format_exc()) + raise diff --git a/fix_run.py b/fix_run.py new file mode 100644 index 0000000..0230c6a --- /dev/null +++ b/fix_run.py @@ -0,0 +1,21 @@ +import os + +FILE = r"C:\Users\12914\Desktop\school-meal\run.py" +with open(FILE, "r", encoding="utf-8") as f: + content = f.read() + +# The setup_environment function has: sys.path.insert(0, base) +# But base is the project root. The config module is in backend/. +# In dev mode, we need to also add backend/ to sys.path. +old = " sys.path.insert(0, base)\n os.environ.setdefault" +new = " sys.path.insert(0, base)\n # In dev mode, add backend/ to path so config and meals are importable\n backend_dir = os.path.join(base, 'backend')\n if os.path.isdir(backend_dir) and backend_dir not in sys.path:\n sys.path.insert(0, backend_dir)\n os.environ.setdefault" + +if old in content: + content = content.replace(old, new, 1) + print("Fixed sys.path") +else: + print("Pattern not found") + +with open(FILE, "w", encoding="utf-8") as f: + f.write(content) +print("Done") \ No newline at end of file diff --git a/frontend/index.html b/frontend/index.html index 2c50180..0c8b4b5 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -2,7 +2,13 @@ + + + + + + 学校订餐菜单生成器 diff --git a/frontend/public/favicon.ico b/frontend/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..590a0ea7caded4bf03c102111306164dc230cf5e GIT binary patch literal 58217 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 z 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/public/icon_512.png b/frontend/public/icon_512.png new file mode 100644 index 0000000000000000000000000000000000000000..a321f7e8ac8036a4cce8bf20d07e58aed0fc14b6 GIT binary patch literal 222713 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 literal 0 HcmV?d00001 diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index a7828ac..c2fbadb 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -1,4 +1,4 @@ -import { useEffect, useState } from 'react' +import { useEffect, useState, useMemo, useCallback } from 'react' import { pinyin } from 'pinyin-pro' const DAYS = ['周一', '周二', '周三', '周四', '周五'] @@ -18,7 +18,34 @@ const TYPE_GROUPS = [ ] const TYPE_LABELS = { meats: '荤菜', vegs: '素菜', soup: '营养汤', staple: '主食' } const TYPE_TO_TAB = { meats: 'meat', vegs: 'veg', soup: 'soup', staple: 'staple' } -const DEFAULT_SCHOOL = '上海外国语大学附属宝山双语学校' +const TYPE_ALL_LABELS = { meat: '荤菜', veg: '素菜', soup: '营养汤', staple: '主食' } +const DEFAULT_SCHOOL = '学校菜单' +const MODAL_PAGE_SIZE = 20 + +/** Compute ISO week Monday/Friday as Date objects */ +const weekDates = (weekNo) => { + const now = new Date() + const isoYear = now.getFullYear() + const jan4 = new Date(isoYear, 0, 4) + const startOfISOWeek1 = new Date(jan4) + startOfISOWeek1.setDate(jan4.getDate() - ((jan4.getDay() + 6) % 7)) + const monday = new Date(startOfISOWeek1) + monday.setDate(startOfISOWeek1.getDate() + (weekNo - 1) * 7) + const friday = new Date(monday) + friday.setDate(monday.getDate() + 4) + return { monday, friday } +} + +/** Format Date as M.D for title */ +const fmtDateShort = (d) => `${d.getMonth() + 1}.${d.getDate()}` + +/** Format Date as YYYY-MM-DD for date input */ +const fmtDateISO = (d) => { + const y = d.getFullYear() + const m = String(d.getMonth() + 1).padStart(2, '0') + const day = String(d.getDate()).padStart(2, '0') + return `${y}-${m}-${day}` +} const currentIsoWeek = () => { const now = new Date() @@ -33,8 +60,147 @@ const currentIsoWeek = () => { const slotKey = (menu, day, slot, idx) => `${menu}|${day}|${slot}|${idx}` +/* ============================ + Modern Pagination Component + ============================ */ +function Pagination({ page, total, pageSize, onChange }) { + const totalPages = Math.max(1, Math.ceil(total / pageSize)) + const currentPage = Math.min(Math.max(1, page), totalPages) + if (totalPages <= 1) return null + + const go = (p) => onChange(Math.min(Math.max(1, p), totalPages)) + + // Build page number list with ellipsis + const pages = [] + for (let i = 1; i <= totalPages; i++) { + if (i === 1 || i === totalPages || (i >= currentPage - 1 && i <= currentPage + 1)) { + pages.push(i) + } else if (pages.length > 0 && pages[pages.length - 1] !== '...') { + pages.push('...') + } + } + + const startItem = (currentPage - 1) * pageSize + 1 + const endItem = Math.min(currentPage * pageSize, total) + + return ( +

+ ) +} + +/* ============================ + FlatDishList — paginated dish grid for modals + ============================ */ +function FlatDishList({ items, currentId, hover, setHover, onSelect, renderItem }) { + const [page, setPage] = useState(1) + + // Reset page when items change (e.g. search/filter) + const itemsKey = items.map(d => d.id).join(',') + const prevItemsKey = useMemo(() => itemsKey, []) + if (itemsKey !== prevItemsKey) { + // Use effect-less pattern: we'll reset via key prop + } + + const startIdx = (page - 1) * MODAL_PAGE_SIZE + const pageItems = items.slice(startIdx, startIdx + MODAL_PAGE_SIZE) + + return ( +
+
+ {pageItems.map((d) => ( + + ))} + {pageItems.length === 0 &&

没有匹配的菜品

} +
+ +
+ ) +} + function SwapModal({ editing, menus, dishes, pinyinMap, swapKeyword, swapType, setSwapKeyword, setSwapType, onReplace, onClose }) { const [hover, setHover] = useState(null) + const [swapPage, setSwapPage] = useState(1) + + // Reset page on filter/search change + useEffect(() => { setSwapPage(1) }, [swapKeyword, swapType]) + if (!editing || !menus) return null const { menuKey, day, type, idx } = editing @@ -51,9 +217,20 @@ function SwapModal({ editing, menus, dishes, pinyinMap, swapKeyword, swapType, s const p = pinyinMap[d.id] return d.name.toLowerCase().includes(kw) || (p && (p.full.includes(kw) || p.initials.includes(kw))) } - const groups = (swapType === 'all' ? TYPE_GROUPS : TYPE_GROUPS.filter(([t]) => t === swapType)) - .map(([t, label]) => [t, label, dishes[t].filter(match)]) - .filter(([, , pool]) => pool.length) + + const flatList = useMemo(() => { + const result = [] + const groups = (swapType === 'all' ? TYPE_GROUPS : TYPE_GROUPS.filter(([t]) => t === swapType)) + for (const [t] of groups) { + for (const d of dishes[t]) { + if (match(d)) result.push(d) + } + } + return result + }, [swapType, kw, dishes]) + + const startIdx = (swapPage - 1) * MODAL_PAGE_SIZE + const pageItems = flatList.slice(startIdx, startIdx + MODAL_PAGE_SIZE) return (
e.stopPropagation()}>

- 替换{menuLabel}·{day}「{slotLabel}」 + 替换{menuLabel}·{day}«{slotLabel}» {current ? `(当前:${current.name})` : ''}

@@ -83,43 +260,32 @@ function SwapModal({ editing, menus, dishes, pinyinMap, swapKeyword, swapType, s
setSwapKeyword(e.target.value)} />
- {groups.map(([t, label, pool]) => { - const cuisines = [...new Set(pool.map((d) => d.cuisine || '未分类'))] - return ( -
-
{label}
- {cuisines.map((g) => ( -
-
{g}
-
- {pool - .filter((d) => (d.cuisine || '未分类') === g) - .map((d) => ( - - ))} -
-
- ))} -
- ) - })} - {!groups.length &&

没有匹配的菜品

} +
+
+ {pageItems.map((d) => ( + + ))} + {pageItems.length === 0 &&

没有匹配的菜品

} +
+ +
{hover && } @@ -129,6 +295,11 @@ function SwapModal({ editing, menus, dishes, pinyinMap, swapKeyword, swapType, s function PickModal({ pick, slots, dishes, pinyinMap, keyword, pickType, setKeyword, setPickType, onChoose, onClose }) { const [hover, setHover] = useState(null) + const [pickPage, setPickPage] = useState(1) + + // Reset page on filter/search change + useEffect(() => { setPickPage(1) }, [keyword, pickType]) + if (!pick) return null const { menu, day, slot, idx } = pick const key = slotKey(menu, day, slot, idx) @@ -141,9 +312,20 @@ function PickModal({ pick, slots, dishes, pinyinMap, keyword, pickType, setKeywo const p = pinyinMap[d.id] return d.name.toLowerCase().includes(kw) || (p && (p.full.includes(kw) || p.initials.includes(kw))) } - const groups = (pickType === 'all' ? TYPE_GROUPS : TYPE_GROUPS.filter(([t]) => t === pickType)) - .map(([t, label]) => [t, label, dishes[t].filter(match)]) - .filter(([, , pool]) => pool.length) + + const flatList = useMemo(() => { + const result = [] + const groups = (pickType === 'all' ? TYPE_GROUPS : TYPE_GROUPS.filter(([t]) => t === pickType)) + for (const [t] of groups) { + for (const d of dishes[t]) { + if (match(d)) result.push(d) + } + } + return result + }, [pickType, kw, dishes]) + + const startIdx = (pickPage - 1) * MODAL_PAGE_SIZE + const pageItems = flatList.slice(startIdx, startIdx + MODAL_PAGE_SIZE) return (
e.stopPropagation()}>

- 自选{menuLabel}·{day}「{slotLabel}」 + 自选{menuLabel}·{day}«{slotLabel}» {current ? `(当前:${current.name})` : '(未选择,可留空自动生成)'}

@@ -175,43 +357,32 @@ function PickModal({ pick, slots, dishes, pinyinMap, keyword, pickType, setKeywo
setKeyword(e.target.value)} />
- {groups.map(([t, label, pool]) => { - const cuisines = [...new Set(pool.map((d) => d.cuisine || '未分类'))] - return ( -
-
{label}
- {cuisines.map((g) => ( -
-
{g}
-
- {pool - .filter((d) => (d.cuisine || '未分类') === g) - .map((d) => ( - - ))} -
-
- ))} -
- ) - })} - {!groups.length &&

没有匹配的菜品

} +
+
+ {pageItems.map((d) => ( + + ))} + {pageItems.length === 0 &&

没有匹配的菜品

} +
+ +
{hover && } @@ -248,6 +419,12 @@ function App() { const [error, setError] = useState('') const [schoolName, setSchoolName] = useState(DEFAULT_SCHOOL) const [weekNo, setWeekNo] = useState(String(currentIsoWeek())) + + const initDates = weekDates(Number(currentIsoWeek())) + + const [dateStart, setDateStart] = useState(fmtDateISO(initDates.monday)) + + const [dateEnd, setDateEnd] = useState(fmtDateISO(initDates.friday)) const [pinyinMap, setPinyinMap] = useState({}) useEffect(() => { @@ -262,6 +439,14 @@ function App() { setPinyinMap(map) }, [dishes]) + useEffect(() => { + if (weekNo) { + const d = weekDates(Number(weekNo)) + setDateStart(fmtDateISO(d.monday)) + setDateEnd(fmtDateISO(d.friday)) + } + }, [weekNo]) + useEffect(() => { fetch('/api/dishes/') .then((r) => r.json()) @@ -294,6 +479,8 @@ function App() { selections, school_name: schoolName.trim() || DEFAULT_SCHOOL, week_no: Number(weekNo), + date_start: dateStart || undefined, + date_end: dateEnd || undefined, }), }) const data = await res.json() @@ -479,7 +666,7 @@ function App() { } const nutritionText = `营养分析:蛋白质≥${Math.min(...proteins).toFixed(1)}g 脂肪≤${Math.max(...fats).toFixed(1)}g 热量≥${Math.round(Math.min(...calories))}kcal` return ( -
+

{idx === 0 ? '营养A菜单' : '营养B菜单'}

@@ -602,8 +789,50 @@ function App() {
+
+ +
+ + + +
+ + setDateStart(e.target.value)} + + /> + + {'—'} + + setDateEnd(e.target.value)} + + /> + +
+ +
+ +
+

- 标题预览:{schoolName.trim() || DEFAULT_SCHOOL}[第{weekNo || '?'}周]日期营养X菜单 + + {`标题预览:${schoolName.trim() || DEFAULT_SCHOOL}[第${weekNo || '?'}周]${dateStart && dateEnd ? `${fmtDateShort(new Date(dateStart))}--${fmtDateShort(new Date(dateEnd))}` : `日期`}营养A菜单`} + +
+ + {`${schoolName.trim() || DEFAULT_SCHOOL}[第${weekNo || '?'}周]${dateStart && dateEnd ? `${fmtDateShort(new Date(dateStart))}--${fmtDateShort(new Date(dateEnd))}` : `日期`}营养B菜单`} +

@@ -674,4 +903,4 @@ function App() { ) } -export default App +export default App \ No newline at end of file diff --git a/frontend/src/index.css b/frontend/src/index.css index 266399c..a9b0c81 100644 --- a/frontend/src/index.css +++ b/frontend/src/index.css @@ -1,44 +1,104 @@ -* { +/* ============================================ + 学校订餐菜单生成器 — Modern Design System + Based on 2025-2026 mainstream web trends + ============================================ */ + +:root { + --c-bg: #f4f6f9; + --c-surface: #ffffff; + --c-surface-alt: #f9fafb; + --c-text: #1a1d23; + --c-text-secondary: #64748b; + --c-text-muted: #94a3b8; + --c-border: #e2e8f0; + --c-border-light: #f1f5f9; + --c-accent: #6366f1; + --c-accent-hover: #4f46e5; + --c-accent-light: #eef2ff; + --c-accent-text: #ffffff; + --c-success: #10b981; + --c-success-light: #ecfdf5; + --c-danger: #ef4444; + --c-danger-light: #fef2f2; + --c-warning: #f59e0b; + --c-warning-light: #fffbeb; + --c-meat: #f97316; + --c-meat-bg: #fff7ed; + --c-veg: #22c55e; + --c-veg-bg: #f0fdf4; + --c-soup: #3b82f6; + --c-soup-bg: #eff6ff; + --c-staple: #eab308; + --c-staple-bg: #fefce8; + --radius-sm: 6px; + --radius-md: 10px; + --radius-lg: 14px; + --radius-xl: 20px; + --shadow-sm: 0 1px 2px rgba(0,0,0,0.04); + --shadow-md: 0 4px 12px rgba(0,0,0,0.06); + --shadow-lg: 0 8px 30px rgba(0,0,0,0.08); + --shadow-xl: 0 20px 60px rgba(0,0,0,0.12); + --transition: 0.2s cubic-bezier(0.4,0,0.2,1); +} + +*, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; } body { - font-family: 'Microsoft YaHei', 'PingFang SC', system-ui, sans-serif; - background: #eef2f7; - color: #2c3e50; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Microsoft YaHei', 'PingFang SC', system-ui, sans-serif; + background: var(--c-bg); + color: var(--c-text); + line-height: 1.6; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } +/* ---- Page layout ---- */ .page { - max-width: 1920px; + max-width: 1280px; margin: 0 auto; - padding: 32px 20px 60px; + padding: 24px 20px 60px; } +/* ---- Hero / Header ---- */ .hero { text-align: center; - padding: 18px 0 28px; + padding: 36px 0 32px; } .hero h1 { - font-size: 30px; - color: #1f3a5f; - margin-bottom: 8px; + font-size: 28px; + font-weight: 700; + color: var(--c-text); + letter-spacing: -0.02em; + margin-bottom: 6px; } .hero p { - color: #6b7a90; + color: var(--c-text-secondary); + font-size: 14px; + max-width: 600px; + margin: 0 auto; } +/* ---- Panels / Cards ---- */ .panel { - background: #fff; - border-radius: 14px; + background: var(--c-surface); + border: 1px solid var(--c-border); + border-radius: var(--radius-lg); padding: 24px; - box-shadow: 0 4px 18px rgba(31, 58, 95, 0.08); - margin-bottom: 24px; + margin-bottom: 20px; + transition: box-shadow var(--transition); } +.panel:hover { + box-shadow: var(--shadow-md); +} + +/* ---- Form fields ---- */ .field { margin-bottom: 20px; } @@ -46,58 +106,72 @@ body { .label { display: block; font-weight: 600; - margin-bottom: 10px; - color: #1f3a5f; + font-size: 13px; + color: var(--c-text); + margin-bottom: 8px; + letter-spacing: 0.01em; } +/* ---- Segmented control ---- */ .seg { display: inline-flex; - background: #eef2f7; - border-radius: 10px; - padding: 4px; - gap: 4px; + background: var(--c-bg); + border-radius: var(--radius-md); + padding: 3px; + gap: 2px; } .seg-btn { border: none; background: transparent; - padding: 9px 22px; - border-radius: 8px; - font-size: 14px; + padding: 8px 18px; + border-radius: 7px; + font-size: 13px; + font-weight: 500; cursor: pointer; - color: #4a5a72; + color: var(--c-text-secondary); + transition: all var(--transition); +} + +.seg-btn:hover { + color: var(--c-text); } .seg-btn.active { - background: #2f5597; - color: #fff; + background: var(--c-surface); + color: var(--c-accent); font-weight: 600; + box-shadow: var(--shadow-sm); } +/* ---- Chips ---- */ .chips { display: flex; flex-wrap: wrap; - gap: 10px; + gap: 8px; } .chip { - border: 1.5px solid #d5deea; - background: #fff; - padding: 8px 18px; + border: 1.5px solid var(--c-border); + background: var(--c-surface); + padding: 7px 16px; border-radius: 999px; - font-size: 14px; + font-size: 13px; + font-weight: 500; cursor: pointer; - transition: all 0.15s; + transition: all var(--transition); + color: var(--c-text-secondary); } .chip:hover:not(:disabled) { - border-color: #2f5597; + border-color: var(--c-accent); + color: var(--c-accent); } .chip.on { - background: #2f5597; - border-color: #2f5597; - color: #fff; + background: var(--c-accent); + border-color: var(--c-accent); + color: var(--c-accent-text); font-weight: 600; } @@ -106,27 +180,45 @@ body { cursor: not-allowed; } -.row-fields { - display: flex; - align-items: flex-end; - gap: 40px; - flex-wrap: wrap; -} - +/* ---- Form inputs ---- */ select { - padding: 9px 14px; - border: 1.5px solid #d5deea; - border-radius: 8px; - font-size: 14px; - background: #fff; + padding: 8px 12px; + border: 1.5px solid var(--c-border); + border-radius: var(--radius-sm); + font-size: 13px; + background: var(--c-surface); min-width: 120px; + transition: border-color var(--transition); } +select:focus { + outline: none; + border-color: var(--c-accent); +} + +.pick-search { + flex: 1; + min-width: 160px; + padding: 8px 14px; + border: 1.5px solid var(--c-border); + border-radius: var(--radius-sm); + font-size: 13px; + outline: none; + background: var(--c-surface); + transition: border-color var(--transition), box-shadow var(--transition); +} + +.pick-search:focus { + border-color: var(--c-accent); + box-shadow: 0 0 0 3px var(--c-accent-light); +} + +/* ---- Checkboxes ---- */ .checks { display: flex; - gap: 24px; + gap: 20px; padding-bottom: 10px; - font-size: 14px; + font-size: 13px; } .checks label { @@ -136,91 +228,120 @@ select { cursor: pointer; } +/* ---- Buttons ---- */ .actions { display: flex; - gap: 14px; + gap: 10px; margin-top: 6px; + flex-wrap: wrap; } .btn { - padding: 12px 32px; - border: 1.5px solid #2f5597; - background: #fff; - color: #2f5597; - border-radius: 10px; - font-size: 15px; - font-weight: 600; + padding: 10px 24px; + border: 1.5px solid var(--c-border); + background: var(--c-surface); + color: var(--c-text); + border-radius: var(--radius-md); + font-size: 14px; + font-weight: 500; cursor: pointer; - transition: all 0.15s; + transition: all var(--transition); } .btn:hover:not(:disabled) { - background: #eaf0fa; + background: var(--c-bg); + border-color: var(--c-accent); + color: var(--c-accent); } .btn.primary { - background: #2f5597; - color: #fff; + background: var(--c-accent); + border-color: var(--c-accent); + color: var(--c-accent-text); + font-weight: 600; } .btn.primary:hover:not(:disabled) { - background: #24447c; + background: var(--c-accent-hover); + border-color: var(--c-accent-hover); + box-shadow: 0 4px 14px rgba(99,102,241,0.3); } .btn:disabled { - opacity: 0.45; + opacity: 0.4; cursor: not-allowed; } -.error { - margin-top: 14px; - color: #c0392b; - font-size: 14px; +.btn.small { + padding: 5px 14px; + font-size: 12px; + border-radius: var(--radius-sm); } +/* ---- Error ---- */ +.error { + margin-top: 14px; + color: var(--c-danger); + font-size: 13px; + font-weight: 500; +} + +/* ---- Panel head ---- */ .panel-head { display: flex; align-items: baseline; - gap: 16px; + gap: 12px; margin-bottom: 16px; + flex-wrap: wrap; } .panel-head h2 { - font-size: 18px; - color: #1f3a5f; + font-size: 16px; + font-weight: 700; + color: var(--c-text); } +.tip { + font-size: 12px; + color: var(--c-text-muted); +} + +/* ---- Tables ---- */ .table-scroll { overflow-x: auto; + border-radius: var(--radius-md); + border: 1px solid var(--c-border); } table { width: 100%; border-collapse: collapse; - font-size: 14px; + font-size: 13px; } table.excel-like caption { - background: #2f5597; + background: linear-gradient(135deg, var(--c-accent), #818cf8); color: #fff; - font-size: 16px; + font-size: 15px; font-weight: 700; padding: 12px; letter-spacing: 2px; - border: 1px solid #2f5597; } table.excel-like th, table.excel-like td { - border: 1px solid #808080; - padding: 12px 14px; + border: 1px solid var(--c-border); + padding: 10px 12px; text-align: center; } table.excel-like th { - background: #2f5597; - color: #fff; + background: var(--c-surface-alt); + color: var(--c-text); font-weight: 600; + font-size: 12px; + text-transform: uppercase; + letter-spacing: 0.05em; min-width: 70px; } @@ -231,36 +352,39 @@ table.excel-like td { td.day { font-weight: 700; - color: #1f3a5f; - background: #d9e2f3; + color: var(--c-accent); + background: var(--c-accent-light); vertical-align: middle; } td.meat { - background: #fce4d6; - color: #9a4a12; + background: var(--c-meat-bg); + color: #c2410c; } td.veg { - background: #e2efda; - color: #2d6a2d; + background: var(--c-veg-bg); + color: #15803d; } td.staple { - background: #fde9d9; + background: var(--c-staple-bg); + color: #a16207; } td.soup { - background: #ddebf7; + background: var(--c-soup-bg); + color: #1d4ed8; } td.nutrition { - background: #fff2cc; + background: var(--c-warning-light); font-weight: 600; - font-size: 13px; - color: #7a5c00; + font-size: 12px; + color: #92400e; } +/* ---- Dish cells ---- */ .dish-cell { position: relative; padding: 4px 2px; @@ -269,15 +393,15 @@ td.nutrition { .swap-btn { display: block; margin: 4px auto 0; - border: 1px solid #b9c4d4; - background: #fff; - color: #5a6b84; + border: 1px solid var(--c-border); + background: var(--c-surface); + color: var(--c-text-muted); font-size: 11px; - border-radius: 6px; + border-radius: var(--radius-sm); padding: 1px 10px; cursor: pointer; opacity: 0; - transition: opacity 0.15s; + transition: all var(--transition); } td:hover .swap-btn, @@ -286,34 +410,50 @@ td:hover .swap-btn, } .swap-btn:hover { - border-color: #2f5597; - color: #2f5597; + border-color: var(--c-accent); + color: var(--c-accent); + background: var(--c-accent-light); } +/* ---- Modal ---- */ .modal-overlay { position: fixed; inset: 0; - background: rgba(15, 28, 47, 0.5); + background: rgba(0,0,0,0.4); + backdrop-filter: blur(4px); + -webkit-backdrop-filter: blur(4px); z-index: 100; display: flex; align-items: center; justify-content: center; + animation: fadeIn 0.2s ease; +} + +@keyframes fadeIn { + from { opacity: 0; } + to { opacity: 1; } } .modal { - background: #fff; - border-radius: 14px; - width: min(760px, 94vw); + background: var(--c-surface); + border-radius: var(--radius-xl); + width: min(780px, 94vw); max-height: 80vh; display: flex; flex-direction: column; - box-shadow: 0 20px 60px rgba(15, 28, 47, 0.35); + box-shadow: var(--shadow-xl); overflow: hidden; + animation: slideUp 0.25s ease; +} + +@keyframes slideUp { + from { opacity: 0; transform: translateY(12px); } + to { opacity: 1; transform: translateY(0); } } .modal-head { - padding: 16px 20px; - border-bottom: 1px solid #e3e9f2; + padding: 18px 22px; + border-bottom: 1px solid var(--c-border-light); display: flex; justify-content: space-between; align-items: center; @@ -321,26 +461,40 @@ td:hover .swap-btn, } .modal-head h3 { - font-size: 16px; - color: #1f3a5f; + font-size: 15px; + font-weight: 700; + color: var(--c-text); } .modal-close { border: none; - background: none; - font-size: 24px; + background: var(--c-bg); + font-size: 18px; line-height: 1; - color: #8a97a8; + color: var(--c-text-muted); cursor: pointer; - padding: 0 4px; + padding: 4px 8px; + border-radius: var(--radius-sm); + transition: all var(--transition); } .modal-close:hover { - color: #c0392b; + color: var(--c-danger); + background: var(--c-danger-light); +} + +.modal-toolbar { + padding: 12px 22px; + border-bottom: 1px solid var(--c-border-light); + display: flex; + align-items: center; + gap: 12px; + flex-wrap: wrap; + flex-shrink: 0; } .modal-body { - padding: 18px 20px 22px; + padding: 18px 22px 22px; overflow-y: auto; } @@ -350,15 +504,17 @@ td:hover .swap-btn, .modal-group-label { font-weight: 700; - color: #2f5597; + color: var(--c-accent); margin-bottom: 8px; - font-size: 13px; + font-size: 12px; + text-transform: uppercase; + letter-spacing: 0.05em; } .modal-items { display: flex; flex-wrap: wrap; - gap: 8px; + gap: 6px; } .modal-item { @@ -366,42 +522,51 @@ td:hover .swap-btn, flex-direction: column; align-items: flex-start; gap: 2px; - border: 1.5px solid #d5deea; - background: #fff; - border-radius: 8px; - padding: 8px 12px; + border: 1.5px solid var(--c-border); + background: var(--c-surface); + border-radius: var(--radius-sm); + padding: 7px 12px; cursor: pointer; font-size: 13px; - color: #2c3e50; - transition: all 0.15s; + color: var(--c-text); + transition: all var(--transition); } .modal-item:hover { - border-color: #2f5597; - background: #eaf0fa; + border-color: var(--c-accent); + background: var(--c-accent-light); } .modal-item.current { - border-color: #2f5597; - background: #2f5597; + border-color: var(--c-accent); + background: var(--c-accent); color: #fff; } .modal-item .item-ing { font-size: 11px; - color: #8a97a8; + color: var(--c-text-muted); } .modal-item.current .item-ing { - color: #cfe0f5; + color: rgba(255,255,255,0.7); } +/* ---- Hints ---- */ .hint { - font-size: 13px; - color: #6b7a90; + font-size: 12px; + color: var(--c-text-muted); padding-bottom: 10px; + line-height: 1.6; } +.hint.warn { + color: var(--c-danger); + margin-top: 12px; + padding-bottom: 0; +} + +/* ---- Label row ---- */ .label-row { display: flex; align-items: center; @@ -413,84 +578,80 @@ td:hover .swap-btn, margin-bottom: 0; } -.btn.small { - padding: 6px 16px; - font-size: 13px; - border-radius: 8px; -} - -.slot-row { - display: grid; - grid-template-columns: repeat(2, 1fr); - gap: 20px; - align-items: start; -} - +/* ---- Title fields ---- */ .title-fields { display: flex; align-items: flex-end; - gap: 24px; + gap: 20px; flex-wrap: wrap; - background: #f7f9fc; - border: 1px solid #e3e9f2; - border-radius: 12px; + background: var(--c-surface-alt); + border: 1px solid var(--c-border-light); + border-radius: var(--radius-md); padding: 16px 18px; margin-bottom: 20px; } .title-field .label { margin-bottom: 6px; - font-size: 13px; + font-size: 12px; } .title-field input.pick-search { - min-width: 320px; + min-width: 280px; } .title-field.week-field input[type='number'] { - width: 90px; - padding: 9px 12px; - border: 1.5px solid #d5deea; - border-radius: 8px; - font-size: 14px; + width: 80px; + padding: 8px 10px; + border: 1.5px solid var(--c-border); + border-radius: var(--radius-sm); + font-size: 13px; } .week-input { display: flex; - gap: 10px; + gap: 8px; align-items: center; } .title-preview { width: 100%; margin: 8px 0 0; - color: #2f5597; + color: var(--c-accent); font-weight: 600; + font-size: 12px; +} + +/* ---- Slot grid ---- */ +.slot-row { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 16px; + align-items: start; } .slot-panel { - border: 1px solid #e3e9f2; - border-radius: 12px; - padding: 16px; - background: #fbfcfe; + border: 1px solid var(--c-border); + border-radius: var(--radius-md); + padding: 14px; + background: var(--c-surface-alt); } .slot-panel .panel-head { - margin-bottom: 12px; + margin-bottom: 10px; } .slot-panel .panel-head h2 { - font-size: 15px; + font-size: 14px; } .slot-panel .tip { - font-size: 12px; - color: #8a97a8; + font-size: 11px; } table.excel-like.slot-table th { - min-width: 84px; - font-size: 13px; + min-width: 80px; + font-size: 12px; } table.excel-like.slot-table td { @@ -499,16 +660,16 @@ table.excel-like.slot-table td { td.slot-cell { cursor: pointer; - transition: background 0.15s; - min-height: 56px; + transition: background var(--transition); + min-height: 52px; } td.slot-cell:hover { - background: #eaf0fa; + background: var(--c-accent-light); } td.slot-cell.filled { - background: #f4f8ff; + background: #f8faff; } td.slot-cell .dish-name { @@ -516,73 +677,118 @@ td.slot-cell .dish-name { } .slot-empty { - color: #aab6c6; - font-size: 13px; + color: var(--c-text-muted); + font-size: 12px; } .slot-clear { display: block; - margin: 6px auto 0; - border: 1px solid #d5deea; - background: #fff; - color: #8a97a8; + margin: 5px auto 0; + border: 1px solid var(--c-border); + background: var(--c-surface); + color: var(--c-text-muted); font-size: 11px; - border-radius: 6px; + border-radius: var(--radius-sm); padding: 2px 10px; cursor: pointer; + transition: all var(--transition); } .slot-clear:hover { - border-color: #c0392b; - color: #c0392b; + border-color: var(--c-danger); + color: var(--c-danger); + background: var(--c-danger-light); } -.modal-toolbar { - padding: 12px 20px; - border-bottom: 1px solid #e3e9f2; - display: flex; - align-items: center; - gap: 14px; - flex-wrap: wrap; - flex-shrink: 0; +/* ---- Menu blocks ---- */ +.menu-row { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 16px; + align-items: start; } -.pick-search { - flex: 1; - min-width: 160px; - padding: 9px 14px; - border: 1.5px solid #d5deea; - border-radius: 8px; +.menu-block { + width: 100%; + min-width: 0; + overflow-x: auto; +} + +/* ---- Nutrition section ---- */ +.nutri-section { + margin-top: 20px; + border-top: 1px solid var(--c-border-light); + padding-top: 16px; +} + +.nutri-section h3 { font-size: 14px; - outline: none; + font-weight: 700; + color: var(--c-text); + margin-bottom: 10px; } -.pick-search:focus { - border-color: #2f5597; +table.excel-like.nutri-table { + max-width: 600px; } +table.excel-like.nutri-table th, +table.excel-like.nutri-table td { + padding: 7px 10px; +} + +table.excel-like.nutri-table td { + vertical-align: middle; +} + +/* ---- Dish cell details ---- */ +.dish-name { + font-weight: 600; + font-size: 13px; +} + +.dish-ing { + font-size: 11px; + color: var(--c-text-muted); + margin-top: 1px; +} + +.dish-cell + .dish-cell { + border-top: 1px dashed var(--c-border); + margin-top: 4px; + padding-top: 5px; +} + +.dish-empty { + color: var(--c-text-muted); +} + +/* ---- Subgroup labels in modals ---- */ .modal-subgroup { - margin-bottom: 12px; + margin-bottom: 10px; } .modal-subgroup-label { - font-size: 12px; - color: #8a97a8; - margin-bottom: 6px; + font-size: 11px; + color: var(--c-text-muted); + margin-bottom: 5px; padding-left: 4px; + font-weight: 500; } +/* ---- Tooltip ---- */ .dish-tooltip { position: fixed; z-index: 200; pointer-events: none; - background: rgba(28, 41, 61, 0.95); + background: rgba(15,23,42,0.92); + backdrop-filter: blur(8px); color: #fff; - border-radius: 8px; + border-radius: var(--radius-md); padding: 10px 14px; - font-size: 12.5px; + font-size: 12px; max-width: 280px; - box-shadow: 0 8px 24px rgba(15, 28, 47, 0.35); + box-shadow: var(--shadow-lg); } .dish-tooltip .tooltip-name { @@ -591,48 +797,59 @@ td.slot-cell .dish-name { } .dish-tooltip .tooltip-ing { - color: #c9d4e4; - margin-bottom: 6px; + color: #cbd5e1; + margin-bottom: 5px; line-height: 1.4; } .dish-tooltip .tooltip-nutri { display: flex; - gap: 12px; - color: #ffd98a; + gap: 10px; + color: #fbbf24; font-weight: 600; } -.hint.warn { - color: #c0392b; - margin-top: 12px; - padding-bottom: 0; +/* ---- Date range ---- */ +.title-date-fields { + width: 100%; + margin-bottom: 8px; } -.dish-cell + .dish-cell { - border-top: 1px dashed #b9c4d4; - margin-top: 4px; - padding-top: 6px; +.date-field .label { + margin-bottom: 6px; + font-size: 12px; } -.dish-name { - font-weight: 600; - font-size: 13.5px; -} - -.dish-ing { - font-size: 11.5px; - color: #666; - margin-top: 2px; -} - -.menu-row { - display: grid; - grid-template-columns: repeat(2, 1fr); - gap: 24px; +.date-range-input { + display: flex; align-items: center; + gap: 8px; } +.date-range-input input[type="date"] { + padding: 8px 10px; + border: 1.5px solid var(--c-border); + border-radius: var(--radius-sm); + font-size: 13px; + font-family: inherit; + color: var(--c-text); + background: var(--c-surface); + transition: border-color var(--transition); +} + +.date-range-input input[type="date"]:focus { + border-color: var(--c-accent); + outline: none; + box-shadow: 0 0 0 3px var(--c-accent-light); +} + +.date-sep { + font-size: 16px; + color: var(--c-text-muted); + font-weight: 600; +} + +/* ---- Responsive ---- */ @media (max-width: 900px) { .menu-row { grid-template-columns: 1fr; @@ -640,33 +857,252 @@ td.slot-cell .dish-name { .slot-row { grid-template-columns: 1fr; } + .title-fields { + flex-direction: column; + align-items: stretch; + } + .title-field input.pick-search { + min-width: 0; + width: 100%; + } } -.nutri-section { - margin-top: 24px; - border-top: 2px solid #eef2f7; - padding-top: 18px; +@media (max-width: 600px) { + .page { + padding: 12px 10px 40px; + } + .hero h1 { + font-size: 22px; + } + .panel { + padding: 16px; + } + .actions { + flex-direction: column; + } + .btn { + width: 100%; + text-align: center; + } } -.nutri-section h3 { - font-size: 16px; - color: #1f3a5f; - margin-bottom: 12px; + +/* ============================================ + Modern Pagination Component + ============================================ */ + +.flat-dish-list { + width: 100%; } -table.excel-like.nutri-table { - max-width: 640px; +.modal-items-grid { + display: flex; + flex-wrap: wrap; + gap: 8px; + margin-bottom: 16px; + min-height: 60px; } -table.excel-like.nutri-table th, -table.excel-like.nutri-table td { - padding: 8px 12px; +.modal-item-badge { + display: inline-block; + font-size: 10px; + font-weight: 600; + letter-spacing: 0.03em; + padding: 2px 7px; + border-radius: 999px; + line-height: 1.3; + text-transform: uppercase; + flex-shrink: 0; } -table.excel-like.nutri-table td { - vertical-align: middle; +/* Badge color by type */ +.modal-item:has(.item-name) .modal-item-badge { + background: var(--c-bg); + color: var(--c-text-muted); + border: 1px solid var(--c-border); } -.dish-empty { - color: #999; +.modal-item:hover .modal-item-badge { + background: rgba(99,102,241,0.1); + color: var(--c-accent); + border-color: rgba(99,102,241,0.2); } + +.modal-item.current .modal-item-badge { + background: rgba(255,255,255,0.2); + color: rgba(255,255,255,0.8); + border-color: rgba(255,255,255,0.15); +} + +/* Pagination container */ +.pagination { + display: flex; + align-items: center; + justify-content: space-between; + gap: 16px; + padding: 14px 0 4px; + border-top: 1px solid var(--c-border-light); + flex-wrap: wrap; +} + +.pg-info { + font-size: 12px; + color: var(--c-text-muted); + font-weight: 500; + white-space: nowrap; +} + +.pg-controls { + display: flex; + align-items: center; + gap: 4px; +} + +/* Individual page button */ +.pg-btn { + display: inline-flex; + align-items: center; + justify-content: center; + min-width: 34px; + height: 34px; + padding: 0 6px; + border: 1.5px solid var(--c-border); + border-radius: var(--radius-sm); + background: var(--c-surface); + color: var(--c-text-secondary); + font-size: 13px; + font-weight: 500; + cursor: pointer; + transition: all 0.18s cubic-bezier(0.4, 0, 0.2, 1); + user-select: none; + line-height: 1; +} + +.pg-btn:hover:not(:disabled):not(.active) { + border-color: var(--c-accent); + color: var(--c-accent); + background: var(--c-accent-light); + transform: translateY(-1px); + box-shadow: 0 2px 8px rgba(99,102,241,0.12); +} + +.pg-btn:active:not(:disabled) { + transform: translateY(0); +} + +.pg-btn.active { + background: var(--c-accent); + border-color: var(--c-accent); + color: #fff; + font-weight: 700; + box-shadow: 0 2px 10px rgba(99,102,241,0.25); +} + +.pg-btn:disabled { + opacity: 0.3; + cursor: not-allowed; + transform: none; + box-shadow: none; +} + +/* Arrow buttons (first/prev/next/last) */ +.pg-arrow { + min-width: 34px; + padding: 0; +} + +.pg-arrow svg { + flex-shrink: 0; +} + +/* Number buttons */ +.pg-num { + font-variant-numeric: tabular-nums; +} + +/* Ellipsis */ +.pg-ellipsis { + display: inline-flex; + align-items: center; + justify-content: center; + min-width: 28px; + height: 34px; + font-size: 14px; + color: var(--c-text-muted); + letter-spacing: 2px; + user-select: none; +} + +/* Jump-to-page */ +.pg-jump { + display: inline-flex; + align-items: center; + gap: 6px; + margin-left: 10px; + font-size: 12px; + color: var(--c-text-muted); + white-space: nowrap; +} + +.pg-jump-input { + width: 48px; + height: 30px; + padding: 0 6px; + border: 1.5px solid var(--c-border); + border-radius: var(--radius-sm); + font-size: 12px; + text-align: center; + background: var(--c-surface); + color: var(--c-text); + outline: none; + transition: border-color 0.18s ease, box-shadow 0.18s ease; + font-family: inherit; + font-variant-numeric: tabular-nums; + -moz-appearance: textfield; +} + +.pg-jump-input::-webkit-outer-spin-button, +.pg-jump-input::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; +} + +.pg-jump-input:focus { + border-color: var(--c-accent); + box-shadow: 0 0 0 3px var(--c-accent-light); +} + +/* Pagination responsive */ +@media (max-width: 600px) { + .pagination { + flex-direction: column; + align-items: stretch; + gap: 10px; + padding: 12px 0 2px; + } + + .pg-info { + text-align: center; + } + + .pg-controls { + justify-content: center; + flex-wrap: wrap; + gap: 3px; + } + + .pg-btn { + min-width: 30px; + height: 30px; + font-size: 12px; + } + + .pg-jump { + margin-left: 0; + justify-content: center; + } + + .modal-items-grid { + gap: 6px; + } +} \ No newline at end of file diff --git a/frontend/vite.config.js b/frontend/vite.config.js index ff2318b..bac987a 100644 --- a/frontend/vite.config.js +++ b/frontend/vite.config.js @@ -3,7 +3,7 @@ import react from '@vitejs/plugin-react' export default defineConfig({ plugins: [react()], - base: 'https://qnycdn.mymoyu.top/xx/web/', + base: '/', server: { port: 5173, proxy: { diff --git a/manager.py b/manager.py new file mode 100644 index 0000000..d09340c --- /dev/null +++ b/manager.py @@ -0,0 +1,282 @@ +""" +Dashboard Manager - School Meal Planner +A lightweight control panel / visualization entry point. +When run standalone, starts the server and opens the dashboard. +When run alongside the EXE (run.py), it is NOT auto-launched. +""" +import os +import sys +import threading +import time +import urllib.request +import webbrowser + +try: + import tkinter as tk + from tkinter import messagebox + HAS_TKINTER = True +except ImportError: + HAS_TKINTER = False + + +# --------------------------------------------------------------------------- +# Environment setup (shared with run.py) +# --------------------------------------------------------------------------- +def _frozen_dir(): + if getattr(sys, "frozen", False): + return sys._MEIPASS + return os.path.dirname(os.path.abspath(__file__)) + + +def _app_dir(): + if getattr(sys, "frozen", False): + return os.path.dirname(sys.executable) + return os.path.dirname(os.path.abspath(__file__)) + + +def setup_environment(): + base = _frozen_dir() + app = _app_dir() + sys.path.insert(0, base) + backend_dir = os.path.join(base, 'backend') + if os.path.isdir(backend_dir) and backend_dir not in sys.path: + sys.path.insert(0, backend_dir) + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings") + os.environ["DJANGO_DEBUG"] = "True" + os.environ["DJANGO_SECRET_KEY"] = "exe-local-secret-key-do-not-use-in-production" + os.environ["DJANGO_ALLOWED_HOSTS"] = "127.0.0.1,localhost" + os.environ["DJANGO_DB_PATH"] = os.path.join(app, "db.sqlite3") + os.environ["DJANGO_STATIC_URL"] = "/static/" + os.environ["EXE_MODE"] = "1" + static_fe = os.path.join(base, "backend", "static", "frontend") + if not os.path.isdir(static_fe): + static_fe = os.path.join(base, "static", "frontend") + os.environ["FRONTEND_DIR"] = static_fe + + +def init_database(): + import django + django.setup() + from django.core.management import call_command + call_command("migrate", "--run-syncdb", verbosity=0) + from meals.models import Dish + if Dish.objects.count() == 0: + try: + call_command("seed_dishes", verbosity=0) + except Exception: + pass + from django.contrib.auth import get_user_model + User = get_user_model() + if not User.objects.filter(username="admin").exists(): + User.objects.create_superuser("admin", "admin@example.com", "admin123") + + +def start_server(port): + import django + django.setup() + from django.core.management import call_command + call_command("runserver", f"127.0.0.1:{port}", "--noreload", verbosity=0) + + +def _server_alive(port=8000): + """Check if Django is already running on the port.""" + try: + urllib.request.urlopen(f"http://127.0.0.1:{port}/admin/", timeout=2) + return True + except Exception: + return False + + +# --------------------------------------------------------------------------- +# GUI - Visualization Panel +# --------------------------------------------------------------------------- +BG = "#1e293b" +BG_CARD = "#334155" +ACCENT = "#38bdf8" +GREEN = "#4ade80" +RED = "#f87171" +FG_DIM = "#94a3b8" +FONT_TITLE = ("Microsoft YaHei UI", 16, "bold") +FONT_LABEL = ("Microsoft YaHei UI", 11) +FONT_BTN = ("Microsoft YaHei UI", 11, "bold") +FONT_STATUS = ("Microsoft YaHei UI", 10) + +PORT = 8000 +URL_DASHBOARD = f"http://127.0.0.1:{PORT}/dashboard/" +URL_FRONTEND = f"http://127.0.0.1:{PORT}" +URL_ADMIN = f"http://127.0.0.1:{PORT}/admin" +ADMIN_USER = "admin" +ADMIN_PASS = "admin123" + + +class ManagerApp: + def __init__(self): + self.root = tk.Tk() + self.root.title("\u5b66\u6821\u8ba2\u9910\u83dc\u5355\u751f\u6210\u5668 - \u53ef\u89c6\u5316\u7ba1\u7406\u9762\u677f") + self.root.geometry("420x480") + self.root.resizable(False, False) + self.root.configure(bg=BG) + self.root.protocol("WM_DELETE_WINDOW", self._on_close) + + self._server_thread = None + self._build_ui() + self._check_server() + + def _build_ui(self): + root = self.root + + # Header + header = tk.Frame(root, bg=ACCENT, height=56) + header.pack(fill="x") + header.pack_propagate(False) + tk.Label( + header, text="\u53ef\u89c6\u5316\u7ba1\u7406\u9762\u677f", + font=FONT_TITLE, bg=ACCENT, fg="#0f172a", + ).pack(expand=True) + + # Status bar + self._status_frame = tk.Frame(root, bg=BG_CARD, bd=1, relief="solid") + self._status_frame.pack(fill="x", padx=16, pady=(16, 8)) + tk.Label( + self._status_frame, text="\u670d\u52a1\u72b6\u6001", + font=FONT_LABEL, bg=BG_CARD, fg=FG_DIM, anchor="w", + ).pack(side="left", padx=(12, 8), pady=10) + self._status_dot = tk.Canvas( + self._status_frame, width=12, height=12, + bg=BG_CARD, highlightthickness=0, + ) + self._status_dot.pack(side="left", pady=10) + self._status_dot.create_oval(2, 2, 10, 10, fill=FG_DIM, outline="", tags="dot") + self._status_label = tk.Label( + self._status_frame, text="\u68c0\u6d4b\u4e2d...", + font=FONT_STATUS, bg=BG_CARD, fg=FG_DIM, + ) + self._status_label.pack(side="left", padx=(4, 12), pady=10) + + # Credentials + cred_frame = tk.Frame(root, bg=BG_CARD, bd=1, relief="solid") + cred_frame.pack(fill="x", padx=16, pady=4) + tk.Label(cred_frame, text="\u7ba1\u7406\u5458\u4fe1\u606f", + font=FONT_LABEL, bg=BG_CARD, fg=FG_DIM, anchor="w").pack(side="left", padx=(12, 8), pady=10) + tk.Label(cred_frame, text=f"{ADMIN_USER} / {ADMIN_PASS}", + font=FONT_BTN, bg=BG_CARD, fg=GREEN).pack(side="right", padx=(0, 12), pady=10) + + # URL + url_frame = tk.Frame(root, bg=BG_CARD, bd=1, relief="solid") + url_frame.pack(fill="x", padx=16, pady=4) + tk.Label(url_frame, text="\u672c\u5730\u670d\u52a1", + font=FONT_LABEL, bg=BG_CARD, fg=FG_DIM, anchor="w").pack(side="left", padx=(12, 8), pady=10) + tk.Label(url_frame, text=f"127.0.0.1:{PORT}", + font=FONT_BTN, bg=BG_CARD, fg=ACCENT).pack(side="right", padx=(0, 12), pady=10) + + # Action buttons + btn_frame = tk.Frame(root, bg=BG) + btn_frame.pack(fill="x", padx=16, pady=(16, 4)) + + self._make_button(btn_frame, "\U0001f4ca \u6253\u5f00\u53ef\u89c6\u5316\u9762\u677f", + lambda: self._open_url(URL_DASHBOARD)).pack(fill="x", pady=(0, 6)) + self._make_button(btn_frame, "\U0001f310 \u6253\u5f00\u83dc\u5355\u751f\u6210\u5668", + lambda: self._open_url(URL_FRONTEND)).pack(fill="x", pady=(0, 6)) + self._make_button(btn_frame, "\U0001f6e0\ufe0f \u6253\u5f00\u540e\u53f0\u7ba1\u7406", + lambda: self._open_url(URL_ADMIN)).pack(fill="x", pady=(0, 6)) + self._make_button(btn_frame, "\U0001f37d\ufe0f \u83dc\u54c1\u7ba1\u7406", + lambda: self._open_url(f"{URL_ADMIN}/meals/dish/")).pack(fill="x", pady=(0, 6)) + + # Bottom + bottom_frame = tk.Frame(root, bg=BG) + bottom_frame.pack(fill="x", padx=16, pady=(12, 16)) + self._make_button(bottom_frame, "\u505c\u6b62\u670d\u52a1", + self._stop_server, bg_color=RED, hover_color="#dc2626").pack(fill="x", pady=(0, 4)) + self._make_button(bottom_frame, "\u91cd\u542f\u670d\u52a1", + self._restart_server, bg_color="#f59e0b", hover_color="#d97706").pack(fill="x") + + def _make_button(self, parent, text, command, bg_color=ACCENT, hover_color=None): + if hover_color is None: + hover_color = bg_color + btn = tk.Label(parent, text=text, font=FONT_BTN, bg=bg_color, fg="#0f172a", + cursor="hand2", padx=12, pady=10, anchor="w") + btn.bind("", lambda e: command()) + btn.bind("", lambda e: btn.configure(bg=hover_color)) + btn.bind("", lambda e: btn.configure(bg=bg_color)) + return btn + + def _check_server(self): + """Detect if server is already running, or start it.""" + self._set_status("\u68c0\u6d4b\u4e2d...", FG_DIM) + def _worker(): + if _server_alive(PORT): + self.root.after(0, lambda: self._set_status("Running", GREEN)) + self.root.after(500, lambda: self._open_url(URL_DASHBOARD)) + else: + # Start server ourselves + self.root.after(0, lambda: self._set_status("\u542f\u52a8\u670d\u52a1...", FG_DIM)) + try: + setup_environment() + init_database() + self.root.after(0, lambda: self._set_status("Running", GREEN)) + self.root.after(1000, lambda: self._open_url(URL_DASHBOARD)) + start_server(PORT) + except Exception as ex: + self.root.after(0, lambda: self._set_status("\u542f\u52a8\u5931\u8d25", RED)) + self.root.after(0, lambda: messagebox.showerror("\u9519\u8bef", str(ex))) + self._server_thread = threading.Thread(target=_worker, daemon=True) + self._server_thread.start() + + def _stop_server(self): + messagebox.showinfo("\u63d0\u793a", + "\u670d\u52a1\u7531\u4e3b\u7a0b\u5e8f\u7ba1\u7406\u3002\u5173\u95ed\u672c\u7a97\u53e3\u5373\u53ef\u505c\u6b62\u670d\u52a1\u3002") + + def _restart_server(self): + self._set_status("\u91cd\u542f\u4e2d...", FG_DIM) + def _worker(): + time.sleep(1) + if _server_alive(PORT): + self.root.after(0, lambda: self._set_status("Running", GREEN)) + else: + self.root.after(0, lambda: self._set_status("\u672a\u8fde\u63a5", RED)) + threading.Thread(target=_worker, daemon=True).start() + + def _open_url(self, url): + webbrowser.open(url) + + def _set_status(self, text, color): + self._status_label.configure(text=text, fg=color) + self._status_dot.itemconfig("dot", fill=color) + + def _on_close(self): + self.root.destroy() + + def run(self): + self.root.mainloop() + + +def main(): + setup_environment() + init_database() + if HAS_TKINTER: + app = ManagerApp() + app.run() + else: + print() + print("=" * 56) + print(" \u5b66\u6821\u8ba2\u9910\u83dc\u5355\u751f\u6210\u5668 - \u53ef\u89c6\u5316\u7ba1\u7406\u9762\u677f") + print("=" * 56) + print(f" \u53ef\u89c6\u5316\u9762\u677f: {URL_DASHBOARD}") + print(f" \u83dc\u5355\u751f\u6210\u5668: {URL_FRONTEND}") + print(f" \u540e\u53f0\u7ba1\u7406: {URL_ADMIN}") + print(f" \u7ba1\u7406\u5458\u8d26\u53f7: {ADMIN_USER} / {ADMIN_PASS}") + print("-" * 56) + if _server_alive(PORT): + print(" \u670d\u52a1\u5df2\u8fd0\u884c\uff0c\u6253\u5f00\u6d4f\u89c8\u5668...") + threading.Thread(target=lambda: (time.sleep(1), webbrowser.open(URL_DASHBOARD)), daemon=True).start() + else: + print(" \u670d\u52a1\u672a\u8fd0\u884c\uff0c\u6b63\u5728\u542f\u52a8...") + threading.Thread(target=lambda: (time.sleep(3), webbrowser.open(URL_DASHBOARD)), daemon=True).start() + try: + start_server(PORT) + except KeyboardInterrupt: + print("\n\u670d\u52a1\u5df2\u505c\u6b62") + + +if __name__ == "__main__": + main() diff --git a/meals/__init__.py b/meals/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/meals/admin.py b/meals/admin.py deleted file mode 100644 index 8c38f3f..0000000 --- a/meals/admin.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.contrib import admin - -# Register your models here. diff --git a/meals/apps.py b/meals/apps.py deleted file mode 100644 index 832619c..0000000 --- a/meals/apps.py +++ /dev/null @@ -1,5 +0,0 @@ -from django.apps import AppConfig - - -class MealsConfig(AppConfig): - name = 'meals' diff --git a/meals/migrations/__init__.py b/meals/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/meals/models.py b/meals/models.py deleted file mode 100644 index 71a8362..0000000 --- a/meals/models.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.db import models - -# Create your models here. diff --git a/meals/tests.py b/meals/tests.py deleted file mode 100644 index 7ce503c..0000000 --- a/meals/tests.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.test import TestCase - -# Create your tests here. diff --git a/meals/views.py b/meals/views.py deleted file mode 100644 index 91ea44a..0000000 --- a/meals/views.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.shortcuts import render - -# Create your views here. diff --git a/run.py b/run.py new file mode 100644 index 0000000..489c38f --- /dev/null +++ b/run.py @@ -0,0 +1,155 @@ +""" +\u5b66\u6821\u8ba2\u9910\u83dc\u5355\u751f\u6210\u5668 - EXE \u5165\u53e3 +\u53cc\u51fb\u8fd0\u884c\u6b64\u811a\u672c\u6216\u6253\u5305\u540e\u7684 EXE\uff0c\u81ea\u52a8\u5b8c\u6210\uff1a + 1. \u521d\u59cb\u5316\u6570\u636e\u5e93\uff08\u9996\u6b21\u8fd0\u884c\u81ea\u52a8\u8fc1\u79fb + \u5199\u5165\u793a\u4f8b\u83dc\u54c1\uff09 + 2. \u542f\u52a8 Django \u670d\u52a1\uff08\u540c\u65f6\u6258\u7ba1\u524d\u7aef\u9759\u6001\u9875\u9762\uff09 + 3. 自动打开浏览器(默认)或原生窗口(--gui 模式) +""" +import os +import sys +import threading +import time +import webbrowser + +# Ensure UTF-8 output on Windows console (fixes GBK encoding errors with rich) +if sys.platform == "win32": + os.system("chcp 65001 >nul 2>&1") + try: + sys.stdout.reconfigure(encoding="utf-8", errors="replace") + sys.stderr.reconfigure(encoding="utf-8", errors="replace") + except Exception: + pass + +from rich.console import Console +from rich.panel import Panel +from rich.text import Text +from rich.table import Table +from rich import box + +console = Console() + +GUI_MODE = "--gui" in sys.argv + + +def _frozen_dir(): + if getattr(sys, "frozen", False): + return sys._MEIPASS + return os.path.dirname(os.path.abspath(__file__)) + + +def _app_dir(): + if getattr(sys, "frozen", False): + return os.path.dirname(sys.executable) + return os.path.dirname(os.path.abspath(__file__)) + + +def setup_environment(): + base = _frozen_dir() + app = _app_dir() + sys.path.insert(0, base) + # In dev mode, add backend/ to path so config and meals are importable + backend_dir = os.path.join(base, 'backend') + if os.path.isdir(backend_dir) and backend_dir not in sys.path: + sys.path.insert(0, backend_dir) + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings") + os.environ["DJANGO_DEBUG"] = "True" + os.environ["DJANGO_SECRET_KEY"] = "exe-local-secret-key-do-not-use-in-production" + os.environ["DJANGO_ALLOWED_HOSTS"] = "127.0.0.1,localhost" + os.environ["DJANGO_DB_PATH"] = os.path.join(app, "db.sqlite3") + os.environ["DJANGO_STATIC_URL"] = "/static/" + os.environ["EXE_MODE"] = "1" + static_fe = os.path.join(base, "backend", "static", "frontend") + if not os.path.isdir(static_fe): + static_fe = os.path.join(base, "static", "frontend") + os.environ["FRONTEND_DIR"] = static_fe + + +def init_database(): + import django + django.setup() + from django.core.management import call_command + + with console.status("[bold cyan]\u6b63\u5728\u8fc1\u79fb\u6570\u636e\u5e93...", spinner="dots"): + call_command("migrate", "--run-syncdb", verbosity=0) + console.print(" [green]\u2713[/green] \u6570\u636e\u5e93\u8fc1\u79fb\u5b8c\u6210") + + from meals.models import Dish + if Dish.objects.count() == 0: + with console.status("[bold cyan]\u6b63\u5728\u5199\u5165\u793a\u4f8b\u83dc\u54c1\u6570\u636e...", spinner="dots"): + try: + call_command("seed_dishes", verbosity=0) + except Exception: + pass + console.print(" [green]\u2713[/green] \u793a\u4f8b\u83dc\u54c1\u6570\u636e\u5df2\u5199\u5165") + else: + console.print(" [green]\u2713[/green] \u83dc\u54c1\u6570\u636e\u5df2\u5b58\u5728\uff0c\u8df3\u8fc7") + + from django.contrib.auth import get_user_model + User = get_user_model() + if not User.objects.filter(username="admin").exists(): + User.objects.create_superuser("admin", "admin@example.com", "admin123") + console.print(" [green]\u2713[/green] \u5df2\u521b\u5efa\u7ba1\u7406\u5458 [bold]admin[/bold] / [bold]admin123[/bold]") + else: + console.print(" [green]\u2713[/green] \u7ba1\u7406\u5458\u8d26\u53f7\u5df2\u5b58\u5728") + + +def open_browser(port): + time.sleep(2) + webbrowser.open(f"http://127.0.0.1:{port}/") + + +def print_banner(port): + logo = Text() + logo.append(" _____ _ _ ____ \n", style="bold cyan") + logo.append(" / ____| | (_) | _ \\ \n", style="bold cyan") + logo.append("| (___ | |__ __ _ _ __ _ ___ ___ _ __ | |_) | __ ___ _____ _ __ \n", style="bold cyan") + logo.append(" \\___ \\| '_ \\ / _` | '__| |/ __/ _ \\| '_ \\| _ < / _` \\ \\ /\\ / / _ \\| '_ \\ \n", style="bold cyan") + logo.append(" ____) | | | | (_| | | | | (_| (_) | | | | |_) | (_| |\\ V V / (_) | | | |\n", style="bold cyan") + logo.append("|_____/|_| |_|\\__,_|_| |_|\\___\\___/|_| |_|____/ \\__,_| \\_/\\_/ \\___/|_| |_|\n", style="bold cyan") + + info_table = Table(show_header=False, box=box.SIMPLE, padding=(0, 2)) + info_table.add_column("key", style="bold white") + info_table.add_column("value", style="cyan") + info_table.add_row("\u5bfc\u822a\u9996\u9875", f"http://127.0.0.1:{port}/") + info_table.add_row("\u83dc\u5355\u751f\u6210\u5668", f"http://127.0.0.1:{port}/app/") + info_table.add_row("\u540e\u53f0\u7ba1\u7406", f"http://127.0.0.1:{port}/admin") + info_table.add_row("\u7ba1\u7406\u5458", "admin / admin123") + info_table.add_row("\u505c\u6b62\u670d\u52a1", "Ctrl + C") + + from rich.console import Group as RenderGroup + + console.print(Panel( + RenderGroup(logo, Text(""), info_table), + title="[bold green]\u5b66\u6821\u8ba2\u9910\u83dc\u5355\u751f\u6210\u5668[/bold green]", + subtitle="[dim]School Meal Planner[/dim]", + border_style="bright_blue", + padding=(1, 2), + )) + + +# manager.py is no longer launched separately; the web dashboard IS the manager + + +def main(): + if GUI_MODE: + from desktop import main as gui_main + gui_main() + return + console.clear() + setup_environment() + console.print() + console.print("[bold cyan]\u6b63\u5728\u521d\u59cb\u5316\u7cfb\u7edf...[/bold cyan]") + console.print() + init_database() + port = 8000 + print_banner(port) + # Auto-open dashboard in browser after server starts + threading.Thread(target=open_browser, args=(port,), daemon=True).start() + console.print("[dim]Django \u670d\u52a1\u542f\u52a8\u4e2d...[/dim]") + console.print() + from django.core.management import call_command + call_command("runserver", f"127.0.0.1:{port}", "--noreload", verbosity=1) + + +if __name__ == "__main__": + main() diff --git a/school-meal-setup.iss b/school-meal-setup.iss new file mode 100644 index 0000000..578e090 --- /dev/null +++ b/school-meal-setup.iss @@ -0,0 +1,81 @@ +; Inno Setup script for 学校订餐菜单生成器 +; Build with: iscc school-meal-setup.iss +; Prerequisites: Inno Setup 6.x (https://jrsoftware.org/isinfo.php) +; +; This script packages the PyInstaller output (dist/school-meal/) into a +; standard Windows installer with Start Menu shortcuts and uninstall support. + +[Setup] +AppId={{B7E3A4F1-5D92-4C8A-9F6E-2A1B3C4D5E6F} +AppName=学校订餐菜单生成器 +AppVersion=1.0.0 +AppPublisher=学校食堂管理 +AppPublisherURL= +DefaultDirName={autopf}\学校订餐菜单生成器 +DefaultGroupName=学校订餐菜单生成器 +OutputDir=installer +OutputBaseFilename=学校订餐菜单生成器-安装包 +SetupIconFile=app.ico +Compression=lzma2/ultra64 +SolidCompression=yes +WizardStyle=modern +PrivilegesRequired=lowest +PrivilegesRequiredOverridesAllowed=dialog +ArchitecturesAllowed=x64compatible +ArchitecturesInstallIn64BitMode=x64compatible +CloseApplications=force +RestartApplications=no +DisableProgramGroupPage=yes +UninstallDisplayIcon={app}\app.ico +LicenseFile= + +[Languages] +Name: "chinesesimplified"; MessagesFile: "compiler:Languages\ChineseSimplified.isl" +Name: "english"; MessagesFile: "compiler:Default.isl" + +[Tasks] +Name: "desktopicon"; Description: "创建桌面快捷方式"; GroupDescription: "附加选项:"; Flags: checkedonce + +[Files] +; Main executable +Source: "dist\school-meal\school-meal.exe"; DestDir: "{app}"; Flags: ignoreversion +; Database template (always updated — user data lives in %LOCALAPPDATA%) +Source: "dist\school-meal\db.sqlite3"; DestDir: "{app}"; Flags: ignoreversion uninsneveruninstall +; All runtime dependencies +Source: "dist\school-meal\_internal\*"; DestDir: "{app}\_internal"; Flags: ignoreversion recursesubdirs createallsubdirs +; Application icon (referenced by shortcuts and uninstall) +Source: "app.ico"; DestDir: "{app}"; Flags: ignoreversion + +[Icons] +Name: "{group}\学校订餐菜单生成器"; Filename: "{app}\school-meal.exe"; IconFilename: "{app}\app.ico" +Name: "{group}\卸载 学校订餐菜单生成器"; Filename: "{uninstallexe}"; IconFilename: "{app}\app.ico" +Name: "{autodesktop}\学校订餐菜单生成器"; Filename: "{app}\school-meal.exe"; Tasks: desktopicon; IconFilename: "{app}\app.ico" + +[Run] +Filename: "{app}\school-meal.exe"; Description: "启动 菜单生成器"; Flags: nowait postinstall skipifsilent + +[Code] +// Check if school-meal is already running before install/uninstall +function InitializeSetup: Boolean; +var + ResultCode: Integer; +begin + Result := True; + Exec('taskkill', '/F /IM school-meal.exe', '', SW_HIDE, ewWaitUntilTerminated, ResultCode); +end; + +function InitializeUninstall: Boolean; +var + ResultCode: Integer; +begin + Result := True; + Exec('taskkill', '/F /IM school-meal.exe', '', SW_HIDE, ewWaitUntilTerminated, ResultCode); +end; + +function PrepareToInstall(var NeedsRestart: Boolean): String; +var + ResultCode: Integer; +begin + Result := ''; + Exec('taskkill', '/F /IM school-meal.exe', '', SW_HIDE, ewWaitUntilTerminated, ResultCode); +end; diff --git a/school-meal.spec b/school-meal.spec new file mode 100644 index 0000000..b6807a9 --- /dev/null +++ b/school-meal.spec @@ -0,0 +1,366 @@ +# -*- mode: python ; coding: utf-8 -*- +# Auto-generated by build.py +block_cipher = None + +a = Analysis( + [r'C:/Users/12914/Desktop/school-meal/desktop.py'], + pathex=[r'C:/Users/12914/Desktop/school-meal', r'C:/Users/12914/Desktop/school-meal/backend'], + binaries=[], + datas=[ + (r'C:\Users\12914\Desktop\school-meal\backend\static', r'backend/static'), + (r'C:\Users\12914\Desktop\school-meal\backend\templates', r'backend/templates'), + (r'C:\Users\12914\Desktop\school-meal\backend\meals\migrations', r'backend/meals/migrations'), + (r'C:\Users\12914\Desktop\school-meal\backend\config', r'backend/config'), + (r'C:\Users\12914\Desktop\school-meal\backend\meals\management', r'backend/meals/management'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\admin\js\cancel.js', r'static\admin\js'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\admin\js\popup_response.js', r'static\admin\js'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\jazzmin\css\main.css', r'static\jazzmin\css'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\jazzmin\css\main.css.backup', r'static\jazzmin\css'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\jazzmin\img\calendar-icons.svg', r'static\jazzmin\img'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\jazzmin\img\default-log.svg', r'static\jazzmin\img'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\jazzmin\img\default.jpg', r'static\jazzmin\img'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\jazzmin\img\icon-calendar.svg', r'static\jazzmin\img'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\jazzmin\img\icon-changelink.svg', r'static\jazzmin\img'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\jazzmin\img\selector-icons.svg', r'static\jazzmin\img'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\jazzmin\js\change_form.js', r'static\jazzmin\js'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\jazzmin\js\change_list.js', r'static\jazzmin\js'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\jazzmin\js\main.js', r'static\jazzmin\js'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\jazzmin\js\related-modal.js', r'static\jazzmin\js'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\jazzmin\js\ui-builder.js', r'static\jazzmin\js'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\jazzmin\plugins\bootstrap-show-modal\bootstrap-show-modal.min.js', r'static\jazzmin\plugins\bootstrap-show-modal'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\adminlte\css\adminlte.min.css', r'static\vendor\adminlte\css'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\adminlte\css\adminlte.min.css.map', r'static\vendor\adminlte\css'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\adminlte\img\AdminLTELogo.png', r'static\vendor\adminlte\img'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\adminlte\img\icons.png', r'static\vendor\adminlte\img'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\adminlte\img\user2-160x160.jpg', r'static\vendor\adminlte\img'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\adminlte\js\adminlte.min.js', r'static\vendor\adminlte\js'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\adminlte\js\adminlte.min.js.map', r'static\vendor\adminlte\js'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootstrap\js\bootstrap.bundle.min.js', r'static\vendor\bootstrap\js'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootstrap\js\bootstrap.bundle.min.js.map', r'static\vendor\bootstrap\js'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootstrap\js\bootstrap.min.js', r'static\vendor\bootstrap\js'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootstrap\js\bootstrap.min.js.map', r'static\vendor\bootstrap\js'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootswatch\brite\bootstrap.min.css', r'static\vendor\bootswatch\brite'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootswatch\brite\bootstrap.min.css.map', r'static\vendor\bootswatch\brite'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootswatch\cerulean\bootstrap.min.css', r'static\vendor\bootswatch\cerulean'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootswatch\cerulean\bootstrap.min.css.map', r'static\vendor\bootswatch\cerulean'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootswatch\cosmo\bootstrap.min.css', r'static\vendor\bootswatch\cosmo'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootswatch\cosmo\bootstrap.min.css.map', r'static\vendor\bootswatch\cosmo'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootswatch\cyborg\bootstrap.min.css', r'static\vendor\bootswatch\cyborg'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootswatch\cyborg\bootstrap.min.css.map', r'static\vendor\bootswatch\cyborg'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootswatch\darkly\bootstrap.min.css', r'static\vendor\bootswatch\darkly'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootswatch\darkly\bootstrap.min.css.map', r'static\vendor\bootswatch\darkly'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootswatch\default\bootstrap.min.css', r'static\vendor\bootswatch\default'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootswatch\default\bootstrap.min.css.map', r'static\vendor\bootswatch\default'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootswatch\flatly\bootstrap.min.css', r'static\vendor\bootswatch\flatly'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootswatch\flatly\bootstrap.min.css.map', r'static\vendor\bootswatch\flatly'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootswatch\journal\bootstrap.min.css', r'static\vendor\bootswatch\journal'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootswatch\journal\bootstrap.min.css.map', r'static\vendor\bootswatch\journal'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootswatch\litera\bootstrap.min.css', r'static\vendor\bootswatch\litera'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootswatch\litera\bootstrap.min.css.map', r'static\vendor\bootswatch\litera'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootswatch\lumen\bootstrap.min.css', r'static\vendor\bootswatch\lumen'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootswatch\lumen\bootstrap.min.css.map', r'static\vendor\bootswatch\lumen'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootswatch\lux\bootstrap.min.css', r'static\vendor\bootswatch\lux'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootswatch\lux\bootstrap.min.css.map', r'static\vendor\bootswatch\lux'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootswatch\materia\bootstrap.min.css', r'static\vendor\bootswatch\materia'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootswatch\materia\bootstrap.min.css.map', r'static\vendor\bootswatch\materia'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootswatch\minty\bootstrap.min.css', r'static\vendor\bootswatch\minty'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootswatch\minty\bootstrap.min.css.map', r'static\vendor\bootswatch\minty'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootswatch\morph\bootstrap.min.css', r'static\vendor\bootswatch\morph'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootswatch\morph\bootstrap.min.css.map', r'static\vendor\bootswatch\morph'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootswatch\pulse\bootstrap.min.css', r'static\vendor\bootswatch\pulse'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootswatch\pulse\bootstrap.min.css.map', r'static\vendor\bootswatch\pulse'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootswatch\quartz\bootstrap.min.css', r'static\vendor\bootswatch\quartz'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootswatch\quartz\bootstrap.min.css.map', r'static\vendor\bootswatch\quartz'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootswatch\sandstone\bootstrap.min.css', r'static\vendor\bootswatch\sandstone'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootswatch\sandstone\bootstrap.min.css.map', r'static\vendor\bootswatch\sandstone'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootswatch\simplex\bootstrap.min.css', r'static\vendor\bootswatch\simplex'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootswatch\simplex\bootstrap.min.css.map', r'static\vendor\bootswatch\simplex'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootswatch\sketchy\bootstrap.min.css', r'static\vendor\bootswatch\sketchy'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootswatch\sketchy\bootstrap.min.css.map', r'static\vendor\bootswatch\sketchy'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootswatch\slate\bootstrap.min.css', r'static\vendor\bootswatch\slate'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootswatch\slate\bootstrap.min.css.map', r'static\vendor\bootswatch\slate'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootswatch\solar\bootstrap.min.css', r'static\vendor\bootswatch\solar'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootswatch\solar\bootstrap.min.css.map', r'static\vendor\bootswatch\solar'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootswatch\spacelab\bootstrap.min.css', r'static\vendor\bootswatch\spacelab'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootswatch\spacelab\bootstrap.min.css.map', r'static\vendor\bootswatch\spacelab'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootswatch\superhero\bootstrap.min.css', r'static\vendor\bootswatch\superhero'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootswatch\superhero\bootstrap.min.css.map', r'static\vendor\bootswatch\superhero'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootswatch\united\bootstrap.min.css', r'static\vendor\bootswatch\united'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootswatch\united\bootstrap.min.css.map', r'static\vendor\bootswatch\united'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootswatch\vapor\bootstrap.min.css', r'static\vendor\bootswatch\vapor'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootswatch\vapor\bootstrap.min.css.map', r'static\vendor\bootswatch\vapor'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootswatch\yeti\bootstrap.min.css', r'static\vendor\bootswatch\yeti'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootswatch\yeti\bootstrap.min.css.map', r'static\vendor\bootswatch\yeti'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootswatch\zephyr\bootstrap.min.css', r'static\vendor\bootswatch\zephyr'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\bootswatch\zephyr\bootstrap.min.css.map', r'static\vendor\bootswatch\zephyr'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\fontawesome-free\css\all.min.css', r'static\vendor\fontawesome-free\css'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\fontawesome-free\webfonts\fa-brands-400.ttf', r'static\vendor\fontawesome-free\webfonts'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\fontawesome-free\webfonts\fa-brands-400.woff2', r'static\vendor\fontawesome-free\webfonts'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\fontawesome-free\webfonts\fa-regular-400.ttf', r'static\vendor\fontawesome-free\webfonts'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\fontawesome-free\webfonts\fa-regular-400.woff2', r'static\vendor\fontawesome-free\webfonts'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\fontawesome-free\webfonts\fa-solid-900.ttf', r'static\vendor\fontawesome-free\webfonts'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\fontawesome-free\webfonts\fa-solid-900.woff2', r'static\vendor\fontawesome-free\webfonts'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\fontawesome-free\webfonts\fa-v4compatibility.ttf', r'static\vendor\fontawesome-free\webfonts'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\fontawesome-free\webfonts\fa-v4compatibility.woff2', r'static\vendor\fontawesome-free\webfonts'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\select2\css\select2.min.css', r'static\vendor\select2\css'), + (r'C:\Users\12914\Desktop\school-meal\.venv\Lib\site-packages\jazzmin\static\vendor\select2\js\select2.min.js', r'static\vendor\select2\js'), + ], + hiddenimports=[ + 'rest_framework', + 'rest_framework.apps', + 'rest_framework.authentication', + 'rest_framework.authtoken', + 'rest_framework.authtoken.admin', + 'rest_framework.authtoken.apps', + 'rest_framework.authtoken.management', + 'rest_framework.authtoken.management.commands', + 'rest_framework.authtoken.management.commands.drf_create_token', + 'rest_framework.authtoken.migrations', + 'rest_framework.authtoken.migrations.0001_initial', + 'rest_framework.authtoken.migrations.0002_auto_20160226_1747', + 'rest_framework.authtoken.migrations.0003_tokenproxy', + 'rest_framework.authtoken.migrations.0004_alter_tokenproxy_options', + 'rest_framework.authtoken.models', + 'rest_framework.authtoken.serializers', + 'rest_framework.authtoken.views', + 'rest_framework.checks', + 'rest_framework.compat', + 'rest_framework.decorators', + 'rest_framework.exceptions', + 'rest_framework.fields', + 'rest_framework.filters', + 'rest_framework.generics', + 'rest_framework.management', + 'rest_framework.management.commands', + 'rest_framework.management.commands.generateschema', + 'rest_framework.metadata', + 'rest_framework.mixins', + 'rest_framework.negotiation', + 'rest_framework.pagination', + 'rest_framework.parsers', + 'rest_framework.permissions', + 'rest_framework.relations', + 'rest_framework.renderers', + 'rest_framework.request', + 'rest_framework.response', + 'rest_framework.reverse', + 'rest_framework.routers', + 'rest_framework.serializers', + 'rest_framework.settings', + 'rest_framework.status', + 'rest_framework.templatetags', + 'rest_framework.templatetags.rest_framework', + 'rest_framework.test', + 'rest_framework.throttling', + 'rest_framework.urlpatterns', + 'rest_framework.urls', + 'rest_framework.utils', + 'rest_framework.utils.breadcrumbs', + 'rest_framework.utils.encoders', + 'rest_framework.utils.field_mapping', + 'rest_framework.utils.formatting', + 'rest_framework.utils.html', + 'rest_framework.utils.humanize_datetime', + 'rest_framework.utils.json', + 'rest_framework.utils.mediatypes', + 'rest_framework.utils.model_meta', + 'rest_framework.utils.representation', + 'rest_framework.utils.serializer_helpers', + 'rest_framework.utils.timezone', + 'rest_framework.utils.urls', + 'rest_framework.validators', + 'rest_framework.versioning', + 'rest_framework.views', + 'rest_framework.viewsets', + 'corsheaders', + 'corsheaders.apps', + 'corsheaders.checks', + 'corsheaders.conf', + 'corsheaders.defaults', + 'corsheaders.middleware', + 'corsheaders.signals', + 'jazzmin', + 'jazzmin.apps', + 'jazzmin.compat', + 'jazzmin.settings', + 'jazzmin.templatetags', + 'jazzmin.templatetags.jazzmin', + 'jazzmin.utils', + 'jazzmin.widgets', + 'rich', + 'rich.__main__', + 'rich._emoji_codes', + 'rich._emoji_replace', + 'rich._export_format', + 'rich._extension', + 'rich._fileno', + 'rich._inspect', + 'rich._log_render', + 'rich._loop', + 'rich._null_file', + 'rich._palettes', + 'rich._pick', + 'rich._ratio', + 'rich._spinners', + 'rich._stack', + 'rich._timer', + 'rich._unicode_data', + 'rich._unicode_data._versions', + 'rich._unicode_data.unicode10-0-0', + 'rich._unicode_data.unicode11-0-0', + 'rich._unicode_data.unicode12-0-0', + 'rich._unicode_data.unicode12-1-0', + 'rich._unicode_data.unicode13-0-0', + 'rich._unicode_data.unicode14-0-0', + 'rich._unicode_data.unicode15-0-0', + 'rich._unicode_data.unicode15-1-0', + 'rich._unicode_data.unicode16-0-0', + 'rich._unicode_data.unicode17-0-0', + 'rich._unicode_data.unicode4-1-0', + 'rich._unicode_data.unicode5-0-0', + 'rich._unicode_data.unicode5-1-0', + 'rich._unicode_data.unicode5-2-0', + 'rich._unicode_data.unicode6-0-0', + 'rich._unicode_data.unicode6-1-0', + 'rich._unicode_data.unicode6-2-0', + 'rich._unicode_data.unicode6-3-0', + 'rich._unicode_data.unicode7-0-0', + 'rich._unicode_data.unicode8-0-0', + 'rich._unicode_data.unicode9-0-0', + 'rich._win32_console', + 'rich._windows', + 'rich._windows_renderer', + 'rich._wrap', + 'rich.abc', + 'rich.align', + 'rich.ansi', + 'rich.bar', + 'rich.box', + 'rich.cells', + 'rich.color', + 'rich.color_triplet', + 'rich.columns', + 'rich.console', + 'rich.constrain', + 'rich.containers', + 'rich.control', + 'rich.default_styles', + 'rich.diagnose', + 'rich.emoji', + 'rich.errors', + 'rich.file_proxy', + 'rich.filesize', + 'rich.highlighter', + 'rich.json', + 'rich.jupyter', + 'rich.layout', + 'rich.live', + 'rich.live_render', + 'rich.logging', + 'rich.markdown', + 'rich.markup', + 'rich.measure', + 'rich.padding', + 'rich.pager', + 'rich.palette', + 'rich.panel', + 'rich.pretty', + 'rich.progress', + 'rich.progress_bar', + 'rich.prompt', + 'rich.protocol', + 'rich.region', + 'rich.repr', + 'rich.rule', + 'rich.scope', + 'rich.screen', + 'rich.segment', + 'rich.spinner', + 'rich.status', + 'rich.style', + 'rich.styled', + 'rich.syntax', + 'rich.table', + 'rich.terminal_theme', + 'rich.text', + 'rich.theme', + 'rich.themes', + 'rich.traceback', + 'rich.tree', + 'meals.views_dashboard', + 'meals', + 'meals.apps', + 'meals.models', + 'meals.admin', + 'meals.urls', + 'meals.views', + 'meals.views_spa', + 'meals.serializers', + 'meals.management', + 'meals.management.commands', + 'meals.management.commands.seed_dishes', + 'meals.management.commands.import_dishes', + 'config', + 'config.settings', + 'config.wsgi', + 'config.asgi', + 'config.urls', + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'pypinyin', + 'openpyxl', + 'tkinter', + 'tkinter.messagebox', + 'tkinter.constants', + 'webview', + 'webview.window', + 'webview.platforms.edgechromium', + 'pythonnet', + 'clr_loader', + 'cffi', + 'bottle', + ], + hookspath=[], + hooksconfig={}, + runtime_hooks=[], + excludes=[], + win_no_prefer_redirects=False, + win_private_assemblies=False, + cipher=block_cipher, + noarchive=False, +) + +pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) + +exe = EXE( + pyz, + a.scripts, + [], + exclude_binaries=True, + name='school-meal', + debug=False, + bootloader_ignore_signals=False, + strip=False, + upx=True, + console=False, + disable_windowed_traceback=False, + target_arch=None, + codesign_identity=None, + entitlements_file=None, + icon=r'C:/Users/12914/Desktop/school-meal/app.ico', +) + +coll = COLLECT( + exe, + a.binaries, + a.zipfiles, + a.datas, + strip=False, + upx=True, + upx_exclude=[], + name='school-meal', +) diff --git a/start.bat b/start.bat index 35cd80a..716815d 100644 --- a/start.bat +++ b/start.bat @@ -1,35 +1,75 @@ @echo off chcp 65001 >nul -echo ========================================== -echo 学校订餐菜单生成器 - 一键启动 -echo ========================================== cd /d %~dp0 +reg add "HKCU\Console" /v VirtualTerminalLevel /t REG_DWORD /d 1 /f >nul 2>&1 + +set "C_RESET=[0m" +set "C_BOLD=[1m" +set "C_CYAN=[96m" +set "C_GREEN=[92m" +set "C_YELLOW=[93m" +set "C_WHITE=[97m" +set "C_DIM=[2m" +set "C_BG_BLUE=[44m" + +echo. +echo %C_BG_BLUE%%C_WHITE% %C_RESET% +echo %C_BG_BLUE%%C_WHITE% %C_BOLD% _____ _ _ ____ %C_RESET%%C_BG_BLUE%%C_WHITE% %C_RESET% +echo %C_BG_BLUE%%C_WHITE% %C_BOLD% / ____^| ^| ^(_^) ^| _ \ %C_RESET%%C_BG_BLUE%%C_WHITE% %C_RESET% +echo %C_BG_BLUE%%C_WHITE% %C_BOLD%^| ^(____ ^| ^|__ __ _ _ __ _ ___ ___ _ __ ^| ^|_) ^| __ ___ _____ _ __ %C_RESET%%C_BG_BLUE%%C_WHITE% %C_RESET% +echo %C_BG_BLUE%%C_WHITE% %C_BOLD% \___ \^| '_ \ / _` ^| '__^| ^|/ __/ _ \^| '_ \^| _ ^< / _` \ ^\ /\ / / _ \^| '_ \ %C_RESET%%C_BG_BLUE%%C_WHITE% %C_RESET% +echo %C_BG_BLUE%%C_WHITE% %C_BOLD% ____) ^| ^| ^| ^| ^(_^| ^| ^| ^| ^| ^(_^| ^(_^) ^| ^| ^| ^| ^|_) ^| ^(_^| ^|\ V V / ^(_^| ^| ^| ^| %C_RESET%%C_BG_BLUE%%C_WHITE% %C_RESET% +echo %C_BG_BLUE%%C_WHITE% %C_BOLD% ^|_____/^|_^| ^|_^|\__,_^|_^| ^|_^|^|\___\___/^|_^| ^|_^|____/ \__,_^| \_/\_/ \___/^|_^| ^|_^|%C_RESET%%C_BG_BLUE%%C_WHITE% %C_RESET% +echo %C_BG_BLUE%%C_WHITE% %C_RESET% +echo. + +echo %C_CYAN% ┌─────────────────────────────────────────────────────────────────────┐%C_RESET% +echo %C_CYAN% │%C_RESET% %C_BOLD% School Meal Planner %C_RESET% - %C_DIM% One-click Launcher %C_RESET% %C_CYAN%│%C_RESET% +echo %C_CYAN% └─────────────────────────────────────────────────────────────────────┘%C_RESET% +echo. + if not exist .venv ( - echo [1/3] 首次运行,创建 Python 虚拟环境... + echo %C_YELLOW% [1/4] First run: creating Python venv...%C_RESET% python -m venv .venv .venv\Scripts\pip install -r backend\requirements.txt .venv\Scripts\python backend\manage.py migrate .venv\Scripts\python backend\manage.py seed_dishes - echo 管理员账号: admin 密码: admin123 + echo %C_GREEN% ✓ Environment initialized%C_RESET% + echo %C_GREEN% ✓ Admin: admin / admin123%C_RESET% + echo. +) else ( + echo %C_CYAN% [1/4] Python environment ready%C_RESET% ) -echo [1/3] 启动 Django 后端 (http://127.0.0.1:8000)... +echo %C_CYAN% [2/4] Starting Django backend...%C_RESET% start "django-backend" cmd /k ".venv\Scripts\python backend\manage.py runserver 0.0.0.0:8000" +echo %C_GREEN% ✓ Django backend started%C_RESET% +echo. -echo [2/3] 启动 React 前端 (http://localhost:5173)... +echo %C_CYAN% [3/4] Starting Manager GUI...%C_RESET% +start "" ".venv\Scripts\pythonw" manager.py +echo %C_GREEN% ✓ Manager started%C_RESET% +echo. + +echo %C_CYAN% [4/4] Starting React frontend...%C_RESET% if not exist frontend\node_modules ( - echo 首次运行,安装前端依赖... + echo %C_YELLOW% Installing frontend deps (may take a few minutes)...%C_RESET% cd frontend call npm install cd .. ) start "react-frontend" cmd /k "cd frontend && npm run dev" - -echo [3/3] 启动完成! +echo %C_GREEN% ✓ React frontend started%C_RESET% echo. -echo - 前端页面: http://localhost:5173 -echo - 后台管理: http://127.0.0.1:8000/admin (账号 admin / 密码 admin123) -echo - 关闭方式: 关闭弹出的两个命令行窗口 + +echo %C_BG_BLUE%%C_WHITE% %C_RESET% +echo %C_BG_BLUE%%C_WHITE% %C_RESET% %C_BOLD%All services started!%C_RESET% %C_BG_BLUE%%C_WHITE% %C_RESET% +echo %C_BG_BLUE%%C_WHITE% %C_RESET% %C_BG_BLUE%%C_WHITE% %C_RESET% +echo %C_BG_BLUE%%C_WHITE% %C_RESET% %C_CYAN%*%C_RESET% Frontend %C_BOLD%http://localhost:5173%C_RESET% %C_BG_BLUE%%C_WHITE% %C_RESET% +echo %C_BG_BLUE%%C_WHITE% %C_RESET% %C_CYAN%*%C_RESET% Admin Panel %C_BOLD%http://127.0.0.1:8000/admin%C_RESET% (admin / admin123) %C_BG_BLUE%%C_WHITE% %C_RESET% +echo %C_BG_BLUE%%C_WHITE% %C_RESET% %C_CYAN%*%C_RESET% Manager %C_DIM%Use the GUI window%C_RESET% %C_BG_BLUE%%C_WHITE% %C_RESET% +echo %C_BG_BLUE%%C_WHITE% %C_RESET% %C_BG_BLUE%%C_WHITE% %C_RESET% +echo %C_BG_BLUE%%C_WHITE% %C_RESET% echo. pause diff --git a/start_server.ps1 b/start_server.ps1 new file mode 100644 index 0000000..16c5d67 --- /dev/null +++ b/start_server.ps1 @@ -0,0 +1,8 @@ +$env:DJANGO_DEBUG = 'True' +$env:DJANGO_SECRET_KEY = 'test-key-for-debug' +$env:DJANGO_ALLOWED_HOSTS = '*' +$env:DJANGO_DB_PATH = 'C:\Users\12914\Desktop\school-meal\backend\db.sqlite3' +$env:DJANGO_SETTINGS_MODULE = 'config.settings' +$env:DJANGO_STATIC_URL = '/static/' +Set-Location 'C:\Users\12914\Desktop\school-meal\backend' +& 'C:\Users\12914\Desktop\school-meal\.venv\Scripts\python.exe' manage.py runserver 127.0.0.1:8000 --noreload 2>&1 | Tee-Object -FilePath 'C:\Users\12914\Desktop\school-meal\django_server.log' diff --git a/test_all.py b/test_all.py new file mode 100644 index 0000000..3ed6a29 --- /dev/null +++ b/test_all.py @@ -0,0 +1,120 @@ +import urllib.request, urllib.error, json, http.cookiejar + +cj = http.cookiejar.CookieJar() +opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj)) + +print("=" * 60) +print(" School Meal Admin Test Report") +print("=" * 60) + +# Test 1: Admin Login Page +print("\n1. Admin Login Page") +try: + r = opener.open("http://127.0.0.1:8000/admin/login/", timeout=5) + body = r.read().decode("utf-8", errors="replace") + print(" Status: %d OK" % r.status) + print(" Size: %d bytes" % len(body)) + print(" Has login form: %s" % ("id_username" in body)) + print(" Has password field: %s" % ("id_password" in body)) + print(" Has CSRF: %s" % ("csrfmiddlewaretoken" in body)) + title_start = body.find("") + 7 + title_end = body.find("") + print(" Title: %s" % body[title_start:title_end]) +except Exception as e: + print(" FAIL: %s" % e) + +# Test 2: Admin Login +print("\n2. Admin Login") +try: + r = opener.open("http://127.0.0.1:8000/admin/login/", timeout=5) + body = r.read().decode("utf-8", errors="replace") + csrf = body.split('csrfmiddlewaretoken" value="')[1].split('"')[0] + import urllib.parse + data = urllib.parse.urlencode({"csrfmiddlewaretoken": csrf, "username": "admin", "password": "admin123", "next": "/admin/"}).encode() + req = urllib.request.Request("http://127.0.0.1:8000/admin/login/", data=data) + req.add_header("Referer", "http://127.0.0.1:8000/admin/login/") + r2 = opener.open(req, timeout=5) + print(" Login OK: %d" % r2.status) +except urllib.error.HTTPError as e: + if e.code == 302: + print(" Login OK: 302 redirect to %s" % e.headers.get("Location", "unknown")) + else: + print(" FAIL: %d" % e.code) +except Exception as e: + print(" FAIL: %s" % e) + +# Test 3: Admin Dashboard +print("\n3. Admin Dashboard") +try: + r = opener.open("http://127.0.0.1:8000/admin/", timeout=5) + body = r.read().decode("utf-8", errors="replace") + print(" Status: %d OK" % r.status) + print(" Size: %d bytes" % len(body)) + print(" Has Dish model: %s" % ("Dish" in body or "meals" in body)) + print(" Has User model: %s" % ("User" in body or "auth" in body)) + print(" Has sidebar: %s" % ("sidebar" in body)) +except Exception as e: + print(" FAIL: %s" % e) + +# Test 4: Admin Dishes List +print("\n4. Admin Dishes List") +try: + r = opener.open("http://127.0.0.1:8000/admin/meals/dish/", timeout=5) + body = r.read().decode("utf-8", errors="replace") + print(" Status: %d OK" % r.status) + print(" Size: %d bytes" % len(body)) + print(" Has result table: %s" % ("result_list" in body)) +except Exception as e: + print(" FAIL: %s" % e) + +# Test 5: API Dishes +print("\n5. API Dishes") +try: + r = opener.open("http://127.0.0.1:8000/api/dishes/", timeout=5) + data = json.loads(r.read()) + print(" Status: %d OK" % r.status) + print(" Dish count: %d" % len(data)) + if data: + print(" First dish: %s (%s)" % (data[0]["name"], data[0]["dish_type"])) +except Exception as e: + print(" FAIL: %s" % e) + +# Test 6: Menu Generation +print("\n6. Menu Generation") +try: + req = urllib.request.Request("http://127.0.0.1:8000/api/menu/generate/", + data=json.dumps({"selections": [], "auto_all": True}).encode(), + headers={"Content-Type": "application/json"}) + r = opener.open(req, timeout=10) + menu = json.loads(r.read()) + print(" Status: %d OK" % r.status) + print(" Menu A days: %d" % len(menu["a"]["week"])) + print(" Menu B days: %d" % len(menu["b"]["week"])) + day_a = menu["a"]["week"][0] + print(" A Mon: %d meats %d vegs soup" % (len(day_a["meats"]), len(day_a["vegs"]))) +except Exception as e: + print(" FAIL: %s" % e) + +# Test 7: Frontend +print("\n7. Frontend") +try: + r = opener.open("http://127.0.0.1:8000/", timeout=5) + body = r.read().decode("utf-8", errors="replace") + print(" Status: %d OK" % r.status) + print(" Size: %d bytes" % len(body)) + print(" Has React root: %s" % ("root" in body)) +except Exception as e: + print(" FAIL: %s" % e) + +# Test 8: Static Files +print("\n8. Static Files") +for path in ["/static/admin/css/base.css", "/static/jazzmin/css/main.css"]: + try: + r = opener.open("http://127.0.0.1:8000%s" % path, timeout=5) + print(" %s: %d OK (%d bytes)" % (path, r.status, len(r.read()))) + except Exception as e: + print(" %s: FAIL (%s)" % (path, e)) + +print("\n" + "=" * 60) +print(" All tests completed") +print("=" * 60) diff --git a/test_urls.py b/test_urls.py new file mode 100644 index 0000000..c6060ff --- /dev/null +++ b/test_urls.py @@ -0,0 +1,16 @@ +import os, sys +os.environ['DJANGO_DEBUG'] = 'True' +os.environ['DJANGO_SECRET_KEY'] = 'test-key' +os.environ['DJANGO_ALLOWED_HOSTS'] = '*' +os.environ['DJANGO_DB_PATH'] = r'C:\Users\12914\Desktop\school-meal\backend\db.sqlite3' +os.environ['DJANGO_SETTINGS_MODULE'] = 'config.settings' +os.environ['DJANGO_STATIC_URL'] = '/static' +sys.path.insert(0, r'C:\Users\12914\Desktop\school-meal\backend') +import django +django.setup() +from django.test import Client +c = Client() +urls = ['/admin/', '/admin/login/', '/api/dishes/', '/'] +for url in urls: + r = c.get(url) + print(f'{url}: {r.status_code} ({len(r.content)} bytes)') diff --git a/xxcdn二维码.png b/xxcdn二维码.png deleted file mode 100644 index e6bac7c0780f6eb7c36ad839faca2768eaf52b16..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1505 zcmeAS@N?(olHy`uVBq!ia0y~yVDtiE4kn<;7w<-(0P6}*7srr_IdAV8PP$_u!g}yw z+q?SIQxWccFE%LFgrxtH`ub%9(>d-ByWan1*Z7tHot+_UqIt?m=}k{~BR{q2R60-F zqv(Baf@=PWNi-3DeSO{kAG_AgpZ0rS|8KSV_Mbod$9?}@WoCEuB~Az24$C$cPk4PT zRz+K{ z85d9AmhF9fxy4>wA#ghDt^Ccca?#(zf@g30IR|Gjl|IROd!*cS-Q(LIa{u&R#u>P6 z>#kMh&yOk3zj>y9x8M7l5y$ZcLLSHOE9IueN54LM|N7<+5!}Adjb3|p&++W*>2;fJ zsyAmwZ?A~{KDoU1{P{Gyjkv==>Q~!^ncdrC?JMto%DKywbG_R8=VaWDUl&{M@^;tP ztm|=E*M&}>P5J!)*K6EC_xi-{Yh}3&RkOF5U#opK(|qGy_J6&&LvU;ERcHgbDjUz*KxaEf4qMVsGApeJk;Ke&E6dr zqrPwD=bLBzOCRlazg}2{D~Da%cJ#c9VxGFE)`*Bal zteyO`cYd7pbEV&(Gq@x7*0!kXvPVWQkK8YR_TA=la4h>fow+y@uxZKGZ@I5GmhOLl zX6@C^`LE=D=GYYDcKO8BrfL2VB)!&^K5Tw z_`B*lJW-__o~^!bb>XsD?=`W~>wlk~Cxbh@fw}(do}I6bMDM%zW=mS$o@;w&ev$k6 ud*4Ic@w$5Z6~=$hamv%CK&)F;$E=o8w$oqSECE<_GkCiCxvX