From e60e32830aed5943e81d4618d808f2b733d964bf Mon Sep 17 00:00:00 2001 From: patdelphi Date: Tue, 19 Aug 2025 17:26:03 +0800 Subject: [PATCH] Fix TypeScript compilation errors for Koyeb deployment --- ...aryl-suanming_2025-08-19T09_03_11.708Z.txt | 88 ++++++++++++++++++ numerology.db | Bin 8003584 -> 8003584 bytes numerology.db-shm | Bin 32768 -> 32768 bytes numerology.db-wal | Bin 1075352 -> 1359632 bytes src/components/AnalysisResultDisplay.tsx | 2 + src/components/BaziAnalysisDisplay.tsx | 38 ++++---- src/components/CompleteBaziAnalysis.tsx | 9 +- src/pages/AnalysisPage.tsx | 2 +- src/pages/BaziDetailsPage.tsx | 4 +- 9 files changed, 120 insertions(+), 23 deletions(-) create mode 100644 common-charyl-suanming_2025-08-19T09_03_11.708Z.txt diff --git a/common-charyl-suanming_2025-08-19T09_03_11.708Z.txt b/common-charyl-suanming_2025-08-19T09_03_11.708Z.txt new file mode 100644 index 0000000..9f6760c --- /dev/null +++ b/common-charyl-suanming_2025-08-19T09_03_11.708Z.txt @@ -0,0 +1,88 @@ +Build ready to start ▶️ +>> Cloning github.com/patdelphi/suanming.git commit sha 5c10fe8d3842c2ec55f29cfb9b1e7c2aefff584e into /builder/workspace +Initialized empty Git repository in /builder/workspace/.git/ +From https://github.com/patdelphi/suanming + * branch 5c10fe8d3842c2ec55f29cfb9b1e7c2aefff584e -> FETCH_HEAD +HEAD is now at 5c10fe8 修复Koyeb部署问题:添加packageManager字段指定pnpm版本 +Starting Docker daemon... +Waiting for the Docker daemon to start... +done +Timer: Analyzer started at 2025-08-19T09:02:34Z +Image with name "registry01.prod.koyeb.com/k-8e751168-cf22-413e-ad8f-1dedf498563a/b5220413-de00-4b69-8514-51ef422bdcaa" not found +Timer: Analyzer ran for 258.636887ms and ended at 2025-08-19T09:02:34Z +Timer: Detector started at 2025-08-19T09:02:37Z +3 of 4 buildpacks participating +heroku/nodejs-engine 3.6.5 +heroku/nodejs-corepack 3.6.5 +heroku/nodejs-pnpm-install 3.6.5 +Timer: Detector ran for 115.628657ms and ended at 2025-08-19T09:02:37Z +Timer: Restorer started at 2025-08-19T09:02:38Z +Layer cache not found +Timer: Restorer ran for 194.782532ms and ended at 2025-08-19T09:02:38Z +Timer: Builder started at 2025-08-19T09:02:38Z + +## Heroku Node.js Engine + +- Checking Node.js version + - Node.js version not specified, using `22.x` + - Resolved Node.js version: `22.15.1` +- Installing Node.js distribution + - Downloading Node.js `22.15.1 (linux-amd64)` from https://nodejs.org/download/release/v22.15.1/node-v22.15.1-linux-x64.tar.gz ... (< 0.1s) + - Verifying checksum + - Extracting Node.js `22.15.1 (linux-amd64)` + - Installing Node.js `22.15.1 (linux-amd64)` ... (< 0.1s) +- Done (finished in 1.4s) + +## Heroku Node.js Corepack + +- Using Corepack version `0.32.0` +- Found `packageManager` set to `pnpm@9.0.0` in `package.json` +- Enabling Corepack + - Creating Corepack shims + - Executing `corepack enable --install-directory /layers/heroku_nodejs-corepack/shim/bin pnpm` +- Installing `pnpm@9.0.0` + - Creating Corepack package manager + - Running `corepack prepare` + + Preparing pnpm@9.0.0... + + - Done (0.4s) +- Done (finished in 0.5s) + +## Heroku Node.js pnpm Install + +- Setting up pnpm dependency store + - Creating new pnpm content-addressable store + - Creating pnpm virtual store +- Installing dependencies + - Running `pnpm install --frozen-lockfile` + +  ERR_PNPM_OUTDATED_LOCKFILE  Cannot install with "frozen-lockfile" because pnpm-lock.yaml is not up to date with package.json + + Note that in CI environments this setting is true by default. If you still need to run install in such cases, use "pnpm install --no-frozen-lockfile" + + Failure reason: + specifiers in the lockfile ({"@hookform/resolvers":"^3.10.0","@radix-ui/react-accordion":"^1.2.2","@radix-ui/react-alert-dialog":"^1.1.4","@radix-ui/react-aspect-ratio":"^1.1.1","@radix-ui/react-avatar":"^1.1.2","@radix-ui/react-checkbox":"^1.1.3","@radix-ui/react-collapsible":"^1.1.2","@radix-ui/react-context-menu":"^2.2.4","@radix-ui/react-dialog":"^1.1.4","@radix-ui/react-dropdown-menu":"^2.1.4","@radix-ui/react-hover-card":"^1.1.4","@radix-ui/react-label":"^2.1.1","@radix-ui/react-menubar":"^1.1.4","@radix-ui/react-navigation-menu":"^1.2.3","@radix-ui/react-popover":"^1.1.4","@radix-ui/react-progress":"^1.1.1","@radix-ui/react-radio-group":"^1.2.2","@radix-ui/react-scroll-area":"^1.2.2","@radix-ui/react-select":"^2.1.4","@radix-ui/react-separator":"^1.1.1","@radix-ui/react-slider":"^1.2.2","@radix-ui/react-slot":"^1.1.1","@radix-ui/react-switch":"^1.1.2","@radix-ui/react-tabs":"^1.1.2","@radix-ui/react-toast":"^1.2.4","@radix-ui/react-toggle":"^1.1.1","@radix-ui/react-toggle-group":"^1.1.1","@radix-ui/react-tooltip":"^1.1.6","@supabase/supabase-js":"^2.55.0","class-variance-authority":"^0.7.1","clsx":"^2.1.1","cmdk":"1.0.0","date-fns":"^3.0.0","embla-carousel-react":"^8.5.2","input-otp":"^1.4.2","lucide-react":"^0.364.0","next-themes":"^0.4.4","react":"^18.3.1","react-day-picker":"8.10.1","react-dom":"^18.3.1","react-hook-form":"^7.54.2","react-resizable-panels":"^2.1.7","react-router-dom":"^6","recharts":"^2.12.4","sonner":"^1.7.2","tailwind-merge":"^2.6.0","tailwindcss-animate":"^1.0.7","vaul":"^1.1.2","zod":"^3.24.1","@eslint/js":"^9.15.0","@types/node":"^22.10.7","@types/react":"^18.3.12","@types/react-dom":"^18.3.1","@types/react-router-dom":"^5","@vitejs/plugin-react":"^4.3.4","autoprefixer":"10.4.20","eslint":"^9.15.0","eslint-plugin-react-hooks":"^5.0.0","eslint-plugin-react-refresh":"^0.4.14","globals":"^15.12.0","postcss":"8.4.49","tailwindcss":"v3.4.16","typescript":"~5.6.2","typescript-eslint":"^8.15.0","vite":"^6.0.1","vite-plugin-source-info":"^1.0.0"}) don't match specs in package.json ({"@eslint/js":"^9.15.0","@types/bcryptjs":"^2.4.6","@types/cors":"^2.8.17","@types/express":"^4.17.21","@types/jsonwebtoken":"^9.0.5","@types/node":"^22.10.7","@types/react":"^18.3.12","@types/react-dom":"^18.3.1","@types/react-router-dom":"^5","@vitejs/plugin-react":"^4.3.4","autoprefixer":"10.4.20","eslint":"^9.15.0","eslint-plugin-react-hooks":"^5.0.0","eslint-plugin-react-refresh":"^0.4.14","globals":"^15.12.0","postcss":"8.4.49","tailwindcss":"v3.4.16","typescript":"~5.6.2","typescript-eslint":"^8.15.0","vite":"^6.0.1","vite-plugin-source-info":"^1.0.0","@hookform/resolvers":"^3.10.0","@radix-ui/react-accordion":"^1.2.2","@radix-ui/react-alert-dialog":"^1.1.4","@radix-ui/react-aspect-ratio":"^1.1.1","@radix-ui/react-avatar":"^1.1.2","@radix-ui/react-checkbox":"^1.1.3","@radix-ui/react-collapsible":"^1.1.2","@radix-ui/react-context-menu":"^2.2.4","@radix-ui/react-dialog":"^1.1.4","@radix-ui/react-dropdown-menu":"^2.1.4","@radix-ui/react-hover-card":"^1.1.4","@radix-ui/react-label":"^2.1.1","@radix-ui/react-menubar":"^1.1.4","@radix-ui/react-navigation-menu":"^1.2.3","@radix-ui/react-popover":"^1.1.4","@radix-ui/react-progress":"^1.1.1","@radix-ui/react-radio-group":"^1.2.2","@radix-ui/react-scroll-area":"^1.2.2","@radix-ui/react-select":"^2.1.4","@radix-ui/react-separator":"^1.1.1","@radix-ui/react-slider":"^1.2.2","@radix-ui/react-slot":"^1.1.1","@radix-ui/react-switch":"^1.1.2","@radix-ui/react-tabs":"^1.1.2","@radix-ui/react-toast":"^1.2.4","@radix-ui/react-toggle":"^1.1.1","@radix-ui/react-toggle-group":"^1.1.1","@radix-ui/react-tooltip":"^1.1.6","bcryptjs":"^2.4.3","better-sqlite3":"^12.2.0","class-variance-authority":"^0.7.1","clsx":"^2.1.1","cmdk":"1.0.0","concurrently":"^8.2.2","cors":"^2.8.5","date-fns":"^3.0.0","embla-carousel-react":"^8.5.2","express":"^4.18.2","helmet":"^7.1.0","input-otp":"^1.4.2","jsonwebtoken":"^9.0.2","lucide-react":"^0.364.0","next-themes":"^0.4.4","node-fetch":"^2.7.0","nodemon":"^3.0.2","react":"^18.3.1","react-day-picker":"8.10.1","react-dom":"^18.3.1","react-hook-form":"^7.54.2","react-resizable-panels":"^2.1.7","react-router-dom":"^6","recharts":"^2.12.4","sonner":"^1.7.2","tailwind-merge":"^2.6.0","tailwindcss-animate":"^1.0.7","vaul":"^1.1.2","zod":"^3.24.1"}) + + - Done (0.2s) + +- Debug Info: + - Command failed `pnpm install --frozen-lockfile` + exit status: 1 + stdout: + stderr: + +! Failed to install Node modules +! +! The Heroku Node.js pnpm Install buildpack uses the command `pnpm install --frozen-lockfile` to install your Node modules. This command failed and the buildpack cannot continue. This error can occur due to an unstable network connection. See the log output above for more information. +! +! Suggestions: +! - Ensure that this command runs locally without error (exit status = 0). +! - Check the status of the upstream Node module repository service at https://status.npmjs.org/ +! +! Use the debug information above to troubleshoot and retry your build. + + +Timer: Builder ran for 3.429800265s and ended at 2025-08-19T09:02:42Z +ERROR: failed to build: exit status 1 +Build failed ❌ \ No newline at end of file diff --git a/numerology.db b/numerology.db index 35e3a663af93114cf065c882d68540c87829df0b..e69ef0c6d45d9bd56ddb82c539336268d58ca531 100644 GIT binary patch delta 4402 zcmbuCc~nzZ8o-m61wxh^Hj#o5(V4mtU-m^9v5JDYAmA232_%sSk{C!_rY%qnC`%0m zxoxRcE3Rn4#_|yNp6PMgnW;F_IqjKKYb^w@GcH|b+H-W;`5p;^%0DxcbAIpU-TU2p zzkBbu+*f&Jh*b%AVuVr#Bj_ClgB=2;y>Xg`BV|Zy!_JrvA~9DulYy!cU*r+R3EPD; zy_0*RgcUDygBY4BjzVEKmYd8a_9APF%~@VzvlUAVZJVdcjZ* zq*kvY^`z?ADyGWYK4~o>;35wLokSG6i#%SDq!K+B&C)Q()rsppIXgzYydjj$dYB zB4IbC3Y*B@pHvF2fWZU_`lnEEpVfJsWvIO7WvxsB2fFak$M6g)_X;xKAqY3SsWYnr z=X`I7#IH3Mh2eXJ3&Qag_U0*km0n5e6>6zQCc~s@ffI|^g`rKE*+JCw9}GwNSujYx zTR@+qn-9-iH+`mS-8^`%bO*z;z#Rn7Qa7wMD8~(RGrw`O>9vLMOBrZ_=#XfZkP^Ni z_>*7_s^jK7F~hGq*fIc z7N`{pQYkZQ3rJ<5Tw^Lwl4|H-Hknm&g;qVXHF9;%$O%go3YB4`e$2_2@dJ~xy?2YF z*#FgeH=V37h`H!X26}}4g&v@9P(S)|_`JMi?@@xwVKJFpZd3nW2`dEkc!N9?TF)UG zxGW~YA?p1_oxiB{7km80Zhuij7i^;1U%36nF4%2G2x?@&lz&By=oY$!-b1bE@91N6 z%o}^qi7I%kNTR^F!%8&pS<%FH>n3aIMxs816-Df@ZZ%tpx-r$YWB%_M71{lGjG8e5 z)uRIL#{zzZM4vK5pNhUiVk8xyC1?}cjgF$WVH%hTBkJ-wa>OHWqO6SLaLA}4aA=D zn@Oo$4XwM!ZI!E}IvHsoYQ}9P6;hoV)T$n*m4whDRcRCk!mS^-nRYR`+Cc0IK@Z_X zFEh|T(S39W^`V>SGjs!ei2i^skC;eVw%IIq%S+ zL%zL@zBBvqRdrS-)jQ33kVy6)qZJx#?Y>i01H;mz*0=cHI__)m!UBhCPWmqN^mjK5RCToM*GENk?)6>X z>1*3H=&2rP>GZk1gWmI4wqLJ`gxLph7u{#<607p&NO5dDI|g5ESbunU8OAR&VzEc+ z2wrmM@T;`^nM1xyRihesTKl`t`+Az`ZSCIaYrNQhzK!1N#@eBdc3*4jK+8E$l-`1& z%6k7U(5w1NYKz3J@oWW_cf@tXkIlbh4L?xd)w$(1n&N-)r{QOXNQfD$u{b$*F_tik z;;8%wTbfbJm8~2OFN?v;f`pOA3qPIU=7|~1=os48H#0t88lQ~cR@+tD ziqL^@4L(zwzwG^tjqf5hyc%%vasCVVEB3|-RA%p%Hq=Ery1_X^aF5#I1_efL5u{%M z-s2i9nU>r`!Tha3%ne7cIK^EOXCImrP#CTiV>ct9c9+B<2%_!#91DLq!?7E8&T`(M z;$}Irm^l4(+yd%sq9c)re>?}=U7j3eSeq_M=>=~1ds??(%%*+4ePq){PfZ!n`Ed=- zUzFN2Y(O`znPQpkxUpzXG@(@D_@5lp@yp%wqw%&heH8Y*!3x12O=Kgy|07oL%`xl)W>7t99sf@*fW13(RKnS z@fXH$!AgD9Mao!L>}1jhTP*@T++9P*UZW@T?8jTI>}Xv1($WbLV;cIqYX?tIbhB}3 z(iGf&HzOR;3mDt6>RwU|{wmq_2|Wk+J`N7cn}*LmWX98?P~qF%8Hg0JiltMBqaYo4 z=vXI<%$ta>FHcXzSC%Kwq(61&yqu4JZn4j#W}-mi@4AI12eJ}eL!atTXDjG$#UJQZJhws|*$L<-Z!M*84=c()0Oo_q5`l_Lh zH(_YF+(0hPykJVC)SafcxL7i{_FdemF@8tcXE--8sV~l%7BXq4Ttn?RZ~A1|Dd*#Z zH;r7X@uDf4n4Ci={lJu(XBR{&0=b<(PHxxm{eB3cQZtg>>8qNzQniSkZtGf)boR8}IknV6c=1%>oOSc;=+=F2BHB~qcFz9n z_Q&TwH}`q&bD#UHHR=lBwQc zNDWc&^?Za%Xl=0u2f4Mq^)mMx;TySN8EI!oI}yk&w_3A{G-!LLxZ9&AtJ7Q|Qps%A z=_s)0Itm<)BI|aCLe5GidM`O-48zFfVr>XF-pppV78aEjIAkhR%J>3?bde$w%Ae;8 z+|znLSK_Ho)?M)8F}6|7N`n|RnlXXf-OBXWIIh~-(6Oe9nq#x&wAWFoqdn4XGZb-2 zy2K=1LX<&opxXQtC*`GiA#^m)6e!I3+W3|t1s#-DJ8>+oF2`|ewFAezYCDcO)nzzl zR@)ecy;*G)2PIeZGh_na%FkB`s-?;+$}F;9(T~Bsr*QX|Oq2SXjfVCrBQGNZ47o@C zM#jiZGBEx&Uvmuubs7m?#2r{KkQ^zO6ChzZDYwa2xO|1vSCsn-hp({viZWke^A%S7 zeT+CSc+ywo0&$a*N#*IeH^cYf=< zJXkW3+gY@uponukJheYOEt5+^xy_cHMV#%y*~0;;NfcQ{ij`y!IYBOwFI59P=bqB> z2fjhuEtBi?QSouHMlPp8(;Zsn{iQQ|P5EUPrVB}nn zuhknlr~g`nLIUnB_g@G(V9aajSbrmH6&b z8@~BW)^Mw2v3uY3o!kUD-^Y;O_OzHhvjA@(PIw`==uv%rA_q#%O; z2!tSzLog^n2`b=$fEq&J33w8I0HH7eCc;w?29sbiOcDBShhJ^`uRhglirPEP5ik`r zFb$@|40sx5!Yr5#&%hj*3-e$;L_!oqgBEn4hZu;3IEaS?NCX2U!2(Ezh48F!r+JZj zOm+l$!73>07mq4g6TR28_-+-FMBp08fOIiopj-#*VFP5sM#usqWJ3<*f*CBZ8S)?> z3ZM|Sz*Z=NVkm)9*aq8^rk6VNN-C$%pH3J2IX9Vh>^HBZ5v_$2sis-^S?yT!Vpsx8 zVHu>rbFds%Kq@>BFThGz1!?ditcG;RfHkld*1>w%0GW^l8^H+KV1iAM1G!)Z3v7lw z$cF+bge|ZYil7)upcJ;jcCdmC%D@f|VXV3QFS+3l61wqWX3+RDgD&B?Q!B;HtnbXt zKFJCl7mevWZSIlD#ETnfYp5(#i0CzbNrbzjJ4VP9-`arh(oa`sv=#4htd0IrU-53x z{f4pLMMS_Na$BJq=-NHlgnq@p+1ROejS*_PBTO}f=IcPf`u2f>j`dX#nHXtidZVpy&iEKUAmX?z^q-Bkc|x?=^$}q=(;HUP zvMC80j2N!e3R=Hfl+UW{MOnO19H?#lMbZSST4+h9wp-3+ zlLzRXdkzhp z`}OGgqrSGD+OtCkJ3LLVdzv~1y7r-u;nS_2?%lqp_3wJwQ-93!X1(X^Vb41qgRgcE z*S33v(?dtAhq@1Xx&<12Dxz~1=GwQ4Jvwm-;wFU+*vka$MWU|?2zjfdx?Ih$VN=CP z+s5=~)43nJUJAxHbiWUJaVU9%Z=2-1LfI9`Z_~_F%S-h0S<*y$b$F$op8C|aR;Yj8 zvRpzxH3Uqeb&;!P(nXP}a(bc8nLKTzt8KXBgg7I6el>LX_2Jf6JY9RlpWVAhUOwbG z_6|KAnL1PZu-OGV*wpUnrUP#`i!WVw%Ku%KwB#A|i+?zu{LfEloGVSE5vwgq z?_aB{N_(1SthPkZo*VY3sHM-98-%b#BK@BaA8`Yv_w(Hu{DhD5G2tWjp)-2JNB&@2 zM$LDYo%%}Z2K7>CdA_3Dh*`M9HH)66t}WNDgaquKb8X<6Fzfr?Q`hEWvNNDyghh9gY0 zjEk(Cl#qNR- zPKH14d_uS%KSyGXkKVk0yR$v|;o{h*Y+VPf&A$3yfA?;6@1K8`nUlz@FUPGEabLn% zjNep#g$ObsCTwPm2oMmN>dCEMK-%%5p=iLJHoLOXEsA*XRUmLLaL?p<& z5EEt`=A~Rmyn34-XLI*}dB|j$8OvR<9{0MngAUnMNTL}XI1RaC{cw{*o1ikVkc68U z=Ei55SSCP@A2!0+gBrA;69ekZmK(ji3ClsH5)+`9s!fmsV+DIJYH<`NFjzDxZleAP zk1EvYxBPiE71)mi8qkhzoL536WZyN9%8LRWSEYdtn4>+D9z}GL(#au{q^AmYHR{lc zE}T)(2K8v;ura!(3-&(LqYWoaIrtHF_d%+{@D`ogOi1`+bjsYCl40Ihj(D7^nzBi9oMFj zsvc%G$lU)(04mPJz`C(fnq~9nOlzi1S$cHAn+@FOGHzCI6kwWc8Exgzr5@kh>;3ILb_R2z;^mQ>GZxWV?_pK!IPA--H@%7K)T(oNN=m z1+K~}3cvkh3(&3r#>pnhK!G5q$#E%A0i!gKnPrn>(xCzdnFw?A za=?41c}dKxb8pi$sF`f@eUtCg53aY*J$0&1 zojP@@{<=-+d!vi*%*xK?z~cadPW{U zd!cr&I&F6PjCkw(*%PgECoV7~PhInzZI;e3dCl~RO1V-KC)dX*3{i4@qDG!5*WBG? z*Q^!>20TmzFe;ObemrMP)tcuer=*QBB|M!lW~ND>vT(U7W!%~sw$aa6moJ)~ygYr* zEc1fZ85vXND%LEUp&h4~JKLXuDp8|Jl&kL1v`P>d5W%ucviq}Kxo+ZWy*hL9oU9q+ z<|`IVU!Ok4G(TnB{N?M%En92SPMI)1dGzF&lh(~mOVd2JAaljsS##4;x{j|fBq|K| zXj;b)42bKh=GCilw)PGcn=DfoBp7GTUKnptC>M?&y=?t7l_EZM{`%z$SFcZ1jLTHb z7&F(TUp{t4!qdt*-fYe2N$WBuuP~3DIc?tf2@9;LPsb-OvM!vIkulCXY1+6&I_rwL=CoNUDQRrAUG&&^QYgU>yh(B%34 zd*R%a8-hDM|L3s~vKQ#$0Qv;oKnH$C7t^oOf5FZ00&VZh*YWPT4@6@A!@Ldy6^8O7 zct*}x1--1Q2RgQN)wo`gceI;scA3V1)+{b9NV;$_d)_HBi@(rfaWIeHhqorvnvuy( zND=5a>6r;*CnOAbrF0YVQ6Zr#1L)q;{nA)TgJg{OZSewnTj-6@mAE{!LhYI2zyMy3 zh zwOBPumELEmO6{Bu-xRM>X%_j+sMBX}sn{Y1Zk~X06<8(<;>plU$*(V1r4o zP$+FiIbKX=z0IoA%T*SIS)s7%Y+939ZP8iHD!Hj+bi!4Ws8A=$mGK6hx(iotduEWA zD_^5GEA?`X&7!nh^eU}Er#0yQs8Y&a76NOe%}jVpEvadfXcpjm4r;Dy(X? zQE$^~eGZUtMGv7&RB7Vn@~&LH?U{jIu9VVbHK>gm3;t&@>$D1kLanhIjasWsqg9x6 z8l}cyFzHRmORhjkGzN>+h)ZIzsI?}GNvl!#=Bk;4u1T#y?-Z}n`*CIc6WgANM-aQL zlt!yH$!#iw(x%XBbXK`isWhvU1|1Hrx9II!)V|fMz(tm8%vQ5WuTkS7m@PVmLa(st zH2O{rvs_iWM1>|^t<`sGnB~g0XX3fTan+fOYFs4Loy}^}Tdhj9NoiA|uyU)xs#RFb z8nex2(3$NvliX~z>eMQY+9J0qv?_~6t1;=-UFWLO;&kKH^1HZ__Dno_IIb#-++;KA zRBDY?r8isDD!oE)QkmpdtyXSOT2uzD$$$)OHl0psu;`UKgOx^7%G ziE4GcT&?RqSJIw|rw_+fVKta-CX>l()uYoppju-2rosr4qaTx(UM zX=}|kjY(~>Xe~yQ!j7%o=Ss{qUaK_R%~he!#B+z^ih9#3tp=k)D>un478Js!QD_u4 zt=wjoYm7RaoI;~Vd(~k(h*v56=89gz8)cyHBL2%4c)8wN{$+IawfqqJ>wpltEr9+9eT!~KpZ+oZ zXZk(*H}soy8#=W-+HrYCf4h*+t+DFuP(I7+*}rwnC>`MC=i!j0l{px^61?e}${LF_R1@`yjiAqH~7+}Fd| ziHrN!9!|s#^Fv+M{XCYC9i@v4vi~3-)YSzE*kOK-Pa!Ua&yHgMxlV%Ygz>@Xu`F7J z(Wt`HL#xoJtSY6}Y*v{p=%#gQtxjXpo6u+L3~H@aVN|KrHjBZAKFKy*Y0{d}@8Br3 zf4o)yRS(tcZ3XXz(9VDm=_>*B>lio|(5vX#w3hBG{YH9K`U>vkBT{=L|8btrDR&Dj z#N8kIpZ}rVA9|e%>uf^0KlDGtgZv)az233&tPS*g+Tl8VN22H+4}B+>@E#9+2aMpJ z4;2fzgMfdJr#^p8)+o}aBi5O-SxdY|qg#Z}{G;KS&M}wMTkmX1xlb4w5hp?lA^!Tj z?yZO~3Rb-{avGcNO637`Bb`czNiRyRQaP?sq;#B0Bo5#a68xu9i8@62-W*jkSBONC zi0D3j`y!DL_D>bjfA!mujk%^96)-fR|JNFZZUxVTnN?w)?YIVbXY4-l)WkSw4$T z==&ml7_#Ow1^MlVPb)A8jFYS46gs6UQ6+aaZgrh&SYb@Vlhd1WbIBh*)OTyr;W;*q z!ZGaugQ5ch$e@(#+%`|mF89u3uKWfCM$~a~1^(PU-u-gC2|RH?aGzmbow6y8yRO;Y zT;;Cb?=IfNl$3TAf*ohnJ=$=DVE?W6`u_0WeaHk(<5Ha~0rWTYm-KD=CherJbR3@J zr;}q)#2$}A_IMPq$0Of+Jo5R$I3_WZ&J-$`ULap$_^z5W6QRGE2yxsmB=*I`Oo-YQ zL_;Ff`Q2(~wu7_j6w|oTRk63dw2s-{)J0{T8H8`9*o4cBJ5b)uqS{N_Fw|9|@(pov z{DIRG#62Ha7y&g{WBExIHq57Yb~msCp(U`pzayC*e!#uAxKSDcFQ4N_ND_#Vpc6uS z3rusooTTF=G}QJM)Y3tM#l3>V=iYd$u6D+6=mCX21pL8lLc1i>nwgoJzB03WjvFzE zI4AP!b52*7owAVwzK$avD};UxuYu1sj4*~a(qg>L%0p`mT$(3_%k$_Y`u)FMf8n*d zx&_4aL+QGPstG6tUqltciGR}b9(9KnocQiD-eB(W<^bFm@6#ppX8J1KN}r|6=}+i4 z=%Wqq%oC*2A;J7G%4A%hio|;YWp>$)8?!b#7cD=;5=+kqz~?qW@48C)F{zX@Ps|UM zx07Hnh=onS7Wxskn* zbgQW1`jGY`8{1EoGH1>(hmJB8wS+wTsB7Ov_p!S6%>_(h8B<+Jy5%*vDz-4K`OL*8 zoNxz47=h3@7ePw`>W%B{z)P0mK_SMSL!!O^`70bO`-^h5{s2XLb8ISwS}m@zfm zJ?HCi>fDOJJ40oW3H8mcx{EB|BhCx^JTJ8{Tg$oCKuvLqcAY-x-e1jJ+{M&fbd3CC z#UN$8CN{>Mb227T85@Hti%C?GmiEmhY>TV5J|K<0ycdQ-c0{lol?Z z5{&2L1RYEN+^c^blV9e%u+3Gw6A4{g+FaZ6T;=s>1guoBI$kyuZk!gF$2*&LdiJC3 z9LDM0V$H-=c-V9F2+d#U zTv(hSt6qvCpwSa~o0~k<)wu1PP2142F!pgDt#MW6c-qRDqTQrJF|O8mSKTq<9N3-B z>5Oa&R%Ftr>H?G3Ob+e*GBg#O5L{U=HVN6?1MkRXTlr*R$hLC4`=JybdqF&BC?^6+ z+n&9}we2{WIhy$P5?6jHiiWywKd=eS4euSsj|RdFrR>k_C_`1UIVzw0=mqZ5Tr&}= zsKmAXFeehHV>qLdJxZw!F!M$6Lp%k1rjkX#(T!qSs)&uTuCy#MF0-Q1${|TB3wIP; zk-;>zOa}QjaZi!+!X8(}3CDX^`#|~#S(an?mDny+O1Z=Sn{Ze(LeK*il?iA#Zjkll zqkn*u;j(@ZWf4z+$a8|OtW6~S$b z_;JUIYhB6Ja;UM3!(nJ0QnI2Z4o9Z$oo8W5ogf099xls)1ih>)6*s?Lk>pUp1ITxp zN_PEGm%TQt0^6U3(e;8}_n$pn8!iil3UfEjX;E`JSvX7`j`BQB=2TuO2zI>uN{FCw zk9#MSoX5FVmJ0Iw`RiLJkB!O9vaX0pjBz&RK*eHNBq8nrl_LZqNAs(pB5ZEY+rsL; ze2*Z%i{ABeN6yu7c-=0RIrid;tv@g5DZ+EfmA{=OsMN^v;FICqbYPG}Ts;c&IIb^C z_LN%IQ^Yi!aW)-h$p++zSHq1FGL;CenW-*?$j4=JF}Fj|Svyl{Jo+U+?d=8>m?>4vXf7BBse59yJ%dUJy^&{PXUnBk=BC zK{PBwi|miP!c%+9l~?F&+sjnv6QY`C*O`q>V>Pq&xMRuh)M&`NN6Dsl2$()w9L6Um z%KQCbF}MAh;u74=M9@Kx;&Hbn+f`J|6l}(^(07q-Q+LdjThyL&4jFik<}&$v;LLpS z?3uXvae~;*>paeE^yF+OuC-vZr!B{ozuVJt%2jZH$*;vNi<3fH;tML8T$QO)LX4byZ4{V-e_E9)2M^GU>2BKN(AT}{Q#rb42Y7Kdx+c_xn>a~xCXu~X3BVQGHE z?jz$KxSJgqAD|HAII1q=j#(sQP@B6ixc2UMHj`tWIm|{t>>*4TTr47|NPe+)bE40QiH%uqHKxIkZGwj!NpCKI)~CeV#=Ev| zbrtRRYJxqo$v}Q8#FfNJ6M>qW+$Xnrw$z{~s2=yBR&u_#9Ppgk58v$<^rkd&$C9^F zprTUH$7?2ayx-sE#r_x}A$psjA4(StwTA?wAZ5Rx6{a2*1W_7=qw?JpA%c|&gCHrCjVus`$f`r*i*9!6~Z(ecD7WorZI}SP=|U) z2{_ZhD9zKh*03qvQn&-a0~wvtt4yt5*W4(oz~UOf_Y>avU+mXMFP|d z`?!qKL8GdHv!77XUW zH=6{GA8i^hI10~BcEq1Ydr-mcZG!1AeUvPs!%Z}Nlq#jV3K3Nh3O7O%U~~BP-kpOp}hAEt9J>O z^G5q;SH9%b2MTD=3ZKJYU!^y>_{zosy|$DRn1Uy`5FogK;6#nU{-r8U+B1L`#=;Xh znE^TN(F3q1N>V&7cR>d z$=A9n&1fbBcXPom%P>x{X5drEv4jo}?NopQa-Nb68_NbkiJoVM%0~BHoMX#x214s%nXDH^Juy$k#$;JnE?JgtAxg+8 zg4;`Ez4&;hJJLnr5dW$~l(Zs!B`P*OgHr`lP=hnZmuv7Xj4bOC^KxTG7Lww5>}joy z^0by?hbWS(o-U5!5;(`(qFI7CUA)4f2KDkcC7(wKt6~{;xR9))Yo6TiGn1*3X`@t$yKG%W?8C)47i0X*L3w@a_ zrl6SFa@r!^kPS}oBWA{IdWBB;9w{y^xi7_aAKpzM)9k(O=6d(GQ|>Jn$T-#KT~Opr zTJy_YyKCKNTiu5Vvfu(to>S_**~+0ZOw0)Zn?pF8HjyDtZo}a`*)QQi!R4bQ*R80< ztQFVPgX3N}iz|u;5C-OWCDHQIaRNgGN6T@-)7-Q91UZD+jMkARjR^B4qppg4oHb`0 zjw)$H1m4~~QOv z1J0*??+&7S%&icd*;2q16uOR`a5Wu(OXma;qsW9gl%)bsv_l+s!kT60ZY^{+k`Tu~ zl;c8~cBpPYP)c&vaJW5FEGCgYft9-8bVFJK=LgmW#NLh5E$f2QjlV2^GiloC2^>yW z^pkM9M_bljXnAd82Epk<=~lc3ZXh__S-L0j(0N#B?T*%IjkBK2`255uXDX#xDRMYztC`bp5RG3EQH^OTA%u?HI*vrj^N$A zzUO5)Yc;V-+_+D&w{rns4 zwpsr`;R(LC0uj(qM9iJ||1&t(A^1yBQ5pXBXm~PQc9rhC4*U92v4<)a78fO~+KTdkJ#ZOTY5PMtL7v6q~dJHZ<8`uwuZwqq)7E=lEvR2d= zOAX`jrhF)I?hl0E}Ujz|JlBXc)@4`Po=zj}m!t_4;$&fHc5(1UI=zZ|$KpeVq zjARgOkLLFTv0m~F+>Yiy54ZG^!SL;u!dJ-rh47a_*e~i6sSv*TQW^!fP1MV9LPE>P zmRRqv@zJYaec`J=1aHFj=OO7U;p=c~kYpg{R!4}?@2w7ufSPgCFc{E}Qh>`#z{LEar{0+K5Dt70X=T&K}-l80c@chXq=sMJ77Pc(>k??`(=>tt$Z2Mx>f=66!U zQ`yOrX{dv!DU=pTRV?XHs14<#8=6Wz{4?$c?H-?LZEJH&lDaI>MoI>e@xc+jMV;{JajC%b@*vXbPfKfB3&>n0rp9MJ^ zOCU)^>j^Ph4{HgLJY@WN558}vEOC`cBqqcPKh8CIFuIq7CFaa19IE0ZJz=R^>Q6k7 z(D|ECK@CJd#Lt4;;Sw6eL84&9WsZ1S^We5e+82`kfzHfI?rQr|LP+vRLxkMsX$uy` zz^fiH=BQr$9#GYb-xs#ero@omE|m}mOhdybQgna8qJGfwcZx;{kF~=wDCmvuCaI4k z2HtF!_JEKOk&-x25k%dT219a)C>YL$h{7OgHWdQr)L6Ji_b7sN^7OB2%HK&UASImh zaU%5RSWjF0B|47scAWV1PjJ7YQDiLhZP{AGE>cv^q!_c>{Wc6^)hcIWd zae^z?tT2(pK^q%mv1XbxQdebRnGNGrUnk-=FrD60?5Zi!!li#w;e73e4RHPG;4nD- zsr1o49ikDa8C}Q-ks-0{(3YH9zT;~AjhS7JZ(;dAVih7AQcYJ`PFQsxw z=`9*E!W$WuS2Gxj9m3K}q5IS+4W|)=+*uKPTLYadTf@pHm7d0Oxb!FKgbp_~ax~=_ zbpL7K7&s#h>vAMQ$s#XCzCtLO7O6JG#ypp5OkaYRl}lEoXQp}=iR|M`W2ioMwE^jw z+9F&gQYphiQT0h&T|z{x+u!PEK0Hym!q>UReb)_wBjddlLU9zOyNFfxRy zSKd($u)r1$VBw;079HGye8SdQjTvd{mSiorvZ*WA8)l59O_?f0HVC4Oio+DZVxAH%PQh>^@q;6c-@G=01`O z1%pKW?aR_JgY0hY+&<@m5rjQCM3?1HR6wTFScX6nB86l-6c;cDv9#3cIY*T2uf8r| z82XM~Bnv@uS49niVK_cBW&3Ut@8=eAKo`;*Eo)O*-Fs^(EHp$QM;7S9s*Ah6hHzyI z7evG@IG<8xYa6u6DaC)@45$8bGmO~)^z-5{fz6nj0SYD6dl*x6ggLa^(^iVBp>Q^y z;DA)D2BJH|?bv0xmktqy_a~5IQ3-Qq7lLh0%;lO$jhD$k&OyTPmXg}w#f!LDzB7vN zc!@-ZJ7@#``tYK_)+Zb3SMKy=@gn{o0{DMGyy$m)droOs9_B8*J{^G3##3ej7_rI4 zzaKHuCdPE&HXOqA0}-Q{aiS4k#E7Us{)-_-(BlItLdzitXy+_CLy(Yzr|@_nThO?U z#bdBUQi30sr>`Lh7Ut~4t;Mej>^n?{$C8&!@F5jNs}ZHkFs?K&M}f#$HvL1YAD`S@|3>^Md$V+P;6&IrSTYd4`w$OVZ!l6s zN&3UB)q!C!DvTcqEgw^X@G*svf%HpZB)s?$We5FDp&b5OB^d!VV@Vp48MqF(uj5`vfJ} zwN&!xuA&ZcPCtj@q^U(S8?G+pP2)wg4j+x5B%)oA0^7(htjRNmym&WKVC{kweDuWQ zB^#c-QOqF)#Xkut2nrptVg0xd;t5h9rW^4p5EG=}6dg|XW*&Ku^d5M@XsL1TmW@7=F?QGvqUi;zd6ZrB09+d>M+TX-9?L^E9k0o+e)o$WSGo(HLIOl+2-}K-#!=a;C z!@=F2xo(9iodBcGhH~N@tj3k7O8ktW752bE@XD3Uu<+61QYj+C@>Dklb&OPrNmOx}}dt9Y8Oj{ln9&u8j zcs2A9ou_XgruSL~^0E0TMUBYKG}UAyXCXPY5qMsOcK62tZR(os*fvrq9D z=bmy@J|Wuo9&k3+Gv&4IWvw{E-J-a5UceFX5vr1DJVL6Xh?HWzaAy@lim-ZtH0CD@ zdS+A*C+OwhOAKbO!v3w|ZdfQCNtG2r%R*_4kX>K6j<*yl>x(xe{aLL=o!~3RHB_~i z5ww)ECvsE9R$uWDuWEAd&qh2M8@USgeGR3@?BMWG_gf}nyR1DC-4>VJuNz!>Q!*_E z-(l)pcvl@;JKkO4+DHny&Za}Ib2(r<$)5x9bAnevR3$wEru;5+Yz#S=eD=(NkfEwe9$Jbe^2;)e9&Wjf=fid85%9dT4`tJnU^I~$g-SSBAuG% zw}UZe^{^|!)$EDNSTq{Vm#a~_bI!Tyo6)#Qyo>vudt<2UrbjAn-y;?NL?N2b6ySS* z#Y{sB7~cwgffee#1N2-zE;1w;rC}@ooiaQbbC(o~MZx`kA>UTDD0t*hVzpb_JlU8t zG$AuGV~m9{A1fe5Y<~|5>63$cL+x3<2#tW~l05fQIqaJpqzU6}fEbPcsy%F$#z%B> zxSY53`dQ<Vtuhwp!}wG>=NE|G)cDM1t1 z#aR7haI_umoqH({%i&C`*CNQYipxoY*+fnPydqYDT!{QNhn*KoTsbxPk-NdpMCYgw zZt-#D@of?e#M?LRaOIacn@?fL-hQwUUpe5mJ;w>h#n%Z2cVV@;faKOCEm-m(`Y1ex zM~`b~8=gK;lN@x`8^Uu(>D?i`fkX`cA-pnh%QL@Q^XNu4gcp4lAo>hL_#2|=vw?Xs zSpW~ee}Mm11pKWpiQl(9_n#S%YBc2^0a6AB&PM#V*O21Qnz zT_|$HdQ&)aNfH%~Z&x~-ut13Ar{jn+6RpBNW=A2^E)R~1;})O1J5k=i5&D(`g8_7$ zu02QaZ3?Ek9v2*D=z^kp<&oMV>m;{0n-7vw7>b#a8XV2XMmVVpillJDC8@!w5dNy9 zH^>Nrw4;t@giSl07xuyzEum46Jqr=EVXdLbV&-%if-Oubv0i9>CU{7=uLa>GY(%69 z-`+qIMc_;t4Sm}}!@3fsqy>kK!Z-cg`OWwqB;Fte(vdetP9MY@G$Cf|v3tDK%Dv2! zkFSC>LiKMXFTspMeDN?`CDbo2MW=7aCe$qs#hEM_lYM&wR{vHK8HPrT?hbX1WC((J zUEk$7(t+ChEe*axg}S}(uu&s|bXcTdW412Qc*CDg#xC!7KznyIzO+j;uGIuRS^E4^ z85fP0{G@37!`e?<=6=?CkVNAW`Yc`p^GGy)gzitaSsvD}?jMsU(U&6QzfKCbZy*7& zl&&N}c{v>}qDr`+{9dtn>|-#kchdW#!#Nu3_r&J3wQhUVXgantA}{%Yf%?V``(E36 znD1eENS_RF?2|_}V7+gW)NV+`?+9sB@j5xi=_U7$(|?I5zWd0!M5QuOu5AeIBOAnv zEgy0AnMWVIfO{DKn5d&L=n5xCv@a9LNJ#2Z*R096<3sI7R$>U%mL-#dlUv1VfA%KJCqpBWg!f);A>$Kd2T)go#~cWB|? z4rv7X{cVGIUKH;Wf17BoeeKZr+WF`2i)&}cXtrU6HIJa^_Wm9?gs1O z=$#`+>HAd1t$l3-_I~C8toMt3J)i^D!#65Ab=~*U2XFo(bJIoCb=m`1@4>eNI$xcC z0PFpVz8!EEte57$$>;n@757b9G=?vN6%Sy&2j30AYV)t_y8-ur^;Y=f6FuI4xo&Uz k;C{sDAHaI0+aG)h;FtKC!>yh^V2aL_bWB>pF delta 41 wcmbR6FKEU^$A%Wh7N!>F7M2#)7Pc1l7LFFq7OocV7M>Q~7QPn#Ednz#06^ak0{{R3 diff --git a/src/components/AnalysisResultDisplay.tsx b/src/components/AnalysisResultDisplay.tsx index a680f85..d0ee29c 100644 --- a/src/components/AnalysisResultDisplay.tsx +++ b/src/components/AnalysisResultDisplay.tsx @@ -10,6 +10,8 @@ interface AnalysisResultDisplayProps { birthDate?: { date: string; time: string; + name?: string; + gender?: string; }; question?: string; userId?: string; diff --git a/src/components/BaziAnalysisDisplay.tsx b/src/components/BaziAnalysisDisplay.tsx index 15ad68a..8aec65a 100644 --- a/src/components/BaziAnalysisDisplay.tsx +++ b/src/components/BaziAnalysisDisplay.tsx @@ -188,28 +188,34 @@ const BaziAnalysisDisplay: React.FC = ({ birthDate }) if (wuxingAnalysis) { // 构造五行分析数据 const elements = wuxingAnalysis.distribution || {}; - const total = Object.values(elements).reduce((sum: number, count: any) => sum + (typeof count === 'number' ? count : 0), 0); + const total = Object.values(elements).reduce((sum: number, count: any) => sum + (typeof count === 'number' ? count : 0), 0) as number; const wuxingData = { bazi: baziChart, wuxingCount: elements, wuxingPercentage: Object.fromEntries( - Object.entries(elements).map(([key, value]) => [ - key, - total > 0 ? Math.round(((value as number) / total) * 100) : 0 - ]) + Object.entries(elements).map(([key, value]) => { + const numValue = typeof value === 'number' ? value : 0; + return [key, total > 0 ? Math.round((numValue / total) * 100) : 0]; + }) ), - wuxingWithStrength: Object.entries(elements).map(([element, count]) => ({ - element, - count: count as number, - percentage: total > 0 ? Math.round(((count as number) / total) * 100) : 0, - strength: (count as number) >= 3 ? '旺' : (count as number) >= 2 ? '中' : '弱' - })), - radarData: Object.entries(elements).map(([element, count]) => ({ - element, - value: count as number, - fullMark: 5 - })), + wuxingWithStrength: Object.entries(elements).map(([element, count]) => { + const numCount = typeof count === 'number' ? count : 0; + return { + element, + count: numCount, + percentage: total > 0 ? Math.round((numCount / total) * 100) : 0, + strength: numCount >= 3 ? '旺' : numCount >= 2 ? '中' : '弱' + }; + }), + radarData: Object.entries(elements).map(([element, count]) => { + const numCount = typeof count === 'number' ? count : 0; + return { + element, + value: numCount, + fullMark: 5 + }; + }), balanceAnalysis: wuxingAnalysis.detailed_analysis || '五行分析', suggestions: [wuxingAnalysis.improvement_suggestions || '建议保持平衡'], dominantElement: Object.entries(elements).reduce((a, b) => (elements[a[0]] as number) > (elements[b[0]] as number) ? a : b)[0], diff --git a/src/components/CompleteBaziAnalysis.tsx b/src/components/CompleteBaziAnalysis.tsx index f3999d1..e675235 100644 --- a/src/components/CompleteBaziAnalysis.tsx +++ b/src/components/CompleteBaziAnalysis.tsx @@ -233,20 +233,21 @@ const CompleteBaziAnalysis: React.FC = ({ birthDate, if (!analysisData.wuxing_analysis?.element_distribution) return null; const elements = analysisData.wuxing_analysis.element_distribution; - const total = Object.values(elements).reduce((sum: number, count: any) => sum + (typeof count === 'number' ? count : 0), 0); + const total = Object.values(elements).reduce((sum: number, count: any) => sum + (typeof count === 'number' ? count : 0), 0) as number; return (
{Object.entries(elements).map(([element, count]) => { - const percentage = total > 0 ? Math.round(((count as number) / total) * 100) : 0; - const strength = (count as number) >= 3 ? '旺' : (count as number) >= 2 ? '中' : '弱'; + const numCount = typeof count === 'number' ? count : 0; + const percentage = total > 0 ? Math.round((numCount / total) * 100) : 0; + const strength = numCount >= 3 ? '旺' : numCount >= 2 ? '中' : '弱'; return (
{elementSymbols[element]}

{element}

-
{count}
+
{numCount}
{percentage}%
{ analysisType={analysisType} birthDate={memoizedBirthDate} question={analysisType === 'yijing' ? formData.question : undefined} - userId={user?.id} + userId={user?.id?.toString()} divinationMethod="time" /> )} diff --git a/src/pages/BaziDetailsPage.tsx b/src/pages/BaziDetailsPage.tsx index 8fffe77..6cbc4df 100644 --- a/src/pages/BaziDetailsPage.tsx +++ b/src/pages/BaziDetailsPage.tsx @@ -21,7 +21,7 @@ const BaziDetailsPage: React.FC = () => { const [birthData, setBirthData] = useState({ date: '', time: '12:00', - name: user?.name || '', + name: '', gender: 'male' }); @@ -59,7 +59,7 @@ const BaziDetailsPage: React.FC = () => { setBirthData({ date: '', time: '12:00', - name: user?.name || '', + name: '', gender: 'male' }); setShowAnalysis(false);