51 lines
4.3 KiB
Markdown
51 lines
4.3 KiB
Markdown
## 目标
|
||
|
||
在后台「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 跟踪则一并纳入变更
|
||
- 按要求跳过真实视觉效果验收 |