vue

vue,第1张

登录业务流程:

在登录页面输入用户名和密码调用后台接口进行验证通过验证以后,根据后天的相应状态跳转到项目主页

登录业务的相关技术点

http是无状态的通过cookie在客户端记录状态通过session在扶额u段记录状态通过token方式维持状态(前端与服务器之间存在跨域问题)


登录退出

axios.defaults.baseURL的三种配置方法

https://blog.csdn.net/weixin_41023528/article/details/89886735

GET和POST请求的区别(超详细)

https://blog.csdn.net/qq_43588129/article/details/115218995

记录Vue项目记录使用iview表单resetFields()方法遇到的问题

https://www.jianshu.com/p/777dbb2bef78

关于token: 观察Appication--Storage--Session Storage

        // 登录成功后:
        // 1. 将登录成功之后的 token,保存到客户端的 sessionStorage 中 之后的网络请求中要拿这个token放入请求头中
        //   1.1 项目中除了登录之外的其他API接口,必须在登录之后才能访问 token就是登录令牌 
        //   1.2 token 只应在当前网站打开期间生效,所以将 token 保存在 sessionStorage 中(不是localstorage)
        window.sessionStorage.setItem('token', res.data.token)
        // 2. 通过编程式导航跳转到后台主页,路由地址是 /home 但是如果没有拿到token而直接输入地址也不应该跳转 此时要用导航守卫 如果要跳转的是登录页面则直接放行 如果跳转的是其他页面则要判断是否携带token 导航守卫写在router.js里面
        this.$router.push('/home')

 问题1:用户未登录,直接通过URL访问特定页面,也可以访问,使得登录后保存得token没起到作用,这算是一个bug。

解决:如果用户没有登录,但是直接通过URL访问特定页面,需要重新导航到登录页面。(方法:beforeEach路由导航守卫控制访问权限)

router.js
// 挂载路由导航守卫
router.beforeEach((to, from, next) => {
  // to 将要访问的路径
  // from 代表从哪个路径跳转而来
  // next 是一个函数,表示放行
  //     next()  放行    next('/login')  强制跳转

  if (to.path === '/login') return next()
  // 其他页面则要有token才能放行 之后的网络请求中要拿这个token放入请求头中
  const tokenStr = window.sessionStorage.getItem('token')
  if (!tokenStr) return next('/login') /* 没有用else if */
  next()
})

问题2: 首页退出功能实现原理,基于token的方式实现退出比较简单,只需要销毁本地的token即可,这样后续的请求就不会携带token,必须重新登录生成一个新的token之后才可以访问页面

 methods: {
    logout() {
      window.sessionStorage.clear() /* 清空token */
      this.$router.push('/login') /* 重定向到登录页 要用replace push还是能点返回回到这个home页 */
    },
}

 主页

问题3:除了登录接口,其他都是许哟啊授权得API,必须在请求头中使用Authorizaton字段提供token令牌。

解决:通过axios情趣拦截器添加token,保证拥有获取数据得权限。

// 请求拦截器 对请求进行预处理 为请求头加上token令牌 有令牌才能放行
axios.interceptors.request.use(config => {
  NProgress.start() /* 触发了request说明发起请求了 显示进度条 */
  config.headers.Authorization = window.sessionStorage.getItem('token')
  // 在最后必须 return config
  return config
})

可以发现,点击登录页面的“登录”按钮,查看Network--login--Headers---Authorizaton:null,登录之后然后再请求其他接口,Authorizaton:token的值。


一级菜单-用户管理 用户列表

p47用户列表-自定义状态列的显示效果

指定了作用域插槽,那么elp-table-column  prop=""便被覆盖了所以可以删掉


          
        

P54添加用户-自定义邮箱和手机号的校验规则

现在邮箱已经不需要自己验证了,{ required: true, message: '请输入正确的邮箱地址', trigger: ['blur' ,'change']


一级菜单-权限管理 角色列表

P84角色列表-完成删除角色下的指定权限的功能

问题4:发送删除的请求成功后,用this.getRolesList()重新刷新一下所有数据,会导致Table表格重新渲染一次 ,刚刚权限打开页面合上了,返回原来的表格状态。

解决: 原因是我们删除成功后,用this.getRolesList()重新获取了整个数据列表。方法:由于响应返回的data是当前角色下最新的权限数据,所以只给当前角色信息重新赋值权限。role.children = res.data

    // 根据Id删除对应的权限
    async removeRightById(role, rightId) {
      // d框提示用户是否要删除
      const confirmResult = await this.$confirm(
        '此 *** 作将永久删除该文件, 是否继续?',
        '提示',
        {
          confirmButtonText: '确定',
          cancelButtonText: '取消',
          type: 'warning'
        }
      ).catch(err => err)

      if (confirmResult !== 'confirm') {
        return this.$message.info('取消了删除!')
      }

      const { data: res } = await this.$http.delete(
        `roles/${role.id}/rights/${rightId}`
      )

      if (res.meta.status !== 200) {
        return this.$message.error('删除权限失败!')
      }
      //this.getRolesList(); 
      role.children = res.data /* 返回的数据就是角色所拥有的新权限 */
    },
  分配权限

P91分配权限-调用API完成分配权限的功能

一个小技巧:

// 点击确定后为角色分配权限
    async allotRights() {
      // 把所有全选和半选的id保存到数组中
      const keys = [
        ...this.$refs.treeRef.getCheckedKeys(), /* getCheckedKeys是tree组件自带的方法 ...是展开到数组中 */
        ...this.$refs.treeRef.getHalfCheckedKeys()
      ]

      const idStr = keys.join(',') /* 改为以逗号拼接的字符串 */

      const { data: res } = await this.$http.post( /* 请求都要接收 以便做请求失败与成功的提示 */
        `roles/${this.roleId}/rights`,
        { rids: idStr } /* 传递rids参数 */
      )

      if (res.meta.status !== 200) {
        return this.$message.error('分配权限失败!')
      }

      this.$message.success('分配权限成功!')
      
      this.getRolesList() /* 刷新 */
      this.setRightDialogVisible = false /* 隐藏 */
    }

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1324586.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-12
下一篇 2022-06-12

发表评论

登录后才能评论

评论列表(0条)

保存