239
社区成员




这个作业属于哪个课程 | FZU_SE_teacherW_4 |
---|---|
这个作业要求在哪里 | 软件工程实践总结&个人技术博客 |
这个作业的目标 | 软件工程实践总结&个人技术博客 |
其他参考文献 | 《构建之法》 |
Vue.js 是一个用于构建现代 Web 应用的前端框架。它以其简洁的语法和强大的响应式机制在前端开发中占有一席之地。本项目中,我通过学习并应用 Vue.js,成功将前端与后端的交互做得更加流畅,解决了数据绑定、组件化开发、接口调试等技术难题。
Vue.js 是一个轻量级的 JavaScript 框架,主要用于构建交互式用户界面。它采用了基于组件的开发模式,使得项目的维护和扩展变得更加简便。Vue 的核心功能包括响应式数据绑定和组件化结构。通过数据绑定,可以使页面内容与数据状态实时同步,避免了传统开发中复杂的 DOM 操作。
在本项目中,我使用 Vue 来构建所有前端界面,主要采用了以下几项技术:
// @/utiles/apiClient.ts
import router from "@/router";
import axios from "axios";
import { ElMessage } from "element-plus"; // 引入 Element Plus 的消息提示组件
const apiClient = axios.create({
baseURL: "url", // 后端地址
timeout: 5000, // 设置超时时间
});
// 请求拦截器:从 localStorage 中获取 Token 并附加到请求头
apiClient.interceptors.request.use(
(config) => {
const token = localStorage.getItem("token"); // 从 localStorage 获取 Token
if (token) {
config.headers["Authorization"] = `Bearer ${token}`;
}
return config;
},
(error) => {
return Promise.reject(error);
}
);
在这个部分,我们创建了一个apiClient
实例,并配置了请求拦截器。每次请求发出时,我们会从localStorage
中获取Token,并将其附加到请求头的Authorization
字段。这样可以确保只有在用户已登录并拥有有效Token的情况下,才能正常访问后端接口。
// 响应拦截器:处理错误(如 401 未授权)
apiClient.interceptors.response.use(
(response) => response,
(error) => {
if (error.response?.status === 401) {
// Token 无效或过期,清除存储并跳转到登录页面
// 显示错误消息
ElMessage.error("登录状态无效或已过期,请重新登录");
// 清除本地存储的 token 和用户名
localStorage.removeItem("token");
localStorage.removeItem("username");
// 跳转到登录页面
router.push("/login");
}
return Promise.reject(error);
}
);
当后端返回401 Unauthorized
状态码时,表示Token无效或已过期。此时,我们会清除存储的Token,并提示用户重新登录,最后跳转到登录页面。这样可以确保用户在Token过期后无法继续访问敏感数据。
import { defineStore } from 'pinia';
import apiClient from "@/utils/apiClient";
import type { UserInfo } from "@/types";
export const useAuthStore = defineStore('auth', {
state: () => ({
isLoggedIn: false, // 登录状态
username: '', // 用户名
hasMessages: false, // 是否有新消息
userInfo: null as UserInfo | null, // 用户信息
}),
actions: {
// 登录操作
async login(user: string, token: string) {
this.isLoggedIn = true;
this.username = user; // 存储用户名
localStorage.setItem('token', token); // 存储 token
localStorage.setItem('username', user); // 存储用户名
// 获取用户信息
try {
const response = await apiClient.get<UserInfo>(`/api/users/getInfoByUsername/${user}`);
this.userInfo = response.data; // 存储用户信息
} catch (error) {
console.error("登录后获取用户信息失败:", error);
this.logout(); // 如果获取用户信息失败,执行登出
}
},
// 登出操作
logout() {
this.isLoggedIn = false;
this.username = ''; // 清空用户名
this.hasMessages = false; // 清空消息状态
this.userInfo = null; // 清空用户信息
localStorage.removeItem('token'); // 清除 token
localStorage.removeItem('username'); // 清除用户名
},
// 设置消息状态
setMessages(status: boolean) {
this.hasMessages = status;
},
// 初始化状态(用于刷新时恢复状态)
async initializeState() {
const token = localStorage.getItem('token');
const username = localStorage.getItem('username');
if (token && username) {
try {
const response = await apiClient.get<UserInfo>(`/api/users/getInfoByUsername/${username}`);
const data: UserInfo = response.data;
this.isLoggedIn = true;
this.username = username;
this.userInfo = data;
} catch (error) {
console.error("Failed to validate token or fetch user info:", error);
this.logout();
}
} else {
// 如果本地没有 token 和 username,则清空 userInfo
this.userInfo = null;
}
}
},
});
随着项目功能逐渐增加,管理全局状态变得尤为重要。我选择了 Pinia 作为状态管理库,它与 Vue 3 深度集成。Pinia 提供了简单的 API 来管理应用中的全局状态,支持多个 store,可以让每个 store 管理一个模块的状态。
在开发过程中,遇到过接口请求失败的情况。具体问题是当我们发送请求时,返回的状态码是 500,表示服务器端出现了错误。为了解决这个问题,我们首先检查了接口路径是否正确,发现路径没有问题。然后,与后端开发人员确认了接口的返回格式,最终发现是接口返回的 JSON 格式不符合前端预期,导致了处理错误。
解决方法:
try...catch
语句捕获错误,确保前端可以根据不同的错误信息显示合适的提示。解决方法:
Access-Control-Allow-Origin
。在项目初期,状态管理存在混乱的情况,主要是因为在多个组件之间共享数据时,修改了同一个状态,但没有统一的更新机制,导致了状态不一致的问题。
解决方法:
在实际开发中,前后端协作时经常会遇到Token过期的问题。为了避免用户在Token过期后继续使用系统,我们需要通过响应拦截器捕获401错误,并提示用户重新登录。处理方案如上所示。
与后端的接口协作时,我们需要与后端团队密切沟通,确保Token认证的统一性和接口返回的一致性。特别是在处理Token过期时,前后端的协同工作至关重要。
通过学习和应用 Vue.js,我深入理解了前端开发的基本概念和最佳实践。Vue 的组件化结构和响应式机制,让项目的开发变得更加模块化和高效。同时,通过与后端接口的对接,我也积累了处理跨域问题、接口调试等经验。
使用 Vue、Pinia 和 Axios 等技术,可以大大提高项目的开发效率,尤其是在多人协作的环境中。通过模块化管理组件和状态,团队成员能够更好地协作,减少冲突并提高代码的可维护性。
最终,这些技术的应用不仅使项目能够顺利进行,也提升了我的前端开发能力,为后续项目的开发打下了坚实的基础。