vue3实战项目第八章微商城后端无法实现登录跳转页面,只显示请求失败,应该怎样处理

vue3实战项目第八章微商城后端无法实现登录跳转页面,只显示请求失败,应该怎样处理

关注让码农阿豪来帮你解答,本回答参考通义千问qwen-plus模型编写提供,如果还有疑问可以评论或留言### 问题描述 在 Vue 3 实战项目第八章微商城后端实现中,登录功能无法正常跳转到目标页面,只显示请求失败。需要解决该问题。
确保后端接口返回的数据格式正确,并且接口能够正常响应。
示例代码(后端):
// 使用 Express 框架示例
const express = require('express');
const app = express();
app.post('/api/login', (req, res) => {
const { username, password } = req.body;
if (username === 'admin' && password === '123456') {
res.json({ success: true, token: 'your_token_here' });
} else {
res.status(401).json({ success: false, message: 'Invalid credentials' });
}
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
确保前端发送的请求参数和请求方式正确。
示例代码(前端):
// 使用 Axios 发送请求
import axios from 'axios';
const login = async (username, password) => {
try {
const response = await axios.post('/api/login', { username, password });
if (response.data.success) {
localStorage.setItem('token', response.data.token);
return true;
} else {
throw new Error(response.data.message);
}
} catch (error) {
console.error('Login failed:', error);
return false;
}
};
export default login;
确保路由配置正确,能够根据登录结果进行跳转。
示例代码(路由配置):
// router/index.js
import { createRouter, createWebHistory } from 'vue-router';
import Home from '../views/Home.vue';
import Login from '../views/Login.vue';
import Dashboard from '../views/Dashboard.vue';
const routes = [
{ path: '/', component: Home },
{ path: '/login', component: Login },
{ path: '/dashboard', component: Dashboard, meta: { requiresAuth: true } },
];
const router = createRouter({
history: createWebHistory(),
routes,
});
router.beforeEach((to, from, next) => {
const token = localStorage.getItem('token');
if (to.meta.requiresAuth && !token) {
next('/login');
} else {
next();
}
});
export default router;
确保使用 Vuex 管理状态时,状态更新正确。
示例代码(Vuex):
// store/index.js
import { createStore } from 'vuex';
const store = createStore({
state: {
token: localStorage.getItem('token') || null,
},
mutations: {
setToken(state, token) {
state.token = token;
localStorage.setItem('token', token);
},
},
actions: {
login({ commit }, { username, password }) {
return login(username, password).then(success => {
if (success) {
commit('setToken', 'your_token_here');
return true;
}
return false;
});
},
},
getters: {
isLoggedIn: state => !!state.token,
},
});
export default store;
假设你有一个简单的微商城项目,包含登录、主页和仪表盘页面。以下是完整的解决方案:
// server.js
const express = require('express');
const app = express();
const cors = require('cors');
app.use(cors());
app.use(express.json());
app.post('/api/login', (req, res) => {
const { username, password } = req.body;
if (username === 'admin' && password === '123456') {
res.json({ success: true, token: 'your_token_here' });
} else {
res.status(401).json({ success: false, message: 'Invalid credentials' });
}
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
// main.js
import { createApp } from 'vue';
import App from './App.vue';
import router from './router';
import store from './store';
import axios from 'axios';
createApp(App)
.use(router)
.use(store)
.mount('#app');
axios.defaults.baseURL = 'http://localhost:3000/api';
// store/index.js
import { createStore } from 'vuex';
const store = createStore({
state: {
token: localStorage.getItem('token') || null,
},
mutations: {
setToken(state, token) {
state.token = token;
localStorage.setItem('token', token);
},
},
actions: {
login({ commit }, { username, password }) {
return axios.post('/login', { username, password }).then(response => {
if (response.data.success) {
commit('setToken', response.data.token);
return true;
}
return false;
});
},
},
getters: {
isLoggedIn: state => !!state.token,
},
});
export default store;
// router/index.js
import { createRouter, createWebHistory } from 'vue-router';
import Home from '../views/Home.vue';
import Login from '../views/Login.vue';
import Dashboard from '../views/Dashboard.vue';
const routes = [
{ path: '/', component: Home },
{ path: '/login', component: Login },
{ path: '/dashboard', component: Dashboard, meta: { requiresAuth: true } },
];
const router = createRouter({
history: createWebHistory(),
routes,
});
router.beforeEach((to, from, next) => {
const token = localStorage.getItem('token');
if (to.meta.requiresAuth && !token) {
next('/login');
} else {
next();
}
});
export default router;
// views/Login.vue
<template>
<div>
<h2>Login</h2>
<form @submit.prevent="handleLogin">
<input v-model="username" type="text" placeholder="Username" required />
<input v-model="password" type="password" placeholder="Password" required />
<button type="submit">Login</button>
</form>
</div>
</template>
<script>
import { ref } from 'vue';
import { useStore } from 'vuex';
import { useRouter } from 'vue-router';
export default {
setup() {
const store = useStore();
const router = useRouter();
const username = ref('');
const password = ref('');
const handleLogin = async () => {
const success = await store.dispatch('login', { username: username.value, password: password.value });
if (success) {
router.push('/dashboard');
} else {
alert('Login failed');
}
};
return {
username,
password,
handleLogin,
};
},
};
</script>
通过以上步骤和示例代码,你应该能够解决登录跳转页面的问题。如果问题仍然存在,请检查网络请求是否被拦截或服务器是否有其他限制。