{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/store/index.ts","webpack:///./src/App.vue?de30","webpack:///./src/router/guards/auth.ts","webpack:///./src/apis/session/index.ts","webpack:///./src/apis/session/token.ts","webpack:///./src/services/session/token.ts","webpack:///./src/router/routes.ts","webpack:///./src/router/guards/progress.ts","webpack:///./src/router/plugins.ts","webpack:///./src/router/index.ts","webpack:///./src/apis/index.ts","webpack:///./src/App.vue?c1ec","webpack:///./src/App.vue","webpack:///./src/main.ts","webpack:///./src/utils/notification.ts","webpack:///./src/store/session.ts","webpack:///./src/services/session/auth.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","QUERY_FROM","registerAuthHook","router","beforeEach","to","from","next","isAuthed","pass","matched","some","route","meta","public","path","query","fullPath","createSession","token","deleteSession","fetchCaptcha","fetchUserInfo","username","service","a","baseURL","headers","contentType","lower","toLocaleLowerCase","includes","JSON","stringify","fetchToken","refreshToken","post","defaults","transformRequest","STORAGE_KEY","REFRESH_ADVANCE_TIME","hasValidAccessToken","isValidToken","accessToken","getAuthorizationHeader","triggerRefresh","Authorization","updateTokens","persistence","updateAccessToken","updateRefreshToken","payload","setTokenToSession","setTokenToLocal","cleanTokens","cleanAccessToken","cleanRefreshToken","sessionStorage","removeItem","localStorage","accessExp","getTokenExpress","getTime","now","Date","edge","neeePreRefresh","updateTokensByStorage","getTokenFromStorage","res","exp","isEffectivePayload","setItem","getItem","parse","routes","component","registerProgressHooks","start","afterEach","done","onError","registerHooks","base","requestInterceptor","requestErrorInterceptor","responseInterceptor","response","responseErrorInterceptor","status","interceptors","del","delete","put","_vm","this","_h","$createElement","_c","_self","attrs","staticRenderFns","config","productionTip","map","vue","render","h","App","$mount","notify","title","success","alert","createAlertVNode","class","style","confirm","titleRaw","optionsRaw","messages","Array","isArray","vnode","baseOptions","options","prompt","SessionModule","user","dynamic","SessionStore","codeToken","getCaptcha","captchaImage","login","loginSuccess","loginByStorage","re","comfirmLogout","logout","getUserInfo","updateUserInfo"],"mappings":"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","file":"js/app.0152568c.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-19cc1e2a\":\"85da0e90\",\"chunk-78e2af0e\":\"93726627\",\"chunk-a00f6b4e\":\"67850a91\",\"chunk-c044bdd4\":\"f3c2bd3f\",\"chunk-07aff3ba\":\"8270d1db\",\"chunk-14b15784\":\"6f098313\",\"chunk-240b18dc\":\"5424c32d\",\"chunk-2aadc5ac\":\"a1dc8549\",\"chunk-45e31571\":\"d7afc8dc\",\"chunk-588d9e9e\":\"019150f6\",\"chunk-590ea4d2\":\"e47fa063\",\"chunk-4dbbeb11\":\"e5ec0e4c\",\"chunk-57996416\":\"ee858d5d\",\"chunk-476ba37a\":\"d7d33383\",\"chunk-e40243f8\":\"bea0c0c2\"}[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-19cc1e2a\":1,\"chunk-78e2af0e\":1,\"chunk-a00f6b4e\":1,\"chunk-c044bdd4\":1,\"chunk-07aff3ba\":1,\"chunk-14b15784\":1,\"chunk-240b18dc\":1,\"chunk-45e31571\":1,\"chunk-4dbbeb11\":1,\"chunk-57996416\":1,\"chunk-476ba37a\":1,\"chunk-e40243f8\":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-19cc1e2a\":\"8840a998\",\"chunk-78e2af0e\":\"93c13bfa\",\"chunk-a00f6b4e\":\"42594f00\",\"chunk-c044bdd4\":\"febef3d4\",\"chunk-07aff3ba\":\"ebbedf6f\",\"chunk-14b15784\":\"f9de0bdd\",\"chunk-240b18dc\":\"f9de0bdd\",\"chunk-2aadc5ac\":\"31d6cfe0\",\"chunk-45e31571\":\"f9de0bdd\",\"chunk-588d9e9e\":\"31d6cfe0\",\"chunk-590ea4d2\":\"31d6cfe0\",\"chunk-4dbbeb11\":\"244da1f2\",\"chunk-57996416\":\"5934bbf1\",\"chunk-476ba37a\":\"c24675cc\",\"chunk-e40243f8\":\"8125fd8d\"}[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 = \"/\";\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 * from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../node_modules/style-resources-loader/lib/index.js??ref--8-oneOf-1-4!../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&\"","import VueRouter from 'vue-router'\r\nimport { hasValidAccessToken, hasAccessToken } from '@/services/session/token'\r\n\r\nexport const QUERY_FROM = 'from'\r\n\r\nexport function registerAuthHook(router: VueRouter) {\r\n router.beforeEach((to, from, next) => {\r\n const isAuthed = hasValidAccessToken()\r\n const pass = to.matched.some(route => route.meta.public) || isAuthed\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 })\r\n}\r\n","import { post, del, get } from '@/apis'\r\nimport { Captcha, LoginToken } from '@/models/session'\r\nimport { Tokens } from '@/models/session/token'\r\nimport { UserInfo } from '@/models/session/user'\r\n\r\nexport async function createSession(token: LoginToken) {\r\n const { data } = await post(`student/session`, token)\r\n return data as Tokens\r\n}\r\n\r\nexport async function deleteSession() {\r\n await del(`student/session`)\r\n}\r\n\r\nexport async function fetchCaptcha() {\r\n const { data } = await get(`student/session`)\r\n return data as Captcha\r\n}\r\n\r\nexport async function fetchUserInfo() {\r\n const { data } = await get(`student/session/user`)\r\n return { username: data } as UserInfo\r\n}\r\n","import { get } from '@/apis'\r\nimport { AccessTokenWrapper } from '@/models/session/token'\r\nimport axios, { AxiosTransformer } from 'axios'\r\nimport qs from 'qs'\r\n\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/**\r\n * 验证 Access Token 是否有效\r\n */\r\nexport async function validateAccessToken() {\r\n await get('student/session/tokens')\r\n}\r\n\r\n/**\r\n * 刷新 Access Token\r\n * @param refreshToken\r\n */\r\nexport async function fetchToken(refreshToken: string) {\r\n try {\r\n const { data } = await service.post('student/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 { fetchUserInfo } from '@/apis/session'\r\nimport { fetchToken } from '@/apis/session/token'\r\nimport { SessionStore as store } from '@/store/session'\r\n\r\nconst STORAGE_KEY = 'SHNU_ZSB_AUTH'\r\n\r\n/** 提前刷新时长 */\r\nconst REFRESH_ADVANCE_TIME = 60 * 1000\r\n\r\nexport function hasAccessToken() {\r\n if (store.accessToken == '') {\r\n return false\r\n }\r\n else {\r\n return true\r\n }\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 * 更新 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/**\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 fetchUserInfo()\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 neeePreRefresh = hasValidAccessToken() && accessExp < edge\r\n if (neeePreRefresh) refreshToken()\r\n return neeePreRefresh\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 fetchToken(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 return true\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 Record\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 { RouteConfig } from 'vue-router'\r\n\r\nexport const routes: RouteConfig[] = [\r\n {\r\n path: '/enroll',\r\n component: () => import('@/views/Enroll/Index.vue')\r\n },\r\n {\r\n path: '/enroll/normal-student',\r\n component: () => import('@/views/Enroll/NormalStudent.vue')\r\n },\r\n {\r\n path: '/enroll/art-student',\r\n component: () => import('@/views/Enroll/ArtStudent.vue')\r\n },\r\n {\r\n path: '/enroll/art-mail',\r\n component: () => import('@/views/Enroll/ArtMail.vue')\r\n },\r\n {\r\n path: '/enroll/junior-to-higher-student',\r\n component: () => import('@/views/Enroll/JuniorToHigherStudent.vue')\r\n },\r\n {\r\n path: '/enroll/reselect-major',\r\n component: () => import('@/views/Enroll/ReselectMajor.vue')\r\n },\r\n {\r\n path: '/enroll/taiwan-student',\r\n component: () => import('@/views/Enroll/TaiwanStudent.vue')\r\n },\r\n {\r\n path: '/enroll/second-degree',\r\n component: () => import('@/views/Enroll/SecondDegree.vue')\r\n },\r\n {\r\n path: '/enroll/chongming-student',\r\n component: () => import('@/views/Enroll/ChongmingStudent.vue')\r\n },\r\n {\r\n path: '/register',\r\n meta: { public: true },\r\n component: () => import('@/views/Auth/Register.vue')\r\n },\r\n {\r\n path: '/identify',\r\n meta: { public: true },\r\n component: () => import('@/views/Auth/Identify.vue')\r\n },\r\n {\r\n path: '*',\r\n meta: { public: true },\r\n component: () => import('@/views/Auth/Login.vue')\r\n }\r\n]\r\n","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 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","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\nimport './plugins'\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\nregisterAuthHook(router)\r\n\r\nVue.use(VueRouter)\r\n\r\nexport { router }\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 '@/services/session/auth'\r\nimport { getAuthorizationHeader } from '@/services/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\nconst responseInterceptor = (response: AxiosResponse) => response\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: 60 * 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\n\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\n\r\nexport { service as axios }\r\n","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 }","import { render, staticRenderFns } from \"./App.vue?vue&type=template&id=4dd5bd46&\"\nvar script = {}\nimport style0 from \"./App.vue?vue&type=style&index=0&lang=scss&\"\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 Vue from 'vue'\r\nimport {\r\n Button,\r\n Card,\r\n Checkbox,\r\n Col,\r\n DatePicker,\r\n Divider,\r\n Form,\r\n FormItem,\r\n Input,\r\n Option,\r\n Radio,\r\n Row,\r\n Select,\r\n Step,\r\n Steps,\r\n Tooltip,\r\n Upload\r\n} from 'element-ui'\r\nimport App from './App.vue'\r\nimport { router } from './router'\r\nimport { store } from './store'\r\n\r\nVue.config.productionTip = false\r\n;[\r\n Button,\r\n Card,\r\n Checkbox,\r\n Col,\r\n DatePicker,\r\n Divider,\r\n Form,\r\n FormItem,\r\n Input,\r\n Option,\r\n Radio,\r\n Row,\r\n Select,\r\n Step,\r\n Steps,\r\n Tooltip,\r\n Upload\r\n].map(component => Vue.component(component.name, component))\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\nimport {\r\n ElMessageBoxOptions,\r\n MessageBoxData\r\n} from 'element-ui/types/message-box'\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\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 function confirm(\r\n message: string | string[],\r\n title: string,\r\n options?: ElMessageBoxOptions\r\n): Promise\r\nexport function confirm(\r\n message: string | string[],\r\n options?: ElMessageBoxOptions\r\n): Promise\r\nexport function confirm(\r\n message: string | string[],\r\n titleRaw?: string | ElMessageBoxOptions,\r\n optionsRaw?: ElMessageBoxOptions\r\n) {\r\n const h = vue.$createElement\r\n const messages = Array.isArray(message) ? message : [message]\r\n const vnode = h(\r\n 'div',\r\n messages.map(message => h('p', message))\r\n )\r\n\r\n const title = typeof titleRaw === 'string' ? titleRaw : undefined\r\n const baseOptions =\r\n optionsRaw || (typeof titleRaw === 'object' ? titleRaw : {})\r\n\r\n const options: ElMessageBoxOptions = {\r\n title,\r\n message: vnode,\r\n ...baseOptions\r\n }\r\n\r\n return MessageBox(options)\r\n}\r\n\r\nexport const prompt = MessageBox.prompt\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 }\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 updateUserInfo(user: UserInfo) {\r\n this.user = user\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 cleanUserInfo() {\r\n this.user = {\r\n username: null\r\n }\r\n }\r\n}\r\n\r\nexport const SessionStore = getModule(SessionModule)\r\n","import {\r\n createSession,\r\n deleteSession,\r\n fetchUserInfo,\r\n fetchCaptcha\r\n} from '@/apis/session'\r\nimport { router } from '@/router'\r\nimport { SessionStore as store } from '@/store/session'\r\nimport { notify, alert, confirm } from '@/utils/notification'\r\nimport { BasicLoginToken } from '@/models/session'\r\nimport { updateTokens, cleanTokens, updateTokensByStorage } from './token'\r\nimport { Nullable } from '@/models/helpers/common'\r\n\r\nlet codeToken: Nullable = null\r\n\r\nexport async function getCaptcha() {\r\n try {\r\n const payload = await fetchCaptcha()\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) {\r\n if (!codeToken || codeToken === '') {\r\n alert('请手动刷新验证码', new Error())\r\n return false\r\n }\r\n\r\n try {\r\n const { accessToken, refreshToken } = await createSession({\r\n ...token,\r\n codeToken\r\n })\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 confirm('真的要退出登录吗?', { 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 try {\r\n await deleteSession()\r\n } catch (e) {\r\n // do something ?\r\n } finally {\r\n cleanTokens()\r\n router.push('/')\r\n }\r\n}\r\n\r\nasync function loginSuccess(to = '/enroll') {\r\n await getUserInfo()\r\n router.push(to)\r\n notify(`欢迎回来, ${store.user.username}!`)\r\n}\r\n\r\nasync function getUserInfo() {\r\n try {\r\n const user = await fetchUserInfo()\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"],"sourceRoot":""}