Archive the differentiated YuXinGu product docs, AI engineering system, design contract, and Go/Vue scaffold. Next execution prioritizes Cece-parity over early innovation (see .ai/product/STRATEGY.md). Co-authored-by: Cursor <cursoragent@cursor.com>
432 lines
34 KiB
JavaScript
432 lines
34 KiB
JavaScript
// ===================== 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));
|
||
}
|
||
});
|
||
|
||
// 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);
|
||
}
|
||
});
|