- 18 张公共表更名(addon/attachment/configure/links/spider_log/spider_stat/sms/notice/ad/task/prop/medal/help/card -> common_*,member_wallets->member_wallet,score_rule/score_log -> member_*,addon_config->common_addonconf),模型全部对齐新表名,Db 直引用清零 - Attachment 模型补 表名绑定,修复富文本上传查 wxapp_attachment 1146 隐患 - install.sql + 迁移 SQL:backend_admin/backend_role delete_at 默认 0,修复软删除(NULL != 0)误过滤导致后台菜单为空 - AppService::boot() 支持插件 info.php 声明 commands 自动注册插件命令(psr-4 自动加载,坏类名自动跳过) - 各插件(haonav/mqttbroker/wxchat/articles/blog/forum 等)字段与配置同步调整 - 框架版本 1.1.0 -> 1.1.1
67 lines
2.0 KiB
PHP
67 lines
2.0 KiB
PHP
<?php
|
|
|
|
declare (strict_types = 1);
|
|
|
|
namespace addon\download\service;
|
|
|
|
use think\facade\Cache;
|
|
use think\facade\Db;
|
|
use addon\download\model\Resource;
|
|
|
|
/**
|
|
* 下载核心服务:计数 + 防盗链 + 本地/外链分发。
|
|
*/
|
|
class DownloadService
|
|
{
|
|
/**
|
|
* 触发下载:返回 ['type'=>'redirect','url'=>...] 或 ['type'=>'file','path'=>...]
|
|
* @param int $id 资源ID
|
|
* @param string $clientIp 客户端IP(用于防刷)
|
|
* @return array
|
|
* @throws \think\Exception
|
|
*/
|
|
public static function dispatch(int $id, string $clientIp): array
|
|
{
|
|
$resource = Resource::find($id);
|
|
if (!$resource || $resource->status != 1 || $resource->is_audit != 1) {
|
|
throw new \think\Exception('资源不存在或已下架');
|
|
}
|
|
|
|
// 防刷:同 IP + 同资源 5 秒内不重复计数
|
|
$lockKey = 'dl_lock_' . md5($clientIp . '_' . $id);
|
|
if (!Cache::get($lockKey)) {
|
|
Db::name('download_resource')
|
|
->where('id', $id)
|
|
->inc('downloads', 1)
|
|
->update();
|
|
Cache::set($lockKey, 1, 5);
|
|
}
|
|
|
|
if ((int)$resource->is_local === 1) {
|
|
// 本地文件:返回服务器绝对路径,由控制器做流式输出
|
|
$root = app()->getRootPath() . 'public';
|
|
$path = $root . $resource->file_url;
|
|
if (!is_file($path)) {
|
|
throw new \think\Exception('文件不存在');
|
|
}
|
|
return ['type' => 'file', 'path' => $path, 'name' => $resource->title];
|
|
}
|
|
|
|
if (empty($resource->file_url)) {
|
|
throw new \think\Exception('下载地址为空');
|
|
}
|
|
return ['type' => 'redirect', 'url' => $resource->file_url];
|
|
}
|
|
|
|
/**
|
|
* 查看计数(详情页调用)
|
|
*/
|
|
public static function incClicks(int $id): void
|
|
{
|
|
Db::name('download_resource')
|
|
->where('id', $id)
|
|
->inc('clicks', 1)
|
|
->update();
|
|
}
|
|
}
|