vue后台管理系统-登录


在程序应用组件App.vue中添加Login组件 引入Login遵循esModule规范 import 并在暴露的接口中注册login组件,在views文件夹下创建Login.vue文件,若要导入字体图标样式在main中导入

el-form:定义label-width表单域标签的宽度

el-form-item:label 定义标签文本内容

el-button:type 类型

el-input 定义提示信息placeholder  

提交校验 v-model 绑定el-input数据 通常为了方便给一个命名空间打点使用,在el-form-item props接收命名空间 

在下面script暴露接口暴露静态数据data(){return }中返回校验对象中包含账户和密码,并定义rules校验规则对象例如require:true是必填的 validator是校验方法

校验方法可以复用将其提出来单独创建一个校验方法文件,我们将其命名为validate.js文件在Login.vue文件中import引用用于validator做校验方法的

登录校验就是给el-input绑定点击事件,点击事件的方法定义在暴露接口的methods当中定义,为 el-form 定义ref 并命名,点击事件传递ref的名称,执行methods当中的方法

methods中方法获取ref对应的组件执行validate方法其中有一个valida对象,如果为真,因为异步接口对应store里面的异步消息队列actions,发送请求使用axios ,所以需要在main中引入axios并安装axios ,要安装到原型中 Vue.prototype = $http 但是我们是在store中发送异步消息,所以就是this.$store.dispatch(消息名称,传递消息)而不是直接this.$http,所以要store中订阅消息actions login(store, username)不能直接修改要发送请求,但是Store不是组件他没有axios,所以要引入axios,发送消息,判断状态码, 发送同步消息并将login作为一个同步的语法将其改为同步的语法 async和await书写,没有login的接口直接假数据发送请求在同步消息中订阅 '更新名字'(state, username)第一个表示静态数据, 所以要在state中定义username 在订阅中将state.username = username,登录之后我们希望跳转到首页去去就可以使用v-if和v-else在login和home首页组件中了,在router的入口文件中暴露接口 router实例化对象定义路由规则 path 为/ component: Home,引入Home.vue,并在App.vue中使用router-view路由占位符实现单页面应用程序,可以根据$store里面的静态数据state里面的username来判断显隐。但是这就出现一个问题他不能保持住状态

<template>
    <div class="login-view">
        
        <div class="form-container">
            
            
            
            <el-form :model="formData" :rules="rules" ref="form">
                <el-form-item prop="username">
                    <el-input placeholder="请输入用户名:" v-model="formData.username" prefix-icon="iconfont icon-yonghu">el-input>
                el-form-item>
                <el-form-item prop="password">
                    <el-input type="password" placeholder="请输入密码" v-model="formData.password" prefix-icon="iconfont icon-mima">el-input>
                el-form-item>
                <el-form-item class="btns">
                    <el-button type="success" @click="login('form')">登录el-button>
                el-form-item>
            el-form>
        div>
    div>
template>
import {username, password} from '@t/validate.js'
export default {    

    // 定义静态数据
    data() {
        return {
            // 校验对象
            formData: {
                username:'admin',
                password:'a123'
            },
            // 校验规则
            rules: {
                // 用户名
                username:[{trigger: 'blur', validator: username}],
                // 密码
                password:[{trigger: 'blur', validator: password}],
            }
        }
    },
    methods: {
        login(name) {
            // 获取组件
            this.$refs[name].validate(valid => {
                if(valid) {
                    // 发送请求
                    this.$store.dispatch('login', this.formData.username)
                }
            })

        }
    }
}

validate文件
//
暴露接口 export function username(obj, value, cb) { // console.log(111, arguments); // 用户名是4-8位字母数字下划线 if (!/^\w{4,8}$/.test(value)) return cb(new Error(' 用户名是4-8位字母数字下划线')) // 成功也要执行cb cb(); } // 暴露接口 export function password(obj, value, cb) { // 密码要包含字母和数字 if(!/^[a-z].*[0-9]$|^[0-9].*[a-z]$/.test(value)) return cb(new Error('密码要包含字母和数字线')); // 验证通过 cb(); } // 暴露接口重复密码 export function repeat(oldPsw, type, obj, value, cb) { // console.log(arguments); // 判断是否输入内容 if (!value) return cb(new Error('密码不能为空')); // 判断两次输入的密码是否一致 if (oldPsw !== value) return cb(new Error('您两次输入的密码不一致')); // 执行成功 cb(); }

store的index.html

// 引入Vue 
import Vue from 'vue';
// 引入vuex
import Vuex, {Store} from 'vuex';
// 引入axios
import axios from 'axios';
//安装
Vue.use(Vuex);

// 引入message
import {Message} from 'element-ui';

// 暴露接口
export default new Store({
    // 静态数据
    state:{
        // 用户名
        username: ''
    },
    // 同步消息队列
    mutations:{
        // 订阅消息
        updateUsername(state, username) {
            state.username = username;
        }
    },
    // 异步消息队列
    actions:{
        // 订阅消息
        async login(store, username) {
            
            // 发送消息
            let {data: res} = await axios.post('/login', {username}) 
            
            // 判断状态码
            if(res.errno) return Message({type: 'warning', message: res.msg })
            // 提交一个同步消息
            store.commit('updateUsername', username);

        },
        // 订阅消息
        async userInfo(store) {
            // 发送请求
           let {data: res} = await axios.get('/admin/userInfo');// 判断状态码
           if(res.errno) return Message({type: 'warning', message: res.msg })
           // 提交一个同步消息
           store.commit('updateUsername', res.data);


        }
    }

})

相关