vue锁屏功能

子组件

<template>
  <div>
    <el-dialog
    :title="title"
    :visible.sync="show"
    width="520px"
    :append-to-body="true"
    class="lock-screen"
    @closed="closed"
    @open="closed"
    >
      <div>
        <img src="@/assets/user.png" class="user-avatar" />
        <p class="user-name-version">小镜子</p>
      </div>
      <el-form :model="formData" ref="ruleForm" label-position="left" size="small" label-width="80px" @submit.native.prevent>
        <el-form-item prop="password" label="锁屏密码" :rules="[
        {required: true, message: '请输入锁屏密码'}
        ]">
          <el-input
            ref="password"
            v-model.trim="formData.password"
            placeholder="请输入锁屏密码"
            name="password"
            auto-complete="on"
            @keyup.enter.native="handleLock"
            clearable
            show-password
          />
        </el-form-item>
        <el-button class="lock-btn" type="primary" size="small" @click="handleLock">锁定</el-button>
      </el-form>
    </el-dialog>

    <el-dialog
    title=""
    :visible.sync="is_lock_screen"
    width="520px"
    :append-to-body="true"
    class="lock-screen-main"
    :fullscreen="true"
    :close-on-click-modal="false"
    :close-on-press-escape="false"
    :show-close="false"
    >
      <div class="login-container">
        <div class="login-wrap1">
          <div class="login-cot1">
            <img src="./assets/user.png" class="user-avatar" />
            <p class="user-name-version">小镜子</p>
            <el-input
              placeholder="请输入解锁密码"
              v-model="unlock"
              type="password"
              clearable
              @keyup.enter.native="handleUnLock()"
              show-password
            >
              <!-- <template slot="append">
                <svg-icon icon-class="lock" class="lock-icon" @click="unLock"></svg-icon>
                <svg-icon icon-class="out" class="lock-icon" @click="outLock"></svg-icon>
              </template> -->
            </el-input>
            <div class="unlock-btn">
              <el-button type="text" @click="goLogin">返回登录</el-button>
              <el-button type="text" @click="handleUnLock">进入系统</el-button>
            </div>
          </div>
        </div>
      </div>
    </el-dialog>
  </div>
</template>

<script>
import { Logout } from "@/utils/";
import md5 from "js-md5";
export default {
  props: {
    // 锁定屏幕弹窗
    title: {
      type: String,
      default: "锁定屏幕"
    },
    // 父组件控制显示隐藏
    is_show: {
      tyoe: Boolean,
      default: () => false
    }
  },
  data() {
    return {
      // 弹窗显示状态
      show: false,
      // 输入密码
      formData: {
        password: ""
      },
      // 显示锁屏
      is_lock_screen: false,
      // 解锁密码
      unlock: ""
    }
  },
  created(){
    const pas = sessionStorage.getItem("LOCK_SCREEN")
    this.is_lock_screen = pas ? true : false;
  },
  methods: {
    // 锁定屏幕
    handleLock() {
      this.$refs.ruleForm.validate(valid => {
        if(valid) {
          // md5 加密存入sessionStorage
          sessionStorage.setItem("LOCK_SCREEN",md5(this.formData.password));
          this.show = false;
          this.is_lock_screen = true;
        }
      })
    },
    // 锁定屏幕弹窗打开/关闭
    closed() {
      if(this.$refs.ruleForm) {
        this.$refs.ruleForm.resetFields()
      }
    },
    // 解锁/进入系统
    handleUnLock() {
      const pas = sessionStorage.getItem("LOCK_SCREEN");
      if (this.unlock == "" || this.unlock == undefined) {
        this.$notify.warning({
          title: "提示",
          message: "请输入解锁密码。",
          duration: 1500
        });
        return;
      }  else if (md5( this.unlock) != pas) {
       this.unlock = "";
        this.$notify.error({
          title: "错误",
          message: "解锁密码错误,请输入登陆密码解锁。",
          duration: 1500
        });
        return;
      } else if(md5(this.unlock) == pas) {
        this.is_lock_screen = false;
        sessionStorage.removeItem("LOCK_SCREEN");
        this.unlock = ""
        this.$router.push("/");
      }
    },
    // 退出/返回登录
    goLogin() {
      Logout();
    }
  },
  watch: {
    is_show: {
      handler() {
        this.show = !this.show;
      },
      deep: true
    }
  }
}
</script>

<style lang="scss" scoped>
$bg: #fcf1df;
::v-deep.lock-screen {
  .el-dialog__body {
    padding: 20px;
    border-top: 1px solid #ebebeb;
    text-align: center;

    .lock-btn {
      width: 100%;
      margin: 10px 0 30px;
    }
  }
}
::v-deep.lock-screen-main {
  .el-dialog__header,.el-dialog__body {
    padding: 0
  }
  .el-dialog__body {
    height: 100%;
  }
}
.user-avatar {
  width: 70px;
  height: 70px;
}
.user-name-version {
  margin: 0px 0 20px;
}
.login-container {
  position: relative;
  width: 100%;
  height: 100%;
  font-family: "MicrosoftYaHei";
  background-color: $bg;
  overflow: hidden;
  background-repeat: no-repeat;
  .login-wrap1 {
    width: 100%;
    height: 100%;
    display: flex;
    flex-direction: column;
    position: relative;
    justify-content: space-between;
    overflow-y: auto;
    background: url("./assets/lock-bg.jpg");
    background-size: cover;
    background-position: center;
    .login-logo {
      width: 250px;
      height: 71px;
      margin-left: 70px;
      margin-top: 30px;
    }
    .login-cot1 {
      display: flex;
      width: 320px;
      flex: 1;
      flex-direction: column;
      justify-content: center;
      align-items: center;
      margin: 0 auto;
      .user-name-version {
        font-size: 28px;
        text-align: center;
        color: #fff;
        margin: 10px 0 20px 0;
      }
      .unlock-btn {
        display: flex;
        width: 100%;
        justify-content: space-between;
        .el-button--text {
          font-size: 16px;
          font-weight: 600;
          text-decoration: underline;
        }
      }
    }
  }
}
@media screen and (min-width: 1024px) and (max-width: 1200px) and (orientation: portrait) {
  .login-container .login-wrap1 .login-cot1 {
    margin-top: auto;
  }
}
@media screen and (min-width: 768px) and (max-width: 1024px) and (orientation: landscape) {
  .login-container .login-wrap1 .login-cot1 {
    margin-top: 150px;
  }
}
</style>

父组件

<lock-screen :is_show="is_show"/>  // is_show:false

全局守卫防止锁屏后页面回退

// 锁定屏幕页面进行浏览器回退
if (sessionStorage.getItem("LOCK_SCREEN") && to.path !== "/lockScreen") {
  next({ path: "/lockScreen" });
}

// 锁屏解锁后可使用浏览器回退至锁屏的问题
if (!sessionStorage.getItem("LOCK_SCREEN") && to.path === "/lockScreen") {
  next({ path: "/" });
}

效果图

1、自定义密码进行锁屏
在这里插入图片描述

2、锁屏页面输入密码进行解锁
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: vue 登录功能是指在 vue 框架中实现的登录功能。 登录功能的基本流程如下: 1. 用户输入登录信息,包括用户名和密码。 2. 将用户名和密码发送到服务器,请求验证。 3. 服务器验证用户名和密码是否正确。 4. 如果用户名和密码正确,则返回登录成功的信息;否则,返回登录失败的信息。 5. 在客户端,根据服务器返回的信息提示用户登录成功或失败。 在 vue 中,可以使用 axios 等库向服务器发送 HTTP 请求,实现与服务器的交互。也可以使用 vuex 管理登录状态,实现对登录信息的持久化存储。 ### 回答2: Vue登录功能是一种常见的网页登录认证功能,通过Vue框架实现。具体步骤如下: 首先,需要创建一个登录页面,包括用户名和密码的输入框,以及登录按钮。可以使用Vue的模板语法创建这个页面。 接下来,在Vue的data选项中定义一个对象,用于存储用户名和密码的数据。 在登录按钮的点击事件中,可以使用Vue的methods选项来定义一个登录方法。在这个方法中,可以通过AJAX或者其他方式,将用户名和密码发送到服务器进行验证。如果验证通过,则登录成功;否则,登录失败。 在登录方法中,可以通过Vue的路由功能,进行页面的跳转。例如,登录成功后可以跳转到主页;登录失败则可以显示错误信息。 为了提高用户体验,可以在登录方法中添加一些额外的功能。例如,可以在发送登录请求的同时,显示一个加载动画;登录成功后,可以将用户信息保存到本地存储中,以便下次自动登录等。 最后,在Vue实例中,将登录页面的模板、数据和方法进行绑定,以此完成登录功能的实现。 总结起来,Vue登录功能的实现分为创建登录页面、定义数据和方法、发送登录请求、处理登录结果和页面跳转等步骤。通过Vue的模板语法和数据绑定,可以帮助我们简化和优化登录功能的开发。 ### 回答3: Vue是一个流行的JavaScript框架,用于构建用户界面。登录功能是Web应用程序中常用的功能之一,也是Vue应用程序中常见的功能之一。下面是对Vue登录功能的详解。 首先,Vue的登录功能需要具备以下几个要素:一个登录表单、用户输入验证、与后端服务器的交互和路由管理。 在Vue中,可以使用Vue Router来管理应用程序的路由。当用户打开登录页面时,Vue Router会将其指向登录组件。登录组件包含一个登录表单,这个表单包括用户名和密码的输入框以及一个登录按钮。 用户在输入用户名和密码后,我们可以使用Vue的表单验证机制对输入进行验证。Vue提供了一些验证指令,例如`v-model`和`v-bind`,可以用来绑定表单输入的值和进行相关逻辑判断,确保输入的数据满足要求。 接下来,当用户点击登录按钮时,可以使用Vue的事件机制来处理登录事件。我们可以在登录按钮上绑定一个点击事件,并在事件处理程序中执行一些逻辑,例如将用户输入的用户名和密码发送给后端服务器进行验证。 在与后端服务器交互时,可以使用Vue的HTTP库,例如axios,来发送HTTP请求。可以向服务器发送一个POST请求,将用户的用户名和密码作为请求参数发送给服务器。服务器可以返回一个成功或失败的响应。 最后,根据服务器的响应,我们可以根据需要进行一些操作。例如,如果登录成功,可以将用户登录状态存储在浏览器的本地存储中,以便在其他页面中验证用户的身份。如果登录失败,可以显示错误消息给用户,提示用户重新输入。 综上所述,Vue的登录功能涉及到表单输入验证、用户与后端服务器的交互以及路由管理。通过使用Vue的相关特性和库,可以实现一个完整的登录功能

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值