1770 lines
54 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="container" v-resize="containerResize">
<!-- <van-pull-refresh v-model="refreshing" @refresh="onRefresh"> -->
<!--左侧菜单-->
<van-popup v-model="leftMenuShow" get-container="body" position="left" :style="{ height: '100%', width: '35%'}">
<div class="left-menu">
<div class="avatar">
<van-image
round
width="5rem"
height="5rem"
fit="cover"
:src="imageUrl+avatar"
/>
</div>
<span>{{ name }}</span>
<div class="classification">
<van-cell :title="$t('route.home')" icon="wap-home-o" @click="clickFileType(null,{})"/>
<van-cell :title="$t('route.favorite')" icon="star-o" @click="clickFileType(null,{isFavorite: true})"/>
<van-cell :title="$t('route.image')" icon="photo-o" @click="clickFileType('image',{isFolder: false})"/>
<van-cell :title="$t('route.video')" icon="video-o" @click="clickFileType('video',{isFolder: false})"/>
<van-cell :title="$t('route.audio')" icon="music-o" @click="clickFileType('audio',{isFolder: false})"/>
<van-cell :title="$t('route.fileTransfer')" icon="upgrade" @click="uploadList"/>
</div>
<div class="logout">
<van-button round type="danger" @click.native="logout">{{ $t('login.logout') }}</van-button>
</div>
</div>
</van-popup>
<van-list
v-model="loading"
:finished="finished"
:finished-text="statistics()"
@load="getFileList(true)"
>
<van-checkbox-group v-model="selectRowData" @change="checkboxChange" ref="checkboxGroup">
<van-cell-group>
<van-sticky :offset-top="-1">
<!-- <div>{{test}} {{diffTabbarTop}} {{lastTabbarOffsetTop}}</div> -->
<van-nav-bar
:style="vanNavBarClass"
v-if="pathList.length < 2 && !selectStatus"
:title="$t('app.browse')"
right-arrow
@click-right="checkboxAll"
:right-text="this.selectRowData.length !== this.fileList.length ? $t('common.select') : $t('common.cancel')"
@click-left="leftMenu"
left-arrow>
<div class="header-button" slot="left">
<svg
class="header-button-icon"
viewBox="0 0 1024 1024"
xmlns="http://www.w3.org/2000/svg"
width="25"
height="25"
>
<path
d="M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM142.4 642.1L298.7 519a8.84 8.84 0 0 0 0-13.9L142.4 381.9c-5.8-4.6-14.4-.5-14.4 6.9v246.3a8.9 8.9 0 0 0 14.4 7z"/>
</svg>
</div>
</van-nav-bar>
<van-nav-bar
:style="vanNavBarClass"
v-if="selectStatus"
:title="selectRowData.length === 0 ? $t('app.selectItem') : selectRowData.length + $t('common.item')"
right-arrow
:left-text="this.selectRowData.length !== this.fileList.length ? $t('app.selectAll') : $t('app.cancelSelectAll')"
@click-left="checkboxAll"
@click-right="cancelSelect"
right-text="完成"
>
</van-nav-bar>
<van-nav-bar
:style="vanNavBarClass"
v-if="pathList.length >= 2 && !selectStatus"
:title="pathList[pathList.length-1].folder"
:right-text="this.selectRowData.length !== this.fileList.length ? $t('common.select') : $t('common.cancel')"
left-arrow
@click-right="checkboxAll"
@click-left="clickBack">
<div class="header-button" slot="left">
<van-icon name="arrow-left"/>
</div>
</van-nav-bar>
<div class="searchbar" :style="searchBarClass">
<van-search
ref="search"
v-model="searchValue"
:show-action="searchStatus"
shape="round"
:placeholder="$t('common.search')"
@focus="startSearch"
@search="onSearch"
@input="onSearch"
>
<div slot="action" @click="endSearch">{{ $t('common.cancel') }}</div>
</van-search>
</div>
</van-sticky>
<!--操作-->
<van-cell :center="true" style="padding: 0 0 10px 0;">
<div class="operating-header">
<van-row>
<van-col class="operating-header-col" span="4" align="center" type="flex" @click="moreOperations">
<van-icon name="more-o"/>
</van-col>
<van-col class="operating-header-col" span="16" align="center" @click="showSortSheet">
已按{{ actionsSortName }}排序
<van-icon class="sortable" :name="'arrow-'+sortOrder"/>
</van-col>
<van-col class="operating-header-col" span="4" align="center" @click="changeVmode">
<van-icon name="bars"
:style="!grid?{background:'#1989fa',color:'#ffffff',padding:'0 5px',borderRadius: '5px'}:{}"/>
</van-col>
</van-row>
</div>
</van-cell>
<!--搜索结果-->
<van-cell v-if="searchStatus && searchValue.length > 0 && fileList.length > 0"
style="background-color:#f7f8fa;">
<div class="search-result">{{ resultCount }}个结果</div>
</van-cell>
<van-cell v-if="searchStatus && searchValue.length > 0 && fileList.length === 0">
<div class="search-result-no">无结果</div>
</van-cell>
<!--空状态-->
<van-empty v-if="!loading && fileList.length === 0" description="空空如也"/>
<van-cell v-if="!grid" class="list-item"
:style="{'background': selectIndexList.includes(index) ? '#90c2fcb5' : ''}" center
v-for="(item,index) in fileList" :key="item.id" @click="fileClick(item,index)"
:is-link="item.isFolder">
<div class="list-item-div" @touchstart="touchStart(item)" @touchend="touchEnd" @touchmove="touchMove">
<van-row class="row-file">
<van-col span="4" align="center" class="list-cell-icon">
<icon-file :item="item" :image-url="imageUrl" :audio-cover-url="audioCoverUrl"></icon-file>
</van-col>
<van-col span="16" class="list-item-content">
<van-col span="24">
{{ item.name }}
</van-col>
<van-col span="24" class="file-description" justify="space-between">
<van-col span="24">
{{ formatTime(item.agoTime) }}&nbsp;&nbsp;&nbsp;{{ formatSize(item.size) }}
</van-col>
</van-col>
</van-col>
<van-col span="4">
</van-col>
</van-row>
</div>
<van-checkbox class="file-item-checkbox" v-if="!grid && selectStatus" slot="right-icon" :name="item" ref="checkboxes"></van-checkbox>
</van-cell>
<van-grid v-if="grid" square :center="true" :column-num="gridColumnNum" :gutter="10" :border="false"
:style="{'width':'100%','overflow':'auto'}">
<van-grid-item class="parent-grid-item" v-for="(item,index) in fileList" ref="gridItem" :key="item.id"
@click="fileClick(item,index)">
<div
class="grid-time van-grid-item__content van-grid-item__content--center van-grid-item__content--square"
:style="{'background': selectIndexList.includes(index) ? '#90c2fcb5' : '', 'border-radius': '15px'}"
@touchstart="touchStart(item)" @touchend="touchEnd" @touchmove="touchMove">
<van-checkbox class="file-item-checkbox" v-if="grid && selectStatus" slot="right-icon" :name="item" ref="checkboxes"></van-checkbox>
<div class="grid-item-icon">
<icon-file :item="item" :image-url="imageUrl" :audio-cover-url="audioCoverUrl"
:grid="true"></icon-file>
</div>
<span :title="item.name" class="grid-item-text">{{ item.name }}</span>
</div>
</van-grid-item>
</van-grid>
</van-cell-group>
</van-checkbox-group>
</van-list>
<!-- </van-pull-refresh> -->
<!--选择上传文件菜单-->
<van-action-sheet
v-model="actionSheetShow"
:actions="actionsMenus"
cancel-text="取消"
@cancel="onCancel"
@select="selectActionsMenus">
</van-action-sheet>
<!--排序菜单-->
<van-action-sheet
v-model="actionSortSheetShow"
:actions="actionsSortMenus"
cancel-text="取消"
description="排序方式"
@cancel="onCancel"
@select="selectSortActionsMenus">
</van-action-sheet>
<van-dialog v-model="showNewFolder" show-cancel-button @confirm="newFolderNameClick">
<van-field class="new-folder-input" v-model="newFolderName" placeholder="请输入文件夹名称" :border="true"
:clearable="true" ref="newFolderInput" :autofocus="true">
</van-field>
</van-dialog>
<van-dialog v-model="showRename" show-cancel-button @confirm="rowRename()">
<van-field class="rename-input" v-model="renameFileName" placeholder="请输入文件名称" :border="true" :clearable="true"
ref="renameInput" :autofocus="true">
</van-field>
</van-dialog>
<e-vue-contextmenu ref="contextShow" class="newFileMenu" @ctx-show="show" @ctx-hide="hide">
<ul v-for="(item,index) in menus" :key="item.label"
:class="{'menu-list-first':index===0,'menu-list-last':index===menus.length-1,'menu-list':index<menus.length-1&&index>0}">
<div v-if="index !== 0" style="border-bottom:1px solid #cccccc85"></div>
<li :class="{'remove':item.operation==='remove'}" @click="menusOperations(item.operation)">
<div class="menuitem">
<svg-icon :icon-class="item.iconClass"/>
<span class="menuitem text">{{ item.label }}</span>
</div>
</li>
</ul>
</e-vue-contextmenu>
<van-overlay ref="overlayShow" :show="overlayShow" duration="0.3" @click="overlayClick">
<van-cell v-if="rowContextData.name!=null && !grid" :style="overlayContentClass"
class="list-item overlay-content-class" center :is-link="rowContextData.isFolder">
<div>
<van-row class="row-file">
<van-col span="4" align="center" class="list-cell-icon">
<icon-file :item="rowContextData" :image-url="imageUrl"></icon-file>
</van-col>
<van-col span="16" class="list-item-content">
<van-col span="24">
{{ rowContextData.name }}
</van-col>
<van-col span="24" class="file-description" justify="space-between">
<van-col span="24">
{{ formatTime(rowContextData.agoTime) }}&nbsp;&nbsp;&nbsp;{{ formatSize(rowContextData.size) }}
</van-col>
</van-col>
</van-col>
<van-col span="4"></van-col>
</van-row>
</div>
<van-checkbox class="file-item-checkbox" v-if="selectStatus" v-model="isShowCheckContext" slot="right-icon"
:name="rowContextData"></van-checkbox>
</van-cell>
<div v-if="rowContextData.name!=null && grid" :style="overlayContentClass"
class="grid-time overlay-content-class van-grid-item__content van-grid-item__content--center van-grid-item__content--square">
<van-checkbox class="file-item-checkbox" v-if="selectStatus" v-model="isShowCheckContext" slot="right-icon"
:name="rowContextData"></van-checkbox>
<div class="grid-item-icon">
<icon-file :item="rowContextData" :image-url="imageUrl" :audio-cover-url="audioCoverUrl"
:grid="true"></icon-file>
</div>
<span :title="rowContextData.name" class="grid-item-text">{{ rowContextData.name }}</span>
</div>
</van-overlay>
<!--为了不受右键区域的影响, 把弹窗之类的提取出来-->
<sim-text-preview :file.sync="textPreviewRow" :status.sync="textPreviewVisible"></sim-text-preview>
<image-viewer :fileList="fileList" :file="imagePreviewRow" :status.sync="imagePreviewVisible"></image-viewer>
<video-preview :file="videoPreviewRow" :status.sync="videoPreviewVisible"></video-preview>
<iframe-preview :file="officePreviewRow" :status.sync="officePreviewVisible"></iframe-preview>
</div>
</template>
<script>
import { mapGetters, mapState } from 'vuex'
import {formatSize, formatTime} from '@/utils/number'
import {getElementToPageLeft, getElementToPageTop} from '@/utils/dom'
import api from '@/api/file-api'
import IconFile from "../../../components/Icon/IconFile";
import fileConfig from "@/utils/file-config";
import ImageViewer from "@/components/preview/ImageViewer";
import VideoPreview from "@/components/preview/VideoPreview";
import SimTextPreview from "@/components/preview/SimTextPreview";
import {suffix} from "@/utils/file-type";
import IframePreview from "@/components/preview/IframePreview.vue";
import Clipboard from "clipboard";
export default {
components: {
IframePreview,
SimTextPreview,
VideoPreview,
ImageViewer, IconFile,
},
computed: {
...mapState(['message']),
...mapGetters([
'name',
'avatar'
])
},
data() {
return {
test: 0,
lastTabbarOffsetTop: 0,// 底部tabbar与上边框 上次的距离
diffTabbarTop: 0,// 底部tabbar与上边框的变化距离
isiPhoneX: 0,
imageUrl: `${process.env.VUE_APP_BASE_API}/view/thumbnail?jmal-token=${this.$store.state.user.token}&name=${this.$store.state.user.name}&id=`,
audioCoverUrl: `${process.env.VUE_APP_BASE_API}/view/cover?jmal-token=${this.$store.state.user.token}&name=${this.$store.state.user.name}&id=`,
tabActive: 0,
path: this.$route.query.path,
fileList: [],
pathList: [
{'folder': '', index: 0},
{'folder': '+', index: 1}
],
pagination: {
pageIndex: 0,
pageSize: 50,
total: 0,
},
queryFileType: null,
queryCondition: {isFolder: null},
loading: false,
finished: false,
refreshing: false,
actionSheetShow: false, // 下拉菜单
actionsMenus: [
{name: '新建文件夹'},
],
actionSortSheetShow: false,
actionsSortMenus: [
{name: '名称'},
{name: '日期'},
{name: '大小'},
],
actionsSortName: '名称',
showNewFolder: false,
showRename: false,
newFolderName: '新建文件夹',
Loop: null,
isJustHideMenus: false,
singleMenus: [
{iconClass: 'menu-select', label: '选择', operation: 'select'},
{iconClass: 'menu-favorite', label: '收藏', operation: 'favorite'},
{iconClass: 'menu-rename', label: '重命名', operation: 'rename'},
{iconClass: 'menu-copy', label: '移动或复制', operation: 'copy'},
{iconClass: 'menu-download', label: '下载', operation: 'download'},
{iconClass: 'menu-remove', label: '删除', operation: 'remove'}
],
menus: [],
rowContextData: {},
selectRowData: [],
checkboxGroup: [],
newFolderLoading: false,
renameLoading: false,
renameFileName: '',
selectIndexList: [],
selectStatus: false,
isShowCheckContext: false,
overlayShow: false,
overlayContentClass: {},
vanNavBarClass: {},
searchBarClass: {},
leftMenuShow: false,
searchValue: '',
searchStatus: true,
resultCount: 0,
sortOrder: 'up',
sortableProp: null,
order: null,
grid: false,
vmode: 'list',
gridColumnNum: -1,
imagePreviewRow: {},
imagePreviewVisible: false,
videoPreviewRow: {},
videoPreviewVisible: false,
officePreviewRow: {},
officePreviewVisible: false,
textPreviewVisible: false,
textPreviewRow: {},
};
},
directives: {
resize: { // 指令的名称
bind(el, binding) { // el为绑定的元素,binding为绑定给指令的对象
let width = '', height = '';
function isReize() {
const style = document.defaultView.getComputedStyle(el);
if (width !== style.width || height !== style.height) {
binding.value(); // 关键
}
width = style.width;
height = style.height;
}
el.__vueSetInterval__ = setInterval(isReize, 300);
},
unbind(el) {
clearInterval(el.__vueSetInterval__);
}
}
},
watch: {
message(msg) {
switch (msg.event) {
case 'getUploadParams':
this.$store.dispatch('updateMessage', {
event: 'onUploadParams',
data: this.getUploadParams(),
})
break
}
}
},
mounted() {
// 加载布局
if (this.$route.query.vmode) {
this.vmode = this.$route.query.vmode
this.grid = this.vmode !== 'list';
}
// 加载url上的path
if (this.$route.query.path !== '/') {
const path = decodeURI(this.$route.query.path)
this.pathList.splice(1, 1)
path.split('/').forEach((pathName, index) => {
if (index > 0) {
const item = {}
item['folder'] = pathName
item['index'] = index
this.pathList.push(item)
}
})
}
if (this.$route.query.folder && this.path) {
localStorage.setItem(this.path, this.$route.query.folder)
}
if (window.history && window.history.pushState) {
history.pushState(null, null, document.URL)
window.addEventListener('popstate', this.goBack, false)
}
},
destroyed() {
window.removeEventListener('popstate', this.goBack, false);
},
methods: {
// 是否高亮收藏图标
highlightFavorite(isFavorite, isHover) {
const item_menu = this.menus.find(item => {
if (item.operation === 'favorite' || item.operation === 'unFavorite') {
return item
}
})
if (item_menu) {
if (isFavorite) {
item_menu.label = '取消收藏'
item_menu.iconClass = 'menu-unfavorite-hover'
item_menu.operation = 'unFavorite'
} else {
if (isHover) {
item_menu.iconClass = 'menu-favorite-hover'
} else {
item_menu.iconClass = 'menu-favorite'
}
item_menu.label = '收藏'
item_menu.operation = 'favorite'
}
// this.$set(this.menus, 0, item_menu)
}
},
// 显示操作菜单
show() {
},
hide() {
const that = this
this.isJustHideMenus = true
setTimeout(function () {
that.isJustHideMenus = false
}, 100)
},
showCheckContext() {
return this.selectIndexList.includes(this.rowContextData.index)
},
// 长按事件
rowContextmenu(row, target, touchClientX) {
this.menus = JSON.parse(JSON.stringify(this.singleMenus));
// 改变菜单
if (this.selectStatus && this.selectIndexList.includes(row.index)) {
if (this.selectIndexList.includes(row.index)) {
const item = {iconClass: 'menu-unselect', label: '取消选择', operation: 'unselect'}
this.menus.splice(0, 1, item)
}
} else {
const item = {iconClass: 'menu-select', label: '选择', operation: 'select'}
this.menus.splice(0, 1, item)
}
if (row.isShare && !row.isPrivacy) {
// 添加复制下载链接选项
this.menus.splice(-2, 0, { iconClass: "menu-fuzhi", label: "复制下载链接", operation: "copyDownloadLink" })
}
this.preliminaryRowData(row)
// 长按选择的数据
const offsetTop = getElementToPageTop(target) - row.scrollY
const e = {}
if ((offsetTop + (target.offsetHeight / 2)) > document.body.offsetHeight / 2) {
e.pageX = touchClientX
e.pageY = getElementToPageTop(target) - this.menus.length * 47 + 5
} else {
e.pageX = touchClientX
e.pageY = getElementToPageTop(target) + target.offsetHeight + 5
}
this.$refs.contextShow.showMenu(e)
},
// 选择某行预备数据
preliminaryRowData(row) {
this.rowContextData = row
this.isShowCheckContext = this.selectIndexList.includes(row.index)
const isFavorite = this.rowContextData.isFavorite
this.highlightFavorite(isFavorite, false)
},
// 菜单操作
menusOperations(operation) {
const that = this
switch (operation) {
case 'favorite':
this.favoriteOperating(true)
break
case 'open':
this.fileClick(this.rowContextData, this.rowContextData.index)
break
case 'unselect':
const index = this.rowContextData.index
this.$refs.checkboxes[index].toggle();
break
case 'unFavorite':
this.favoriteOperating(false)
break
case 'select':
this.selectStatus = true
this.selectIndexList.push(this.rowContextData.index)
setTimeout(() => {
this.$refs.checkboxes[that.rowContextData.index].toggle()
}, 0)
break
case 'rename':
this.renameFileName = this.rowContextData.name
this.showRename = true
setTimeout(function () {
that.$refs.renameInput.focus()
}, 0)
break
case 'copy':
vant.Toast('暂不支持移动');
break
case 'download':
this.downloadFile()
break
case "copyDownloadLink":
// 复制下载链接
this.copyDownloadLink(this.rowContextData)
break;
case 'remove':
this.deleteFile()
break
}
this.overlayShow = false
document.documentElement.style.overflow = null;
this.$refs.contextShow.hideMenu()
},
// 重命名
rowRename() {
const row = this.rowContextData
let newFileName = this.renameFileName
if (newFileName) {
if (!row.isFolder) {
const ext = '.' + row.suffix
if (!newFileName.endsWith(ext)) {
newFileName += ext
}
}
this.renameLoading = true
const findIndex = this.fileList.findIndex(item => {
if (newFileName === item.name) {
return item;
}
})
if (findIndex > -1) {
let msg = '该文件已存在'
if (row.isFolder) {
msg = '该文件夹已存在'
}
this.$message({
message: msg,
type: 'warning'
});
this.renameLoading = false
return
}
api.rename({
newFileName: encodeURI(newFileName),
username: this.$store.state.user.name,
folder: this.$route.query.folder,
id: row.id
}).then(() => {
this.renameLoading = false
row.name = newFileName
this.fileList[row.index] = row
this.editingIndex = -1
})
} else {
this.editingIndex = -1
}
},
downloadFile() {
let fileIds = [];
if (this.selectRowData.length > 0) {
this.selectRowData.forEach(value => {
fileIds.push(value.id)
})
} else {
fileIds.push(this.rowContextData.id)
}
if (fileIds.length > 1 || this.rowContextData.isFolder) {
fileConfig.packageDownload(fileIds)
return
}
fileConfig.download(this.$store.state.user.name, this.rowContextData, this.$store.state.user.token)
},
// 复制下载链接
copyDownloadLink(row) {
let url = window.location.origin + fileConfig.previewUrl(this.$store.getters.name, row, undefined, undefined)
let clipboard = new Clipboard('.newFileMenu', {
text: function () {
return url
}
})
clipboard.on('success', e => {
this.$message({message: '复制成功', type: 'success', duration: 1000});
// 释放内存
clipboard.destroy()
})
clipboard.on('error', e => {
// 不支持复制
this.$message({message: '该浏览器不支持自动复制', type: 'warning', duration: 1000});
clipboard.destroy()
})
},
// 收藏/取消收藏
favoriteOperating(isFavorite) {
this.rowContextData.isFavorite = isFavorite
this.highlightFavorite(isFavorite, true)
api.favoriteUrl({
fileIds: this.rowContextData.id,
isFavorite: isFavorite
}).then(res => {
})
},
// 删除
deleteFile() {
let fileList = []
const fileIds = []
if (this.selectRowData.length > 0) {
fileList = this.selectRowData
this.selectRowData.forEach(value => {
fileIds.push(value.id)
})
} else {
fileList = this.selectRowData
fileIds.push(this.rowContextData.id)
}
const str = this.getShowSumFileAndFolder(fileList)
vant.Dialog.confirm({
title: '提示',
message: '此操作将永久删除' + str + ', 是否继续?'
}).then(() => {
api.delete({
currentDirectory: this.rowContextData.path,
username: this.$store.state.user.name,
fileIds: fileIds,
sweep: true
}).then(() => {
// 刷新列表
this.getFileList()
vant.Toast.setDefaultOptions({duration: 800});
vant.Toast.success('删除成功');
if (this.selectRowData.length > 1) {
this.selectRowData = []
}
})
})
},
touchMove() {
// // 避免和长按事件冲突
clearTimeout(this.Loop);
// e.preventDefault();
},
touchStart(item) {
// e.preventDefault();
// Toast.setDefaultOptions({ duration: 500 });
//手指触摸
clearTimeout(this.Loop); //再次清空定时器,防止重复注册定时器
const e = window.event
this.Loop = setTimeout(() => {
item.scrollY = e.targetTouches[0].pageY - e.targetTouches[0].clientY
if (this.findListItem(item, e.targetTouches[0].target, e.targetTouches[0].clientX)) {
this.overlayShow = true
document.documentElement.style.overflow = 'hidden';
}
}, 500);
},
touchEnd() {
//手指离开
clearTimeout(this.Loop);
},
// 点击遮罩层
overlayClick() {
this.overlayShow = false
document.documentElement.style.overflow = null;
},
findListItem(item, target, touchClientX) {
if (target === null) {
return false
}
const offsetParent = target.offsetParent
const parentElement = target.parentElement
if (!offsetParent && parentElement || offsetParent === null) {
return this.findListItem(item, target.parentElement, touchClientX)
} else {
if (offsetParent.className.indexOf('list-item') > -1) {
// list
this.longPressDisplayLayer(item, offsetParent, touchClientX)
} else if (offsetParent.className.indexOf('grid-time') > -1) {
// grid
this.longPressDisplayLayer(item, offsetParent, touchClientX)
} else {
return this.findListItem(item, target.offsetParent, touchClientX)
}
}
return true
},
// 长按显示层
longPressDisplayLayer(item, offsetParent, touchClientX) {
const background = this.selectIndexList.includes(this.rowContextData.index) ? '#90c2fcb5' : ''
this.overlayContentClass = {
'top': (getElementToPageTop(offsetParent) - item.scrollY) + 'px',
'height': offsetParent.offsetHeight + 'px',
'width': offsetParent.offsetWidth + 'px',
'left': getElementToPageLeft(offsetParent) + 'px',
'border-radius': '0px',
'background': background
}
setTimeout(() => {
this.overlayContentClass = {
'top': (getElementToPageTop(offsetParent) - item.scrollY) + 'px',
'height': offsetParent.offsetHeight + 'px',
'width': (offsetParent.offsetWidth - (this.grid ? 0 : 10)) + 'px',
'left': (getElementToPageLeft(offsetParent) + (this.grid ? 0 : 5)) + 'px',
'border-radius': '20px',
'background': background
}
}, 0)
this.rowContextmenu(item, offsetParent, touchClientX)
},
// 浏览器的返回事件
goBack() {
if (this.pathList.length <= 1) {
this.$router.push(`/_m?vmode=${this.vmode}&path=${encodeURI(this.path)}`)
return
}
this.clickBack()
},
// 点击返回按钮(标题), 返回上一级
clickBack() {
this.handleLink(this.pathList[this.pathList.length - 2], this.pathList.length - 2)
},
//菜单键
leftMenu() {
this.leftMenuShow = true
},
async logout() {
await this.$store.dispatch('user/logout')
this.$router.push(`/login?redirect=${this.$route.fullPath}`)
},
startSearch() {
// this.searchStatus = true
this.vanNavBarClass = {
visibility: 'hidden'
}
this.searchBarClass = {
marginTop: '-30px'
}
let searchAction = document.querySelector('.van-search__action')
searchAction.style.marginRight = '0px'
searchAction.style.visibility = 'visible'
searchAction.style.color = '#1989fa'
},
endSearch() {
const that = this
setTimeout(function () {
that.vanNavBarClass = {
visibility: 'visible'
}
}, 150)
this.searchBarClass = {
marginTop: '0px'
}
let searchAction = document.querySelector('.van-search__action')
searchAction.style.marginRight = '-44px'
searchAction.style.visibility = 'hidden'
this.searchValue = ''
this.pathList.splice(1, this.pathList.length - 1)
this.$router.push(`?vmode=${this.vmode}`)
this.getFileList()
},
onSearch() {
if (this.searchValue.length < 1) {
this.$router.push(`?vmode=${this.vmode}`)
this.getFileList()
} else {
this.searchFile(this.searchValue)
}
},
// 切换布局
changeVmode() {
this.grid = !this.grid
this.vmode = 'list'
if (this.grid) {
this.vmode = 'grid'
}
if (!this.path) {
this.path = ''
}
this.$router.push(`?vmode=${this.vmode}&path=${this.path}${this.$route.query.folder ? '&folder='+this.$route.query.folder : ''}`)
},
showSortSheet() {
this.actionSortSheetShow = true
},
// 更多操作
moreOperations() {
// Toast("提示").setDefaultOptions({ duration: 200 });
this.actionSheetShow = true
this.actionsMenus = [
{name: '新建文件夹'},
]
if (window.uploader.support) {
const menuItem = {}
menuItem['name'] = '上传文件'
this.actionsMenus.push(menuItem)
}
if (window.uploader.supportDirectory) {
const menuItem = {}
menuItem['name'] = '上传文件夹'
this.actionsMenus.push(menuItem)
}
},
handleLink(item, index, unPushLink, unRefresh) {
if (item && item.search) {
if (item.searchKey) {
this.searchFileByKeyWord(item.searchKey)
} else if (item.row) {
this.searchFileAndOpenDir(item.row)
}
this.pathList.splice(this.pathList.findIndex((v, i) => i === index + 1), this.pathList.length - (index + 1))
} else {
this.pathList.splice(this.pathList.findIndex((v, i) => i === index + 1), this.pathList.length - (index + 1))
this.pathList.forEach((p, number) => {
if (number === 0) {
this.path = ''
} else if (number === this.pathList.length) {
} else {
this.path += '/' + this.pathList[number].folder
}
})
let queryFolder = localStorage.getItem(this.path)
if (!unPushLink) {
if (!this.$route.query.path) {
this.$router.push(`/_m?vmode=${this.vmode}&path=${encodeURI(this.path)}${queryFolder ? '&folder='+queryFolder : ''}`)
} else {
this.$router.push(`/_m?vmode=${this.vmode}&path=${encodeURI(this.path)}${queryFolder ? '&folder='+queryFolder : ''}`)
}
}
if (!unRefresh) {
this.pagination.pageIndex = 1
this.getFileList()
}
}
},
// 格式化最近时间
formatTime(time) {
return formatTime(time)
},
// 格式化文件大小
formatSize(size) {
return formatSize(size)
},
// 下拉刷新
onRefresh() {
// 清空列表数据
this.finished = false;
// 重新加载数据
// 将 loading 设置为 true,表示处于加载状态
this.loading = true;
this.getFileList();
},
searchFileAndOpenDir(fileId, onLoad) {
this.beforeLoadData(onLoad);
api.searchFileAndOpenDir({
userId: this.$store.state.user.userId,
username: this.$store.getters.name,
id: fileId,
pageIndex: this.pagination.pageIndex,
pageSize: this.pagination.pageSize,
folder: this.$route.query.folder,
}).then(res => {
this.loadData(res, onLoad)
this.listModeSearch = true
})
},
getFileList(onLoad) {
this.beforeLoadData(onLoad)
if (this.$route.query.keyword) {
if (this.$route.query.keyword !== "undefined") {
this.searchValue = this.$route.query.keyword
}
const searchPathIndex = this.pathList.findIndex(item => item.search)
if (this.$route.query.folder && searchPathIndex > -1) {
this.searchFileAndOpenDir(this.$route.query.folder, false)
} else {
this.searchFile(this.searchValue, onLoad)
}
} else {
api.fileList({
username: this.$store.state.user.name,
userId: this.$store.state.user.userId,
currentDirectory: encodeURI(this.$route.query.path),
folder: this.$route.query.folder,
queryFileType: this.queryFileType,
sortableProp: this.sortableProp,
order: this.order,
isFolder: this.queryCondition.isFolder,
isFavorite: this.queryCondition.isFavorite,
queryCondition: this.queryCondition,
pageIndex: this.pagination.pageIndex,
pageSize: this.pagination.pageSize,
}).then(res => {
this.loadData(res, onLoad)
}).catch(e => {
})
}
},
searchFile(key, onLoad) {
if (key) {
this.beforeLoadData(onLoad)
this.$router.push(`?vmode=${this.vmode}&keyword=${key}`)
api.searchFile({
userId: this.$store.state.user.userId,
username: this.$store.state.user.name,
keyword: key,
currentDirectory: encodeURI(this.$route.query.path),
pageIndex: this.pagination.pageIndex,
pageSize: this.pagination.pageSize
}).then(res => {
this.loadData(res, onLoad)
this.path = ''
this.listModeSearch = true
})
}
},
// 请求之前的准备
beforeLoadData(onLoad) {
if (onLoad) {
this.pagination.pageIndex++
} else {
this.pagination.pageIndex = 1
this.fileList = []
}
this.finished = false;
},
// 填充数据
loadData(res, onLoad) {
if (onLoad) {
res.data.forEach((file, index) => {
file['index'] = (this.pagination.pageIndex - 1) * this.pagination.pageSize + index
this.fileList.push(file)
})
} else {
this.fileList = res.data
this.fileList.map((file, index) => {
file['index'] = index
})
}
this.refreshing = false
this.resultCount = res.count
// 数据全部加载完成
if (this.fileList.length >= res.count) {
this.finished = true;
}
// 排序
this.fileList.sort(this.compare(this.sortableProp))
this.$nextTick(() => {
this.containerResize()
// 加载状态结束
this.loading = false
})
},
containerResize() {
const container = document.querySelector(".container")
let clientWidth = container.clientWidth
if (clientWidth > 1024) {
this.gridColumnNum = Math.round(clientWidth / 100 - 4)
} else {
this.gridColumnNum = Math.round(clientWidth / 100 - 2)
if (clientWidth <= 550) {
this.gridColumnNum = 4
}
if (clientWidth <= 375) {
this.gridColumnNum = 3
}
}
},
clickFileType(queryFileType, queryCondition) {
this.queryCondition = queryCondition
this.queryFileType = queryFileType
this.getFileList()
this.leftMenuShow = false
},
uploadList() {
this.$router.push(`/upload/index_m`)
},
// 统计
statistics() {
let totalSize = 0
this.fileList.forEach(file => {
totalSize += file.size;
})
return this.getShowSumFileAndFolder(this.fileList) + ' ' + this.getShowSumSize(totalSize)
},
// 统计文件和文件夹
getShowSumFileAndFolder(fileList) {
let folderSize = 0
let fileSize = 0
fileList.forEach((fileInfo) => {
if (fileInfo.isFolder) {
folderSize += 1
} else {
fileSize += 1
}
})
let folderSum = ''
if (folderSize > 0) {
folderSum = folderSize + '个文件夹'
}
let fileSum = ''
if (fileSize > 0) {
fileSum = fileSize + '个文件'
}
return folderSum + ' ' + fileSum
},
// 计算总大小
getShowSumSize(totalSize) {
let sizeSum = ''
if (totalSize > 0) {
sizeSum = ' 共'
}
if (totalSize === 0) {
return sizeSum
} else if (totalSize < 1024) {
sizeSum += totalSize + 'B'
} else if (totalSize >= 1024 && totalSize < 1024 * 1024) {
sizeSum += (totalSize / 1024).toFixed(2) + 'K'
} else if (totalSize >= 1024 * 1024 && totalSize < 1024 * 1024 * 1024) {
sizeSum += (totalSize / (1024 * 1024)).toFixed(2) + 'M'
} else {
sizeSum += (totalSize / (1024 * 1024 * 1024)).toFixed(2) + 'G'
}
return sizeSum
},
// 全选或反选
checkboxAll() {
if (this.selectRowData.length !== this.fileList.length) {
this.$refs.checkboxGroup.toggleAll(true);
} else {
this.$refs.checkboxGroup.toggleAll();
}
},
// 取消选择状态
cancelSelect() {
this.$refs.checkboxGroup.toggleAll(false)
const that = this
setTimeout(function () {
that.selectStatus = false
})
},
// 选择状态改变时触发
checkboxChange(any) {
this.selectRowData = any
this.selectIndexList = []
for (const item of any) {
this.selectIndexList.push(item.index)
}
this.selectStatus = true
},
// 点击文件或文件夹
fileClick(row, index) {
if (this.selectStatus) {
this.$refs.checkboxes[index].toggle();
} else {
if (row.isFolder) {
// 打开文件夹
if (this.path) {
this.path += '/' + row.name
} else {
this.path = '/' + row.name
}
const item = {}
item['folder'] = row.name
item['index'] = this.pathList.length - 1
this.pathList.push(item)
const keyword = this.$route.query.keyword ? `&keyword=${this.$route.query.keyword}` : ''
if (this.listModeSearch) {
const item = {};
item["folder"] = row.name;
item["search"] = true;
item["row"] = row;
this.pathList.push(item);
this.pagination.pageIndex = 1;
const folder = row.id ? `&folder=${row.id}` : ''
const path = this.$route.query.path ? `&path=${this.$route.query.path}` : ''
this.$router.push(`?vmode=${this.vmode}${path}${keyword}${folder}`);
this.getFileList()
} else {
const path = encodeURI(this.path);
if (this.$store.getters.userId !== row.userId) {
row.mountFileId = row.id
}
if (row.mountFileId) {
localStorage.setItem(this.path, row.mountFileId)
}
this.$router.push(`/_m?vmode=${this.vmode}&path=${path}${keyword}${row.mountFileId ? '&folder='+row.mountFileId : ''}`)
this.getFileList()
}
} else {
if (row.contentType.startsWith('image')) {
// 图片
this.imagePreviewVisible = true
this.imagePreviewRow = row
return
}
if (suffix.simText.includes(row.suffix)) {
// 文本文件
this.textPreviewRow = row
this.textPreviewVisible = true
return
}
if (row.contentType.indexOf('video') > -1) {
// 视频文件
this.videoPreviewVisible = true
this.videoPreviewRow = row
return
}
if (row.contentType.indexOf('audio') > -1) {
// 音频文件
this.$store.dispatch('updateMessage', { event: 'onAddAudio', data: { row: row, audioCoverUrl: this.audioCoverUrl } })
return
}
if (row.contentType.indexOf('office') > -1 || row.suffix === 'csv') {
// office文件
this.officePreviewVisible = true
this.officePreviewRow = row
return
}
if (row.suffix === 'pdf') {
// pdf文件
fileConfig.preview(this.$store.state.user.name, row, this.$store.getters.token)
return
}
vant.Dialog.confirm({
title: '标题',
message: '此文件不支持预览,是否下载',
confirmButtonText: '下载'
}).then(() => {
// 通用下载文件的方法
setTimeout(() => {
fileConfig.download(this.$store.state.user.name, row, this.$store.state.user.token)
}, 0)
}).catch(() => {
// on cancel
});
}
}
},
onCancel() {
this.actionSheetShow = false
this.actionSortSheetShow = false
},
compare(property) {
return (a, b) => {
let value1 = a[property]
let value2 = b[property]
if (this.order === 'ascending') {
return value1 - value2
} else {
return value2 - value1
}
}
},
selectSortActionsMenus(action) {
const that = this
setTimeout(function () {
that.actionSortSheetShow = false
}, 100)
if (this.sortOrder === 'up') {
this.sortOrder = 'down'
this.order = 'descending'
} else {
this.sortOrder = 'up'
this.order = 'ascending'
}
this.actionsSortName = action.name
if (action.name === '名称') {
this.sortableProp = 'name'
if (this.sortOrder === 'up') {
this.order = null
}
this.getFileList()
}
if (action.name === '大小') {
this.sortableProp = 'size'
this.fileList.sort(this.compare(this.sortableProp))
}
if (action.name === '日期') {
this.sortableProp = 'updateDate'
this.getFileList()
// this.fileList.sort(this.compare('agoTime'))
}
},
// 选择上传文件菜单
selectActionsMenus(action) {
const that = this
setTimeout(function () {
that.actionSheetShow = false
}, 100)
// 新建文件夹
if (action.name === '新建文件夹') {
this.newFolderName = '新建文件夹'
let append = 0
let filenameList = []
this.fileList.forEach(file => {
filenameList.push(file.name)
})
while (filenameList.includes(this.newFolderName)) {
append += 1
this.newFolderName = '新建文件夹' + append
}
this.showNewFolder = true
const that = this
setTimeout(function () {
that.$refs.newFolderInput.focus()
}, 0)
}
// 上传文件
if (action.name === '上传文件') {
// 打开文件选择框
this.$store.dispatch('updateMessage', { event: 'openUploader'})
}
// 上传文件夹
if (action.name === '上传文件夹') {
// 打开文件夹选择框
this.$store.dispatch('updateMessage', { event: 'uploadFolder'})
}
},
getUploadParams() {
return {
// 传入的参数
folder: this.$route.query.folder,
currentDirectory: encodeURI(this.path),
username: this.$store.state.user.name,
userId: this.$store.state.user.userId
}
},
// 新建文件夹
newFolderNameClick() {
this.newFolderLoading = true
if (this.newFolderName) {
api.uploadFolder({
isFolder: true,
filename: encodeURI(this.newFolderName),
folder: this.$route.query.folder,
currentDirectory: encodeURI(this.path),
username: this.$store.state.user.name,
userId: this.$store.state.user.userId
}).then((res) => {
if (res.data === 1) {
this.newFolderLoading = false
this.$message({
message: '该文件夹已存在',
type: 'warning'
});
} else {
this.newFolderLoading = false
this.showNewFolder = false
this.isShowNewFolder = false
Notify({type: 'success', message: '新建文件夹成功', duration: 1000});
if (this.listModeSearch) {
this.getFileListBySearchMode()
} else {
this.getFileList()
}
}
})
} else {
this.newFolderLoading = false
this.$message({
message: '请输入文件夹名称',
type: 'warning'
});
}
},
swipeUp() {
this.test = 10
},
tabBottom() {
return {padding: '0 0 20px 0'}
}
}
}
</script>
<style lang="scss" scoped>
* {
-webkit-touch-callout: none; /*系统默认菜单被禁用*/
-webkit-user-select: none; /*webkit浏览器*/
-moz-user-select: none; /*火狐*/
-ms-user-select: none; /*IE10*/
user-select: none;
}
input {
-webkit-user-select: auto; /*webkit浏览器*/
}
.tab-bottom {
padding: 0 0 25px 0;
.van-tabbar-item {
margin-top: 25px;
animation: ordinary .4s forwards;
-moz-animation: ordinary .4s forwards; /* Firefox */
-webkit-animation: ordinary .4s forwards; /* Safari and Chrome */
-o-animation: ordinary .4s forwards; /* Opera */
}
}
@keyframes iphoneX {
from {
margin-top: 25px;
}
to {
margin-top: -5px;
}
}
@keyframes ordinary {
from {
margin-top: -5px;
}
to {
margin-top: 25px;
}
}
.tab-bottom-iphoneX {
padding: 0 0 25px 0;
.van-tabbar-item {
animation: iphoneX .4s forwards;
-moz-animation: iphoneX .4s forwards; /* Firefox */
-webkit-animation: iphoneX .4s forwards; /* Safari and Chrome */
-o-animation: iphoneX .5s forwards; /* Opera */
}
}
.tab-bottom-iphoneXS {
padding: 0 0 25px 0;
.van-tabbar-item {
animation: iphoneX .4s forwards;
-moz-animation: iphoneX .4s forwards; /* Firefox */
-webkit-animation: iphoneX .4s forwards; /* Safari and Chrome */
-o-animation: iphoneX .4s forwards; /* Opera */
}
}
.van-tabbar-item {
color: #646566;
text-align: center;
margin-top: 20px;
font-size: 10px;
.tab-text {
margin-top: 2px;
}
}
.container {
font-size: 14px;
.classification {
padding: 1rem 0 1rem 0;
background: wheat;
}
}
>>> .block {
.audio-player-close {
width: 1em;
height: 1em;
}
}
/*.van-divider {*/
/*margin: 5px 15px 0px 15px;*/
/*}*/
.file-description {
color: #646566;
font-size: 12px;
}
.van-col {
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.list-item {
padding: 5px 10px;
.list-cell-icon {
font-size: 18px;
}
.list-item-content {
margin-left: 5px;
}
>>> .svg-icon {
width: 2.5em;
height: 2.5em;
}
}
.overlay-content-class {
-webkit-transition: all .1s ease-in-out 0s;
transition: all .1s ease-in-out 0s;
box-shadow: 2px 3px 3px #888888;
}
.list-item:active {
background-color: #bfcbd930;
}
>>> .van-sticky {
background: inherit;
-webkit-backdrop-filter: saturate(180%) blur(10px);
backdrop-filter: saturate(180%) blur(10px);
background-color: rgba(255, 255, 255, 0.72);
box-shadow: 2px 0 2px rgba(0, 0, 0, 0.25);
}
[class*=van-hairline]::after {
border: 0 solid rgba(255, 255, 255, 0.72);
}
>>> .van-sticky--fixed {
z-index: 1;
}
.van-nav-bar {
/*height: 59px;*/
/*line-height: 59px;*/
background-color: unset;
-webkit-transition: all .15s ease-in-out 0s;
transition: all .15s ease-in-out 0s;
/*position: relative;*/
/*box-shadow: 4px 0 2px rgba(0,0,0,0.5);*/
}
.van-nav-bar::after {
/*background: inherit;*/
/*!*-webkit-filter: blur(15px);*!*/
/*!*filter: blur(20px);*!*/
/*-webkit-backdrop-filter: saturate(180%) blur(20px);*/
/*backdrop-filter: saturate(180%) blur(20px);*/
/*background-color: rgba(255,255,255,0.72);*/
}
.van-overlay {
-webkit-backdrop-filter: saturate(180%) blur(1.5px);
backdrop-filter: saturate(180%) blur(1.5px);
background-color: rgba(0, 0, 0, .7);
}
.van-nav-bar__title {
width: 30%;
position: absolute;
margin-left: 35%;
z-index: 11;
}
.van-nav-bar__left {
// max-width: 30%;
z-index: 11;
.van-icon-arrow-left {
font-size: 24px;
}
}
/*.van-nav-bar__left:active {*/
/*background-color: #f8f8f8;*/
/*!*background-color: hsl(0, 94%, 47%);*!*/
/*}*/
.van-nav-bar__right {
z-index: 11;
}
.van-nav-bar__arrow + .van-nav-bar__text {
max-width: 7.5rem;
min-width: 5.5rem;
text-align: left;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.new-folder-input >>> .van-field__body {
height: 40px;
}
.newFileMenu ul {
list-style: none;
padding-inline-start: 0;
margin-top: 0;
margin-bottom: 0;
padding: 0 5px;
}
.newFileMenu {
color: #000000db;
background-color: #efefef;
padding: 1px 0;
}
>>> .menu-background::after {
background: inherit;
-webkit-backdrop-filter: saturate(180%) blur(20px);
backdrop-filter: saturate(180%) blur(20px);
background-color: rgba(255, 255, 255, 0.72);
}
.newFileMenu li {
cursor: pointer;
margin: 0;
padding: 0;
font-size: 1em;
min-width: 136px;
height: 3em;
}
.newFileMenu .remove {
color: rgba(255, 0, 0, 0.8);
}
.newFileMenu .menu-list-first li:active {
border-top-left-radius: 1rem;
border-top-right-radius: 1rem;
background-color: #E1E1E1;
}
.newFileMenu .menu-list li:active {
background-color: #E1E1E1;
}
.newFileMenu .menu-list-last li:active {
border-bottom-right-radius: 1rem;
border-bottom-left-radius: 1rem;
background-color: #E1E1E1;
}
/*.newFileMenu li:active {*/
/*cursor: pointer;*/
/*border-radius: 1rem;*/
/*background-color: #cccccc;*/
/*}*/
.newFileMenu li .menuitem {
cursor: pointer;
line-height: 3em;;
margin-left: 10%;
}
.newFileMenu li .menuitem .text {
cursor: pointer;
margin-left: 10%;
font-weight: normal;
}
.newFileMenu li .menuitem .svg-icon {
width: 1rem;
height: 1rem;
}
>>> .ctx-menu-container {
top: unset;
border: 1px solid rgba(0, 0, 0, .15);
-webkit-box-shadow: 0 0 0 #ccc;
box-shadow: 0 0 0 #ccc;
}
.header-button {
margin: 0 -16px;
padding: 0 16px;
}
.header-button-icon {
width: 1.5rem;
height: 1.5rem;
vertical-align: middle;
}
.header-button:active {
background-color: #f2f3f5;
}
.left-menu {
padding: 1rem 0 0 0;
height: 100%;
width: 100%;
text-align: center;
}
.logout {
padding: 1rem 0 0 0;
}
.classification {
padding: 1rem 0 0 0;
>>> .van-cell:active {
background-color: #f8f8f8;
}
}
.searchbar {
height: 48px;
background-color: unset;
-webkit-transition: all .3s ease-in-out 0s;
transition: all .3s ease-in-out 0s;
/*background: inherit;*/
/*background-color: #fff;*/
/*-webkit-backdrop-filter: saturate(180%) blur(20px);*/
/*backdrop-filter: saturate(180%) blur(20px);*/
/*background-color: rgba(255,255,255,0.72);*/
}
/*.searchbar::after{*/
/*background: inherit;*/
/*background-color: #fff;*/
/*-webkit-backdrop-filter: saturate(180%) blur(20px);*/
/*backdrop-filter: saturate(180%) blur(20px);*/
/*background-color: rgba(255,255,255,0.72);*/
/*}*/
.van-search {
padding: 0 12px;
}
.van-search__action {
-webkit-transition: all .3s ease-in-out 0s;
transition: all .3s ease-in-out 0s;
margin-right: -44px;
visibility: hidden;
}
.search-result {
font-weight: 600;
font-size: 20px;
height: unset;
margin-top: unset;
}
.search-result-no {
height: 80px;
line-height: 80px;
font-weight: 600;
font-size: 20px;
text-align: center;
}
.operating-header {
.operating-header-col {
height: 28px;
color: #1989fa;
.sortable {
font-size: 14px !important;
}
.van-icon {
line-height: 28px;
font-size: 20px;
color: #1989fa;
}
}
.operating-header-col:active {
color: #C2CCD1;
.van-icon {
color: #C2CCD1;
}
}
}
>>> .grid-item-text {
text-align: center;
color: #606266;
word-wrap: break-word;
width: -webkit-fill-available;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
>>> .van-grid-item__content {
padding: 0px;
.grid-item-icon {
svg {
width: 4rem;
height: 4rem;
}
.favorite.svg-icon {
width: 1.5rem !important;
height: 1.5rem !important;
margin: 15px 10px;
}
.el-image {
width: 4rem !important;
height: 4rem !important;
}
}
}
.file-item-checkbox {
position: absolute;
top: 0.5rem;
right: 0.5rem;
z-index: 1;
}
</style>