Element UI框架踩坑记录

本文分享了基于Vue和ElementUI框架实现权限控制与路由显示的过程。通过自定义登录后的用户信息保存方式,并调整框架中关于角色路由的生成逻辑,实现了更细粒度的权限管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为什么要记录这个

目前正在开发一个基于vue的在线学习网站,使用的是Element UI框架,这是我使用这个框架做的第二个前端项目,仍然还有很多东西不懂,正在慢慢摸索成长。所以我想把我新学习到的东西记录下来,如果我记录的东西能够让同样在学习这个框架的人,或者说遇到相同问题的人一点帮助的话就更好了。一起加油吧~
另外,系统整体架构使用的是github上很火的一个 PanJiaChen /vue-element-admin框架,下面的问题都是基于这个我本身的项目对该框架的一些修改。

权限控制(含token)

先说一下原项目的身份权限,分为admin和editor两个,接口为本地接口。权限控制主要应用在登录功能中,即使用同一个登录页面可以实现不同账号登录后呈现不同的页面效果。这就需要我们获取后端返回的身份roles数组(这里要数组因为框架需要的是数组,我就没改动也让后端返回数组了)。
针对我自己项目的改造在于给utils/auth.js文件中新增setUserInfo()和getUserInfo()这两个方法,目的在于将接口中获取用户的信息保存到cookie中。

// 具体代码,判断userInfo和userName是否存在,如果存在则保存
export function setUserInfo(userInfo) {
 if (userInfo && userInfo.userName) {
   return Cookies.set(UserInfoKey, userInfo)
 }
 return null
}

export function getUserInfo() {
 const userInfo = Cookies.getJSON(UserInfoKey)
 if (userInfo && userInfo.userName) {
   return userInfo
 }
 return null
}

然后修改store/modules/user.js文件中actions的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)
          setUserInfo(data.user.userInfo)
          resolve()
        })
        .catch(error => {
          reject(error)
        })
    })
  }

路由显示

权限设置好后,能够实现不同身份的用户进行登录。我项目一共有三个身份,分别为student、teacher和admin。我在router/index.js中设置好不同页面的路由后,发现一个很奇怪的问题,那就是除了对应权限的用户能够看到属于自己的路由外,admin竟然能够额外看到student的所有路由。我不希望admin能看到学生端的路由,但是我确认了好多遍设置路由的界面并没有写错。后面就发现了问题所在——在store/modules/permission.js中,admin设置为能够看到所有的路由。所以就算我设置了某些页面仅学生端可见,但是admin中并没有起作用。于是进行如下代码改造——

generateRoutes({ commit }, roles) {
    return new Promise(resolve => {
      let accessedRoutes
      if (roles.includes('admin')) {
        // 下面这句是注释掉的源代码
        // accessedRoutes = asyncRoutes || []
        accessedRoutes = filterAsyncRoutes(asyncRoutes, roles)
      } else {
        accessedRoutes = filterAsyncRoutes(asyncRoutes, roles)
      }
      commit('SET_ROUTES', accessedRoutes)
      resolve(accessedRoutes)
    })
  }

只要将admin中的路由改成和普通路由一样进行控制就可以正常显示了。其实也可以直接把if语句删掉,但是为了能够记得犯下的这个错暂时保留。

总结

说实话这两个问题困扰了我好久,这算是第一次真正去研究框架内部的文件。之前一直都是在src/views里面写页面、连接口等等。把感想和改造步骤记录下来,便于以后回顾。因为要准备前端面试找工作了,所以后面还会更新一些前端的问题,希望我能坚持下来~

element-ui@2.15.6是一个前端UI框架的版本号。根据引用的建议,如果你的element-ui版本号高于2.15.6,建议直接降低版本,使用npm install element-ui@2.15.6进行安装。这可能是因为在高版本中存在一些问题,而降低版本可以解决这些问题。 另外,根据引用,你还可以从https://unpkg.com/browse/element-ui@2.15.7/获取element-ui@2.15.7的资源,这对于没有网络或网络环境不好的情况下使用是很有帮助的。 而根据引用的描述,你在使用element-ui@2.15.6的插件时遇到了一个问题。你尝试将其变成全局使用,按照官网的语句,在main.js中引入了,然后使用vue.use(Message)声明。然而,在首页会弹出一个没有内容的message.info弹窗,没有报错或其他提示。这可能是由于代码的其他部分导致的问题,请检查代码的其他部分,尤其是和消息弹窗相关的部分,以确定问题的根本原因。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [控制台报Prop being mutated:“placemeent“错误](https://blog.youkuaiyun.com/qq_50721840/article/details/126499741)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [element-ui@2.15.7.zip](https://download.youkuaiyun.com/download/u010867236/50710097)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [《记录》使用element-ui@2.15.6,全局配置后首页出现一个info弹窗](https://blog.youkuaiyun.com/Leporc/article/details/122389665)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值