feat: refine profile and home UI with dynamic fortune rules

This commit is contained in:
zhouzhibo committed 2026-10-15 21:56:45 +08:00
1 parent 869376979c
commit 4608dbd5cf
59 files changed
+3424 -1347

No files matched your search

+39
View File
@@ -0,0 +1,39 @@
# 前端五行报告:普通扶抑简化参考算法 v1
用户确认采用可解释的普通扶抑综合评分。本规则为本产品的确定性参考算法,不是统一命理标准或专业断命依据;只作传统文化娱乐参考。
## 输入与排盘
- 只使用保存后的公历生日、出生时辰,不使用接口返回的 `elementReport`。
- 使用锁定版本的 `lunar-typescript` 生成四柱和地支藏干;年/月柱沿用库的节气划分。
- 输入按北京时间处理,不转换浏览器时区,不作真太阳时校正。
- 只有时辰时,使用该时辰起始小时(子时23点,丑时1点等);库 `setSect(2)` 约定日柱零点换日。由于缺少具体分钟,节气交界的时辰无法精确划分;不声称处理了分钟级边界。
- 日期支持1900至2100年;非法日期、缺失/非法时辰返回空状态,不伪造默认五行或日主。
## 组成比例
四个天干各10份,年/日/时支各10份,月支18份。地支分到其藏干:一藏干100%,两藏干70%/30%,三藏干60%/30%/10%,顺序使用历法库藏干顺序。这些份数为产品约定。用最大余数法转换为整数百分比,保证五项之和为100%。
## 三项评分
1. 得令(40%):以月支主五行作为季节,辰戌丑未简化为土。日主与季节同类为旺100分,季节生日主为相80分,日主生季节为休50分,日主克季节为囚30分,季节克日主为死15分。旺、相标为月令支持。
2. 得地(30%):四支藏干中与日主同五行的份额相加,达到两个完整根计100分,其余按比例计分并封顶100分。有任何同类藏干即标为有根;“有根”不等于“根气充分”。
3. 得势(30%):排除日干本身,计算其他天干和所有地支藏干中印星(生日主)与比劫(同日主)的加权份额占比。月支仍取18份,其他支10份,其他天干10份,占比即评分。达到50%标为生扶力量占优。
总分 = 得令×0.4 + 得地×0.3 + 得势×0.3,四舍五入到整数。该启发式中月令也参与藏干和得势,是刻意强调季节的产品约定,并非三份独立统计样本。
## 扶抑喜忌
- 小于45分:偏弱。喜生扶,列印星、比劫;忌项为食伤、财、官杀。
- 大于55分:偏强。喜泄耗制衡,列食伤、财、官杀;忌项为印星、比劫。
- 45到55分(含边界):相对平衡,不强行指定喜用/忌用;页面提示保持协调。
此处“喜用”是扶抑方向集合,不进一步判断唯一用神或精确优先级。不包含从格、专旺、化气、合冲刑害、调候、藏干司令天数等;不能把本算法表述为完整八字喜用神体系。
## 更新与验收
`useDidShow` 重新读取 `GET /api/user/profile` 的个人资料;生日或时辰改变后,`useMemo` 重新计算整份报告。昵称、头像、性别、地点不参与本版计算。加载失败显示重试入口,不退回假资料。保存使用原来的 `PUT /api/user/profile`,无需新增报告接口。
执行 `npm run test:elements`,覆盖强弱反转、藏干根气、无效日期、百分比守恒、时辰变化、节气月份切换和子时换日。构建验证仍需 `tsc --noEmit`、H5与小程序构建。
开发者工具验收:我的→我的元素,检查五项比例、强弱、得令/得地/得势说明;返回修改生日或时辰并保存,再次进入元素页检查四柱和报告。测试平衡命例时,喜忌应显示“暂无明显偏向/偏忌”。
+51
View File
@@ -0,0 +1,51 @@
# 首页动态生成与验收(开发维护说明)
用户确认:纯前端简化参考规则;页面不公开公式、权重、计算依据;维度卡片仅展示列表,不做详情交互。因此下面内容仅为维护文档,不渲染进首页。
## 数据与更新
只请求 `GET /api/user/profile` 获取生日、时辰、头像,不读取旧 `/api/home/overview` 的报告,也不使用异常时的固定42分示例。沿用 `calculateFiveElements` 的扶抑规则,以及按春节换年的生肖和合冲关系。需要有效生日、时辰,缺失时显示完善资料入口;网络失败显示重试。H5显式 `?preview=1` 由现有预览适配器提供示例个人资料,不请求后端。
北京时间日期作为基准,昨日/今日/明日分别偏移−1/0/+1。每份报告独立生成整套公历、星期、农历、摘要、指数、吉色吉数、吉向吉时和八个维度。页面显示时重读个人资料;北京时间零点刷新相对日期。生日、时辰、日期任一输入变化后重新计算,相同输入结果稳定,不调用随机数。
## 评分约定
本产品的简化娱乐规则,不代表统一命理标准。分值仅用于界面参考,不解释为健康、财富或事件发生的概率。
- 日主喜忌由已经确认的普通扶抑算法产生。
- 某元素在喜用集合:基础权重 + round(max(0,20−个人该元素百分比)/5)。在忌用集合:−基础权重 − round(max(0,个人该元素百分比−20)/5)。相对平衡时不加减。即先判断扶抑方向,再小幅调节份额,不把“缺少”直接等同于“喜用”。
- 当日公共基分=50 + 日干五行喜忌项(基础权重10) + 出生生肖年支对当日日支的关系分×5。关系分沿用六合+2、三合同组+1、六冲−2、相害−1、其余0。
- 各维度再加该维度五行的喜忌项(基础权重8),以及日干五行对维度五行的同类/生助+6、相克−6、其余0。
- 黄历宜忌读取所选日期的历法库数据,匹配该维度活动关键词。命中忌为−10,否则命中宜为+10,否则0;同项冲突优先忌。不把黄历活动误写成事件必然发生。
- 维度分限制15到90;≥50显示宜,<50显示忌。展示文案按宜/忌选择对应普通生活建议,再用日干奇偶选择文案变体;不是固定的一套八维文案,也不以随机数伪装计算。
- 八个维度等权平均并四舍五入为综合指数。≥80大吉、≥65小吉、≥50平日、≥35小逆、其余谨慎。
- 维度关联:情感/社交=火,健康/事业=木,生活=土,财富=金,学业/出行=水。活动词见 `definitions`,属于产品简化映射。
普通建议仅涉及日常沟通、整理、作息、预算核对、任务安排和路线准备,不生成诊疗、投资或事故预测。摘要由当日状态和最高/最低分维度形成;同分时使用均衡描述。
## 吉色、吉数、吉向、吉时
- 有利五行取扶抑报告喜用集合;相对平衡时只在颜色/数字展示中取两个较低占比元素作装饰参考,不重新定义喜用。结合所选日干的生助关系排序,取两项。
- 色盘映射:木为绿、火为粉橘、土为杏麦、金为白金、水为蓝;按日干奇偶选色调。
- 数字映射采用产品约定的河图数:木3/8、火2/7、土5/0、金4/9、水1/6,按日支奇偶选对应数字。
- 吉向读取所选当日 `getDayPositionXiDesc()`,作为传统喜神方位参考;指南针图标跟随方向旋转。
- 吉时只在当日 `getTimes()` 的“吉”片段中选择,以时干喜忌项(基础权重2)和出生年支对时支关系排序,取两个不重复时支。用历法库具体起止片段显示:早子时00–01,夜子时23–24,不把跨日片段混作同一天。若无时段,显示暂无参考时段。
## 图标、列表、排序和导航
八维图标、水滴和灵境头像为原创矢量源转换的256像素透明PNG,源码在 `scripts/render-home-icons.cjs`。统一由共享 `AppTabBar` 提供首页与我的导航;H5关闭Taro重复系统tabBar,微信端保留原tab配置并使用 `switchTab`。
`src/index.html` 交给Taro的HTML插件生成预览入口与正确的脚本文件名,不再手写分块编号。模板注入rem响应式脚本,H5使用baseFontSize20、minRootSize16、maxRootSize40;修复以前缺少脚本导致宽屏/窄屏缩放不一致的问题。
维度按本机顺序展示,不默认按宜忌重排。排序页用上下按钮调整,完成后写入 `home.dimension-order.v1`;损坏或旧存储通过去重/过滤/补齐修复为八维。页面没有不可点击的伪详情箭头,也没有评分依据展开入口。
## 验收
1. 开发者工具打开首页;检查水滴头像、三个日期、真实农历、紫色指数卡、四块参考信息、八维图标与卡片、底部灵境头像。
2. 依次切换昨日/今日/明日,日期与状态、整份报告同步变化;不同字段允许在某些日期相同,不人为强制每项变化。
3. 修改生日或时辰保存后回首页,报告按新资料重新计算;昵称/头像不参与评分。
4. 点击排序,用上下按钮调整后完成,退出重进仍保留八维顺序;首尾按钮不可越界。
5. 列表无详情点击交互;页面不显示评分公式、干支依据、权重或测试工具,只保留简短娱乐参考标注。
6. 切换窄屏、常规屏、长屏检查文本、卡片和安全区;从首页切我的,导航样式一致,H5不重复渲染原生tabBar。
自动验证:`npm run test:home`。验证真实日期/农历、三日切换、评分一致性、同输入稳定、生日时辰变化、吉时来源和边界、排序修复及图标资产。
+51
View File
@@ -0,0 +1,51 @@
# 我的生肖
按用户确认,以春节(农历正月初一)换生肖,使用公历生日经 `lunar-typescript` 转为农历,读取 `getYearShengXiao()`。不使用公历年份模12,也不使用以立春为界的八字年柱。
`src/utils/zodiac.ts` 只接收生日,返回十二生肖名称或空值。缺失或无效生日不默认展示兔子。支持1900至2100年,和当前元素报告的生日范围一致。
“我的生肖”入口与弹窗共用同一个 `zodiac` 结果及 `ZodiacMascot` 组件。十二张图标为本地256×256透明PNG,矢量源保存在 `scripts/render-zodiac-icons.cjs`。通过 `sharp` 可重新生成,运行时无需依赖 `sharp`。
页面返回时通过现有 `GET /api/user/profile` 获取最新生日,生日变化后重新计算生肖。保存生日沿用 `PUT /api/user/profile`,不新增生肖接口。图标、弹窗标题和“属X”名称随结果一起变化;隐藏生日开关不影响计算。
## 验收
1. 在开发者工具使用测试账号,进入“我的”,点击“我的生肖”,入口及弹窗应显示同一种动物,弹窗有对应“属X”名称。
2. 修改测试账号生日为2024-02-09并保存,返回应显示兔;改为2024-02-10并保存,返回应显示龙。
3. 2024-02-05在立春之后但春节之前,仍应为兔;避免把“我的元素”的节气年柱与日常生肖混用。
4. 对缺失或非法生日,入口显示“待完善”,弹窗提示完善生日并提供编辑入口。
5. 点击遮罩或“知道了”关闭弹窗,进入资料编辑与生肖按钮保持独立。
自动验证:`npm run test:zodiac`,覆盖春节前后、十二生肖周期、非法生日、资料改变和图标资产完整性。H5和微信小程序均需构建通过。
## 动态生肖周运:合冲简化规则 v1
用户已确认采用纯前端合冲关系计算,并要求公开权重与判断依据。输入为保存后的生日和北京时间当前日期。生日先按春节换年得到生肖,再对应子丑寅卯辰巳午未申酉戌亥的出生年支。按北京时间本周一至周日,用历法库计算七天日支;不是按公历日期模12伪造日支。
每天按以下互斥关系计一次分:
| 关系 | 分数 | 对应关系 |
| --- | --- | --- |
| 六合 | +2 | 子丑、寅亥、卯戌、辰酉、巳申、午未 |
| 三合同组 | +1 | 申子辰、亥卯未、寅午戌、巳酉丑,同组且不同支 |
| 六冲 | −2 | 子午、丑未、寅申、卯酉、辰戌、巳亥 |
| 相害 | −1 | 子未、丑午、寅巳、卯辰、申亥、酉戌 |
| 平常 | 0 | 其余关系,包括相同地支 |
六合与六冲表复用历法库 `LunarUtil.HE_ZHI_6` / `LunarUtil.CHONG`。三合同组只是出生年支与日支两支间的助力关系,不声称完整三合成局。不纳入刑、破或八字整体。权重与以下阈值是本产品的简化娱乐参考规则,不是统一命理标准。
七天分数求和:≥2为“顺势”,≤−2为“谨慎”,−1至1为“平稳”。正分日列为助力日,负分日列为留意日。摘要由本周实际天数、周状态及其对应建议组成;同一生肖同周稳定,不随机。不同生肖/周次可能同为“平稳”,不保证每次切换都换一个状态。
弹窗展示周一/周日的完整公历日期、状态、摘要、助力/留意日期,可展开权重、周总分与七天日支/关系/分数。明确标注“仅作传统文化娱乐参考”。普通建议限于沟通、协调、确认安排,不生成健康或投资预测。
页面显示、弹窗打开时检查北京时间日期;弹窗保持打开时在北京时间零点刷新,跨周后重新计算。没有后端报告接口,没有持久化周运结果。无效生日不给出周运;无效设备日期显示日期检查提示。
### 周运验收
1. “我的”→“我的生肖”,确认显示本周周一至周日区间、生肖、动态摘要和日期。
2. 展开“判断依据”,逐日分数合计应等于周总分;总分对应状态应与上述阈值一致。
3. 修改生日跨生肖,检查图标、名称、七天关系和摘要一起更新;同生肖的不同生日在同周允许结果相同。
4. 按北京时间周日/周一检查周区间,跨年周应保留完整年份。不要用UTC日期替代北京时间日期。
5. 小屏下滚动查看详细依据,“知道了”按钮始终可用;遮罩仍可关闭弹窗。
测试:`npm run test:zodiac-weekly`,覆盖所有地支关系及对称性、北京时间零点、同周稳定、跨年/跨周、十二生肖结果差异、分数复算、非法输入。