Vue登录功能

html

<el-form
  class="login-form"
  :rules="loginRules"
  ref="form"
  :model="form"
  label-width="0"
  >
  <el-form-item prop="username">
    <el-input
      size="small"
      v-model="form.username"
      auto-complete="false"
      placeholder="请输入用户名"
      @focus="focus(0)"
      @blur="blur(0)"
    >
      <i
        slot="prefix"
        class="iconfont icon-yonghu1"
        :style="isFocus[0] ? 'color:#1c8ffa' : ''"
      ></i>
    </el-input>
    <!-- input输入框获取焦点的时候(isFocus[0]true),蓝线才出来,表示正确,而且存在一个过渡效果 -->
    <div
      class="bottom-line"
      :style="isFocus[0] ? 'left:0%; width:100%;' : ''"
    ></div>
    <!-- 没有填写内容,并且失去焦点的时候,再显示红线,表示错误 -->
    <div
      class="bottom-error-line"
      :style="(errorArr[0] && !isFocus[0]) ? 'left:0%; width:100%;' : ''"
    ></div>
    <!-- 对钩 √-->
    <span class="iconfont icon-wancheng1" v-show="correctArr[0]"></span>
    <!-- 叉号x -->
    <span class="iconfont icon-close" v-show="incorrectArr[0]"></span>
  </el-form-item>
  <el-form-item prop="password">
    <el-input
      size="small"
      type="password"
      v-model="form.password"
      auto-complete="false"
      placeholder="请输入密码"
      @keyup.enter.native="submitForm"
      @focus="focus(1)"
      @blur="blur(1)"
    >
      <i
        slot="prefix"
        class="iconfont icon-mima1"
        :style="isFocus[1] ? 'color:#1c8ffa' : ''"
      ></i>
    </el-input>
    <div
      class="bottom-line"
      :style="isFocus[1] ? 'left:0%; width:100%;' : ''"
    ></div>
    <div
      class="bottom-error-line"
      :style="(errorArr[1] && !isFocus[1]) ? 'left:0%; width:100%;' : ''"
    ></div>
    <span class="iconfont icon-wancheng1" v-show="correctArr[1]"></span>
    <span class="iconfont icon-close" v-show="incorrectArr[1]"></span>
  </el-form-item>
  
  <div class="more">
    <el-checkbox v-model="checked">记住密码</el-checkbox>
  </div>
  
  <div
    class="login-button"
    v-waves="{color:'#ffffff',time:wavesTime}"
    @click="submitForm">登 录</div>
</el-form>

css

.bottom-line {
        content: "";
        width: 0px;
        height: 1px;
        background: #1c8ffa;
        position: absolute;
        bottom: -1px;
        left: 30%;
        transition: all 0.4s;
      }
      .bottom-error-line {
        content: "";
        width: 0px;
        height: 1px;
        background: #f25555;
        position: absolute;
        bottom: -1px;
        left: 50%;
        transition: all 0.4s;
      }

data

export default {
  name: 'user-login',
  data() {
    // 自定义校验规则:用户名
    const validateUser = (rule, value, callback) => {
      // if (!isvalidUsername(value)) {
      // 检验没有通过
      if (!value) {
        // 设置不显示对钩
        this.$set(this.correctArr, 0, false);
        // 设置显示叉号
        this.$set(this.incorrectArr, 0, true);
        // 设置显示红色的下横线
        this.$set(this.errorArr, 0, true);
        callback(new Error('请输入用户名'));
        // callback();
      } else {
        // 设置显示对钩
        this.$set(this.correctArr, 0, true);
        // 设置不显示叉号
        this.$set(this.incorrectArr, 0, false);
        // 设置不显示红色的下横线
        this.$set(this.errorArr, 0, false);
        callback();
      }
    };
    // 自定义校验规则:密码
    const validatePassword = (rule, value, callback) => {
      if (!value) {
        this.$set(this.correctArr, 1, false);
        this.$set(this.incorrectArr, 1, true);
        this.$set(this.errorArr, 1, true);
        callback(new Error('请输入密码'));
      } else {
        this.$set(this.correctArr, 1, true);
        this.$set(this.incorrectArr, 1, false);
        this.$set(this.errorArr, 1, false);
        callback();
      }
    };
    return {
      form: {
        username: '1',
        password: '1',
      },
      // 记住密码
      checked: false,
      // 每个选框是否获取焦点
      isFocus: [false, false],
      // 每个选框是否正确 对号
      correctArr: [false, false],
      // 每个选框是否正确 叉号
      incorrectArr: [false],
      // 每个选框是否错误,红色的下横线
      errorArr: [false, false],
      // 验证规则
      loginRules: {
        username: [
          // validator 自定义校验规则
          { required: true, trigger: 'blur', validator: validateUser },
        ],
        password: [
          { required: true, trigger: 'blur', validator: validatePassword },
        ],
      },
      // setTimout对象
      timer: null,
    };
  },

  mounted() {
    // 记住密码处理
    // 每次打开页面的时候,都从cookie里面获取账号,密码,checked
    this.form.username = dealCookie.get('E_username');
    this.form.password = dealCookie.get('E_password');
    this.checked = Boolean(dealCookie.get('E_checked'));
  },
  
  methods: {
    // 聚焦改变样式
    focus(index) {
      this.$set(this.isFocus, index, true);
    },
    // 失焦改变样式
    blur(index) {
      this.$set(this.isFocus, index, false);
    },
        // 提交
    submitForm() {
      // 清除定时器
      clearTimeout(this.timer);
      this.timer = setTimeout(() => {
        this.$refs.form.validate((valid) => {
          if (valid) {
            const params = {
              captcha: 'string',
              domain: getSecHost(), // 获取二级域名  localhost
              mac: 'string',
              password: this.form.password,
              username: this.form.username,
            };
            login(params).then((res) => {
              if (res.code === '00000') {
                //  //判断复选框是否被勾选,就保存用户名,密码,时限7天
                if (this.checked) {
                  // 设置cookie,保存7天
                  dealCookie.set('E_username', this.form.username, 7);
                  dealCookie.set('E_password', this.form.password, 7);
                  dealCookie.set('E_checked', true, 7);
                } else { // 否则,删除cookie中保存的用户名,密码
                  dealCookie.delete('E_username');
                  dealCookie.delete('E_password');
                  dealCookie.delete('E_checked');
                }
                // 用户信息
                const userInfo = res.data.userInfo || {};
                //用户token
                const token = res.data.token || '';
                // 保存token到vuex和localstorage中
                this.$store.commit('SET_TOKEN', token);
                // 保存用户信息
                this.$store.commit('SET_USERIFNO', userInfo);
                this.$message.success('登录成功');
                this.$router.push('/home');
              } else {
                this.$message.error(res.msg);
                return false;
              }
            });
          }
        });
      }, this.wavesTime * 1000);
    },

util/util.js

// 设置cookies,获取cookie,删除cookie
export const dealCookie = {
  // 设置cookies
  set: (name, value, days) => {
    const d = new Date();
    d.setTime(d.getTime() + 24 * 60 * 60 * 1000 * days);
    window.document.cookie = `${name}=${value};path=/;expires=${d.toGMTString()}`;
  },
  // 获取cookie
  get: (name) => {
    const v = window.document.cookie.match(`(^|;) ?${name}=([^;]*)(;|$)`);
    return v ? v[2] : null;
  },
  // 删除cookie
  delete: (name) => {
    const d = new Date();
    d.setTime(d.getTime() + 24 * 60 * 60 * 1000 * -1);
    window.document.cookie = `${name}='';path=/;expires=${d.toGMTString()}`;
  },
};

vuex

import Vue from 'vue';
import Vuex from 'vuex';
import createPersistedState from 'vuex-persistedstate';
import user from './modules/user';
import common from './modules/common';
import map from './modules/map';
import tags from './modules/tags';
import snow from './modules/snow';
import getters from './getters';

Vue.use(Vuex);
const store = new Vuex.Store({
  modules: {
    user,
    map,
    common,
    tags,
    snow,
  },
  getters,
  // 数据持久化
  plugins: [createPersistedState({
    storage: window.sessionStorage,
    reducer(val) {
      return {
        // 只储存common模块中的数据
        common: val.common,
        user: val.user,
      };
    },
  })],
});

export default store;

modules/user.js

import { setStore, getStore } from '@/util/store';

const user = {
  state: {
    // token,直接获取本地存储的token
    token: getStore({ name: 'token' }) || '',
    // 用户信息
    userInfo: getStore({ name: 'userInfo' }) || {},
  },
  actions: {
  // 退出登录
    LOG_OUT: ({ commit }) => {
      commit('SET_TOKEN', '');
    },
  },
  mutations: {
    // 存token
    SET_TOKEN: (state, token) => {
      state.token = token;
      setStore({ name: 'token', content: state.token });
    },
    // 存用户信息
    SET_USERIFNO: (state, userInfo) => {
      setStore({ name: 'userInfo', content: userInfo });
      state.userInfo = userInfo;
    },

};
export default user;

util/store.js

import {
  validatenull,
} from '@/util/validate';
/**
 * 存储localStorage
 */
export const setStore = (params) => {
  const {
    name, // 名称
    content, // 内容
    type, // 类型
  } = params;
  const obj = {
    dataType: typeof (content),
    content,
    type,
    datetime: new Date().getTime(),
  };
  if (type) window.sessionStorage.setItem(name, JSON.stringify(obj));
  else window.localStorage.setItem(name, JSON.stringify(obj));
};
/**
     * 获取localStorage
     */

export const getStore = (params) => {
  const {
    name,
  } = params;
  let obj = {};
  let content = '';
  obj = window.sessionStorage.getItem(name);
  if (validatenull(obj)) obj = window.localStorage.getItem(name);
  if (validatenull(obj)) {
    return undefined;
  }
  obj = JSON.parse(obj);
  if (obj.dataType === 'string') {
    content = obj.content;
  } else if (obj.dataType === 'number') {
    content = Number(obj.content);
  } else if (obj.dataType === 'boolean') {
    content = !!(obj.content);
  } else if (obj.dataType === 'object') {
    content = obj.content;
  }
  // eslint-disable-line
  return content;
};
/**
     * 删除localStorage
     */
export const removeStore = (params) => {
  const {
    name,
  } = params;
  window.localStorage.removeItem(name);
  window.sessionStorage.removeItem(name);
};

/**
 * 获取全部localStorage
 */
export const getAllStore = (params) => {
  const list = [];
  const {
    type,
  } = params;
  for (let i = 1; i <= window.sessionStorage.length; i++) {
    if (type) {
      list.push({
        name: window.sessionStorage.key(i),
        content: getStore({
          name: window.sessionStorage.key(i),
          type: 'session',
        }),
      });
    } else {
      list.push(getStore({
        name: window.localStorage.key(i),
        content: getStore({
          name: window.localStorage.key(i),
        }),
      }));
    }
  }

  return list;
};

/**
 * 清空全部localStorage
 */
export const clearStore = (params) => {
  const {
    type,
  } = params;
  if (type) {
    window.sessionStorage.clear();
    return;
  }
  window.localStorage.clear();
};

util/validate.js

/**
 * 判断是否为空
 */
export function validatenull(val) {
  if (typeof val === 'boolean') {
    return false;
  }
  if (typeof val === 'number') {
    return false;
  }
  if (val instanceof Array) {
    if (val.length === 0) return true;
  } else if (val instanceof Object) {
    if (JSON.stringify(val) === '{}') return true;
  } else {
    if (val === 'null' || val === null || val === 'undefined' || val === undefined || val === '') return true;
    return false;
  }
  return false;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: vue 登录功能是指在 vue 框架中实现的登录功能登录功能的基本流程如下: 1. 用户输入登录信息,包括用户名和密码。 2. 将用户名和密码发送到服务器,请求验证。 3. 服务器验证用户名和密码是否正确。 4. 如果用户名和密码正确,则返回登录成功的信息;否则,返回登录失败的信息。 5. 在客户端,根据服务器返回的信息提示用户登录成功或失败。 在 vue 中,可以使用 axios 等库向服务器发送 HTTP 请求,实现与服务器的交互。也可以使用 vuex 管理登录状态,实现对登录信息的持久化存储。 ### 回答2: Vue登录功能是一种常见的网页登录认证功能,通过Vue框架实现。具体步骤如下: 首先,需要创建一个登录页面,包括用户名和密码的输入框,以及登录按钮。可以使用Vue的模板语法创建这个页面。 接下来,在Vuedata选项中定义一个对象,用于存储用户名和密码的数据。 在登录按钮的点击事件中,可以使用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、付费专栏及课程。

余额充值