diff --git a/package.json b/package.json index 1f44331d..46133187 100644 --- a/package.json +++ b/package.json @@ -9,11 +9,12 @@ }, "dependencies": { "@types/color": "^3.0.3", + "@types/crypto-js": "^4.1.1", "@types/keymaster": "^1.6.30", "animate.css": "^4.1.1", "axios": "0.23.0", "color": "^4.2.3", - "crypto-ts": "^1.0.2", + "crypto-js": "^4.1.1", "echarts-liquidfill": "^3.1.0", "highlight.js": "^11.5.0", "html2canvas": "^1.4.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1f16f11d..4d65f563 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2,6 +2,7 @@ lockfileVersion: 5.3 specifiers: '@types/color': ^3.0.3 + '@types/crypto-js': ^4.1.1 '@types/keymaster': ^1.6.30 '@types/node': ^16.11.26 '@typescript-eslint/eslint-plugin': ^5.18.0 @@ -15,7 +16,7 @@ specifiers: animate.css: ^4.1.1 axios: 0.23.0 color: ^4.2.3 - crypto-ts: ^1.0.2 + crypto-js: ^4.1.1 default-passive-events: ^2.0.0 echarts: ^5.3.2 echarts-liquidfill: ^3.1.0 @@ -53,11 +54,12 @@ specifiers: dependencies: '@types/color': 3.0.3 + '@types/crypto-js': 4.1.1 '@types/keymaster': 1.6.30 animate.css: 4.1.1 axios: 0.23.0 color: 4.2.3 - crypto-ts: 1.0.2 + crypto-js: 4.1.1 echarts-liquidfill: 3.1.0_echarts@5.3.2 highlight.js: 11.5.0 html2canvas: 1.4.1 @@ -624,6 +626,10 @@ packages: '@types/color-convert': 2.0.0 dev: false + /@types/crypto-js/4.1.1: + resolution: {integrity: sha512-BG7fQKZ689HIoc5h+6D2Dgq1fABRa0RbBWKBd9SP/MVRVXROflpm5fhwyATX5duFmbStzyzyycPB8qUYKDH3NA==} + dev: false + /@types/estree/0.0.39: resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} dev: true @@ -1491,13 +1497,8 @@ packages: which: 2.0.2 dev: true - /crypto-ts/1.0.2: - resolution: {integrity: sha512-TcBWwF8ghYhVd/qPSwvY4nsbDZRN/PVxQ1Uc8ryRLiX4M4C5XSPyIhVgR4M5mIhrQEnWIktLcrv+FIqhKk2t3g==} - peerDependencies: - '@angular/common': '>= 5.0.0' - '@angular/core': '>= 5.0.0' - dependencies: - tslib: 1.14.1 + /crypto-js/4.1.1: + resolution: {integrity: sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==} dev: false /css-line-break/2.1.0: @@ -4016,6 +4017,7 @@ packages: /tslib/1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + dev: true /tslib/2.3.0: resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==} diff --git a/src/enums/pageEnum.ts b/src/enums/pageEnum.ts index af5c92bf..d709043c 100644 --- a/src/enums/pageEnum.ts +++ b/src/enums/pageEnum.ts @@ -30,7 +30,7 @@ export enum PageEnum { // 我的项目 BASE_HOME_ITEMS = '/project/items', - BASE_HOME_ITEMS_NAME = 'Project-Ttems', + BASE_HOME_ITEMS_NAME = 'Project-Items', // 我的模板 BASE_HOME_TEMPLATE = '/project/my-template', diff --git a/src/layout/components/LayoutFooter/index.vue b/src/layout/components/LayoutFooter/index.vue index 081c0bc0..d6e9c485 100644 --- a/src/layout/components/LayoutFooter/index.vue +++ b/src/layout/components/LayoutFooter/index.vue @@ -1,12 +1,19 @@ diff --git a/src/router/router-guards.ts b/src/router/router-guards.ts index 9b550a8c..aedb0667 100644 --- a/src/router/router-guards.ts +++ b/src/router/router-guards.ts @@ -1,6 +1,6 @@ import { Router } from 'vue-router'; import { PageEnum } from '@/enums/pageEnum' - +import { loginCheck } from '@/utils' export function createRouterGuards(router: Router) { // 前置 @@ -11,6 +11,13 @@ export function createRouterGuards(router: Router) { if (isErrorPage === -1) { next({ name: PageEnum.ERROR_PAGE_NAME_404 }) } + + if (!loginCheck()) { + if (to.name === PageEnum.BASE_LOGIN_NAME) { + next() + } + next({ name: PageEnum.BASE_LOGIN_NAME }) + } next() }) diff --git a/src/utils/crypto.ts b/src/utils/crypto.ts index 96989aa2..f3530da9 100644 --- a/src/utils/crypto.ts +++ b/src/utils/crypto.ts @@ -1,29 +1,34 @@ -import * as CryptoJS from 'crypto-ts' -// 加密 -const AES_KEY = 'mt' +import CryptoJS from 'crypto-js' +import { isString } from './type' +const KEY = 'mt' + +/** + * * 加密 + * @param data { string } + * @returns + */ export const cryptoEncode = (data: string): string => { - if (typeof data !== 'string') return '' + if (!isString(data)) return '' // 加密 - const key = CryptoJS.enc.Utf8.parse(AES_KEY) - const str = JSON.stringify(data) - const encryptedData = CryptoJS.AES.encrypt(str, key, { + const encryptedData = CryptoJS.AES.encrypt(data, KEY, { mode: CryptoJS.mode.ECB, - padding: CryptoJS.pad.PKCS7, - iv: CryptoJS.enc.Utf8.parse(AES_KEY) - }) - return encryptedData.toString() + padding: CryptoJS.pad.Pkcs7 + }).toString() + return encryptedData } -// 解密 + +/** + * * 解密 + * @param data { string } + * @returns + */ export const cryptoDecode = (data: string): string => { - if (typeof data !== 'string') return '' - const encryptedHexStr = CryptoJS.enc.Utf8.parse(data) - const encryptedBase64Str = CryptoJS.enc.Utf8.stringify(encryptedHexStr) - const key = CryptoJS.enc.Utf8.parse(AES_KEY) - const decryptedData = CryptoJS.AES.decrypt(encryptedBase64Str, key, { + if (!isString(data)) return '' + // 解密 + const decryptedData = CryptoJS.AES.decrypt(data, KEY, { mode: CryptoJS.mode.ECB, - padding: CryptoJS.pad.PKCS7, - iv: CryptoJS.enc.Utf8.parse(AES_KEY) + padding: CryptoJS.pad.Pkcs7 }) return decryptedData.toString(CryptoJS.enc.Utf8) } diff --git a/src/utils/router.ts b/src/utils/router.ts index a790bf7a..f2bf6142 100644 --- a/src/utils/router.ts +++ b/src/utils/router.ts @@ -1,8 +1,11 @@ import { useRoute } from 'vue-router' import { ResultEnum } from '@/enums/httpEnum' import { ErrorPageNameMap, PageEnum } from '@/enums/pageEnum' -import router from '@/router' import { docPath, giteeSourceCodePath } from '@/settings/pathConst' +import { cryptoDecode } from './crypto' +import { StorageEnum } from '@/enums/storageEnum' +import { clearLocalStorage, getLocalStorage } from './storage' +import router from '@/router' /** * * 根据名字跳转路由 @@ -101,6 +104,7 @@ export const reloadRoutePage = () => { * * 退出 */ export const logout = () => { + clearLocalStorage(StorageEnum.GO_LOGIN_INFO_STORE) routerTurnByName(PageEnum.BASE_LOGIN_NAME) } @@ -128,6 +132,10 @@ export const openGiteeSourceCode = () => { openNewWindow(giteeSourceCodePath) } +/** + * * 判断是否是预览页 + * @returns boolean + */ export const isPreview = () => { return document.location.hash.includes('preview') } @@ -152,3 +160,21 @@ export const fetchRouteParams = () => { export const goHome = () => { routerTurnByName(PageEnum.BASE_HOME_NAME) } + +/** + * * 判断是否登录(现阶段是有 login 数据即可) + * @return boolean + */ +export const loginCheck = () => { + try { + const info = getLocalStorage(StorageEnum.GO_LOGIN_INFO_STORE) + if (!info) return false + const decodeInfo = cryptoDecode(info) + if (decodeInfo) { + return true + } + return false + } catch (error) { + return false + } +} \ No newline at end of file diff --git a/src/utils/storage.ts b/src/utils/storage.ts index 420d9e1f..60e7c7e8 100644 --- a/src/utils/storage.ts +++ b/src/utils/storage.ts @@ -18,7 +18,7 @@ * @param k 键名 * @returns any */ -export const getLocalStorage = (k: string) => { + export const getLocalStorage = (k: string) => { const item = window.localStorage.getItem(k) try { return item ? JSON.parse(item) : item @@ -27,6 +27,14 @@ export const getLocalStorage = (k: string) => { } } +/** + * * 清除本地会话数据 + * @param name + */ + export const clearLocalStorage = (name: string) => { + window.localStorage.removeItem(name) +} + /** * * 存储临时会话数据 * @param k 键名 @@ -52,4 +60,12 @@ export const getSessionStorage: (k: string) => any = (k: string) => { } catch (err) { return item } +} + +/** + * * 清除本地会话数据 + * @param name + */ +export const clearSessioStorage = (name: string) => { + window.sessionStorage.removeItem(name) } \ No newline at end of file diff --git a/src/views/login/index.vue b/src/views/login/index.vue index 3edaa7f2..e439aa42 100644 --- a/src/views/login/index.vue +++ b/src/views/login/index.vue @@ -116,11 +116,6 @@