更新
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
|
||||
const ENV_CONFIG = {
|
||||
// API配置
|
||||
API_BASE_URL: import.meta.env.VITE_APP_API_BASE_URL || (import.meta.env.DEV ? 'http://localhost:8000/api' : 'https://www.yunzer.cn/api'),
|
||||
API_BASE_URL: import.meta.env.VITE_APP_API_BASE_URL,
|
||||
REQUEST_TIMEOUT: 10000,
|
||||
|
||||
// 应用配置
|
||||
@@ -11,6 +11,8 @@ const ENV_CONFIG = {
|
||||
// 本地存储key
|
||||
TOKEN_KEY: 'admin_token',
|
||||
USER_INFO_KEY: 'admin_user_info',
|
||||
USER_STORE_KEY: 'user-store',
|
||||
APPFASTNAV_KEY: 'appfastnav',
|
||||
|
||||
// 是否为开发环境
|
||||
IS_DEV: import.meta.env.DEV,
|
||||
|
||||
@@ -1,36 +1,40 @@
|
||||
import { defineStore } from 'pinia'
|
||||
import { login as loginApi, getUserInfo as getUserInfoApi, logout as logoutApi } from '@/api/user'
|
||||
import ENV_CONFIG from '@/config/env'
|
||||
import { defineStore } from "pinia";
|
||||
import {
|
||||
login as loginApi,
|
||||
getUserInfo as getUserInfoApi,
|
||||
logout as logoutApi,
|
||||
} from "@/api/user";
|
||||
import ENV_CONFIG from "@/config/env";
|
||||
|
||||
interface LoginForm {
|
||||
account: string
|
||||
password: string
|
||||
account: string;
|
||||
password: string;
|
||||
}
|
||||
|
||||
interface UserInfo {
|
||||
id: number
|
||||
account: string
|
||||
name: string
|
||||
avatar?: string
|
||||
phone?: string
|
||||
sex?: number
|
||||
qq?: string
|
||||
wechat?: string
|
||||
create_time?: number
|
||||
id: number;
|
||||
account: string;
|
||||
name: string;
|
||||
avatar?: string;
|
||||
phone?: string;
|
||||
sex?: number;
|
||||
qq?: string;
|
||||
wechat?: string;
|
||||
create_time?: number;
|
||||
}
|
||||
|
||||
interface LoginResponse {
|
||||
token: string
|
||||
user_info: UserInfo
|
||||
token: string;
|
||||
user_info: UserInfo;
|
||||
}
|
||||
|
||||
const useUserStore = defineStore('user', {
|
||||
const useUserStore = defineStore("user", {
|
||||
state: () => {
|
||||
return {
|
||||
token: '',
|
||||
token: "",
|
||||
userInfo: null as UserInfo | null,
|
||||
isLogin: false
|
||||
}
|
||||
isLogin: false,
|
||||
};
|
||||
},
|
||||
|
||||
getters: {
|
||||
@@ -39,40 +43,45 @@ const useUserStore = defineStore('user', {
|
||||
// 获取token
|
||||
getToken: (state) => state.token,
|
||||
// 是否已登录
|
||||
getIsLogin: (state) => state.isLogin
|
||||
getIsLogin: (state) => state.isLogin,
|
||||
},
|
||||
|
||||
actions: {
|
||||
// 用户登录
|
||||
async userLogin(loginForm: LoginForm) {
|
||||
try {
|
||||
const response = await loginApi(loginForm) as unknown as LoginResponse
|
||||
|
||||
const response = (await loginApi(
|
||||
loginForm
|
||||
)) as unknown as LoginResponse;
|
||||
|
||||
// 后端返回格式为 { token: string, user_info: UserInfo }
|
||||
if (response && response.token && response.user_info) {
|
||||
const { token, user_info } = response
|
||||
|
||||
const { token, user_info } = response;
|
||||
|
||||
// 保存登录状态
|
||||
this.token = token
|
||||
this.userInfo = user_info
|
||||
this.isLogin = true
|
||||
|
||||
this.token = token;
|
||||
this.userInfo = user_info;
|
||||
this.isLogin = true;
|
||||
|
||||
// 保存到 localStorage
|
||||
localStorage.setItem(ENV_CONFIG.TOKEN_KEY, token)
|
||||
localStorage.setItem(ENV_CONFIG.USER_INFO_KEY, JSON.stringify(user_info))
|
||||
|
||||
return user_info
|
||||
localStorage.setItem(ENV_CONFIG.TOKEN_KEY, token);
|
||||
localStorage.setItem(
|
||||
ENV_CONFIG.USER_INFO_KEY,
|
||||
JSON.stringify(user_info)
|
||||
);
|
||||
|
||||
return user_info;
|
||||
} else {
|
||||
throw new Error('登录响应数据格式错误')
|
||||
throw new Error("登录响应数据格式错误");
|
||||
}
|
||||
} catch (error: any) {
|
||||
// 处理不同类型的错误
|
||||
if (error.response?.data?.msg) {
|
||||
throw new Error(error.response.data.msg)
|
||||
throw new Error(error.response.data.msg);
|
||||
} else if (error.message) {
|
||||
throw new Error(error.message)
|
||||
throw new Error(error.message);
|
||||
} else {
|
||||
throw new Error('登录失败,请稍后重试')
|
||||
throw new Error("登录失败,请稍后重试");
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -80,54 +89,54 @@ const useUserStore = defineStore('user', {
|
||||
// 用户登出
|
||||
async userLogout() {
|
||||
try {
|
||||
await logoutApi()
|
||||
await logoutApi();
|
||||
} catch (error) {
|
||||
console.error('登出API调用失败:', error)
|
||||
console.error("登出API调用失败:", error);
|
||||
} finally {
|
||||
this.token = ''
|
||||
this.userInfo = null
|
||||
this.isLogin = false
|
||||
|
||||
this.token = "";
|
||||
this.userInfo = null;
|
||||
this.isLogin = false;
|
||||
|
||||
// 清除 localStorage
|
||||
localStorage.removeItem(ENV_CONFIG.TOKEN_KEY)
|
||||
localStorage.removeItem(ENV_CONFIG.USER_INFO_KEY)
|
||||
localStorage.removeItem(ENV_CONFIG.TOKEN_KEY);
|
||||
localStorage.removeItem(ENV_CONFIG.USER_INFO_KEY);
|
||||
}
|
||||
},
|
||||
|
||||
// 初始化用户状态(从 localStorage 恢复)
|
||||
async initUserState() {
|
||||
const token = localStorage.getItem(ENV_CONFIG.TOKEN_KEY)
|
||||
const userInfoStr = localStorage.getItem(ENV_CONFIG.USER_INFO_KEY)
|
||||
|
||||
const token = localStorage.getItem(ENV_CONFIG.TOKEN_KEY);
|
||||
const userInfoStr = localStorage.getItem(ENV_CONFIG.USER_INFO_KEY);
|
||||
|
||||
if (token && userInfoStr) {
|
||||
try {
|
||||
// 验证token是否有效
|
||||
const response = await getUserInfoApi() as unknown as UserInfo
|
||||
|
||||
const response = (await getUserInfoApi()) as unknown as UserInfo;
|
||||
|
||||
if (response && response.id) {
|
||||
this.token = token
|
||||
this.userInfo = response
|
||||
this.isLogin = true
|
||||
this.token = token;
|
||||
this.userInfo = response;
|
||||
this.isLogin = true;
|
||||
} else {
|
||||
// token无效,清除本地存储但不调用logout API
|
||||
this.clearUserState()
|
||||
this.clearUserState();
|
||||
}
|
||||
} catch (error: any) {
|
||||
console.error('获取用户信息失败:', error)
|
||||
console.error("获取用户信息失败:", error);
|
||||
// 如果有本地token和用户信息,先保持登录状态
|
||||
// 只有在明确知道token无效时才清除
|
||||
if (error.response?.status === 401) {
|
||||
this.clearUserState()
|
||||
this.clearUserState();
|
||||
} else {
|
||||
// 网络错误或其他错误,使用本地存储的数据
|
||||
try {
|
||||
const userInfo = JSON.parse(userInfoStr)
|
||||
this.token = token
|
||||
this.userInfo = userInfo
|
||||
this.isLogin = true
|
||||
const userInfo = JSON.parse(userInfoStr);
|
||||
this.token = token;
|
||||
this.userInfo = userInfo;
|
||||
this.isLogin = true;
|
||||
} catch (parseError) {
|
||||
// 本地数据解析失败,清除状态
|
||||
this.clearUserState()
|
||||
this.clearUserState();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -136,21 +145,23 @@ const useUserStore = defineStore('user', {
|
||||
|
||||
// 清除用户状态(不调用API)
|
||||
clearUserState() {
|
||||
this.token = ''
|
||||
this.userInfo = null
|
||||
this.isLogin = false
|
||||
|
||||
this.token = "";
|
||||
this.userInfo = null;
|
||||
this.isLogin = false;
|
||||
|
||||
// 清除 localStorage
|
||||
localStorage.removeItem(ENV_CONFIG.TOKEN_KEY)
|
||||
localStorage.removeItem(ENV_CONFIG.USER_INFO_KEY)
|
||||
}
|
||||
localStorage.removeItem(ENV_CONFIG.TOKEN_KEY);
|
||||
localStorage.removeItem(ENV_CONFIG.USER_INFO_KEY);
|
||||
localStorage.removeItem(ENV_CONFIG.USER_STORE_KEY);
|
||||
localStorage.removeItem(ENV_CONFIG.APPFASTNAV_KEY);
|
||||
},
|
||||
},
|
||||
|
||||
persist: {
|
||||
key: 'user-store',
|
||||
key: "user-store",
|
||||
storage: localStorage,
|
||||
paths: ['token', 'userInfo', 'isLogin']
|
||||
}
|
||||
})
|
||||
paths: ["token", "userInfo", "isLogin"],
|
||||
},
|
||||
});
|
||||
|
||||
export default useUserStore
|
||||
export default useUserStore;
|
||||
|
||||
Reference in New Issue
Block a user