试卷后台与下载鉴权:后台三页、积分扣费、签名防盗链
试卷能在后台新增、换附件、上下架,下载要过签名、时间戳、登录和积分四道关,积分不足引导扫码看广告。
- 后台新增「试卷管理」分组:试卷管理 / 试卷分类 / 试卷标签三页,三张表注册进通用 CRUD 白名单;列表支持按学科分组筛选标签、按编号 / 标题 / 时间 / 大小 / 状态排序、批量上下架。
- 「上传试卷」把附件传到 public/static/uploads/shijuan/,编辑弹窗补齐附件、授权方式、资源类型与上架状态;数据库升到 v81 给 shijuan_item 补 file / license / rtype / status / update_time 五列,老库缺列时后台保存会静默丢掉附件与授权信息。
- 系统设置新增「试卷设置」:下载总开关、下载需登录、下载扣积分、每次消耗积分、看一次广告得多少积分、积分不足可看广告、小程序二维码上传 / 清空 / 预览;数值限定 0 - 10000,开启扣积分时自动强制登录。
- 下载只认 POST:把下载地址复制到地址栏直接打开会看到一张友好的拒绝页,真正的文件必须由详情页脚本带请求头发起,GET 只用来接住误操作。
- 签名防盗链:渲染附件地址时拼 exp(15 分钟)与 sign(HMAC-SHA256,绑定文件 / 栏目 / 过期时间 / 当前登录用户),换账号、改文件名、过一会儿再点都会失败;参数名刻意避开 e 和 s,因为 s 是 ThinkPHP 的 pathinfo 变量名,出现在查询串里会把路由覆盖成 404。
- 请求头令牌:X-Nav-Ts 与服务器时间相差超过 5 分钟就拒绝;开启加密传输后还要求 X-Nav-Kid / X-Nav-Pub 与当前会话一致,前端遇到 419 会重新握手再重试一次。
- 积分与「会员与积分」「用户中心」共用 user.points,不另设账户;扣费走 nav_points_change 并落流水(ref = sjk:栏目:文件名),积分不足直接拒绝,不会出现扣成负数。
- 详情页把下载门槛分成 off / login / points 三种锁:未开放只提示维护中,游客引导登录,积分不足弹小程序二维码引导看广告;前端下载成功后就地扣减页面积分显示并锁 5 秒,连点多个下载按钮也只执行一次。
