diff --git a/apps/user-h5/src/router/index.ts b/apps/user-h5/src/router/index.ts
index 58ef423..39bd17d 100644
--- a/apps/user-h5/src/router/index.ts
+++ b/apps/user-h5/src/router/index.ts
@@ -1,7 +1,7 @@
import { createRouter, createWebHistory } from 'vue-router'
const router = createRouter({
- history: createWebHistory(),
+ history: createWebHistory('/psy/'),
routes: [
{ path: '/', name: 'home', component: () => import('../pages/HomePage.vue') },
{ path: '/explore', name: 'explore', component: () => import('../pages/ExplorePage.vue') },
diff --git a/css/app.css b/css/app.css
deleted file mode 100644
index ddd9a33..0000000
--- a/css/app.css
+++ /dev/null
@@ -1,72 +0,0 @@
-/* 愈心谷共享壳 —— 品牌色、布局、底栏、二级顶栏 */
-:root{
- --pri:#E54D42; --blue:#4A90E2; --green:#5CB85C;
- --purple:#8B5CF6; --orange:#E8985A; --pink:#E0508C;
- --gold:#C8923A;
- --text:#333; --sub:#999;
- --hero-start:#FF9F80; --hero-end:#FFB8A6;
- --bg-start:#FFD1C7; --bg-end:#FFC8B5;
- --nav-h:56px;
-}
-*{box-sizing:border-box;margin:0;padding:0;-webkit-tap-highlight-color:transparent}
-html,body{min-height:100%}
-body.app-body{
- font-family:-apple-system,BlinkMacSystemFont,"PingFang SC","Microsoft YaHei","Helvetica Neue",sans-serif;
- background:linear-gradient(180deg,var(--bg-start) 0%,var(--bg-end) 30%,#fff5f0 100%);
- color:var(--text);max-width:430px;margin:0 auto;
- -webkit-font-smoothing:antialiased;
- padding-bottom:calc(var(--nav-h) + env(safe-area-inset-bottom,0px) + 12px);
-}
-body.app-body.no-nav{padding-bottom:24px}
-
-a{color:inherit}
-
-/* ── 二级顶栏 ── */
-.app-topbar{
- display:flex;align-items:center;gap:10px;
- padding:12px 14px;position:sticky;top:0;z-index:50;
- background:linear-gradient(180deg,var(--bg-start) 0%,rgba(255,209,199,0.85) 100%);
- -webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);
-}
-.app-topbar .back{
- width:36px;height:36px;border:none;background:rgba(255,255,255,0.7);
- border-radius:10px;font-size:18px;color:#555;cursor:pointer;
- display:flex;align-items:center;justify-content:center;text-decoration:none;flex-shrink:0;
-}
-.app-topbar .title{
- flex:1;font-size:16px;font-weight:600;color:var(--text);
- white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:center;
- padding-right:36px;
-}
-
-/* ── 底栏 ── */
-.app-nav{
- position:fixed;bottom:0;left:50%;transform:translateX(-50%);
- width:100%;max-width:430px;background:#fff;
- display:flex;justify-content:space-around;
- padding:6px 0 calc(10px + env(safe-area-inset-bottom,0));
- border-top:1px solid #f0f0f0;z-index:100;
- box-shadow:0 -2px 8px rgba(0,0,0,0.03);
-}
-.app-nav a{
- display:flex;flex-direction:column;align-items:center;gap:2px;
- font-size:10px;color:var(--sub);text-decoration:none;line-height:1;
- flex:1;padding:2px 0;
-}
-.app-nav a.active{color:var(--pri)}
-.app-nav .ni{
- width:20px;height:20px;display:flex;align-items:center;justify-content:center;
- font-size:16px;line-height:1;
-}
-
-/* ── 通用卡片 ── */
-.app-card{
- background:#fff;border-radius:16px;padding:18px 16px;
- box-shadow:0 2px 10px rgba(0,0,0,0.04);
-}
-.app-section{padding:0 16px;margin-top:18px}
-.app-sec-title{font-size:16px;font-weight:600;color:var(--text);margin-bottom:10px}
-
-.page-pad{padding:0 16px 20px}
-.page-header{text-align:center;padding:20px 16px 12px}
-.page-header .sub{font-size:13px;color:rgba(0,0,0,0.45);margin-top:4px}
diff --git a/css/decode.css b/css/decode.css
deleted file mode 100644
index 9d15a32..0000000
--- a/css/decode.css
+++ /dev/null
@@ -1,110 +0,0 @@
-:root{
- --pri:#E54D42; --num:#C8923A; --num-d:#8a6d3b;
- --ys:#5CB85C; --ys-d:#3f8f45;
- --text:#333; --sub:#999;
- --bg-start:#FFD1C7; --bg-end:#FFC8B5;
-}
-*{margin:0;padding:0;box-sizing:border-box;-webkit-tap-highlight-color:transparent;}
-/* legacy body → scoped */
-.app-page{font-family:-apple-system,"PingFang SC","Microsoft YaHei",sans-serif;
- color:var(--text);background:linear-gradient(160deg,var(--bg-start),var(--bg-end));
- min-height:100vh;padding-bottom:80px;}
-.wrap{max-width:430px;margin:0 auto;padding:0 14px;}
-.top{text-align:center;padding:22px 0 10px;}
-.top .t{font-size:24px;font-weight:800;letter-spacing:3px;color:#fff;
- text-shadow:0 2px 8px rgba(0,0,0,.15);}
-.top .s{font-size:12px;color:#fff;opacity:.9;margin-top:4px;}
-.card{background:#fff;border-radius:18px;padding:20px;margin:14px 0;
- box-shadow:0 8px 30px rgba(0,0,0,.08);}
-.tag{display:inline-block;font-size:11px;padding:3px 10px;border-radius:20px;
- color:#fff;font-weight:600;margin-bottom:10px;}
-.tag-num{background:var(--num);}
-.tag-ys{background:var(--ys);}
-
-/* Part1 数字 */
-.hex{width:76px;height:76px;margin:6px auto 8px;display:flex;align-items:center;
- justify-content:center;font-size:34px;font-weight:800;color:#fff;
- background:linear-gradient(135deg,var(--num),var(--num-d));
- clip-path:polygon(50% 0,100% 25%,100% 75%,50% 100%,0 75%,0 25%);}
-.p-title{text-align:center;font-size:19px;font-weight:700;color:var(--num-d);}
-.p-oneline{text-align:center;font-size:13px;color:var(--sub);margin-top:4px;}
-.pyr{text-align:center;margin:16px 0;}
-
-/* Part2 体质 */
-.ys-type{text-align:center;font-size:20px;font-weight:700;color:var(--ys-d);margin:4px 0;}
-.ys-dir{text-align:center;font-size:13px;color:var(--sub);}
-.bars{margin:16px 0 6px;}
-.bar-row{display:flex;align-items:center;gap:8px;margin:7px 0;font-size:13px;}
-.bar-row .lab{width:20px;text-align:center;font-weight:700;}
-.bar-track{flex:1;height:14px;background:#f0f0f0;border-radius:8px;overflow:hidden;}
-.bar-fill{height:100%;border-radius:8px;transition:width .6s;}
-.bar-row .val{width:34px;text-align:right;color:var(--sub);}
-
-/* 付费墙 */
-.lock{position:relative;margin-top:14px;border-radius:14px;overflow:hidden;
- border:1px solid #f2e6d0;}
-.lock .blur{filter:blur(10px);opacity:0.35;pointer-events:none;user-select:none;
- padding:16px;font-size:13px;line-height:1.9;color:#666;}
-.lock .cover{position:absolute;inset:0;background:linear-gradient(180deg,
- rgba(255,255,255,.4),rgba(255,255,255,.92));display:flex;flex-direction:column;
- align-items:center;justify-content:center;text-align:center;padding:16px;}
-.lock .cover .lk-t{font-size:15px;font-weight:700;color:var(--num-d);}
-.lock .cover .lk-d{font-size:12px;color:var(--sub);margin:6px 0 12px;}
-.unlock-btn{background:var(--pri);color:#fff;border:none;padding:11px 30px;
- border-radius:24px;font-size:15px;font-weight:700;cursor:pointer;
- box-shadow:0 4px 14px rgba(229,77,66,.35);}
-.unlocked .cover{display:none;}
-.unlocked .blur{filter:none;pointer-events:auto;user-select:auto;}
-
-/* Part3 今日锦囊 */
-.jn h4{font-size:14px;color:var(--ys-d);margin-bottom:8px;}
-.jn .row{font-size:13px;line-height:2;color:#555;}
-.jn .row b{color:var(--ys-d);}
-.jn .st{font-size:12px;color:var(--sub);margin-bottom:6px;}
-
-/* 契合度 / 分享 */
-.mini-form{display:flex;gap:6px;align-items:center;justify-content:center;
- flex-wrap:wrap;margin-top:10px;}
-.mini-form input{width:56px;padding:9px 4px;border:1.5px solid #eee;
- border-radius:9px;text-align:center;font-size:14px;}
-.mini-form button,.share-btn{background:var(--pri);color:#fff;border:none;
- padding:10px 20px;border-radius:22px;font-size:14px;font-weight:600;cursor:pointer;}
-.share-btn{display:block;width:100%;margin-top:6px;}
-.match-score{text-align:center;font-size:32px;font-weight:800;color:var(--pri);margin:8px 0 2px;}
-
-/* 深度入口 */
-.deep{display:flex;gap:10px;margin:16px 0;}
-.deep a{flex:1;text-align:center;padding:13px 6px;border-radius:14px;
- color:#fff;text-decoration:none;font-size:13px;font-weight:600;}
-.deep .d-num{background:linear-gradient(135deg,var(--num),var(--num-d));}
-.deep .d-ys{background:linear-gradient(135deg,var(--ys),var(--ys-d));}
-
-.disc{font-size:11px;color:#fff;opacity:.8;text-align:center;line-height:1.7;
- padding:14px 8px;}
-.err{text-align:center;color:#fff;padding:40px 20px;font-size:15px;}
-
-/* 分享卡片 canvas 弹层 */
-.modal{position:fixed;inset:0;background:rgba(0,0,0,.6);display:none;
- align-items:center;justify-content:center;z-index:99;padding:20px;}
-.modal.on{display:flex;}
-.modal .m-box{background:#fff;border-radius:16px;padding:16px;max-width:340px;text-align:center;}
-.modal canvas{width:100%;border-radius:10px;}
-.modal .m-tip{font-size:12px;color:var(--sub);margin:10px 0;}
-.modal .m-close{color:var(--pri);font-size:14px;cursor:pointer;}
-
-/* 支付弹窗 */
-.pay-modal{position:fixed;inset:0;background:rgba(0,0,0,.5);display:none;
- align-items:center;justify-content:center;z-index:100;padding:20px;}
-.pay-modal.on{display:flex;}
-.pay-modal .pm-box{background:#fff;border-radius:20px;padding:28px 24px 22px;
- max-width:300px;width:100%;text-align:center;box-shadow:0 16px 48px rgba(0,0,0,.15);}
-.pay-modal .pm-icon{font-size:36px;margin-bottom:10px;}
-.pay-modal .pm-title{font-size:18px;font-weight:700;color:#333;margin-bottom:4px;}
-.pay-modal .pm-desc{font-size:13px;color:var(--sub);margin-bottom:6px;line-height:1.6;}
-.pay-modal .pm-price{font-size:28px;font-weight:800;color:var(--pri);margin:8px 0;}
-.pay-modal .pm-price small{font-size:14px;font-weight:400;color:var(--sub);}
-.pay-modal .pm-features{font-size:12px;color:#888;margin:10px 0 14px;line-height:1.9;}
-.pay-modal .pm-btn{display:block;width:100%;background:var(--pri);color:#fff;border:none;
- padding:12px;border-radius:24px;font-size:15px;font-weight:700;cursor:pointer;
- box-shadow:0 4px 14px rgba(229,77,66,.35);margin-bottom:8px;}
-.pay-modal .pm-cancel{font-size:12px;color:#aaa;cursor:pointer;background:none;border:none;}
diff --git a/css/health.css b/css/health.css
deleted file mode 100644
index 9587bd3..0000000
--- a/css/health.css
+++ /dev/null
@@ -1,124 +0,0 @@
-:root{--pri:#E54D42;--gold:#C8923A;--wd:#5CB85C;--fr:#E54D42;--ea:#E8985A;--mt:#C8923A;--wt:#4A90E2;--bg0:#FFD1C7;--bg1:#FFC8B5;--bg2:#FFF8F0;--bg3:#fff5f0}
-*{box-sizing:border-box;margin:0;padding:0}
-/* legacy body → scoped */
-.app-page{
- font-family:-apple-system,BlinkMacSystemFont,"PingFang SC","Microsoft YaHei",sans-serif;
- background:linear-gradient(180deg,var(--bg0) 0%,var(--bg1) 30%,var(--bg2) 60%,var(--bg3) 100%);
- min-height:100vh;color:#333;-webkit-font-smoothing:antialiased;
-}
-.container{max-width:500px;margin:0 auto;padding:20px 14px 40px}
-.header{text-align:center;padding:24px 0 16px}
-.header .sub{font-size:12px;color:rgba(0,0,0,0.35);margin-top:4px}
-.card{
- background:#fff;border-radius:16px;padding:20px;margin-bottom:14px;
- box-shadow:0 2px 12px rgba(0,0,0,0.04);
-}
-.card h2{font-size:16px;font-weight:600;margin-bottom:12px;color:#333;display:flex;align-items:center;gap:8px}
-.card h3{font-size:14px;font-weight:600;margin:14px 0 8px;color:#555}
-.card h4{font-size:13px;font-weight:600;color:#333;margin-bottom:4px}
-.card p.dim{font-size:12px;color:#aaa;margin-bottom:14px}
-
-/* Tabs */
-.tabs{display:flex;gap:0;margin-bottom:14px;background:#f5f0eb;border-radius:10px;padding:3px}
-.tab{flex:1;text-align:center;padding:10px 0;border-radius:8px;font-size:13px;cursor:pointer;color:#888;transition:all 0.15s}
-.tab.active{background:#fff;color:var(--pri);font-weight:600;box-shadow:0 1px 3px rgba(0,0,0,0.06)}
-
-/* Form */
-.fg{margin-bottom:12px}
-.fg label{display:block;font-size:12px;color:#999;margin-bottom:4px;font-weight:500}
-.fg input,.fg select{width:100%;padding:12px 14px;border:1.5px solid #e8e0d8;border-radius:10px;font-size:15px;outline:none;background:#fdfaf7}
-.fg input:focus,.fg select:focus{border-color:var(--pri)}
-.fr{display:flex;gap:10px}.fr .fg{flex:1}
-.btn{width:100%;padding:14px;border:none;border-radius:12px;font-size:16px;font-weight:600;cursor:pointer}
-.btn-pri{background:var(--pri);color:#fff}.btn-pri:active{opacity:0.85}
-
-/* Pentagram */
-.penta{display:flex;justify-content:center;gap:8px;margin:16px 0;flex-wrap:wrap}
-.pb{text-align:center;min-width:44px}
-.pb .f{height:120px;width:28px;border-radius:14px;margin:0 auto 6px;position:relative;background:#f0ebe5;overflow:hidden}
-.pb .fi{position:absolute;bottom:0;left:0;right:0;border-radius:14px;transition:height 0.6s ease}
-.pb .l{font-size:11px;color:#888}
-.pb .v{font-size:13px;font-weight:700;margin-top:2px}
-
-/* Stats */
-.stats2{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin:8px 0}
-.st2{padding:14px 10px;border-radius:10px;background:#fdf8f5;text-align:center}
-.st2 .v{font-size:20px;font-weight:700}
-.st2 .l{font-size:11px;color:#999;margin-top:2px}
-.st2 .d{font-size:11px;color:#bbb;margin-top:2px;line-height:1.5}
-
-/* Bazi table */
-.bzt{width:100%;border-collapse:collapse;font-size:13px;margin:10px 0}
-.bzt th{background:#fdf8f5;padding:10px 6px;font-weight:600;font-size:11px;color:#999}
-.bzt td{text-align:center;padding:10px 6px;border-bottom:1px solid #f5f0eb}
-.bzt td strong{font-size:16px}
-.bzt .el{font-size:11px;color:#aaa}
-
-/* Tags */
-.tags{display:flex;flex-wrap:wrap;gap:6px;margin:6px 0}
-.tag{padding:4px 12px;border-radius:20px;font-size:12px;font-weight:500}
-.tg{background:#E6FFE8;color:#388E3C}
-.tw{background:#FFECEC;color:var(--pri)}
-.tb{background:#E6F0FF;color:var(--wt)}
-.to{background:#FFF8E6;color:var(--ea)}
-
-/* Risk */
-.rk{padding:14px;border-radius:12px;margin-bottom:10px;border-left:4px solid}
-.rk.r1{background:#FFF0ED;border-color:var(--fr)}
-.rk.r2{background:#FFF8E6;border-color:var(--ea)}
-.rk.r3{background:#E6F0FF;border-color:var(--wt)}
-.rk h4{font-size:14px;margin-bottom:6px}
-.rk p.x{font-size:12px;color:#888;margin-bottom:6px;line-height:1.6}
-.rk ul{list-style:none;padding:0}
-.rk li{font-size:12px;color:#666;padding:2px 0}
-.rk li::before{content:'· ';color:var(--pri)}
-
-/* Suggest */
-.sr{display:flex;gap:8px;margin-bottom:10px}
-.si{width:36px;height:36px;border-radius:10px;display:flex;align-items:center;justify-content:center;font-size:18px;flex-shrink:0}
-.sb{flex:1}
-.sb .t{font-size:14px;font-weight:600;margin-bottom:4px}
-.sb .i{font-size:12px;color:#666;line-height:1.8}
-.sb .r{font-size:11px;color:#aaa;margin-top:2px}
-.sg{background:#E6FFE8}.sr2{background:#FFECEC}.sbl{background:#E6F0FF}.so{background:#FFF8E6}
-
-/* Score */
-.sc{display:flex;align-items:center;gap:10px;padding:8px 0}
-.sl{font-size:13px;width:40px;text-align:right}
-.sb2{flex:1;height:8px;border-radius:4px;background:#f0ebe5;overflow:hidden}
-.sf{height:100%;border-radius:4px;transition:width 0.4s ease}
-.sv{font-size:13px;font-weight:600;width:32px}
-
-/* Quote */
-.qt{background:linear-gradient(135deg,#FFF8F0,#FFECEC);border-radius:12px;padding:16px;text-align:center;margin:10px 0}
-.qt .t{font-size:15px;font-weight:600;color:var(--pri);font-style:italic}
-.qt .e{font-size:12px;color:#888;margin-top:6px;line-height:1.6}
-
-/* Organ stars */
-.or{display:flex;justify-content:space-between;align-items:center;padding:6px 0;border-bottom:1px solid #f5f0eb}
-.or:last-child{border-bottom:none}
-.on{font-size:13px;width:30px}
-.os2{color:var(--gold);font-size:14px;letter-spacing:2px}
-.os2 .off{color:#ddd}
-
-/* Meridian */
-.mer{display:grid;grid-template-columns:1fr 1fr;gap:4px;margin:10px 0}
-.mi{font-size:11px;padding:6px 8px;border-radius:8px;background:#fdf8f5;text-align:center}
-.mi .t2{font-weight:600;font-size:12px}
-.mi .o2{font-size:10px;color:#999;margin-top:1px}
-
-/* WYLQ table */
-.wlt{width:100%;border-collapse:collapse;font-size:12px;margin:8px 0}
-.wlt td{padding:8px 6px;border-bottom:1px solid #f5f0eb}
-.wlt td:first-child{color:#999;white-space:nowrap}
-.wlt td:last-child{font-weight:500}
-
-/* Interaction */
-.inter{display:flex;gap:8px;flex-wrap:wrap;margin:8px 0}
-.iv{padding:6px 12px;border-radius:8px;font-size:12px;font-weight:500}
-.iv.good{background:#E6FFE8;color:#388E3C}
-.iv.bad{background:#FFECEC;color:var(--pri)}
-.iv.neut{background:#f5f0eb;color:#888}
-
-.hidden{display:none!important}
-.tip{font-size:11px;color:#ccc;text-align:center;margin-top:8px}
diff --git a/css/home.css b/css/home.css
deleted file mode 100644
index fde7dfe..0000000
--- a/css/home.css
+++ /dev/null
@@ -1,213 +0,0 @@
-/* 首页 · 测测式信息流(愈心谷品牌色) */
-
-body.app-body[data-nav="home"]{
- background:
- radial-gradient(120% 80% at 80% -10%, rgba(255,180,160,.55) 0%, transparent 55%),
- radial-gradient(90% 60% at 10% 8%, rgba(255,210,190,.7) 0%, transparent 50%),
- linear-gradient(180deg, #FFD6CC 0%, #FFE8E0 28%, #FFF6F2 55%, #FFF9F7 100%);
- overflow-x:hidden;
-}
-
-/* ── 品牌顶区 ── */
-.home-brand{
- text-align:center;padding:18px 20px 6px;position:relative;z-index:2;
-}
-.home-brand img{height:28px;vertical-align:middle}
-.home-brand .word{
- margin-top:10px;
- font-family:"Noto Serif SC","Songti SC","PingFang SC",serif;
- font-size:28px;font-weight:700;letter-spacing:0.18em;
- color:#2a2a2a;line-height:1.2;
-}
-.home-brand .word em{
- font-style:normal;color:var(--pri);
-}
-.home-brand .tagline{
- margin-top:6px;font-size:12px;color:rgba(0,0,0,.38);letter-spacing:0.12em;
-}
-
-/* 装饰光斑 */
-.home-glow{
- position:absolute;pointer-events:none;border-radius:50%;filter:blur(2px);z-index:0;
-}
-.home-glow.g1{width:140px;height:140px;top:40px;right:-30px;background:rgba(255,255,255,.45)}
-.home-glow.g2{width:90px;height:90px;top:100px;left:-20px;background:rgba(255,200,180,.4)}
-
-/* ── 愈心解码(顶区主入口) ── */
-.decode-hero{
- margin:14px 16px 0;position:relative;z-index:2;
- padding:18px 16px 16px;background:#fff;border-radius:20px;
- box-shadow:0 8px 28px rgba(229,77,66,.12);
- text-align:center;
- animation:bdayIn .5s ease both;
-}
-.decode-hero .di-title{
- font-family:"Noto Serif SC","Songti SC",serif;
- font-size:17px;font-weight:700;color:#C8923A;letter-spacing:0.1em;
-}
-.decode-hero .di-sub{font-size:12px;color:#aaa;margin:4px 0 14px}
-.decode-hero .di-inputs{
- display:flex;gap:6px;align-items:center;justify-content:center;flex-wrap:wrap;
-}
-.decode-hero input{
- padding:11px 6px;border:1.5px solid #eee;border-radius:12px;
- font-size:15px;text-align:center;outline:none;background:#fdfaf8;
- transition:border-color .15s;
-}
-.decode-hero input:focus{border-color:#F0B8B0;background:#fff}
-.decode-hero input.dc-y{width:64px}
-.decode-hero input.dc-md{width:48px}
-.decode-hero .dc-sep{font-size:12px;color:#bbb}
-.decode-hero button{
- padding:11px 18px;background:linear-gradient(135deg,#FF7A6E,var(--pri));
- color:#fff;border:none;border-radius:22px;font-size:14px;font-weight:600;
- cursor:pointer;box-shadow:0 6px 16px rgba(229,77,66,.28);
-}
-.decode-hero button:active{opacity:.9}
-@keyframes bdayIn{
- from{opacity:0;transform:translateY(8px)}
- to{opacity:1;transform:translateY(0)}
-}
-
-/* ── 分类 chips ── */
-.chips{
- display:flex;gap:8px;padding:14px 16px 4px;
- overflow-x:auto;-webkit-overflow-scrolling:touch;
- scrollbar-width:none;position:relative;z-index:2;
-}
-.chips::-webkit-scrollbar{display:none}
-.chip{
- flex-shrink:0;padding:7px 14px;border-radius:999px;
- background:rgba(255,255,255,.72);border:1px solid rgba(255,255,255,.9);
- font-size:12px;color:#666;text-decoration:none;
- backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);
- transition:background .15s,color .15s;
-}
-.chip:active,.chip.on{background:#fff;color:var(--pri);font-weight:600;box-shadow:0 2px 8px rgba(0,0,0,.04)}
-
-/* ── 白色内容面板(测测式上浮 sheet) ── */
-.home-sheet{
- margin-top:14px;background:#fff;
- border-radius:22px 22px 0 0;
- padding:8px 0 28px;
- box-shadow:0 -4px 24px rgba(180,100,80,.06);
- position:relative;z-index:3;
- animation:sheetUp .55s cubic-bezier(.22,.8,.28,1) both;
-}
-@keyframes sheetUp{
- from{opacity:0;transform:translateY(24px)}
- to{opacity:1;transform:translateY(0)}
-}
-
-.section{padding:0 16px;margin-top:20px}
-.sec-head{
- display:flex;justify-content:space-between;align-items:baseline;
- margin-bottom:12px;
-}
-.sec-head .title{
- font-size:17px;font-weight:700;color:#222;letter-spacing:0.02em;
-}
-.sec-head .more{
- font-size:12px;color:#bbb;text-decoration:none;
-}
-
-/* ── 图标宫格 ── */
-.test-grid{
- display:grid;grid-template-columns:repeat(4,1fr);gap:14px 8px;
- padding:4px 2px 2px;
-}
-.test-item{
- display:flex;flex-direction:column;align-items:center;gap:8px;
- text-decoration:none;color:var(--text);position:relative;
- transition:transform .15s;
-}
-.test-item:active{transform:scale(0.92)}
-.test-item .icon{
- width:54px;height:54px;border-radius:18px;
- display:flex;align-items:center;justify-content:center;
- font-size:22px;flex-shrink:0;
- box-shadow:inset 0 -2px 0 rgba(0,0,0,.03);
-}
-.test-item .label{
- font-size:11px;color:#555;text-align:center;line-height:1.25;
- max-width:68px;word-break:keep-all;
-}
-.test-item .badge{
- position:absolute;top:-4px;right:6px;
- font-size:9px;background:linear-gradient(135deg,#FF7A6E,var(--pri));
- color:#fff;padding:1px 5px;border-radius:6px;line-height:1.4;
- box-shadow:0 2px 6px rgba(229,77,66,.3);
-}
-
-.icon-pink{background:#FFE4E4;color:var(--pri)}
-.icon-blue{background:#E3EEFF;color:var(--blue)}
-.icon-purple{background:#EDE4FF;color:var(--purple)}
-.icon-orange{background:#FFE8D6;color:var(--orange)}
-.icon-green{background:#E0F6E4;color:var(--green)}
-.icon-rose{background:#FFE0EC;color:var(--pink)}
-.icon-teal{background:#DDF6EF;color:#2EA88A}
-.icon-gold{background:#FFF3D6;color:#C8923A}
-.icon-night{background:#E8E2F4;color:#6B5B95}
-.icon-mute{background:#F3F3F3;color:#aaa}
-
-/* ── 热门信息流卡片(测测 feed) ── */
-.feed{display:flex;flex-direction:column;gap:12px}
-.feed-card{
- display:flex;gap:14px;align-items:stretch;
- padding:12px;background:#FAFAFA;border-radius:16px;
- text-decoration:none;color:var(--text);
- transition:transform .12s, background .12s;
- position:relative;overflow:hidden;
-}
-.feed-card:active{transform:scale(0.985);background:#F5F5F5}
-.feed-cover{
- width:72px;height:72px;border-radius:14px;flex-shrink:0;
- display:flex;align-items:center;justify-content:center;
- font-size:28px;position:relative;overflow:hidden;
-}
-.feed-cover::after{
- content:"";position:absolute;inset:0;
- background:linear-gradient(160deg,rgba(255,255,255,.35),transparent 50%);
-}
-.feed-body{flex:1;min-width:0;display:flex;flex-direction:column;justify-content:center;padding:2px 0}
-.feed-body .name{font-size:15px;font-weight:650;color:#222;line-height:1.35}
-.feed-body .meta{font-size:12px;color:#999;margin-top:4px;line-height:1.4}
-.feed-body .stat{font-size:11px;color:#c4c4c4;margin-top:6px}
-.feed-tag{
- position:absolute;top:10px;right:10px;
- font-size:10px;color:#fff;background:var(--pri);
- padding:2px 7px;border-radius:8px;
-}
-
-.fc-a .feed-cover{background:linear-gradient(145deg,#FFD0C8,#FFB0A4);color:#C23B32}
-.fc-b .feed-cover{background:linear-gradient(145deg,#E4D8F8,#C9B6F0);color:#5B4A8A}
-.fc-c .feed-cover{background:linear-gradient(145deg,#D6E8FF,#B0D0F5);color:#3A6FB0}
-.fc-d .feed-cover{background:linear-gradient(145deg,#D8F0DC,#B5E0BE);color:#3A8A4A}
-.fc-e .feed-cover{background:linear-gradient(145deg,#FFE6C8,#F5C98A);color:#B07A28}
-
-/* ── 快捷入口横滑 ── */
-.scroll-row{
- display:flex;gap:10px;overflow-x:auto;padding:2px 0 4px;
- -webkit-overflow-scrolling:touch;scrollbar-width:none;
-}
-.scroll-row::-webkit-scrollbar{display:none}
-.mini-card{
- flex:0 0 148px;padding:14px 14px 16px;border-radius:16px;
- text-decoration:none;color:#333;position:relative;overflow:hidden;
- transition:transform .12s;
-}
-.mini-card:active{transform:scale(0.97)}
-.mini-card .mi{font-size:22px;margin-bottom:8px}
-.mini-card .mt{font-size:14px;font-weight:650}
-.mini-card .md{font-size:11px;color:rgba(0,0,0,.4);margin-top:3px;line-height:1.35}
-.mc-coral{background:linear-gradient(160deg,#FFE8E2,#FFD4CA)}
-.mc-mint{background:linear-gradient(160deg,#E4F6EA,#D0EDD8)}
-.mc-sky{background:linear-gradient(160deg,#E6F0FF,#D4E4FF)}
-.mc-sand{background:linear-gradient(160deg,#FFF3E0,#FFE4C2)}
-
-@media(max-width:380px){
- .home-brand .word{font-size:24px}
- .test-item .icon{width:48px;height:48px;font-size:20px;border-radius:16px}
- .test-item .label{font-size:10px}
- .feed-cover{width:64px;height:64px}
-}
diff --git a/css/hub.css b/css/hub.css
deleted file mode 100644
index 04b4ea5..0000000
--- a/css/hub.css
+++ /dev/null
@@ -1,26 +0,0 @@
-/* 一级聚合页:认识自己 / 私域活动 / 我的 */
-.hub-list{display:flex;flex-direction:column;gap:10px;padding:0 16px 20px}
-.hub-item{
- display:flex;align-items:center;gap:14px;padding:16px;
- background:#fff;border-radius:14px;text-decoration:none;color:var(--text);
- box-shadow:0 2px 10px rgba(0,0,0,0.04);transition:transform .12s;
-}
-.hub-item:active{transform:scale(0.98)}
-.hub-item .hi{
- width:48px;height:48px;border-radius:12px;
- display:flex;align-items:center;justify-content:center;
- font-size:22px;flex-shrink:0;
-}
-.hub-item .ht{font-size:16px;font-weight:600}
-.hub-item .hd{font-size:12px;color:var(--sub);margin-top:3px}
-.hub-item .ha{margin-left:auto;color:#ccc;font-size:18px}
-.hi-gold{background:#FFF8E6;color:#C8923A}
-.hi-blue{background:#E6F0FF;color:#4A90E2}
-.hi-purple{background:#F0E6FF;color:#8B5CF6}
-.hi-green{background:#E6FFE8;color:#5CB85C}
-.hi-rose{background:#FFECEC;color:#E54D42}
-.hub-empty{
- margin:24px 16px;padding:28px 20px;text-align:center;
- background:#fff;border-radius:16px;color:var(--sub);font-size:14px;line-height:1.7;
- box-shadow:0 2px 10px rgba(0,0,0,0.04);
-}
diff --git a/css/mindmap.css b/css/mindmap.css
deleted file mode 100644
index 2bb9a25..0000000
--- a/css/mindmap.css
+++ /dev/null
@@ -1,107 +0,0 @@
-:root{--pri:#E54D42;--hero-start:#FF9F80;--bg-start:#FFD1C7;--bg-end:#FFC8B5}
-*{box-sizing:border-box;margin:0;padding:0}
-/* legacy body → scoped */
-.app-page{
- font-family:-apple-system,BlinkMacSystemFont,"PingFang SC","Microsoft YaHei",sans-serif;
- background:linear-gradient(180deg,var(--bg-start),var(--bg-end) 50%,#fff5f0);
- height:100vh;display:flex;overflow:hidden;
-}
-
-/* ── Sidebar ── */
-.sidebar{
- width:200px;background:#fff;border-right:1px solid #f0e0d8;display:flex;flex-direction:column;
- flex-shrink:0;box-shadow:2px 0 8px rgba(0,0,0,0.03);z-index:10;
-}
-.sidebar .sh{
- padding:16px 14px 10px;font-size:15px;font-weight:600;color:#333;
- border-bottom:1px solid #f5f0eb;
-}
-.sidebar .slist{flex:1;overflow-y:auto;padding:8px 0}
-.sidebar .slist .item{
- padding:10px 14px;cursor:pointer;font-size:13px;color:#555;
- display:flex;align-items:center;justify-content:space-between;
- border-left:3px solid transparent;transition:background 0.1s;
-}
-.sidebar .slist .item:hover{background:#fdf8f5}
-.sidebar .slist .item.active{background:#fff0ed;border-left-color:var(--pri);color:var(--pri);font-weight:600}
-.sidebar .slist .item .del{font-size:11px;color:#ccc;visibility:hidden;cursor:pointer}
-.sidebar .slist .item:hover .del{visibility:visible}
-.sidebar .slist .item .del:hover{color:var(--pri)}
-.sidebar .sb{display:flex;gap:6px;padding:10px 12px;border-top:1px solid #f5f0eb}
-.sidebar .sb button{
- flex:1;padding:8px 0;border:1px solid #ddd;border-radius:6px;
- background:#fff;font-size:12px;cursor:pointer;color:#555;
-}
-.sidebar .sb button.primary{background:var(--pri);color:#fff;border-color:var(--pri)}
-.sidebar .sb button:active{opacity:0.8}
-
-/* ── Main ── */
-.main{flex:1;display:flex;flex-direction:column;overflow:hidden}
-.toolbar{
- display:flex;align-items:center;gap:6px;padding:8px 12px;
- background:rgba(255,255,255,0.9);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);
- border-bottom:1px solid #f0e0d8;flex-shrink:0;flex-wrap:wrap;z-index:10;
-}
-.toolbar button{
- padding:6px 12px;border:1px solid #ddd;border-radius:6px;
- background:#fff;font-size:13px;cursor:pointer;color:#555;
-}
-.toolbar button:active{background:#f0ebe5}
-.toolbar button.primary{background:var(--pri);color:#fff;border-color:var(--pri)}
-.toolbar .sep{width:1px;height:20px;background:#ddd;margin:0 2px}
-.toolbar .hint{font-size:11px;color:#aaa;margin-left:auto}
-canvas{flex:1;display:block;cursor:grab}
-canvas:active{cursor:grabbing}
-#editor{position:absolute;display:none;z-index:20}
-#editor input{
- padding:4px 8px;border:2px solid var(--pri);border-radius:4px;
- font-size:13px;outline:none;min-width:80px;background:#fff;
-}
-/* Plus buttons */
-#plusChild,#plusSibling{
- position:absolute;display:none;z-index:25;
- width:20px;height:20px;border-radius:50%;
- color:#fff;font-size:14px;font-weight:bold;line-height:20px;
- text-align:center;cursor:pointer;user-select:none;
- pointer-events:auto;
-}
-
-/* Mobile */
-@media(max-width:600px){
- .sidebar{
- position:fixed;left:0;top:0;bottom:0;width:240px;z-index:30;
- transform:translateX(-100%);transition:transform 0.25s ease;
- box-shadow:4px 0 20px rgba(0,0,0,0.1);
- }
- .sidebar.open{transform:translateX(0)}
- .sidebar .sh{font-size:16px;padding:18px 16px 12px}
- .sidebar .slist .item{font-size:14px;padding:12px 16px}
- .sidebar .sb button{padding:10px 0;font-size:13px}
- /* hamburger */
- .hamburger{
- display:flex!important;position:fixed;top:8px;left:8px;z-index:40;
- width:36px;height:36px;align-items:center;justify-content:center;
- background:rgba(255,255,255,0.9);border-radius:8px;
- border:1px solid #e0d5cf;font-size:18px;cursor:pointer;
- -webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);
- }
- /* overlay backdrop */
- .overlay{
- display:none;position:fixed;inset:0;z-index:25;
- background:rgba(0,0,0,0.25);
- }
- .overlay.show{display:block}
- /* toolbar compact */
- .toolbar{gap:3px;padding:6px 6px 6px 50px;min-height:42px}
- .toolbar button{padding:6px 10px;font-size:12px;border-radius:8px}
- .toolbar .sep{margin:0 1px}
- .toolbar .hint{font-size:10px;display:none}
- /* canvas */
- canvas{flex:1}
- /* editor bigger for touch */
- #editor input{font-size:16px!important;padding:8px 12px;min-width:100px;border-radius:6px}
- /* node hit area larger on mobile */
- .mobile .toolbar button{min-height:32px}
-}
-/* Desktop: hide hamburger */
-.hamburger{display:none}
diff --git a/css/scale-test.css b/css/scale-test.css
deleted file mode 100644
index 7534fca..0000000
--- a/css/scale-test.css
+++ /dev/null
@@ -1,58 +0,0 @@
-:root{--pri:#E54D42;--bg-start:#FFD1C7;--bg-end:#FFC8B5}
-*{box-sizing:border-box;margin:0;padding:0}
-/* legacy body → scoped */
-.app-page{
- font-family:-apple-system,BlinkMacSystemFont,"PingFang SC","Microsoft YaHei",sans-serif;
- background:linear-gradient(180deg,var(--bg-start) 0%,var(--bg-end) 50%,#fff5f0 100%);
- min-height:100vh;-webkit-font-smoothing:antialiased;
- display:flex;flex-direction:column;
-}
-
-.top-bar{display:flex;align-items:center;padding:14px 16px;gap:12px;max-width:500px;margin:0 auto}
-.top-bar .back{font-size:22px;text-decoration:none;color:#666;line-height:1}
-.top-bar .title{flex:1;font-size:16px;font-weight:600;color:#333;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:center}
-.top-bar .qnum{font-size:13px;color:#999}
-.progress{height:3px;background:rgba(0,0,0,0.08);max-width:500px;margin:0 auto}
-.progress .bar{height:100%;background:var(--pri);transition:width 0.3s}
-
-.main{flex:1;display:flex;flex-direction:column;padding:20px;max-width:500px;width:100%;margin:0 auto}
-
-.qcard{background:#fff;border-radius:14px;padding:28px 22px;box-shadow:0 2px 10px rgba(0,0,0,0.04);flex:1}
-.qcard .qtext{font-size:17px;color:#333;line-height:1.7;margin-bottom:24px}
-.qcard .qtext .qidx{color:var(--pri);font-weight:600;margin-right:6px}
-
-.options{display:flex;flex-direction:column;gap:10px}
-.option{
- padding:14px 18px;border-radius:10px;border:1.5px solid #eee;
- font-size:15px;color:#444;cursor:pointer;transition:all 0.15s;text-align:left;background:#fafafa;
-}
-.option:hover{border-color:var(--pri);background:#fff5f3}
-.option.selected{border-color:var(--pri);background:#fff0ed;color:var(--pri);font-weight:500}
-
-.btns{display:flex;gap:12px;padding:16px 0 30px;max-width:500px;width:100%;margin:0 auto}
-.btns button{
- flex:1;padding:14px;border-radius:10px;border:none;font-size:15px;cursor:pointer;
- font-weight:500;transition:all 0.15s;
-}
-.btn-prev{background:#f0f0f0;color:#666}
-.btn-next{background:var(--pri);color:#fff}
-.btn-submit{background:#4CAF50;color:#fff}
-button:disabled{opacity:0.4;cursor:not-allowed}
-
-.submit-area{text-align:center;padding:40px 20px}
-.submit-area p{font-size:14px;color:#888;margin-bottom:20px}
-.submit-area button{
- padding:14px 40px;border-radius:10px;background:var(--pri);color:#fff;
- border:none;font-size:16px;cursor:pointer;font-weight:500;
-}
-
-.result-card{background:#fff;border-radius:14px;padding:32px 22px;box-shadow:0 2px 10px rgba(0,0,0,0.04);text-align:center;max-width:500px;width:100%;margin:0 auto}
-.result-card .score{font-size:48px;font-weight:700;color:var(--pri);margin:12px 0}
-.result-card .level{font-size:18px;color:#666;margin-bottom:20px}
-.result-card .detail{font-size:14px;color:#999;line-height:1.6;text-align:left}
-.result-card .back-btn{
- display:inline-block;margin-top:20px;padding:12px 30px;background:var(--pri);color:#fff;
- border-radius:10px;text-decoration:none;font-size:15px;
-}
-
-.loading{text-align:center;padding:80px 20px;color:#999}
diff --git a/css/scales.css b/css/scales.css
deleted file mode 100644
index 9adaaab..0000000
--- a/css/scales.css
+++ /dev/null
@@ -1,48 +0,0 @@
-:root{--pri:#E54D42;--bg-start:#FFD1C7;--bg-end:#FFC8B5}
-*{box-sizing:border-box;margin:0;padding:0}
-/* legacy body → scoped */
-.app-page{
- font-family:-apple-system,BlinkMacSystemFont,"PingFang SC","Microsoft YaHei",sans-serif;
- background:linear-gradient(180deg,var(--bg-start) 0%,var(--bg-end) 50%,#fff5f0 100%);
- min-height:100vh;-webkit-font-smoothing:antialiased;
-}
-.header{padding:24px 20px 16px;text-align:center}
-.logo img{height:36px;margin-bottom:4px}
-.header .sub{font-size:13px;color:rgba(0,0,0,0.45);margin-top:4px}
-
-.categories{display:flex;flex-wrap:wrap;gap:8px;padding:0 20px 12px;justify-content:center;max-width:600px;margin:0 auto}
-.cat-btn{
- padding:7px 16px;border-radius:20px;border:1px solid rgba(0,0,0,0.12);
- background:#fff;font-size:13px;color:#555;cursor:pointer;
- transition:all 0.2s;white-space:nowrap;
-}
-.cat-btn.active{background:var(--pri);color:#fff;border-color:var(--pri)}
-
-.scales{max-width:600px;margin:0 auto;padding:0 20px 40px}
-.scale-card{
- display:flex;align-items:center;gap:12px;padding:16px;
- background:#fff;border-radius:12px;margin-bottom:10px;
- box-shadow:0 1px 6px rgba(0,0,0,0.05);cursor:pointer;
- transition:transform 0.12s;text-decoration:none;color:inherit;
-}
-.scale-card:active{transform:scale(0.98)}
-.scale-card .icon{width:44px;height:44px;border-radius:10px;display:flex;align-items:center;justify-content:center;font-size:22px;flex-shrink:0}
-.scale-card .icon.cat-综合{background:#FFECEC;color:var(--pri)}
-.scale-card .icon.cat-人格{background:#E6F0FF;color:#4A90E2}
-.scale-card .icon.cat-抑郁{background:#E6E0FF;color:#7C5CF2}
-.scale-card .icon.cat-焦虑{background:#FFF0E6;color:#E8985A}
-.scale-card .icon.cat-强迫{background:#E6FFE8;color:#5CB85C}
-.scale-card .icon.cat-躁狂{background:#FFF8E6;color:#E8985A}
-.scale-card .icon.cat-双相{background:#FFE6F0;color:#E0508C}
-.scale-card .icon.cat-恐惧{background:#E6F5FF;color:#4A90E2}
-.scale-card .icon.cat-智商{background:#F3E8FF;color:#8B5CF6}
-.scale-card .icon.cat-情商{background:#FFF5EC;color:#C8923A}
-.scale-card .icon.cat-其他{background:#F0F0F0;color:#888}
-.scale-card .info{flex:1;min-width:0}
-.scale-card .info .name{font-size:15px;font-weight:600;color:#333}
-.scale-card .info .desc{font-size:12px;color:#999;margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
-.scale-card .count{font-size:12px;color:#aaa;flex-shrink:0}
-
-.loading{text-align:center;padding:60px 20px;color:#999}
-.empty{text-align:center;padding:40px 20px;color:#ccc;font-size:14px}
-.back{display:inline-block;padding:8px 16px;color:var(--pri);text-decoration:none;font-size:14px;margin:8px 0 0 20px}
diff --git a/css/shuzi.css b/css/shuzi.css
deleted file mode 100644
index 97e0b25..0000000
--- a/css/shuzi.css
+++ /dev/null
@@ -1,78 +0,0 @@
-@font-face { font-family:'TriangleDigits'; src:url(data:font/woff2;base64,d09GMgABAAAAAAUAAA4AAAAACHwAAASsAAIZmQAAAAAAAAAAAAAAAAAAAAAAAAAAGhYbbBxIBmAANBEQCocshhEBNgIkAxoLGAAEIAWDIgcgG9QGKC4G7Ib6hm2MRajDYhGiDhrol2EQYF1VSXrYswJPkJb83g+eA7l2QeKDmZzBKY+S2Y6GNNvdREZSoL/sv5IIQxUu06If+FX4/z+X49/WsztrTAw5kRt099ubOm5NXEAFHuBcGvAGSjDAgLDn2bZk6fIVBBISV5n1GLNAADYApcVbCydXozYtkTdtbu8OvEOS0PEgPgIdEQfiY0OwiSCOBmAPsl4AYswwdCJQA1FoSBQqZkProGuMIFPAPhuoa8oSVYX8YAQSAZpDCmDZcIkm/ZAjI0LR3A1KzY56XmlDxUYMYNhtcBARzR51kKE7KkxKozJobFeXdNJlKY3czMCYMrUMa/83F2mmEHEHkFJnDXn9YBwBCSjAHYUA3NEIBjQ0BFDLHki2t3+KqVZYkbggAFQ26ho8RWcQ3tl/htql/UbHN70BAoXUbXpAnK4F+eoWL5vNxzpnKT0L1CrUld9zyZWVebLzdRVOGASMYohloBiiuziLHrm5uQI5VmbV7EqrcnVlszArq2tWV6c5C0+s7O5L1+3WqS7Q2737TCeTufqRH9o1O3uOtCpHMUc36sxupMOcNaesYEbpnGdwwlHmrs8VKBTmstgNaLvfBrx5PQ/wj1yzJd01+3LOm+/CzOY4zhHWtXYr5PbIyREYwJnHeFm4pXu2IcxByHzZVWJ3Er3bMQkX9snibM6Y1aTyc3rkXNUJPXpz8SR3SFeH84FFWYV9bzibJvHlL0bRde6KYc9cmiIKk5+FN+NThqtvc8aBGfnF6WzIqLk1ON06sNXy3bLFuIJ8DQT/QGhPY9JrsRk3RddPID33rzz9cLGnXZjvNNQR4659v7m7f0qW1qex/MqwciHDfdsqBnOLCispr6nWU0/DmAXZBdjkTA0M/4LXawb7VDhbjduWNPaWsM25jxyH1ENRUmejPPOk33dOKZ+v4BRLNZQeriawC/Nzxb0nr7/lPdzfGvGf3kgW0N6/tXYq1Si9RA/v58kV3DTY5DgaxwV1Uw5++lzxouLrgNYX82rdHtlWXSn61Di0UAxfhc2HeamcDnfrnVra3xecFNc61xtZhSxqUlFZFQ62rTQ+w3YS4S9Z4bNHHUB7y/fxoxt9pVAyqdOZ66cPKs7Oz8sYj5f2lIpvQPQfX3t4++1V80/rnFtRkIspHBjC5WXnpReTvuTiMVkJsZFp5SVhxARkdDKQhx19XV78vjqr1UAXlvCfnhUiz41CK/6P8dI6eIab2nlH17ap48+X3P/67iJUpWdlq6vNFAQABCB9dmU3fPxwgFPdb2YhMwAvzT++ByhOmZz+3/9vizVMBYAZOVthCvnfDK9OI6rfpSMQ1O8ljbVAg/Zm6S2UNDN4K6A9UySALjrjrgTjPKoUNdG7bdIswFkQgyCYswaJI28NikwKujXQYMBXOC8yEihiaSpGlAKsZbII4YSJENhVwgyBgJQEXSDaUphohpCxTCWZFJKhBY+AiHgRfBMjhobUGOI+OYREilhp4gmpjs63SFuCvHUricIo0nYoVERiSqyLCF+MnFdHwYlnbI0JjLBYonBsPGESCHYCTx5NXJ+7DhJpNTCDOrOPjGrLzlAAAAA) format('woff2'); }
- * { box-sizing: border-box; margin: 0; padding: 0; }
- /* legacy body → scoped */
-.app-page{ background:linear-gradient(160deg,#FFD1C7,#FFC8B5); font-family:-apple-system,BlinkMacSystemFont,"PingFang SC","Microsoft YaHei",sans-serif; display:flex; flex-direction:column; justify-content:center; align-items:center; min-height:100vh; color:#333; padding:10px 10px 20px; -webkit-user-select:none; user-select:none; -webkit-touch-callout:none; }
- .container { position:relative; width:600px; max-width:95%; padding:12px 40px 40px; display:flex; flex-direction:column; align-items:center; background:#fff; border-radius:18px; box-shadow:0 8px 30px rgba(0,0,0,.08); margin-bottom:30px; }
- .input-row { display:flex; gap:5px; align-items:center; margin-bottom:24px; font-family:sans-serif; }
- .input-row input { width:56px; padding:6px 4px; border:1px solid #d9ccb6; border-radius:3px; font-size:14px; text-align:center; color:#6b5b4e; background:#fff; outline:none; }
- .input-row input:focus { border-color:#a89580; }
- .input-row .lbl { font-size:0.75em; color:#9b8a78; }
- .btn-gen { padding:6px 12px; background:#8b7a68; color:#fff; border:none; border-radius:3px; font-size:0.75em; cursor:pointer; margin-left:2px; }
- .btn-gen:active { opacity:0.8; }
- .top-numbers { display:flex; flex-direction:column; align-items:center; margin-bottom:-20px; z-index:2; font-family:'TriangleDigits','Georgia','Times New Roman',serif; }
- .top-numbers .num-top { font-size:2.2rem; font-weight:normal; }
- .top-numbers .num-mid-row { display:flex; gap:60px; font-size:2.2rem; font-weight:normal; }
- .triangle-wrapper { position:relative; width:300px; height:260px; margin:20px 0; display:flex; justify-content:center; align-items:center; overflow:visible; }
- .triangle-svg { position:absolute; top:0; left:0; width:100%; height:100%; z-index:0; }
- .triangle-path { fill:#f2ebdd; stroke:#d9ccb6; stroke-width:2; }
- .divider-line { stroke:#d9ccb6; stroke-width:2; }
- .inner-number { position:absolute; z-index:1; font-size:2.2rem; font-weight:bold; cursor:pointer; font-family:'TriangleDigits','Georgia','Times New Roman',serif; color:#5a4636; }
- .red-num { color:#c47a78; top:25%; }
- .mid-left { top:55%; left:30%; } .mid-right { top:55%; right:30%; }
- .bot-1 { bottom:10%; left:18%; } .bot-2 { bottom:10%; left:38%; }
- .bot-3 { bottom:10%; right:38%; } .bot-4 { bottom:10%; right:18%; }
- .side-decorations { position:absolute; width:100%; height:100%; top:0; left:0; font-family:'TriangleDigits','Georgia','Times New Roman',serif; }
- .side-num { position:absolute; font-size:2.2rem; opacity:0.65; cursor:pointer; font-family:'TriangleDigits','Georgia','Times New Roman',serif; font-weight:normal; color:#8b7e6e; }
- .left-group { top:30%; left:-40px; text-align:right; line-height:1.5; }
- .right-group { top:30%; right:-40px; text-align:left; line-height:1.5; }
- .footer-date { margin-top:0; display:flex; gap:40px; font-size:1.8rem; letter-spacing:2px; color:#5a4636; font-family:'TriangleDigits','Georgia','Times New Roman',serif; }
- .sections { width:100%; max-width:360px; margin-top:24px; font-family:sans-serif; font-size:1em; color:#6b5b4e; }
- .divider { border:none; border-top:1px solid #e0d5c4; margin:12px 0; opacity:0.6; }
- .codes .r { display:flex; justify-content:space-between; border-bottom:1px dotted rgba(168,144,112,0.15); padding:2px 4px; }
- .codes .k { color:#9b8a78; } .codes .v { color:#6b5b4e; }
- .joint-age { font-size:0.9em; color:#a89070; font-weight:600; text-align:center; margin:8px 0 2px; border-bottom:1px solid rgba(168,144,112,0.2); padding-bottom:2px; }
- .joint-grid { display:grid; grid-template-columns:repeat(2,1fr); gap:2px 10px; }
- .joint-grid .jc { font-weight:700; color:#5a4636; } .joint-grid .jm { color:#9b8a78; }
- .tooltip { position:fixed; padding:5px 10px; background:#6b5b4e; color:#fff; border-radius:4px; font-size:0.7em; pointer-events:none; opacity:0; transition:opacity 0.12s; z-index:999; max-width:200px; line-height:1.5; font-family:sans-serif; }
- .tooltip.on { opacity:1; }
- .footer { text-align:center; font-size:0.6em; color:#9b8a78; margin-top:10px; }
- /* 付费墙 */
- .shuzi-lock { position:relative; border-radius:10px; overflow:hidden; border:1px solid #f2e6d0; }
- .shuzi-lock > .blur { filter:blur(10px); opacity:0.35; pointer-events:none; user-select:none; }
- .shuzi-lock .cover { position:absolute; inset:0; z-index:2; background:linear-gradient(180deg, rgba(250,247,242,.5), rgba(250,247,242,.95)); display:flex; flex-direction:column; align-items:center; justify-content:center; text-align:center; padding:20px; }
- .shuzi-lock .cover .lk-t { font-size:1.05em; font-weight:700; color:#c47a78; }
- .shuzi-lock .cover .lk-d { font-size:0.75em; color:#9b8a78; margin:8px 0 14px; }
- .shuzi-lock .cover .lk-btn { background:#c47a78; color:#fff; border:none; padding:10px 28px; border-radius:20px; font-size:0.85em; font-weight:600; cursor:pointer; }
- .shuzi-lock.unlocked .cover { display:none; }
- .shuzi-lock.unlocked .blur { filter:none; pointer-events:auto; user-select:auto; }
- .scene-3d { position:relative; display:flex; justify-content:center; margin:8px 0; cursor:grab; }
- .scene-3d:active { cursor:grabbing; }
- .scene-3d canvas { display:block; touch-action:none; }
- .scene-hint { position:absolute; bottom:2px; left:50%; transform:translateX(-50%); font-size:0.55em; color:#b8a898; pointer-events:none; opacity:0.7; }
- .freq-label { text-align:center; font-size:0.7em; color:#6b5b4e; margin-top:2px; line-height:1.8; }
- .tabs-nav { display:flex; flex-wrap:wrap; gap:4px; margin-bottom:18px; justify-content:center; padding:0 4px; }
- .tab-btn { padding:5px 10px; border:1px solid #d9ccb6; border-radius:3px; background:#fff; color:#9b8a78; font-size:0.7em; cursor:pointer; font-family:sans-serif; transition:all 0.15s; white-space:nowrap; }
- .tab-btn:hover { border-color:#c47a78; color:#c47a78; }
- .tab-btn.active { background:#c47a78; color:#fff; border-color:#c47a78; }
- .tab-panel { display:none; }
- .tab-panel.active { display:block; }
- .tab-panel .module-title { font-size:0.82em; font-weight:600; color:#5a4636; text-align:center; margin-bottom:8px; }
- .tab-panel .module-desc { font-size:0.68em; color:#9b8a78; text-align:center; margin-bottom:10px; line-height:1.6; }
- .tab-panel .module-section { font-size:0.72em; color:#6b5b4e; line-height:1.75; padding:0 4px; margin-bottom:10px; }
- .tab-panel .module-section b { color:#5a4636; }
- .bagua-grid { display:grid; grid-template-columns:repeat(4,1fr); gap:6px; text-align:center; margin:8px 0; }
- .bagua-cell { padding:6px 4px; border-radius:4px; font-size:0.68em; line-height:1.5; }
- @media (max-width:600px) {
- .triangle-wrapper { width:220px; height:190px; margin:10px auto 0; }
- .triangle-wrapper svg { width:220px; height:190px; }
- .inner-number { font-size:1.6rem; }
- .red-num { top:22%; }
- .mid-left { top:52%; left:28%; } .mid-right { top:52%; right:28%; }
- .bot-1 { bottom:10%; left:14%; } .bot-2 { bottom:10%; left:35%; }
- .bot-3 { bottom:10%; right:35%; } .bot-4 { bottom:10%; right:14%; }
- .side-num { font-size:1.6rem; }
- .left-group { left:-32px; top:26%; } .right-group { right:-32px; top:26%; }
- .top-numbers .num-top { font-size:1.6rem; }
- .top-numbers .num-mid-row { font-size:1.6rem; gap:40px; }
- .footer-date { gap:14px; font-size:1.2rem; letter-spacing:0; }
- }
diff --git a/css/xingjing.css b/css/xingjing.css
deleted file mode 100644
index e4d87b1..0000000
--- a/css/xingjing.css
+++ /dev/null
@@ -1,221 +0,0 @@
-html{overflow-y:auto;-webkit-overflow-scrolling:touch}
-:root{
- --pri:#E54D42; --blue:#4A90E2; --teal:#0D9488; --gold:#C8923A;
- --text:#333; --sub:#999; --bg-start:#FFD1C7; --bg-end:#FFC8B5; --dark:#1a1a2e;
-}
-*{box-sizing:border-box;margin:0;padding:0}
-/* legacy body → scoped */
-.app-page{
- font-family:-apple-system,BlinkMacSystemFont,"PingFang SC","Microsoft YaHei","Helvetica Neue",sans-serif;
- background:linear-gradient(180deg,var(--bg-start) 0%,var(--bg-end) 40%,#fff5f0 100%);
- color:var(--text);max-width:430px;margin:0 auto;min-height:100vh;
- -webkit-font-smoothing:antialiased;overflow-x:hidden;
- overflow-y:auto;-webkit-overflow-scrolling:touch;
-}
-.topbar{
- display:flex;align-items:center;justify-content:center;gap:8px;
- padding:10px 16px 6px;position:sticky;top:0;z-index:20;
- background:linear-gradient(180deg,var(--bg-start) 0%,rgba(255,209,199,0.7) 100%);
- -webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);
-}
-.topbar .tbt{font-size:15px;font-weight:700;color:var(--text);flex:1;text-align:center}
-.topbar .back-btn{
- width:32px;height:32px;border-radius:50%;border:none;background:rgba(255,255,255,0.6);
- font-size:16px;cursor:pointer;display:none;align-items:center;justify-content:center;
- flex-shrink:0;color:var(--text);
-}
-.topbar .back-btn.show{display:flex}
-.topbar img{height:22px;flex-shrink:0}
-
-.page{display:none;padding:0 16px 85px;animation:fadeIn 0.25s}
-.page.active{display:block}
-@keyframes fadeIn{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}
-
-.nav{
- position:fixed;bottom:0;left:50%;transform:translateX(-50%);
- width:100%;max-width:430px;background:#fff;display:flex;justify-content:space-around;
- padding:4px 0 calc(6px + env(safe-area-inset-bottom,0));
- border-top:1px solid #f0f0f0;z-index:100;box-shadow:0 -2px 8px rgba(0,0,0,0.03);
-}
-.nav-item{display:flex;flex-direction:column;align-items:center;gap:1px;font-size:9px;color:var(--sub);cursor:pointer;line-height:1;transition:color 0.15s}
-.nav-item .ni{font-size:17px}
-.nav-item.active{color:var(--pri)}
-
-.card{background:#fff;border-radius:14px;padding:16px;margin-bottom:10px;box-shadow:0 2px 8px rgba(0,0,0,0.04)}
-.card-sm{padding:12px;border-radius:12px}
-.card-title{font-size:15px;font-weight:700;margin-bottom:4px}
-.card-sub{font-size:11px;color:var(--sub);line-height:1.5}
-
-.hero-card{
- background:linear-gradient(135deg,var(--dark),#16213e,#0f3460);
- border-radius:18px;padding:24px 18px 20px;margin-bottom:12px;color:#fff;position:relative;overflow:hidden;
-}
-.hero-card .h-stars{position:absolute;inset:0;pointer-events:none}
-.hero-card .h-stars span{position:absolute;background:#fff;border-radius:50%;animation:twinkle 3s ease-in-out infinite}
-.hero-card .h-stars span:nth-child(1){width:3px;height:3px;top:12%;left:20%}
-.hero-card .h-stars span:nth-child(2){width:2px;height:2px;top:25%;right:22%}
-.hero-card .h-stars span:nth-child(3){width:3px;height:3px;top:50%;left:65%}
-.hero-card .h-stars span:nth-child(4){width:2px;height:2px;bottom:30%;left:15%}
-.hero-card .h-stars span:nth-child(5){width:3px;height:3px;bottom:20%;right:30%}
-@keyframes twinkle{0%,100%{opacity:0.2}50%{opacity:1}}
-.hero-card .hzodiac{margin-bottom:4px}
-.hero-card .hlabel{font-size:11px;opacity:0.6;margin-bottom:2px}
-/* Dunhuang zodiac badge */
-.zodiac-dh{display:inline-flex;align-items:center;justify-content:center;width:48px;height:48px;border-radius:50%;background:#F5E6D3;border:2px solid;font-size:22px;font-weight:700;line-height:1;box-shadow:0 2px 8px rgba(0,0,0,0.1);flex-shrink:0}
-.hero-card .zodiac-dh{width:56px;height:56px;font-size:26px;border-width:2.5px;margin:0 auto}
-.result-hero .zodiac-dh{width:64px;height:64px;font-size:30px;border-width:3px;margin:0 auto}
-.zodiac-dh.fire{border-color:#C04030;color:#8B2020;background:#FDF2EC}
-.zodiac-dh.earth{border-color:#A0855B;color:#6B4F3A;background:#F8F2EA}
-.zodiac-dh.air{border-color:#5B8FA8;color:#3A6070;background:#F0F5F8}
-.zodiac-dh.water{border-color:#6B5B95;color:#4A3570;background:#F2F0F8}
-#pAvatar .zodiac-dh{width:56px;height:56px;font-size:26px;box-shadow:none}
-.hist-item .zodiac-dh{width:40px;height:40px;font-size:18px}
-.hero-card .hsign{font-size:24px;font-weight:800}
-.hero-card .hdate{font-size:11px;opacity:0.5;margin-top:2px}
-.hero-card .haction{display:inline-block;margin-top:12px;padding:8px 20px;background:rgba(255,255,255,0.15);color:#fff;border-radius:20px;font-size:13px;font-weight:600;cursor:pointer;transition:transform 0.15s}
-.hero-card .haction:active{transform:scale(0.95)}
-
-.input-row{display:flex;gap:6px;align-items:center;margin-bottom:8px;flex-wrap:wrap}
-.input-row input,.input-row select{padding:10px 8px;border:1.5px solid #e8e0d8;border-radius:10px;font-size:14px;outline:none;background:#fdfaf7;text-align:center;flex:1;min-width:0}
-.input-row input:focus,.input-row select:focus{border-color:var(--pri)}
-.input-row .lbl{font-size:12px;color:var(--sub);white-space:nowrap}
-
-.btn{display:inline-block;padding:10px 20px;border:none;border-radius:22px;font-size:13px;font-weight:600;cursor:pointer;transition:transform 0.15s}
-.btn:active{transform:scale(0.96)}
-.btn-pri{background:var(--pri);color:#fff;box-shadow:0 3px 10px rgba(229,77,66,.2)}
-.btn-outline{background:#fff;color:var(--pri);border:1.5px solid var(--pri)}
-.btn-sm{padding:6px 14px;font-size:11px}
-.btn-block{display:block;width:100%;text-align:center}
-
-.quiz-q{margin-bottom:14px}
-.quiz-q .q-num{font-size:10px;color:var(--sub);margin-bottom:2px}
-.quiz-q .q-text{font-size:15px;font-weight:600;margin-bottom:8px;line-height:1.4}
-.quiz-opt{display:block;width:100%;padding:12px 14px;margin-bottom:6px;background:#fafafa;border:1.5px solid #eee;border-radius:12px;font-size:13px;text-align:left;cursor:pointer;transition:all 0.15s;line-height:1.4}
-.quiz-opt:active,.quiz-opt.sel{background:#FFF5F0;border-color:var(--pri);color:var(--pri)}
-
-.result-hero{background:linear-gradient(135deg,var(--dark),#16213e,#0f3460);border-radius:18px;padding:28px 20px;text-align:center;color:#fff;margin-bottom:12px}
-.result-hero .rzodiac{margin-bottom:6px}
-.result-hero .rsign{font-size:22px;font-weight:800;margin-bottom:2px}
-.result-hero .rmbti{font-size:13px;opacity:0.7;margin-bottom:8px}
-.result-tag{display:inline-block;padding:3px 10px;border-radius:20px;font-size:10px;margin:2px;background:rgba(255,255,255,0.12);color:rgba(255,255,255,0.85)}
-
-.elem-bar{display:flex;align-items:center;gap:6px;margin-bottom:4px;font-size:11px}
-.elem-bar .el{width:40px;text-align:right;color:var(--sub)}
-.elem-bar .eb{flex:1;height:8px;border-radius:4px;background:#eee;overflow:hidden}
-.elem-bar .ebf{height:100%;border-radius:4px;transition:width 0.6s}
-.elem-bar .ev{width:28px;text-align:right;font-weight:600;font-size:10px}
-
-.dim-row{display:flex;align-items:center;gap:8px;margin-bottom:6px;font-size:11px}
-.dim-row .dl{width:24px;text-align:right;color:var(--sub);font-weight:600}
-.dim-row .dbar{flex:1;height:18px;background:#f5f5f5;border-radius:9px;position:relative;overflow:hidden}
-.dim-row .dfill{height:100%;border-radius:9px;transition:width 0.8s;display:flex;align-items:center;padding-left:8px;color:#fff;font-size:9px;font-weight:600}
-.dim-row .dr{width:24px;font-weight:600;font-size:10px}
-
-#chartCanvas{display:block;width:100%;border-radius:16px;background:var(--dark);cursor:grab}
-#chartCanvas:active{cursor:grabbing}
-.chart-info{text-align:center;padding:10px;font-size:12px;color:var(--sub);background:#fff;border-radius:12px;margin-top:8px;box-shadow:0 2px 6px rgba(0,0,0,0.03)}
-.chart-info .pn{font-weight:700;color:var(--pri);font-size:14px}
-
-.horo-card{background:linear-gradient(135deg,#fff8f0,#fff5f0);border-radius:14px;padding:14px;margin-bottom:10px;border:1px solid rgba(229,77,66,0.08)}
-.horo-card .hday{font-size:11px;color:var(--sub)}
-.horo-card .hmsg{font-size:13px;font-weight:600;color:var(--text);margin:4px 0;line-height:1.5}
-.horo-card .hstars{color:#FFD700;font-size:12px}
-
-.quick-grid{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-bottom:10px}
-.quick-item{background:#fff;border-radius:12px;padding:16px 12px;text-align:center;box-shadow:0 2px 6px rgba(0,0,0,0.03);cursor:pointer;transition:transform 0.15s}
-.quick-item:active{transform:scale(0.96)}
-.quick-item .qi{font-size:26px;margin-bottom:4px}
-.quick-item .qt{font-size:12px;font-weight:600;color:var(--text)}
-.quick-item .qd{font-size:10px;color:var(--sub);margin-top:2px}
-
-.feed-tabs{display:flex;gap:8px;margin-bottom:10px;overflow-x:auto}
-.feed-tab{padding:6px 14px;border-radius:20px;font-size:11px;white-space:nowrap;background:#fff;color:var(--sub);cursor:pointer;transition:all 0.15s;border:1px solid #eee}
-.feed-tab.active{background:var(--pri);color:#fff;border-color:var(--pri)}
-.feed-item{background:#fff;border-radius:14px;margin-bottom:10px;overflow:hidden;box-shadow:0 2px 8px rgba(0,0,0,0.04)}
-.feed-item .f-thumb{position:relative;height:180px;display:flex;align-items:center;justify-content:center;cursor:pointer}
-.feed-item .f-thumb .play-btn{width:44px;height:44px;border-radius:50%;background:rgba(255,255,255,0.2);display:flex;align-items:center;justify-content:center;font-size:16px;color:#fff}
-.feed-item .f-thumb .f-dur{position:absolute;bottom:8px;right:8px;background:rgba(0,0,0,0.6);color:#fff;font-size:10px;padding:2px 6px;border-radius:4px}
-.feed-item .f-avatar{position:absolute;bottom:8px;left:8px;width:28px;height:28px;border-radius:50%;background:rgba(255,255,255,0.3);display:flex;align-items:center;justify-content:center;font-size:14px}
-.feed-item .f-info{padding:12px}
-.feed-item .f-info .f-title{font-size:13px;font-weight:600;margin-bottom:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
-.feed-item .f-info .f-meta{font-size:10px;color:var(--sub);display:flex;gap:10px}
-.feed-item .f-tags{display:flex;gap:5px;padding:0 12px 8px;flex-wrap:wrap}
-.feed-tag{font-size:9px;padding:2px 7px;border-radius:10px;background:#FFF5F0;color:var(--pri)}
-
-.video-overlay{position:fixed;inset:0;z-index:200;background:#000;display:none;flex-direction:column;justify-content:center;align-items:center}
-.video-overlay.on{display:flex}
-.video-overlay .v-canvas{display:block;width:100%;max-width:430px}
-.video-overlay .v-close{position:absolute;top:16px;right:16px;z-index:210;width:36px;height:36px;border-radius:50%;background:rgba(255,255,255,0.12);color:#fff;border:none;font-size:18px;cursor:pointer;display:flex;align-items:center;justify-content:center}
-.video-overlay .v-progress{position:absolute;bottom:40px;left:50%;transform:translateX(-50%);width:70%;max-width:280px;height:3px;background:rgba(255,255,255,0.15);border-radius:3px;z-index:210}
-.video-overlay .v-progress .v-bar{height:100%;background:var(--pri);border-radius:3px;transition:width 0.1s linear}
-.video-overlay .v-watermark{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%) rotate(-20deg);color:rgba(255,255,255,0.06);font-size:32px;font-weight:800;pointer-events:none;z-index:205;white-space:nowrap}
-
-.tier-card{background:#fff;border-radius:14px;padding:16px;margin-bottom:8px;box-shadow:0 2px 8px rgba(0,0,0,0.04);position:relative;overflow:hidden}
-.tier-card.pro{border:2px solid var(--gold)}
-.tier-card.pro::after{content:"推荐";position:absolute;top:0;right:0;background:var(--gold);color:#fff;font-size:10px;padding:3px 10px;border-radius:0 12px 0 12px;font-weight:600}
-.tier-card .t-name{font-size:15px;font-weight:700;margin-bottom:2px}
-.tier-card .t-price{font-size:20px;font-weight:800;color:var(--pri);margin-bottom:6px}
-.tier-card .t-price .unit{font-size:12px;font-weight:400}
-.tier-card .t-feat{font-size:11px;color:var(--sub);line-height:1.8}
-
-.badge-row{display:flex;gap:8px;overflow-x:auto;padding:4px 0;margin-bottom:6px}
-.badge-item{flex-shrink:0;width:56px;text-align:center;font-size:9px;color:var(--sub)}
-.badge-item .bi{width:44px;height:44px;border-radius:50%;margin:0 auto 4px;display:flex;align-items:center;justify-content:center;font-size:20px}
-.badge-item .bi.locked{background:#f0f0f0;filter:grayscale(1);opacity:0.5}
-
-.hist-item{display:flex;align-items:center;gap:10px;padding:12px;background:#fff;border-radius:12px;margin-bottom:8px;box-shadow:0 1px 4px rgba(0,0,0,0.03);cursor:pointer}
-.hist-item .hi{flex-shrink:0;display:flex;align-items:center}
-.hist-item .hc{flex:1;min-width:0}
-.hist-item .hc .hn{font-size:13px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
-.hist-item .hc .hd{font-size:10px;color:var(--sub)}
-
-.toast{position:fixed;top:60px;left:50%;transform:translateX(-50%);z-index:300;background:var(--dark);color:#fff;padding:10px 20px;border-radius:20px;font-size:13px;opacity:0;transition:opacity 0.3s;pointer-events:none}
-.toast.show{opacity:1}
-
-/* Purchase modal - simple overlay kept for membership */
-.modal-overlay{position:fixed;top:0;left:0;right:0;bottom:0;z-index:250;background:rgba(0,0,0,0.5);display:none;align-items:center;justify-content:center}
-.modal-overlay.on{display:flex}
-.modal-box{background:#fff;border-radius:16px;padding:24px;width:calc(100% - 48px);max-width:360px;text-align:center}
-.modal-box .m-icon{font-size:40px;margin-bottom:6px}
-.modal-box .m-title{font-size:17px;font-weight:700;margin-bottom:4px}
-.modal-box .m-desc{font-size:12px;color:var(--sub);margin-bottom:14px;line-height:1.6}
-
-.sec-head{font-size:14px;font-weight:700;margin:14px 0 8px;display:flex;align-items:center;gap:6px}
-.sec-head .dot{width:6px;height:6px;border-radius:50%;background:var(--pri);flex-shrink:0}
-.scroll-x{display:flex;gap:10px;overflow-x:auto;padding-bottom:4px;-webkit-overflow-scrolling:touch}
-.scroll-x::-webkit-scrollbar{display:none}
-
-/* Back button container */
-.back-row{display:flex;align-items:center;gap:6px;margin-bottom:10px}
-.back-row .bk{cursor:pointer;font-size:13px;color:var(--pri);font-weight:600;display:flex;align-items:center;gap:2px}
-
-/* ═══ SCHULTE 3D CUBE ═══ */
-.cube-scene{perspective:900px;width:300px;height:300px;margin:20px auto;position:relative}
-.cube-scene.paused .cube{animation-play-state:paused}
-.cube{width:100%;height:100%;position:relative;transform-style:preserve-3d;transform:rotateX(-15deg) rotateY(25deg)}
-.cube-face{position:absolute;width:300px;height:300px;border-radius:10px;backface-visibility:hidden}
-.cube-front{transform:translateZ(150px);background:linear-gradient(135deg,#1a1a2e,#16213e)}
-.cube-back{transform:rotateY(180deg) translateZ(150px);background:linear-gradient(135deg,#16213e,#0f3460)}
-.cube-left{transform:rotateY(-90deg) translateZ(150px);background:linear-gradient(135deg,#0f3460,#1a1a2e)}
-.cube-right{transform:rotateY(90deg) translateZ(150px);background:linear-gradient(135deg,#1a1a2e,#2d1b69)}
-.cube-top{transform:rotateX(90deg) translateZ(150px);background:linear-gradient(135deg,#2d1b69,#16213e)}
-.cube-bottom{transform:rotateX(-90deg) translateZ(150px);background:linear-gradient(135deg,#16213e,#1a1a2e)}
-.cube-face .deco-face{font-size:32px;opacity:.2;text-align:center;line-height:1.3;pointer-events:none;position:absolute;inset:0;display:flex;align-items:center;justify-content:center}
-.cube-grid{position:absolute;top:0;left:0;width:300px;height:300px;border-radius:10px;display:grid;grid-template-columns:repeat(5,1fr);grid-template-rows:repeat(5,1fr);gap:2px;padding:4px;z-index:10;background:rgba(26,26,46,.85);box-shadow:0 0 30px rgba(0,0,0,.4),inset 0 0 20px rgba(0,0,0,.2);perspective:400px}
-.cube-grid .cs{display:flex;align-items:center;justify-content:center;font-size:22px;font-weight:800;border-radius:6px;cursor:pointer;transition:transform .15s,box-shadow .15s;user-select:none;-webkit-tap-highlight-color:transparent;background:rgba(255,255,255,.92);color:var(--text);box-shadow:0 4px 14px rgba(0,0,0,.15);animation:cellFloat 3s ease-in-out infinite;transform-style:preserve-3d}
-@keyframes cellFloat{0%,100%{transform:translateY(0) scale(1);box-shadow:0 4px 12px rgba(0,0,0,.18)}50%{transform:translateY(-12px) scale(1.06);box-shadow:0 18px 32px rgba(0,0,0,.42)}}
-.cube-grid .cs:active{transform:scale(.9)!important;animation:none}
-.cube-grid .cs.done{background:rgba(255,255,255,.12);color:transparent;box-shadow:none;pointer-events:none;opacity:0;animation:none}
-.cube-grid .cs.next{animation:cellFloat 3s ease-in-out infinite,csPulse .8s ease-in-out infinite}
-@keyframes csPulse{0%,100%{box-shadow:0 0 8px rgba(229,77,66,.3)}50%{box-shadow:0 0 24px rgba(229,77,66,.85)}}
-.schulte-info{text-align:center;padding:8px 0;color:var(--sub);font-size:12px}
-.schulte-timer{font-size:28px;font-weight:800;color:var(--pri);text-align:center;margin:8px 0}
-.schulte-best{font-size:11px;color:var(--sub);text-align:center}
-.schulte-cta{display:block;margin:10px auto;width:160px}
-.schulte-result{text-align:center;padding:20px 0}
-.schulte-result .sr-time{font-size:36px;font-weight:800;color:var(--pri)}
-.schulte-result .sr-rank{font-size:13px;color:var(--sub);margin-top:4px}
-
-/* Synastry tabs */
-.syn-tab{flex:1;padding:8px 4px;border:none;border-radius:20px;background:#f0f0f0;font-size:11px;font-weight:600;cursor:pointer;transition:all .2s;color:var(--sub)}
-.syn-tab.active{background:var(--pri);color:#fff;box-shadow:0 2px 8px rgba(229,77,66,.2)}
diff --git a/index.html b/index.html
deleted file mode 100644
index 285393a..0000000
--- a/index.html
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-
-
-
-愈心谷
-
-
-
-
- 进入愈心谷
-
-
-
diff --git a/js/common.js b/js/common.js
deleted file mode 100644
index 2425b40..0000000
--- a/js/common.js
+++ /dev/null
@@ -1,331 +0,0 @@
-/* common.js —— 纯数据 + 纯函数,禁止任何 DOM 操作
- shared by: pages/shuzi.html / pages/health.html / pages/decode.html */
-
-// ===== from shuzi.html =====
-function s1(n){while(n>=10)n=String(n).split('').reduce((a,b)=>a+ +b,0);return n}
-function digs(n,l){return String(n).padStart(l,'0').split('').map(Number)}
-function calc(y,m,d){
- const dd=digs(d,2),mm=digs(m,2),yy=digs(y,4);
- const A=dd[0],B=dd[1],C=mm[0],D=mm[1],E=yy[0],F=yy[1],G=yy[2],H=yy[3];
- const v={AB:[A,B],CD:[C,D],EF:[E,F],GH:[G,H]};
- v.I=s1(A+B);v.J=s1(C+D);v.K=s1(E+F);v.L=s1(G+H);
- v.M=s1(v.I+v.J);v.N=s1(v.K+v.L);v.O=s1(v.M+v.N);
- v.Q=s1(v.N+v.O);v.P=s1(v.M+v.O);v.R=s1(v.Q+v.P);
- v.T=s1(v.I+v.M);v.S=s1(v.J+v.M);v.U=s1(v.T+v.S);
- v.V=s1(v.K+v.N);v.W=s1(v.L+v.N);v.X=s1(v.V+v.W);
- return v;
-}
-const tips={
- O:v=>`${v.O}=${v.M}+${v.N}`,M:v=>`${v.M}=${v.I}+${v.J}`,N:v=>`${v.N}=${v.K}+${v.L}`,
- I:v=>`${v.I}=${v.AB[0]}+${v.AB[1]}`,J:v=>`${v.J}=${v.CD[0]}+${v.CD[1]}`,
- K:v=>`${v.K}=${v.EF[0]}+${v.EF[1]}`,L:v=>`${v.L}=${v.GH[0]}+${v.GH[1]}`,
- R:v=>`${v.R}=${v.Q}+${v.P}`,Q:v=>`${v.Q}=${v.N}+${v.O}`,P:v=>`${v.P}=${v.M}+${v.O}`,
- T:v=>`${v.T}=${v.I}+${v.M}`,S:v=>`${v.S}=${v.J}+${v.M}`,U:v=>`${v.U}=${v.T}+${v.S}`,
- V:v=>`${v.V}=${v.K}+${v.N}`,W:v=>`${v.W}=${v.L}+${v.N}`,X:v=>`${v.X}=${v.V}+${v.W}`,
-};
-const NUM={
-1:{title:'天生领袖·开拓者',pos:'自信果敢、创造力爆棚、天生自带光芒',neg:'偶尔孤傲、不擅示弱、容易一个人扛下所有',job:'创始人、管理者、艺术家、独立设计师',elem:'金',desc:'你是天生的领航员,内心有一团不灭的火。你不需要别人告诉你该做什么——你比谁都清楚。独立、果敢、行动力超强,这让你在人群中自带光环。但请记住,真正的强大不是独自承担一切,而是学会信任和依靠。偶尔放下铠甲,你会看到更广阔的世界。'},
-2:{title:'温柔沟通·共情者',pos:'善解人意、沟通力满分、团队里的粘合剂',neg:'太在意他人眼光、容易委屈自己、选择困难',job:'心理咨询师、公关专家、教育者、客户关系',elem:'水',desc:'你有一颗比常人更柔软的心。你能听见别人没说出口的话,感受到空气里的情绪——这是你独一无二的天赋。你是团队里最温暖的存在,总能让人感到被理解。但要记得,你的感受同样重要。温柔不是软弱,拒绝不是伤害。学会为自己发声,你的温柔会更有力量。'},
-3:{title:'创意火花·行动派',pos:'灵感不断、感染力满分、想到就去做',neg:'三分钟热度、急躁冒进、耐不住寂寞',job:'演员、讲师、创意总监、自媒体人',elem:'木',desc:'你的大脑永远在高速运转,灵感像烟花一样炸开。你就是那个能把想法变成现实的人——当别人还在犹豫,你已经冲出去了。你的热情能点燃整个房间。但有时候,慢一点反而更快。不是每个火花都需要燃烧,学会聚焦,你的光芒会更耀眼。'},
-4:{title:'稳妥规划·筑造者',pos:'逻辑缜密、靠谱担当、凡事井井有条',neg:'过于保守、害怕改变、安全感容易动摇',job:'工程师、会计师、项目经理、架构师',elem:'木',desc:'你是那个让所有人放心的人。当世界一片混乱时,你已经在默默列清单了。你的稳不是无趣,是把混乱变成秩序的超能力。每一步都走得扎实,每个细节都心中有数。但生活不是待办清单,偶尔打破计划,会有惊喜。允许自己不那么完美,你已经足够好了。'},
-5:{title:'自由灵魂·探索者',pos:'无拘无束、方向感超强、幽默感爆棚',neg:'讨厌束缚、容易逃避、很难安定下来',job:'旅行博主、作家、自由职业者、冒险家',elem:'土',desc:'你就是风,没人能把你关在笼子里。你的灵魂渴望远方,对世界永远保持好奇。你能在迷茫中找到方向,这是你最珍贵的天赋。你的人生不是按部就班,而是充满冒险的故事。但也要记得,自由不是逃避,真正的自由是拥有选择的能力。找到值得你停留的热爱,那里就是你的家。'},
-6:{title:'智慧远见·鉴赏家',pos:'眼光毒辣、财富直觉、精益求精',neg:'完美主义、容易焦虑、对自己太狠',job:'投资人、咨询顾问、医生、律师',elem:'金',desc:'你有一双看透本质的眼睛。别人看到表面,你看到价值;别人追逐潮流,你预判趋势。你对品质的要求不是挑剔,是对生活的尊重。但完美不是终点,生活有瑕疵才真实。偶尔放低标准,你会发现世界比你想象的更宽容。你值得拥有最好的,包括对自己温柔一点。'},
-7:{title:'深度洞察·求真者',pos:'钻研到底、直觉惊人、看透事物本质',neg:'疏离冷漠、疑心重、社交电量容易耗尽',job:'科学家、侦探、程序员、学者',elem:'水',desc:'别人看热闹,你看门道。你的大脑是永动的探索引擎,对世界的真相充满饥渴。你不需要浅薄的社交,你在意的是深度和意义。这份专注让你在专业领域无人能敌。但请偶尔走出自己的世界,那些看似平凡的人间烟火,也能给你答案。独处是力量,连接是温暖,两者你都值得拥有。'},
-8:{title:'责任担当·成就者',pos:'责任感爆棚、商业嗅觉、野心勃勃',neg:'压力山大、控制欲强、容易透支自己',job:'企业家、高管、投资人、政治家',elem:'土',desc:'你注定不是普通人。你肩膀上扛着比常人更重的使命,心中有比常人更大的蓝图。你的责任感和行动力让你天然成为领袖。但你不需要扛起整个世界,真正的领导者懂得分担负重。学会休息不是懈怠,是为了走更远的路。你值得被照顾,不只是照顾别人。'},
-9:{title:'博爱大器·成功者',pos:'慈悲大爱、机会磁铁、自带成功气场',neg:'贪多嚼不烂、难以专注、理想主义过头',job:'慈善家、艺人、灵性导师、社会活动家',elem:'火',desc:'你身上有一种让人想靠近的魔力。你的心中装着比个人更大的东西——爱与使命感是你最强的驱动力。机会总是向你涌来,因为你值得。你天生自带好运体质。但不需要抓住所有机会,挑一个最让你心动的,全力以赴。你的存在,本身就是一种治愈。'},
-};
-const JOINT={
-'112':'独当一面,做事靠谱有担当','123':'天生讲师,开口就能圈粉','134':'灵感落地,把创意变成现实',
-'145':'运筹帷幄,天生的规划师','156':'八方来财,处处遇贵人','167':'白手起家,靠自己闯天下',
-'178':'成就他人,身边贵人不断','189':'停不下来的工作狂','191':'独立开创,没人能阻挡你',
-'213':'口才炸裂,感染力爆棚','224':'心太软,善良是你的底牌','235':'沟通达人,三言两语暖人心',
-'246':'贵人环绕,销冠体质','257':'直觉导航,跟着感觉走就对了','268':'重情重义,一诺千金',
-'279':'异性缘超好,走到哪都是焦点','281':'大单收割机,谈判桌王者','292':'幕后军师,运筹帷幄之中',
-'314':'创意执行力,说干就干','325':'感性沟通,用温度打动人心','336':'资源连接器,人脉即财富',
-'347':'深耕专业,做领域里的王','358':'行动派领袖,带队冲锋','369':'万花筒人生,十八般武艺样样通',
-'415':'规划力MAX,步步为营','426':'智慧型销售,成交于无形','437':'学术大佬,坐冷板凳也能发光',
-'448':'靠谱天花板,交给你就放心了','459':'策划大师,脑子比电脑快','461':'稳扎稳打,厚积薄发',
-'472':'火眼金睛,精准分析一切','483':'技术大牛,专业领域独孤求败','494':'完美规划师,细节控本控',
-'516':'方向感+大智慧,走哪都是对的','527':'感性直觉,第六感超准','538':'天生领袖,气场两米八',
-'549':'规划型赢家,稳操胜券','551':'风一样自由,方向感自带导航','562':'会赚也会花,享受生活',
-'573':'贵人相助命,总有高人来指点','584':'责任+规划,双核驱动','595':'梦想家体质,心有多大舞台就有多大',
-'617':'白手起家,命运由我不由天','628':'财富+沟通,双商在线','639':'多才多艺,斜杠青年本青',
-'641':'务实派经营者,脚踏实地','652':'财富雷达,赚钱直觉超准','663':'完美主义+财富,精品人生',
-'674':'天生傲骨,不甘平凡','685':'商业+责任,事业标杆','696':'极致追求,匠人精神',
-'718':'钻研成王,责任铸就传奇','729':'桃花运旺,魅力无法挡','731':'创新领袖,敢为天下先',
-'742':'神机妙算,谋定而后动','753':'直觉行动派,干就完了','764':'精打细算,每一分钱都花在刀刃上',
-'775':'王者基因,注定站在C位','786':'商业领袖,运筹帷幄','797':'极致深钻,领域天花板',
-'819':'亲力亲为,掌控全局','821':'大单高手,说服力满格','832':'行动+沟通,效率拉满',
-'843':'技术专家,一技傍身走天下','854':'规划+自由,收放自如','865':'财富+责任,扛得住世界',
-'876':'商业王者,霸气外露','887':'强势担当,说到做到','898':'大事业格局,志在千里',
-'911':'大爱无疆,独立而温柔','922':'温柔至善,人间小天使','933':'巧手匠心,万物皆可造',
-'944':'稳中求进,计划周全','955':'自由博爱,灵魂有趣','966':'完美+智慧,人间清醒',
-'977':'深度大爱,为理想燃烧','988':'商业帝国缔造者','999':'极致巅峰,满分人生',
-};
-const MISS_MSG={
-1:'内心的领袖力还在沉睡——试着在小事上果断决策,你会发现自己比想象中更强大',
-2:'你的声音值得被听见——从今天开始,勇敢说出你的想法,别怕被拒绝',
-3:'行动力是等待点燃的火种——别再想了,先迈出第一步,剩下的路会自动展开',
-4:'安全感不是等来的,是建出来的——给自己一个可以依靠的小习惯,它会慢慢长大',
-5:'你的指南针正在校准中——去尝试那些让你心跳加速的事,方向自会出现',
-6:'财富嗅觉是可以培养的——从关注自己的价值开始,你会发现自己值得更多',
-7:'深度的力量需要聚焦——找一个让你好奇的问题,像侦探一样追下去',
-8:'你的使命感正在觉醒——找到那件让你热血沸腾的事,扛起来走下去',
-9:'大爱需要边界——学会对自己说"够了",你的能量会用在对的地方',
-};
-const MISS_STRONG={
-1:'自信女神本神,偶尔听一下别人的意见会更完美',
-2:'沟通力溢出屏幕,但别忘了先连接自己的内心',
-3:'活力四射到飞起,偶尔刹车踩一踩,走得更远',
-4:'稳得像座山,但偶尔翻个墙看看外面的世界也不错',
-5:'自由到炸裂,找个值得停靠的港湾也很酷',
-6:'完美主义拉满,对自己说一句"已经够好了"试试',
-7:'沉迷思考无法自拔,偶尔出来晒晒太阳吧',
-8:'责任扛得太多啦,分一些给信得过的人',
-9:'爱心泛滥到溢出,聚焦一件最想改变的事会更有力量',
-};
-
-// ===== from yangsheng.html =====
-var TG=['甲','乙','丙','丁','戊','己','庚','辛','壬','癸'];
-var DZ=['子','丑','寅','卯','辰','巳','午','未','申','酉','戌','亥'];
-var TGE={甲:'木',乙:'木',丙:'火',丁:'火',戊:'土',己:'土',庚:'金',辛:'金',壬:'水',癸:'水'};
-var DZE={子:'水',丑:'土',寅:'木',卯:'木',辰:'土',巳:'火',午:'火',未:'土',申:'金',酉:'金',戌:'土',亥:'水'};
-var DZ_ANI=['鼠','牛','虎','兔','龙','蛇','马','羊','猴','鸡','狗','猪'];
-var EC={木:'#5CB85C',火:'#E54D42',土:'#E8985A',金:'#C8923A',水:'#4A90E2'};
-var EO=['木','火','土','金','水'];
-
-// 纳音 (60甲子)
-var NAYIN_MAP = {};
-(function(){
- var n30 = [
- '海中金','炉中火','大林木','路旁土','剑锋金','山头火',
- '涧下水','城头土','白蜡金','杨柳木','泉中水','屋上土',
- '霹雳火','松柏木','流年水','砂石金','山下火','平地木',
- '壁上土','金箔金','覆灯火','天河水','大驿土','钗钏金',
- '桑柘木','大溪水','沙中土','天上火','石榴木','大海水'
- ];
- for(var i=0;i<60;i++){
- var tg = TG[i%10], dz = DZ[i%12];
- NAYIN_MAP[tg+dz] = n30[Math.floor(i/2)];
- }
-})();
-
-var ST = [
- {n:'小寒',m:1,d:5},{n:'大寒',m:1,d:20},{n:'立春',m:2,d:4},{n:'雨水',m:2,d:19},
- {n:'惊蛰',m:3,d:5},{n:'春分',m:3,d:20},{n:'清明',m:4,d:5},{n:'谷雨',m:4,d:20},
- {n:'立夏',m:5,d:5},{n:'小满',m:5,d:21},{n:'芒种',m:6,d:5},{n:'夏至',m:6,d:21},
- {n:'小暑',m:7,d:7},{n:'大暑',m:7,d:22},{n:'立秋',m:8,d:7},{n:'处暑',m:8,d:23},
- {n:'白露',m:9,d:7},{n:'秋分',m:9,d:23},{n:'寒露',m:10,d:8},{n:'霜降',m:10,d:23},
- {n:'立冬',m:11,d:7},{n:'小雪',m:11,d:22},{n:'大雪',m:12,d:7},{n:'冬至',m:12,d:22}
-];
-var MONTH_DZ=['寅','卯','辰','巳','午','未','申','酉','戌','亥','子','丑'];
-
-function gzYear(y){return{tg:TG[(y-4)%10],dz:DZ[(y-4)%12]};}
-function getST(d){
- var m=d.getMonth()+1, dd=d.getDate(), t=null;
- for(var i=ST.length-1;i>=0;i--){var s=ST[i];if(m>s.m||(m===s.m&&dd>=s.d)){t=s;break;}}
- return t||ST[ST.length-1];
-}
-function getMDz(st){
- var bi=ST.findIndex(function(s){return s.n==='立春';});
- return MONTH_DZ[Math.floor(((ST.indexOf(st)-bi+24)%24)/2)];
-}
-
-function getBazi(d,h){
- var y=d.getFullYear();
- var gzY=gzYear(y);
- var dayOfYear=Math.floor((d-new Date(y,0,0))/86400000);
- var lcDay=35; // 立春approx day
- var mi=Math.floor(((dayOfYear-lcDay+365)%365)/30.44);
- if(mi<0)mi+=12;if(mi>=12)mi=11;
- var mTg=TG[(((y-4)%10)*2+mi)%10];
- var mDz=DZ[(mi+2)%12];
- var base=new Date(1900,0,1);
- var dd=Math.floor((d-base)/86400000);
- var dTg=TG[((dd%10)+10)%10];
- var dDz=DZ[((dd%12)+12)%12];
- var hDz=DZ[Math.floor((h+1)/2)%12];
- var hTg=TG[(TG.indexOf(dTg)*2+DZ.indexOf(hDz))%10];
- return{year:{tg:gzY.tg,dz:gzY.dz},month:{tg:mTg,dz:mDz},day:{tg:dTg,dz:dDz},hour:{tg:hTg,dz:hDz}};
-}
-
-function calc5E(bz){
- var c={木:0,火:0,土:0,金:0,水:0};
- [bz.year,bz.month,bz.day,bz.hour].forEach(function(p){c[TGE[p.tg]]++;c[DZE[p.dz]]++;});
- var t=0;EO.forEach(function(e){t+=c[e];});
- var r={};EO.forEach(function(e){r[e]=Math.round(c[e]/t*100);});
- return r;
-}
-
-function getConst(p){
- var s=EO.slice().sort(function(a,b){return p[b]-p[a];});
- var strong=s[0], weak=s[4];
- var detail={
- '木':{
- primary:'气郁质', secondary:'血瘀质', strong:'肝', weak:'脾',
- desc:'你的身体像一棵需要舒展的大树。肝气就像树的枝叶,需要自由伸展才能舒畅。你积极进取,但也容易因压力而紧绷——胸闷、偏头痛、情绪波动都是身体在说"我需要透透气"。春天是你最敏感的季节,别把情绪关在心里。',
- body:'体型偏瘦或适中,面色偏青黄。指甲容易脆裂,眼睛容易干涩——这都是肝血在提醒你。春季容易过敏,舌边偏红。',
- tips:'疏肝理气是头等大事。多运动、多表达、别把委屈憋在心里。玫瑰花茶是你的好朋友,明亮通风的环境就是你的充电站。',
- diseases:'偏头痛、高血压、甲状腺结节、乳腺增生、月经不调、胁间神经痛。长期压抑情绪会"化火伤阴"。',
- seasonRisk:'春天最敏感——过敏、血压波动。秋天金克木,容易情绪低落。',
- foodTherapy:'绿色蔬菜是主角(菠菜、芹菜、西兰花)。少来点酸的(山楂、柠檬),别过量。玫瑰花茶、薄荷茶疏肝解郁。荞麦、小米养肝血。',
- dailyRhythm:'早上醒来拉伸5分钟,像猫一样舒展。上午11点前搞定重要决策(肝气最旺)。晚上11点前入睡养肝血。'
- },
- '火':{
- primary:'湿热质', secondary:'阴虚质', strong:'心', weak:'肺',
- desc:'你的内心有一团温暖的火。热情、感染力强是你的超能力,但这团火也容易烧得太旺——心浮气躁、失眠多梦、口腔溃疡都是信号。夏天是你最需要注意的季节,学会给内心降温。',
- body:'面色偏红,手心脚心热乎乎的,容易出汗。皮肤容易出油长痘,舌尖偏红。夏天尤其难熬,总想喝冰的。',
- tips:'清心降火、静养心神。午休(11-13点)是黄金养心时间。莲子心茶、菊花茶是你的清凉剂。少熬夜,少参与激烈争吵——伤的是自己。',
- diseases:'失眠、口腔溃疡反复、心悸焦虑、高血压、皮肤痘痘。严重时心火下移,可能引起尿路问题。',
- seasonRisk:'夏天最敏感——暑热+心火,容易心烦中暑。冬天水克火,注意防寒护心。',
- foodTherapy:'苦味清心(苦瓜、莲子心)。红色食物养心(红枣、枸杞、番茄)。绿豆汤、百合莲子羹清心安神。西瓜、黄瓜解暑生津。',
- dailyRhythm:'午时(11-13点)小憩15-30分钟,像给手机充电。傍晚微微出汗的运动最好。睡前温水泡脚,把火气引下去。'
- },
- '土':{
- primary:'痰湿质', secondary:'气虚质', strong:'脾', weak:'肾',
- desc:'你像大地一样稳重可靠,是所有人都想依靠的人。但思虑太多会伤脾——饭后犯困、身体沉重、大便不成形,都是脾胃在喊累。长夏湿热季节是你最需要照顾自己的时候。脾胃好,一切都好。',
- body:'体型偏丰满,肌肉松软,腹部容易囤积。面色偏黄,舌头胖大。梅雨季会特别不舒服,头重脚轻。',
- tips:'健脾祛湿是核心功课。吃饭七分饱,细嚼慢咽——这不是规矩,是爱自己。山药薏米粥、陈皮茶都是好帮手。别老坐着,动起来帮脾胃运转。',
- diseases:'肥胖、高血脂、脂肪肝、慢性胃炎、消化不良、眩晕、湿疹。',
- seasonRisk:'长夏(7-8月)最难熬——湿热交蒸,浑身沉重。春天肝气犯脾,容易胃痛腹泻。',
- foodTherapy:'甘淡的食物最养脾(山药、茯苓、薏米)。黄色食物是脾胃的好朋友(小米、南瓜、玉米)。陈皮理气,生姜暖中。冰的、甜的、腻的——少碰。',
- dailyRhythm:'早餐7-9点必须吃好吃饱(胃经当令)。饭后散步10分钟助消化。晚餐早一点、少一点。'
- },
- '金':{
- primary:'阴虚质', secondary:'气郁质', strong:'肺', weak:'肝',
- desc:'你像一把精密的乐器,条理分明、追求完美。但肺为"娇脏",怕燥怕干——皮肤干燥、秋冬咳嗽、喉咙不适都是它在提醒你。秋天是你最要呵护自己的季节,给自己多一点滋润。',
- body:'偏瘦,皮肤容易干燥起皮,嘴唇干裂。手心脚心热,晚上容易盗汗。秋天特别敏感,容易便秘。',
- tips:'滋阴润肺是关键。白色食物是你的好朋友(银耳、百合、雪梨)。辛辣烧烤油炸——能躲就躲。早睡比什么都养阴,腹式呼吸能帮你增强肺力。',
- diseases:'慢性咽炎、干咳、支气管炎、皮肤干燥、便秘、过敏性鼻炎、荨麻疹。',
- seasonRisk:'秋天最敏感——燥邪伤肺,干咳咽痒。夏天火克金,心肺都要护。',
- foodTherapy:'白色食物润肺(银耳、百合、山药、雪梨、莲藕)。蜂蜜、麦冬、沙参滋阴润燥。菊花、薄荷清肺。远离辛辣、烧烤、烟酒。',
- dailyRhythm:'清晨(5-7点大肠经)排清宿便。上午深呼吸5分钟。午后吃个梨或喝银耳羹。晚上9点前入睡养肺阴。保持房间湿度50%-60%。'
- },
- '水':{
- primary:'阳虚质', secondary:'痰湿质', strong:'肾', weak:'心',
- desc:'你像深潭里的水,沉静而有深度。智慧是你的底色,但阳气不足会让你畏寒怕冷、腰膝酸软、缺乏安全感。肾是先天之本,冬天是你最需要温暖的季节——对自己好一点,从保暖开始。',
- body:'体型偏丰满或有浮肿感,面色偏白或晦暗。手脚冰凉,晚上起夜多,头发容易掉。腰膝冷痛是常见信号。',
- tips:'温阳补肾是首要任务。多晒太阳,特别是晒后背——那是你的"阳气充电板"。艾灸关元、命门、腰要暖、脚要热。黑豆、核桃、肉桂都是你的好朋友。',
- diseases:'慢性肾炎、甲减、骨质疏松、腰椎问题、耳鸣耳聋、不孕不育。寒湿导致关节痛。',
- seasonRisk:'冬天最难熬——寒气伤阳,浑身发冷。长夏湿气困肾,水肿加重。',
- foodTherapy:'黑色食物补肾(黑豆、黑芝麻、黑米、桑葚)。核桃、山药、枸杞温补肾阳。海带、紫菜适量。冰镇饮料、生冷瓜果——戒了。',
- dailyRhythm:'早晨7-9点晒太阳15分钟补阳气。上午搓腰眼至发热。下午5-7点(肾经当令)休息养肾。晚上热水泡脚至微微出汗。冬天早睡晚起。'
- }
- };
- return detail[strong];
-}
-
-function getEmotion(strongEl){
- var m={
- '木':{
- strength:['创造力','决策力','学习能力','进取心','目标感'],
- risk:['焦虑','易怒','急躁','偏头痛倾向','经前紧张(女)'],
- advice:'遇事深呼吸三秒再回应。每日快走30分钟疏解肝气。学习正念冥想。',
- color:'绿'
- },
- '火':{
- strength:['热情','感染力','表达力','社交能力','行动力'],
- risk:['失眠','焦躁','心神不宁','多梦','舌尖溃疡'],
- advice:'午时(11-13点)小憩养心。少刷手机,睡前温水泡脚。练习书法静心。',
- color:'红'
- },
- '土':{
- strength:['稳重','包容','耐心','执行力','可信赖'],
- risk:['思虑过度','脾胃不适','优柔寡断','过度操心'],
- advice:'饭后散步10分钟助运化。学会说"不",减轻负担。培养一个动手爱好。',
- color:'黄'
- },
- '金':{
- strength:['条理','决断','专注','毅力','原则性'],
- risk:['悲伤','忧愁','呼吸道敏感','皮肤干燥','便秘'],
- advice:'练习腹式呼吸强肺。多与朋友交流倾诉。保持环境湿度。',
- color:'白'
- },
- '水':{
- strength:['智慧','洞察','冷静','适应力','深度思考'],
- risk:['恐惧','孤独感','腰膝酸软','听力下降','记忆力减退'],
- advice:'冬季注意腰腹保暖。练习站桩固肾。多听音乐舒缓恐惧。',
- color:'黑'
- }
- };
- return m[strongEl];
-}
-
-function getWYLQ(year){
- var gz=gzYear(year);
- var tgI=TG.indexOf(gz.tg);
- var zy=TGE[gz.tg]; // 中运
- var tg2=tgI%2===0; // 太过
- var dzI=DZ.indexOf(gz.dz);
- var sitianMap={'子':'午','丑':'未','寅':'申','卯':'酉','辰':'戌','巳':'亥','午':'子','未':'丑','申':'寅','酉':'卯','戌':'辰','亥':'巳'};
- var st=DZ[DZ.indexOf(sitianMap[gz.dz])];
- var zq=st;
- var stepNum=Math.floor((new Date().getMonth())/2);
- var zhuqi=['厥阴风木','少阴君火','少阳相火','太阴湿土','阳明燥金','太阳寒水'];
- var keqiOrder = [];
- var stIdx=DZ.indexOf(st);
- for(var k=0;k<6;k++) keqiOrder.push(DZ[(stIdx+k)%12]);
- return{zhongyun:zy,taiguo:tg2,sitian:st,zaiquan:zq,zhuqi:zhuqi,keqiOrder:keqiOrder,stepNum:stepNum,yearTg:gz.tg,yearDz:gz.dz};
-}
-
-function getCurAnalysis(){
- var now=new Date();
- var w=getWYLQ(now.getFullYear());
- var term=getST(now);
- var mDz=getMDz(term);
- var m=DZE[mDz];
- var seMap={3:'木',4:'木',5:'火',6:'火',7:'土',8:'土',9:'金',10:'金',11:'水',12:'水',1:'水',2:'木'};
- var se=seMap[now.getMonth()+1];
- var ww={};
- EO.forEach(function(e){
- var i=EO.indexOf(e), si=EO.indexOf(se);
- if(e===se)ww[e]='旺';
- else if(e===EO[(si+1)%5])ww[e]='相';
- else if(e===EO[(si+4)%5])ww[e]='休';
- else if(e===EO[(si+2)%5])ww[e]='囚';
- else ww[e]='死';
- });
- var step=Math.floor((now.getMonth())/2);
- return{date:now,year:now.getFullYear(),term:term,monthDz:mDz,monthEl:m,seasonEl:se,waxWane:ww,wylq:w,step:step};
-}
-
-// 子午流注 12 时辰
-var meridian=[
- {h:1,n:'丑时',o:'肝经',act:'熟睡养肝血',tip:'深度睡眠黄金期'},
- {h:3,n:'寅时',o:'肺经',act:'深睡养肺气',tip:'哮喘易发时段'},
- {h:5,n:'卯时',o:'大肠经',act:'起床排便',tip:'最佳排便时间'},
- {h:7,n:'辰时',o:'胃经',act:'吃早餐',tip:'胃气最旺时进食'},
- {h:9,n:'巳时',o:'脾经',act:'工作学习',tip:'脾运化最佳'},
- {h:11,n:'午时',o:'心经',act:'午餐小憩',tip:'养心阴黄金30分钟'},
- {h:13,n:'未时',o:'小肠经',act:'消化吸收',tip:'多喝水助排浊'},
- {h:15,n:'申时',o:'膀胱经',act:'学习记忆',tip:'记忆力最佳时段'},
- {h:17,n:'酉时',o:'肾经',act:'休息养肾',tip:'不宜剧烈运动'},
- {h:19,n:'戌时',o:'心包经',act:'放松散步',tip:'保持心情愉快'},
- {h:21,n:'亥时',o:'三焦经',act:'准备入睡',tip:'泡脚听轻音乐'},
- {h:23,n:'子时',o:'胆经',act:'深度睡眠',tip:'必须睡觉养胆气'}
-];
-
-// 五行-时令风险库(25种组合)
-var riskDB={
- '木_火':{t:'心火偏旺',d:'木生火,夏季火旺叠加先天木盛,心火易亢。木火相煽,热扰心神。',sy:['失眠多梦','焦躁易怒','口干心烦','舌尖红','小便黄'],act:'午时小憩养心,睡前温水泡脚。喝莲子心茶清心火。减少咖啡和激烈运动。按揉神门穴、内关穴。'},
- '木_木':{t:'肝气过亢',d:'春木逢木,肝气太过。木旺生风,上扰清窍。',sy:['头晕目眩','偏头痛','血压波动','眼干眼胀'],act:'每日快走30分钟疏肝。喝菊花枸杞茶清肝明目。按揉太冲穴、行间穴。避免熬夜和情绪激动。'},
- '木_土':{t:'肝木克土',d:'先天木旺克制脾土,脾胃运化受阻。',sy:['食欲不振','腹胀嗳气','大便不调','疲倦乏力'],act:'少食多餐,温热饮食。饭前喝一小碗小米粥护脾胃。饭后散步10分钟。按揉足三里、中脘穴。避免生气时进食。'},
- '木_金':{t:'木侮金',d:'木气过盛反侮肺金。',sy:['干咳少痰','咽喉不适','皮肤过敏'],act:'保持室内湿度,喝蜂蜜梨水润肺。练习腹式呼吸。避免辛辣和干燥环境。'},
- '木_水':{t:'子盗母气',d:'木旺耗水,肾水暗亏。',sy:['腰膝酸软','耳鸣','脱发增多'],act:'多吃黑芝麻、核桃补肾。搓腰眼至发热。减少熬夜,保证子时(23点前)入睡。'},
- '火_火':{t:'心火亢盛',d:'火上加火,两阳相劫,耗伤心阴。',sy:['心悸怔忡','盗汗','烦躁不宁','口腔溃疡频发','面赤'],act:'务必午休养心阴。绿豆百合汤清心安神。避免烈日下活动和辛辣食物。睡前温水泡脚引火下行。按揉神门、涌泉穴。'},
- '火_木':{t:'木火刑金',d:'火得木生更旺,反侮肺金。',sy:['干咳','鼻衄','皮肤干燥','便秘'],act:'桑叶菊花茶清肺润燥。多吃梨、银耳、蜂蜜。保持环境湿润。避免烧烤和烟酒。'},
- '火_土':{t:'火生土亢',d:'火旺生土过度,湿热内生。',sy:['口苦口臭','大便黏滞','皮肤油腻长痘','头重身困'],act:'薏米赤小豆汤祛湿热。少甜食油腻。保持皮肤清洁干爽。荷叶茶清热利湿。'},
- '火_水':{t:'火盛水涸',d:'心火亢盛下劫肾水,心肾不交。',sy:['心烦失眠','腰膝酸软','耳鸣','记忆力下降','夜尿频'],act:'黄连阿胶汤类方交通心肾。睡前热水泡脚至微汗。按揉涌泉、太溪穴。避免熬夜和过度用脑。'},
- '火_金':{t:'火克金',d:'心火乘肺金,肺阴受损。',sy:['干咳无痰','咽干喉痛','皮肤粗糙','毛发干枯'],act:'麦冬沙参茶润肺生津。银耳百合羹每周3次。腹式深呼吸养肺。居室保持50%湿度。'},
- '土_火':{t:'火生土壅',d:'火旺生土,湿热蕴脾。',sy:['身重困倦','头蒙如裹','口黏不爽','大便溏滞'],act:'薏米茯苓粥健脾祛湿。室内通风除湿。少思虑多运动。按揉阴陵泉、丰隆穴。'},
- '土_土':{t:'脾湿壅盛',d:'土气过旺,湿浊内停。',sy:['身体沉重','腹胀满闷','痰多','浮肿'],act:'陈皮薏仁茶理气化湿。控制食量七分饱。每天快走40分钟。按揉足三里、天枢穴。'},
- '土_水':{t:'脾土克水',d:'土盛克水,肾阳受损。',sy:['水肿','小便不利','腰冷痛','畏寒'],act:'茯苓山药粥健脾利水。艾灸关元、命门温阳。避免久坐久卧。'},
- '土_木':{t:'土虚木乘',d:'湿土困脾,肝木乘虚而入。',sy:['胃痛','反酸','情绪波动时加重'],act:'饭前少量生姜水暖胃。少食多餐减轻脾胃负担。保持情绪稳定,饭后不生气。'},
- '水_火':{t:'水火不济',d:'夏季火旺克水,先天水盛之人肾水受制,心肾不交。',sy:['心烦不得眠','五心烦热','腰膝酸软','健忘','耳鸣加重'],act:'交泰丸类方交通心肾。睡前搓涌泉穴100次。下午5-7点(肾经当令)休息。少吃生冷,多晒太阳补阳。'},
- '水_水':{t:'寒湿内盛',d:'水气过旺,寒湿困阻。',sy:['畏寒肢冷','关节疼痛','水肿','小便清长'],act:'艾灸关元、命门、足三里。生姜红糖水温中散寒。多晒太阳尤其后背。冬季泡温泉。忌冰饮冷食。'},
- '水_木':{t:'水不涵木',d:'水亏不能养木,虚风内动。',sy:['头晕','手抖','失眠'],act:'枸杞菊花茶滋水涵木。早睡养肾阴。减少用眼过度。按揉太冲、太溪穴。'},
- '水_金':{t:'金不生水',d:'金被火克不能生水,肾水枯竭。',sy:['腰酸','脱发','牙齿松动','骨关节退变'],act:'黑豆核桃粥补肾填精。西洋参麦冬茶气阴双补。搓腰眼每日100次。适当负重运动强骨。'},
- '金_火':{t:'肺燥津伤',d:'火克金,肺阴受损。燥热伤津,肺失肃降。',sy:['干咳无痰或少痰','咽干鼻燥','皮肤干痒','大便秘结','声音嘶哑'],act:'川贝雪梨汤润肺止咳。室内加湿器保持50%-60%湿度。腹式深呼吸每次5分钟。避免辛辣油炸烧烤。麦冬沙参泡水代茶。'},
- '金_金':{t:'肺气壅滞',d:'金气过盛,肺失宣降。',sy:['胸闷气短','咳嗽','皮肤干燥脱屑'],act:'白萝卜蜂蜜水宣肺化痰。户外深呼吸新鲜空气。适度有氧运动微汗。按揉太渊、列缺穴。'},
- '金_木':{t:'金乘肝木',d:'肺金过盛抑制肝木疏泄。',sy:['情绪抑郁','胸胁胀痛','经前不适(女)'],act:'玫瑰花薄荷茶疏肝解郁。多与朋友交流倾诉。快走或瑜伽舒畅气机。按揉太冲、期门穴。'},
-};
diff --git a/js/decode.js b/js/decode.js
deleted file mode 100644
index 1e9d295..0000000
--- a/js/decode.js
+++ /dev/null
@@ -1,210 +0,0 @@
-/* ---------- 工具 ---------- */
-function qp(k){return new URLSearchParams(location.search).get(k);}
-function strongestEl(p){return EO.reduce((a,b)=>p[b]>p[a]?b:a,EO[0]);}
-function esc(s){return (s||'').replace(/'+(n!=null?n:'')+' ';
- }
- var s='';
- s+=cell(cx-CW/2,0,apex,true);
- s+=cell(cx-CW-GY/2,CH+GY,mid[0])+cell(cx+GY/2,CH+GY,mid[1]);
- base.forEach(function(n,i){ s+=cell(i*(CW+GY),(CH+GY)*2,n); });
- s+=' ';
- return s;
-}
-
-/* ---------- 今日锦囊 ---------- */
-var SEASON_EL={0:'水',1:'水',2:'木',3:'木',4:'木',5:'火',6:'火',7:'火',8:'土',9:'金',10:'金',11:'水'};
-var YI_JI={
- 木:{yi:'早睡养肝血 · 舒展拉伸 · 绿色蔬菜',ji:'久坐 · 生闷气 · 熬夜'},
- 火:{yi:'午休15分钟 · 菊花/莲子 · 平心静气',ji:'暴晒 · 辛辣油腻 · 过度兴奋'},
- 土:{yi:'规律三餐 · 健脾山药 · 饭后散步',ji:'思虑过度 · 生冷 · 暴饮暴食'},
- 金:{yi:'滋润养肺 · 白色食物 · 深呼吸',ji:'干燥受凉 · 悲忧 · 剧烈耗气'},
- 水:{yi:'早卧晚起 · 温补黑色食物 · 护腰腹',ji:'受寒 · 过劳 · 惊恐紧张'}
-};
-function todaySolar(){
- var now=new Date(),m=now.getMonth()+1,d=now.getDate();
- var cur=ST[0];
- for(var i=0;it.m||(m===t.m&&d>=t.d)) cur=t; }
- return cur;
-}
-
-/* ---------- 主渲染 ---------- */
-function render(){
- var y=+qp('y'),m=+qp('m'),d=+qp('d');
- var box=document.getElementById('report');
- if(!y||!m||!d||y<1900||y>2100){
- box.innerHTML='缺少有效生日参数,请从首页重新进入 🙏
';return;
- }
- document.getElementById('disc').style.display='block';
-
- // === 数字引擎 ===
- var v=calc(y,m,d);
- var mainNum=v.O;
- var person=NUM[mainNum]||{title:'',pos:'',neg:'',job:'',desc:''};
-
- // === 养生引擎(无时辰,默认午时12点) ===
- var bz=getBazi(new Date(y,m-1,d),12);
- var p5=calc5E(bz);
- var strong=strongestEl(p5);
- var cst=getConst(p5);
- var emo=getEmotion(strong);
-
- // === 今日锦囊 ===
- var st=todaySolar();
- var sEl=SEASON_EL[new Date().getMonth()];
- var yj=YI_JI[sEl];
-
- var paid=localStorage.getItem('jiema_paid')==='1';
-
- box.innerHTML=
- ''+
- ''+
- '
✨ 数字性格密码 '+
- '
'+mainNum+'
'+
- '
'+mainNum+'号人 · '+esc(person.title)+'
'+
- '
'+esc((person.desc||'').split(/[。.]/)[0])+'
'+
- '
'+miniPyramid(v)+'
'+
- '
'+
- '
'+
- '天赋优势: '+esc(person.pos)+' '+
- '人生课题: '+esc(person.neg)+' '+
- '适合方向: '+esc(person.job)+' '+
- '能量解读: '+esc(person.desc)+
- '
'+
- '
'+
- '
🔒 解锁你的完整密码
'+
- '
天赋优势 · 人生课题 · 适合方向 · 12组联合码深度解读
'+
- '
¥39.9 立即解锁 → '+
- '
'+
- '
'+
- '
'+
-
- ''+
- ''+
- '
🌿 五行体质画像 '+
- '
'+esc(cst.primary)+'
'+
- '
核心养护:养'+esc(cst.strong)+' · 需呵护'+esc(cst.weak)+'
'+
- '
'+
- EO.map(function(e){return '
';}).join('')+
- '
'+
- '
🎭 情绪画像:'+esc((emo.strength||[]).join(' · '))+'
'+
- '
'+
- '
'+
- '体质特征: '+esc(cst.body)+' '+
- '调养要点: '+esc(cst.tips)+' '+
- '易感倾向: '+esc(cst.diseases)+' '+
- '季节风险: '+esc(cst.seasonRisk)+' '+
- '食疗方向: '+esc(cst.foodTherapy)+' '+
- '作息节律: '+esc(cst.dailyRhythm)+
- '
'+
- '
'+
- '
🔒 解锁五行体质深度分析
'+
- '
脏腑画像 · 易感倾向 · 食疗 · 运动作息方案
'+
- '
¥39.9 立即解锁 → '+
- '
'+
- '
'+
- '
'+
-
- ''+
- ''+
- '
🎯 今日养生锦囊 '+
- '
当前节气:'+st.n+' · 时令 '+sEl+' 当令
'+
- '
今日调养建议 '+
- '
宜: '+yj.yi+'
'+
- '
忌: '+yj.ji+'
'+
- '
'+
-
- ''+
- ''+
-
- ''+
- ''+
-
- ''+
- ''+
- '🦋 分享你的身心密码 '+
- '📱 生成分享卡片 '+
- '
';
-}
-
-/* ---------- 付费墙 ---------- */
-function unlock(){
- document.getElementById('payModal').classList.add('on');
-}
-function doUnlock(){
- localStorage.setItem('jiema_paid','1');
- document.querySelectorAll('.lock').forEach(function(el){el.classList.add('unlocked');});
- document.getElementById('payModal').classList.remove('on');
-}
-
-/* ---------- 契合度(免费仅分数,深度引导付费/双人报告) ---------- */
-function matchTest(y1,m1,d1){
- var y=+document.getElementById('tY').value,
- m=+document.getElementById('tM').value,
- d=+document.getElementById('tD').value;
- if(!y||!m||!d){alert('请输入 TA 的完整生日');return;}
- var a=calc(y1,m1,d1).O, b=calc(y,m,d).O;
- var diff=Math.abs(a-b);
- var score=92-diff*6+((a+b)%3)*3;
- score=Math.max(60,Math.min(98,score));
- document.getElementById('matchOut').innerHTML=
- ''+score+' 分
'+
- ''+
- '
你们在沟通节奏、能量互补、相处课题上的详细解读……
'+
- '
'+
- '
🔒 解锁完整契合度解读
'+
- '
关系能量图 · 相处建议 · 沟通指南
'+
- '
¥129 查看完整解读 → '+
- '
'+
- '
';
-}
-
-/* ---------- 分享卡片(纯 canvas,无外部库) ---------- */
-function genShare(numTitle,constType,ysKey){
- var c=document.getElementById('shareCanvas'),g=c.getContext('2d');
- var W=c.width,H=c.height;
- var grd=g.createLinearGradient(0,0,0,H);
- grd.addColorStop(0,'#FF9F80');grd.addColorStop(1,'#FFC8B5');
- g.fillStyle=grd;g.fillRect(0,0,W,H);
- g.fillStyle='#fff';g.textAlign='center';
- g.font='bold 40px sans-serif';g.fillText('愈心解码',W/2,90);
- g.font='20px sans-serif';g.fillText('一个生日,读懂身与心',W/2,128);
- // 卡片
- g.fillStyle='rgba(255,255,255,.95)';
- roundRect(g,60,180,W-120,380,24);g.fill();
- g.fillStyle='#8a6d3b';g.font='bold 46px sans-serif';
- g.fillText(numTitle,W/2,290);
- g.fillStyle='#5CB85C';g.font='bold 40px sans-serif';
- g.fillText(constType,W/2,390);
- g.fillStyle='#666';g.font='24px sans-serif';
- g.fillText('养生重点:'+ysKey,W/2,460);
- g.fillStyle='#E54D42';g.font='20px sans-serif';
- g.fillText('▶ 扫码解锁你的身心密码',W/2,530);
- g.fillStyle='#fff';g.font='18px sans-serif';
- g.fillText('愈心谷 · 愈见魔方,遇见自己',W/2,H-40);
- document.getElementById('shareModal').classList.add('on');
-}
-function roundRect(g,x,y,w,h,r){
- g.beginPath();g.moveTo(x+r,y);g.arcTo(x+w,y,x+w,y+h,r);
- g.arcTo(x+w,y+h,x,y+h,r);g.arcTo(x,y+h,x,y,r);g.arcTo(x,y,x+w,y,r);g.closePath();
-}
-
-render();
diff --git a/js/health.js b/js/health.js
deleted file mode 100644
index 4d817f6..0000000
--- a/js/health.js
+++ /dev/null
@@ -1,431 +0,0 @@
-// ===================== REPORTS =====================
-function wkReport(p,con,emo,cur){
- var s=EO.slice().sort(function(a,b){return p[b]-p[a];});
- var st=s[0], se=cur.seasonEl, ww=cur.waxWane;
- var om={木:'肝',火:'心',土:'脾',金:'肺',水:'肾'};
- var os={};
- EO.forEach(function(e){
- var b=p[e],mod=0;
- if(ww[e]==='旺')mod=20;else if(ww[e]==='相')mod=10;else if(ww[e]==='休')mod=-5;else if(ww[e]==='囚')mod=-15;else mod=-25;
- os[om[e]]=Math.max(1,Math.min(5,Math.round((b+mod)/20)));
- });
-
- // Element interaction
- var gen=EO[(EO.indexOf(st)+1)%5], ke=EO[(EO.indexOf(st)+2)%5], beiGen=EO[(EO.indexOf(st)+4)%5], beiKe=EO[(EO.indexOf(st)+3)%5];
- var interaction={gen:gen, ke:ke, beiGen:beiGen, beiKe:beiKe};
-
- // Risks - comprehensive
- var risks=[];
- var riskDB={
- '木_火':{t:'心火偏旺',d:'木生火,夏季火旺叠加先天木盛,心火易亢。木火相煽,热扰心神。',sy:['失眠多梦','焦躁易怒','口干心烦','舌尖红','小便黄'],act:'午时小憩养心,睡前温水泡脚。喝莲子心茶清心火。减少咖啡和激烈运动。按揉神门穴、内关穴。'},
- '木_木':{t:'肝气过亢',d:'春木逢木,肝气太过。木旺生风,上扰清窍。',sy:['头晕目眩','偏头痛','血压波动','眼干眼胀'],act:'每日快走30分钟疏肝。喝菊花枸杞茶清肝明目。按揉太冲穴、行间穴。避免熬夜和情绪激动。'},
- '木_土':{t:'肝木克土',d:'先天木旺克制脾土,脾胃运化受阻。'+(ww['土']==='囚'?'当前土气被困,脾胃尤为脆弱。':''),sy:['食欲不振','腹胀嗳气','大便不调','疲倦乏力'],act:'少食多餐,温热饮食。饭前喝一小碗小米粥护脾胃。饭后散步10分钟。按揉足三里、中脘穴。避免生气时进食。'},
- '木_金':{t:'木侮金',d:'木气过盛反侮肺金。',sy:['干咳少痰','咽喉不适','皮肤过敏'],act:'保持室内湿度,喝蜂蜜梨水润肺。练习腹式呼吸。避免辛辣和干燥环境。'},
- '木_水':{t:'子盗母气',d:'木旺耗水,肾水暗亏。',sy:['腰膝酸软','耳鸣','脱发增多'],act:'多吃黑芝麻、核桃补肾。搓腰眼至发热。减少熬夜,保证子时(23点前)入睡。'},
- '火_火':{t:'心火亢盛',d:'火上加火,两阳相劫,耗伤心阴。',sy:['心悸怔忡','盗汗','烦躁不宁','口腔溃疡频发','面赤'],act:'务必午休养心阴。绿豆百合汤清心安神。避免烈日下活动和辛辣食物。睡前温水泡脚引火下行。按揉神门、涌泉穴。'},
- '火_木':{t:'木火刑金',d:'火得木生更旺,反侮肺金。',sy:['干咳','鼻衄','皮肤干燥','便秘'],act:'桑叶菊花茶清肺润燥。多吃梨、银耳、蜂蜜。保持环境湿润。避免烧烤和烟酒。'},
- '火_土':{t:'火生土亢',d:'火旺生土过度,湿热内生。',sy:['口苦口臭','大便黏滞','皮肤油腻长痘','头重身困'],act:'薏米赤小豆汤祛湿热。少甜食油腻。保持皮肤清洁干爽。荷叶茶清热利湿。'},
- '火_水':{t:'火盛水涸',d:'心火亢盛下劫肾水,心肾不交。',sy:['心烦失眠','腰膝酸软','耳鸣','记忆力下降','夜尿频'],act:'黄连阿胶汤类方交通心肾。睡前热水泡脚至微汗。按揉涌泉、太溪穴。避免熬夜和过度用脑。'},
- '火_金':{t:'火克金',d:'心火乘肺金,肺阴受损。',sy:['干咳无痰','咽干喉痛','皮肤粗糙','毛发干枯'],act:'麦冬沙参茶润肺生津。银耳百合羹每周3次。腹式深呼吸养肺。居室保持50%湿度。'},
- '土_火':{t:'火生土壅',d:'火旺生土,湿热蕴脾。',sy:['身重困倦','头蒙如裹','口黏不爽','大便溏滞'],act:'薏米茯苓粥健脾祛湿。室内通风除湿。少思虑多运动。按揉阴陵泉、丰隆穴。'},
- '土_土':{t:'脾湿壅盛',d:'土气过旺,湿浊内停。',sy:['身体沉重','腹胀满闷','痰多','浮肿'],act:'陈皮薏仁茶理气化湿。控制食量七分饱。每天快走40分钟。按揉足三里、天枢穴。'},
- '土_水':{t:'脾土克水',d:'土盛克水,肾阳受损。',sy:['水肿','小便不利','腰冷痛','畏寒'],act:'茯苓山药粥健脾利水。艾灸关元、命门温阳。避免久坐久卧。'},
- '土_木':{t:'土虚木乘',d:'湿土困脾,肝木乘虚而入。',sy:['胃痛','反酸','情绪波动时加重'],act:'饭前少量生姜水暖胃。少食多餐减轻脾胃负担。保持情绪稳定,饭后不生气。'},
- '水_火':{t:'水火不济',d:'夏季火旺克水,先天水盛之人肾水受制,心肾不交。',sy:['心烦不得眠','五心烦热','腰膝酸软','健忘','耳鸣加重'],act:'交泰丸类方交通心肾。睡前搓涌泉穴100次。下午5-7点(肾经当令)休息。少吃生冷,多晒太阳补阳。'},
- '水_水':{t:'寒湿内盛',d:'水气过旺,寒湿困阻。',sy:['畏寒肢冷','关节疼痛','水肿','小便清长'],act:'艾灸关元、命门、足三里。生姜红糖水温中散寒。多晒太阳尤其后背。冬季泡温泉。忌冰饮冷食。'},
- '水_木':{t:'水不涵木',d:'水亏不能养木,虚风内动。',sy:['头晕','手抖','失眠'],act:'枸杞菊花茶滋水涵木。早睡养肾阴。减少用眼过度。按揉太冲、太溪穴。'},
- '水_金':{t:'金不生水',d:'金被火克不能生水,肾水枯竭。',sy:['腰酸','脱发','牙齿松动','骨关节退变'],act:'黑豆核桃粥补肾填精。西洋参麦冬茶气阴双补。搓腰眼每日100次。适当负重运动强骨。'},
- '金_火':{t:'肺燥津伤',d:'火克金,肺阴受损。燥热伤津,肺失肃降。',sy:['干咳无痰或少痰','咽干鼻燥','皮肤干痒','大便秘结','声音嘶哑'],act:'川贝雪梨汤润肺止咳。室内加湿器保持50%-60%湿度。腹式深呼吸每次5分钟。避免辛辣油炸烧烤。麦冬沙参泡水代茶。'},
- '金_金':{t:'肺气壅滞',d:'金气过盛,肺失宣降。',sy:['胸闷气短','咳嗽','皮肤干燥脱屑'],act:'白萝卜蜂蜜水宣肺化痰。户外深呼吸新鲜空气。适度有氧运动微汗。按揉太渊、列缺穴。'},
- '金_木':{t:'金乘肝木',d:'肺金过盛抑制肝木疏泄。',sy:['情绪抑郁','胸胁胀痛','经前不适(女)'],act:'玫瑰花薄荷茶疏肝解郁。多与朋友交流倾诉。快走或瑜伽舒畅气机。按揉太冲、期门穴。'},
- };
- var rk=riskDB[st+'_'+se] || riskDB[st+'_'+st];
- if(rk) risks.push(rk);
- // Add a second risk based on beiKe
- var rk2=riskDB[beiKe+'_'+se];
- if(rk2 && rk2.t!==(rk?rk.t:'')) risks.push(rk2);
- if(risks.length===0) risks.push({t:'整体协调',d:'当前时空与先天体质较为协调,继续保持良好生活习惯即可。',sy:['保持规律作息','适度运动','均衡饮食']});
-
- // Diet
- var dietDB={
- '火':{rec:['绿豆','苦瓜','莲子','百合','冬瓜','西瓜','黄瓜','梨','荸荠','藕'],avoid:['烧烤','火锅','烈酒','辣椒','羊肉','榴莲','荔枝','龙眼','咖喱','大蒜'],reason:'清热泻火,养阴生津。避免辛温助热之品。',tea:'莲子心竹叶茶:莲子心3g + 淡竹叶5g,沸水冲泡,清心降火。菊花枸杞茶:菊花5朵 + 枸杞10粒,清肝明目。'},
- '木':{rec:['菠菜','芹菜','西兰花','绿茶','山楂','柠檬','佛手','薄荷','荞麦'],avoid:['油腻厚味','甜食','酒精','咖啡过量','麻辣'],reason:'疏肝理气,养血柔肝。避免壅滞气机。',tea:'玫瑰花佛手茶:玫瑰花5朵 + 佛手干3片,疏肝解郁。薄荷柠檬茶:鲜薄荷叶5片 + 柠檬2片,舒畅气机。'},
- '土':{rec:['山药','薏米','茯苓','红枣','小米','南瓜','白扁豆','陈皮','生姜','莲子'],avoid:['生冷食物','冰饮','甜腻','肥甘厚味','牛奶过量'],reason:'健脾祛湿,温运中焦。避免寒凉伤脾。',tea:'陈皮薏仁茶:陈皮5g + 炒薏米15g,理气化湿。生姜红枣茶:生姜3片 + 红枣5枚,温中健脾。'},
- '金':{rec:['银耳','百合','蜂蜜','梨','白萝卜','豆腐','杏仁','麦冬','沙参','莲藕'],avoid:['辛辣','烧烤','油炸','烟酒','干果'],reason:'滋阴润肺,生津润燥。避免辛燥伤阴。',tea:'麦冬沙参茶:麦冬10g + 沙参10g,润肺生津。蜂蜜雪梨水:雪梨1个切块+蜂蜜,煮水代茶。'},
- '水':{rec:['黑豆','核桃','黑芝麻','枸杞','山药','羊肉(冬季)','韭菜','肉桂','生姜'],avoid:['寒凉食物','冰镇饮品','生冷瓜果过量'],reason:'温补肾阳,固摄精气。避免寒凉伤阳。',tea:'桂圆枸杞茶:桂圆5颗 + 枸杞15粒 + 生姜2片,温补肾阳。黑豆核桃露:黑豆30g + 核桃3颗打浆煮饮。'}
- };
- var dt=se==='土'&&st==='火'?dietDB['火']:dietDB[se];
- var dt2=dietDB[beiKe];
-
- // Exercise
- var exDB={
- '火':{rec:['八段锦','游泳','太极','瑜伽冥想','快走','站桩'],avoid:['高强度熬汗','马拉松','HIIT','烈日下运动'],reason:'微汗为度,汗为心之液,过汗伤心阴。'},
- '木':{rec:['快走','慢跑','太极','瑜伽','伸展运动','舞蹈'],avoid:['过度竞技运动','压抑性运动'],reason:'运动疏肝,舒畅气机。避免过量压抑肝气。'},
- '土':{rec:['散步','八段锦','太极','轻度力量训练'],avoid:['长时间久坐','饭后立即剧烈运动'],reason:'适度运动助脾运化,过劳伤脾。'},
- '金':{rec:['深呼吸练习','太极','瑜伽','游泳','慢跑'],avoid:['干燥环境中运动','过度出汗'],reason:'养肺气,润皮毛。避免燥邪伤肺。'},
- '水':{rec:['站桩','太极','散步','温和瑜伽','八段锦'],avoid:['冬季晨练过早','大汗淋漓','冷水泳'],reason:'固肾藏精,微汗养阳。避免过耗阳气。'}
- };
- var ex=exDB[se];
-
- // Sleep
- var slDB={
- '火':{bt:'22:30',wt:'06:00',focus:'23:00前入睡养胆清心。午时(11-13点)小憩15-30分钟养心阴。'},
- '木':{bt:'22:30',wt:'06:30',focus:'23:00前入睡养肝血。睡前温水泡脚引火下行。避免睡前思虑。'},
- '土':{bt:'22:00',wt:'06:30',focus:'早睡养脾。晚餐宜早宜少,睡前3小时不进食。'},
- '金':{bt:'21:30',wt:'06:00',focus:'早卧早起养肺气。保持卧室湿度,避免干燥。'},
- '水':{bt:'21:30',wt:'07:00',focus:'早睡晚起养肾阳。睡前热水泡脚至微汗。注意腰腹保暖。'}
- };
- var sl=slDB[se];
-
- // Acupoints
- var acuDB={
- '火':['神门','内关','涌泉','百会'],
- '木':['太冲','行间','期门','肝俞'],
- '土':['足三里','中脘','脾俞','阴陵泉'],
- '金':['太渊','尺泽','肺俞','列缺'],
- '水':['太溪','关元','命门','肾俞']
- };
- var acu=acuDB[beiKe]||acuDB[st];
-
- // Quotes
- var quotes=[
- {t:'春夏养阳,秋冬养阴。',e:'当前属'+({'木':'春','火':'夏','土':'长夏','金':'秋','水':'冬'}[se]||se)+'季,应顺应阳气生长之势,避免过度耗散,保持规律作息。'},
- {t:'正气存内,邪不可干。',e:'保持内在平衡是抵御外邪的根本。当前注意调和阴阳,顺应天时变化。'},
- {t:'上古之人,其知道者,法于阴阳,和于术数。',e:'养生之道在于遵循自然规律。饮食有节,起居有常,不妄作劳。'},
- {t:'虚邪贼风,避之有时,恬惔虚无,真气从之。',e:'顺应四时避开外邪,内心平和则正气自足。当前时令尤需注意。'},
- {t:'阴平阳秘,精神乃治。',e:'阴阳平衡是健康的根本。当前'+se+'气偏盛,注意调和阴阳,不过不不及。'}
- ];
- var q=quotes[Math.floor(Math.random()*quotes.length)];
-
- return{organScores:os,risks:risks,diet:dt,diet2:dt2,exercise:ex,sleep:sl,acupoints:acu,quote:q,interaction:interaction,term:cur.term,se:se,strongest:st,wylq:cur.wylq,step:cur.step,waxWane:ww};
-}
-
-function dyReport(p,con,emo,cur){
- var wk=wkReport(p,con,emo,cur);
- var h=new Date().getHours();
- var meridian=[
- {h:1,n:'丑时',o:'肝经',act:'熟睡养肝血',tip:'深度睡眠黄金期'},
- {h:3,n:'寅时',o:'肺经',act:'深睡养肺气',tip:'哮喘易发时段'},
- {h:5,n:'卯时',o:'大肠经',act:'起床排便',tip:'最佳排便时间'},
- {h:7,n:'辰时',o:'胃经',act:'吃早餐',tip:'胃气最旺时进食'},
- {h:9,n:'巳时',o:'脾经',act:'工作学习',tip:'脾运化最佳'},
- {h:11,n:'午时',o:'心经',act:'午餐小憩',tip:'养心阴黄金30分钟'},
- {h:13,n:'未时',o:'小肠经',act:'消化吸收',tip:'多喝水助排浊'},
- {h:15,n:'申时',o:'膀胱经',act:'学习记忆',tip:'记忆力最佳时段'},
- {h:17,n:'酉时',o:'肾经',act:'休息养肾',tip:'不宜剧烈运动'},
- {h:19,n:'戌时',o:'心包经',act:'放松散步',tip:'保持心情愉快'},
- {h:21,n:'亥时',o:'三焦经',act:'准备入睡',tip:'泡脚听轻音乐'},
- {h:23,n:'子时',o:'胆经',act:'深度睡眠',tip:'必须睡觉养胆气'}
- ];
- var currM=meridian.find(function(m){return Math.abs(m.h-h)<=1;})||meridian[0];
- var scores=[
- {l:'睡眠',v:Math.floor(Math.random()*16+80),c:'#5CB85C'},
- {l:'饮食',v:Math.floor(Math.random()*21+65),c:'#E8985A'},
- {l:'情绪',v:Math.floor(Math.random()*26+60),c:'#E54D42'},
- {l:'运动',v:Math.floor(Math.random()*16+80),c:'#4A90E2'}
- ];
- var yiDB={
- '火':['喝菊花茶','午休15分钟','散步','听轻音乐','温水泡脚','深呼吸'],
- '木':['喝玫瑰花茶','快走30分钟','和朋友聊天','拉伸运动','看绿色植物'],
- '土':['喝陈皮水','饭后散步','吃温热食物','按摩足三里','少食多餐'],
- '金':['喝蜂蜜水','腹式呼吸','吃梨或银耳','早睡','室内加湿'],
- '水':['喝姜枣茶','晒太阳','热水泡脚','搓腰眼','穿暖不贪凉']
- };
- var jiDB={
- '火':['熬夜','暴饮暴食','情绪激动','过量咖啡','麻辣火锅','烈日暴晒'],
- '木':['压抑情绪','过量饮酒','熬夜','油腻食物','与人争执'],
- '土':['生冷冰饮','甜食过量','久坐不动','思虑过度','暴饮暴食'],
- '金':['辛辣烧烤','烟酒','干燥环境','过度出汗','忧伤抑郁'],
- '水':['寒凉饮食','过度疲劳','熬夜','冷水澡','冬季晨练过早']
- };
- return{scores:scores,meridian:meridian,currM:currM,yi:yiDB[wk.se]||yiDB['火'],ji:jiDB[wk.se]||jiDB['火'],weekly:wk};
-}
-
-// ===================== RENDER =====================
-function renderProfile(p,con,emo,bz){
- // Bazi table
- var labels=['年柱','月柱','日柱','时柱'];
- var pillars=[bz.year,bz.month,bz.day,bz.hour];
- var h='天干 地支 五行 纳音 生肖 ';
- for(var i=0;i<4;i++){
- var pl=pillars[i];
- var ny=NAYIN_MAP[pl.tg+pl.dz]||'--';
- var ds=pl.dz, dzEl=DZE[ds];
- var ani=i===0?DZ_ANI[DZ.indexOf(ds)]:'';
- h+=''+labels[i]+' '+pl.tg+' '+TGE[pl.tg]+' '+ds+' '+dzEl+' '+TGE[pl.tg]+'/'+dzEl+' '+ny+' '+ani+' ';
- }
- h+='
';
- document.getElementById('baziTable').innerHTML=h;
-
- // Pentagram
- var pg=document.getElementById('pentagram');
- pg.innerHTML='';
- EO.forEach(function(e){
- var v=p[e],c=EC[e];
- pg.innerHTML+='';
- });
- var sorted=EO.slice().sort(function(a,b){return p[b]-p[a];});
- document.getElementById('pentagramNote').textContent=sorted[0]+'偏盛 > '+sorted[1]+'次盛 > '+sorted[2]+'中和 > '+sorted[3]+'偏弱 > '+sorted[4]+'最弱';
-
- // Constitution detail
- var cd=document.getElementById('constDetail');
- cd.innerHTML='🫁 体质分析 '+con.desc+'
🩺 易患疾病 '+con.diseases+'
👁 外在表现 '+con.body+'
⚠️ 季节弱点 '+con.seasonRisk+'
🎯 养生核心 '+con.tips+'
🍽 食疗原则 '+con.foodTherapy+'
⏰ 日常节律 '+con.dailyRhythm+'
';
-
- // Organ detail
- var od=document.getElementById('organDetail');
- od.innerHTML='🫀 脏腑画像 '+con.strong+'
偏强脏腑
功能亢进 易生热/郁/火
'+con.weak+'
偏弱脏腑
功能不足 易受外邪侵袭
';
-
- // Emotion detail
- var ed=document.getElementById('emotionDetail');
- ed.innerHTML='🧠 情绪画像 优势特质: '+emo.strength.map(function(s){return ''+s+' ';}).join('')+'
风险倾向: '+emo.risk.map(function(s){return ''+s+' ';}).join('')+'
情绪调节 '+emo.advice+'
';
-
- // Personality summary
- document.getElementById('personalityCard').innerHTML='📖 综合画像 先天'+sorted[0]+' 之气偏盛,属'+con.primary+' 体质。'+con.strong+'经易亢,'+con.weak+'经偏弱。'+emo.strength[0]+'、'+emo.strength[1]+'是你的核心天赋;需注意'+emo.risk[0]+'和'+emo.risk[1]+'的倾向。
';
-
- document.getElementById('profileResult').classList.remove('hidden');
- document.getElementById('formCard').style.opacity='0.55';
-}
-
-function seasonalGuide(term, se){
- var guides={
- '立春':{tips:'春季养肝正当时。早睡早起,广步于庭。披发缓行,以使志生。多吃芽菜(豆芽、香椿),少吃酸多食辛甘。',avoid:'压抑怒气、过度进补、过早减衣。'},
- '雨水':{tips:'湿气渐增,健脾祛湿。多吃山药薏米。注意关节保暖。',avoid:'生冷瓜果、淋雨涉水。'},
- '惊蛰':{tips:'春雷惊百虫,阳气升发。早起活动舒展筋骨。多吃梨润肺防春燥。',avoid:'过度劳累、情绪压抑。'},
- '春分':{tips:'阴阳平分,养生贵在平衡。早睡早起,适度运动微汗。饮食寒热均衡。',avoid:'偏食偏嗜、大补大泻。'},
- '清明':{tips:'清气上升,养肝明目。踏青散步舒畅情志。菊花枸杞茶护眼。',avoid:'过度悲伤、暴饮暴食。'},
- '谷雨':{tips:'雨生百谷,湿度加大。健脾祛湿防春困。多喝薏米陈皮茶。',avoid:'潮湿环境久待、过食生冷。'},
- '立夏':{tips:'夏季养心。夜卧早起,无厌于日。午休15-30分钟养心阴。多吃红色食物。',avoid:'烈日暴晒、大汗淋漓、辛辣过量。'},
- '小满':{tips:'湿热渐盛,清心祛湿。冬瓜薏米汤清热利湿。保持皮肤干爽。',avoid:'油腻厚味、甜腻食物。'},
- '芒种':{tips:'梅雨季将至,防湿防霉。室内通风除湿。饮食清淡少油腻。艾灸足三里健脾。',avoid:'生冷冰饮、久居湿地。'},
- '夏至':{tips:'阳极阴生,养心护阳。午休不可少。饮食清淡多汤水。夏至一阴生,忌过度贪凉。',avoid:'冰镇饮品、空调直吹、熬夜。'},
- '小暑':{tips:'暑热渐盛,清暑益气。绿豆汤、荷叶粥消暑。避免正午户外活动。',avoid:'过度出汗、冷热交替刺激。'},
- '大暑':{tips:'湿热交蒸,健脾祛湿为首。藿香正气类防中暑。多喝温水少量多次。',avoid:'烈日下劳作、冰火两重天。'},
- '立秋':{tips:'秋燥当令,润肺生津。多吃白色食物。早卧早起与鸡俱兴。',avoid:'辛辣烧烤、过度出汗。'},
- '处暑':{tips:'暑气渐消,秋燥初显。银耳百合羹润燥。适度运动舒展筋骨。',avoid:'燥热食物、熬夜伤阴。'},
- '白露':{tips:'寒气初生,注意保暖。早晚添衣,尤其腹部和脚部。多吃温润食物。',avoid:'赤脚踩凉地、露脐装。'},
- '秋分':{tips:'阴阳平分如春分。滋阴润燥,收敛神气。早睡早起,心态平和。',avoid:'剧烈运动大汗、辛辣伤阴。'},
- '寒露':{tips:'寒气加重,护好颈腰脚踝。泡脚至微汗。多吃芝麻核桃润燥。',avoid:'冷水洗脚、穿露脚踝裤。'},
- '霜降':{tips:'秋末冬初,补脾养肺。山药红枣粥最佳。适度运动增强抵抗力。',avoid:'过度秋冻、生冷瓜果。'},
- '立冬':{tips:'冬季养肾。早卧晚起,必待日光。多晒太阳补阳。多吃黑色食物。',avoid:'清晨过早户外运动、冷水澡。'},
- '小雪':{tips:'寒气渐重,温补肾阳。羊肉汤、当归生姜羊肉汤温补。艾灸关元命门。',avoid:'寒凉饮食、过度疲劳。'},
- '大雪':{tips:'仲冬严寒,藏精养阳。减少户外活动。多喝热粥热汤。早睡晚起。',avoid:'大汗淋漓、受寒感冒。'},
- '冬至':{tips:'一阳来复,阴极阳生。静养为主,减少消耗。吃饺子/汤圆象征团圆。冬至进补事半功倍。',avoid:'剧烈运动、熬夜、房劳过度。'},
- '小寒':{tips:'三九严寒,温阳散寒。艾灸关元足三里。每晚热水泡脚。羊肉当归汤最宜。',avoid:'清晨低温外出、冷水刺激。'},
- '大寒':{tips:'寒极则暖,冬藏待春。继续温补藏精。保持心态平和,不急不躁。',avoid:'过度消耗、受寒受冻。'}
- };
- var g=guides[term.n]||{tips:'顺应四时,饮食有节,起居有常。',avoid:'过度劳累、暴饮暴食、情绪波动。'};
- return '';
-}
-
-function renderWeekly(wk){
- var wc=document.getElementById('weeklyContent');
- var tn=wk.term?wk.term.n:'--';
- var se=wk.se||'--';
- var seN={'木':'春季','火':'夏季','土':'长夏','金':'秋季','水':'冬季'}[se]||se;
- var now=new Date();
- var ts=now.getFullYear()+'-'+String(now.getMonth()+1).padStart(2,'0')+'-'+String(now.getDate()).padStart(2,'0')+' '+String(now.getHours()).padStart(2,'0')+':'+String(now.getMinutes()).padStart(2,'0');
- var h='';
-
- // ---- Overview ----
- h+='📊 本周气机概览 ';
- h+='
📅 节气:'+tn+' | 🌤 时令:'+seN+' ('+se+'旺)
';
- h+='
你的先天:'+wk.strongest+' 偏盛 | '+wk.strongest+'生'+wk.interaction.gen+' | '+wk.strongest+'克'+wk.interaction.ke+'
';
- h+='
⏱ 数据基于当前时空气机实时计算 | 刷新时间:'+ts+'
';
-
- // ---- WYLQ Detail ----
- var wq=wk.wylq;
- h+='
岁运(中运) '+wq.zhongyun+' '+(wq.taiguo?'(太过)':'(不及)')+' ';
- h+='司天之气 '+wq.sitian+'('+DZE[wq.sitian]+')— 上半年主气 ';
- h+='在泉之气 '+wq.zaiquan+'('+DZE[wq.zaiquan]+')— 下半年主气 ';
- var cs=wk.step||Math.floor(new Date().getMonth()/2);
- h+='当前主气 '+wq.zhuqi[cs]+' ';
- h+='当前客气 '+wq.keqiOrder[cs]+' ';
- h+='
';
-
- // Five elements wax/wane
- h+='
五行旺衰: ';
- EO.forEach(function(e){h+=''+e+wk.waxWane[e]+' ';});
- h+='
';
-
- // Organ scores
- h+='
本周脏腑指数:
';
- ['肝','心','脾','肺','肾'].forEach(function(o){
- var sc=wk.organScores[o]||3;
- var stars='';
- for(var i=1;i<=5;i++)stars+=i<=sc?'★':'
★ ';
- h+='
'+o+' '+stars+'
';
- });
- h+='
';
-
- // ---- Risks ----
- h+='⚠️ 健康风险 ';
- wk.risks.forEach(function(r,i){
- h+='
风险'+(i+1)+':'+r.t+' '+r.d+'
';
- r.sy.forEach(function(s){h+=''+s+' ';});
- h+=' ';
- if(r.act) h+='
✅ 应对: '+r.act+'
';
- h+='
';
- });
- h+='
';
-
- // ---- Daily refresh tip (changes daily) ----
- var dailyTips={
- '火':['夏日午后一杯淡竹叶茶,清心降火。','心静自然凉,午休15分钟胜过补药。','苦味入心,晚餐加一道凉拌苦瓜。'],
- '木':['肝喜条达,今天遇到烦心事出去走10分钟。','绿色入肝,午餐加一份西兰花。','怒伤肝,深呼吸三次再回应让你生气的事。'],
- '土':['脾主思,今天少想多做,动手整理房间也是调理。','黄色入脾,早餐一碗小米粥暖胃健脾。','饭后百步走,活到九十九——今天饭后就散个步。'],
- '金':['秋燥伤肺,今天多喝温水,室内保持湿润。','白色入肺,今天吃一个雪梨润肺。','忧伤肺,今天找一件让你开心的小事做。'],
- '水':['肾藏精,今天早点上床,23点前入睡是最好的补肾药。','黑色入肾,今天吃一把黑芝麻或核桃。','恐伤肾,今天少看负面新闻,多晒晒太阳。']
- };
- var tips=dailyTips[wk.se]||dailyTips['火'];
- var idx=new Date().getDate()%tips.length;
- h+='';
-
- // ---- Diet ----
- h+='🥗 本周饮食 ';
- h+='
👍
推荐食材
'+wk.diet.rec.join('、')+'
💡 '+wk.diet.reason+'
';
- h+='
👎
减少摄入
'+wk.diet.avoid.join('、')+'
';
- if(wk.diet.tea) h+='
';
- if(wk.diet2){
- h+='
🔄
辅助调养('+wk.interaction.beiKe+'行)
'+wk.diet2.rec.join('、')+'
💡 '+wk.diet2.reason+'
';
- }
- h+='
';
-
- // ---- Exercise ----
- h+='🏃 运动建议 ';
- h+='
✅
推荐运动
'+wk.exercise.rec.join('、')+'
';
- h+='
⛔
避免
'+wk.exercise.avoid.join('、')+'
💡 '+wk.exercise.reason+'
';
- h+='
';
-
- // ---- Sleep ----
- h+='😴 作息建议 ';
- h+='
🌙
'+wk.sleep.bt+' 入睡 · '+wk.sleep.wt+' 起床
'+wk.sleep.focus+'
';
- h+='
';
-
- // ---- Seasonal Living Guide ----
- h+=seasonalGuide(wk.term, wk.se);
-
- // ---- Acupoints ----
- h+='📍 穴位保健 ';
- h+='
'+wk.acupoints.map(function(a){return ''+a+' ';}).join('')+'
';
- h+='
每日按揉每穴3-5分钟,酸胀为度,早晚各一次。
';
- h+='
';
-
- // ---- Quote ----
- h+='📖 本周一句内经 「'+wk.quote.t+'」
'+wk.quote.e+'
';
-
- wc.innerHTML=h;
-}
-
-function renderDaily(dy){
- var dc=document.getElementById('dailyContent');
- var wk=dy.weekly;
- var h='';
-
- h+='☀️ 今日养生 ';
- h+='
📅 '+wk.term.n+' | 值日五行:'+wk.se+'
';
- h+='
你的状态:'+wk.strongest+' 偏旺
';
-
- // Meridian clock
- h+='⏰ 子午流注 ';
- h+='
当前时段:'+dy.currM.n+' ('+dy.currM.o+')— '+dy.currM.act+'
';
- h+='
💡 '+dy.currM.tip+'
';
- h+='
';
- dy.meridian.forEach(function(m){
- h+='
';
- });
- h+='
';
-
- // Scores
- h+='📈 今日评分 ';
- dy.scores.forEach(function(s){
- h+='
';
- });
- h+='
';
-
- // Yiji
- h+='📋 今日宜忌 ';
- h+='
';
- h+='
';
- h+='
';
-
- // Key focus
- h+='🎯 今日重点 ';
- h+='
';
- h+='
保养'+({'木':'肝','火':'心','土':'脾','金':'肺','水':'肾'}[wk.strongest]||'--')+'经
';
- h+='
'+dy.yi.slice(0,3).join(' · ')+'
';
- h+='
';
-
- dc.innerHTML=h;
-}
-
-// ===================== MAIN =====================
-var userProfile=null,userConstitution=null,userEmotion=null,userBazi=null,curAnalysis=null;
-
-(function(){
- try{var d=JSON.parse(localStorage.getItem('yangsheng_profile'));
- if(d){userProfile=d.profile;userConstitution=d.constitution;userEmotion=d.emotion;userBazi=d.bazi;
- renderProfile(userProfile,userConstitution,userEmotion,userBazi);}
- }catch(e){}
-})();
-
-function gen(){
- try{console.log('gen start');
- var nm=document.getElementById('fname').value||'用户';
- var bs=document.getElementById('fbirth').value;
- var ts=document.getElementById('ftime').value||'12:00';
- var pl=document.getElementById('fplace').value||'--';
- if(!bs){alert('请填写出生日期');return;}
- var bd=new Date(bs),bh=parseInt(ts.split(':')[0]);
- userBazi=getBazi(bd,bh); console.log('bazi ok');
- userProfile=calc5E(userBazi); console.log('profile ok');
- userConstitution=getConst(userProfile); console.log('const ok');
- userEmotion=getEmotion(EO.slice().sort(function(a,b){return userProfile[b]-userProfile[a];})[0]); console.log('emotion ok');
- try{localStorage.setItem('yangsheng_profile',JSON.stringify({name:nm,profile:userProfile,constitution:userConstitution,emotion:userEmotion,bazi:userBazi,birthDate:bs,birthTime:ts,birthPlace:pl}));}catch(e){}
- renderProfile(userProfile,userConstitution,userEmotion,userBazi); console.log('renderProfile ok');
- // Switch to weekly
- document.querySelectorAll('.tab').forEach(function(t){t.classList.remove('active');});
- document.querySelector('[data-tab="weekly"]').classList.add('active');
- document.getElementById('tab-profile').classList.add('hidden');
- document.getElementById('tab-weekly').classList.remove('hidden');
- document.getElementById('tab-daily').classList.add('hidden');
- curAnalysis=getCurAnalysis(); console.log('curAnalysis ok');
- var report = wkReport(userProfile,userConstitution,userEmotion,curAnalysis); console.log('wkReport ok');
- renderWeekly(report); console.log('renderWeekly ok');
- }catch(e){console.error('gen error:',e.message,e.stack);}
-}
-
-// Tabs
-document.getElementById('tabs').addEventListener('click',function(e){
- if(!e.target.classList.contains('tab'))return;
- var tab=e.target.dataset.tab;
- document.querySelectorAll('.tab').forEach(function(t){t.classList.remove('active');});
- e.target.classList.add('active');
- document.getElementById('tab-profile').classList.add('hidden');
- document.getElementById('tab-weekly').classList.add('hidden');
- document.getElementById('tab-daily').classList.add('hidden');
- if(tab==='profile') document.getElementById('tab-profile').classList.remove('hidden');
- else if(tab==='weekly'){
- if(!userProfile){alert('请先生成先天体质画像');document.querySelector('[data-tab="profile"]').click();return;}
- document.getElementById('tab-weekly').classList.remove('hidden');
- curAnalysis=getCurAnalysis();
- renderWeekly(wkReport(userProfile,userConstitution,userEmotion,curAnalysis));
- }else if(tab==='daily'){
- if(!userProfile){alert('请先生成先天体质画像');document.querySelector('[data-tab="profile"]').click();return;}
- document.getElementById('tab-daily').classList.remove('hidden');
- curAnalysis=getCurAnalysis();
- renderDaily(dyReport(userProfile,userConstitution,userEmotion,curAnalysis));
- }
-});
-
-// URL 参数预填(从 jiema.html 跳转过来)
-window.addEventListener('DOMContentLoaded',function(){
- const p=new URLSearchParams(location.search);
- const y=p.get('y'),m=p.get('m'),d=p.get('d'),h=p.get('h')||'12';
- if(y&&m&&d){
- var fb=document.getElementById('fbirth');
- var ft=document.getElementById('ftime');
- if(fb) fb.value=y+'-'+String(m).padStart(2,'0')+'-'+String(d).padStart(2,'0');
- if(ft) ft.value=String(h).padStart(2,'0')+':00';
- setTimeout(gen,300);
- }
-});
diff --git a/js/home.js b/js/home.js
deleted file mode 100644
index 8e64abc..0000000
--- a/js/home.js
+++ /dev/null
@@ -1,14 +0,0 @@
-function goDecode(){
- var y=document.getElementById('dy').value.trim();
- var m=document.getElementById('dm').value.trim();
- var d=document.getElementById('dd').value.trim();
- if(!y||!m||!d){alert('请输入完整的出生年月日');return;}
- location.href='pages/decode.html?y='+encodeURIComponent(y)+'&m='+encodeURIComponent(m)+'&d='+encodeURIComponent(d);
-}
-['dy','dm','dd'].forEach(function(id){
- var el=document.getElementById(id);
- if(!el) return;
- el.addEventListener('keydown',function(e){
- if(e.key==='Enter')goDecode();
- });
-});
diff --git a/js/mindmap.js b/js/mindmap.js
deleted file mode 100644
index 363ff76..0000000
--- a/js/mindmap.js
+++ /dev/null
@@ -1,424 +0,0 @@
-var c=document.getElementById('c'),ctx=c.getContext('2d');
-var ei=document.getElementById('ei'),ed=document.getElementById('editor');
-var SCALE=1,ox=0,oy=0;
-var dragging=false,dragX=0,dragY=0;
-var selected=null,editing=null;
-var colors=['#8B5CF6','#4A90E2','#5CB85C','#E8985A','#E54D42','#06B6D4','#F59E0B','#EC4899'];
-var STORAGE_KEY='yuxingu_maps';
-
-// ---- Multi-map state ----
-var maps=[],currentIdx=-1;
-
-function defaultTree(){
- return {
- id:'root',text:'新建脑图',color:colors[0],children:[]
- };
-}
-
-function defaultTemplate(){
- return {
- id:'root',text:'愈心谷小程序',color:colors[0],
- children:[
- {id:'b1',text:'愈心魔方',color:colors[0],children:[
- {id:'b1a',text:'急救魔方'},{id:'b1b',text:'亲子魔方'},{id:'b1c',text:'成长魔方'},
- {id:'b1d',text:'解构魔方'},{id:'b1e',text:'艺术魔方'},{id:'b1f',text:'情感魔方'}
- ]},
- {id:'b2',text:'私域活动',color:colors[1],children:[
- {id:'b2a',text:'心理研学'},{id:'b2b',text:'心灵旅修'}
- ]},
- {id:'b3',text:'心理咨询',color:colors[2]},
- {id:'b4',text:'心理评估',color:colors[3],children:[
- {id:'b4a',text:'AI面部识别'},{id:'b4b',text:'脑机接口'}
- ]},
- {id:'b5',text:'健康管理',color:colors[4]}
- ]
- };
-}
-
-// ---- Persistence ----
-function loadMaps(){
- try{
- var d=localStorage.getItem(STORAGE_KEY);
- return d?JSON.parse(d):[];
- }catch(e){return [];}
-}
-
-function saveMaps(){
- try{localStorage.setItem(STORAGE_KEY,JSON.stringify(maps))}catch(e){}
- // sync to server (all maps)
- fetch('/save',{method:'POST',body:JSON.stringify(maps)}).catch(function(){});
-}
-
-function syncServer(){
- fetch('/load').then(function(r){return r.json()}).then(function(data){
- if(Array.isArray(data)&&data.length>0){
- maps=data;saveMaps();renderSidebar();
- if(currentIdx<0||currentIdx>=maps.length)switchMap(0);
- }
- }).catch(function(){});
-}
-
-// ---- Sidebar ----
-function renderSidebar(){
- var sl=document.getElementById('slist');
- sl.innerHTML='';
- maps.forEach(function(m,i){
- var d=document.createElement('div');
- d.className='item'+(i===currentIdx?' active':'');
- d.innerHTML=''+escHtml(m.name||'脑图'+(i+1))+' ✕ ';
- d.onclick=function(){switchMap(i)};
- sl.appendChild(d);
- });
-}
-
-function escHtml(s){return s.replace(/&/g,'&').replace(//g,'>');}
-
-function switchMap(idx){
- if(idx<0||idx>=maps.length)return;
- currentIdx=idx;
- tree=JSON.parse(JSON.stringify(maps[idx].tree));
- selected=null;
- renderSidebar();
- layout();draw();
- // close sidebar on mobile after selection
- if(window.innerWidth<=600)closeSidebar();
-}
-
-function newMap(){
- var name=prompt('脑图名称:','脑图'+(maps.length+1));
- if(!name)return;
- maps.push({name:name,tree:defaultTree()});
- saveMaps();
- renderSidebar();
- switchMap(maps.length-1);
-}
-
-function renameMap(){
- if(currentIdx<0)return;
- var name=prompt('新名称:',maps[currentIdx].name);
- if(!name)return;
- maps[currentIdx].name=name;
- saveMaps();renderSidebar();
-}
-
-function deleteMap(idx){
- if(!confirm('删除「'+maps[idx].name+'」?不可恢复。'))return;
- maps.splice(idx,1);
- saveMaps();renderSidebar();
- if(maps.length===0){maps.push({name:'愈心谷小程序',tree:defaultTemplate()});saveMaps();renderSidebar();}
- if(currentIdx>=maps.length)currentIdx=maps.length-1;
- switchMap(currentIdx);
-}
-
-var _saveTimer=null;
-function autoSave(){
- if(currentIdx<0)return;
- maps[currentIdx].tree=JSON.parse(JSON.stringify(exportTree(tree)));
- saveMaps();
- var h=document.getElementById('saveHint');
- if(h){h.textContent='💾 已自动保存';h.style.color='#aaa';
- clearTimeout(_saveTimer);
- _saveTimer=setTimeout(function(){h.textContent='';},2000);}
-}
-
-// ---- Tree export ----
-function exportTree(node){
- var o={id:node.id,text:node.text};
- if(node.color)o.color=node.color;
- if(node.children)o.children=node.children.map(exportTree);
- return o;
-}
-
-// ---- Layout & Draw ----
-var tree=defaultTemplate();
-var NODE_W=120,NODE_H=34,HGAP=60,VGAP=14;
-
-function uid(){return 'n'+Date.now()+Math.random().toString(36).slice(2,6)}
-
-function getColor(node,parentColor){
- if(node.color)return node.color;
- if(parentColor)return parentColor;
- return colors[0];
-}
-
-function layoutHeight(node){
- if(!node.children||node.children.length===0)return NODE_H;
- var h=0;
- for(var i=0;i0){
- var totalH=0;
- for(var i=0;i=node._x&&mx<=node._x+node._w&&my>=node._y&&my<=node._y+node._h)return node;
- if(node.children)for(var i=0;i0?0.9:1.1)));
- draw();
-},{passive:false});
-c.addEventListener('dblclick',function(e){
- var rect=c.getBoundingClientRect();
- var sx=(e.clientX-rect.left-c.width/2-ox)/SCALE;
- var sy=(e.clientY-rect.top-c.height/2-oy)/SCALE;
- var node=hitTest(sx,sy);
- if(node){
- editing=node;
- var cx=rect.left+c.width/2+ox+node._x*SCALE;
- var cy=rect.top+c.height/2+oy+node._y*SCALE;
- ed.style.display='block';ed.style.left=cx+'px';ed.style.top=cy+'px';
- ei.value=node.text;ei.focus();ei.select();
- }
-});
-
-// Touch
-c.addEventListener('touchstart',function(e){
- if(e.touches.length===1){
- var rect=c.getBoundingClientRect();
- var sx=(e.touches[0].clientX-rect.left-c.width/2-ox)/SCALE;
- var sy=(e.touches[0].clientY-rect.top-c.height/2-oy)/SCALE;
- var node=hitTest(sx,sy);
- if(node){selected=node;draw();}
- else{dragging=true;dragX=e.touches[0].clientX;dragY=e.touches[0].clientY;}
- }
-},{passive:false});
-c.addEventListener('touchmove',function(e){
- if(dragging&&e.touches.length===1){
- e.preventDefault();
- ox+=e.touches[0].clientX-dragX;oy+=e.touches[0].clientY-dragY;
- dragX=e.touches[0].clientX;dragY=e.touches[0].clientY;draw();
- }
-},{passive:false});
-c.addEventListener('touchend',function(){dragging=false;});
-
-// ---- Mobile: sidebar toggle ----
-function toggleSidebar(){
- var sb=document.querySelector('.sidebar');
- var ov=document.getElementById('overlay');
- sb.classList.toggle('open');
- ov.classList.toggle('show');
-}
-function closeSidebar(){
- document.querySelector('.sidebar').classList.remove('open');
- document.getElementById('overlay').classList.remove('show');
-}
-
-// ---- Mobile: double-tap to edit ----
-var _lastTap=0;
-c.addEventListener('touchend',function(e){
- var now=Date.now();
- if(now-_lastTap<300){
- // double tap
- e.preventDefault();
- var rect=c.getBoundingClientRect();
- var sx=(e.changedTouches[0].clientX-rect.left-c.width/2-ox)/SCALE;
- var sy=(e.changedTouches[0].clientY-rect.top-c.height/2-oy)/SCALE;
- var node=hitTest(sx,sy);
- if(node){
- editing=node;
- var cx=rect.left+c.width/2+ox+node._x*SCALE;
- var cy=rect.top+c.height/2+oy+node._y*SCALE;
- ed.style.display='block';ed.style.left=cx+'px';ed.style.top=cy+'px';
- ei.value=node.text;ei.focus();ei.select();
- }
- }
- _lastTap=now;
- // close sidebar when tapping canvas
- if(window.innerWidth<=600)closeSidebar();
-});
-
-// ---- Mobile: pinch-to-zoom ----
-var _pinchDist=0;
-c.addEventListener('touchstart',function(e){
- if(e.touches.length===2){
- _pinchDist=Math.hypot(
- e.touches[0].clientX-e.touches[1].clientX,
- e.touches[0].clientY-e.touches[1].clientY
- );
- }
-},{passive:false});
-c.addEventListener('touchmove',function(e){
- if(e.touches.length===2){
- e.preventDefault();
- var d=Math.hypot(
- e.touches[0].clientX-e.touches[1].clientX,
- e.touches[0].clientY-e.touches[1].clientY
- );
- var ratio=d/(_pinchDist||1);
- SCALE=Math.max(0.3,Math.min(3,SCALE*ratio));
- _pinchDist=d;
- draw();
- }
-},{passive:false});
-
-// ---- Keyboard shortcuts ----
-document.addEventListener('keydown',function(e){
- if(e.target.tagName==='INPUT'||e.target.tagName==='TEXTAREA')return; // 编辑中不触发
- if(e.key==='Delete'||e.key==='Backspace'){
- e.preventDefault();
- delNode();
- }
-});
-
-// ---- Actions ----
-function commitEdit(){if(editing)editing.text=ei.value||'新节点';ed.style.display='none';editing=null;draw();autoSave();}
-function cancelEdit(){ed.style.display='none';editing=null;}
-
-function addChild(){
- if(!selected){alert('请先选中一个节点');return;}
- if(!selected.children)selected.children=[];
- selected.children.push({id:uid(),text:'新节点'});
- layout();draw();selected=selected.children[selected.children.length-1];draw();autoSave();
-}
-
-function addSibling(){
- if(!selected||selected===tree){alert('请选中一个非根节点');return;}
- function fp(node,target){
- if(node.children)for(var i=0;i缺少量表参数'; return; }
- try {
- const r = await fetch(`../api/scales/${slug}`);
- scale = await r.json();
- if (scale.error) throw new Error(scale.error);
- answers = new Array(scale.question_count).fill(null);
- // Restore from localStorage
- const cached = localStorage.getItem(`scale_${slug}`);
- if (cached) answers = JSON.parse(cached);
- renderStart();
- } catch(e) {
- document.getElementById('app').innerHTML = `加载失败: ${e.message}
`;
- }
-}
-
-function renderStart() {
- const hasCache = answers.some(a => a !== null);
- const answered = answers.filter(a => a !== null).length;
- const rawDesc = scale.description || '';
- const parts = rawDesc.split('\n\n');
- const mainDesc = parts[0] || '';
- const metaLine = parts.slice(1).join(' · ') || '';
- const timeMin = Math.ceil(scale.question_count / 6);
- const timeMax = Math.ceil(scale.question_count / 4);
-
- document.getElementById('app').innerHTML = `
-
-
-
- ${mainDesc ? `
${mainDesc}
` : ''}
- ${metaLine ? `
- ${metaLine.split('·').filter(m=>m.trim()).map(m =>
- `${m.trim()} `
- ).join('')}
-
` : ''}
-
- 📝 ${scale.question_count} 题
- ⏱ ${timeMin}-${timeMax} 分钟
- 🔒 自动保存
-
- ${hasCache
- ? `
- 📌 已有答题进度:${answered}/${scale.question_count} 题
-
`
- : ''}
-
- ${hasCache ? `继续测试 (${answered}/${scale.question_count})` : '开始测试'}
-
- ${hasCache
- ? `
重新开始 `
- : ''}
-
-
- `;
-}
-
-function startTest() {
- started = true;
- // Resume from first unanswered question
- const firstUnanswered = answers.findIndex(a => a === null);
- current = firstUnanswered >= 0 ? firstUnanswered : 0;
- render();
-}
-
-function resetAndStart() {
- answers = new Array(scale.question_count).fill(null);
- localStorage.removeItem(`scale_${slug}`);
- started = true;
- current = 0;
- render();
-}
-
-function saveCache() {
- localStorage.setItem(`scale_${slug}`, JSON.stringify(answers));
-}
-
-function selectOption(idx) {
- if (submitted) return;
- answers[current] = idx;
- saveCache();
- render();
- // Auto advance after short delay
- if (current < scale.question_count - 1) {
- setTimeout(() => { current++; render(); }, 300);
- }
-}
-
-function goPrev() { if (current > 0) { current--; render(); } }
-function goNext() { if (current < scale.question_count - 1) { current++; render(); } }
-
-async function submit() {
- if (submitted) return;
- submitted = true;
- saveCache();
-
- try {
- const r = await fetch('../api/scales/result', {
- method: 'POST',
- headers: {'Content-Type': 'application/json'},
- body: JSON.stringify({
- scale_slug: scale.slug,
- scale_name: scale.name,
- answers: answers,
- })
- });
- const data = await r.json();
- // Clear cache
- localStorage.removeItem(`scale_${slug}`);
- renderResult(data);
- } catch(e) {
- submitted = false;
- alert('提交失败,请重试');
- render();
- }
-}
-
-function renderResult(data) {
- const s = data.scores;
- const allAnswered = s.answer_count;
- const total = scale.question_count;
- const scoreDisplay = s.std_score !== null ? s.std_score : s.raw_score;
- const isStd = s.std_score !== null;
- const isFactorScale = s.factors && Object.keys(s.factors).length >= 6;
- const hasFactors = s.factors && Object.keys(s.factors).length > 0;
-
- // Factor bars (for any factor count, not just 8+)
- let factorsHtml = '';
- if (hasFactors) {
- const factorMax = s.factor_max || {};
- const bars = Object.entries(s.factors).map(([k,v]) => {
- const max = factorMax[k] || 50;
- const pct = Math.min(Math.round(v / max * 100), 100);
- return `
-
- ${k} ${v}/${max}
-
-
-
`;
- }).join('');
-
- let insightHtml = '';
- if (isFactorScale) {
- const sorted = Object.entries(s.factors).sort((a,b) => b[1]-a[1]);
- const top3 = sorted.slice(0,3).map(([k,v]) => `${k} `).join('、');
- insightHtml = `
- 🌟 优势方向: ${top3}
- 得分最高的领域代表天赋倾向,建议重点关注和培养。
-
`;
- }
-
- factorsHtml = `
-
${isFactorScale ? '各维度得分' : '因子得分'}
- ${bars}
- ${insightHtml}
-
`;
- }
-
- // Rating badge
- let ratingHtml = '';
- if (s.rating) {
- ratingHtml = `${s.rating}
`;
- }
-
- document.getElementById('app').innerHTML = `
-
-
-
测评完成 · ${allAnswered}/${total} 题
- ${isFactorScale
- ? `
多元智能测评结果
`
- : `
- ${scoreDisplay}
- ${isStd ? `分 ` : ''}
-
- ${isStd ? `
原始分 ${s.raw_score} × 1.25 = 标准分 ${scoreDisplay}
` : ''}
- ${!isStd && !isFactorScale ? `
满分 ${s.max_score} · 占比 ${(s.raw_score/s.max_score*100).toFixed(0)}%
` : ''}`}
- ${ratingHtml}
- ${factorsHtml}
-
-
* 结果仅供参考,不能替代专业诊断
-
- `;
-}
-
-function render() {
- if (!scale) return;
- const total = scale.question_count;
- const pct = ((current + 1) / total * 100).toFixed(0);
- const isLast = current === total - 1;
- const selected = answers[current];
-
- const q = scale.questions[current];
- const opts = scale.options[current];
-
- const optHtml = opts.map((o, i) => `
-
- ${String.fromCharCode(65+i)}. ${o}
-
- `).join('');
-
- const allAnswered = answers.every(a => a !== null);
-
- document.getElementById('app').innerHTML = `
-
-
←
-
${scale.name}
-
${current+1}/${total}
-
-
-
-
-
${current+1}. ${q}
-
${optHtml}
-
-
-
- 上一题
- ${isLast
- ? `✓ 提交答卷 `
- : `下一题 → `
- }
-
- ${isLast ? `${allAnswered?'全部答完,可以提交了':'还有题目未作答'}
` : ''}
- `;
-}
-
-init();
diff --git a/js/scales.js b/js/scales.js
deleted file mode 100644
index f1519ff..0000000
--- a/js/scales.js
+++ /dev/null
@@ -1,53 +0,0 @@
-const ICONS = {'心理测试综合':'📋','人格测试':'🎭','抑郁症测试':'🌧️','焦虑症测试':'😰','强迫症测试':'🔄','躁狂症测试':'🔥','双向情感障碍':'🌓','恐惧症测试':'😨','智商测试':'🧠','情商测试':'💝','其它测试':'📌'};
-
-const CAT_KEYS = {'心理测试综合':'cat-综合','人格测试':'cat-人格','抑郁症测试':'cat-抑郁','焦虑症测试':'cat-焦虑','强迫症测试':'cat-强迫','躁狂症测试':'cat-躁狂','双向情感障碍':'cat-双相','恐惧症测试':'cat-恐惧','智商测试':'cat-智商','情商测试':'cat-情商','其它测试':'cat-其他'};
-
-let scales = [], activeCat = '全部';
-
-async function load() {
- document.getElementById('content').innerHTML = '加载中…
';
- try {
- const r = await fetch('../api/scales');
- scales = await r.json();
- renderCats();
- renderScales();
- } catch(e) {
- document.getElementById('content').innerHTML = '加载失败,请刷新重试
';
- }
-}
-
-function renderCats() {
- const cats = [...new Set(scales.map(s=>s.category))];
- const html = ['全部 '];
- cats.forEach(c => {
- html.push(`${c} `);
- });
- document.getElementById('cats').innerHTML = html.join('');
-}
-
-function filter(cat) {
- activeCat = cat;
- document.querySelectorAll('.cat-btn').forEach(b => b.classList.toggle('active', b.textContent === cat));
- renderScales();
-}
-
-function renderScales() {
- const filtered = activeCat === '全部' ? scales : scales.filter(s=>s.category===activeCat);
- if (!filtered.length) {
- document.getElementById('content').innerHTML = '暂无数据
';
- return;
- }
- const html = filtered.map(s => `
-
- ${ICONS[s.category]||'📌'}
-
-
${s.name}
-
${s.description||''}
-
- ${s.question_count}题
-
- `).join('');
- document.getElementById('content').innerHTML = `${html}
`;
-}
-
-load();
diff --git a/js/shell.js b/js/shell.js
deleted file mode 100644
index ce5f300..0000000
--- a/js/shell.js
+++ /dev/null
@@ -1,60 +0,0 @@
-/* 愈心谷共享壳 —— 底栏注入、高亮、二级返回 */
-(function () {
- var body = document.body;
- if (!body) return;
-
- var navKey = body.getAttribute('data-nav') || 'none';
- var backTo = body.getAttribute('data-back') || '';
- var pageTitle = body.getAttribute('data-title') || document.title || '';
- var base = body.getAttribute('data-base') || '';
-
- // 根据当前路径推断资源根:根目录页用 '',pages/ 下用 '../'
- if (!base) {
- base = /\/pages\//.test(location.pathname) ? '../' : '';
- }
-
- body.classList.add('app-body');
- if (navKey === 'none') body.classList.add('no-nav');
-
- function abs(path) {
- if (!path) return base;
- if (/^(https?:|mailto:|tel:|#)/.test(path)) return path;
- return base + path.replace(/^\.\//, '');
- }
-
- // 二级顶栏
- if (navKey === 'none' && (backTo || pageTitle)) {
- var top = document.createElement('div');
- top.className = 'app-topbar';
- var backHref = abs(backTo || 'yuxingu.html');
- top.innerHTML =
- '← ' +
- '
';
- top.querySelector('.title').textContent = pageTitle;
- body.insertBefore(top, body.firstChild);
- }
-
- // 一级底栏
- if (navKey !== 'none') {
- var items = [
- { key: 'home', href: 'yuxingu.html', icon: '⌂', label: '首页' },
- { key: 'know', href: 'pages/know.html', icon: '◉', label: '认识自己' },
- { key: 'scales', href: 'pages/scales.html', icon: '☰', label: '专业测评' },
- { key: 'activity', href: 'pages/activity.html', icon: '✦', label: '私域活动' },
- { key: 'health', href: 'pages/health.html', icon: '♡', label: '健康管理' },
- { key: 'mine', href: 'pages/mine.html', icon: '◍', label: '我的' }
- ];
- var nav = document.createElement('nav');
- nav.className = 'app-nav';
- nav.setAttribute('aria-label', '主导航');
- nav.innerHTML = items.map(function (it) {
- var cls = it.key === navKey ? ' active' : '';
- return (
- '' +
- '' + it.icon + ' ' + it.label +
- ' '
- );
- }).join('');
- body.appendChild(nav);
- }
-})();
diff --git a/js/shuzi.js b/js/shuzi.js
deleted file mode 100644
index b161783..0000000
--- a/js/shuzi.js
+++ /dev/null
@@ -1,465 +0,0 @@
-const NUM_CLR={
-1:{top:[232,160,160],front:[196,122,120],right:[168,96,96]},
-2:{top:[240,200,160],front:[232,168,124],right:[208,144,96]},
-3:{top:[238,208,128],front:[224,184,88],right:[200,152,64]},
-4:{top:[160,216,112],front:[112,173,71],right:[88,136,48]},
-5:{top:[144,200,240],front:[91,155,213],right:[64,120,176]},
-6:{top:[240,168,176],front:[212,135,142],right:[176,104,112]},
-7:{top:[184,168,216],front:[139,122,181],right:[104,88,152]},
-8:{top:[160,144,128],front:[107,91,78],right:[80,64,48]},
-9:{top:[244,236,224],front:[232,220,200],right:[208,192,168]},
-};
-
-// ===== Dimetric 投影 + Z 轴旋转 —— 底座天然水平 =====
-let rotZ = -0.55; // Z 轴旋转角(弧度)
-let dragActive=false, dragPX=0;
-let currentFreq={};
-
-function proj(x,y,z,rz) {
- // Z 轴旋转 + 45° dimetric 投影
- const cr=Math.cos(rz), sr=Math.sin(rz);
- const xr=x*cr-y*sr, yr=x*sr+y*cr;
- return { sx:yr-xr, sy:-(xr+yr)+z*0.7, depth:-(xr+yr)+z };
-}
-
-function faceVis(face, rz) {
- const cr=Math.cos(rz), sr=Math.sin(rz);
- switch(face) {
- case 'right': return cr+sr>0;
- case 'left': return cr+sr<0;
- case 'front': return cr-sr>0;
- case 'back': return cr-sr<0;
- case 'top': return true;
- case 'bottom':return false;
- }
-}
-
-function faceCorns(cx,cy,cz,hs,face) {
- const h=hs;
- switch(face) {
- case 'top': return [[cx-h,cy-h,cz+h],[cx+h,cy-h,cz+h],[cx+h,cy+h,cz+h],[cx-h,cy+h,cz+h]];
- case 'bottom': return [[cx-h,cy-h,cz-h],[cx+h,cy-h,cz-h],[cx+h,cy+h,cz-h],[cx-h,cy+h,cz-h]];
- case 'front': return [[cx-h,cy+h,cz-h],[cx+h,cy+h,cz-h],[cx+h,cy+h,cz+h],[cx-h,cy+h,cz+h]];
- case 'back': return [[cx-h,cy-h,cz-h],[cx+h,cy-h,cz-h],[cx+h,cy-h,cz+h],[cx-h,cy-h,cz+h]];
- case 'right': return [[cx+h,cy-h,cz-h],[cx+h,cy+h,cz-h],[cx+h,cy+h,cz+h],[cx+h,cy-h,cz+h]];
- case 'left': return [[cx-h,cy-h,cz-h],[cx-h,cy+h,cz-h],[cx-h,cy+h,cz+h],[cx-h,cy-h,cz+h]];
- }
-}
-
-function renderScene(canvas, freq, rz) {
- const dpr=window.devicePixelRatio||1;
- const mob=window.innerWidth<=600;
- const CS=mob?20:26;
- const STEP=CS*2+(mob?2:4);
- const DH=CS*2+(mob?1:2);
- const PAD=mob?30:40;
-
- const cols={};
- for(let n=1;n<=9;n++){
- const row=2-Math.floor((n-1)/3), col=(n-1)%3;
- cols[n]={wx:(col-1)*STEP,wy:(row-1)*STEP};
- }
-
- // 计算包围盒
- let mnX=Infinity,mxX=-Infinity,mnY=Infinity,mxY=-Infinity;
- for(let n=1;n<=9;n++){
- const {wx,wy}=cols[n];
- const layers=Math.max(1,freq[n]||1);
- for(let l=0;l{const p=proj(c[0],c[1],c[2],rz);mnX=Math.min(mnX,p.sx);mxX=Math.max(mxX,p.sx);mnY=Math.min(mnY,p.sy);mxY=Math.max(mxY,p.sy);});
- }
- }
-
- // 底座平台包围盒
- const bw=STEP*2+CS*2+16, bz=-CS-3;
- [[-bw,-bw,bz],[bw,-bw,bz],[bw,bw,bz],[-bw,bw,bz]].forEach(c=>{
- const p=proj(c[0],c[1],c[2],rz);mnX=Math.min(mnX,p.sx);mxX=Math.max(mxX,p.sx);mnY=Math.min(mnY,p.sy);mxY=Math.max(mxY,p.sy);
- });
-
- const viewW=Math.max(mxX-mnX+PAD*2,mob?300:400);
- const viewH=Math.max(mxY-mnY+PAD*2,mob?320:420);
- canvas.width=Math.ceil(viewW*dpr);canvas.height=Math.ceil(viewH*dpr);
- canvas.style.width=Math.ceil(viewW)+'px';canvas.style.height=Math.ceil(viewH)+'px';
- const ctx=canvas.getContext('2d');ctx.scale(dpr,dpr);ctx.clearRect(0,0,viewW,viewH);
-
- const centerX=(mxX+mnX)/2, ox=viewW/2-centerX, oy=viewH-PAD-mxY;
- const faces=[];
- const AF=['top','bottom','front','back','right','left'];
-
- // 底座平台(厚块)
- (()=>{
- const bt=mob?4:5, bzTop=-CS-2, bzBot=bzTop-bt;
- const bclr=[170,155,135];
- [
- {t:'top', c:[[-bw,-bw,bzTop],[bw,-bw,bzTop],[bw,bw,bzTop],[-bw,bw,bzTop]],clr:bclr},
- {t:'front', c:[[-bw,bw,bzBot],[bw,bw,bzBot],[bw,bw,bzTop],[-bw,bw,bzTop]],clr:bclr.map(v=>Math.floor(v*0.85))},
- {t:'right', c:[[bw,-bw,bzBot],[bw,bw,bzBot],[bw,bw,bzTop],[bw,-bw,bzTop]],clr:bclr.map(v=>Math.floor(v*0.7))},
- ].forEach(fb=>{
- const pts=fb.c.map(c=>proj(c[0],c[1],c[2],rz));
- const avgZ=pts.reduce((s,p)=>s+p.depth,0)/4;
- const projPts=pts.map(p=>[ox+p.sx,oy-p.sy]);
- faces.push({z:avgZ,proj:projPts,color:fb.clr,isTop:fb.t==='top',num:0});
- });
- })();
-
- // 方块面
- for(let n=1;n<=9;n++){
- const {wx,wy}=cols[n];
- const layers=Math.max(1,freq[n]||1);
- const clr=NUM_CLR[n];
- const fc={top:clr.top,bottom:clr.top,front:clr.front,back:clr.front,right:clr.right,left:clr.right};
- for(let l=0;lproj(c[0],c[1],c[2],rz));
- const avgZ=pts.reduce((s,p)=>s+p.depth,0)/4;
- const projPts=pts.map(p=>[ox+p.sx,oy-p.sy]);
- const cnt=proj(wx,wy,wz+CS,rz);
- faces.push({z:avgZ,proj:projPts,color:fc[face],isTop:face==='top',num:n,cx:ox+cnt.sx,cy:oy-cnt.sy});
- }
- }
- }
-
- faces.sort((a,b)=>a.z-b.z);
- const alpha=0.82;
-
- for(const f of faces){
- const [r,g,b]=f.color;
- ctx.fillStyle=`rgba(${r},${g},${b},${alpha})`;
- ctx.beginPath();ctx.moveTo(f.proj[0][0],f.proj[0][1]);
- for(let i=1;i<4;i++)ctx.lineTo(f.proj[i][0],f.proj[i][1]);
- ctx.closePath();ctx.fill();
- if(f.isTop&&f.num){
- ctx.fillStyle='rgba(255,255,255,0.92)';
- const fs=mob?11:14;ctx.font=`bold ${fs}px Georgia,"Noto Serif SC",serif`;
- ctx.textAlign='center';ctx.textBaseline='middle';
- ctx.shadowColor='rgba(0,0,0,0.25)';ctx.shadowBlur=2;
- ctx.fillText(f.num,f.cx,f.cy);
- ctx.shadowColor='transparent';ctx.shadowBlur=0;
- }
- }
-
- // 底部 2D 横条
- (()=>{
- const bh=mob?18:22,by=viewH-bh;
- const grad=ctx.createLinearGradient(0,by,0,viewH);
- grad.addColorStop(0,'rgba(180,165,145,0.5)');
- grad.addColorStop(0.3,'rgba(160,145,125,0.35)');
- grad.addColorStop(1,'rgba(140,125,105,0.1)');
- ctx.fillStyle=grad;ctx.fillRect(0,by,viewW,bh);
- ctx.strokeStyle='rgba(140,125,105,0.45)';ctx.lineWidth=1;
- ctx.beginPath();ctx.moveTo(0,by);ctx.lineTo(viewW,by);ctx.stroke();
- })();
-}
-
-function drawScene(){
- const canvas=document.querySelector('#scene3d canvas');
- if(!canvas)return;
- renderScene(canvas,currentFreq,rotZ);
-}
-
-function setupRotation(){
- const el=document.querySelector('#scene3d');if(!el)return;
- function getX(e){return e.touches&&e.touches.length?e.touches[0].clientX:e.clientX}
- function onStart(e){dragActive=true;dragPX=getX(e);e.preventDefault()}
- function onMove(e){
- if(!dragActive)return;
- const cx=getX(e),dx=cx-dragPX;dragPX=cx;
- rotZ+=dx*0.008;drawScene();e.preventDefault();
- }
- function onEnd(){dragActive=false}
- el.addEventListener('mousedown',onStart);
- el.addEventListener('touchstart',onStart,{passive:false});
- window.addEventListener('mousemove',onMove);
- window.addEventListener('touchmove',onMove,{passive:false});
- window.addEventListener('mouseup',onEnd);
- window.addEventListener('touchend',onEnd);
-}
-
-// ===== 解读模块生成器 =====
-
-const GUA64=['','乾为天','天泽履','天火同人','天雷无妄','天风姤','天水讼','天山遁','天地否','泽天夬','兑为泽','泽火革','泽雷随','泽风大过','泽水困','泽山咸','泽地萃','火天大有','火泽睽','离为火','火雷噬嗑','火风鼎','火水未济','火山旅','火地晋','雷天大壮','雷泽归妹','雷火丰','震为雷','雷风恒','雷水解','雷山小过','雷地豫','风天小畜','风泽中孚','风火家人','风雷益','巽为风','风水涣','风山渐','风地观','水天需','水泽节','水火既济','水雷屯','水风井','坎为水','水山蹇','水地比','山天大畜','山泽损','山火贲','山雷颐','山风蛊','山水蒙','艮为山','山地剥','地天泰','地泽临','地火明夷','地雷复','地风升','地水师','地山谦','坤为地'];
-const GUA64_DESC={'乾为天':'刚健中正,纯阳之卦。运势旺盛,宜主动进取。','坤为地':'柔顺包容,厚德载物。耐心守成,终得善果。','水雷屯':'万事起头难。创业维艰,宜稳扎稳打。','山水蒙':'蒙昧初开。宜虚心求教,不可自作聪明。','水天需':'等待时机。耐心守候,时机未到不可强求。','天水讼':'争执诉讼之象。退一步海阔天空。','地水师':'统兵出征。纪律严明,以正制邪。','水地比':'亲附和合。广结善缘,必得助力。','地天泰':'天地交泰。万事亨通,上下和合。','天地否':'闭塞不通。宜隐忍守正,静待时机。','天火同人':'志同道合。同心协力可成大事。','火天大有':'丰收大有。顺天应时,财源广进。','雷天大壮':'强盛壮大。力量充沛但切忌恃强凌弱。','火地晋':'旭日东升。逐步晋升,光明在前。','地火明夷':'光明受损。韬光养晦,等待天明。','风火家人':'家庭和乐。修身齐家,家和万事兴。','火泽睽':'乖离不合。求同存异,小事可成。','水山蹇':'艰难险阻。退守求稳,不可强闯。','雷水解':'困难解除。柳暗花明,危机化解。','山泽损':'损下益上。有舍有得,吃亏是福。','风雷益':'增益有利。抓住机遇,积极作为。','泽天夬':'决断果断。当断则断,不受其乱。','天风姤':'不期而遇。随缘而处,不可强求。','泽地萃':'聚集荟萃。人气旺盛,利于合作。','地风升':'步步高升。循序渐进,终达目标。','泽水困':'困顿之象。坚守正道,终可脱困。','水风井':'修德养民。滋养根本,源远流长。','泽火革':'变革之时。顺势而变,除旧布新。','火风鼎':'鼎新革故。稳固根基,创新求变。','震为雷':'震动警醒。临危不乱,化险为夷。','艮为山':'知止不殆。适可而止,安守本分。','风山渐':'循序渐进。按部就班,水到渠成。','雷泽归妹':'婚嫁之象。以诚相待,终成眷属。','雷火丰':'丰盛之时。月满则亏,知足常乐。','火山旅':'行旅之象。随遇而安,莫问归期。','巽为风':'柔顺渗透。以柔克刚,润物无声。','兑为泽':'喜悦沟通。以和为贵,广结善缘。','风水涣':'涣散离散。聚拢人心,凝聚力量。','水泽节':'节制有度。合理规划,量力而行。','风泽中孚':'诚信感召。以诚待人,金石为开。','雷山小过':'小有过失。宜下不宜上,宜小不宜大。','水火既济':'事已成就。居安思危,防微杜渐。','火水未济':'未竟之业。持之以恒,终将成功。','地山谦':'谦逊受益。虚怀若谷,众望所归。','雷地豫':'安乐愉悦。居安思危,不可懈怠。','泽雷随':'随顺时势。灵活应变,顺势而为。','山风蛊':'蛊坏整治。拨乱反正,振弊起衰。','地泽临':'居高临下。亲近下属,恩威并施。','风地观':'观览体察。审时度势,明察秋毫。','火雷噬嗑':'咬合刑罚。明断是非,刚正不阿。','山火贲':'文饰美化。返璞归真,内在为重。','山地剥':'剥落凋零。守正待时,顺势而为。','地雷复':'一阳来复。否极泰来,新生在望。','天雷无妄':'真实无妄。顺其自然,不妄作为。','山天大畜':'蓄积力量。厚积薄发,大器晚成。','山雷颐':'颐养之道。养生养德,自求口实。','泽风大过':'过度之象。刚柔相济,中庸为贵。','坎为水':'重重险难。坚守诚信,终可出险。','离为火':'光明依附。柔顺中正,照亮四方。'};
-
-function meihuaHTML(y,m,d){
- const dz=['子','丑','寅','卯','辰','巳','午','未','申','酉','戌','亥'];
- const dzNum={子:1,丑:2,寅:3,卯:4,辰:5,巳:6,午:7,未:8,申:9,酉:10,戌:11,亥:12};
- const tg=['甲','乙','丙','丁','戊','己','庚','辛','壬','癸'];
- const guaName=['','乾 ☰','兑 ☱','离 ☲','震 ☳','巽 ☴','坎 ☵','艮 ☶','坤 ☷'];
- const guaEle=['','金','金','火','木','木','水','土','土'];
- const ndz=dz[(y-4)%12],ntg=tg[(y-4)%10],nDZ=dzNum[ndz];
- const upNum=nDZ%8||8,downNum=(m+d)%8||8,dongY=(nDZ+m+d)%6||6;
- const benGuaIdx=(upNum-1)*8+downNum;
- const benName=GUA64[benGuaIdx]||(guaName[upNum]+'+'+guaName[downNum]);
- const varUp=dongY<=3?upNum:((upNum^5)||8),varDown=dongY<=3?((downNum^5)||8):downNum;
- const varIdx=(varUp-1)*8+varDown;
- const varName=GUA64[varIdx]||(guaName[varUp]+'+'+guaName[varDown]);
- const desc=GUA64_DESC[benName]||'卦象已显,静心体悟其中玄机。';
- const dongYaoNames=['初爻','二爻','三爻','四爻','五爻','上爻'];
- const ue=guaEle[upNum],de=guaEle[downNum];
- const shengKe={'金':'木','木':'土','土':'水','水':'火','火':'金'};
- let tiYong;
- if(upNum===downNum)tiYong='体用比和,万事顺遂';
- else if(shengKe[ue]===de)tiYong='体克用,事可成但需费心力';
- else if(shengKe[de]===ue)tiYong='用克体,宜守不宜攻,等待时机';
- else tiYong='体用相生,遇贵人之象,万事可成';
- return `✦ ${benName} ✦
-${ntg}${ndz}年 · 上卦${guaName[upNum]} 下卦${guaName[downNum]} · 动在${dongYaoNames[dongY-1]}
-▸ 本卦:${benName} ${desc} ▸ 变卦:${varName} ${GUA64_DESC[varName]||'变动已生,观其变化而知吉凶。'} ▸ 体用生克 上卦属${ue}·下卦属${de} — ${tiYong}
`;
-}
-
-const XLR_NAMES=['','大安','留连','速喜','赤口','小吉','空亡'];
-const XLR_DESC={'大安':'大吉。光明正大,平安顺遂。求财向东南,凡事安稳。','留连':'凶。事难成就,去者未归。宜静不宜动,急则生变。','速喜':'大吉。喜事将至,向南吉利,行人有信至。','赤口':'凶。口舌是非,宜守不宜攻,失物难寻。','小吉':'大吉。好事将近,路遇贵人,向西南吉利。','空亡':'大凶。谋事落空,宜静待时机,强求反遭祸。'};
-
-function xiaoLiuRenHTML(y,m,d){
- const mo=m>12?m-12:m,shi=7;let pos=1;
- for(let i=1;i✦ 小六壬 掌诀:${name} ✦
-月上起日,日上起时(午时)→ 最终落位
-${name} ${XLR_DESC[name]} ▸ 六掌速查 大安 · 留连 · 速喜 · 赤口 · 小吉 · 空亡
`;
-}
-
-function daLiuRenHTML(y,m,d){
- const dz=['子','丑','寅','卯','辰','巳','午','未','申','酉','戌','亥'];
- const ydz=dz[(y-4)%12],yueJiangMap={1:'子',2:'亥',3:'戌',4:'酉',5:'申',6:'未',7:'午',8:'巳',9:'辰',10:'卯',11:'寅',12:'丑'};
- return `✦ 大六壬 课式概要 ✦
-${y}年(${ydz}年)· ${m}月 月将${yueJiangMap[m]||'午'} · 占时午
-▸ 简介 六壬为三式之首,以月将加占时起天地盘,排四课发三传断吉凶。演算极精(12天将+12神煞+遁干),此处展示基础课式。 ▸ 天地盘 地盘:子丑寅卯辰巳午未申酉戌亥(固定) 天盘:月将加临占时之上,顺布十二辰 ▸ 四课 第一课日干阳神 · 第二课日干阴神 · 第三课日支阳神 · 第四课日支阴神 ▸ 三传 初传(发用·起始)→ 中传(移易·过程)→ 末传(归计·结局) ▸ 九宗门 贼克·比用·涉害·遥克·昴星·别责·八专·伏吟·反吟 ※ 完整排盘需配合具体时辰与日干支,建议请六壬师详断。
`;
-}
-
-function qiMenHTML(y,m,d){
- const dz=['子','丑','寅','卯','辰','巳','午','未','申','酉','戌','亥'];
- const tg=['甲','乙','丙','丁','戊','己','庚','辛','壬','癸'];
- const mingGongMap={1:'丑',2:'寅',3:'卯',4:'辰',5:'巳',6:'午',7:'未',8:'申',9:'酉',10:'戌',11:'亥',12:'子'};
- return `✦ 奇门遁甲 命盘概要 ✦
-${tg[(y-4)%10]}${dz[(y-4)%12]}年 · 命宫:${mingGongMap[m]||'午'}
-▸ 简介 奇门合天(九星)、地(九宫)、人(八门)、神(八神)四层于一体。排盘需节气+时辰+用局,极为精密。 ▸ 地盘九宫 戴九履一·左三右七·二四为肩·六八为足·五居中央 坎一水·坤二土·震三木·巽四木·中五土·乾六金·兑七金·艮八土·离九火 ▸ 八门(人事) 开门(吉)·休门(吉)·生门(吉)·伤门(凶)·杜门(平)·景门(平)·死门(凶)·惊门(凶) ▸ 九星(天时) 天蓬·天任·天冲·天辅·天英·天芮·天柱·天心·天禽 ※ 全面排盘需根据具体时辰和节气确定阳遁/阴遁几局,建议请奇门师详断。
`;
-}
-
-const ZODIAC=[
- {name:'摩羯座',emoji:'♑',elem:'土',from:[12,22],to:[1,19],trait:'坚韧务实,目标明确,大器晚成',lucky:'深绿·黑'},
- {name:'水瓶座',emoji:'♒',elem:'风',from:[1,20],to:[2,18],trait:'独立创新,思维超前,人道主义',lucky:'蓝·银'},
- {name:'双鱼座',emoji:'♓',elem:'水',from:[2,19],to:[3,20],trait:'浪漫敏感,富有同情心,艺术天赋',lucky:'紫·海蓝'},
- {name:'白羊座',emoji:'♈',elem:'火',from:[3,21],to:[4,19],trait:'热情勇敢,行动力强,开拓先锋',lucky:'红·金'},
- {name:'金牛座',emoji:'♉',elem:'土',from:[4,20],to:[5,20],trait:'稳健可靠,审美出众,坚定执着',lucky:'粉·绿'},
- {name:'双子座',emoji:'♊',elem:'风',from:[5,21],to:[6,21],trait:'机智灵活,善于沟通,双面魅力',lucky:'黄·银'},
- {name:'巨蟹座',emoji:'♋',elem:'水',from:[6,22],to:[7,22],trait:'温柔顾家,情感丰富,保护欲强',lucky:'白·银'},
- {name:'狮子座',emoji:'♌',elem:'火',from:[7,23],to:[8,22],trait:'自信大方,领导力强,光芒四射',lucky:'金·橙'},
- {name:'处女座',emoji:'♍',elem:'土',from:[8,23],to:[9,22],trait:'细致严谨,追求完美,服务精神',lucky:'灰·米'},
- {name:'天秤座',emoji:'♎',elem:'风',from:[9,23],to:[10,23],trait:'优雅公正,善于平衡,社交达人',lucky:'粉·蓝'},
- {name:'天蝎座',emoji:'♏',elem:'水',from:[10,24],to:[11,22],trait:'深沉敏锐,意志坚定,极致深情',lucky:'深红·黑'},
- {name:'射手座',emoji:'♐',elem:'火',from:[11,23],to:[12,21],trait:'乐观自由,探索精神,哲学思维',lucky:'紫·深蓝'},
-];
-
-function xingZuoHTML(y,m,d){
- let z=ZODIAC.find(x=>(m===x.from[0]&&d>=x.from[1])||(m===x.to[0]&&d<=x.to[1]));
- if(!z){if((m===12&&d>=22)||(m===1&&d<=19))z=ZODIAC[0];else if(m===1)z=ZODIAC[1];else z=ZODIAC.find(x=>m===x.from[0]&&d✦ ${z.emoji} ${z.name} ✦
-${z.elem}象星座 · 幸运色:${z.lucky}
-${z.emoji} ▸ 性格特质 ${z.trait} ▸ 元素能量 ${et[z.elem]} ▸ 十二星座 ${ZODIAC.map(x=>`${x.emoji} `).join(' ')}
`;
-}
-
-const BAGUA=[
- {name:'乾 ☰',xiang:'天',elem:'金',clr:'#d4c5a0',txt:'#8b7355',desc:'刚健·创造'},
- {name:'兑 ☱',xiang:'泽',elem:'金',clr:'#e8d5c8',txt:'#a08070',desc:'喜悦·沟通'},
- {name:'离 ☲',xiang:'火',elem:'火',clr:'#e8c8c0',txt:'#b06050',desc:'光明·智慧'},
- {name:'震 ☳',xiang:'雷',elem:'木',clr:'#c8d8b0',txt:'#5a7a3a',desc:'行动·震动'},
- {name:'巽 ☴',xiang:'风',elem:'木',clr:'#b8d0b8',txt:'#4a7a4a',desc:'渗透·柔顺'},
- {name:'坎 ☵',xiang:'水',elem:'水',clr:'#a8c8d8',txt:'#3a6a8a',desc:'险陷·智慧'},
- {name:'艮 ☶',xiang:'山',elem:'土',clr:'#d0c8b0',txt:'#7a6a4a',desc:'静止·坚守'},
- {name:'坤 ☷',xiang:'地',elem:'土',clr:'#e0d8c0',txt:'#8a7a5a',desc:'柔顺·包容'},
-];
-
-function wuXingHTML(y,m,d){
- const yElem=['金','水','木','火','土'][Math.floor(((y-4)%10)/2)];
- const mElem=['木','木','土','火','火','土','金','金','土','水','水','土'][m-1];
- const dElem=['木','火','土','金','水'][d%5];
- const ec={金:'#d4c5a0',水:'#a8c8d8',木:'#b8d0b8',火:'#e8c8c0',土:'#e0d8c0'};
- return `✦ 五行八卦 能量图谱 ✦
-年柱${yElem} · 月柱${mElem} · 日柱${dElem}
-▸ 五行
-
${['金','水','木','火','土'].map(e=>`${e} `).join('')}
-
金(义)·水(智)·木(仁)·火(礼)·土(信) 相生:金→水→木→火→土→金 相克:金→木→土→水→火→金 ▸ 八卦
-
${BAGUA.map(b=>`
${b.name} ${b.elem}·${b.xiang} ${b.desc}
`).join('')}
-
八卦歌诀:乾三连·坤六断·震仰盂·艮覆碗·离中虚·坎中满·兑上缺·巽下断 `;
-}
-
-// ===== Tab 切换 =====
-function initTabs(){
- const nav=document.querySelector('.tabs-nav');
- if(!nav)return;
- nav.addEventListener('click',e=>{
- const btn=e.target.closest('.tab-btn');
- if(!btn)return;
- const tab=btn.dataset.tab;
- nav.querySelectorAll('.tab-btn').forEach(b=>b.classList.remove('active'));
- btn.classList.add('active');
- document.querySelectorAll('.tab-panel').forEach(p=>p.classList.remove('active'));
- const panel=document.getElementById(tab+'-panel');
- if(panel)panel.classList.add('active');
- });
-}
-
-function update(v,y,m,d){
- document.getElementById('valR').textContent=v.R;
- document.getElementById('valQ').textContent=v.Q;
- document.getElementById('valP').textContent=v.P;
- document.getElementById('valO').textContent=v.O;
- document.getElementById('valM').textContent=v.M;
- document.getElementById('valN').textContent=v.N;
- document.getElementById('valI').textContent=v.I;
- document.getElementById('valJ').textContent=v.J;
- document.getElementById('valK').textContent=v.K;
- document.getElementById('valL').textContent=v.L;
- document.getElementById('valU').textContent=v.U;
- document.getElementById('valT').textContent=v.T;
- document.getElementById('valS').textContent=v.S;
- document.getElementById('valX').textContent=v.X;
- document.getElementById('valV').textContent=v.V;
- document.getElementById('valW').textContent=v.W;
- document.getElementById('dateD').textContent=String(d).padStart(2,'0');
- document.getElementById('dateM').textContent=String(m).padStart(2,'0');
- document.getElementById('dateY').textContent=y;
-
- const allNums=[0,1,2,3,4,5,6,7,8,9];
- const inner=new Set([v.O,v.M,v.N,v.I,v.J,v.K,v.L]);
- const present=new Set([...inner,v.Q,v.P,v.R,v.T,v.S,v.U,v.V,v.W,v.X,v.AB[0],v.AB[1],v.CD[0],v.CD[1],v.EF[0],v.EF[1],v.GH[0],v.GH[1]]);
- const miss={inner:allNums.filter(n=>!inner.has(n)),outer:allNums.filter(n=>![v.Q,v.P,v.R,v.T,v.S,v.U,v.V,v.W,v.X].includes(n)),both:allNums.filter(n=>!present.has(n))};
- const n=NUM[v.O]||{};
-
- const freq={};
- for(let i=1;i<=9;i++)freq[i]=0;
- const allVals=[v.O,v.M,v.N,v.I,v.J,v.K,v.L,v.Q,v.P,v.R,v.T,v.S,v.U,v.V,v.W,v.X,
- v.AB[0],v.AB[1],v.CD[0],v.CD[1],v.EF[0],v.EF[1],v.GH[0],v.GH[1]];
- allVals.forEach(x=>{if(x>=1&&x<=9)freq[x]++;});
- currentFreq=freq;
- const freqArr=Object.entries(freq).sort((a,b)=>b[1]-a[1]);
- const most=freqArr[0],least=freqArr.filter(([,c])=>c===freqArr[freqArr.length-1][1]);
-
- let freeHtml=``;
- freeHtml+=`
${v.O}号人
`;
- freeHtml+=`
${n.title||''}
`;
- freeHtml+=`
${n.desc||''}
`;
- freeHtml+=`
`;
- let premiumHtml=``;
- premiumHtml+=``;
- premiumHtml+=`✦ 天赋优势 :${n.pos||''}✦ 人生课题 :${n.neg||''}✦ 五行属性 :${n.elem||''}✦ 适合职业 :${n.job||''}
`;
-
- premiumHtml+=` `;
- premiumHtml+=`✦ 数字能量图谱 ✦
`;
- premiumHtml+=`你的生命三角共汇聚了 ${allVals.filter(x=>x>=1).length} 个能量数字
`;
- premiumHtml+=``;
- premiumHtml+=`🔥 能量最强:${most[0]} (出现 ${most[1]} 次),是你生命中最闪耀的特质
`;
- if(least.length>0)premiumHtml+=`💧 能量最弱:${least.map(([n])=>`${n} `).join('、')}(仅 ${least[0][1]} 次),值得你用心浇灌
`;
-
- premiumHtml+=` `;
- premiumHtml+=`✦ 三角内外——真实自我与外界眼光 ✦
`;
- premiumHtml+=``;
- premiumHtml+=`
▸ 三角内部 :代表你内在真实的自我——潜意识的驱动、与生俱来的性格特质、不为人知的内心世界。
`;
- premiumHtml+=`
▸ 三角外部 :代表外界对你的认知——你在工作、家庭、社交中呈现出的样子,以及他人眼中的你。
`;
- premiumHtml+=`
▸ 下方基因 (父母遗传):代表来自父亲和母亲的先天遗传基因,是你性格的底层土壤。
`;
-
- premiumHtml+=` `;
- premiumHtml+=`✦ 性格密码深度解读 ✦
`;
- premiumHtml+=``;
- premiumHtml+=`
潜意识码:${v.I}${v.J}${v.K}${v.L}
`;
- premiumHtml+=`
你内心深处的真实驱动力,最本能的反应模式。四个数字分别主宰:思维、情感、行动、人际。
`;
- premiumHtml+=`
内心码:${v.M}${v.N}
`;
- premiumHtml+=`
深层情感模式与核心价值观。理性行动 vs 感性人际——两者的平衡就是你面对压力时的姿态。
`;
- premiumHtml+=`
坐镇码:${v.I}${v.M}${v.O}
`;
- premiumHtml+=`
性格核心轴线:潜意识→内心→主性格。三环相扣,是你从内驱力到外在呈现的完整链条,也是你最稳定的底色。
`;
- premiumHtml+=`
父亲基因:${v.EF.join('')} ${v.GH.join('')} · 母亲基因:${v.AB.join('')} ${v.CD.join('')}
`;
- premiumHtml+=`
父亲基因 ← 年份 ${v.EF.join('')}${v.GH.join('')})承载家族传承与事业基因 母亲基因 ← 月${v.CD.join('')} 日${v.AB.join('')})影响情感模式与人际底色
`;
-
- premiumHtml+=` `;
- premiumHtml+=`✦ 数字缺失与能量过剩 ✦
`;
- premiumHtml+=``;
- if(miss.both.length>0){premiumHtml+=`
⚠ 缺失数字
`;miss.both.forEach(n=>{premiumHtml+=`
· 缺${n} :${MISS_MSG[n]||''}
`;});}
- else premiumHtml+=`
✦ 你的数字分布完整,能量均衡。
`;
- const over=[];for(let i=1;i<=9;i++){if(freq[i]>=4&&!miss.both.includes(i))over.push(i);}
- if(over.length>0){premiumHtml+=`
⚡ 能量过剩
`;over.forEach(n=>{premiumHtml+=`
· 多${n} (×${freq[n]}):${MISS_STRONG[n]||''}
`;});}
- premiumHtml+=`
`;
-
- const joints=[['I','J'],['J','M'],['M','I'],['K','L'],['L','N'],['N','K'],['M','O'],['O','N'],['M','N'],['Q','P'],['Q','O'],['P','O']].map(([a,b])=>{const k=''+v[a]+v[b];const jk=Object.keys(JOINT).find(x=>x.startsWith(k));return {code:k,label:jk?JOINT[jk]:'—'};});
- premiumHtml+=` `;
- premiumHtml+=`✦ 12组人生联合码 ✦
`;
- premiumHtml+=`相邻数字组合,解密你不同人生阶段的内在剧本
`;
- const ages=[
- {label:'21—40岁 · 工作和朋友',codes:joints.slice(0,4),desc:'由潜意识码主导,反映你在职场上升期和社交圈中的表现模式。'+(v.I+v.J+v.M>=10?'能量较强,事业心旺盛,社交活跃。':'能量内敛,更注重深度而非广度。')},
- {label:'41—60岁 · 儿女和下属',codes:joints.slice(4,8),desc:'由内心码和主性格主导,体现你对下一代和下级的培养方式及中年价值观。'+(v.K+v.L+v.N>=10?'有较强的责任感和支配欲。':'倾向于给予空间,放手让他人成长。')},
- {label:'61岁至晚年 · 晚年和家庭',codes:joints.slice(8,12),desc:'由外心码主导,展现你晚年的生活智慧和家庭关系的最终呈现。'+(v.M+v.N+v.O>=10?'晚年活跃,持续发挥影响力。':'晚年宁静,享受内在平和。')},
- ];
- ages.forEach(ag=>{
- premiumHtml+=`${ag.label}
`;
- premiumHtml+=`${ag.desc}
`;
- premiumHtml+=``;
- ag.codes.forEach(jc=>{premiumHtml+=`
${jc.code} ${jc.label}
`;});
- premiumHtml+=`
`;
- });
-
- const paid=localStorage.getItem('jiema_paid');
- const lockEl=document.getElementById('missingBlock');
- if(paid){
- lockEl.innerHTML=freeHtml+premiumHtml;
- }else{
- lockEl.innerHTML=freeHtml+''+premiumHtml+'
';
- const lock=document.getElementById('shuziLock');
- Array.from(lock.children).forEach(c=>c.classList.add('blur'));
- const cover=document.createElement('div');cover.className='cover';
- cover.innerHTML='🔒 解锁你的完整数字报告
天赋优势 · 能量分布 · 性格编码 · 12组联合码
';
- const btn=document.createElement('button');btn.className='lk-btn';btn.textContent='¥39.9 立即解锁 →';
- btn.addEventListener('click',unlockShuzi);cover.appendChild(btn);lock.appendChild(cover);
- }
- setTimeout(()=>{
- const canvas=document.querySelector('#scene3d canvas');
- if(canvas){renderScene(canvas,freq,rotZ);setupRotation();}
- },30);
- document.getElementById('missingMsg').textContent='';
- document.getElementById('codesBlock').innerHTML='';
- document.getElementById('jointBlock').innerHTML='';
-
- const tipEl=document.getElementById('tip');
- ['valR','valQ','valP','valO','valM','valN','valI','valJ','valK','valL','valU','valT','valS','valX','valV','valW'].forEach(id=>{
- const el=document.getElementById(id);if(!el)return;el.style.cursor='pointer';
- const k=id.replace('val','');
- el.onpointerenter=()=>{const f=tips[k]?tips[k](v):'';tipEl.innerHTML=f||k;tipEl.classList.add('on')};
- el.onpointermove=e=>{tipEl.style.left=(e.clientX+14)+'px';tipEl.style.top=(e.clientY-10)+'px'};
- });
-
- // 填充其他解读面板
- document.getElementById('meihua-panel').innerHTML=meihuaHTML(y,m,d);
- document.getElementById('xiaoliuren-panel').innerHTML=xiaoLiuRenHTML(y,m,d);
- document.getElementById('daliuren-panel').innerHTML=daLiuRenHTML(y,m,d);
- document.getElementById('qimen-panel').innerHTML=qiMenHTML(y,m,d);
- document.getElementById('xingzuo-panel').innerHTML=xingZuoHTML(y,m,d);
- document.getElementById('wuxing-panel').innerHTML=wuXingHTML(y,m,d);
- }
-
- function unlockShuzi(){localStorage.setItem("jiema_paid","1");const l=document.getElementById("shuziLock");l.querySelectorAll(".blur").forEach(c=>c.classList.remove("blur"));l.classList.add("unlocked");}
- function go(){const y=+document.getElementById('inY').value,m=+document.getElementById('inM').value,d=+document.getElementById('inD').value;if(!y||!m||!d)return;update(calc(y,m,d),y,m,d)}
- document.getElementById('goBtn').addEventListener('click',go);
- document.querySelectorAll('.input-row input').forEach(i=>i.addEventListener('keydown',e=>{if(e.key==='Enter')go()}));
- setTimeout(go,150);
- initTabs();
-
- // URL 参数预填(从 jiema.html 跳转过来)
- (function(){
- const p=new URLSearchParams(location.search);
- const y=p.get('y'),m=p.get('m'),d=p.get('d');
- if(y&&m&&d){
- document.getElementById('inY').value=y;
- document.getElementById('inM').value=m;
- document.getElementById('inD').value=d;
- setTimeout(go,200);
- }
- })();
diff --git a/js/xingjing.js b/js/xingjing.js
deleted file mode 100644
index 9feed22..0000000
--- a/js/xingjing.js
+++ /dev/null
@@ -1,1089 +0,0 @@
-// ═══════ DATA ═══════
-var ZODIAC=[
- {name:'摩羯座',dh:'羯',el:'土',trait:'坚韧·务实·野心',color:'#8B7355',range:[[1,1,1,19],[12,22,12,31]]},
- {name:'水瓶座',dh:'瓶',el:'风',trait:'独立·创新·博爱',color:'#4A90E2',range:[[1,20,2,18]]},
- {name:'双鱼座',dh:'鱼',el:'水',trait:'敏感·梦幻·共情',color:'#7B68EE',range:[[2,19,3,20]]},
- {name:'白羊座',dh:'羊',el:'火',trait:'勇敢·冲动·开创',color:'#E54D42',range:[[3,21,4,19]]},
- {name:'金牛座',dh:'牛',el:'土',trait:'稳重·固执·审美',color:'#5CB85C',range:[[4,20,5,20]]},
- {name:'双子座',dh:'子',el:'风',trait:'多变·聪明·好奇',color:'#F5A623',range:[[5,21,6,21]]},
- {name:'巨蟹座',dh:'蟹',el:'水',trait:'温柔·念旧·顾家',color:'#C0C0C0',range:[[6,22,7,22]]},
- {name:'狮子座',dh:'狮',el:'火',trait:'自信·慷慨·领袖',color:'#FFD700',range:[[7,23,8,22]]},
- {name:'处女座',dh:'女',el:'土',trait:'细致·完美·服务',color:'#8B8B83',range:[[8,23,9,22]]},
- {name:'天秤座',dh:'秤',el:'风',trait:'优雅·平衡·犹豫',color:'#FF69B4',range:[[9,23,10,23]]},
- {name:'天蝎座',dh:'蝎',el:'水',trait:'深刻·神秘·执着',color:'#8B0000',range:[[10,24,11,22]]},
- {name:'射手座',dh:'射',el:'火',trait:'乐观·自由·冒险',color:'#FF6347',range:[[11,23,12,21]]}
-];
-var ZODIAC_ICON={"摩羯座":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCA2NCI+CjxjaXJjbGUgY3g9IjMyIiBjeT0iMzIiIHI9IjMwIiBmaWxsPSIjRjVFNkQzIiBzdHJva2U9IiNBMEE1NUIiIHN0cm9rZS13aWR0aD0iMi41Ii8+CjxjaXJjbGUgY3g9IjMyIiBjeT0iMzIiIHI9IjI4IiBmaWxsPSJub25lIiBzdHJva2U9IiNDNEE4N0MiIHN0cm9rZS13aWR0aD0iMC41Ii8+CjxnIHN0cm9rZT0iIzZCNEYzQSIgc3Ryb2tlLXdpZHRoPSIyIiBmaWxsPSJub25lIiBzdHJva2UtbGluZWNhcD0icm91bmQiPgo8cGF0aCBkPSJNMjAgMzhjMi00IDYtOCAxMi04czEwIDQgMTIgOCIvPgo8cGF0aCBkPSJNMjUgMzBjMS0yIDMtNCA3LTNjMyAxIDUgMyA1IDMiLz4KPHBhdGggZD0iTTE4IDQyYzIgNCA2IDggOCAxNGMxIDMgMCA1LTIgNiIvPgo8cGF0aCBkPSJNNDYgNDJjLTIgNC02IDgtOCAxNGMtMSAzIDAgNSAyIDYiLz4KPC9nPgo8Y2lyY2xlIGN4PSIzMiIgY3k9IjIyIiByPSIyIiBmaWxsPSIjNkI0RjNBIi8+Cjwvc3ZnPg==","水瓶座":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCA2NCI+CjxjaXJjbGUgY3g9IjMyIiBjeT0iMzIiIHI9IjMwIiBmaWxsPSIjRjBGNUY4IiBzdHJva2U9IiM1QjhGQTgiIHN0cm9rZS13aWR0aD0iMi41Ii8+CjxjaXJjbGUgY3g9IjMyIiBjeT0iMzIiIHI9IjI4IiBmaWxsPSJub25lIiBzdHJva2U9IiM3QkFGQzgiIHN0cm9rZS13aWR0aD0iMC41Ii8+CjxnIHN0cm9rZT0iIzNBNjA3MCIgc3Ryb2tlLXdpZHRoPSIyIiBmaWxsPSJub25lIiBzdHJva2UtbGluZWNhcD0icm91bmQiPgo8cGF0aCBkPSJNMjIgMTRjMCAyIDIgNCA1IDRoMTBjMyAwIDUtMiA1LTQiLz4KPHBhdGggZD0iTTI0IDE4djEwYzAgNi0yIDEwLTQgMTRjMiAyIDQgNCA2IDRoMTJjMiAwIDQtMiA2LTRjLTItNC00LTgtNC0xNFYxOCIvPgo8cGF0aCBkPSJNMjggMzBjMi0yIDQtNCA4LTNjMyAxIDQgMyA0IDNNMjcgMzZjMi0yIDUtMyA4LTJNMjUgNDJjMi0yIDUtMyA4LTIiLz4KPC9nPgo8L3N2Zz4=","双鱼座":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCA2NCI+CjxjaXJjbGUgY3g9IjMyIiBjeT0iMzIiIHI9IjMwIiBmaWxsPSIjRjJGMEY4IiBzdHJva2U9IiM2QjVCOTUiIHN0cm9rZS13aWR0aD0iMi41Ii8+CjxjaXJjbGUgY3g9IjMyIiBjeT0iMzIiIHI9IjI4IiBmaWxsPSJub25lIiBzdHJva2U9IiM4QjdCQjUiIHN0cm9rZS13aWR0aD0iMC41Ii8+CjxnIHN0cm9rZT0iIzRBMzU3MCIgc3Ryb2tlLXdpZHRoPSIyIiBmaWxsPSJub25lIiBzdHJva2UtbGluZWNhcD0icm91bmQiPgo8cGF0aCBkPSJNMjIgMjJjNi00IDE0LTIgMTYgNmMyIDgtNCAxNC0xMCAxNHMtMTAtNi04LTE0Ii8+CjxjaXJjbGUgY3g9IjIwIiBjeT0iMjAiIHI9IjEuNSIgZmlsbD0iIzRBMzU3MCIvPgo8cGF0aCBkPSJNNDIgNDJjLTYgNC0xNCAyLTE2LTZjLTItOCA0LTE0IDEwLTE0czEwIDYgOCAxNCIvPgo8Y2lyY2xlIGN4PSI0NCIgY3k9IjQ0IiByPSIxLjUiIGZpbGw9IiM0QTM1NzAiLz4KPHBhdGggZD0iTTMwIDM0YzEtMiAzLTIgNCAwIi8+CjwvZz4KPC9zdmc+","白羊座":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCA2NCI+CjxjaXJjbGUgY3g9IjMyIiBjeT0iMzIiIHI9IjMwIiBmaWxsPSIjRkRGMkVDIiBzdHJva2U9IiNDMDQwMzAiIHN0cm9rZS13aWR0aD0iMi41Ii8+CjxjaXJjbGUgY3g9IjMyIiBjeT0iMzIiIHI9IjI4IiBmaWxsPSJub25lIiBzdHJva2U9IiNEMDYwNTAiIHN0cm9rZS13aWR0aD0iMC41Ii8+CjxnIHN0cm9rZT0iIzhCMjAyMCIgc3Ryb2tlLXdpZHRoPSIyLjIiIGZpbGw9Im5vbmUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCI+CjxwYXRoIGQ9Ik0xNiAzNmMyLTggNi0xNCAxNC0xNmMzLTEgNiAwIDggMiIvPgo8cGF0aCBkPSJNNDggMzZjLTItOC02LTE0LTE0LTE2Yy0zLTEtNiAwLTggMiIvPgo8cGF0aCBkPSJNMTggMzhjNC0xMiA4LTE0IDE0LTEyYzYgMiA4IDggOCA4TTQ2IDM4Yy00LTEyLTgtMTQtMTQtMTJjLTYgMi04IDgtOCA4Ii8+CjwvZz4KPHBhdGggZD0iTTI4IDQwYzAtMiAyLTQgNC00czQgMiA0IDQiIHN0cm9rZT0iIzhCMjAyMCIgc3Ryb2tlLXdpZHRoPSIxLjUiIGZpbGw9Im5vbmUiLz4KPC9zdmc+","金牛座":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCA2NCI+CjxjaXJjbGUgY3g9IjMyIiBjeT0iMzIiIHI9IjMwIiBmaWxsPSIjRjhGMkVBIiBzdHJva2U9IiNBMDg1NUIiIHN0cm9rZS13aWR0aD0iMi41Ii8+CjxjaXJjbGUgY3g9IjMyIiBjeT0iMzIiIHI9IjI4IiBmaWxsPSJub25lIiBzdHJva2U9IiNDNEE4N0MiIHN0cm9rZS13aWR0aD0iMC41Ii8+CjxnIHN0cm9rZT0iIzZCNEYzQSIgc3Ryb2tlLXdpZHRoPSIyIiBmaWxsPSJub25lIiBzdHJva2UtbGluZWNhcD0icm91bmQiPgo8cGF0aCBkPSJNMjYgMjBjMi02IDgtOCAxMi02YzIgMSA0IDMgNCA2Ii8+CjxwYXRoIGQ9Ik0xOCAyOGMwIDQgMiA4IDYgMTBsNCAxMGMxIDIgMiAzIDQgM3MzLTEgNC0zbDQtMTBjNC0yIDYtNiA2LTEwIi8+CjxjaXJjbGUgY3g9IjI0IiBjeT0iMjQiIHI9IjIiIGZpbGw9IiM2QjRGM0EiLz4KPGNpcmNsZSBjeD0iNDAiIGN5PSIyNCIgcj0iMiIgZmlsbD0iIzZCNEYzQSIvPgo8cGF0aCBkPSJNMjggMzRoOCIvPgo8L2c+Cjwvc3ZnPg==","双子座":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCA2NCI+CjxjaXJjbGUgY3g9IjMyIiBjeT0iMzIiIHI9IjMwIiBmaWxsPSIjRjBGNUY4IiBzdHJva2U9IiM1QjhGQTgiIHN0cm9rZS13aWR0aD0iMi41Ii8+CjxjaXJjbGUgY3g9IjMyIiBjeT0iMzIiIHI9IjI4IiBmaWxsPSJub25lIiBzdHJva2U9IiM3QkFGQzgiIHN0cm9rZS13aWR0aD0iMC41Ii8+CjxnIHN0cm9rZT0iIzNBNjA3MCIgc3Ryb2tlLXdpZHRoPSIxLjgiIGZpbGw9Im5vbmUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCI+CjxwYXRoIGQ9Ik0yMiAxNGMwIDQgMiA2IDUgNnM1LTIgNS02Ii8+CjxwYXRoIGQ9Ik0yMiAyMHYyMGMwIDYgMiAxMCA0IDEyIi8+CjxwYXRoIGQ9Ik0zMCAxNGMwIDQgMiA2IDUgNnM1LTIgNS02Ii8+CjxwYXRoIGQ9Ik0zMCAyMHYyMGMwIDYgMiAxMCA0IDEyIi8+CjxwYXRoIGQ9Ik0yNCAyOGMxLTIgMy0zIDUtMk0zMiAyOGMxLTIgMy0zIDUtMiIvPgo8L2c+CjxjaXJjbGUgY3g9IjI0IiBjeT0iMTQiIHI9IjMiIGZpbGw9IiMzQTYwNzAiLz4KPGNpcmNsZSBjeD0iMzIiIGN5PSIxNCIgcj0iMyIgZmlsbD0iIzNBNjA3MCIvPgo8L3N2Zz4=","巨蟹座":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCA2NCI+CjxjaXJjbGUgY3g9IjMyIiBjeT0iMzIiIHI9IjMwIiBmaWxsPSIjRjJGMEY4IiBzdHJva2U9IiM2QjVCOTUiIHN0cm9rZS13aWR0aD0iMi41Ii8+CjxjaXJjbGUgY3g9IjMyIiBjeT0iMzIiIHI9IjI4IiBmaWxsPSJub25lIiBzdHJva2U9IiM4QjdCQjUiIHN0cm9rZS13aWR0aD0iMC41Ii8+CjxnIHN0cm9rZT0iIzRBMzU3MCIgc3Ryb2tlLXdpZHRoPSIyIiBmaWxsPSJub25lIiBzdHJva2UtbGluZWNhcD0icm91bmQiPgo8cGF0aCBkPSJNMTYgMjhjNC00IDgtNCAxMi0yYzItMyA1LTMgOCAwYzMtMyA2LTMgMTAtMiIvPgo8cGF0aCBkPSJNMTQgMzRjNCA2IDggMTAgMTggMTBzMTQtNCAxOC0xMCIvPgo8cGF0aCBkPSJNMjQgNDRjMyA0IDYgNiA4IDZzNS0yIDgtNiIvPgo8cGF0aCBkPSJNMTggMzR2LTZNNDYgMzR2LTYiLz4KPC9nPgo8Y2lyY2xlIGN4PSIxOCIgY3k9IjIyIiByPSIyIiBmaWxsPSIjNEEzNTcwIi8+CjxjaXJjbGUgY3g9IjQ2IiBjeT0iMjIiIHI9IjIiIGZpbGw9IiM0QTM1NzAiLz4KPC9zdmc+","狮子座":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCA2NCI+CjxjaXJjbGUgY3g9IjMyIiBjeT0iMzIiIHI9IjMwIiBmaWxsPSIjRkRGMkVDIiBzdHJva2U9IiNDMDQwMzAiIHN0cm9rZS13aWR0aD0iMi41Ii8+CjxjaXJjbGUgY3g9IjMyIiBjeT0iMzIiIHI9IjI4IiBmaWxsPSJub25lIiBzdHJva2U9IiNEMDYwNTAiIHN0cm9rZS13aWR0aD0iMC41Ii8+CjxnIHN0cm9rZT0iIzhCMjAyMCIgc3Ryb2tlLXdpZHRoPSIyIiBmaWxsPSJub25lIiBzdHJva2UtbGluZWNhcD0icm91bmQiPgo8cGF0aCBkPSJNMzIgMTJjLTYgMi0xMCA2LTEyIDEwYy0xIDItMSA0IDAgNmMyIDYgNiAxMCAxMiAxMmM2LTIgMTAtNiAxMi0xMmMxLTIgMS00IDAtNmMtMi00LTYtOC0xMi0xMHoiLz4KPHBhdGggZD0iTTI4IDIyYzEtMiAzLTMgNC0yczEgMyAwIDQiLz4KPHBhdGggZD0iTTM2IDIyYy0xLTItMy0zLTQtMnMtMSAzIDAgNCIvPgo8cGF0aCBkPSJNMzAgMjhjMC0xIDEtMSAyIDBjMSAxIDEgMSAyIDAiLz4KPC9nPgo8L3N2Zz4=","处女座":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCA2NCI+CjxjaXJjbGUgY3g9IjMyIiBjeT0iMzIiIHI9IjMwIiBmaWxsPSIjRjhGMkVBIiBzdHJva2U9IiNBMDg1NUIiIHN0cm9rZS13aWR0aD0iMi41Ii8+CjxjaXJjbGUgY3g9IjMyIiBjeT0iMzIiIHI9IjI4IiBmaWxsPSJub25lIiBzdHJva2U9IiNDNEE4N0MiIHN0cm9rZS13aWR0aD0iMC41Ii8+CjxnIHN0cm9rZT0iIzZCNEYzQSIgc3Ryb2tlLXdpZHRoPSIxLjgiIGZpbGw9Im5vbmUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCI+CjxwYXRoIGQ9Ik0zMiAxMmMwIDQtMiA2LTUgNiIvPgo8cGF0aCBkPSJNMzIgMTh2MTJjMCA4LTIgMTItNCAxNmMyIDIgNCA0IDggNHM2LTIgOC00Yy0yLTQtNC04LTQtMTZWMTgiLz4KPHBhdGggZD0iTTIyIDQ2bDQtNGw0IDQiLz4KPHBhdGggZD0iTTQyIDQ2bC00LTRsLTQgNCIvPgo8cGF0aCBkPSJNMjggMjBsMiAxNCIvPgo8cGF0aCBkPSJNMzYgMjBsLTIgMTQiLz4KPC9nPgo8Y2lyY2xlIGN4PSIyNyIgY3k9IjEyIiByPSIzIiBmaWxsPSIjNkI0RjNBIi8+Cjwvc3ZnPg==","天秤座":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCA2NCI+CjxjaXJjbGUgY3g9IjMyIiBjeT0iMzIiIHI9IjMwIiBmaWxsPSIjRjBGNUY4IiBzdHJva2U9IiM1QjhGQTgiIHN0cm9rZS13aWR0aD0iMi41Ii8+CjxjaXJjbGUgY3g9IjMyIiBjeT0iMzIiIHI9IjI4IiBmaWxsPSJub25lIiBzdHJva2U9IiM3QkFGQzgiIHN0cm9rZS13aWR0aD0iMC41Ii8+CjxnIHN0cm9rZT0iIzNBNjA3MCIgc3Ryb2tlLXdpZHRoPSIyIiBmaWxsPSJub25lIiBzdHJva2UtbGluZWNhcD0icm91bmQiPgo8cGF0aCBkPSJNMTYgMThoMzIiLz4KPHBhdGggZD0iTTMyIDE4djgiLz4KPHBhdGggZD0iTTE4IDI2bC0yIDhjMCAyIDEgNCAzIDRzMy0yIDMtNGMwIDIgMSA0IDMgNHMzLTItMy00YzAgMiAxIDQgMyA0czMtMiAzLTRsLTItOCIvPgo8cGF0aCBkPSJNMjAgNDJjNCA2IDggMTAgMTIgMTBzOC00IDEyLTEwIi8+CjwvZz4KPC9zdmc+","天蝎座":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCA2NCI+CjxjaXJjbGUgY3g9IjMyIiBjeT0iMzIiIHI9IjMwIiBmaWxsPSIjRjJGMEY4IiBzdHJva2U9IiM2QjVCOTUiIHN0cm9rZS13aWR0aD0iMi41Ii8+CjxjaXJjbGUgY3g9IjMyIiBjeT0iMzIiIHI9IjI4IiBmaWxsPSJub25lIiBzdHJva2U9IiM4QjdCQjUiIHN0cm9rZS13aWR0aD0iMC41Ii8+CjxnIHN0cm9rZT0iIzRBMzU3MCIgc3Ryb2tlLXdpZHRoPSIyIiBmaWxsPSJub25lIiBzdHJva2UtbGluZWNhcD0icm91bmQiPgo8cGF0aCBkPSJNMjggMTZjLTQgMC02IDQtNiA4YzAgMyAxIDUgMyA2Ii8+CjxwYXRoIGQ9Ik0zNiAxNmM0IDAgNiA0IDYgOGMwIDMtMSA1LTMgNiIvPgo8cGF0aCBkPSJNMjIgMzBjLTIgNC00IDEwLTIgMTRjMiA1IDYgOCAxMiA4czEwLTMgMTItOGMyLTQgMC0xMC0yLTE0Ii8+CjxwYXRoIGQ9Ik0zMiAzMHYyMiIvPgo8cGF0aCBkPSJNMjYgNDhjMyAzIDYgNCA4IDJjMy0zIDMtNiAxLTEwTTM4IDQ4Yy0zIDMtNiA0LTggMmMtMy0zLTMtNi0xLTEwIi8+CjwvZz4KPC9zdmc+","射手座":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCA2NCI+CjxjaXJjbGUgY3g9IjMyIiBjeT0iMzIiIHI9IjMwIiBmaWxsPSIjRkRGMkVDIiBzdHJva2U9IiNDMDQwMzAiIHN0cm9rZS13aWR0aD0iMi41Ii8+CjxjaXJjbGUgY3g9IjMyIiBjeT0iMzIiIHI9IjI4IiBmaWxsPSJub25lIiBzdHJva2U9IiNEMDYwNTAiIHN0cm9rZS13aWR0aD0iMC41Ii8+CjxnIHN0cm9rZT0iIzhCMjAyMCIgc3Ryb2tlLXdpZHRoPSIyLjIiIGZpbGw9Im5vbmUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCI+CjxwYXRoIGQ9Ik0xOCA0NmMyLTggNi0xOCAxNi0zMGM0IDQgOCA2IDEyIDZjMiAwIDQtMSA0LTIiLz4KPHBhdGggZD0iTTM0IDE2YzYgMiAxMCA2IDEyIDEyIi8+CjxwYXRoIGQ9Ik00NiAyOGwtNCA4bC04LTQiLz4KPC9nPgo8cGF0aCBkPSJNMjggNDBjMCA2IDIgMTAgNCAxMmMyLTIgNC02IDQtMTIiIHN0cm9rZT0iIzhCMjAyMCIgc3Ryb2tlLXdpZHRoPSIyIiBmaWxsPSJub25lIiBzdHJva2UtbGluZWNhcD0icm91bmQiLz4KPC9zdmc+"};
-function zodiacBadge(z){return ' ';}
-
-var HOURS=['子时 23-1','丑时 1-3','寅时 3-5','卯时 5-7','辰时 7-9','巳时 9-11','午时 11-13','未时 13-15','申时 15-17','酉时 17-19','戌时 19-21','亥时 21-23'];
-var CITIES=['北京','上海','广州','深圳','成都','杭州','武汉','南京','西安','重庆','长沙','其他'];
-
-var REGIONS={
- '北京':{'北京':['东城','西城','朝阳','海淀','丰台','石景山','通州','大兴','顺义','昌平','房山','门头沟','平谷','怀柔','密云','延庆']},
- '上海':{'上海':['黄浦','徐汇','长宁','静安','普陀','虹口','杨浦','浦东','闵行','宝山','嘉定','松江','金山','青浦','奉贤','崇明']},
- '天津':{'天津':['和平','河东','河西','南开','河北','红桥','滨海','东丽','西青','津南','北辰','武清','宝坻','宁河','静海','蓟州']},
- '重庆':{'重庆':['渝中','江北','沙坪坝','九龙坡','南岸','大渡口','北碚','渝北','巴南','万州','涪陵','黔江','长寿','江津','合川','永川','南川','綦江','大足','璧山','铜梁','潼南','荣昌','开州','梁平','武隆','城口','丰都','垫江','忠县','云阳','奉节','巫山','巫溪','石柱','秀山','酉阳','彭水']},
- '广东':{'广州':['越秀','天河','海珠','荔湾','白云','黄埔','番禺','花都','南沙','从化','增城'],'深圳':['福田','罗湖','南山','盐田','宝安','龙岗','龙华','坪山','光明'],'珠海':['香洲','斗门','金湾'],'汕头':['金平','龙湖','濠江','潮阳','潮南','澄海','南澳'],'佛山':['禅城','南海','顺德','三水','高明'],'韶关':['浈江','武江','曲江','乐昌','南雄','始兴','仁化','翁源','新丰','乳源'],'湛江':['赤坎','霞山','坡头','麻章','廉江','雷州','吴川','遂溪','徐闻'],'肇庆':['端州','鼎湖','高要','四会','广宁','怀集','封开','德庆'],'江门':['蓬江','江海','新会','台山','开平','鹤山','恩平'],'茂名':['茂南','电白','高州','化州','信宜'],'惠州':['惠城','惠阳','博罗','惠东','龙门'],'梅州':['梅江','梅县','兴宁','大埔','丰顺','五华','平远','蕉岭'],'汕尾':['城区','陆丰','海丰','陆河'],'河源':['源城','紫金','龙川','连平','和平','东源'],'阳江':['江城','阳东','阳春','阳西'],'清远':['清城','清新','英德','连州','佛冈','阳山','连山','连南'],'东莞':['莞城','南城','东城','万江','虎门','长安','厚街','寮步','大朗','塘厦','凤岗','常平'],'中山':['石岐','东区','西区','南区','小榄','古镇','三乡','坦洲','南朗'],'潮州':['湘桥','潮安','饶平'],'揭阳':['榕城','揭东','普宁','惠来','揭西'],'云浮':['云城','云安','罗定','新兴','郁南']},
- '江苏':{'南京':['玄武','秦淮','建邺','鼓楼','栖霞','雨花台','江宁','浦口','六合','溧水','高淳'],'苏州':['姑苏','虎丘','吴中','相城','吴江','常熟','张家港','昆山','太仓'],'无锡':['梁溪','锡山','惠山','滨湖','新吴','江阴','宜兴'],'常州':['天宁','钟楼','新北','武进','金坛','溧阳'],'镇江':['京口','润州','丹徒','丹阳','扬中','句容'],'南通':['崇川','通州','海门','启东','如皋','海安','如东'],'扬州':['广陵','邗江','江都','仪征','高邮','宝应'],'泰州':['海陵','高港','姜堰','兴化','靖江','泰兴'],'盐城':['亭湖','盐都','大丰','东台','响水','滨海','阜宁','射阳','建湖'],'淮安':['清江浦','淮安','淮阴','洪泽','涟水','盱眙','金湖'],'连云港':['连云','海州','赣榆','东海','灌云','灌南'],'徐州':['鼓楼','云龙','贾汪','泉山','铜山','新沂','邳州','丰县','沛县','睢宁'],'宿迁':['宿城','宿豫','沭阳','泗阳','泗洪']},
- '浙江':{'杭州':['上城','拱墅','西湖','滨江','萧山','余杭','临平','钱塘','富阳','临安','桐庐','淳安','建德'],'宁波':['海曙','江北','北仑','镇海','鄞州','奉化','余姚','慈溪','象山','宁海'],'温州':['鹿城','龙湾','瓯海','洞头','瑞安','乐清','永嘉','平阳','苍南','文成','泰顺'],'嘉兴':['南湖','秀洲','海宁','平湖','桐乡','嘉善','海盐'],'湖州':['吴兴','南浔','德清','长兴','安吉'],'绍兴':['越城','柯桥','上虞','诸暨','嵊州','新昌'],'金华':['婺城','金东','兰溪','义乌','东阳','永康','武义','浦江','磐安'],'衢州':['柯城','衢江','江山','常山','开化','龙游'],'舟山':['定海','普陀','岱山','嵊泗'],'台州':['椒江','黄岩','路桥','温岭','临海','玉环','三门','天台','仙居'],'丽水':['莲都','龙泉','青田','缙云','遂昌','松阳','云和','庆元','景宁']},
- '山东':{'济南':['历下','市中','槐荫','天桥','历城','长清','章丘','济阳','莱芜','钢城','平阴','商河'],'青岛':['市南','市北','黄岛','崂山','李沧','城阳','即墨','胶州','平度','莱西'],'淄博':['淄川','张店','博山','临淄','周村','桓台','高青','沂源'],'枣庄':['市中','薛城','峄城','台儿庄','山亭','滕州'],'东营':['东营','河口','垦利','利津','广饶'],'烟台':['芝罘','福山','牟平','莱山','蓬莱','龙口','莱阳','莱州','招远','栖霞','海阳'],'潍坊':['潍城','寒亭','坊子','奎文','青州','诸城','寿光','安丘','高密','昌邑','临朐','昌乐'],'济宁':['任城','兖州','曲阜','邹城','微山','鱼台','金乡','嘉祥','汶上','泗水','梁山'],'泰安':['泰山','岱岳','新泰','肥城','宁阳','东平'],'威海':['环翠','文登','荣成','乳山'],'日照':['东港','岚山','五莲','莒县'],'临沂':['兰山','罗庄','河东','沂南','郯城','沂水','兰陵','费县','平邑','莒南','蒙阴','临沭'],'德州':['德城','陵城','乐陵','禹城','宁津','庆云','临邑','齐河','平原','夏津','武城'],'聊城':['东昌府','茌平','临清','阳谷','莘县','东阿','冠县','高唐'],'滨州':['滨城','沾化','邹平','惠民','阳信','无棣','博兴'],'菏泽':['牡丹','定陶','曹县','单县','成武','巨野','郓城','鄄城','东明']},
- '河南':{'郑州':['中原','二七','管城','金水','上街','惠济','巩义','荥阳','新密','新郑','登封','中牟'],'开封':['龙亭','顺河','鼓楼','禹王台','祥符','杞县','通许','尉氏','兰考'],'洛阳':['老城','西工','瀍河','涧西','偃师','孟津','新安','栾川','嵩县','汝阳','宜阳','洛宁','伊川'],'平顶山':['新华','卫东','石龙','湛河','舞钢','汝州','宝丰','叶县','鲁山','郏县'],'安阳':['文峰','北关','殷都','龙安','林州','安阳','汤阴','滑县','内黄'],'鹤壁':['鹤山','山城','淇滨','浚县','淇县'],'新乡':['红旗','卫滨','凤泉','牧野','卫辉','辉县','新乡','获嘉','原阳','延津','封丘','长垣'],'焦作':['解放','中站','马村','山阳','沁阳','孟州','修武','博爱','武陟','温县'],'濮阳':['华龙','清丰','南乐','范县','台前','濮阳'],'许昌':['魏都','建安','禹州','长葛','鄢陵','襄城'],'漯河':['源汇','郾城','召陵','舞阳','临颍'],'三门峡':['湖滨','陕州','义马','灵宝','渑池','卢氏'],'南阳':['宛城','卧龙','邓州','南召','方城','西峡','镇平','内乡','淅川','社旗','唐河','新野','桐柏'],'商丘':['梁园','睢阳','永城','民权','睢县','宁陵','柘城','虞城','夏邑'],'信阳':['浉河','平桥','罗山','光山','新县','商城','固始','潢川','淮滨','息县'],'周口':['川汇','淮阳','项城','扶沟','西华','商水','沈丘','郸城','太康','鹿邑'],'驻马店':['驿城','西平','上蔡','平舆','正阳','确山','泌阳','汝南','遂平','新蔡'],'济源':['济源']},
- '河北':{'石家庄':['长安','桥西','新华','井陉','裕华','藁城','鹿泉','栾城','正定','行唐','灵寿','高邑','深泽','赞皇','无极','平山','元氏','赵县','晋州','新乐'],'唐山':['路南','路北','古冶','开平','丰南','丰润','曹妃甸','遵化','迁安','滦州','滦南','乐亭','迁西','玉田'],'秦皇岛':['海港','山海关','北戴河','抚宁','昌黎','卢龙','青龙'],'邯郸':['邯山','丛台','复兴','峰峰','肥乡','永年','武安','临漳','成安','大名','涉县','磁县','邱县','鸡泽','广平','馆陶','魏县','曲周'],'邢台':['襄都','信都','任泽','南和','南宫','沙河','临城','内丘','柏乡','隆尧','宁晋','巨鹿','新河','广宗','平乡','威县','清河','临西'],'保定':['竞秀','莲池','满城','清苑','徐水','涿州','定州','安国','高碑店','涞水','阜平','定兴','唐县','高阳','容城','涞源','望都','安新','易县','曲阳','蠡县','顺平','博野','雄县'],'张家口':['桥东','桥西','宣化','下花园','万全','崇礼','张北','康保','沽源','尚义','蔚县','阳原','怀安','怀来','涿鹿','赤城'],'承德':['双桥','双滦','鹰手营子','平泉','承德','兴隆','滦平','隆化','丰宁','宽城','围场'],'沧州':['新华','运河','泊头','任丘','黄骅','河间','沧县','青县','东光','海兴','盐山','肃宁','南皮','吴桥','献县','孟村'],'廊坊':['安次','广阳','霸州','三河','固安','永清','香河','大城','文安','大厂'],'衡水':['桃城','冀州','深州','枣强','武邑','武强','饶阳','安平','故城','景县','阜城']},
- '四川':{'成都':['锦江','青羊','金牛','武侯','成华','龙泉驿','青白江','新都','温江','双流','郫都','新津','都江堰','彭州','邛崃','崇州','简阳','金堂','大邑','蒲江'],'绵阳':['涪城','游仙','安州','江油','三台','盐亭','梓潼','平武','北川'],'自贡':['自流井','贡井','大安','沿滩','荣县','富顺'],'攀枝花':['东区','西区','仁和','米易','盐边'],'泸州':['江阳','纳溪','龙马潭','泸县','合江','叙永','古蔺'],'德阳':['旌阳','罗江','广汉','什邡','绵竹','中江'],'广元':['利州','昭化','朝天','旺苍','青川','剑阁','苍溪'],'遂宁':['船山','安居','射洪','蓬溪','大英'],'内江':['市中','东兴','隆昌','威远','资中'],'乐山':['市中','沙湾','五通桥','金口河','峨眉山','犍为','井研','夹江','沐川','峨边','马边'],'南充':['顺庆','高坪','嘉陵','阆中','南部','营山','蓬安','仪陇','西充'],'眉山':['东坡','彭山','仁寿','洪雅','丹棱','青神'],'宜宾':['翠屏','南溪','叙州','江安','长宁','高县','珙县','筠连','兴文','屏山'],'广安':['广安','前锋','华蓥','岳池','武胜','邻水'],'达州':['通川','达川','万源','宣汉','开江','大竹','渠县'],'雅安':['雨城','名山','荥经','汉源','石棉','天全','芦山','宝兴'],'巴中':['巴州','恩阳','通江','南江','平昌'],'资阳':['雁江','安岳','乐至'],'凉山':['西昌','会理','木里','盐源','德昌','会东','宁南','普格','布拖','金阳','昭觉','喜德','冕宁','越西','甘洛','美姑','雷波'],'甘孜':['康定','泸定','丹巴','九龙','雅江','道孚','炉霍','甘孜','新龙','德格','白玉','石渠','色达','理塘','巴塘','乡城','稻城','得荣'],'阿坝':['马尔康','汶川','理县','茂县','松潘','九寨沟','金川','小金','黑水','壤塘','阿坝','若尔盖','红原']},
- '湖北':{'武汉':['江岸','江汉','硚口','汉阳','武昌','青山','洪山','东西湖','汉南','蔡甸','江夏','黄陂','新洲'],'黄石':['黄石港','西塞山','下陆','铁山','大冶','阳新'],'十堰':['茅箭','张湾','郧阳','丹江口','郧西','竹山','竹溪','房县'],'宜昌':['西陵','伍家岗','点军','猇亭','夷陵','宜都','当阳','枝江','远安','兴山','秭归','长阳','五峰'],'襄阳':['襄城','樊城','襄州','老河口','枣阳','宜城','南漳','谷城','保康'],'鄂州':['鄂城','华容','梁子湖'],'荆门':['东宝','掇刀','钟祥','京山','沙洋'],'孝感':['孝南','应城','安陆','汉川','孝昌','大悟','云梦'],'荆州':['沙市','荆州','石首','洪湖','松滋','监利','公安','江陵'],'黄冈':['黄州','麻城','武穴','团风','红安','罗田','英山','浠水','蕲春','黄梅'],'咸宁':['咸安','赤壁','嘉鱼','通城','崇阳','通山'],'随州':['曾都','广水','随县'],'恩施':['恩施','利川','建始','巴东','宣恩','咸丰','来凤','鹤峰'],'仙桃':['仙桃'],'潜江':['潜江'],'天门':['天门']},
- '湖南':{'长沙':['芙蓉','天心','岳麓','开福','雨花','望城','浏阳','宁乡','长沙'],'株洲':['天元','荷塘','芦淞','石峰','渌口','醴陵','攸县','茶陵','炎陵'],'湘潭':['雨湖','岳塘','湘乡','韶山','湘潭'],'衡阳':['珠晖','雁峰','石鼓','蒸湘','南岳','耒阳','常宁','衡阳','衡南','衡山','衡东','祁东'],'邵阳':['双清','大祥','北塔','武冈','邵东','新邵','邵阳','隆回','洞口','绥宁','新宁','城步'],'岳阳':['岳阳楼','云溪','君山','汨罗','临湘','岳阳','华容','湘阴','平江'],'常德':['武陵','鼎城','津市','安乡','汉寿','澧县','临澧','桃源','石门'],'张家界':['永定','武陵源','慈利','桑植'],'益阳':['资阳','赫山','沅江','南县','桃江','安化'],'郴州':['北湖','苏仙','资兴','桂阳','宜章','永兴','嘉禾','临武','汝城','桂东','安仁'],'永州':['零陵','冷水滩','祁阳','东安','双牌','道县','江永','宁远','蓝山','新田','江华'],'怀化':['鹤城','洪江','中方','沅陵','辰溪','溆浦','会同','麻阳','新晃','芷江','靖州','通道'],'娄底':['娄星','冷水江','涟源','双峰','新化'],'湘西':['吉首','泸溪','凤凰','花垣','保靖','古丈','永顺','龙山']},
- '福建':{'福州':['鼓楼','台江','仓山','马尾','晋安','长乐','福清','闽侯','连江','罗源','闽清','永泰','平潭'],'厦门':['思明','湖里','集美','海沧','同安','翔安'],'莆田':['城厢','涵江','荔城','秀屿','仙游'],'三明':['三元','沙县','永安','明溪','清流','宁化','大田','尤溪','将乐','泰宁','建宁'],'泉州':['鲤城','丰泽','洛江','泉港','石狮','晋江','南安','惠安','安溪','永春','德化','金门'],'漳州':['芗城','龙文','龙海','长泰','云霄','漳浦','诏安','东山','南靖','平和','华安'],'南平':['延平','建阳','邵武','武夷山','建瓯','顺昌','浦城','光泽','松溪','政和'],'龙岩':['新罗','永定','漳平','长汀','上杭','武平','连城'],'宁德':['蕉城','福安','福鼎','霞浦','古田','屏南','寿宁','周宁','柘荣']},
- '安徽':{'合肥':['瑶海','庐阳','蜀山','包河','巢湖','长丰','肥东','肥西','庐江'],'芜湖':['镜湖','鸠江','弋江','湾沚','繁昌','无为','南陵'],'蚌埠':['龙子湖','蚌山','禹会','淮上','怀远','五河','固镇'],'淮南':['大通','田家庵','谢家集','八公山','潘集','凤台','寿县'],'马鞍山':['花山','雨山','博望','当涂','含山','和县'],'淮北':['杜集','相山','烈山','濉溪'],'铜陵':['铜官','义安','郊区','枞阳'],'安庆':['迎江','大观','宜秀','桐城','怀宁','潜山','太湖','宿松','望江','岳西'],'黄山':['屯溪','黄山','徽州','歙县','休宁','黟县','祁门'],'滁州':['琅琊','南谯','天长','明光','来安','全椒','定远','凤阳'],'阜阳':['颍州','颍东','颍泉','界首','临泉','太和','阜南','颍上'],'宿州':['埇桥','砀山','萧县','灵璧','泗县'],'六安':['金安','裕安','叶集','霍邱','舒城','金寨','霍山'],'亳州':['谯城','涡阳','蒙城','利辛'],'池州':['贵池','东至','石台','青阳'],'宣城':['宣州','宁国','广德','郎溪','泾县','绩溪','旌德']},
- '江西':{'南昌':['东湖','西湖','青云谱','青山湖','新建','红谷滩','南昌','进贤','安义'],'景德镇':['昌江','珠山','乐平','浮梁'],'萍乡':['安源','湘东','莲花','上栗','芦溪'],'九江':['濂溪','浔阳','柴桑','瑞昌','共青城','庐山','武宁','修水','永修','德安','都昌','湖口','彭泽'],'新余':['渝水','分宜'],'鹰潭':['月湖','余江','贵溪'],'赣州':['章贡','南康','赣县','瑞金','信丰','大余','上犹','崇义','安远','定南','全南','宁都','于都','兴国','会昌','寻乌','石城','龙南'],'吉安':['吉州','青原','井冈山','吉安','吉水','峡江','新干','永丰','泰和','遂川','万安','安福','永新'],'宜春':['袁州','丰城','樟树','高安','奉新','万载','上高','宜丰','靖安','铜鼓'],'抚州':['临川','东乡','南城','黎川','南丰','崇仁','乐安','宜黄','金溪','资溪','广昌'],'上饶':['信州','广丰','广信','德兴','玉山','铅山','横峰','弋阳','余干','鄱阳','万年','婺源']},
- '辽宁':{'沈阳':['和平','沈河','大东','皇姑','铁西','苏家屯','浑南','沈北','于洪','辽中','新民','康平','法库'],'大连':['中山','西岗','沙河口','甘井子','旅顺口','金州','普兰店','瓦房店','庄河','长海'],'鞍山':['铁东','铁西','立山','千山','海城','台安','岫岩'],'抚顺':['新抚','东洲','望花','顺城','抚顺','新宾','清原'],'本溪':['平山','溪湖','明山','南芬','本溪','桓仁'],'丹东':['元宝','振兴','振安','东港','凤城','宽甸'],'锦州':['古塔','凌河','太和','凌海','北镇','黑山','义县'],'营口':['站前','西市','鲅鱼圈','老边','盖州','大石桥'],'阜新':['海州','新邱','太平','清河门','细河','彰武','阜新'],'辽阳':['白塔','文圣','宏伟','弓长岭','太子河','灯塔','辽阳'],'盘锦':['双台子','兴隆台','大洼','盘山'],'铁岭':['银州','清河','调兵山','开原','铁岭','西丰','昌图'],'朝阳':['双塔','龙城','北票','凌源','朝阳','建平','喀左'],'葫芦岛':['连山','龙港','南票','兴城','绥中','建昌']},
- '陕西':{'西安':['新城','碑林','莲湖','灞桥','未央','雁塔','阎良','临潼','长安','高陵','鄠邑','蓝田','周至'],'铜川':['王益','印台','耀州','宜君'],'宝鸡':['渭滨','金台','陈仓','凤翔','岐山','扶风','眉县','陇县','千阳','麟游','凤县','太白'],'咸阳':['秦都','杨陵','渭城','兴平','三原','泾阳','乾县','礼泉','永寿','长武','旬邑','淳化','武功','彬州'],'渭南':['临渭','华州','韩城','华阴','潼关','大荔','合阳','澄城','蒲城','白水','富平'],'延安':['宝塔','安塞','子长','延长','延川','志丹','吴起','甘泉','富县','洛川','宜川','黄龙','黄陵'],'汉中':['汉台','南郑','城固','洋县','西乡','勉县','宁强','略阳','镇巴','留坝','佛坪'],'榆林':['榆阳','横山','神木','府谷','靖边','定边','绥德','米脂','佳县','吴堡','清涧','子洲'],'安康':['汉滨','旬阳','汉阴','石泉','宁陕','紫阳','岚皋','平利','镇坪','白河'],'商洛':['商州','洛南','丹凤','商南','山阳','镇安','柞水']},
- '山西':{'太原':['杏花岭','迎泽','小店','尖草坪','万柏林','晋源','古交','清徐','阳曲','娄烦'],'大同':['平城','云冈','新荣','云州','阳高','天镇','广灵','灵丘','浑源','左云'],'阳泉':['城区','矿区','郊区','平定','盂县'],'长治':['潞州','上党','屯留','潞城','襄垣','平顺','黎城','壶关','长子','武乡','沁县','沁源'],'晋城':['城区','泽州','高平','沁水','阳城','陵川'],'朔州':['朔城','平鲁','怀仁','山阴','应县','右玉'],'晋中':['榆次','太谷','介休','榆社','左权','和顺','昔阳','寿阳','祁县','平遥','灵石'],'运城':['盐湖','永济','河津','临猗','万荣','闻喜','稷山','新绛','绛县','垣曲','夏县','平陆','芮城'],'忻州':['忻府','原平','定襄','五台','代县','繁峙','宁武','静乐','神池','五寨','岢岚','河曲','保德','偏关'],'临汾':['尧都','侯马','霍州','曲沃','翼城','襄汾','洪洞','古县','安泽','浮山','吉县','乡宁','大宁','隰县','永和','蒲县','汾西'],'吕梁':['离石','孝义','汾阳','文水','交城','兴县','临县','柳林','石楼','岚县','方山','中阳','交口']},
- '黑龙江':{'哈尔滨':['道里','南岗','道外','平房','松北','香坊','呼兰','阿城','双城','尚志','五常','依兰','方正','宾县','巴彦','木兰','通河','延寿'],'齐齐哈尔':['龙沙','建华','铁锋','昂昂溪','富拉尔基','碾子山','梅里斯','讷河','龙江','依安','泰来','甘南','富裕','克山','克东','拜泉'],'鸡西':['鸡冠','恒山','滴道','梨树','城子河','麻山','虎林','密山','鸡东'],'鹤岗':['向阳','工农','南山','兴安','东山','兴山','萝北','绥滨'],'双鸭山':['尖山','岭东','四方台','宝山','集贤','友谊','宝清','饶河'],'大庆':['萨尔图','龙凤','让胡路','红岗','大同','肇州','肇源','林甸','杜尔伯特'],'伊春':['伊美','乌翠','友好','金林','铁力','嘉荫','汤旺','丰林','大箐山','南岔'],'佳木斯':['前进','向阳','东风','郊区','同江','富锦','桦南','桦川','汤原','抚远'],'七台河':['新兴','桃山','茄子河','勃利'],'牡丹江':['东安','阳明','爱民','西安','绥芬河','海林','宁安','穆棱','东宁','林口'],'黑河':['爱辉','北安','五大连池','嫩江','逊克','孙吴'],'绥化':['北林','安达','肇东','海伦','望奎','兰西','青冈','庆安','明水','绥棱'],'大兴安岭':['加格达奇','漠河','呼玛','塔河']},
- '吉林':{'长春':['南关','宽城','朝阳','二道','绿园','双阳','九台','榆树','德惠','公主岭','农安'],'吉林':['昌邑','龙潭','船营','丰满','永吉','蛟河','桦甸','舒兰','磐石'],'四平':['铁西','铁东','双辽','梨树','伊通'],'辽源':['龙山','西安','东丰','东辽'],'通化':['东昌','二道江','梅河口','集安','通化','辉南','柳河'],'白山':['浑江','江源','临江','抚松','靖宇','长白'],'松原':['宁江','扶余','长岭','乾安','前郭'],'白城':['洮北','洮南','大安','镇赉','通榆'],'延边':['延吉','图们','敦化','珲春','龙井','和龙','汪清','安图']},
- '云南':{'昆明':['五华','盘龙','官渡','西山','东川','呈贡','安宁','晋宁','富民','宜良','嵩明','石林','禄劝','寻甸'],'曲靖':['麒麟','沾益','马龙','宣威','陆良','师宗','罗平','富源','会泽'],'玉溪':['红塔','江川','澄江','通海','华宁','易门','峨山','新平','元江'],'保山':['隆阳','腾冲','施甸','龙陵','昌宁'],'昭通':['昭阳','鲁甸','巧家','盐津','大关','永善','绥江','镇雄','彝良','威信','水富'],'丽江':['古城','玉龙','永胜','华坪','宁蒗'],'普洱':['思茅','宁洱','墨江','景东','景谷','镇沅','江城','孟连','澜沧','西盟'],'临沧':['临翔','凤庆','云县','永德','镇康','双江','耿马','沧源'],'楚雄':['楚雄','禄丰','双柏','牟定','南华','姚安','大姚','永仁','元谋','武定'],'红河':['蒙自','个旧','开远','弥勒','建水','石屏','泸西','元阳','红河','绿春','金平','屏边','河口'],'文山':['文山','砚山','西畴','麻栗坡','马关','丘北','广南','富宁'],'西双版纳':['景洪','勐海','勐腊'],'大理':['大理','祥云','宾川','弥渡','永平','云龙','洱源','剑川','鹤庆','漾濞','南涧','巍山'],'德宏':['芒市','瑞丽','梁河','盈江','陇川'],'怒江':['泸水','福贡','贡山','兰坪'],'迪庆':['香格里拉','德钦','维西']},
- '贵州':{'贵阳':['南明','云岩','花溪','乌当','白云','观山湖','清镇','开阳','息烽','修文'],'六盘水':['钟山','水城','六枝','盘州'],'遵义':['红花岗','汇川','播州','赤水','仁怀','桐梓','绥阳','正安','道真','务川','凤冈','湄潭','余庆','习水'],'安顺':['西秀','平坝','普定','镇宁','关岭','紫云'],'毕节':['七星关','大方','黔西','金沙','织金','纳雍','威宁','赫章'],'铜仁':['碧江','万山','江口','玉屏','石阡','思南','印江','德江','沿河','松桃'],'黔西南':['兴义','兴仁','普安','晴隆','贞丰','望谟','册亨','安龙'],'黔东南':['凯里','黄平','施秉','三穗','镇远','岑巩','天柱','锦屏','剑河','台江','黎平','榕江','从江','雷山','麻江','丹寨'],'黔南':['都匀','福泉','荔波','贵定','瓮安','独山','平塘','罗甸','长顺','龙里','惠水','三都']},
- '广西':{'南宁':['兴宁','青秀','江南','西乡塘','良庆','邕宁','武鸣','横州','隆安','马山','上林','宾阳'],'柳州':['城中','鱼峰','柳南','柳北','柳江','柳城','鹿寨','融安','融水','三江'],'桂林':['秀峰','叠彩','象山','七星','雁山','临桂','阳朔','灵川','全州','兴安','永福','灌阳','龙胜','资源','平乐','荔浦','恭城'],'梧州':['万秀','长洲','龙圩','岑溪','苍梧','藤县','蒙山'],'北海':['海城','银海','铁山港','合浦'],'防城港':['港口','防城','东兴','上思'],'钦州':['钦南','钦北','灵山','浦北'],'贵港':['港北','港南','覃塘','桂平','平南'],'玉林':['玉州','福绵','北流','容县','陆川','博白','兴业'],'百色':['右江','田阳','靖西','田东','德保','那坡','凌云','乐业','田林','西林','隆林'],'贺州':['八步','平桂','昭平','钟山','富川'],'河池':['金城江','宜州','南丹','天峨','凤山','东兰','罗城','环江','巴马','都安','大化'],'来宾':['兴宾','合山','忻城','象州','武宣','金秀'],'崇左':['江州','凭祥','扶绥','宁明','龙州','大新','天等']},
- '海南':{'海口':['秀英','龙华','琼山','美兰'],'三亚':['海棠','吉阳','天涯','崖州'],'三沙':['三沙'],'儋州':['儋州'],'五指山':['五指山'],'琼海':['琼海'],'文昌':['文昌'],'万宁':['万宁'],'东方':['东方'],'定安':['定安'],'屯昌':['屯昌'],'澄迈':['澄迈'],'临高':['临高'],'白沙':['白沙'],'昌江':['昌江'],'乐东':['乐东'],'陵水':['陵水'],'保亭':['保亭'],'琼中':['琼中']},
- '甘肃':{'兰州':['城关','七里河','西固','安宁','红古','永登','皋兰','榆中'],'嘉峪关':['嘉峪关'],'金昌':['金川','永昌'],'白银':['白银','平川','靖远','会宁','景泰'],'天水':['秦州','麦积','清水','秦安','甘谷','武山','张家川'],'武威':['凉州','民勤','古浪','天祝'],'张掖':['甘州','民乐','临泽','高台','山丹','肃南'],'平凉':['崆峒','华亭','泾川','灵台','崇信','庄浪','静宁'],'酒泉':['肃州','玉门','敦煌','金塔','瓜州','肃北','阿克塞'],'庆阳':['西峰','庆城','环县','华池','合水','正宁','宁县','镇原'],'定西':['安定','通渭','陇西','渭源','临洮','漳县','岷县'],'陇南':['武都','成县','文县','宕昌','康县','西和','礼县','徽县','两当'],'临夏':['临夏','临夏县','康乐','永靖','广河','和政','东乡','积石山'],'甘南':['合作','临潭','卓尼','舟曲','迭部','玛曲','碌曲','夏河']},
- '内蒙古':{'呼和浩特':['新城','回民','玉泉','赛罕','托克托','和林格尔','清水河','武川','土默特左'],'包头':['昆都仑','青山','东河','九原','石拐','白云鄂博','固阳','土默特右','达尔罕茂明安'],'乌海':['海勃湾','海南','乌达'],'赤峰':['红山','元宝山','松山','阿鲁科尔沁','巴林左','巴林右','林西','克什克腾','翁牛特','喀喇沁','宁城','敖汉'],'通辽':['科尔沁','霍林郭勒','科尔沁左翼中','科尔沁左翼后','开鲁','库伦','奈曼','扎鲁特'],'鄂尔多斯':['东胜','康巴什','达拉特','准格尔','鄂托克前','鄂托克','杭锦','乌审','伊金霍洛'],'呼伦贝尔':['海拉尔','扎赉诺尔','满洲里','牙克石','扎兰屯','额尔古纳','根河','阿荣旗','莫力达瓦','鄂伦春','鄂温克','陈巴尔虎','新巴尔虎左','新巴尔虎右'],'巴彦淖尔':['临河','五原','磴口','乌拉特前','乌拉特中','乌拉特后','杭锦后'],'乌兰察布':['集宁','丰镇','卓资','化德','商都','兴和','凉城','察哈尔右翼前','察哈尔右翼中','察哈尔右翼后','四子王'],'兴安盟':['乌兰浩特','阿尔山','科尔沁右翼前','科尔沁右翼中','扎赉特','突泉'],'锡林郭勒':['锡林浩特','二连浩特','阿巴嘎','苏尼特左','苏尼特右','东乌珠穆沁','西乌珠穆沁','太仆寺','镶黄','正镶白','正蓝','多伦'],'阿拉善':['阿拉善左','阿拉善右','额济纳']},
- '新疆':{'乌鲁木齐':['天山','沙依巴克','新市','水磨沟','头屯河','达坂城','米东','乌鲁木齐'],'克拉玛依':['克拉玛依','独山子','白碱滩','乌尔禾'],'吐鲁番':['高昌','鄯善','托克逊'],'哈密':['伊州','巴里坤','伊吾'],'昌吉':['昌吉','阜康','呼图壁','玛纳斯','奇台','吉木萨尔','木垒'],'博州':['博乐','阿拉山口','精河','温泉'],'巴州':['库尔勒','轮台','尉犁','若羌','且末','焉耆','和静','和硕','博湖'],'阿克苏':['阿克苏','温宿','库车','沙雅','新和','拜城','乌什','阿瓦提','柯坪'],'克州':['阿图什','阿克陶','阿合奇','乌恰'],'喀什':['喀什','疏附','疏勒','英吉沙','泽普','莎车','叶城','麦盖提','岳普湖','伽师','巴楚','塔什库尔干'],'和田':['和田','和田县','墨玉','皮山','洛浦','策勒','于田','民丰'],'伊犁':['伊宁','奎屯','霍尔果斯','伊宁县','察布查尔','霍城','巩留','新源','昭苏','特克斯','尼勒克'],'塔城':['塔城','乌苏','额敏','沙湾','托里','裕民','和布克赛尔'],'阿勒泰':['阿勒泰','布尔津','富蕴','福海','哈巴河','青河','吉木乃'],'石河子':['石河子']},
- '西藏':{'拉萨':['城关','堆龙德庆','达孜','林周','当雄','尼木','曲水','墨竹工卡'],'日喀则':['桑珠孜','南木林','江孜','定日','萨迦','拉孜','昂仁','谢通门','白朗','仁布','康马','定结','仲巴','亚东','吉隆','聂拉木','萨嘎','岗巴'],'昌都':['卡若','江达','贡觉','类乌齐','丁青','察雅','八宿','左贡','芒康','洛隆','边坝'],'林芝':['巴宜','工布江达','米林','墨脱','波密','察隅','朗县'],'山南':['乃东','扎囊','贡嘎','桑日','琼结','曲松','措美','洛扎','加查','隆子','错那','浪卡子'],'那曲':['色尼','嘉黎','比如','聂荣','安多','申扎','索县','班戈','巴青','尼玛','双湖'],'阿里':['普兰','札达','噶尔','日土','革吉','改则','措勤']},
- '青海':{'西宁':['城东','城中','城西','城北','湟中','湟源','大通'],'海东':['乐都','平安','民和','互助','化隆','循化'],'海北':['海晏','祁连','刚察','门源'],'黄南':['同仁','尖扎','泽库','河南'],'海南':['共和','同德','贵德','兴海','贵南'],'果洛':['玛沁','班玛','甘德','达日','久治','玛多'],'玉树':['玉树','杂多','称多','治多','囊谦','曲麻莱'],'海西':['德令哈','格尔木','茫崖','乌兰','都兰','天峻']},
- '宁夏':{'银川':['兴庆','西夏','金凤','永宁','贺兰','灵武'],'石嘴山':['大武口','惠农','平罗'],'吴忠':['利通','红寺堡','青铜峡','盐池','同心'],'固原':['原州','西吉','隆德','泾源','彭阳'],'中卫':['沙坡头','中宁','海原']},
- '香港':{'香港':['中西区','湾仔','东区','南区','油尖旺','深水埗','九龙城','黄大仙','观塘','荃湾','屯门','元朗','北区','大埔','沙田','西贡','离岛']},
- '澳门':{'澳门':['澳门半岛','氹仔','路环']},
- '台湾':{'台北':['中正','大同','中山','松山','大安','万华','信义','士林','北投','内湖','南港','文山'],'新北':['板桥','三重','中和','永和','新庄','新店','土城','芦洲','汐止','树林','淡水'],'桃园':['桃园','中坜','平镇','八德','杨梅','芦竹','大溪'],'台中':['中区','东区','南区','西区','北区','北屯','西屯','南屯','大里','太平','丰原'],'台南':['中西','东区','南区','北区','安平','安南','永康','新营'],'高雄':['苓雅','前镇','三民','新兴','前金','盐埕','鼓山','左营','楠梓','凤山','冈山'],'基隆':['仁爱','信义','中正','中山','安乐','暖暖','七堵'],'新竹':['东区','北区','香山','竹北'],'嘉义':['东区','西区'],'苗栗':['苗栗','头份','竹南'],'彰化':['彰化','员林'],'南投':['南投','埔里','草屯'],'云林':['斗六','虎尾'],'屏东':['屏东','潮州'],'宜兰':['宜兰','罗东'],'花莲':['花莲'],'台东':['台东'],'澎湖':['马公']}
-};
-
-var QUIZ=[
- {q:'周末你更倾向于怎样度过?',d:'探索社交能量来源',opts:['宅家看书看剧,享受独处时光','约上好友聚会,热闹才开心','一个人去户外徒步探索','看心情,随时切换']},
- {q:'做重要决定时,你更依赖什么?',d:'揭示决策模式',opts:['逻辑分析和客观事实','直觉和内心感受','多方征求意见后再定','综合考虑,权衡利弊']},
- {q:'面对突如其来的变化,第一反应?',d:'测试应变模式',opts:['立即调整计划,快速适应','先有点慌,然后慢慢接受','感到兴奋,喜欢新鲜感','冷静分析,找到最优应对']},
- {q:'在团队中你通常扮演什么角色?',d:'了解协作风格',opts:['组织者和领导者','创意提供者','执行者和细节把控者','协调者和氛围维护者']},
- {q:'朋友形容你最多的是什么?',d:'外部认知画像',opts:['理性、冷静、靠谱','热情、阳光、有趣','温柔、体贴、细腻','独立、自由、有主见']},
- {q:'你更容易被什么打动?',d:'情感触发点',opts:['一段感人的故事','一个精妙的创意','一处绝美的风景','一个实实在在的帮助']},
- {q:'面对压力时通常怎么做?',d:'压力应对机制',opts:['制定详细计划,一步步解决','找人倾诉,释放情绪','暂时逃避,给自己缓冲时间','运动或做事来转移注意力']},
- {q:'情绪更像哪种自然现象?',d:'情绪波动模式',opts:['深海——表面平静,内在丰富','火焰——来得快去得也快','潮汐——有规律地起伏','山峦——稳定不易波动']},
- {q:'理想中的生活状态?',d:'人生价值取向',opts:['稳步上升,一切在掌控中','充满惊喜和可能性','宁静平和,岁月静好','自由自在,不被束缚']},
- {q:'亲密关系中最看重什么?',d:'关系需求模式',opts:['深度的灵魂共鸣和理解','浪漫和激情,保持新鲜感','稳定的陪伴和安全感','共同成长,互相成就']}
-];
-
-var PLANETS=[
- {name:'太阳',r:0,s:0,size:14,color:'#FFD700',glow:'rgba(255,215,0,0.3)',desc:'核心自我 · 生命力',orbitDays:365.25},
- {name:'月亮',r:34,s:0.015,size:8,color:'#C0C0C0',glow:'rgba(192,192,192,0.2)',desc:'情绪反应 · 潜意识',orbitDays:27.32},
- {name:'水星',r:52,s:0.025,size:5,color:'#B8860B',glow:'rgba(184,134,11,0.15)',desc:'思维方式 · 沟通',orbitDays:87.97},
- {name:'金星',r:68,s:0.018,size:7,color:'#FF69B4',glow:'rgba(255,105,180,0.2)',desc:'爱情观念 · 审美',orbitDays:224.7},
- {name:'火星',r:82,s:0.012,size:6,color:'#E54D42',glow:'rgba(229,77,66,0.2)',desc:'行动模式 · 欲望',orbitDays:686.98},
- {name:'木星',r:98,s:0.008,size:11,color:'#F5A623',glow:'rgba(245,166,35,0.2)',desc:'幸运领域 · 成长',orbitDays:4332.59},
- {name:'土星',r:114,s:0.006,size:10,color:'#8B8B83',glow:'rgba(139,139,131,0.15)',desc:'责任课题 · 考验',orbitDays:10759.22}
-];
-var CHART_MODE='live'; // 'live' or 'birth'
-var BIRTH_ANGLES=null;
-var REF_DATE=new Date(2000,0,1,12,0,0).getTime();
-var CHART_ZI=[];function chartPreloadIcons(){ZODIAC.forEach(function(z,i){var img=new Image();img.src=ZODIAC_ICON[z.name];CHART_ZI[i]=img;});}
-chartPreloadIcons();
-var CHART_INTRO=-1;
-var CHART_PAIRS=[];
-var CHART_TIMER=null;
-var CHART_REVEALED=[];
-var CHART_CUR_START=0;
-var CHART_LINE_DUR=3000;
-var CHART_FROZEN_NOW=0;
-var CHART_DONE=false; // prevent auto-restart after first play
-
-function getPlanetAngles(birth){
- if(!birth)return null;
- var bd=new Date(birth.year,birth.month-1,birth.day,12,0,0).getTime();
- var days=(bd-REF_DATE)/86400000;
- var angles=[];
- PLANETS.forEach(function(p,i){
- if(p.orbitDays){
- var baseAngle=p.baseAngle||0;
- angles.push(((days/p.orbitDays)%1)*Math.PI*2+baseAngle);
- }else{angles.push(0);}
- });
- return angles;
-}
-
-var FEED_CAT=['推荐','星盘解读','性格分析','合盘配对','运势播报','心理成长'];
-var FEED=[
- {c:0,t:'天蝎座不为人知的五个秘密',a:'星语师小鹿',d:'2:34',v:'12.8万',tags:['天蝎座','深度'],bg1:'#1a1a2e',bg2:'#8B0000',icon:'🦂'},
- {c:0,t:'MBTI测试结果反转!我居然不是INTJ',a:'心理探长',d:'1:52',v:'8.3万',tags:['性格测试','反转'],bg1:'#16213e',bg2:'#0f3460',icon:'🧠'},
- {c:1,t:'教你三分钟看懂自己的本命星盘',a:'占星小课堂',d:'3:15',v:'25.6万',tags:['星盘入门','教程'],bg1:'#0f3460',bg2:'#1a1a2e',icon:'🌟'},
- {c:2,t:'双人合盘大揭秘:你们真的合适吗',a:'星空对话',d:'3:16',v:'20.1万',tags:['合盘','感情'],bg1:'#2d1b69',bg2:'#1a1a2e',icon:'💫'},
- {c:1,t:'十二上升星座的外貌气质全解析',a:'星座美学',d:'4:02',v:'18.3万',tags:['上升星座','外貌'],bg1:'#1a1a2e',bg2:'#2d1b69',icon:'✨'},
- {c:3,t:'水逆期生存指南:避开这三个坑',a:'星座大叔',d:'2:08',v:'9.7万',tags:['水逆','避坑'],bg1:'#0f3460',bg2:'#16213e',icon:'⚠️'},
- {c:4,t:'2026下半年十二星座运势总览',a:'星空预言家',d:'5:30',v:'33.2万',tags:['运势','年度'],bg1:'#1a1a2e',bg2:'#0f3460',icon:'🔮'},
- {c:5,t:'如何走出焦虑:占星视角的情绪管理',a:'心灵星座',d:'2:45',v:'11.5万',tags:['焦虑','情绪管理'],bg1:'#16213e',bg2:'#2d1b69',icon:'💆'},
- {c:0,t:'金星落在十二星座的爱情模式',a:'恋爱占星师',d:'4:20',v:'16.7万',tags:['金星','爱情'],bg1:'#2d1b69',bg2:'#1a1a2e',icon:'💕'},
- {c:2,t:'INTJ和ENFP为什么是天生一对',a:'人格解码',d:'2:55',v:'7.2万',tags:['性格配对','MBTI'],bg1:'#0f3460',bg2:'#16213e',icon:'🎭'},
- {c:1,t:'冥王星换座:未来二十年大变局',a:'深度占星',d:'6:10',v:'28.9万',tags:['冥王星','时代'],bg1:'#1a1a2e',bg2:'#8B0000',icon:'🌑'},
- {c:4,t:'本周十二星座注意事项',a:'每周星运',d:'3:40',v:'14.1万',tags:['周运','提醒'],bg1:'#16213e',bg2:'#0f3460',icon:'📅'}
-];
-
-var HOROSCOPES=[
- {msg:'今天的星象提示你:相信直觉。某个看似偶然的相遇可能带来重要转机。',color:'珊瑚粉',num:7},
- {msg:'创造力格外活跃,把灵感记录下来。月亮与海王星的互动让直觉变得敏锐。',color:'薰衣草紫',num:3},
- {msg:'保持耐心是今天的关键词,好事值得等待。火星给你带来额外行动力。',color:'琥珀橙',num:9},
- {msg:'适合整理和规划的一天,为未来播下种子。木星的幸运光环正照耀着你。',color:'薄荷绿',num:5},
- {msg:'勇敢迈出第一步,宇宙会回应你的勇气。金星与木星的相位带来好运。',color:'天空蓝',num:8},
- {msg:'给自己一些独处的时间,倾听内心的声音。今日适合冥想和自我关怀。',color:'玫瑰金',num:2},
- {msg:'一个久违的朋友可能会联系你,珍惜这份重逢。水星顺行带来沟通顺畅。',color:'暖黄色',num:6},
- {msg:'处理事务时多一份耐心,今天适合完成搁置已久的计划。',color:'雾蓝色',num:4}
-];
-
-var TRENDING=[
- {t:'十二上升星座全解',d:'外貌·气质·第一印象',i:'✨'},
- {t:'月亮星座看原生家庭',d:'童年模式如何影响你',i:'🌙'},
- {t:'金星星座看爱情',d:'你的爱情语言是什么',i:'💕'},
- {t:'火星星座看行动力',d:'驱动你的内在引擎',i:'🔥'}
-];
-
-// ═══════ STATE ═══════
-var S={tab:'home',quizIdx:0,answers:[],birth:null,sign:null,feedCat:0,isMember:false,history:[],navHistory:[]};
-
-// ═══════ INIT ═══════
-(function init(){
- var h=localStorage.getItem('xj_history');
- S.history=h?JSON.parse(h):[];
- // Migrate old signEmoji → signBadge
- S.history.forEach(function(r){if(!r.signBadge&&r.signEmoji){var z=ZODIAC.find(function(zz){return zz.name===r.signName});if(z)r.signBadge=zodiacBadge(z);}});
- if(S.history.length>0){var last=S.history[S.history.length-1];S.sign=ZODIAC.find(function(z){return z.name===last.signName});S.birth=last.birth;BIRTH_ANGLES=getPlanetAngles(S.birth);CHART_MODE='birth';}
- S.isMember=localStorage.getItem('xj_member')==='1';
-
- renderHome();renderFeedTabs();renderFeed();renderHistory();renderProfile();
- setTimeout(function(){drawChart()},200);
-
- var today=new Date();var seed=(today.getFullYear()*10000+(today.getMonth()+1)*100+today.getDate())%HOROSCOPES.length;
- var ho=HOROSCOPES[seed];
- document.querySelector('#horoCard .hday').textContent=today.getFullYear()+'年'+(today.getMonth()+1)+'月'+today.getDate()+'日 · 今日运势';
- document.querySelector('#horoCard .hmsg').textContent=ho.msg;
- document.getElementById('hlColor').textContent=ho.color;
- document.getElementById('hlNum').textContent=ho.num;
- var m=today.getMonth()+1,d=today.getDate();
- document.getElementById('hlMonth').textContent=m+'月'+d+'日 · 今日星象';
- var cz=getZodiac(m,d);
- document.getElementById('hzEmoji').innerHTML=zodiacBadge(cz);
- document.getElementById('hzSign').textContent=cz.name+'季';
- document.getElementById('hzDate').textContent=cz.trait;
- renderTrending();
- setupTestInputs();
-})();
-
-function setupTestInputs(){
- var ms=document.getElementById('tMonth');if(!ms||ms.options.length>1)return;
- for(var i=1;i<=12;i++){var o=document.createElement('option');o.value=i;o.text=i+'月';ms.appendChild(o);}
- var ds=document.getElementById('tDay');for(var i=1;i<=31;i++){var o=document.createElement('option');o.value=i;o.text=i+'日';ds.appendChild(o);}
- var hs=document.getElementById('tHour');HOURS.forEach(function(h,i){var o=document.createElement('option');o.value=i;o.text=h;hs.appendChild(o);});
- var ps=document.getElementById('tProv');
- Object.keys(REGIONS).forEach(function(p){var o=document.createElement('option');o.value=p;o.text=p;ps.appendChild(o);});
-}
-function onProvChange(){
- var p=document.getElementById('tProv').value;
- var cs=document.getElementById('tCity');cs.innerHTML='市区 ';
- var ds=document.getElementById('tDist');ds.innerHTML='县/区 ';
- if(p&®IONS[p]){Object.keys(REGIONS[p]).forEach(function(c){var o=document.createElement('option');o.value=c;o.text=c;cs.appendChild(o);});}
-}
-function onCityChange(){
- var p=document.getElementById('tProv').value;
- var c=document.getElementById('tCity').value;
- var ds=document.getElementById('tDist');ds.innerHTML='县/区 ';
- if(p&&c&®IONS[p]&®IONS[p][c]){REGIONS[p][c].forEach(function(d){var o=document.createElement('option');o.value=d;o.text=d;ds.appendChild(o);});}
-}
-
-// ═══════ NAVIGATION ═══════
-var MAIN_TABS=['home','chart','report','community','profile'];
-
-function showPage(id,title,showBack,showNav){
- document.querySelectorAll('.page').forEach(function(p){p.classList.remove('active')});
- document.getElementById('page-'+id).classList.add('active');
- S.tab=id;
-
- // Topbar
- document.querySelector('#topbar .tbt').textContent=title;
- var backBtn=document.getElementById('backBtn');
- if(showBack){backBtn.classList.add('show')}else{backBtn.classList.remove('show')}
-
- // Bottom nav
- var nav=document.getElementById('bottomNav');
- if(nav) nav.style.display='none'; // 统一由愈心谷壳导航,星镜内不再显示底栏
-
- // Highlight nav item
- document.querySelectorAll('.nav-item').forEach(function(n){n.classList.remove('active')});
- if(showNav){
- var idx=MAIN_TABS.indexOf(id);
- if(idx>=0)document.querySelectorAll('.nav-item')[idx].classList.add('active');
- }
-
- S.navHistory.push({id:id,title:title,showBack:showBack,showNav:showNav});
-}
-
-function switchTab(tab){
- var titles={home:'星镜',chart:'星镜 · 星盘',report:'星镜 · 报告',community:'星镜 · 社区',profile:'星镜 · 我的'};
- showPage(tab,titles[tab],false,true);
- if(tab==='chart'){setTimeout(function(){drawChart();startChartIntro();},100);}
- if(tab==='home')renderHome();
-}
-
-function goTest(){
- S.quizIdx=0;S.answers=[];
- setupTestInputs();
- showPage('test-birth','星镜 · 测试',true,false);
-}
-
-function goHome(){
- showPage('home','星镜',false,true);
- renderHome();
-}
-
-function openSchulte(){
- showPage('schulte','星镜 · 舒尔特',true,false);
- initSchulteBest();
- if(schulteState.running){clearInterval(schulteState.timer);schulteState.timer=null;}
- schulteState.running=false;schulteState.next=1;
- document.getElementById('schulteTimer').textContent='00:00.0';
- document.getElementById('schulteBtn').textContent='开始训练';
- document.getElementById('schulteSub').textContent='按顺序点击 1→25,训练专注力与反应速度';
- var scene=document.getElementById('cubeScene');scene.classList.remove('paused');
- var cube=document.getElementById('cubeEl');cube.style.transform='rotateX(-15deg) rotateY(25deg)';
- buildSchulteGrid();
-}
-
-function goBack(){
- if(S.navHistory.length<=1){location.href='know.html';return;}
- S.navHistory.pop(); // remove current
- var prev=S.navHistory[S.navHistory.length-1];
- if(!prev){goHome();return;}
- showPage(prev.id,prev.title,prev.showBack,prev.showNav);
- if(prev.id==='home')renderHome();
- if(prev.id==='chart')setTimeout(function(){drawChart()},100);
-}
-
-// ═══════ ZODIAC ═══════
-function getZodiac(m,d){
- for(var i=0;i=r[1])||(m===r[2]&&d<=r[3]))return z;}}
- return ZODIAC[0];
-}
-
-// ═══════ TEST FLOW ═══════
-function startQuiz(){
- var y=parseInt(document.getElementById('tYear').value);
- var m=parseInt(document.getElementById('tMonth').value);
- var d=parseInt(document.getElementById('tDay').value);
- if(!y||!m||!d){showToast('请填写完整的出生年月日');return;}
- if(y<1900||y>2026){showToast('请输入有效的出生年份');return;}
- S.birth={year:y,month:m,day:d};
- S.sign=getZodiac(m,d);
- S.quizIdx=0;S.answers=[];
- showPage('test-quiz','星镜 · 答题',true,false);
- renderQuizCard();
-}
-
-function renderQuizCard(){
- var q=QUIZ[S.quizIdx];
- document.getElementById('quizHint').textContent=q.d;
- document.getElementById('qNow').textContent=S.quizIdx+1;
- document.getElementById('qBar').style.width=((S.quizIdx+1)/QUIZ.length*100)+'%';
- var h=''+q.q+'
';
- q.opts.forEach(function(o,i){h+='
'+o+' ';});
- h+='
';
- document.getElementById('quizCard').innerHTML=h;
-}
-
-function pickAnswer(idx){
- S.answers.push(idx);S.quizIdx++;
- if(S.quizIdx>=QUIZ.length){showResult();}else{renderQuizCard();}
-}
-
-function showResult(){
- showPage('test-result','星镜 · 解读',true,false);
- if(S.birth){BIRTH_ANGLES=getPlanetAngles(S.birth);CHART_MODE='birth';updateChartToggle();}
- var sign=S.sign,a=S.answers;
-
- var dims=[
- {name:'开放性',val:Math.max(20,(a[1]===3||a[8]===3?60:20)+20+(a[1]===3?20:0)),color:'#4A90E2',left:'传统',right:'好奇'},
- {name:'尽责性',val:Math.max(20,(a[6]===0||a[0]===0?55:20)+20+(a[6]===0?25:0)),color:'#5CB85C',left:'随性',right:'自律'},
- {name:'外向性',val:Math.max(20,(a[0]===1||a[3]===0?60:20)+20+(a[3]===0?20:0)),color:'#F5A623',left:'内向',right:'外向'},
- {name:'宜人性',val:Math.max(20,(a[4]===2||a[9]===2?55:20)+20+(a[9]===2?20:0)),color:'#FF69B4',left:'独立',right:'共情'},
- {name:'情绪性',val:Math.max(20,(a[7]===1||a[2]===1?50:25)+25+(a[7]===1?25:0)),color:'#E54D42',left:'稳定',right:'敏感'}
- ];
-
- var mbti='';
- mbti+=(a[0]===0||a[0]===2?'I':'E');mbti+=(a[1]===0||a[1]===3?'T':'F');
- mbti+=(a[6]===0?'J':'P');mbti+=(a[5]===1||a[8]===3?'N':'S');
-
- var elScore={火:25,土:25,风:25,水:25};
- if(sign.el==='火')elScore.火+=20;else if(sign.el==='土')elScore.土+=20;else if(sign.el==='风')elScore.风+=20;else elScore.水+=20;
- elScore.火+=a[0]===1?10:a[0]===3?5:0;elScore.土+=a[6]===0?10:a[3]===2?5:0;
- elScore.风+=a[1]===0?10:a[5]===3?5:0;elScore.水+=a[9]===0?10:a[4]===2?5:0;
- var total=elScore.火+elScore.土+elScore.风+elScore.水;
- var els=[{name:'火',pct:Math.round(elScore.火/total*100),color:'#E54D42'},{name:'土',pct:Math.round(elScore.土/total*100),color:'#5CB85C'},{name:'风',pct:Math.round(elScore.风/total*100),color:'#4A90E2'},{name:'水',pct:Math.round(elScore.水/total*100),color:'#7B68EE'}];
-
- var style=a[8]===0?'稳步前行型':a[8]===1?'探索冒险型':a[8]===2?'宁静致远型':'自由奔放型';
- var emotion=a[7]===0?'深沉内敛':a[7]===1?'热烈奔放':a[7]===2?'起伏有致':'稳定平和';
- var love=a[9]===0?'灵魂共鸣型':a[9]===1?'浪漫激情型':a[9]===2?'温暖陪伴型':'成长伙伴型';
-
- var h='';
- h+=''+zodiacBadge(sign)+'
'+sign.name+'
'+mbti+' · '+style+'
';
- h+=''+sign.el+'象 '+emotion+' '+love+'
';
-
- h+='四大元素能量分布
';
- els.forEach(function(e){h+='
';});
- h+='
';
-
- h+='人格五维度画像
';
- dims.forEach(function(d){h+='
';});
- h+='
';
-
- h+='性格综述
你是一个'+sign.name+' ,'+sign.trait+'。属于'+sign.el+'象星座 ,风格偏向'+style+' 。情感方面表现为'+emotion+' ,在亲密关系中最看重'+love.replace('型','')+' 。
';
-
- h+='▶ 播放专属视频报告 ';
- h+='◎ 查看动态星盘 ';
-
- document.getElementById('resultContent').innerHTML=h;
-
- var entry={signName:sign.name,signBadge:zodiacBadge(sign),mbti:mbti,style:style,birth:S.birth,el:sign.el,date:new Date().toISOString().slice(0,10),els:els,dims:dims};
- S.history.push(entry);localStorage.setItem('xj_history',JSON.stringify(S.history));
- renderHistory();renderProfile();
-}
-
-// ═══════ HOME ═══════
-function renderHome(){
- if(S.sign){document.getElementById('hzEmoji').innerHTML=zodiacBadge(S.sign);document.getElementById('hzSign').textContent=S.sign.name;document.getElementById('hzDate').textContent=S.sign.trait;}
-}
-function renderTrending(){
- var h='';TRENDING.forEach(function(it){h+='';});
- document.getElementById('trendingRow').innerHTML=h;
-}
-
-// ═══════ CHART ═══════
-var chartAngle=0,chartZoom=1,chartDragging=false,chartLastX=0,chartPinchDist=0;
-
-function drawChart(){
- var canvas=document.getElementById('chartCanvas');if(!canvas)return;
- var ctx=canvas.getContext('2d'),dpr=window.devicePixelRatio||1;
- var w=canvas.parentElement.clientWidth-32;if(w<10)return;
- var s=Math.min(w,380);canvas.width=s*dpr;canvas.height=s*dpr;canvas.style.width=s+'px';canvas.style.height=s+'px';ctx.scale(dpr,dpr);
- var cx=s/2,cy=s/2,mr=s/2-16;
-
- function render(){
- ctx.clearRect(0,0,s,s);ctx.fillStyle='#0a0a1a';ctx.fillRect(0,0,s,s);
- ctx.save();ctx.translate(cx,cy);ctx.scale(chartZoom,chartZoom);ctx.rotate(chartAngle);
- var seed=42;
- for(var i=0;i<80;i++){seed=(seed*16807)%2147483647;var sr=12+((seed%1000)/1000)*(mr-12),sa=((seed%6283)/1000);ctx.fillStyle='rgba(255,255,255,'+(0.15+Math.sin(Date.now()/2500+i*0.7)*0.12)+')';ctx.beginPath();ctx.arc(Math.cos(sa)*sr,Math.sin(sa)*sr,0.5+Math.random()*0.6,0,Math.PI*2);ctx.fill();}
- ctx.strokeStyle='rgba(255,255,255,0.06)';ctx.lineWidth=1;ctx.beginPath();ctx.arc(0,0,mr,0,Math.PI*2);ctx.stroke();ctx.beginPath();ctx.arc(0,0,mr-4,0,Math.PI*2);ctx.stroke();
- for(var i=0;i<12;i++){var a=i/12*Math.PI*2-Math.PI/2;ctx.strokeStyle='rgba(255,255,255,0.03)';ctx.lineWidth=0.5;ctx.beginPath();ctx.moveTo(0,0);ctx.lineTo(Math.cos(a)*mr,Math.sin(a)*mr);ctx.stroke();}
- // Draw zodiac icons around the wheel
- var isz=16;
- for(var i=0;i<12;i++){
- var a=i/12*Math.PI*2-Math.PI/2;
- var ix=Math.cos(a)*(mr-14),iy=Math.sin(a)*(mr-14);
- ctx.save();ctx.translate(ix,iy);
- ctx.globalAlpha=0.7;
- if(CHART_ZI[i]&&CHART_ZI[i].complete)ctx.drawImage(CHART_ZI[i],-isz,-isz,isz*2,isz*2);
- ctx.restore();
- }
- PLANETS.forEach(function(p){if(p.r>0){ctx.strokeStyle='rgba(255,255,255,0.03)';ctx.lineWidth=0.5;ctx.beginPath();ctx.arc(0,0,p.r,0,Math.PI*2);ctx.stroke();}});
- var now=Date.now()/1000;
- if(CHART_MODE==='birth'&&BIRTH_ANGLES){now=0;}
- // Freeze time during intro so planets match locked pairs
- if(CHART_INTRO>=0){if(CHART_FROZEN_NOW===0)CHART_FROZEN_NOW=now;now=CHART_FROZEN_NOW;}
- var pos=[];
- PLANETS.forEach(function(p,i){
- var angle;
- if(CHART_MODE==='birth'&&BIRTH_ANGLES){angle=BIRTH_ANGLES[i]||0;}
- else{angle=(p.r>0)?(now*p.s+i*0.8):0;}
- pos.push({x:Math.cos(angle)*p.r,y:Math.sin(angle)*p.r});
- });
- // Build pairs only once per intro (lock during animation)
- if(CHART_INTRO<0||CHART_PAIRS.length===0){
- CHART_PAIRS=[];
- var seen={};
- // Step 1: proximity-based pairs
- for(var i=0;i=0){
- var aa=Math.min(i,bestJ),bb=Math.max(i,bestJ),key=aa+','+bb;
- if(!seen[key]){seen[key]=true;CHART_PAIRS.push({a:aa,b:bb,ax:pos[aa].x,ay:pos[aa].y,bx:pos[bb].x,by:pos[bb].y,order:Math.min(PLANETS[aa].r,PLANETS[bb].r)});}
- }
- }
- }
- CHART_PAIRS.sort(function(p,q){return p.order-q.order;});
- }
- // Draw aspect lines with animation
- var introDone=(CHART_INTRO<0&&CHART_REVEALED.length>0);
- for(var pi=0;pi=0;
- var isCurrent=(CHART_INTRO>=0&&pi===CHART_INTRO);
- if(!isRevealed&&!isCurrent)continue;
- var alpha, lw;
- if(isCurrent){alpha=0.8;lw=1.8;}
- else if(introDone){alpha=0.35;lw=0.6;}
- else{alpha=0.3;lw=0.5;}
- ctx.strokeStyle='rgba(255,255,255,'+alpha+')';ctx.lineWidth=lw;
- ctx.beginPath();
- if(isCurrent){
- var elapsed=Date.now()-CHART_CUR_START;
- var t=Math.min(1,elapsed/CHART_LINE_DUR);
- // ease-out
- t=1-Math.pow(1-t,3);
- ctx.moveTo(pr.ax,pr.ay);
- ctx.lineTo(pr.ax+(pr.bx-pr.ax)*t,pr.ay+(pr.by-pr.ay)*t);
- }else{
- ctx.moveTo(pr.ax,pr.ay);ctx.lineTo(pr.bx,pr.by);
- }
- ctx.stroke();
- }
- // Highlight active zodiac sign
- if(CHART_INTRO>=0&&CHART_INTRO=0){
- var activeA=activeZi/12*Math.PI*2-Math.PI/2;
- var pulse=1+Math.sin(Date.now()/1200)*0.08;
- var az=18*pulse;
- var ag=ctx.createRadialGradient(Math.cos(activeA)*(mr-10),Math.sin(activeA)*(mr-10),az*0.5,Math.cos(activeA)*(mr-10),Math.sin(activeA)*(mr-10),az*2);
- ag.addColorStop(0,'rgba(255,215,0,0.4)');ag.addColorStop(0.5,'rgba(255,180,0,0.15)');ag.addColorStop(1,'rgba(255,180,0,0)');
- ctx.fillStyle=ag;ctx.beginPath();ctx.arc(Math.cos(activeA)*(mr-10),Math.sin(activeA)*(mr-10),az*2,0,Math.PI*2);ctx.fill();
- ctx.save();ctx.translate(Math.cos(activeA)*(mr-10),Math.sin(activeA)*(mr-10));
- ctx.globalAlpha=0.95;
- if(CHART_ZI[activeZi]&&CHART_ZI[activeZi].complete)ctx.drawImage(CHART_ZI[activeZi],-az,-az,az*2,az*2);
- ctx.restore();
- // Show name below the icon
- ctx.fillStyle='rgba(255,255,255,0.8)';ctx.font='bold 10px sans-serif';ctx.textAlign='center';
- ctx.fillText(ZODIAC[activeZi].name,Math.cos(activeA)*(mr-10),Math.sin(activeA)*(mr-10)+az+10);
- }
- }
- PLANETS.forEach(function(p,i){var angle;if(CHART_MODE==='birth'&&BIRTH_ANGLES){angle=BIRTH_ANGLES[i]||0;}else{angle=(p.r>0)?(now*p.s+i*0.8):0;}var px=Math.cos(angle)*p.r,py=Math.sin(angle)*p.r;var g=ctx.createRadialGradient(px,py,0,px,py,p.size*1.8);g.addColorStop(0,p.glow);g.addColorStop(1,'rgba(0,0,0,0)');ctx.fillStyle=g;ctx.beginPath();ctx.arc(px,py,p.size*1.8,0,Math.PI*2);ctx.fill();ctx.fillStyle=p.color;ctx.beginPath();ctx.arc(px,py,p.size,0,Math.PI*2);ctx.fill();ctx.fillStyle='rgba(255,255,255,0.5)';ctx.font='8px sans-serif';ctx.textAlign='center';ctx.fillText(p.name,px,py-p.size-5);});
- var sg=ctx.createRadialGradient(0,0,0,0,0,15);sg.addColorStop(0,'#FFF8DC');sg.addColorStop(0.4,'#FFD700');sg.addColorStop(1,'rgba(255,215,0,0)');ctx.fillStyle=sg;ctx.beginPath();ctx.arc(0,0,15,0,Math.PI*2);ctx.fill();ctx.fillStyle='#FFD700';ctx.beginPath();ctx.arc(0,0,7,0,Math.PI*2);ctx.fill();
- ctx.restore();
- }
- render();
- canvas.onclick=function(e){var rect=canvas.getBoundingClientRect();var mx=e.clientX-rect.left-cx,my=e.clientY-rect.top-cy;var cos=Math.cos(-chartAngle),sin=Math.sin(-chartAngle);var rx=mx*cos-my*sin,ry=mx*sin+my*cos;var found=-1;PLANETS.forEach(function(p,i){var a;if(CHART_MODE==='birth'&&BIRTH_ANGLES){a=BIRTH_ANGLES[i]||0;}else{var now2=Date.now()/1000;a=(p.r>0)?(now2*p.s+i*0.8):0;}var px=Math.cos(a)*p.r,py=Math.sin(a)*p.r;if(Math.hypot(rx-px,ry-py)=0){var p=PLANETS[found];document.getElementById('chartInfo').innerHTML=''+p.name+' · '+p.desc;document.getElementById('chartHint').textContent='已选中:'+p.name;}};
- canvas.addEventListener('mousedown',function(e){chartDragging=true;chartLastX=e.clientX;});
- canvas.addEventListener('mousemove',function(e){if(!chartDragging)return;chartAngle+=(e.clientX-chartLastX)*0.005;chartLastX=e.clientX;render();});
- canvas.addEventListener('mouseup',function(){chartDragging=false;});canvas.addEventListener('mouseleave',function(){chartDragging=false;});
- canvas.addEventListener('touchstart',function(e){if(e.touches.length===1){chartDragging=true;chartLastX=e.touches[0].clientX;}if(e.touches.length===2){chartPinchDist=Math.hypot(e.touches[0].clientX-e.touches[1].clientX,e.touches[0].clientY-e.touches[1].clientY);}},{passive:false});
- canvas.addEventListener('touchmove',function(e){if(e.touches.length===1&&chartDragging){chartAngle+=(e.touches[0].clientX-chartLastX)*0.005;chartLastX=e.touches[0].clientX;render();}if(e.touches.length===2){e.preventDefault();var d=Math.hypot(e.touches[0].clientX-e.touches[1].clientX,e.touches[0].clientY-e.touches[1].clientY);chartZoom=Math.max(0.5,Math.min(2,chartZoom*(d/chartPinchDist)));chartPinchDist=d;render();}},{passive:false});
- canvas.addEventListener('touchend',function(){chartDragging=false;});
- if(!canvas._anim){canvas._anim=true;function anim(){render();requestAnimationFrame(anim);}anim();}
-}
-
-function toggleChartMode(){
- if(!S.birth){showToast('请先完成星盘测试');return;}
- CHART_MODE=CHART_MODE==='birth'?'live':'birth';
- CHART_DONE=false; // allow replay
- updateChartToggle();
- startChartIntro();
- drawChart();
-}
-function updateChartToggle(){
- var el=document.getElementById('chartToggle');
- if(!el)return;
- if(!S.birth){el.textContent='◎ 实时天象';return;}
- if(CHART_MODE==='birth'){
- var d=S.birth;el.textContent='📅 '+d.year+'.'+d.month+'.'+d.day+' 本命盘';
- }else{el.textContent='◎ 实时天象';}
-}
-
-function startChartIntro(){
- if(CHART_DONE)return; // play once only
- if(CHART_TIMER){clearInterval(CHART_TIMER);CHART_TIMER=null;}
- CHART_INTRO=-1;CHART_PAIRS=[];CHART_REVEALED=[];CHART_FROZEN_NOW=0;
- // Wait for first render to fill CHART_PAIRS, then start
- setTimeout(function(){
- if(CHART_PAIRS.length===0)return;
- CHART_INTRO=0;CHART_CUR_START=Date.now();
- updateIntroText(0);
- CHART_TIMER=setInterval(function(){
- // Current line done, move to revealed
- CHART_REVEALED.push(CHART_INTRO);
- CHART_INTRO++;
- if(CHART_INTRO>=CHART_PAIRS.length){
- CHART_INTRO=-1;clearInterval(CHART_TIMER);CHART_TIMER=null;CHART_DONE=true;
- updateIntroDone();return;
- }
- CHART_CUR_START=Date.now();
- updateIntroText(CHART_INTRO);
- },CHART_LINE_DUR);
- },200);
-}
-
-function updateIntroText(idx){
- var pr=CHART_PAIRS[idx];
- var na=PLANETS[pr.a].name,nb=PLANETS[pr.b].name;
- var key=pr.a第'+(idx+1)+'/'+CHART_PAIRS.length+'条 '+meaning+' ';
-}
-
-function updateIntroDone(){
- document.getElementById('chartHint').textContent='全部 '+CHART_PAIRS.length+' 条相位连线已完成';
- document.getElementById('chartInfo').innerHTML='拖拽旋转 · 双指缩放 · 点击行星 ';
- updateChartToggle();
-}
-
-// ═══════ VIDEO ═══════
-var videoTimer=null;
-function playVideoReport(){
- if(!S.sign){showToast('请先完成测试');return;}
- var overlay=document.getElementById('videoOverlay');overlay.classList.add('on');
- var canvas=document.getElementById('videoCanvas'),ctx=canvas.getContext('2d'),dpr=window.devicePixelRatio||1;
- var w=Math.min(430,window.innerWidth),h=window.innerHeight;
- canvas.width=w*dpr;canvas.height=h*dpr;canvas.style.width=w+'px';canvas.style.height=h+'px';ctx.scale(dpr,dpr);
- var wm=document.getElementById('vWatermark');wm.style.display=S.isMember?'none':'block';
- var sign=S.sign,fps=30,totalFrames=30*fps,frame=0;
- var signImg=new Image();signImg.src=ZODIAC_ICON[sign.name];
-
- var scenes=[
- {start:0,end:3,texts:[{t:0,text:'星镜',x:w/2,y:h*0.15,fs:40,fc:'#fff'}]},
- {start:3,end:8,imgs:[{t:0,img:signImg,x:w/2,y:h*0.28,s:120}],texts:[{t:0,text:sign.name,x:w/2,y:h*0.43,fs:26,fc:'#fff'},{t:1.5,text:sign.trait,x:w/2,y:h*0.50,fs:13,fc:'rgba(255,255,255,0.7)'}]},
- {start:8,end:20,texts:[{t:0,text:sign.el+'象星座',x:w/2,y:h*0.22,fs:20,fc:sign.color},{t:2,text:'天赋特质',x:w/2,y:h*0.35,fs:15,fc:'rgba(255,255,255,0.5)'},{t:3,text:sign.trait.split('·')[0],x:w/2,y:h*0.44,fs:18,fc:'#fff'},{t:5.5,text:sign.trait.split('·')[1],x:w/2,y:h*0.52,fs:16,fc:'#fff'},{t:8,text:sign.trait.split('·')[2],x:w/2,y:h*0.60,fs:16,fc:'#fff'},{t:10.5,text:'开启视频解读 · 了解更多',x:w/2,y:h*0.72,fs:12,fc:'rgba(255,255,255,0.4)'}]},
- {start:20,end:26,texts:[{t:0,text:'开通星镜会员',x:w/2,y:h*0.35,fs:18,fc:'#fff'},{t:1.5,text:'解锁无水印完整视频报告',x:w/2,y:h*0.44,fs:13,fc:'rgba(255,255,255,0.8)'},{t:3,text:'首月仅 ¥9.9',x:w/2,y:h*0.56,fs:20,fc:'#FFD700'}]},
- {start:26,end:30,imgs:[{t:0,img:signImg,x:w/2,y:h*0.32,s:64}],texts:[{t:0,text:'星镜',x:w/2,y:h*0.48,fs:20,fc:'#fff'},{t:1.5,text:'让每一次自我探索,都成为可播放的电影',x:w/2,y:h*0.56,fs:11,fc:'rgba(255,255,255,0.5)'}]}
- ];
-
- var stars=[];for(var i=0;i<80;i++)stars.push({x:Math.random()*w,y:Math.random()*h,r:Math.random()*1.5+0.5,a:Math.random(),sp:Math.random()*0.02+0.005});
-
- function drawFrame(){
- ctx.fillStyle='#0a0a1a';ctx.fillRect(0,0,w,h);var t=frame/fps;
- stars.forEach(function(s){s.a+=s.sp;ctx.fillStyle='rgba(255,255,255,'+(0.3+Math.sin(s.a)*0.4)+')';ctx.beginPath();ctx.arc(s.x,s.y,s.r,0,Math.PI*2);ctx.fill();});
- for(var si=0;si=sc.start&&t<=sc.end){var st=t-sc.start;
- // Draw images
- if(sc.imgs)sc.imgs.forEach(function(ix){if(st>=ix.t&&ix.img.complete&&ix.img.naturalWidth>0){var alpha=Math.min(1,(st-ix.t)/0.5);ctx.globalAlpha=alpha;ctx.drawImage(ix.img,ix.x-ix.s/2,ix.y-ix.s/2,ix.s,ix.s);ctx.globalAlpha=1;}});
- // Draw texts
- if(sc.texts)sc.texts.forEach(function(tx){if(st>=tx.t){var alpha=Math.min(1,(st-tx.t)/0.5);ctx.fillStyle=tx.fc.replace(/rgba\\((\\d+),(\\d+),(\\d+),([\\d.]+)\\)/,function(_,r,g,b,a2){return'rgba('+r+','+g+','+b+','+(alpha*parseFloat(a2)).toFixed(2)+')';});ctx.font='bold '+tx.fs+'px -apple-system,sans-serif';ctx.textAlign='center';ctx.fillText(tx.text,tx.x,tx.y);}});
- }}
- frame++;document.getElementById('vBar').style.width=(frame/totalFrames*100)+'%';
- if(frame>=totalFrames){clearInterval(videoTimer);videoTimer=null;return;}
- }
- if(videoTimer)clearInterval(videoTimer);
- frame=0;document.getElementById('vBar').style.width='0%';drawFrame();
- videoTimer=setInterval(drawFrame,1000/fps);
-}
-
-function stopVideo(){if(videoTimer){clearInterval(videoTimer);videoTimer=null;}document.getElementById('videoOverlay').classList.remove('on');}
-
-// ═══════ FEED ═══════
-function renderFeedTabs(){var h='';FEED_CAT.forEach(function(c,i){h+=''+c+' ';});document.getElementById('feedTabs').innerHTML=h;}
-function switchFeedCat(i){S.feedCat=i;renderFeedTabs();renderFeed();}
-function renderFeed(){var list=FEED.filter(function(f){return S.feedCat===0||f.c===S.feedCat||f.c===0});var h='';list.forEach(function(f){h+=''+f.t+'
'+f.a+' '+f.v+' 次观看
';f.tags.forEach(function(t){h+='#'+t+' ';});h+='
';});document.getElementById('feedList').innerHTML=h;}
-
-// ═══════ HISTORY ═══════
-function renderHistory(){
- var list=document.getElementById('historyList');
- if(S.history.length===0){list.innerHTML='🎬
还没有测试记录
完成星盘测试后,你的专属报告将保存在这里
开始测试 → ';return;}
- var h='';for(var i=S.history.length-1;i>=0;i--){var r=S.history[i];h+=''+r.signBadge+'
'+r.signName+' · '+r.mbti+'
'+r.date+' · '+r.style+' · '+r.el+'象星座
▶
';}list.innerHTML=h;}
-function replayHistory(idx){var r=S.history[idx];S.sign=ZODIAC.find(function(z){return z.name===r.signName});S.birth=r.birth;playVideoReport();}
-
-// ═══════ PROFILE ═══════
-function renderProfile(){
- if(S.history.length>0){var last=S.history[S.history.length-1];document.getElementById('pAvatar').innerHTML=last.signBadge;document.getElementById('pSign').textContent=last.signName+' · '+last.mbti;document.getElementById('pDetail').textContent=last.style+' · '+last.el+'象星座 · 已完成'+S.history.length+'次测试';}
- var badges=[{name:'初识星盘',icon:'🔭',unlock:S.history.length>=1},{name:'探索者',icon:'🌟',unlock:S.history.length>=2},{name:'星象达人',icon:'🌙',unlock:S.history.length>=3},{name:'深度玩家',icon:'✨',unlock:S.history.length>=5},{name:'会员专属',icon:'👑',unlock:S.isMember}];
- var h='';badges.forEach(function(b){h+='';});document.getElementById('badgeRow').innerHTML=h;
-}
-
-// ═══════ PURCHASE ═══════
-function openPurchase(){document.getElementById('purchaseModal').classList.add('on');}
-function closePurchase(){document.getElementById('purchaseModal').classList.remove('on');}
-function doPurchase(){S.isMember=true;localStorage.setItem('xj_member','1');showToast('购买成功!欢迎加入星镜会员 🎉');closePurchase();renderProfile();}
-
-// ═══════ UTILS ═══════
-function showToast(msg){var t=document.getElementById('toast');t.textContent=msg;t.classList.add('show');setTimeout(function(){t.classList.remove('show')},2000);}
-window.addEventListener('resize',function(){if(S.tab==='chart')drawChart();});
-document.getElementById('purchaseModal').addEventListener('click',function(e){if(e.target===this)closePurchase();});
-
-// ═══════ SYNASTRY ═══════
-var synMode='romance';
-function setSynMode(m){
- synMode=m;
- document.querySelectorAll('.syn-tab').forEach(function(t){t.classList.remove('active');});
- document.getElementById('synTab'+{romance:'Romance',friendship:'Friend',family:'Family'}[m]).classList.add('active');
- var cfg={romance:{icon:'❤️',title:'两性合盘',sub:'分析两人的情感模式、吸引力与亲密关系契合度',l1:'👤 你',l2:'💕 伴侣',btn:'❤️ 开始两性合盘'},
- friendship:{icon:'🤝',title:'缘分配对',sub:'输入两人的出生信息,解锁星座契合度分析',l1:'👤 你',l2:'👤 TA',btn:'💫 开始合盘分析'},
- family:{icon:'🏠',title:'家庭合盘',sub:'分析亲子、手足或家庭成员的星座互动与相处模式',l1:'👤 我',l2:'👨👩👧 家人',btn:'🏠 开始家庭合盘'}}[m];
- document.getElementById('synIcon').textContent=cfg.icon;
- document.getElementById('synTitle').textContent='双人合盘 · '+cfg.title;
- document.getElementById('synSub').textContent=cfg.sub;
- document.getElementById('synLabel1').textContent=cfg.l1;
- document.getElementById('synLabel2').textContent=cfg.l2;
- document.getElementById('synBtn').textContent=cfg.btn;
- // Show family relationship selector only in family mode
- var relSel=document.getElementById('synFamilyRel');if(relSel)relSel.style.display=m==='family'?'inline-block':'none';
- document.getElementById('synastryResult').innerHTML='';
-}
-
-var synChartType='compare';
-function setSynChart(t){
- synChartType=t;
- document.querySelectorAll('#synChartTabs .syn-tab').forEach(function(b){b.classList.remove('active');});
- var idx={compare:0,composite:1,marksAB:2,marksBA:3}[t];
- document.querySelectorAll('#synChartTabs .syn-tab')[idx].classList.add('active');
-}
-
-// ═══ Synastry wheel drawing engine ═══
-function drawSynastryWheel(cvid,birth1,birth2){
- var cv=document.getElementById(cvid);if(!cv)return;
- var ctx=cv.getContext('2d'),dpr=window.devicePixelRatio||1;
- var w=340,h=340;cv.width=w*dpr;cv.height=h*dpr;cv.style.width='100%';cv.style.maxWidth=w+'px';cv.style.height='auto';ctx.scale(dpr,dpr);
- var cx=w/2,cy=h/2;
- var ang1=birth1?getPlanetAngles(birth1):null;
- var ang2=birth2?getPlanetAngles(birth2):null;
- if(!ang1||!ang2)return;
-
- var zSigns=['♑','♒','♓','♈','♉','♊','♋','♌','♍','♎','♏','♐'];
- var zNames=['摩羯','水瓶','双鱼','白羊','金牛','双子','巨蟹','狮子','处女','天秤','天蝎','射手'];
- var pColors=['#FFD700','#C0C0C0','#B8860B','#FF69B4','#E54D42','#F5A623','#8B8B83'];
- var pNames=['日','月','水','金','火','木','土'];
-
- // Aspect detection helper
- function getAspect(deg){
- deg=((deg%360)+360)%360;
- if(deg<=8||deg>=352)return{t:'合',c:'#FFD700',w:2.5,o:0};
- if(deg>=172&°<=188)return{t:'冲',c:'#E54D42',w:2,o:180};
- if(deg>=114&°<=126)return{t:'拱',c:'#4A90E2',w:1.8,o:120};
- if(deg>=84&°<=96)return{t:'刑',c:'#FF6347',w:1.5,o:90};
- if(deg>=54&°<=66)return{t:'六合',c:'#5CB85C',w:1.5,o:60};
- return null;
- }
-
- // Compute composite midpoints
- var compAng=[];
- for(var i=0;i<7;i++){
- var diff=ang2[i]-ang1[i];
- if(diff>Math.PI)diff-=Math.PI*2;if(diff<-Math.PI)diff+=Math.PI*2;
- compAng.push((ang1[i]+diff/2+Math.PI*2)%(Math.PI*2));
- }
-
- function render(){
- ctx.clearRect(0,0,w,h);
- ctx.fillStyle='#0a0a1a';ctx.fillRect(0,0,w,h);
-
- if(synChartType==='compare'){
- // === COMPARISON CHART: dual rings ===
- var ir=80,or=125,zr=155;
- // Zodiac ring
- for(var i=0;i<12;i++){var a=i/12*Math.PI*2-Math.PI/2;ctx.strokeStyle='rgba(255,255,255,.08)';ctx.lineWidth=.5;ctx.beginPath();ctx.arc(cx,cy,zr-12,a,a+Math.PI/6);ctx.stroke();}
- // Sector lines
- for(var i=0;i<12;i++){var a=i/12*Math.PI*2-Math.PI/2;ctx.strokeStyle='rgba(255,255,255,.06)';ctx.beginPath();ctx.moveTo(cx+Math.cos(a)*(zr-12),cy+Math.sin(a)*(zr-12));ctx.lineTo(cx+Math.cos(a)*zr,cy+Math.sin(a)*zr);ctx.stroke();}
- // Zodiac labels
- for(var i=0;i<12;i++){var a=(i+.5)/12*Math.PI*2-Math.PI/2;ctx.fillStyle='rgba(255,255,255,.35)';ctx.font='9px sans-serif';ctx.textAlign='center';ctx.fillText(zSigns[i],cx+Math.cos(a)*(zr-6),cy+Math.sin(a)*(zr-6)+3);}
- // Rings
- ctx.strokeStyle='rgba(255,255,255,.1)';ctx.lineWidth=1;ctx.beginPath();ctx.arc(cx,cy,ir,0,Math.PI*2);ctx.stroke();ctx.beginPath();ctx.arc(cx,cy,or,0,Math.PI*2);ctx.stroke();
- // Inner ring = Person A's planets
- var pos1=[],pos2=[];
- for(var i=0;i<7;i++){var a=ang1[i];var px=cx+Math.cos(a)*ir,py=cy+Math.sin(a)*ir;pos1.push({x:px,y:py,a:a});ctx.fillStyle=pColors[i];ctx.beginPath();ctx.arc(px,py,5,0,Math.PI*2);ctx.fill();ctx.fillStyle='#fff';ctx.font='bold 7px sans-serif';ctx.textAlign='center';ctx.fillText(pNames[i],px,py+2);}
- // Outer ring = Person B's planets
- for(var i=0;i<7;i++){var a=ang2[i];var px=cx+Math.cos(a)*or,py=cy+Math.sin(a)*or;pos2.push({x:px,y:py,a:a});ctx.fillStyle=pColors[i];ctx.beginPath();ctx.arc(px,py,5,0,Math.PI*2);ctx.fill();ctx.strokeStyle='rgba(255,255,255,.5)';ctx.lineWidth=1;ctx.stroke();ctx.fillStyle='#fff';ctx.font='bold 7px sans-serif';ctx.textAlign='center';ctx.fillText(pNames[i],px,py+2);}
- // Aspect lines between rings
- for(var i=0;i<7;i++){for(var j=0;j<7;j++){
- var da=((ang2[j]-ang1[i])%(Math.PI*2)+Math.PI*2)%(Math.PI*2);
- var asp=getAspect(da/Math.PI*180);
- if(asp){
- ctx.strokeStyle=asp.c;ctx.lineWidth=asp.w;ctx.globalAlpha=.45;
- ctx.beginPath();ctx.moveTo(pos1[i].x,pos1[i].y);ctx.lineTo(pos2[j].x,pos2[j].y);ctx.stroke();
- ctx.globalAlpha=1;
- }
- }}
- // Legend
- ctx.fillStyle='rgba(255,255,255,.6)';ctx.font='9px sans-serif';ctx.fillText('内圈:你 · 外圈:TA',cx,cy+or+16);
- }else{
- // === SINGLE-RING CHARTS: composite / marks ===
- var sr=125,zr=sr+28;
- var angles;var title='';
- if(synChartType==='composite'){angles=compAng;title='组合中点盘';}
- else if(synChartType==='marksAB'){angles=ang2.map(function(a,i){return(a+ang1[i]*.38)%(Math.PI*2);});title='马盘 A→B(A眼中的B)';}
- else{angles=ang1.map(function(a,i){return(a+ang2[i]*.38)%(Math.PI*2);});title='马盘 B→A(B眼中的A)';}
- // Zodiac sectors
- for(var i=0;i<12;i++){var a=i/12*Math.PI*2-Math.PI/2;ctx.strokeStyle='rgba(255,255,255,.08)';ctx.lineWidth=.5;ctx.beginPath();ctx.arc(cx,cy,sr+10,a,a+Math.PI/6);ctx.stroke();}
- for(var i=0;i<12;i++){var a=i/12*Math.PI*2-Math.PI/2;ctx.strokeStyle='rgba(255,255,255,.06)';ctx.beginPath();ctx.moveTo(cx+Math.cos(a)*(sr+10),cy+Math.sin(a)*(sr+10));ctx.lineTo(cx+Math.cos(a)*zr,cy+Math.sin(a)*zr);ctx.stroke();}
- for(var i=0;i<12;i++){var a=(i+.5)/12*Math.PI*2-Math.PI/2;ctx.fillStyle='rgba(255,255,255,.35)';ctx.font='9px sans-serif';ctx.textAlign='center';ctx.fillText(zSigns[i],cx+Math.cos(a)*(zr-6),cy+Math.sin(a)*(zr-6)+3);}
- // Planet ring
- ctx.strokeStyle='rgba(255,255,255,.15)';ctx.lineWidth=1.5;ctx.beginPath();ctx.arc(cx,cy,sr,0,Math.PI*2);ctx.stroke();
- // Planets
- var poses=[];
- for(var i=0;i<7;i++){var a=angles[i];var px=cx+Math.cos(a)*sr,py=cy+Math.sin(a)*sr;poses.push({x:px,y:py,a:a});ctx.fillStyle=pColors[i];ctx.beginPath();ctx.arc(px,py,6,0,Math.PI*2);ctx.fill();ctx.strokeStyle='rgba(255,255,255,.3)';ctx.lineWidth=1;ctx.stroke();ctx.fillStyle='#fff';ctx.font='bold 7px sans-serif';ctx.textAlign='center';ctx.fillText(pNames[i],px,py+2);}
- // Inner aspects
- for(var i=0;i<7;i++){for(var j=i+1;j<7;j++){
- var da=((angles[j]-angles[i])%(Math.PI*2)+Math.PI*2)%(Math.PI*2);
- var asp=getAspect(da/Math.PI*180);
- if(asp){
- ctx.strokeStyle=asp.c;ctx.lineWidth=asp.w;ctx.globalAlpha=.5;
- ctx.beginPath();ctx.moveTo(poses[i].x,poses[i].y);ctx.lineTo(poses[j].x,poses[j].y);ctx.stroke();
- ctx.globalAlpha=1;
- }
- }}
- ctx.fillStyle='rgba(255,255,255,.5)';ctx.font='10px sans-serif';ctx.textAlign='center';ctx.fillText(title,cx,cy+zr+6);
- }
- }
- render();
-}
-
-function openSynastry(){
- showPage('synastry','星镜 · 合盘',true,false);
- setupSynastryInputs();
- setSynMode(synMode);
-}
-function setupSynastryInputs(){
- ['s1','s2'].forEach(function(p){
- var ms=document.getElementById(p+'Month');if(!ms||ms.options.length>1)return;
- for(var i=1;i<=12;i++){var o=document.createElement('option');o.value=i;o.text=i+'月';ms.appendChild(o);}
- var ds=document.getElementById(p+'Day');for(var i=1;i<=31;i++){var o=document.createElement('option');o.value=i;o.text=i+'日';ds.appendChild(o);}
- });
-}
-function runSynastry(){
- var y1=parseInt(document.getElementById('s1Year').value),m1=parseInt(document.getElementById('s1Month').value),d1=parseInt(document.getElementById('s1Day').value);
- var y2=parseInt(document.getElementById('s2Year').value),m2=parseInt(document.getElementById('s2Month').value),d2=parseInt(document.getElementById('s2Day').value);
- if(!y1||!m1||!d1||!y2||!m2||!d2){showToast('请填写两人的完整出生日期');return;}
- var familyRel='家人';var relSel=document.getElementById('synFamilyRel');if(relSel&&relSel.style.display!=='none')familyRel=relSel.value;
- var z1=getZodiac(m1,d1),z2=getZodiac(m2,d2);
- // Element & sign compat
- var elCompat={火火:75,土土:80,风风:78,水水:82,火土:45,土火:45,火风:88,风火:88,火水:35,水火:35,土风:55,风土:55,土水:72,水土:72,风水:60,水风:60};
- var elScore=elCompat[z1.el+z2.el]||50;
- var zCompat={摩羯:['金牛',55],水瓶:['双子',60],双鱼:['巨蟹',65],白羊:['狮子',70],金牛:['处女',68],双子:['天秤',72],巨蟹:['天蝎',75],狮子:['射手',70],处女:['摩羯',65],天秤:['水瓶',68],天蝎:['双鱼',78],射手:['白羊',72]};
- var zScore=50;var zm=zCompat[z1.name];if(zm&&zm[0]===z2.name)zScore=zm[1];
- var zm2=zCompat[z2.name];if(zm2&&zm2[0]===z1.name)zScore=Math.max(zScore,zm2[1]);
-
- // === Planet aspect analysis (测测-style) ===
- var pairs=[
- {a:'太阳',b:'太阳',icon:'☀☀',cat:'吸引力',d:'核心自我的共鸣'},
- {a:'太阳',b:'月亮',icon:'☀☽',cat:'情感深度',d:'意识与潜意识的互动'},
- {a:'金星',b:'火星',icon:'♀♂',cat:'激情火花',d:'爱与欲望的磁场'},
- {a:'水星',b:'水星',icon:'☿☿',cat:'沟通',d:'思维频率的匹配'},
- {a:'月亮',b:'月亮',icon:'☽☽',cat:'心灵默契',d:'情绪安全感的共振'},
- {a:'金星',b:'金星',icon:'♀♀',cat:'吸引力',d:'爱情语言的契合'},
- {a:'火星',b:'火星',icon:'♂♂',cat:'激情火花',d:'行动力与欲望碰撞'},
- {a:'月亮',b:'金星',icon:'☽♀',cat:'情感深度',d:'情绪滋养与爱的表达'},
- {a:'太阳',b:'水星',icon:'☀☿',cat:'沟通',d:'自我表达与言语理解'},
- {a:'木星',b:'土星',icon:'♃♄',cat:'关系持久',d:'理想与现实的平衡'}
- ];
- var planetAspects=[],dims={吸引力:0,沟通:0,情感深度:0,关系持久:0,激情火花:0,心灵默契:0},dc={吸引力:0,沟通:0,情感深度:0,关系持久:0,激情火花:0,心灵默契:0};
- pairs.forEach(function(p){
- var s=elCompat[z1.el+z2.el]||50;
- if(p.a==='金星'&&p.b==='火星')s=z1.el+z2.el==='火风'||z1.el+z2.el==='风火'?88:z1.el+z2.el==='水火'||z1.el+z2.el==='火水'?40:z1.el+z2.el==='土水'||z1.el+z2.el==='水土'?70:s;
- if(p.a==='太阳'&&p.b==='月亮')s=z1.name===z2.name?85:z1.el+z2.el==='火风'?82:z1.el+z2.el==='水土'?75:s;
- if(p.a==='水星'&&p.b==='水星')s=z1.el+z2.el==='风风'?90:z1.el+z2.el==='火风'?78:z1.el+z2.el==='土水'?65:s;
- if(p.a==='月亮'&&p.b==='月亮')s=z1.el+z2.el==='水水'?88:z1.el+z2.el==='土土'?82:z1.el+z2.el==='火火'?55:s;
- if(p.a==='金星'&&p.b==='金星')s=z1.el+z2.el==='土土'?82:z1.el+z2.el==='风风'?78:z1.el+z2.el==='水水'?75:s;
- if(p.a==='火星'&&p.b==='火星')s=z1.el+z2.el==='火火'?85:z1.el+z2.el==='风风'?62:z1.el+z2.el==='土土'?55:s;
- if(p.a==='月亮'&&p.b==='金星')s=z1.el+z2.el==='水土'?80:z1.el+z2.el==='水水'?78:z1.el+z2.el==='火风'?72:s;
- if(p.a==='太阳'&&p.b==='水星')s=z1.el+z2.el==='风风'?85:z1.el+z2.el==='火风'?76:z1.el+z2.el==='水土'?68:s;
- if(p.a==='木星'&&p.b==='土星')s=z1.el+z2.el==='土土'?85:z1.el+z2.el==='风风'?70:z1.el+z2.el==='火火'?50:s;
- s=Math.max(25,Math.min(95,s+Math.round((Math.random()-0.5)*10)));
- var stars=s>=85?'★★★★★':s>=70?'★★★★☆':s>=55?'★★★☆☆':s>=35?'★★☆☆☆':'★☆☆☆☆';
- var it='';var zn1=z1.name,zn2=z2.name;
- if(p.a==='太阳'&&p.b==='太阳')it=s>=75?zn1+'与'+zn2+'的核心人格高度共振,彼此理解对方的本质需求。':s>=50?'两人有各自独立的人格魅力,需要花时间理解彼此的处事方式。':'两个独立的灵魂,互相尊重比互相改变更重要。';
- else if(p.a==='太阳'&&p.b==='月亮')it=s>=75?zn1+'的自我表达能温柔包裹'+zn2+'的情绪世界,给予充分的安全感。':s>=50?'理性与感性需要磨合,但正是这种差异让你们更完整。':'自我与情绪的冲突可能让彼此疲惫,学会换位是关键。';
- else if(p.a==='金星'&&p.b==='火星')it=s>=75?'吸引力爆棚!你们的磁场天然共振,初次见面就有强烈的好感。':s>=50?'有不错的情愫流动,多创造独处机会让火花升温。':'感情的节奏不太同步,需要更多耐心等待对方跟上。';
- else if(p.a==='水星'&&p.b==='水星')it=s>=75?'沟通丝滑顺畅,能聊到天亮也不累。你们的脑回路在同一条线上。':s>=50?'大部分话题能聊得来,偶尔的思维碰撞反而是调味剂。':'沟通风格差异明显,多确认双方的真正意图减少误会。';
- else if(p.a==='月亮'&&p.b==='月亮')it=s>=75?'情绪共鸣极深,不用说出口就能感知对方的心情变化。':s>=50?'情绪节奏基本同步,偶尔不同频也能快速调整。':'情绪表达方式不同,需要更明确地告诉对方你的感受。';
- else if(p.a==='金星'&&p.b==='金星')it=s>=75?'爱情观高度一致,你们享受浪漫的方式是如此相似。':s>=50?'对爱的理解有交集也有差异,互补让关系更丰富。':'表达爱的方式不太一样,别用自己的标准衡量对方的付出。';
- else if(p.a==='火星'&&p.b==='火星')it=s>=75?'行动力超强的一对,一起做事效率翻倍,激情四射。':s>=50?'做事的节奏不同但可以互补,一快一慢相得益彰。':'都很有主见,处理冲突时学会退一步海阔天空。';
- else if(p.a==='月亮'&&p.b==='金星')it=s>=75?'情感的滋养与爱的表达完美对接,在一起就是治愈。':s>=50?'情感上可以互相支持,多表达欣赏让对方感受到被爱。':'情感需求与爱的表达方式有落差,坦诚沟通胜过猜测。';
- else if(p.a==='太阳'&&p.b==='水星')it=s>=75?zn1+'的表达能被'+zn2+'精准理解,交流毫无障碍。':s>=50?'多数情况下能顺畅交流,偶尔的误解无伤大雅。':'思维频道不完全一致,说清楚比让对方猜更重要。';
- else if(p.a==='木星'&&p.b==='土星')it=s>=75?'理想与现实达到美妙平衡,一个负责想象一个负责落地。':s>=50?'乐观与务实需要磨合,但分工明确后会很稳定。':'自由与约束的张力较大,找到共同的目标是关键。';
- planetAspects.push({icon:p.icon,label:p.a+' × '+p.b,cat:p.cat,score:s,stars:stars,desc:it});
- if(dims[p.cat]!==undefined){dims[p.cat]+=s;dc[p.cat]++;}
- });
- Object.keys(dims).forEach(function(k){dims[k]=Math.round(dims[k]/dc[k]);});
- var total=Math.round(dims.吸引力*0.22+dims.沟通*0.16+dims.情感深度*0.18+dims.关系持久*0.14+dims.激情火花*0.16+dims.心灵默契*0.14);
- total=Math.min(98,Math.max(30,total));
-
- // Mode config
- var modeCfg={
- romance:{title:'两性吸引力',icon:'❤️',heroBg:'linear-gradient(135deg,#3d0a2e,#2d1b69,#16213e)',
- levels:[{max:48,l:'火花未燃',e:'🌱'},{max:65,l:'温柔吸引',e:'🌷'},{max:80,l:'热烈奔赴',e:'🔥'},{max:98,l:'灵魂伴侣',e:'💞'}],
- keywords:['亲密','默契','吸引','成长','信任','守护'],
- strength:z1.name+'与'+z2.name+'的相遇有一种天然的磁场。'+z1.el+'象与'+z2.el+'象的能量搭配'+(elScore>=75?'非常和谐':'富有张力')+',你们的组合在人群中总是特别的存在。',
- watch:z1.el===z2.el?'同元素让你们容易理解彼此,但也可能陷入相同的盲点。尝试跳出舒适圈,给关系注入新鲜感。':'不同元素的碰撞是你们最大的财富,也可能是摩擦的来源。学会欣赏差异而非试图改变对方。',
- advice:'保持每周一次深度对话,不聊日常琐事只谈心。'+z1.name+'可以多主动表达感受,'+z2.name+'需要给对方留出独处的空间。记住:最好的关系是两个完整的人并肩前行,而非两个半人拼凑。'},
- friendship:{title:'缘分契合度',icon:'🤝',heroBg:'linear-gradient(135deg,#2d1b69,#16213e,#0f3460)',
- levels:[{max:45,l:'有缘无分',e:'🌊'},{max:60,l:'淡淡默契',e:'🌸'},{max:75,l:'灵魂共鸣',e:'🔥'},{max:98,l:'天作之合',e:'💫'}],
- keywords:['志趣','理解','成长','互补','共鸣','自由'],
- strength:z1.name+'('+z1.trait.split('·')[0]+')与'+z2.name+'('+z2.trait.split('·')[0]+')的组合有一种天然的舒适感。在一起时可以自在地做自己,无需刻意迎合。',
- watch:'两人的节奏偶尔会错位——一个想冲锋时另一个想休整。尊重各自的生命节拍,不必强求同步。尊重各自的边界是长久友谊的基础。',
- advice:'一起培养一个共同爱好,让它成为你们友谊的锚点。'+z1.name+'可以多分享你的思考,'+z2.name+'可以带对方体验新鲜事物。友谊最好的样子是互相照亮而非彼此消耗。'},
- family:{title:'家庭和谐度',icon:'🏠',heroBg:'linear-gradient(135deg,#1a3a2e,#16213e,#0f3460)',
- levels:[{max:50,l:'需要磨合',e:'🏡'},{max:68,l:'和睦相处',e:'🌿'},{max:82,l:'互相扶持',e:'🌟'},{max:98,l:'家和万事兴',e:'🌈'}],
- keywords:['包容','支持','理解','关怀','传承','温暖'],
- strength:'你和'+familyRel+'('+z2.name+')之间有一种超越言语的亲情纽带。'+z1.el+'象与'+z2.el+'象的能量在家庭中'+(elScore>=70?'相辅相成':'需要更多磨合')+'。',
- watch:z1.el===z2.el?'同元素的家人容易有相似的处事方式,但注意不要让固有模式限制彼此。多一点变通,少一点固执。':'不同元素的家人意味着多元的能量,理解对方的不同表达方式是和谐的关键。',
- advice:'定期安排家庭聚会或视频通话,仪式感是家庭关系的润滑剂。'+z1.name+'可以多倾听,'+z2.name+'可以多表达。家人之间的爱不需要理由,但需要经营。'}
- }[synMode];
- var level=modeCfg.levels[0];for(var i=0;i';
- h+='';
- h+=''+zodiacBadge(z1)+' ✕ '+zodiacBadge(z2)+'
';
- h+=''+modeCfg.icon+' '+modeCfg.title+'
';
- h+=''+total+'%
';
- h+=''+level.l+' '+level.e+'
';
- h+=' ';
- h+='';
-
- // Chart type tabs (result area)
- h+='';
- h+='◎ 比较盘 ';
- h+='◉ 组合盘 ';
- h+='👁 马盘 A→B ';
- h+='👁 马盘 B→A ';
- h+='
';
-
- // Synastry wheel canvas
- h+=' ';
-
- // Aspect detail table
- h+='📐 相位详情表
';
- // Compute aspects for the selected chart type
- (function(){
- var ang1=getPlanetAngles({year:y1,month:m1,day:d1});
- var ang2=getPlanetAngles({year:y2,month:m2,day:d2});
- var pNames=['日','月','水','金','火','木','土'];
- var aspNames={合:'黄',冲:'红',拱:'蓝',刑:'橙',六合:'绿'};
- var aspColors={合:'#FFD700',冲:'#E54D42',拱:'#4A90E2',刑:'#FF6347',六合:'#5CB85C'};
- var aspects=[];
- for(var i=0;i<7;i++){for(var j=0;j<7;j++){
- var da=((ang2[j]-ang1[i])%(Math.PI*2)+Math.PI*2)%(Math.PI*2);
- var deg=da/Math.PI*180;
- var t=null;
- deg=((deg%360)+360)%360;
- if(deg<=8||deg>=352)t='合';else if(deg>=172&°<=188)t='冲';else if(deg>=114&°<=126)t='拱';else if(deg>=84&°<=96)t='刑';else if(deg>=54&°<=66)t='六合';
- if(t)aspects.push({a:PLANETS[i].name,b:PLANETS[j].name,t:t,c:aspColors[t],deg:Math.round(deg),orb:Math.round(Math.abs(deg-(t==='合'?0:t==='冲'?180:t==='拱'?120:t==='刑'?90:60)))});
- }}
- // Sort: conjunctions first, then by orb
- aspects.sort(function(x,y){var o={合:0,冲:1,拱:2,刑:3,六合:4};return(o[x.t]-o[y.t])||(x.orb-y.orb);});
- aspects.slice(0,8).forEach(function(a){
- h+='
';
- h+=''+a.a+' × '+a.b+' ';
- h+=''+a.t+' ';
- h+=''+a.deg+'° ';
- h+='容许 '+a.orb+'° ';
- h+='
';
- });
- if(aspects.length===0)h+='
暂无显著的托勒密相位
';
- })();
- h+='
';
-
- // Six dimensions
- h+='🔮 六维解析
';
- var dOrder=['吸引力','激情火花','情感深度','沟通','心灵默契','关系持久'];
- var dColors={吸引力:'#E54D42',激情火花:'#FF6347',情感深度:'#7B68EE',沟通:'#4A90E2',心灵默契:'#FF69B4',关系持久:'#5CB85C'};
- dOrder.forEach(function(d){
- h+='
';
- });
- h+='
';
-
- // Planet aspect details
- h+='⭐ 行星相位解读
';
- planetAspects.slice(0,6).forEach(function(a){
- var alpha=a.score>=80?1:a.score>=60?.85:.7;
- h+='
';
- h+='
'+a.icon+' '+a.label+' '+a.stars+' '+a.score+'%
';
- h+='
'+a.desc+'
';
- });
- h+='
';
-
- // Keywords
- h+='💫 关系关键词
';
- h+='
';
- modeCfg.keywords.forEach(function(k){h+='#'+k+' ';});
- h+='
';
-
- // Sections
- h+='✅ 关系优势
'+modeCfg.strength+'
';
- h+='';
- h+='💌 给你们的建议
'+modeCfg.advice+'
';
- h+='重新合盘 ';
- document.getElementById('synastryResult').innerHTML=h;
-
- // Draw radar chart
- setTimeout(function(){
- var cv=document.getElementById('synRadar');if(!cv)return;
- var ctx=cv.getContext('2d'),w=cv.width,h=cv.height,cx=w/2,cy=h/2,r=80;
- ctx.clearRect(0,0,w,h);
- for(var i=1;i<=4;i++){ctx.beginPath();ctx.arc(cx,cy,r*i/4,0,Math.PI*2);ctx.strokeStyle='rgba(255,255,255,'+(.06+.04*i)+')';ctx.lineWidth=.8;ctx.stroke();}
- var labels=['吸引力','激情','情感','沟通','默契','持久'];
- var vals=[dims.吸引力,dims.激情火花,dims.情感深度,dims.沟通,dims.心灵默契,dims.关系持久];
- var clrs=['#E54D42','#FF6347','#7B68EE','#4A90E2','#FF69B4','#5CB85C'];
- // Axes
- for(var i=0;i<6;i++){var a=-Math.PI/2+i/6*Math.PI*2;ctx.beginPath();ctx.moveTo(cx,cy);ctx.lineTo(cx+Math.cos(a)*r,cy+Math.sin(a)*r);ctx.strokeStyle='rgba(255,255,255,.06)';ctx.stroke();}
- // Data polygon
- ctx.beginPath();
- for(var i=0;i<6;i++){var a=-Math.PI/2+i/6*Math.PI*2;var vr=vals[i]/100*r;var px=cx+Math.cos(a)*vr,py=cy+Math.sin(a)*vr;if(i===0)ctx.moveTo(px,py);else ctx.lineTo(px,py);}
- ctx.closePath();var g=ctx.createRadialGradient(cx,cy,0,cx,cy,r);g.addColorStop(0,'rgba(255,215,0,.28)');g.addColorStop(1,'rgba(255,100,50,.04)');ctx.fillStyle=g;ctx.fill();ctx.strokeStyle='rgba(255,215,0,.65)';ctx.lineWidth=2;ctx.stroke();
- // Dots & labels
- for(var i=0;i<6;i++){var a=-Math.PI/2+i/6*Math.PI*2;var vr=vals[i]/100*r;var px=cx+Math.cos(a)*vr,py=cy+Math.sin(a)*vr;ctx.fillStyle=clrs[i];ctx.beginPath();ctx.arc(px,py,4,0,Math.PI*2);ctx.fill();ctx.fillStyle='#FFD700';ctx.beginPath();ctx.arc(px,py,2.2,0,Math.PI*2);ctx.fill();var lx=cx+Math.cos(a)*(r+22),ly=cy+Math.sin(a)*(r+22);ctx.fillStyle='rgba(255,255,255,.65)';ctx.font='9px sans-serif';ctx.textAlign='center';ctx.fillText(labels[i],lx,ly+3);}
- },100);
- // Draw synastry wheel
- setTimeout(function(){drawSynastryWheel('synWheel',{year:y1,month:m1,day:d1},{year:y2,month:m2,day:d2});},150);
-}
-
-// Tab refresh helper for result-area chart tabs
-function refreshSynTabs(){
- var tabs=document.querySelectorAll('#synastryResult .syn-tab');
- tabs.forEach(function(t){t.classList.remove('active');});
- var idx={compare:0,composite:1,marksAB:2,marksBA:3}[synChartType];
- if(tabs[idx])tabs[idx].classList.add('active');
-}
-
-// ═══════ SCHULTE ═══════
-var schulteState={running:false,next:1,nums:[],startTime:0,timer:null,best:parseFloat(localStorage.getItem('schulte_best')||'0')};
-
-function initSchulteBest(){
- var el=document.getElementById('schulteBest');
- el.textContent=schulteState.best>0?'历史最佳:'+(schulteState.best/1000).toFixed(1)+'s':'';
-}
-initSchulteBest();
-
-function shuffleSchulte(){
- var arr=[];for(var i=1;i<=25;i++)arr.push(i);
- for(var i=arr.length-1;i>0;i--){var j=Math.floor(Math.random()*(i+1));var t=arr[i];arr[i]=arr[j];arr[j]=t;}
- return arr;
-}
-
-function buildSchulteGrid(){
- if(schulteState.nums.length===0)schulteState.nums=shuffleSchulte();
- var front=document.getElementById('cubeFront');
- front.innerHTML='';
- for(var i=0;i<25;i++){
- var cell=document.createElement('div');cell.className='cs';
- cell.textContent=schulteState.nums[i];
- cell.setAttribute('data-num',schulteState.nums[i]);
- cell.style.animationDelay=((i%5)*0.12+(Math.floor(i/5)*0.08))+'s';
- cell.onclick=function(){schulteClick(this);};
- front.appendChild(cell);
- }
-}
-
-function schulteClick(el){
- if(!schulteState.running)return;
- var n=parseInt(el.getAttribute('data-num'));
- if(n!==schulteState.next)return; // wrong order, ignore
- el.classList.add('done');
- schulteState.next++;
- if(schulteState.next>25){finishSchulte();return;}
- // Highlight next target
- var front=document.getElementById('cubeFront');
- var cells=front.querySelectorAll('.cs');
- for(var i=0;i
-
-
-
-
-
-
-
-私域活动 · 愈心谷
-
-
-
-
-
-
-
-
- 活动中心即将上线
- 节气推送、社群共创、会员专属活动
- 敬请期待
-
-
-
-
-
diff --git a/pages/decode.html b/pages/decode.html
deleted file mode 100644
index e2f2ebc..0000000
--- a/pages/decode.html
+++ /dev/null
@@ -1,61 +0,0 @@
-
-
-
-
-
-
-
-
-
-愈心解码 · 愈心谷
-
-
-
-
-
-
-
-
-
-
愈心解码
-
一个生日,读懂你的身与心
-
-
-
- 📋 本页面内容为文化 + 心理测评 + 健康生活方式参考,
- 体质部分参考国标《中医体质分类与判定》,不构成医疗建议。
-
-
-
-
-
-
-
-
长按图片保存 · 分享给好友
-
关闭
-
-
-
-
-
-
-
🔮
-
解锁完整深度报告
-
一次解锁,永久查看所有解读
-
¥39.9
-
✨ 天赋优势深度解读 ✨ 人生课题方向指引 ✨ 12组联合码全解析 ✨ 五行体质完整方案
-
立即解锁 →
-
暂不需要
-
-
-
-
-
-
-
-
diff --git a/pages/health.html b/pages/health.html
deleted file mode 100644
index 7409ec6..0000000
--- a/pages/health.html
+++ /dev/null
@@ -1,75 +0,0 @@
-
-
-
-
-
-
-
-
-
-健康管理 · 愈心谷
-
-
-
-
-
-
-
-
-
-
-
-
-
📋 先天档案
-
📊 本周报告
-
☀️ 今日养生
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/pages/know.html b/pages/know.html
deleted file mode 100644
index 590b6ec..0000000
--- a/pages/know.html
+++ /dev/null
@@ -1,60 +0,0 @@
-
-
-
-
-
-
-
-
-认识自己 · 愈心谷
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/pages/mindmap.html b/pages/mindmap.html
deleted file mode 100644
index 3e2d91f..0000000
--- a/pages/mindmap.html
+++ /dev/null
@@ -1,62 +0,0 @@
-
-
-
-
-
-
-
-
-
-愈心脑图 · 愈心谷
-
-
-
-
-
-
-
-☰
-
-
-
-
-
-
-
-
- ✎ 重命名
- + 子
- + 同级
- ✕ 删除
-
- 🔍+
- 🔍-
-
- 💾 已自动保存
-
-
-
-
-+
-+
-
-
-
-
-
-
diff --git a/pages/mine.html b/pages/mine.html
deleted file mode 100644
index f94981a..0000000
--- a/pages/mine.html
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
-
-
-
-
-
-
-我的 · 愈心谷
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/pages/scale-test.html b/pages/scale-test.html
deleted file mode 100644
index 082f246..0000000
--- a/pages/scale-test.html
+++ /dev/null
@@ -1,27 +0,0 @@
-
-
-
-
-
-
-
-
-
-量表测试 · 愈心谷
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/pages/scales.html b/pages/scales.html
deleted file mode 100644
index 8d891e7..0000000
--- a/pages/scales.html
+++ /dev/null
@@ -1,34 +0,0 @@
-
-
-
-
-
-
-
-
-
-专业测评 · 愈心谷
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/pages/shuzi.html b/pages/shuzi.html
deleted file mode 100644
index fb11420..0000000
--- a/pages/shuzi.html
+++ /dev/null
@@ -1,103 +0,0 @@
-
-
-
-
-
-
-
-
-
-数字心理学 · 愈心谷
-
-
-
-
-
-
-
-
-
-
-
-
-
愈心谷数字解构
-
✦ 输入公历出生年月日 ✦
-
-
- 年
- 月
- 日
- 生成
-
-
-
-
-
-
-
-
-
-
7
-
1
-
6
-
8
-
2
-
1
-
5
-
-
-
-
-
- ✨ 数字报告
- 🪷 梅花易数
- 🔮 小六壬
- 🌌 大六壬
- 🏯 奇门遁甲
- ⭐ 星座
- ☯️ 五行八卦
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/pages/xingjing.html b/pages/xingjing.html
deleted file mode 100644
index 379e790..0000000
--- a/pages/xingjing.html
+++ /dev/null
@@ -1,237 +0,0 @@
-
-
-
-
-
-
-
-
-
-星镜 · 愈心谷
-
-
-
-
-
-
-
-
←
-
星镜
-
-
-
-
-
-
-
-
今日星象
-
🔭
-
探索你的星盘
-
发现内在的宇宙
-
✦ 开始星盘测试
-
-
-
-
★★★★☆
-
💛 幸运色:— · 幸运数字:—
-
-
-
-
-
热门解读
-
-
-
-
-
-
← 返回首页
-
-
🔭
-
输入出生信息
-
解锁专属星盘与性格解读
-
-
-
- 年
- 月
- 日
-
-
- 时辰
- 时
-
-
- 省份
- 市区
- 县/区
-
-
下一步 →
-
-
-
-
-
-
-
-
-
-
-
-
点击行星查看详情
-
-
- ◎ 实时天象
- 拖拽旋转 · 双指缩放 · 点击行星
-
-
-
-
-
-
-
-
-
-
-
-
-
成就徽章
-
-
会员订阅
-
免费版
¥0 /月
✓ 基础排盘 ✓ 30秒带水印报告 ✓ 每日运势 ✓ 社区浏览
-
星镜会员
¥24 /月 首月¥9.9
✓ 无水印完整视频报告 ✓ 高清3D星盘 ✓ AI数字人多风格 ✓ 专属课程库 ✓ 不限次数生成
立即开通
-
年度会员
¥168 /年 省 ¥120
✓ 包含全部月会员权益 + 年度专属深度报告
开通年度
-
预约达人咨询
-
- 选择咨询类型 视频一对一 · ¥199/30min 预制短视频解读 · ¥99/次 语音咨询 · ¥129/30min 图文咨询 · ¥49/次
-
- 提交预约
-
-
-
-
-
-
← 返回首页
-
-
🧊
-
舒尔特前额叶训练
-
按顺序点击 1→25,训练专注力与反应速度
-
-
-
00:00.0
-
-
开始训练
-
拖拽旋转 · 点击数字按序消除
-
-
-
-
-
← 返回首页
-
-
💫
-
双人合盘 · 缘分配对
-
输入两人的出生信息,解锁星座契合度分析
-
-
- ❤️ 两性合盘
- 🤝 缘分配对
- 🏠 家庭合盘
-
-
- ◎ 比较盘
- ◉ 组合盘
- 👁 马盘 A→B
- 👁 马盘 B→A
-
-
-
-
-
- 👤 TA
-
- 父亲 母亲 兄弟 姐妹 子女 祖父母 其他家人
-
-
-
年 月 日
-
-
-
💫 开始合盘分析
-
-
-
-
-
-◎ 星盘
- ▶ 报告
- ▤ 社区
- ◍ 我的
-
-
-
-
-
-
-
-
-
⭐
开通星镜会员
-
解锁无水印完整视频报告、高清3D星盘、专属课程等全部权益。 首月仅需 ¥9.9
-
¥9.9 立即开通
-
暂不需要
-
-
-
-
-
-
-
diff --git a/server.py b/server.py
index d0c9401..b7d73e2 100644
--- a/server.py
+++ b/server.py
@@ -5,6 +5,7 @@ from http.server import HTTPServer, SimpleHTTPRequestHandler
from urllib.parse import urlparse, parse_qs
ROOT = os.path.dirname(os.path.abspath(__file__))
+VUE_DIST = os.path.join(ROOT, "apps", "user-h5", "dist")
MINDMAP_FILE = os.path.join(ROOT, "mindmap_data.json")
SCALES_FILE = os.path.join(ROOT, "scales_data.json")
RESULTS_DB = os.path.join(ROOT, "scale_results.db")
@@ -432,6 +433,45 @@ class Handler(SimpleHTTPRequestHandler):
def __init__(self, *args, **kwargs):
super().__init__(*args, directory=ROOT, **kwargs)
+ def translate_path(self, path):
+ """Try ROOT first; for unmatched paths, serve Vue SPA from VUE_DIST."""
+ # Parse the path (strip query string / fragment — already done by parent)
+ parsed = urlparse(path)
+ clean = parsed.path
+
+ # Root path → Vue SPA index
+ if clean == '/' or clean == '':
+ spa_index = os.path.join(VUE_DIST, 'index.html')
+ if os.path.isfile(spa_index):
+ return spa_index
+
+ # Always try ROOT first (covers old pages, data files, etc.)
+ root_path = os.path.join(ROOT, clean.lstrip('/'))
+ if os.path.isfile(root_path):
+ return root_path
+ if os.path.isdir(root_path):
+ for idx in ('index.html', 'index.htm'):
+ ip = os.path.join(root_path, idx)
+ if os.path.isfile(ip):
+ return ip
+
+ # Not found in ROOT — serve from Vue dist with SPA fallback
+ dist_path = os.path.join(VUE_DIST, clean.lstrip('/'))
+ if os.path.isfile(dist_path):
+ return dist_path
+ if os.path.isdir(dist_path):
+ for idx in ('index.html', 'index.htm'):
+ ip = os.path.join(dist_path, idx)
+ if os.path.isfile(ip):
+ return ip
+
+ # SPA fallback: serve dist/index.html for client-side routes
+ spa_index = os.path.join(VUE_DIST, 'index.html')
+ if os.path.isfile(spa_index):
+ return spa_index
+
+ return root_path
+
def end_headers(self):
no_cache_paths = ['/', '/load', '/api/']
if any(self.path == p or self.path.startswith(p) for p in no_cache_paths):
diff --git a/yuxingu.html b/yuxingu.html
deleted file mode 100644
index 520db8d..0000000
--- a/yuxingu.html
+++ /dev/null
@@ -1,186 +0,0 @@
-
-
-
-
-
-
-
-
-愈心谷
-
-
-
-
-
-
-
-
-
-
-
-
-
- 愈心 谷
- 愈见自己 · 遇见更好
-
-
-
-
-
- 性格测试
- 星座星盘
- 东方养生
- 专业量表
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-