From ce9bcc8f4801393ebaf0ef5e91fcff06612f221e Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 19 Jul 2024 16:28:04 +0800 Subject: [PATCH] =?UTF-8?q?mid=20service=20=E8=B5=84=E6=BA=90=E5=88=86?= =?UTF-8?q?=E4=BA=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/common.php | 52 +++++++++++++++++++- app/controller/ResourceController.php | 10 ++-- app/middleware/LoginMiddleware.php | 2 +- app/model/Share.php | 31 ++++++++++++ app/model/ShareItem.php | 9 ++++ app/service/ResourceDirService.php | 2 +- app/service/ResourceService.php | 45 +++++++++-------- app/service/ShareItemService.php | 22 +++++++++ app/service/ShareService.php | 92 +++++++++++++++++++++++++++++++++++ route/app.php | 5 ++ 10 files changed, 244 insertions(+), 26 deletions(-) create mode 100644 app/model/ShareItem.php create mode 100644 app/service/ShareItemService.php create mode 100644 app/service/ShareService.php diff --git a/app/common.php b/app/common.php index f2bcdb9..fa1293d 100644 --- a/app/common.php +++ b/app/common.php @@ -1,5 +1,8 @@ $code, 'data' => $data, 'msg' => $msg]; } -// 递归函数来查找父级路径 +/** + * 递归查找父级路径 + * @param $obj 递归的对象 + * @param string $id + * @param array $path 路径数组 + * @return array + */ function findParent($obj, $id, &$path) { // 查找当前文件夹的信息 @@ -42,3 +51,44 @@ function findParent($obj, $id, &$path) } } } + + +/** + * 获得分享信息 + * @return array + */ +function getResourceShareInfo() +{ + $code = uniqid(); + $share_link = url('share/index', ['id' => $code])->domain(true); + $password = str_pad(rand(0, 9999), 4, '0', STR_PAD_LEFT); + return [ + 'code' => $code, + 'share_link' => (string)$share_link, + 'password' => $password, + ]; +} + +/** + * 将天数转换为毫秒数 + * + * @param int $days 天数 + * @return int 毫秒数 + */ +function daysToMilliseconds($days) +{ + // 1天 = 24小时,1小时 = 60分钟,1分钟 = 60秒,1秒 = 1000毫秒 + return $days * 24 * 60 * 60 * 1000; +} + +/** + * 将天数转换为秒数 + * + * @param int $days 天数 + * @return int 毫秒数 + */ +function daysToSeconds($days) +{ + // 1天 = 24小时,1小时 = 60分钟,1分钟 = 60秒,1秒 = 1000毫秒 + return $days * 24 * 60 * 60; +} diff --git a/app/controller/ResourceController.php b/app/controller/ResourceController.php index 06ebe11..f6d0f5b 100644 --- a/app/controller/ResourceController.php +++ b/app/controller/ResourceController.php @@ -4,6 +4,7 @@ namespace app\controller; use app\model\Resource; use app\service\ResourceService; +use app\service\ShareService; use app\validate\ResourceValidate; use think\facade\Db; use think\facade\Lang; @@ -97,19 +98,22 @@ class ResourceController /** * 资源 分享 */ - public function share(Resource $resource, Request $request) + public function share(Request $request) { try { validate(ResourceValidate::class)->scene('share')->check($request->param()); } catch (ValidateException $e) { return jsonReturn(-1, $e->getError()); } + Db::startTrans(); try { - $resource->addResourceShare($request->param(), $request->user_id); - return jsonReturn(0, Lang::get('成功')); + $res = (new ShareService())->addResourceShare($request->param(), $request->user_id); + Db::commit(); } catch (\Exception $e) { + Db::rollback(); return jsonReturn(-5, $e->getMessage()); } + return json($res); } /** diff --git a/app/middleware/LoginMiddleware.php b/app/middleware/LoginMiddleware.php index eedd5d0..bc6b564 100644 --- a/app/middleware/LoginMiddleware.php +++ b/app/middleware/LoginMiddleware.php @@ -21,7 +21,7 @@ class LoginMiddleware */ public function handle($request, \Closure $next) { - $userId = 2; + $userId = 1; $request->user_id = $userId; // 继续处理请求 diff --git a/app/model/Share.php b/app/model/Share.php index d843fd5..ae22cab 100644 --- a/app/model/Share.php +++ b/app/model/Share.php @@ -6,4 +6,35 @@ use app\exception\ModelException; class Share extends Model { + const EXPIRE_TYPE_MAP = [ + 1 => 7, + 2 => 30, + 3 => 365 * 30, //永久有效 + ]; + + public function user() + { + return $this->belongsTo(User::class); + } + + public function shareItem() + { + return $this->hasMany(shareItem::class, 'share_id'); + } + + /** + * @param $type 类型 + * 根据分享的type 生成不同的操作对象 (资源/内容) + */ + public static function getObjByType($type) + { + switch ($type) { + case 1: + $obj = new Resource; + break; + case 2: + $obj = new Content; + } + return $obj; + } } diff --git a/app/model/ShareItem.php b/app/model/ShareItem.php new file mode 100644 index 0000000..0050533 --- /dev/null +++ b/app/model/ShareItem.php @@ -0,0 +1,9 @@ +find($resource_id); - //1.创建一个新资源 + //1.创建一个新普通资源 $this->copyResource($resource->toArray(), $to_id); - //2 更新 新的文件夹 以及所有父文件夹 大小和数量 + //2 更新 新的文件夹资源 以及所有父文件夹资源 大小和数量 (new ResourceDirService())->changeDirSizeAndCount($resource, $to_id, '+'); } return dataReturn($this->sucCode, $this->copyMsg); @@ -139,7 +139,7 @@ class ResourceService extends Service /** * @param $resource 资源对象 * @return array - * 获取一个资源的大小(所有素材大小的总和) 和包含的素材数量 + * 通过素材 获取一个普通资源的大小(所有素材大小的总和) 和包含的素材数量 */ public function getFileSizeAndCount($resource) { @@ -158,20 +158,25 @@ class ResourceService extends Service } /** - * @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() + public function getResourceSizeAndCount($resource) { + switch ($resource->type) { + case 1: + //普通资源 + $count = $resource->file_count; + $size = $resource->file_size; + break; + case 2; + //文件夹资源 + $count = $resource->resource_count; + $size = $resource->resource_size; + break; + } + return [ + 'count' => $count, + 'size' => $size, + ]; } } diff --git a/app/service/ShareItemService.php b/app/service/ShareItemService.php new file mode 100644 index 0000000..402151e --- /dev/null +++ b/app/service/ShareItemService.php @@ -0,0 +1,22 @@ +shareItem()->saveAll($share_item_array); + } +} diff --git a/app/service/ShareService.php b/app/service/ShareService.php new file mode 100644 index 0000000..5a40247 --- /dev/null +++ b/app/service/ShareService.php @@ -0,0 +1,92 @@ +getExpireTimeInfoByExpireType($param['expire_type']); + $param['expire_time'] = $expire_time_info['milliseconds']; + $param['share_start_time'] = date('Y-m-d H:i:s'); + $param['share_end_time'] = $this->getShareEndTime($param['share_start_time'], $expire_time_info['seconds']); + $param['user_id'] = $user_id; + $param['size'] = $this->getShareSize($param['ids'], $param['type']); + + $share = Share::create($param); + + //插入分享详情表 + (new ShareItemService())->addShareItem($share, $param['ids'], $param['type']); + + //这里关联关系无法预加载 这样写可以实现 但是感觉怪怪的。。 + $share->user = $share->user; + } catch (\Exception $e) { + throw new ModelException($e->getMessage()); + } + return dataReturn($this->sucCode, $this->addMsg, $share); + } + /** + * @param $expire_type 过期时间类型 + * 通过过期时间类型 获取过期时间 + */ + public function getExpireTimeInfoByExpireType($expire_type) + { + $expire_type_map = Share::EXPIRE_TYPE_MAP; + return [ + 'milliseconds' => daysToMilliseconds($expire_type_map[$expire_type]), + 'seconds' => daysToSeconds($expire_type_map[$expire_type]), + ]; + } + + /** + * @param $share_start_time 分享开始时间 + * @param $expire_time_seconds 分享过起秒数 + * 计算分享结束时间 + */ + public function getShareEndTime($share_start_time, $expire_time_seconds) + { + + return date('Y-m-d H:i:s', strtotime($share_start_time) + $expire_time_seconds); + } + + /** + * @param $ids 分享ids + * @param $type 分享类型1 资源 2 内容 + * + * 获取分享的大小 + */ + public function getShareSize($ids, $type) + { + switch ($type) { + case 1: + //分享的是资源 + $resources = Resource::whereIn('id', $ids)->select(); + $size = 0; + foreach ($resources as $resource) { + $size += (new ResourceService())->getResourceSizeAndCount($resource)['size']; + } + break; + case 2: + //分享的是内容 + } + return $size; + } +} diff --git a/route/app.php b/route/app.php index cf50803..5a4f037 100644 --- a/route/app.php +++ b/route/app.php @@ -27,6 +27,11 @@ Route::group('resource', function () { Route::post('/copy_to', 'copyTo'); })->prefix('resource/')->middleware('login'); +//资源 +Route::group('share', function () { + Route::get('/index', 'index'); +})->prefix('share/'); + //文件夹 Route::group('resourceDir', function () { Route::get('/index/[:id]', 'index');