xnx_checkin 签到插件
功能
每日签到:用户每日可签到一次,按随机奖励区间
reward_base_min ~ reward_base_max发放积分连续签到奖励:第 3/7/15/30 天额外奖励(独立配置金额)
满勤奖励:周满勤
reward_weekly_full/ 月满勤reward_monthly_full每日前三名:当日最早签到的 3 名用户额外奖励
reward_top1/2/3,并标记is_top3/top3_rank心情记录:签到时可选择心情(happy/calm/tired/sad/excited),存入
xnx_checkin_mood表,提供今日心情统计日历视图:当月签到日历(已签到日期高亮,支持切换年月)
排行榜:累计签到天数榜 / 连续签到天数榜,缓存 300 秒
后台管理:12 项奖励参数配置、发现页入口配置、签到记录查询(按 uid/日期范围筛选 + 分页)、补签(
manualCheckin指定 uid + 日期)API 接口:
xnx_checkin_api提供do(POST 签到)/status(GET 查询状态)/ 日历等 JSON 接口前台路由:
xnx_checkin(签到主页)、xnx_checkin_calendar(日历页)、xnx_checkin_rank(排行榜页)首页注入:
index_site_brief_post_after.htm显示签到按钮(未登录跳登录 / 已签到跳签到页 / 未签到跳签到页),状态缓存 60 秒性能优化:
getCheckinStatus通过一次批量查当月记录 + 一次查上月末记录消除 N+1(原 N+4 次查询降为 3 次)完整缓存:状态 60 秒 / 今日统计 60 秒 / 排行榜 300 秒 / 防刷锁 5 秒,通过
CacheHelper::registerKeys('checkin', ...)注册
文件结构
plugin/xnx_checkin/
├── conf.json
├── install.php / uninstall.php / upgrade.php
├── setting.php (后台配置 + 记录查询 + 补签)
├── index.php (签到主页)
├── api.php (JSON 接口:do/status/...)
├── calendar.php (日历页)
├── rank.php (排行榜页)
├── admin.php (后台入口,转发到 setting.php)
├── update.md
├── model/CheckinService.php
├── lang/
│ ├── zh-cn.php
│ ├── zh-tw.php
│ └── en-us.php
├── hook/
│ ├── index_site_brief_post_after.htm (首页签到按钮)
│ ├── index_site_brief_stats_after.htm
│ ├── index_route_case_end.php
│ ├── admin_index_route_case_end.php
│ ├── lang_zh_cn_bbs.php
│ ├── lang_zh_tw_bbs.php
│ └── lang_en_us_bbs.php
├── view/
│ ├── css/checkin.css
│ └── htm/
│ ├── checkin_index.htm
│ ├── checkin_calendar.htm
│ ├── checkin_rank.htm
│ ├── checkin_modal.htm
│ └── checkin_admin.htm
配置流程
后台启用插件(自动建
xnx_checkin_log日志表 +xnx_checkin_mood心情表,写入 12 项默认奖励参数)进入「插件设置」配置积分类型、基础奖励区间、连续奖励 3/7/15/30、周/月满勤、前三名奖励
切换到「签到记录」标签可按 uid/日期范围筛选并补签
测试:用户访问
?xnx_checkin→ 点击签到 → 获得随机积分 + 连续奖励 + 前三名奖励(若有);首页显示「已签到 / 签到」按钮;日历页查看历史签到;排行榜页查看 Top 用户
扩展说明
事件 hook:
xnx_checkin_do_checkin_end.php触发位置:
CheckinService::doCheckin()签到成功后(事务提交、积分发放、缓存清理完毕之后)触发可用变量:
$uid(用户 ID)、$totalReward(总奖励积分)、$newContinuous(连续天数)、$newTotal(累计天数)、$isTop3(是否前三)、$top3Rank(前三名次)、$creditsType(积分类型)、$today(日期)、$mood(心情)监听方在自身
hook/目录放置xnx_checkin_do_checkin_end.php即可注入逻辑(如xnx_feeds监听此 hook 将签到动作写入动态流)