feat: add public resource support, usage filtering, and recordDownload API

This commit is contained in:
2026-05-20 18:24:04 +08:00
parent 8d015fa962
commit 03b80310f6
2 changed files with 97 additions and 16 deletions
@@ -10,7 +10,7 @@ use think\facade\Db;
class AssetAppController extends BaseApiController
{
// 所有接口都免框架登录验证(使用独立 asset_token 体系,在方法内自行校验)
public array $notNeedLogin = ['login', 'getResourceList', 'changePassword'];
public array $notNeedLogin = ['login', 'getResourceList', 'changePassword', 'recordDownload'];
/** token 有效期:7 天 */
const TOKEN_EXPIRE = 86400 * 7;
@@ -98,32 +98,53 @@ class AssetAppController extends BaseApiController
}
/**
* @notes 获取用户关联的资源列表
* @notes 获取用户关联的资源列表 (或公开资源)
*/
public function getResourceList()
{
$user = $this->getAssetUser();
if (!$user) {
return $this->fail('登录已过期,请重新登录', [], -1);
}
$type = $this->request->get('type', 1);
$pageNo = $this->request->get('page_no', 1);
$pageSize = $this->request->get('page_size', 20);
$days = (int)$this->request->get('days', 0);
$usageStatus = (int)$this->request->get('usage_status', 0); // 0=全部, 1=未使用, 2=已使用
$query = AssetResource::where('type', $type);
$usedResourceIds = [];
if ($user) {
// 登录用户:只看自己的专属资源
$resourceIds = AssetUserResource::where('user_id', $user->id)->column('resource_id');
if (empty($resourceIds)) {
return $this->data([
'lists' => [],
'count' => 0,
'page_no' => $pageNo,
'page_size' => $pageSize,
]);
return $this->data(['lists' => [], 'count' => 0, 'page_no' => $pageNo, 'page_size' => $pageSize]);
}
$query = $query->whereIn('id', $resourceIds);
// 获取该用户的使用记录
$usedResourceIds = \think\facade\Db::name('asset_resource_usage')
->where('user_id', $user->id)
->column('resource_id');
// 使用状态过滤
if ($usageStatus === 1) { // 未使用
if (!empty($usedResourceIds)) {
$query = $query->whereNotIn('id', $usedResourceIds);
}
} elseif ($usageStatus === 2) { // 已使用
if (empty($usedResourceIds)) {
return $this->data(['lists' => [], 'count' => 0, 'page_no' => $pageNo, 'page_size' => $pageSize]);
}
$query = $query->whereIn('id', $usedResourceIds);
}
} else {
// 游客(未登录):只看公开资源(没关联给任何用户的资源)
$associatedResourceIds = AssetUserResource::column('resource_id');
if (!empty($associatedResourceIds)) {
$query = $query->whereNotIn('id', $associatedResourceIds);
}
}
$query = AssetResource::whereIn('id', $resourceIds)->where('type', $type);
// 时间过滤
if ($days > 0) {
$startTime = strtotime("-{$days} days", strtotime(date('Y-m-d')));
$query = $query->where('create_time', '>=', $startTime);
@@ -133,7 +154,13 @@ class AssetAppController extends BaseApiController
$lists = (clone $query)
->order('id', 'desc')
->page($pageNo, $pageSize)
->select();
->select()
->toArray();
// 附加 is_used 字段
foreach ($lists as &$item) {
$item['is_used'] = in_array($item['id'], $usedResourceIds);
}
return $this->data([
'lists' => $lists,
@@ -143,6 +170,52 @@ class AssetAppController extends BaseApiController
]);
}
/**
* @notes 记录资源下载/使用
*/
public function recordDownload()
{
$user = $this->getAssetUser();
if (!$user) {
return $this->fail('请先登录', [], -1);
}
$resourceId = $this->request->post('resource_id');
if (empty($resourceId)) {
return $this->fail('参数缺失');
}
// 检查资源是否存在
$resource = AssetResource::find($resourceId);
if (!$resource) {
return $this->fail('资源不存在');
}
// 检查是否有关联权限 (或者是公开资源)
$isAssociated = AssetUserResource::where('user_id', $user->id)->where('resource_id', $resourceId)->find();
$isPublic = !AssetUserResource::where('resource_id', $resourceId)->find();
if (!$isAssociated && !$isPublic) {
return $this->fail('无权操作此资源');
}
// 记录下载
$exists = \think\facade\Db::name('asset_resource_usage')
->where('user_id', $user->id)
->where('resource_id', $resourceId)
->find();
if (!$exists) {
\think\facade\Db::name('asset_resource_usage')->insert([
'user_id' => $user->id,
'resource_id' => $resourceId,
'create_time' => time()
]);
}
return $this->success('记录成功');
}
/**
* @notes 修改密码
*/
+8
View File
@@ -0,0 +1,8 @@
CREATE TABLE `zyt_asset_resource_usage` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(11) unsigned NOT NULL COMMENT '用户ID',
`resource_id` int(11) unsigned NOT NULL COMMENT '资源ID',
`create_time` int(11) DEFAULT '0' COMMENT '使用/下载时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_user_resource` (`user_id`, `resource_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='私密资产-资源使用记录表';