## 目标
在后台「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 时,渲染 ``(保留网盘识别徽章/着色),提取码旁复用全局 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()`:直连模式渲染 `` 直链替代 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` 已移除;直连模式下盒模板与付费卡函数含直链 `` 渲染分支
## 行为语义(写入代码注释与测试预期)
- 默认开启,存量站点零感知(不迁移 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 跟踪则一并纳入变更
- 按要求跳过真实视觉效果验收