- 版规考试准入ID exam_gate版本 1.0.0插件制作者 cxk123售价 30 积分2106 行 / 114.7 KBHook / 路由 / 后台页新用户注册后要先通过一份版规考试才能发言:没通过之前可以按你的设置限制成「只能看」、收费插件安装说明购买后点击“授权码”获取一次性授权码;在后台 > 插件广场点击在线安装或更新,并填写该授权码。已购买用户更新免费:每次在线安装或更新前,重新点击“授权码”获取新的一次性授权码即可,无需再次购买;也可直接下载新版后用后台“插件上传”更新。尊重并感谢他人劳动,请勿传播代码。app/plugins/exam_gate/plugin.php插件预览6 张开发日志已有 1 条
此项目接受所有登录用户协助维护和提交更新。
主楼 版本 1.0.0 更新:
1.0.0 首次上架:新用户准入闸 —— 「版规考试」(考过才放行 · 未过按档限制 · 全程可申诉)【为什么需要它】
新注册的人不看版规就直接发言,是每个论坛都要处理的事。现在的做法要么靠版主事后删帖,要么靠管理员
一个个私信提醒。核心的app_users里没有任何「是否已通过版规考试」的位置,也没有任何插件做过这件事
(市场 414 款里「考试 / 测验 / 题库 / 答题 / 及格 / 准入」只有 1 条命中,且是问卷插件的无关语境)。
本插件把这件事做成闸门:注册后/首次登录先考一份版规考试,考过自动放行,没过按你设的档位限制。【新能力】
- 题库与卷面:题目支持单选 / 多选 / 判断,任意条选项 + 正确答案 + 解析 + 难度(1-5) + 权重(1-10) + 启用开关。
后台可逐题增删改,也可以粘贴一整段文本导入(
[单选] 题干/+ 正确项/- 错误项/> 解析,
支持[多选|难度3|权重2]),并能导出成同一格式的 .txt —— 导出再粘回导入,题目、选项、正确项、
解析、难度与权重原样回来(往返无损)。导入分「追加(按题干去重)」与「替换全部」两种。- 出卷规则全部可配:出卷题数 · 及格分(百分制)· 是否随机题目顺序 · 是否随机选项顺序 · 时间限制(0=不限)·
允许重考次数(0=不限)· 重考冷却分钟数 · 题库改版后是否需要重考 · 豁免用户组 · 是否开放申诉。
- 考试与判卷:开始考试时一次性固定卷面(题目顺序 + 每题的选项顺序 + 题干与选项文案整体落库为快照),
刷新、回退、换标签页拿到的都是同一份卷;提交后服务端判卷,立刻给出分数、逐题对错、你的答案、正确答案与解析。
多选题按「选项集合完全相等」判,少选多选都算错(不设部分分,口径写在考试页上)。- 防作弊(四条硬口径):
· 幂等提交:落库用
UPDATE … WHERE id=? AND status=0条件更新 + 行数判定,重复提交 / 双击 /
两发同时到达都只留第一份成绩,第二次直接跳成绩单,分数与用时都不会被改写;
· 超时判失败:以服务端时间为准,超时提交记超时、分数照算供本人复盘,但恒不通过;
卷面倒计时到 0 会自动交卷,服务端仍然独立判一次(前端倒计时只是体验);
· 答案不落到前端:正确答案与解析只在服务端快照里,卷面 HTML 里没有任何对错标记、没有解析文本;
· 成绩单归属校验:WHERE id=? AND user_id=?,别人的成绩单直接 404(管理团队可查看)。- 准入闸:未通过的人在核心写路径之前就被拦下 —— 可配三档:「只能看不能发」「只能回帖不能发主题」
「只能在新手区发言」。拦截时给出可读提示(写明当前限制 + 考试入口地址),顶部栏常驻「版规考试(未通过)」
一键跳到考试页;编辑自己以前的帖子不受影响(老内容不追溯)。- 通过即永久放行:通过后把「通过时的题库版本号 + 通过时间」写进用户自身,此后每次请求零查询放行,
发帖回帖按钮立刻恢复。题库改版(版本号 +1)且开启「需重考」时,旧通过者重新入闸。
- 后台一个 Tab:题库管理(分页列表 + 编辑表单 + 导入 / 导出)· 出卷规则与准入口径 · 通过率与最常错题目 ·
放行与撤销(按用户名手动放行 / 撤销,含待处理申诉)· 台账与留存(保留天数 + 一键清理)。
- 绝不会把人锁死:重考次数用完或被冷却挡住时,考试大厅会显示具体原因并引导提交申诉(带理由,落台账),
管理团队在后台「放行与撤销」页看得到申诉原文并一键放行;题库为空(或全部停用)时闸门整体失效,
开考那一刻还会复核一次真实题目数,为 0 就直接放行并留痕 —— 任何情况下都有明确的下一步。【默认是关的】
刚装上时闸门是关闭状态,插件的判定完全惰性、不影响任何人。先把题库导进去、把规则配好,再打开开关。【查询预算(实测)】
首页 / 版块页 / 主题页 / 用户页 / 个人回帖列表页 0 条自有表查询;被拦下的发帖与回帖 POST 也是 0 条
(判定全在内存里 —— 通过状态写在用户自身,随核心的用户行一起读出来);提交答卷 POST 3 条;
考试页(卷面)1 条、结果页 1 条、记录页 2 条;后台各视图 0-4 条。列表与首页不因为装了它多一次查询。【兼容】
· 只加自己的 4 张表(plugin_exam_gate_questions/_options/_attempts/_audit)与app_users的
2 个新增列(plugin_exam_gate_passed_version/_passed_at),**不改任何 app_* 既有列**;
· 不注册计划任务、不发任何外部请求;依赖的钩子全部是核心既有扩展点,单独装也能工作;
· 卸载(不保留数据)会把 4 张表、7 枚索引与app_users的 2 个新增列一并归还,重装幂等。插件质量报告
插件:
exam_gateHook 功能范围 循环 使用频率 文件读写 修改系统表 读写系统表 读写自己的表 top.bar.actions 顶部栏插件入口,同一请求只执行一次(展示位置:版块导航与搜索框前后) 否 5 - - - - user.can_speak 发帖权限检查 否 4 - - - - reply.before_save 回帖发布/编辑表单提交 否 3 - - app_topics - topic.before_save 主题发布/编辑表单提交 否 3 - - - - reply.form_extra 回帖编辑表单 否 2 - - - - topic.form_extra 主题发布/编辑表单 否 2 - - - - admin.tabs 后台管理页标签栏(展示位置:后台Tab) 否 1 - - - - 颜色说明:黄色表示有数据读写,红色表示 Hook 在系统循环中执行,浅蓝色表示有文件写入。“列表跳过”表示回调在列表路径会提前返回,“回调内”表示操作位于回调自身或其帮助函数的循环体内。“文件批处理”表示逐个处理用户一次提交的文件,属于必要操作,不标记修正。只有操作实际处于需要优化的循环路径时,才会标记“修正❗️”。
数据字典
plugin_exam_gate_questions字段 类型 可空 默认值 约束 id id 否 - 主键、自增 question_key key 否 - 唯一 qtype INTEGER 否 - - title text 否 - - explanation text 是 - - difficulty INTEGER 否 - - weight INTEGER 否 - - enabled INTEGER 否 - - sort_order INTEGER 否 - - created_at uint 否 - - updated_at uint 否 - - plugin_exam_gate_options字段 类型 可空 默认值 约束 id id 否 - 主键、自增 question_id uint 否 - - label string 否 - - is_correct INTEGER 否 - - sort_order INTEGER 否 - - plugin_exam_gate_attempts字段 类型 可空 默认值 约束 id id 否 - 主键、自增 user_id uint 否 - - status INTEGER 否 - - score INTEGER 否 - - pass_percent INTEGER 否 - - passed INTEGER 否 - - paper_version uint 否 - - question_count INTEGER 否 - - total_weight INTEGER 否 - - earned_weight INTEGER 否 - - correct_count INTEGER 否 - - wrong_count INTEGER 否 - - started_at uint 否 - - expires_at uint 否 - - submitted_at uint 否 - - used_seconds uint 否 - - paper_json text 是 - - answer_json text 是 - - review_json text 是 - - fail_reason string 是 - - created_at uint 否 - - updated_at uint 否 - - plugin_exam_gate_audit字段 类型 可空 默认值 约束 id id 否 - 主键、自增 user_id uint 否 - - actor_id uint 否 - - action key 否 - - reason string 是 - - meta text 是 - - created_at uint 否 - -