diff --git a/package-lock.json b/package-lock.json index 03f68b9..4211135 100644 --- a/package-lock.json +++ b/package-lock.json @@ -430,6 +430,21 @@ "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", "dev": true }, + "@riophae/vue-treeselect": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@riophae/vue-treeselect/-/vue-treeselect-0.4.0.tgz", + "integrity": "sha512-J4atYmBqXQmiPFK/0B5sXKjtnGc21mBJEiyKIDZwk0Q9XuynVFX6IJ4EpaLmUgL5Tve7HAS7wkiGGSti6Uaxcg==", + "requires": { + "@babel/runtime": "^7.3.1", + "babel-helper-vue-jsx-merge-props": "^2.0.3", + "easings-css": "^1.0.0", + "fuzzysearch": "^1.0.3", + "is-promise": "^2.1.0", + "lodash": "^4.0.0", + "material-colors": "^1.2.6", + "watch-size": "^2.0.0" + } + }, "@soda/friendly-errors-webpack-plugin": { "version": "1.8.1", "resolved": "https://registry.npmmirror.com/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.8.1.tgz", @@ -1104,6 +1119,16 @@ "@xtuc/long": "4.2.2" } }, + "@wsfe/ctree": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@wsfe/ctree/-/ctree-2.4.0.tgz", + "integrity": "sha512-lywbYDiDbYm5lHgtKNfIAjiBjKt9Qf6ZAB8z8vx1lOfxZ6HNKCeqX1Hs2xP5wt5Og5hPVMtmv3bMyKhc+mIuSg==" + }, + "@wsfe/vue-tree": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@wsfe/vue-tree/-/vue-tree-4.1.0.tgz", + "integrity": "sha512-/2K3YVMu5P4k2tvbeS/YMPg8k2vvihteMRehp3yFckbtkFwvfge3hXCpQ69uZqFivcZdZHLIXoyWSSPQQezmAg==" + }, "@xmldom/xmldom": { "version": "0.8.10", "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", @@ -1640,6 +1665,11 @@ } } }, + "babel-helper-vue-jsx-merge-props": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz", + "integrity": "sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg==" + }, "babel-runtime": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", @@ -3853,6 +3883,11 @@ "stream-shift": "^1.0.0" } }, + "easings-css": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/easings-css/-/easings-css-1.0.0.tgz", + "integrity": "sha512-7Uq7NdazNfVtr0RNmPAys8it0zKCuaqxJStYKEl72D3j4gbvXhhaM7iWNbqhA4C94ygCye6VuyhzBRQC4szeBg==" + }, "easy-stack": { "version": "1.0.1", "resolved": "https://registry.npmmirror.com/easy-stack/-/easy-stack-1.0.1.tgz", @@ -4582,6 +4617,11 @@ "schema-utils": "^2.5.0" } }, + "file-saver": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz", + "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==" + }, "file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmmirror.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", @@ -4909,6 +4949,11 @@ "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-2.7.4.tgz", "integrity": "sha512-sgGP+haQC8FRwuxQkVeNSUViyO4rXUZ/0S2n8zafzmeUHPGSVf6zM7WHhc4IUm7xIarCdm0Jy4dTGK77BtdSvA==" }, + "fuzzysearch": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fuzzysearch/-/fuzzysearch-1.0.3.tgz", + "integrity": "sha512-s+kNWQuI3mo9OALw0HJ6YGmMbLqEufCh2nX/zzV5CrICQ/y4AwPxM+6TIiF9ItFCHXFCyM/BfCCmN57NTIJuPg==" + }, "gauge": { "version": "2.7.4", "resolved": "https://registry.npmmirror.com/gauge/-/gauge-2.7.4.tgz", @@ -6216,6 +6261,11 @@ "isobject": "^3.0.1" } }, + "is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" + }, "is-regex": { "version": "1.1.4", "resolved": "https://registry.npmmirror.com/is-regex/-/is-regex-1.1.4.tgz", @@ -6982,6 +7032,11 @@ "resolved": "https://registry.npmjs.org/marked/-/marked-4.2.12.tgz", "integrity": "sha512-yr8hSKa3Fv4D3jdZmtMMPghgVt6TWbk86WQaWhDloQjRSQhMMYCAro7jP7VDJrjjdV8pxVxMssXS8B8Y5DZ5aw==" }, + "material-colors": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/material-colors/-/material-colors-1.2.6.tgz", + "integrity": "sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg==" + }, "material-design-icons-iconfont": { "version": "6.7.0", "resolved": "https://registry.npmjs.org/material-design-icons-iconfont/-/material-design-icons-iconfont-6.7.0.tgz", @@ -12191,6 +12246,11 @@ "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==", "dev": true }, + "vue-tree-list": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/vue-tree-list/-/vue-tree-list-1.5.0.tgz", + "integrity": "sha512-qHRJtPMmjCYA9I9kpHgIT6F1H7leR1ZxcNETrP2r97otSHYdHdK42qt12t4glf2mNvI+wBpY2fLClUGcaQJnpg==" + }, "vue-video-player": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/vue-video-player/-/vue-video-player-5.0.1.tgz", @@ -12247,6 +12307,11 @@ } } }, + "watch-size": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/watch-size/-/watch-size-2.0.0.tgz", + "integrity": "sha512-M92R89dNoTPWyCD+HuUEDdhaDnh9jxPGOwlDc0u51jAgmjUvzqaEMynXSr3BaWs+QdHYk4KzibPy1TFtjLmOZQ==" + }, "watchpack": { "version": "1.7.5", "resolved": "https://registry.npmmirror.com/watchpack/-/watchpack-1.7.5.tgz", diff --git a/package.json b/package.json index bfcf94c..01d966a 100644 --- a/package.json +++ b/package.json @@ -8,14 +8,18 @@ }, "dependencies": { "@antv/g2plot": "^2.4.31", + "@riophae/vue-treeselect": "^0.4.0", "@voerro/vue-tagsinput": "^2.7.1", "@vue-office/docx": "^0.2.1", "@vue-office/excel": "^0.2.2", "@vue-office/pdf": "^0.2.1", "@vue/composition-api": "^1.7.1", + "@wsfe/ctree": "^2.4.0", + "@wsfe/vue-tree": "^4.1.0", "ali-oss": "^6.17.1", "axios": "^0.27.2", "docx-preview": "^0.1.4", + "file-saver": "^2.0.5", "jszip": "^3.10.1", "mammoth": "^1.4.21", "marked": "^4.2.12", @@ -30,6 +34,7 @@ "vue-jsmind": "^1.5.0", "vue-materialize-datatable": "^1.0.4", "vue-router": "^3.2.0", + "vue-tree-list": "^1.5.0", "vue-video-player": "^5.0.1", "xlsx": "^0.18.5" }, diff --git a/src/api/document.js b/src/api/document.js index c54a2d8..4f0c86a 100644 --- a/src/api/document.js +++ b/src/api/document.js @@ -13,6 +13,9 @@ import { DOC_TXT_URL, DOC_REBUILD_URL, + DOC_GENERATE_DOWNLOAD_KEY, + DOC_DOWNLOAD, + ADD_LIKE_URL, GET_LIKE_URL @@ -75,5 +78,16 @@ export default { return Get(GET_LIKE_URL, param) }, + generateDownloadKey: (param) => { + return Get(DOC_GENERATE_DOWNLOAD_KEY, param) + }, + + downloadFile: (param) => { + console.log(param) + console.log("--------") + // 这里要求返回的内容是二进制的blob + return Get(DOC_DOWNLOAD, param, "blob") + } + } diff --git a/src/api/request.js b/src/api/request.js index 6abff26..b3f7097 100644 --- a/src/api/request.js +++ b/src/api/request.js @@ -7,9 +7,9 @@ let vm = new Vue(); const instance = axios.create({ // baseURL: 'http://81.69.247.172:8082', - // baseURL: 'http://81.69.247.172:8082/api/v1.0', + baseURL: 'http://81.69.247.172:8082/api/v1.0', // baseURL: 'http://localhost:8082/api/v1.0', - baseURL: '/api/v1.0', + // baseURL: '/api/v1.0', timeout: 100000, headers: { post: { @@ -89,16 +89,18 @@ instance.interceptors.response.use(response => { *@param{String} url [请求地址] *@param{Object} params 请求参数 */ -export function Get(url, params) { +export function Get(url, params = {}, responseType = 'json') { return new Promise((resolve, reject) => { instance.get(url, { - params: params + params: params, + responseType: responseType }).then((res) => { - resolve(res.data); + // 如果是 blob 类型,直接返回响应,而不是 res.data + resolve(responseType === 'blob' ? res : res.data); }).catch((error) => { - reject(error.data); - }) - }) + reject(error); + }); + }); } /* @@ -185,4 +187,8 @@ export function BackendUrl() { export function GetStaticSource(url, param) { const token = localStorage.getItem("token") return instance.defaults.baseURL + url + param + "?token=" + token; +} + +export function GetStaticSourceWithoutToken(url, param) { + return instance.defaults.baseURL + url + param; } \ No newline at end of file diff --git a/src/api/staticSourceUrl.js b/src/api/staticSourceUrl.js index 11fdf0b..ad39f59 100644 --- a/src/api/staticSourceUrl.js +++ b/src/api/staticSourceUrl.js @@ -1,10 +1,13 @@ -import {GetStaticSource} from "@/api/request"; +import {GetStaticSource, GetStaticSourceWithoutToken} from "@/api/request"; + +import {DOC_DOWNLOAD} from "@/api/url" const DOC_PREVIEW_URL2 = '/files/view2/'; const DOC_PREVIEW_URL = '/files/view/'; const IMAGE_URL = '/files/image2/' + export default { docPreviewUrl: (param) => { @@ -13,6 +16,9 @@ export default { imageUrl: (param) => { return GetStaticSource(IMAGE_URL, param); - } + }, + downloadFileUrl: (param) => { + return GetStaticSourceWithoutToken(DOC_DOWNLOAD, param) + } } \ No newline at end of file diff --git a/src/api/url.js b/src/api/url.js index 33945d8..e9e4d4c 100644 --- a/src/api/url.js +++ b/src/api/url.js @@ -26,6 +26,9 @@ const DOC_VIEW_URL = '/files/view/'; // 预览文档 const DOC_TXT_URL = '/files/text/'; // 下载文本文件 const DOC_REBUILD_URL = '/files/rebuildIndex'; // 重建文档索引 +const DOC_GENERATE_DOWNLOAD_KEY = "files/generateDownloadLink"; // 产生下载的key +const DOC_DOWNLOAD = "/files/downloadFile"; // 文件下载链接 + const COLLECT_ADD_URL = '/collect/auth/insert'; // 收藏增加 const COLLECT_REMOVE_URL = '/collect/auth/remove'; // 收藏减少 @@ -107,6 +110,9 @@ module.exports = { DOC_TXT_URL, DOC_REBUILD_URL, + DOC_GENERATE_DOWNLOAD_KEY, + DOC_DOWNLOAD, + COLLECT_ADD_URL, COLLECT_REMOVE_URL, diff --git a/src/assets/svg/list.svg b/src/assets/svg/list.svg new file mode 100644 index 0000000..7e8ba3a --- /dev/null +++ b/src/assets/svg/list.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/router/index.js b/src/router/index.js index a09224f..3826830 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -156,6 +156,13 @@ const routes = [ return import("../views/allDocs/Index") } }, + { + path: "/fenlei", + name: "fenlei", + component: function () { + return import("../views/fenlei/Index") + } + }, { path: '/userPage', name: "userPage", diff --git a/src/utils/throttle.js b/src/utils/throttle.js new file mode 100644 index 0000000..bfb0488 --- /dev/null +++ b/src/utils/throttle.js @@ -0,0 +1,28 @@ +// utils/throttle.js + +/** + * 节流函数 + * @param {Function} func 要节流的函数 + * @param {number} limit 节流时间间隔(毫秒) + * @return {Function} 节流后的函数 + */ +export function throttle(func, limit) { + let lastFunc; + let lastRan; + return function() { + const context = this; + const args = arguments; + if (!lastRan) { + func.apply(context, args); + lastRan = Date.now(); + } else { + clearTimeout(lastFunc); + lastFunc = setTimeout(function() { + if ((Date.now() - lastRan)>= limit) { + func.apply(context, args); + lastRan = Date.now(); + } + }, limit - (Date.now() - lastRan)); + } + } +} diff --git a/src/views/admin/AdminReview.vue b/src/views/admin/AdminReview.vue index 731073d..7236c21 100644 --- a/src/views/admin/AdminReview.vue +++ b/src/views/admin/AdminReview.vue @@ -1,6 +1,6 @@