2025-06-15 16:36:08 +08:00

381 lines
9.6 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>
<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>