VuePress 中如何增加用户登录功能


Posted in Javascript onNovember 29, 2019

VuePress是什么?

先让我们看看 VuePress能干什么?有什么效果?

VuePress 中如何增加用户登录功能

很像vue官网的文档页面,因为vuePress就是尤大大的一个力作

vuePress官网介绍介绍的很详细,这里只做搭建VuePress项目教程

在 VuePress 中增加用户登录

VuePress 是 Vuejs 官方提供的一个快速建设文档站点的工具,在简单配置好功能后,需要做的事情就剩下写好一个个 Markdown 文档。

因为 VuePress 提供了可以在 Markdown 中使用 Vue 的能力,所以有时候,希望可以在它的文档功能基础上增加部分常规功能,比如用户登录;有团队希望公司建设的文档内容仅公司员工可查看,因为有可能会有涉及内容保密的部分

VuePress 本身的安装配置过程不再赘述,可参考官方文档,本文将介绍使用 v-dialogs 对 VuePress 增加用户登录功能的进行改造,仅作为抛砖引玉,更多的需求,大家可以自由发挥想象。

安装插件

安装 v-dialogs 插件,将会使用它的模态窗口 (Modal) 和消息通知 (Alert) 的功能

# npm
npm i v-dialogs -D

# yarn
yarn add -D v-dialogs

创建登录表单

新增 Login.vue 文件用于登录表单,它将使用模态窗口(Modal)进行展示

<template>
 <div class="login-form">
  <div class="form-header">User Name</div>
  <div>
   <input type="text" class="form-control" v-model="username">
  </div>
  <div class="form-header">Password</div>
  <div>
   <input type="password" class="form-control" v-model="password">
  </div>

  <div class="btn-row">
   <button class="btn" @click="login">
    OK
   </button>
  </div>
 </div>
</template>

<script>
import { STORAGE_KEY } from './helper'

export default {
 data () {
  return {
   username: '',
   password: ''
  }
 },
 methods: {
  login () {
   if (this.username && this.password) {
    const data = JSON.stringify({
     name: this.username,
     time: new Date().getTime()
    })
    // 登录成功后的逻辑处理,这里将数据保存在 localStorage 中仅作为功能演示
    window.localStorage.setItem(STORAGE_KEY, data)
    // 关闭窗口
    this.$emit('close', true)
   } else {
    this.$dlg.alert('Please complete the content', {
     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>

VuePress 配置

在 /.vuepress 位置新增 enhanceApp.js 文件,该文件是 VuePress 对 应用级别的配置 的配置文件,文件 export default 了一个钩子函数,并接受一个包含了一些应用级别属性的对象作为参数。你可以使用这个钩子来安装一些附加的 Vue 插件、注册全局组件,或者增加额外的路由钩子等

import { checkAuth } from './login/helper'
import Login from './login/Login'

export default ({
 Vue,
 options,
 router,
 siteData
}) => {
 Vue.mixin({
  mounted() {
   const doCheck = () => {
    if (!checkAuth()) {
     this.$dlg.modal(Login, {
      width: 300,
      height: 350,
      title: 'Employee login',
      singletonKey: 'employee-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 对全局进行了混入操作,所以在每个文档页面被访问后都会触发该 mounted() 生命周期进行用户权限的校验。在这里需要特别说明的是,原来对于权限检查的操作,本是希望在 Vue Router 的路由守卫中处理,但由于 浏览器的 API 访问限制 原因,Vue 插件在注册的过程中因为需要使用到浏览器的API (window 或 document),但在编译为静态文件的过程中,需要通过 Node.js 服务端渲染,因此所有的 Vue 相关代码都应当遵循 编写通用代码 的要求。简而言之,请确保只在 beforeMount 或者 mounted 访问浏览器 / DOM 的 API

v-dialogs 在注册的过程中需要使用到 document 这个对象,所以在编译的过程中会出现 document is not defined 的错误信息,基于上述的原因,对于功能权限的检查在 mounted 生命周期中执行,并将该操作进行全局混入,才能达到全局校验的效果

上述的代码编写部署并重新构建后,就会在每个文档页面中执行用户身份校验

  • 未登录,则弹出模态窗口要求输入身份信息进行校验
  • 已登录时就显示正确的文档内容

实例

可以访问下面的站点进行在线预览登录功能的改造

github.io

gitee.io

输入任意用户名和密码进行体验即可

源代码

请访问: https://github.com/TerryZ/vuepress-login

总结

以上所述是小编给大家介绍的VuePress 中如何增加用户登录功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
一个基于jquery的文本框记数器
Sep 19 Javascript
JavaScrip实现PHP print_r的数功能(三种方法)
Nov 12 Javascript
JavaScript通过Date-Mask将日期转换成字符串的方法
Jun 04 Javascript
浅析jquery如何判断滚动条滚到页面底部并执行事件
Apr 29 Javascript
jquery 追加元素append、prepend、before、after用法与区别分析
Dec 02 Javascript
超全面的vue.js使用总结
Feb 12 Javascript
js 事件的传播机制(实例讲解)
Jul 20 Javascript
vue axios请求拦截实例代码
Mar 29 Javascript
angular2路由之routerLinkActive指令【推荐】
May 30 Javascript
JS 逻辑判断不要只知道用 if-else 和 switch条件判断(小技巧)
May 27 Javascript
在vue中使用Echarts利用watch做动态数据渲染操作
Jul 20 Javascript
Vue性能优化的方法
Jul 30 Javascript
Vue.directive 实现元素scroll逻辑复用
Nov 29 #Javascript
Vue.js实现大屏数字滚动翻转效果
Nov 29 #Javascript
Vue基础配置讲解
Nov 29 #Javascript
jQuery实现弹幕特效
Nov 29 #jQuery
Vue实现多标签选择器
Nov 28 #Javascript
swiper实现异形轮播效果
Nov 28 #Javascript
Vue请求java服务端并返回数据代码实例
Nov 28 #Javascript
You might like
php 使用expat方式解析xml文件操作示例
2019/11/26 PHP
IE8 兼容性问题(属性名区分大小写)
2009/06/04 Javascript
jquery validate使用攻略 第四步
2010/07/01 Javascript
jQuery 版元素拖拽原型代码
2011/04/25 Javascript
js中跨域方法原理详解
2015/07/19 Javascript
javascript html5实现表单验证
2016/03/01 Javascript
Bootstrap多级导航栏(级联导航)的实现代码
2016/03/08 Javascript
JS定时器使用,定时定点,固定时刻,循环执行详解
2016/05/31 Javascript
基于JavaScript实现下拉列表左右移动代码
2017/02/07 Javascript
javascript简写常用的12个技巧(可以大大减少你的js代码量)
2020/03/28 Javascript
深入Vue-Router路由嵌套理解
2018/08/13 Javascript
JS使用对象的defineProperty进行变量监控操作示例
2019/02/02 Javascript
使用webpack4编译并压缩ES6代码的方法示例
2019/04/24 Javascript
Javascript Web Worker使用过程解析
2020/03/16 Javascript
Vue使用axios引起的后台session不同操作
2020/08/14 Javascript
[29:23]2014 DOTA2国际邀请赛中国区预选赛 LGD-GAMING VS CIS 第一场1
2014/05/23 DOTA
[54:29]2018DOTA2亚洲邀请赛 4.7 淘汰赛 VP vs LGD 第二场
2018/04/09 DOTA
[43:33]EG vs Spirit Supermajor 败者组 BO3 第一场 6.4
2018/06/05 DOTA
Python datetime时间格式化去掉前导0
2014/07/31 Python
Python3实现从指定路径查找文件的方法
2015/05/22 Python
Python中的日期时间处理详解
2016/11/17 Python
python代码 FTP备份交换机配置脚本实例解析
2019/08/01 Python
python 实现按对象传值
2019/12/26 Python
PyQt5中QTableWidget如何弹出菜单的示例代码
2020/02/23 Python
python对XML文件的操作实现代码
2020/03/27 Python
Python参数传递及收集机制原理解析
2020/06/05 Python
从Pytorch模型pth文件中读取参数成numpy矩阵的操作
2021/03/04 Python
美国儿童玩具、装扮和玩偶商店:Magic Cabin
2018/09/02 全球购物
会计专业毕业生自我评价
2013/09/25 职场文书
中国央视网签名寄语
2014/01/18 职场文书
银行办公室岗位职责
2014/03/10 职场文书
员工安全生产承诺书
2014/05/22 职场文书
支部书记四风对照材料
2014/08/28 职场文书
有关朝花夕拾的读书笔记
2015/06/29 职场文书
创业计划书之书店
2019/09/10 职场文书
什么是clearfix (一文搞清楚css清除浮动clearfix)
2023/05/21 HTML / CSS