初始化仓库
This commit is contained in:
66
src/store/auth.ts
Normal file
66
src/store/auth.ts
Normal file
@@ -0,0 +1,66 @@
|
||||
import { defineStore } from 'pinia';
|
||||
import { ref } from 'vue';
|
||||
import { useRouter } from 'vue-router';
|
||||
import Cookies from 'js-cookie';
|
||||
import { message } from 'ant-design-vue';
|
||||
|
||||
import { useUserStore } from './user';
|
||||
import { login } from '@/api/system';
|
||||
import type { LoginInfo } from '@/api/system/model';
|
||||
|
||||
const TOKEN_KEY = 'token';
|
||||
|
||||
export const useAuthStore = defineStore('auth', () => {
|
||||
const router = useRouter();
|
||||
const userStore = useUserStore();
|
||||
|
||||
const loginLoading = ref(false);
|
||||
const token = ref(Cookies.get(TOKEN_KEY) || null);
|
||||
|
||||
function setToken(newToken: string) {
|
||||
token.value = newToken;
|
||||
Cookies.set(TOKEN_KEY, newToken);
|
||||
}
|
||||
|
||||
function clearToken() {
|
||||
token.value = null;
|
||||
Cookies.remove(TOKEN_KEY);
|
||||
}
|
||||
|
||||
async function authLogin(params: LoginInfo) {
|
||||
try {
|
||||
loginLoading.value = true;
|
||||
const res = await login(params);
|
||||
if (res.code === 200) {
|
||||
setToken(res.token as string);
|
||||
await userStore.fetchUserInfo();
|
||||
message.success('登录成功');
|
||||
await router.push('/');
|
||||
return res;
|
||||
} else {
|
||||
// 抛出错误,让调用方处理
|
||||
throw new Error(res.msg || '登录失败');
|
||||
}
|
||||
} catch (error) {
|
||||
throw error;
|
||||
} finally {
|
||||
loginLoading.value = false;
|
||||
}
|
||||
}
|
||||
|
||||
async function logout() {
|
||||
// 在实际应用中,这里可以调用后端的退出登录接口
|
||||
// await doLogoutApi();
|
||||
clearToken();
|
||||
userStore.clearUserInfo();
|
||||
await router.push('/login');
|
||||
message.success('已成功退出');
|
||||
}
|
||||
|
||||
return {
|
||||
token,
|
||||
loginLoading,
|
||||
authLogin,
|
||||
logout,
|
||||
};
|
||||
});
|
||||
2
src/store/index.ts
Normal file
2
src/store/index.ts
Normal file
@@ -0,0 +1,2 @@
|
||||
export * from './auth';
|
||||
export * from './user';
|
||||
22
src/store/user.ts
Normal file
22
src/store/user.ts
Normal file
@@ -0,0 +1,22 @@
|
||||
import { defineStore } from 'pinia';
|
||||
import Cookies from 'js-cookie';
|
||||
|
||||
const USERNAME_KEY = 'username';
|
||||
|
||||
export const useUserStore = defineStore('user', {
|
||||
state: () => ({
|
||||
username: Cookies.get(USERNAME_KEY) || null,
|
||||
}),
|
||||
actions: {
|
||||
async fetchUserInfo() {
|
||||
// Simulate API call
|
||||
const fetchedUsername = 'mock_user';
|
||||
this.username = fetchedUsername;
|
||||
Cookies.set(USERNAME_KEY, fetchedUsername);
|
||||
},
|
||||
clearUserInfo() {
|
||||
this.username = null;
|
||||
Cookies.remove(USERNAME_KEY);
|
||||
},
|
||||
},
|
||||
});
|
||||
Reference in New Issue
Block a user