Search K
Appearance
Appearance
📊 SEO元描述:2024年最新Vue基础功能实现教程,详解用户认证系统、路由权限控制、数据请求封装、错误处理。包含完整企业级实现方案,适合Vue2开发者快速构建核心功能。
核心关键词:Vue基础功能2024、Vue用户认证、Vue权限控制、Vue数据请求、Vue错误处理、前端核心功能
长尾关键词:Vue用户登录实现、Vue路由权限配置、Vue axios封装、Vue错误处理机制、Vue JWT认证
通过本节Vue核心功能开发教程,你将系统性掌握:
Vue基础功能实现是什么?这是Vue2开发者构建企业级应用的核心技能。基础功能实现是建立应用核心架构和通用功能模块,也是现代Web应用开发的重要组成部分。
💡 学习建议:基础功能是应用的根基,建议深入理解每个模块的设计原理和实现细节
用户认证是现代Web应用的核心功能:
// 🎉 用户认证系统完整实现
// store/modules/auth.js
const auth = {
namespaced: true,
state: {
token: localStorage.getItem('token') || '',
user: JSON.parse(localStorage.getItem('user') || '{}'),
isAuthenticated: false,
loginLoading: false
},
mutations: {
SET_TOKEN(state, token) {
state.token = token
state.isAuthenticated = !!token
localStorage.setItem('token', token)
},
SET_USER(state, user) {
state.user = user
localStorage.setItem('user', JSON.stringify(user))
},
SET_LOGIN_LOADING(state, loading) {
state.loginLoading = loading
},
CLEAR_AUTH(state) {
state.token = ''
state.user = {}
state.isAuthenticated = false
localStorage.removeItem('token')
localStorage.removeItem('user')
}
},
actions: {
// 用户登录
async login({ commit }, credentials) {
try {
commit('SET_LOGIN_LOADING', true)
const response = await api.post('/auth/login', credentials)
const { token, user } = response.data
commit('SET_TOKEN', token)
commit('SET_USER', user)
return { success: true, user }
} catch (error) {
commit('CLEAR_AUTH')
throw error
} finally {
commit('SET_LOGIN_LOADING', false)
}
},
// 用户注册
async register({ commit }, userData) {
try {
const response = await api.post('/auth/register', userData)
const { token, user } = response.data
commit('SET_TOKEN', token)
commit('SET_USER', user)
return { success: true, user }
} catch (error) {
throw error
}
},
// 用户登出
logout({ commit }) {
commit('CLEAR_AUTH')
router.push('/login')
},
// 验证token有效性
async validateToken({ commit, state }) {
if (!state.token) return false
try {
const response = await api.get('/auth/validate')
commit('SET_USER', response.data.user)
return true
} catch (error) {
commit('CLEAR_AUTH')
return false
}
}
},
getters: {
isAuthenticated: state => state.isAuthenticated,
currentUser: state => state.user,
userRole: state => state.user.role || 'guest',
hasPermission: state => permission => {
return state.user.permissions?.includes(permission) || false
}
}
}路由权限控制确保用户只能访问有权限的页面:
// router/permission.js - 路由权限守卫
import router from './index'
import store from '@/store'
import { Message } from 'element-ui'
// 白名单路由(无需认证)
const whiteList = ['/login', '/register', '/404', '/403']
router.beforeEach(async (to, from, next) => {
// 显示加载进度
NProgress.start()
const token = store.getters['auth/token']
if (token) {
// 已登录用户
if (to.path === '/login') {
// 已登录用户访问登录页,重定向到首页
next({ path: '/' })
} else {
// 验证用户信息是否存在
const hasUserInfo = store.getters['auth/currentUser'].id
if (hasUserInfo) {
// 检查路由权限
if (hasRoutePermission(to, store.getters['auth/userRole'])) {
next()
} else {
Message.error('没有访问权限')
next('/403')
}
} else {
try {
// 获取用户信息
await store.dispatch('auth/validateToken')
// 检查权限后继续
if (hasRoutePermission(to, store.getters['auth/userRole'])) {
next()
} else {
next('/403')
}
} catch (error) {
// token无效,清除认证信息
await store.dispatch('auth/logout')
Message.error('登录已过期,请重新登录')
next(`/login?redirect=${to.path}`)
}
}
}
} else {
// 未登录用户
if (whiteList.includes(to.path)) {
next()
} else {
next(`/login?redirect=${to.path}`)
}
}
})
// 检查路由权限
function hasRoutePermission(route, userRole) {
if (route.meta && route.meta.roles) {
return route.meta.roles.includes(userRole)
}
return true // 没有设置权限要求的路由默认允许访问
}
router.afterEach(() => {
NProgress.done()
})数据请求封装策略:
💼 企业级实践:大型应用通常需要建立完善的权限管理系统,支持细粒度的权限控制和动态权限分配
通过本节Vue核心功能开发教程的学习,你已经掌握:
A: 可以在axios响应拦截器中检测401状态码,自动刷新token或引导用户重新登录。建议实现token自动刷新机制提升用户体验。
A: 可以将权限信息存储在Vuex中,通过API动态获取用户权限,在路由守卫中实时检查权限状态。
A: 可以使用计数器记录正在进行的请求数量,当计数器为0时隐藏loading。或者为不同类型的请求设置不同的loading状态。
A: 根据业务需求选择。localStorage支持跨标签页共享且持久化,sessionStorage仅在当前标签页有效。考虑安全性,敏感信息建议使用sessionStorage。
A: 可以设计权限码系统,为每个功能分配唯一的权限码,在组件中通过指令或方法检查用户是否具有特定权限码。
// 问题:token验证失败导致无限重定向
// 解决:添加重定向保护机制
const MAX_REDIRECT_COUNT = 3
let redirectCount = 0
router.beforeEach((to, from, next) => {
if (to.path === '/login' && redirectCount > MAX_REDIRECT_COUNT) {
redirectCount = 0
next('/error')
return
}
// 其他逻辑...
})// 问题:权限检查逻辑错误导致访问异常
// 解决:添加权限检查的容错机制
function hasPermission(route, userPermissions = []) {
if (!route.meta || !route.meta.permissions) {
return true // 没有权限要求的路由默认允许
}
return route.meta.permissions.some(permission =>
userPermissions.includes(permission)
)
}"掌握Vue基础功能实现是构建企业级应用的关键技能,这些核心功能将为你的应用提供坚实的基础架构。继续学习高级功能实现,让你的应用更加完善!"