index.vue 31 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064
  1. <template>
  2. <div class="container">
  3. <!-- <div class="topPath">
  4. <span @click="backTopPath">收藏文件</span>
  5. <PathLabel
  6. @folderClick="folderClick"
  7. :pathLabelData="pathLabelData"
  8. ></PathLabel>
  9. </div> -->
  10. <!-- 标签 -->
  11. <div class="tags">
  12. <div class="tags_left">
  13. <el-tabs
  14. v-model="clickCollect"
  15. class="tabSign"
  16. @tab-change="tabchange"
  17. ref="tabs"
  18. >
  19. <!-- <el-tab-pane label="常用" name="first"></el-tab-pane> -->
  20. <el-tab-pane label="默认" name="second"></el-tab-pane>
  21. <el-tab-pane
  22. v-for="item in toRaw(tabList)"
  23. :key="item"
  24. :name="item.labelId"
  25. >
  26. <template #label>
  27. <div
  28. v-if="isChangeTabName !== item.labelId"
  29. @click.right="tabClick($event, item)"
  30. >
  31. {{ item.labelName }}
  32. </div>
  33. <div v-else>
  34. <el-input
  35. v-model="changeTabName"
  36. size="mini"
  37. @blur="reTabName"
  38. maxlength="5"
  39. placeholder="请输入不多于5位字符"
  40. :autofocus="true"
  41. ></el-input>
  42. </div>
  43. </template>
  44. </el-tab-pane>
  45. </el-tabs>
  46. <!-- 添加标签 -->
  47. <div class="addCollect">
  48. <div v-if="!isAddCollect">
  49. <el-icon color="#2E6BC8">
  50. <Plus />
  51. </el-icon>
  52. <span @click="toAddCollectFn">添加标签</span>
  53. </div>
  54. <div v-else>
  55. <el-input
  56. v-model="tabName"
  57. size="mini"
  58. @change="addCollectFn"
  59. maxlength="5"
  60. placeholder="请输入不多于5位字符"
  61. :autofocus="true"
  62. ></el-input>
  63. </div>
  64. </div>
  65. </div>
  66. <div class="right_box">
  67. <img
  68. src="@/assets/images/sort.png"
  69. @click="changeSort"
  70. v-if="isAsc == 'asc'"
  71. alt=""
  72. />
  73. <img
  74. src="@/assets/images/Frame_188.png"
  75. @click="changeSort"
  76. v-else
  77. alt=""
  78. />
  79. <img
  80. v-if="isList == 1"
  81. src="@/assets/images/squre.png"
  82. alt=""
  83. @click="changeShow"
  84. />
  85. <img
  86. v-else
  87. src="@/assets/images/Frame_187.png"
  88. alt=""
  89. @click="changeShow"
  90. />
  91. </div>
  92. </div>
  93. <el-collapse v-model="activeNames">
  94. <div v-if="isList == 1">
  95. <el-collapse-item name="folder">
  96. <template #title>
  97. <span class="collapseItem_title">文件夹</span>
  98. </template>
  99. <!-- 表格 -->
  100. <el-table
  101. :data="folderArr"
  102. style="width: 100%"
  103. height="37vh"
  104. :scrollbar-always-on="true"
  105. @row-contextmenu="fileRightTable"
  106. @row-click="folderClick"
  107. >
  108. <el-table-column fixed prop="date" label="名称" width="500">
  109. <template #default="scope">
  110. <div class="folderName">
  111. <img
  112. class="table_icon"
  113. src="@/assets/images/fileBox.png"
  114. alt=""
  115. style=""
  116. />
  117. <span class="shouzhi">{{
  118. scope.row.dirName
  119. ? scope.row.dirName
  120. : scope.row.docDir.dirName
  121. }}</span>
  122. </div>
  123. </template>
  124. </el-table-column>
  125. <el-table-column prop="docDir.createTime" label="时间" width="200">
  126. <template #default="scope">
  127. {{
  128. scope.row.createTime
  129. ? scope.row.createTime
  130. : scope.row.docDir.createTime
  131. }}
  132. </template>
  133. </el-table-column>
  134. <el-table-column prop="docInfo.fileType" label="类型" width="180">
  135. <!-- <template #default="scope"> -->
  136. <div>文件夹</div>
  137. <!-- </template> -->
  138. </el-table-column>
  139. </el-table>
  140. </el-collapse-item>
  141. <el-collapse-item name="file">
  142. <template #title>
  143. <span class="collapseItem_title">文件</span>
  144. </template>
  145. <!-- 表格 -->
  146. <el-table
  147. :data="fileArr"
  148. style="width: 100%"
  149. height="42vh"
  150. :scrollbar-always-on="true"
  151. @row-contextmenu="fileRightTable"
  152. @row-click="clickFile"
  153. >
  154. <el-table-column fixed prop="date" label="名称" width="500">
  155. <template #default="scope">
  156. <div class="fileName">
  157. <img
  158. class="table_icon"
  159. :src="
  160. setIcon(
  161. scope.row.fileType
  162. ? scope.row.fileType
  163. : scope.row.docInfo.fileType
  164. )
  165. "
  166. alt=""
  167. style=""
  168. />
  169. <span class="shouzhi">
  170. {{
  171. scope.row.fileName
  172. ? scope.row.fileName
  173. : scope.row.docInfo.fileName
  174. }}</span
  175. >
  176. </div>
  177. </template>
  178. </el-table-column>
  179. <el-table-column prop="createTime" label="时间" width="200" />
  180. <el-table-column prop="fileType" label="类型" width="180">
  181. <template #default="scope">
  182. {{
  183. scope.row.fileType
  184. ? scope.row.fileType
  185. : scope.row.docInfo.fileType
  186. }}
  187. </template>
  188. </el-table-column>
  189. <el-table-column prop="docInfo.fileSize" label="大小" width="160">
  190. <template #default="scope">
  191. <span>
  192. {{
  193. formatFileSize(
  194. scope.row.fileSize
  195. ? scope.row.fileSize
  196. : scope.row.docInfo.fileSize
  197. )
  198. }}
  199. </span>
  200. </template>
  201. </el-table-column>
  202. </el-table>
  203. </el-collapse-item>
  204. </div>
  205. <div v-else>
  206. <el-collapse-item name="folder">
  207. <template #title>
  208. <span class="collapseItem_title">文件夹</span>
  209. </template>
  210. <!-- 平铺 -->
  211. <el-scrollbar style="height: 39vh">
  212. <div class="tile_box">
  213. <div
  214. class="file_box"
  215. @click.right="fileRight($event, item)"
  216. v-for="item in folderArr"
  217. :key="item"
  218. style="cursor: pointer"
  219. >
  220. <img
  221. class="big_file_img"
  222. src="@/assets/images/fileBox.png"
  223. alt=""
  224. />
  225. <el-tooltip
  226. class="box-item"
  227. effect="dark"
  228. :content="item.dirName ? item.dirName : item.docDir.dirName"
  229. placement="top"
  230. >
  231. <span>{{
  232. item.dirName ? item.dirName : item.docDir.dirName
  233. }}</span>
  234. </el-tooltip>
  235. </div>
  236. </div>
  237. </el-scrollbar>
  238. </el-collapse-item>
  239. <el-collapse-item name="file">
  240. <template #title>
  241. <span class="collapseItem_title">文件</span>
  242. </template>
  243. <!-- 平铺 -->
  244. <el-scrollbar style="height: 40vh">
  245. <div class="tile_box">
  246. <div
  247. class="file_box"
  248. @click.right="fileRight($event, item)"
  249. v-for="item in fileArr"
  250. :key="item"
  251. style="cursor: pointer"
  252. >
  253. <img
  254. class="big_file_img"
  255. :src="
  256. setIcon(
  257. item.fileType ? item.fileType : item.docInfo.fileType
  258. )
  259. "
  260. alt=""
  261. />
  262. <el-tooltip
  263. class="box-item"
  264. effect="dark"
  265. :content="
  266. item.fileName ? item.fileName : item.docInfo.fileName
  267. "
  268. placement="top"
  269. >
  270. <span>{{
  271. item.fileName ? item.fileName : item.docInfo.fileName
  272. }}</span>
  273. </el-tooltip>
  274. </div>
  275. </div>
  276. </el-scrollbar>
  277. </el-collapse-item>
  278. </div>
  279. </el-collapse>
  280. </div>
  281. <!-- 右键唤出的菜单 -->
  282. <div
  283. class="right_menu shouzhi"
  284. v-if="visible"
  285. :style="{ left: left + 'px', top: top + 'px', margin: '0' }"
  286. >
  287. <div class="menu_item" @click="reName">
  288. <img src="@/assets/images/textbox.png" alt="" />
  289. <span>重命名</span>
  290. </div>
  291. <div class="menu_item" @click="delTabs">
  292. <img src="@/assets/images/trash.png" alt="" />
  293. <span>删除</span>
  294. </div>
  295. </div>
  296. <RightMenu
  297. v-show="showFlieRM"
  298. @folderClick="folderClick"
  299. @delCollect="delCollect"
  300. @openFile="openFile"
  301. :isTop="isTop"
  302. :fileRightXY="fileRightXY"
  303. :isFolder="isFolder"
  304. ></RightMenu>
  305. <ImgPreview
  306. :previewData="previewData"
  307. :copyFileType="copyFileType"
  308. :showPreview="showPreview"
  309. @closeImgPreview="closeImgPreview"
  310. ></ImgPreview>
  311. <div
  312. v-loading.fullscreen="loadingPreview"
  313. v-if="loadingPreview"
  314. class="lodingBox"
  315. ></div>
  316. </template>
  317. <script setup>
  318. import Sortable from "sortablejs";
  319. // import { setIcon } from "@/utils/index.js";
  320. import draggable from "vuedraggable";
  321. import FileEdit from "@/views/myfile/components/FileEdit.vue";
  322. import { onMounted, ref, watch, nextTick, inject } from "vue";
  323. import { toRaw } from "@vue/reactivity";
  324. import ImgPreview from "@/components/ImgPreview/ImgPreview.vue";
  325. import { canPreviewFile } from "@/utils/index.js";
  326. import {
  327. listLabel,
  328. addLabel,
  329. delLabel,
  330. updateLabel,
  331. sortLabel,
  332. } from "@/api/biz/label.js";
  333. import {
  334. listFavorite,
  335. listFavoriteById,
  336. delFavorite,
  337. } from "@/api/biz/favorite.js";
  338. import { preview } from "@/api/common/common.js";
  339. import { ElMessageBox, ElMessage } from "element-plus";
  340. import RightMenu from "@/components/RightMenu/index.vue";
  341. import documents from "@/api/document/document";
  342. import myfile from "@/api/myfile/myfile";
  343. import PathLabel from "@/components/PathLabel/index.vue";
  344. import { getDir } from "@/api/biz/dir.js";
  345. const activeNames = ref(["folder", "file"]);
  346. const clickCollect = ref("second"); //当前标签
  347. const isAddCollect = ref(false); //是否在添加标签
  348. const tabName = ref(""); //新增的标签名
  349. const changeTabName = ref(""); //修改的标签名
  350. const tabList = ref([]);
  351. const isAsc = ref("desc");
  352. const tableData = [];
  353. const visible = ref(false); //显示右键菜单
  354. const top = ref(0);
  355. const left = ref(0);
  356. const thisTab = ref({}); //当前右键的标签
  357. const isChangeTabName = ref(0); //存放修改状标签的id
  358. const folderArr = ref(); //文件夹数组
  359. const fileArr = ref(); //文件数组
  360. const isList = ref(sessionStorage.getItem("fileGrid") || 1); //控制显示方式
  361. const showPreview = ref(false); //预览
  362. const fileRightXY = ref({}); //右键菜单坐标
  363. const showFlieRM = ref(false); //右键菜单显示
  364. const thisRData = ref(); //当前右键的文件
  365. const filePageNum = ref(1); //获取文件分页
  366. const tableBeEnd = ref(true); //控制下拉是否到底
  367. const tableTotal = ref(0); //表格数据总数
  368. const thisFolder = ref(); //当前右键的文件夹
  369. const pageSize = ref(9999);
  370. const newDirId = ref();
  371. const newSpaceId = ref();
  372. const pathLabelData = ref([]);
  373. const isFolder = ref(false); //右键的是否是文件夹
  374. const isTop = ref(true); //是不是顶层的
  375. const loadingPreview = ref(false);
  376. const previewData = ref();
  377. const copyFileType = ref();
  378. const addFileTab = inject("addFileTab");
  379. const addFolderAdd = inject("addFolderAdd");
  380. const folersArr = ref([]); //路劲上的文件夹
  381. const openFolderTop = ref(); // 所在的空间
  382. const firstFolderData = ref(); // 第一层目录
  383. //----引入图片----
  384. import file_DOC from "../../assets/images/fileType/file_DOC.png";
  385. import file_pdf from "../../assets/images/fileType/file_pdf.png";
  386. import file_PPT from "../../assets/images/fileType/file_PPT.png";
  387. import file_TXT from "../../assets/images/fileType/file_TXT.png";
  388. import file_XLSX from "../../assets/images/fileType/file_XLSX.png";
  389. import file_pic from "../../assets/images/fileType/file_pic.png";
  390. import file_audio from "../../assets/images/fileType/file_audio.png";
  391. import file_video from "../../assets/images/fileType/file_video.png";
  392. import file_zip from "../../assets/images/fileType/file_zip.png";
  393. // -------
  394. onMounted(async () => {
  395. await getList();
  396. await getCollectList();
  397. await tabchange("second");
  398. // rowDrop();
  399. // 添加监听,点击其他地方关闭菜单
  400. window.addEventListener("click", closeMenu, true);
  401. window.addEventListener("click", closeFlieRMenu, true);
  402. });
  403. // 文件夹每行点击事件
  404. const folderClick = async (row, list, e, jump) => {
  405. folersArr.value = []
  406. openFolderTop.value = null
  407. firstFolderData.value = null
  408. // console.log("thisFolder.value", thisFolder.value);
  409. const thisFolderD = toRaw(thisFolder.value); //打开的收藏文件
  410. async function getFoldersData(info) {
  411. if (info.parentId) {
  412. folersArr.value.push(JSON.parse(JSON.stringify(info)));
  413. const res = await getDir(info.parentId);
  414. // console.log('res====',res);
  415. await getFoldersData(res.data);
  416. } else {
  417. openFolderTop.value = info;
  418. return;
  419. }
  420. }
  421. await getFoldersData(thisFolderD.docDir);
  422. // folersArr = JSON.parse(JSON.stringify(folersArr))
  423. folersArr.value.reverse();
  424. firstFolderData.value = folersArr.value[0];
  425. // console.log("folersArr", folersArr.value);
  426. // console.log("openFolderTop", openFolderTop.value);
  427. sessionStorage.setItem('folderArr',JSON.stringify(folersArr.value))
  428. // 判断空间
  429. if (openFolderTop.value.dirName.includes("个人空间")) {
  430. // 创建标签
  431. const addData = {
  432. path: "/myfile",
  433. name: firstFolderData.value.dirName,
  434. clickRowId:firstFolderData.value,
  435. };
  436. const itemData = {
  437. name: '个人空间',
  438. path: "/myfile"
  439. }
  440. // addFolderAdd(addData);
  441. sessionStorage.setItem('newTab',JSON.stringify(itemData))
  442. sessionStorage.setItem('openFolder',JSON.stringify(addData))
  443. } else if (openFolderTop.value.dirName.includes("部门空间")) {
  444. // 创建标签
  445. const addData = {
  446. path: "/department",
  447. name: firstFolderData.value.dirName,
  448. clickRowId:firstFolderData.value,
  449. };
  450. const itemData = {
  451. name: '部门空间',
  452. path: "/department"
  453. }
  454. // addFolderAdd(addData);
  455. sessionStorage.setItem('newTab',JSON.stringify(itemData))
  456. // addFolderAdd(addData);
  457. sessionStorage.setItem('openFolder',JSON.stringify(addData))
  458. } else {
  459. // 创建标签
  460. const addData = {
  461. path: "/publicment",
  462. name: firstFolderData.value.dirName,
  463. clickRowId:firstFolderData.value,
  464. };
  465. const itemData = {
  466. name: '公公空间',
  467. path: "/publicment"
  468. }
  469. // addFolderAdd(addData);
  470. sessionStorage.setItem('newTab',JSON.stringify(itemData))
  471. // addFolderAdd(addData);
  472. sessionStorage.setItem('openFolder',JSON.stringify(addData))
  473. }
  474. // 初始化分页数据
  475. };
  476. // 文件点击事件
  477. const clickFile = () => {};
  478. // 返回最顶层
  479. const backTopPath = () => {
  480. thisFolder.value = null;
  481. tabchange(clickCollect.value);
  482. };
  483. //取消收藏
  484. const delCollect = async () => {
  485. let thisFavoriteId;
  486. if (isFolder.value) {
  487. thisFavoriteId = thisFolder.value;
  488. } else {
  489. thisFavoriteId = thisRData.value;
  490. }
  491. console.log("thisFavoriteId", thisFavoriteId);
  492. const res = await delFavorite(thisFavoriteId);
  493. tabchange(clickCollect.value);
  494. console.log("res", res);
  495. };
  496. // tab右键事件
  497. const tabClick = (e, item) => {
  498. e.preventDefault();
  499. e.stopPropagation();
  500. // console.log("e", e);
  501. // console.log("item", toRaw(item));
  502. thisTab.value = item;
  503. // 唤出右键菜单,思路:获取鼠标位置来定位菜单
  504. visible.value = true;
  505. top.value = e.pageY;
  506. left.value = e.pageX;
  507. };
  508. // 宫格右键事件
  509. const fileRight = (e, item) => {
  510. e.preventDefault();
  511. e.stopPropagation();
  512. if (!item.favoriteId) {
  513. isTop.value = false;
  514. } else {
  515. isTop.value = true;
  516. }
  517. // console.log("e", e);
  518. // console.log("item", toRaw(item));
  519. // 唤出右键菜单,思路:获取鼠标位置来定位菜单
  520. showFlieRM.value = true;
  521. fileRightXY.value.top = e.pageY;
  522. fileRightXY.value.left = e.pageX;
  523. // 判断是文件夹还是文件
  524. if (item.docInfo || item.docId) {
  525. isFolder.value = false;
  526. thisRData.value = item;
  527. } else {
  528. isFolder.value = true;
  529. thisFolder.value = item;
  530. }
  531. };
  532. // folder右键事件
  533. const fileRightTable = (item, col, e) => {
  534. e.preventDefault();
  535. e.stopPropagation();
  536. if (!item.favoriteId) {
  537. isTop.value = false;
  538. } else {
  539. isTop.value = true;
  540. }
  541. // console.log("e", e);
  542. // console.log("item", toRaw(item));
  543. // 唤出右键菜单,思路:获取鼠标位置来定位菜单
  544. showFlieRM.value = true;
  545. fileRightXY.value.top = e.pageY;
  546. fileRightXY.value.left = e.pageX;
  547. // 判断是文件夹还是文件
  548. if (item.docInfo || item.docId) {
  549. isFolder.value = false;
  550. thisRData.value = item;
  551. } else {
  552. isFolder.value = true;
  553. thisFolder.value = item;
  554. }
  555. };
  556. const openFile = async () => {
  557. const row = thisRData.value.favoriteId
  558. ? thisRData.value.docInfo
  559. : thisRData.value;
  560. const typeArr = [".png", ".jpg", ".jpeg", ".JPG", ".PNG", ".mp3", ".mp4"];
  561. // loadingPreview.value = true
  562. const filePreview = canPreviewFile(row.fileType);
  563. if (filePreview) {
  564. loadingPreview.value = false;
  565. const itemData = {
  566. name: row.fileName,
  567. path: `${window.location.origin}/fileEdit?clickRowId=${row.docId}&canEdit=0&canCopy=0&history=0&fileId=0`
  568. }
  569. sessionStorage.setItem('newTab',JSON.stringify(itemData))
  570. // addFileTab(row, 0, 0);
  571. } else if (typeArr.some((item) => item == row.fileType)) {
  572. const res = await preview(row.docId);
  573. copyFileType.value = row.fileType;
  574. showPreview.value = true;
  575. previewData.value = URL.createObjectURL(res);
  576. } else {
  577. ElMessage.error("该文件格式不支持预览!");
  578. }
  579. loadingPreview.value = false;
  580. };
  581. //关闭图片预览事件
  582. const closeImgPreview = () => {
  583. // console.log('close');
  584. showPreview.value = false;
  585. };
  586. // 关闭右键菜单
  587. const closeMenu = () => {
  588. // console.log("close");
  589. visible.value = false;
  590. };
  591. // 关闭右键菜单
  592. const closeFlieRMenu = () => {
  593. // console.log("close");
  594. showFlieRM.value = false;
  595. };
  596. //添加标签
  597. const toAddCollectFn = async () => {
  598. isAddCollect.value = true;
  599. };
  600. const addCollectFn = async () => {
  601. if (!tabName.value) {
  602. isAddCollect.value = false;
  603. return;
  604. }
  605. const list = toRaw(tabList.value);
  606. if (list.length >= 10) {
  607. isAddCollect.value = false;
  608. tabName.value = "";
  609. return ElMessage.error("已到最大数量,请先删除其他收藏标签!");
  610. }
  611. const hasIt = list.some((item) => item.labelName === tabName.value);
  612. if (hasIt) {
  613. return ElMessage.error("标签名已存在!");
  614. }
  615. let order = 0;
  616. if (list.length > 0) {
  617. order = getBigOrder(list);
  618. }
  619. const res = await addLabel({
  620. labelName: tabName.value,
  621. orderNum: order,
  622. });
  623. if (res.code == 200) {
  624. isAddCollect.value = false;
  625. tabName.value = "";
  626. getList();
  627. }
  628. };
  629. //获取标签数据
  630. const getList = async () => {
  631. const res = await listLabel();
  632. console.log("tabList =", res);
  633. if (res.rows.length > 0) {
  634. let dates = JSON.parse(JSON.stringify(res.rows));
  635. dates.sort(sortArr("orderNum"));
  636. tabList.value = [...dates];
  637. // console.log("tabList", tabList.value);
  638. // console.log("dates", dates);
  639. }
  640. };
  641. // 删除标签
  642. const delTabs = async () => {
  643. let tabDetail = toRaw(thisTab.value);
  644. const res = await delLabel(tabDetail.labelId); //直接传id
  645. // console.log("delres = ", res);
  646. getList();
  647. };
  648. //获取收藏数据
  649. const getCollectList = async () => {
  650. const res = await listFavorite();
  651. console.log("collectres = ", res);
  652. if (res.code === 200 && res.rows.length > 0) {
  653. tableData.value = res.rows;
  654. }
  655. };
  656. // 修改便签名
  657. const reName = async () => {
  658. console.log("thisTab", toRaw(thisTab.value));
  659. let tabDetail = toRaw(thisTab.value);
  660. changeTabName.value = tabDetail.labelName;
  661. isChangeTabName.value = tabDetail.labelId;
  662. };
  663. const reTabName = async () => {
  664. let tabDetail = toRaw(thisTab.value);
  665. const res = await updateLabel({
  666. labelId: tabDetail.labelId,
  667. labelName: changeTabName.value,
  668. });
  669. await getList();
  670. isChangeTabName.value = 0;
  671. console.log("rename", res);
  672. };
  673. //拖拽事件
  674. // const rowDrop = () => {
  675. // const el = document.querySelector(".tabSign .el-tabs__nav"); //找到想要拖拽的那一列
  676. // // console.log('el',el);
  677. // const _this = toRaw(JSON.parse(JSON.stringify(tabList.value))); //否则下面遍历会出错
  678. // // console.log("_this", _this);
  679. // Sortable.create(el, {
  680. // filter: "#tab-first,#tab-second", //限制哪些可以拖动
  681. // preventOnFilter: true,
  682. // onChoose: function (/**Event*/ evt) {
  683. // evt.oldIndex;
  684. // // console.log("evt", evt);
  685. // },
  686. // //结束拖拽事件
  687. // async onEnd({ newIndex, oldIndex, to }) {
  688. // //拿到交换前后对应的index
  689. // const ni = newIndex - 3;
  690. // const oi = oldIndex - 3;
  691. // let list = toRaw(tabList.value);
  692. // list = list.filter((item) => item); //筛除空数据
  693. // console.log("list", list);
  694. // console.log("newIndex", ni);
  695. // console.log("oldIndex", oi);
  696. // const newList = list.map((item, index) => {
  697. // console.log("item", item);
  698. // if (oi > ni) {
  699. // // 从后往前,需要将oi和ni之间的+1
  700. // if (index === oi) {
  701. // item.orderNum = _this[ni].orderNum;
  702. // // console.log("oiitem", item);
  703. // } else if (ni < index < oi) {
  704. // item.orderNum += 1;
  705. // }
  706. // } else if (oi < ni) {
  707. // // 从前往后,需要将oi和ni之间的-1
  708. // if (index === oi) {
  709. // item.orderNum = _this[ni].orderNum;
  710. // // console.log("oiitem", item);
  711. // } else if (oi < index < ni) {
  712. // item.orderNum -= 1;
  713. // }
  714. // }
  715. // return item;
  716. // });
  717. // console.log("newList", newList);
  718. // const res = await sortLabel(newList);
  719. // console.log("res", res);
  720. // await getList();
  721. // },
  722. // });
  723. // };
  724. const tabchange = async (labelId) => {
  725. console.log("labelId", toRaw(labelId));
  726. thisFolder.value = null;
  727. const query = {
  728. pageSize: 9999,
  729. isAsc: isAsc.value,
  730. orderByColumn: "createTime",
  731. };
  732. let res;
  733. if (labelId === "second") {
  734. res = await listFavoriteById(-1, query);
  735. console.log("res", res);
  736. // return;
  737. } else {
  738. // 获取当前标签下的数据
  739. res = await listFavoriteById(labelId, query);
  740. }
  741. // console.log("----res", res);
  742. folderArr.value = res.rows.filter((item) => item.isFolder === "Y");
  743. fileArr.value = res.rows.filter((item) => item.isFolder === "N");
  744. //把路径清楚
  745. pathLabelData.value = [];
  746. loadingPreview.value = false;
  747. console.log("folderArr", folderArr.value);
  748. console.log("fileArr", fileArr.value);
  749. };
  750. const changeShow = () => {
  751. // isList.value = !isList.value;
  752. // fileGrid.value = fileGrids
  753. // folderGrid.value = fileGrids;
  754. if (isList.value == 1) {
  755. isList.value = 0;
  756. } else {
  757. isList.value = 1;
  758. }
  759. sessionStorage.setItem("fileGrid", isList.value);
  760. };
  761. const changeSort = async () => {
  762. loadingPreview.value = true;
  763. isAsc.value == "asc" ? (isAsc.value = "desc") : (isAsc.value = "asc");
  764. if (!thisFolder.value) {
  765. tabchange(clickCollect.value);
  766. } else {
  767. folderClick();
  768. }
  769. // console.log("res", res);
  770. };
  771. // 工具函数
  772. //获取新增标签时要赋予的ordername
  773. const getBigOrder = (arr) => {
  774. let num = 0;
  775. arr.forEach((item) => {
  776. if (item.orderNum > num) {
  777. num = item.orderNum;
  778. }
  779. });
  780. return num + 1;
  781. };
  782. //数组排序
  783. const sortArr = (field) => {
  784. return function (a, b) {
  785. return a[field] - b[field];
  786. };
  787. };
  788. // 文件大小格式化
  789. function formatFileSize(fileSize) {
  790. if (fileSize >= 1024 * 1024 * 1024) {
  791. // 大于等于1GB,显示GB
  792. return (fileSize / (1024 * 1024 * 1024)).toFixed(2) + "GB";
  793. } else if (fileSize >= 1024 * 1024) {
  794. // 大于等于1MB,显示MB
  795. return (fileSize / (1024 * 1024)).toFixed(2) + "MB";
  796. } else if (fileSize >= 1024) {
  797. // 大于等于1KB,显示KB
  798. return (fileSize / 1024).toFixed(2) + "KB";
  799. } else {
  800. // 小于1KB,显示字节
  801. return fileSize + "B";
  802. }
  803. }
  804. const setIcon = (fileType) => {
  805. switch (fileType) {
  806. case ".docx":
  807. return file_DOC;
  808. break;
  809. case ".pdf":
  810. return file_pdf;
  811. break;
  812. case ".ppt":
  813. return file_PPT;
  814. break;
  815. case ".txt":
  816. return file_TXT;
  817. break;
  818. case ".xlsx":
  819. return file_XLSX;
  820. break;
  821. case ".csv":
  822. return file_XLSX;
  823. break;
  824. case ".png":
  825. return file_pic;
  826. break;
  827. case ".mp3":
  828. return file_audio;
  829. break;
  830. case ".mp4":
  831. return file_video;
  832. break;
  833. case ".zip":
  834. return file_zip;
  835. break;
  836. default:
  837. return file_DOC;
  838. break;
  839. }
  840. };
  841. </script>
  842. <style lang="scss" scoped>
  843. @import "@/assets/styles/my-common.scss";
  844. .shouzhi {
  845. margin-left: 5px;
  846. }
  847. .lodingBox {
  848. position: absolute;
  849. top: 0;
  850. left: 0;
  851. width: 100vh;
  852. height: 100vh;
  853. z-index: 10000000;
  854. }
  855. .container {
  856. height: 100%;
  857. background-color: #fff;
  858. border-radius: 4px;
  859. height: 88vh;
  860. .topPath {
  861. width: 100%;
  862. height: 24px;
  863. display: flex;
  864. align-items: center;
  865. margin-left: 16px;
  866. cursor: pointer;
  867. color: #6f85b5;
  868. font-size: 12px;
  869. }
  870. .tags {
  871. display: flex;
  872. width: 100%;
  873. height: 40px;
  874. box-sizing: border-box;
  875. border-top: 1px solid #c1cce3;
  876. border-bottom: 1px solid #c1cce3;
  877. background-color: #f5f7f9;
  878. justify-content: space-between;
  879. .tags_left {
  880. display: flex;
  881. }
  882. .right_box {
  883. width: 50px;
  884. display: flex;
  885. align-items: center;
  886. margin-right: 16px;
  887. img {
  888. width: 22px;
  889. height: 22px;
  890. cursor: pointer;
  891. }
  892. }
  893. }
  894. .addCollect {
  895. margin-left: 16px;
  896. cursor: pointer;
  897. height: 100%;
  898. line-height: 40px;
  899. font-size: 14px;
  900. color: #2e6bc8;
  901. font-weight: 400;
  902. vertical-align: middle;
  903. }
  904. }
  905. .right_menu {
  906. width: 100px;
  907. position: absolute;
  908. padding: 8px;
  909. box-shadow: 0px 2px 10px 1px rgba(199, 203, 216);
  910. border-radius: 4px 4px 4px 4px;
  911. border: 1px solid #c1cce3;
  912. background-color: #fff;
  913. z-index: 10000;
  914. .menu_item {
  915. width: 100%;
  916. height: 40px;
  917. border-radius: 4px 4px 4px 4px;
  918. display: flex;
  919. align-items: center;
  920. &:hover {
  921. background-color: #f5f7f9;
  922. }
  923. span {
  924. margin-left: 4px;
  925. }
  926. }
  927. }
  928. // tag间距
  929. ::v-deep .el-tabs__item {
  930. padding: 0 16px !important;
  931. color: #505870 !important;
  932. font-weight: 400 !important;
  933. }
  934. ::v-deep .el-tabs--top .el-tabs__item.is-top:last-child {
  935. padding-right: 0 !important;
  936. }
  937. // tag选中颜色
  938. ::v-deep .el-tabs__item.is-active {
  939. color: #2e6bc8 !important;
  940. font-weight: normal;
  941. font-family: Inter-SemiBold;
  942. }
  943. ::v-deep .el-tabs__active-bar {
  944. background-color: #2e6bc8;
  945. }
  946. .table_icon {
  947. height: 27px;
  948. width: 27px;
  949. vertical-align: middle;
  950. }
  951. :deep(.el-collapse-item__content) {
  952. padding-bottom: 0;
  953. }
  954. :deep(.el-collapse-item__header) {
  955. background-color: #ebeff6 !important;
  956. width: 100% !important;
  957. height: 24px !important;
  958. }
  959. :deep(.el-collapse-item__arrow) {
  960. position: relative;
  961. color: #2e6bc8;
  962. right: 97%;
  963. }
  964. :deep(.el-table td.el-table__cell) {
  965. border: none;
  966. font-size: 14px !important;
  967. font-weight: 400 !important;
  968. color: #000 !important;
  969. }
  970. :deep(.el-table__row) {
  971. height: 35px !important;
  972. }
  973. :deep(.el-table .el-table__header-wrapper th) {
  974. border-bottom: none;
  975. border-right: 1px solid #c1cce3;
  976. background-color: #fff !important;
  977. color: #505870;
  978. font-size: 14px;
  979. }
  980. .collapseItem_title {
  981. position: relative;
  982. left: 3%;
  983. color: #2e6bc8;
  984. font-family: Inter-Medium;
  985. font-size: 12px;
  986. }
  987. // 表格右边3个靠右对齐
  988. :deep(.el-table__header thead tr th) {
  989. font-family: Inter-Medium;
  990. font-size: 14px;
  991. color: #505870;
  992. text-align: right;
  993. &:nth-child(1) {
  994. text-align: left;
  995. }
  996. }
  997. ::v-deep .el-table__body tbody [class*="column_"] {
  998. text-align: right;
  999. &:nth-child(4n + 1) {
  1000. text-align: left;
  1001. }
  1002. }
  1003. //表格文本超出隐藏
  1004. :deep(.fileName) {
  1005. /*第一步: 溢出隐藏 */
  1006. overflow: hidden;
  1007. /* 第二步:让文本不会换行, 在同一行继续 */
  1008. white-space: nowrap;
  1009. /* 第三步:用省略号来代表未显示完的文本 */
  1010. text-overflow: ellipsis;
  1011. }
  1012. //表格文本超出隐藏
  1013. :deep(.folderName) {
  1014. /*第一步: 溢出隐藏 */
  1015. overflow: hidden;
  1016. /* 第二步:让文本不会换行, 在同一行继续 */
  1017. white-space: nowrap;
  1018. /* 第三步:用省略号来代表未显示完的文本 */
  1019. text-overflow: ellipsis;
  1020. }
  1021. //平铺
  1022. .tile_box {
  1023. width: 100%;
  1024. height: 300px;
  1025. display: flex;
  1026. flex-wrap: wrap;
  1027. .file_box {
  1028. width: 116px;
  1029. min-height: 138px;
  1030. // border: 1px solid #000;
  1031. display: flex;
  1032. flex-direction: column;
  1033. align-items: center;
  1034. .big_file_img {
  1035. width: 100px;
  1036. height: 100px;
  1037. }
  1038. span {
  1039. width: 100%;
  1040. text-align: center;
  1041. font-size: 14px;
  1042. font-weight: 400;
  1043. line-height: 22px;
  1044. display: -webkit-box;
  1045. -webkit-box-orient: vertical;
  1046. text-overflow: ellipsis;
  1047. -webkit-line-clamp: 2; //例如超过3行显示省略号
  1048. overflow: hidden;
  1049. }
  1050. }
  1051. }
  1052. </style>