ref : 重构令牌管理逻辑,,统一状态码识别

This commit is contained in:
TsMask
2025-04-27 17:23:33 +08:00
parent f76311cf1b
commit 2de9788373
23 changed files with 229 additions and 253 deletions

View File

@@ -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<string, string>) {
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<string, string>) {
*/
export function register(data: Record<string, any>) {
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',
});
}
};
/**
*

View File

@@ -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;
}
/**
* 获取服务器时间

View File

@@ -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 },
});
}

View File

@@ -1,12 +0,0 @@
import { request } from '@/plugins/http-fetch';
/**
* 获取路由
* @returns object
*/
export const getRouters = () => {
return request({
url: '/router',
method: 'GET',
});
};

View File

@@ -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 },
});
}

View File

@@ -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();

View File

@@ -1,14 +1,14 @@
/**响应-code加密数据 */
export const RESULT_CODE_ENCRYPT = 2;
export const RESULT_CODE_ENCRYPT = 200999;
/**响应-msg加密数据 */
export const RESULT_MSG_ENCRYPT: Record<string, string> = {
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<string, string> = {
@@ -17,7 +17,16 @@ export const RESULT_MSG_SUCCESS: Record<string, string> = {
};
/**响应-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<string, string> = {
zh_CN: '服务器连接出错!',
en_US: 'Server Connection Error!',
};
/**响应-msg错误失败 */
export const RESULT_MSG_ERROR: Record<string, string> = {
@@ -37,18 +46,6 @@ export const RESULT_MSG_NOT_TYPE: Record<string, string> = {
en_US: 'Unknown Response Data Type!',
};
/**响应-服务器连接出错 */
export const RESULT_MSG_SERVER_ERROR: Record<string, string> = {
zh_CN: '服务器连接出错!',
en_US: 'Server Connection Error!',
};
/**响应-请求地址未找到 */
export const RESULT_MSG_URL_NOTFOUND: Record<string, string> = {
zh_CN: '请求地址未找到!',
en_US: 'Request Address Not Found!',
};
/**响应-数据正在处理,请勿重复提交 */
export const RESULT_MSG_URL_RESUBMIT: Record<string, string> = {
zh_CN: '数据正在处理,请勿重复提交!',

View File

@@ -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';

View File

@@ -1224,7 +1224,7 @@ export default {
type:'网元类型',
neId:'网元唯一标识',
MML:'MML',
logTime:'log Time'
logTime:'记录时间'
},
forwarding:{
alarmId:'告警唯一标识',

View File

@@ -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);
}

View File

@@ -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<any> {
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<any> {
return options;
}
/**请求后的拦截 */
function interceptorResponse(res: ResultType): ResultType | Promise<any> {
/**响应前的拦截 */
async function beforeResponse(
options: OptionsType,
res: ResultType
): Promise<any> {
// 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<any> {
* @returns 返回 Promise<ResultType>
*/
export async function request(options: OptionsType): Promise<ResultType> {
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<ResultType> {
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<ResultType> {
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<ResultType> {
}
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;
}

View File

@@ -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',
});

View File

@@ -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) {

View File

@@ -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';

View File

@@ -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) {

View File

@@ -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;

View File

@@ -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<string, string>) {
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();
}
},
},

View File

@@ -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);

View File

@@ -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;
});
}
// 判断是否有背景地址

View File

@@ -910,6 +910,7 @@ onMounted(() => {
<!-- 状态历史框 -->
<HistoryModal
v-if="neTypeAndId.length > 1"
v-model:open="modalState.openByHistory"
:title="t('views.neData.baseStation.history')"
:ne-type="neTypeAndId[0]"

View File

@@ -2,7 +2,7 @@
import { GlobalFooter } from 'antdv-pro-layout';
import { Modal, message } from 'ant-design-vue/es';
import { computed, onMounted, reactive, toRaw } from 'vue';
import { register } from '@/api/login';
import { register } from '@/api/auth';
import { regExpPasswd, regExpUserName } from '@/utils/regular-utils';
import { useRouter, useRoute } from 'vue-router';
import useAppStore from '@/store/modules/app';

View File

@@ -2,7 +2,7 @@
import { stepState, fnToStepName } from '../hooks/useStep';
import { Modal } from 'ant-design-vue/es';
import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
import { removeToken } from '@/plugins/auth-token';
import { delAccessToken, delRefreshToken } from '@/plugins/auth-token';
import { useRouter } from 'vue-router';
import useAppStore from '@/store/modules/app';
import useI18n from '@/hooks/useI18n';
@@ -56,7 +56,8 @@ function fnGuideDone() {
bootloaderDone()
.then(res => {
if (res.code === RESULT_CODE_SUCCESS) {
removeToken();
delAccessToken();
delRefreshToken();
useAppStore().bootloader = false;
}
})

View File

@@ -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' });
}