PalaceGridFile.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570
  1. <template>
  2. <div>
  3. <!-- flex盒子 -->
  4. <div class="bigBox">
  5. <template v-for="(item, index) in fileList">
  6. <!-- 循环盒子 -->
  7. <div class="flexBox" @contextmenu="rightClick(item, $event)">
  8. <!-- 图片 -->
  9. <div class="imgBox">
  10. <img :src="getImage(item.fileType)" alt="" style="vertical-align: middle;">
  11. </div>
  12. <!-- 名称 -->
  13. <div class="nameBox">
  14. <p class="nameName">{{ item.fileName }}</p>
  15. </div>
  16. </div>
  17. </template>
  18. <div class="setCli" v-if="cliCC" :style="{ left: xz + 'px', top: (yz - 330) + 'px' }">
  19. <template v-for="(item, index) in filterMouseCli()">
  20. <p @click="chooseSet(item, index, 1)" class="chooseSet">
  21. <img :src="item.img" alt="">
  22. {{ item.name }}
  23. <span v-if="item.name == '协作' ? true : false"
  24. style="color: #7084B4;float: right;position: relative;" class="arrow">></span>
  25. </p>
  26. </template>
  27. </div>
  28. <div class="setCli1" v-if="anyP" :style="{ left: xz + 155 + 'px', top: yz - 50 + 'px' }">
  29. <p @click="chooseSet1(0)" class="chooseSet">
  30. <img src="../../../assets/images/user.png" alt="">
  31. 选择人员
  32. </p>
  33. <p class="chooseSet" @click="goLock">
  34. <img src="../../../assets/images/archiveTray.png" alt="">
  35. 归档
  36. </p>
  37. </div>
  38. <!-- <div>
  39. <TransferModal v-if="thanks" :thanks="thanks" :clickRowId="clickRowId" :workOrEdit="workOrEdit"
  40. @getCback="getCback"></TransferModal>
  41. </div> -->
  42. <!-- 复制粘贴 -->
  43. <div>
  44. <FileTree v-if="fileTrees" :fileTrees="fileTrees" :newSpaceId="newSpaceId" :fileId="clickRowId"
  45. @getChildren="getChildren" :copyOrMove="copyOrMove"></FileTree>
  46. </div>
  47. <div>
  48. <ImgPreview :previewData="previewData" :copyFileType="copyFileType" :showPreview="showPreview"
  49. @closeImgPreview="closeImgPreview"></ImgPreview>
  50. </div>
  51. <div>
  52. <FileCollect v-if="collects" :collects="collects" @getCollects="getCollects" :copyFileName="copyFileName"
  53. :copyFileId="copyFileId" :isFolder="isFolder" :clickRow="clickRow"></FileCollect>
  54. </div>
  55. </div>
  56. </div>
  57. </template>
  58. <script>
  59. import { ref, onMounted, watch } from "vue"
  60. import { ElMessage } from "element-plus";
  61. import myfile from "../../../api/myfile/myfile";
  62. import documents from "../../../api/document/document";
  63. import fileCount from "../../../api/fileCount/fileCount";
  64. import TransferModal from '../modalComponebts/Transfer.vue'
  65. import ImgPreview from '@/components/ImgPreview/ImgPreview.vue'
  66. import FileCollect from '../modalComponebts/FileCollect.vue'
  67. import FileEdit from './FileEdit.vue'
  68. import FileTree from './FileTree.vue'
  69. import ImgFile from "../jsComponents/ImgFile";
  70. import { canPreviewFile } from "@/utils/index.js"
  71. import { preview } from "@/api/common/common.js";
  72. import { listVersion } from "@/api/biz/version";
  73. export default {
  74. props: {
  75. getAllTop: {
  76. type: Function,
  77. required: true
  78. },
  79. },
  80. setup(props, { emit }) {
  81. let impDirId = ref(0)
  82. let impSpaceId = ref(0)
  83. let newSpaceId = ref(0)
  84. let newDirId = ref(0)
  85. let topPath = ref("")
  86. let fileList = ref([])
  87. let folderList = ref([])
  88. let fileTotal = ref(0)
  89. let fileMenu = ref([])
  90. let isFolder = ref("")
  91. let clickRow = ref({})
  92. let copyRow = ref("")
  93. let clickRowId = ref("")
  94. let copyDirId = ref("")
  95. let copySpaceId = ref("")
  96. let copyFileId = ref("")
  97. let copyFileSize = ref("")
  98. let copyFileType = ref("")
  99. let workOrEdit = ref(0)
  100. let copyOrMove = ref(0)
  101. let nameForm = ref({
  102. name: ""
  103. })
  104. const historycopyRow = ref({})
  105. let copyFileName = ref("")
  106. let yz = ref(0)
  107. let xz = ref(0)
  108. let cliCC = ref(false)
  109. let anyP = ref(false)
  110. let thanks = ref(false)
  111. let fileTrees = ref(false)
  112. let onlyView = ref(false)
  113. let editOnline = ref(false)
  114. let showPreview = ref(false)
  115. let historyPrew = ref(false)
  116. let fileNameChange = ref(false)
  117. let collects = ref(false)
  118. let openForwardFile = ref(false)
  119. let historyTotal = ref(0)
  120. const fileUserTreeData = reactive({ data: {} });
  121. let previewData = ref()
  122. let mouseCli = ref([
  123. {
  124. img: ImgFile.previewIcon,
  125. name: "预览"
  126. },
  127. {
  128. img: ImgFile.addolder,
  129. name: "移动到...",
  130. },
  131. {
  132. img: ImgFile.copy,
  133. name: "复制到...",
  134. },
  135. {
  136. img: ImgFile.collect,
  137. name: "收藏"
  138. },
  139. {
  140. img: ImgFile.downLoad,
  141. name: "下载"
  142. },
  143. {
  144. img: ImgFile.textbox,
  145. name: "重命名"
  146. },
  147. {
  148. img: ImgFile.share,
  149. name: "分享"
  150. },
  151. {
  152. img: ImgFile.notePencil,
  153. name: "在线编辑"
  154. },
  155. {
  156. img: ImgFile.togger,
  157. name: "协作"
  158. },
  159. {
  160. img: ImgFile.icc,
  161. name: "文字识别"
  162. },
  163. {
  164. img: ImgFile.history,
  165. name: "历史版本"
  166. },
  167. {
  168. img: ImgFile.trash,
  169. name: "删除"
  170. }
  171. ])
  172. // 获取文件夹,中栏,文件
  173. function getAllTop() {
  174. documents.getTop(3).then(res => {
  175. let userMe = [res]
  176. impDirId.value = userMe[0].dirId//固定
  177. impSpaceId.value = userMe[0].spaceId//固定
  178. newSpaceId.value = userMe[0].spaceId//变化
  179. newDirId.value = userMe[0].dirId//变化
  180. topPath.value = userMe[0].dirPath
  181. let obj = {
  182. pageNum: 1,
  183. pageSize: 10
  184. }
  185. documents.getALLdocument({ parentId: userMe[0].dirId - 0, spaceId: userMe[0].spaceId, pageNum: obj.pageNum, pageSize: obj.pageSize }).then(res => {
  186. fileMenu.value = res.data
  187. folderList.value = res.data
  188. })
  189. myfile.getById(userMe[0].dirId - 0, obj).then(res => {
  190. if (res.code === 200) {
  191. fileList.value = res.rows
  192. fileTotal.value = res.total
  193. if (fileTotal.value / 10 != 1) {
  194. let x = Math.trunc(fileTotal.value / 10) + 1
  195. for (var i = 1; i <= x; i++) {
  196. obj.pageNum = i
  197. myfile.getById(userMe[0].dirId - 0, obj).then(res => {
  198. fileList.value = fileList.value.concat(res.rows)
  199. const uniqueFileList = Array.from(new Set(fileList.value.map(item => item.docId)))
  200. .map(docId => fileList.value.find(item => item.docId === docId));
  201. // 合并数组并更新 fileList.value
  202. fileList.value = uniqueFileList
  203. console.log(fileList.value, 'iiii');
  204. })
  205. }
  206. }
  207. }
  208. })
  209. })
  210. }
  211. // 筛选后缀图片
  212. function getImage(file) {
  213. if (file === '.txt') {
  214. return ImgFile.bigTxt
  215. } else if (file === '.xlxs' || file === '.docx' || file === '.xls') {
  216. return ImgFile.bigxlsx
  217. } else if (file === '.pptx') {
  218. return ImgFile.bigpptx
  219. } else if (file === '.word') {
  220. return ImgFile.bigdoc
  221. } else if (file === '.pdf') {
  222. return ImgFile.bigpdf
  223. } else if (file === ".mp3") {
  224. return ImgFile.audio
  225. } else if (file === '.mp4') {
  226. return ImgFile.video
  227. } else if (file === ".png" || file === ".jpg") {
  228. return ImgFile.pic
  229. } else {
  230. return ImgFile.elseFile
  231. }
  232. }
  233. function rightClick(row, event) {
  234. event.preventDefault()
  235. isFolder.value = "N"
  236. clickRow.value = row
  237. xz.value = event.pageX
  238. yz.value = event.pageY
  239. copyRow.value = row
  240. clickRowId.value = row.docId
  241. copyDirId.value = row.dirId
  242. copySpaceId.value = row.spaceId
  243. copyFileId.value = row.fileId
  244. copyFileSize.value = row.fileSize
  245. copyFileType.value = row.fileType
  246. nameForm.value.name = row.fileName
  247. copyFileName.value = row.fileName
  248. if (cliCC.value === true) {
  249. cliCC.value = false
  250. } else {
  251. cliCC.value = true
  252. }
  253. }
  254. //对mouseCli数组进行筛选,实现菜单的区分显示
  255. const filterMouseCli = () => {
  256. const canPreviewArray = ['.doc', '.docm', '.docx', '.dot', '.dotm', '.dotx', '.epub', '.fodt', '.htm', '.html', '.mht', '.odt', '.ott', '.pdf', '.rtf', '.txt', '.djvu', '.xps', 'csv', 'fods', 'ods', 'ots', 'xls', 'xlsm', 'xlsx', 'xlt', 'xltm', 'xltx', 'fodp', 'odp', 'otp', 'pot', 'potm', 'potx', 'pps', 'ppsm', 'ppsx', 'ppt', 'pptm', 'pptx']
  257. const typeArr = ['.png', '.jpg', '.jpeg', '.JPG', '.mp3', '.mp4']
  258. const imgTypeArr = ['.png', '.jpg', '.jpeg', '.JPG']
  259. const canEditArr = ['.doc', '.docm', '.docx', '.dot', '.dotm', '.dotx', '.txt', '.djvu', '.xps', 'csv', 'fods', 'ods', 'ots', 'xls', 'xlsm', 'xlsx', 'xlt', 'xltm', 'xltx', 'fodp', 'odp', 'otp']
  260. let arr = []
  261. if (!(typeArr.includes(copyFileType.value) || canPreviewArray.includes(copyFileType.value))) {
  262. arr = mouseCli.value.filter(item => item.name !== "预览")
  263. } else {
  264. arr = toRaw(mouseCli.value)
  265. }
  266. if (!canEditArr.includes(copyFileType.value)) {
  267. arr = arr.filter(item => item.name !== "在线编辑" && item.name !== "协作" && item.name !== "历史版本")
  268. }
  269. if (!imgTypeArr.includes(copyFileType.value)) {
  270. arr = arr.filter(item => item.name !== "文字识别")
  271. }
  272. return arr
  273. }
  274. function mouseClick() {
  275. if (cliCC.value) {
  276. cliCC.value = false
  277. }
  278. if (anyP) {
  279. anyP.value = false
  280. }
  281. }
  282. async function chooseSet(row, index, num) {
  283. if (row.name == '协作') {
  284. cliCC.value = true
  285. } else {
  286. cliCC.value = false
  287. }
  288. if (row.name == '分享') {
  289. workOrEdit.value = num
  290. thanks.value = true
  291. emit("shareBack", thanks.value, workOrEdit.value)
  292. } else {
  293. thanks.value = false
  294. }
  295. if (row.name == '协作') {
  296. if (anyP.value) {
  297. anyP.value = false
  298. } else {
  299. anyP.value = true
  300. }
  301. } else {
  302. anyP.value = false
  303. }
  304. console.log(anyP.value, 'anyp');
  305. if (row.name == '删除') {
  306. myfile.delMenu(clickRowId.value).then(res => {
  307. if (res.code === 200) {
  308. ElMessage({
  309. type: "success",
  310. message: "删除成功"
  311. })
  312. getAllTop()
  313. }
  314. })
  315. }
  316. if (row.name === '复制到...') {
  317. copyOrMove.value = 0
  318. fileTrees.value = true
  319. }
  320. if (row.name === '移动到...') {
  321. copyOrMove.value = 1
  322. fileTrees.value = true
  323. }
  324. if (row.name === '重命名') {
  325. fileNameChange.value = true
  326. emit("navBack", fileNameChange.value, nameForm.value.name)
  327. }
  328. if (row.name === "下载") {
  329. location.href = `${import.meta.env.VITE_APP_BASE_API}/api/download/${copyFileId.value}`;
  330. }
  331. if (row.name === '收藏') {
  332. collects.value = true
  333. }
  334. if (row.name === '在线编辑') {
  335. editOnline.value = false
  336. emit("onlineCase", editOnline.value, clickRowId.value, copyRow.value)
  337. }
  338. if (row.name === '文字识别') {
  339. router.push({
  340. path: '/identifyFont',
  341. query: {
  342. fileId: copyFileId.value,
  343. fileType: copyFileType.value
  344. }
  345. })
  346. }
  347. if (row.name === '预览') {
  348. // editOnline.value = true
  349. // emit("showFile", false)
  350. const filePreview = canPreviewFile(copyFileType.value)
  351. if (filePreview) {
  352. onlyView.value = true
  353. emit("showFile", false, clickRowId.value, copyRow.value)
  354. cliCC.value = false
  355. } else {
  356. showPreview.value = true
  357. const res = await preview(copyFileId.value)
  358. previewData.value = URL.createObjectURL(res)
  359. }
  360. showPreview.value = true
  361. const res = await preview(copyFileId.value)
  362. previewData.value = URL.createObjectURL(res)
  363. } else if (row.name === "历史版本") {
  364. const resHistory = await listVersion({ docId: clickRowId.value })
  365. historyTotal.value = resHistory.total
  366. fileUserTreeData.data = resHistory.rows;
  367. openForwardFile.value = true
  368. emit("lastBB", openForwardFile.value, historyTotal.value, fileUserTreeData.data)
  369. }
  370. }
  371. function changeMsgClose(val, item) {
  372. if (val) {
  373. historycopyRow.value = item
  374. editOnline.value = false
  375. cliCC.value = false
  376. historyPrew.value = true
  377. }
  378. openForwardFile.value = val
  379. }
  380. function chooseSet1(num) {
  381. workOrEdit.value = num
  382. thanks.value = true
  383. anyP.value = false
  384. emit("shareBack", thanks.value, workOrEdit.value)
  385. }
  386. function getChildren(data) {
  387. fileTrees.value = data
  388. }
  389. function getCback(data) {
  390. thanks.value = data
  391. }
  392. function closeImgPreview(data) {
  393. showPreview.value = data
  394. }
  395. function cancleHistoryPrew(data) {
  396. historyPrew.value = false
  397. }
  398. function getCollects(data) {
  399. collects.value = false
  400. }
  401. // 归档
  402. function goLock() {
  403. fileCount.lockActor(clickRowId.value).then(res => {
  404. if (res.code === 200) {
  405. ElMessage({
  406. type: "success",
  407. message: "归档成功"
  408. })
  409. cliCC.value = false
  410. anyP.value = false
  411. }
  412. })
  413. }
  414. onMounted(() => {
  415. getAllTop()
  416. window.addEventListener("click", mouseClick, true);
  417. })
  418. return {
  419. getAllTop,
  420. impDirId,
  421. impSpaceId,
  422. newDirId,
  423. newSpaceId,
  424. fileList,
  425. fileMenu,
  426. folderList,
  427. fileTotal,
  428. getImage,
  429. rightClick,
  430. filterMouseCli,
  431. copyRow,
  432. clickRow,
  433. clickRowId,
  434. copyDirId,
  435. copySpaceId,
  436. copyFileId,
  437. copyFileSize,
  438. copyFileType,
  439. nameForm,
  440. copyFileName,
  441. cliCC,
  442. mouseClick,
  443. anyP,
  444. xz,
  445. yz,
  446. chooseSet,
  447. chooseSet1,
  448. thanks,
  449. FileTree,
  450. fileTrees,
  451. getCback,
  452. getChildren,
  453. copyOrMove,
  454. onlyView,
  455. editOnline,
  456. showPreview,
  457. ImgPreview,
  458. previewData,
  459. closeImgPreview,
  460. FileEdit,
  461. cancleHistoryPrew,
  462. historycopyRow,
  463. changeMsgClose,
  464. historyPrew,
  465. getCollects,
  466. collects,
  467. fileNameChange,
  468. editOnline,
  469. goLock,
  470. }
  471. },
  472. components: {
  473. TransferModal,
  474. FileTree,
  475. ImgPreview,
  476. FileEdit,
  477. FileCollect,
  478. }
  479. }
  480. </script>
  481. <style scoped>
  482. .bigBox {
  483. width: 100%;
  484. height: 100%;
  485. display: flex;
  486. justify-content: flex-start;
  487. align-items: center;
  488. flex-wrap: wrap;
  489. }
  490. .imgBox {
  491. width: 88px;
  492. height: 88px;
  493. text-align: center;
  494. line-height: 88px;
  495. }
  496. .flexBox {
  497. width: 104px;
  498. height: 148px;
  499. position: relative;
  500. }
  501. .nameName {
  502. width: 100%;
  503. white-space: nowrap;
  504. /* 禁止文本换行 */
  505. overflow: hidden;
  506. /* 隐藏溢出部分文本 */
  507. text-overflow: ellipsis;
  508. /* 显示省略号 */
  509. }
  510. .setCli {
  511. width: 156px;
  512. max-height: auto;
  513. position: absolute;
  514. flex-wrap: 400;
  515. background-color: white;
  516. border: 1px solid gray;
  517. border-radius: 4px;
  518. z-index: 3;
  519. overflow-y: auto;
  520. /* // font-size: 16px; */
  521. }
  522. .setCli1 {
  523. width: 156px;
  524. height: auto;
  525. position: absolute;
  526. background-color: white;
  527. border: 1px solid gray;
  528. border-radius: 4px;
  529. z-index: 2;
  530. overflow-y: auto;
  531. }
  532. .chooseSet {
  533. width: 140px;
  534. height: 30px;
  535. line-height: 30px;
  536. margin: 5px auto;
  537. font-size: 13px;
  538. /*
  539. display: flex;
  540. align-items: center;
  541. position: relative; */
  542. }
  543. .chooseSet img {
  544. margin-right: 4px;
  545. vertical-align: middle;
  546. }
  547. .chooseSet:hover {
  548. width: 140px;
  549. height: 30px;
  550. line-height: 30px;
  551. margin: 5px auto;
  552. font-size: 13px;
  553. background-color: #F5F7F9;
  554. /* color: white; */
  555. }
  556. </style>