feat(auth): 实现登录认证和权限控制功能
- 添加用户登录和登出功能 - 实现 Token 过期和无效的错误处理 - 添加路由权限控制,未登录用户重定向到登录页 - 优化登录失败的错误提示 - 修复搜索功能的返回数据问题
This commit is contained in:
@@ -864,7 +864,7 @@ const handleSearch = async () => {
|
||||
}
|
||||
try {
|
||||
const response = await searchMarkdown(searchKeyword.value);
|
||||
groupMarkdownFiles.value = response.data;
|
||||
groupMarkdownFiles.value = response.data || [];
|
||||
} catch (error) {
|
||||
ElMessage.error('搜索失败: ' + error.message);
|
||||
}
|
||||
|
||||
@@ -65,7 +65,7 @@ const handleLogin = async () => {
|
||||
ElMessage.success('登录成功');
|
||||
router.push('/home');
|
||||
} else {
|
||||
ElMessage.error('用户名或密码错误');
|
||||
// ElMessage.error('用户名或密码错误'); // 错误已由 axios 拦截器处理
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -4,6 +4,8 @@ import LoginPage from '../components/LoginPage.vue';
|
||||
import RegisterPage from '../components/RegisterPage.vue';
|
||||
import TrashPage from '../components/TrashPage.vue';
|
||||
|
||||
import { useUserStore } from '../stores/user';
|
||||
|
||||
const routes = [
|
||||
{
|
||||
path: '/',
|
||||
@@ -12,7 +14,8 @@ const routes = [
|
||||
{
|
||||
path: '/home',
|
||||
name: 'Home',
|
||||
component: HomePage
|
||||
component: HomePage,
|
||||
meta: { requiresAuth: true }
|
||||
},
|
||||
{
|
||||
path: '/login',
|
||||
@@ -27,7 +30,8 @@ const routes = [
|
||||
{
|
||||
path: '/trash',
|
||||
name: 'Trash',
|
||||
component: TrashPage
|
||||
component: TrashPage,
|
||||
meta: { requiresAuth: true }
|
||||
}
|
||||
];
|
||||
|
||||
@@ -36,4 +40,15 @@ const router = createRouter({
|
||||
routes
|
||||
});
|
||||
|
||||
router.beforeEach((to, from, next) => {
|
||||
const userStore = useUserStore();
|
||||
const requiresAuth = to.matched.some(record => record.meta.requiresAuth);
|
||||
|
||||
if (requiresAuth && !userStore.isLoggedIn) {
|
||||
next('/login');
|
||||
} else {
|
||||
next();
|
||||
}
|
||||
});
|
||||
|
||||
export default router;
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
import axios from 'axios'
|
||||
import { useUserStore } from '../stores/user'
|
||||
import { ElMessage } from 'element-plus'
|
||||
import router from '../router'
|
||||
|
||||
const instance = axios.create({
|
||||
baseURL: import.meta.env.VITE_API_BASE_URL,
|
||||
@@ -29,18 +31,30 @@ instance.interceptors.response.use(
|
||||
response => {
|
||||
const res = response.data;
|
||||
if (res.code !== 200) {
|
||||
// ElMessage({
|
||||
// message: res.msg || 'Error',
|
||||
// type: 'error',
|
||||
// duration: 5 * 1000
|
||||
// });
|
||||
ElMessage({
|
||||
message: res.msg || 'Error',
|
||||
type: 'error',
|
||||
duration: 5 * 1000
|
||||
});
|
||||
return Promise.reject(new Error(res.msg || 'Error'));
|
||||
} else {
|
||||
return res.data;
|
||||
}
|
||||
},
|
||||
error => {
|
||||
return Promise.reject(error)
|
||||
if (error.response && error.response.status === 401) {
|
||||
const userStore = useUserStore();
|
||||
userStore.logout();
|
||||
ElMessage.error('登录已过期,请重新登录');
|
||||
router.push('/login');
|
||||
} else {
|
||||
ElMessage({
|
||||
message: error.message,
|
||||
type: 'error',
|
||||
duration: 5 * 1000
|
||||
});
|
||||
}
|
||||
return Promise.reject(error);
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user