From 910270dfb35756440281cba32cc5446e00f6889f Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 18 Jul 2024 11:42:55 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E8=B5=84=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/common.php | 17 ++++++++ app/controller/ResourceController.php | 21 +++++++--- app/controller/ResourceDirController.php | 19 +++++++++ app/model/Model.php | 2 + app/model/Resource.php | 63 +++++++++++++++++++++++++---- app/model/ResourceDir.php | 69 +++++++++++++++++++++++++------- app/validate/ResourceValidate.php | 2 + route/app.php | 6 ++- 8 files changed, 170 insertions(+), 29 deletions(-) diff --git a/app/common.php b/app/common.php index f2809a8..f2bcdb9 100644 --- a/app/common.php +++ b/app/common.php @@ -25,3 +25,20 @@ function dataReturn($code, $msg = 'success', $data = []) return ['code' => $code, 'data' => $data, 'msg' => $msg]; } + +// 递归函数来查找父级路径 +function findParent($obj, $id, &$path) +{ + // 查找当前文件夹的信息 + $resource_dir = $obj::where('id', $id)->where('type', 2)->find(); + + if ($resource_dir) { + // 将当前文件夹ID添加到路径 + $path[] = $resource_dir['id']; + + // 如果有父级ID,继续查找父级 + if (!is_null($resource_dir['parent_id'])) { + findParent($obj, $resource_dir['parent_id'], $path); + } + } +} diff --git a/app/controller/ResourceController.php b/app/controller/ResourceController.php index 725ab9a..1e8feca 100644 --- a/app/controller/ResourceController.php +++ b/app/controller/ResourceController.php @@ -105,18 +105,15 @@ class ResourceController /** * 资源 重命名 */ - public function rename(Resource $resource, Request $request, $id) + public function rename(Resource $resource, Request $request) { try { validate(ResourceValidate::class)->scene('rename')->check($request->param()); } catch (ValidateException $e) { return jsonReturn(-1, $e->getError()); } - try { - $resource_detail = $resource::find($id); - $resource_detail->name = $request->param('name'); - $resource_detail->save(); + $resource::whereIn('id', $request->param('ids'))->update(['name' => $request->param('name')]); return jsonReturn(0, Lang::get('成功')); } catch (\Exception $e) { return jsonReturn(-5, $e->getMessage()); @@ -126,8 +123,20 @@ class ResourceController /** * 资源 移动到 */ - public function moveTo() + public function moveTo(Resource $resource, Request $request) { + //保存到数据库 + Db::startTrans(); + try { + // 移动资源 + $res = $resource->moveTo($request->param('ids'), $request->param('to_id')); + Db::commit(); + } catch (\Exception $e) { + Db::rollback(); + return jsonReturn(-5, $e->getMessage()); + } + + return json($res); } /** diff --git a/app/controller/ResourceDirController.php b/app/controller/ResourceDirController.php index f1e97d3..349da6e 100644 --- a/app/controller/ResourceDirController.php +++ b/app/controller/ResourceDirController.php @@ -57,4 +57,23 @@ class ResourceDirController return json($res); } + + + /** + * 文件夹 重命名 + */ + public function rename(Resource $resource, Request $request) + { + try { + validate(ResourceValidate::class)->scene('rename_dir')->check($request->param()); + } catch (ValidateException $e) { + return jsonReturn(-1, $e->getError()); + } + try { + $resource::whereIn('id', $request->param('ids'))->update(['name' => $request->param('name')]); + return jsonReturn(0, Lang::get('成功')); + } catch (\Exception $e) { + return jsonReturn(-5, $e->getMessage()); + } + } } diff --git a/app/model/Model.php b/app/model/Model.php index 18c7d1d..b090112 100644 --- a/app/model/Model.php +++ b/app/model/Model.php @@ -17,6 +17,7 @@ use think\Model as BaseModel; class Model extends BaseModel { // msg + public $moveMsg; public $getMsg; public $addMsg; public $updateMsg; @@ -48,6 +49,7 @@ class Model extends BaseModel $this->className = $this->getClassName(); $this->listCacheKey = $this->className . '_cache_list'; $this->detailCacheKey = $this->className . '_cache_detail'; + $this->moveMsg = lang('移动成功'); $this->getMsg = lang('获取成功'); $this->addMsg = lang('添加成功'); $this->updateMsg = lang('修改成功'); diff --git a/app/model/Resource.php b/app/model/Resource.php index 8e32d63..d61976d 100644 --- a/app/model/Resource.php +++ b/app/model/Resource.php @@ -35,8 +35,6 @@ class Resource extends Model public function addResource($param): array { try { - //添加资源的前置操作 - $param = $this->beforeAddResource($param); //插入资源表 $resource = self::create($param); //存在授权文件 插入授权文件表 @@ -45,6 +43,9 @@ class Resource extends Model } //插入素材表 (new File())->addFile($resource, $param['files'], $param['file_input_mode']); + + //添加资源的后置操作 + $this->afterAddResource($resource); } catch (\Exception $e) { throw new ModelException($e->getMessage()); } @@ -52,14 +53,62 @@ class Resource extends Model } /** - * @param $param 前端提交的参数 + * @param $resource 资源对象 * @return array - * 添加资源前的操作 + * 添加资源后的的操作 */ - public function beforeAddResource($param) + public function afterAddResource($resource) { - $param['size'] = (new File())->getFileSize($param['files']); + //根据素材 更新资源大小 数量 + $file_size_and_count = $this->getFileSizeAndCount($resource); + $resource->file_size = $file_size_and_count['file_size']; + $resource->file_count = $file_size_and_count['file_count']; //todo 还有状态的啥的 - return $param; + $resource->save(); + } + + /** + * @param $ids 需要移动的资源ids + * @param $to_id 文件夹id + * @return array + * 移动操作 + */ + public function moveTo($ids, $to_id) + { + foreach ($ids as $resource_id) { + $resource = $this::find($resource_id); + if ($resource->parent_id == $to_id) { + //移动到同文件夹 无需操作 + continue; + } + //1 更新原文件夹 以及所有父文件夹 大小和数量 + (new ResourceDir())->changeDirSizeAndCount($resource, $resource->parent_id, '-'); + + //2 更新parent_id + $resource->parent_id = $to_id; + $resource->save(); + + //3 更新 新的文件夹 以及所有父文件夹 大小和数量 + (new ResourceDir())->changeDirSizeAndCount($resource, $to_id, '+'); + } + return dataReturn($this->sucCode, $this->moveMsg); + } + /** + * @param $resource 资源对象 + * @return array + * 获取一个资源的大小(所有素材大小的总和) 和包含的素材数量 + */ + public function getFileSizeAndCount($resource) + { + $size = 0; + $count = 0; + foreach ($resource->files as $file) { + $size += $file['size']; + $count++; + } + return [ + 'file_size' => $size, + 'file_count' => $count, + ]; } } diff --git a/app/model/ResourceDir.php b/app/model/ResourceDir.php index 1dbb548..a171f54 100644 --- a/app/model/ResourceDir.php +++ b/app/model/ResourceDir.php @@ -17,11 +17,15 @@ class ResourceDir extends Model public function addResourceDir($param): array { try { - $resource = self::create($param); + $resource_dir = self::create($param); + + //更新id_path + $resource_dir->id_path = $this->getResourceDirIdPath($resource_dir->id); + $resource_dir->save(); } catch (\Exception $e) { throw new ModelException($e->getMessage()); } - return dataReturn($this->sucCode, $this->addMsg, $resource->id); + return dataReturn($this->sucCode, $this->addMsg, $resource_dir->id); } /** @@ -37,23 +41,60 @@ class ResourceDir extends Model ->select(); return $resource_list; } + /** - * @param $folderId 文件夹id + * @param $resource 资源 + * @param $resource_dir_id 移入/移出的文件夹id + * @param $resource_dir_id method + 移入 - 移除 * @return array - * 递归获取一个文件夹下所有ids + * 将一资源移入或者移出文件夹 文件夹修改资源数量 和 资源大小 */ - public function getFolderIds($folderId) + public function changeDirSizeAndCount($resource, $resource_dir_id, $method = '+') { - $folderIds = []; - // 获取直接子文件夹 - $sub_folders = Resource::where('parent_id', $folderId) - ->where('type', 2) - ->select(); - foreach ($sub_folders as $subfolder) { - $folderIds[] = $subfolder['id']; - $folderIds = array_merge($folderIds, $this->getFolderIds($subfolder['id'])); + $resource_dir = $this::find($resource_dir_id); + if ($method === '+') { + $this::whereIn('id', $resource_dir['id_path'])->inc('resource_size', $resource->file_size) + ->inc('resource_count', 1) + ->update(); + } elseif ($method === '-') { + $this::whereIn('id', $resource_dir['id_path'])->dec('resource_size', $resource->file_size) + ->dec('resource_count', 1) + ->update(); } + } - return $folderIds; + /** + * @param $resource_dir_id 文件夹id + * 获取文件夹 id_path(从顶级文件夹到自己的路径) + */ + public function getResourceDirIdPath($resource_dir_id) + { + $path = []; + // 调用递归函数 + findParent($this, $resource_dir_id, $path); + // 反转路径数组,使顶级文件夹在前 + return implode(',', array_reverse($path)); } + + + + // /** + // * @param $folderId 文件夹id + // * @return array + // * 递归获取一个文件夹下所有ids + // */ + // public function getFolderIds($folderId) + // { + // $folderIds = []; + // // 获取直接子文件夹 + // $sub_folders = Resource::where('parent_id', $folderId) + // ->where('type', 2) + // ->select(); + // foreach ($sub_folders as $subfolder) { + // $folderIds[] = $subfolder['id']; + // $folderIds = array_merge($folderIds, $this->getFolderIds($subfolder['id'])); + // } + + // return $folderIds; + // } } diff --git a/app/validate/ResourceValidate.php b/app/validate/ResourceValidate.php index 319a449..a5458b8 100644 --- a/app/validate/ResourceValidate.php +++ b/app/validate/ResourceValidate.php @@ -33,6 +33,8 @@ class ResourceValidate extends Validate 'rename' => ['name'], 'save_dir' => ['name'], //新增文件夹 + 'rename_dir' => ['name'], //重命名文件夹 + // 'setStatus' => ['id', 'status'], ]; diff --git a/route/app.php b/route/app.php index 0a15ad2..b471a3c 100644 --- a/route/app.php +++ b/route/app.php @@ -21,12 +21,14 @@ Route::group('resource', function () { Route::post('/save', 'save'); Route::get('/detail/:id', 'detail'); Route::get('/share/:id', 'share'); - Route::post('/rename/:id', 'rename'); + Route::post('/rename', 'rename'); + Route::post('/move_to', 'moveTo'); })->prefix('resource/'); Route::group('resourceDir', function () { Route::get('/index', 'index'); - Route::post('/save', 'save'); + Route::post('/save', 'save'); //新建文件夹 子文件夹 + Route::post('/rename', 'rename'); })->prefix('resourceDir/'); Route::group('oss', function () {