commit 371b1558a0285e0360dcb2a1ee20cf1c2d1cb363 Author: qubiaobiao <3294694717@qq.com> Date: Fri Mar 27 17:45:41 2026 +0800 卫星通信服务平台 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..cd68f14 --- /dev/null +++ b/.gitignore @@ -0,0 +1,39 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +.DS_Store +dist +dist-ssr +coverage +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +*.tsbuildinfo + +.eslintcache + +# Cypress +/cypress/videos/ +/cypress/screenshots/ + +# Vitest +__screenshots__/ + +# Vite +*.timestamp-*-*.mjs diff --git a/README.md b/README.md new file mode 100644 index 0000000..1182684 --- /dev/null +++ b/README.md @@ -0,0 +1,38 @@ +# tqxz-sn-message-platform + +This template should help get you started developing with Vue 3 in Vite. + +## Recommended IDE Setup + +[VS Code](https://code.visualstudio.com/) + [Vue (Official)](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur). + +## Recommended Browser Setup + +- Chromium-based browsers (Chrome, Edge, Brave, etc.): + - [Vue.js devtools](https://chromewebstore.google.com/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd) + - [Turn on Custom Object Formatter in Chrome DevTools](http://bit.ly/object-formatters) +- Firefox: + - [Vue.js devtools](https://addons.mozilla.org/en-US/firefox/addon/vue-js-devtools/) + - [Turn on Custom Object Formatter in Firefox DevTools](https://fxdx.dev/firefox-devtools-custom-object-formatters/) + +## Customize configuration + +See [Vite Configuration Reference](https://vite.dev/config/). + +## Project Setup + +```sh +npm install +``` + +### Compile and Hot-Reload for Development + +```sh +npm run dev +``` + +### Compile and Minify for Production + +```sh +npm run build +``` diff --git a/index.html b/index.html new file mode 100644 index 0000000..89415d7 --- /dev/null +++ b/index.html @@ -0,0 +1,52 @@ + + + + + + + + 北斗启航科技教育平台 + + + + +
+ + + + \ No newline at end of file diff --git a/jsconfig.json b/jsconfig.json new file mode 100644 index 0000000..5a1f2d2 --- /dev/null +++ b/jsconfig.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "paths": { + "@/*": ["./src/*"] + } + }, + "exclude": ["node_modules", "dist"] +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..ed57207 --- /dev/null +++ b/package.json @@ -0,0 +1,50 @@ +{ + "name": "tqxz-sn-message-platform", + "version": "0.0.0", + "private": true, + "type": "module", + "scripts": { + "dev": "vite --port=7022", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "@element-plus/icons-vue": "^2.3.1", + "axios": "^1.6.8", + "core-js": "^3.37.0", + "crypto-js": "^4.2.0", + "element-plus": "^2.7.8", + "fingerprintjs2": "^2.1.4", + "gbk.js": "^0.3.0", + "moment": "^2.30.1", + "pinia": "^3.0.4", + "pinia-plugin-persist": "^1.0.0", + "socket.io-client": "^4.8.0", + "terser": "^5.31.5", + "vue": "^3.5.29", + "vue-i18n": "^9.13.1", + "vue-router": "^5.0.3", + "zipson": "^0.2.12" + }, + "devDependencies": { + "@rollup/pluginutils": "^5.3.0", + "@vitejs/plugin-legacy": "^5.4.1", + "@vitejs/plugin-vue": "^6.0.4", + "autoprefixer": "^10.4.19", + "esbuild": "^0.27.3", + "install": "^0.13.0", + "minimatch": "^10.2.4", + "npm": "^11.11.0", + "postcss": "^8.4.40", + "rollup": "^4.59.0", + "tailwindcss": "^3.4.7", + "unimport": "^6.0.1", + "unplugin-auto-import": "^0.17.5", + "unplugin-vue-components": "^0.27.0", + "vite": "^7.3.1", + "vite-plugin-vue-devtools": "^8.0.6" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } +} diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..6ef5c58 --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {} + } +} \ No newline at end of file diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..df36fcf Binary files /dev/null and b/public/favicon.ico differ diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..65662c0 --- /dev/null +++ b/src/App.vue @@ -0,0 +1,11 @@ + + + + + diff --git a/src/api/index.js b/src/api/index.js new file mode 100644 index 0000000..c148995 --- /dev/null +++ b/src/api/index.js @@ -0,0 +1,118 @@ +import axios from "axios"; +import $url from "./url"; +import router from "../router"; +import { encrypt } from "../utils/aes"; + +// 添加请求拦截器 +axios.interceptors.request.use(function (config) { + // 在发送请求之前做些什么 + if (config.headers) { + config.headers.uid = localStorage.data; + if (localStorage.access_token && localStorage.access_token !== "" && localStorage.access_token !== null && localStorage.access_token !== undefined && localStorage.access_token !== NaN) { + config.headers.authorization = localStorage.access_token; + } + } + return config; +}, function (error) { + // 对请求错误做些什么 + return Promise.reject(error); +}); + +// 转到登录页面 +const toLogin = () => { + localStorage.clear(); + const data = { origin_url: window.location.href }; + axios.post($url.toLogin, data).then((res) => { + if (res.data.code === 200) { + window.location.href = res.data.redirect; + } else { + router.push({ path: '/404page' }); + } + }); +}; + +// 添加响应拦截器 +let result = true; +axios.interceptors.response.use(function (response) { + // 2xx 范围内的状态码都会触发该函数。 + // 对响应数据做点什么 + if (response.data.code === 200) { + if ("access_token" in response.data) { + localStorage.setItem("access_token", response.data.access_token); + } + if ("refresh_token" in response.data) { + localStorage.setItem("refresh_token", response.data.refresh_token); + } + if ("data" in response.data) { + localStorage.setItem("data", response.data.data); + } + } + // if (response.data.code === 302) { + // localStorage.clear(); + // //转到主页 + // router.push({ path: '/main' }); + // } + if(response.data.code === 401 && result) { + result = false; + setTimeout(() => { + result = true; + }, 1000); + let getCode = window.location.href.indexOf('?'); + if (getCode != '-1') { + let code = window.location.href.substring(getCode + 1); + const data = { + code: code, + type: encrypt('code') + }; + axios.post($url.getToken, data).then((res) => { + if (res.data.code === 200) { + localStorage.setItem("data", res.data.data); + localStorage.setItem("access_token", res.data.access_token); + localStorage.setItem("refresh_token", res.data.refresh_token); + window.location.href = res.data.redirect; + } else { + toLogin(); + } + }); + } else if (localStorage.refresh_token && localStorage.refresh_token !== "" && localStorage.refresh_token !== null && localStorage.refresh_token !== undefined && localStorage.refresh_token !== NaN) { + const data = { + code: localStorage.refresh_token, + type: localStorage.data + }; + axios.post($url.getToken, data).then((res) => { + if (res.data.code === 200) { + localStorage.setItem("data", res.data.data); + localStorage.setItem("access_token", res.data.access_token); + localStorage.setItem("refresh_token", res.data.refresh_token); + window.location.reload(); + } else { + toLogin(); + } + }); + } else { + toLogin(); + } + } + return response; +}, function (error) { + // 超出 2xx 范围的状态码都会触发该函数。 + // 对响应错误做点什么 + return Promise.reject(error); +}); + +export default { + get(url, query = {}) { + return axios.get(url, { + params: query + }); + }, + post(url, body) { + return axios.post(url, body); + }, + put(url, body) { + return axios.put(url, body); + }, + del(url) { + return axios.delete(url); + }, +} \ No newline at end of file diff --git a/src/api/url.js b/src/api/url.js new file mode 100644 index 0000000..5c5d057 --- /dev/null +++ b/src/api/url.js @@ -0,0 +1,44 @@ +export default { + // 用于确认哪个网页在进行登录 + toLogin: "/authentication/toLogin", + // 退出登录 + unLogin: "/authentication/unLogin", + // 用于获取token + getToken: "/authentication/getToken", + // 用于验证token + verify: "/authentication/verify", + // 获取用户基本信息 + getUser: "/authentication/getUser", + // 修改用户基本信息 + editUser: "/authentication/editUser", + // B端单位管理员编辑用户基本信息 + editUserManager: "/authentication/editUserManager", + // 修改密码 + changePassword: "/authentication/changePassword", + // 重置密码 + resetPassword: "/authentication/resetPassword", + // 获取sn号 + getSN: "/snShortMessage/getSN", + // 搜索sn号 + searchSN: "/snShortMessage/searchSN", + // 搜索可绑定的SN号 + searchBindSN: "/snShortMessage/searchBindSN", + // 搜索可绑定的单位用户 + searchBindUser: "/snShortMessage/searchBindUser", + // 绑定sn号 + bindSN: "/snShortMessage/bindSN", + // 解绑sn号 + unBindingSN: "/snShortMessage/unBindingSN", + // 获取绑定记录 + getRecord: "/snShortMessage/getRecord", + // 获取历史消息 + getHistoryMsg: "/snShortMessage/getHistoryMsg", + // 删除历史消息 + delHistoryMsg: "/snShortMessage/delHistoryMsg", + // 获取单位用户 + bsideUserManager: "/snShortMessage/bsideUserManager", + // 获取可管理的SN号 + bsideSNManager: "/snShortMessage/bsideSNManager", + // webSocket服务端地址 + snWebSocket: "/snWebSocket/", +} \ No newline at end of file diff --git a/src/assets/base.css b/src/assets/base.css new file mode 100644 index 0000000..8816868 --- /dev/null +++ b/src/assets/base.css @@ -0,0 +1,86 @@ +/* color palette from */ +:root { + --vt-c-white: #ffffff; + --vt-c-white-soft: #f8f8f8; + --vt-c-white-mute: #f2f2f2; + + --vt-c-black: #181818; + --vt-c-black-soft: #222222; + --vt-c-black-mute: #282828; + + --vt-c-indigo: #2c3e50; + + --vt-c-divider-light-1: rgba(60, 60, 60, 0.29); + --vt-c-divider-light-2: rgba(60, 60, 60, 0.12); + --vt-c-divider-dark-1: rgba(84, 84, 84, 0.65); + --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48); + + --vt-c-text-light-1: var(--vt-c-indigo); + --vt-c-text-light-2: rgba(60, 60, 60, 0.66); + --vt-c-text-dark-1: var(--vt-c-white); + --vt-c-text-dark-2: rgba(235, 235, 235, 0.64); +} + +/* semantic color variables for this project */ +:root { + --color-background: var(--vt-c-white); + --color-background-soft: var(--vt-c-white-soft); + --color-background-mute: var(--vt-c-white-mute); + + --color-border: var(--vt-c-divider-light-2); + --color-border-hover: var(--vt-c-divider-light-1); + + --color-heading: var(--vt-c-text-light-1); + --color-text: var(--vt-c-text-light-1); + + --section-gap: 160px; +} + +@media (prefers-color-scheme: dark) { + :root { + --color-background: var(--vt-c-black); + --color-background-soft: var(--vt-c-black-soft); + --color-background-mute: var(--vt-c-black-mute); + + --color-border: var(--vt-c-divider-dark-2); + --color-border-hover: var(--vt-c-divider-dark-1); + + --color-heading: var(--vt-c-text-dark-1); + --color-text: var(--vt-c-text-dark-2); + } +} + +*, +*::before, +*::after { + box-sizing: border-box; + margin: 0; + font-weight: normal; +} + +body { + min-height: 100vh; + color: var(--color-text); + background: var(--color-background); + transition: + color 0.5s, + background-color 0.5s; + line-height: 1.6; + font-family: + Inter, + -apple-system, + BlinkMacSystemFont, + 'Segoe UI', + Roboto, + Oxygen, + Ubuntu, + Cantarell, + 'Fira Sans', + 'Droid Sans', + 'Helvetica Neue', + sans-serif; + font-size: 15px; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} diff --git a/src/assets/favicon.ico b/src/assets/favicon.ico new file mode 100644 index 0000000..1b51f8f Binary files /dev/null and b/src/assets/favicon.ico differ diff --git a/src/assets/img/Q&A/showType.png b/src/assets/img/Q&A/showType.png new file mode 100644 index 0000000..a969c35 Binary files /dev/null and b/src/assets/img/Q&A/showType.png differ diff --git a/src/assets/img/Q&A/tabelTools.png b/src/assets/img/Q&A/tabelTools.png new file mode 100644 index 0000000..b452677 Binary files /dev/null and b/src/assets/img/Q&A/tabelTools.png differ diff --git a/src/assets/img/Q&A/toolsClick.png b/src/assets/img/Q&A/toolsClick.png new file mode 100644 index 0000000..2f05570 Binary files /dev/null and b/src/assets/img/Q&A/toolsClick.png differ diff --git a/src/assets/img/Q&A/toolsSelect.png b/src/assets/img/Q&A/toolsSelect.png new file mode 100644 index 0000000..519e1c9 Binary files /dev/null and b/src/assets/img/Q&A/toolsSelect.png differ diff --git a/src/assets/img/code/changeMode.png b/src/assets/img/code/changeMode.png new file mode 100644 index 0000000..8cc2dbb Binary files /dev/null and b/src/assets/img/code/changeMode.png differ diff --git a/src/assets/img/code/codeGuide.png b/src/assets/img/code/codeGuide.png new file mode 100644 index 0000000..7c3fa24 Binary files /dev/null and b/src/assets/img/code/codeGuide.png differ diff --git a/src/assets/img/code/codeScience.png b/src/assets/img/code/codeScience.png new file mode 100644 index 0000000..20e99a5 Binary files /dev/null and b/src/assets/img/code/codeScience.png differ diff --git a/src/assets/img/code/codeType.png b/src/assets/img/code/codeType.png new file mode 100644 index 0000000..d1054f4 Binary files /dev/null and b/src/assets/img/code/codeType.png differ diff --git a/src/assets/img/code/fontGuide.png b/src/assets/img/code/fontGuide.png new file mode 100644 index 0000000..3573cc5 Binary files /dev/null and b/src/assets/img/code/fontGuide.png differ diff --git a/src/assets/img/code/showType.png b/src/assets/img/code/showType.png new file mode 100644 index 0000000..957b146 Binary files /dev/null and b/src/assets/img/code/showType.png differ diff --git a/src/assets/img/code/transCode.png b/src/assets/img/code/transCode.png new file mode 100644 index 0000000..acd3959 Binary files /dev/null and b/src/assets/img/code/transCode.png differ diff --git a/src/assets/img/code/transFont.png b/src/assets/img/code/transFont.png new file mode 100644 index 0000000..26facfb Binary files /dev/null and b/src/assets/img/code/transFont.png differ diff --git a/src/assets/img/header/headerGuide.png b/src/assets/img/header/headerGuide.png new file mode 100644 index 0000000..162c6b7 Binary files /dev/null and b/src/assets/img/header/headerGuide.png differ diff --git a/src/assets/img/header/headerSelect.png b/src/assets/img/header/headerSelect.png new file mode 100644 index 0000000..a2f1320 Binary files /dev/null and b/src/assets/img/header/headerSelect.png differ diff --git a/src/assets/img/manager/operateSelect.png b/src/assets/img/manager/operateSelect.png new file mode 100644 index 0000000..fa44a1e Binary files /dev/null and b/src/assets/img/manager/operateSelect.png differ diff --git a/src/assets/img/manager/operateType.png b/src/assets/img/manager/operateType.png new file mode 100644 index 0000000..05c0331 Binary files /dev/null and b/src/assets/img/manager/operateType.png differ diff --git a/src/assets/img/msg/msg.png b/src/assets/img/msg/msg.png new file mode 100644 index 0000000..aae75c1 Binary files /dev/null and b/src/assets/img/msg/msg.png differ diff --git a/src/assets/img/msg/operateSelect.png b/src/assets/img/msg/operateSelect.png new file mode 100644 index 0000000..fa44a1e Binary files /dev/null and b/src/assets/img/msg/operateSelect.png differ diff --git a/src/assets/img/msg/operateType.png b/src/assets/img/msg/operateType.png new file mode 100644 index 0000000..0c9a95b Binary files /dev/null and b/src/assets/img/msg/operateType.png differ diff --git a/src/assets/img/msg/showMsg.png b/src/assets/img/msg/showMsg.png new file mode 100644 index 0000000..bbb4462 Binary files /dev/null and b/src/assets/img/msg/showMsg.png differ diff --git a/src/assets/img/xor/errorMsg.png b/src/assets/img/xor/errorMsg.png new file mode 100644 index 0000000..57aadac Binary files /dev/null and b/src/assets/img/xor/errorMsg.png differ diff --git a/src/assets/img/xor/input.png b/src/assets/img/xor/input.png new file mode 100644 index 0000000..a69e1d5 Binary files /dev/null and b/src/assets/img/xor/input.png differ diff --git a/src/assets/img/xor/xor.png b/src/assets/img/xor/xor.png new file mode 100644 index 0000000..0d2516c Binary files /dev/null and b/src/assets/img/xor/xor.png differ diff --git a/src/assets/img/xor/xorGuide.png b/src/assets/img/xor/xorGuide.png new file mode 100644 index 0000000..a44a044 Binary files /dev/null and b/src/assets/img/xor/xorGuide.png differ diff --git a/src/assets/logo.png b/src/assets/logo.png new file mode 100644 index 0000000..ee9c6bd Binary files /dev/null and b/src/assets/logo.png differ diff --git a/src/assets/logo.svg b/src/assets/logo.svg new file mode 100644 index 0000000..7565660 --- /dev/null +++ b/src/assets/logo.svg @@ -0,0 +1 @@ + diff --git a/src/assets/main.css b/src/assets/main.css new file mode 100644 index 0000000..2c350cf --- /dev/null +++ b/src/assets/main.css @@ -0,0 +1,9 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer components { + .w-h-full { + @apply w-full h-full m-0 p-0 overflow-hidden; + } +} \ No newline at end of file diff --git a/src/assets/qrcode.jpg b/src/assets/qrcode.jpg new file mode 100644 index 0000000..1ca11ac Binary files /dev/null and b/src/assets/qrcode.jpg differ diff --git a/src/components/calculationXOR/calculationXOR.vue b/src/components/calculationXOR/calculationXOR.vue new file mode 100644 index 0000000..8d3ac3c --- /dev/null +++ b/src/components/calculationXOR/calculationXOR.vue @@ -0,0 +1,115 @@ + + + + + diff --git a/src/components/features/bindSN.vue b/src/components/features/bindSN.vue new file mode 100644 index 0000000..3e8a2c8 --- /dev/null +++ b/src/components/features/bindSN.vue @@ -0,0 +1,239 @@ + + + + + diff --git a/src/components/features/bsideManager.vue b/src/components/features/bsideManager.vue new file mode 100644 index 0000000..697e330 --- /dev/null +++ b/src/components/features/bsideManager.vue @@ -0,0 +1,453 @@ + + + + + diff --git a/src/components/features/historyMsg.vue b/src/components/features/historyMsg.vue new file mode 100644 index 0000000..c356d8d --- /dev/null +++ b/src/components/features/historyMsg.vue @@ -0,0 +1,458 @@ + + + + + diff --git a/src/components/features/record.vue b/src/components/features/record.vue new file mode 100644 index 0000000..3422046 --- /dev/null +++ b/src/components/features/record.vue @@ -0,0 +1,302 @@ + + + + + diff --git a/src/components/features/snManager.vue b/src/components/features/snManager.vue new file mode 100644 index 0000000..e21e8f0 --- /dev/null +++ b/src/components/features/snManager.vue @@ -0,0 +1,275 @@ + + + + + diff --git a/src/components/guide/Q&A.vue b/src/components/guide/Q&A.vue new file mode 100644 index 0000000..79833d0 --- /dev/null +++ b/src/components/guide/Q&A.vue @@ -0,0 +1,87 @@ + + + + + diff --git a/src/components/guide/code.vue b/src/components/guide/code.vue new file mode 100644 index 0000000..9227cc7 --- /dev/null +++ b/src/components/guide/code.vue @@ -0,0 +1,92 @@ + + + + + diff --git a/src/components/guide/guide.vue b/src/components/guide/guide.vue new file mode 100644 index 0000000..2f2348f --- /dev/null +++ b/src/components/guide/guide.vue @@ -0,0 +1,128 @@ + + + + + diff --git a/src/components/guide/header.vue b/src/components/guide/header.vue new file mode 100644 index 0000000..58bf6be --- /dev/null +++ b/src/components/guide/header.vue @@ -0,0 +1,29 @@ + + + + + diff --git a/src/components/guide/manager.vue b/src/components/guide/manager.vue new file mode 100644 index 0000000..61b6fa0 --- /dev/null +++ b/src/components/guide/manager.vue @@ -0,0 +1,38 @@ + + + + + diff --git a/src/components/guide/msg.vue b/src/components/guide/msg.vue new file mode 100644 index 0000000..de65067 --- /dev/null +++ b/src/components/guide/msg.vue @@ -0,0 +1,72 @@ + + + + + diff --git a/src/components/guide/xor.vue b/src/components/guide/xor.vue new file mode 100644 index 0000000..95f9d37 --- /dev/null +++ b/src/components/guide/xor.vue @@ -0,0 +1,42 @@ + + + + + diff --git a/src/components/manager/changePassword.vue b/src/components/manager/changePassword.vue new file mode 100644 index 0000000..45448c1 --- /dev/null +++ b/src/components/manager/changePassword.vue @@ -0,0 +1,217 @@ + + + + + diff --git a/src/components/manager/userManager.vue b/src/components/manager/userManager.vue new file mode 100644 index 0000000..ad5e05d --- /dev/null +++ b/src/components/manager/userManager.vue @@ -0,0 +1,344 @@ + + + + + diff --git a/src/components/operate/dataShow.vue b/src/components/operate/dataShow.vue new file mode 100644 index 0000000..ae6c2b0 --- /dev/null +++ b/src/components/operate/dataShow.vue @@ -0,0 +1,54 @@ + + + + + diff --git a/src/components/operate/editBsideUser.vue b/src/components/operate/editBsideUser.vue new file mode 100644 index 0000000..17b5815 --- /dev/null +++ b/src/components/operate/editBsideUser.vue @@ -0,0 +1,140 @@ + + + + + diff --git a/src/components/operate/passwordOauth.vue b/src/components/operate/passwordOauth.vue new file mode 100644 index 0000000..8a0caa0 --- /dev/null +++ b/src/components/operate/passwordOauth.vue @@ -0,0 +1,146 @@ + + + + + diff --git a/src/components/operate/shortMsg.vue b/src/components/operate/shortMsg.vue new file mode 100644 index 0000000..75fb8f4 --- /dev/null +++ b/src/components/operate/shortMsg.vue @@ -0,0 +1,18 @@ + + + + + diff --git a/src/components/operate/tabelSelect.vue b/src/components/operate/tabelSelect.vue new file mode 100644 index 0000000..3fe6b73 --- /dev/null +++ b/src/components/operate/tabelSelect.vue @@ -0,0 +1,78 @@ + + + + + diff --git a/src/components/operate/tabelTools.vue b/src/components/operate/tabelTools.vue new file mode 100644 index 0000000..606e513 --- /dev/null +++ b/src/components/operate/tabelTools.vue @@ -0,0 +1,113 @@ + + + + + diff --git a/src/components/pageStructure/footer.vue b/src/components/pageStructure/footer.vue new file mode 100644 index 0000000..dcb7932 --- /dev/null +++ b/src/components/pageStructure/footer.vue @@ -0,0 +1,16 @@ + + + + + diff --git a/src/components/pageStructure/header.vue b/src/components/pageStructure/header.vue new file mode 100644 index 0000000..4bad806 --- /dev/null +++ b/src/components/pageStructure/header.vue @@ -0,0 +1,168 @@ + + + + + diff --git a/src/components/pageStructure/main.vue b/src/components/pageStructure/main.vue new file mode 100644 index 0000000..a4cc4a5 --- /dev/null +++ b/src/components/pageStructure/main.vue @@ -0,0 +1,193 @@ + + + + + diff --git a/src/components/search/dateTimePicker.vue b/src/components/search/dateTimePicker.vue new file mode 100644 index 0000000..c269dcc --- /dev/null +++ b/src/components/search/dateTimePicker.vue @@ -0,0 +1,94 @@ + + + + + diff --git a/src/components/search/pagination.vue b/src/components/search/pagination.vue new file mode 100644 index 0000000..e7b41f3 --- /dev/null +++ b/src/components/search/pagination.vue @@ -0,0 +1,57 @@ + + + + + diff --git a/src/components/search/searchKey.vue b/src/components/search/searchKey.vue new file mode 100644 index 0000000..b7a4687 --- /dev/null +++ b/src/components/search/searchKey.vue @@ -0,0 +1,40 @@ + + + + + diff --git a/src/components/search/selectSearch.vue b/src/components/search/selectSearch.vue new file mode 100644 index 0000000..3ffc2d4 --- /dev/null +++ b/src/components/search/selectSearch.vue @@ -0,0 +1,42 @@ + + + + + diff --git a/src/components/search/sortSearch.vue b/src/components/search/sortSearch.vue new file mode 100644 index 0000000..de6dc8f --- /dev/null +++ b/src/components/search/sortSearch.vue @@ -0,0 +1,32 @@ + + + + + diff --git a/src/components/transcoding/codeHelp.vue b/src/components/transcoding/codeHelp.vue new file mode 100644 index 0000000..e192936 --- /dev/null +++ b/src/components/transcoding/codeHelp.vue @@ -0,0 +1,96 @@ + + + + + diff --git a/src/components/transcoding/decode.vue b/src/components/transcoding/decode.vue new file mode 100644 index 0000000..83f0c68 --- /dev/null +++ b/src/components/transcoding/decode.vue @@ -0,0 +1,328 @@ + + + + + diff --git a/src/components/transcoding/encode.vue b/src/components/transcoding/encode.vue new file mode 100644 index 0000000..523aa66 --- /dev/null +++ b/src/components/transcoding/encode.vue @@ -0,0 +1,159 @@ + + + + + diff --git a/src/main.js b/src/main.js new file mode 100644 index 0000000..ff9e433 --- /dev/null +++ b/src/main.js @@ -0,0 +1,23 @@ +import './assets/main.css' + +import { createApp } from 'vue'; +import { createPinia } from 'pinia'; +import piniaPersist from 'pinia-plugin-persist'; +import ElementPlus from 'element-plus'; +import zhCn from 'element-plus/es/locale/lang/zh-cn'; +import 'element-plus/dist/index.css'; + +import App from './App.vue'; +import router from './router'; + +const app = createApp(App); // 创建 vue 实例 + +const store = createPinia(); // 创建 pinia 实例 + +store.use(piniaPersist); + +app.use(store); +app.use(ElementPlus, { locale: zhCn }); +app.use(router); + +app.mount('#app'); diff --git a/src/router/index.js b/src/router/index.js new file mode 100644 index 0000000..9bc7140 --- /dev/null +++ b/src/router/index.js @@ -0,0 +1,31 @@ +import { createRouter, createWebHistory } from 'vue-router'; + +const router = createRouter({ + history: createWebHistory(import.meta.env.BASE_URL), + routes: [ + { + path: '/main', + name: 'main', + component: () => import('../views/Main.vue') + }, + { + path: '/404page', + name: '404', + component: () => import('../views/404page.vue') + } + ] +}); + +router.beforeEach((to, from, next) => { + if (to.matched.length === 0) { + if (to.path == "/") { + router.push({ path: '/main' }); + } else { + router.push({ path: '/404page' }); + } + } else { + next(); + } +}); + +export default router; diff --git a/src/stores/bindSN.js b/src/stores/bindSN.js new file mode 100644 index 0000000..f11900e --- /dev/null +++ b/src/stores/bindSN.js @@ -0,0 +1,26 @@ +import { defineStore } from 'pinia'; +import { parse, stringify } from 'zipson'; + +const bindSNActiveStore = defineStore('bindSN', { + state: () => ({ + // 持久化数据 + selectedUser: "", + selectedSN: "", + }), + persist: { + enabled: true, // Store 中数据持久化生效 + strategies: [ + { + key: 'bindSNActive', // 存储的 key + storage: localStorage, // 存储位置 + paths: ["selectedUser", "selectedSN"], // 需要持久化的字段 + serializer: { + deserialize: parse, + serialize: stringify, + }, + } + ], + }, +}); + +export default bindSNActiveStore; \ No newline at end of file diff --git a/src/stores/bsideManager.js b/src/stores/bsideManager.js new file mode 100644 index 0000000..7925ddb --- /dev/null +++ b/src/stores/bsideManager.js @@ -0,0 +1,37 @@ +import { defineStore } from 'pinia'; +import { parse, stringify } from 'zipson'; + +const bsideManagerActiveStore = defineStore('bsideManager', { + state: () => ({ + // 持久化数据 + offset: 1, + limit: 10, + dataCount: 0, + pageCount: 0, + searchOptions: { + account_name: "", + user_name: "", + phone: "", + }, + dialogVisible: false, + dialogSearchVisible: false, + dialogSortVisible: false, + dialogOperationVisible: false + }), + persist: { + enabled: true, // Store 中数据持久化生效 + strategies: [ + { + key: 'bsideManagerActive', // 存储的 key + storage: localStorage, // 存储位置 + paths: ["offset", "limit", "dataCount", "pageCount", "searchOptions", "dialogVisible", "dialogSearchVisible", "dialogSortVisible", "dialogOperationVisible"], // 需要持久化的字段 + serializer: { + deserialize: parse, + serialize: stringify, + }, + } + ] + }, +}); + +export default bsideManagerActiveStore; \ No newline at end of file diff --git a/src/stores/decode.js b/src/stores/decode.js new file mode 100644 index 0000000..bf22c72 --- /dev/null +++ b/src/stores/decode.js @@ -0,0 +1,33 @@ +import { defineStore } from 'pinia'; +import { parse, stringify } from 'zipson'; + +const decodeActiveStore = defineStore('decode', { + state: () => ({ + // 持久化数据 + decodeType: "", + showType: "", + fontcode: "", + transcode: "", + transcodehex: "", + transcodebin: "", + fontcodedec: "", + fontcodehex: "", + fontcodebin: "", + }), + persist: { + enabled: true, // Store 中数据持久化生效 + strategies: [ + { + key: 'decodeActive', // 存储的 key + storage: localStorage, // 存储位置 + paths: ["decodeType", "showType", "fontcode", "transcode", "transcodehex", "transcodebin", "fontcodedec", "fontcodehex", "fontcodebin"], // 需要持久化的字段 + serializer: { + deserialize: parse, + serialize: stringify, + }, + } + ], + }, +}); + +export default decodeActiveStore; \ No newline at end of file diff --git a/src/stores/encode.js b/src/stores/encode.js new file mode 100644 index 0000000..6f68c33 --- /dev/null +++ b/src/stores/encode.js @@ -0,0 +1,29 @@ +import { defineStore } from 'pinia'; +import { parse, stringify } from 'zipson'; + +const encodeActiveStore = defineStore('encode', { + state: () => ({ + // 持久化数据 + showType: "", + inputfont: "", + transfont: "", + transfonthex: "", + transfontbin: "", + }), + persist: { + enabled: true, // Store 中数据持久化生效 + strategies: [ + { + key: 'encodeActive', // 存储的 key + storage: localStorage, // 存储位置 + paths: ["showType", "inputfont", "transfont", "transfonthex", "transfontbin"], // 需要持久化的字段 + serializer: { + deserialize: parse, + serialize: stringify, + }, + } + ] + }, +}); + +export default encodeActiveStore; \ No newline at end of file diff --git a/src/stores/historyMsg.js b/src/stores/historyMsg.js new file mode 100644 index 0000000..badc7dd --- /dev/null +++ b/src/stores/historyMsg.js @@ -0,0 +1,43 @@ +import { defineStore } from 'pinia'; +import { parse, stringify } from 'zipson'; + +const historyMsgActiveStore = defineStore('historyMsg', { + state: () => ({ + // 持久化数据 + activeIndex: "1", + subActiveIndex: "1", + offset: 1, + limit: 10, + dataCount: 0, + pageCount: 0, + searchOptions: { + sn_number: "", + original_msg: "", + msg_data: "", + created_at: "", + }, + sortOptions: { + sn_number: false, + created_at: false, + }, + dialogSearchVisible: false, + dialogSortVisible: false, + dialogOperationVisible: false + }), + persist: { + enabled: true, // Store 中数据持久化生效 + strategies: [ + { + key: 'historyMsgActive', // 存储的 key + storage: localStorage, // 存储位置 + paths: ["activeIndex", "subActiveIndex", "offset", "limit", "dataCount", "pageCount", "searchOptions", "sortOptions", "dialogSearchVisible", "dialogSortVisible", "dialogOperationVisible"], // 需要持久化的字段 + serializer: { + deserialize: parse, + serialize: stringify, + }, + } + ] + }, +}); + +export default historyMsgActiveStore; \ No newline at end of file diff --git a/src/stores/record.js b/src/stores/record.js new file mode 100644 index 0000000..fd813a3 --- /dev/null +++ b/src/stores/record.js @@ -0,0 +1,40 @@ +import { defineStore } from 'pinia'; +import { parse, stringify } from 'zipson'; + +const recordActiveStore = defineStore('record', { + state: () => ({ + // 持久化数据 + offset: 1, + limit: 10, + dataCount: 0, + searchOptions: { + account_name: "", + sn_number: "", + type: "", + created_at: "", + }, + sortOptions: { + sn_number: false, + created_at: false, + }, + dialogSearchVisible: false, + dialogSortVisible: false, + dialogOperationVisible: false + }), + persist: { + enabled: true, // Store 中数据持久化生效 + strategies: [ + { + key: 'recordActive', // 存储的 key + storage: localStorage, // 存储位置 + paths: ["offset", "limit", "dataCount", "searchOptions", "sortOptions", "dialogSearchVisible", "dialogSortVisible", "dialogOperationVisible"], // 需要持久化的字段 + serializer: { + deserialize: parse, + serialize: stringify, + }, + } + ] + }, +}); + +export default recordActiveStore; \ No newline at end of file diff --git a/src/stores/shortMsg.js b/src/stores/shortMsg.js new file mode 100644 index 0000000..8b55a22 --- /dev/null +++ b/src/stores/shortMsg.js @@ -0,0 +1,26 @@ +import { defineStore } from 'pinia'; +import { parse, stringify } from 'zipson'; + +const shortMsgActiveStore = defineStore('shortMsg', { + state: () => ({ + // 持久化数据 + message: "", + created_at: "" + }), + persist: { + enabled: true, // Store 中数据持久化生效 + strategies: [ + { + key: 'shortMsgActive', // 存储的 key + storage: localStorage, // 存储位置 + paths: ["message", "created_at"], // 需要持久化的字段 + serializer: { + deserialize: parse, + serialize: stringify, + }, + } + ] + }, +}); + +export default shortMsgActiveStore; \ No newline at end of file diff --git a/src/stores/snManager.js b/src/stores/snManager.js new file mode 100644 index 0000000..c82cf9d --- /dev/null +++ b/src/stores/snManager.js @@ -0,0 +1,39 @@ +import { defineStore } from 'pinia'; +import { parse, stringify } from 'zipson'; + +const snManagerActiveStore = defineStore('snManager', { + state: () => ({ + // 持久化数据 + offset: 1, + limit: 10, + dataCount: 0, + searchOptions: { + sn_number: "", + status: "", + updated_at: "", + }, + sortOptions: { + sn_number: false, + updated_at: false, + }, + dialogSearchVisible: false, + dialogSortVisible: false, + dialogOperationVisible: false + }), + persist: { + enabled: true, // Store 中数据持久化生效 + strategies: [ + { + key: 'snManagerActive', // 存储的 key + storage: localStorage, // 存储位置 + paths: ["offset", "limit", "dataCount", "searchOptions", "sortOptions", "dialogSearchVisible", "dialogSortVisible", "dialogOperationVisible"], // 需要持久化的字段 + serializer: { + deserialize: parse, + serialize: stringify, + }, + } + ] + }, +}); + +export default snManagerActiveStore; \ No newline at end of file diff --git a/src/stores/userManager.js b/src/stores/userManager.js new file mode 100644 index 0000000..4442b85 --- /dev/null +++ b/src/stores/userManager.js @@ -0,0 +1,35 @@ +import { defineStore } from 'pinia'; +import { parse, stringify } from 'zipson'; + +const userManagerActiveStore = defineStore('userManager', { + state: () => ({ + // 持久化数据 + dialogVisible: false, + ruleForm: { + account_name: "", + user_name: "", + phone: "", + gender: "", + age: "", + email: "", + address: "", + post_code: "", + }, + }), + persist: { + enabled: true, // Store 中数据持久化生效 + strategies: [ + { + key: 'userManagerActive', // 存储的 key + storage: localStorage, // 存储位置 + paths: ["dialogVisible", "ruleForm"], // 需要持久化的字段 + serializer: { + deserialize: parse, + serialize: stringify, + }, + } + ] + }, +}); + +export default userManagerActiveStore; \ No newline at end of file diff --git a/src/utils/aes.js b/src/utils/aes.js new file mode 100644 index 0000000..9ca4cdc --- /dev/null +++ b/src/utils/aes.js @@ -0,0 +1,21 @@ +import CryptoJS from 'crypto-js'; + +const KEY = CryptoJS.enc.Utf8.parse('BDQH'); + +export const encrypt = (plaintext) => { + if(plaintext !== null && plaintext !== undefined && plaintext !== "") { + return CryptoJS.AES.encrypt(plaintext, KEY, { + mode: CryptoJS.mode.ECB, + padding: CryptoJS.pad.Pkcs7 + }).toString(); + } +}; + +export const decrypt = (plaintext) => { + if(plaintext !== null && plaintext !== undefined && !plaintext == "") { + return CryptoJS.AES.decrypt(plaintext, KEY, { + mode: CryptoJS.mode.ECB, + padding: CryptoJS.pad.Pkcs7 + }).toString(CryptoJS.enc.Utf8); + } +}; \ No newline at end of file diff --git a/src/utils/hasNullOrEmptyPropertyWithTypeof.js b/src/utils/hasNullOrEmptyPropertyWithTypeof.js new file mode 100644 index 0000000..6af4b89 --- /dev/null +++ b/src/utils/hasNullOrEmptyPropertyWithTypeof.js @@ -0,0 +1,9 @@ +export const hasNullOrEmptyPropertyWithTypeof = (obj) => { + let hasNullOrEmpty = false; + for (const prop in obj) { + if (!(obj.hasOwnProperty(prop) && ((obj[prop] === null) || obj[prop] === undefined || (typeof obj[prop] === 'string' && obj[prop] === '')))) { + hasNullOrEmpty = true; + } + } + return hasNullOrEmpty; +} \ No newline at end of file diff --git a/src/utils/judgment.js b/src/utils/judgment.js new file mode 100644 index 0000000..46ab749 --- /dev/null +++ b/src/utils/judgment.js @@ -0,0 +1,5 @@ +export const judgment = (keyWord, key, value, val) => { + if (value !== null) { + keyWord[key] = value[val]; + } +}; \ No newline at end of file diff --git a/src/utils/toFullWidth.js b/src/utils/toFullWidth.js new file mode 100644 index 0000000..38d1c93 --- /dev/null +++ b/src/utils/toFullWidth.js @@ -0,0 +1,7 @@ +//将半角空格,制表符,回车和半角字符转为全角空格,全角制表符,全角回车和全角字符 +export const toFullWidth = (str) => { + //全角制表符使用4个全角空格模拟 + return str.replace(/ /g, '\u3000').replace(/\t/g, '\u3000\u3000\u3000\u3000').replace(/\n/g, '\u21B5').replace(/[\x21-\x7E]/g, (font) => { + return String.fromCharCode(font.charCodeAt(0) + 0xFEE0); + }); +}; \ No newline at end of file diff --git a/src/views/404page.vue b/src/views/404page.vue new file mode 100644 index 0000000..10a1ca1 --- /dev/null +++ b/src/views/404page.vue @@ -0,0 +1,21 @@ + + + + + diff --git a/src/views/Main.vue b/src/views/Main.vue new file mode 100644 index 0000000..79fa714 --- /dev/null +++ b/src/views/Main.vue @@ -0,0 +1,186 @@ + + + + + diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 0000000..1f9ce20 --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,13 @@ +/** @type {import('tailwindcss').Config} */ +export default { + purge: ['./index.html', './src/**/*.{vue,js,ts,jsx,tsx}'], + darkMode: false, // or 'media' or 'class' + content: [], + theme: { + extend: {}, + }, + variants: { + extend: {}, + }, + plugins: [], +} \ No newline at end of file diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 0000000..1a9bd80 --- /dev/null +++ b/vite.config.js @@ -0,0 +1,54 @@ +import { fileURLToPath, URL } from 'node:url' + +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' +import AutoImport from 'unplugin-auto-import/vite' +import Components from 'unplugin-vue-components/vite' +import { ElementPlusResolver } from 'unplugin-vue-components/resolvers' +import legacy from '@vitejs/plugin-legacy' + +// https://vitejs.dev/config/ +export default defineConfig({ + base: './', + publicPath: './', + plugins: [ + vue(), + AutoImport({ + resolvers: [ElementPlusResolver()], + }), + Components({ + resolvers: [ElementPlusResolver()], + }), + legacy({ + target: ['ie>=11'], + additionalLegacyPolyfills: ['regenerator-runtime/runtime'], + }), + ], + resolve: { + alias: { + '@': fileURLToPath(new URL('./src', import.meta.url)) + } + }, + server: { + //用来配置跨域 + host: '127.0.0.1', + port: 7003, + proxy: { + '/authentication': { + target: 'http://127.0.0.1:8011',//鉴权服务器地址 + changeOrigin: true, + rewrite: (path) => path.replace(/^\/authentication/, '') + }, + '/snShortMessage': { + target: 'http://127.0.0.1:8120',//资源服务器地址 + changeOrigin: true, + rewrite: (path) => path.replace(/^\/snShortMessage/, '') + }, + '/snWebSocket': { + target: 'http://127.0.0.1:8110',//webSocket服务器地址 + changeOrigin: true, + rewrite: (path) => path.replace(/^\/snWebSocket/, '') + } + } + } +})