前言


一、登陆界面设计

1.1、新建登录组件index.vue

<template>
<div>
登录页面
</div>
</template>

1.2、配置路由index.js

import Vue from "vue";
import VueRouter from "vue-router";
//导入登录组件,后面的 index.vue 可以不写,因为默认就会找
index.vue,这就是为什么取名为 index.vue 的好处。
import Login from "../views/login/index.vue" Vue.use(VueRouter);
const routes = [
{//配置登录路由

path: "/login", name: "login", component: Login
}, ];
const router = new VueRouter({
mode: "history", base: process.env.BASE_URL, routes
});
export default router

1.3、清理下根组件 App.vue

<template>
<div id="app">
//<!-- 显示路由组件位置 -->
<router-view />
</div>
</template>
<style lang="scss">
body {
font: "微软雅黑";
}
</style>

1.4、测试

二、使用 element 完善系统登录界面设计

2.1、登录界面 Index.vue 表单

<template>
<div id="login-container">
<el-form ref="form" :model="form" label-width="60px" class="login-form">
<h2 class="login-title">小豆子图书信息管理系统</h2>
<el-form-item label="账号">
<el-input v-model="form.username" placeholder="请输入账号"></el-input>
</el-form-item>
<el-form-item label="密码">
<el-input v-model="form.password" type="password" placeholder="请输入密码"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit">登录</el-button>
</el-form-item>
</el-form>
</div>
</template>
<script>
export default {
data() {
return {
form: {
username: '', password: '', }
}
},methods: {
onSubmit() {
console.log('submit!');
}
}
}
</script>

2.2、登陆界面index.vue表单美化

<style scoped>
#login-container {
  /* 让这个div100%布满屏幕 */
  position: absolute;
  width: 100%;
  height: 100%;
  background-image: url("../../assets/login-bg.jpg");
  background-size: cover;
}
.login-form {
  width: 350px;
  background-color: rgb(191, 208, 223);
  /* margin: 160px auto; */
  padding: 15px;
  border-radius: 20px;
  height: 250px;
  /* 让它真正的居中 */
  left: 50%;
  top: 50%;
  margin-left: -175px;
  margin-top: -125px;
  position: absolute;
}
.login-title {
  color: rgb(9, 10, 10);
  text-align: center;
}
</style>

2.3、App.vue的美化

<style lang="scss">
body {
  font: "微软雅黑";
  // 解决主页上下左右多出一点点出现滚动条
  margin: 0px auto;
}
</style>

三、使用 element 完善系统登录界面设计

3.1、登录表单验证功能

<template>
  <div id="login-container">
    <el-form
      :ref="form"
      :rules="rules"
      :model="form"
      label-width="60px"
      class="login-form"
    >
      <h2 class="login-title">小豆子图书管理系统</h2>
      <el-form-item label="账号" prop="username">
        <el-input v-model="form.username" placeholder="请输入账号"></el-input>
      </el-form-item>
      <el-form-item label="密码" prop="password">
        <el-input
          v-model="form.password"
          type="password"
          placeholder="请输入密码"
        ></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 loginAPI from '@/API/login' 
//login.js 中 js 不用写,不过这种导入方式导入的是默认对象,而在 login.js 导出的是普通函数对象,所以换下面的按需导入
import { login, getUserInfo } from "@/api/login";
export default {
  data() {
    return {
      form: {
        username: "",
        password: "",
      },
      //定义账号密码的输入规则
      rules: {
        username: [{ required: true, message: "请输入账号", trigger: "blur" }],
        password: [
          { required: true, message: "请输入密码", trigger: "blur" },
          {
            min: 6,
            max: 23,
            message: "长度在6~23个字符",
            trigger: ["blur", "change"],
          },
        ],
      },
    };
  }
</script>

3.2、登录功能实现

methods: {
submitForm(formName) {
this.$refs[formName].validate(valid => {
if (valid) { //valid 为 true 表示所有表单校验通过
alert("submit!");
} else {
console.log("error submit!!");
return false;
}
});
}
}

四、使用 Easymock 为登录验证创建模拟接口

4.1、首先修改下我们服务接口基础地址

4.2、创建服务接口(配置 mock.js)

假设后台只要请求成功,状态码统一规定为 200

{ "code": 200, // 状态码
"flag": true,
"message": '验证成功',
"data":
{ "token": "admin" }
}

图书信息管理系统(二)-LMLPHP

{ "code": 200,
 "flag": true,
  "message": '成功获取用户信息',
"data": //生成数据的规则
{ "id|1-1000": 1,
 "name": "@cname",//cname是中文名字,name是英文名字
 "roles": ["manager"]}
}

图书信息管理系统(二)-LMLPHP

五、登录业务逻辑实现

5.1、创建 api 接口文件 login.js

import myaxios from '@/utils/myaxios'
//发送 ajax 请求,传入账户、密码,用于验证用户是否有资格
export function login(username,password){
    //返回这个promise对象以供后续操作.then.catch
    return myaxios({
        url:'/user/login',//最前面的/不要少的
        method:'post',//url 和 method 两个属性值与前面创建接口时保持一致
        data:{//发送请求,并带数据过去
            username, //username:username
            password
        }
    })
}
//发送 ajax 请求,传入 token,用于获取用户信息
export function getUserInfo(token){
    return myaxios({
        url:`user/info/${token}`, //由于这里需要拼接占位符,所以用``
        method:'get'
    })
}

5.2、使用 login.js 发送异步请求

<script>
//import loginAPI from '@/API/login' 
//login.js 中 js 不用写,不过这种导入方式导入的是默认对象,而在 login.js 导出的是普通函数对象,所以换下面的按需导入
import { login, getUserInfo } from "@/api/login";
export default {
  data() {
    return {
      form: {
        username: "",
        password: "",
      },
      //定义账号密码的输入规则
      rules: {
        username: [{ required: true, message: "请输入账号", trigger: "blur" }],
        password: [
          { required: true, message: "请输入密码", trigger: "blur" },
          {
            min: 6,
            max: 23,
            message: "长度在6~23个字符",
            trigger: ["blur", "change"],
          },
        ],
      },
    };
  },
  methods: {
    submitForm(formName) {
      // valid是指表单验证结果(就是输入是否符合规则)
      this.$refs[formName].validate((valid) => {
        //valid 为 true 表示所有表单校验通过,符合规则
        if (valid) {
          //校验成功,调用login接口
          login(this.form.username, this.form.password).then((response) => {
            console.log(response.data);
            const resp = response.data;
            if (resp.flag) {
              //认证通过,获取token令牌,调用另一个接口
              getUserInfo(resp.data.token).then((response) => {
                console.log(response.data);
                const respUser = response.data;
                if (respUser.flag) {
                  //获取用户信息
                  //存储信息到浏览器本地
                  localStorage.setItem("llf-manager-user",JSON.stringify(respUser.data));
                  localStorage.setItem("llf-manager-token", resp.data.token);
                  this.$router.push("./");//获取到后跳转到主页面
                } else {
                  //获取用户信息失败
                  this.$message({
                    message: respUser.message,
                    type: "warning",
                  });
                }
              });
            } else {
              //认证失败
              this.$message({
                message: resp.message,
                type: "warning",
              });
            }
          });
        } else {
          //校验失败
          console.log("error submit!!");
          return false;
        }
      });
    },
  },
};
</script>
06-18 16:26