2024年前端最新vue-admin-template 动态路由的实现(方式二 推荐)(1),2024年最新教资面试心得体会

读者福利

========

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

由于篇幅过长,就不展示所有面试题了,想要完整面试题目的朋友(另有小编自己整理的2024大厂高频面试题及答案附赠)


params: parameter

})

}

export function getInfo(token) {

return request({

url: Api.StudentInfo,

method: ‘get’,

params: {‘token’:token}

})

}

export function logout() {

return request({

url: Api.TakeOut,

method: ‘get’

})

}

登录接口数据

{‘code’: 200, ‘data’: {‘token’: ‘X-admin’}, ‘message’: “操作成功”}

退出接口数据

{‘code’: 200, ‘data’: ‘success’, ‘message’: “操作成功”}

详情接口数据

{

“code”: 200,

“data”: {

“avatar”: “https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif”,

“name”: “黄晓果”,

“roles”: [

“editor”

]

}

}

  • 改造router/index.js

import Vue from ‘vue’

import Router from ‘vue-router’

Vue.use(Router)

/* Layout */

import Layout from ‘@/layout’

// 基础路由

export const constantRoutes = [

{

path: ‘/login’,

component: () => import(‘@/views/login/index’),

hidden: true

},

{

path: ‘/404’,

component: () => import(‘@/views/404’),

hidden: true

},

{

path: ‘/’,

component: Layout,

redirect: ‘/dashboard’,

children: [{

path: ‘dashboard’,

name: ‘Dashboard’,

component: () => import(‘@/views/dashboard/index’),

meta: { title: ‘首页’, icon: ‘el-icon-menu’ }

}]

},

]

/**

  • 动态路由

*/

export const asyncRoutes = [

{

path: ‘/studentinformation’,

component: Layout,

children: [

{

path: ‘index’,

component: () => import(‘@/views/studentinformation/index’),

meta: { title: ‘学生信息’, icon: ‘el-icon-s-check’ }

}

]

},

{

path: ‘/lecturerinformation’,

component: Layout,

children: [

{

path: ‘index’,

component: () => import(‘@/views/lecturerinformation/index’),

meta: { title: ‘讲师信息’, icon: ‘el-icon-s-custom’, roles: [‘editor’] }

}

]

},

{

path: ‘/coursemanage’,

component: Layout,

meta: { roles: [‘admin’] },

children: [

{

path: ‘index’,

component: () => import(‘@/views/coursemanage/index’),

meta: { title: ‘课程管理’, icon: ‘el-icon-s-platform’}

}

]

},

// 404 页面必须放置在最后一个页面

{ path: ‘*’, redirect: ‘/404’, hidden: true }

]

const createRouter = () => new Router({

// mode: ‘history’, // require service support

scrollBehavior: () => ({ y: 0 }),

routes: constantRoutes

})

const router = createRouter()

// Detail see: https://github.com/vuejs/vue-router/issues/1234#issuecomment-357941465

export function resetRouter() {

const newRouter = createRouter()

router.matcher = newRouter.matcher // reset router

}

export default router

将动态显示的路由写在asyncRoutes 中并添加 roles ,例如meta: { roles: [‘admin’] },

  • 在store/modulds目录下添加permission.js

在这里插入图片描述

import { asyncRoutes, constantRoutes } from ‘@/router’

/**

  • Use meta.role to determine if the current user has permission

  • @param roles

  • @param route

*/

function hasPermission(roles, route) {

if (route.meta && route.meta.roles) {

return roles.some(role => route.meta.roles.includes(role))

} else {

return true

}

}

/**

  • Filter asynchronous routing tables by recursion

  • @param routes asyncRoutes

  • @param roles

*/

export function filterAsyncRoutes(routes, roles) {

const res = []

routes.forEach(route => {

const tmp = { …route }

if (hasPermission(roles, tmp)) {

if (tmp.children) {

tmp.children = filterAsyncRoutes(tmp.children, roles)

}

res.push(tmp)

}

})

return res

}

const state = {

routes: [],

addRoutes: []

}

const mutations = {

SET_ROUTES: (state, routes) => {

state.addRoutes = routes

state.routes = constantRoutes.concat(routes)

}

}

const actions = {

generateRoutes({ commit }, roles) {

return new Promise(resolve => {

const accessedRoutes = filterAsyncRoutes(asyncRoutes, roles)

commit(‘SET_ROUTES’, accessedRoutes)

resolve(accessedRoutes)

})

}

}

export default {

namespaced: true,

state,

mutations,

actions

}

  • 修改store/modulds/user.js

import { login, logout, getInfo } from ‘@/api/user’

import { getToken, setToken, removeToken } from ‘@/utils/auth’

import { resetRouter } from ‘@/router’

const getDefaultState = () => {

return {

token: getToken(),

name: ‘’,

avatar: ‘’,

roles: []

}

}

const state = getDefaultState()

const mutations = {

RESET_STATE: (state) => {

Object.assign(state, getDefaultState())

},

SET_TOKEN: (state, token) => {

state.token = token

},

SET_NAME: (state, name) => {

state.name = name

},

SET_AVATAR: (state, avatar) => {

state.avatar = avatar

},

SET_ROLES: (state, roles) => {

state.roles = roles

}

}

const actions = {

// user login

login({ commit }, userInfo) {

const { username, password } = userInfo

return new Promise((resolve, reject) => {

login({ username: username.trim(), password: password }).then(response => {

const { data } = response

commit(‘SET_TOKEN’, data.token)

setToken(data.token)

resolve()

}).catch(error => {

reject(error)

})

})

},

// get user info

getInfo({ commit, state }) {

return new Promise((resolve, reject) => {

getInfo(state.token).then(response => {

const { data } = response

if (!data) {

return reject(‘验证失败,请重新登录’)

}

const {roles, name, avatar } = data

commit(‘SET_ROLES’, roles)

commit(‘SET_NAME’, name)

commit(‘SET_AVATAR’, avatar)

resolve(data)

}).catch(error => {

reject(error)

})

})

},

// user logout

logout({ commit, state }) {

return new Promise((resolve, reject) => {

logout(state.token).then(() => {

removeToken() // must remove token first

resetRouter()

commit(‘RESET_STATE’)

commit(‘SET_ROLES’, [])

resolve()

}).catch(error => {

reject(error)

})

})

},

// remove token

resetToken({ commit }) {

return new Promise(resolve => {

removeToken() // must remove token first

commit(‘RESET_STATE’)

commit(‘SET_ROLES’, [])

resolve()

})

}

}

export default {

namespaced: true,

state,

mutations,

actions

}

添加roles: [] 保存权限列表 ,添加内容如下

const getDefaultState = () => {

return {

roles: []

}

}

const mutations = {

SET_ROLES: (state, roles) => {

state.roles = roles

}

}

// get user info

getInfo({ commit, state }) {

return new Promise((resolve, reject) => {

getInfo(state.token).then(response => {

const {roles, name, avatar } = data

commit(‘SET_ROLES’, roles)

}).catch(error => {

reject(error)

})

})

},

// user logout

logout({ commit, state }) {

return new Promise((resolve, reject) => {

logout(state.token).then(() => {

commit(‘SET_ROLES’, [])

}).catch(error => {

reject(error)

})

})

},

// remove token

resetToken({ commit }) {

基础学习:

前端最基础的就是 HTML , CSS 和 JavaScript 。

网页设计:HTML和CSS基础知识的学习

HTML是网页内容的载体。内容就是网页制作者放在页面上想要让用户浏览的信息,可以包含文字、图片、视频等。

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

CSS样式是表现。就像网页的外衣。比如,标题字体、颜色变化,或为标题加入背景图片、边框等。所有这些用来改变内容外观的东西称之为表现。

动态交互:JavaScript基础的学习

JavaScript是用来实现网页上的特效效果。如:鼠标滑过弹出下拉菜单。或鼠标滑过表格的背景颜色改变。还有焦点新闻(新闻图片)的轮换。可以这么理解,有动画的,有交互的一般都是用JavaScript来实现的。

logout(state.token).then(() => {

commit(‘SET_ROLES’, [])

}).catch(error => {

reject(error)

})

})

},

// remove token

resetToken({ commit }) {

基础学习:

前端最基础的就是 HTML , CSS 和 JavaScript 。

网页设计:HTML和CSS基础知识的学习

HTML是网页内容的载体。内容就是网页制作者放在页面上想要让用户浏览的信息,可以包含文字、图片、视频等。

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

[外链图片转存中…(img-oIzvah9T-1715590280923)]

CSS样式是表现。就像网页的外衣。比如,标题字体、颜色变化,或为标题加入背景图片、边框等。所有这些用来改变内容外观的东西称之为表现。

[外链图片转存中…(img-AyFTLgY7-1715590280924)]

动态交互:JavaScript基础的学习

JavaScript是用来实现网页上的特效效果。如:鼠标滑过弹出下拉菜单。或鼠标滑过表格的背景颜色改变。还有焦点新闻(新闻图片)的轮换。可以这么理解,有动画的,有交互的一般都是用JavaScript来实现的。

[外链图片转存中…(img-q1nWNcLM-1715590280925)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值