290 lines
7.8 KiB
Vue
290 lines
7.8 KiB
Vue
<template>
|
||
<div class="ele-body">
|
||
<a-card
|
||
:bordered="false"
|
||
:body-style="{padding: 0, minHeight: '520px'}">
|
||
<div style="padding: 16px 16px 0 16px;">
|
||
<!-- 工具栏 -->
|
||
<div class="ele-table-tool">
|
||
<div class="ele-table-tool-title">
|
||
<a-space>
|
||
<a-upload
|
||
:showUploadList="false"
|
||
:customRequest="doUpload">
|
||
<a-button type="primary">上传</a-button>
|
||
</a-upload>
|
||
<a-button type="primary">新建文件夹</a-button>
|
||
<a-button danger type="primary">删除</a-button>
|
||
</a-space>
|
||
</div>
|
||
<!-- 搜索框 -->
|
||
<div style="max-width: 240px;">
|
||
<a-input-search
|
||
v-model:value="search"
|
||
placeholder="搜索您的文件"/>
|
||
</div>
|
||
<!-- 显示方式切换 -->
|
||
<menu-outlined
|
||
v-if="grid"
|
||
class="ele-file-tool-btn"
|
||
@click="grid=!grid"/>
|
||
<appstore-outlined
|
||
v-else
|
||
class="ele-file-tool-btn"
|
||
@click="grid=!grid"/>
|
||
</div>
|
||
<!-- 文件目录面包屑 -->
|
||
<div class="ele-file-breadcrumb-group ele-cell">
|
||
<div class="ele-cell-content ele-cell">
|
||
<div
|
||
v-if="directory.length"
|
||
class="ele-file-breadcrumb-back ele-text-primary"
|
||
@click="back">返回上一级
|
||
</div>
|
||
<div class="ele-file-breadcrumb-list ele-cell-content ele-cell">
|
||
<div
|
||
:class="['ele-file-breadcrumb-item ele-cell', {'ele-text-primary': directory.length}]"
|
||
@click="listAll">
|
||
<div class="ele-file-breadcrumb-item-title">全部文件</div>
|
||
<right-outlined v-if="directory.length"/>
|
||
</div>
|
||
<div
|
||
v-for="(item,index) in directory"
|
||
:key="index"
|
||
@click="listDir(index)"
|
||
:class="['ele-file-breadcrumb-item ele-cell', {'ele-text-primary': index!==directory.length-1}]">
|
||
<div class="ele-file-breadcrumb-item-title">{{ item }}</div>
|
||
<right-outlined v-if="index!==directory.length-1"/>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div>已全部加载,共 {{ data.length }} 个</div>
|
||
</div>
|
||
</div>
|
||
<a-spin :spinning="loading">
|
||
<!-- 文件展示列表 -->
|
||
<ele-file-list
|
||
:data="data"
|
||
v-model:checked="checked"
|
||
:grid="grid"
|
||
:sort="sort"
|
||
:order="order"
|
||
@item-click="onItemClick"
|
||
@sort-change="onSortChange">
|
||
</ele-file-list>
|
||
</a-spin>
|
||
</a-card>
|
||
</div>
|
||
</template>
|
||
|
||
<script>
|
||
import EleFileList from 'ele-admin-pro/packages/ele-file-list';
|
||
import {
|
||
MenuOutlined,
|
||
AppstoreOutlined,
|
||
RightOutlined
|
||
} from '@ant-design/icons-vue';
|
||
|
||
export default {
|
||
name: 'ExtensionFile',
|
||
components: {
|
||
EleFileList,
|
||
MenuOutlined,
|
||
AppstoreOutlined,
|
||
RightOutlined
|
||
},
|
||
data() {
|
||
return {
|
||
// 加载状态
|
||
loading: true,
|
||
// 是否网格展示
|
||
grid: true,
|
||
// 文件列表数据
|
||
data: [],
|
||
// 选中数据
|
||
checked: [],
|
||
// 文件目录面包屑数据
|
||
directory: [],
|
||
// 搜索
|
||
search: '',
|
||
// 排序字段
|
||
sort: '',
|
||
// 排序方式
|
||
order: '',
|
||
// 图片预览文件
|
||
currentImage: '',
|
||
};
|
||
},
|
||
computed: {
|
||
// 图片预览列表
|
||
previewList() {
|
||
return this.data.filter(d => d.thumbnail).map(d => d.url);
|
||
}
|
||
},
|
||
mounted() {
|
||
this.query();
|
||
},
|
||
methods: {
|
||
/* 查询文件列表 */
|
||
query() {
|
||
this.checked = [];
|
||
this.loading = true;
|
||
this.$http.get('/file/list', {
|
||
params: {
|
||
directory: this.directory.join('/'),
|
||
sort: this.sort,
|
||
order: this.order
|
||
}
|
||
}).then(res => {
|
||
this.loading = false;
|
||
if (res.data.code === 0) {
|
||
res.data.data.forEach(d => {
|
||
// 文件地址加baseURL
|
||
if (d.url) {
|
||
d.url = this.$http.defaults.baseURL + '/' + d.url;
|
||
}
|
||
if (d.thumbnail) {
|
||
d.thumbnail = this.$http.defaults.baseURL + '/' + d.thumbnail;
|
||
}
|
||
// 文件大小格式化
|
||
if (d.isDirectory) {
|
||
d.length = '-';
|
||
} else {
|
||
d.length = this.getFileSize(d.length);
|
||
}
|
||
// 修改时间格式化
|
||
if (d.updateTime) {
|
||
d.updateTime = this.$util.toDateString(d.updateTime);
|
||
}
|
||
});
|
||
this.data = res.data.data;
|
||
} else {
|
||
this.$message.error(res.data.msg);
|
||
}
|
||
}).catch(e => {
|
||
this.loading = false;
|
||
this.$message.error(e.message);
|
||
});
|
||
},
|
||
/* item点击事件 */
|
||
onItemClick(item) {
|
||
if (item.isDirectory) { // 文件夹
|
||
this.directory.push(item.name);
|
||
this.query();
|
||
} /*else if (item.thumbnail) {
|
||
this.currentImage = item.url;
|
||
}*/ else if (this.checked.indexOf(item) !== -1) {
|
||
this.checked.splice(this.checked.indexOf(item), 1);
|
||
} else {
|
||
this.checked.push(item);
|
||
}
|
||
},
|
||
/* 返回上级 */
|
||
back() {
|
||
this.directory.splice(this.directory.length - 1, 1);
|
||
this.query();
|
||
},
|
||
/* 全部文件 */
|
||
listAll() {
|
||
if (!this.directory.length) {
|
||
return;
|
||
}
|
||
this.directory = [];
|
||
this.query();
|
||
},
|
||
/* 回到指定目录 */
|
||
listDir(index) {
|
||
if (index === this.directory.length - 1) {
|
||
return;
|
||
}
|
||
this.directory.splice(index, this.directory.length - index);
|
||
this.query();
|
||
},
|
||
/* 文件大小格式化 */
|
||
getFileSize(value) {
|
||
if (value < 1024) {
|
||
return value + 'B';
|
||
} else if (value < 1024 * 1024) {
|
||
return (value / 1024).toFixed(1) + 'KB';
|
||
} else if (value < 1024 * 1024 * 1024) {
|
||
return (value / 1024 / 1024).toFixed(1) + 'M';
|
||
} else {
|
||
return (value / 1024 / 1024 / 1024).toFixed(1) + 'G';
|
||
}
|
||
},
|
||
/* 文件列表排序方式改变 */
|
||
onSortChange(obj) {
|
||
this.order = obj.order;
|
||
this.sort = obj.sort;
|
||
this.query();
|
||
},
|
||
/* 查看文件 */
|
||
view(item) {
|
||
if (item.isDirectory) {
|
||
this.onItemClick(item);
|
||
} else if (item.url) {
|
||
window.open(item.url);
|
||
}
|
||
},
|
||
/* 上传 */
|
||
doUpload({file}) {
|
||
let formData = new FormData();
|
||
formData.append('file', file);
|
||
const hide = this.$message.loading('上传中..', 0);
|
||
this.$http.post('/file/upload', formData).then(res => {
|
||
hide();
|
||
if (res.data.code === 0) {
|
||
this.$message.success(res.data.msg);
|
||
this.directory = [res.data.dir.replace(/\//, '')];
|
||
this.query();
|
||
} else {
|
||
this.$message.error(res.data.msg);
|
||
}
|
||
}).catch(e => {
|
||
hide();
|
||
this.$message.error(e.message);
|
||
});
|
||
return false;
|
||
}
|
||
}
|
||
}
|
||
</script>
|
||
|
||
<style scoped>
|
||
/* 图标按钮 */
|
||
.ele-file-tool-btn {
|
||
font-size: 20px;
|
||
margin-left: 16px;
|
||
cursor: pointer;
|
||
}
|
||
|
||
/* 文件目录面包屑 */
|
||
.ele-file-breadcrumb-group {
|
||
margin-bottom: 12px;
|
||
line-height: 1;
|
||
}
|
||
|
||
.ele-file-breadcrumb-back {
|
||
padding-right: 12px;
|
||
border-right: 1px solid hsla(0, 0%, 60%, .3);
|
||
}
|
||
|
||
.ele-file-breadcrumb-back:hover,
|
||
.ele-file-breadcrumb-item.ele-text-primary:hover > .ele-file-breadcrumb-item-title {
|
||
text-decoration: underline;
|
||
cursor: pointer;
|
||
}
|
||
|
||
.ele-file-breadcrumb-item .anticon {
|
||
margin: 0 4px;
|
||
font-size: 12px;
|
||
}
|
||
|
||
@media screen and (max-width: 768px) {
|
||
.ele-table-tool > .ele-table-tool-title + div,
|
||
.ele-file-breadcrumb-group > .ele-cell-content + div {
|
||
display: none;
|
||
}
|
||
}
|
||
</style>
|