From 2b0467e00f9ead14a8c4568dc532cf494c9824d0 Mon Sep 17 00:00:00 2001 From: kuaifan Date: Wed, 29 Dec 2021 08:38:45 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=87=E4=BB=B6=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=8F=AA=E8=AF=BB=E3=80=81=E8=AF=BB/=E5=86=99=E7=BB=86?= =?UTF-8?q?=E5=8C=96=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/Api/FileController.php | 127 ++++++++----------- app/Models/File.php | 45 ++++--- app/Models/FileUser.php | 5 +- resources/assets/js/components/UserInput.vue | 5 + resources/assets/js/pages/manage/file.vue | 125 +++++++++++++----- resources/assets/sass/pages/page-file.scss | 38 ++++++ 6 files changed, 213 insertions(+), 132 deletions(-) diff --git a/app/Http/Controllers/Api/FileController.php b/app/Http/Controllers/Api/FileController.php index ce3b2aa9..ad351d6f 100755 --- a/app/Http/Controllers/Api/FileController.php +++ b/app/Http/Controllers/Api/FileController.php @@ -35,12 +35,7 @@ class FileController extends AbstractController $pid = intval($data['pid']); // if ($pid > 0) { - $file = File::find($pid); - if (empty($file)) { - return Base::retError('Not exist'); - } - $file->exceAllow($user->userid); - // + File::allowFind($pid); $builder = File::wherePid($pid); } else { $builder = File::whereUserid($user->userid); @@ -61,13 +56,11 @@ class FileController extends AbstractController } } else { // 获取共享相关 - $list = File::where('userid', '!=', $user->userid)->where(function ($query) use ($user) { - $query->where('share', 1)->orWhere(function ($q2) use ($user) { - $q2->where('share', 2)->whereIn('id', function ($q3) use ($user) { - $q3->select('file_id')->from('file_users')->where('userid', $user->userid); - }); - }); - })->get(); + $list = File::select(['files.*', 'file_users.permission']) + ->join('file_users', 'files.id', '=', 'file_users.file_id') + ->where('files.userid', '!=', $user->userid) + ->where('file_users.userid', $user->userid) + ->get(); if ($list->isNotEmpty()) { foreach ($list as $file) { $temp = $file->toArray(); @@ -512,34 +505,35 @@ class FileController extends AbstractController return Base::retError('仅限所有者操作'); } // - $userids = FileUser::whereFileId($file->id)->pluck('userid')->toArray(); + $list = FileUser::whereFileId($file->id)->get(); // return Base::retSuccess('success', [ 'id' => $file->id, - 'userids' => $userids + 'list' => $list ]); } /** - * 获取共享信息 + * 设置共享 * * @apiParam {Number} id 文件ID - * @apiParam {String} action 动作 - * - share: 设置共享 - * - unshare: 取消共享 - * @apiParam {Number} [share] 共享对象 - * - 1: 共享给所有人(限管理员) - * - 2: 共享给指定成员 * @apiParam {Array} [userids] 共享成员,格式: [userid1, userid2, userid3] + * @apiParam {Number} [permission] 共享方式 + * - 0:只读 + * - 1:读写 + * - -1: 删除 */ public function share__update() { $user = User::auth(); // $id = intval(Request::input('id')); - $action = Request::input('action'); - $share = intval(Request::input('share')); $userids = Request::input('userids'); + $permission = intval(Request::input('permission')); + // + if (!in_array($permission, [-1, 0, 1])) { + return Base::retError('参数错误'); + } // $file = File::whereId($id)->first(); if (empty($file)) { @@ -553,56 +547,45 @@ class FileController extends AbstractController return Base::retError('已经处于共享文件夹中'); } // - if ($action == 'unshare') { - // 取消共享 - if ($file->share == 1) { - $uids = WebSocket::select(['userid'])->pluck('userid')->toArray(); - } else { - $uids = FileUser::whereFileId($file->id)->pluck('userid')->toArray(); - } - $uids = array_values(array_diff($uids, [$user->userid])); - // - $file->setShare(0); - $message = '取消成功'; - } else { - // 设置共享 - switch ($share) { - case 1: - $user->isAdmin(); - break; - - case 2: - $array = []; - if (is_array($userids)) { - foreach ($userids as $userid) { - if (!intval($userid)) continue; - if (!User::whereUserid($userid)->exists()) continue; - FileUser::updateInsert([ - 'file_id' => $file->id, - 'userid' => $userid, - ]); - $array[] = $userid; - } - } - if (empty($array)) { - return Base::retError('请选择共享成员'); - } - $builder = FileUser::whereFileId($file->id)->whereNotIn('userid', $array); - $uids = (clone $builder)->pluck('userid')->toArray(); - $builder->delete(); - break; - - default: - return Base::retError('请选择共享对象'); - } - $file->setShare($share); - $message = '设置成功'; + if (!is_array($userids) || empty($userids)) { + return Base::retError('请选择共享对象'); } // - $file->pushMsg('update', $file); - if (isset($uids)) { - $file->pushMsg('delete', null, $uids); + $array = []; + if ($permission === -1) { + // 取消共享 + $action = "delete"; + foreach ($userids as $userid) { + if (!intval($userid)) continue; + if (FileUser::where([ + 'file_id' => $file->id, + 'userid' => $userid, + ])->delete()) { + $array[] = $userid; + } + } + } else { + // 设置共享 + $action = "update"; + if (FileUser::whereFileId($file->id)->count() + count($userids) > 100) { + return Base::retError('共享人数上限100个成员'); + } + foreach ($userids as $userid) { + if (!intval($userid)) continue; + if (!User::whereUserid($userid)->exists()) continue; + if (FileUser::updateInsert([ + 'file_id' => $file->id, + 'userid' => $userid, + ], [ + 'permission' => $permission, + ])) { + $array[] = $userid; + } + } } - return Base::retSuccess($message, $file); + // + $file->setShare(); + $file->pushMsg($action, $action == "delete" ? null : $file, $array); + return Base::retSuccess($action == "delete" ? "删除成功" : "设置成功", $file); } } diff --git a/app/Models/File.php b/app/Models/File.php index a0f105d3..d8a97b6c 100644 --- a/app/Models/File.php +++ b/app/Models/File.php @@ -51,7 +51,7 @@ class File extends AbstractModel use SoftDeletes; /** - * 是否有访问权限(没有时抛出异常) + * 是否有访问权限 * @param $userid */ public function exceAllow($userid) @@ -64,8 +64,7 @@ class File extends AbstractModel /** * 是否有访问权限 * ① 自己的文件夹 - * ② 共享所有人的文件夹 - * ③ 在指定共享人员内 + * ② 在指定共享成员内 * @param $userid * @return bool */ @@ -77,14 +76,9 @@ class File extends AbstractModel } $row = $this->getShareInfo(); if ($row) { - if ($row->share == 1) { - // ② 共享所有人的文件夹 + if (FileUser::whereFileId($row->id)->whereUserid($userid)->exists()) { + // ② 在指定共享成员内 return true; - } elseif ($row->share == 2) { - // ③ 在指定共享人员内 - if (FileUser::whereFileId($row->id)->whereUserid($userid)->exists()) { - return true; - } } } return false; @@ -96,7 +90,7 @@ class File extends AbstractModel */ public function getShareInfo() { - if ($this->share > 0) { + if ($this->share) { return $this; } $pid = $this->pid; @@ -105,7 +99,7 @@ class File extends AbstractModel if (empty($row)) { break; } - if ($row->share > 0) { + if ($row->share) { return $row; } $pid = $row->pid; @@ -125,7 +119,7 @@ class File extends AbstractModel if (empty($row)) { break; } - if ($row->share > 0) { + if ($row->share) { return true; } $pid = $row->pid; @@ -138,18 +132,23 @@ class File extends AbstractModel * @param $share * @return bool */ - public function setShare($share) + public function setShare($share = null) { - AbstractModel::transaction(function () use ($share) { - $this->share = $share; - $this->save(); - $list = self::wherePid($this->id)->get(); - if ($list->isNotEmpty()) { - foreach ($list as $item) { - $item->setShare(0); + if ($share === null) { + $share = FileUser::whereFileId($this->id)->count() == 0 ? 0 : 1; + } + if ($this->share != $share) { + AbstractModel::transaction(function () use ($share) { + $this->share = $share; + $this->save(); + $list = self::wherePid($this->id)->get(); + if ($list->isNotEmpty()) { + foreach ($list as $item) { + $item->setShare(0); + } } - } - }); + }); + } return true; } diff --git a/app/Models/FileUser.php b/app/Models/FileUser.php index 22ecf12f..5b35960f 100644 --- a/app/Models/FileUser.php +++ b/app/Models/FileUser.php @@ -4,12 +4,12 @@ namespace App\Models; /** - * Class FileUser + * App\Models\FileUser * - * @package App\Models * @property int $id * @property int|null $file_id 项目ID * @property int|null $userid 成员ID + * @property int|null $permission 权限:0只读,1读写 * @property \Illuminate\Support\Carbon|null $created_at * @property \Illuminate\Support\Carbon|null $updated_at * @method static \Illuminate\Database\Eloquent\Builder|FileUser newModelQuery() @@ -18,6 +18,7 @@ namespace App\Models; * @method static \Illuminate\Database\Eloquent\Builder|FileUser whereCreatedAt($value) * @method static \Illuminate\Database\Eloquent\Builder|FileUser whereFileId($value) * @method static \Illuminate\Database\Eloquent\Builder|FileUser whereId($value) + * @method static \Illuminate\Database\Eloquent\Builder|FileUser wherePermission($value) * @method static \Illuminate\Database\Eloquent\Builder|FileUser whereUpdatedAt($value) * @method static \Illuminate\Database\Eloquent\Builder|FileUser whereUserid($value) * @mixin \Eloquent diff --git a/resources/assets/js/components/UserInput.vue b/resources/assets/js/components/UserInput.vue index 9f62fa21..b376fae5 100755 --- a/resources/assets/js/components/UserInput.vue +++ b/resources/assets/js/components/UserInput.vue @@ -5,6 +5,7 @@ :transfer="transfer" :remote-method="searchUser" :placeholder="placeholder" + :size="size" :loading="loading" :loading-text="$L('加载中...')" :default-label="value" @@ -17,6 +18,7 @@ @on-open-change="openChange" @on-set-default-options="setDefaultOptions">
{{$L('最多只能选择' + multipleMax + '个')}}
+