7 changed files with 253 additions and 7 deletions
@ -0,0 +1,32 @@ |
|||||
|
import router from './router' |
||||
|
import { userStStore } from './stores/user' |
||||
|
import NProgress from 'nprogress' // progress bar
|
||||
|
import '@/components/nprogress.css' // progress bar style
|
||||
|
|
||||
|
NProgress.configure({ showSpinner: false }) // NProgress Configuration
|
||||
|
|
||||
|
// 登录页面
|
||||
|
const loginRoutePath = '/login' |
||||
|
// 白名单
|
||||
|
const whiteList = [loginRoutePath, '/404', '/401'] |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
// 路由守卫
|
||||
|
// router.beforeEach((to, from, next) => {
|
||||
|
// NProgress.start() // start progress bar
|
||||
|
|
||||
|
// // 获取用户store实例
|
||||
|
// const userStore = userStStore()
|
||||
|
// console.log(userStore.token,"user token")
|
||||
|
|
||||
|
// // 检查token
|
||||
|
// console.log("check token")
|
||||
|
|
||||
|
// })
|
||||
|
|
||||
|
// 路由守卫
|
||||
|
router.afterEach((to, from) => { |
||||
|
NProgress.done() // finish progress bar
|
||||
|
}) |
||||
@ -0,0 +1,171 @@ |
|||||
|
import { defineStore } from 'pinia' |
||||
|
import { api } from '@/api/axios' // 你的 API 配置
|
||||
|
|
||||
|
export const useAuthStore = defineStore('auth', { |
||||
|
state: () => ({ |
||||
|
// 用户信息
|
||||
|
user: null, |
||||
|
// 令牌
|
||||
|
token: localStorage.getItem('token') || null, |
||||
|
// 登录状态
|
||||
|
isLoggedIn: !!localStorage.getItem('token'), |
||||
|
// 加载状态
|
||||
|
isLoading: false, |
||||
|
// 错误信息
|
||||
|
error: null |
||||
|
}), |
||||
|
|
||||
|
getters: { |
||||
|
// 用户基本信息
|
||||
|
userInfo: (state) => state.user, |
||||
|
// 用户名
|
||||
|
userName: (state) => state.user?.username || state.user?.name || '用户', |
||||
|
// 用户角色
|
||||
|
userRole: (state) => state.user?.role || '', |
||||
|
// 是否有特定权限
|
||||
|
hasPermission: (state) => (permission) => { |
||||
|
return state.user?.permissions?.includes(permission) || false |
||||
|
}, |
||||
|
// 是否是管理员
|
||||
|
isAdmin: (state) => state.user?.role === 'admin' |
||||
|
}, |
||||
|
|
||||
|
actions: { |
||||
|
/** |
||||
|
* 用户登录 |
||||
|
*/ |
||||
|
async login(credentials) { |
||||
|
this.isLoading = true |
||||
|
this.error = null |
||||
|
|
||||
|
try { |
||||
|
const response = await api.post('/auth/login', credentials) |
||||
|
const { user, token } = response.data |
||||
|
|
||||
|
// 保存用户信息和令牌
|
||||
|
this.user = user |
||||
|
this.token = token |
||||
|
this.isLoggedIn = true |
||||
|
|
||||
|
// 保存到 localStorage
|
||||
|
localStorage.setItem('token', token) |
||||
|
localStorage.setItem('user', JSON.stringify(user)) |
||||
|
|
||||
|
// 设置 axios 默认授权头
|
||||
|
api.defaults.headers.common['Authorization'] = `Bearer ${token}` |
||||
|
|
||||
|
this.isLoading = false |
||||
|
return { success: true, user } |
||||
|
} catch (error) { |
||||
|
this.isLoading = false |
||||
|
this.error = error.response?.data?.message || '登录失败' |
||||
|
return { success: false, error: this.error } |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
/** |
||||
|
* 用户注册 |
||||
|
*/ |
||||
|
async register(userData) { |
||||
|
this.isLoading = true |
||||
|
this.error = null |
||||
|
|
||||
|
try { |
||||
|
const response = await api.post('/auth/register', userData) |
||||
|
const { user, token } = response.data |
||||
|
|
||||
|
// 自动登录
|
||||
|
this.user = user |
||||
|
this.token = token |
||||
|
this.isLoggedIn = true |
||||
|
|
||||
|
localStorage.setItem('token', token) |
||||
|
localStorage.setItem('user', JSON.stringify(user)) |
||||
|
api.defaults.headers.common['Authorization'] = `Bearer ${token}` |
||||
|
|
||||
|
this.isLoading = false |
||||
|
return { success: true, user } |
||||
|
} catch (error) { |
||||
|
this.isLoading = false |
||||
|
this.error = error.response?.data?.message || '注册失败' |
||||
|
return { success: false, error: this.error } |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
/** |
||||
|
* 用户退出登录 |
||||
|
*/ |
||||
|
logout() { |
||||
|
this.user = null |
||||
|
this.token = null |
||||
|
this.isLoggedIn = false |
||||
|
this.error = null |
||||
|
|
||||
|
// 清除 localStorage
|
||||
|
localStorage.removeItem('token') |
||||
|
localStorage.removeItem('user') |
||||
|
|
||||
|
// 移除 axios 授权头
|
||||
|
delete api.defaults.headers.common['Authorization'] |
||||
|
|
||||
|
// 可以在这里跳转到登录页
|
||||
|
if (this.router) { |
||||
|
this.router.push('/login') |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
/** |
||||
|
* 检查登录状态(页面刷新时调用) |
||||
|
*/ |
||||
|
async checkAuth() { |
||||
|
const token = localStorage.getItem('token') |
||||
|
const userData = localStorage.getItem('user') |
||||
|
|
||||
|
if (token && userData) { |
||||
|
try { |
||||
|
// 验证 token 是否有效
|
||||
|
const response = await api.get('/auth/me') |
||||
|
this.user = response.data.user |
||||
|
this.token = token |
||||
|
this.isLoggedIn = true |
||||
|
api.defaults.headers.common['Authorization'] = `Bearer ${token}` |
||||
|
} catch (error) { |
||||
|
// token 无效,清除状态
|
||||
|
this.logout() |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
/** |
||||
|
* 更新用户信息 |
||||
|
*/ |
||||
|
async updateUser(userData) { |
||||
|
try { |
||||
|
const response = await api.put('/auth/profile', userData) |
||||
|
this.user = { ...this.user, ...response.data.user } |
||||
|
|
||||
|
// 更新 localStorage
|
||||
|
localStorage.setItem('user', JSON.stringify(this.user)) |
||||
|
|
||||
|
return { success: true, user: this.user } |
||||
|
} catch (error) { |
||||
|
this.error = error.response?.data?.message || '更新失败' |
||||
|
return { success: false, error: this.error } |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
/** |
||||
|
* 清除错误信息 |
||||
|
*/ |
||||
|
clearError() { |
||||
|
this.error = null |
||||
|
}, |
||||
|
|
||||
|
/** |
||||
|
* 设置路由实例(用于退出登录后跳转) |
||||
|
*/ |
||||
|
setRouter(router) { |
||||
|
this.router = router |
||||
|
} |
||||
|
} |
||||
|
}) |
||||
@ -0,0 +1,31 @@ |
|||||
|
import { defineStore } from 'pinia'; |
||||
|
|
||||
|
export const userStStore = defineStore('user', { |
||||
|
state: () => { |
||||
|
return { |
||||
|
token: null, // 存储用户token
|
||||
|
user: null, // 存储用户对象
|
||||
|
isLoggedIn: false // 用户登录状态
|
||||
|
}; |
||||
|
}, |
||||
|
getters: { |
||||
|
getUser: (state) => state.user, |
||||
|
getIsLoggedIn: (state) => state.isLoggedIn, |
||||
|
token: (state) => state.token |
||||
|
}, |
||||
|
actions: { |
||||
|
setUser(user) { |
||||
|
this.user = user; |
||||
|
this.isLoggedIn = true; |
||||
|
}, |
||||
|
logout() { |
||||
|
this.token = null |
||||
|
this.user = null; |
||||
|
this.isLoggedIn = false; |
||||
|
}, |
||||
|
setToken(token) { |
||||
|
// this.token = token;
|
||||
|
console.log("set token") |
||||
|
} |
||||
|
}, |
||||
|
}); |
||||
Loading…
Reference in new issue