feat: 更新mock数据和用户store逻辑
重构用户模块的异步函数,添加租户和租户计划的mock接口,优化字典表单和请求拦截器的实现。
This commit is contained in:
@@ -18,37 +18,24 @@ export const useUserStore = defineStore("user", () => {
|
||||
|
||||
/**
|
||||
* 登录
|
||||
*
|
||||
* @param {LoginRequest}
|
||||
* @returns
|
||||
*/
|
||||
function login(loginRequest: LoginRequest) {
|
||||
return new Promise<void>((resolve, reject) => {
|
||||
AuthAPI.login(loginRequest)
|
||||
.then((data) => {
|
||||
const { accessToken, refreshToken } = data;
|
||||
// 保存记住我状态和token
|
||||
rememberMe.value = loginRequest.rememberMe ?? false;
|
||||
AuthStorage.setTokens(accessToken, refreshToken, rememberMe.value);
|
||||
resolve();
|
||||
})
|
||||
.catch((error) => {
|
||||
reject(error);
|
||||
});
|
||||
});
|
||||
async function login(loginRequest: LoginRequest): Promise<void> {
|
||||
const { accessToken, refreshToken } = await AuthAPI.login(loginRequest);
|
||||
rememberMe.value = loginRequest.rememberMe ?? false;
|
||||
AuthStorage.setTokens(accessToken, refreshToken, rememberMe.value);
|
||||
}
|
||||
|
||||
let refreshPromise: Promise<void> | null = null;
|
||||
|
||||
/**
|
||||
* 刷新 token(单飞)。
|
||||
* 刷新 token(单飞模式)
|
||||
*
|
||||
* 多个并发请求遇到 token 过期时,共享同一次 refresh 请求。
|
||||
*/
|
||||
function refreshTokenOnce() {
|
||||
function refreshTokenOnce(): Promise<void> {
|
||||
if (refreshPromise) return refreshPromise;
|
||||
|
||||
refreshPromise = refreshToken().finally(() => {
|
||||
refreshPromise = doRefreshToken().finally(() => {
|
||||
refreshPromise = null;
|
||||
});
|
||||
|
||||
@@ -57,118 +44,84 @@ export const useUserStore = defineStore("user", () => {
|
||||
|
||||
/**
|
||||
* 获取用户信息
|
||||
*
|
||||
* @returns {UserInfo} 用户信息
|
||||
*/
|
||||
function getUserInfo() {
|
||||
return new Promise<UserInfo>((resolve, reject) => {
|
||||
UserAPI.getInfo()
|
||||
.then((data) => {
|
||||
if (!data) {
|
||||
reject("Verification failed, please Login again.");
|
||||
return;
|
||||
}
|
||||
Object.assign(userInfo.value, { ...data });
|
||||
resolve(data);
|
||||
})
|
||||
.catch((error) => {
|
||||
reject(error);
|
||||
});
|
||||
});
|
||||
async function getUserInfo(): Promise<UserInfo> {
|
||||
const data = await UserAPI.getInfo();
|
||||
if (!data) {
|
||||
throw new Error("Verification failed, please Login again.");
|
||||
}
|
||||
Object.assign(userInfo.value, data);
|
||||
return data;
|
||||
}
|
||||
|
||||
/**
|
||||
* 登出
|
||||
*/
|
||||
function logout() {
|
||||
return new Promise<void>((resolve, reject) => {
|
||||
AuthAPI.logout()
|
||||
.then(() => {
|
||||
// 重置所有系统状态
|
||||
resetAllState();
|
||||
resolve();
|
||||
})
|
||||
.catch((error) => {
|
||||
reject(error);
|
||||
});
|
||||
});
|
||||
async function logout(): Promise<void> {
|
||||
await AuthAPI.logout();
|
||||
resetAllState();
|
||||
}
|
||||
|
||||
/**
|
||||
* 重置所有系统状态
|
||||
*
|
||||
* 统一处理所有清理工作,包括用户凭证、路由、缓存等
|
||||
*/
|
||||
function resetAllState() {
|
||||
function resetAllState(): void {
|
||||
// 1. 重置用户状态
|
||||
resetUserState();
|
||||
|
||||
// 2. 重置其他模块状态
|
||||
// 重置路由
|
||||
usePermissionStoreHook().resetRouter();
|
||||
// 清除字典缓存
|
||||
useDictStoreHook().clearDictCache();
|
||||
// 清除标签视图
|
||||
useTagsViewStore().delAllViews();
|
||||
|
||||
// 3. 清理 WebSocket 连接
|
||||
cleanupWebSocket();
|
||||
console.log("[UserStore] WebSocket connections cleaned up");
|
||||
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
/**
|
||||
* 重置用户状态
|
||||
*
|
||||
* 仅处理用户模块内的状态
|
||||
*/
|
||||
function resetUserState() {
|
||||
// 清除用户凭证
|
||||
function resetUserState(): void {
|
||||
AuthStorage.clearAuth();
|
||||
// 重置用户信息
|
||||
userInfo.value = {} as UserInfo;
|
||||
}
|
||||
|
||||
/**
|
||||
* 刷新 token
|
||||
*/
|
||||
function refreshToken() {
|
||||
const refreshToken = AuthStorage.getRefreshToken();
|
||||
async function doRefreshToken(): Promise<void> {
|
||||
const currentRefreshToken = AuthStorage.getRefreshToken();
|
||||
|
||||
if (!refreshToken) {
|
||||
return Promise.reject(new Error("没有有效的刷新令牌"));
|
||||
if (!currentRefreshToken) {
|
||||
throw new Error("没有有效的刷新令牌");
|
||||
}
|
||||
|
||||
return new Promise<void>((resolve, reject) => {
|
||||
AuthAPI.refreshToken(refreshToken)
|
||||
.then((data) => {
|
||||
const { accessToken, refreshToken: newRefreshToken } = data;
|
||||
// 更新令牌,保持当前记住我状态
|
||||
AuthStorage.setTokens(accessToken, newRefreshToken, AuthStorage.getRememberMe());
|
||||
resolve();
|
||||
})
|
||||
.catch((error) => {
|
||||
console.log(" refreshToken 刷新失败", error);
|
||||
reject(error);
|
||||
});
|
||||
});
|
||||
const { accessToken, refreshToken: newRefreshToken } =
|
||||
await AuthAPI.refreshToken(currentRefreshToken);
|
||||
AuthStorage.setTokens(accessToken, newRefreshToken, AuthStorage.getRememberMe());
|
||||
}
|
||||
|
||||
return {
|
||||
userInfo,
|
||||
rememberMe,
|
||||
isLoggedIn: () => !!AuthStorage.getAccessToken(),
|
||||
getUserInfo,
|
||||
login,
|
||||
logout,
|
||||
getUserInfo,
|
||||
resetAllState,
|
||||
resetUserState,
|
||||
refreshToken,
|
||||
refreshToken: doRefreshToken,
|
||||
refreshTokenOnce,
|
||||
};
|
||||
});
|
||||
|
||||
/**
|
||||
* 在组件外部使用UserStore的钩子函数
|
||||
* 在组件外部使用 UserStore 的钩子函数
|
||||
*
|
||||
* @see https://pinia.vuejs.org/core-concepts/outside-component-usage.html
|
||||
*/
|
||||
export function useUserStoreHook() {
|
||||
|
||||
@@ -78,8 +78,7 @@ http.interceptors.response.use(
|
||||
|
||||
const token = AuthStorage.getAccessToken();
|
||||
if (token) {
|
||||
config.headers = config.headers || ({} as any);
|
||||
(config.headers as any).Authorization = `Bearer ${token}`;
|
||||
config.headers.set("Authorization", `Bearer ${token}`);
|
||||
}
|
||||
|
||||
return http(config);
|
||||
|
||||
@@ -184,7 +184,11 @@ const dialogState = reactive({
|
||||
});
|
||||
|
||||
// 表单数据
|
||||
const formData = reactive<DictItemForm>({});
|
||||
const formData = reactive<DictItemForm>({
|
||||
sort: 1,
|
||||
status: 1,
|
||||
tagType: "",
|
||||
});
|
||||
|
||||
// 标签类型选项
|
||||
const tagType = ["primary", "success", "info", "warning", "danger"] as const;
|
||||
@@ -239,6 +243,7 @@ function handleSelectionChange(selection: DictItem[]): void {
|
||||
* @param row 字典项数据(编辑时传入)
|
||||
*/
|
||||
function openDialog(row?: DictItem): void {
|
||||
resetForm();
|
||||
dialogState.visible = true;
|
||||
dialogState.title = row ? "编辑字典值" : "新增字典值";
|
||||
|
||||
@@ -249,6 +254,17 @@ function openDialog(row?: DictItem): void {
|
||||
}
|
||||
}
|
||||
|
||||
function resetForm(): void {
|
||||
dataFormRef.value?.clearValidate();
|
||||
formData.id = undefined;
|
||||
formData.dictCode = dictCode.value;
|
||||
formData.label = undefined;
|
||||
formData.value = undefined;
|
||||
formData.sort = 1;
|
||||
formData.status = 1;
|
||||
formData.tagType = "";
|
||||
}
|
||||
|
||||
/**
|
||||
* 提交表单
|
||||
*/
|
||||
@@ -286,11 +302,7 @@ function handleSubmit(): void {
|
||||
function closeDialog(): void {
|
||||
dialogState.visible = false;
|
||||
dataFormRef.value?.resetFields();
|
||||
dataFormRef.value?.clearValidate();
|
||||
formData.id = undefined;
|
||||
formData.sort = 1;
|
||||
formData.status = 1;
|
||||
formData.tagType = "";
|
||||
resetForm();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -162,7 +162,9 @@ const dialogState = reactive({
|
||||
});
|
||||
|
||||
// 表单数据
|
||||
const formData = reactive<DictTypeForm>({});
|
||||
const formData = reactive<DictTypeForm>({
|
||||
status: 1,
|
||||
});
|
||||
|
||||
// 验证规则
|
||||
const rules: FormRules = {
|
||||
@@ -213,6 +215,7 @@ function handleSelectionChange(selection: DictTypeItem[]): void {
|
||||
* 新增按钮点击事件
|
||||
*/
|
||||
function handleCreateClick(): void {
|
||||
resetForm();
|
||||
dialogState.visible = true;
|
||||
dialogState.title = "新增字典";
|
||||
}
|
||||
@@ -222,6 +225,7 @@ function handleCreateClick(): void {
|
||||
* @param id 字典ID
|
||||
*/
|
||||
function handleEditClick(id: string): void {
|
||||
resetForm();
|
||||
dialogState.visible = true;
|
||||
dialogState.title = "修改字典";
|
||||
DictAPI.getFormData(id).then((data) => {
|
||||
@@ -229,6 +233,15 @@ function handleEditClick(id: string): void {
|
||||
});
|
||||
}
|
||||
|
||||
function resetForm(): void {
|
||||
dataFormRef.value?.clearValidate();
|
||||
formData.id = undefined;
|
||||
formData.name = undefined;
|
||||
formData.dictCode = undefined;
|
||||
formData.status = 1;
|
||||
formData.remark = undefined;
|
||||
}
|
||||
|
||||
/**
|
||||
* 提交表单
|
||||
*/
|
||||
@@ -264,8 +277,7 @@ function handleSubmit(): void {
|
||||
function closeDialog(): void {
|
||||
dialogState.visible = false;
|
||||
dataFormRef.value?.resetFields();
|
||||
dataFormRef.value?.clearValidate();
|
||||
formData.id = undefined;
|
||||
resetForm();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user