Files
digital-psychology/yangsheng.html
T

826 lines
56 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="zh">
<head>
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-LVVXH3TL04"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-LVVXH3TL04');
</script>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0,user-scalable=no">
<title>愈心谷 · AI东方养生顾问</title>
<style>
: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}
body{
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:32px 0 20px}
.header .logo{font-size:20px;font-weight:700;color:var(--pri);letter-spacing:1px}
.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}
</style>
</head>
<body>
<div class="container">
<div class="header">
<div class="logo">☯️ 愈心谷 · AI东方养生</div>
<div class="sub">易经 × 黄帝内经 × 五运六气</div>
</div>
<div class="tabs" id="tabs">
<div class="tab active" data-tab="profile">📋 先天档案</div>
<div class="tab" data-tab="weekly">📊 本周报告</div>
<div class="tab" data-tab="daily">☀️ 今日养生</div>
</div>
<!-- ===== PROFILE ===== -->
<div id="tab-profile">
<div class="card" id="formCard">
<h2>📝 建立先天健康档案</h2>
<p class="dim">仅需填写一次,系统自动推算八字、五行、体质,生成终身健康画像</p>
<div class="fg"><label>姓名</label><input id="fname" placeholder="请输入姓名"></div>
<div class="fg"><label>性别</label><select id="fgender"><option value="男"></option><option value="女"></option></select></div>
<div class="fg"><label>出生日期(公历)</label><input id="fbirth" type="date" value="1990-01-01"></div>
<div class="fr">
<div class="fg"><label>出生时间</label><input id="ftime" type="time" value="12:00"></div>
<div class="fg"><label>出生地</label><input id="fplace" placeholder="如:上海" value="上海"></div>
</div>
<button class="btn btn-pri" onclick="gen()">🧬 生成先天体质画像</button>
<p class="tip">数据仅存本地,不上传服务器</p>
</div>
<div id="profileResult" class="hidden">
<div class="card" id="baziCard"><h2>🔢 八字命盘</h2><div id="baziTable"></div></div>
<div class="card"><h2>🎨 五行画像</h2><div class="penta" id="pentagram"></div><div id="pentagramNote" style="font-size:12px;color:#999;text-align:center;margin-top:4px"></div></div>
<div class="card" id="constDetail"></div>
<div class="card" id="organDetail"></div>
<div class="card" id="emotionDetail"></div>
<div class="card" id="personalityCard"></div>
</div>
</div>
<!-- ===== WEEKLY ===== -->
<div id="tab-weekly" class="hidden"><div id="weeklyContent"></div></div>
<!-- ===== DAILY ===== -->
<div id="tab-daily" class="hidden"><div id="dailyContent"></div></div>
</div>
<script>
// ===================== DATA =====================
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 nayin60 = [
'海中金','炉中火','大林木','路旁土','剑锋金','山头火',
'涧下水','城头土','白蜡金','杨柳木','泉中水','屋上土',
'霹雳火','松柏木','流年水','砂石金','山下火','平地木',
'壁上土','金箔金','覆灯火','天河水','大驿土','钗钏金',
'桑柘木','柘榴木','大海水','石榴木','大海水',
];
// Actually 30 pairs, each pair covers 2 years. Let me just hardcode the 30.
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=['寅','卯','辰','巳','午','未','申','酉','戌','亥','子','丑'];
// ===================== CALC =====================
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点前完成重要决策(肝气最旺)。下午3-5点(申时)膀胱经当令,多喝水排毒。晚上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分钟助运化。下午3-5点多喝水助膀胱排湿。晚餐宜早宜少。'
},
'金':{
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; // 在泉 = 司天对冲
// Step
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]='死';
});
// Current keqi
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};
}
// ===================== 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='<table class="bzt"><tr><th></th><th>天干</th><th>地支</th><th>五行</th><th>纳音</th><th>生肖</th></tr>';
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+='<tr><td>'+labels[i]+'</td><td><strong>'+pl.tg+'</strong><br><span class="el">'+TGE[pl.tg]+'</span></td><td><strong>'+ds+'</strong><br><span class="el">'+dzEl+'</span></td><td style="color:'+EC[dzEl]+';font-weight:600;font-size:14px">'+TGE[pl.tg]+'/'+dzEl+'</td><td style="font-size:11px;color:#888">'+ny+'</td><td style="font-size:11px;color:#999">'+ani+'</td></tr>';
}
h+='</table>';
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+='<div class="pb"><div class="f"><div class="fi" style="height:'+v+'%;background:'+c+'"></div></div><div class="l">'+e+'</div><div class="v" style="color:'+c+'">'+v+'</div></div>';
});
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='<h2>🫁 体质分析</h2><div class="stats2"><div class="st2"><div class="v" style="color:var(--pri)">'+con.primary+'</div><div class="l">主要体质</div></div><div class="st2"><div class="v" style="color:#E8985A">'+con.secondary+'</div><div class="l">次要体质</div></div></div><p style="font-size:13px;color:#555;line-height:1.9;margin-top:8px">'+con.desc+'</p><h4 style="margin-top:12px">🩺 易患疾病</h4><p style="font-size:12px;color:#888;line-height:1.7">'+con.diseases+'</p><h4>👁 外在表现</h4><p style="font-size:12px;color:#888;line-height:1.7">'+con.body+'</p><h4>⚠️ 季节弱点</h4><p style="font-size:12px;color:#888;line-height:1.7">'+con.seasonRisk+'</p><h4>🎯 养生核心</h4><p style="font-size:12px;color:#888;line-height:1.7">'+con.tips+'</p><h4>🍽 食疗原则</h4><p style="font-size:12px;color:#888;line-height:1.7">'+con.foodTherapy+'</p><h4>⏰ 日常节律</h4><p style="font-size:12px;color:#888;line-height:1.7">'+con.dailyRhythm+'</p>';
// Organ detail
var od=document.getElementById('organDetail');
od.innerHTML='<h2>🫀 脏腑画像</h2><div class="stats2"><div class="st2"><div class="v" style="color:'+EC[sorted[0]]+'">'+con.strong+'</div><div class="l">偏强脏腑</div><div class="d">功能亢进<br>易生热/郁/火</div></div><div class="st2"><div class="v" style="color:#aaa">'+con.weak+'</div><div class="l">偏弱脏腑</div><div class="d">功能不足<br>易受外邪侵袭</div></div></div>';
// Emotion detail
var ed=document.getElementById('emotionDetail');
ed.innerHTML='<h2>🧠 情绪画像</h2><div style="margin-bottom:10px"><span style="font-size:12px;color:#999">优势特质:</span><div class="tags">'+emo.strength.map(function(s){return '<span class="tag tg">'+s+'</span>';}).join('')+'</div></div><div style="margin-bottom:10px"><span style="font-size:12px;color:#999">风险倾向:</span><div class="tags">'+emo.risk.map(function(s){return '<span class="tag tw">'+s+'</span>';}).join('')+'</div></div><h4>情绪调节</h4><p style="font-size:12px;color:#888;line-height:1.7">'+emo.advice+'</p>';
// Personality summary
document.getElementById('personalityCard').innerHTML='<h2>📖 综合画像</h2><p style="font-size:13px;color:#555;line-height:2">先天<b style="color:'+EC[sorted[0]]+'">'+sorted[0]+'</b>之气偏盛,属<b style="color:var(--pri)">'+con.primary+'</b>体质。'+con.strong+'经易亢,'+con.weak+'经偏弱。'+emo.strength[0]+'、'+emo.strength[1]+'是你的核心天赋;需注意'+emo.risk[0]+'和'+emo.risk[1]+'的倾向。</p>';
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 '<div class="card"><h2>🌿 '+term.n+'节气养生指南</h2><div class="sr"><div class="si sg">宜</div><div class="sb"><div class="i">'+g.tips+'</div></div></div><div class="sr"><div class="si sr2">忌</div><div class="sb"><div class="i">'+g.avoid+'</div></div></div></div>';
}
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+='<div class="card"><h2>📊 本周气机概览</h2>';
h+='<div style="font-size:14px;margin-bottom:4px">📅 节气:<b>'+tn+'</b>  🌤 时令:<b>'+seN+'</b>'+se+'旺)</div>';
h+='<div style="font-size:12px;color:#aaa;margin-bottom:10px">你的先天:<b style="color:'+EC[wk.strongest]+'">'+wk.strongest+'</b>偏盛  '+wk.strongest+'生'+wk.interaction.gen+'  '+wk.strongest+'克'+wk.interaction.ke+'</div>';
h+='<div style="font-size:11px;color:#ccc;border-top:1px dashed #f0e8e0;padding-top:8px">⏱ 数据基于当前时空气机实时计算 | 刷新时间:'+ts+'</div>';
// ---- WYLQ Detail ----
var wq=wk.wylq;
h+='<table class="wlt"><tr><td>岁运(中运)</td><td><b>'+wq.zhongyun+'</b>'+(wq.taiguo?'(太过)':'(不及)')+'</td></tr>';
h+='<tr><td>司天之气</td><td>'+wq.sitian+''+DZE[wq.sitian]+')— 上半年主气</td></tr>';
h+='<tr><td>在泉之气</td><td>'+wq.zaiquan+''+DZE[wq.zaiquan]+')— 下半年主气</td></tr>';
var cs=wk.step||Math.floor(new Date().getMonth()/2);
h+='<tr><td>当前主气</td><td>'+wq.zhuqi[cs]+'</td></tr>';
h+='<tr><td>当前客气</td><td>'+wq.keqiOrder[cs]+'</td></tr>';
h+='</table>';
// Five elements wax/wane
h+='<div style="font-size:12px;margin-top:10px"><b>五行旺衰:</b>';
EO.forEach(function(e){h+='<span style="margin:0 4px;padding:2px 8px;border-radius:4px;background:'+(wk.waxWane[e]==='旺'?EC[e]+'20':'transparent')+';color:'+EC[e]+';font-weight:'+(wk.waxWane[e]==='旺'?'700':'400')+'">'+e+wk.waxWane[e]+'</span>';});
h+='</div>';
// Organ scores
h+='<div style="margin-top:12px"><b>本周脏腑指数:</b></div>';
['肝','心','脾','肺','肾'].forEach(function(o){
var sc=wk.organScores[o]||3;
var stars='';
for(var i=1;i<=5;i++)stars+=i<=sc?'★':'<span class="off">★</span>';
h+='<div class="or"><span class="on">'+o+'</span><span class="os2">'+stars+'</span></div>';
});
h+='</div>';
// ---- Risks ----
h+='<div class="card"><h2>⚠️ 健康风险</h2>';
wk.risks.forEach(function(r,i){
h+='<div class="rk r'+(i+1)+'"><h4>风险'+(i+1)+''+r.t+'</h4><p class="x">'+r.d+'</p><ul>';
r.sy.forEach(function(s){h+='<li>'+s+'</li>';});
h+='</ul>';
if(r.act) h+='<p style="font-size:12px;color:var(--pri);margin-top:6px;line-height:1.7"><b>✅ 应对:</b>'+r.act+'</p>';
h+='</div>';
});
h+='</div>';
// ---- Daily refresh tip (changes daily) ----
var dailyTips={
'火':['夏日午后一杯淡竹叶茶,清心降火。','心静自然凉,午休15分钟胜过补药。','苦味入心,晚餐加一道凉拌苦瓜。'],
'木':['肝喜条达,今天遇到烦心事出去走10分钟。','绿色入肝,午餐加一份西兰花。','怒伤肝,深呼吸三次再回应让你生气的事。'],
'土':['脾主思,今天少想多做,动手整理房间也是调理。','黄色入脾,早餐一碗小米粥暖胃健脾。','饭后百步走,活到九十九——今天饭后就散个步。'],
'金':['秋燥伤肺,今天多喝温水,室内保持湿润。','白色入肺,今天吃一个雪梨润肺。','忧伤肺,今天找一件让你开心的小事做。'],
'水':['肾藏精,今天早点上床,23点前入睡是最好的补肾药。','黑色入肾,今天吃一把黑芝麻或核桃。','恐伤肾,今天少看负面新闻,多晒晒太阳。']
};
var tips=dailyTips[wk.se]||dailyTips['火'];
var idx=new Date().getDate()%tips.length;
h+='<div class="card"><h2>💡 今日养生小贴士</h2><p style="font-size:13px;color:#555;line-height:1.8;padding:8px 12px;background:#FFF8F0;border-radius:10px">'+tips[idx]+'</p></div>';
// ---- Diet ----
h+='<div class="card"><h2>🥗 本周饮食</h2>';
h+='<div class="sr"><div class="si sg">👍</div><div class="sb"><div class="t">推荐食材</div><div class="i">'+wk.diet.rec.join('、')+'</div><div class="r">💡 '+wk.diet.reason+'</div></div></div>';
h+='<div class="sr"><div class="si sr2">👎</div><div class="sb"><div class="t">减少摄入</div><div class="i">'+wk.diet.avoid.join('、')+'</div></div></div>';
if(wk.diet.tea) h+='<div class="sr"><div class="si so">🍵</div><div class="sb"><div class="t">养生茶饮</div><div class="i">'+wk.diet.tea+'</div></div></div>';
if(wk.diet2){
h+='<div class="sr"><div class="si so">🔄</div><div class="sb"><div class="t">辅助调养('+wk.interaction.beiKe+'行)</div><div class="i">'+wk.diet2.rec.join('、')+'</div><div class="r">💡 '+wk.diet2.reason+'</div></div></div>';
}
h+='</div>';
// ---- Exercise ----
h+='<div class="card"><h2>🏃 运动建议</h2>';
h+='<div class="sr"><div class="si sbl">✅</div><div class="sb"><div class="t">推荐运动</div><div class="i">'+wk.exercise.rec.join('、')+'</div></div></div>';
h+='<div class="sr"><div class="si so">⛔</div><div class="sb"><div class="t">避免</div><div class="i">'+wk.exercise.avoid.join('、')+'</div><div class="r">💡 '+wk.exercise.reason+'</div></div></div>';
h+='</div>';
// ---- Sleep ----
h+='<div class="card"><h2>😴 作息建议</h2>';
h+='<div class="sr"><div class="si sbl">🌙</div><div class="sb"><div class="t">'+wk.sleep.bt+' 入睡 · '+wk.sleep.wt+' 起床</div><div class="i">'+wk.sleep.focus+'</div></div></div>';
h+='</div>';
// ---- Seasonal Living Guide ----
h+=seasonalGuide(wk.term, wk.se);
// ---- Acupoints ----
h+='<div class="card"><h2>📍 穴位保健</h2>';
h+='<div class="tags">'+wk.acupoints.map(function(a){return '<span class="tag tb">'+a+'</span>';}).join('')+'</div>';
h+='<p style="font-size:11px;color:#999;margin-top:6px">每日按揉每穴3-5分钟,酸胀为度,早晚各一次。</p>';
h+='</div>';
// ---- Quote ----
h+='<div class="card"><h2>📖 本周一句内经</h2><div class="qt"><div class="t">「'+wk.quote.t+'」</div><div class="e">'+wk.quote.e+'</div></div></div>';
wc.innerHTML=h;
}
function renderDaily(dy){
var dc=document.getElementById('dailyContent');
var wk=dy.weekly;
var h='';
h+='<div class="card"><h2>☀️ 今日养生</h2>';
h+='<div style="font-size:14px;color:#555">📅 '+wk.term.n+'  值日五行:<b style="color:'+EC[wk.se]+'">'+wk.se+'</b></div>';
h+='<div style="font-size:12px;color:#aaa;margin-top:4px">你的状态:<b style="color:'+EC[wk.strongest]+'">'+wk.strongest+'</b>偏旺</div></div>';
// Meridian clock
h+='<div class="card"><h2>⏰ 子午流注</h2>';
h+='<p style="font-size:12px;color:#999;margin-bottom:8px">当前时段:<b>'+dy.currM.n+'</b>'+dy.currM.o+')— '+dy.currM.act+'</p>';
h+='<p style="font-size:11px;color:#bbb;margin-bottom:8px">💡 '+dy.currM.tip+'</p>';
h+='<div class="mer">';
dy.meridian.forEach(function(m){
h+='<div class="mi'+(m===dy.currM?'" style="background:#FFECEC;border:1px solid var(--pri)"':'')+'"><div class="t2">'+m.n+'</div><div class="o2">'+m.o+'</div></div>';
});
h+='</div></div>';
// Scores
h+='<div class="card"><h2>📈 今日评分</h2>';
dy.scores.forEach(function(s){
h+='<div class="sc"><span class="sl">'+s.l+'</span><div class="sb2"><div class="sf" style="width:'+s.v+'%;background:'+s.c+'"></div></div><span class="sv">'+s.v+'</span></div>';
});
h+='</div>';
// Yiji
h+='<div class="card"><h2>📋 今日宜忌</h2>';
h+='<div class="sr"><div class="si sg">宜</div><div class="sb"><div class="i">'+dy.yi.join('、')+'</div></div></div>';
h+='<div class="sr"><div class="si sr2">忌</div><div class="sb"><div class="i">'+dy.ji.join('、')+'</div></div></div>';
h+='</div>';
// Key focus
h+='<div class="card"><h2>🎯 今日重点</h2>';
h+='<div style="padding:16px;background:#FFECEC;border-radius:10px;text-align:center">';
h+='<div style="font-size:18px;font-weight:700;color:var(--pri);margin-bottom:6px">保养'+({'木':'肝','火':'心','土':'脾','金':'肺','水':'肾'}[wk.strongest]||'--')+'经</div>';
h+='<div style="font-size:13px;color:#888">'+dy.yi.slice(0,3).join(' · ')+'</div>';
h+='</div></div>';
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));
}
});
</script>
</body>
</html>