feat: 共享给所有人

This commit is contained in:
kuaifan 2021-12-29 13:08:30 +08:00
parent 2b0467e00f
commit 4d8cf41b7a
5 changed files with 63 additions and 28 deletions

View File

@ -8,12 +8,10 @@ use App\Models\File;
use App\Models\FileContent; use App\Models\FileContent;
use App\Models\FileUser; use App\Models\FileUser;
use App\Models\User; use App\Models\User;
use App\Models\WebSocket;
use App\Module\Base; use App\Module\Base;
use App\Module\Ihttp; use App\Module\Ihttp;
use Arr; use Illuminate\Support\Facades\DB;
use Request; use Request;
use Response;
/** /**
* @apiDefine file * @apiDefine file
@ -56,10 +54,17 @@ class FileController extends AbstractController
} }
} else { } else {
// 获取共享相关 // 获取共享相关
$list = File::select(['files.*', 'file_users.permission']) DB::statement("SET SQL_MODE=''");
$pre = DB::connection()->getTablePrefix();
$list = File::select(["files.*", DB::raw("MAX({$pre}file_users.permission) as permission")])
->join('file_users', 'files.id', '=', 'file_users.file_id') ->join('file_users', 'files.id', '=', 'file_users.file_id')
->where('files.userid', '!=', $user->userid) ->where('files.userid', '!=', $user->userid)
->where('file_users.userid', $user->userid) ->where(function ($query) use ($user) {
$query->where('file_users.userid', 0);
$query->orWhere('file_users.userid', $user->userid);
})
->groupBy('files.id')
->take(100)
->get(); ->get();
if ($list->isNotEmpty()) { if ($list->isNotEmpty()) {
foreach ($list as $file) { foreach ($list as $file) {
@ -556,7 +561,6 @@ class FileController extends AbstractController
// 取消共享 // 取消共享
$action = "delete"; $action = "delete";
foreach ($userids as $userid) { foreach ($userids as $userid) {
if (!intval($userid)) continue;
if (FileUser::where([ if (FileUser::where([
'file_id' => $file->id, 'file_id' => $file->id,
'userid' => $userid, 'userid' => $userid,
@ -571,8 +575,6 @@ class FileController extends AbstractController
return Base::retError('共享人数上限100个成员'); return Base::retError('共享人数上限100个成员');
} }
foreach ($userids as $userid) { foreach ($userids as $userid) {
if (!intval($userid)) continue;
if (!User::whereUserid($userid)->exists()) continue;
if (FileUser::updateInsert([ if (FileUser::updateInsert([
'file_id' => $file->id, 'file_id' => $file->id,
'userid' => $userid, 'userid' => $userid,

View File

@ -56,7 +56,7 @@ class File extends AbstractModel
*/ */
public function exceAllow($userid) public function exceAllow($userid)
{ {
if (!$this->chackAllow($userid)) { if ($this->chackAllow($userid) === -1) {
throw new ApiException('没有访问权限'); throw new ApiException('没有访问权限');
} }
} }
@ -66,22 +66,26 @@ class File extends AbstractModel
* 自己的文件夹 * 自己的文件夹
* 在指定共享成员内 * 在指定共享成员内
* @param $userid * @param $userid
* @return bool * @return int -1:没有权限0:只读1:读写
*/ */
public function chackAllow($userid) public function chackAllow($userid)
{ {
if ($userid == $this->userid) { if ($userid == $this->userid) {
// ① 自己的文件夹 // ① 自己的文件夹
return true; return 1;
} }
$row = $this->getShareInfo(); $row = $this->getShareInfo();
if ($row) { if ($row) {
if (FileUser::whereFileId($row->id)->whereUserid($userid)->exists()) { $fileUser = FileUser::whereFileId($row->id)->where(function ($query) use ($userid) {
$query->where('userid', 0);
$query->orWhere('userid', $userid);
})->orderByDesc('permission')->first();
if ($fileUser) {
// ② 在指定共享成员内 // ② 在指定共享成员内
return true; return $fileUser->permission;
} }
} }
return false; return -1;
} }
/** /**

View File

@ -72,10 +72,11 @@
</div> </div>
<div class="file-icon"> <div class="file-icon">
<template v-if="item.share"> <template v-if="item.share">
<UserAvatar v-if="item.userid != userId" :userid="item.userid" class="share-avatar" :size="20"/> <UserAvatar v-if="item.userid != userId" :userid="item.userid" class="share-avatar" :size="20">
<p>{{$L('共享权限')}}: {{$L(item.permission == 1 ? '读/写' : '只读')}}</p>
</UserAvatar>
<div v-else class="share-icon"> <div v-else class="share-icon">
<i v-if="item.share == 1" class="taskfont" :title="$L('所有人')">&#xe75c;</i> <i class="taskfont">&#xe757;</i>
<i v-else class="taskfont" :title="$L('指定成员')">&#xe757;</i>
</div> </div>
</template> </template>
</div> </div>
@ -207,9 +208,9 @@
:disabledChoice="shareAlready" :disabledChoice="shareAlready"
:multiple-max="100" :multiple-max="100"
:placeholder="$L('选择共享成员')"> :placeholder="$L('选择共享成员')">
<Option slot="option-prepend" :value="0" :label="$L('所有人')"> <Option slot="option-prepend" :value="0" :label="$L('所有人')" :disabled="shareAlready.includes(0)">
<div class="user-input-option"> <div class="user-input-option">
<div class="user-input-avatar"><EAvatar class="avatar" style="line-height:26px" icon="el-icon-s-custom"/></div> <div class="user-input-avatar"><EAvatar class="avatar" icon="el-icon-s-custom"/></div>
<div class="user-input-nickname">{{ $L('所有人') }}</div> <div class="user-input-nickname">{{ $L('所有人') }}</div>
<div class="user-input-userid">All</div> <div class="user-input-userid">All</div>
</div> </div>
@ -230,7 +231,11 @@
<div class="page-file-share-title">{{ $L('已共享成员') }}:</div> <div class="page-file-share-title">{{ $L('已共享成员') }}:</div>
<ul class="page-file-share-list"> <ul class="page-file-share-list">
<li v-for="item in shareList"> <li v-for="item in shareList">
<UserAvatar :size="32" :userid="item.userid" show-name tooltip-disabled/> <div v-if="item.userid == 0" class="all-avatar">
<EAvatar class="avatar-text" icon="el-icon-s-custom"/>
<span class="avatar-name">{{$L('所有人')}}</span>
</div>
<UserAvatar v-else :size="32" :userid="item.userid" show-name tooltip-disabled/>
<Select v-model="item.permission" :placeholder="$L('权限')" @on-change="upShare(item)"> <Select v-model="item.permission" :placeholder="$L('权限')" @on-change="upShare(item)">
<Option :value="1">{{ $L('读/写') }}</Option> <Option :value="1">{{ $L('读/写') }}</Option>
<Option :value="0">{{ $L('只读') }}</Option> <Option :value="0">{{ $L('只读') }}</Option>
@ -431,7 +436,7 @@ export default {
let {pid, files} = this; let {pid, files} = this;
let array = []; let array = [];
while (pid > 0) { while (pid > 0) {
let file = files.find(({id, allow}) => id == pid && allow !== false); let file = files.find(({id, allow}) => id == pid && allow !== -1);
if (file) { if (file) {
array.unshift(file); array.unshift(file);
pid = file.pid; pid = file.pid;
@ -543,19 +548,22 @@ export default {
// //
const iconArray = []; const iconArray = [];
if (row.share) { if (row.share) {
if (row.share == 1) { if (row.userid != this.userId) {
iconArray.push(h('i', { iconArray.push(h('UserAvatar', {
class: 'taskfont', props: {
domProps: { userid: row.userid,
title: this.$L('所有人'), size: 20
innerHTML: '&#xe75c;'
}, },
})) }))
if (row.permission == 0) {
iconArray.push(h('span', {
class: 'permission',
}, this.$L('只读')))
}
} else { } else {
iconArray.push(h('i', { iconArray.push(h('i', {
class: 'taskfont', class: 'taskfont',
domProps: { domProps: {
title: this.$L('指定成员'),
innerHTML: '&#xe757;' innerHTML: '&#xe757;'
}, },
})) }))

View File

@ -32,6 +32,7 @@
.avatar { .avatar {
width: 26px; width: 26px;
height: 26px; height: 26px;
line-height: 26px;
} }
} }
.user-input-nickname { .user-input-nickname {

View File

@ -351,6 +351,10 @@
background-image: url("../images/file/wps.svg"); background-image: url("../images/file/wps.svg");
} }
} }
.permission {
padding-left: 6px;
font-size: 13px;
}
.taskfont { .taskfont {
color: #aaaaaa; color: #aaaaaa;
font-size: 16px; font-size: 16px;
@ -731,6 +735,22 @@
.common-avatar { .common-avatar {
flex: 1; flex: 1;
} }
.all-avatar {
flex: 1;
display: flex;
align-items: center;
.avatar-text {
width: 32px;
height: 32px;
line-height: 32px;
}
.avatar-name {
padding-left: 8px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
.ivu-select { .ivu-select {
width: auto; width: auto;
flex-shrink: 0; flex-shrink: 0;