Files
wordpress-theme-aksrt/.zcode/plans/plan-sess_9a435e5a-de87-4d0d-9a80-4da27ea60fea.md
T
2026-08-29 17:36:21 +08:00

4.3 KiB
Raw Blame History

目标

在后台「AKSRT → 功能&权限 → 下载配置」中新增总开关 enabled(switch,默认开启)。开启 = 现有本站 token 中转下载(/download/{token},别名/次数/有效期生效);关闭 = 直连模式,下载按钮直接渲染原始下载地址,不再生成本站中转链接。权限门控保留(未登录/未购买/非会员仍显示解锁提示,已确认)。不写迁移、不留死代码、不做真实视觉效果验收。

现状(调研结论)

  • 「下载配置」是 SPA 通用 schema 页(SchemaPage.vue),PHP schema 在 src/Admin/Schema/SchemaPermissions.php:73-85(option aksrt_download_config),前端镜像在 assets/admin/src/schema/sections/permissions/index.js:246-269
  • 下载链路:按钮 data-action="aksrt-download" → POST /aksrt/v1/download/request(src/Content/Download.php:215)签发 token → 返回 home_url('/别名/{token}') → rewrite + maybe_serve_download() 中转(本地流式/302 外链)
  • 发现死代码:rest_policy() + /download/policy 路由(全库无调用方)、aksrt_is_download_alone_page_enabled()(inc/helpers/aksrt-pay.php:921,无调用方)

变更清单

1. src/Admin/Schema/SchemaPermissions.php(PHP 权威 schema)

  • download section version 1.0.0 → 1.1.0
  • groups 重构(仿 login/moderation 模式):新 basic 组「下载总开关」,字段 enabled(switch,default true,help 说明「关闭后下载采用直连,下方链接规则不生效」);原 url_alias/default_max_uses/ttl_minutes 移入 rules 组「链接规则」,各加 dependsOn: {key: 'enabled', value: true}

2. assets/admin/src/schema/sections/permissions/index.js(前端镜像)

  • download.defaults 增加 enabled: true;groups 同步 PHP 双组结构(switch + dependsOn);更新 description

3. src/Content/Download.php

  • 新增 public function is_enabled(): bool:读 aksrt_download_config,enabled 键缺失视为开启(默认 true),否则 !empty() 判定(与 PostDisplay 等现有默认 true 惯用法一致)
  • 关闭时提前 return:register_rewrite()(不注册路由)、register_routes()(不注册 /download/request)、maybe_serve_download()(旧 token 链接失效,含 ?aksrt_dl_token= 直查)
  • 删除死代码:rest_policy() 方法与 /download/policy 路由注册
  • token 签发/流式输出等开启路径逻辑不动(现有契约测试正则不受影响)

4. templates/parts/resource-download-box.php

  • 顶部计算 $direct_download(class_exists 守卫 + is_enabled() 取反)
  • 下载源循环:直连模式且非 need_login 时,渲染 <a href="{原始url}" target="_blank" rel="nofollow noopener">(保留网盘识别徽章/着色),提取码旁复用全局 clipboard 委托渲染复制按钮(data-clipboard-text,main.min.js 已全局处理);need_login 分支不变
  • 直连模式下 $captcha_active 置 false(验证码容器成死 UI)
  • 独立下载页入口(down_alone_page)是独立功能,不与本开关耦合

5. inc/helpers/aksrt-pay.php

  • aksrt_get_paid_download_actions_html():直连模式渲染 <a class="but ..."> 直链替代 token 按钮;提取码/复制按钮逻辑不变
  • 删除死代码 aksrt_is_download_alone_page_enabled()

6. tests/widget-system/download-config-contract.test.cjs(扩展契约测试)

  • 字段对齐测试加入 enabled => true(PHP)/ enabled: true(JS)
  • 新增断言:Download.php 含 is_enabled 守卫;/download/policy 已移除;直连模式下盒模板与付费卡函数含直链 <a> 渲染分支

行为语义(写入代码注释与测试预期)

  • 默认开启,存量站点零感知(不迁移 option,键缺失即 true)
  • 关闭后:无下载计次、无免费额度扣减、无下载就绪通知、无验证码——直连语义的自然结果
  • 关闭后旧 /download/{token} 链接全部失效

验证

  • php -l 检查所有改动的 PHP 文件
  • node --test tests/widget-system/download-config-contract.test.cjs,并跑 pay-card-contract、post-visual-contract 确认无回归
  • cd assets/admin && npm run build 重建 SPA(前端 schema 变更需构建生效);若 assets/admin/build/ 被 git 跟踪则一并纳入变更
  • 按要求跳过真实视觉效果验收