381 lines
9.6 KiB
Vue
381 lines
9.6 KiB
Vue
<template>
|
||
<view class="fileItem" @click="fileClick" @longpress.stop="longpress">
|
||
<view class="icon">
|
||
<image class="iconImg" :src="icon" mode="aspectFit" />
|
||
</view>
|
||
<view class="fileInfo">
|
||
<text
|
||
class="fileName"
|
||
:style="{
|
||
color: item.type == 'back' ? '#999' : '#333',
|
||
}"
|
||
>
|
||
{{ item.name }}
|
||
</text>
|
||
<view v-if="item.type != 'back'" class="fileMeta">
|
||
<text class="textItem">{{ item.date }}</text>
|
||
<text v-if="item.type == 'file'" class="textItem">
|
||
{{ item.sizeText }}
|
||
</text>
|
||
</view>
|
||
</view>
|
||
</view>
|
||
</template>
|
||
<script>
|
||
import appDelDir from '../libs/appDelDir'
|
||
|
||
export default {
|
||
props: {
|
||
/**
|
||
* 当前文件路径类型
|
||
*/
|
||
dirType: {
|
||
type: String,
|
||
default: '',
|
||
},
|
||
/**
|
||
* 文件路径列表
|
||
*/
|
||
dirList: {
|
||
type: Array,
|
||
default: () => [],
|
||
},
|
||
/**
|
||
* 单个列表对象
|
||
*/
|
||
item: {
|
||
type: Object,
|
||
default() {
|
||
return {
|
||
type: '', // 对象类型 dir back file
|
||
name: '',
|
||
fileType: '', // 文件后缀名称
|
||
size: '', // 文件大小
|
||
icon: '', //图标
|
||
time: '', // 最后更改日期
|
||
date: '',
|
||
fileCount: 0, //文件夹下的文件数量
|
||
directoryCount: 0, //文件夹下的目录数量
|
||
}
|
||
},
|
||
},
|
||
},
|
||
computed: {
|
||
icon() {
|
||
// #ifdef APP-PLUS
|
||
// IOS端直接访问本地图片会报跨域,所以仅支持安卓预览图片
|
||
if (
|
||
uni.getSystemInfoSync().platform == 'android' &&
|
||
this.item.type == 'file' &&
|
||
['jpg', 'jpeg', 'png', 'gif', 'webp', 'bmp'].indexOf(this.item.fileType) > -1
|
||
) {
|
||
let path = this.getPath()
|
||
return path
|
||
}
|
||
// #endif
|
||
return this.item.icon
|
||
},
|
||
},
|
||
data() {
|
||
return {}
|
||
},
|
||
methods: {
|
||
/**
|
||
* 点击事件
|
||
*/
|
||
fileClick() {
|
||
let that = this
|
||
if (this.item.type == 'dir') {
|
||
this.$emit('goChildDir', this.item.name)
|
||
} else if (this.item.type == 'back') {
|
||
this.$emit('goChildDir', '__back__')
|
||
} else {
|
||
if (
|
||
//? 使用文本编辑器快捷打开文件
|
||
['txt', 'sql', 'js', 'css', 'html', 'log', 'json'].indexOf(this.item.fileType) != -1
|
||
) {
|
||
this.openInEdit()
|
||
} else if (['jpg', 'jpeg', 'png', 'gif', 'webp', 'bmp'].indexOf(this.item.fileType) != -1) {
|
||
let path = that.getPath()
|
||
uni.previewImage({
|
||
urls: [path],
|
||
})
|
||
} else {
|
||
this.longpress()
|
||
}
|
||
}
|
||
},
|
||
/**
|
||
* 使用文本编辑器打开
|
||
*/
|
||
openInEdit() {
|
||
let that = this
|
||
let path = that.getPath()
|
||
that.$emit('openEditFileDialog', {
|
||
title: that.item.name,
|
||
canSave: that.dirType != 'PRIVATE_WWW',
|
||
path,
|
||
size: that.item.size,
|
||
})
|
||
},
|
||
/**
|
||
* 获取当前文件绝对路径
|
||
*/
|
||
getPath() {
|
||
let that = this
|
||
let path = ''
|
||
switch (that.dirType) {
|
||
case 'wx':
|
||
path = wx.env.USER_DATA_PATH
|
||
break
|
||
case 'PRIVATE_DOC':
|
||
path = '_doc'
|
||
break
|
||
case 'PRIVATE_WWW':
|
||
path = '_www'
|
||
break
|
||
case 'PUBLIC_DOCUMENTS':
|
||
path = '_documents'
|
||
break
|
||
case 'PUBLIC_DOWNLOADS':
|
||
path = '_downloads'
|
||
break
|
||
default:
|
||
break
|
||
}
|
||
that.dirList.map((x) => {
|
||
path += '/' + x
|
||
})
|
||
path = path + '/' + that.item.name
|
||
return path
|
||
},
|
||
/**
|
||
* 长按事件
|
||
*/
|
||
longpress() {
|
||
let that = this
|
||
let path = that.getPath()
|
||
|
||
let menu = [
|
||
{
|
||
text: `复制绝对路径`,
|
||
click() {
|
||
// #ifdef APP-PLUS
|
||
path = plus.io.convertLocalFileSystemURL(path)
|
||
// #endif
|
||
uni.setClipboardData({
|
||
data: path,
|
||
})
|
||
},
|
||
},
|
||
{
|
||
text: `删除`,
|
||
click() {
|
||
uni.showModal({
|
||
title: '警告',
|
||
content:
|
||
'是否确认删除' +
|
||
(that.item.type == 'dir' ? '文件夹:' : '文件:') +
|
||
that.item.name +
|
||
'?',
|
||
success(res) {
|
||
if (res.confirm) {
|
||
uni.showLoading({
|
||
title: '删除中',
|
||
})
|
||
|
||
function delSuccess() {
|
||
uni.hideLoading()
|
||
uni.showToast({
|
||
title: '删除成功!',
|
||
icon: 'success',
|
||
})
|
||
that.$emit('getPage')
|
||
}
|
||
function delError() {
|
||
uni.hideLoading()
|
||
uni.showToast({
|
||
title: '删除失败',
|
||
icon: 'none',
|
||
})
|
||
}
|
||
|
||
// #ifdef MP-WEIXIN
|
||
if (1) {
|
||
let fs = wx.getFileSystemManager()
|
||
|
||
if (that.item.type == 'file') {
|
||
// ! 删除文件
|
||
fs.unlink({
|
||
filePath: path,
|
||
success: delSuccess,
|
||
fail: delError,
|
||
})
|
||
} else {
|
||
// ! 删除文件夹
|
||
fs.rmdir({
|
||
dirPath: path,
|
||
recursive: true,
|
||
success: delSuccess,
|
||
fail: delError,
|
||
})
|
||
}
|
||
|
||
return
|
||
}
|
||
// #endif
|
||
|
||
if (that.item.type == 'file') {
|
||
// ! 删除文件
|
||
plus.io.resolveLocalFileSystemURL(
|
||
path,
|
||
(entry) => {
|
||
// 可通过entry对象操作test.html文件
|
||
entry.remove(delSuccess, delError)
|
||
},
|
||
delError,
|
||
)
|
||
} else {
|
||
// ! 删除文件夹
|
||
appDelDir(path + '/')
|
||
.then(delSuccess)
|
||
.catch(delError)
|
||
}
|
||
}
|
||
},
|
||
})
|
||
},
|
||
},
|
||
]
|
||
|
||
let isMp = false
|
||
// #ifdef MP-WEIXIN
|
||
isMp = true
|
||
// #endif
|
||
|
||
if (!isMp || that.item.type != 'dir') {
|
||
menu.push({
|
||
text: '重命名',
|
||
click() {
|
||
that.$emit('editDirName', {
|
||
isDir: that.item.type == 'dir',
|
||
isEdit: true,
|
||
name: that.item.name,
|
||
})
|
||
},
|
||
})
|
||
}
|
||
|
||
// #ifdef APP-PLUS
|
||
if (that.item.type == 'file') {
|
||
menu.push({
|
||
text: '调用外部程序打开此文件',
|
||
click() {
|
||
plus.runtime.openFile(path, null, (e) => {
|
||
uni.showToast({
|
||
title: '文档打开失败!' + e.message,
|
||
icon: 'none',
|
||
})
|
||
})
|
||
},
|
||
})
|
||
}
|
||
// #endif
|
||
|
||
// #ifdef MP-WEIXIN
|
||
if (['doc', 'xls', 'ppt', 'pdf', 'docx', 'xlsx', 'pptx'].indexOf(that.item.fileType) != -1) {
|
||
menu.unshift({
|
||
text: '打开该文档',
|
||
click() {
|
||
let path = that.getPath()
|
||
uni.openDocument({
|
||
filePath: path,
|
||
fail() {
|
||
uni.showToast({
|
||
title: '文档打开失败!',
|
||
icon: 'none',
|
||
})
|
||
},
|
||
})
|
||
},
|
||
})
|
||
}
|
||
// #endif
|
||
|
||
if (that.item.type == 'file') {
|
||
menu.unshift({
|
||
text: `用文本编辑器打开`,
|
||
click() {
|
||
that.openInEdit()
|
||
},
|
||
})
|
||
}
|
||
|
||
uni.showActionSheet({
|
||
itemList: menu.map((x) => x.text),
|
||
success({ tapIndex }) {
|
||
menu[tapIndex].click()
|
||
},
|
||
})
|
||
},
|
||
},
|
||
}
|
||
</script>
|
||
<style lang="scss" scoped>
|
||
.fileItem {
|
||
display: flex;
|
||
flex-direction: row;
|
||
align-items: center;
|
||
padding: 0rpx 20rpx;
|
||
border-bottom: 1px solid rgba(0, 0, 0, 0.05);
|
||
width: 750rpx;
|
||
/* #ifndef APP-PLUS */
|
||
min-height: 70rpx;
|
||
/* #endif */
|
||
&:active {
|
||
background-color: rgba(0, 0, 0, 0.05);
|
||
}
|
||
.icon {
|
||
width: 50rpx;
|
||
height: 50rpx;
|
||
border-radius: 10rpx;
|
||
display: flex;
|
||
flex-direction: row;
|
||
align-items: center;
|
||
justify-content: center;
|
||
background-color: rgba(0, 0, 0, 0.05);
|
||
.iconImg {
|
||
width: 40rpx;
|
||
height: 40rpx;
|
||
}
|
||
}
|
||
.fileInfo {
|
||
margin-left: 10rpx;
|
||
width: 650rpx;
|
||
display: flex;
|
||
flex-direction: column;
|
||
.fileName {
|
||
width: 650rpx;
|
||
lines: 1;
|
||
overflow: hidden;
|
||
font-size: 24rpx;
|
||
color: #333;
|
||
line-height: 28rpx;
|
||
}
|
||
.fileMeta {
|
||
margin-top: 5rpx;
|
||
display: flex;
|
||
flex-direction: row;
|
||
align-items: center;
|
||
width: 650rpx;
|
||
.textItem {
|
||
margin-right: 20rpx;
|
||
font-size: 20rpx;
|
||
line-height: 26rpx;
|
||
color: #999;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
</style>
|