HM后台(一)

一,项目初始化

1.vue脚手架图形化配置

在控制面板输入vue ui, 创建- 桌面(项目本地存放路径)-在此创建新项目-输入项目名(英文)
-初始化git仓库-手动配置项目(babel,router,vuex,linter,使用配置文件)-
不选择历史路由(history),standardconofig, -lint on save-

2.

配置element-ui
插件- vue-cli-plugin-element, 安装
配置插件,按需引入,
配置axios,
依赖,axios,安装,运行依赖

 

二,登录/退出功能

 

三,登录页面的样式

1.新建login.vue组件,

<style lang="less" scoped
scoped,为当前组件的样式生效,不加,就是全局的样式

配置login路由

import Login from '@/views/Login'
const routes = [
  {
    path: '/login',
    component: Login
  },
  {
    path: '/',
    redirect: '/login'
  }
]

const router = new VueRouter({
  routes
})

在app.vue组件中

<template>
  <div id="app">
    <router-view></router-view>
  </div>
</template>

2.让登录组件的颜色样式铺满网页

assets文件夹中新建css-global.css, 全局样式表

在main.js中导入

// 导入全局样式
import './assets/css/global.css'
html,
body,
#app{
  height: 100%;
  margin: 0;
  padding: 0;
}

3.登录组件的样式编写

 

 

3.1,在main.js文件中导入阿里巴巴字体图标库,下载到本地

aimport './assets/fonts/iconfont.css'
<template>
  <div class="login-container">
    <div class="login-box">
      <div class="avatar-box">
        <img src="../assets/logo.png" alt="" />
      </div>

      <!-- 登录表单 -->
      <el-form
        label-width="0px"
        class="login-form"
        style="width:100%"
        :model="loginForm"
      >
        <el-form-item>
          <el-input
            v-model="loginForm.username"
            prefix-icon="iconfont icon-user"
          ></el-input>
        </el-form-item>

        <el-form-item>
          <el-input
            v-model="loginForm.password"
            type="password"
            prefix-icon="iconfont icon-3702mima"
          ></el-input>
        </el-form-item>
        <el-form-item class="login-btn">
          <el-button type="primary" size="middle">登录</el-button>
          <el-button type="warning" size="middle">提交</el-button>
        </el-form-item>
      </el-form>
    </div>
  </div>
</template>

<script>
export default {
  name: "Login",
  data() {
    return {
      loginForm: {
        username: "",
        password: ""
      }
    };
  }
};
</script>

<style scoped lang="less">
.login-container {
  background-color: #2b4b6b;
  height: 100%;
  position: relative;

  .login-box {
    width: 450px;
    height: 300px;
    background: #fff;
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);

    .avatar-box {
      width: 130px;
      height: 130px;
      border: 1px solid #eee;
      border-radius: 50%;
      background: #fff;
      position: absolute;
      left: 50%;
      transform: translate(-50%, -50%);
      padding: 10px;
      box-shadow: 0 0 10px #abc;

      img {
        height: 100%;
        border-radius: 50%;
        background: #eee;
      }
    }

    .login-form {
      position: absolute;
      bottom: 0px;
      padding: 0 10px;
      box-sizing: border-box;

      .login-btn {
        display: flex;
        justify-content: flex-end;
      }
    }
  }
}
</style>

 

4.登录组件的表单数据验证

 <el-form
        label-width="0px"
        class="login-form"
        style="width:100%"
        :model="loginForm"
        :rules="loginFormRules"
      >
        <el-form-item prop="username">
          <el-input
            v-model="loginForm.username"
            prefix-icon="iconfont icon-user"
          ></el-input>
        </el-form-item>

        <el-form-item prop="password">
          <el-input
            v-model="loginForm.password"
            type="password"
            prefix-icon="iconfont icon-3702mima"
          ></el-input>
loginFormRules: {
        username: [
          { required: true, message: "请输入登录名称", trigger: "blur" },
          { min: 3, max: 10, message: "长度在 3 到 10 个字符", trigger: "blur" }
        ],

        password: [
          { required: true, message: "请输入登录密码", trigger: "blur" },
          { min: 3, max: 10, message: "长度在 3 到 10 个字符", trigger: "blur" }
        ]
      }

5.表单重置按钮的功能

点击重置按钮,对表单的输入框重置,以及校验重置初始值

 

 

<el-form
        label-width="0px"
        class="login-form"
        style="width:100%"
        :model="loginForm"
        :rules="loginFormRules"
        ref="loginFormRef"
      >
<el-button type="warning" size="middle" @click="reset"
            >重置</el-button>
reset() {
      // 点击重置按钮,输入框数据消失
      this.$refs.loginFormRef.resetFields();
      // console.log(this)
    }

 

6.点击登录按钮,进行表单的预验证

 

 6.1,在main.js引入axios,配置接口

import axios from 'axios'
// 配置请求的跟路径
axios.defaults.baseURL = 'http://127.0.0.1:8888/api/private/v1/'
Vue.prototype.$http = axios

 

 <el-form-item class="login-btn">
          <el-button type="primary" size="middle" @click="login"
            >登录</el-button
          >
login() {
      this.$refs.loginFormRef.validate(async valid => {
        if (!valid) return
        const { data: res } = await this.$http.post('login', this.loginForm)
        if (res.meta.status !== 200) return this.$message.error('登录失败!')
        this.$message.success('登录成功')
        // 1. 将登录成功之后的 token,保存到客户端的 sessionStorage 中
        //   1.1 项目中出了登录之外的其他API接口,必须在登录之后才能访问
        //   1.2 token 只应在当前网站打开期间生效,所以将 token 保存在 sessionStorage 中
        window.sessionStorage.setItem('token', res.data.token)
        // 2. 通过编程式导航跳转到后台主页,路由地址是 /home
        this.$router.push('/home')
      })
    }

 

7.路由导航守卫控制访问权限

7.1,如果用户没有登录,但是直接通过URL访问特定页面,需要重新导航到登录页面

 

 在路由配置文件中配置路由守卫, 判断路劲,在判断是否登录(token值)

,const router = new VueRouter({
  routes
})

// 挂载路由导航守卫
router.beforeEach((to, from, next) => {
  // to 将要访问的路径
  // from 代表从哪个路径跳转而来
  // next 是一个函数,表示放行
  //     next()  放行    next('/login')  强制跳转

  if (to.path === '/login') return next()
  // 获取token
  const tokenStr = window.sessionStorage.getItem('token')
  if (!tokenStr) return next('/login')
  next()
})

 

8.退出功能

基于 token 的方式实现退出比较简单,只需要销毁本地的 token 即可。这样,后续的请求就不会携带 token ,必须重新登录生成一个新的 token 之后才可以访问页面。

<el-button type="info" @click="logout">退出</el-button>
logout() {
      window.sessionStorage.clear()
      this.$router.push('/login')
    }

 

posted @ 2021-01-09 16:30  全情海洋  阅读(196)  评论(0编辑  收藏  举报