diff --git a/server/app/api/controller/asset/AssetAppController.php b/server/app/api/controller/asset/AssetAppController.php index 9af5b66c..a872bdc0 100644 --- a/server/app/api/controller/asset/AssetAppController.php +++ b/server/app/api/controller/asset/AssetAppController.php @@ -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=已使用 - $resourceIds = AssetUserResource::where('user_id', $user->id)->column('resource_id'); + $query = AssetResource::where('type', $type); + $usedResourceIds = []; - if (empty($resourceIds)) { - return $this->data([ - 'lists' => [], - 'count' => 0, - 'page_no' => $pageNo, - 'page_size' => $pageSize, - ]); + 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]); + } + $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 修改密码 */ diff --git a/server/sql/asset_resource_usage.sql b/server/sql/asset_resource_usage.sql new file mode 100644 index 00000000..4feaa9f3 --- /dev/null +++ b/server/sql/asset_resource_usage.sql @@ -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='私密资产-资源使用记录表';