no message

This commit is contained in:
aipaw 2021-06-30 08:50:07 +08:00
parent 14bb9bb7b2
commit 3ecb3b3992
2 changed files with 87 additions and 26 deletions

View File

@ -15,6 +15,22 @@ use Request;
*/ */
class FileController extends AbstractController class FileController extends AbstractController
{ {
/**
* 获取文件列表
*
* @apiParam {Number} [pid] 父级ID
*/
public function lists()
{
$user = User::auth();
//
$pid = intval(Request::input('pid'));
//
$list = File::whereUserid($user->userid)->wherePid($pid)->orderBy('name')->take(500)->get();
//
return Base::retSuccess('success', $list);
}
/** /**
* 添加项目 * 添加项目
* *
@ -46,10 +62,13 @@ class FileController extends AbstractController
} }
// //
if ($pid > 0) { if ($pid > 0) {
if (!File::whereUserid($user->id)->whereId($pid)->exists()) { if (!File::whereUserid($user->userid)->whereId($pid)->exists()) {
return Base::retError('参数错误'); return Base::retError('参数错误');
} }
} }
if (File::whereUserid($user->userid)->wherePid($pid)->count() >= 300) {
return Base::retError('每个文件夹里最多只能创建300个文件或文件夹');
}
// 开始创建 // 开始创建
$file = File::createInstance([ $file = File::createInstance([
'pid' => $pid, 'pid' => $pid,

View File

@ -3,7 +3,7 @@
<PageTitle :title="$L('文件')"/> <PageTitle :title="$L('文件')"/>
<div class="file-wrapper"> <div class="file-wrapper">
<div class="file-head"> <div class="file-head">
<h1>{{$L('文件')}}</h1> <h1 @click="pid=0">{{$L('文件')}}</h1>
<div class="file-search"> <div class="file-search">
<i class="iconfont">&#xe6f8;</i> <i class="iconfont">&#xe6f8;</i>
</div> </div>
@ -21,13 +21,13 @@
</EDropdown> </EDropdown>
</div> </div>
</div> </div>
<div v-if="files.length + temps.length == 0" class="file-no"> <div v-if="files.length == 0" class="file-no">
<i class="iconfont">&#xe60b;</i> <i class="iconfont">&#xe60b;</i>
<p>{{$L('没有任何文件')}}</p> <p>{{$L('没有任何文件')}}</p>
</div> </div>
<div v-else class="file-list"> <div v-else class="file-list">
<ul class="clearfix"> <ul class="clearfix">
<li v-for="item in folderList" :class="item.type"> <li v-for="item in folderList" :class="item.type" @click="openFile(item)">
<div class="file-icon"></div> <div class="file-icon"></div>
<div v-if="item._edit" class="file-input"> <div v-if="item._edit" class="file-input">
<Input <Input
@ -41,7 +41,7 @@
</div> </div>
<div v-else class="file-name">{{item.name}}</div> <div v-else class="file-name">{{item.name}}</div>
</li> </li>
<li v-for="item in fileList" :class="item.type"> <li v-for="item in fileList" :class="item.type" @click="openFile(item)">
<div class="file-icon"></div> <div class="file-icon"></div>
<div v-if="item._edit" class="file-input"> <div v-if="item._edit" class="file-input">
<Input <Input
@ -62,10 +62,14 @@
<script> <script>
import {mapState} from "vuex"; import {mapState} from "vuex";
import {sortBy} from "lodash";
export default { export default {
data() { data() {
return { return {
loadIng: 0,
pid: 0,
types: [ types: [
{value: 'folder', name: "目录"}, {value: 'folder', name: "目录"},
{value: 'document', name: "文本"}, {value: 'document', name: "文本"},
@ -74,7 +78,6 @@ export default {
{value: 'flow', name: "流程图"}, {value: 'flow', name: "流程图"},
], ],
files: [], files: [],
temps: [],
} }
}, },
@ -90,27 +93,63 @@ export default {
...mapState(['userInfo']), ...mapState(['userInfo']),
folderList() { folderList() {
const data = this.files.filter(({type}) => type == 'folder') return sortBy(this.files.filter(({type, pid}) => pid == this.pid && type == 'folder'), 'name')
return Object.assign(data, this.temps.filter(({type}) => type == 'folder'))
}, },
fileList() { fileList() {
const data = this.files.filter(({type}) => type != 'folder') return sortBy(this.files.filter(({type, pid}) => pid == this.pid && type != 'folder'), 'name')
return Object.assign(data, this.temps.filter(({type}) => type != 'folder'))
} }
}, },
watch: { watch: {
pid: {
handler() {
this.getLists();
},
immediate: true
}
}, },
methods: { methods: {
getLists() {
this.loadIng++;
this.$store.dispatch("call", {
url: 'file/lists',
data: {
pid: this.pid,
},
}).then(({data}) => {
this.loadIng--;
this.saveFile(data);
}).catch(({msg}) => {
$A.modalError(msg);
this.loadIng--;
})
},
saveFile(file) {
if ($A.isArray(file)) {
file.forEach((item) => {
this.saveFile(item);
});
return;
}
let index = this.files.findIndex(({id}) => id == file.id);
if (index > -1) {
this.files.splice(index, 1, file);
} else {
this.files.push(file)
}
},
addFile(command) { addFile(command) {
let id = $A.randomString(8); let id = $A.randomString(8);
this.temps.push({ this.files.push({
_edit: true, _edit: true,
pid: this.pid,
id: id, id: id,
type: command, type: command,
name: '',
newname: this.$L('未命名') newname: this.$L('未命名')
}); });
this.$nextTick(() => { this.$nextTick(() => {
@ -120,21 +159,30 @@ export default {
}) })
}, },
openFile(item) {
if (item.type == 'folder') {
this.pid = item.id;
}
},
onBlur(item) { onBlur(item) {
this.onEnter(item); if (!item.newname) {
this.files = this.files.filter(({id}) => id != item.id);
}
}, },
onEnter(item) { onEnter(item) {
if (item._load) {
return;
}
if (!item.newname) { if (!item.newname) {
this.temps = this.temps.filter(({id}) => id != item.id); this.files = this.files.filter(({id}) => id != item.id);
} else { } else {
if (item._load) {
return;
}
this.$set(item, '_load', true); this.$set(item, '_load', true);
this.$store.dispatch("call", { this.$store.dispatch("call", {
url: 'file/add', url: 'file/add',
data: { data: {
pid: item.pid,
name: item.newname, name: item.newname,
type: item.type, type: item.type,
}, },
@ -142,18 +190,12 @@ export default {
$A.messageSuccess(msg) $A.messageSuccess(msg)
this.$set(item, '_load', false); this.$set(item, '_load', false);
this.$set(item, '_edit', false); this.$set(item, '_edit', false);
if (this.temps.find(({id}) => id == item.id)) { this.files = this.files.filter(({id}) => id != item.id);
this.temps = this.temps.filter(({id}) => id != item.id); this.saveFile(data);
this.files.push(data);
} else {
Object.keys(data).forEach((key) => {
this.$set(item, key, data[key]);
})
}
}).catch(({msg}) => { }).catch(({msg}) => {
$A.modalError(msg) $A.modalError(msg)
this.$set(item, '_edit', false); this.$set(item, '_edit', false);
this.temps = this.temps.filter(({id}) => id != item.id); this.files = this.files.filter(({id}) => id != item.id);
}) })
} }
} }