【XiunoX插件】每日报平安 2.1.0

管理员组

每日报平安(navgcn_dailycheck)

插件功能概述

每日报平安插件鼓励社区用户每日登录后点击"报平安",形成健康活跃的互动氛围。系统自动监测失联用户,并通过站内通知和邮件提醒,适用于远程团队关心、社区日活促进等场景。

核心功能

  • 每日报平安:用户点击导航栏"报平安"按钮,弹出确认对话框,完成当日报到

  • 连续报到统计:显示连续报到天数、累计报到次数、最近报到时间

  • 报到日历:月度报到日历,直观展示报到记录(类似 GitHub 贡献图)

  • 失联监测:系统自动检测连续未报到用户,超过阈值触发预警

  • 站内通知:失联用户收到站内消息提醒

  • 邮件提醒:失联用户和指定管理员收到邮件通知(需配置 SMTP)

  • 管理员后台:查看所有用户报到状态、筛选失联用户、手动触发检测、查看错误日志

安装步骤

  1. navgcn_dailycheck 目录上传至 Xiuno X 的 plugin 目录。

  2. 登录后台 → 插件管理 → 找到"每日报平安" → 点击"安装"。

  3. 安装后进入插件设置页,配置失联天数阈值、邮件模板等。

  4. 确保系统 SMTP 邮件发送功能已配置正确。

卸载步骤

  1. 后台插件管理 → 点击"卸载",将删除所有数据表(报到记录、通知记录)。

  2. 手动删除 plugin/navgcn_dailycheck 目录。

使用说明

用户端

  • 登录后点击导航栏"报平安"按钮,每日一次

  • 在报到历史页查看自己的报到记录和月度日历

  • 连续报到天数会在导航栏和侧边栏显示

管理员

  • 后台 → 每日报平安 → 可查看所有用户报到状态

  • 设置失联阈值(默认3天)、邮件模板

  • 手动触发"立即检查失联"按钮

  • 查看邮件发送失败日志

更新日志

  • v1.0.0(2026-07-30):初始版本,实现核心报到、失联监测、邮件通知、后台管理。


插件自检报告(2026-07-31)

依据:xiunox-plugin-dev Skill 硬规则 + 项目 .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 用 <?php exit;;route/cron/lang 类 hook 用 <?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 → 无命中(合规:规则禁止这些字段)

  • 本人所开发的插件,请在二开或魔改时,标注原作者来源信息

最新回复

请先登录后再回复 登录

uid:1 管理员组
关注
这个人很懒,什么都没留下来...
发帖 13
评论 48
粉丝 0
关注 2
发新帖
目录
【XiunoX插件】每日报平安 2.1.0