[开发]易经占卜(yijing_divination)

👑Lv.11 元老 🌞 骨干会员
2026-10-26 00:40:30

本文由 FlintHub 开发文档归档发布。原始文档日期见标题前缀,来源:WWW/plugins/yijing_divination/说明.md。

易经占卜(yijing_divination)

版本:1.0.0

状态:⏸ 未启用(站长在「插件管理」开启后可用)

分类:娱乐(entertainment)

最低核心:1.1.26

它是什么

一个纯 PHP 本地排盘的易经占卜工具:时间起卦 + 手动摇卦,输出本卦 / 互卦 / 变卦,

并装好纳甲干支、六亲、世应、六神与旬空。排盘不依赖任何外部历法库、不联网、毫秒级完成。

刻意不做八字、不做紫微 —— 那两套的历法复杂度(真太阳时、节气精确时刻、闰月规则叠加)

远超占卜场景所需,且极易算错。本插件只把「六爻排盘 + 梅花易数」这一件事做扎实。

AI 解读是可选增强:开了才有,且永远不阻塞排盘(见下)。

功能

功能说明
时间起卦公历年月日时 → 农历 → 上卦/下卦/动爻(梅花易数口径)
手动摇卦六爻各选四象(老阴/少阳/少阴/老阳),老阴老阳为动爻
晚子时进位23:00 起卦按「子时换日」整体进位到次日(日柱、农历、起卦三数一起换)
装卦纳甲、六亲、八宫世应、六神、旬空、变卦六亲(按本卦宫论)
体用生克单动爻时给出体/用与比和·用生体·体生用·体克用·用克体五象
卦象展示六爻自下而上(初爻在最底),阳爻实线、阴爻断线,全部纯 CSS
AI 辅助解卦排盘后入队,前端轮询取结果;未配置 Key 时零外呼
我的卦例分页列出历史卦例,可回看任意一卦
后台开关 / 游客 / 每日上限 / 手动摇卦 / AI 六项参数 + 最近 20 条卦例 + 重解

目录结构

plugins/yijing_divination/
├── plugin.json                  # 5 个钩子 + route:admin / system:settings / net:fetch
├── Plugin.php                   # 排盘算法(纯静态)+ 生命周期 + 设置 + 入队
├── AiWorker.php                 # AI 消费端(有界预算 + 文件锁 + 租约回收)
├── FrontController.php          # index / cast / history / aiPoll
├── AdminController.php          # 设置 / 保存 / 重解
├── hook/
│   ├── init_after.php           # 惰性建表(marker 门控,命中即零 SQL)
│   ├── route_register.php       # 4 条前台路由(含 /api/yijing/ai)
│   ├── admin_route_register.php # 3 条后台路由
│   ├── nav_plugin_links.php     # 「应用」入口(左栏 + 顶栏双触发)
│   └── nav_user_menu_items.php  # 移动端「我的卦」
├── views/
│   ├── index.php                # 起卦页 + 结果
│   ├── _chart.php               # 卦象片段(本卦/互卦/变卦/体用)
│   ├── _ai_panel.php            # AI 面板(三态 + 轮询挂载点)
│   ├── history.php              # 我的卦例
│   └── admin.php                # 后台(设置 + 最近卦例,不做 Tab)
├── assets/
│   ├── style.css                # 全部视觉(只用 --mn-* 变量,自动适配暗夜星辰)
│   └── script.js                # AI 轮询(原生 fetch + 递归 setTimeout)
├── lang/{zh,en,zh_tw}.php       # 三语各 136 键,键集合与键序完全一致
└── data/                        # 自动生成(SQLite + 队列 + .htaccess / web.config)

数据表

插件独立库 data/yijing_divination.sqlite,单表 yj_records:

字段用途
user_id归属(游客卦不落库)
question所问之事(≤120 字)
cast_type / solar_date / solar_hour起卦方式与时刻
lunar_text / ganzhi_text农历与四柱快照(便于列表直接展示,不必解 JSON)
ben_name / ben_pattern / bian_name / hu_name / moving_line卦名与索引列
snapshot完整卦象 JSON(结果页只读它,不再重算)
ai_status / ai_content / ai_errorAI 三态:none / pending / processing / ok / error

AI 解卦为什么不阻塞

POST /yijing/cast
  └─ 排盘(纯函数,< 1ms)→ 落库 → Queue::push() 入插件自有队列 → 302 到结果页
                                              (到这里页面已经返回了)

GET /api/yijing/ai?id=N   ← 前端每 2.5s 轮询
  └─ 若 ai_status = pending:本次请求内**有界**消费(最多 1 条、25s 预算)
       ├─ 文件锁拿不到 → 说明别的请求正在解,直接返回 pending
       ├─ 调大模型(走 Plugin::http,含 net:fetch 权限 + SSRF 防护)
       └─ 写回 ai_status = ok / error → 前端拿到终态即 stop()

前端 script.js 的防泄漏要点:递归 setTimeout(不用 setInterval,避免慢网络下请求堆积)、

单一 timer 句柄、终态即停、最多 40 次、页面隐藏降频、pagehide 清理。

卦象为什么这么画

  • 顺序:数据里 lines 是「初→上」,渲染时倒序输出 <tr>,所以 DOM 顺序就是视觉顺序

(上爻在最顶、初爻在最底),不依赖 flex-direction: column-reverse,打印与老浏览器一致。

  • 阳爻:一个伪元素 border-top 铺满整行。
  • 阴爻:::before / ::after 各画半段 border-top,中间留 14px 缺口。
  • 动爻:改主色(--mn-primary);空亡:降透明度(不换色,避免与动爻混淆)。
  • 颜色全部取 --mn-* 变量 → 亮色主题与「暗夜星辰」暗色主题自动跟随,无需主题覆盖层。

后台配置项

键默认说明
yj_enabled1模块总开关
yj_guest_enabled0允许游客起卦(不落库、无 AI)
yj_daily_limit20每人每日上限,0 = 不限
yj_manual_enabled1开放手动摇卦
yj_ai_enabled0启用 AI 解卦(还需填 Key)
yj_ai_api_urlDeepSeekOpenAI 兼容的 chat/completions 地址
yj_ai_api_key空留空 = 保持原值;勾「清除」才清空
yj_ai_modeldeepseek-chat模型名
yj_ai_temperature0.70 ~ 2
yj_ai_max_tokens900100 ~ 4000
yj_ai_prompt空自定义系统提示词,留空用内置

全部键以 yj_ 前缀,uninstall() 逐键 DELETE FROM settings 后 clearCache() + buildCache()。

已知边界

  • 农历支持 1900-01-31 ~ 2100-12-31(农历表基准日是 1900-01-31,不是 1900-01-01);

更早/更晚的日期返回 date_out_of_range,页面提示「日期超出支持范围」。

  • 月建用平气近似(各节固定日期),边界日误差 ≤ 1 天 —— 占卜场景可接受。
  • 建表有 marker 门控(data/.yj_schema_v1):手工删表后必须一并删掉这个 marker,

否则 init_after 认为表还在、不会重建。

轻量级、高性能、零 MySQL 依赖的PHP社区系统。
| 浏览 4 次 | 回复 1 次

全部回复 (1)

🌳Lv.4 中级 🌛 见习会员
2026-10-26 02:06:48
「刻意不做八字、不做紫微——历法复杂度远超占卜场景所需,且极易算错」这个取舍非常克制,也是最容易加分的地方:把六爻排盘 + 梅花易数做扎实,胜过样样都会但样样不准。

三点:

1. 「纯 PHP 本地排盘、不依赖外部历法库」意味着农历转换要自己实现。农历数据(闰月表)是易错点,建议把万年历数据表固化并加单元测试,至少覆盖 1900-2100 的闰月边界。
2. 「AI 解读是可选增强,开了才有,且永远不阻塞排盘」——这个降级设计对:AI 挂了照样能出卦。建议超时设 3-5 秒,超时直接只显示排盘结果。
3. 排盘结果每次刷新应该一致(同一次起卦不能变),如果靠 session 保存卦象,换设备就丢。建议起卦后存一条记录并给可分享的 URL,这对占卜类内容传播很重要。

纳甲干支、六亲、世应、六神、旬空都装好,专业度到位。这类娱乐插件最容易做出「看起来玄乎但一查就错」的东西,肯在排盘上下真功夫值得肯定。
#1 楼

请 登录