附件权限

附件权限

为单个附件独立配置下载权限,支持 6 种权限类型

插件 v1.2.1 贰先生 积分 阅读 付费 20 金币

xnx_attach_access 附件权限

功能

  • 为单个附件独立配置下载权限,支持 6 种权限类型:

    • public 公开(默认)

    • login 登录可见

    • credit 积分购买(按 enabled_credits_typesdefault_price 配置扣费)

    • reply 回复可见(用户在该附件所属主题下有回帖)

    • group 指定用户组(按 permission_params.gids 放行)

    • medal 拥有勋章可见(按 permission_params.medal_ids 放行,依赖 xnx_medal 勋章插件,单选一个勋章)

  • 购买与退款:用户积分扣费购买后写入 xnx_attach_access_purchaseUNIQUE KEY (aid,uid));退款时 status=0 但保留记录,重新购买走 ON DUPLICATE KEY UPDATE 复原

  • 豁免规则:管理员(gid=1/2)与附件作者(attach.uid)自动放行

  • 下载拦截:在 attach_download_start hook 拦截下载入口,未通过 checkAccess 直接 message(-1) 阻止

  • 多入口注入:

    • 发帖/编辑帖时附件列表 model_post_file_list_html_end 注入「权限配置」按钮

    • 主题页 thread_end.htm / 帖子页 post_ref_thread_after.htm 渲染权限标识与解锁提示

    • 帖子 JS post_js.htm / 主题 JS thread_js.htm 注入购买/查询交互

  • 级联清理:删帖(model_thread_delete_start / model_post_delete_start)时自动清理对应附件的权限记录

  • 后台路由 admin_attach_access 提供统计/管理面板(仅 gid=1/2)

  • 前台路由 attach-access-purchase(POST 扣费购买)/ attach-access-status(GET 查询访问状态)

  • 缓存:权限数据与购买状态均使用「版本号 + 数据」双层缓存(版本号 86400 秒、数据 3600 秒),写操作通过 bumpPermissionVersion / bumpPurchasedVersion 失效

文件结构

plugin/xnx_attach_access/
├── conf.json
├── install.php / uninstall.php
├── model/AttachAccessService.php
├── route/
│   ├── admin_attach_access.php  (后台统计/管理面板)
│   └── attach_access.php        (前台 purchase / status 接口)
├── hook/
│   ├── model_inc_file.php
│   ├── model_route_table_end.php
│   ├── index_route_case_end.php
│   ├── admin_index_route_case_end.php
│   ├── attach_start.php
│   ├── attach_download_start.php     (下载入口拦截)
│   ├── attach_assoc_post_end.php
│   ├── model_attach_create_end.php
│   ├── model_post_delete_start.php
│   ├── model_post_update_end.php
│   ├── model_post_file_list_html_end.php
│   ├── model_thread_delete_start.php
│   ├── post_js.htm
│   ├── post_ref_thread_after.htm
│   ├── thread_end.htm
│   ├── thread_js.htm
│   ├── lang_zh_cn_bbs.php
│   ├── lang_zh_tw_bbs.php
│   └── lang_en_us_bbs.php
├── view/htm/
│   ├── setting.htm
│   ├── attach_access_modal.htm
│   └── attach_access_post_card.htm
└── static/js/
    ├── post_attach_access.js
    └── thread_attach_access.js

配置流程

  1. 后台启用插件(自动建 xnx_attach_access 权限表 + xnx_attach_access_purchase 购买表,写入 6 种类型默认开关与默认价格)

  2. 进入「插件设置」勾选启用的权限类型、允许的积分类型、默认价格

  3. 用户在发帖/编辑帖时点击附件旁「权限配置」按钮 → 弹窗选择类型与参数(如积分价格、用户组、勋章)

  4. 测试:游客访问附件下载链接 → 提示「请先登录 / 需回复 / 需购买 / 需勋章」;登录/回复/购买/获得勋章后下载放行;作者或管理员直接放行

升级说明(1.0.0 → 1.1.0)

  • 移除 vip 权限类型(VIP 专属),原 vip 权限数据自动迁移为 group 类型(保留原 vip_gids 作为 gids)

  • 新增 medal 权限类型(拥有勋章可见),依赖 xnx_medal 勋章插件,未安装时该类型不可用

  • 修复 group 指定用户组在发帖页权限配置弹窗中不显示用户组选项的 bug(db_find 返回关联数组未转索引数组导致 JS Array.isArray 判定为 false)

  • 清理已废弃的 vip_gids 配置字段

  • 升级流程通过 upgrade.php 幂等迁移,自动清理 tmp/model.min.php 编译缓存

升级说明(1.1.0 → 1.1.1)

  • medal 权限类型 UI 由 checkbox 多选改为 <select> 单选,消除"多选是 OR 还是 AND"的歧义

  • 字段 permission_params.medal_ids 结构不变(数组),新数据仅含单个元素;Service 层 foreach 兼容历史多选数据,无需迁移

  • 三语言包 select_medals 文案改为单数语义(“选择一个勋章” / “Select a Medal”)


截图 1
v1.2.1 2026-07-25
适配1.1.4版本
v1.2.1 2026-07-23
增加后台设置页面
v1.1.1 2026-07-22
medal 权限类型 UI 由 checkbox 多选改为 <select> 单选,消除"多选是 OR 还是 AND"的歧义



字段 permission_params.medal_ids 结构不变(数组),新数据仅含单个元素;Service 层 foreach 兼容历史多选数据,无需迁移



三语言包 select_medals 文案改为单数语义(“选择一个勋章” / “Select a Medal”)
v1.0.0 2026-07-19
补传源码
v1.0.0 2026-07-19
作者信息
贰先生
贰先生 贰先生
XIUNOX开发者
21
应用
300
安装
2026-06
加入
应用详情
应用分类 插件
版本 v1.2.1
适用版本 1.1
开发者 贰先生
下载量 15
浏览 390
更新时间 2026-07-28
发布时间 2026-07-19
最新回复 9
查看全部
  • 权威 Lv1
    支持一下作者
    1天前
  • yaoys Lv2
    支持支持,正好需要这个
    1天前
  • 支持支持
    8天前
  • yaoys Lv2
    支持支持
    8天前
  • 轩逸 Lv2
    学习一下
    10天前
  • 段先生 Lv3
    拿来学习一下插件的结构
    10天前
  • 哆哆 Lv2
    学习学习
    10天前
  • Laity Lv3
    支持一下
    11天前
  • AI Lv1

    感谢贰先生的分享!这款插件实现了细粒度的附件权限控制,特别是结合积分交易和 VIP 逻辑,扩展了社区的商业化潜力。

    架构上采用 hook 拦截与双层缓存机制,设计思路清晰。不过有几点建议供参考:

    1. 并发安全ON DUPLICATE KEY UPDATE 在高并发购买场景下可能导致竞态条件,建议配合数据库行锁或 Redis 分布式锁确保积分扣减与权限授予的事务一致性。
    2. 性能优化checkAccess 若在热点帖子中频繁查询数据库,即使有缓存也可能成为瓶颈,可考虑将高频访问的权限状态预热至内存对象缓存。
    3. 用户体验:退款逻辑保留记录是好的,但建议在 UI 上明确区分“已过期”与“未购买”,避免混淆。

    期待后续版本能增加批量配置功能,方便管理员对历史附件进行权限迁移。【以上由 AI 自动回复,仅供参考】

    11天前
查看全部评论 / 发表评论
完整评论功能在讨论帖中,点击前往