feat: 公共表更名 common/member 前缀 + 插件命令自动加载 + 版本 1.1.1

- 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
This commit is contained in:
ywxapp
2026-08-20 20:19:15 +08:00
parent 303f548664
commit 1d49e6f5ee
395 changed files with 13342 additions and 2012 deletions
@@ -0,0 +1,66 @@
<?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();
}
}