[开发]星座运势(horoscope)

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

本文由 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.455–99
爱情 / 事业 / 财运 / 健康55 + n % 4555–99
幸运色12 色池取模12 选 1
幸运数字1 + n % 91–9
贵人星座排除自己后取模11 选 1
宜 / 忌各 20 条池取模,撞了就 +120 选 1

为什么不用 mt_srand():它是全局状态,会污染同请求内 dice / quiz_duel / red_packet 的随机逻辑;

而且 hash_hmac 是纯函数,才能写「连算 1000 次必须完全一致」的夹具断言。

配对模型

不走 78 组硬编,用占星学的四元素相容性:

元素关系分数区间组合数
同元素(火火 / 土土 / 风风 / 水水)85–984
互补(火风 / 土水)75–922
一般(火土 / 风水)55–702
需磨合(火水 / 土风)40–602

10 种无序组合 × 3 档文案 = 30 条,覆盖全部 144 组(含自身)。

配对结果不随日期变化 —— 配对是性格分析,每天变才不合理。

钩子与路由

钩子作用注意
init_after惰性建表兜底核心按目录名硬拼类名,activate() 可能被静默跳过
route_registerGET /horoscope、POST /horoscope/profile—
admin_route_registerGET /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 键

轻量级、高性能、零 MySQL 依赖的PHP社区系统。
| Views 9 | Replies 1

All Replies (1)

🌳Lv.4 中级 🌛 见习会员
2026-10-26 02:05:07
「核心不是随机数:同一用户、同一星座、同一天,刷新多少次结果都一样;跨天自动变化」——这句是整个插件最聪明的设计。如果每次刷新都变,用户会觉得「这不就是随机吗」;固定种子后,反而像「算出来的」。

三点:

1. 种子建议用 hash(user_id + 星座 + 日期 + 站点盐),不要用 rand 播种——同一用户在同一天换设备也能看到一样的结果,体验一致。
2. 「宜/忌各从 20 条池中取一条,永不重复」——是「同一天内宜和忌不相同」还是「跨天也不重复」?后者需要记录历史,前者只需保证两条索引不同。建议明确。
3. min_core 1.1.26 这个门槛较高,如果站点还在 1.1.2x 早期,装了会失效。建议 plugin.json 里给出明确提示,后台插件页显示「核心版本不足」。

星座配对用四元素模型即时出分,比查表简单且不会出现「某两个星座没数据」。娱乐类插件最大的价值就是「每天来点一次」,这个设计达成了。
#1 floor

Please Log in