背景介绍

VuePress是个不错的能基于Markdown快速构建静态网站的框架,初步来说,对外访问都是透明的。

但是可能因为一些保密需要,有些站点的文档,我们希望控制一下访问,所以我们借着别人的轮子记录下怎么给VuePress实现简单版本的全局登录验证弹窗。

给项目添加弹窗插件

npm i v-dialogs -D

新建Login.vueHelper.js

Login.vue

这是构建一个登录框,基于v-dialogs插件的。

里面有一个简单的表单判断,代码里面预埋了一些username和password,有符合的就放过了,你也可以换成你接口的逻辑。

# .vuepress\login\Login.vue

<template>
<div class="login-form">
<div class="form-header">账号</div>
<div>
<input type="text" class="form-control" v-model="username">
</div>
<div class="form-header">密码</div>
<div>
<input type="password" class="form-control" v-model="password">
</div> <div class="btn-row">
<button class="btn" @click="login">
登录
</button>
</div>
</div>
</template> <script> import { STORAGE_KEY } from './helper' export default {
data () {
return {
username: '',
password: ''
}
},
methods: {
login ()
{
if (this.username && this.password)
{
var userAndWords = { 'user1': 'password1', 'user2' : 'password2'}
var isMatchUser = false
for(var key in userAndWords)
{
var tempUser = key;
var tempPassword = userAndWords[key]
if(this.username === tempUser && this.password === tempPassword)
{
isMatchUser = true
break;
}
} if(isMatchUser)
{
const data = JSON.stringify({
name: this.username,
time: new Date().getTime()
})
window.localStorage.setItem(STORAGE_KEY, data)
this.$emit('close', true)
}
else{
this.$dlg.alert('抱歉,账号密码不对', {
messageType: 'warning'
})
}
}
else {
this.$dlg.alert('请输入账号密码', {
messageType: 'warning'
})
}
}
}
}
</script> <style lang="stylus">
.login-form
padding: 1rem
display flex
flex-direction column
box-sizing border-box
.btn-row
margin-top 1rem
.btn
padding 0.6rem 2rem
outline none
background-color #60C084
color white
border 0
.form-header
color #666
margin-bottom 0.5rem
.form-control
padding 0.6rem
border 2px solid #ddd
width 100%
margin-bottom 0.5rem
box-sizing border-box
outline none
transition border 0.2s ease
&:focus
border 2px solid #aaa
</style>

账号和密码验证通过之后,我们往STORAGE_KEY写入了一个数据,以便后续刷新页面检查之前登录结果,详细判断见下文。

helper.js

这是一个用来判断是否登录验证通过的函数,如果返回true就算是验证通过,返回false那就没验证通过了。

# .vuepress\login\helper.js

export const STORAGE_KEY = 'user_auth_xxxxxxxxxxxx'

// Do user authorization verify
export function checkAuth ()
{
var auth = JSON.parse(localStorage.getItem(STORAGE_KEY))
return auth && Object.keys(auth).length
}

这个是判断是否登录过的函数,说直白点,就是上面的登录成功后,会往这个key里面写一个对象值,每次调用页面之前,先走这个函数做一个检查,如果拿出来的auth是你觉得合法的,你就true通过,不然就一直继续弹登录框了。

其实这里,我们也可以根据自己的需要,给拿到的auth对象进一步做判断,当然要怎么搞就看你自己了。比如我会加一个过期时间,一个小时过期:

export function checkAuth ()
{
var auth = JSON.parse(localStorage.getItem(STORAGE_KEY))
console.log(auth)
if(auth && auth.time){
var preTime = new Date(auth.time)
var nowTime = new Date().setHours(-1)
if(nowTime > preTime)
{
return false;
}
return auth && Object.keys(auth).length
}
else
{
return false;
}
}

嵌入新增的文件到VuePress

找到.vuepress下面的enhanceApp.js,如果没有可以新建一个。

import { checkAuth } from './login/helper'
import Login from './login/Login' export default ({
Vue,
options,
router,
siteData
}) => {
Vue.mixin({
// 请确保只在 beforeMount 或者 mounted 访问浏览器 / DOM 的 API
mounted() {
const doCheck = () => {
if (!checkAuth()) {
this.$dlg.modal(Login, {
width: 400,
height: 350,
title: '请登录您的账号',
singletonKey: 'user-login',
maxButton: false,
closeButton: false,
callback: data => {
if (data === true) {
// do some stuff after login
}
}
})
}
} if (this.$dlg) {
doCheck()
} else {
import('v-dialogs').then(resp => {
Vue.use(resp.default)
this.$nextTick(() => {
doCheck()
})
})
}
}
})
}

其中Vue.mixin是对全局混入插入,因为v-dialogs插件在注册的过程中需要使用到document这个对象,所以这里一定要在beforeMount或者mounted时间来做。

试着给VuePress添加登录授权支持,基于v-dialogs的更多相关文章

  1. 试着给VuePress添加渐进式Web应用(PWA)支持,基于vuepress/plugin-pwa,点亮离线访问

    背景 有时候,我们也希望VuePress构建的文档中心能支持离线访问,这时候我们需要给他添加渐进式Web应用(PWA,Progressive Web App)的支持,根据官方文档指引,我们可以借助插件 ...

  2. 试着给VuePress添加全局禁止爬取支持,基于vuepress-plugin-robots

    背景 有时候,我们有些内部网站希望不被外部抓取,那么我们可以借助vuepress-plugin-robots来生成robots.txt文件,来告诉爬虫不要抓取页面. 安装 npm install vu ...

  3. Amazon Alexa登录授权(Android)

    访问Alexa的API,必须要携带AccessToken,也就是必须要登录授权,本文主要记录Amazon Alexa在Android平台上的登录授权过程. 一.在亚马逊开发者平台注册应用 进入亚马逊开 ...

  4. Asp.Net Core 2.0 项目实战(10) 基于cookie登录授权认证并实现前台会员、后台管理员同时登录

    1.登录的实现 登录功能实现起来有哪些常用的方式,大家首先想到的肯定是cookie或session或cookie+session,当然还有其他模式,今天主要探讨一下在Asp.net core 2.0下 ...

  5. net core体系-web应用程序-4asp.net core2.0 项目实战(1)-12基于cookie登录授权认证并实现前台会员、后台管理员同时登录

    1.登录的实现 登录功能实现起来有哪些常用的方式,大家首先想到的肯定是cookie或session或cookie+session,当然还有其他模式,今天主要探讨一下在Asp.net core 2.0下 ...

  6. Asp .Net Core 2.0 登录授权以及多用户登录

    用户登录是一个非常常见的应用场景 .net core 2.0 的登录方式发生了点变化,应该是属于是良性的变化,变得更方便,更容易扩展. 配置 打开项目中的Startup.cs文件,找到Configur ...

  7. thinkcmf 角色授权支持分类

    ThinkCMF中的权限是以后台菜单为基础来进行设置的(menu table),即如果你需要一个自定义的权限,那么你需要在后台菜单里添加一项菜单,然后在角色管理里可以针对角色进行授权   而现在遇到一 ...

  8. Asp .Net Core 2.0 登录授权以及前后台多用户登录

    用户登录是一个非常常见的应用场景 .net core 2.0 的登录方式发生了点变化,应该是属于是良性的变化,变得更方便,更容易扩展. 配置 打开项目中的Startup.cs文件,找到Configur ...

  9. 初识sa-token,一行代码搞定登录授权!

    前言 在java的世界里,有很多优秀的权限认证框架,如Apache Shiro.Spring Security 等等.这些框架背景强大,历史悠久,其生态也比较齐全. 但同时这些框架也并非十分完美,在前 ...

随机推荐

  1. 28.HashSet

    4.HashSet集合 4.1HashSet集合概述和特点[应用] 底层数据结构是哈希表 不能保证存储和取出的顺序完全一致 不可以存储重复元素 没有索引,不能使用普通for循环遍历 4.2HashSe ...

  2. Bash技巧:使用 set 内置命令帮助调试 shell 脚本

    Bash技巧:使用 set 内置命令帮助调试 shell 脚本 霜鱼片发布于 2020-02-03   在 bash 中,可以使用 set 内置命令设置和查看 shell 的属性.这些属性会影响 sh ...

  3. Docker------阿里云部署私有镜像仓库

    Docker------阿里云部署私有镜像仓库   前言 公共镜像仓库 官方:https://hub.docker.com/ 基于各个软件开发或者软件提供方开发的 非官方:其它组织或公司开发的镜像,供 ...

  4. WPS-插入-公式-菜单 怎样在EXCEL中使用PRODUCT函数

    怎样在EXCEL中使用PRODUCT函数 ################   WPS2018 -插入-公式-[专门有公式菜单] 插入函数       ##################       ...

  5. CentOS 7.3 安装指南 作者: Matei Cezar 译者: LCTT geekpi

    CentOS 7.3 安装指南 作者: Matei Cezar 译者: LCTT geekpi | 2016-12-20 09:12   评论: 11 收藏: 4 分享: 1 基于 Red Hat 企 ...

  6. commit信息修改

    场景:向社区提交commit信息,code reviewer给你回复说,请添加TrivialFix并且完善commit信息.好吧,虽然这对代码的运行无关紧要,但是对于日后的代码管理是很有必要的. 解决 ...

  7. Rust trait

    Rust trait Rust中的trait类似于Java中的接口,定义了一组可以被类型选择实现的"契约"或共享行为,. 特征定义: trait Playable{ fn play ...

  8. Ansible_常用文件模块使用详解

    一.Ansibel常用文件模块使用详解 1.file模块 1️⃣:file模块常用的参数列表: path       被管理文件的路径 state状态常用参数: absent           删除 ...

  9. STM32标准外设库中USE_STDPERIPH_DRIVER, STM32F10X_MD的含义

    在项目中使用stm32标准外设库(STM32F10x Standard Peripherals Library)的时候,我们会在项目的选项中预定义两个宏定义:USE_STDPERIPH_DRIVER, ...

  10. IIC通信时遇到问题的解决

    如果遇到问题,反复查不到 就DEBUG  下单点运行,执行每一个SCK 和SDA的拉高拉低 看看是否能正常的拉高拉低 先解决掉底层的GPIO的控制问题, 有的时候可能数据引脚为特殊功能引脚