From 1f1581321c25ac0109bd8e3fe14c6d533ec6cc25 Mon Sep 17 00:00:00 2001 From: 17628274150 <1537674247@qq.com> Date: Wed, 3 Jun 2026 14:18:28 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AC=AC=E4=B8=80=E6=AC=A1=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 39 ++ babel.config.js | 5 + env.d.ts | 12 + favicon.ico | Bin 0 -> 21299 bytes index.html | 23 ++ jsconfig.json | 19 + package.json | 37 ++ postcss.config.js | 6 + public/favicon.ico | Bin 0 -> 4286 bytes src/App.vue | 26 ++ src/api/index.ts | 7 + src/api/request.ts | 153 +++++++ src/api/works.js | 25 ++ src/assets/images/img-load-err.png | Bin 0 -> 2542 bytes src/assets/images/profile.jpg | Bin 0 -> 93115 bytes src/assets/images/start.png | Bin 0 -> 1252 bytes src/assets/index.js | 1 + src/assets/logo.png | Bin 0 -> 21299 bytes src/main.ts | 9 + src/router/index.js | 25 ++ src/store/index.js | 14 + src/styles/css/common.css | 69 ++++ src/styles/css/global.scss | 12 + src/styles/css/iconfont.css | 1 + src/styles/css/reset.css | 384 ++++++++++++++++++ src/styles/css/transition.css | 82 ++++ src/typings/global.d.ts | 79 ++++ src/typings/utils.d.ts | 17 + src/typings/window.d.ts | 8 + src/typings/work.d.ts | 45 +++ src/views/detail-nosearch.vue | 320 +++++++++++++++ src/views/detail-open.vue | 564 ++++++++++++++++++++++++++ src/views/detail.vue | 628 +++++++++++++++++++++++++++++ src/views/index.vue | 382 ++++++++++++++++++ src/views/waterfallFlow.vue | 387 ++++++++++++++++++ tailwind.config.js | 10 + tsconfig.json | 30 ++ tsconfig.node.json | 10 + utils/color.ts | 59 +++ utils/copyText.js | 23 ++ utils/date.ts | 95 +++++ utils/dict.ts | 17 + utils/errorHandler.ts | 27 ++ utils/index.ts | 470 +++++++++++++++++++++ utils/is/index.ts | 125 ++++++ utils/loading.js | 30 ++ utils/showMsg.ts | 13 + utils/svg.ts | 13 + utils/toBeian.js | 3 + utils/useFileNameParser.ts | 25 ++ vite.config.ts | 56 +++ 51 files changed, 4385 insertions(+) create mode 100644 .gitignore create mode 100644 babel.config.js create mode 100644 env.d.ts create mode 100644 favicon.ico create mode 100644 index.html create mode 100644 jsconfig.json create mode 100644 package.json create mode 100644 postcss.config.js create mode 100644 public/favicon.ico create mode 100644 src/App.vue create mode 100644 src/api/index.ts create mode 100644 src/api/request.ts create mode 100644 src/api/works.js create mode 100644 src/assets/images/img-load-err.png create mode 100644 src/assets/images/profile.jpg create mode 100644 src/assets/images/start.png create mode 100644 src/assets/index.js create mode 100644 src/assets/logo.png create mode 100644 src/main.ts create mode 100644 src/router/index.js create mode 100644 src/store/index.js create mode 100644 src/styles/css/common.css create mode 100644 src/styles/css/global.scss create mode 100644 src/styles/css/iconfont.css create mode 100644 src/styles/css/reset.css create mode 100644 src/styles/css/transition.css create mode 100644 src/typings/global.d.ts create mode 100644 src/typings/utils.d.ts create mode 100644 src/typings/window.d.ts create mode 100644 src/typings/work.d.ts create mode 100644 src/views/detail-nosearch.vue create mode 100644 src/views/detail-open.vue create mode 100644 src/views/detail.vue create mode 100644 src/views/index.vue create mode 100644 src/views/waterfallFlow.vue create mode 100644 tailwind.config.js create mode 100644 tsconfig.json create mode 100644 tsconfig.node.json create mode 100644 utils/color.ts create mode 100644 utils/copyText.js create mode 100644 utils/date.ts create mode 100644 utils/dict.ts create mode 100644 utils/errorHandler.ts create mode 100644 utils/index.ts create mode 100644 utils/is/index.ts create mode 100644 utils/loading.js create mode 100644 utils/showMsg.ts create mode 100644 utils/svg.ts create mode 100644 utils/toBeian.js create mode 100644 utils/useFileNameParser.ts create mode 100644 vite.config.ts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8d4e27b --- /dev/null +++ b/.gitignore @@ -0,0 +1,39 @@ +# 依赖相关 (npm/yarn) +node_modules/ +package-lock.json +yarn.lock + +# 编译/构建产物 +dist/ + +# Docker 相关 +.docker-compose/ + +# 编辑器/IDE 配置 +.idea/ +.vscode/ +*.suo +*.ntvs* +*.njsproj +*.sln + +# 脚本/可执行文件 +*.sh +fpx.bat + +# 压缩包 +*.zip +*.rar +*.7z +*.tar + +# 环境配置文件 (核心:忽略所有环境文件) +.env +.env.development +.env.production +.env.line +.env.outnet +.env.test + +# 其他临时文件 +*.env \ No newline at end of file diff --git a/babel.config.js b/babel.config.js new file mode 100644 index 0000000..e955840 --- /dev/null +++ b/babel.config.js @@ -0,0 +1,5 @@ +module.exports = { + presets: [ + '@vue/cli-plugin-babel/preset' + ] +} diff --git a/env.d.ts b/env.d.ts new file mode 100644 index 0000000..4f47c85 --- /dev/null +++ b/env.d.ts @@ -0,0 +1,12 @@ +/// + +// 声明你的环境变量,按需添加 +interface ImportMetaEnv { + readonly VITE_BASE_PATH: string + // 继续添加你项目里其他 VITE_ 开头变量 + // readonly VITE_ROUTER_MODE: string + } + + interface ImportMeta { + readonly env: ImportMetaEnv + } \ No newline at end of file diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..fe4530c7c1eda555c83b23c51b3b42c7c75f12f2 GIT binary patch literal 21299 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 literal 0 HcmV?d00001 diff --git a/index.html b/index.html new file mode 100644 index 0000000..64c1c22 --- /dev/null +++ b/index.html @@ -0,0 +1,23 @@ + + + + + + + + + %VITE_TITLE% + + + + + +
+ + + + + \ No newline at end of file diff --git a/jsconfig.json b/jsconfig.json new file mode 100644 index 0000000..4aafc5f --- /dev/null +++ b/jsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "es5", + "module": "esnext", + "baseUrl": "./", + "moduleResolution": "node", + "paths": { + "@/*": [ + "src/*" + ] + }, + "lib": [ + "esnext", + "dom", + "dom.iterable", + "scripthost" + ] + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..8864589 --- /dev/null +++ b/package.json @@ -0,0 +1,37 @@ +{ + "name": "work-show-web", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "autoprefixer": "^10.5.0", + "axios": "^1.16.1", + "core-js": "^3.8.3", + "element-plus": "^2.14.1", + "postcss": "^8.5.15", + "vue": "^3.2.13", + "vue-router": "^4.0.3", + "vue-waterfall-plugin-next": "^3.0.1", + "vue3-waterfall-plugin": "^1.1.5", + "vuex": "^4.0.0" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^6.0.7", + "@vue/cli-plugin-typescript": "^5.0.9", + "sass": "^1.32.7", + "sass-loader": "^12.0.0", + "tailwindcss": "3", + "typescript": "^6.0.3", + "vite": "^8.0.15" + }, + "browserslist": [ + "> 1%", + "last 2 versions", + "not dead", + "not ie 11" + ] +} diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..7c1c9d3 --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: [ + require('tailwindcss'), + require('autoprefixer') + ] + } \ No newline at end of file diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..df36fcfb72584e00488330b560ebcf34a41c64c2 GIT binary patch literal 4286 zcmds*O-Phc6o&64GDVCEQHxsW(p4>LW*W<827=Unuo8sGpRux(DN@jWP-e29Wl%wj zY84_aq9}^Am9-cWTD5GGEo#+5Fi2wX_P*bo+xO!)p*7B;iKlbFd(U~_d(U?#hLj56 zPhFkj-|A6~Qk#@g^#D^U0XT1cu=c-vu1+SElX9NR;kzAUV(q0|dl0|%h|dI$%VICy zJnu2^L*Te9JrJMGh%-P79CL0}dq92RGU6gI{v2~|)p}sG5x0U*z<8U;Ij*hB9z?ei z@g6Xq-pDoPl=MANPiR7%172VA%r)kevtV-_5H*QJKFmd;8yA$98zCxBZYXTNZ#QFk2(TX0;Y2dt&WitL#$96|gJY=3xX zpCoi|YNzgO3R`f@IiEeSmKrPSf#h#Qd<$%Ej^RIeeYfsxhPMOG`S`Pz8q``=511zm zAm)MX5AV^5xIWPyEu7u>qYs?pn$I4nL9J!=K=SGlKLXpE<5x+2cDTXq?brj?n6sp= zphe9;_JHf40^9~}9i08r{XM$7HB!`{Ys~TK0kx<}ZQng`UPvH*11|q7&l9?@FQz;8 zx!=3<4seY*%=OlbCbcae?5^V_}*K>Uo6ZWV8mTyE^B=DKy7-sdLYkR5Z?paTgK-zyIkKjIcpyO z{+uIt&YSa_$QnN_@t~L014dyK(fOOo+W*MIxbA6Ndgr=Y!f#Tokqv}n<7-9qfHkc3 z=>a|HWqcX8fzQCT=dqVbogRq!-S>H%yA{1w#2Pn;=e>JiEj7Hl;zdt-2f+j2%DeVD zsW0Ab)ZK@0cIW%W7z}H{&~yGhn~D;aiP4=;m-HCo`BEI+Kd6 z={Xwx{TKxD#iCLfl2vQGDitKtN>z|-AdCN|$jTFDg0m3O`WLD4_s#$S literal 0 HcmV?d00001 diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..4429eaf --- /dev/null +++ b/src/App.vue @@ -0,0 +1,26 @@ + + + diff --git a/src/api/index.ts b/src/api/index.ts new file mode 100644 index 0000000..1efefb9 --- /dev/null +++ b/src/api/index.ts @@ -0,0 +1,7 @@ +import request from "./request"; +import works from "./works"; +interface ApiInterface { + key: Function; +} +const apis: ApiInterface = Object.assign({}, works(request)); +export default apis; diff --git a/src/api/request.ts b/src/api/request.ts new file mode 100644 index 0000000..4807d3f --- /dev/null +++ b/src/api/request.ts @@ -0,0 +1,153 @@ +import axios, { + AxiosInstance, + AxiosRequestConfig, + AxiosResponse, + AxiosError, +} from "axios"; +import { showMsg } from "@/utils/showMsg"; +import {showLoading,hiddenLoading} from "@/utils/loading"; +// 定义响应数据结构 +interface ResponseData { + code: number; + data: T; + message?: string; +} + +// 定义配置扩展接口 +interface CustomAxiosRequestConfig extends AxiosRequestConfig { + donNotShowLoading?: boolean; +} + +// 创建axios实例 +const service: AxiosInstance = axios.create({ + baseURL: import.meta.env.VITE_BASE_PATH, + timeout: 1000 * 10 * 60, // 原有超时配置(600秒) +}); + +// ========== 新增:辅助函数 - 判断是否为无网络状态 ========== +const isOffline = () => { + // 浏览器原生API,判断当前是否处于离线状态 + return typeof window !== "undefined" && !window.navigator.onLine; +}; + +// 请求拦截器(保留原有业务逻辑,无修改) +service.interceptors.request.use( + (config: any) => { + const { method } = config; + if (method === "get" && config.params) { + config.data = config.params; + } + config.headers = { + "Content-Type": "application/json", + // [import.meta.env.VITE_SESS_KEY]: `Bearer ${userStore.token}`, + ...config.headers, + }; + return config; + }, + (error: AxiosError) => { + const config = error.config as CustomAxiosRequestConfig; + showMsg(error.message || "请求错误", "error"); + return Promise.reject(error); + } +); + +// 响应拦截器(新增:超时 + 无网络判断) +service.interceptors.response.use( + async (response: AxiosResponse) => { + const { data, headers } = response; + + // 处理zip文件响应 + if (headers["content-type"] === "application/zip") { + return data; + } + // 处理Blob响应 + if (data instanceof Blob) { + return data; + } + + let { code, data: obj, message } = data; + + if (code === 200) { + hiddenLoading(); + // showMsg("请求成功", "success"); + if (headers.message) { + message = decodeURI(headers.message); + } + return obj; + } else { + message && showMsg(message || decodeURI(headers.message), "error"); + hiddenLoading(); + return Promise.reject(data); + } + }, + async (error: AxiosError) => { + let { message, response, config: requestConfig } = error; + let config = requestConfig as CustomAxiosRequestConfig; + console.log("接口报错", response, error.code); + + // ========== 新增核心1:超时错误判断(Axios错误码 ECONNABORTED) ========== + const isTimeout = error.code === AxiosError.ECONNABORTED; + + // ========== 新增核心2:无网络判断(结合原生API + 无response) ========== + const noNetwork = isOffline(); + + // 无响应的场景(超时 / 无网络 / 其他网络异常) + if (!response) { + // 区分提示:无网络 > 超时 > 通用网络异常 + if (noNetwork) { + message = "当前无网络连接,请检查网络后重试"; + } else if (isTimeout) { + message = "请求超时,服务器响应过慢,请稍后重试"; + } else { + message = "网络异常,请检查网络设置"; + } + showMsg(message, "error"); + hiddenLoading(); + return Promise.reject(error); + } + + // 有响应但状态码错误的场景(保留原有逻辑) + let { status, data } = response; + if (data) { + data?.message && (message = data.message); + data?.code && (error.code = data.code); + } + switch (status) { + case 401: + // showMsg.confirm({ + // title: "登录过期", + // message: message || "登录过期", + // confirmButtonText: "重新登录", + // cancelButtonText: "取消", + // showCancelButton: false, + // closeOnPopstate: false, + // closeOnClickOverlay: false, + // }); + break; + case 404: + // await showMsg.confirm({ + // title: "请求失败", + // message: message || "请求失败,状态码:404", + // confirmButtonText: "我知道了", + // showCancelButton: false, + // }); + break; + case 500: + showMsg(message || `服务器错误`); + break; + default: + // ========== 新增:默认状态码也补充无网络/超时提示(兜底) ========== + if (noNetwork) { + message = "当前无网络连接,请检查网络后重试"; + } else if (isTimeout) { + message = "请求超时,服务器响应过慢,请稍后重试"; + } + showMsg(message || `请求失败,状态码:${status}`); + } + + hiddenLoading(); + return Promise.reject(error); + } +); + +export default service; \ No newline at end of file diff --git a/src/api/works.js b/src/api/works.js new file mode 100644 index 0000000..340da54 --- /dev/null +++ b/src/api/works.js @@ -0,0 +1,25 @@ +export default ({ request }) => ({ + // 作品集详情 + WOEKS_LIST_ONE(params) { + return request({ + url: `/public/page/product`, + method: "get", + params, + }); + }, + WOEKS_LIST_TWO(params) { + return request({ + url: `/public/page/task/finish`, + method: "get", + params, + }); + }, + /* 根据类型获取字典列表 */ + GET_DICT_LIST(type, params = {}) { + return request({ + url: `/common/dict/select/${type}`, + method: 'get', + params + }) + } +}); diff --git a/src/assets/images/img-load-err.png b/src/assets/images/img-load-err.png new file mode 100644 index 0000000000000000000000000000000000000000..15044da49e1910ef4fe054701e5c6aa453fceac4 GIT binary patch literal 2542 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 Eg0;kz3jhEB literal 0 HcmV?d00001 diff --git a/src/assets/images/profile.jpg b/src/assets/images/profile.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9acf6f9011df446d6bdb0dcfb756ad76c06e7c72 GIT binary patch literal 93115 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 literal 0 HcmV?d00001 diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..9eb3f31 --- /dev/null +++ b/src/main.ts @@ -0,0 +1,9 @@ +import { createApp } from 'vue' +import App from './App.vue' +import router from './router/index.js' +import store from './store/index.js' +import 'element-plus/dist/index.css' +import ElementPlus from 'element-plus' +import './assets/index.js' +// import 'tailwindcss/tailwind.css' +createApp(App).use(store).use(router).use(ElementPlus).mount('#app') diff --git a/src/router/index.js b/src/router/index.js new file mode 100644 index 0000000..c7756fb --- /dev/null +++ b/src/router/index.js @@ -0,0 +1,25 @@ +import { createRouter, createWebHashHistory } from 'vue-router' +const routes = [ + // { + // path: '/', + // name: 'index', + // component: () => import(/* webpackChunkName: "index" */ '../views/index.vue') + // }, + // { + // path: '/detail/:taskId', + // name: 'detail', + // component: () => import(/* webpackChunkName: "works-detail" */ '../views/detail.vue') + // } + { + path: '/', + name: 'detail', + component: () => import(/* webpackChunkName: "index" */ '../views/detail.vue') + }, +] + +const router = createRouter({ + history: createWebHashHistory(), + routes +}) + +export default router diff --git a/src/store/index.js b/src/store/index.js new file mode 100644 index 0000000..7f5b89c --- /dev/null +++ b/src/store/index.js @@ -0,0 +1,14 @@ +import { createStore } from 'vuex' + +export default createStore({ + state: { + }, + getters: { + }, + mutations: { + }, + actions: { + }, + modules: { + } +}) diff --git a/src/styles/css/common.css b/src/styles/css/common.css new file mode 100644 index 0000000..b41bcc2 --- /dev/null +++ b/src/styles/css/common.css @@ -0,0 +1,69 @@ + +.text-overflow-ellipsis { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +/* // 文字溢出多行 */ +.text-overflow-multi-line { + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; +} + +* { + /* // text-shadow: 4px 4px 4px rgb(230, 6, 6); */ +} + +/* 美化滚动条 */ +::-webkit-scrollbar { + width: 4px; +} + +::-webkit-scrollbar-thumb { + background: #000000ad; + border-radius: 4px; + cursor: pointer; + /* // &:hover { + // background: #252525; + // } */ +} + +::-webkit-scrollbar-track { + background: #c1c1c12b; + border-radius: 4px; +} + +.one-ell { + display: -webkit-box; + -webkit-line-clamp: 1; + -webkit-box-orient: vertical; + overflow: hidden; +} + +.two-ell { + display: -webkit-box ; + -webkit-line-clamp: 2 ; + -webkit-box-orient: vertical ; + overflow: hidden ; +} + +.three-ell { + display: -webkit-box; + -webkit-line-clamp: 3; + -webkit-box-orient: vertical; + overflow: hidden; +} + +.four-ell { + display: -webkit-box; + -webkit-line-clamp: 4; + -webkit-box-orient: vertical; + overflow: hidden; +} +/* // *{ +// color:#f00 !important; +// } */ \ No newline at end of file diff --git a/src/styles/css/global.scss b/src/styles/css/global.scss new file mode 100644 index 0000000..ac8026a --- /dev/null +++ b/src/styles/css/global.scss @@ -0,0 +1,12 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; +@import "./transition.css"; +@import "./reset.css"; +@import "./iconfont.css"; +@import "./common.css"; +html, +body, +#app { + min-height: 100vh; +} diff --git a/src/styles/css/iconfont.css b/src/styles/css/iconfont.css new file mode 100644 index 0000000..da08a68 --- /dev/null +++ b/src/styles/css/iconfont.css @@ -0,0 +1 @@ +@import url(//at.alicdn.com/t/c/font_5111335_mdz5ib2itiq.css); \ No newline at end of file diff --git a/src/styles/css/reset.css b/src/styles/css/reset.css new file mode 100644 index 0000000..8a8eccd --- /dev/null +++ b/src/styles/css/reset.css @@ -0,0 +1,384 @@ +/* +1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) +2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) +*/ + +*, +::before, +::after { + box-sizing: border-box; /* 1 */ + border-width: 0; /* 2 */ + border-style: solid; /* 2 */ + border-color: currentColor; /* 2 */ + /* word-break: keep-all; */ + word-break: break-all; + /* text-align: left; */ +} + +/* +1. Use a consistent sensible line-height in all browsers. +2. Prevent adjustments of font size after orientation changes in iOS. +3. Use a more readable tab size. +4. Use the user's configured `sans` font-family by default. +*/ + +html { + line-height: 1.5; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ + -moz-tab-size: 4; /* 3 */ + tab-size: 4; /* 3 */ + font-family: + ui-sans-serif, + system-ui, + -apple-system, + BlinkMacSystemFont, + "Segoe UI", + Roboto, + "Helvetica Neue", + Arial, + "Noto Sans", + sans-serif, + "Apple Color Emoji", + "Segoe UI Emoji", + "Segoe UI Symbol", + "Noto Color Emoji"; /* 4 */ +} + +/* +1. Remove the margin in all browsers. +2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. +*/ + +body { + margin: 0; /* 1 */ + line-height: inherit; /* 2 */ +} + +/* +1. Add the correct height in Firefox. +2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) +3. Ensure horizontal rules are visible by default. +*/ + +hr { + height: 0; /* 1 */ + color: inherit; /* 2 */ + border-top-width: 1px; /* 3 */ +} + +/* +Add the correct text decoration in Chrome, Edge, and Safari. +*/ + +abbr:where([title]) { + text-decoration: underline dotted; +} + +/* +Remove the default font size and weight for headings. +*/ + +h1, +h2, +h3, +h4, +h5, +h6 { + font-size: inherit; + font-weight: inherit; +} + +/* +Reset links to optimize for opt-in styling instead of opt-out. +*/ + +a { + color: inherit; + text-decoration: inherit; +} + +/* +Add the correct font weight in Edge and Safari. +*/ + +b, +strong { + font-weight: bolder; +} + +/* +1. Use the user's configured `mono` font family by default. +2. Correct the odd `em` font sizing in all browsers. +*/ + +code, +kbd, +samp, +pre { + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, + "Liberation Mono", "Courier New", monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/* +Add the correct font size in all browsers. +*/ + +small { + font-size: 80%; +} + +/* +Prevent `sub` and `sup` elements from affecting the line height in all browsers. +*/ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* +1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) +2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) +3. Remove gaps between table borders by default. +*/ + +table { + text-indent: 0; /* 1 */ + border-color: inherit; /* 2 */ + border-collapse: collapse; /* 3 */ +} + +/* +1. Change the font styles in all browsers. +2. Remove the margin in Firefox and Safari. +3. Remove default padding in all browsers. +*/ + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; /* 1 */ + font-size: 100%; /* 1 */ + line-height: inherit; /* 1 */ + color: inherit; /* 1 */ + margin: 0; /* 2 */ + padding: 0; /* 3 */ +} + +/* +Remove the inheritance of text transform in Edge and Firefox. +*/ + +button, +select { + text-transform: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Remove default button styles. +*/ + +button, +[type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; /* 1 */ + /* background-color: transparent; 2 */ + background-image: none; /* 2 */ +} + +/* +Use the modern Firefox focus style for all focusable elements. +*/ + +:-moz-focusring { + outline: auto; +} + +/* +Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) +*/ + +:-moz-ui-invalid { + box-shadow: none; +} + +/* +Add the correct vertical alignment in Chrome and Firefox. +*/ + +progress { + vertical-align: baseline; +} + +/* +Correct the cursor style of increment and decrement buttons in Safari. +*/ + +::-webkit-inner-spin-button, +::-webkit-outer-spin-button { + height: auto; +} + +/* +1. Correct the odd appearance in Chrome and Safari. +2. Correct the outline style in Safari. +*/ + +[type="search"] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ +} + +/* +Remove the inner padding in Chrome and Safari on macOS. +*/ + +::-webkit-search-decoration { + -webkit-appearance: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Change font properties to `inherit` in Safari. +*/ + +::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ +} + +/* +Add the correct display in Chrome and Safari. +*/ + +summary { + display: list-item; +} + +/* +Removes the default spacing and border for appropriate elements. +*/ + +blockquote, +dl, +dd, +h1, +h2, +h3, +h4, +h5, +h6, +hr, +figure, +p, +pre { + margin: 0; +} + +fieldset { + margin: 0; + padding: 0; +} + +legend { + padding: 0; +} + +ol, +ul, +menu { + list-style: none; + margin: 0; + padding: 0; +} + +/* +Prevent resizing textareas horizontally by default. +*/ + +textarea { + resize: vertical; +} + +/* +1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) +2. Set the default placeholder color to the user's configured gray 400 color. +*/ + +input::placeholder, +textarea::placeholder { + opacity: 1; /* 1 */ + color: #9ca3af; /* 2 */ +} + +/* +Set the default cursor for buttons. +*/ + +button, +[role="button"] { + cursor: pointer; +} + +/* +Make sure disabled buttons don't get the pointer cursor. +*/ +:disabled { + cursor: default; +} + +/* +1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) +2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) + This can trigger a poorly considered lint error in some tools but is included by design. +*/ + +img, +svg, +video, +canvas, +audio, +iframe, +embed, +object { + display: block; /* 1 */ + vertical-align: middle; /* 2 */ +} + +/* +Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) +*/ + +img, +video { + max-width: 100%; + height: auto; +} + +/* +Ensure the default browser behavior of the `hidden` attribute. +*/ + +[hidden] { + display: none; +} + +.dark { + color-scheme: dark; +} diff --git a/src/styles/css/transition.css b/src/styles/css/transition.css new file mode 100644 index 0000000..1848b25 --- /dev/null +++ b/src/styles/css/transition.css @@ -0,0 +1,82 @@ +/* fade */ +.fade-enter-active, +.fade-leave-active { + transition: opacity 0.3s ease-in-out; +} +.fade-enter-from, +.fade-leave-to { + opacity: 0; +} + +/* fade-slide */ +.fade-slide-leave-active, +.fade-slide-enter-active { + transition: all 0.3s; +} +.fade-slide-enter-from { + opacity: 0; + transform: translateX(-30px); +} +.fade-slide-leave-to { + opacity: 0; + transform: translateX(30px); +} + +/* fade-bottom */ +.fade-bottom-enter-active, +.fade-bottom-leave-active { + transition: + opacity 0.25s, + transform 0.3s; +} +.fade-bottom-enter-from { + opacity: 0; + transform: translateY(-10%); +} +.fade-bottom-leave-to { + opacity: 0; + transform: translateY(10%); +} + +/* fade-scale */ +.fade-scale-leave-active, +.fade-scale-enter-active { + transition: all 0.28s; +} +.fade-scale-enter-from { + opacity: 0; + transform: scale(1.2); +} +.fade-scale-leave-to { + opacity: 0; + transform: scale(0.8); +} + +/* zoom-fade */ +.zoom-fade-enter-active, +.zoom-fade-leave-active { + transition: + transform 0.2s, + opacity 0.3s ease-out; +} +.zoom-fade-enter-from { + opacity: 0; + transform: scale(0.92); +} +.zoom-fade-leave-to { + opacity: 0; + transform: scale(1.06); +} + +/* zoom-out */ +.zoom-out-enter-active, +.zoom-out-leave-active { + transition: + opacity 0.1s ease-in-out, + transform 0.15s ease-out; +} +.zoom-out-enter-from, +.zoom-out-leave-to { + opacity: 0; + transform: scale(0); +} diff --git a/src/typings/global.d.ts b/src/typings/global.d.ts new file mode 100644 index 0000000..a20f6c2 --- /dev/null +++ b/src/typings/global.d.ts @@ -0,0 +1,79 @@ +/* Menu */ +declare namespace Menu { + interface MenuOptions { + path: string; + name: string; + component?: string | (() => Promise); + redirect?: string; + meta: MetaProps; + children?: MenuOptions[]; + } + interface MetaProps { + icon: string; + title: string; + activeMenu?: string; + isLink?: string; + isHide: boolean; + isFull: boolean; + isAffix: boolean; + isKeepAlive: boolean; + } +} + +/* FileType */ +declare namespace File { + type ImageMimeType = + | "image/apng" + | "image/bmp" + | "image/gif" + | "image/jpeg" + | "image/pjpeg" + | "image/png" + | "image/svg+xml" + | "image/tiff" + | "image/webp" + | "image/x-icon"; + + type ExcelMimeType = "application/vnd.ms-excel" | "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; +} + +/* Vite */ +declare type Recordable = Record; + +declare interface ViteEnv { + VITE_USER_NODE_ENV: "development" | "production" | "test"; + VITE_GLOB_APP_TITLE: string; + VITE_PORT: number; + VITE_OPEN: boolean; + VITE_REPORT: boolean; + VITE_ROUTER_MODE: "hash" | "history"; + VITE_BUILD_COMPRESS: "gzip" | "brotli" | "gzip,brotli" | "none"; + VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE: boolean; + VITE_DROP_CONSOLE: boolean; + VITE_PWA: boolean; + VITE_DEVTOOLS: boolean; + VITE_PUBLIC_PATH: string; + VITE_API_URL: string; + VITE_BASE_PATH: string; + VITE_PROXY: [string, string, string][]; + VITE_CODEINSPECTOR: boolean; +} + +interface ImportMetaEnv extends ViteEnv { + __: unknown; +} + +interface ImportMeta { + readonly env: ImportMetaEnv; +} + +/* __APP_INFO__ */ +declare const __APP_INFO__: { + pkg: { + name: string; + version: string; + dependencies: Recordable; + devDependencies: Recordable; + }; + lastBuildTime: string; +}; diff --git a/src/typings/utils.d.ts b/src/typings/utils.d.ts new file mode 100644 index 0000000..8476216 --- /dev/null +++ b/src/typings/utils.d.ts @@ -0,0 +1,17 @@ +type ObjToKeyValUnion = { + [K in keyof T]: { key: K; value: T[K] }; +}[keyof T]; + +type ObjToKeyValArray = { + [K in keyof T]: [K, T[K]]; +}[keyof T]; + +type ObjToSelectedValueUnion = { + [K in keyof T]: T[K]; +}[keyof T]; + +type Optional = Omit & Partial>; + +type GetOptional = { + [P in keyof T as T[P] extends Required[P] ? never : P]: T[P]; +}; diff --git a/src/typings/window.d.ts b/src/typings/window.d.ts new file mode 100644 index 0000000..1582726 --- /dev/null +++ b/src/typings/window.d.ts @@ -0,0 +1,8 @@ +declare global { + interface Navigator { + msSaveOrOpenBlob: (blob: Blob, fileName: string) => void; + browserLanguage: string; + } +} + +export {}; diff --git a/src/typings/work.d.ts b/src/typings/work.d.ts new file mode 100644 index 0000000..7b2ed82 --- /dev/null +++ b/src/typings/work.d.ts @@ -0,0 +1,45 @@ +/** src/types/work.ts 瀑布流全局类型 */ +export enum MediaType { + IMAGE = 1, // 纯图片 + IMAGE_TEXT = 2,// 图文 + VIDEO = 3, // 视频 + TEXT = 4 // 纯文字 +} + +export interface WaterfallItem { + avatar?: string; + nickName?: string; + fileUrl?: string; + content?: string; + fileError?: boolean; + + _isNew?: boolean; + _avatarLoaded?: boolean; + _mediaLoaded?: boolean; + + // 动态索引签名(允许 item[字段名] 取值) + [key: string]: any; +} + +export interface WaterfallProps { + list?: WaterfallItem[]; + columns?: number|string; + columnGap?: number|string; + cardGap?: number|string; + imageField?: string; + titleField?: string; + descField?: string; + placeholderImage?: string; + type?: MediaType; + hasSlot?: boolean; +} +export interface TaskInfo { + title: string; + [key: string]: any; +} + +export interface DictOption { + label: string; + value: number | string; + [key: string]: any; +} \ No newline at end of file diff --git a/src/views/detail-nosearch.vue b/src/views/detail-nosearch.vue new file mode 100644 index 0000000..a5ddde9 --- /dev/null +++ b/src/views/detail-nosearch.vue @@ -0,0 +1,320 @@ + + + + + \ No newline at end of file diff --git a/src/views/detail-open.vue b/src/views/detail-open.vue new file mode 100644 index 0000000..39804ea --- /dev/null +++ b/src/views/detail-open.vue @@ -0,0 +1,564 @@ + + + + + \ No newline at end of file diff --git a/src/views/detail.vue b/src/views/detail.vue new file mode 100644 index 0000000..82993bc --- /dev/null +++ b/src/views/detail.vue @@ -0,0 +1,628 @@ + + + + + \ No newline at end of file diff --git a/src/views/index.vue b/src/views/index.vue new file mode 100644 index 0000000..d2007b4 --- /dev/null +++ b/src/views/index.vue @@ -0,0 +1,382 @@ + + + + + \ No newline at end of file diff --git a/src/views/waterfallFlow.vue b/src/views/waterfallFlow.vue new file mode 100644 index 0000000..b1299f1 --- /dev/null +++ b/src/views/waterfallFlow.vue @@ -0,0 +1,387 @@ + + + + + \ No newline at end of file diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 0000000..5804c0a --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,10 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: [ + "./src/**/*.{vue,js,ts,jsx,tsx}" + ], + theme: { + extend: {}, + }, + plugins: [], + } \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..5295dbd --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,30 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "module": "ESNext", + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "skipLibCheck": true, + + /* 模块解析 */ + "moduleResolution": "bundler", // Vite 推荐 bundler + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + + /* 别名 */ + "baseUrl": "./", + "paths": { + "@/utils/*": ["utils/*"], + "@/*": ["src/*"] + }, + + /* 类型 */ + "types": ["vite/client"], + "strict": false, + "esModuleInterop": true + }, + "include": ["src/**/*", "src/typings/**/*", "utils/**/*"], + "references": [{ "path": "./tsconfig.node.json" }] + } \ No newline at end of file diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 0000000..c4a351b --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] + } \ No newline at end of file diff --git a/utils/color.ts b/utils/color.ts new file mode 100644 index 0000000..88ebaac --- /dev/null +++ b/utils/color.ts @@ -0,0 +1,59 @@ +import { ElMessage } from "element-plus"; + +/** + * @description hex颜色转rgb颜色 + * @param {String} str 颜色值字符串 + * @returns {String} 返回处理后的颜色值 + */ +export function hexToRgb(str: any) { + let hexs: any = ""; + let reg = /^\#?[0-9A-Fa-f]{6}$/; + if (!reg.test(str)) return ElMessage.warning("输入错误的hex"); + str = str.replace("#", ""); + hexs = str.match(/../g); + for (let i = 0; i < 3; i++) hexs[i] = parseInt(hexs[i], 16); + return hexs; +} + +/** + * @description rgb颜色转Hex颜色 + * @param {*} r 代表红色 + * @param {*} g 代表绿色 + * @param {*} b 代表蓝色 + * @returns {String} 返回处理后的颜色值 + */ +export function rgbToHex(r: any, g: any, b: any) { + let reg = /^\d{1,3}$/; + if (!reg.test(r) || !reg.test(g) || !reg.test(b)) return ElMessage.warning("输入错误的rgb颜色值"); + let hexs = [r.toString(16), g.toString(16), b.toString(16)]; + for (let i = 0; i < 3; i++) if (hexs[i].length == 1) hexs[i] = `0${hexs[i]}`; + return `#${hexs.join("")}`; +} + +/** + * @description 加深颜色值 + * @param {String} color 颜色值字符串 + * @param {Number} level 加深的程度,限0-1之间 + * @returns {String} 返回处理后的颜色值 + */ +export function getDarkColor(color: string, level: number) { + let reg = /^\#?[0-9A-Fa-f]{6}$/; + if (!reg.test(color)) return ElMessage.warning("输入错误的hex颜色值"); + let rgb = hexToRgb(color); + for (let i = 0; i < 3; i++) rgb[i] = Math.round(20.5 * level + rgb[i] * (1 - level)); + return rgbToHex(rgb[0], rgb[1], rgb[2]); +} + +/** + * @description 变浅颜色值 + * @param {String} color 颜色值字符串 + * @param {Number} level 加深的程度,限0-1之间 + * @returns {String} 返回处理后的颜色值 + */ +export function getLightColor(color: string, level: number) { + let reg = /^\#?[0-9A-Fa-f]{6}$/; + if (!reg.test(color)) return ElMessage.warning("输入错误的hex颜色值"); + let rgb = hexToRgb(color); + for (let i = 0; i < 3; i++) rgb[i] = Math.round(255 * level + rgb[i] * (1 - level)); + return rgbToHex(rgb[0], rgb[1], rgb[2]); +} diff --git a/utils/copyText.js b/utils/copyText.js new file mode 100644 index 0000000..ab8ccd2 --- /dev/null +++ b/utils/copyText.js @@ -0,0 +1,23 @@ +/**一键复制 */ +// import { Message } from "element-ui"; +import {showMsg} from "@/utils/showMsg"; +function fallbackCopyToClipboard(text) { + const textarea = document.createElement("textarea"); + textarea.value = text; + textarea.style.position = "fixed"; + document.body.appendChild(textarea); + textarea.select(); + + try { + document.execCommand("copy"); + // alert('复制成功(降级方案)!'); + showMsg("已复制到剪切板", "success"); + } catch (err) { + console.error("降级复制失败:", err); + // alert('复制失败,请手动复制!'); + showMsg("复制失败,请手动复制!", "error"); + } + + document.body.removeChild(textarea); +} +export default fallbackCopyToClipboard; diff --git a/utils/date.ts b/utils/date.ts new file mode 100644 index 0000000..20af39b --- /dev/null +++ b/utils/date.ts @@ -0,0 +1,95 @@ +/** + * @description 时间相关工具函数 + */ + +/** + * 格式化日期时间为指定格式 + * @param date 日期对象或字符串 + * @param format 格式字符串,默认为 'YYYY-MM-DD HH:mm:ss' + * @returns 格式化后的日期时间字符串 + */ +export function formatDateTime(date: Date | string | number, format: string = 'YYYY-MM-DD HH:mm:ss'): string { + if (!date) return ''; + + const d = new Date(date); + + // 检查日期是否有效 + if (isNaN(d.getTime())) return ''; + + const year = d.getFullYear(); + const month = String(d.getMonth() + 1).padStart(2, '0'); + const day = String(d.getDate()).padStart(2, '0'); + const hours = String(d.getHours()).padStart(2, '0'); + const minutes = String(d.getMinutes()).padStart(2, '0'); + const seconds = String(d.getSeconds()).padStart(2, '0'); + + return format + .replace('YYYY', String(year)) + .replace('MM', month) + .replace('DD', day) + .replace('HH', hours) + .replace('mm', minutes) + .replace('ss', seconds); +} + +/** + * 格式化 sendTime 字段,确保为 'YYYY-MM-DD HH:mm:ss' 格式 + * @param sendTime sendTime 字段值 + * @returns 格式化后的 sendTime 字符串 + */ +export function formatSendTime(sendTime: string | Date | number): string { + if (!sendTime) return ''; + + // 如果已经是字符串格式,验证是否符合预期格式 + if (typeof sendTime === 'string') { + // 检查是否已经是 'YYYY-MM-DD HH:mm:ss' 格式 + const dateTimeRegex = /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/; + if (dateTimeRegex.test(sendTime)) { + return sendTime; + } + + // 如果是其他格式的字符串,尝试解析 + const parsed = new Date(sendTime); + if (!isNaN(parsed.getTime())) { + return formatDateTime(parsed); + } + + return ''; + } + + // 如果是 Date 对象或时间戳 + return formatDateTime(sendTime); +} + +/** + * 验证 sendTime 格式是否正确 + * @param sendTime sendTime 字段值 + * @returns 是否为有效格式 + */ +export function isValidSendTime(sendTime: string): boolean { + if (!sendTime) return false; + + const dateTimeRegex = /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/; + if (!dateTimeRegex.test(sendTime)) return false; + + // 进一步验证日期时间是否有效 + const date = new Date(sendTime); + return !isNaN(date.getTime()); +} + +/** + * 获取当前时间的 sendTime 格式 + * @returns 当前时间的格式化字符串 + */ +export function getCurrentSendTime(): string { + return formatDateTime(new Date()); +} + +/** + * 将日期时间转换为 sendTime 格式(用于表单提交前的处理) + * @param dateTime 日期时间值 + * @returns sendTime 格式字符串 + */ +export function toSendTimeFormat(dateTime: any): string { + return formatSendTime(dateTime); +} diff --git a/utils/dict.ts b/utils/dict.ts new file mode 100644 index 0000000..7eb30a5 --- /dev/null +++ b/utils/dict.ts @@ -0,0 +1,17 @@ +// ? 系统全局字典 + +/** + * @description:用户性别 + */ +export const genderType = [ + { label: "男", value: 1 }, + { label: "女", value: 2 } +]; + +/** + * @description:用户状态 + */ +export const userStatus = [ + { label: "启用", value: 1, tagType: "success" }, + { label: "禁用", value: 0, tagType: "danger" } +]; diff --git a/utils/errorHandler.ts b/utils/errorHandler.ts new file mode 100644 index 0000000..180b8c7 --- /dev/null +++ b/utils/errorHandler.ts @@ -0,0 +1,27 @@ +import { ElNotification } from "element-plus"; + +/** + * @description 全局代码错误捕捉 + * */ +const errorHandler = (error: any) => { + // 过滤 HTTP 请求错误 + if (error.status || error.status == 0) return false; + let errorMap: { [key: string]: string } = { + InternalError: "Javascript引擎内部错误", + ReferenceError: "未找到对象", + TypeError: "使用了错误的类型或对象", + RangeError: "使用内置对象时,参数超范围", + SyntaxError: "语法错误", + EvalError: "错误的使用了Eval", + URIError: "URI错误" + }; + let errorName = errorMap[error.name] || `错误码:${error.code}` || "未知错误"; + ElNotification({ + title: errorName, + message: error.message ? error.message : error, + type: "error", + duration: 3000 + }); +}; + +export default errorHandler; diff --git a/utils/index.ts b/utils/index.ts new file mode 100644 index 0000000..f65a7bc --- /dev/null +++ b/utils/index.ts @@ -0,0 +1,470 @@ +import { isArray } from "@/utils/is"; +import * as dateUtils from "@/utils/date"; + +const mode = import.meta.env.VITE_ROUTER_MODE; + +/** + * @description 获取localStorage + * @param {String} key Storage名称 + * @returns {String} + */ +export function localGet(key: string) { + const value = window.localStorage.getItem(key); + try { + return JSON.parse(window.localStorage.getItem(key) as string); + } catch (error) { + console.error(error); + return value; + } +} + +/** + * @description 存储localStorage + * @param {String} key Storage名称 + * @param {*} value Storage值 + * @returns {void} + */ +export function localSet(key: string, value: any) { + window.localStorage.setItem(key, JSON.stringify(value)); +} + +/** + * @description 清除localStorage + * @param {String} key Storage名称 + * @returns {void} + */ +export function localRemove(key: string) { + window.localStorage.removeItem(key); +} + +/** + * @description 清除所有localStorage + * @returns {void} + */ +export function localClear() { + window.localStorage.clear(); +} + +/** + * @description 判断数据类型 + * @param {*} val 需要判断类型的数据 + * @returns {String} + */ +export function isType(val: any) { + if (val === null) return "null"; + if (typeof val !== "object") return typeof val; + else return Object.prototype.toString.call(val).slice(8, -1).toLocaleLowerCase(); +} + +/** + * @description 生成唯一 uuid + * @returns {String} + */ +export function generateUUID() { + let uuid = ""; + for (let i = 0; i < 32; i++) { + let random = (Math.random() * 16) | 0; + if (i === 8 || i === 12 || i === 16 || i === 20) uuid += "-"; + uuid += (i === 12 ? 4 : i === 16 ? (random & 3) | 8 : random).toString(16); + } + return uuid; +} + +/** + * 判断两个对象是否相同 + * @param {Object} a 要比较的对象一 + * @param {Object} b 要比较的对象二 + * @returns {Boolean} 相同返回 true,反之 false + */ +export function isObjectValueEqual(a: { [key: string]: any }, b: { [key: string]: any }) { + if (!a || !b) return false; + let aProps = Object.getOwnPropertyNames(a); + let bProps = Object.getOwnPropertyNames(b); + if (aProps.length != bProps.length) return false; + for (let i = 0; i < aProps.length; i++) { + let propName = aProps[i]; + let propA = a[propName]; + let propB = b[propName]; + if (!b.hasOwnProperty(propName)) return false; + if (propA instanceof Object) { + if (!isObjectValueEqual(propA, propB)) return false; + } else if (propA !== propB) { + return false; + } + } + return true; +} + +/** + * @description 生成随机数 + * @param {Number} min 最小值 + * @param {Number} max 最大值 + * @returns {Number} + */ +export function randomNum(min: number, max: number): number { + let num = Math.floor(Math.random() * (min - max) + max); + return num; +} + +/** + * @description 获取当前时间对应的提示语 + * @returns {String} + */ +export function getTimeState() { + let timeNow = new Date(); + let hours = timeNow.getHours(); + if (hours >= 6 && hours <= 10) return `早上好 ⛅`; + if (hours >= 10 && hours <= 14) return `中午好 🌞`; + if (hours >= 14 && hours <= 18) return `下午好 🌞`; + if (hours >= 18 && hours <= 24) return `晚上好 🌛`; + if (hours >= 0 && hours <= 6) return `凌晨好 🌛`; +} + +/** + * @description 获取浏览器默认语言 + * @returns {String} + */ +export function getBrowserLang() { + let browserLang = navigator.language ? navigator.language : navigator.browserLanguage; + let defaultBrowserLang = ""; + if (["cn", "zh", "zh-cn"].includes(browserLang.toLowerCase())) { + defaultBrowserLang = "zh"; + } else { + defaultBrowserLang = "en"; + } + return defaultBrowserLang; +} + +/** + * @description 获取不同路由模式所对应的 url + params + * @returns {String} + */ +export function getUrlWithParams() { + const url = { + hash: location.hash.substring(1), + history: location.pathname + location.search + }; + return url[mode]; +} + +/** + * @description 使用递归扁平化菜单,方便添加动态路由 + * @param {Array} menuList 菜单列表 + * @returns {Array} + */ +export function getFlatMenuList(menuList: Menu.MenuOptions[]): Menu.MenuOptions[] { + let newMenuList: Menu.MenuOptions[] = JSON.parse(JSON.stringify(menuList)); + return newMenuList.flatMap(item => [item, ...(item.children ? getFlatMenuList(item.children) : [])]); +} + +/** + * @description 使用递归过滤出需要渲染在左侧菜单的列表 (需剔除 isHide == true 的菜单) + * @param {Array} menuList 菜单列表 + * @returns {Array} + * */ +export function getShowMenuList(menuList: Menu.MenuOptions[]) { + let newMenuList: Menu.MenuOptions[] = JSON.parse(JSON.stringify(menuList)); + return newMenuList.filter(item => { + item.children?.length && (item.children = getShowMenuList(item.children)); + return !item.meta?.isHide; + }); +} + +/** + * @description 使用递归找出所有面包屑存储到 pinia/vuex 中 + * @param {Array} menuList 菜单列表 + * @param {Array} parent 父级菜单 + * @param {Object} result 处理后的结果 + * @returns {Object} + */ +export const getAllBreadcrumbList = (menuList: Menu.MenuOptions[], parent = [], result: { [key: string]: any } = {}) => { + for (const item of menuList) { + result[item.path] = [...parent, item]; + if (item.children) getAllBreadcrumbList(item.children, result[item.path], result); + } + return result; +}; + +/** + * @description 使用递归处理路由菜单 path,生成一维数组 (第一版本地路由鉴权会用到,该函数暂未使用) + * @param {Array} menuList 所有菜单列表 + * @param {Array} menuPathArr 菜单地址的一维数组 ['**','**'] + * @returns {Array} + */ +export function getMenuListPath(menuList: Menu.MenuOptions[], menuPathArr: string[] = []): string[] { + for (const item of menuList) { + if (typeof item === "object" && item.path) menuPathArr.push(item.path); + if (item.children?.length) getMenuListPath(item.children, menuPathArr); + } + return menuPathArr; +} + +/** + * @description 递归查询当前 path 所对应的菜单对象 (该函数暂未使用) + * @param {Array} menuList 菜单列表 + * @param {String} path 当前访问地址 + * @returns {Object | null} + */ +export function findMenuByPath(menuList: Menu.MenuOptions[], path: string): Menu.MenuOptions | null { + for (const item of menuList) { + if (item.path === path) return item; + if (item.children) { + const res = findMenuByPath(item.children, path); + if (res) return res; + } + } + return null; +} + +/** + * @description 使用递归过滤需要缓存的菜单 name (该函数暂未使用) + * @param {Array} menuList 所有菜单列表 + * @param {Array} keepAliveNameArr 缓存的菜单 name ['**','**'] + * @returns {Array} + * */ +export function getKeepAliveRouterName(menuList: Menu.MenuOptions[], keepAliveNameArr: string[] = []) { + menuList.forEach(item => { + item.meta.isKeepAlive && item.name && keepAliveNameArr.push(item.name); + item.children?.length && getKeepAliveRouterName(item.children, keepAliveNameArr); + }); + return keepAliveNameArr; +} + +/** + * @description 格式化表格单元格默认值 (el-table-column) + * @param {Number} row 行 + * @param {Number} col 列 + * @param {*} callValue 当前单元格值 + * @returns {String} + * */ +export function formatTableColumn(row: number, col: number, callValue: any) { + // 如果当前值为数组,使用 / 拼接(根据需求自定义) + if (isArray(callValue)) return callValue.length ? callValue.join(" / ") : "--"; + return callValue ?? "--"; +} + +/** + * @description 处理 ProTable 值为数组 || 无数据 + * @param {*} callValue 需要处理的值 + * @returns {String} + * */ +export function formatValue(callValue: any) { + // 如果当前值为数组,使用 / 拼接(根据需求自定义) + if (isArray(callValue)) return callValue.length ? callValue.join(" / ") : "--"; + return callValue ?? "--"; +} + +/** + * @description 处理 prop 为多级嵌套的情况,返回的数据 (列如: prop: user.name) + * @param {Object} row 当前行数据 + * @param {String} prop 当前 prop + * @returns {*} + * */ +export function handleRowAccordingToProp(row: { [key: string]: any }, prop: string) { + if (!prop.includes(".")) return row[prop] ?? "--"; + prop.split(".").forEach(item => (row = row[item] ?? "--")); + return row; +} + +/** + * @description 处理 prop,当 prop 为多级嵌套时 ==> 返回最后一级 prop + * @param {String} prop 当前 prop + * @returns {String} + * */ +export function handleProp(prop: string) { + const propArr = prop.split("."); + if (propArr.length == 1) return prop; + return propArr[propArr.length - 1]; +} + + +/** + * @description 递归查找 callValue 对应的 enum 值 + * */ +export function findItemNested(enumData: any, callValue: any, value: string, children: string) { + return enumData.reduce((accumulator: any, current: any) => { + if (accumulator) return accumulator; + if (current[value] === callValue) return current; + if (current[children]) return findItemNested(current[children], callValue, value, children); + }, null); +} + +export function checkType(data: unknown): string { + const type = Object.prototype.toString.call(data); + return type.slice(8, -1).toLowerCase(); +} + +export function isEmpty(data: unknown): boolean { + const dataType = checkType(data); + switch (dataType) { + case "array": + return !(data as Array).length; + case "object": + return !Object.keys(data as object).length; + case "map": + case "set": + return !(data as Map | Set).size; + case "boolean": + case "number": + case "symbol": + case "function": + return false; + default: + return !data; + } +} + +import type { FilesType } from "../components/FilesCard/types.d.ts"; + +/* 公共 相关 开始 */ +/* 公共 相关 结束 */ + +/* FileCard 组件相关 开始 */ +// 更据文件后缀名获取文件类型 +export function getFileType(fileExtension: string): { + lowerCase: FilesType; + upperCase: string; +} { + // 去除后缀名开头的点,并转换为小写 + const cleanExtension = fileExtension.replace(".", "").toLowerCase(); + if (!cleanExtension) { + return { lowerCase: "unknown", upperCase: "Unknown" }; + } + const imageExtensions = ["png", "jpg", "jpeg", "gif", "bmp", "svg", "webp"]; + const wordExtensions = ["doc", "docx"]; + const excelExtensions = ["xls", "xlsx"]; + const pptExtensions = ["ppt", "pptx"]; + const audioExtensions = ["mp3", "wav", "ogg", "flac"]; + const videoExtensions = ["mp4", "avi", "mov", "mkv"]; + const codeExtensions = ["js", "ts", "html", "css", "py", "java", "c", "cpp", "json", "php"]; + const databaseExtensions = ["sql", "db", "sqlite"]; + const zipExtensions = ["zip", "rar", "7z"]; + const markExtensions = ["md", "mdx"]; + + if (imageExtensions.includes(cleanExtension)) { + return { lowerCase: "image", upperCase: "Image" }; + } + if (wordExtensions.includes(cleanExtension)) { + return { lowerCase: "word", upperCase: "Word" }; + } + if (excelExtensions.includes(cleanExtension)) { + return { lowerCase: "excel", upperCase: "Excel" }; + } + if (pptExtensions.includes(cleanExtension)) { + return { lowerCase: "ppt", upperCase: "Ppt" }; + } + if (cleanExtension === "pdf") { + return { lowerCase: "pdf", upperCase: "Pdf" }; + } + if (cleanExtension === "txt") { + return { lowerCase: "txt", upperCase: "Txt" }; + } + if (markExtensions.includes(cleanExtension)) { + return { lowerCase: "mark", upperCase: "Markdown" }; + } + if (audioExtensions.includes(cleanExtension)) { + return { lowerCase: "audio", upperCase: "Audio" }; + } + if (videoExtensions.includes(cleanExtension)) { + return { lowerCase: "video", upperCase: "Video" }; + } + if (codeExtensions.includes(cleanExtension)) { + return { lowerCase: "code", upperCase: "Code" }; + } + if (databaseExtensions.includes(cleanExtension)) { + return { lowerCase: "database", upperCase: "Database" }; + } + if (cleanExtension === "lnk") { + return { lowerCase: "link", upperCase: "Link" }; + } + if (zipExtensions.includes(cleanExtension)) { + return { lowerCase: "zip", upperCase: "Zip" }; + } + if (cleanExtension === "obj" || cleanExtension === "fbx" || cleanExtension === "glb") { + return { lowerCase: "three", upperCase: "3D" }; + } + return { lowerCase: "file", upperCase: "File" }; +} + +// 获取文件大小 +export function getSize(size: number) { + let retSize = size; + const units = ["B", "KB", "MB", "GB", "TB", "PB", "EB"]; + let unitIndex = 0; + + while (retSize >= 1024 && unitIndex < units.length - 1) { + retSize /= 1024; + unitIndex++; + } + + return `${retSize.toFixed(0)} ${units[unitIndex]}`; +} + +// 通过文件流,生成图片预览 +// Follow code is copy from `antd/components/upload/utils.ts`: +export function isImageFileType(type: string): boolean { + return type.indexOf("image/") === 0; +} +const MEASURE_SIZE = 200; +export function previewImage(file: File | Blob): Promise { + return new Promise(resolve => { + if (!file || !file.type || !isImageFileType(file.type)) { + resolve(""); + return; + } + + const img = new Image(); + img.onload = () => { + const { width, height } = img; + + const ratio = width / height; + const MEASURE_SIZE_WIDTH = ratio > 1 ? MEASURE_SIZE : MEASURE_SIZE * ratio; + const MEASURE_SIZE_HEIGHT = ratio > 1 ? MEASURE_SIZE / ratio : MEASURE_SIZE; + + const canvas = document.createElement("canvas"); + canvas.width = MEASURE_SIZE_WIDTH; + canvas.height = MEASURE_SIZE_HEIGHT; + canvas.style.cssText = `position: fixed; left: 0; top: 0; width: ${MEASURE_SIZE_WIDTH}px; height: ${MEASURE_SIZE_HEIGHT}px; z-index: 9999; display: none;`; + document.body.appendChild(canvas); + const ctx = canvas.getContext("2d"); + + ctx!.drawImage(img, 0, 0, MEASURE_SIZE_WIDTH, MEASURE_SIZE_HEIGHT); + const dataURL = canvas.toDataURL(); + document.body.removeChild(canvas); + window.URL.revokeObjectURL(img.src); + resolve(dataURL); + }; + img.crossOrigin = "anonymous"; + if (file.type.startsWith("image/svg+xml")) { + const reader = new FileReader(); + reader.onload = () => { + if (reader.result && typeof reader.result === "string") { + img.src = reader.result; + } + }; + reader.readAsDataURL(file); + } else if (file.type.startsWith("image/gif")) { + const reader = new FileReader(); + reader.onload = () => { + if (reader.result) { + resolve(reader.result as string); + } + }; + reader.readAsDataURL(file); + } else { + img.src = window.URL.createObjectURL(file); + } + }); +} + +/* FileCard 组件相关 结束 */ + +/* 日期时间工具函数 开始 */ +export const { + formatDateTime, + formatSendTime, + isValidSendTime, + getCurrentSendTime, + toSendTimeFormat +} = dateUtils; +/* 日期时间工具函数 结束 */ diff --git a/utils/is/index.ts b/utils/is/index.ts new file mode 100644 index 0000000..5678491 --- /dev/null +++ b/utils/is/index.ts @@ -0,0 +1,125 @@ +/** + * @description: 判断值是否未某个类型 + */ +export function is(val: unknown, type: string) { + return Object.prototype.toString.call(val) === `[object ${type}]`; +} + +/** + * @description: 是否为函数 + */ +export function isFunction(val: unknown): val is T { + return is(val, "Function"); +} + +/** + * @description: 是否已定义 + */ +export const isDef = (val?: T): val is T => { + return typeof val !== "undefined"; +}; + +/** + * @description: 是否未定义 + */ +export const isUnDef = (val?: T): val is T => { + return !isDef(val); +}; + +/** + * @description: 是否为对象 + */ +export const isObject = (val: any): val is Record => { + return val !== null && is(val, "Object"); +}; + +/** + * @description: 是否为时间 + */ +export function isDate(val: unknown): val is Date { + return is(val, "Date"); +} + +/** + * @description: 是否为数值 + */ +export function isNumber(val: unknown): val is number { + return is(val, "Number"); +} + +/** + * @description: 是否为AsyncFunction + */ +export function isAsyncFunction(val: unknown): val is Promise { + return is(val, "AsyncFunction"); +} + +/** + * @description: 是否为promise + */ +export function isPromise(val: unknown): val is Promise { + return is(val, "Promise") && isObject(val) && isFunction(val.then) && isFunction(val.catch); +} + +/** + * @description: 是否为字符串 + */ +export function isString(val: unknown): val is string { + return is(val, "String"); +} + +/** + * @description: 是否为boolean类型 + */ +export function isBoolean(val: unknown): val is boolean { + return is(val, "Boolean"); +} + +/** + * @description: 是否为数组 + */ +export function isArray(val: any): val is Array { + return val && Array.isArray(val); +} + +/** + * @description: 是否客户端 + */ +export const isClient = () => { + return typeof window !== "undefined"; +}; + +/** + * @description: 是否为浏览器 + */ +export const isWindow = (val: any): val is Window => { + return typeof window !== "undefined" && is(val, "Window"); +}; + +/** + * @description: 是否为 element 元素 + */ +export const isElement = (val: unknown): val is Element => { + return isObject(val) && !!val.tagName; +}; + +/** + * @description: 是否为 null + */ +export function isNull(val: unknown): val is null { + return val === null; +} + +/** + * @description: 是否为 null || undefined + */ +export function isNullOrUnDef(val: unknown): val is null | undefined { + return isUnDef(val) || isNull(val); +} + +/** + * @description: 是否为 16 进制颜色 + */ +export const isHexColor = (str: string) => { + return /^#?([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$/.test(str); +}; diff --git a/utils/loading.js b/utils/loading.js new file mode 100644 index 0000000..206e2e4 --- /dev/null +++ b/utils/loading.js @@ -0,0 +1,30 @@ +import { ElLoading } from "element-plus"; + +const loadingStack = []; + +const showLoading = (text='数据加载中...') => { + const loadingInstance = ElLoading.service({ + lock: true, + text: `${text}...`, + background: "rgba(228, 228, 228, 0.57)", + }); + loadingStack.push(loadingInstance); + return loadingInstance; +}; + +const hiddenLoading = () => { + if (loadingStack.length > 0) { + const loadingInstance = loadingStack.pop(); + loadingInstance.close(); + } +}; + +// 强制关闭所有 Loading(可选) +const hiddenAllLoading = () => { + while (loadingStack.length > 0) { + const loadingInstance = loadingStack.pop(); + loadingInstance.close(); + } +}; + +export { showLoading, hiddenLoading, hiddenAllLoading }; diff --git a/utils/showMsg.ts b/utils/showMsg.ts new file mode 100644 index 0000000..1ffdbb5 --- /dev/null +++ b/utils/showMsg.ts @@ -0,0 +1,13 @@ +// 显示错误 +import { ElNotification } from "element-plus"; +export function showMsg(t: string, type = "error", isCatch = true, reason?: string, duration = 2000) { + ElNotification({ + title: t, + type, + duration + }); + if (isCatch && type != "success") { + throw Error(reason || t); + } + // if (isCatch && type != 'success') { return reason || t; } +} diff --git a/utils/svg.ts b/utils/svg.ts new file mode 100644 index 0000000..0c191c9 --- /dev/null +++ b/utils/svg.ts @@ -0,0 +1,13 @@ +/** + * @description Loading Svg + */ +export const loadingSvg = ` + +`; diff --git a/utils/toBeian.js b/utils/toBeian.js new file mode 100644 index 0000000..f699daf --- /dev/null +++ b/utils/toBeian.js @@ -0,0 +1,3 @@ +export const toBeian = () => { + window.open("https://beian.miit.gov.cn/", "_blank"); +}; diff --git a/utils/useFileNameParser.ts b/utils/useFileNameParser.ts new file mode 100644 index 0000000..b83da6b --- /dev/null +++ b/utils/useFileNameParser.ts @@ -0,0 +1,25 @@ +import type { Ref } from "vue"; +import { computed } from "vue"; + +export default function useFileNameParser(name: Ref) { + const namePrefix = computed(() => { + const nameStr = name.value || ""; + const lastDotIndex = nameStr.lastIndexOf("."); + return lastDotIndex === -1 ? nameStr : nameStr.slice(0, lastDotIndex); + }); + + const nameSuffix = computed(() => { + const nameStr = name.value || ""; + const lastDotIndex = nameStr.lastIndexOf("."); + if (lastDotIndex === -1 && nameStr.length - lastDotIndex > 10) { + // 文件名长度超过10个字符 显示.file + return ".file"; + } + return lastDotIndex === -1 ? "" : nameStr.slice(lastDotIndex); + }); + + return { + namePrefix, + nameSuffix + }; +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..eefc447 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,56 @@ +import { defineConfig, ConfigEnv, loadEnv } from 'vite' +// import { +// getRootPath, +// getSrcPath, +// setupVitePlugins, +// } from "./build"; +import vue from '@vitejs/plugin-vue' +import path from 'path' +import { fileURLToPath, URL } from 'url' +// https://vitejs.dev/config/ +export default defineConfig((configEnv: ConfigEnv) => { + const viteEnv = loadEnv( + configEnv.mode, + process.cwd() + ) as unknown as ImportMetaEnv; + return { + plugins: [vue()], + // plugins: setupVitePlugins(viteEnv), + // 1. 路径别名(对应你之前的 @ -> src) + resolve: { + alias: { + '@/utils': path.resolve(__dirname, './utils'), + "~": path.resolve(__dirname, './src'), + '@': path.resolve(__dirname, './src'), + '@/typings': path.resolve(__dirname, './src/typings'), + components: path.resolve(__dirname, "components"), + + }, + extensions: ['.js', '.ts', '.jsx', '.tsx', '.json', '.vue'], + }, + + // 2. SCSS 兼容 & 全局变量(和 Vue CLI 写法不同) + css: { + preprocessorOptions: { + scss: { + // 如果你有全局 scss 变量文件,在这里引入 + // additionalData: `@use "@/assets/styles/variables.scss" as *;` + } + } + }, + + // 3. 开发服务配置(端口、跨域、自动打开浏览器等) + server: { + host: "0.0.0.0", + port: viteEnv.VITE_CLI_PORT, + proxy: { + [viteEnv.VITE_BASE_API]: { + target: viteEnv.VITE_BASE_PATH, + changeOrigin: true, + rewrite: (path: string) => + path.replace(new RegExp("^" + viteEnv.VITE_BASE_API), ""), + }, + }, + } + } +}) \ No newline at end of file