feat: 共享给所有人
This commit is contained in:
parent
2b0467e00f
commit
4d8cf41b7a
@ -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,
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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('所有人')"></i>
|
||||
<i v-else class="taskfont" :title="$L('指定成员')"></i>
|
||||
<i class="taskfont"></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: ''
|
||||
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: ''
|
||||
},
|
||||
}))
|
||||
|
@ -32,6 +32,7 @@
|
||||
.avatar {
|
||||
width: 26px;
|
||||
height: 26px;
|
||||
line-height: 26px;
|
||||
}
|
||||
}
|
||||
.user-input-nickname {
|
||||
|
20
resources/assets/sass/pages/page-file.scss
vendored
20
resources/assets/sass/pages/page-file.scss
vendored
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user