feat: 新增客户端协议生成系统,支持8种主流下载工具

🚀 核心功能
- 新增完整的客户端下载链接生成器系统
- 支持ARIA2、Motrix、比特彗星、迅雷、wget、cURL、IDM、FDM、PowerShell等8种客户端
- 自动处理防盗链参数(User-Agent、Referer、Cookie等)
- 提供可扩展的生成器架构,支持自定义客户端

🔧 技术实现
- ClientLinkGeneratorFactory: 工厂模式管理生成器
- DownloadLinkMeta: 元数据存储下载信息
- ClientLinkUtils: 便捷工具类
- 线程安全的ConcurrentHashMap设计

🌐 前端集成
- 新增ClientLinks.vue界面,支持客户端链接展示
- Element Plus图标系统,混合图标显示
- 客户端检测逻辑优化,避免自动打开外部应用
- 移动端和PC端环境判断

📚 文档完善
- 完整的CLIENT_LINK_GENERATOR_GUIDE.md使用指南
- API文档和测试用例
- 输出示例和最佳实践

从单纯的网盘解析工具升级为完整的下载解决方案生态
This commit is contained in:
q
2025-10-24 09:25:57 +08:00
parent 231d5c3fb9
commit 42b721eabf
47 changed files with 3740 additions and 96 deletions

View File

@@ -91,6 +91,7 @@
<el-button style="margin-left: 20px" @click="generateMarkdown">生成Markdown</el-button>
<el-button style="margin-left: 20px" @click="generateQRCode">扫码下载</el-button>
<el-button style="margin-left: 20px" @click="getStatistics">分享统计</el-button>
<el-button style="margin-left: 20px" @click="goToClientLinks" type="primary">客户端链接(实验)</el-button>
</p>
</div>
@@ -589,6 +590,55 @@ export default {
}).catch(() => {
this.$message.error('复制失败');
});
},
// 跳转到客户端链接页面
async goToClientLinks() {
// 验证输入
if (!this.link.trim()) {
this.$message.warning('请先输入分享链接')
return
}
if (!this.link.startsWith("https://") && !this.link.startsWith("http://")) {
this.$message.error("请输入有效链接!")
return
}
try {
// 显示加载状态
this.isLoading = true
// 直接使用 axios 请求客户端链接 API因为它的响应格式与其他 API 不同
const params = { url: this.link }
if (this.password) params.pwd = this.password
const response = await axios.get(`${this.baseAPI}/v2/clientLinks`, { params })
const result = response.data
// 处理包装格式的响应
const clientData = result.data || result
if (clientData.success) {
// 将数据存储到 sessionStorage供客户端链接页面使用
sessionStorage.setItem('clientLinksData', JSON.stringify(clientData))
sessionStorage.setItem('clientLinksForm', JSON.stringify({
shareUrl: this.link,
password: this.password
}))
// 跳转到客户端链接页面
this.$router.push('/clientLinks')
this.$message.success('客户端链接生成成功,正在跳转...')
} else {
this.$message.error(clientData.error || '生成客户端链接失败')
}
} catch (error) {
console.error('生成客户端链接失败:', error)
this.$message.error('生成客户端链接失败')
} finally {
this.isLoading = false
}
}
},