{"version":3,"file":"index.81725393.js","sources":["../../src/App.vue","../../vite/preload-helper","../../src/router/routes/index.ts","../../src/router/index.ts","../../src/store/mutations.ts","../../src/store/modules/space/actions.ts","../../src/store/modules/space/getters.ts","../../src/api/material/materialModel.ts","../../src/store/modules/space/mutations.ts","../../src/store/modules/space/state.ts","../../src/store/modules/system/state.ts","../../src/api/config.ts","../../src/utils/is.ts","../../src/utils/http/axios/axiosCancel.ts","../../src/enums/httpEnum.ts","../../src/utils/http/axios/Axios.ts","../../src/utils/log.ts","../../src/utils/env.ts","../../build/getConfigFileName.ts","../../src/hooks/web/useMessage.tsx","../../src/settings/encryptionSetting.ts","../../src/utils/cipher.ts","../../src/utils/cache/storageCache.ts","../../src/utils/cache/index.ts","../../src/utils/cache/memory.ts","../../src/enums/cacheEnum.ts","../../src/utils/cache/persistent.ts","../../src/enums/appEnum.ts","../../src/settings/designSetting.ts","../../src/settings/projectSetting.ts","../../build/config/themeConfig.ts","../../src/utils/auth/index.ts","../../src/utils/index.ts","../../src/utils/http/axios/helper.ts","../../src/utils/http/axios/index.ts","../../src/hooks/setting/index.ts","../../src/api/user/index.ts","../../src/store/modules/user/actions.ts","../../src/store/modules/user/getters.ts","../../src/store/modules/user/mutations.ts","../../src/store/modules/user/state.ts","../../src/store/modules/index.ts","../../src/store/index.ts","../../src/router/guard/index.ts","../../src/plugins/pwa.ts","../../../../../@vite-plugin-pwa/virtual:pwa-register","../../mock/_util.ts","../../mock/sys/user.ts","../../mock/_createProductionServer.ts","../../src/main.ts","../../src/plugins/antd.ts","../../src/plugins/customComponents.ts","../../src/plugins/globalMethods.ts","../../src/utils/error-handler/index.ts"],"sourcesContent":["\n\n\n\n\n\n","let scriptRel;const seen = {};export const __vitePreload = function preload(baseModule, deps) {\n // @ts-ignore\n if (!__VITE_IS_MODERN__ || !deps) {\n return baseModule();\n }\n // @ts-ignore\n if (scriptRel === undefined) {\n // @ts-ignore\n const relList = document.createElement('link').relList;\n // @ts-ignore\n scriptRel =\n relList && relList.supports && relList.supports('modulepreload')\n ? 'modulepreload'\n : 'preload';\n }\n return Promise.all(deps.map((dep) => {\n // @ts-ignore\n if (dep in seen)\n return;\n // @ts-ignore\n seen[dep] = true;\n const isCss = dep.endsWith('.css');\n const cssSelector = isCss ? '[rel=\"stylesheet\"]' : '';\n // @ts-ignore check if the file is already preloaded by SSR markup\n if (document.querySelector(`link[href=\"${dep}\"]${cssSelector}`)) {\n return;\n }\n // @ts-ignore\n const link = document.createElement('link');\n // @ts-ignore\n link.rel = isCss ? 'stylesheet' : scriptRel;\n if (!isCss) {\n link.as = 'script';\n link.crossOrigin = '';\n }\n link.href = dep;\n // @ts-ignore\n document.head.appendChild(link);\n if (isCss) {\n return new Promise((res, rej) => {\n link.addEventListener('load', res);\n link.addEventListener('error', rej);\n });\n }\n })).then(() => baseModule());\n}","/*\r\n * @Author: Kuiper\r\n * @Date: 2021-06-24 19:33:34\r\n */\r\nimport type { AppRouteRecordRaw, AppRouteModule } from '/@/router/types'\r\n\r\nconst modules = import.meta.globEager('./modules/**/*.ts')\r\n\r\nconst routeModuleList: AppRouteModule[] = []\r\n\r\nObject.keys(modules).forEach((key) => {\r\n const mod = modules[key].default || {}\r\n const modList = Array.isArray(mod) ? [...mod] : [mod]\r\n routeModuleList.push(...modList)\r\n})\r\n\r\nexport const asyncRoutes = [...routeModuleList]\r\n\r\nexport const TestRoute: AppRouteRecordRaw = {\r\n path: '/test',\r\n name: 'KuiperTest',\r\n component: () => import('/@/views/KuiperTest.vue'),\r\n meta: {\r\n title: 'KuiperTest',\r\n },\r\n}\r\n\r\nexport const RootRoute: AppRouteRecordRaw = {\r\n path: '/layouts',\r\n name: 'layouts',\r\n component: () => import('/@/views/layouts/index.vue'),\r\n meta: {\r\n title: 'layouts',\r\n isMine: true,\r\n },\r\n children: [\r\n {\r\n path: '/',\r\n name: 'home',\r\n component: () => import('/@/views/Index/Personal.vue'),\r\n meta: {\r\n title: 'home',\r\n isMine: true,\r\n },\r\n },\r\n {\r\n path: '/introduce',\r\n name: 'introduce',\r\n component: () => import('/@/views/Index/introduce.vue'),\r\n meta: {\r\n title: 'introduce',\r\n requireAuth: false,\r\n isMine: true,\r\n },\r\n },\r\n {\r\n path: '/disk',\r\n name: 'disk',\r\n component: () => import('/@/views/material/PersonPage.vue'),\r\n meta: {\r\n title: 'disk',\r\n requireAuth: true,\r\n isMine: true,\r\n },\r\n },\r\n {\r\n path: '/pcshare',\r\n name: 'pcshare',\r\n component: () => import('/@/views/iframe/FrameBlank.vue'),\r\n meta: {\r\n title: 'pcshare',\r\n isMine: true,\r\n },\r\n },\r\n ],\r\n}\r\nexport const downLoadRoute: AppRouteRecordRaw = {\r\n path: '/download',\r\n name: 'Download',\r\n component: () => import('/@/views/downloadPage/downloadPage.vue'),\r\n meta: {\r\n title: 'Download',\r\n },\r\n}\r\n// Basic routing without permission\r\nexport const basicRoutes = [RootRoute, TestRoute, downLoadRoute]\r\n","/*\r\n * @Author: Kuiper\r\n * @Date: 2021-06-24 19:33:34\r\n */\r\nimport type { RouteRecordRaw } from 'vue-router'\r\nimport type { App } from 'vue'\r\n\r\nimport { createRouter, createWebHashHistory } from 'vue-router'\r\nimport { basicRoutes } from './routes'\r\n\r\n// app router\r\nexport const router = createRouter({\r\n history: createWebHashHistory(import.meta.env.VITE_PUBLIC_PATH),\r\n // history: createWebHistory(),\r\n routes: basicRoutes as unknown as RouteRecordRaw[],\r\n strict: true,\r\n scrollBehavior: () => ({ left: 0, top: 0 }),\r\n})\r\n\r\n// config router\r\nexport function setupRouter(app: App) {\r\n app.use(router)\r\n}\r\n","/*\r\n * @Author: Kuiper\r\n * @Date: 2021-08-06 16:48:26\r\n */\r\n/** 一个封装常规 mutation 操作的常规方法 */\r\nexport default {\r\n __set(state: any, msg: { key: string; val: any }) {\r\n state[msg.key] = msg.val\r\n },\r\n}\r\n","/*\r\n * @Author: ZhangYao\r\n * @Date: 2021-06-24 20:22:50\r\n */\r\nimport { Store } from 'vuex'\r\nimport { StateType } from '../../types'\r\nimport { updateSpaceItem } from '/@/api/material/materialModel'\r\n\r\nexport default {\r\n async setSpaceItem(store: Store, item: CShareDiskNS.ShareSpaceItem | null) {\r\n store.commit('setSpaceItem', item)\r\n },\r\n async setTmpToken(store: Store, item: CShareDiskNS.tmpToken | null) {\r\n store.commit('setTmpToken', item)\r\n },\r\n async updateSpaceSize(store: Store, item: updateSpaceItem | null) {\r\n store.commit('updateSpaceSize', item)\r\n },\r\n async setShowUploadList(store: Store, condition: boolean) {\r\n store.commit('setShowUploadList', condition)\r\n },\r\n async setNoUpload(store: Store, condition: boolean) {\r\n store.commit('setNoUpload', condition)\r\n },\r\n async setBatchDown(store: Store, condition: boolean) {\r\n store.commit('setBatchDown', condition)\r\n },\r\n async selectedRow(store: Store, item: CShareDiskNS.SelectItem) {\r\n store.commit('setSelectRow', item)\r\n },\r\n async onload(context: Store, item: any) {\r\n try {\r\n if (item != null && item.length > 0) {\r\n context.commit('setSpaceId', item[0].space_id)\r\n context.commit('setSpaceItem', item[0])\r\n }\r\n } catch (error) {\r\n console.log('=====onload err======', error)\r\n }\r\n },\r\n}\r\n","/*\r\n * @Author: Kuiper\r\n * @Date: 2021-06-24 20:22:50\r\n */\r\nexport default {\r\n // TODO\r\n}\r\n","/*\r\n * @Author: ZhangYao\r\n * @Date: 2021-06-26 10:36:11\r\n */\r\nexport interface AiotResponse {\r\n code: number\r\n data: T\r\n msg: string\r\n}\r\nexport interface AiotResponseApi {\r\n code: number\r\n getdata: T\r\n}\r\nexport interface TempToken {\r\n tmp_secret_id: string\r\n tmp_secret_key: string\r\n session_token: string\r\n expiration: number\r\n}\r\n\r\nfunction fixNumber(val: number, n: number) {\r\n const pow = Math.pow(10, n)\r\n return Math.ceil(val * pow) / pow\r\n}\r\nexport function fileLengthFormat(total: number, n: number): string {\r\n if (total == null || total == undefined) {\r\n // console.log('fileLengthFormat undefined ')\r\n return '-'\r\n }\r\n let format = '-'\r\n const len = total / 1024.0\r\n if (len > 1000) {\r\n return fileLengthFormat(len, ++n)\r\n } else {\r\n switch (n) {\r\n case 1:\r\n format = fixNumber(len, 1) + 'KB'\r\n break\r\n case 2:\r\n format = fixNumber(len, 1) + 'MB'\r\n break\r\n case 3:\r\n format = fixNumber(len, 1) + 'GB'\r\n break\r\n case 4:\r\n format = fixNumber(len, 1) + 'TB'\r\n break\r\n }\r\n // console.log('fileLengthFormat: ', format)\r\n return format\r\n }\r\n}\r\n\r\nexport interface updateSpaceItem {\r\n spaceId: string\r\n size: number\r\n}\r\n\r\n// export interface TempToken {\r\n// tmp_secret_id: string;\r\n// tmp_secret_key: string;\r\n// session_token: string;\r\n// expiration: number;\r\n// }\r\n\r\n// export interface ShareSpaceItem {\r\n// id: string;\r\n// label: string;\r\n// icon: string;\r\n// space_id: string;\r\n// space_name: string;\r\n// total?: string;\r\n// used?: string;\r\n// percent_volume?: number;\r\n// total_volume: number;\r\n// remain_volume: number;\r\n// bucket_info: string;\r\n// status: number;\r\n// create_time: string;\r\n// update_time: string;\r\n// prefix: string;\r\n// bucket: string;\r\n// region: string;\r\n// file_type: number;\r\n// }\r\n\r\n// export interface ShareFileItem {\r\n// file_key: string;\r\n// cos_file_key: string;\r\n// url?: string;\r\n// url_time?: number;\r\n// icon: string;\r\n// label: string;\r\n// creator: string;\r\n// file_size?: string;\r\n// fileSize?: number;\r\n// create_time: string;\r\n// update_time: string;\r\n// content_type: string;\r\n// file_type: number;\r\n// item_count?: number;\r\n// previewType?: string;\r\n// isSelect?: boolean;\r\n// is_delete?: boolean;\r\n// space_id: string;\r\n// }\r\n// export interface PreCreateItem {\r\n// file_key: string;\r\n// cos_file_key: string;\r\n// new_file_key?: string;\r\n// is_duplicate?: boolean;\r\n// }\r\n\r\n// export interface TaskItem {\r\n// /** 上传任务 ID */\r\n// taskId: string;\r\n// origin_file_key?: string;\r\n// file_key: string;\r\n// cos_file_key: string;\r\n// label: string;\r\n// icon?: string;\r\n// status_text?: string;\r\n// total_text?: string;\r\n// loaded_text?: string;\r\n// /** 上传状态 */\r\n// state:\r\n// | \"waiting\"\r\n// | \"checking\"\r\n// | \"uploading\"\r\n// | \"error\"\r\n// | \"paused\"\r\n// | \"success\"\r\n// | \"canceled\";\r\n// /** 上传错误信息 */\r\n// error?: string | Error | { Code: string; Message: string };\r\n// /** 已上传/下载的字节数,单位 B(字节) */\r\n// loaded?: number;\r\n// /** 要上传/下载的文件的大小,单位 B(字节) */\r\n// total?: number;\r\n// /** 速度,单位 B/s */\r\n// speed?: number;\r\n// /** 进度百分比,范围是 0-1,保留两位小数 */\r\n// uploadPercent?: number;\r\n// /** 续传校验进度,范围 0-1,保留两位小数 */\r\n// hashPercent?: number;\r\n// hasRestart?: boolean;\r\n// }\r\n\r\n// export type ShareItem = ShareFileItem | ShareSpaceItem;\r\n\r\n// export interface ShareUserItem {\r\n// id: string;\r\n// userName: string;\r\n// department: string;\r\n// mobile: string;\r\n// }\r\n\r\n// export interface ShareMemberItem {\r\n// mid: string;\r\n// uid: string;\r\n// name: string;\r\n// department: string;\r\n// role: number;\r\n// tel: string;\r\n// status: number;\r\n// group_id: string;\r\n// }\r\n","import { fileLengthFormat } from '/@/api/material/materialModel'\r\nexport default {\r\n updateSpaceSize(state, info: { spaceId: string; size: number }) {\r\n const { spaceId, size } = info\r\n console.log(info)\r\n if (spaceId && spaceId != '') {\r\n if (state.currentSpaceItem.space_id == spaceId) {\r\n const total_volume = state.currentSpaceItem.total_volume\r\n console.log(total_volume)\r\n state.currentSpaceItem.remain_volume -= size\r\n const used = total_volume - state.currentSpaceItem.remain_volume\r\n state.currentSpaceItem.used = fileLengthFormat(used, 1)\r\n state.currentSpaceItem.percent_volume = total_volume ? (used * 100) / total_volume : 0\r\n }\r\n }\r\n },\r\n setSpaceItem(state, item: CShareDiskNS.ShareSpaceItem | null) {\r\n if (!item) {\r\n state.currentSpaceItem = null\r\n return\r\n }\r\n state.currentSpaceItem = item\r\n },\r\n setTmpToken(state, item: CShareDiskNS.tmpToken | null) {\r\n if (!item) {\r\n state.tmpToken = null\r\n return\r\n }\r\n state.tmpToken = item\r\n },\r\n setShowUploadList(state, condition: boolean) {\r\n state.showUploadList = condition\r\n },\r\n setNoUpload(state, condition: boolean) {\r\n state.noUpload = condition\r\n },\r\n setBatchDown(state, condition: boolean) {\r\n state.batchDown = condition\r\n },\r\n setSelectRow(state, selectedItem: CShareDiskNS.SelectItem) {\r\n state.selectedRow = selectedItem\r\n },\r\n setSpaceId(state, space_id?: string) {\r\n if (space_id && space_id != '') {\r\n state.currentSpaceId = space_id\r\n return\r\n }\r\n },\r\n clear(state) {\r\n console.log('useAccountStore clear')\r\n state.currentSpaceId = null\r\n },\r\n}\r\n","/*\r\n * @Author: ZhangYao\r\n * @Date: 2021-06-28 20:22:50\r\n */\r\nimport { StateType } from '/@/store/types'\r\nimport { Module } from 'vuex'\r\nconst state = {\r\n currentSpaceItem: null as null | CShareDiskNS.ShareSpaceItem, //空间列表\r\n currentSpaceId: '', //当前空间ID\r\n tmpToken: null as null | CShareDiskNS.tmpToken, //秘钥\r\n showUploadList: false, //上传队列弹窗是否显示\r\n noUpload: false, //是否允许拖拽上传\r\n batchDown: false, //是否批量下载\r\n selectedRow: {\r\n //素材选中row\r\n type: 1, //1代表点击,2代码双击\r\n list: [],\r\n } as CShareDiskNS.SelectItem,\r\n}\r\ntype SpaceStateType = typeof state\r\n\r\nconst space: Module = {\r\n namespaced: true,\r\n ...state,\r\n}\r\n\r\nexport { SpaceStateType, state }\r\nexport default space\r\n","/*\r\n * @Author: yeild\r\n * @Date: 2021-08-23 21:25:50\r\n */\r\nimport { StateType } from '/@/store/types'\r\nimport { Module } from 'vuex'\r\n\r\nconst state = {\r\n backdoor: false, //仅用于本地测试的开关(发布上线时请改为false)\r\n}\r\ntype SystemStateType = typeof state\r\n\r\nconst system: Module = {\r\n namespaced: true,\r\n ...state,\r\n}\r\n\r\nexport { SystemStateType, state }\r\nexport default system\r\n","export function isDevelopment() {\r\n // 测试环境打包\r\n if (process.env.NODE_ENV === 'development') {\r\n return true\r\n } else {\r\n return false\r\n }\r\n // if (process.env.NODE_ENV === \"development\") {\r\n // return false\r\n // } else {\r\n // return true\r\n // }\r\n}\r\n","const toString = Object.prototype.toString\r\n\r\nexport function is(val: unknown, type: string) {\r\n return toString.call(val) === `[object ${type}]`\r\n}\r\n\r\nexport function isDef(val?: T): val is T {\r\n return typeof val !== 'undefined'\r\n}\r\n\r\nexport function isUnDef(val?: T): val is T {\r\n return !isDef(val)\r\n}\r\n\r\nexport function isObject(val: any): val is Record {\r\n return val !== null && is(val, 'Object')\r\n}\r\n\r\nexport function isEmpty(val: T): val is T {\r\n if (isArray(val) || isString(val)) {\r\n return val.length === 0\r\n }\r\n\r\n if (val instanceof Map || val instanceof Set) {\r\n return val.size === 0\r\n }\r\n\r\n if (isObject(val)) {\r\n return Object.keys(val).length === 0\r\n }\r\n\r\n return false\r\n}\r\n\r\nexport function isDate(val: unknown): val is Date {\r\n return is(val, 'Date')\r\n}\r\n\r\nexport function isNull(val: unknown): val is null {\r\n return val === null\r\n}\r\n\r\nexport function isNullAndUnDef(val: unknown): val is null | undefined {\r\n return isUnDef(val) && isNull(val)\r\n}\r\n\r\nexport function isNullOrUnDef(val: unknown): val is null | undefined {\r\n return isUnDef(val) || isNull(val)\r\n}\r\n\r\nexport function isNumber(val: unknown): val is number {\r\n return is(val, 'Number')\r\n}\r\n\r\nexport function isPromise(val: unknown): val is Promise {\r\n return is(val, 'Promise') && isObject(val) && isFunction(val.then) && isFunction(val.catch)\r\n}\r\n\r\nexport function isString(val: unknown): val is string {\r\n return is(val, 'String')\r\n}\r\n\r\nexport function isFunction(val: unknown): val is Function {\r\n return typeof val === 'function'\r\n}\r\n\r\nexport function isBoolean(val: unknown): val is boolean {\r\n return is(val, 'Boolean')\r\n}\r\n\r\nexport function isRegExp(val: unknown): val is RegExp {\r\n return is(val, 'RegExp')\r\n}\r\n\r\nexport function isArray(val: any): val is Array {\r\n return val && Array.isArray(val)\r\n}\r\n\r\nexport function isWindow(val: any): val is Window {\r\n return typeof window !== 'undefined' && is(val, 'Window')\r\n}\r\n\r\nexport function isElement(val: unknown): val is Element {\r\n return isObject(val) && !!val.tagName\r\n}\r\n\r\nexport const isServer = typeof window === 'undefined'\r\n\r\nexport const isClient = !isServer\r\n\r\nexport function isUrl(path: string): boolean {\r\n const reg =\r\n /(((^https?:(?:\\/\\/)?)(?:[-;:&=\\+\\$,\\w]+@)?[A-Za-z0-9.-]+(?::\\d+)?|(?:www.|[-;:&=\\+\\$,\\w]+@)[A-Za-z0-9.-]+)((?:\\/[\\+~%\\/.\\w-_]*)?\\??(?:[-\\+=&;%@.\\w_]*)#?(?:[\\w]*))?)$/\r\n return reg.test(path)\r\n}\r\n","import type { AxiosRequestConfig, Canceler } from 'axios'\r\nimport axios from 'axios'\r\nimport { isFunction } from '/@/utils/is'\r\n\r\n// Used to store the identification and cancellation function of each request\r\nlet pendingMap = new Map()\r\n\r\nexport const getPendingUrl = (config: AxiosRequestConfig) => [config.method, config.url].join('&')\r\n\r\nexport class AxiosCanceler {\r\n /**\r\n * Add request\r\n * @param {Object} config\r\n */\r\n addPending(config: AxiosRequestConfig) {\r\n this.removePending(config)\r\n const url = getPendingUrl(config)\r\n config.cancelToken =\r\n config.cancelToken ||\r\n new axios.CancelToken((cancel) => {\r\n if (!pendingMap.has(url)) {\r\n // If there is no current request in pending, add it\r\n pendingMap.set(url, cancel)\r\n }\r\n })\r\n }\r\n\r\n /**\r\n * @description: Clear all pending\r\n */\r\n removeAllPending() {\r\n pendingMap.forEach((cancel) => {\r\n cancel && isFunction(cancel) && cancel()\r\n })\r\n pendingMap.clear()\r\n }\r\n\r\n /**\r\n * Removal request\r\n * @param {Object} config\r\n */\r\n removePending(config: AxiosRequestConfig) {\r\n const url = getPendingUrl(config)\r\n\r\n if (pendingMap.has(url)) {\r\n // If there is a current request identifier in pending,\r\n // the current request needs to be cancelled and removed\r\n const cancel = pendingMap.get(url)\r\n cancel && cancel(url)\r\n pendingMap.delete(url)\r\n }\r\n }\r\n\r\n /**\r\n * @description: reset\r\n */\r\n reset(): void {\r\n pendingMap = new Map()\r\n }\r\n}\r\n","/**\r\n * @description: Request result set\r\n */\r\nexport enum ResultEnum {\r\n SUCCESS = 0,\r\n ERROR = 1,\r\n TIMEOUT = 401,\r\n TYPE = 'success',\r\n}\r\n\r\n/**\r\n * @description: request method\r\n */\r\nexport enum RequestEnum {\r\n GET = 'GET',\r\n POST = 'POST',\r\n PUT = 'PUT',\r\n DELETE = 'DELETE',\r\n}\r\n\r\n/**\r\n * @description: contentTyp\r\n */\r\nexport enum ContentTypeEnum {\r\n // json\r\n JSON = 'application/json;charset=UTF-8',\r\n // form-data qs\r\n FORM_URLENCODED = 'application/x-www-form-urlencoded;charset=UTF-8',\r\n // form-data upload\r\n FORM_DATA = 'multipart/form-data;charset=UTF-8',\r\n}\r\n","import type { AxiosRequestConfig, AxiosInstance, AxiosResponse } from 'axios'\r\nimport type { RequestOptions, Result, UploadFileParams } from '../../../../types/axios'\r\nimport type { CreateAxiosOptions } from './axiosTransform'\r\nimport axios from 'axios'\r\nimport qs from 'qs'\r\nimport { AxiosCanceler } from './axiosCancel'\r\nimport { isFunction } from '/@/utils/is'\r\nimport { cloneDeep } from 'lodash-es'\r\nimport { ContentTypeEnum } from '/@/enums/httpEnum'\r\nimport { RequestEnum } from '/@/enums/httpEnum'\r\n\r\nexport * from './axiosTransform'\r\n\r\n/**\r\n * @description: axios module\r\n */\r\nexport class VAxios {\r\n private axiosInstance: AxiosInstance\r\n private readonly options: CreateAxiosOptions\r\n\r\n constructor(options: CreateAxiosOptions) {\r\n this.options = options\r\n this.axiosInstance = axios.create(options)\r\n this.setupInterceptors()\r\n }\r\n\r\n /**\r\n * @description: Create axios instance\r\n */\r\n private createAxios(config: CreateAxiosOptions): void {\r\n this.axiosInstance = axios.create(config)\r\n }\r\n\r\n private getTransform() {\r\n const { transform } = this.options\r\n return transform\r\n }\r\n\r\n getAxios(): AxiosInstance {\r\n return this.axiosInstance\r\n }\r\n\r\n /**\r\n * @description: Reconfigure axios\r\n */\r\n configAxios(config: CreateAxiosOptions) {\r\n if (!this.axiosInstance) {\r\n return\r\n }\r\n this.createAxios(config)\r\n }\r\n\r\n /**\r\n * @description: Set general header\r\n */\r\n setHeader(headers: any): void {\r\n if (!this.axiosInstance) {\r\n return\r\n }\r\n Object.assign(this.axiosInstance.defaults.headers, headers)\r\n }\r\n\r\n /**\r\n * @description: Interceptor configuration\r\n */\r\n private setupInterceptors() {\r\n const transform = this.getTransform()\r\n if (!transform) {\r\n return\r\n }\r\n const {\r\n requestInterceptors,\r\n requestInterceptorsCatch,\r\n responseInterceptors,\r\n responseInterceptorsCatch,\r\n } = transform\r\n\r\n const axiosCanceler = new AxiosCanceler()\r\n\r\n // Request interceptor configuration processing\r\n this.axiosInstance.interceptors.request.use((config: AxiosRequestConfig) => {\r\n // If cancel repeat request is turned on, then cancel repeat request is prohibited\r\n const {\r\n headers: { ignoreCancelToken },\r\n } = config\r\n\r\n const ignoreCancel =\r\n ignoreCancelToken !== undefined\r\n ? ignoreCancelToken\r\n : this.options.requestOptions?.ignoreCancelToken\r\n\r\n !ignoreCancel && axiosCanceler.addPending(config)\r\n if (requestInterceptors && isFunction(requestInterceptors)) {\r\n config = requestInterceptors(config, this.options)\r\n }\r\n return config\r\n }, undefined)\r\n\r\n // Request interceptor error capture\r\n requestInterceptorsCatch &&\r\n isFunction(requestInterceptorsCatch) &&\r\n this.axiosInstance.interceptors.request.use(undefined, requestInterceptorsCatch)\r\n\r\n // Response result interceptor processing\r\n this.axiosInstance.interceptors.response.use((res: AxiosResponse) => {\r\n res && axiosCanceler.removePending(res.config)\r\n if (responseInterceptors && isFunction(responseInterceptors)) {\r\n res = responseInterceptors(res)\r\n }\r\n return res\r\n }, undefined)\r\n\r\n // Response result interceptor error capture\r\n responseInterceptorsCatch &&\r\n isFunction(responseInterceptorsCatch) &&\r\n this.axiosInstance.interceptors.response.use(undefined, responseInterceptorsCatch)\r\n }\r\n\r\n /**\r\n * @description: File Upload\r\n */\r\n uploadFile(config: AxiosRequestConfig, params: UploadFileParams) {\r\n const formData = new window.FormData()\r\n\r\n if (params.data) {\r\n Object.keys(params.data).forEach((key) => {\r\n if (!params.data) return\r\n const value = params.data[key]\r\n if (Array.isArray(value)) {\r\n value.forEach((item) => {\r\n formData.append(`${key}[]`, item)\r\n })\r\n return\r\n }\r\n\r\n formData.append(key, params.data[key])\r\n })\r\n }\r\n\r\n formData.append(params.name || 'file', params.file, params.filename)\r\n\r\n return this.axiosInstance.request({\r\n ...config,\r\n method: 'POST',\r\n data: formData,\r\n headers: {\r\n 'Content-type': ContentTypeEnum.FORM_DATA,\r\n ignoreCancelToken: true,\r\n },\r\n })\r\n }\r\n\r\n // support form-data\r\n supportFormData(config: AxiosRequestConfig) {\r\n const headers = config.headers || this.options.headers\r\n const contentType = headers?.['Content-Type'] || headers?.['content-type']\r\n if (\r\n contentType !== ContentTypeEnum.FORM_URLENCODED ||\r\n !Reflect.has(config, 'data') ||\r\n config.method?.toUpperCase() === RequestEnum.GET\r\n ) {\r\n return config\r\n }\r\n return {\r\n ...config,\r\n data: qs.stringify(config.data, { arrayFormat: 'brackets' }),\r\n }\r\n }\r\n\r\n get(config: AxiosRequestConfig, options?: RequestOptions): Promise {\r\n return this.request({ ...config, method: 'GET' }, options)\r\n }\r\n\r\n post(config: AxiosRequestConfig, options?: RequestOptions): Promise {\r\n return this.request({ ...config, method: 'POST' }, options)\r\n }\r\n\r\n put(config: AxiosRequestConfig, options?: RequestOptions): Promise {\r\n return this.request({ ...config, method: 'PUT' }, options)\r\n }\r\n\r\n delete(config: AxiosRequestConfig, options?: RequestOptions): Promise {\r\n return this.request({ ...config, method: 'DELETE' }, options)\r\n }\r\n\r\n request(config: AxiosRequestConfig, options?: RequestOptions): Promise {\r\n let conf: CreateAxiosOptions = cloneDeep(config)\r\n const transform = this.getTransform()\r\n\r\n const { requestOptions } = this.options\r\n\r\n const opt: RequestOptions = Object.assign({}, requestOptions, options)\r\n\r\n const { beforeRequestHook, requestCatchHook, transformRequestHook } = transform || {}\r\n if (beforeRequestHook && isFunction(beforeRequestHook)) {\r\n conf = beforeRequestHook(conf, opt)\r\n }\r\n conf.requestOptions = opt\r\n\r\n conf = this.supportFormData(conf)\r\n\r\n return new Promise((resolve, reject) => {\r\n this.axiosInstance\r\n .request>(conf)\r\n .then((res: AxiosResponse) => {\r\n if (transformRequestHook && isFunction(transformRequestHook)) {\r\n try {\r\n const ret = transformRequestHook(res, opt)\r\n resolve(ret)\r\n } catch (err) {\r\n reject(err || new Error('request error!'))\r\n }\r\n return\r\n }\r\n resolve(res as unknown as Promise)\r\n })\r\n .catch((e: Error) => {\r\n if (requestCatchHook && isFunction(requestCatchHook)) {\r\n reject(requestCatchHook(e, opt))\r\n return\r\n }\r\n reject(e)\r\n })\r\n })\r\n }\r\n}\r\n","const projectName = import.meta.env.VITE_GLOB_APP_TITLE\r\n\r\nexport function warn(message: string) {\r\n console.warn(`[${projectName} warn]:${message}`)\r\n}\r\n\r\nexport function error(message: string) {\r\n throw new Error(`[${projectName} error]:${message}`)\r\n}\r\n","/*\r\n * @Author: Kuiper\r\n * @Date: 2021-06-25 11:21:44\r\n */\r\nimport type { GlobEnvConfig } from '/#/config'\r\n\r\nimport { warn } from '/@/utils/log'\r\nimport pkg from '../../package.json'\r\nimport { getConfigFileName } from '../../build/getConfigFileName'\r\n\r\nexport function getCommonStoragePrefix() {\r\n const { VITE_GLOB_APP_SHORT_NAME } = getAppEnvConfig()\r\n return `${VITE_GLOB_APP_SHORT_NAME}__${getEnv()}`.toUpperCase()\r\n}\r\n\r\n// Generate cache key according to version\r\nexport function getStorageShortName() {\r\n return `${getCommonStoragePrefix()}${`__${pkg.version}`}__`.toUpperCase()\r\n}\r\n\r\nexport function getAppEnvConfig() {\r\n const ENV_NAME = getConfigFileName(import.meta.env)\r\n\r\n const ENV = (import.meta.env.DEV\r\n ? // Get the global configuration (the configuration will be extracted independently when packaging)\r\n (import.meta.env as unknown as GlobEnvConfig)\r\n : window[ENV_NAME as any]) as unknown as GlobEnvConfig\r\n\r\n const {\r\n VITE_GLOB_APP_TITLE,\r\n VITE_GLOB_API_URL,\r\n VITE_GLOB_APP_SHORT_NAME,\r\n VITE_GLOB_API_URL_PREFIX,\r\n VITE_GLOB_UPLOAD_URL,\r\n } = ENV\r\n\r\n if (!/^[a-zA-Z\\_]*$/.test(VITE_GLOB_APP_SHORT_NAME)) {\r\n warn(\r\n `VITE_GLOB_APP_SHORT_NAME Variables can only be characters/underscores, please modify in the environment variables and re-running.`\r\n )\r\n }\r\n\r\n return {\r\n VITE_GLOB_APP_TITLE,\r\n VITE_GLOB_API_URL,\r\n VITE_GLOB_APP_SHORT_NAME,\r\n VITE_GLOB_API_URL_PREFIX,\r\n VITE_GLOB_UPLOAD_URL,\r\n }\r\n}\r\n\r\n/**\r\n * @description: Development model\r\n */\r\nexport const devMode = 'development'\r\n\r\n/**\r\n * @description: Production mode\r\n */\r\nexport const prodMode = 'production'\r\n\r\n/**\r\n * @description: Get environment variables\r\n * @returns:\r\n * @example:\r\n */\r\nexport function getEnv(): string {\r\n return import.meta.env.MODE\r\n}\r\n\r\n/**\r\n * @description: Is it a development mode\r\n * @returns:\r\n * @example:\r\n */\r\nexport function isDevMode(): boolean {\r\n return import.meta.env.DEV\r\n}\r\n\r\n/**\r\n * @description: Is it a production mode\r\n * @returns:\r\n * @example:\r\n */\r\nexport function isProdMode(): boolean {\r\n return import.meta.env.PROD\r\n}\r\n","/**\r\n * Get the configuration file variable name\r\n * @param env\r\n */\r\nexport const getConfigFileName = (env: Record) => {\r\n return `__PRODUCTION__${env.VITE_GLOB_APP_SHORT_NAME || '__APP'}__CONF__`\r\n .toUpperCase()\r\n .replace(/\\s/g, '')\r\n}\r\n","import type { ModalFunc, ModalFuncProps } from 'ant-design-vue/lib/modal/Modal'\r\n\r\nimport { Modal, message as Message, notification } from 'ant-design-vue'\r\nimport { InfoCircleFilled, CheckCircleFilled, CloseCircleFilled } from '@ant-design/icons-vue'\r\n\r\nimport { ArgsProps, ConfigProps } from 'ant-design-vue/lib/notification'\r\nimport { isString } from '/@/utils/is'\r\n\r\nexport interface NotifyApi {\r\n info(config: ArgsProps): void\r\n success(config: ArgsProps): void\r\n error(config: ArgsProps): void\r\n warn(config: ArgsProps): void\r\n warning(config: ArgsProps): void\r\n open(args: ArgsProps): void\r\n close(key: String): void\r\n config(options: ConfigProps): void\r\n destroy(): void\r\n}\r\n\r\nexport declare type NotificationPlacement = 'topLeft' | 'topRight' | 'bottomLeft' | 'bottomRight'\r\nexport declare type IconType = 'success' | 'info' | 'error' | 'warning'\r\nexport interface ModalOptionsEx extends Omit {\r\n iconType: 'warning' | 'success' | 'error' | 'info'\r\n}\r\nexport type ModalOptionsPartial = Partial & Pick\r\n\r\ninterface ConfirmOptions {\r\n info: ModalFunc\r\n success: ModalFunc\r\n error: ModalFunc\r\n warn: ModalFunc\r\n warning: ModalFunc\r\n}\r\n\r\nfunction getIcon(iconType: string) {\r\n if (iconType === 'warning') {\r\n return \r\n } else if (iconType === 'success') {\r\n return \r\n } else if (iconType === 'info') {\r\n return \r\n } else {\r\n return \r\n }\r\n}\r\n\r\nfunction renderContent({ content }: Pick) {\r\n if (isString(content)) {\r\n return
${content as string}
`}>\r\n } else {\r\n return content\r\n }\r\n}\r\n\r\n/**\r\n * @description: Create confirmation box\r\n */\r\nfunction createConfirm(options: ModalOptionsEx): ConfirmOptions {\r\n const iconType = options.iconType || 'warning'\r\n Reflect.deleteProperty(options, 'iconType')\r\n const opt: ModalFuncProps = {\r\n centered: true,\r\n icon: getIcon(iconType),\r\n ...options,\r\n content: renderContent(options),\r\n }\r\n return Modal.confirm(opt) as unknown as ConfirmOptions\r\n}\r\n\r\nconst getBaseOptions = () => {\r\n return {\r\n okText: 'common.okText',\r\n centered: true,\r\n }\r\n}\r\n\r\nfunction createModalOptions(options: ModalOptionsPartial, icon: string): ModalOptionsPartial {\r\n return {\r\n ...getBaseOptions(),\r\n ...options,\r\n content: renderContent(options),\r\n icon: getIcon(icon),\r\n }\r\n}\r\n\r\nfunction createSuccessModal(options: ModalOptionsPartial) {\r\n return Modal.success(createModalOptions(options, 'success'))\r\n}\r\n\r\nfunction createErrorModal(options: ModalOptionsPartial) {\r\n return Modal.error(createModalOptions(options, 'close'))\r\n}\r\n\r\nfunction createInfoModal(options: ModalOptionsPartial) {\r\n return Modal.info(createModalOptions(options, 'info'))\r\n}\r\n\r\nfunction createWarningModal(options: ModalOptionsPartial) {\r\n return Modal.warning(createModalOptions(options, 'warning'))\r\n}\r\n\r\nnotification.config({\r\n placement: 'topRight',\r\n duration: 3,\r\n})\r\n\r\n/**\r\n * @description: message\r\n */\r\nexport function useMessage() {\r\n return {\r\n createMessage: Message,\r\n notification: notification as NotifyApi,\r\n createConfirm: createConfirm,\r\n createSuccessModal,\r\n createErrorModal,\r\n createInfoModal,\r\n createWarningModal,\r\n }\r\n}\r\n","import { isDevMode } from '/@/utils/env'\r\n\r\n// System default cache time, in seconds\r\nexport const DEFAULT_CACHE_TIME = 60 * 60 * 24 * 7\r\n\r\n// aes encryption key\r\nexport const cacheCipher = {\r\n key: '_11111000001111@',\r\n iv: '@11111000001111_',\r\n}\r\n\r\n// Whether the system cache is encrypted using aes\r\nexport const enableStorageEncryption = !isDevMode()\r\n","import { encrypt, decrypt } from 'crypto-js/aes'\r\nimport { parse } from 'crypto-js/enc-utf8'\r\nimport pkcs7 from 'crypto-js/pad-pkcs7'\r\nimport ECB from 'crypto-js/mode-ecb'\r\nimport md5 from 'crypto-js/md5'\r\nimport UTF8 from 'crypto-js/enc-utf8'\r\nimport Base64 from 'crypto-js/enc-base64'\r\n\r\nexport interface EncryptionParams {\r\n key: string\r\n iv: string\r\n}\r\n\r\nexport class AesEncryption {\r\n private key\r\n private iv\r\n\r\n constructor(opt: Partial = {}) {\r\n const { key, iv } = opt\r\n if (key) {\r\n this.key = parse(key)\r\n }\r\n if (iv) {\r\n this.iv = parse(iv)\r\n }\r\n }\r\n\r\n get getOptions() {\r\n return {\r\n mode: ECB,\r\n padding: pkcs7,\r\n iv: this.iv,\r\n }\r\n }\r\n\r\n encryptByAES(cipherText: string) {\r\n return encrypt(cipherText, this.key, this.getOptions).toString()\r\n }\r\n\r\n decryptByAES(cipherText: string) {\r\n return decrypt(cipherText, this.key, this.getOptions).toString(UTF8)\r\n }\r\n}\r\n\r\nexport function encryptByBase64(cipherText: string) {\r\n return UTF8.parse(cipherText).toString(Base64)\r\n}\r\n\r\nexport function decodeByBase64(cipherText: string) {\r\n return Base64.parse(cipherText).toString(UTF8)\r\n}\r\n\r\nexport function encryptByMd5(password: string) {\r\n return md5(password).toString()\r\n}\r\n","import { cacheCipher } from '/@/settings/encryptionSetting'\r\n\r\nimport type { EncryptionParams } from '/@/utils/cipher'\r\n\r\nimport { AesEncryption } from '/@/utils/cipher'\r\n\r\nimport { isNullOrUnDef } from '/@/utils/is'\r\n\r\nexport interface CreateStorageParams extends EncryptionParams {\r\n prefixKey: string\r\n storage: Storage\r\n hasEncrypt: boolean\r\n timeout?: Nullable\r\n}\r\nexport const createStorage = ({\r\n prefixKey = '',\r\n storage = sessionStorage,\r\n key = cacheCipher.key,\r\n iv = cacheCipher.iv,\r\n timeout = null,\r\n hasEncrypt = true,\r\n}: Partial = {}) => {\r\n if (hasEncrypt && [key.length, iv.length].some((item) => item !== 16)) {\r\n throw new Error('When hasEncrypt is true, the key or iv must be 16 bits!')\r\n }\r\n\r\n const encryption = new AesEncryption({ key, iv })\r\n\r\n /**\r\n *Cache class\r\n *Construction parameters can be passed into sessionStorage, localStorage,\r\n * @class Cache\r\n * @example\r\n */\r\n const WebStorage = class WebStorage {\r\n private storage: Storage\r\n private prefixKey?: string\r\n private encryption: AesEncryption\r\n private hasEncrypt: boolean\r\n /**\r\n *\r\n * @param {*} storage\r\n */\r\n constructor() {\r\n this.storage = storage\r\n this.prefixKey = prefixKey\r\n this.encryption = encryption\r\n this.hasEncrypt = hasEncrypt\r\n }\r\n\r\n private getKey(key: string) {\r\n return `${this.prefixKey}${key}`.toUpperCase()\r\n }\r\n\r\n /**\r\n *\r\n * Set cache\r\n * @param {string} key\r\n * @param {*} value\r\n * @expire Expiration time in seconds\r\n * @memberof Cache\r\n */\r\n set(key: string, value: any, expire: number | null = timeout) {\r\n const stringData = JSON.stringify({\r\n value,\r\n time: Date.now(),\r\n expire: !isNullOrUnDef(expire) ? new Date().getTime() + expire * 1000 : null,\r\n })\r\n const stringifyValue = this.hasEncrypt ? this.encryption.encryptByAES(stringData) : stringData\r\n this.storage.setItem(this.getKey(key), stringifyValue)\r\n }\r\n\r\n /**\r\n *Read cache\r\n * @param {string} key\r\n * @memberof Cache\r\n */\r\n get(key: string, def: any = null): any {\r\n const val = this.storage.getItem(this.getKey(key))\r\n if (!val) return def\r\n\r\n try {\r\n const decVal = this.hasEncrypt ? this.encryption.decryptByAES(val) : val\r\n const data = JSON.parse(decVal)\r\n const { value, expire } = data\r\n if (isNullOrUnDef(expire) || expire >= new Date().getTime()) {\r\n return value\r\n }\r\n this.remove(key)\r\n } catch (e) {\r\n return def\r\n }\r\n }\r\n\r\n /**\r\n * Delete cache based on key\r\n * @param {string} key\r\n * @memberof Cache\r\n */\r\n remove(key: string) {\r\n this.storage.removeItem(this.getKey(key))\r\n }\r\n\r\n /**\r\n * Delete all caches of this instance\r\n */\r\n clear(): void {\r\n this.storage.clear()\r\n }\r\n }\r\n return new WebStorage()\r\n}\r\n","import { getStorageShortName } from '/@/utils/env'\r\nimport { createStorage as create, CreateStorageParams } from './storageCache'\r\nimport { enableStorageEncryption } from '/@/settings/encryptionSetting'\r\nimport { DEFAULT_CACHE_TIME } from '/@/settings/encryptionSetting'\r\n\r\nexport type Options = Partial\r\n\r\nconst createOptions = (storage: Storage, options: Options = {}): Options => {\r\n return {\r\n // No encryption in debug mode\r\n hasEncrypt: enableStorageEncryption,\r\n storage,\r\n prefixKey: getStorageShortName(),\r\n ...options,\r\n }\r\n}\r\n\r\nexport const WebStorage = create(createOptions(sessionStorage))\r\n\r\nexport const createStorage = (storage: Storage = sessionStorage, options: Options = {}) => {\r\n return create(createOptions(storage, options))\r\n}\r\n\r\nexport const createSessionStorage = (options: Options = {}) => {\r\n return createStorage(sessionStorage, { ...options, timeout: DEFAULT_CACHE_TIME })\r\n}\r\n\r\nexport const createLocalStorage = (options: Options = {}) => {\r\n return createStorage(localStorage, { ...options, timeout: DEFAULT_CACHE_TIME })\r\n}\r\n\r\nexport default WebStorage\r\n","export interface Cache {\r\n value?: V\r\n timeoutId?: ReturnType\r\n time?: number\r\n alive?: number\r\n}\r\n\r\nconst NOT_ALIVE = 0\r\n\r\nexport class Memory {\r\n private cache: { [key in keyof T]?: Cache } = {}\r\n private alive: number\r\n\r\n constructor(alive = NOT_ALIVE) {\r\n // Unit second\r\n this.alive = alive * 1000\r\n }\r\n\r\n get getCache() {\r\n return this.cache\r\n }\r\n\r\n setCache(cache) {\r\n this.cache = cache\r\n }\r\n\r\n // get(key: K) {\r\n // const item = this.getItem(key);\r\n // const time = item?.time;\r\n // if (!isNullOrUnDef(time) && time < new Date().getTime()) {\r\n // this.remove(key);\r\n // }\r\n // return item?.value ?? undefined;\r\n // }\r\n\r\n get(key: K) {\r\n return this.cache[key]\r\n }\r\n\r\n set(key: K, value: V, expires?: number) {\r\n let item = this.get(key)\r\n\r\n if (!expires || (expires as number) <= 0) {\r\n expires = this.alive\r\n }\r\n if (item) {\r\n if (item.timeoutId) {\r\n clearTimeout(item.timeoutId)\r\n item.timeoutId = undefined\r\n }\r\n item.value = value\r\n } else {\r\n item = { value, alive: expires }\r\n this.cache[key] = item\r\n }\r\n\r\n if (!expires) {\r\n return value\r\n }\r\n const now = new Date().getTime()\r\n item.time = now + this.alive\r\n item.timeoutId = setTimeout(\r\n () => {\r\n this.remove(key)\r\n },\r\n expires > now ? expires - now : expires\r\n )\r\n\r\n return value\r\n }\r\n\r\n remove(key: K) {\r\n const item = this.get(key)\r\n Reflect.deleteProperty(this.cache, key)\r\n if (item) {\r\n clearTimeout(item.timeoutId!)\r\n return item.value\r\n }\r\n }\r\n\r\n resetCache(cache: { [K in keyof T]: Cache }) {\r\n Object.keys(cache).forEach((key) => {\r\n const k = key as any as keyof T\r\n const item = cache[k]\r\n if (item && item.time) {\r\n const now = new Date().getTime()\r\n const expire = item.time\r\n if (expire > now) {\r\n this.set(k, item.value, expire)\r\n }\r\n }\r\n })\r\n }\r\n\r\n clear() {\r\n Object.keys(this.cache).forEach((key) => {\r\n const item = this.cache[key]\r\n item.timeoutId && clearTimeout(item.timeoutId)\r\n })\r\n this.cache = {}\r\n }\r\n}\r\n","// token key\r\nexport const TOKEN_KEY = 'TOKEN__'\r\n\r\nexport const LOCALE_KEY = 'LOCALE__'\r\n\r\n// user info key\r\nexport const USER_INFO_KEY = 'USER__INFO__'\r\n\r\n// role info key\r\nexport const ROLES_KEY = 'ROLES__KEY__'\r\n\r\n// project config key\r\nexport const PROJ_CFG_KEY = 'PROJ__CFG__KEY__'\r\n\r\n// lock info\r\nexport const LOCK_INFO_KEY = 'LOCK__INFO__KEY__'\r\n\r\nexport const MULTIPLE_TABS_KEY = 'MULTIPLE_TABS__KEY__'\r\n\r\nexport const APP_DARK_MODE_KEY_ = '__APP__DARK__MODE__'\r\n\r\n// base global local key\r\nexport const APP_LOCAL_CACHE_KEY = 'COMMON__LOCAL__KEY__'\r\n\r\n// base global session key\r\nexport const APP_SESSION_CACHE_KEY = 'COMMON__SESSION__KEY__'\r\n\r\nexport enum CacheTypeEnum {\r\n SESSION,\r\n LOCAL,\r\n}\r\n","import type { LockInfo, UserInfo } from '/#/store'\r\nimport type { ProjectConfig } from '/#/config'\r\nimport type { RouteLocationNormalized } from 'vue-router'\r\n\r\nimport { createLocalStorage, createSessionStorage } from '/@/utils/cache'\r\nimport { Memory } from './memory'\r\nimport {\r\n TOKEN_KEY,\r\n USER_INFO_KEY,\r\n ROLES_KEY,\r\n LOCK_INFO_KEY,\r\n PROJ_CFG_KEY,\r\n APP_LOCAL_CACHE_KEY,\r\n APP_SESSION_CACHE_KEY,\r\n MULTIPLE_TABS_KEY,\r\n} from '/@/enums/cacheEnum'\r\nimport { DEFAULT_CACHE_TIME } from '/@/settings/encryptionSetting'\r\nimport { toRaw } from 'vue'\r\n\r\ninterface BasicStore {\r\n [TOKEN_KEY]: string | number | null | undefined\r\n [USER_INFO_KEY]: UserInfo\r\n [ROLES_KEY]: string[]\r\n [LOCK_INFO_KEY]: LockInfo\r\n [PROJ_CFG_KEY]: ProjectConfig\r\n [MULTIPLE_TABS_KEY]: RouteLocationNormalized[]\r\n}\r\n\r\ntype LocalStore = BasicStore\r\n\r\ntype SessionStore = BasicStore\r\n\r\nexport type BasicKeys = keyof BasicStore\r\ntype LocalKeys = keyof LocalStore\r\ntype SessionKeys = keyof SessionStore\r\n\r\nconst ls = createLocalStorage()\r\nconst ss = createSessionStorage()\r\n\r\nconst localMemory = new Memory(DEFAULT_CACHE_TIME)\r\nconst sessionMemory = new Memory(DEFAULT_CACHE_TIME)\r\n\r\nfunction initPersistentMemory() {\r\n const localCache = ls.get(APP_LOCAL_CACHE_KEY)\r\n const sessionCache = ss.get(APP_SESSION_CACHE_KEY)\r\n localCache && localMemory.resetCache(localCache)\r\n sessionCache && sessionMemory.resetCache(sessionCache)\r\n}\r\n\r\nexport class Persistent {\r\n static getLocal(key: LocalKeys) {\r\n return localMemory.get(key)?.value as Nullable\r\n }\r\n\r\n static setLocal(key: LocalKeys, value: LocalStore[LocalKeys], immediate = false): void {\r\n localMemory.set(key, toRaw(value))\r\n immediate && ls.set(APP_LOCAL_CACHE_KEY, localMemory.getCache)\r\n }\r\n\r\n static removeLocal(key: LocalKeys): void {\r\n localMemory.remove(key)\r\n }\r\n\r\n static clearLocal(): void {\r\n localMemory.clear()\r\n }\r\n\r\n static getSession(key: SessionKeys) {\r\n return sessionMemory.get(key)?.value as Nullable\r\n }\r\n\r\n static setSession(key: SessionKeys, value: SessionStore[SessionKeys], immediate = false): void {\r\n sessionMemory.set(key, toRaw(value))\r\n immediate && ss.set(APP_SESSION_CACHE_KEY, sessionMemory.getCache)\r\n }\r\n\r\n static removeSession(key: SessionKeys): void {\r\n sessionMemory.remove(key)\r\n }\r\n static clearSession(): void {\r\n sessionMemory.clear()\r\n }\r\n\r\n static clearAll() {\r\n sessionMemory.clear()\r\n localMemory.clear()\r\n }\r\n}\r\n\r\nwindow.addEventListener('beforeunload', function () {\r\n ls.set(APP_LOCAL_CACHE_KEY, localMemory.getCache)\r\n ss.set(APP_SESSION_CACHE_KEY, sessionMemory.getCache)\r\n})\r\n\r\nfunction storageChange(e: any) {\r\n const { key, newValue, oldValue } = e\r\n\r\n if (!key) {\r\n Persistent.clearAll()\r\n return\r\n }\r\n\r\n if (!!newValue && !!oldValue) {\r\n if (APP_LOCAL_CACHE_KEY === key) {\r\n Persistent.clearLocal()\r\n }\r\n if (APP_SESSION_CACHE_KEY === key) {\r\n Persistent.clearSession()\r\n }\r\n }\r\n}\r\n\r\nwindow.addEventListener('storage', storageChange)\r\n\r\ninitPersistentMemory()\r\n","/*\r\n * @Author: Kuiper\r\n * @Date: 2021-08-10 17:55:24\r\n */\r\nexport const SIDE_BAR_MINI_WIDTH = 48\r\nexport const SIDE_BAR_SHOW_TIT_MINI_WIDTH = 80\r\n\r\nexport enum ContentEnum {\r\n // auto width\r\n FULL = 'full',\r\n // fixed width\r\n FIXED = 'fixed',\r\n}\r\n\r\n// menu theme enum\r\nexport enum ThemeEnum {\r\n DARK = 'dark',\r\n LIGHT = 'light',\r\n}\r\n\r\nexport enum SettingButtonPositionEnum {\r\n AUTO = 'auto',\r\n HEADER = 'header',\r\n FIXED = 'fixed',\r\n}\r\n\r\nexport enum SessionTimeoutProcessingEnum {\r\n ROUTE_JUMP,\r\n PAGE_COVERAGE,\r\n}\r\n\r\n/**\r\n * 权限模式\r\n */\r\nexport enum PermissionModeEnum {\r\n // role\r\n ROLE = 'ROLE',\r\n // black\r\n BACK = 'BACK',\r\n}\r\n\r\n// Route switching animation\r\nexport enum RouterTransitionEnum {\r\n ZOOM_FADE = 'zoom-fade',\r\n ZOOM_OUT = 'zoom-out',\r\n FADE_SIDE = 'fade-slide',\r\n FADE = 'fade',\r\n FADE_BOTTOM = 'fade-bottom',\r\n FADE_SCALE = 'fade-scale',\r\n}\r\n","/*\r\n * @Author: Kuiper\r\n * @Date: 2021-06-25 11:24:18\r\n */\r\nimport { ThemeEnum } from '../enums/appEnum'\r\n\r\nexport const prefixCls = 'cc'\r\n\r\nexport const darkMode = ThemeEnum.LIGHT\r\n\r\n// app theme preset color\r\nexport const APP_PRESET_COLOR_LIST: string[] = [\r\n '#0960bd',\r\n '#0084f4',\r\n '#009688',\r\n '#536dfe',\r\n '#ff5c93',\r\n '#ee4f12',\r\n '#0096c7',\r\n '#9c27b0',\r\n '#ff9800',\r\n]\r\n\r\n// header preset color\r\nexport const HEADER_PRESET_BG_COLOR_LIST: string[] = [\r\n '#ffffff',\r\n '#151515',\r\n '#009688',\r\n '#5172DC',\r\n '#018ffb',\r\n '#409eff',\r\n '#e74c3c',\r\n '#24292e',\r\n '#394664',\r\n '#001529',\r\n '#383f45',\r\n]\r\n\r\n// sider preset color\r\nexport const SIDE_BAR_BG_COLOR_LIST: string[] = [\r\n '#001529',\r\n '#212121',\r\n '#273352',\r\n '#ffffff',\r\n '#191b24',\r\n '#191a23',\r\n '#304156',\r\n '#001628',\r\n '#28333E',\r\n '#344058',\r\n '#383f45',\r\n]\r\n","import type { ProjectConfig } from '/#/config'\r\nimport { CacheTypeEnum } from '/@/enums/cacheEnum'\r\nimport {\r\n ContentEnum,\r\n PermissionModeEnum,\r\n ThemeEnum,\r\n RouterTransitionEnum,\r\n SettingButtonPositionEnum,\r\n SessionTimeoutProcessingEnum,\r\n} from '/@/enums/appEnum'\r\nimport { HEADER_PRESET_BG_COLOR_LIST } from './designSetting'\r\nimport { primaryColor } from '../../build/config/themeConfig'\r\n\r\n// ! You need to clear the browser cache after the change\r\nconst setting: ProjectConfig = {\r\n // Whether to show the configuration button\r\n showSettingButton: true,\r\n\r\n // Whether to show the theme switch button\r\n showDarkModeToggle: true,\r\n\r\n // `Settings` button position\r\n settingButtonPosition: SettingButtonPositionEnum.AUTO,\r\n\r\n // Permission mode\r\n permissionMode: PermissionModeEnum.ROLE,\r\n\r\n // Permission-related cache is stored in sessionStorage or localStorage\r\n permissionCacheType: CacheTypeEnum.LOCAL,\r\n\r\n // Session timeout processing\r\n sessionTimeoutProcessing: SessionTimeoutProcessingEnum.ROUTE_JUMP,\r\n\r\n // color\r\n themeColor: primaryColor,\r\n\r\n // Website gray mode, open for possible mourning dates\r\n grayMode: false,\r\n\r\n // Color Weakness Mode\r\n colorWeak: false,\r\n\r\n // Whether to cancel the menu, the top, the multi-tab page display, for possible embedded in other systems\r\n fullContent: false,\r\n\r\n // content mode\r\n contentMode: ContentEnum.FULL,\r\n\r\n // Whether to display the logo\r\n showLogo: true,\r\n\r\n // Whether to show footer\r\n showFooter: false,\r\n\r\n // Header configuration\r\n headerSetting: {\r\n // header bg color\r\n bgColor: HEADER_PRESET_BG_COLOR_LIST[0],\r\n // Fixed at the top\r\n fixed: true,\r\n // Whether to show top\r\n show: true,\r\n // theme\r\n theme: ThemeEnum.LIGHT,\r\n // Whether to enable the lock screen function\r\n useLockPage: true,\r\n // Whether to show the full screen button\r\n showFullScreen: true,\r\n // Whether to show the document button\r\n showDoc: true,\r\n // Whether to show the notification button\r\n showNotice: true,\r\n // Whether to display the menu search\r\n showSearch: true,\r\n },\r\n\r\n // Multi-label\r\n multiTabsSetting: {\r\n cache: false,\r\n // Turn on\r\n show: true,\r\n // Is it possible to drag and drop sorting tabs\r\n canDrag: true,\r\n // Turn on quick actions\r\n showQuick: true,\r\n // Whether to show the refresh button\r\n showRedo: true,\r\n // Whether to show the collapse button\r\n showFold: true,\r\n },\r\n\r\n // Transition Setting\r\n transitionSetting: {\r\n // Whether to open the page switching animation\r\n // The disabled state will also disable pageLoadinng\r\n enable: true,\r\n\r\n // Route basic switching animation\r\n basicTransition: RouterTransitionEnum.FADE_SIDE,\r\n\r\n // Whether to open page switching loading\r\n // Only open when enable=true\r\n openPageLoading: true,\r\n\r\n // Whether to open the top progress bar\r\n openNProgress: false,\r\n },\r\n\r\n // Whether to enable KeepAlive cache is best to close during development, otherwise the cache needs to be cleared every time\r\n openKeepAlive: true,\r\n\r\n // Automatic screen lock time, 0 does not lock the screen. Unit minute default 0\r\n lockTime: 0,\r\n\r\n // Whether to show breadcrumbs\r\n showBreadCrumb: true,\r\n\r\n // Whether to show the breadcrumb icon\r\n showBreadCrumbIcon: false,\r\n\r\n // Use error-handler-plugin\r\n useErrorHandle: false,\r\n\r\n // Whether to open back to top\r\n useOpenBackTop: true,\r\n\r\n // Is it possible to embed iframe pages\r\n canEmbedIFramePage: true,\r\n\r\n // Whether to delete unclosed messages and notify when switching the interface\r\n closeMessageOnSwitch: true,\r\n\r\n // Whether to cancel the http request that has been sent but not responded when switching the interface.\r\n // If it is enabled, I want to overwrite a single interface. Can be set in a separate interface\r\n removeAllHttpPending: false,\r\n\r\n idleLogoutSwitch: true,\r\n}\r\n\r\nexport default setting\r\n","import { generate } from '@ant-design/colors'\r\n\r\nexport const primaryColor = '#0960bd'\r\n\r\nexport const darkMode = 'light'\r\n\r\ntype Fn = (...arg: any) => any\r\n\r\ntype GenerateTheme = 'default' | 'dark'\r\n\r\nexport interface GenerateColorsParams {\r\n mixLighten: Fn\r\n mixDarken: Fn\r\n tinycolor: any\r\n color?: string\r\n}\r\n\r\nexport function generateAntColors(color: string, theme: GenerateTheme = 'default') {\r\n return generate(color, {\r\n theme,\r\n })\r\n}\r\n\r\nexport function getThemeColors(color?: string) {\r\n const tc = color || primaryColor\r\n const lightColors = generateAntColors(tc)\r\n const primary = lightColors[5]\r\n const modeColors = generateAntColors(primary, 'dark')\r\n\r\n return [...lightColors, ...modeColors]\r\n}\r\n\r\nexport function generateColors({\r\n color = primaryColor,\r\n mixLighten,\r\n mixDarken,\r\n tinycolor,\r\n}: GenerateColorsParams) {\r\n const arr = new Array(19).fill(0)\r\n const lightens = arr.map((_t, i) => {\r\n return mixLighten(color, i / 5)\r\n })\r\n\r\n const darkens = arr.map((_t, i) => {\r\n return mixDarken(color, i / 5)\r\n })\r\n\r\n const alphaColors = arr.map((_t, i) => {\r\n return tinycolor(color)\r\n .setAlpha(i / 20)\r\n .toRgbString()\r\n })\r\n\r\n const shortAlphaColors = alphaColors.map((item) => item.replace(/\\s/g, '').replace(/0\\./g, '.'))\r\n\r\n const tinycolorLightens = arr\r\n .map((_t, i) => {\r\n return tinycolor(color)\r\n .lighten(i * 5)\r\n .toHexString()\r\n })\r\n .filter((item) => item !== '#ffffff')\r\n\r\n const tinycolorDarkens = arr\r\n .map((_t, i) => {\r\n return tinycolor(color)\r\n .darken(i * 5)\r\n .toHexString()\r\n })\r\n .filter((item) => item !== '#000000')\r\n return [\r\n ...lightens,\r\n ...darkens,\r\n ...alphaColors,\r\n ...shortAlphaColors,\r\n ...tinycolorDarkens,\r\n ...tinycolorLightens,\r\n ].filter((item) => !item.includes('-'))\r\n}\r\n","import { Persistent, BasicKeys } from '/@/utils/cache/persistent'\r\nimport { CacheTypeEnum } from '/@/enums/cacheEnum'\r\nimport projectSetting from '/@/settings/projectSetting'\r\nimport { TOKEN_KEY } from '/@/enums/cacheEnum'\r\n\r\nconst { permissionCacheType } = projectSetting\r\nconst isLocal = permissionCacheType === CacheTypeEnum.LOCAL\r\n\r\nexport function getToken() {\r\n return getAuthCache(TOKEN_KEY)\r\n}\r\n\r\nexport function getAuthCache(key: BasicKeys) {\r\n const fn = isLocal ? Persistent.getLocal : Persistent.getSession\r\n return fn(key) as T\r\n}\r\n\r\nexport function setAuthCache(key: BasicKeys, value) {\r\n const fn = isLocal ? Persistent.setLocal : Persistent.setSession\r\n return fn(key, value, true)\r\n}\r\n","/*\r\n * @Author: Kuiper\r\n * @Date: 2021-07-15 17:28:17\r\n */\r\nimport type { RouteLocationNormalized, RouteRecordNormalized } from 'vue-router'\r\nimport type { App, Plugin } from 'vue'\r\n\r\nimport { unref } from 'vue'\r\nimport { isObject } from '/@/utils/is'\r\n\r\nexport const noop = () => {}\r\n\r\n/**\r\n * @description: Set ui mount node\r\n */\r\nexport function getPopupContainer(node?: HTMLElement): HTMLElement {\r\n return (node?.parentNode as HTMLElement) ?? document.body\r\n}\r\n\r\n/**\r\n * Add the object as a parameter to the URL\r\n * @param baseUrl url\r\n * @param obj\r\n * @returns {string}\r\n * eg:\r\n * let obj = {a: '3', b: '4'}\r\n * setObjToUrlParams('www.baidu.com', obj)\r\n * ==>www.baidu.com?a=3&b=4\r\n */\r\nexport function setObjToUrlParams(baseUrl: string, obj: any): string {\r\n let parameters = ''\r\n for (const key in obj) {\r\n parameters += key + '=' + encodeURIComponent(obj[key]) + '&'\r\n }\r\n parameters = parameters.replace(/&$/, '')\r\n return /\\?$/.test(baseUrl) ? baseUrl + parameters : baseUrl.replace(/\\/?$/, '?') + parameters\r\n}\r\n\r\nexport function deepMerge(src: any = {}, target: any = {}): T {\r\n let key: string\r\n for (key in target) {\r\n src[key] = isObject(src[key]) ? deepMerge(src[key], target[key]) : (src[key] = target[key])\r\n }\r\n return src\r\n}\r\n\r\nexport function openWindow(\r\n url: string,\r\n opt?: { target?: TargetContext | string; noopener?: boolean; noreferrer?: boolean }\r\n) {\r\n const { target = '__blank', noopener = true, noreferrer = true } = opt || {}\r\n const feature: string[] = []\r\n\r\n noopener && feature.push('noopener=yes')\r\n noreferrer && feature.push('noreferrer=yes')\r\n\r\n window.open(url, target, feature.join(','))\r\n}\r\n\r\n// dynamic use hook props\r\nexport function getDynamicProps(props: T): Partial {\r\n const ret: Recordable = {}\r\n\r\n Object.keys(props).map((key) => {\r\n ret[key] = unref((props as Recordable)[key])\r\n })\r\n\r\n return ret as Partial\r\n}\r\n\r\nexport function getRawRoute(route: RouteLocationNormalized): RouteLocationNormalized {\r\n if (!route) return route\r\n const { matched, ...opt } = route\r\n return {\r\n ...opt,\r\n matched: (matched\r\n ? matched.map((item) => ({\r\n meta: item.meta,\r\n name: item.name,\r\n path: item.path,\r\n }))\r\n : undefined) as RouteRecordNormalized[],\r\n }\r\n}\r\n\r\nexport const withInstall = (component: T, alias?: string) => {\r\n const comp = component as any\r\n comp.install = (app: App) => {\r\n app.component(comp.name || comp.displayName, component)\r\n if (alias) {\r\n app.config.globalProperties[alias] = component\r\n }\r\n }\r\n return component as T & Plugin\r\n}\r\n\r\nexport function getFileNameWithoutExt(str) {\r\n return str.substring(0, str.lastIndexOf('.'))\r\n}\r\n","import { isObject, isString } from '/@/utils/is'\r\n\r\nconst DATE_TIME_FORMAT = 'YYYY-MM-DD HH:mm'\r\n\r\nexport function joinTimestamp(\r\n join: boolean,\r\n restful: T\r\n): T extends true ? string : object\r\n\r\nexport function joinTimestamp(join: boolean, restful = false): string | object {\r\n if (!join) {\r\n return restful ? '' : {}\r\n }\r\n const now = new Date().getTime()\r\n if (restful) {\r\n return `?_t=${now}`\r\n }\r\n return { _t: now }\r\n}\r\n\r\n/**\r\n * @description: Format request parameter time\r\n */\r\nexport function formatRequestDate(params: Recordable) {\r\n if (Object.prototype.toString.call(params) !== '[object Object]') {\r\n return\r\n }\r\n\r\n for (const key in params) {\r\n if (params[key] && params[key]._isAMomentObject) {\r\n params[key] = params[key].format(DATE_TIME_FORMAT)\r\n }\r\n if (isString(key)) {\r\n const value = params[key]\r\n if (value) {\r\n try {\r\n params[key] = isString(value) ? value.trim() : value\r\n } catch (error) {\r\n throw new Error(error)\r\n }\r\n }\r\n }\r\n if (isObject(params[key])) {\r\n formatRequestDate(params[key])\r\n }\r\n }\r\n}\r\n","// axios配置 可自行根据项目进行更改,只需更改该文件即可,其他文件可以不动\r\n// The axios configuration can be changed according to the project, just change the file, other files can be left unchanged\r\n\r\nimport type { AxiosResponse } from 'axios'\r\nimport type { RequestOptions, Result } from '/#/axios'\r\nimport type { AxiosTransform, CreateAxiosOptions } from './axiosTransform'\r\nimport { VAxios } from './Axios'\r\nimport { useGlobSetting } from '/@/hooks/setting'\r\nimport { useMessage } from '/@/hooks/web/useMessage'\r\nimport { RequestEnum, ResultEnum, ContentTypeEnum } from '/@/enums/httpEnum'\r\nimport { isString } from '/@/utils/is'\r\nimport { getToken } from '/@/utils/auth'\r\nimport { setObjToUrlParams, deepMerge } from '/@/utils'\r\nimport { joinTimestamp, formatRequestDate } from './helper'\r\n\r\nconst globSetting = useGlobSetting()\r\nconst urlPrefix = globSetting.urlPrefix\r\nconst { createMessage, createErrorModal } = useMessage()\r\n\r\n/**\r\n * @description: 数据处理,方便区分多种处理方式\r\n */\r\nconst transform: AxiosTransform = {\r\n /**\r\n * @description: 处理请求数据。如果数据不是预期格式,可直接抛出错误\r\n */\r\n transformRequestHook: (res: AxiosResponse, options: RequestOptions) => {\r\n const { isTransformResponse, isReturnNativeResponse } = options\r\n // 是否返回原生响应头 比如:需要获取响应头时使用该属性\r\n if (isReturnNativeResponse) {\r\n return res\r\n }\r\n // 不进行任何处理,直接返回\r\n // 用于页面代码可能需要直接获取code,data,message这些信息时开启\r\n if (!isTransformResponse) {\r\n return res.data\r\n }\r\n // 错误的时候返回\r\n\r\n const { data } = res\r\n if (!data) {\r\n // return '[HTTP] Request has no return value';\r\n throw new Error('sys.api.apiRequestFailed')\r\n }\r\n // 这里 code,result,message为 后台统一的字段,需要在 types.ts内修改为项目自己的接口返回格式\r\n const { code, result, message } = data\r\n\r\n // 这里逻辑可以根据项目进行修改\r\n const hasSuccess = data && Reflect.has(data, 'code') && code === ResultEnum.SUCCESS\r\n if (hasSuccess) {\r\n return result\r\n }\r\n\r\n // 在此处根据自己项目的实际情况对不同的code执行不同的操作\r\n // 如果不希望中断当前请求,请return数据,否则直接抛出异常即可\r\n let timeoutMsg = ''\r\n switch (code) {\r\n case ResultEnum.TIMEOUT:\r\n timeoutMsg = 'sys.api.timeoutMessage'\r\n default:\r\n if (message) {\r\n timeoutMsg = message\r\n }\r\n }\r\n\r\n // errorMessageMode=‘modal’的时候会显示modal错误弹窗,而不是消息提示,用于一些比较重要的错误\r\n // errorMessageMode='none' 一般是调用时明确表示不希望自动弹出错误提示\r\n if (options.errorMessageMode === 'modal') {\r\n createErrorModal({ title: 'sys.api.errorTip', content: timeoutMsg })\r\n } else if (options.errorMessageMode === 'message') {\r\n createMessage.error(timeoutMsg)\r\n }\r\n\r\n throw new Error(timeoutMsg || 'sys.api.apiRequestFailed')\r\n },\r\n\r\n // 请求之前处理config\r\n beforeRequestHook: (config, options) => {\r\n const { apiUrl, joinPrefix, joinParamsToUrl, formatDate, joinTime = true } = options\r\n\r\n if (joinPrefix) {\r\n config.url = `${urlPrefix}${config.url}`\r\n }\r\n\r\n if (apiUrl && isString(apiUrl)) {\r\n config.url = `${apiUrl}${config.url}`\r\n }\r\n const params = config.params || {}\r\n if (config.method?.toUpperCase() === RequestEnum.GET) {\r\n if (!isString(params)) {\r\n // 给 get 请求加上时间戳参数,避免从缓存中拿数据。\r\n config.params = Object.assign(params || {}, joinTimestamp(joinTime, false))\r\n } else {\r\n // 兼容restful风格\r\n config.url = config.url + params + `${joinTimestamp(joinTime, true)}`\r\n config.params = undefined\r\n }\r\n } else {\r\n if (!isString(params)) {\r\n formatDate && formatRequestDate(params)\r\n // config.data = params;\r\n // config.params = undefined;\r\n if (joinParamsToUrl) {\r\n config.url = setObjToUrlParams(config.url as string, config.params)\r\n config.params = undefined\r\n }\r\n } else {\r\n // 兼容restful风格\r\n config.url = config.url + params\r\n config.params = undefined\r\n }\r\n }\r\n return config\r\n },\r\n\r\n /**\r\n * @description: 请求拦截器处理\r\n */\r\n requestInterceptors: (config, options) => {\r\n // 请求之前处理config\r\n const token = getToken()\r\n if (token) {\r\n // jwt token\r\n config.headers.Authorization = options.authenticationScheme\r\n ? `${options.authenticationScheme} ${token}`\r\n : token\r\n }\r\n return config\r\n },\r\n\r\n /**\r\n * @description: 响应拦截器处理\r\n */\r\n responseInterceptors: (res: AxiosResponse) => {\r\n return res\r\n },\r\n\r\n /**\r\n * @description: 响应错误处理\r\n */\r\n responseInterceptorsCatch: (error: any) => {\r\n return Promise.reject(error)\r\n },\r\n}\r\n\r\nfunction createAxios(opt?: Partial) {\r\n return new VAxios(\r\n deepMerge(\r\n {\r\n // See https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication#authentication_schemes\r\n // authentication schemes,e.g: Bearer\r\n // authenticationScheme: 'Bearer',\r\n authenticationScheme: '',\r\n timeout: 10 * 1000,\r\n // 基础接口地址\r\n // baseURL: globSetting.apiUrl,\r\n // 接口可能会有通用的地址部分,可以统一抽取出来\r\n urlPrefix: urlPrefix,\r\n headers: { 'Content-Type': ContentTypeEnum.JSON },\r\n // 如果是form-data格式\r\n // headers: { 'Content-Type': ContentTypeEnum.FORM_URLENCODED },\r\n // 数据处理方式\r\n transform,\r\n // 配置项,下面的选项都可以在独立的接口请求中覆盖\r\n requestOptions: {\r\n // 默认将prefix 添加到url\r\n joinPrefix: false,\r\n // 是否返回原生响应头 比如:需要获取响应头时使用该属性\r\n isReturnNativeResponse: false,\r\n // 需要对返回数据进行处理\r\n isTransformResponse: false,\r\n // post请求的时候添加参数到url\r\n joinParamsToUrl: false,\r\n // 格式化提交参数时间\r\n formatDate: false,\r\n // 消息提示类型\r\n errorMessageMode: 'message',\r\n // 接口地址\r\n apiUrl: globSetting.apiUrl,\r\n // 是否加入时间戳\r\n joinTime: false,\r\n // 忽略重复请求\r\n ignoreCancelToken: true,\r\n },\r\n },\r\n opt || {}\r\n )\r\n )\r\n}\r\nexport const defHttp = createAxios()\r\n\r\n// other api url\r\n// export const otherHttp = createAxios({\r\n// requestOptions: {\r\n// apiUrl: 'xxx',\r\n// },\r\n// });\r\n","import type { GlobConfig } from '/#/config'\r\n\r\nimport { warn } from '/@/utils/log'\r\nimport { getAppEnvConfig } from '/@/utils/env'\r\n\r\nexport const useGlobSetting = (): Readonly => {\r\n const {\r\n VITE_GLOB_APP_TITLE,\r\n VITE_GLOB_API_URL,\r\n VITE_GLOB_APP_SHORT_NAME,\r\n VITE_GLOB_API_URL_PREFIX,\r\n VITE_GLOB_UPLOAD_URL,\r\n } = getAppEnvConfig()\r\n\r\n if (!/[a-zA-Z\\_]*/.test(VITE_GLOB_APP_SHORT_NAME)) {\r\n warn(\r\n `VITE_GLOB_APP_SHORT_NAME Variables can only be characters/underscores, please modify in the environment variables and re-running.`\r\n )\r\n }\r\n\r\n // Take global configuration\r\n const glob: Readonly = {\r\n title: VITE_GLOB_APP_TITLE,\r\n apiUrl: VITE_GLOB_API_URL,\r\n shortName: VITE_GLOB_APP_SHORT_NAME,\r\n urlPrefix: VITE_GLOB_API_URL_PREFIX,\r\n uploadUrl: VITE_GLOB_UPLOAD_URL,\r\n }\r\n return glob as Readonly\r\n}\r\n","/*\r\n * @Author: Kuiper\r\n * @Date: 2021-06-25 10:36:11\r\n */\r\nimport { isDevelopment } from '/@/api/config'\r\nimport { defHttp } from '/@/utils/http/axios'\r\nimport md5 from 'crypto-js/md5'\r\nimport { ContentTypeEnum } from '/@/enums/httpEnum'\r\nimport { LoginParams, LoginResultModel, AccessInfo, ReCoocaaAccountInfo } from './userModel'\r\n\r\nenum Api {\r\n Login = '/login',\r\n GetUserInfo = '/getUserInfo',\r\n TestApi = 'https://beta.passport.coocaa.com/api/screen/agora-token-by-uid',\r\n TestMockApi = '/mock/zy/aaa',\r\n testdevicetList = '/mock/yss/devicetList',\r\n testCompanyInfo = '/mock/yss/companyInfo',\r\n testMemberList = '/mock/yss/memberList',\r\n}\r\n\r\nimport { AxiosResponse } from 'axios'\r\nconst isDev = isDevelopment()\r\nconst baseUrl = isDev ? 'https://beta.passport.coocaa.com' : 'https://passport.coocaa.com' //\r\nconst CLIENT_ID_COOCAA = isDev\r\n ? '20030b3587ab4f9a9739185237319a46'\r\n : '25c7c236ccf84b7e8ebac9aa71531f07' //client_id:25c7c236ccf84b7e8ebac9aa71531f07 client_secret:pbSWEUWHhOXsszxa\r\nconst CLIENT_SECRET_COOCAA = isDev ? 'KSiVM12wRNu1WNN5' : 'pbSWEUWHhOXsszxa' //\r\nconst SHARE_DISK_CODE_KEY = 'share_disk_request_coocaa' + randomString(10) //需要保证每次得acode值不一样,避免发生覆盖问题,出现图片验证码输入正确提示错误得问题\r\n\r\nfunction processURL(paramsMap: any = {}) {\r\n Object.assign(paramsMap, {\r\n time: Math.round(new Date().getTime() / 1000),\r\n client_id: CLIENT_ID_COOCAA,\r\n })\r\n let url = ''\r\n let sign = ''\r\n Object.keys(paramsMap)\r\n .sort()\r\n .forEach(function (key) {\r\n url += key + '=' + encodeURIComponent(paramsMap[key]) + '&'\r\n sign += key + '=' + paramsMap[key] + '&'\r\n })\r\n sign = sign.slice(0, sign.length - 1)\r\n sign += CLIENT_SECRET_COOCAA\r\n sign = md5(sign).toString()\r\n url += 'sign=' + sign\r\n return {\r\n url,\r\n sign,\r\n }\r\n}\r\nfunction randomString(len) {\r\n len = len || 32\r\n const $chars =\r\n 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678' /****默认去掉了容易混淆的字符oOLl,9gq,Vv,Uu,I1****/\r\n const maxPos = $chars.length\r\n let pwd = ''\r\n for (let i = 0; i < len; i++) {\r\n pwd += $chars.charAt(Math.floor(Math.random() * maxPos))\r\n }\r\n return pwd\r\n}\r\nexport function getCaptchaApi(iconWidth?: number, iconHeight?: number) {\r\n const data = {\r\n width: iconWidth,\r\n height: iconHeight,\r\n codeKey: SHARE_DISK_CODE_KEY,\r\n }\r\n const params = {\r\n client_id: CLIENT_ID_COOCAA,\r\n time: Math.round(new Date().getTime() / 1000),\r\n sign: '',\r\n }\r\n const signParam = processURL()\r\n params.sign = signParam.sign\r\n return defHttp.post({\r\n url: baseUrl + `/skyapi/common/getValidCode`,\r\n headers: {\r\n 'content-type': ContentTypeEnum.FORM_URLENCODED,\r\n },\r\n params,\r\n data,\r\n responseType: 'blob',\r\n })\r\n}\r\n\r\nexport function getCaptcha(mobile: string, iconCapcha: string) {\r\n const data = {\r\n codeKey: SHARE_DISK_CODE_KEY,\r\n mobile_email: mobile,\r\n capcha: iconCapcha,\r\n }\r\n const params = {\r\n client_id: CLIENT_ID_COOCAA,\r\n time: Math.round(new Date().getTime() / 1000),\r\n sign: '',\r\n }\r\n const signParam = processURL({})\r\n params.sign = signParam.sign\r\n return defHttp.post({\r\n url: baseUrl + `/skyapi/common/captcha-new`,\r\n headers: {\r\n 'content-type': ContentTypeEnum.FORM_URLENCODED,\r\n },\r\n params,\r\n data,\r\n })\r\n}\r\nexport function loginByCaptcha(mobile: string, captcha: string) {\r\n const data = {\r\n mobile,\r\n captcha,\r\n mac: '11:11:FE:11:11',\r\n model: 'web',\r\n core: 'shareDisk',\r\n }\r\n const params = {\r\n client_id: CLIENT_ID_COOCAA,\r\n time: Math.round(new Date().getTime() / 1000),\r\n sign: '',\r\n }\r\n const signParam = processURL({})\r\n params.sign = signParam.sign\r\n return defHttp.post({\r\n url: baseUrl + `/skyapi/user/login/mobile`,\r\n headers: {\r\n 'content-type': ContentTypeEnum.FORM_URLENCODED,\r\n },\r\n params,\r\n data,\r\n })\r\n}\r\n\r\nexport function requireAccInfo(ak: string) {\r\n const params = {\r\n client_id: CLIENT_ID_COOCAA,\r\n time: Math.round(new Date().getTime() / 1000),\r\n sign: '',\r\n access_token: ak,\r\n }\r\n const signParam = processURL({})\r\n params.sign = signParam.sign\r\n return defHttp.get({\r\n url: baseUrl + `/api/user/info`,\r\n headers: {\r\n 'content-type': ContentTypeEnum.FORM_URLENCODED,\r\n },\r\n params,\r\n })\r\n}\r\n\r\nexport function testApi() {\r\n console.log('api testApi in')\r\n const params = {\r\n channelName: '12345678',\r\n role: 1,\r\n uid: 0,\r\n expireTimeInSeconds: 36000,\r\n }\r\n return defHttp.get({ url: Api.TestApi, params })\r\n}\r\n\r\nexport function testMockApi() {\r\n console.log('api testMockApi in')\r\n return defHttp.get({ url: Api.TestMockApi })\r\n}\r\n\r\nexport function MockdeviceList() {\r\n console.log('api testMockApi in')\r\n return defHttp.get({ url: Api.testdevicetList })\r\n}\r\nexport function MockcompanyInfo() {\r\n console.log('api testMockApi in')\r\n return defHttp.get({ url: Api.testCompanyInfo })\r\n}\r\n\r\nexport function MockmemberList() {\r\n console.log('api testMockApi in')\r\n return defHttp.get({ url: Api.testMemberList })\r\n}\r\n/**\r\n * @description: user login api\r\n */\r\nexport function loginApi(params: LoginParams) {\r\n return defHttp.post({\r\n url: Api.Login,\r\n params,\r\n })\r\n}\r\n","/*\r\n * @Author: Kuiper\r\n * @Date: 2021-06-24 20:22:50\r\n */\r\nimport { Store } from 'vuex'\r\nimport { StateType } from '../../types'\r\nimport { loginApi, testApi, getCaptchaApi, requireAccInfo, testMockApi } from '/@/api/user'\r\nimport { LoginParams, LoginResultModel, CoocaaAccountInfo } from '/@/api/user/userModel'\r\n\r\nexport default {\r\n async testCall(): Promise {\r\n try {\r\n console.log('store testCall in')\r\n const res = await testApi()\r\n console.log('store res', res)\r\n return res\r\n } catch (error) {\r\n return Promise.reject(error)\r\n }\r\n },\r\n\r\n async mockCall(): Promise {\r\n try {\r\n console.log('store mockCall in')\r\n const res = await testMockApi()\r\n console.log('store res', res)\r\n return res\r\n } catch (error) {\r\n return Promise.reject(error)\r\n }\r\n },\r\n\r\n async loginByCaptcha(): Promise {\r\n try {\r\n console.log('store loginByCaptcha in')\r\n const res = await getCaptchaApi()\r\n console.log('loginByCaptcha', res)\r\n return res\r\n } catch (error) {\r\n return Promise.reject(error)\r\n }\r\n },\r\n async getUserInfo(context: Store, params: any) {\r\n console.log('派发actions的时候传递数据', params)\r\n try {\r\n const queryData = params.accessToken ? params.accessToken : params.access_token\r\n console.log(queryData)\r\n const response = await requireAccInfo(queryData)\r\n if (response) {\r\n console.log('这是获取到的个人信息', response)\r\n if (response && response.open_id) {\r\n let user_name\r\n if (response.user_name) {\r\n user_name = response.user_name\r\n } else {\r\n user_name = response.nick_name\r\n }\r\n const info: CoocaaAccountInfo = {\r\n code: 1,\r\n mobile: response.mobile,\r\n uid: response.open_id,\r\n ak: params.accessToken,\r\n avatar: response.avatar,\r\n nickname: user_name,\r\n role: params.role,\r\n }\r\n context.commit('assign', info)\r\n }\r\n }\r\n } catch (error) {\r\n return Promise.reject(error)\r\n }\r\n },\r\n async login(\r\n context: Store,\r\n params: LoginParams\r\n ): Promise {\r\n try {\r\n console.log('store login in', context, params)\r\n const { ...loginParams } = params\r\n const data = await loginApi(loginParams)\r\n const { token } = data\r\n console.log('login token:', token)\r\n return data\r\n } catch (error) {\r\n return Promise.reject(error)\r\n }\r\n },\r\n}\r\n","/*\r\n * @Author: Kuiper\r\n * @Date: 2021-06-24 20:22:50\r\n */\r\nexport default {\r\n // TODO\r\n}\r\n","/*\r\n * @Author: Kuiper\r\n * @Date: 2021-08-11 16:00:03\r\n */\r\nimport { CoocaaAccountInfo } from '/@/api/user/userModel'\r\nexport default {\r\n __set(state: any, msg: { key: string; val: any }) {\r\n state[msg.key] = msg.val\r\n },\r\n assign(state, account: CoocaaAccountInfo) {\r\n console.log('useAccountStore assign', account)\r\n state.userInfo = account\r\n },\r\n setLastTime(state, value: number) {\r\n state.lastTime = value\r\n },\r\n clear(state) {\r\n console.log('useAccountStore clear')\r\n state.userInfo = {\r\n code: 0,\r\n ak: null,\r\n uid: null,\r\n nickname: null,\r\n avatar: null,\r\n mobile: null,\r\n role: null,\r\n }\r\n },\r\n}\r\n","/*\r\n * @Author: Kuiper\r\n * @Date: 2021-06-24 20:22:50\r\n */\r\nimport { StateType } from '/@/store/types'\r\nimport { Module } from 'vuex'\r\ninterface Token {\r\n [propertys: string]: any\r\n}\r\n\r\nconst state = {\r\n token: {} as Token,\r\n lastTime: 0,\r\n userInfo: {\r\n code: -1,\r\n ak: undefined,\r\n uid: undefined,\r\n nickname: undefined,\r\n avatar: undefined,\r\n mobile: undefined,\r\n role: undefined,\r\n },\r\n currentTeamRoleId: 0, // 当前所选择的团队用户所具有的权限\r\n currentProjectRoleId: 0, // 当前所选择的项目用户所具有的权限\r\n}\r\ntype UserStateType = typeof state\r\n\r\nconst user: Module = {\r\n namespaced: true,\r\n ...state,\r\n}\r\n\r\nexport { UserStateType, state }\r\nexport default user\r\n","/*\r\n * @Author: Kuiper\r\n * @Date: 2021-06-12 10:03:34\r\n * @LastEditTime: 2021-06-25 15:48:39\r\n */\r\n// https://vuex.vuejs.org/en/modules.html\r\n\r\nconst allModules = import.meta.globEager('./*/*.ts')\r\n// console.log('allModules:', allModules)\r\n\r\nconst modules: any = {}\r\n\r\nObject.keys(allModules).forEach((key) => {\r\n const path = key.replace(/(\\.\\/|\\.ts)/g, '')\r\n // console.log('path:', path)\r\n const [namespace, imported] = path.split('/')\r\n if (!modules[namespace]) {\r\n modules[namespace] = {\r\n namespaced: true,\r\n }\r\n }\r\n modules[namespace][imported] = allModules[key].default || {}\r\n // console.log('modules:', modules)\r\n})\r\n\r\nexport default modules\r\n","/*\r\n * @Author: Kuiper\r\n * @Date: 2021-06-12 10:03:34\r\n * @LastEditTime: 2021-08-13 18:17:47\r\n */\r\nimport { createStore, createLogger, Store } from 'vuex'\r\nimport createPersistedState from 'vuex-persistedstate'\r\nimport mutations from './mutations'\r\nimport modules from './modules'\r\nimport { StateType } from './types'\r\nimport { App, InjectionKey } from 'vue'\r\n\r\nexport const key: InjectionKey> = Symbol()\r\n\r\nconst store: Store = createStore({\r\n strict: true,\r\n mutations,\r\n modules: { ...modules },\r\n plugins:\r\n process.env.NODE_ENV !== 'production'\r\n ? [\r\n createLogger(),\r\n createPersistedState({\r\n key: '__CC_SHARE_USER__',\r\n paths: ['user'],\r\n // reducer(val) {\r\n // return val.user.userInfo\r\n // }\r\n }),\r\n ]\r\n : [\r\n createPersistedState({\r\n key: '__CC_SHARE_USER__',\r\n paths: ['user'],\r\n // reducer(val) {\r\n // return val.user.userInfo\r\n // }\r\n }),\r\n ],\r\n})\r\n\r\nexport function setupStore(app: App) {\r\n app.use(store)\r\n}\r\n\r\nexport { store }\r\n","/*\r\n * @Author: Kuiper\r\n * @Date: 2021-06-24 19:33:34\r\n */\r\nimport { Router } from 'vue-router'\r\nimport { store } from '/@/store'\r\n\r\nexport const DEFAULT_SESSION_TIMEOUT = 60 * 60 * 24 * 7 * 1000\r\n\r\nexport function setupRouterGuard(router: Router) {\r\n createPageGuard(router)\r\n}\r\n\r\nfunction createPageGuard(router: Router) {\r\n router.beforeEach((to, from, next) => {\r\n console.log('监听路由from:', from)\r\n console.log('监听路由to:', to)\r\n if (to.meta.requireAuth) {\r\n // 判断该路由是否需要登录权限\r\n if (store.state.user.userInfo.ak) {\r\n //判断本地是否存在access_token\r\n const user = store.state.user.userInfo.role == 'personal' ? true : false\r\n if (user == to.meta.isMine) {\r\n next()\r\n } else {\r\n if (user && to.meta.isMine) {\r\n next()\r\n } else if (user && !to.meta.isMine) {\r\n store.commit('user/clear')\r\n next({\r\n path: '/login',\r\n query: {\r\n role: 'company',\r\n // redirect: to.fullPath\r\n },\r\n })\r\n } else if (!user && to.meta.isMine) {\r\n store.commit('user/clear')\r\n next({\r\n path: '/',\r\n // query: {\r\n // role: 'personal',\r\n // // redirect: to.fullPath\r\n // }\r\n })\r\n } else {\r\n next()\r\n }\r\n }\r\n } else {\r\n if (to.meta.isMine) {\r\n next({\r\n path: '/introduce',\r\n })\r\n } else {\r\n next({\r\n path: '/login',\r\n query: {\r\n role: 'company',\r\n // redirect: to.fullPath\r\n },\r\n })\r\n }\r\n }\r\n } else {\r\n next()\r\n }\r\n })\r\n}\r\n","/*\r\n * @Author: Kuiper\r\n * @Date: 2021-08-26 20:45:04\r\n */\r\nimport { registerSW } from 'virtual:pwa-register'\r\n\r\nexport function setupPwa() {\r\n if (import.meta.env.PROD) {\r\n console.log('start to registerSW')\r\n const updateSW = registerSW({\r\n onNeedRefresh() {\r\n console.log('registerSW onNeedRefresh')\r\n updateSW()\r\n },\r\n onOfflineReady() {\r\n console.log('registerSW onOfflineReady')\r\n },\r\n })\r\n // updateSW()\r\n // navigator?.serviceWorker?.getRegistrations().then((res) => {\r\n // console.log('serviceWorker getRegistrations:', res)\r\n // })\r\n }\r\n}\r\n","// src/client/build/register.ts\nimport {Workbox, messageSW} from \"workbox-window\";\nvar autoUpdateMode = \"true\";\nvar auto = autoUpdateMode === \"true\";\nfunction registerSW(options = {}) {\n const {\n immediate = false,\n onNeedRefresh,\n onOfflineReady\n } = options;\n let wb;\n let registration;\n const updateServiceWorker = async (reloadPage = true) => {\n if (!auto) {\n if (reloadPage) {\n wb == null ? void 0 : wb.addEventListener(\"controlling\", (event) => {\n if (event.isUpdate)\n window.location.reload();\n });\n }\n if (registration && registration.waiting) {\n await messageSW(registration.waiting, {type: \"SKIP_WAITING\"});\n }\n }\n };\n if (\"serviceWorker\" in navigator) {\n wb = new Workbox(\"./service-worker.js\", {scope: \"./\"});\n wb.addEventListener(\"activated\", (event) => {\n if (event.isUpdate)\n auto && window.location.reload();\n else\n onOfflineReady == null ? void 0 : onOfflineReady();\n });\n if (!auto) {\n const showSkipWaitingPrompt = () => {\n onNeedRefresh == null ? void 0 : onNeedRefresh();\n };\n wb.addEventListener(\"waiting\", showSkipWaitingPrompt);\n wb.addEventListener(\"externalwaiting\", showSkipWaitingPrompt);\n }\n wb.register({immediate}).then((r) => registration = r);\n }\n return updateServiceWorker;\n}\nexport {\n registerSW\n};\n","// Interface data format used to return a unified format\r\n\r\nexport function resultSuccess(result: T, { message = 'ok' } = {}) {\r\n return {\r\n code: 0,\r\n result,\r\n message,\r\n type: 'success',\r\n }\r\n}\r\n\r\nexport function resultPageSuccess(\r\n page: number,\r\n pageSize: number,\r\n list: T[],\r\n { message = 'ok' } = {}\r\n) {\r\n const pageData = pagination(page, pageSize, list)\r\n\r\n return {\r\n ...resultSuccess({\r\n items: pageData,\r\n total: list.length,\r\n }),\r\n message,\r\n }\r\n}\r\n\r\nexport function resultError(message = 'Request failed', { code = -1, result = null } = {}) {\r\n return {\r\n code,\r\n result,\r\n message,\r\n type: 'error',\r\n }\r\n}\r\n\r\nexport function pagination(pageNo: number, pageSize: number, array: T[]): T[] {\r\n const offset = (pageNo - 1) * Number(pageSize)\r\n const ret =\r\n offset + Number(pageSize) >= array.length\r\n ? array.slice(offset, array.length)\r\n : array.slice(offset, offset + Number(pageSize))\r\n return ret\r\n}\r\n\r\nexport interface requestParams {\r\n method: string\r\n body: any\r\n headers?: { authorization?: string }\r\n query: any\r\n}\r\n\r\n/**\r\n * @description 本函数用于从request数据中获取token,请根据项目的实际情况修改\r\n *\r\n */\r\nexport function getRequestToken({ headers }: requestParams): string | undefined {\r\n return headers?.authorization\r\n}\r\n","/*\r\n * @Author: Kuiper\r\n * @Date: 2021-06-19 13:58:08\r\n */\r\nimport { MockMethod } from 'vite-plugin-mock'\r\nimport { resultError, resultSuccess, getRequestToken, requestParams } from '../_util'\r\n\r\nexport function createFakeUserList() {\r\n return [\r\n {\r\n userId: '1',\r\n username: 'vben',\r\n realName: 'fanyanbo',\r\n avatar: 'https://q1.qlogo.cn/g?b=qq&nk=190848757&s=640',\r\n desc: 'manager',\r\n password: '123456',\r\n token: 'fakeToken1',\r\n roles: [\r\n {\r\n roleName: 'Super Admin',\r\n value: 'super',\r\n },\r\n ],\r\n },\r\n {\r\n userId: '2',\r\n username: 'test',\r\n password: '123456',\r\n realName: 'test user',\r\n avatar: 'https://q1.qlogo.cn/g?b=qq&nk=339449197&s=640',\r\n desc: 'tester',\r\n token: 'fakeToken2',\r\n roles: [\r\n {\r\n roleName: 'Tester',\r\n value: 'test',\r\n },\r\n ],\r\n },\r\n ]\r\n}\r\n//mock设备列表信息\r\nexport function devicetList() {\r\n return [\r\n {\r\n id: 1,\r\n screen_name: '应用名称1',\r\n mac_addr: '12345678',\r\n screen_model: 'H1233',\r\n active_time: '2020-01-04 09:41:00',\r\n },\r\n {\r\n id: 2,\r\n screen_name: '应用名称1',\r\n mac_addr: '12345678',\r\n screen_model: 'H1233',\r\n active_time: '2020-01-04 09:41:00',\r\n },\r\n {\r\n id: 2,\r\n screen_name: '应用名称1',\r\n mac_addr: '12345678',\r\n screen_model: 'H1233',\r\n active_time: '2020-01-04 09:41:00',\r\n },\r\n {\r\n id: 2,\r\n screen_name: '应用名称1',\r\n mac_addr: '12345678',\r\n screen_model: 'H1233',\r\n active_time: '2020-01-04 09:41:00',\r\n },\r\n {\r\n id: 2,\r\n screen_name: '应用名称1',\r\n mac_addr: '12345678',\r\n screen_model: 'H1233',\r\n active_time: '2020-01-04 09:41:00',\r\n },\r\n {\r\n id: 2,\r\n screen_name: '应用名称1',\r\n mac_addr: '12345678',\r\n screen_model: 'H1233',\r\n active_time: '2020-01-04 09:41:00',\r\n },\r\n {\r\n id: 2,\r\n screen_name: '应用名称1',\r\n mac_addr: '12345678',\r\n screen_model: 'H1233',\r\n active_time: '2020-01-04 09:41:00',\r\n },\r\n {\r\n id: 2,\r\n screen_name: '应用名称1',\r\n mac_addr: '12345678',\r\n screen_model: 'H1233',\r\n active_time: '2020-01-04 09:41:00',\r\n },\r\n {\r\n id: 2,\r\n screen_name: '应用名称1',\r\n mac_addr: '12345678',\r\n screen_model: 'H1233',\r\n active_time: '2020-01-04 09:41:00',\r\n },\r\n {\r\n id: 2,\r\n screen_name: '应用名称1',\r\n mac_addr: '12345678',\r\n screen_model: 'H1233',\r\n active_time: '2020-01-04 09:41:00',\r\n },\r\n {\r\n id: 2,\r\n screen_name: '应用名称1',\r\n mac_addr: '12345678',\r\n screen_model: 'H1233',\r\n active_time: '2020-01-04 09:41:00',\r\n },\r\n ]\r\n}\r\nexport function companyInfo() {\r\n return [\r\n {\r\n business_id: '1234',\r\n tel: '18729266957',\r\n role: '1',\r\n business_name: '你真好看',\r\n member_num: '20',\r\n device_num: '111',\r\n },\r\n ]\r\n}\r\nexport function memberList() {\r\n return [\r\n {\r\n id: 1,\r\n name: '靓女1',\r\n tel: '12345678',\r\n email: 'yss565797726@hh.com',\r\n create_time: '2020-01-04 09:41:00',\r\n },\r\n {\r\n id: 2,\r\n name: '靓女2',\r\n tel: '12345678',\r\n email: 'yss565797726@hh.com',\r\n create_time: '2020-01-04 09:41:00',\r\n },\r\n {\r\n id: 3,\r\n name: '靓女3',\r\n tel: '12345678',\r\n email: 'yss565797726@hh.com',\r\n create_time: '2020-01-04 09:41:00',\r\n },\r\n ]\r\n}\r\n\r\nexport function getAppletList() {\r\n return [\r\n {\r\n id: 0,\r\n name: '党史学习教育',\r\n avatar: '/src/assets/img/applet/logo.png',\r\n describe: '记录中国共产党重大的事件',\r\n active: true,\r\n },\r\n {\r\n id: 1,\r\n name: 'JUMP',\r\n avatar: '/src/assets/img/applet/logo.png',\r\n describe: 'encodeURIComponent',\r\n active: false,\r\n },\r\n {\r\n id: 2,\r\n name: '党史学习教育',\r\n avatar: '/src/assets/img/applet/logo.png',\r\n describe: '记录中国共产党重大的事件',\r\n active: true,\r\n },\r\n {\r\n id: 3,\r\n name: 'JUMP',\r\n avatar: '/src/assets/img/applet/logo.png',\r\n describe: 'encodeURIComponent',\r\n active: false,\r\n },\r\n ]\r\n}\r\n\r\nexport default [\r\n // mock user login\r\n {\r\n url: '/fyb-test/login',\r\n timeout: 200,\r\n method: 'post',\r\n response: ({ body }) => {\r\n console.log('111111')\r\n const { username, password } = body\r\n const checkUser = createFakeUserList().find(\r\n (item) => item.username === username && password === item.password\r\n )\r\n if (!checkUser) {\r\n return resultError('Incorrect account or password!')\r\n }\r\n const { userId, username: _username, token, realName, desc, roles } = checkUser\r\n return resultSuccess({\r\n roles,\r\n userId,\r\n username: _username,\r\n token,\r\n realName,\r\n desc,\r\n })\r\n },\r\n },\r\n {\r\n url: '/fyb-test/getUserInfo',\r\n method: 'get',\r\n response: (request: requestParams) => {\r\n const token = getRequestToken(request)\r\n if (!token) return resultError('Invalid token')\r\n const checkUser = createFakeUserList().find((item) => item.token === token)\r\n if (!checkUser) {\r\n return resultError('The corresponding user information was not obtained!')\r\n }\r\n return resultSuccess(checkUser)\r\n },\r\n },\r\n {\r\n url: '/mock/zy/aaa',\r\n method: 'get',\r\n response: () => {\r\n const checkUser = createFakeUserList()\r\n if (!checkUser) {\r\n return resultError('The corresponding user information was not obtained!')\r\n }\r\n return resultSuccess(checkUser)\r\n },\r\n },\r\n //设备列表\r\n {\r\n url: '/mock/yss/devicetList',\r\n method: 'get',\r\n response: () => {\r\n const checkUser = devicetList()\r\n if (!checkUser) {\r\n return resultError('The corresponding user information was not obtained!')\r\n }\r\n return resultSuccess(checkUser)\r\n },\r\n },\r\n //企业信息\r\n {\r\n url: '/mock/yss/companyInfo',\r\n method: 'get',\r\n response: () => {\r\n const checkUser = companyInfo()\r\n if (!checkUser) {\r\n return resultError('The corresponding user information was not obtained!')\r\n }\r\n return resultSuccess(checkUser)\r\n },\r\n },\r\n //成员信息\r\n {\r\n url: '/mock/yss/memberList',\r\n method: 'get',\r\n response: () => {\r\n const checkUser = memberList()\r\n if (!checkUser) {\r\n return resultError('The corresponding user information was not obtained!')\r\n }\r\n return resultSuccess(checkUser)\r\n },\r\n },\r\n\r\n //已创建的订阅号列表\r\n {\r\n url: '/mock/yq/getAppletList',\r\n method: 'get',\r\n response: () => {\r\n const getResults = getAppletList()\r\n if (!getResults) {\r\n return resultError('The corresponding user information was not obtained!')\r\n }\r\n return resultSuccess(getResults)\r\n },\r\n },\r\n] as MockMethod[]\r\n","import { createProdMockServer } from 'vite-plugin-mock/es/createProdMockServer'\r\n\r\nconst modules = import.meta.globEager('./**/*.ts')\r\n\r\nconst mockModules: any[] = []\r\nObject.keys(modules).forEach((key) => {\r\n if (key.includes('/_')) {\r\n return\r\n }\r\n mockModules.push(...modules[key].default)\r\n})\r\n\r\n/**\r\n * Used in a production environment. Need to manually import all modules\r\n */\r\nexport function setupProdMockServer() {\r\n createProdMockServer(mockModules)\r\n}\r\n","/*\r\n * @Author: Kuiper\r\n * @Date: 2021-06-24 18:24:06\r\n */\r\nimport { createApp } from 'vue'\r\nimport App from './App.vue'\r\nimport { router, setupRouter } from '/@/router'\r\nimport { setupRouterGuard } from '/@/router/guard'\r\nimport { setupStore } from '/@/store'\r\nimport { setupAntd, setupGlobalMethods, setupCustomComponents, setupPwa } from '/@/plugins'\r\nimport { setupErrorHandle } from './utils/error-handler/index'\r\n\r\nasync function bootstrap() {\r\n const app = createApp(App)\r\n\r\n // Configure store\r\n setupStore(app)\r\n\r\n // 注册全局常用的ant-design-vue组件\r\n setupAntd(app)\r\n\r\n // 注册全局自定义组件,如:\r\n setupCustomComponents(app)\r\n\r\n // 注册全局方法,如:app.config.globalProperties.$message = message\r\n setupGlobalMethods(app)\r\n\r\n // Configure routing\r\n setupRouter(app)\r\n\r\n // router-guard\r\n setupRouterGuard(router)\r\n\r\n // Mount when the route is ready\r\n // https://next.router.vuejs.org/api/#isready\r\n await router.isReady()\r\n\r\n // sentry\r\n setupErrorHandle(app, router)\r\n\r\n // progress web application\r\n setupPwa()\r\n\r\n app.mount('#app', true)\r\n}\r\nvoid bootstrap()\r\n","/*\r\n * @Author: Kuiper\r\n * @Date: 2021-06-24 19:37:19\r\n */\r\nimport type { App } from 'vue'\r\n\r\nimport {\r\n Modal,\r\n Table,\r\n Menu,\r\n Input,\r\n Form,\r\n Card,\r\n Checkbox,\r\n Radio,\r\n Upload,\r\n Button,\r\n Switch,\r\n Row,\r\n Progress,\r\n List,\r\n Layout,\r\n Col,\r\n Tabs,\r\n Select,\r\n Icon,\r\n Dropdown,\r\n Tag,\r\n Avatar,\r\n Tooltip,\r\n Image,\r\n Divider,\r\n Anchor,\r\n Popconfirm,\r\n Popover,\r\n Spin,\r\n Pagination,\r\n} from 'ant-design-vue'\r\n\r\nimport 'ant-design-vue/dist/antd.css'\r\n\r\nexport function setupAntd(app: App) {\r\n app\r\n .use(Form)\r\n .use(Input)\r\n .use(Modal)\r\n .use(Table)\r\n .use(Menu)\r\n .use(Card)\r\n .use(Checkbox)\r\n .use(Radio)\r\n .use(Upload)\r\n .use(Button)\r\n .use(Switch)\r\n .use(Row)\r\n .use(Progress)\r\n .use(List)\r\n .use(Layout)\r\n .use(Col)\r\n .use(Tabs)\r\n .use(Icon)\r\n .use(Select)\r\n .use(Dropdown)\r\n .use(Tag)\r\n .use(Avatar)\r\n .use(Tooltip)\r\n .use(Image)\r\n .use(Divider)\r\n .use(Anchor)\r\n .use(Popconfirm)\r\n .use(Popover)\r\n .use(Spin)\r\n .use(Pagination)\r\n}\r\n","/*\r\n * @Author: Kuiper\r\n * @Date: 2021-06-24 19:37:19\r\n */\r\nimport { App } from 'vue'\r\n\r\n// import { SvgIcon } from '/@/components/svg-icon'\r\n\r\n/**\r\n * 全局注册自定义组件\r\n * @param app\r\n */\r\nexport function setupCustomComponents(app: App) {\r\n // TODO\r\n console.log('setupCustomComponents', app)\r\n // app.component(SvgIcon.name, SvgIcon)\r\n}\r\n","/*\r\n * @Author: Kuiper\r\n * @Date: 2021-06-24 19:37:19\r\n */\r\nimport { App } from 'vue'\r\n\r\n/**\r\n * 注册全局方法\r\n * @param app\r\n */\r\nexport function setupGlobalMethods(app: App) {\r\n // TODO\r\n console.log('setupGlobalMethods', app)\r\n}\r\n","/*\r\n * @Author: Kuiper\r\n * @Date: 2021-08-20 18:14:29\r\n */\r\nimport { App } from 'vue'\r\nimport { Router } from 'vue-router'\r\nimport * as Sentry from '@sentry/vue'\r\nimport { Integrations } from '@sentry/tracing'\r\nimport pkg from '../../../package.json'\r\n\r\nexport function setupErrorHandle(app: App, router: Router) {\r\n if (import.meta.env.VITE_USE_SENTRY === 'false') return\r\n\r\n Sentry.init({\r\n app,\r\n dsn: 'https://689527d13092413eb47355a54615768f@o967152.ingest.sentry.io/5958016',\r\n release: `${pkg.name}@${pkg.version}`,\r\n integrations: [\r\n new Integrations.BrowserTracing({\r\n routingInstrumentation: Sentry.vueRouterInstrumentation(router),\r\n tracingOrigins: ['ccss.tv', 'v.ccss.tv', 'beta-webapp.skysrt.com', /^\\//],\r\n }),\r\n ],\r\n environment: process.env.NODE_ENV,\r\n // Set tracesSampleRate to 1.0 to capture 100%\r\n // of transactions for performance monitoring.\r\n // We recommend adjusting this value in production\r\n tracesSampleRate: 1.0,\r\n })\r\n\r\n app.provide('$sentry', Sentry)\r\n // app.config.globalProperties.$sentry = Sentry\r\n}\r\n\r\n////////////////使用//////////////\r\n// const $sentry: any = inject('$sentry')\r\n// setTimeout(() => {\r\n// $sentry && $sentry.captureException(new Error('第5个错误'))\r\n// }, 5000)\r\n"],"names":["defineComponent","name","setup","showUi","ref","allargs","String","window","document","location","href","split","value","query","GetUrlQueryString","specifyParams","name2","url","toLowerCase","reg","RegExp","search","r","substr","indexOf","match","decodeURIComponent","GetUrlParam","log","replace","navigator","userAgent","el","createElement","type","charset","async","toString","src","test","language","body","appendChild","scriptRel","seen","__vitePreload","baseModule","deps","relList","supports","Promise","all","map","dep","isCss","endsWith","cssSelector","querySelector","link","rel","as","crossOrigin","head","res","rej","addEventListener","then","modules","Object","keys","forEach","key","mod","default","isArray","basicRoutes","path","component","meta","title","isMine","children","requireAuth","router","createRouter","history","createWebHashHistory","routes","strict","scrollBehavior","left","top","[object Object]","state2","msg","val","store2","item","commit","condition","context","length","space_id","error","n","pow","Math","ceil","total","format","len","fileLengthFormat","fixNumber","info","spaceId","size","currentSpaceItem","total_volume","remain_volume","used","percent_volume","tmpToken","showUploadList","noUpload","batchDown","selectedItem","selectedRow","currentSpaceId","state","list","space","__spreadValues","namespaced","backdoor","system","prototype","call","is","isDef","isUnDef","isNull","pendingMap","Map","getPendingUrl","config","method","join","removePending","cancelToken","axios","CancelToken","cancel","has","set","isFunction","clear","get","delete","ResultEnum","ResultEnum2","RequestEnum","RequestEnum2","ContentTypeEnum","ContentTypeEnum2","options","axiosInstance","create","setupInterceptors","transform","this","transform2","createAxios","headers","assign","defaults","getTransform","requestInterceptors","requestInterceptorsCatch","responseInterceptors","responseInterceptorsCatch","axiosCanceler","AxiosCanceler","interceptors","request","use","ignoreCancelToken","requestOptions","addPending","response","params","formData","FormData","data","Array","append","file","filename","__spreadProps","Content-type","FORM_DATA","FORM_URLENCODED","Reflect","toUpperCase","GET","qs","stringify","arrayFormat","conf","cloneDeep","opt","beforeRequestHook","requestCatchHook","transformRequestHook","supportFormData","resolve","reject","ret","err","Error","catch","e","message","warn","VITE_GLOB_APP_SHORT_NAME","getAppEnvConfig","getCommonStoragePrefix","pkg","ENV_NAME","ENV","VITE_GLOB_APP_TITLE","VITE_GLOB_API_URL","VITE_GLOB_API_URL_PREFIX","VITE_GLOB_UPLOAD_URL","iconType","content","isString","deleteProperty","centered","icon","getIcon","renderContent","Modal","confirm","okText","success","createModalOptions","warning","notification","placement","duration","cacheCipher","iv","parse","mode","ECB","padding","pkcs7","cipherText","encrypt","getOptions","decrypt","UTF8","createStorage","prefixKey","storage","sessionStorage","timeout","hasEncrypt","some","encryption","AesEncryption","key2","expire","stringData","JSON","time","Date","now","isNullOrUnDef","getTime","stringifyValue","encryptByAES","setItem","getKey","def","getItem","decVal","decryptByAES","remove","removeItem","createOptions","getStorageShortName","alive","cache","expires","timeoutId","setTimeout","k","clearTimeout","CacheTypeEnum","CacheTypeEnum2","ls","localStorage","createLocalStorage","ss","createSessionStorage","localMemory","Memory","sessionMemory","immediate","toRaw","getCache","ContentEnum","ContentEnum2","ThemeEnum","ThemeEnum2","SettingButtonPositionEnum","SettingButtonPositionEnum2","SessionTimeoutProcessingEnum","SessionTimeoutProcessingEnum2","PermissionModeEnum","PermissionModeEnum2","RouterTransitionEnum","RouterTransitionEnum2","newValue","oldValue","clearLocal","clearSession","clearAll","localCache","sessionCache","resetCache","initPersistentMemory","LIGHT","setting","showSettingButton","showDarkModeToggle","settingButtonPosition","AUTO","permissionMode","ROLE","permissionCacheType","LOCAL","sessionTimeoutProcessing","ROUTE_JUMP","themeColor","grayMode","colorWeak","fullContent","contentMode","FULL","showLogo","showFooter","headerSetting","bgColor","fixed","show","theme","useLockPage","showFullScreen","showDoc","showNotice","showSearch","multiTabsSetting","canDrag","showQuick","showRedo","showFold","transitionSetting","enable","basicTransition","FADE_SIDE","openPageLoading","openNProgress","openKeepAlive","lockTime","showBreadCrumb","showBreadCrumbIcon","useErrorHandle","useOpenBackTop","canEmbedIFramePage","closeMessageOnSwitch","removeAllHttpPending","idleLogoutSwitch","projectSetting","isLocal","Persistent","getLocal","getSession","target","isObject","deepMerge","restful","_t","_isAMomentObject","trim","globSetting","apiUrl","shortName","urlPrefix","uploadUrl","useGlobSetting","createMessage","createErrorModal","Message","createConfirm","createSuccessModal","createInfoModal","createWarningModal","isTransformResponse","isReturnNativeResponse","code","result","SUCCESS","timeoutMsg","TIMEOUT","errorMessageMode","joinPrefix","joinParamsToUrl","formatDate","joinTime","joinTimestamp","formatRequestDate","baseUrl2","obj","parameters","encodeURIComponent","setObjToUrlParams","token","getToken","Authorization","authenticationScheme","defHttp","VAxios","Content-Type","Api","Api2","baseUrl","CLIENT_ID_COOCAA","SHARE_DISK_CODE_KEY","$chars","maxPos","pwd","i","charAt","floor","random","randomString","paramsMap","round","client_id","sign","sort","slice","md5","iconWidth","iconHeight","width","height","codeKey","signParam","processURL","post","content-type","responseType","mobile","iconCapcha","mobile_email","capcha","captcha","mac","model","core","TestApi","channelName","role","uid","expireTimeInSeconds","TestMockApi","getCaptchaApi","queryData","accessToken","access_token","ak","requireAccInfo","open_id","user_name","nick_name","avatar","nickname","loginParams","Login","loginApi","account","userInfo","lastTime","currentTeamRoleId","currentProjectRoleId","user","allModules","namespace","imported","store","createStore","mutations","plugins","createPersistedState","paths","router2","beforeEach","to","from","next","user2","updateSW","onNeedRefresh","onOfflineReady","wb","Workbox","scope","event","isUpdate","reload","register","reloadPage","__async","registerSW","pageNo","pageSize","array","offset","Number","authorization","userId","username","realName","desc","password","roles","roleName","id","screen_name","mac_addr","screen_model","active_time","business_id","tel","business_name","member_num","device_num","email","create_time","describe","active","checkUser","find","resultError","_username","resultSuccess","getRequestToken","getResults","page","pageData","pagination","items","mockModules","includes","push","app","createApp","App","Form","Input","Table","Menu","Card","Checkbox","Radio","Upload","Button","Switch","Row","Progress","List","Layout","Col","Tabs","Icon","Select","Dropdown","Tag","Avatar","Tooltip","Image","Divider","Anchor","Popconfirm","Popover","Spin","Pagination","isReady","dsn","release","integrations","Integrations","BrowserTracing","routingInstrumentation","Sentry.vueRouterInstrumentation","tracingOrigins","environment","tracesSampleRate","provide","Sentry","mount","bootstrap"],"mappings":"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"}