diff --git a/src/api/login.ts b/src/api/auth.ts similarity index 61% rename from src/api/login.ts rename to src/api/auth.ts index e66963c6..eab43a76 100644 --- a/src/api/login.ts +++ b/src/api/auth.ts @@ -1,15 +1,28 @@ -import { CACHE_SESSION_CRYPTO_API } from '@/constants/cache-keys-constants'; -import { sessionGet } from '@/utils/cache-session-utils'; import { request } from '@/plugins/http-fetch'; -// 登录方法 +/** + * 登录方法 + * @param data 数据 + * @returns 结果 + */ export function login(data: Record) { return request({ - url: '/login', + url: '/auth/login', method: 'POST', data: data, whithToken: false, - crypto: sessionGet(CACHE_SESSION_CRYPTO_API) !== 'false', + }); +} + +/** + * 退出方法 + * @returns object + */ +export function logout() { + return request({ + url: '/auth/logout', + method: 'POST', + repeatSubmit: false, }); } @@ -20,11 +33,24 @@ export function login(data: Record) { */ export function register(data: Record) { return request({ - url: '/register', + url: '/auth/register', method: 'POST', data: data, whithToken: false, - crypto: sessionGet(CACHE_SESSION_CRYPTO_API) !== 'false', + }); +} + +/** + * 刷新登录令牌 + * @param data 数据 + * @returns 结果 + */ +export function refreshToken(refreshToken: string) { + return request({ + url: '/auth/refresh-token', + method: 'POST', + data: { refreshToken }, + whithToken: false, }); } @@ -40,16 +66,15 @@ export function getInfo() { } /** - * 退出方法 + * 获取路由 * @returns object */ -export function logout() { +export const getRouter = () => { return request({ - url: '/logout', - method: 'POST', - repeatSubmit: false, + url: '/router', + method: 'GET', }); -} +}; /** * 获取验证码 diff --git a/src/api/index.ts b/src/api/index.ts index 4806e43c..f7d04d31 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -1,65 +1,5 @@ import { RESULT_CODE_SUCCESS } from '@/constants/result-constants'; import { request } from '@/plugins/http-fetch'; -import { parseDateToStr } from '@/utils/date-utils'; -import { NE_TYPE_LIST } from '@/constants/ne-constants'; - -/** - * 查询公告列表 - * @param query 查询参数 - * @returns object - */ -export async function listMain() { - const result = await request({ - url: '/api/rest/systemManagement/v1/elementType/all/objectType/systemState', - method: 'GET', - timeout: 60_000, - }); - // console.log(result); - let realData = result.data.data; - const mergedData = realData.map((obj: any) => { - // console.log(obj); - const [key, value] = Object.entries(obj)[0]; - const ipAddress = (value as any).ipAddress; - const systemState = (value as any).systemState; - const serialNum = (value as any).serialNum; - const version = (value as any).version; - - const errCode = systemState && systemState['errorCode']; - var time = new Date(); - // console.log(key, value); - let mergedObj; - if (errCode === undefined && systemState) { - mergedObj = { - ...systemState, - refresh: parseDateToStr(time), - ipAddress: ipAddress, - name: key.split('/').join('_'), - status: 'Normal', - }; - } else { - mergedObj = { - version, - refresh: parseDateToStr(time), - ipAddress, - serialNum, - name: key.split('/').join('_'), - expiryDate: '-', - status: 'Abnormal', - }; - } - return mergedObj; - }); - //通过sort进行冒泡排序 - mergedData.sort((a: any, b: any) => { - const typeA = NE_TYPE_LIST.indexOf(a.name.split('_')[0]); - const typeB = NE_TYPE_LIST.indexOf(b.name.split('_')[0]); - if (typeA === -1) return 1; // 如果不在特定顺序中,排到后面 - if (typeB === -1) return -1; // 如果不在特定顺序中,排到后面 - return typeA - typeB; - }); - - return mergedData; -} /** * 获取服务器时间 diff --git a/src/api/profile.ts b/src/api/profile.ts index 3e52e664..63295ed3 100644 --- a/src/api/profile.ts +++ b/src/api/profile.ts @@ -37,16 +37,3 @@ export function updateUserPassword(oldPassword: string, newPassword: string) { data: { oldPassword, newPassword }, }); } - -/** - * 用户强制重置密码 - * @param password 密码 - * @returns object - */ -export function updateUserPasswordForce(password: string) { - return request({ - url: '/system/user/profile/password-force', - method: 'PUT', - data: { password }, - }); -} diff --git a/src/api/router.ts b/src/api/router.ts deleted file mode 100644 index 4846be2b..00000000 --- a/src/api/router.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { request } from '@/plugins/http-fetch'; - -/** - * 获取路由 - * @returns object - */ -export const getRouters = () => { - return request({ - url: '/router', - method: 'GET', - }); -}; diff --git a/src/api/system/user.ts b/src/api/system/user.ts index 4563069f..f59758f8 100644 --- a/src/api/system/user.ts +++ b/src/api/system/user.ts @@ -136,3 +136,16 @@ export function changeUserStatus( data: { userId, statusFlag }, }); } + +/** + * 用户强制重置密码 + * @param password 密码 + * @returns object + */ +export function updateUserPasswordForce(password: string) { + return request({ + url: '/system/user/profile/password-force', + method: 'PUT', + data: { password }, + }); +} diff --git a/src/components/ForcePasswdChange/index.vue b/src/components/ForcePasswdChange/index.vue index c433ad35..0229ffd8 100644 --- a/src/components/ForcePasswdChange/index.vue +++ b/src/components/ForcePasswdChange/index.vue @@ -4,7 +4,7 @@ import { regExpPasswd, regExpUserName } from '@/utils/regular-utils'; import { Form, message, Modal } from 'ant-design-vue'; import useI18n from '@/hooks/useI18n'; import useUserStore from '@/store/modules/user'; -import { updateUserPasswordForce } from '@/api/profile'; +import { updateUserPasswordForce } from '@/api/system/user'; import { RESULT_CODE_SUCCESS } from '@/constants/result-constants'; import { getConfigKey } from '@/api/system/config'; const userStore = useUserStore(); diff --git a/src/constants/result-constants.ts b/src/constants/result-constants.ts index ae7dfeeb..76332a40 100644 --- a/src/constants/result-constants.ts +++ b/src/constants/result-constants.ts @@ -1,14 +1,14 @@ /**响应-code加密数据 */ -export const RESULT_CODE_ENCRYPT = 2; +export const RESULT_CODE_ENCRYPT = 200999; /**响应-msg加密数据 */ export const RESULT_MSG_ENCRYPT: Record = { zh_CN: '加密!', - en_US: 'encrypt!', + en_US: 'Encrypt!', }; /**响应-code正常成功 */ -export const RESULT_CODE_SUCCESS = 1; +export const RESULT_CODE_SUCCESS = 200001; /**响应-msg正常成功 */ export const RESULT_MSG_SUCCESS: Record = { @@ -17,7 +17,16 @@ export const RESULT_MSG_SUCCESS: Record = { }; /**响应-code错误失败 */ -export const RESULT_CODE_ERROR = 0; +export const RESULT_CODE_ERROR = 400001; + +/**响应-code错误异常 */ +export const RESULT_CODE_EXCEPTION = 500001; + +/**响应-服务器连接出错 */ +export const RESULT_MSG_SERVER_ERROR: Record = { + zh_CN: '服务器连接出错!', + en_US: 'Server Connection Error!', +}; /**响应-msg错误失败 */ export const RESULT_MSG_ERROR: Record = { @@ -37,18 +46,6 @@ export const RESULT_MSG_NOT_TYPE: Record = { en_US: 'Unknown Response Data Type!', }; -/**响应-服务器连接出错 */ -export const RESULT_MSG_SERVER_ERROR: Record = { - zh_CN: '服务器连接出错!', - en_US: 'Server Connection Error!', -}; - -/**响应-请求地址未找到 */ -export const RESULT_MSG_URL_NOTFOUND: Record = { - zh_CN: '请求地址未找到!', - en_US: 'Request Address Not Found!', -}; - /**响应-数据正在处理,请勿重复提交 */ export const RESULT_MSG_URL_RESUBMIT: Record = { zh_CN: '数据正在处理,请勿重复提交!', diff --git a/src/constants/token-constants.ts b/src/constants/token-constants.ts index 03d2cc87..44316013 100644 --- a/src/constants/token-constants.ts +++ b/src/constants/token-constants.ts @@ -2,10 +2,13 @@ export const TOKEN_RESPONSE_FIELD = 'accessToken'; /**令牌-请求头标识前缀 */ -export const TOKEN_KEY_PREFIX = 'Bearer '; +export const TOKEN_KEY_PREFIX = 'Bearer'; /**令牌-请求头标识 */ export const TOKEN_KEY = 'Authorization'; -/**令牌-存放Cookie标识 */ -export const TOKEN_COOKIE = 'AuthOMC'; +/**令牌-访问令牌存放Cookie标识 */ +export const TOKEN_ACCESS_COOKIE = 'omc_access'; + +/**令牌-刷新令牌存放Cookie标识 */ +export const TOKEN_REFRESH_COOKIE = 'omc_refresh'; diff --git a/src/i18n/locales/zh-CN.ts b/src/i18n/locales/zh-CN.ts index 9bc99748..4a544f38 100644 --- a/src/i18n/locales/zh-CN.ts +++ b/src/i18n/locales/zh-CN.ts @@ -1224,7 +1224,7 @@ export default { type:'网元类型', neId:'网元唯一标识', MML:'MML', - logTime:'log Time' + logTime:'记录时间' }, forwarding:{ alarmId:'告警唯一标识', diff --git a/src/plugins/auth-token.ts b/src/plugins/auth-token.ts index 536d54b1..09b420b4 100644 --- a/src/plugins/auth-token.ts +++ b/src/plugins/auth-token.ts @@ -1,25 +1,45 @@ import Cookies from 'js-cookie'; -import { TOKEN_COOKIE } from '@/constants/token-constants'; -import { localRemove, localSet } from '@/utils/cache-local-utils'; import { - CACHE_LOCAL_LOCK_PASSWD, - CACHE_LOCAL_MASK, -} from '@/constants/cache-keys-constants'; + TOKEN_ACCESS_COOKIE, + TOKEN_REFRESH_COOKIE, +} from '@/constants/token-constants'; -/**获取cookis中Token字符串 */ -export function getToken(): string { - return Cookies.get(TOKEN_COOKIE) || ''; +/**获取访问令牌 */ +export function getAccessToken(): string { + return Cookies.get(TOKEN_ACCESS_COOKIE) || ''; } -/**设置cookis中Token字符串 */ -export function setToken(token: string): void { - Cookies.set(TOKEN_COOKIE, token || ''); - localSet(CACHE_LOCAL_MASK, 'none'); +/** + * 设置访问令牌 + * @param token token字符串 + * @param exp 过期时间(秒) + */ +export function setAccessToken(token: string, exp: number): void { + const expires = new Date(new Date().getTime() + exp * 1000); + Cookies.set(TOKEN_ACCESS_COOKIE, token, { expires }); } -/**移除cookis中Token字符串,localStorage中锁屏字符串 */ -export function removeToken(): void { - Cookies.remove(TOKEN_COOKIE); - localRemove(CACHE_LOCAL_MASK); - localRemove(CACHE_LOCAL_LOCK_PASSWD); +/**移除访问令牌 */ +export function delAccessToken(): void { + Cookies.remove(TOKEN_ACCESS_COOKIE); +} + +/**获取刷新令牌 */ +export function getRefreshToken(): string { + return Cookies.get(TOKEN_REFRESH_COOKIE) || ''; +} + +/** + * 设置刷新令牌 + * @param token token字符串 + * @param exp 过期时间(秒) + */ +export function setRefreshToken(token: string, exp: number): void { + const expires = new Date(new Date().getTime() + exp * 1000); + Cookies.set(TOKEN_REFRESH_COOKIE, token, { expires }); +} + +/**移除刷新令牌 */ +export function delRefreshToken(): void { + Cookies.remove(TOKEN_REFRESH_COOKIE); } diff --git a/src/plugins/http-fetch.ts b/src/plugins/http-fetch.ts index b5f38c97..f3673262 100644 --- a/src/plugins/http-fetch.ts +++ b/src/plugins/http-fetch.ts @@ -1,10 +1,16 @@ -import { getToken, removeToken } from '@/plugins/auth-token'; +import { + getAccessToken, + setAccessToken, + delAccessToken, + getRefreshToken, + setRefreshToken, + delRefreshToken, +} from '@/plugins/auth-token'; import { sessionGet, sessionGetJSON, sessionSetJSON, } from '@/utils/cache-session-utils'; -import { localGet } from '@/utils/cache-local-utils'; import { TOKEN_KEY, TOKEN_KEY_PREFIX } from '@/constants/token-constants'; import { CACHE_LOCAL_I18N, @@ -18,6 +24,7 @@ import { import { RESULT_CODE_ENCRYPT, RESULT_CODE_ERROR, + RESULT_CODE_EXCEPTION, RESULT_CODE_SUCCESS, RESULT_MSG_ENCRYPT, RESULT_MSG_ERROR, @@ -25,10 +32,11 @@ import { RESULT_MSG_SERVER_ERROR, RESULT_MSG_SUCCESS, RESULT_MSG_TIMEOUT, - RESULT_MSG_URL_NOTFOUND, RESULT_MSG_URL_RESUBMIT, } from '@/constants/result-constants'; import { decryptAES, encryptAES } from '@/utils/encrypt-utils'; +import { localGet } from '@/utils/cache-local-utils'; +import { refreshToken } from '@/api/auth'; /**响应结果类型 */ export type ResultType = { @@ -61,7 +69,7 @@ type OptionsType = { /**请求地址 */ url: string; /**请求方法 */ - method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH'; + method: 'GET' | 'POST' | 'PUT' | 'DELETE'; /**请求头 */ headers?: HeadersInit; /**地址栏参数 */ @@ -133,16 +141,21 @@ function beforeRequest(options: OptionsType): OptionsType | Promise { Reflect.set(options.headers, 'Accept-Language', `${language};q=0.9`); // 是否需要设置 token - const token = getToken(); - if (options.whithToken && token) { - Reflect.set(options.headers, TOKEN_KEY, TOKEN_KEY_PREFIX + token); + const accessToken = getAccessToken(); + if (options.whithToken && accessToken) { + Reflect.set( + options.headers, + TOKEN_KEY, + TOKEN_KEY_PREFIX + ' ' + accessToken + ); } // 是否需要防止数据重复提交 if ( options.repeatSubmit && options.dataType === 'json' && - ['post', 'put'].includes(options.method) + !(options.data instanceof FormData) && + ['POST', 'PUT'].includes(options.method) ) { const requestObj: RepeatSubmitType = { url: options.url, @@ -212,13 +225,31 @@ function beforeRequest(options: OptionsType): OptionsType | Promise { return options; } -/**请求后的拦截 */ -function interceptorResponse(res: ResultType): ResultType | Promise { +/**响应前的拦截 */ +async function beforeResponse( + options: OptionsType, + res: ResultType +): Promise { // console.log('请求后的拦截', res); // 登录失效时,移除授权令牌并重新刷新页面 - if (res.code === 401) { - removeToken(); + // 登录失效时,移除访问令牌并重新请求 + if (res.code === 401001) { + const result = await refreshToken(getRefreshToken()); + // 更新访问令牌和刷新令牌 + if (result.code === RESULT_CODE_SUCCESS) { + setAccessToken(result.data.accessToken, result.data.refreshExpiresIn); + setRefreshToken(result.data.refreshToken, result.data.refreshExpiresIn); + return await request(options); + } else { + delAccessToken(); + delRefreshToken(); + window.location.reload(); + } + } + if ([401002, 401003].includes(res.code)) { + delAccessToken(); + delRefreshToken(); window.location.reload(); } @@ -271,43 +302,45 @@ function interceptorResponse(res: ResultType): ResultType | Promise { * @returns 返回 Promise */ export async function request(options: OptionsType): Promise { - options = Object.assign({}, FATCH_OPTIONS, options); - let timeoutId: any = 0; + let reqOptions = Object.assign({}, FATCH_OPTIONS, options); + // 请求超时控制请求终止 - if (!options.signal) { + let timeoutId: any = null; + if (!reqOptions.signal) { const controller = new AbortController(); - const { signal } = controller; - options.signal = signal; + reqOptions.signal = controller.signal; timeoutId = setTimeout(() => { controller.abort(); // 终止请求 - }, options.timeout); + }, reqOptions.timeout); } // 检查请求拦截 - const beforeReq = beforeRequest(options); + const beforeReq = beforeRequest(reqOptions); if (beforeReq instanceof Promise) { return await beforeReq; } - options = beforeReq; + reqOptions = beforeReq; // 判断用户传递的URL是否http或/开头 - if (!options.url.startsWith('http')) { - const uri = options.url.startsWith('/') ? options.url : `/${options.url}`; - options.url = options.baseUrl + uri; + if (!reqOptions.url.startsWith('http')) { + const uri = reqOptions.url.startsWith('/') + ? reqOptions.url + : `/${reqOptions.url}`; + reqOptions.url = reqOptions.baseUrl + uri; } try { - const res = await fetch(options.url, options); + const res = await fetch(reqOptions.url, reqOptions); // console.log('请求结果:', res); - - // 状态码拦截处理 - const reqNot = stateCode(res); - if (reqNot != false) { - return reqNot; + if (res.status === 500) { + return { + code: RESULT_CODE_EXCEPTION, + msg: RESULT_MSG_SERVER_ERROR[language], + }; } // 根据响应数据类型返回 - switch (options.responseType) { + switch (reqOptions.responseType) { case 'text': // 文本数据 const str = await res.text(); return { @@ -317,11 +350,7 @@ export async function request(options: OptionsType): Promise { case 'json': // json格式数据 const result = await res.json(); // 请求后的拦截 - const beforeRes = interceptorResponse(result); - if (beforeRes instanceof Promise) { - return await beforeRes; - } - return result; + return await beforeResponse(options, result); case 'blob': // 二进制数据则直接返回 case 'arrayBuffer': const contentType = res.headers.get('content-type') || ''; @@ -330,7 +359,7 @@ export async function request(options: OptionsType): Promise { return result as ResultType; } const data = - options.responseType === 'blob' + reqOptions.responseType === 'blob' ? await res.blob() : await res.arrayBuffer(); return { @@ -356,41 +385,7 @@ export async function request(options: OptionsType): Promise { } throw error; } finally { - clearTimeout(timeoutId); // 请求成功,清除超时计时器 + clearTimeout(timeoutId); // 清除超时计时器 + timeoutId = null; } } - -/** - * 判断状态码处理结果信息(不可处理) - * @param res 请求结果 - * @returns - */ -function stateCode(res: Response) { - // 网络异常 - if (res.status === 500) { - return { - code: RESULT_CODE_ERROR, - msg: RESULT_MSG_SERVER_ERROR[language], - }; - } - // 上传文件成功无内容返回 - if (res.status === 204 || res.statusText === 'No Content') { - return { - code: RESULT_CODE_SUCCESS, - msg: RESULT_MSG_SUCCESS[language], - }; - } - // 地址找不到 - if (res.status === 404 || res.status === 405) { - return { - code: RESULT_CODE_ERROR, - msg: RESULT_MSG_URL_NOTFOUND[language], - }; - } - // 身份授权 - if (res.status === 401) { - removeToken(); - window.location.reload(); - } - return false; -} diff --git a/src/plugins/ws-websocket.ts b/src/plugins/ws-websocket.ts index 623cd7cf..ca2c00a0 100644 --- a/src/plugins/ws-websocket.ts +++ b/src/plugins/ws-websocket.ts @@ -1,5 +1,5 @@ import { sessionGet } from '@/utils/cache-session-utils'; -import { getToken } from './auth-token'; +import { getAccessToken } from './auth-token'; import { localGet } from '@/utils/cache-local-utils'; import { CACHE_LOCAL_I18N } from '@/constants/cache-keys-constants'; import { TOKEN_RESPONSE_FIELD } from '@/constants/token-constants'; @@ -92,7 +92,7 @@ export class WS { // 地址栏参数 let params = Object.assign({}, options.params, { // 设置 token - [TOKEN_RESPONSE_FIELD]: getToken(), + [TOKEN_RESPONSE_FIELD]: getAccessToken(), // 多语言 ['language']: localGet(CACHE_LOCAL_I18N) || 'en_US', }); diff --git a/src/router/index.ts b/src/router/index.ts index b16ea27c..6a2755d3 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -8,7 +8,7 @@ import NProgress from 'nprogress'; import 'nprogress/nprogress.css'; import BasicLayout from '../layouts/BasicLayout.vue'; import BlankLayout from '../layouts/BlankLayout.vue'; -import { getToken } from '@/plugins/auth-token'; +import { getAccessToken } from '@/plugins/auth-token'; import { validHttp } from '@/utils/regular-utils'; import useUserStore from '@/store/modules/user'; import useAppStore from '@/store/modules/app'; @@ -182,7 +182,7 @@ router.beforeEach(async (to, from, next) => { next({ name: 'Index' }); } - let token = getToken(); + let token = getAccessToken(); // 免用户登录认证 if (!appStore.loginAuth) { diff --git a/src/store/modules/app.ts b/src/store/modules/app.ts index 1634e3cd..b2664c3a 100644 --- a/src/store/modules/app.ts +++ b/src/store/modules/app.ts @@ -4,7 +4,7 @@ import { CACHE_SESSION_CRYPTO_API, } from '@/constants/cache-keys-constants'; import { RESULT_CODE_SUCCESS } from '@/constants/result-constants'; -import { removeToken } from '@/plugins/auth-token'; +import { delAccessToken, delRefreshToken } from '@/plugins/auth-token'; import { parseUrlPath } from '@/plugins/file-static-url'; import { localGet, localSet } from '@/utils/cache-local-utils'; import { sessionSet } from '@/utils/cache-session-utils'; @@ -94,7 +94,8 @@ const useAppStore = defineStore('app', { this.bootloader = res.data.bootloader === 'true'; // 引导时 if (this.bootloader) { - removeToken(); + delAccessToken(); + delRefreshToken(); } this.loginAuth = res.data.loginAuth !== 'false'; this.cryptoApi = res.data.cryptoApi !== 'false'; diff --git a/src/store/modules/neinfo.ts b/src/store/modules/neinfo.ts index 13bab5ee..ebf4cd9f 100644 --- a/src/store/modules/neinfo.ts +++ b/src/store/modules/neinfo.ts @@ -52,7 +52,7 @@ const useNeInfoStore = defineStore('neinfo', { async fnNelist() { // 有数据不请求 if (this.neList.length > 0) { - return { code: 1, data: this.neList, msg: 'success' }; + return { code: RESULT_CODE_SUCCESS, data: this.neList, msg: 'success' }; } const res = await listAllNeInfo({ bandStatus: false, @@ -79,7 +79,7 @@ const useNeInfoStore = defineStore('neinfo', { async fnNeTaskPerformance() { // 有数据不请求 if (this.perMeasurementList.length > 0) { - return { code: 1, data: this.perMeasurementList, msg: 'success' }; + return { code: RESULT_CODE_SUCCESS, data: this.perMeasurementList, msg: 'success' }; } const res = await getNePerformanceList(); if (res.code === RESULT_CODE_SUCCESS) { diff --git a/src/store/modules/router.ts b/src/store/modules/router.ts index a4131a7d..ade7ef3b 100644 --- a/src/store/modules/router.ts +++ b/src/store/modules/router.ts @@ -5,7 +5,7 @@ import type { RouteMeta, RouteRecordRaw, } from 'vue-router'; -import { getRouters } from '@/api/router'; +import { getRouter } from '@/api/auth'; import BasicLayout from '@/layouts/BasicLayout.vue'; import BlankLayout from '@/layouts/BlankLayout.vue'; import LinkLayout from '@/layouts/LinkLayout.vue'; @@ -46,7 +46,7 @@ const useRouterStore = defineStore('router', { * @returns 生成的路由菜单 */ async generateRoutes() { - const res = await getRouters(); + const res = await getRouter(); if (res.code === RESULT_CODE_SUCCESS) { const buildRoutes = buildRouters(res.data.concat()); this.buildRouterData = buildRoutes; diff --git a/src/store/modules/user.ts b/src/store/modules/user.ts index 003ac7e9..7af89458 100644 --- a/src/store/modules/user.ts +++ b/src/store/modules/user.ts @@ -1,9 +1,13 @@ import defaultAvatar from '@/assets/images/default_avatar.png'; import useLayoutStore from './layout'; -import { login, logout, getInfo } from '@/api/login'; -import { setToken, removeToken } from '@/plugins/auth-token'; +import { login, logout, getInfo } from '@/api/auth'; +import { + delAccessToken, + delRefreshToken, + setAccessToken, + setRefreshToken, +} from '@/plugins/auth-token'; import { defineStore } from 'pinia'; -import { TOKEN_RESPONSE_FIELD } from '@/constants/token-constants'; import { RESULT_CODE_SUCCESS } from '@/constants/result-constants'; import { parseUrlPath } from '@/plugins/file-static-url'; @@ -105,8 +109,8 @@ const useUserStore = defineStore('user', { async fnLogin(loginBody: Record) { const res = await login(loginBody); if (res.code === RESULT_CODE_SUCCESS && res.data) { - const token = res.data[TOKEN_RESPONSE_FIELD]; - setToken(token); + setAccessToken(res.data.accessToken, res.data.refreshExpiresIn); + setRefreshToken(res.data.refreshToken, res.data.refreshExpiresIn); if (res.data?.forcePasswdChange) { this.forcePasswdChange = true; } @@ -150,11 +154,6 @@ const useUserStore = defineStore('user', { this.forcePasswdChange = true; } } - // 网络错误时退出登录状态 - if (res.code === 0) { - removeToken(); - window.location.reload(); - } return res; }, // 退出系统 @@ -166,7 +165,8 @@ const useUserStore = defineStore('user', { } finally { this.roles = []; this.permissions = []; - removeToken(); + delAccessToken(); + delRefreshToken(); } }, }, diff --git a/src/views/logManage/mml/index.vue b/src/views/logManage/mml/index.vue index 5931820d..ae69cf66 100644 --- a/src/views/logManage/mml/index.vue +++ b/src/views/logManage/mml/index.vue @@ -97,7 +97,7 @@ let tableColumns: ColumnsType = reactive([ title: t('views.logManage.mml.logTime'), dataIndex: 'logTime', align: 'left', - width: 150, + width: 200, customRender(opt) { if (!opt.value) return ''; return parseDateToStr(opt.value); diff --git a/src/views/login.vue b/src/views/login.vue index 18adece3..d01be8c7 100644 --- a/src/views/login.vue +++ b/src/views/login.vue @@ -5,7 +5,7 @@ import { message } from 'ant-design-vue/es'; import { reactive, onMounted, computed, toRaw } from 'vue'; import useUserStore from '@/store/modules/user'; import useAppStore from '@/store/modules/app'; -import { getCaptchaImage } from '@/api/login'; +import { getCaptchaImage } from '@/api/auth'; import { useRouter, useRoute } from 'vue-router'; import useI18n from '@/hooks/useI18n'; import useLayoutStore from '@/store/modules/layout'; @@ -75,21 +75,28 @@ function fnFinish() { function fnGetCaptcha() { if (state.captchaClick) return; state.captchaClick = true; - getCaptchaImage().then(res => { - state.captchaClick = false; - if (res.code != RESULT_CODE_SUCCESS) { - message.warning(`${res.msg}`, 3); - return; - } - state.captcha.enabled = Boolean(res.captchaEnabled); - if (state.captcha.enabled) { - state.captcha.codeImg = res.img; - state.from.uuid = res.uuid; - if (res.text) { - state.from.code = res.text; + getCaptchaImage() + .then(res => { + if (res.code !== RESULT_CODE_SUCCESS) { + message.warning({ + content: `${res.msg}`, + duration: 3, + }); + return; } - } - }); + const { enabled, img, uuid } = res.data; + state.captcha.enabled = Boolean(enabled); + if (state.captcha.enabled) { + state.captcha.codeImg = img; + state.from.uuid = uuid; + } + if (res.data?.text) { + state.from.code = res.data.text; + } + }) + .finally(() => { + state.captchaClick = false; + }); } // 判断是否有背景地址 diff --git a/src/views/neData/base-station/list.vue b/src/views/neData/base-station/list.vue index 9b3c7407..4a233e76 100644 --- a/src/views/neData/base-station/list.vue +++ b/src/views/neData/base-station/list.vue @@ -910,6 +910,7 @@ onMounted(() => { { if (res.code === RESULT_CODE_SUCCESS) { - removeToken(); + delAccessToken(); + delRefreshToken(); useAppStore().bootloader = false; } }) diff --git a/src/views/system/quick-start/components/Start.vue b/src/views/system/quick-start/components/Start.vue index f337a9e0..1d9c5a7c 100644 --- a/src/views/system/quick-start/components/Start.vue +++ b/src/views/system/quick-start/components/Start.vue @@ -2,8 +2,7 @@ import { onMounted } from 'vue'; import { useRouter } from 'vue-router'; import { RESULT_CODE_SUCCESS } from '@/constants/result-constants'; -import { TOKEN_RESPONSE_FIELD } from '@/constants/token-constants'; -import { getToken, setToken } from '@/plugins/auth-token'; +import { getAccessToken, setAccessToken } from '@/plugins/auth-token'; import { bootloaderStart } from '@/api/system/quick-start/bootloader'; import { fnToStepName } from '../hooks/useStep'; import useI18n from '@/hooks/useI18n'; @@ -19,11 +18,10 @@ function fnChangeLocale(e: any) { /**引导开始 */ function fnGuideStart() { - if (getToken()) return; + if (getAccessToken()) return; bootloaderStart().then(res => { if (res.code === RESULT_CODE_SUCCESS && res.data) { - const token = res.data[TOKEN_RESPONSE_FIELD]; - setToken(token); + setAccessToken(res.data.accessToken, res.data.refreshExpiresIn); } else { router.push({ name: 'Login' }); }