{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/store/index.ts","webpack:///./src/layout/components/TheSidebar.vue?d659","webpack:///./src/api/session/right.ts","webpack:///./src/service/session/permission.ts","webpack:///./src/layout/components/TheHeader.vue?3b59","webpack:///./src/api/config.ts","webpack:///./src/store/config.ts","webpack:///./src/api/session/user.ts","webpack:///./src/service/session/auth.ts","webpack:///./src/router/plugins.ts","webpack:///./src/layout/Index.vue?0e8a","webpack:///./src/layout/components/TheSidebar.vue?39e9","webpack:///./src/layout/components/sidebar.ts","webpack:///./src/layout/components/MenuItem.vue?a626","webpack:///./src/layout/components/MenuItem.vue","webpack:///./src/layout/components/MenuItem.vue?5d45","webpack:///./src/layout/components/MenuItem.vue?9ba7","webpack:///./src/layout/components/TheSidebar.vue","webpack:///./src/layout/components/TheSidebar.vue?c73e","webpack:///./src/layout/components/TheSidebar.vue?e433","webpack:///./src/layout/components/TheHeader.vue?10a7","webpack:///./src/layout/components/TheHeader.vue","webpack:///./src/layout/components/TheHeader.vue?a6a0","webpack:///./src/layout/components/TheHeader.vue?9458","webpack:///./src/layout/Index.vue","webpack:///./src/layout/Index.vue?5831","webpack:///./src/layout/Index.vue?3ebb","webpack:///./src/router/routes.ts","webpack:///./src/utils/random.ts","webpack:///./src/router/guards/auth.ts","webpack:///./src/api/session/index.ts","webpack:///./src/api/session/token.ts","webpack:///./src/service/session/token.ts","webpack:///./src/router/tools.ts","webpack:///./src/layout/components/TheHeader.vue?9352","webpack:///./src/App.vue?2397","webpack:///./src/router/guards/progress.ts","webpack:///./src/router/index.ts","webpack:///./src/layout/components/TheSidebar.vue?0eae","webpack:///./src/App.vue?f53c","webpack:///./src/App.vue","webpack:///./src/App.vue?0ab4","webpack:///./src/App.vue?bff9","webpack:///./src/directives/permission.ts","webpack:///./src/directives/index.ts","webpack:///./src/main.ts","webpack:///./src/utils/notification.ts","webpack:///./src/utils/http.ts","webpack:///./src/store/session.ts"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","installedCssChunks","jsonpScriptSrc","p","exports","module","l","e","promises","cssChunks","Promise","resolve","reject","href","fullhref","existingLinkTags","document","getElementsByTagName","tag","dataHref","getAttribute","rel","existingStyleTags","linkTag","createElement","type","onload","onerror","event","request","target","src","err","Error","code","parentNode","removeChild","head","appendChild","then","installedChunkData","promise","onScriptComplete","script","charset","timeout","nc","setAttribute","error","clearTimeout","chunk","errorType","realSrc","message","name","undefined","setTimeout","all","m","c","d","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","oe","console","jsonpArray","window","oldJsonpFunction","slice","use","store","Store","state","mutations","actions","ownRights","Set","allRightMap","Map","requiredMap","optionalMap","emptyMap","allNotNil","complement","isNil","allOwn","has","getRights","route","meta","rights","getStandardRights","compose","standard","toInvertPairs","toPairs","invertObj","hasRight","rightMap","getRight","need","Array","from","values","isArray","map","init","cleanOwnPermisson","fetchRight","add","addRights","required","optional","routes","clear","pre","child","merged","mergeDeepRight","set","concat","tmp","endsWith","getFullRight","a","includes","wrapObj","wrapStandard","mapwrapobj","wrapArray","mergeAll","typeSwitch","sub","rightCompletion","mapObjIndexed","subStanard","fetchConfigs","fetchConfig","putConfig","config","put","configs","this","dynamic","ConfigStore","preloadConfig","JSON","parse","forEach","updateConfig","getConfig","stringify","codeToken","fetchCaptcha","payload","captchaImage","login","el","persistence","token","validate","accessToken","refreshToken","loginSuccess","loginByStorage","to","re","comfirmLogout","logout","router","fetchUserInfo","user","username","updateUserInfo","registerHooks","render","_vm","_h","$createElement","_c","_self","attrs","staticRenderFns","class","$style","menu","defaultActive","collapse","text","primary","background","on","handleSelect","collapseInfo","icon","_v","_s","_l","collapseInfos","fold","unfold","chooseCollapseInfo","isHidden","hidden","isSub","children","chooseIcon","filterRoutes","testFn","deep","filter","anyPass","getRoutes","navTo","currentRoute","path","scopedSlots","_u","fn","title","proxy","component","$router","components","MenuItem","injectStyles","context","locals","header","handldBack","avatar","handleCommand","$route","back","command","immediate","TheSidebar","TheHeader","public","alias","withKey","randNum","min","max","Math","floor","random","randStr","tokens","join","randKey","keys","len","size","pow","QUERY_FROM","registerAuthHook","beforeEach","next","isAuthed","isRefreshTokenOk","refreshRes","query","fullPath","pass","matched","post","service","baseURL","headers","contentType","lower","toLocaleLowerCase","refreshAccessToken","defaults","transformRequest","STORAGE_KEY","REFRESH_ADVANCE_TIME","hasValidAccessToken","isValidToken","getAuthorizationHeader","triggerRefresh","Authorization","CheckLocalRefreshToken","updateTokens","updateAccessToken","updateRefreshToken","setTokenToSession","setTokenToLocal","RefreshAndStoreToken","RefreshToken","res","cleanTokens","cleanAccessToken","cleanRefreshToken","sessionStorage","removeItem","localStorage","accessExp","getTokenExpress","getTime","now","Date","edge","preRefresh","updateTokensByStorage","getTokenFromStorage","exp","isEffectivePayload","setItem","getItem","getChildren","hasChildren","addKey","getFullPath","lastIndexOf","registerProgressHooks","start","afterEach","done","onError","base","access","directive","productionTip","VueHtmlToPaperOptions","specs","styles","vue","h","$mount","notify","success","warning","alert","createAlertVNode","style","comfirm","confirm","prompt","requestInterceptor","requestErrorInterceptor","responseInterceptor","response","responseErrorInterceptor","status","interceptors","delete","SessionModule","role","sessionStore"],"mappings":"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","file":"js/app.459edc12.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded CSS chunks\n \tvar installedCssChunks = {\n \t\t\"app\": 0\n \t}\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t\"app\": 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"js/\" + ({}[chunkId]||chunkId) + \".\" + {\"chunk-0b61bb7a\":\"ad5e9e52\",\"chunk-137d298d\":\"301c56f8\",\"chunk-216c22c0\":\"134be40c\",\"chunk-5a32dabe\":\"f4d97eaf\",\"chunk-26db742f\":\"d1f72640\",\"chunk-2d0b1690\":\"248fdb88\",\"chunk-2d0b309a\":\"4b8679b7\",\"chunk-2d21a33b\":\"0a5faae2\",\"chunk-2d2304b4\":\"063ec550\",\"chunk-344f3bec\":\"379b1249\",\"chunk-371af7e3\":\"79477592\",\"chunk-3b3925c8\":\"6345cbc1\",\"chunk-492a4b28\":\"c928be42\",\"chunk-6505249a\":\"d88e1c59\",\"chunk-712f2df5\":\"8fe28d0f\",\"chunk-79430f20\":\"7f4978f5\",\"chunk-97c6cbe2\":\"2ff4f5a7\",\"chunk-172cd7a2\":\"ae0e8af4\",\"chunk-472d246b\":\"ed63de80\",\"chunk-29aedeca\":\"c87e2b11\",\"chunk-646197cc\":\"1ba5815c\",\"chunk-74f8ccb8\":\"0c1646af\",\"chunk-a527da50\":\"a83bada2\",\"chunk-01f8b7f8\":\"3dd3bd98\",\"chunk-1d2e61ba\":\"cf46d0e5\",\"chunk-0f5a84cb\":\"ea97d54b\",\"chunk-26c4f0f7\":\"4e8e0fa1\",\"chunk-4d041ee0\":\"89ddca0b\",\"chunk-5b3bf73b\":\"3ee6614c\",\"chunk-1175bef4\":\"c4fc6326\",\"chunk-3f405dce\":\"f9dee1d2\",\"chunk-7ae19d3e\":\"a466ad71\",\"chunk-b530f4fe\":\"383b2361\",\"chunk-d720ad32\":\"0becf1ca\",\"chunk-b23b6cf0\":\"6c0d9abc\",\"chunk-6889442e\":\"c28b266d\",\"chunk-a1811e3c\":\"1d8da9e9\",\"chunk-5f549f42\":\"59349334\",\"chunk-f5f39fb6\":\"415f4a4a\"}[chunkId] + \".js\"\n \t}\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar promises = [];\n\n\n \t\t// mini-css-extract-plugin CSS loading\n \t\tvar cssChunks = {\"chunk-0b61bb7a\":1,\"chunk-137d298d\":1,\"chunk-216c22c0\":1,\"chunk-5a32dabe\":1,\"chunk-26db742f\":1,\"chunk-344f3bec\":1,\"chunk-371af7e3\":1,\"chunk-3b3925c8\":1,\"chunk-492a4b28\":1,\"chunk-6505249a\":1,\"chunk-79430f20\":1,\"chunk-01f8b7f8\":1,\"chunk-0f5a84cb\":1,\"chunk-26c4f0f7\":1,\"chunk-4d041ee0\":1,\"chunk-5b3bf73b\":1,\"chunk-1175bef4\":1,\"chunk-3f405dce\":1,\"chunk-b23b6cf0\":1,\"chunk-6889442e\":1,\"chunk-a1811e3c\":1,\"chunk-5f549f42\":1,\"chunk-f5f39fb6\":1};\n \t\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n \t\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n \t\t\tpromises.push(installedCssChunks[chunkId] = new Promise(function(resolve, reject) {\n \t\t\t\tvar href = \"css/\" + ({}[chunkId]||chunkId) + \".\" + {\"chunk-0b61bb7a\":\"1cd48e8f\",\"chunk-137d298d\":\"65f383aa\",\"chunk-216c22c0\":\"b1d49875\",\"chunk-5a32dabe\":\"cc090f42\",\"chunk-26db742f\":\"182f565b\",\"chunk-2d0b1690\":\"31d6cfe0\",\"chunk-2d0b309a\":\"31d6cfe0\",\"chunk-2d21a33b\":\"31d6cfe0\",\"chunk-2d2304b4\":\"31d6cfe0\",\"chunk-344f3bec\":\"e2bafc77\",\"chunk-371af7e3\":\"faaf8d44\",\"chunk-3b3925c8\":\"5a3c0770\",\"chunk-492a4b28\":\"d8a3c943\",\"chunk-6505249a\":\"e2bafc77\",\"chunk-712f2df5\":\"31d6cfe0\",\"chunk-79430f20\":\"510f6906\",\"chunk-97c6cbe2\":\"31d6cfe0\",\"chunk-172cd7a2\":\"31d6cfe0\",\"chunk-472d246b\":\"31d6cfe0\",\"chunk-29aedeca\":\"31d6cfe0\",\"chunk-646197cc\":\"31d6cfe0\",\"chunk-74f8ccb8\":\"31d6cfe0\",\"chunk-a527da50\":\"31d6cfe0\",\"chunk-01f8b7f8\":\"a818c4ee\",\"chunk-1d2e61ba\":\"31d6cfe0\",\"chunk-0f5a84cb\":\"17c62815\",\"chunk-26c4f0f7\":\"17c62815\",\"chunk-4d041ee0\":\"52f3e102\",\"chunk-5b3bf73b\":\"00d53ef9\",\"chunk-1175bef4\":\"1972f3bd\",\"chunk-3f405dce\":\"17c62815\",\"chunk-7ae19d3e\":\"31d6cfe0\",\"chunk-b530f4fe\":\"31d6cfe0\",\"chunk-d720ad32\":\"31d6cfe0\",\"chunk-b23b6cf0\":\"060f7204\",\"chunk-6889442e\":\"73dfb508\",\"chunk-a1811e3c\":\"d72ac0a1\",\"chunk-5f549f42\":\"f4358bb0\",\"chunk-f5f39fb6\":\"9e0e8a0b\"}[chunkId] + \".css\";\n \t\t\t\tvar fullhref = __webpack_require__.p + href;\n \t\t\t\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n \t\t\t\tfor(var i = 0; i < existingLinkTags.length; i++) {\n \t\t\t\t\tvar tag = existingLinkTags[i];\n \t\t\t\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n \t\t\t\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return resolve();\n \t\t\t\t}\n \t\t\t\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n \t\t\t\tfor(var i = 0; i < existingStyleTags.length; i++) {\n \t\t\t\t\tvar tag = existingStyleTags[i];\n \t\t\t\t\tvar dataHref = tag.getAttribute(\"data-href\");\n \t\t\t\t\tif(dataHref === href || dataHref === fullhref) return resolve();\n \t\t\t\t}\n \t\t\t\tvar linkTag = document.createElement(\"link\");\n \t\t\t\tlinkTag.rel = \"stylesheet\";\n \t\t\t\tlinkTag.type = \"text/css\";\n \t\t\t\tlinkTag.onload = resolve;\n \t\t\t\tlinkTag.onerror = function(event) {\n \t\t\t\t\tvar request = event && event.target && event.target.src || fullhref;\n \t\t\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + request + \")\");\n \t\t\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n \t\t\t\t\terr.request = request;\n \t\t\t\t\tdelete installedCssChunks[chunkId]\n \t\t\t\t\tlinkTag.parentNode.removeChild(linkTag)\n \t\t\t\t\treject(err);\n \t\t\t\t};\n \t\t\t\tlinkTag.href = fullhref;\n\n \t\t\t\tvar head = document.getElementsByTagName(\"head\")[0];\n \t\t\t\thead.appendChild(linkTag);\n \t\t\t}).then(function() {\n \t\t\t\tinstalledCssChunks[chunkId] = 0;\n \t\t\t}));\n \t\t}\n\n \t\t// JSONP chunk loading for javascript\n\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n \t\t\t// a Promise means \"currently loading\".\n \t\t\tif(installedChunkData) {\n \t\t\t\tpromises.push(installedChunkData[2]);\n \t\t\t} else {\n \t\t\t\t// setup Promise in chunk cache\n \t\t\t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t\t\t});\n \t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n \t\t\t\t// start chunk loading\n \t\t\t\tvar script = document.createElement('script');\n \t\t\t\tvar onScriptComplete;\n\n \t\t\t\tscript.charset = 'utf-8';\n \t\t\t\tscript.timeout = 120;\n \t\t\t\tif (__webpack_require__.nc) {\n \t\t\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t\t\t}\n \t\t\t\tscript.src = jsonpScriptSrc(chunkId);\n\n \t\t\t\t// create error before stack unwound to get useful stacktrace later\n \t\t\t\tvar error = new Error();\n \t\t\t\tonScriptComplete = function (event) {\n \t\t\t\t\t// avoid mem leaks in IE.\n \t\t\t\t\tscript.onerror = script.onload = null;\n \t\t\t\t\tclearTimeout(timeout);\n \t\t\t\t\tvar chunk = installedChunks[chunkId];\n \t\t\t\t\tif(chunk !== 0) {\n \t\t\t\t\t\tif(chunk) {\n \t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n \t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n \t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n \t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n \t\t\t\t\t\t\terror.type = errorType;\n \t\t\t\t\t\t\terror.request = realSrc;\n \t\t\t\t\t\t\tchunk[1](error);\n \t\t\t\t\t\t}\n \t\t\t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t\t\t}\n \t\t\t\t};\n \t\t\t\tvar timeout = setTimeout(function(){\n \t\t\t\t\tonScriptComplete({ type: 'timeout', target: script });\n \t\t\t\t}, 120000);\n \t\t\t\tscript.onerror = script.onload = onScriptComplete;\n \t\t\t\tdocument.head.appendChild(script);\n \t\t\t}\n \t\t}\n \t\treturn Promise.all(promises);\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/bmgl/\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([0,\"chunk-vendors\"]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","import Vue from 'vue'\r\nimport Vuex from 'vuex'\r\n\r\nVue.use(Vuex)\r\n\r\nexport const store = new Vuex.Store({\r\n state: {},\r\n mutations: {},\r\n actions: {},\r\n modules: {}\r\n})\r\n","export { default } from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-0-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-0-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-0-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-0-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TheSidebar.vue?vue&type=style&index=0&lang=scss&module=true&\"; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-0-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-0-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-0-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-0-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TheSidebar.vue?vue&type=style&index=0&lang=scss&module=true&\"","import { axios } from '@/utils/http'\r\n\r\nexport async function get() {\r\n const { data } = await axios.get(`session/right`)\r\n return data as string[]\r\n}\r\n","/**\r\n * 1. 每个页面存在必需权限和可选权限, 不满足必需权限的页面无法访问\r\n * 2. 每个页面继承父级页面的必需权限\r\n * 3. 组件内使用 v-permission 检测的权限必须位于页面的权限表中\r\n * 4. 权限可以被重命名, 省略 module 时的自动补全被视为隐性重命名\r\n * 5. 设置为 public 的页面及其子页面会跳过权限检查, 但在页面内依然可以使用 v-permission\r\n *\r\n * rights: {\r\n * module: 'moduleA', // if right not include '/', it will wrap with module/right\r\n * required: [\r\n * 'foo', // moduleA/foo\r\n * 'moduleB/bar' // moduleB/bar\r\n * ],\r\n * optional: {\r\n * 'module/foo': 'bar', // v-premission='bar' Yes, v-premission='module/foo' No!\r\n * [MyModule.foo]: 'foo' // recommend\r\n * }\r\n * }\r\n *\r\n * right: ['moduleA/foo', 'moduleB/bar'] // if right is array or string, they are required\r\n */\r\n\r\nimport {\r\n all,\r\n complement,\r\n compose,\r\n concat,\r\n map,\r\n mapObjIndexed,\r\n mergeAll,\r\n mergeDeepRight,\r\n isNil,\r\n invertObj,\r\n toPairs\r\n} from 'ramda'\r\nimport { RouteConfig } from 'vue-router'\r\nimport { routes } from '@/router/routes'\r\nimport { get } from '@/api/session/right'\r\nimport { notify } from '@/utils/notification'\r\nimport { AnyObject } from '@/models/helpers/common'\r\nimport { hasChildren, getChildren } from '@/router/tools'\r\n\r\n/** Route.meta.rights */\r\ntype Rights =\r\n | string\r\n | string[]\r\n | {\r\n module?: string\r\n required?: SubRight\r\n optional?: SubRight\r\n }\r\n\r\ntype SubRight = string | string[] | AnyObject | undefined\r\n\r\ntype Standardization = {\r\n required: AnyObject\r\n optional: AnyObject\r\n}\r\n\r\n/** key -> rename -> right */\r\ntype RightMap = Map\r\ntype RenameMap = Map\r\n\r\nconst ownRights = new Set()\r\nconst allRightMap: RightMap = new Map()\r\nconst requiredMap: RightMap = new Map()\r\nconst optionalMap: RightMap = new Map()\r\n\r\n// helpers\r\nconst emptyMap = new Map()\r\nconst allNotNil = all(complement(isNil))\r\nconst allOwn = all(ownRights.has.bind(ownRights))\r\n/** right -> rename, need invert */\r\nconst getRights = (route: RouteConfig): Rights => route!.meta!.rights || {}\r\nconst getStandardRights = compose(standard, getRights)\r\nconst toInvertPairs = compose(toPairs, invertObj)\r\n\r\n/**\r\n * 检查是否拥有访问页面的所有必需权限\r\n * @param key route.meta.key\r\n */\r\nexport function hasRight(key: string): boolean\r\n/**\r\n * 检查是否拥有页面的某权限\r\n * @param key route.meta.key\r\n * @param rights 权限名\r\n */\r\nexport function hasRight(key: string, rights: string | string[]): boolean\r\nexport function hasRight(key: string, rights?: string | string[]) {\r\n if (!requiredMap.has(key)) return false\r\n\r\n const rightMap = requiredMap.get(key) || emptyMap\r\n const getRight = rightMap.get.bind(rightMap)\r\n\r\n const need = isNil(rights)\r\n ? Array.from(rightMap.values())\r\n : Array.isArray(rights)\r\n ? map(getRight, rights)\r\n : [getRight(rights)]\r\n\r\n return allNotNil(need) && allOwn(need as string[])\r\n}\r\n\r\nexport async function init() {\r\n cleanOwnPermisson()\r\n const rights = await fetchRight()\r\n map(ownRights.add.bind(ownRights), rights)\r\n addRights({ required: {}, optional: {} })(routes as any)\r\n}\r\n\r\n/**\r\n * 清空当前账号的权限信息\r\n */\r\nexport function cleanOwnPermisson() {\r\n ownRights.clear()\r\n}\r\n\r\nasync function fetchRight() {\r\n try {\r\n return await get()\r\n } catch (e) {\r\n notify('获取权限信息失败, 请刷新页面或联系管理员', e)\r\n return []\r\n }\r\n}\r\n\r\nfunction addRights(pre: Standardization) {\r\n // TODO testable\r\n return map((child: RouteConfig) => {\r\n const rights = getStandardRights(child)\r\n const merged = mergeDeepRight(pre, rights) as Standardization\r\n\r\n const required = toInvertPairs(merged.required)\r\n const optional = toInvertPairs(merged.required)\r\n requiredMap.set(child!.meta!.key, new Map(required))\r\n optionalMap.set(child!.meta!.key, new Map(optional))\r\n allRightMap.set(child!.meta!.key, new Map(concat(optional, required)))\r\n\r\n if (hasChildren(child)) addRights(merged)(getChildren(child))\r\n })\r\n}\r\n\r\n/**\r\n * 格式化权限表, 并补全 module\r\n * @param rights 未格式化的权限表\r\n */\r\nexport function standard(rights: Rights): Standardization {\r\n // TODO: too long! split it\r\n const tmp = (rights as any).module\r\n const module = tmp ? (tmp.endsWith('/') ? tmp : tmp.concat('/')) : ''\r\n const getFullRight = (a: string) => (a.includes('/') ? a : module.concat(a))\r\n\r\n const wrapObj = (value: string) => ({ [value]: value })\r\n const wrapStandard = (required: AnyObject) => ({ required, optional: {} })\r\n const mapwrapobj = map(wrapObj)\r\n const wrapArray = compose(mergeAll, mapwrapobj)\r\n const typeSwitch = (sub: SubRight) =>\r\n typeof sub === 'string'\r\n ? wrapObj(sub)\r\n : Array.isArray(sub)\r\n ? wrapArray(sub)\r\n : sub || {}\r\n\r\n const rightCompletion = compose(\r\n invertObj,\r\n mapObjIndexed(getFullRight),\r\n invertObj\r\n )\r\n const subStanard = compose(rightCompletion, typeSwitch)\r\n\r\n if (typeof rights === 'string') {\r\n rights = wrapStandard({ [rights]: rights })\r\n }\r\n\r\n if (Array.isArray(rights)) {\r\n rights = compose(\r\n wrapStandard,\r\n mergeAll,\r\n map((a: string) => ({ [a]: a }))\r\n )(rights)\r\n }\r\n\r\n return {\r\n required: subStanard(rights.required),\r\n optional: subStanard(rights.optional)\r\n }\r\n}\r\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"header\":\"TheHeader_header_3Of4R\",\"avatar\":\"TheHeader_avatar_1SExE\"};","import { axios } from '@/utils/http'\r\nimport { Config } from '@/models/config'\r\n\r\nexport async function fetchConfigs(): Promise {\r\n const { data } = await axios.get(`Configs`)\r\n return data\r\n}\r\n\r\nexport async function fetchConfig(key: string): Promise {\r\n const { data } = await axios.get(`Configs/${key}`)\r\n return data\r\n}\r\n\r\nexport async function putConfig(config: Config): Promise {\r\n const { data } = await axios.put(`Configs/${config.key}`, config)\r\n return data\r\n}\r\n","import { fetchConfig, fetchConfigs, putConfig } from '@/api/config'\r\nimport { store } from '@/store'\r\nimport { Config } from '@/models/config'\r\nimport { getModule, Module, Mutation, VuexModule } from 'vuex-module-decorators'\r\n\r\n@Module({ name: 'Config', dynamic: true, store })\r\nclass ConfigModule extends VuexModule {\r\n configs: Record = {}\r\n\r\n @Mutation\r\n updateConfig(config: Config) {\r\n this.configs = {\r\n ...this.configs,\r\n [config.key]: config.value\r\n }\r\n }\r\n}\r\n\r\nexport const ConfigStore = getModule(ConfigModule)\r\n\r\nexport async function preloadConfig(): Promise {\r\n try {\r\n const configs = await fetchConfigs()\r\n configs\r\n .map(({ key, value }) => ({ key, value: JSON.parse(value) }))\r\n .forEach(config => ConfigStore.updateConfig(config))\r\n } catch (e) {\r\n // todo\r\n }\r\n}\r\n\r\nexport async function getConfig(\r\n key: string\r\n): Promise {\r\n if (ConfigStore.configs[key]) {\r\n return ConfigStore.configs[key] as RType\r\n }\r\n\r\n try {\r\n const config = await fetchConfig(key)\r\n const value = JSON.parse(config.value)\r\n ConfigStore.updateConfig({ key, value })\r\n return value\r\n } catch (e) {\r\n return null\r\n }\r\n}\r\n\r\nexport async function updateConfig(key: string, value: any) {\r\n try {\r\n const config = {\r\n key,\r\n value: JSON.stringify(value)\r\n }\r\n await putConfig(config)\r\n ConfigStore.updateConfig({ key, value })\r\n } catch (e) {\r\n // TODO\r\n }\r\n}\r\n","import { axios } from '@/utils/http'\r\nimport { UserInfo } from '@/models/session/user'\r\n\r\nexport async function get() {\r\n const { data } = await axios.get(`session/user`)\r\n return data as UserInfo\r\n}\r\n","import { isNil } from 'ramda'\r\nimport { ElForm } from 'element-ui/types/form'\r\nimport { post, get, del } from '@/api/session'\r\nimport { get as getUser } from '@/api/session/user'\r\nimport { router } from '@/router'\r\nimport { sessionStore as store } from '@/store/session'\r\nimport { updateTokens, cleanTokens, updateTokensByStorage } from './token'\r\nimport { init as initPermission, cleanOwnPermisson } from './permission'\r\nimport { notify, alert, comfirm } from '@/utils/notification'\r\nimport { BasicLoginToken } from '@/models/session'\r\nimport { Nilable } from '@/models/helpers/common'\r\n\r\nlet codeToken: Nilable = null\r\n\r\nexport async function fetchCaptcha() {\r\n try {\r\n const payload = await get()\r\n codeToken = payload.codeToken\r\n return `data:image/png;base64,${payload.captchaImage}`\r\n } catch (e) {\r\n notify(`获取验证码失败`, e)\r\n return ``\r\n }\r\n}\r\n\r\ntype form = BasicLoginToken & { persistence: boolean }\r\nexport async function login({ persistence, ...token }: form, el?: ElForm) {\r\n if (isNil(codeToken)) {\r\n alert('请手动刷新验证码', new Error())\r\n return false\r\n }\r\n\r\n try {\r\n if (el) await el.validate()\r\n } catch (e) {\r\n return false\r\n }\r\n\r\n try {\r\n const { accessToken, refreshToken } = await post({ ...token, codeToken })\r\n updateTokens(accessToken, refreshToken, persistence)\r\n } catch (e) {\r\n alert(`登录失败`, e)\r\n return false\r\n }\r\n\r\n await loginSuccess()\r\n return true\r\n}\r\n\r\nexport async function loginByStorage(to?: string) {\r\n const re = await updateTokensByStorage()\r\n if (re) await loginSuccess(to)\r\n return re\r\n}\r\n\r\nexport async function comfirmLogout() {\r\n try {\r\n await comfirm('真的要退出登录吗?', { type: 'warning' })\r\n logout()\r\n notify('您已安全退出系统')\r\n } catch (e) {\r\n // DO Nothing\r\n }\r\n}\r\n\r\nexport async function logout() {\r\n cleanTokens()\r\n cleanOwnPermisson()\r\n router.push('/login')\r\n}\r\n\r\nasync function loginSuccess(to = '/') {\r\n await Promise.all([fetchUserInfo(), initPermission()])\r\n router.push(to)\r\n notify(`欢迎回来, ${store.user.username}!`)\r\n}\r\n\r\nasync function fetchUserInfo() {\r\n try {\r\n const user = await getUser()\r\n store.updateUserInfo(user)\r\n return user\r\n } catch (e) {\r\n notify('获取用户信息失败', e)\r\n return null\r\n }\r\n}\r\n","import Component from 'vue-class-component'\r\n\r\n// Register the router hooks with their names\r\nComponent.registerHooks([\r\n 'beforeRouteEnter',\r\n 'beforeRouteLeave',\r\n 'beforeRouteUpdate' // for vue-router 2.2+\r\n])\r\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('el-container',{attrs:{\"direction\":\"horizontal\"}},[_c('el-aside',{attrs:{\"width\":\"\"}},[_c('TheSidebar')],1),_c('el-container',[_c('el-header',[_c('TheHeader')],1),_c('el-main',[_c('router-view'),_c('el-backtop')],1)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('el-menu',{class:_vm.$style.menu,attrs:{\"unique-opened\":\"\",\"default-active\":_vm.defaultActive,\"collapse\":_vm.collapse,\"text-color\":_vm.$style.text,\"active-text-color\":_vm.$style.primary,\"background-color\":_vm.$style.background},on:{\"select\":_vm.handleSelect}},[_c('el-menu-item',{attrs:{\"index\":\"collapse\"}},[_c('i',{class:_vm.collapseInfo.icon}),_c('span',[_vm._v(_vm._s(_vm.collapseInfo.text))])]),_vm._l((_vm.routes),function(route){return _c('MenuItem',{key:route.meta.key,attrs:{\"route\":route}})})],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { anyPass, compose, complement, filter, map } from 'ramda'\r\nimport { RouteConfig } from 'vue-router'\r\nimport { router } from '@/router'\r\nimport { routes } from '@/router/routes'\r\nimport { hasChildren, getChildren, getFullPath } from '@/router/tools'\r\nimport { FilterFn } from '@/models/helpers/function'\r\n\r\nconst collapseInfos = {\r\n fold: { icon: 'el-icon-s-fold', text: '收起' },\r\n unfold: { icon: 'el-icon-s-unfold', text: '展开' }\r\n}\r\n\r\nexport function chooseCollapseInfo(collapse: boolean) {\r\n return collapse ? collapseInfos.unfold : collapseInfos.fold\r\n}\r\n\r\nexport function isHidden(route: RouteConfig) {\r\n return !!route.meta && !!route.meta.hidden\r\n}\r\n\r\nexport function isSub(route: RouteConfig) {\r\n return !!route.children && !!route.children.length\r\n}\r\n\r\nexport function chooseIcon(route: RouteConfig) {\r\n return route.meta && route.meta.icon ? route.meta.icon : 'el-icon-document'\r\n}\r\n\r\nexport const filterRoutes: FilterFn = testFn => {\r\n const deep = (route: RouteConfig) => {\r\n const children = filterRoutes(testFn)(getChildren(route))\r\n return children.length ? { ...route, children } : route\r\n }\r\n\r\n return compose(filter(anyPass([hasChildren, testFn])), map(deep))\r\n}\r\n\r\nexport function getRoutes() {\r\n return filterRoutes(complement(isHidden))(routes)\r\n}\r\n\r\nexport function navTo(key: string) {\r\n if (key === router.currentRoute.meta!.key) return\r\n const path = getFullPath(key)\r\n router.push(path)\r\n}\r\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.isHidden)?_c('div'):(_vm.isSub)?_c('el-submenu',{attrs:{\"index\":_vm.route.meta.key},scopedSlots:_vm._u([{key:\"title\",fn:function(){return [_c('i',{class:_vm.icon}),_c('span',[_vm._v(_vm._s(_vm.route.meta.title))])]},proxy:true}])},_vm._l((_vm.route.children),function(child){return _c('MenuItem',{key:child.name,attrs:{\"route\":child}})}),1):_c('el-menu-item',{attrs:{\"index\":_vm.route.meta.key}},[_c('i',{class:_vm.icon}),_c('span',[_vm._v(_vm._s(_vm.route.meta.title))])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\r\nimport { Vue, Component, Prop } from 'vue-property-decorator'\r\nimport { RouteConfig } from 'vue-router'\r\nimport { chooseIcon, isHidden, isSub } from './sidebar'\r\n\r\n@Component({\r\n name: 'MenuItem'\r\n})\r\nexport default class MenuItem extends Vue {\r\n @Prop({ type: Object, required: true }) route!: RouteConfig\r\n\r\n get isHidden() {\r\n return isHidden(this.route)\r\n }\r\n\r\n get isSub() {\r\n return isSub(this.route)\r\n }\r\n\r\n get icon() {\r\n return chooseIcon(this.route)\r\n }\r\n}\r\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??ref--14-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MenuItem.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??ref--14-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MenuItem.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./MenuItem.vue?vue&type=template&id=ecb6e2c4&\"\nimport script from \"./MenuItem.vue?vue&type=script&lang=ts&\"\nexport * from \"./MenuItem.vue?vue&type=script&lang=ts&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\r\nimport { Vue, Component } from 'vue-property-decorator'\r\nimport { getRoutes, chooseCollapseInfo, navTo } from './sidebar'\r\nimport MenuItem from './MenuItem.vue'\r\n\r\n@Component({\r\n components: {\r\n MenuItem\r\n }\r\n})\r\nexport default class TheSidebar extends Vue {\r\n defaultActive = ''\r\n routes = getRoutes()\r\n collapse = false\r\n\r\n // TODO show title and user info\r\n\r\n get collapseInfo() {\r\n return chooseCollapseInfo(this.collapse)\r\n }\r\n\r\n mounted() {\r\n this.defaultActive = this.$router.currentRoute.path\r\n }\r\n\r\n handleSelect(key: string) {\r\n if (key === 'collapse') {\r\n this.collapse = !this.collapse\r\n } else {\r\n navTo(key) // or get route by emit?\r\n }\r\n }\r\n}\r\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??ref--14-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TheSidebar.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??ref--14-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TheSidebar.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./TheSidebar.vue?vue&type=template&id=b45ec0c2&\"\nimport script from \"./TheSidebar.vue?vue&type=script&lang=ts&\"\nexport * from \"./TheSidebar.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./TheSidebar.vue?vue&type=style&index=0&lang=scss&module=true&\"\n\n\n\n\nfunction injectStyles (context) {\n \n this[\"$style\"] = (style0.locals || style0)\n\n}\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n injectStyles,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{class:_vm.$style.header},[_c('el-page-header',{attrs:{\"content\":_vm.title},on:{\"back\":_vm.handldBack}}),_c('el-dropdown',{class:_vm.$style.avatar,on:{\"command\":_vm.handleCommand},scopedSlots:_vm._u([{key:\"dropdown\",fn:function(){return [_c('el-dropdown-menu',[_c('el-dropdown-item',{attrs:{\"command\":\"logout\"}},[_vm._v(\"退出登录\")])],1)]},proxy:true}])},[(_vm.avatar)?_c('el-avatar',{attrs:{\"src\":_vm.avatar}}):_c('el-avatar',{attrs:{\"icon\":\"el-icon-user-solid\"}})],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\r\nimport { Vue, Component, Watch } from 'vue-property-decorator'\r\nimport { sessionStore as store } from '@/store/session'\r\nimport { comfirmLogout } from '@/service/session/auth'\r\n\r\n@Component\r\nexport default class TheHeader extends Vue {\r\n title = ''\r\n\r\n get avatar() {\r\n return store.user.avatar\r\n }\r\n\r\n @Watch('$route', { immediate: true })\r\n handleRouteChange() {\r\n const title = this.$route.meta!.title\r\n this.title = title || process.env.VUE_APP_TITLE\r\n }\r\n\r\n handldBack() {\r\n // TODO handle back logic\r\n this.$router.back()\r\n }\r\n\r\n handleCommand(command: string) {\r\n switch (command) {\r\n case 'logout':\r\n comfirmLogout()\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n}\r\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??ref--14-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TheHeader.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??ref--14-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TheHeader.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./TheHeader.vue?vue&type=template&id=73b1ee74&\"\nimport script from \"./TheHeader.vue?vue&type=script&lang=ts&\"\nexport * from \"./TheHeader.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./TheHeader.vue?vue&type=style&index=0&lang=scss&module=true&\"\n\n\n\n\nfunction injectStyles (context) {\n \n this[\"$style\"] = (style0.locals || style0)\n\n}\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n injectStyles,\n null,\n null\n \n)\n\nexport default component.exports","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\r\nimport { Vue, Component } from 'vue-property-decorator'\r\nimport TheSidebar from './components/TheSidebar.vue'\r\nimport TheHeader from './components/TheHeader.vue'\r\n\r\n@Component({\r\n components: {\r\n TheSidebar,\r\n TheHeader\r\n }\r\n})\r\nexport default class Layout extends Vue {}\r\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??ref--14-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Index.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??ref--14-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Index.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./Index.vue?vue&type=template&id=74185860&\"\nimport script from \"./Index.vue?vue&type=script&lang=ts&\"\nexport * from \"./Index.vue?vue&type=script&lang=ts&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","import { map } from 'ramda'\r\nimport { RouteConfig } from 'vue-router'\r\nimport { addKey } from './tools'\r\nimport './plugins'\r\n\r\nimport Layout from '@/layout/Index.vue'\r\n\r\nconst routes: RouteConfig[] = [\r\n {\r\n path: '/',\r\n component: Layout,\r\n meta: { title: '我的', hidden: true },\r\n children: [\r\n {\r\n path: '',\r\n component: () => import('@/views/Home.vue'),\r\n meta: { title: '首页' }\r\n }\r\n ]\r\n },\r\n {\r\n path: '/',\r\n component: Layout,\r\n meta: { title: '系统管理', hidden: true },\r\n children: [\r\n {\r\n path: '',\r\n meta: { title: '用户管理' },\r\n component: () => import('@/views/Home.vue')\r\n },\r\n {\r\n path: '',\r\n meta: { title: '角色管理' },\r\n component: () => import('@/views/Home.vue')\r\n },\r\n {\r\n path: '',\r\n meta: { title: '权限分配' },\r\n component: () => import('@/views/Home.vue')\r\n }\r\n ]\r\n },\r\n {\r\n path: '/exam',\r\n component: Layout,\r\n meta: { title: '考试管理' },\r\n children: [\r\n {\r\n path: 'creater',\r\n meta: { title: '新建考试' },\r\n component: () => import('@/views/exam/Creater.vue')\r\n },\r\n {\r\n path: 'upload',\r\n meta: { title: '上传信息' },\r\n component: () => import('@/views/exam/Upload.vue')\r\n }\r\n ]\r\n },\r\n {\r\n path: '/print',\r\n component: Layout,\r\n meta: { title: '排考信息' },\r\n children: [\r\n {\r\n path: 'exam-download',\r\n meta: { title: '排考结果' },\r\n component: () => import('@/views/print/ExamDownload.vue')\r\n },\r\n {\r\n path: 'exam-profile',\r\n meta: { title: '考试概览' },\r\n component: () => import('@/views/print/ExamProfile.vue')\r\n },\r\n {\r\n path: 'exam-room-record',\r\n meta: { title: '打印考场记录' },\r\n component: () => import('@/views/print/ExamRecord.vue')\r\n },\r\n {\r\n path: 'exam-room-arrangement',\r\n meta: { title: '打印考场安排' },\r\n component: () => import('@/views/print/ExamRoomArrangement.vue')\r\n },\r\n {\r\n path: 'exam-room-stick',\r\n meta: { title: '打印考场门贴' },\r\n component: () => import('@/views/print/ExamRoomStick.vue')\r\n },\r\n {\r\n path: 'exam-room-profile',\r\n meta: { title: '打印考场概要' },\r\n component: () => import('@/views/print/ExamRoomProfile.vue')\r\n },\r\n {\r\n path: 'exam-seat-sticker',\r\n meta: { title: '打印座位贴纸' },\r\n component: () => import('@/views/print/ExamSeatSticker.vue')\r\n },\r\n {\r\n path: 'downLoadNoify',\r\n meta: { title: '下载监考通知' },\r\n component: () => import('@/views/print/downloadNotify.vue')\r\n }\r\n ]\r\n },\r\n {\r\n path: '/enroll-manage',\r\n component: Layout,\r\n meta: { title: '报名管理' },\r\n children: [\r\n {\r\n path: 'freeteacher',\r\n meta: { title: '免费师范生' },\r\n component: () => import('@/views/enroll/FreeTeacherManage.vue')\r\n },\r\n {\r\n path: 'art-student',\r\n meta: { title: '艺术类' },\r\n component: () => import('@/views/enroll/ArtManage.vue')\r\n },\r\n {\r\n path: 'upgraded-student',\r\n meta: { title: '专升本' },\r\n component: () => import('@/views/enroll/UpgradedManage.vue')\r\n },\r\n {\r\n path: 'taiwan-student/:id',\r\n meta: { title: '台湾地区入学', hidden: true },\r\n component: () => import('@/views/enroll/TaiwanStudentDetail.vue')\r\n },\r\n {\r\n path: 'taiwan-student',\r\n meta: { title: '台湾地区入学' },\r\n component: () => import('@/views/enroll/TaiwanStudentManage.vue')\r\n },\r\n {\r\n path: 'chongming-student',\r\n meta: { title: '崇明定向' },\r\n component: () => import('@/views/enroll/ChongmingStudentManage.vue')\r\n },\r\n {\r\n path: 'second-degree-student',\r\n meta: { title: '第二学位' },\r\n component: () => import('@/views/enroll/SecondDegreeStudentManage.vue')\r\n },\r\n {\r\n path: 'art-mail-report',\r\n meta: { title: '书法学邮寄登记' },\r\n component: () => import('@/views/enroll/ArtMailInfo.vue')\r\n },\r\n {\r\n path: 'others',\r\n meta: { title: '其他考试' },\r\n component: () => import('@/views/enroll/OtherManage.vue')\r\n },\r\n {\r\n path: 'enroll-config',\r\n meta: { title: '考试配置' },\r\n component: () => import('@/views/enroll/EnrollConfig.vue')\r\n }\r\n ]\r\n },\r\n {\r\n path: '/springexam',\r\n component: Layout,\r\n meta: { title: '春招考试管理' },\r\n children: [\r\n {\r\n path: 'exam-manage',\r\n meta: { title: '考试管理' },\r\n component: () => import('@/views/springExam/SpringExam.vue')\r\n },\r\n {\r\n path: 'student-manage',\r\n meta: { title: '学生管理' },\r\n component: () => import('@/views/springExam/SpringExamUser.vue')\r\n }\r\n ]\r\n },\r\n {\r\n path: '/mark-manage',\r\n component: Layout,\r\n meta: { title: '成绩管理' },\r\n children: [\r\n {\r\n path: 'upload',\r\n meta: { title: '上传成绩信息' },\r\n component: () => import('@/views/mark/UploadMarkExcel.vue')\r\n },\r\n {\r\n path: 'manage',\r\n meta: { title: '成绩信息管理' },\r\n component: () => import('@/views/mark/ManageMarkInfo.vue')\r\n },\r\n {\r\n path: 'config',\r\n meta: { title: '页面配置' },\r\n component: () => import('@/views/mark/MarkQueryConfig.vue')\r\n }\r\n ]\r\n },\r\n {\r\n path: '/student-photo',\r\n component: Layout,\r\n meta: { title: '新生照片管理' },\r\n children: [\r\n {\r\n path: 'manage',\r\n meta: { title: '照片管理' },\r\n component: () => import('@/views/studentPhoto/studentPhoto.vue')\r\n }\r\n ]\r\n },\r\n {\r\n path: '/login',\r\n meta: { public: true, hidden: true },\r\n component: () => import('@/views/auth/Login.vue')\r\n },\r\n {\r\n path: '/mark-query',\r\n meta: { public: true, hidden: true, title: '成绩查询' },\r\n component: () => import('@/views/mark/MarkQuery.vue')\r\n },\r\n {\r\n path: '/springexam-query',\r\n meta: { public: true, hidden: true, title: '春招选考试时间' },\r\n component: () => import('@/views/springExam/StdCheck.vue')\r\n },\r\n {\r\n path: '/',\r\n component: Layout,\r\n meta: { hidden: true },\r\n children: [\r\n {\r\n path: '401',\r\n meta: { title: '401' },\r\n component: () => import('@/views/error/401.vue')\r\n },\r\n {\r\n path: '*',\r\n alias: '404',\r\n meta: { title: '404' },\r\n component: () => import('@/views/error/404.vue')\r\n }\r\n ]\r\n }\r\n]\r\n\r\nconst withKey = (map(addKey(''), routes) as any) as RouteConfig[]\r\n\r\nexport { withKey as routes }\r\n","/**\r\n * 返回 [ min, max ] 之间的整数\r\n * @param min 包含的最小值\r\n * @param max 包含的最大值\r\n */\r\nexport function randNum(min: number, max: number) {\r\n return Math.floor(Math.random() * (max - min + 1) + min)\r\n}\r\n\r\nexport enum token {\r\n number = '0123456789',\r\n lowercase = 'abcdefghijklmnopqrstuvwxyz',\r\n uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXY',\r\n alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXY',\r\n all = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',\r\n enhance = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ~!@#$%^&*()-_=+[]{}|<>?'\r\n}\r\n\r\n/**\r\n * 返回随机字符串\r\n * @param length 字符串长度\r\n * @param tokens 字符串词库,未传入值时默认 number + alphabet\r\n */\r\nexport function randStr(length: number, tokens: token | string = token.all) {\r\n return [...Array(length)]\r\n .map(() => tokens[randNum(0, tokens.length)])\r\n .join('')\r\n}\r\n\r\n/**\r\n * 生成随机不重复的 Key\r\n */\r\nexport const randKey = (() => {\r\n const keys = new Set()\r\n let len = 5\r\n return () => {\r\n if (keys.size > 0.3 * Math.pow(10, len)) {\r\n len++\r\n }\r\n\r\n let key = randStr(len, token.all)\r\n while (keys.has(key)) {\r\n key = randStr(len, token.all)\r\n }\r\n keys.add(key)\r\n return `_${key}`\r\n }\r\n})()\r\n","import { and, any, or } from 'ramda'\r\nimport VueRouter from 'vue-router'\r\nimport { hasRight } from '@/service/session/permission'\r\nimport {\r\n hasValidAccessToken,\r\n CheckLocalRefreshToken,\r\n RefreshAndStoreToken\r\n} from '@/service/session/token'\r\n\r\nexport const QUERY_FROM = 'from'\r\n\r\nexport function registerAuthHook(router: VueRouter) {\r\n router.beforeEach(async (to, from, next) => {\r\n //检查当前accesstoken是否已过期\r\n let isAuthed = hasValidAccessToken()\r\n //过期则尝试使用refreshtoken换取新的token\r\n if (!isAuthed) {\r\n //检查refreshtoken是否过期\r\n const isRefreshTokenOk = CheckLocalRefreshToken()\r\n //未过期则换取新的accesstoken\r\n if (isRefreshTokenOk) {\r\n const refreshRes = await RefreshAndStoreToken()\r\n isAuthed = true\r\n if (!refreshRes) {\r\n next({ path: 'login', query: { [QUERY_FROM]: to.fullPath } })\r\n }\r\n }\r\n }\r\n const pass = or(\r\n any(route => route.meta.public, to.matched),\r\n and(isAuthed, hasRight(to.meta!.key))\r\n )\r\n\r\n if (pass) {\r\n next()\r\n } else if (isAuthed) {\r\n next('401')\r\n } else {\r\n next({ path: 'login', query: { [QUERY_FROM]: to.fullPath } })\r\n }\r\n })\r\n}\r\n","import { axios } from '@/utils/http'\r\nimport { Captcha, LoginToken } from '@/models/session'\r\nimport { Tokens } from '@/models/session/token'\r\n\r\n/**\r\n * 登入\r\n * @param token 用户名密码\r\n */\r\nexport async function post(token: LoginToken) {\r\n const { data } = await axios.post(`session`, token)\r\n return data as Tokens\r\n}\r\n\r\n/**\r\n * 刷新验证码\r\n */\r\nexport async function get() {\r\n const { data } = await axios.get(`session`)\r\n return data as Captcha\r\n}\r\n\r\n/**\r\n * 登出\r\n */\r\nexport async function del() {\r\n await axios.delete(`session`)\r\n}\r\n","import { get } from '@/utils/http'\r\nimport qs from 'qs'\r\nimport axios, { AxiosTransformer } from 'axios'\r\nimport { AccessTokenWrapper } from '@/models/session/token'\r\nconst service = axios.create({\r\n baseURL: process.env.VUE_APP_BASE_API,\r\n timeout: 600 * 1000,\r\n headers: { 'Content-Type': 'application/json' }\r\n})\r\n\r\nconst transformRequest: AxiosTransformer = (data, headers) => {\r\n const contentType = headers['Content-Type']\r\n if (typeof contentType !== 'string') return data\r\n\r\n const lower = contentType.toLocaleLowerCase()\r\n if (lower.includes('multipart/form-data')) return data\r\n if (lower.includes('application/json')) return JSON.stringify(data)\r\n return qs.stringify(data)\r\n}\r\nservice.defaults.transformRequest = transformRequest\r\n/**\r\n * 验证 Access Token 是否有效\r\n */\r\nexport async function CheckAccessToken() {\r\n await get('session/tokens')\r\n}\r\n\r\n/**\r\n * 刷新 Access Token\r\n * @param refreshToken\r\n */\r\nexport async function refreshAccessToken(refreshToken: string) {\r\n try {\r\n const { data } = await service.post('Session/tokens', refreshToken)\r\n return data as AccessTokenWrapper\r\n } catch (e) {\r\n return null\r\n }\r\n}\r\n","import { decode } from 'jsonwebtoken'\r\nimport { CheckAccessToken, refreshAccessToken } from '@/api/session/token'\r\nimport { sessionStore as store } from '@/store/session'\r\nimport { AnyObject } from '@/models/helpers/common'\r\n\r\nconst STORAGE_KEY = 'auth'\r\n\r\n/** 提前刷新时长 */\r\nconst REFRESH_ADVANCE_TIME = 60 * 1000\r\n\r\n/**\r\n * 判断当前 Access Token 是否有效\r\n */\r\nexport function hasValidAccessToken() {\r\n return isValidToken(store.accessToken)\r\n}\r\n\r\n/**\r\n * 获取 http 校验头, 并触发 token 更新\r\n */\r\nexport async function getAuthorizationHeader() {\r\n await triggerRefresh()\r\n return hasValidAccessToken()\r\n ? { Authorization: `Bearer ${store.accessToken}` }\r\n : null\r\n}\r\n\r\n/**\r\n * 判断本地是否存在RefreshToken及其有效性\r\n *\r\n * 存在且有效 返回 true 否则返回 false\r\n */\r\nexport function CheckLocalRefreshToken(): boolean {\r\n const refreshToken = store.refreshToken\r\n if (!refreshToken) return false\r\n return isValidToken(refreshToken)\r\n}\r\n\r\n/**\r\n * 更新 Token\r\n * @param accessToken\r\n * @param refreshToken\r\n * @param persistence 是否持久化\r\n */\r\nexport function updateTokens(\r\n accessToken: string,\r\n refreshToken?: string,\r\n persistence?: boolean\r\n) {\r\n store.updateAccessToken(accessToken)\r\n if (refreshToken) {\r\n store.updateRefreshToken(refreshToken)\r\n const payload = { token: refreshToken }\r\n persistence ? setTokenToSession(payload) : setTokenToLocal(payload)\r\n }\r\n}\r\n\r\n///根据RefreshToken换取AccessToken 并存到 sessionStorage\r\nexport async function RefreshAndStoreToken() {\r\n const RefreshToken = store.refreshToken\r\n if (RefreshToken != null) {\r\n const res = await refreshAccessToken(RefreshToken)\r\n if (res != null) {\r\n store.updateAccessToken(res.accessToken)\r\n return true\r\n } else return false\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\n/**\r\n * 清空 tokens 及其本地储存\r\n */\r\nexport function cleanTokens() {\r\n store.cleanAccessToken()\r\n store.cleanRefreshToken()\r\n sessionStorage.removeItem(STORAGE_KEY)\r\n localStorage.removeItem(STORAGE_KEY)\r\n}\r\n\r\n/**\r\n * 验证 Access Token 有效性\r\n */\r\nexport async function verify() {\r\n if (!hasValidAccessToken()) return false\r\n\r\n try {\r\n await CheckAccessToken()\r\n } catch (e) {\r\n return false\r\n }\r\n\r\n return true\r\n}\r\n\r\n/**\r\n * 判断是否需要刷新 Access Token\r\n * 已过期时等待刷新\r\n * 预刷新时不等待\r\n */\r\nasync function triggerRefresh() {\r\n if (!store.accessToken) return false\r\n\r\n const accessExp = getTokenExpress(store.accessToken).getTime()\r\n const now = new Date().getTime()\r\n\r\n if (!isValidToken(store.refreshToken)) return false\r\n if (!isValidToken(store.accessToken)) return await refreshToken()\r\n\r\n const edge = now + REFRESH_ADVANCE_TIME\r\n const preRefresh = hasValidAccessToken() && accessExp < edge\r\n if (preRefresh) refreshToken()\r\n return preRefresh\r\n}\r\n\r\n/**\r\n * 尝试从本地储存获取 Token\r\n */\r\nexport async function updateTokensByStorage() {\r\n const token = getTokenFromStorage()\r\n if (token) {\r\n store.updateRefreshToken(token)\r\n await refreshToken()\r\n }\r\n return !!token\r\n}\r\n\r\nasync function refreshToken() {\r\n try {\r\n const token = store.refreshToken\r\n const res = await refreshAccessToken(token)\r\n if (res != null) {\r\n store.updateAccessToken(res.accessToken)\r\n return true\r\n } else return false\r\n } catch (e) {\r\n return false\r\n }\r\n}\r\n\r\nfunction isValidToken(token: string) {\r\n const exp = getTokenExpress(token).getTime()\r\n const now = new Date().getTime()\r\n return now < exp\r\n}\r\n\r\nfunction getTokenExpress(token: string) {\r\n const data = (decode(token) || {}) as AnyObject\r\n const exp = 1000 * data.exp || 0\r\n return new Date(exp)\r\n}\r\n\r\ntype Payload = { token: string }\r\n\r\nfunction isEffectivePayload(payload: any): payload is Payload {\r\n if (!payload || !payload.token) return false\r\n return isValidToken(payload.token)\r\n}\r\n\r\nfunction setTokenToSession(payload: Payload) {\r\n sessionStorage.setItem(STORAGE_KEY, JSON.stringify(payload))\r\n}\r\n\r\nfunction setTokenToLocal(payload: Payload) {\r\n localStorage.setItem(STORAGE_KEY, JSON.stringify(payload))\r\n}\r\n\r\nfunction getTokenFromStorage() {\r\n const data =\r\n sessionStorage.getItem(STORAGE_KEY) || localStorage.getItem(STORAGE_KEY)\r\n if (!data) return null\r\n\r\n const payload = JSON.parse(data)\r\n if (!isEffectivePayload(payload)) {\r\n cleanTokens()\r\n return null\r\n }\r\n\r\n return payload.token\r\n}\r\n","import {\r\n anyPass,\r\n curry,\r\n compose,\r\n complement,\r\n map,\r\n isEmpty,\r\n filter\r\n} from 'ramda'\r\nimport { RouteConfig as Route } from 'vue-router'\r\nimport { randKey } from '@/utils/random'\r\nimport { ChainFn, TestFn, FilterFn } from '@/models/helpers/function'\r\n\r\nexport const getChildren = (route: Route) => route.children || []\r\n\r\nexport const hasChildren = compose(complement(isEmpty), getChildren)\r\n\r\n/**\r\n * 将 fn 作用于每个子节点\r\n * 先作用于父节点, 后作用于子节点\r\n * @param fn\r\n */\r\nexport const deepMap = (fn: ChainFn): ChainFn =>\r\n compose(map(_deepMap(fn)), map(fn))\r\n\r\nfunction _deepMap(fn: ChainFn) {\r\n return (route: Route) => ({\r\n ...route,\r\n children: deepMap(fn)(getChildren(route))\r\n })\r\n}\r\n\r\n/**\r\n * 过滤不满足以下要求的路由\r\n * 1. 自身不满足条件\r\n * 2. 所有子节点均不满足条件\r\n * @param testFn 测试函数\r\n */\r\nexport const deepFilter: FilterFn = testFn =>\r\n compose(filter(anyPass([hasChildren, testFn])), map(_deepFilter(testFn)))\r\n\r\nfunction _deepFilter(testFn: TestFn) {\r\n return (route: Route) => ({\r\n ...route,\r\n children: deepFilter(testFn)(getChildren(route))\r\n })\r\n}\r\n\r\n/**\r\n * 为每个路由添加以地址开头的唯一id\r\n */\r\nexport const addKey = curry(\r\n (pre: string, route: Route): Route => {\r\n const path = pre ? `${pre}/${route.path}` : route.path\r\n if (hasChildren(route)) {\r\n route.children = map(addKey(path), getChildren(route)) as any\r\n }\r\n return { ...route, meta: { ...route.meta, key: path + randKey() } }\r\n }\r\n)\r\n\r\n/**\r\n * TODO need refactor\r\n * @param key\r\n */\r\nexport const getFullPath = (key: string) => key.slice(0, key.lastIndexOf('_'))\r\n","export { default } from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-0-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-0-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-0-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-0-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TheHeader.vue?vue&type=style&index=0&lang=scss&module=true&\"; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-0-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-0-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-0-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-0-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TheHeader.vue?vue&type=style&index=0&lang=scss&module=true&\"","export { default } from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-0-0!../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-0-1!../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--8-oneOf-0-2!../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-0-3!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=style&index=0&lang=scss&module=true&\"; export * from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-0-0!../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-0-1!../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--8-oneOf-0-2!../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-0-3!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=style&index=0&lang=scss&module=true&\"","import VueRouter from 'vue-router'\r\nimport NProgress from 'nprogress'\r\nimport 'nprogress/nprogress.css'\r\n\r\nexport function registerProgressHooks(router: VueRouter) {\r\n router.beforeEach((to, from, next) => {\r\n NProgress.start()\r\n next()\r\n })\r\n\r\n router.afterEach(() => NProgress.done())\r\n router.onError(() => NProgress.done())\r\n}\r\n","import Vue from 'vue'\r\nimport VueRouter from 'vue-router'\r\nimport { routes } from './routes'\r\nimport { registerAuthHook } from './guards/auth'\r\nimport { registerProgressHooks } from './guards/progress'\r\n\r\nVue.use(VueRouter)\r\n\r\nconst router = new VueRouter({\r\n base: process.env.BASE_URL,\r\n routes\r\n})\r\n\r\nregisterProgressHooks(router)\r\nif (process.env.NODE_ENV !== 'development') {\r\n registerAuthHook(router)\r\n}\r\nexport { router }\r\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"primary\":\"#409eff\",\"background\":\"#24292e\",\"text\":\"#fff\",\"menu\":\"TheSidebar_menu_EnAzD\"};","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"app\"}},[_c('router-view')],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n\r\nimport { Vue, Component } from 'vue-property-decorator'\r\nimport { preloadConfig } from './store/config';\r\n\r\n@Component\r\nexport default class App extends Vue {\r\n async created() {\r\n await preloadConfig()\r\n }\r\n}\r\n","import mod from \"-!../node_modules/cache-loader/dist/cjs.js??ref--14-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/ts-loader/index.js??ref--14-3!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../node_modules/cache-loader/dist/cjs.js??ref--14-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/ts-loader/index.js??ref--14-3!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./App.vue?vue&type=template&id=50147236&\"\nimport script from \"./App.vue?vue&type=script&lang=ts&\"\nexport * from \"./App.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./App.vue?vue&type=style&index=0&lang=scss&module=true&\"\n\n\n\n\nfunction injectStyles (context) {\n \n this[\"$style\"] = (style0.locals || style0)\n\n}\n\n/* normalize component */\nimport normalizer from \"!../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n injectStyles,\n null,\n null\n \n)\n\nexport default component.exports","import { DirectiveFunction } from 'vue'\r\nimport { router } from '@/router'\r\nimport { hasRight } from '@/service/session/permission'\r\n\r\nexport const permission: DirectiveFunction = async (el, { value }) => {\r\n const key = router.currentRoute.meta!.key\r\n const access = await hasRight(key, value)\r\n if (!access && el.parentNode) {\r\n el.parentNode.removeChild(el)\r\n }\r\n}\r\n","import Vue from 'vue'\r\nimport { permission } from './permission'\r\n\r\nVue.directive('permission', permission)\r\n","import Vue from 'vue'\r\nimport App from '@/App.vue'\r\nimport { router } from '@/router'\r\nimport { store } from '@/store'\r\nimport '@/directives'\r\n\r\n// element ui\r\nimport Element from 'element-ui'\r\nimport '@/style/element.scss'\r\n\r\nimport VueHtmlToPaper from 'vue-html-to-paper'\r\n\r\nVue.config.productionTip = false\r\n\r\nconst VueHtmlToPaperOptions = {\r\n name: '_blank',\r\n specs: ['fullscreen=yes', 'titlebar=yes', 'scrollbars=yes'],\r\n styles: [\r\n 'https://cdnjs.cloudflare.com/ajax/libs/paper-css/0.3.0/paper.css',\r\n process.env.BASE_URL + 'print.css'\r\n ]\r\n}\r\n\r\nVue.use(Element)\r\nVue.use(VueHtmlToPaper, VueHtmlToPaperOptions)\r\n\r\nexport const vue = new Vue({\r\n router,\r\n store,\r\n render: h => h(App)\r\n}).$mount('#app')\r\n","import { Notification, Message, MessageBox } from 'element-ui'\r\nimport { ElNotificationComponent } from 'element-ui/types/notification'\r\nimport { ElMessageComponent } from 'element-ui/types/message'\r\nimport { vue } from '@/main'\r\n\r\n/**\r\n * 成功提示, 用于系统被动提示\r\n * @param title 提示信息\r\n */\r\nexport function notify(title: string): ElNotificationComponent\r\n/**\r\n * 失败提示, 用于系统被动提示\r\n * @param title 提示信息\r\n * @param error 错误\r\n */\r\nexport function notify(title: string, error: Error): ElNotificationComponent\r\nexport function notify(title: string, error?: Error) {\r\n return error instanceof Error\r\n ? Notification.error({ title, message: error.message })\r\n : Notification.success(title)\r\n}\r\n\r\nexport function warning(title: string, message: string) {\r\n Notification.error({ title, message })\r\n}\r\n/**\r\n * 成功提示, 用于操作后提示\r\n * @param title 提示信息\r\n */\r\nexport function alert(title: string): ElMessageComponent\r\n/**\r\n * 失败提示, 用于操作后提示\r\n * @param title 提示信息\r\n * @param error 错误\r\n */\r\nexport function alert(title: string, error: Error): ElMessageComponent\r\nexport function alert(title: string, error?: Error) {\r\n return error instanceof Error\r\n ? Message.error({ message: createAlertVNode(title, error.message) })\r\n : Message.success(title)\r\n}\r\n\r\nfunction createAlertVNode(title: string, message: string) {\r\n const h = vue.$createElement\r\n\r\n return h('div', { class: ['el-message__content'] }, [\r\n h('p', { class: ['el-alert__title', 'is-bold'] }, title),\r\n h(\r\n 'p',\r\n { class: ['el-alert__description'], style: { 'font-size': '12px' } },\r\n message\r\n )\r\n ])\r\n}\r\n\r\nexport const comfirm = MessageBox.confirm\r\nexport const prompt = MessageBox.prompt\r\n","import axios, {\r\n AxiosResponse,\r\n AxiosRequestConfig,\r\n AxiosError,\r\n AxiosTransformer\r\n} from 'axios'\r\nimport qs from 'qs'\r\nimport { logout } from '@/service/session/auth'\r\nimport { getAuthorizationHeader } from '@/service/session/token'\r\nimport { AsyncChainFn } from '@/models/helpers/function'\r\n\r\nconst requestInterceptor: AsyncChainFn = async request => ({\r\n ...request,\r\n headers: {\r\n ...request.headers,\r\n ...(await getAuthorizationHeader())\r\n }\r\n})\r\n\r\nconst requestErrorInterceptor = (error: any) => Promise.reject(error)\r\n\r\nconst responseInterceptor = (response: AxiosResponse) => response\r\n\r\nconst responseErrorInterceptor = (error: AxiosError) => {\r\n const res = error.response\r\n if (res) {\r\n switch (res.status) {\r\n case 400:\r\n case 412:\r\n error.message = res.data.Error\r\n break\r\n case 401: // unauthorized\r\n error.message = '登录失效,请重新登录'\r\n logout()\r\n break\r\n case 500: // 服务器内部错误\r\n case 502: // Bad Gateway\r\n case 504: // Gateway Time-out\r\n case 505: // HTTP Version not supported\r\n error.message = '服务器未响应,请联系管理员'\r\n break\r\n case 503: // 服务器繁忙\r\n error.message = '服务器繁忙,请重试'\r\n break\r\n case 501: // 请求方法不支持\r\n default:\r\n error.message = '系统异常,请联系管理员'\r\n break\r\n }\r\n } else if (error.message === 'Network Error') {\r\n error.message = '请检查网络连接是否正常'\r\n }\r\n return Promise.reject(error)\r\n}\r\n\r\nconst transformRequest: AxiosTransformer = (data, headers) => {\r\n const contentType = headers['Content-Type']\r\n if (typeof contentType !== 'string') return data\r\n\r\n const lower = contentType.toLocaleLowerCase()\r\n if (lower.includes('multipart/form-data')) return data\r\n if (lower.includes('application/json')) return JSON.stringify(data)\r\n return qs.stringify(data)\r\n}\r\n\r\n// Full config: https://github.com/axios/axios#request-config\r\nconst service = axios.create({\r\n baseURL: process.env.VUE_APP_BASE_API,\r\n timeout: 600 * 1000,\r\n headers: { 'Content-Type': 'application/json' }\r\n})\r\n\r\nservice.interceptors.request.use(requestInterceptor, requestErrorInterceptor)\r\nservice.interceptors.response.use(responseInterceptor, responseErrorInterceptor)\r\nservice.defaults.transformRequest = transformRequest\r\nexport const post = service.post\r\nexport const get = service.get\r\nexport const del = service.delete\r\nexport const put = service.put\r\nexport { service as axios }\r\n","import { Module, VuexModule, Mutation, getModule } from 'vuex-module-decorators'\r\nimport { store } from '@/store'\r\nimport { UserInfo } from '@/models/session/user'\r\n\r\n@Module({ name: 'Auth', dynamic: true, store })\r\nclass SessionModule extends VuexModule {\r\n accessToken = ''\r\n refreshToken = ''\r\n user: UserInfo = {\r\n username: null,\r\n avatar: null,\r\n role: null\r\n }\r\n\r\n @Mutation\r\n public updateAccessToken(token: string) {\r\n this.accessToken = token\r\n }\r\n\r\n @Mutation\r\n public updateRefreshToken(token: string) {\r\n this.refreshToken = token\r\n }\r\n\r\n @Mutation\r\n public cleanAccessToken() {\r\n this.accessToken = ''\r\n }\r\n\r\n @Mutation\r\n public cleanRefreshToken() {\r\n this.refreshToken = ''\r\n }\r\n\r\n @Mutation\r\n public updateUserInfo(user: UserInfo) {\r\n this.user = user\r\n }\r\n\r\n @Mutation\r\n public cleanUserInfo() {\r\n this.user = {\r\n username: null,\r\n avatar: null,\r\n role: null\r\n }\r\n }\r\n}\r\n\r\nexport const sessionStore = getModule(SessionModule)\r\n"],"sourceRoot":""}