添加Mock数据
前面我们使用elementUI实现了登录页面和简单的校验,现在使用接口的方式来实现登录的逻辑
使用EasyMock添加两个接口
因为要访问EasyMock 模拟接口, 所以要把 接口地址改一下,在 .env.development 文件中修改如下:
注意:改成你自已的EasyMock上的接口服务地址
# 使用 VUE_APP_ 开头的变量会被 webpack 自动加载,process.env.VUE_APP_xxx # 开发环境的前缀 VUE_APP_BASE_API = '/dev-api' # 目标服务接口地址,是按照自己的环境来的,添加或更改服务后,需要重启服务 VUE_APP_SERVICE_URL = ' http://mengxuegu.com:7300/mock/5db437d92aa750460d4fce18'
改完后,重启下 npm run serve , 看下是否正常
当登录成功后,响应状态码 2000 和 token 值。token用来 认证
后面请求只要是成功的,状态码均为 2000, 这个是与后台接口的约定
- 请求URL: /user/login
- 请求方式: post
- 描述:登陆认证
mock.js 配置如下
{ "code":2000, "flag":true, "message":"验证成功", "data":{ "token":"admin" } }
添加响应用户信息模拟接口
- 请求URL: /user/info/{token}
- 请求方式: get
- 描述:响应用户信息
mock.js 配置:
{ "code": 2000, "flag": true, "message": "成功获取用户信息", "data": { "id|1-10000": 1, "name": "@cname", "roles": ["manager"] } }
登录逻辑实现
src/api 下创建 login.js , 添加内容如下:
import request from '@/utils/request' // 导出的是普通成员函数 // 登录 export function login(username,password){ return request({ url: '/user/login', method: 'post', data: { username, password } }) } // 获取用户信息 export function getUserInfo(token){ return request({ url: `/user/info/${token}`, // 反单引号,动态获取token值 method: 'get' }) }
在 srcviewsloginindex.vue 的 submitForm 中进行逻辑处理.
1. 导入 import {login, getUserInfo} from '@/api/login'
2. 在 submitForm 函数进行登录判断和获取用户信息
<template> <div class="login-container"> <el-form ref="form" :rules="rules" :model="form" label-width="80px" class="login-form"> <h2 class="login-title">管理系统</h2> <el-form-item label="用户名" prop="username"> <el-input v-model="form.username"></el-input> </el-form-item> <el-form-item label="密码" prop="password"> <el-input v-model="form.password"></el-input> </el-form-item> <el-form-item> <el-button type="primary" @click="submitForm('form')">登录</el-button> </el-form-item> </el-form> </div> </template> <script> import { login, getUserInfo } from "@/api/login"; // 导入登录和获取用户信息的方法 export default { data() { return { form: { username: "", password: "" }, rules: { username: [ { required: true, message: "用户名不能为空", trigger: "blur" }, { min: 3, max: 10, message: "用户名3-5位", trigger: "blur" } ], password: [ { required: true, message: "密码不能为空", trigger: "blur" }, { min: 3, max: 10, message: "密码3-5位", trigger: "blur" } ] } }; }, methods: { submitForm(formName) { this.$refs[formName].validate(valid => { // console.log(valid) 验证通过为true,有一个不通过就是false if (valid) { // 提交表单给后台验证是否正确 login(this.form.username, this.form.password).then(response => { const res = response.data; console.log(res, res.flag, res.data.token, res.message); if (res.flag) { // 验证成功,通过token获取用户信息 getUserInfo(res.data.token).then(response => { const resUser = response.data; if (resUser.flag) { // 获取到了用户信息 console.log("userInfo", resUser.data); // 保存token和用户信息 localStorage.setItem( "zz-mms-user", JSON.stringify(resUser.data) ); localStorage.setItem("zz-mms-token", res.data.token); // 前往首页 this.$router.push("/"); } else { // 使用elementui的消息提示 this.$message({ message: resUser.message, type: "warning" }); } }); }else { // 未通过,弹出警告 // 使用elementui的消息提示 this.$message({ message: res.message, type: "warning" }); } }); } else { // 验证未通过,弹出警告 // 使用elementui的消息提示 this.$message.error('验证未通过'); } }); } } }; </script> <style acoped> .login-form { 350px; margin: 160px auto; /* 上下间距160px,左右自动居中*/ background-color: rgb(255, 255, 255, 0.8); /* 透明背景色 */ padding: 30px; border-radius: 20px; /* 圆角 */ } /* 背景 */ .login-container { position: absolute; 100%; height: 100%; background: url("../../assets/login.png"); } /* 标题 */ .login-title { color: #303133; text-align: center; } </style> -->