优秀的编程知识分享平台

网站首页 > 技术文章 正文

vue-element-admin 扩展sso单点登录注册退出(八)

nanyue 2025-02-10 13:42:58 技术文章 8 ℃

有点复杂有点长,一定要耐心看,看完之后你会对单点登录有个神奇的看法。

你能学到的知识:1. layout布局 2.加载路由视图 3.封装路由以及路由拦截器使用 4.封装store auth验证模块 5.vue-router、vuex、js-cookie应用 6.什么叫sso单点登录

一、先介绍一下什么是单点登录?了解的同学可以直接跳过了~~~

1.为什么要用sso单点登录?

很多企业或者公司一开始的时候项目没有那么多,或许只有一两个,所以各自有各自的登录平台没啥关系,但是一旦到达一定规模后,单点登录显得尤为重要。在这里 举个栗子:淘宝、天猫、阿里云。一开始淘宝也是在本系统内进行登录注册的,但是当有了天猫,有了阿里巴巴之后,你登陆一个平台之后,另外几个平台再打开的时候会自动获取客户端存储的信息,然后验证是否登录,也就实现了单点登录。至于淘宝信息存在哪,有兴趣的可以自己去看看,这里不再赘述。

对了 这里有个小插曲,单点登录并不是说 两个网页同一个网站,这边登录后那边被顶下去了。这一定要注意~~~

2.单点登录的应用场景?

多个平台共用同一个用户系统,实现一端登陆后其余平台均可以拿到用户信息。

二、安装需要用到的插件,开始实际的代码操作

安装三个插件:npm install --save vue-router vuex js-cookie 安装完之后在项目里的package.json文件中有这三个插件就说明安装成功了

vue-router 应用vue的路由器

vuex 封装store,暴露模块

js-cookie 存浏览器cookie,获取cookie然后登录信息

三、详细介绍

跟紧党的 jue 步,要开始一步一步的操作了

1. 首先是 layout布局:我习惯把layout文件夹放在组件components文件夹内,然后封装layout组件,引用路由组件,完成项目整体架构

在这里我新建了个layout文件夹以及下面的AppHeader和AppFooter文件夹,每个文件夹内新建了个index.vue文件,其实不难理解,就是布局的头部,底部以及整体的布局引用文件。

(1)AppHeader/index.vue && AppFooter/index.vue 这两个组件很简单,就是头部和底部代码,都是静态的。这里有个小细节点:

截至上面,你已经完成了sso单点登录、注册、退出的所有功能了。注意:登录和注册在组件中触发,而退出则直接在路由中触发,也就是你请求地址比如:www.xx.com/logout?redirectURL=http://www.xxxx.com 会自动匹配/logout 路由进行退出。

小结:utils里面的三个文件,我给你们暴露一下,有兴趣的可以研究一下,没兴趣的可以直接使用。包含cookie.js、request.js、validate.js

cookie.js

import Cookies from 'js-cookie'
 
// Cookie的key值
export const Key = {
  accessTokenKey: 'accessToken', // 访问令牌在cookie的key值 
  refreshTokenKey: 'refreshToken', // 刷新令牌在cookie的key值 
  userInfoKey: 'userInfo'
}
 
class CookieClass {
  constructor() {
    this.domain = process.env.VUE_APP_COOKIE_DOMAIN // 域名
    this.expireTime = 15 // 15 天
  }
 
  set(key, value, expires, path = '/') {
    CookieClass.checkKey(key);
    Cookies.set(key, value, {expires: expires || this.expireTime, path: path, domain: this.domain})
  }
 
  get(key) {
    CookieClass.checkKey(key)
    return Cookies.get(key)
  }
 
  remove(key, path = '/') {
    CookieClass.checkKey(key)
    Cookies.remove(key, {path: path, domain: this.domain})
  }
 
  geteAll() {
    Cookies.get();
  }
 
  static checkKey(key) {
    if (!key) {
      throw new Error('没有找到key。');
    }
    if (typeof key === 'object') {
      throw new Error('key不能是一个对象。');
    }
  }
}
 
// 导出
export const PcCookie =  new CookieClass()

request.js 封装了一个axios

import axios from 'axios'
 
const service = axios.create({
  // .env.development 和 .env.productiont
  baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
  timeout: 10000 // request timeout
})
 
// 请求拦截器
service.interceptors.request.use(
  config => {
    return config
  },
  error => {
    return Promise.reject(error)
  }
)
 
// 响应拦截器
service.interceptors.response.use(
  response => { 
    // 正常响应
    const res = response.data
    return res
  },
  error => {
    // 响应异常
    return Promise.reject(error)
  }
)
 
export default service

validate.js

// 校验用户名是否合法 只允许4-30位中文、数字、字母和下划线
export function isvalidUsername(str) {
  const valid_map = /^[a-zA-Z0-9_\u4e00-\u9fa5]{4,30}$/
  return valid_map.test(str)
}
 
// 校验手机号是否合法
export function isvalidMobile(str) {
  const valid_map = 11 && /^1(3|4|5|6|7|8|9)\d{9}$/
  return valid_map.test(str)
}
  
// 校验邮箱是否合法
export function isvalidEmail(str) {
  const valid_map = /^[A-Za-z0-9_.-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/
  return valid_map.test(str)
}
 
/* 合法uri*/
export function validateURL(textval) {
  const urlregex = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/
  return urlregex.test(textval)
}

四、注意事项

1.千万不要直接复制我的代码,就算不会也要手写一遍,里面不理解的要多查多问多看。

2.细节很重要,要学会分析问题,找到问题,解决问题

3.promise 成功用什么失败用什么一定要区分清楚

4.在用户行为里面为什么用commit执行定义的方法

5.路由拦截beforeEach里面的三个参数分别是什么?

6.为什么路由component组件用import引入

7.不会的一定要多查多问,不要怕丢人,因为谁一开始都是不会的。

Tags:

最近发表
标签列表