阅读配额与会员升级
概述
mdView 内置了基于角色的阅读配额系统,不同等级的用户在一定时间段内只能阅读指定数量的文章,超出后引导升级会员。
架构
用户请求文档
│
▼
view/index.php 或 share.php
│
├─ Permission 检查(文档等级门禁) ← 现有逻辑
│
├─ ReadingQuota::canRead() ← 配额检查
│ ├─ 查 reading_logs 表 → 统计当日/当周/当月已读数
│ ├─ 查 settings.reading_quota_config → 当前角色配额上限
│ └─ 超限 → 渲染超额引导页(含升级按钮)
│
├─ ReadingQuota::logRead() ← 记录阅读(同日同文去重)
│
└─ 正常渲染文档
数据模型
reading_logs 表
去重规则:同一用户 + 同一文档 + 同一自然日 = 计 1 次。
settings 表配置
key = reading_quota_config,value 为 JSON:
{
"visitor": {"daily": 3, "weekly": 10, "monthly": 30, "upgrade": "member"},
"viewer": {"daily": 5, "weekly": 20, "monthly": 50, "upgrade": "member"},
"member": {"daily": 30, "weekly": 100, "monthly": 300, "upgrade": "premium"},
"premium": {"daily": 0, "weekly": 0, "monthly": 0, "upgrade": ""},
"editor": {"daily": 0, "weekly": 0, "monthly": 0, "upgrade": ""},
"super_admin": {"daily": 0, "weekly": 0, "monthly": 0, "upgrade": ""}
}
daily / weekly / monthly:配额上限,0 = 无限upgrade:超额时推荐的升级角色 slug角色体系
核心类:ReadingQuota
超额提示页
当用户阅读数超出配额时,页面展示:
/upgrade升级页 /upgrade
展示会员套餐对比卡片,包含:
后台管理 /admin/reading-quota
管理员可在后台直接修改各角色的阅读配额:
settings.reading_quota_config(即时生效,无需重启)调用方式
前台页面
view/index.php 和 share.php 中,在权限检查后、渲染前插入:
$quota = new ReadingQuota();
$userId = $quota->getUserId();
$roleSlug = $quota->getUserRoleSlug();
$ip = ReadingQuota::getIp();
if (!$quota->canRead($userId, $roleSlug, $filePath, $ip)) {
renderQuotaExceeded($title, $tree, $filePath, $quota, $roleSlug);
return;
}
$quota->logRead($userId, $filePath, $ip);
判断逻辑(canRead 内部)
reading_logs 当日/当周/当月去重文章数边界场景
与 Permission 的关系
两者正交:先过 Permission 门禁(不过则截断预览),再过 Quota 限流(超过则引导升级)。