本文由 FlintHub 开发文档归档发布。原始文档日期见标题前缀,来源:WWW/plugins/horoscope/说明.md。
星座运势(horoscope)
版本:1.0.0
状态:✅ 已启用
分类:娱乐(
entertainment)最低核心:1.1.26
它是什么
给登录用户一个「每天来看一眼」的理由:今日运势、未来 7 天趋势、星座配对。
核心不是随机数:同一用户、同一星座、同一天,刷新多少次结果都一样;跨天自动变化。
所以它看起来像「算出来的」,而不是「摇出来的」。
功能
| 功能 | 说明 |
|---|---|
| 今日运势 | 综合 / 爱情 / 事业 / 财运 / 健康五维度,各带一句解读与分数条 |
| 幸运信息 | 幸运色(带色块)、幸运数字、贵人星座 |
| 宜 / 忌 | 各从 20 条池中取一条,永不重复 |
| 未来 7 天 | 7 根柱状趋势,今天高亮(仅登录可见) |
| 星座配对 | 四元素模型,选一个星座即时出分与解读 |
| 星座档案 | 12 格一键切换,或填生日自动识别(只记月日,不记年份) |
| 星座图标 | 12 个传统星座符号(♈–♓)内联 SVG,随 currentColor 变色;切换条 / 大标题 / 配对区 / 右栏卡共用一套 |
| 右栏小卡 | 已设置星座的用户在右栏看到今日分数与一句话 |
| 后台 | 模块开关 / 游客开关 / 默认星座 + 今日·7 日·累计查看量与星座分布 |
目录结构
plugins/horoscope/
├── plugin.json # 6 个钩子 + route:admin / system:settings 权限
├── Plugin.php # 星座表 / 种子引擎 / 档案 / 统计
├── FrontController.php # index(今日运势)/ saveProfile(写操作)
├── AdminController.php # 设置 + 统计
├── hook/
│ ├── init_after.php # 惰性建表(marker 门控)
│ ├── route_register.php # 2 条前台路由
│ ├── admin_route_register.php# 2 条后台路由
│ ├── nav_plugin_links.php # 「应用」入口(左栏 + 顶栏双触发)
│ ├── nav_user_menu_items.php # 用户下拉「我的星座」
│ └── right_sidebar_after.php # 右栏小卡
├── views/
│ ├── index.php # 今日运势(含趋势与配对)
│ ├── admin.php # 后台(设置 + 统计,不做 Tab)
│ └── _sidebar.php # 右栏卡模板
├── assets/style.css # 唯一资源文件(本插件无 JS)
├── lang/{zh,zh_tw,en}.php # 三语各 230 键,键集合与键序完全一致
└── data/ # 自动生成(含 .htaccess / web.config)没有 assets/script.js:切换星座与配对都是普通表单提交,服务端整页渲染。
少一个 JS = 少一套运行时错误路径,对「每天看一次」的低频页面完全够用。
数据表(插件独立库 data/horoscope.sqlite)
hs_profiles (user_id PK, sign, birthday_md, created_at, updated_at)
hs_logs (id PK, user_id, sign, log_date, action, created_at)
+ idx_hs_logs_date / idx_hs_logs_sign刻意不存每日运势结果:种子是 (日期, 用户, 星座) 的纯函数,历史任意一天都能重算,
存下来只会产生冗余与不一致。
生日只存 MM-DD:推星座只需要月日,存年份是没必要的隐私负担。
运势怎么算出来的
$seed = hash_hmac('sha256', 日期 | 用户ID | 星座, 盐);盐(horoscope_seed_salt,32 字节 hex)在激活时生成,只在不存在时写入 —— 盐一变,全站运势重排。
从 64 位 hex 按固定偏移切片,每段独立派生一个字段:
| 字段 | 派生 | 范围 |
|---|---|---|
| 综合分 | 四维均值 × 0.6 + 独立分 × 0.4 | 55–99 |
| 爱情 / 事业 / 财运 / 健康 | 55 + n % 45 | 55–99 |
| 幸运色 | 12 色池取模 | 12 选 1 |
| 幸运数字 | 1 + n % 9 | 1–9 |
| 贵人星座 | 排除自己后取模 | 11 选 1 |
| 宜 / 忌 | 各 20 条池取模,撞了就 +1 | 20 选 1 |
为什么不用 mt_srand():它是全局状态,会污染同请求内 dice / quiz_duel / red_packet 的随机逻辑;
而且 hash_hmac 是纯函数,才能写「连算 1000 次必须完全一致」的夹具断言。
配对模型
不走 78 组硬编,用占星学的四元素相容性:
| 元素关系 | 分数区间 | 组合数 |
|---|---|---|
| 同元素(火火 / 土土 / 风风 / 水水) | 85–98 | 4 |
| 互补(火风 / 土水) | 75–92 | 2 |
| 一般(火土 / 风水) | 55–70 | 2 |
| 需磨合(火水 / 土风) | 40–60 | 2 |
10 种无序组合 × 3 档文案 = 30 条,覆盖全部 144 组(含自身)。
配对结果不随日期变化 —— 配对是性格分析,每天变才不合理。
钩子与路由
| 钩子 | 作用 | 注意 |
|---|---|---|
init_after | 惰性建表兜底 | 核心按目录名硬拼类名,activate() 可能被静默跳过 |
route_register | GET /horoscope、POST /horoscope/profile | — |
admin_route_register | GET /admin/horoscope、POST /admin/horoscope/save | 需 route:admin |
nav_plugin_links | 「应用」入口 | 一次渲染触发两次,__nav_uri 守卫高亮 |
nav_user_menu_items | 移动端「我的」菜单「我的星座」 | 按 $placement 分支:PC 下拉不出此项(站长要求);同一文件被调用两次,勿整体 return |
right_sidebar_after | 右栏小卡 | 未设置星座的用户不渲染 |
后台
一页两块,不做 Tab(只有两区,上下排更直观,也避开「多页 Tab 需页内自建 JS」的坑)。
- 设置:启用开关 / 允许游客查看 / 默认星座
- 统计:今日、近 7 日、累计查看量 + 12 星座分布 + 最近 20 条记录
更新记录
| 版本 | 内容 |
|---|---|
| 1.0.0 | 首个版本:确定性运势引擎(同人同日恒定)、五维度 + 幸运色/数字/贵人 + 宜忌、未来 7 天趋势、四元素配对、12 格星座档案、右栏卡、后台设置与统计;三语 230 键 |