<style scoped> @import url("./iconfont.css"); .matter-icon { font-size: 25px; } .matter-title { top: -5px; display: inline; margin-left: 10px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; position: relative; } </style> <template> <div style="height: 100%"> <el-row> <el-button size="mini" type="success" @click="dialogVisible = true" >上传文件</el-button > <el-button size="mini" type="primary" @click="createFolder" >新建文件夹</el-button > <!-- <el-button size="mini" type="info">移动文件</el-button> <el-button size="mini" type="warning">下载文件</el-button> --> <el-button size="mini" type="danger" @click="removeFiles" >删除文件</el-button > </el-row> <div style="margin: 20px 0px"> <el-breadcrumb separator="/"> <el-breadcrumb-item ><a @click.prevent="getAllFiles">全部文件</a></el-breadcrumb-item > <el-breadcrumb-item v-for="(item, index) in currentDirList" :key="index" ><a @click.prevent="viewFiles(item, index)" href="javascript:void(0)" >{{ item }}</a ></el-breadcrumb-item > </el-breadcrumb> </div> <el-table v-loading="loading" :data="tableData" size="medium" stripe style="width: 100%" height="700px" tooltip-effect="dark" v-el-table-infinite-scroll="onScrollEnd" @selection-change="onSelectionChange" > <el-table-column type="selection" width="30" :selectable="onSelectable" ></el-table-column> <el-table-column label="文件"> <template slot-scope="scope"> <i v-if="scope.row.is_dir" class="matter-icon el-icon-folder" style="color: #ffc402" ></i> <i v-else :class="`iconfont matter-icon ${scope.row.icon}`"></i> <el-link :underline="false" class="matter-title" href="Javascript: void(0);" > <span @click="onNameClick(scope.row)">{{ scope.row.name }}</span> </el-link> </template> </el-table-column> <el-table-column prop="size" label="文件大小" width="120" ></el-table-column> <el-table-column prop="create_at" label="创建日期" width="180" ></el-table-column> <el-table-column prop="create_by.username" label="创建者" width="150" ></el-table-column> <el-table-column label="操作" width="100"> <template slot-scope="scope"> <el-button icon="el-icon-edit" type="text" @click="onRename(scope.row)">重命名</el-button> </template> </el-table-column> </el-table> <el-dialog title="上传文件" :visible.sync="dialogVisible" width="30%"> <el-upload drag name="binfile" :headers="uploadHeaders" :data="uploadData" :before-upload="onBeforeUpload" :on-success="onUploadSuccess" :action="`${window.location.protocol}//${window.location.host}/api/v1/evm_store/netdisc/add`" multiple > <i class="el-icon-upload"></i> <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div> <div class="el-upload__tip" slot="tip">文件不超过100mb</div> </el-upload> </el-dialog> </div> </template> <script> import { download } from "@/utils/index"; import elTableInfiniteScroll from "el-table-infinite-scroll"; import { getFileList, addFile, updateFile, deleteFile } from "@/api/index"; export default { name: "Files", directives: { "el-table-infinite-scroll": elTableInfiniteScroll, }, data() { return { loading: false, tableData: [], dialogVisible: false, selectList: [], currentDirList: [], currentDir: "/", uploadData: { parent_dir: "/", file_type: "", }, uploadHeaders: { Authorization: this.$store.getters.token, }, urlRoot: "", }; }, watch: { $route: "onRouteChange", }, computed: { window: () => window, }, methods: { getAllFiles() { this.currentDir = "/"; this.currentDirList = []; this.getFileList(); }, onSelectionChange(selection) { this.selectList = selection; }, onScrollEnd() { // if (this.total != 0 && this.rows.length == this.total) { // console.log("no more"); // return; // } // this.getFileList(this.offset, this.limit); console.log("to do nothing"); }, onSelectable(row) { if (row.is_dir !== 1) return true; }, onRename(row) { console.log(row) this.$prompt("请输入名称", "提示", { confirmButtonText: "确定", cancelButtonText: "取消", inputPattern: !/(\\|:)+/g, inputErrorMessage: "文件夹格式不正确", }) .then(({ value }) => { this.updateFile(row.uuid, { name: value }); }) .catch(() => { this.$message({ type: "info", message: "取消动作", }); }); }, removeFiles() { this.$confirm("此操作将永久删除该文件, 是否继续?", "提示", { confirmButtonText: "确定", cancelButtonText: "取消", type: "warning", }) .then(() => { this.deleteFile() }) .catch(() => { this.$message({ type: "info", message: "已取消删除", }); }); }, onRouteChange(newVal) { if (this.currentDir != newVal.query.dir) { this.currentDir = newVal.query.dir; // change the current direction when the route changed } this.getFileList(); }, isOfficeFile(type) { let officeTypes = [ "application/msword", "application/vnd.ms-excel", "application/vnd.ms-powerpoint", "application/vnd.openxmlformats-officedocument.wordprocessingml.document", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "application/vnd.openxmlformats-officedocument.presentationml.presentation", ]; return officeTypes.includes(type); }, officeIcon(type) { let docTypes = [ "application/msword", "application/vnd.openxmlformats-officedocument.wordprocessingml.document", ]; let excelTypes = [ "application/vnd.ms-excel", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", ]; let pptTypes = [ "application/vnd.ms-powerpoint", "application/vnd.openxmlformats-officedocument.presentationml.presentation", ]; if (docTypes.includes(type)) { return "icon-doc"; } else if (excelTypes.includes(type)) { return "icon-excel"; } else if (pptTypes.includes(type)) { return "icon-ppt"; } }, type2icon(type) { let [t1, t2] = type.split("/"); let mt = ["pdf", "html", "xml", "psd", "rtf"]; if (mt.includes(t2)) { return `icon-${t2}`; } let codeTypes = ["json", "yaml", "x-yaml"]; if (codeTypes.includes(t2)) { return "icon-html"; } let compressedFileTypes = ["zip", "x-gzip", "tar", "gz", "rar"]; if (compressedFileTypes.includes(t2)) { return "icon-compressed-file"; } if (this.isOfficeFile(type)) { return this.officeIcon(type); } let gt = ["audio", "video", "image", "text"]; if (gt.includes(t1)) { return `icon-${t1}`; } return "icon-file"; }, buildQuery(dir) { if (dir.startsWith(this.rootDir)) { dir = dir.replace(this.rootDir, ""); } let query = !dir ? {} : { dir: dir }; return { query: query }; }, onNameClick(item) { if (item.is_dir == 1) { this.currentDirList.push(item.name); this.currentDir = "/" + this.currentDirList.join("/"); this.getFileList(); return; } download(item.name, this.urlRoot + item.real_path); }, convert(limit) { var size = ""; if (limit < 0.1 * 1024) { //如果小于0.1KB转化成B size = limit.toFixed(2) + "B"; } else if (limit < 0.1 * 1024 * 1024) { //如果小于0.1MB转化成KB size = (limit / 1024).toFixed(2) + "KB"; } else if (limit < 0.1 * 1024 * 1024 * 1024) { //如果小于0.1GB转化成MB size = (limit / (1024 * 1024)).toFixed(2) + "MB"; } else { //其他转化成GB size = (limit / (1024 * 1024 * 1024)).toFixed(2) + "GB"; } var sizestr = size + ""; var len = sizestr.indexOf("."); var dec = sizestr.substr(len + 1, 2); if (dec == "00") { //当小数点后为00时 去掉小数部分 return sizestr.substring(0, len) + sizestr.substr(len + 3, 2); } return sizestr; }, createFolder() { this.$prompt("请输入文件夹名称", "提示", { confirmButtonText: "确定", cancelButtonText: "取消", inputPattern: !/(\\|:)+/g, inputErrorMessage: "文件夹格式不正确", }) .then(({ value }) => { this.addFile(value); }) .catch(() => { this.$message({ type: "info", message: "取消动作", }); }); }, onBeforeUpload(file) { this.uploadData.file_type = file.type; }, onUploadSuccess() { this.getFileList(); }, viewFiles(dir, idx) { let t = this.currentDirList.slice(0, idx).join("/"); this.currentDirList = this.currentDirList.slice(0, idx + 1); if (t.startsWith("/")) this.currentDir = t + "/" + dir; else if (t.length) this.currentDir = "/" + t + "/" + dir; else this.currentDir = "/" + dir; this.getFileList(); }, getFileList() { this.loading = true; getFileList({ parent_dir: this.currentDir }) .then((res) => { this.tableData = res.data.map((item) => { item.size = this.convert(item.size); item.icon = this.type2icon(item.file_type); return item; }); this.urlRoot = res.url; }) .catch((err) => { this.tableData = []; console.log(err); }) .finally(() => { this.loading = false; }); }, addFile(name) { addFile({ name: name, parent_dir: this.currentDir }) .then((res) => { this.$message.success(res.message); this.getFileList(); }) .catch((err) => { this.$message.error(err.message); }); }, updateFile(id, params) { updateFile(id, params) .then((res) => { this.$message.success(res.message); this.getFileList(); }) .catch((err) => { this.$message.error(err.message); }); }, deleteFile() { deleteFile({ uuids: this.selectList.map(item => item.uuid) }) .then((res) => { this.$message.success(res.message); this.getFileList(); }) .catch((err) => { this.$message.error(err.message); }); }, }, mounted() {}, created() { this.getFileList(); }, }; </script>