Merge pull request #252 from jamebal/search

feat: 新增dwg文件预览
This commit is contained in:
jmal 2024-08-02 19:50:41 +08:00 committed by GitHub
commit 97c009bc3e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
22 changed files with 2420 additions and 86 deletions

View File

@ -32,7 +32,6 @@
"jquery.fancytree": "^2.35.0",
"js-cookie": "2.2.0",
"jshint": "^2.11.1",
"jspdf": "^2.5.1",
"less-loader": "^6.1.0",
"lib-flexible": "^0.3.2",
"moment": "^2.29.4",
@ -40,6 +39,7 @@
"monaco-editor-vue": "^1.0.10",
"monaco-editor-webpack-plugin": "^3.0.1",
"monaco-languages": "^2.3.0",
"mxcad": "^1.0.238",
"normalize.css": "7.0.0",
"nprogress": "0.2.0",
"path-to-regexp": "2.4.0",

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,101 @@
*BORDER,Border __ __ . __ __ . __ __ . __ __ . __ __ .
A,.5,-.25,.5,-.25,0,-.25
*BORDER2,Border (.5x) __.__.__.__.__.__.__.__.__.__.__.
A,.25,-.125,.25,-.125,0,-.125
*BORDERX2,Border (2x) ____ ____ . ____ ____ . ___
A,1.0,-.5,1.0,-.5,0,-.5
*CENTER,Center ____ _ ____ _ ____ _ ____ _ ____ _ ____
A,1.25,-.25,.25,-.25
*CENTER2,Center (.5x) ___ _ ___ _ ___ _ ___ _ ___ _ ___
A,.75,-.125,.125,-.125
*CENTERX2,Center (2x) ________ __ ________ __ _____
A,2.5,-.5,.5,-.5
*DASHDOT,Dash dot __ . __ . __ . __ . __ . __ . __ . __
A,.5,-.25,0,-.25
*DASHDOT2,Dash dot (.5x) _._._._._._._._._._._._._._._.
A,.25,-.125,0,-.125
*DASHDOTX2,Dash dot (2x) ____ . ____ . ____ . ___
A,1.0,-.5,0,-.5
*DASHED,Dashed __ __ __ __ __ __ __ __ __ __ __ __ __ _
A,.5,-.25
*DASHED2,Dashed (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
A,.25,-.125
*DASHEDX2,Dashed (2x) ____ ____ ____ ____ ____ ___
A,1.0,-.5
*DIVIDE,Divide ____ . . ____ . . ____ . . ____ . . ____
A,.5,-.25,0,-.25,0,-.25
*DIVIDE2,Divide (.5x) __..__..__..__..__..__..__..__.._
A,.25,-.125,0,-.125,0,-.125
*DIVIDEX2,Divide (2x) ________ . . ________ . . _
A,1.0,-.5,0,-.5,0,-.5
*DOT,Dot . . . . . . . . . . . . . . . . . . . . . . . .
A,0,-.25
*DOT2,Dot (.5x) ........................................
A,0,-.125
*DOTX2,Dot (2x) . . . . . . . . . . . . . .
A,0,-.5
*HIDDEN,Hidden __ __ __ __ __ __ __ __ __ __ __ __ __ __
A,.25,-.125
*HIDDEN2,Hidden (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
A,.125,-.0625
*HIDDENX2,Hidden (2x) ____ ____ ____ ____ ____ ____ ____
A,.5,-.25
*PHANTOM,Phantom ______ __ __ ______ __ __ ______
A,1.25,-.25,.25,-.25,.25,-.25
*PHANTOM2,Phantom (.5x) ___ _ _ ___ _ _ ___ _ _ ___ _ _
A,.625,-.125,.125,-.125,.125,-.125
*PHANTOMX2,Phantom (2x) ____________ ____ ____ _
A,2.5,-.5,.5,-.5,.5,-.5
*ACAD_ISO02W100,ISO dash __ __ __ __ __ __ __ __ __ __ __ __ __
A,12,-3
*ACAD_ISO03W100,ISO dash space __ __ __ __ __ __
A,12,-18
*ACAD_ISO04W100,ISO long-dash dot ____ . ____ . ____ . ____ . _
A,24,-3,0,-3
*ACAD_ISO05W100,ISO long-dash double-dot ____ .. ____ .. ____ .
A,24,-3,0,-3,0,-3
*ACAD_ISO06W100,ISO long-dash triple-dot ____ ... ____ ... ____
A,24,-3,0,-3,0,-3,0,-3
*ACAD_ISO07W100,ISO dot . . . . . . . . . . . . . . . . . . . .
A,0,-3
*ACAD_ISO08W100,ISO long-dash short-dash ____ __ ____ __ ____ _
A,24,-3,6,-3
*ACAD_ISO09W100,ISO long-dash double-short-dash ____ __ __ ____
A,24,-3,6,-3,6,-3
*ACAD_ISO10W100,ISO dash dot __ . __ . __ . __ . __ . __ . __ .
A,12,-3,0,-3
*ACAD_ISO11W100,ISO double-dash dot __ __ . __ __ . __ __ . __ _
A,12,-3,12,-3,0,-3
*ACAD_ISO12W100,ISO dash double-dot __ . . __ . . __ . . __ . .
A,12,-3,0,-3,0,-3
*ACAD_ISO13W100,ISO double-dash double-dot __ __ . . __ __ . . _
A,12,-3,12,-3,0,-3,0,-3
*ACAD_ISO14W100,ISO dash triple-dot __ . . . __ . . . __ . . . _
A,12,-3,0,-3,0,-3,0,-3
*ACAD_ISO15W100,ISO double-dash triple-dot __ __ . . . __ __ . .
A,12,-3,12,-3,0,-3,0,-3,0,-3
*FENCELINE1,Fenceline circle ----0-----0----0-----0----0-----0--
A,.25,-.1,[CIRC1,ltypeshp.shx,x=-.1,s=.1],-.1,1
*FENCELINE2,Fenceline square ----[]-----[]----[]-----[]----[]---
A,.25,-.1,[BOX,ltypeshp.shx,x=-.1,s=.1],-.1,1
*TRACKS,Tracks -|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-
A,.15,[TRACK1,ltypeshp.shx,s=.25],.15
*BATTING,Batting SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
A,.0001,-.1,[BAT,ltypeshp.shx,x=-.1,s=.1],-.2,[BAT,ltypeshp.shx,r=180,x=.1,s=.1],-.1
*HOT_WATER_SUPPLY,Hot water supply ---- HW ---- HW ---- HW ----
A,.5,-.2,["HW",STANDARD,S=.1,R=0.0,X=-0.1,Y=-.05],-.2
*GAS_LINE,Gas line ----GAS----GAS----GAS----GAS----GAS----GAS--
A,.5,-.2,["GAS",STANDARD,S=.1,R=0.0,X=-0.1,Y=-.05],-.25
*ZIGZAG,Zig zag /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
A,.0001,-.2,[ZIG,ltypeshp.shx,x=-.2,s=.2],-.4,[ZIG,ltypeshp.shx,r=180,x=.2,s=.2],-.2

View File

@ -0,0 +1,29 @@
*SOLID, 实体填充
45, 0,0, 0,.125
*ANGLE, 角钢
0, 0,0, 0,.275, .2,-.075
90, 0, 0,.275,0, .2,-.075
*ANSI31, ANSI 铁、砖和石
45, 0,0, 0,.125
*ANSI32, ANSI 钢
45, 0,0, 0,.375
45, .176776695,0, 0,.375
*ANSI33, ANSI 青铜、黄铜和紫铜
45, 0,0, 0,.25
45, .176776695,0, 0,.25, .125,-.0625
*ANSI34, ANSI 塑料和橡胶
45, 0,0, 0,.75
45, .176776695,0, 0,.75
45, .353553391,0, 0,.75
45, .530330086,0, 0,.75
*ANSI35, ANSI 耐火砖和耐火材料
45, 0,0, 0,.25
45, .176776695,0, 0,.25, .3125,-.0625,0,-.0625
*ANSI36, ANSI 大理石、板岩和玻璃
45, 0,0, .21875,.125, .3125,-.0625,0,-.0625
*ANSI37, ANSI 铅、锌、镁和声/热/电绝缘体
45, 0,0, 0,.125
135, 0,0, 0,.125
*ANSI38, ANSI 铝
45, 0,0, 0,.125
135, 0,0, .25,.125, .3125,-.1875

View File

@ -0,0 +1,32 @@
*ACAD_ISO02W100, 划线
0, 0,0, 0,5, 12,-3
*ACAD_ISO03W100, 划、空格线
0, 0,0, 0,5, 12,-18
*ACAD_ISO04W100, 长划、点线
0, 0,0, 0,5, 24,-3,.5,-3
*ACAD_ISO05W100, 长划、双点线
0, 0,0, 0,5, 24,-3,.5,-3,.5,-3
*ACAD_ISO06W100, 长划、三点线
0, 0,0, 0,5, 24,-3,.5,-3,.5,-6.5
0, 0,0, 0,5, -34,.5,-3
*ACAD_ISO07W100, 点线
0, 0,0, 0,5, .5,-3
*ACAD_ISO08W100, 长划、短划线
0, 0,0, 0,5, 24,-3,6,-3
*ACAD_ISO09W100, 长划、双短划线
0, 0,0, 0,5, 24,-3,6,-3,6,-3
*ACAD_ISO10W100, 划、点线
0, 0,0, 0,5, 12,-3,.5,-3
*ACAD_ISO11W100, 双划、点线
0, 0,0, 0,5, 12,-3,12,-3,.5,-3
*ACAD_ISO12W100, 划、双点线
0, 0,0, 0,5, 12,-3,.5,-3,.5,-3
*ACAD_ISO13W100, 双划、双点线
0, 0,0, 0,5, 12,-3,12,-3,.5,-6.5
0, 0,0, 0,5, -33.5,.5,-3
*ACAD_ISO14W100, 划、三点线
0, 0,0, 0,5, 12,-3,.5,-3,.5,-6.5
0, 0,0, 0,5, -22,.5,-3
*ACAD_ISO15W100, 双划、三点线
0, 0,0, 0,5, 12,-3,12,-3,.5,-10
0, 0,0, 0,5, -33.5,.5,-3,.5,-3

View File

@ -0,0 +1,95 @@
*AR-B816, 8x16 块砖顺砌
0, 0,0, 0,8
90, 0,0, 8,8, 8,-8
*AR-B816C, 8x16 块砖顺砌,用灰泥接缝
0, 0,0, 8,8, 15.625,-.375
0, -8,.375, 8,8, 15.625,-.375
90, 0,0, 8,8, -8.375,7.625
90, -0.375,0, 8,8, -8.375,7.625
*AR-SAND, 随机的点图案
37.5, 0,0, 1.123,1.567, 0,-1.52,0,-1.7,0,-1.625
7.5, 0,0, 2.123,2.567, 0,-.82,0,-1.37,0,-.525
-32.5, -1.23,0, 2.6234,1.678, 0,-.5,0,-1.8,0,-2.35
-42.5, -1.23,0, 1.6234,2.678, 0,-.25,0,-1.18,0,-1.35
*BRASS, 黄铜制品
0, 0,0, 0,.25
0, 0,.125, 0,.25, .125,-.0625
*BRSTONE, 砖和石
0, 0,0, 0,.33
90, .9,0, .33,.5, .33,-.33
90, .8,0, .33,.5, .33,-.33
0, .9,.055, .5,.33, -.9, .1
0, .9,.11, .5,.33, -.9, .1
0, .9,.165, .5,.33, -.9, .1
0, .9,.22, .5,.33, -.9, .1
0, .9,.275, .5,.33, -.9, .1
*CLAY, 粘土材料
0, 0,0, 0,.1875
0, 0,.03125, 0,.1875
0, 0,.0625, 0,.1875
0, 0,.125, 0,.1875, .1875,-.125
*CROSS, 一系列十字形
0, 0,0, .25,.25, .125,-.375
90, .0625,-.0625, .25,.25, .125,-.375
*DASH, 划线
0, 0,0, .125,.125, .125,-.125
*DOLMIT, 地壳岩层
0, 0,0, 0,.25
45, 0,0, 0,.70710678, .35355339,-.70710768
*DOTS, 一系列点
0, 0,0, .03125,.0625, 0,-.0625
*EARTH, 地面
0, 0,0, .25,.25, .25,-.25
0, 0,.09375, .25,.25, .25,-.25
0, 0,.1875, .25,.25, .25,-.25
90, .03125,.21875, .25,.25, .25,-.25
90, .125,.21875, .25,.25, .25,-.25
90, .21875,.21875, .25,.25, .25,-.25
*ESCHER, Escher 图案
60, 0,0, -.6,1.039230484, 1.1,-.1
180, 0,0, -.6,1.039230484, 1.1,-.1
300, 0,0, .6,1.039230484, 1.1,-.1
60, .1,0, -.6,1.039230484, .2,-1
300, .1,0, .6,1.039230484, .2,-1
60, -.05,.08660254, -.6,1.039230484, .2,-1
180, -.05,.08660254, -.6,1.039230484, .2,-1
300, -.05,-.08660254, .6,1.039230484, .2,-1
180, -.05,-.08660254, -.6,1.039230484, .2,-1
60, -.4,0, -.6,1.039230484, .2,-1
300, -.4,0, .6,1.039230484, .2,-1
60, .2,-.346410161, -.6,1.039230484, .2,-1
180, .2,-.346410161, -.6,1.039230484, .2,-1
300, .2,.346410161, .6,1.039230484, .2,-1
180, .2,.346410161, -.6,1.039230484, .2,-1
0, .2,.173205081, -.6,1.039230484, .7,-.5
0, .2,-.173205081, -.6,1.039230484, .7,-.5
120, .05,.259807621, .6,1.039230484, .7,-.5
120, -.25,.08660254, .6,1.039230484, .7,-.5
240, -.25,-.08660254, .6,1.039230484, .7,-.5
240, .05,-.259807621, .6,1.039230484, .7,-.5
*GRASS, 草地
90, 0,0, .707106781,.707106781, .1875,-1.226713563
45, 0,0, 0,1, .1875,-.8125
135, 0,0, 0,1, .1875,-.8125
*GRATE, 格栅区域
0, 0,0, 0,.03125
90, 0,0, 0,.125
*HEX, 六边形
0, 0,0, 0,.216506351, .125,-.25
120, 0,0, 0,.216506351, .125,-.25
60, .125,0, 0,.216506351, .125,-.25
*HONEY, 蜂巢图案
0, 0,0, .1875,.108253175, .125,-.25
120, 0,0, .1875,.108253175, .125,-.25
60, 0,0, .1875,.108253175, -.25,.125
*INSUL, 绝缘材料
0, 0,0, 0,.375
0, 0,.125, 0,.375, .125,-.125
0, 0,.25, 0,.375, .125,-.125

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@ -107,7 +107,6 @@
<script>
import {generateMixed} from 'vue-kityminder-ggg/src/utils/index.js';
import 'vue-kityminder-ggg/examples/styles/minder.css';
import JSPDF from 'jspdf';
import api from "@/api/file-api";
import txtApi from "@/api/markdown-api";
import historyApi from "@/api/file-history";
@ -324,26 +323,6 @@ export default {
this.minder.execCommand(var1, var2)
}
},
exportHandle(n, filename) {
filename = filename || (this.content.root.data.text || '无标题')
if (n === 0 || n === 'png') {
this.minder.exportData('png').then((content) => {
let element = document.createElement('a')
element.setAttribute('href', content)
element.setAttribute('download', filename)
element.style.display = 'none'
document.body.appendChild(element)
element.click()
document.body.removeChild(element)
})
} else if (n === 1 || n === 'pdf') {
this.minder.exportData('png').then((content) => {
let doc = new JSPDF()
doc.addImage(content, 'PNG', 0, 0, 0, 0)
doc.save(`${filename}.pdf`)
})
}
},
rendData() {
this.$nextTick(() => {
setTimeout(() => {

View File

@ -4329,7 +4329,7 @@ export default {
this.openCompressionVisible = true
return
}
if (row.contentType.indexOf('office') > -1 || ['pdf', 'csv', 'drawio', 'mind', 'glb', 'gltf'].includes(row.suffix)) {
if (row.contentType.indexOf('office') > -1 || suffix.iframePreviewFile.includes(row.suffix)) {
// iframe 预览
this.iframePreviewVisible = true
this.iframePreviewRow = row

View File

@ -0,0 +1,88 @@
<template>
<div>
<div class="top-bar">
<div class="top-left"></div>
<div class="top-center">{{file.name}}</div>
<div class="top-right">
<div class="top-right-option">
<el-button title="切换背景色" size="medium" type="primary" @click="changeBackground" :icon="lightTheme?'el-icon-moon':'el-icon-sunny'"></el-button>
<el-button title="显示全部" size="medium" type="primary" @click="reset" icon="el-icon-c-scale-to-original"></el-button>
</div>
</div>
</div>
<div class="iframe-content">
<canvas id="mxCadCanvas" style="height: 600px"></canvas>
</div>
</div>
</template>
<script>
import { createMxCad, MxCpp } from 'mxcad'
import { MxFun } from 'mxdraw'
export default {
name: 'CADPreview',
props: {
fileUrl: {
type: String,
default: '',
},
shareId: {
type: String,
default: undefined,
},
file: {
type: Object,
default: function() {
return {}
},
},
},
data() {
return {
clientHeight: document.documentElement.clientHeight - 100,
lightTheme: false,
}
},
computed: {
mxwebUrl() {
if (this.shareId) {
return `${process.env.VUE_APP_BASE_API}/public/s/view/mxweb/${this.file.id}/${this.shareId}`
}
return `${process.env.VUE_APP_BASE_API}/view/mxweb/${this.file.id}`
},
},
mounted() {
createMxCad({
canvas: '#mxCadCanvas',
locateFile: (fileName) => window.location.origin + '/resource/mxcad/wasm/2d-st/' + fileName,
fontspath: window.location.origin + '/resource/mxcad/fonts/',
fileUrl: this.mxwebUrl,
}).then(() => {
MxFun.sendStringToExecute('Mx_Pan')
this.$emit('onReady')
})
},
methods: {
changeBackground() {
this.lightTheme = !this.lightTheme
const value = this.lightTheme ? 255 : 0
const mxcad = this.mxcad()
mxcad.updateDisplay()
mxcad.setViewBackgroundColor(value, value, value)
},
reset() {
const mxcad = this.mxcad()
mxcad.regen()
mxcad.updateDisplay()
mxcad.zoomAll()
},
mxcad() {
return MxCpp.getCurrentMxCAD()
}
},
}
</script>
<style lang="scss" scoped>
@import 'src/styles/iframe.scss';
</style>

View File

@ -170,6 +170,9 @@ export default {
return ['docx', 'xlsx'].includes(this.file.suffix) && this.file.size > 0 && this.file.size < 1024 * 1024 * 5
},
allowOpenFile() {
if (!this.file.contentType) {
return false
}
return (this.file.contentType.indexOf('office') > -1 || ['pdf', 'epub'].includes(this.file.suffix))
}
},

View File

@ -102,62 +102,5 @@ export default {
}
</script>
<style lang="scss" scoped>
.top-bar {
width: 100%;
top: 0;
position: absolute;
display: flex;
flex-wrap: nowrap;
justify-content: space-between;
background: #fff;
}
.top-left {
width: 25%;
}
.top-center {
width: 50%;
text-align: center;
align-content: center;
}
.top-right {
width: 25%;
.svg-icon {
font-size: 14px;
}
.top-right-option {
float: right;
margin-right: 3rem;
display: flex;
align-items: center;
justify-content: flex-end;
height: 2.5rem;
line-height: 2.5rem;
}
>>> .el-select {
width: 135px;
margin-right: 10px;
}
}
.iframe-content {
position: absolute;
top: 2.5rem;
left: 0;
right: 0;
bottom: 0;
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
-webkit-box-pack: center;
-ms-flex-pack: center;
justify-content: center;
background: #dcdfe6;
iframe {
width: 100%;
height: 100%;
border: 0;
}
}
@import 'src/styles/iframe.scss';
</style>

View File

@ -16,8 +16,8 @@
<svg-icon class="preview-close" icon-class="close"/>
</div>
<div class="wrapper">
<div>{{fileType}}</div>
<pdf-preview v-if="fileType === 'pdf'" :file="file" :shareId="shareId" :file-url="fileUrl" @onReady="onReady"></pdf-preview>
<CADPreview v-if="fileType === 'cad'" :file="file" :shareId="shareId" :file-url="fileUrl" @onReady="onReady"></CADPreview>
<pdf-preview v-else-if="fileType === 'pdf'" :file="file" :shareId="shareId" :file-url="fileUrl" @onReady="onReady"></pdf-preview>
<drawio v-else-if="fileType === 'drawio'" v-show="fileReday" :file="file" :shareId="shareId" :read-only="readOnly" @onEdit="onEdit" @onReady="onReady" @onClose="close"></drawio>
<my-mind-editor v-else-if="fileType === 'mind'" :file="file" :shareId="shareId" :read-only="readOnly" @onEdit="onEdit" @onReady="onReady" @onClose="close"></my-mind-editor>
<model-preview v-else-if="fileType === 'glTF/GLB'" :file="file" :file-url="fileUrl" :shareId="shareId" @onReady="onReady"></model-preview>
@ -38,11 +38,13 @@ import IframeContentPreview from '@/components/preview/IframeContentPreview.vue'
import fileConfig from "@/utils/file-config";
import PdfPreview from "@/components/office/PdfPreview";
import Drawio from "@/components/office/Drawio";
import MyMindEditor from "@/components/Minder/minder"
export default {
name: 'IframePreview',
components: { IframeContentPreview, ModelPreview, Drawio, PdfPreview, MessageDialog, OnlyOfficeEditor, MyMindEditor},
components: { IframeContentPreview, ModelPreview, Drawio, PdfPreview, MessageDialog, OnlyOfficeEditor,
MyMindEditor: () => import('@/components/Minder/minder'),
CADPreview: () => import('@/components/preview/CADPreview.vue')
},
props: {
id: {
type: String,
@ -146,6 +148,8 @@ export default {
case 'office':
case 'csv':
return 'office'
case 'dwg':
return 'cad'
default:
return 'other'
}

60
src/styles/iframe.scss Normal file
View File

@ -0,0 +1,60 @@
.top-bar {
width: 100%;
top: 0;
position: absolute;
display: flex;
flex-wrap: nowrap;
justify-content: space-between;
background: #fff;
z-index: 99;
box-shadow: 0 1px 5px 0 #e9e9e994;
}
.top-left {
width: 25%;
}
.top-center {
width: 50%;
text-align: center;
align-content: center;
}
.top-right {
width: 25%;
.svg-icon {
font-size: 14px;
}
.top-right-option {
float: right;
margin-right: 3rem;
display: flex;
align-items: center;
justify-content: flex-end;
height: 2.5rem;
line-height: 2.5rem;
}
>>> .el-select {
width: 135px;
margin-right: 10px;
}
}
.iframe-content {
position: absolute;
top: 2.5rem;
left: 0;
right: 0;
bottom: 0;
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
-webkit-box-pack: center;
-ms-flex-pack: center;
justify-content: center;
background: #dcdfe6;
iframe {
width: 100%;
height: 100%;
border: 0;
}
}

View File

@ -10,6 +10,7 @@ export const suffix = {
compressedFile: [
'zip','tar','7z', 'rar', 'jar','tar.gz','tgz','tar.bz2'
],
iframePreviewFile: ['pdf', 'csv', 'drawio', 'mind', 'glb', 'gltf', 'dwg']
}
monaco.languages.getLanguages().forEach(language => {

View File

@ -1090,7 +1090,7 @@ export default {
return
}
// office文件
if (row.contentType.indexOf('office') > -1 || ['pdf', 'csv', 'drawio', 'mind'].includes(row.suffix)) {
if (row.contentType.indexOf('office') > -1 || suffix.iframePreviewFile.includes(row.suffix)) {
// office文件
this.officePreviewVisible = true
this.officePreviewRow = row