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组联合码深度解读
'+ - ''+ - '
'+ - '
'+ - '
'+ - - ''+ - '
'+ - '🌿 五行体质画像'+ - '
'+esc(cst.primary)+'
'+ - '
核心养护:养'+esc(cst.strong)+' · 需呵护'+esc(cst.weak)+'
'+ - '
'+ - EO.map(function(e){return '
'+e+'
'+p5[e]+'%
';}).join('')+ - '
'+ - '
🎭 情绪画像:'+esc((emo.strength||[]).join(' · '))+'
'+ - '
'+ - '
'+ - '体质特征:'+esc(cst.body)+'
'+ - '调养要点:'+esc(cst.tips)+'
'+ - '易感倾向:'+esc(cst.diseases)+'
'+ - '季节风险:'+esc(cst.seasonRisk)+'
'+ - '食疗方向:'+esc(cst.foodTherapy)+'
'+ - '作息节律:'+esc(cst.dailyRhythm)+ - '
'+ - '
'+ - '
🔒 解锁五行体质深度分析
'+ - '
脏腑画像 · 易感倾向 · 食疗 · 运动作息方案
'+ - ''+ - '
'+ - '
'+ - '
'+ - - ''+ - '
'+ - '🎯 今日养生锦囊'+ - '
当前节气:'+st.n+' · 时令 '+sEl+' 当令
'+ - '

今日调养建议

'+ - '
宜:'+yj.yi+'
'+ - '
忌:'+yj.ji+'
'+ - '
'+ - - ''+ - '
'+ - '完整数字报告 →'+ - '完整养生方案 →'+ - '
'+ - - ''+ - '
'+ - '💞 测测你和 TA 的契合度'+ - '
'+ - ''+ - ''+ - ''+ - ''+ - '
'+ - '
'+ - '
'+ - - ''+ - '
'+ - '🦋 分享你的身心密码'+ - ''+ - '
'; -} - -/* ---------- 付费墙 ---------- */ -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+' 分
'+ - '
'+ - '
你们在沟通节奏、能量互补、相处课题上的详细解读……
'+ - '
'+ - '
🔒 解锁完整契合度解读
'+ - '
关系能量图 · 相处建议 · 沟通指南
'+ - ''+ - '
'+ - '
'; -} - -/* ---------- 分享卡片(纯 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+=''; - } - h+='
天干地支五行纳音生肖
'+labels[i]+''+pl.tg+'
'+TGE[pl.tg]+'
'+ds+'
'+dzEl+'
'+TGE[pl.tg]+'/'+dzEl+''+ny+''+ani+'
'; - 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+='
'+e+'
'+v+'
'; - }); - 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.primary+'
主要体质
'+con.secondary+'
次要体质

'+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 '

🌿 '+term.n+'节气养生指南

'+g.tips+'
'+g.avoid+'
'; -} - -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+=''; - h+=''; - h+=''; - var cs=wk.step||Math.floor(new Date().getMonth()/2); - h+=''; - h+=''; - h+='
岁运(中运)'+wq.zhongyun+''+(wq.taiguo?'(太过)':'(不及)')+'
司天之气'+wq.sitian+'('+DZE[wq.sitian]+')— 上半年主气
在泉之气'+wq.zaiquan+'('+DZE[wq.zaiquan]+')— 下半年主气
当前主气'+wq.zhuqi[cs]+'
当前客气'+wq.keqiOrder[cs]+'
'; - - // 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+='

💡 今日养生小贴士

'+tips[idx]+'

'; - - // ---- Diet ---- - h+='

🥗 本周饮食

'; - h+='
👍
推荐食材
'+wk.diet.rec.join('、')+'
💡 '+wk.diet.reason+'
'; - h+='
👎
减少摄入
'+wk.diet.avoid.join('、')+'
'; - if(wk.diet.tea) h+='
🍵
养生茶饮
'+wk.diet.tea+'
'; - 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+='
'+m.n+'
'+m.o+'
'; - }); - h+='
'; - - // Scores - h+='

📈 今日评分

'; - dy.scores.forEach(function(s){ - h+='
'+s.l+'
'+s.v+'
'; - }); - h+='
'; - - // Yiji - h+='

📋 今日宜忌

'; - h+='
'+dy.yi.join('、')+'
'; - h+='
'+dy.ji.join('、')+'
'; - 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加载失败: ${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 = ` -
- -
${scale.name}
-
-
-
- ${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 - ? `` - : ''} -
-
- `; -} - -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 = ` -
- -
${scale.name}
-
-
-
测评完成 · ${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) => ` - - `).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(``); - }); - 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 ''+z.name+'';} - -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+='';}); - 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+='
'+e.name+'
'+e.pct+'%
';}); - h+='
'; - - h+='
人格五维度画像
'; - dims.forEach(function(d){h+='
'+d.left+'
'+d.name+'
'+d.right+'
';}); - 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+='
'+it.i+'
'+it.t+'
'+it.d+'
';}); - 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 '+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.d+'
'+f.icon+'
'+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+='
'+b.icon+'
'+b.name+'
';});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+=''; - h+=''; - 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+='
'+d+'
'+dims[d]+'%
'; - }); - 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+='
⚠️ 需要注意
'+modeCfg.watch+'
'; - 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 @@ - - - - - - - - - -数字心理学 · 愈心谷 - - - - - - -
- 愈心谷 -
- -
-
-

愈心谷数字解构

-
✦ 输入公历出生年月日 ✦
-
-
- - - - -
-
-
3
-
48
-
-
- - - - - - -
7
-
1
-
6
-
8
-
2
-
1
-
5
-
-
-
3
-
93
-
-
-
9
-
72
-
-
-
- -
-
- - - - - - - -
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
- - - - - - 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 @@ - - - - - - - - - -星镜 · 愈心谷 - - - - - - -
- - 愈心谷星镜 -
-
- - -
-
-
-
今日星象
-
🔭
-
探索你的星盘
-
发现内在的宇宙
-
✦ 开始星盘测试
-
- -
-
★★★★☆
-
💛 幸运色: · 幸运数字:
-
- -
-
🔮
星盘测试
生辰排盘 · 性格解读
-
动态星盘
行星运转 · 实时动画
-
视频社区
达人解读 · 热门内容
-
🎬
我的报告
历史记录 · 视频回放
-
🧊
舒尔特训练
3D魔方 · 前额叶激活
-
💫
合盘配对
双人星盘 · 缘分契合度
-
- -
热门解读
-
-
- - -
-
← 返回首页
-
-
🔭
-
输入出生信息
-
解锁专属星盘与性格解读
-
-
-
- - - -
-
- - -
-
- - - -
- -
-
- - -
-
← 返回修改
-
- -
1 / 10
-
-
-
-
-
-
- - -
-
← 返回首页
-
-
- - -
-
点击行星查看详情
- -
- ◎ 实时天象 - 拖拽旋转 · 双指缩放 · 点击行星 -
-
- - -
-
测试历史
-
-
- - -
-
-
-
- - -
-
-
-
探索者
完成测试解锁完整档案
-
-
成就徽章
-
-
会员订阅
-
免费版
¥0 /月
✓ 基础排盘   ✓ 30秒带水印报告   ✓ 每日运势   ✓ 社区浏览
-
星镜会员
¥24 /月 首月¥9.9
✓ 无水印完整视频报告   ✓ 高清3D星盘   ✓ AI数字人多风格   ✓ 专属课程库   ✓ 不限次数生成
-
年度会员
¥168 /年 省 ¥120
✓ 包含全部月会员权益 + 年度专属深度报告
-
预约达人咨询
-
- - - -
-
- - -
-
← 返回首页
-
-
🧊
-
舒尔特前额叶训练
-
按顺序点击 1→25,训练专注力与反应速度
-
-
-
-

愈心谷
-

专注
前额叶
-

反应
速度
-

注意力
-

视觉
搜索
-

记忆
-
-
-
-
00:00.0
-
- -
拖拽旋转 · 点击数字按序消除
-
- - -
-
← 返回首页
-
-
💫
-
双人合盘 · 缘分配对
-
输入两人的出生信息,解锁星座契合度分析
-
-
- - - -
-
- - - - -
-
-
-
👤 你
-
-
-
-
- 👤 TA - -
-
-
-
- -
-
- - - - - - - - - - -
- - -
-
星镜 · 预览版
-
- -
- - - - - - 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 @@ - - - - - - - - -愈心谷 - - - - - - - - - - - -
- 愈心谷 -
-

愈见自己 · 遇见更好

-
- -
-
愈心解码
-
一个生日,读懂你的身与心
-
- - - - - - - -
-
- - - -
- -
-
- 认识自己 - 全部 -
- -
- -
-
- 热门推荐 - 更多 -
- -
- -
-
精选工具
- -
- -
- - - - -