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
+29 -8
View File
@@ -4,7 +4,9 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
## Project overview
愈心谷 (YuXinGu) — a digital mental health platform. The codebase is a collection of standalone, mobile-first HTML pages with no build step, no framework, and no JavaScript dependencies.
愈心谷 (YuXinGu) — a digital mental health platform. The codebase is a collection of standalone, mobile-first HTML pages with no build step, no framework, no package.json, and no JavaScript dependencies.
The product vision is detailed in `立项文档.md` (Chinese): combine digital psychology (numerology-based personality analysis) with TCM constitution theory (中医体质) to create a "test → report → subscribe → consult" funnel. Target audience is Chinese-speaking; all UI text is Chinese (zh-CN).
## Running the app
@@ -12,11 +14,13 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
python3 server.py [port] # default port 8001
```
The server serves all static files from the project root and exposes two JSON API endpoints:
The server serves static files from the project root and exposes two JSON API endpoints:
- `GET /load` — returns mindmap data from `mindmap_data.json`
- `POST /save` — persists mindmap data to `mindmap_data.json` (validates JSON before writing)
There are no tests, no linters, and no build pipeline. To verify changes, run the server and open the relevant HTML file in a browser.
## File map
| File | Purpose |
@@ -27,8 +31,16 @@ The server serves all static files from the project root and exposes two JSON AP
| `mindmap.html` | Canvas-based mind-map editor with multi-map management |
| `yangsheng.html` | AI Eastern wellness — bazi/wuxing constitution analysis, weekly/daily reports |
| `manual.html` | Static "life manual" poster with pyramid triangle charts rendered via inline SVG |
| `yuxingu_v1.html` | Earlier iteration of the main page |
| `yuxingu_v1.html` | Earlier iteration of the main page (kept for reference, not linked from index) |
| `server.py` | Minimal HTTP server (Python stdlib, no dependencies) |
| `立项文档.md` | Product requirements doc — market analysis, business model, pricing, MVP scope |
### Unrelated files
These files are not part of the 愈心谷 app — they belong to a separate crypto trading visualization project that happens to share the repo:
- `link_regime_chart.html` — LINK token HMM regime K-line chart
- `l2_LINK_*.json` (3 files) — market data and signals for the above
## Architecture notes
@@ -36,8 +48,17 @@ The server serves all static files from the project root and exposes two JSON AP
- **Mobile-first design** with `max-width: 430px500px` containers, `user-scalable=no`, and `env(safe-area-inset-bottom)` for notched phones.
- **CSS custom properties** define the brand palette: `--pri: #E54D42` (primary red), with per-page accent colors (gold, blue, green, orange).
- **Emoji are deliberately avoided** in the main UI — icons use CSS shapes, Unicode text symbols (△, ☯, ◈), or inline SVG.
- **`mindmap.html`** uses a `<canvas>` for rendering with hand-rolled hit-testing, drag-to-pan, and inline text editing. It persists maps to both `localStorage` (client-side key `yuxingu_maps`) and the server via `/save` / `/load`.
- **`shuzi.html`** contains a full numerology engine in embedded JS — digit reduction, triangle calculation, joint codes, missing-number detection — plus tabbed panels for 梅花易数, 小六壬, 大六壬, 奇门遁甲, 星座, and 五行八卦 (content rendered dynamically).
- **`yangsheng.html`** computes bazi (八字), five elements (五行), organ-meridian mapping, and wuyun-liuqi (五运六气) from a birth date. The weekly/daily panels use the current date to generate time-appropriate health advice.
- The server is a thin wrapper around `http.server.SimpleHTTPRequestHandler`. It disables caching for HTML/JSON responses and adds the `/save` + `/load` routes. No database, no auth.
- Target audience is Chinese-speaking; all UI text is Chinese (zh-CN).
- **Google Analytics** (`G-LVVXH3TL04`) is embedded in every HTML page via a `<script>` block in `<head>`.
- **Static assets**: `logo.png`, `logo.jpg`, `cube.jpg`. The logo is referenced from multiple pages but lives at the project root.
### Page-specific details
**`mindmap.html`** — Uses `<canvas>` for rendering with hand-rolled hit-testing, drag-to-pan, and inline text editing. Dual persistence: primary store is `localStorage` (key `yuxingu_maps`), with secondary server sync via `POST /save` and `GET /load`. The sidebar lists multiple named maps; each map is a tree with colored nodes. Data format is an array of `{name, tree: {id, text, color, children}}` objects.
**`shuzi.html`** — Full numerology engine in embedded JS: digit reduction, triangle calculation, joint codes, missing-number detection. Includes a custom base64-embedded font (`TriangleDigits`) for styled number rendering. Tabbed panels for 梅花易数, 小六壬, 大六壬, 奇门遁甲, 星座, and 五行八卦 with content rendered dynamically. Also includes a 3D bagua scene rendered on canvas.
**`yangsheng.html`** — Computes bazi (八字), five elements (五行), organ-meridian mapping, and wuyun-liuqi (五运六气) from a birth date. Weekly/daily panels use the current date to generate time-appropriate health advice. Builds on the same numerological engine concepts as `shuzi.html` but oriented toward TCM wellness rather than personality analysis.
**`manual.html`** — A static reference poster. Uses inline SVG to draw pyramid triangle charts for life-number interpretation. Different aesthetic (serif fonts, paper-like colors) from the rest of the app.
**`server.py`** — Thin wrapper around `http.server.SimpleHTTPRequestHandler`. Disables caching for HTML and JSON responses. Adds `/save` + `/load` routes. No database, no auth. Single-threaded with a 30-second socket timeout. Binds to `127.0.0.1` only (no external network access).
+323
View File
@@ -0,0 +1,323 @@
/* common.js —— 纯数据 + 纯函数,禁止任何 DOM 操作
shared by: shuzi.html / yangsheng.html / jiema.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:'1号人是天生的领导者,具有强烈的开创精神和独立意识。你目标明确,行动力强,能够独自完成许多事情。但你需要注意不要过于自我,学会倾听他人意见。'},
2:{title:'沟通·温柔',pos:'善于沟通、温柔体贴、合作能力强',neg:'依赖他人、优柔寡断、情绪化',job:'公关、客服、教育、心理咨询',elem:'水',desc:'2号人天生具有细腻的情感和出色的沟通能力。你善解人意,重视人际关系,是团队中的润滑剂。需要学会独立决断,避免过度依赖他人的认可。'},
3:{title:'行动·创意',pos:'行动力强、创意无限、表达力出众',neg:'急躁冲动、三分钟热度、缺乏耐心',job:'演员、讲师、销售、创意行业',elem:'木',desc:'3号人是天生的行动派,想到就做,充满创意和热情。你的表达能力和感染力极强,总能带动周围人的情绪。需要培养耐心,把创意落地为成果。'},
4:{title:'规划·稳定',pos:'善于规划、踏实稳重、注重细节',neg:'过于保守、缺乏弹性、安全感缺失',job:'工程师、会计、策划、项目管理',elem:'木',desc:'4号人是最可靠的建设者,做事有条不紊,追求安全与稳定。你擅长把复杂的事情拆解成清晰的步骤。需要学会接受变化,适当放松对完美的执念。'},
5:{title:'自由·方向',pos:'热爱自由、方向感强、幽默风趣',neg:'难以约束、逃避责任、缺乏定性',job:'旅行家、作家、自由职业、营销',elem:'土',desc:'5号人向往自由,喜欢冒险和新鲜事物。你天生的方向感让你总能在迷茫中找到出路。需要学会在自由与责任之间找到平衡。'},
6:{title:'智慧·财富',pos:'聪明睿智、财富直觉、追求完美',neg:'挑剔苛刻、浪费资源、过分焦虑',job:'金融、投资、咨询、医疗、法律',elem:'金',desc:'6号人是天生的智者,对财富和品质有敏锐的直觉。你追求完美,注重价值,具有强大的分析判断能力。需要学会放松标准,接纳不完美。'},
7:{title:'分析·真理',pos:'深入钻研、追求真理、洞察力强',neg:'冷漠孤僻、多疑猜忌、不善社交',job:'科学家、侦探、程序员、学者',elem:'水',desc:'7号人是天生的研究者,喜欢刨根问底,追求事物的本质和真相。你的洞察力和分析能力超群,但也容易陷入自己的世界。需要多与人交流,打开心扉。'},
8:{title:'责任·商业',pos:'责任心强、商业头脑、野心勃勃',neg:'压力过大、控制欲强、过度功利',job:'企业家、管理者、投资人、政治家',elem:'土',desc:'8号人天生具有强大的责任感和商业头脑,渴望成功并愿意为之付出努力。你有掌控大局的能力,但需注意不要让事业压力压垮自己。'},
9:{title:'博爱·成功',pos:'慈悲博爱、机会多多、容易成功',neg:'贪多嚼不烂、缺乏专注、过于理想化',job:'慈善家、演员、艺术家、宗教/灵修',elem:'火',desc:'9号人拥有广阔的胸怀和强大的亲和力,容易获得他人的信任和机会。你天生带有成功的气场,但需要学会聚焦,把精力集中到最重要的事情上。'},
};
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':'规划执行','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':'领袖码,天生王者','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点前完成重要决策(肝气最旺)。下午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;
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:'玫瑰花薄荷茶疏肝解郁。多与朋友交流倾诉。快走或瑜伽舒畅气机。按揉太冲、期门穴。'},
};
+5
View File
@@ -39,6 +39,7 @@ body{
.c2 .li{background:#E6F0FF;color:#4A90E2}
.c3 .li{background:#E6FFE8;color:#5CB85C}
.c4 .li{background:#FFF8E6;color:#E8985A}
.c5 .li{background:#FFF5EC;color:#C8923A}
</style>
</head>
<body>
@@ -51,6 +52,10 @@ body{
<div class="li">🏠</div>
<div><div class="lt">愈心谷首页</div><div class="ld">心理健康服务 · 愈心魔方</div></div>
</a>
<a href="jiema.html" class="link-card c5">
<div class="li">🔮</div>
<div><div class="lt">愈心解码</div><div class="ld">一个生日 · 读懂身与心</div></div>
</a>
<a href="shuzi.html" class="link-card c2">
<div class="li"></div>
<div><div class="lt">数字心理学</div><div class="ld">生命数字三角解构</div></div>
+336
View File
@@ -0,0 +1,336 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no">
<title>愈心解码 · 一个生日读懂身与心</title>
<style>
: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;}
body{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(5px);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;}
</style>
</head>
<body>
<div class="wrap">
<div class="top">
<div class="t">愈心解码</div>
<div class="s">一个生日,读懂你的身与心</div>
</div>
<div id="report"></div>
<div class="disc" id="disc" style="display:none">
📋 本页面内容为文化 + 心理测评 + 健康生活方式参考,<br>
体质部分参考国标《中医体质分类与判定》,不构成医疗建议。
</div>
</div>
<!-- 分享卡片弹层 -->
<div class="modal" id="shareModal">
<div class="m-box">
<canvas id="shareCanvas" width="540" height="720"></canvas>
<div class="m-tip">长按图片保存 · 分享给好友</div>
<div class="m-close" onclick="document.getElementById('shareModal').classList.remove('on')">关闭</div>
</div>
</div>
<script src="common.js"></script>
<script>
/* ---------- 工具 ---------- */
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(/</g,'&lt;');}
/* ---------- 精简 SVG 三角图(核心数字:I,J,K,L → M,N → O ---------- */
function miniPyramid(v){
const base=[v.I,v.J,v.K,v.L], mid=[v.M,v.N], apex=v.O;
const CW=42,CH=40,GY=8,W=CW*4+GY*3,cx=W/2;
function cell(x,y,n,hl){
return '<rect x="'+x+'" y="'+y+'" width="'+CW+'" height="'+CH+'" rx="8" fill="'+(hl?'#C8923A':'#fff8ef')+'" stroke="#e0c48a"/><text x="'+(x+CW/2)+'" y="'+(y+CH/2+5)+'" text-anchor="middle" font-size="17" font-weight="700" fill="'+(hl?'#fff':'#8a6d3b')+'">'+(n!=null?n:'')+'</text>';
}
var s='<svg width="'+W+'" height="'+(CH*3+GY*2)+'" xmlns="http://www.w3.org/2000/svg">';
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+='</svg>';
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;i<ST.length;i++){ var t=ST[i];if(m>t.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='<div class="err">缺少有效生日参数,请从首页重新进入 🙏</div>';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=
'<!-- Part1 数字性格 -->'+
'<div class="card">'+
'<span class="tag tag-num">数字性格</span>'+
'<div class="hex">'+mainNum+'</div>'+
'<div class="p-title">'+mainNum+'号人 · '+esc(person.title)+'</div>'+
'<div class="p-oneline">'+esc((person.desc||'').split(/[。.]/)[0])+'</div>'+
'<div class="pyr">'+miniPyramid(v)+'</div>'+
'<div class="lock '+(paid?'unlocked':'')+'" id="lock-num">'+
'<div class="blur">'+
'<b>天赋优势:</b>'+esc(person.pos)+'<br>'+
'<b>人生课题:</b>'+esc(person.neg)+'<br>'+
'<b>适合方向:</b>'+esc(person.job)+'<br>'+
'<b>能量解读:</b>'+esc(person.desc)+
'</div>'+
'<div class="cover">'+
'<div class="lk-t">🔒 解锁完整性格解读</div>'+
'<div class="lk-d">天赋优势 · 人生课题 · 适合职业 · 12组联合码</div>'+
'<button class="unlock-btn" onclick="unlock()">¥39.9 解锁 →</button>'+
'</div>'+
'</div>'+
'</div>'+
'<!-- Part2 五行体质 -->'+
'<div class="card">'+
'<span class="tag tag-ys">五行体质</span>'+
'<div class="ys-type">'+esc(cst.primary)+'</div>'+
'<div class="ys-dir">养生重点:养'+esc(cst.strong)+' · 需护'+esc(cst.weak)+'</div>'+
'<div class="bars">'+
EO.map(function(e){return '<div class="bar-row"><span class="lab" style="color:'+EC[e]+'">'+e+'</span><div class="bar-track"><div class="bar-fill" style="width:'+p5[e]+'%;background:'+EC[e]+'"></div></div><span class="val">'+p5[e]+'%</span></div>';}).join('')+
'</div>'+
'<div class="p-oneline">情绪画像:'+esc((emo.strength||[]).join(' · '))+'</div>'+
'<div class="lock '+(paid?'unlocked':'')+'" id="lock-ys">'+
'<div class="blur">'+
'<b>体质特征:</b>'+esc(cst.body)+'<br>'+
'<b>调养要点:</b>'+esc(cst.tips)+'<br>'+
'<b>易感倾向:</b>'+esc(cst.diseases)+'<br>'+
'<b>季节风险:</b>'+esc(cst.seasonRisk)+'<br>'+
'<b>食疗方向:</b>'+esc(cst.foodTherapy)+'<br>'+
'<b>作息节律:</b>'+esc(cst.dailyRhythm)+
'</div>'+
'<div class="cover">'+
'<div class="lk-t">🔒 解锁五行体质深度分析</div>'+
'<div class="lk-d">脏腑画像 · 易感倾向 · 食疗 · 运动作息方案</div>'+
'<button class="unlock-btn" onclick="unlock()">¥39.9 解锁 →</button>'+
'</div>'+
'</div>'+
'</div>'+
'<!-- Part3 今日养生锦囊(免费) -->'+
'<div class="card jn">'+
'<span class="tag tag-ys">今日养生锦囊</span>'+
'<div class="st">当前节气:'+st.n+' · 时令 '+sEl+' 当令</div>'+
'<h4>今日调养建议</h4>'+
'<div class="row"><b>宜:</b>'+yj.yi+'</div>'+
'<div class="row"><b>忌:</b>'+yj.ji+'</div>'+
'</div>'+
'<!-- 深度入口 -->'+
'<div class="deep">'+
'<a class="d-num" href="shuzi.html?y='+y+'&m='+m+'&d='+d+'">完整数字报告 →</a>'+
'<a class="d-ys" href="yangsheng.html?y='+y+'&m='+m+'&d='+d+'&h=12">完整养生方案 →</a>'+
'</div>'+
'<!-- 契合度(免费给分数) -->'+
'<div class="card">'+
'<span class="tag tag-num">测测你和 TA 的契合度</span>'+
'<div class="mini-form">'+
'<input type="number" id="tY" placeholder="年"><span>年</span>'+
'<input type="number" id="tM" placeholder="月"><span>月</span>'+
'<input type="number" id="tD" placeholder="日"><span>日</span>'+
'<button onclick="matchTest('+y+','+m+','+d+')">测算</button>'+
'</div>'+
'<div id="matchOut"></div>'+
'</div>'+
'<!-- 分享 -->'+
'<div class="card">'+
'<span class="tag tag-num">分享你的身心密码</span>'+
'<button class="share-btn" onclick="genShare(\''+mainNum+'号人 · '+esc(person.title)+'\',\''+esc(cst.primary)+'\',\'养'+esc(cst.strong)+'\')">📱 生成分享卡片</button>'+
'</div>';
}
/* ---------- 付费墙 ---------- */
function unlock(){
if(confirm('【模拟支付】\n\n解锁完整深度报告 ¥39.9\n\n确认支付?')){
localStorage.setItem('jiema_paid','1');
document.querySelectorAll('.lock').forEach(function(el){el.classList.add('unlocked');});
}
}
/* ---------- 契合度(免费仅分数,深度引导付费/双人报告) ---------- */
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=
'<div class="match-score">'+score+' 分</div>'+
'<div class="lock" style="margin-top:8px">'+
'<div class="blur">你们在沟通节奏、能量互补、相处课题上的详细解读……</div>'+
'<div class="cover">'+
'<div class="lk-t">🔒 查看完整契合度解读</div>'+
'<div class="lk-d">关系能量图 · 相处建议 · 沟通指南</div>'+
'<button class="unlock-btn" onclick="alert(\'双人契合度报告 ¥129(模拟)\')">¥129 解锁 →</button>'+
'</div>'+
'</div>';
}
/* ---------- 分享卡片(纯 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();
</script>
</body>
</html>
+16 -74
View File
@@ -85,6 +85,9 @@
</style>
</head>
<body>
<div style="max-width:600px;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 style="text-align:center;margin-bottom:10px;">
<h1 style="font-size:1.5em;font-weight:400;letter-spacing:0.2em;color:#5a4636;margin:0 0 6px;">愈心谷数字解构</h1>
@@ -156,39 +159,8 @@
</div>
<div class="tooltip" id="tip"></div>
<script src="common.js"></script>
<script>
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:'1号人是天生的领导者,具有强烈的开创精神和独立意识。你目标明确,行动力强,能够独自完成许多事情。但你需要注意不要过于自我,学会倾听他人意见。'},
2:{title:'沟通·温柔',pos:'善于沟通、温柔体贴、合作能力强',neg:'依赖他人、优柔寡断、情绪化',job:'公关、客服、教育、心理咨询',elem:'水',desc:'2号人天生具有细腻的情感和出色的沟通能力。你善解人意,重视人际关系,是团队中的润滑剂。需要学会独立决断,避免过度依赖他人的认可。'},
3:{title:'行动·创意',pos:'行动力强、创意无限、表达力出众',neg:'急躁冲动、三分钟热度、缺乏耐心',job:'演员、讲师、销售、创意行业',elem:'木',desc:'3号人是天生的行动派,想到就做,充满创意和热情。你的表达能力和感染力极强,总能带动周围人的情绪。需要培养耐心,把创意落地为成果。'},
4:{title:'规划·稳定',pos:'善于规划、踏实稳重、注重细节',neg:'过于保守、缺乏弹性、安全感缺失',job:'工程师、会计、策划、项目管理',elem:'木',desc:'4号人是最可靠的建设者,做事有条不紊,追求安全与稳定。你擅长把复杂的事情拆解成清晰的步骤。需要学会接受变化,适当放松对完美的执念。'},
5:{title:'自由·方向',pos:'热爱自由、方向感强、幽默风趣',neg:'难以约束、逃避责任、缺乏定性',job:'旅行家、作家、自由职业、营销',elem:'土',desc:'5号人向往自由,喜欢冒险和新鲜事物。你天生的方向感让你总能在迷茫中找到出路。需要学会在自由与责任之间找到平衡。'},
6:{title:'智慧·财富',pos:'聪明睿智、财富直觉、追求完美',neg:'挑剔苛刻、浪费资源、过分焦虑',job:'金融、投资、咨询、医疗、法律',elem:'金',desc:'6号人是天生的智者,对财富和品质有敏锐的直觉。你追求完美,注重价值,具有强大的分析判断能力。需要学会放松标准,接纳不完美。'},
7:{title:'分析·真理',pos:'深入钻研、追求真理、洞察力强',neg:'冷漠孤僻、多疑猜忌、不善社交',job:'科学家、侦探、程序员、学者',elem:'水',desc:'7号人是天生的研究者,喜欢刨根问底,追求事物的本质和真相。你的洞察力和分析能力超群,但也容易陷入自己的世界。需要多与人交流,打开心扉。'},
8:{title:'责任·商业',pos:'责任心强、商业头脑、野心勃勃',neg:'压力过大、控制欲强、过度功利',job:'企业家、管理者、投资人、政治家',elem:'土',desc:'8号人天生具有强大的责任感和商业头脑,渴望成功并愿意为之付出努力。你有掌控大局的能力,但需注意不要让事业压力压垮自己。'},
9:{title:'博爱·成功',pos:'慈悲博爱、机会多多、容易成功',neg:'贪多嚼不烂、缺乏专注、过于理想化',job:'慈善家、演员、艺术家、宗教/灵修',elem:'火',desc:'9号人拥有广阔的胸怀和强大的亲和力,容易获得他人的信任和机会。你天生带有成功的气场,但需要学会聚焦,把精力集中到最重要的事情上。'},
};
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]},
@@ -200,48 +172,6 @@ const NUM_CLR={
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]},
};
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':'规划执行','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':'领袖码,天生王者','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:'博爱过度,需注意避免贪多不精',
};
// ===== Dimetric 投影 + Z 轴旋转 —— 底座天然水平 =====
let rotZ = -0.55; // Z 轴旋转角(弧度)
@@ -668,6 +598,18 @@ function update(v,y,m,d){
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);
}
})();
</script>
</body>
</html>
+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>
+32
View File
@@ -161,6 +161,38 @@ body{
<div class="hearts-css"><span class="hh"></span><span class="hh"></span></div>
</div>
<!-- 愈心解码入口 -->
<div class="section">
<div style="background:#fff;border-radius:18px;padding:22px 18px;box-shadow:0 4px 16px rgba(0,0,0,0.06);text-align:center;">
<div style="font-size:18px;font-weight:700;color:#C8923A;margin-bottom:4px;">🔮 愈心解码</div>
<div style="font-size:12px;color:var(--sub);margin-bottom:16px;">输入生日,解锁你的身心密码</div>
<div style="display:flex;gap:6px;align-items:center;justify-content:center;flex-wrap:wrap;">
<input type="number" id="dy" placeholder="1990" maxlength="4" style="width:62px;padding:10px 6px;border:1.5px solid #e8e0d8;border-radius:10px;font-size:15px;text-align:center;outline:none;background:#fdfaf7;">
<span style="font-size:13px;color:var(--sub);"></span>
<input type="number" id="dm" placeholder="1" maxlength="2" style="width:48px;padding:10px 6px;border:1.5px solid #e8e0d8;border-radius:10px;font-size:15px;text-align:center;outline:none;background:#fdfaf7;">
<span style="font-size:13px;color:var(--sub);"></span>
<input type="number" id="dd" placeholder="1" maxlength="2" style="width:48px;padding:10px 6px;border:1.5px solid #e8e0d8;border-radius:10px;font-size:15px;text-align:center;outline:none;background:#fdfaf7;">
<span style="font-size:13px;color:var(--sub);"></span>
<button onclick="goDecode()" style="padding:10px 18px;background:var(--pri);color:#fff;border:none;border-radius:22px;font-size:14px;font-weight:600;cursor:pointer;box-shadow:0 3px 10px rgba(229,77,66,.3);">生成 →</button>
</div>
</div>
</div>
<script>
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='jiema.html?y='+encodeURIComponent(y)+'&m='+encodeURIComponent(m)+'&d='+encodeURIComponent(d);
}
['dy','dm','dd'].forEach(function(id){
document.getElementById(id).addEventListener('keydown',function(e){
if(e.key==='Enter')goDecode();
});
});
</script>
<!-- 疗愈魔方 -->
<div class="section">
<div class="sec-head" style="justify-content:center;flex-direction:column;align-items:center;gap:4px">