Skip to content

ECUSTMC/campus-status

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

31 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Campus Status - 在校状态校验

BlessingSkin Server 6 插件,通过 IP 或学工号校验用户在校状态。

功能

  • 用户在侧边栏「在校认证」页面主动进行在校认证
  • IP 认证:页面自动检测用户当前 IP 是否在校园网段内
    • 在校园网内 → 按钮可点击,点击后认证为在校用户
    • 不在校园网内 → 按钮灰色不可点击,并提示可通过 SSLVPN 连接校园网
  • 学工号认证:通过华东理工大学学工号邮箱自动验证在校身份
    • @mail.ecust.edu.cn 学生邮箱:8 位学号(本科生)或 Y + 8 位学号(研究生)
    • @ecust.edu.cn 教职工邮箱:5 位数字工号
    • 本科生:毕业日期(入学年+4 的 6 月 30 日)未过方可通过
    • 研究生:毕业日期(入学年+2 的 6 月 30 日)未过方可通过(默认按两年学制,其他请通过 IP 验证)
    • 教职工:直接通过
  • 有效期智能计算:学工号认证时,有效期取「正常有效期」和「毕业年 6 月 30 日」中的较早者,避免临近毕业的学生获得超出在校时间的有效期
  • 认证有效期默认 365 天,可在管理后台调整
  • 有效期过期后需重新认证续期
  • 管理后台可查看所有用户的在校状态统计和详细列表(含过期时间、认证方式)
  • 管理后台支持按状态筛选用户(在校 / 已过期 / 未认证)
  • 支持同时配置 IPv4 和 IPv6 CIDR 网段,也支持直接填写单个 IP 地址
  • 认证福利:管理员可在后台配置 Markdown 格式的福利信息,展示在认证页面右侧
  • 注册自动认证:用户通过 BlessingSkin 原生注册时,若邮箱符合学工号规则将自动认证
  • 一键批量验证:管理后台提供一键验证按钮,对未认证用户批量进行学工号认证
  • 插件联动接口:提供 AutoVerifier::verify() 静态方法供其他插件调用

使用方式

用户端

  1. 登录后,在侧边栏点击「在校认证」
  2. 页面会自动检测当前网络环境和学工号身份
  3. 认证方式二选一:
    • IP 认证:如果处于校园网内,点击「认证为在校用户」按钮;不在校内时可通过 SSLVPN 连接后认证
    • 学工号认证:如果邮箱符合学工号要求,点击「通过学工号认证」按钮
  4. 已认证用户可点击续期刷新有效期
  5. 页面右侧展示管理员配置的认证福利信息

管理后台

在插件配置页面可以:

  • 校园网 IP 段:每行填写一个 CIDR 或单个 IP 地址,支持 IPv4 和 IPv6 混合,例如:
    10.0.0.0/8
    172.16.0.0/12
    192.168.1.100
    2001:da8::/32
    ::1
    

    直接填写 IP 地址时,IPv4 自动视为 /32,IPv6 自动视为 /128,即仅匹配该地址本身。

  • 有效期(天):在校认证的有效天数,默认 365
  • 认证福利:使用 Markdown 语法编写福利信息,展示在用户认证页面右侧。留空则不显示福利版块。
  • 查看在校/已过期/未认证用户统计
  • 查看用户在校状态详细列表(含认证时间、过期时间、认证IP/方式)
  • 按状态快速筛选用户(全部 / 在校 / 已过期 / 未认证)
  • 一键学工号验证:对未认证用户批量进行学工号邮箱验证,仅符合规则的会被自动认证

配置项

配置键 默认值 说明
campus_status_cidr_ranges (空) 校园网 IP 段,每行一个 CIDR 或 IP 地址
campus_status_validity_days 365 在校状态有效天数
campus_status_benefits (空) 认证福利,Markdown 格式,留空不显示

数据表

插件启用时会自动创建 campus_status_records 表:

字段 类型 说明
uid INT UNSIGNED (主键) 用户 UID
ip VARCHAR(45) (可空) 认证IP/方式
verified_at TIMESTAMP (可空) 认证时间
expires_at TIMESTAMP (可空) 过期时间
  • 用户首次认证时插入记录,再次认证时更新 ipverified_atexpires_at
  • 在校状态是否有效通过 expires_at > 当前时间 判断
  • ip 字段同时记录认证方式:实际 IP 地址表示 IP 认证,email 表示学工号认证,manual 表示管理员手动认证

数据库迁移

  • 新安装:插件启用时自动创建包含 expires_at 列的完整表
  • 旧版升级bootstrap.php 首次请求时检测 expires_at 列是否存在,缺失时自动添加并根据已有 verified_at 回填过期时间,完成后缓存标记不再重复执行

学工号认证规则

系统通过用户注册邮箱的域名和本地部分自动判断学工号类型:

邮箱域名 本地部分格式 身份类型 年限校验
@mail.ecust.edu.cn 8 位纯数字(前两位为入学年份) 本科生 毕业日期(入学年+4 的 6 月 30 日)未过
@mail.ecust.edu.cn Y/y + 8 位数字(第3-4位为入学年份) 研究生 毕业日期(入学年+2 的 6 月 30 日)未过
@ecust.edu.cn 5 位纯数字 教职工 无需年限校验,直接通过

研究生默认按两年学制计算在校年限,其他学制请通过 IP 验证,请谅解。

有效期计算

  • IP 认证 / 手动认证:有效期 = 认证时间 + 有效天数
  • 学工号认证:有效期 = min(认证时间 + 有效天数, 毕业年 6 月 30 日 23:59:59)

举例:2022 级本科生在 2026 年 5 月通过学工号认证(有效期 365 天):

  • 正常有效期 → 2027-05-28
  • 毕业日期 → 2026-06-30 23:59:59
  • 实际有效期 → 2026-06-30 23:59:59

自动认证

原生注册自动认证

用户通过 BlessingSkin 原生注册流程注册时,若邮箱符合学工号规则,将自动完成在校认证。

其他插件联动

本插件提供 CampusStatus\Services\AutoVerifier 类供其他插件调用:

use CampusStatus\Services\AutoVerifier;

// 通过学工号邮箱验证用户,返回 bool
AutoVerifier::verify(int $uid, string $email): bool;

// 通过 IP 地址验证用户,返回 bool
AutoVerifier::verifyByIp(int $uid, string $ip): bool;

建议使用前先检查类是否存在:

if (class_exists(\CampusStatus\Services\AutoVerifier::class)) {
    $autoVerifier = \CampusStatus\Services\AutoVerifier::class;

    // 单独使用:学工号认证
    $autoVerifier::verify($user->uid, $user->email);

    // 单独使用:IP 认证
    $autoVerifier::verifyByIp($user->uid, $userIp);

    // 组合使用:注册时双通道认证,任一通过即标记在校
    $ipResult = $autoVerifier::verifyByIp($user->uid, $userIp);
    $emailResult = $autoVerifier::verify($user->uid, $user->email);

    if ($ipResult || $emailResult) {
        // 用户已通过在校认证
    }
}

例如 auth-ecust 插件可在后台开启「注册时自动学工号认证」,在用户首次注册时自动调用本接口。

IP 获取

插件优先读取 EO-Connecting-IP 请求头(腾讯云 EdgeOne CDN 传递的真实客户端 IP),如果该头不存在则回退到 request()->ip()

安装

campus-status 目录放入 BlessingSkin 的 plugins/ 目录下,然后在管理后台启用插件即可。

要求

  • BlessingSkin Server >= 6.0
  • PHP >= 8.0

About

Campus Status - 在校状态校验,BlessingSkin Server 6 插件,通过 IP 或学工号校验用户在校状态。

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors