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\FileUser;
use App\Models\User;
use App\Models\WebSocket;
use App\Module\Base;
use App\Module\Ihttp;
use Arr;
use Illuminate\Support\Facades\DB;
use Request;
use Response;
/**
* @apiDefine file
@ -56,10 +54,17 @@ class FileController extends AbstractController
}
} 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')
->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();
if ($list->isNotEmpty()) {
foreach ($list as $file) {
@ -556,7 +561,6 @@ class FileController extends AbstractController
// 取消共享
$action = "delete";
foreach ($userids as $userid) {
if (!intval($userid)) continue;
if (FileUser::where([
'file_id' => $file->id,
'userid' => $userid,
@ -571,8 +575,6 @@ class FileController extends AbstractController
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,

View File

@ -56,7 +56,7 @@ class File extends AbstractModel
*/
public function exceAllow($userid)
{
if (!$this->chackAllow($userid)) {
if ($this->chackAllow($userid) === -1) {
throw new ApiException('没有访问权限');
}
}
@ -66,22 +66,26 @@ class File extends AbstractModel
* 自己的文件夹
* 在指定共享成员内
* @param $userid
* @return bool
* @return int -1:没有权限0:只读1:读写
*/
public function chackAllow($userid)
{
if ($userid == $this->userid) {
// ① 自己的文件夹
return true;
return 1;
}
$row = $this->getShareInfo();
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 class="file-icon">
<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">
<i v-if="item.share == 1" class="taskfont" :title="$L('所有人')">&#xe75c;</i>
<i v-else class="taskfont" :title="$L('指定成员')">&#xe757;</i>
<i class="taskfont">&#xe757;</i>
</div>
</template>
</div>
@ -207,9 +208,9 @@
:disabledChoice="shareAlready"
:multiple-max="100"
: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-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-userid">All</div>
</div>
@ -230,7 +231,11 @@
<div class="page-file-share-title">{{ $L('已共享成员') }}:</div>
<ul class="page-file-share-list">
<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)">
<Option :value="1">{{ $L('读/写') }}</Option>
<Option :value="0">{{ $L('只读') }}</Option>
@ -431,7 +436,7 @@ export default {
let {pid, files} = this;
let array = [];
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) {
array.unshift(file);
pid = file.pid;
@ -543,19 +548,22 @@ export default {
//
const iconArray = [];
if (row.share) {
if (row.share == 1) {
iconArray.push(h('i', {
class: 'taskfont',
domProps: {
title: this.$L('所有人'),
innerHTML: '&#xe75c;'
if (row.userid != this.userId) {
iconArray.push(h('UserAvatar', {
props: {
userid: row.userid,
size: 20
},
}))
if (row.permission == 0) {
iconArray.push(h('span', {
class: 'permission',
}, this.$L('只读')))
}
} else {
iconArray.push(h('i', {
class: 'taskfont',
domProps: {
title: this.$L('指定成员'),
innerHTML: '&#xe757;'
},
}))

View File

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

View File

@ -351,6 +351,10 @@
background-image: url("../images/file/wps.svg");
}
}
.permission {
padding-left: 6px;
font-size: 13px;
}
.taskfont {
color: #aaaaaa;
font-size: 16px;
@ -731,6 +735,22 @@
.common-avatar {
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 {
width: auto;
flex-shrink: 0;