feature-nxdev #42

Merged
nanxun merged 3 commits from feature-nxdev into main 2026-01-13 22:08:35 +08:00
3 changed files with 53 additions and 12 deletions
Showing only changes of commit d855c8f8fb - Show all commits
@@ -53,8 +53,8 @@ namespace IM_API.Services
if (json.IsNullOrEmpty) return (false,-1); if (json.IsNullOrEmpty) return (false,-1);
try try
{ {
var doc = JsonConvert.DeserializeObject<JsonElement>(json); using var doc = JsonDocument.Parse(json.ToString());
var userId = doc.GetProperty("UserId").GetInt32(); var userId = doc.RootElement.GetProperty("UserId").GetInt32();
return (true,userId); return (true,userId);
} }
catch catch
+44 -5
View File
@@ -2,10 +2,15 @@ import axios from 'axios'
import { useMessage } from '@/components/messages/useAlert'; import { useMessage } from '@/components/messages/useAlert';
import router from '@/router'; import router from '@/router';
import { useAuthStore } from '@/stores/auth'; import { useAuthStore } from '@/stores/auth';
import { authService } from './auth';
const message = useMessage(); const message = useMessage();
const authStore = useAuthStore(); const authStore = useAuthStore();
let waitqueue = [];
let isRefreshing = false;
const authURL = ['/auth/login', '/auth/register', '/auth/refresh'];
const api = axios.create({ const api = axios.create({
baseURL: import.meta.env.VITE_API_BASE_URL || 'http://localhost:3000/api', // 从环境变量中读取基础 URL baseURL: import.meta.env.VITE_API_BASE_URL || 'http://localhost:3000/api', // 从环境变量中读取基础 URL
timeout: 10000, timeout: 10000,
@@ -31,16 +36,50 @@ api.interceptors.response.use(
response => { response => {
return response.data; return response.data;
}, },
err => { async err => {
if (err.response) { const { config, response } = err;
switch (err.response.status) { if (response) {
switch (response.status) {
case 401: case 401:
if (authURL.some(x => config.url.includes(x))) {
authStore.logout();
message.error('未登录,请登录后操作。');
router.push('/auth/login')
break;
}
if (config._retry) {
break;
}
config._retry = true;
// 已经在刷新 → 排队
if (isRefreshing) {
return new Promise(resolve => {
waitqueue.push(token => {
config.headers.Authorization = `Bearer ${token}`
resolve(api(config))
})
})
}
isRefreshing = true;
const refreshToken = authStore.refreshToken;
console.log(authStore)
if (refreshToken != null && refreshToken != '') {
const res = await authService.refresh(refreshToken)
authStore.setLoginInfo(res.data.token, res.data.refreshToken, res.data.userInfo)
waitqueue.forEach(cb => cb(authStore.token));
waitqueue = [];
config.headers.Authorization = `Bearer ${authStore.token}`
return api(config)
}
authStore.logout();
message.error('未登录,请登录后操作。'); message.error('未登录,请登录后操作。');
router.push('/auth/login') router.push('/auth/login')
break; break;
case 400: case 400:
if (err.response.data && err.response.data.code == 1003) { if (response.data && response.data.code == 1003) {
message.error(err.response.data.message); message.error(response.data.message);
break; break;
} }
default: default:
+7 -5
View File
@@ -4,10 +4,10 @@ import { defineStore } from 'pinia'
export const useAuthStore = defineStore('auth', () => { export const useAuthStore = defineStore('auth', () => {
const token = ref(localStorage.getItem('user_token') || ''); const token = ref(localStorage.getItem('user_token') || '');
const refreshToken = ref(localStorage.getItem('refresh_token') || ''); const refreshToken = ref(localStorage.getItem('refresh_token') || '');
const userInfo = ref(localStorage.getItem('user_info') || ''); const userInfo = ref(JSON.parse(localStorage.getItem('user_info')) || {});
//判断是否已登录 //判断是否已登录
const isLoggedIn = computed(() => !!token.value); const isLoggedIn = computed(() => !!refreshToken.value);
/** /**
* 登录成功保存状态 * 登录成功保存状态
@@ -15,12 +15,13 @@ export const useAuthStore = defineStore('auth', () => {
* @param {*} user 用户信息 * @param {*} user 用户信息
*/ */
function setLoginInfo(newToken, newRefreshToken, user) { function setLoginInfo(newToken, newRefreshToken, user) {
console.log(`设置凭证:\ntoken${newToken}\nrefreshToken:${newRefreshToken}`)
token.value = newToken; token.value = newToken;
refreshToken.value = newRefreshToken refreshToken.value = newRefreshToken
userInfo.value = user; userInfo.value = user;
localStorage.setItem('user_token', newToken); localStorage.setItem('user_token', newToken);
localStorage.setItem('refresh_token', refreshToken) localStorage.setItem('refresh_token', newRefreshToken)
localStorage.setItem('user_info', user) localStorage.setItem('user_info', JSON.stringify(user))
} }
/** /**
@@ -29,10 +30,11 @@ export const useAuthStore = defineStore('auth', () => {
function logout() { function logout() {
token.value = ''; token.value = '';
userInfo.value = null; userInfo.value = null;
refreshToken.value = ''
localStorage.removeItem('user_token'); localStorage.removeItem('user_token');
localStorage.removeItem('refresh_token') localStorage.removeItem('refresh_token')
localStorage.removeItem('user_info') localStorage.removeItem('user_info')
} }
return { token, userInfo, isLoggedIn, setLoginInfo, logout }; return { token, refreshToken, userInfo, isLoggedIn, setLoginInfo, logout };
}) })