• cxk123
    版规考试准入
    ID exam_gate版本 1.0.0插件制作者 cxk123售价 30 积分2106 行 / 114.7 KBHook / 路由 / 后台页
    新用户注册后要先通过一份版规考试才能发言:没通过之前可以按你的设置限制成「只能看」、
    收费插件安装说明购买后点击“授权码”获取一次性授权码;在后台 > 插件广场点击在线安装或更新,并填写该授权码。已购买用户更新免费:每次在线安装或更新前,重新点击“授权码”获取新的一次性授权码即可,无需再次购买;也可直接下载新版后用后台“插件上传”更新。尊重并感谢他人劳动,请勿传播代码。
    app/plugins/exam_gate/plugin.php
    开发日志已有 1 条

    此项目接受所有登录用户协助维护和提交更新。

    • cxk123
      cxk123
      版本 1.0.0 277c6eeccd52 更新:1.0.0 首次上架:新用户准入闸 —— 「版规考试」(考过才放行 · 未过按档限制 · 全程可申诉) 【为什么需要它】 新注册的人不看版规就直接发言,是每个论坛都要处理的事。现在的做法要么靠版主事后删帖,要么靠管理员 一个个私信提醒。核心的 `app_users` 里没有任何「是否已通过版规考试」的位置,也没有任何插件做过这件事 (市场 414 款里「考试 / 测验 / 题库 / 答题 / 及格release
    主楼
  • cxk123

    版本 1.0.0 更新:
    1.0.0 首次上架:新用户准入闸 —— 「版规考试」(考过才放行 · 未过按档限制 · 全程可申诉)

    【为什么需要它】
    新注册的人不看版规就直接发言,是每个论坛都要处理的事。现在的做法要么靠版主事后删帖,要么靠管理员
    一个个私信提醒。核心的 app_users 里没有任何「是否已通过版规考试」的位置,也没有任何插件做过这件事
    (市场 414 款里「考试 / 测验 / 题库 / 答题 / 及格 / 准入」只有 1 条命中,且是问卷插件的无关语境)。
    本插件把这件事做成闸门:注册后/首次登录先考一份版规考试,考过自动放行,没过按你设的档位限制。

    【新能力】

    1. 题库与卷面:题目支持单选 / 多选 / 判断,任意条选项 + 正确答案 + 解析 + 难度(1-5) + 权重(1-10) + 启用开关。

    后台可逐题增删改,也可以粘贴一整段文本导入([单选] 题干 / + 正确项 / - 错误项 / > 解析,
    支持 [多选|难度3|权重2]),并能导出成同一格式的 .txt —— 导出再粘回导入,题目、选项、正确项、
    解析、难度与权重原样回来(往返无损)。导入分「追加(按题干去重)」与「替换全部」两种。

    1. 出卷规则全部可配:出卷题数 · 及格分(百分制)· 是否随机题目顺序 · 是否随机选项顺序 · 时间限制(0=不限)·

    允许重考次数(0=不限)· 重考冷却分钟数 · 题库改版后是否需要重考 · 豁免用户组 · 是否开放申诉。

    1. 考试与判卷:开始考试时一次性固定卷面(题目顺序 + 每题的选项顺序 + 题干与选项文案整体落库为快照),

    刷新、回退、换标签页拿到的都是同一份卷;提交后服务端判卷,立刻给出分数、逐题对错、你的答案、正确答案与解析。
    多选题按「选项集合完全相等」判,少选多选都算错(不设部分分,口径写在考试页上)。

    1. 防作弊(四条硬口径):

    · 幂等提交:落库用 UPDATE … WHERE id=? AND status=0 条件更新 + 行数判定,重复提交 / 双击 /
    两发同时到达都只留第一份成绩,第二次直接跳成绩单,分数与用时都不会被改写;
    · 超时判失败:以服务端时间为准,超时提交记 超时、分数照算供本人复盘,但恒不通过;
    卷面倒计时到 0 会自动交卷,服务端仍然独立判一次(前端倒计时只是体验);
    · 答案不落到前端:正确答案与解析只在服务端快照里,卷面 HTML 里没有任何对错标记、没有解析文本;
    · 成绩单归属校验:WHERE id=? AND user_id=?,别人的成绩单直接 404(管理团队可查看)。

    1. 准入闸:未通过的人在核心写路径之前就被拦下 —— 可配三档:「只能看不能发」「只能回帖不能发主题」

    「只能在新手区发言」。拦截时给出可读提示(写明当前限制 + 考试入口地址),顶部栏常驻「版规考试(未通过)」
    一键跳到考试页;编辑自己以前的帖子不受影响(老内容不追溯)。

    1. 通过即永久放行:通过后把「通过时的题库版本号 + 通过时间」写进用户自身,此后每次请求零查询放行,

    发帖回帖按钮立刻恢复。题库改版(版本号 +1)且开启「需重考」时,旧通过者重新入闸。

    1. 后台一个 Tab:题库管理(分页列表 + 编辑表单 + 导入 / 导出)· 出卷规则与准入口径 · 通过率与最常错题目 ·

    放行与撤销(按用户名手动放行 / 撤销,含待处理申诉)· 台账与留存(保留天数 + 一键清理)。

    1. 绝不会把人锁死:重考次数用完或被冷却挡住时,考试大厅会显示具体原因并引导提交申诉(带理由,落台账),

    管理团队在后台「放行与撤销」页看得到申诉原文并一键放行;题库为空(或全部停用)时闸门整体失效,
    开考那一刻还会复核一次真实题目数,为 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 个新增列一并归还,重装幂等。

    #1
  • 质量报告

    插件质量报告

    插件:exam_gate

    Hook功能范围循环使用频率文件读写修改系统表读写系统表读写自己的表
    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

    字段类型可空默认值约束
    idid否-主键、自增
    question_keykey否-唯一
    qtypeINTEGER否--
    titletext否--
    explanationtext是--
    difficultyINTEGER否--
    weightINTEGER否--
    enabledINTEGER否--
    sort_orderINTEGER否--
    created_atuint否--
    updated_atuint否--

    plugin_exam_gate_options

    字段类型可空默认值约束
    idid否-主键、自增
    question_iduint否--
    labelstring否--
    is_correctINTEGER否--
    sort_orderINTEGER否--

    plugin_exam_gate_attempts

    字段类型可空默认值约束
    idid否-主键、自增
    user_iduint否--
    statusINTEGER否--
    scoreINTEGER否--
    pass_percentINTEGER否--
    passedINTEGER否--
    paper_versionuint否--
    question_countINTEGER否--
    total_weightINTEGER否--
    earned_weightINTEGER否--
    correct_countINTEGER否--
    wrong_countINTEGER否--
    started_atuint否--
    expires_atuint否--
    submitted_atuint否--
    used_secondsuint否--
    paper_jsontext是--
    answer_jsontext是--
    review_jsontext是--
    fail_reasonstring是--
    created_atuint否--
    updated_atuint否--

    plugin_exam_gate_audit

    字段类型可空默认值约束
    idid否-主键、自增
    user_iduint否--
    actor_iduint否--
    actionkey否--
    reasonstring是--
    metatext是--
    created_atuint否--
    #2

发表回复

登录后回复