feat: 新增愈心解码整合页面 + 公共代码重构

- 新增 common.js: 从 shuzi.html/yangsheng.html 提取共享引擎(数字三角计算、八字五行、体质判别等纯函数+数据字典)
- 新增 jiema.html: 愈心解码统一入口,整合数字性格+五行体质+今日锦囊,含付费墙(模拟支付)、分享卡片、契合度测算
- shuzi.html: 引用 common.js,删重复代码,新增返回链接+URL参数预填
- yangsheng.html: 引用 common.js,删重复代码,新增返回链接+URL参数预填
- yuxingu.html: Hero下方新增愈心解码入口卡片(含生日输入+生成按钮)
- index.html: 新增愈心解码导航卡片
- CLAUDE.md: 补充项目文档和架构说明

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
jackyu66git
2026-07-13 12:59:06 +08:00
co-authored by Claude
parent 33e6dffa17
commit 573095325f
7 changed files with 758 additions and 295 deletions
+17 -213
View File
@@ -141,6 +141,9 @@ body{
</style>
</head>
<body>
<div style="max-width:500px;margin:0 auto;padding:8px 14px;">
<a href="jiema.html" style="color:#9b8a78;text-decoration:none;font-size:13px;">← 返回愈心解码</a>
</div>
<div class="container">
<div class="header">
@@ -187,220 +190,8 @@ body{
</div>
<script src="common.js"></script>
<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){
@@ -820,6 +611,19 @@ document.getElementById('tabs').addEventListener('click',function(e){
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);
}
});
</script>
</body>
</html>