每日报平安(navgcn_dailycheck)
插件功能概述
每日报平安插件鼓励社区用户每日登录后点击"报平安",形成健康活跃的互动氛围。系统自动监测失联用户,并通过站内通知和邮件提醒,适用于远程团队关心、社区日活促进等场景。
核心功能
每日报平安:用户点击导航栏"报平安"按钮,弹出确认对话框,完成当日报到
连续报到统计:显示连续报到天数、累计报到次数、最近报到时间
报到日历:月度报到日历,直观展示报到记录(类似 GitHub 贡献图)
失联监测:系统自动检测连续未报到用户,超过阈值触发预警
站内通知:失联用户收到站内消息提醒
邮件提醒:失联用户和指定管理员收到邮件通知(需配置 SMTP)
管理员后台:查看所有用户报到状态、筛选失联用户、手动触发检测、查看错误日志
安装步骤
将
navgcn_dailycheck目录上传至 Xiuno X 的plugin目录。登录后台 → 插件管理 → 找到"每日报平安" → 点击"安装"。
安装后进入插件设置页,配置失联天数阈值、邮件模板等。
确保系统 SMTP 邮件发送功能已配置正确。
卸载步骤
后台插件管理 → 点击"卸载",将删除所有数据表(报到记录、通知记录)。
手动删除
plugin/navgcn_dailycheck目录。
使用说明
用户端
登录后点击导航栏"报平安"按钮,每日一次
在报到历史页查看自己的报到记录和月度日历
连续报到天数会在导航栏和侧边栏显示
管理员
后台 → 每日报平安 → 可查看所有用户报到状态
设置失联阈值(默认3天)、邮件模板
手动触发"立即检查失联"按钮
查看邮件发送失败日志
更新日志
v1.0.0(2026-07-30):初始版本,实现核心报到、失联监测、邮件通知、后台管理。
插件自检报告(2026-07-31)
依据:
xiunox-plugin-devSkill 硬规则 + 项目.rules/project_rules.md/.rules/bugfix_rules.md。 方式:静态代码审计(Grep 全量扫描)+ 关键 Bug 源码级定位 + 修复验证。
一、交付检查表逐项结论
检查项 | 结论 | 说明 |
|---|---|---|
conf.json 必填字段完整,不含 id/installed/enable | ✅ 合规 | name/brief/version(2.0.0)/bbs_version(1.1)/type 齐全;规则禁止含 id/installed/enable,当前缺失即合规 |
bbs_version 与 XIUNOX_VERSION 前两段一致 | ✅ 合规 | XIUNOX_VERSION=1.1.4 → 前两段 1.1,与 bbs_version 一致,不触发 conf_version 拦截 |
install.php 用 IF NOT EXISTS 幂等 | ✅ | 4 张表均 CREATE TABLE IF NOT EXISTS |
uninstall.php 标准拼写 + 删表删 KV | ✅ | 文件名 uninstall.php(非 unstall.php) |
数据库结构变更走 upgrade.php 幂等 + 递增 version | ✅ | SHOW COLUMNS + ALTER,version 2.0.0 |
hook 文件头正确 | ✅ | 仅 model_inc_file.php 用 |
hook 文件无 return; | ✅ | Grep hook/ 目录 return; 无命中 |
POST 表单含 CsrfService::input();处理以 check() 开头 | ✅ | 3 个表单均含 input;两个 route POST 首行 check |
输出转义(无 esc_textarea) | ✅(1 处备注) | 全局无 esc_textarea;4 处 DB 派生日期串未包 esc_html(低风险,见第四节) |
无 jQuery/Alpine/idiomorph;无 htmx 2.x 旧事件名 | ✅ | static/js 无 jQuery/Alpine;内联 JS 仅用原生 DOM API |
命名全带前缀 | ✅ | 表/变量/语言键/setting 键/CSS class 均 navgcn_dailycheck_ 前缀 |
JS/CSS 放 static/,引用用 $conf['view_url'] | ✅ | 经 header_link_after.htm / footer_js_after.htm hook 注入 |
static/*.js 无 <?php | ✅ | Grep 无命中 |
数据库表用 utf8mb4;db_* 传表名不含前缀 | ⚠️→✅ 已修复 | 详见第二节 |
Service 调用核心类前 include_once 守卫 | ✅ | 类用 class_exists,函数用 function_exists,一致 |
改 PHP 后清 tmp/ 编译缓存 | ✅ | 本次修复已清 Service 编译缓存 |
后台模板 include ADMIN_PATH header/footer | ✅ | dailycheck_admin.htm 首尾 include admin header/footer |
Card 组件加 x-card,无裸 border | ✅ | 后台/前台卡片用 x-card |
头像用 avatar_component_from_data() | ✅ | 无原生 img 头像 |
插件目录名符合 作者_功能标识 两段格式 | ✅ | navgcn_dailycheck 符合 |
二、发现并修复的严重 Bug(双重表前缀)
位置:
model/NavgcnDailycheckService.php,共 14 处db_*调用手动拼接$this->tablepre。根因:框架
db_pdo_mysql::find()等方法内部已自动拼接$db->tablepre(值bbs_);Service 又手动拼了一次$this->tablepre(同为bbs_),叠加成bbs_bbs_navgcn_dailycheck_*,而线上实际表名为bbs_navgcn_dailycheck_*,导致表不存在。影响:豁免管理(whitelist 全部增删查)、操作日志(log_operation)、补录报到(manualCheckin)、重置用户状态(resetUserStatus 删 log/notify)、导出(exportCheckinData)等依赖这 14 处的方法全部静默失效(db_* 失败返回空/0,不抛异常)。
修复:去掉
db_*调用中的手动前缀,改为裸表名(如db_count('navgcn_dailycheck_whitelist')),由框架自动补bbs_前缀;保留第 646 行原生 SQL(db_sql_find不走自动补前缀,必须保留手动前缀)。验证:
php -l无语法错误;仅 646 行保留$this->tablepre;线上SHOW TABLES确认bbs_navgcn_dailycheck_{log,log_operation,notify,whitelist}四表存在;框架find()第 95 行FROM {$this->tablepre}$table确认自动补前缀 → 修复后db_count('navgcn_dailycheck_whitelist')精确指向bbs_navgcn_dailycheck_whitelist。已清tmp/plugin_navgcn_dailycheck_model_NavgcnDailycheckService.php编译缓存。复用:
db_*函数传表名禁止包含前缀(框架自动补),仅在原生 SQL(db_sql_find/db_exec)中手动拼$db->tablepre。
三、Grep 审计命令结果(应为空/合规)
grep -rn "jQuery|\$(|$.ajax|$.fn|Alpine|x-data|x-show" plugin/navgcn_dailycheck/→ 无命中grep -rn "return;" plugin/navgcn_dailycheck/hook/→ 无命中grep -rn "<\?php" plugin/navgcn_dailycheck/static/*.js→ 无命中grep -rn "esc_textarea" plugin/navgcn_dailycheck/→ 无命中grep -rn "conf\['db'\]\['tablepre'\]"→ 无命中grep -rn "id\|installed\|enable" plugin/navgcn_dailycheck/conf.json→ 无命中(合规:规则禁止这些字段)本人所开发的插件,请在二开或魔改时,标注原作者来源信息