diff --git a/app/controller/ResourceController.php b/app/controller/ResourceController.php index e243f1d..06ebe11 100644 --- a/app/controller/ResourceController.php +++ b/app/controller/ResourceController.php @@ -3,6 +3,7 @@ namespace app\controller; use app\model\Resource; +use app\service\ResourceService; use app\validate\ResourceValidate; use think\facade\Db; use think\facade\Lang; @@ -11,7 +12,6 @@ use think\Request; class ResourceController { - /** * 全部资源 列表 */ @@ -53,7 +53,7 @@ class ResourceController /** * 全部资源 新增 */ - public function save(Resource $resource, Request $request) + public function save(Request $request) { // 数据验证 try { @@ -73,7 +73,7 @@ class ResourceController Db::startTrans(); try { // 1. 保存站点到数据库 - $res = $resource->addResource($request->param()); + $res = (new ResourceService())->addResource($request->param()); Db::commit(); } catch (\Exception $e) { @@ -97,9 +97,19 @@ class ResourceController /** * 资源 分享 */ - public function share($id) + public function share(Resource $resource, Request $request) { - dd($id); + try { + validate(ResourceValidate::class)->scene('share')->check($request->param()); + } catch (ValidateException $e) { + return jsonReturn(-1, $e->getError()); + } + try { + $resource->addResourceShare($request->param(), $request->user_id); + return jsonReturn(0, Lang::get('成功')); + } catch (\Exception $e) { + return jsonReturn(-5, $e->getMessage()); + } } /** @@ -123,13 +133,13 @@ class ResourceController /** * 资源 移动到 */ - public function moveTo(Resource $resource, Request $request) + public function moveTo(Request $request) { //保存到数据库 Db::startTrans(); try { // 移动资源 - $res = $resource->moveTo($request->param('ids'), $request->param('to_id')); + $res = (new ResourceService())->moveTo($request->param('ids'), $request->param('to_id')); Db::commit(); } catch (\Exception $e) { Db::rollback(); @@ -142,12 +152,12 @@ class ResourceController /** * 资源 复制到 */ - public function copyTo(Resource $resource, Request $request) + public function copyTo(Request $request) { Db::startTrans(); try { // 复制资源 - $res = $resource->copyTo($request->param('ids'), $request->param('to_id')); + $res = (new ResourceService())->copyTo($request->param('ids'), $request->param('to_id')); Db::commit(); } catch (\Exception $e) { Db::rollback(); diff --git a/app/controller/ResourceDirController.php b/app/controller/ResourceDirController.php index 8fdb48f..1115c0e 100644 --- a/app/controller/ResourceDirController.php +++ b/app/controller/ResourceDirController.php @@ -4,6 +4,7 @@ namespace app\controller; use app\model\Resource; use app\model\ResourceDir; +use app\service\ResourceDirService; use app\validate\ResourceValidate; use think\facade\Db; use think\facade\Lang; @@ -48,7 +49,7 @@ class ResourceDirController /** * 创建文件夹 */ - public function save(ResourceDir $resource_dir, Request $request) + public function save(Request $request) { if ($request->param('type') != 2) { return jsonReturn(-1, '仅支持创建文件夹'); @@ -64,7 +65,7 @@ class ResourceDirController Db::startTrans(); try { // 新增文件夹 - $res = $resource_dir->addResourceDir($request->param()); + $res = (new ResourceDirService())->addResourceDir($request->param()); Db::commit(); } catch (\Exception $e) { diff --git a/app/event.php b/app/event.php index e9851bb..84c20ed 100644 --- a/app/event.php +++ b/app/event.php @@ -2,6 +2,7 @@ // 事件定义文件 return [ 'bind' => [ + 'ResourceEvent' => 'app\event\ResourceEvent', ], 'listen' => [ @@ -10,8 +11,8 @@ return [ 'HttpEnd' => [], 'LogLevel' => [], 'LogWrite' => [], + 'ResourceEvent' => ['app\listener\ResourceEvent'], ], - 'subscribe' => [ - ], + 'subscribe' => [], ]; diff --git a/app/event/ResourceEvent.php b/app/event/ResourceEvent.php new file mode 100644 index 0000000..8c84eca --- /dev/null +++ b/app/event/ResourceEvent.php @@ -0,0 +1,20 @@ +resource = $resource; + $this->method = $method; + } +} diff --git a/app/listener/ResourceEvent.php b/app/listener/ResourceEvent.php new file mode 100644 index 0000000..83f5f86 --- /dev/null +++ b/app/listener/ResourceEvent.php @@ -0,0 +1,19 @@ +resource); + } +} diff --git a/app/middleware/LoginMiddleware.php b/app/middleware/LoginMiddleware.php new file mode 100644 index 0000000..eedd5d0 --- /dev/null +++ b/app/middleware/LoginMiddleware.php @@ -0,0 +1,30 @@ +user_id = $userId; + + // 继续处理请求 + return $next($request); + } +} diff --git a/app/model/AccreditFile.php b/app/model/AccreditFile.php deleted file mode 100644 index c0e82e7..0000000 --- a/app/model/AccreditFile.php +++ /dev/null @@ -1,18 +0,0 @@ -accreditFiles()->saveAll($accredit_file_array); - } - - /** - * @param $resource 资源对象 - * @param $files 素材 - * 添加 素材 - */ - public function addFile($resource, $files, $file_input_mode) - { - foreach ($files as $file) { - $file['type'] = 1; - $file['file_input_mode'] = $file_input_mode; - $file_array[] = $file; - } - // 资源素材关联 系统会自动插入 - $resource->files()->saveAll($file_array); - } - - /** - * @param $files 素材数组 - * 获得一组素材的大小 - */ - public function getFileSize($files) - { - $size = 0; - foreach ($files as $file) { - $size += $file['size']; - } - return $size; - } } diff --git a/app/model/Resource.php b/app/model/Resource.php index 9c71870..1bd0b8b 100644 --- a/app/model/Resource.php +++ b/app/model/Resource.php @@ -2,10 +2,12 @@ namespace app\model; +use app\event\ResourceEvent; use app\exception\ModelException; class Resource extends Model { + public function user() { return $this->belongsTo(User::class); @@ -34,152 +36,4 @@ class Resource extends Model { return $this->hasMany(File::class, 'resource_id', 'id'); } - - - - /** - * @param $param 前端提交的参数 - * @return array - * 添加资源 - */ - public function addResource($param): array - { - try { - //插入资源表 - $resource = self::create($param); - - //存在授权文件 插入授权文件表 - if ($param['copyright_type'] == 2 && isset($param['accredit_files'])) { - (new File())->addAccreditFile($resource, $param['accredit_files']); - } - //插入素材表 - (new File())->addFile($resource, $param['files'], $param['file_input_mode']); - - //添加资源的后置操作 - $this->afterAddResource($resource); - } catch (\Exception $e) { - throw new ModelException($e->getMessage()); - } - - return dataReturn($this->sucCode, $this->addMsg, $resource->id); - } - - /** - * @param $resource 资源对象 - * @return array - * 添加资源后的的操作 - */ - public function afterAddResource($resource) - { - //根据素材 更新资源大小 数量 - $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 还有状态的啥的 - $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 $ids 需要复制的资源ids - * @param $to_id 文件夹id - * @return array - * 移动操作 - */ - public function copyTo($ids, $to_id) - { - foreach ($ids as $resource_id) { - //复制需要 需要复制里面所有的素材 - $resource = $this::with(['files', 'accredit_files'])->find($resource_id); - - //1.创建一个新资源 - $this->copyResource($resource->toArray(), $to_id); - - //2 更新 新的文件夹 以及所有父文件夹 大小和数量 - (new ResourceDir())->changeDirSizeAndCount($resource, $to_id, '+'); - } - return dataReturn($this->sucCode, $this->copyMsg); - } - - /** - * @param $resource 资源数组(因为前台创建是数组 保持一致) - * @param $to_id 复制到的文件夹id - * @return array - * 复制一个资源数据 - */ - public function copyResource($resource, $to_id) - { - //资源表字段更新 - unset($resource['id']); - $resource['create_time'] = date('Y-m-d H:i:s'); - $resource['update_time'] = date('Y-m-d H:i:s'); - $resource['parent_id'] = $to_id; - - //关联表去掉关联字段 - if (isset($resource['files'])) { - foreach ($resource['files'] as $key => $file) { - unset($resource['files'][$key]['id']); - unset($resource['files'][$key]['resource_id']); //去掉原来的关联关系 - - } - } - - if (isset($resource['accredit_files'])) { - foreach ($resource['accredit_files'] as $key => $file) { - unset($resource['accredit_files'][$key]['id']); - unset($resource['accredit_files'][$key]['resource_id']); //去掉原来的关联关系 - } - } - - //重新创建资源 - return $this->addResource($resource); - } - /** - * @param $resource 资源对象 - * @return array - * 获取一个资源的大小(所有素材大小的总和) 和包含的素材数量 - */ - public function getFileSizeAndCount($resource) - { - $size = 0; - $count = 0; - foreach ($resource->files as $file) { - if (isset($file['size'])) { - $size += $file['size']; - } - $count++; - } - return [ - 'file_size' => $size, - 'file_count' => $count, - ]; - } } diff --git a/app/model/ResourceDir.php b/app/model/ResourceDir.php index 9f3013e..e5f9d42 100644 --- a/app/model/ResourceDir.php +++ b/app/model/ResourceDir.php @@ -8,77 +8,4 @@ use think\facade\Db; class ResourceDir extends Model { protected $table = 'zl_resource'; - - /** - * @param $param 前端提交的参数 - * @return array - * 添加文件夹 - */ - public function addResourceDir($param): array - { - try { - $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_dir->id); - } - - /** - * @param $resource_dir_id 文件夹id - * @return array - * 获取一个文件夹下的所有文件夹 和资源 - */ - public function getResourceDirAndResource($resource_dir_id) - { - $resource_list = Resource::where('parent_id', $resource_dir_id) - ->order('type', 'desc') //文件夹放在上面 - ->order('create_time', 'desc') - ->select(); - return $resource_list; - } - - /** - * @param $resource 资源对象 - * @param $resource_dir_id 移入/移出的文件夹id - * @param $resource_dir_id method + 移入 - 移除 - * @return array - * 将一资源移入或者移出文件夹 文件夹修改资源数量 和 资源大小 - */ - public function changeDirSizeAndCount($resource, $resource_dir_id, $method = '+') - { - - //资源还不属于文件夹 - if ($resource_dir_id == 0) { - return true; - } - $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 dataReturn($this->sucCode, $this->addMsg); - } - - /** - * @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)); - } } diff --git a/app/model/ResourceFile.php b/app/model/ResourceFile.php deleted file mode 100644 index f71250c..0000000 --- a/app/model/ResourceFile.php +++ /dev/null @@ -1,28 +0,0 @@ - $resource_id, - 'file_id' => $file_id, - ]; - } - $ResourceFile = new ResourceFile(); - $ResourceFile->saveAll($resource_file_array); - } -} diff --git a/app/model/ResourceOperationLog.php b/app/model/ResourceOperationLog.php new file mode 100644 index 0000000..6fb2b2e --- /dev/null +++ b/app/model/ResourceOperationLog.php @@ -0,0 +1,23 @@ +resource_id = $resource->id; + // $log->resource_type = 'resource'; + // $log->operation_type = $operationType; + // $log->user_id = session('user_id'); // 获取当前用户ID,假设用户ID保存在session中 + // $log->details = json_encode($resource->toArray()); + // $log->ip_address = Request::ip(); + // $log->user_agent = Request::server('HTTP_USER_AGENT'); + // $log->save(); + // } +} diff --git a/app/model/Share.php b/app/model/Share.php new file mode 100644 index 0000000..d843fd5 --- /dev/null +++ b/app/model/Share.php @@ -0,0 +1,9 @@ +accreditFiles()->saveAll($accredit_file_array); + } + + /** + * @param $resource 资源对象 + * @param $files 素材 + * 添加 素材 + */ + public function addFile($resource, $files, $file_input_mode) + { + foreach ($files as $file) { + $file['type'] = 1; + $file['file_input_mode'] = $file_input_mode; + $file_array[] = $file; + } + // 资源素材关联 系统会自动插入 + $resource->files()->saveAll($file_array); + } + + /** + * @param $files 素材数组 + * 获得一组素材的大小 + */ + public function getFileSize($files) + { + $size = 0; + foreach ($files as $file) { + $size += $file['size']; + } + return $size; + } +} diff --git a/app/service/FileSystemService.php b/app/service/FileSystemService.php deleted file mode 100644 index 3f79a76..0000000 --- a/app/service/FileSystemService.php +++ /dev/null @@ -1,31 +0,0 @@ -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_dir->id); + } + + /** + * @param $resource_dir_id 文件夹id + * @return array + * 获取一个文件夹下的所有文件夹 和资源 + */ + public function getResourceDirAndResource($resource_dir_id) + { + $resource_list = ResourceDir::where('parent_id', $resource_dir_id) + ->order('type', 'desc') //文件夹放在上面 + ->order('create_time', 'desc') + ->select(); + return $resource_list; + } + + /** + * @param $resource 资源对象 + * @param $resource_dir_id 移入/移出的文件夹id + * @param $resource_dir_id method + 移入 - 移除 + * @return array + * 将一资源移入或者移出文件夹 文件夹修改资源数量 和 资源大小 + */ + public function changeDirSizeAndCount($resource, $resource_dir_id, $method = '+') + { + + //资源还不属于文件夹 + if ($resource_dir_id == 0) { + return true; + } + $resource_dir = ResourceDir::find($resource_dir_id); + if ($method === '+') { + ResourceDir::whereIn('id', $resource_dir['id_path'])->inc('resource_size', $resource->file_size) + ->inc('resource_count', 1) + ->update(); + } elseif ($method === '-') { + ResourceDir::whereIn('id', $resource_dir['id_path'])->dec('resource_size', $resource->file_size) + ->dec('resource_count', 1) + ->update(); + } + return dataReturn($this->sucCode, $this->addMsg); + } + + /** + * @param $resource_dir_id 文件夹id + * 获取文件夹 id_path(从顶级文件夹到自己的路径) + */ + public function getResourceDirIdPath($resource_dir_id) + { + $path = []; + // 调用递归函数 + findParent(new ResourceDir(), $resource_dir_id, $path); + // 反转路径数组,使顶级文件夹在前 + return implode(',', array_reverse($path)); + } +} diff --git a/app/service/ResourceService.php b/app/service/ResourceService.php new file mode 100644 index 0000000..c900301 --- /dev/null +++ b/app/service/ResourceService.php @@ -0,0 +1,177 @@ +addAccreditFile($resource, $param['accredit_files']); + } + //插入素材表 + (new FileService())->addFile($resource, $param['files'], $param['file_input_mode']); + //添加资源的后置操作 + $this->afterAddResource($resource); + } catch (\Exception $e) { + throw new ModelException($e->getMessage()); + } + + return dataReturn($this->sucCode, $this->addMsg, $resource->id); + } + + /** + * @param $resource 资源对象 + * @return array + * 添加资源后的的操作 + */ + public function afterAddResource($resource) + { + //根据素材 更新资源大小 数量 + $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 还有状态的啥的 + $resource->save(); + } + + /** + * @param $ids 需要移动的资源ids + * @param $to_id 文件夹id + * @return array + * 移动操作 + */ + public function moveTo($ids, $to_id) + { + foreach ($ids as $resource_id) { + $resource = Resource::find($resource_id); + if ($resource->parent_id == $to_id) { + //移动到同文件夹 无需操作 + continue; + } + + //1 更新原文件夹 以及所有父文件夹 大小和数量 + (new ResourceDirService())->changeDirSizeAndCount($resource, $resource->parent_id, '-'); + + //2 更新parent_id + $resource->parent_id = $to_id; + $resource->save(); + + //3 更新 新的文件夹 以及所有父文件夹 大小和数量 + (new ResourceDirService())->changeDirSizeAndCount($resource, $to_id, '+'); + } + return dataReturn($this->sucCode, $this->moveMsg); + } + + + /** + * @param $ids 需要复制的资源ids + * @param $to_id 文件夹id + * @return array + * 移动操作 + */ + public function copyTo($ids, $to_id) + { + foreach ($ids as $resource_id) { + //复制需要 需要复制里面所有的素材 + $resource = Resource::with(['files', 'accredit_files'])->find($resource_id); + + //1.创建一个新资源 + $this->copyResource($resource->toArray(), $to_id); + + //2 更新 新的文件夹 以及所有父文件夹 大小和数量 + (new ResourceDirService())->changeDirSizeAndCount($resource, $to_id, '+'); + } + return dataReturn($this->sucCode, $this->copyMsg); + } + + + /** + * @param $resource 资源数组(因为前台创建是数组 保持一致) + * @param $to_id 复制到的文件夹id + * @return array + * 复制一个资源数据 + */ + public function copyResource($resource, $to_id) + { + //资源表字段更新 + unset($resource['id']); + $resource['create_time'] = date('Y-m-d H:i:s'); + $resource['update_time'] = date('Y-m-d H:i:s'); + $resource['parent_id'] = $to_id; + + //关联表去掉关联字段 + if (isset($resource['files'])) { + foreach ($resource['files'] as $key => $file) { + unset($resource['files'][$key]['id']); + unset($resource['files'][$key]['resource_id']); //去掉原来的关联关系 + + } + } + + if (isset($resource['accredit_files'])) { + foreach ($resource['accredit_files'] as $key => $file) { + unset($resource['accredit_files'][$key]['id']); + unset($resource['accredit_files'][$key]['resource_id']); //去掉原来的关联关系 + } + } + + //重新创建资源 + return $this->addResource($resource); + } + /** + * @param $resource 资源对象 + * @return array + * 获取一个资源的大小(所有素材大小的总和) 和包含的素材数量 + */ + public function getFileSizeAndCount($resource) + { + $size = 0; + $count = 0; + foreach ($resource->files as $file) { + if (isset($file['size'])) { + $size += $file['size']; + } + $count++; + } + return [ + 'file_size' => $size, + 'file_count' => $count, + ]; + } + + /** + * @param $param 提交参数 + * @param $user_id 用户id + * + * @return array + */ + public function addResourceShare($param, $user_id) + { + $param['user_id'] = $user_id; + $param['code'] = $this->getResourceShareInfo(); //获取访问链接和密码 + dd($param); + $resource = Share::create($param); + } + + public function getResourceShareInfo() + { + } +} diff --git a/app/service/Service.php b/app/service/Service.php new file mode 100644 index 0000000..a89b75e --- /dev/null +++ b/app/service/Service.php @@ -0,0 +1,55 @@ +delData = [ + 'is_del' => 2, + 'delete_time' => time(), + 'update_time' => time(), + ]; + $this->className = $this->getClassName(); + $this->listCacheKey = $this->className . '_cache_list'; + $this->detailCacheKey = $this->className . '_cache_detail'; + $this->moveMsg = lang('移动成功'); + $this->copyMsg = lang('复制成功'); + $this->getMsg = lang('获取成功'); + $this->addMsg = lang('添加成功'); + $this->updateMsg = lang('修改成功'); + $this->delMsg = lang('删除成功'); + // parent::__construct($data); + } + + public function getClassName(): string + { + $reflection = new \ReflectionClass($this); + return $reflection->getShortName(); + } +} diff --git a/app/service/UserService.php b/app/service/UserService.php deleted file mode 100644 index b162478..0000000 --- a/app/service/UserService.php +++ /dev/null @@ -1,22 +0,0 @@ -app->bind('userService', function () { - // return new UserService(); - // }); - // } - - public function doSomething() - { - // 服务的具体方法 - return 'Service is working'; - } -} diff --git a/app/validate/ResourceValidate.php b/app/validate/ResourceValidate.php index a5458b8..daad185 100644 --- a/app/validate/ResourceValidate.php +++ b/app/validate/ResourceValidate.php @@ -25,6 +25,8 @@ class ResourceValidate extends Validate "use_range|适用范围" => 'require', "file_input_mode|素材录入方式" => 'require', "files|素材" => 'require', + + 'expire_type|有效期' => 'require', ]; protected $scene = [ @@ -34,6 +36,7 @@ class ResourceValidate extends Validate 'save_dir' => ['name'], //新增文件夹 'rename_dir' => ['name'], //重命名文件夹 + 'share' => ['name', 'expire_type'] //分享 // 'setStatus' => ['id', 'status'], ]; diff --git a/config/middleware.php b/config/middleware.php index 7e1972f..d9a4a71 100644 --- a/config/middleware.php +++ b/config/middleware.php @@ -2,7 +2,9 @@ // 中间件配置 return [ // 别名或分组 - 'alias' => [], + 'alias' => [ + 'login' => app\middleware\LoginMiddleware::class, + ], // 优先级设置,此数组中的中间件会按照数组中的顺序优先执行 'priority' => [], ]; diff --git a/route/app.php b/route/app.php index d708878..cf50803 100644 --- a/route/app.php +++ b/route/app.php @@ -21,11 +21,11 @@ Route::group('resource', function () { Route::get('/index', 'index'); Route::post('/save', 'save'); Route::get('/detail/:id', 'detail'); - Route::get('/share/:id', 'share'); + Route::post('/share', 'share'); Route::post('/rename', 'rename'); Route::post('/move_to', 'moveTo'); Route::post('/copy_to', 'copyTo'); -})->prefix('resource/'); +})->prefix('resource/')->middleware('login'); //文件夹 Route::group('resourceDir', function () {