Vue后台管理项目(1)登录页面

1 准备工作

软件:vscode
安装vue-cli脚手架,参考另一篇笔记:https://blog.csdn.net/qq_36932169/article/details/105379074

我的版本是:

vue-cli:@vue/cli 5.0.8
vue:vue@3.3.4

以下教程用的是vue3
安装完成之后启动一下:npm run serve
在这里插入图片描述

2 登录页面

2.1 路由配置

src/router/index.js

import {
    createRouter,
    createWebHistory
} from 'vue-router';

const routes = [{
        path: '/login',
        name: 'login',
        component: () =>
            import('@/views/Login/index.vue')
    },
    {
        path: '/',
        name: 'layout',
        component: () =>
            import('@/views/Layout'),
        redirect: '/home',
        children: [{
                path: '/home',
                name: 'home',
                component: () =>
                    import('@/views/system/Home'),

            },
            {
                path: 'system/journal',
                name: 'journal',
                meta: {
                    label: '期刊'
                },
                component: () =>
                    import('@/views/system/journal')
            },
            {
                path: 'system/paper',
                name: 'paper',
                meta: {
                    label: '文章'
                },
                component: () =>
                    import('@/views/system/paper')
            },
            {
                path: 'system/user',
                name: 'user',
                meta: {
                    label: '用户'
                },
                component: () =>
                    import('@/views/system/user')
            },
            {
                path: 'system/record',
                name: 'record',
                meta: {
                    label: '记录'
                },
                component: () =>
                    import('@/views/system/record')
            }
        ]

    }

]

const router = createRouter({
    history: createWebHistory(process.env.BASE_URL),
    routes
})

export default router

2.2 登录页面组件

src/views下创建Login文件夹并建立index.vue和login.vue
(1)src/views/Login/index.vue

<template>
  <div>
    <div class="login" :style="'background-image:url(' + Background + ');'">
      <div class="login_position">
        <login></login>
      </div>
    </div>
  </div>
</template>
 
<script>
import Background from "@/assets/bg01.jpg"
//引入
import login from "@/views/Login/login";
 
export default {
//注册
  components: {
    login
  },
  data(){
    return{
      Background: Background
    }
    
  }
}
</script>
 
<style lang="less" scoped>

.login {
  display: flex;
  justify-content: center;
  align-items: center;
  height: 605px;
  width: 100%;
  position: relative;
  background-size: cover;
}
 
.login_position {
  border-radius: 6px;
  position: absolute;
  top: 80px;
  right: 100px;
  background-color: #fff;
}
</style>

(2)登陆组件:src/views/Login/login.vue,
这里需要注意搭配用的element-plus,也可以参考笔记https://blog.csdn.net/qq_36932169/article/details/105379074

<template>
  <div class="LoginForm-Panel" v-loading="loading">
    <div class="login">
      <div class="login-title">
        <span>账号登录</span>
        <span>忘记密码</span>
      </div>
      <el-form :rules="rules" :model="loginForm" ref="loginForm">
        <el-form-item prop="userName">
          <el-input
            v-model="loginForm.userName"
            prefix-icon="User"
            placeholder="请输入用户名"
          ></el-input>
        </el-form-item>
        <el-form-item prop="password">
          <el-input
            type="password"
            show-password
            v-model="loginForm.password"
            prefix-icon="Lock"
            placeholder="请输入密码"
          ></el-input>
        </el-form-item>

        <el-button style="width: 100%" type="primary" @click="login()"
          >登录</el-button
        >
      </el-form>
    </div>
  </div>
</template>
 
<script>
export default {
  created() {
    console.log("created-------------");
  },

  data() {
    return {
      loading: false, //页面加载状态
      loginForm: {
        //表单项
        userName: "",
        password: "",
      },
      rules: {
        //验证规则
        userName: [{ required: true, message: "请输入用户名" }],
        password: [{ required: true, message: "请输入密码" }],
      },
    };
  },
  methods: {
    //设置页面加载状态
    setLoading(bool) {
      this.loading = bool;
    },

    login() {
}
}
</script>
 
 
<style lang="less">
.login {
  padding: 20px;

  .login-title {
    font-size: 14px;
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-bottom: 40px;
    height: 40px;
    line-height: 1.5;

    a {
      outline: none;
    }
  }
}

.el-form-item__content {
  display: flex;
}

.login-code {
  margin-left: 5px;
  width: 33%;
  height: 100%;

  img {
    cursor: pointer;
    vertical-align: middle;
    height: 100%;
  }
}
</style>

2.2.1 ui好看的登录页面(我用的是这个)

<template>
  <div id="login">
    <div id="login-form" @keyup.enter="inputInfo">
      <h1 class="login-title">登陆界面</h1>
      <el-form :rules="loginRules" :model="loginForm" ref="loginForm">
        <el-form-item prop="userName">
          <label for="userName"
            ><i class="el-icon-user-solid" style="color: #c1c1c1"></i
          ></label>
          <input
            type="text"
            placeholder="用户名"
            name="userName"
            id="userName"
            autocapitalize="off"
            v-model.trim="loginForm.userName"
            aria-autocomplete="off"
          />
        </el-form-item>

        <el-form-item prop="password">
          <label for="password"
            ><i class="el-icon-right" style="color: #c1c1c1"></i
          ></label>
          <input
            type="password"
            placeholder="密码"
            name="password"
            id="password"
            autocapitalize="off"
            v-model.trim="loginForm.password"
          />
        </el-form-item>

        <div>
          <el-button type="primary" v-on:click="login">登录</el-button>
          <el-button type="info" @click="register">注册</el-button>
        </div>
      </el-form>
    </div>
  </div>
</template>

<script>
export default {
  data: function () {
    return {
      loginForm: {
        //表单项
        userName: "",
        password: "",
      },
      loginRules: {
        //验证规则
        userName: [
          { required: true, trigger: "blur", message: "请输入用户名" },
        ],
        password: [{ required: true, trigger: "blur", message: "请输入密码" }],
      },
    };
  },
  methods: {
    login() {
      this.$refs.loginForm.validate((val) => {
        if (val) {
          // 表单验证通过
          this.$router.push("/");
        }
      });
    },
  },
};
</script>

<style lang="scss" scoped>
#login {
  width: 100vw;
  height: 100vh;
  overflow: hidden;
  position: relative;
  background-image: url("@/assets/images/bg02.jpg");
  background-repeat: no-repeat;
  background-attachment: fixed;
  background-position: center;
  background-size: cover;
}

#login-form {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: 50vw;
  min-width: 300px;
  max-width: 400px;
  display: flex;
  flex-direction: column;
  background-color: rgba(0, 0, 0, 0.7);
  border-radius: 15px;
  box-shadow: 0 15px 25px rgba(0, 0, 0, 0.5);

  h1 {
    width: 60%;
    margin: 50px auto 20px;
    color: #c1c1c1;
    text-align: center;
  }

  input {
    width: 60%;
    margin: 15px auto;
    outline: none;
    border: none;
    padding: 10px;
    border-bottom: 1px solid #fff;
    background: transparent;
    color: white;
  }

  label {
    width: 60%;
    margin: 0 auto;
    position: relative;
    top: 30px;
    left: -15px;
  }

  div {
    width: 60%;
    margin: 10px auto;
    display: flex;
    justify-content: center;
    align-content: center;
  }

  button {
    // rgba
    background-color: rgba(9, 108, 144, 0.5);
    margin: 10px 25px 40px 25px;
  }

  p {
    width: 60%;
    margin: 8px auto;
    position: relative;
    left: -15px;
    color: #ff0000;
    font-size: 8px;
  }
}

input {
  -webkit-text-fill-color: #ffffff !important;
  transition: background-color 5000s ease-in-out, width 1s ease-out !important;
}
</style>

2.3 处理登录请求

(1)封装使用接口请求,方法写在api里。
src/utils文件夹下创建request.js

import axios from "axios";

let request = axios.create({
    baseURL: 'http://192.168.50.86:8081',
    timeout: 5000
})
export default request

src/api/login.js

import request from "@/utils/request"

//登录
export function login(data) {
    return request({
        url: "/user/login",
        method: "post",
        data
    })
}

views/Login/index.vue

 <script>
import { login } from "@/api/login";

...
methods: {
    login() {
      this.$refs.loginForm.validate((val) => {
        if (val) {
        //表单验证通过,将登录表单信息传给后端
          login(this.loginForm).then((res) => {
            console.log(res.data);
            this.$router.push("/");
          });
        }
      });
    },
  },

(2)添加拦截器,提示请求失败信息
我们发现登陆失败的时候,页面一点反应都没有,是不是很不合常理?我们需要在获得后端响应之后对后端返回的信息进行处理并显示出来,于是就需要使用拦截器。
src/utils/request.js
导入axios,并创建实例,然后给实例添加响应拦截器即可

import axios from "axios";
let request = axios.create({
    baseURL: 'http://192.168.50.86:8081',
    timeout: 5000
})

//添加响应拦截器
request.interceptors.response.use(response => {
        console.log(response);
        console.log('响应拦截器');
        return response.data;
    },
    error => {
        ElMessage.error('请求失败了' + error);
        return Promise.reject(error)
    })
    
export default request

(3)token认证(jwt)
JWT本身就包含校验信息,是不需要写入数据库的。可以理解为:token是身份证号码,JWT是身份证,身份证上面是有过期时间的。
在这里插入图片描述
①保存用户名密码到cookies
②保存token到cookies

新建utils/auth.js,定义公共的获取token和设置token的方法

//npm install js-cookie
import Cookies from 'js-cookie'
import Config from '@/settings'

const TokenKey = Config.TokenKey
// const TokenKey = 'EL-ADMIN-TOEKN'

export function getToken() {
    return Cookies.get(TokenKey)
}

export function setToken(token) {
    Cookies.set(TokenKey, token)
}

export function removeToken() {
    return Cookies.remove(TokenKey)
}

存放一些公用配置信息src/setting.js

module.exports = {
  TokenKey: 'EL-ADMIN-TOEKN',
}

接着我们在发送登陆请求之后把token保存到Cookies里面

views/Login/index.vue

import { setToken } from "@/utils/auth";
...
    login() {
      this.$refs.loginForm.validate((val) => {
          login(this.loginForm).then((res) => {
            console.log(res.data);
            setToken(res.data.token); //保存token
            this.$router.push("/");
          });
        }
      });
    },

(4)路由导航守卫NavigationGuard
如何想在登录过后,直接跳过登录页面?或者没有登录就跳转到登录页面
router/index.js中添加

//假如用户A没有登录,访问了Login页面
router.beforeEach((to, from, next) => {
    if (getToken() !== 'undefined' && getToken()) { //已登录
        if (to.name === 'login') next({
            name: 'layout'
        }) // 如果访问的是登陆页面,直接跳转到主页
        // 另外一种写法,直接写path,next('/layout')
        else next() //想去哪里就去哪里
    } else if (to.name !== 'login')
        //没有登录
        next({
            name: 'login'
        }) //如果不是登陆页面,重定向到登陆页面
    else next() //如果是登陆页面,就直接放行
})

(5)请求拦截器,实现携带token发送请求
utils/requst.js

//添加请求拦截器
request.interceptors.request.use(config => {
        if (getToken()) {
            config.headers['Authorization'] = getToken()
        }
        return config
    },
    error => {
        return Promise.reject(error)
    })

(6)注销功能
utils/requst.js

//添加响应拦截器
request.interceptors.response.use(response => {
        console.log(response);
        console.log('响应拦截器');
        return response.data;
    },
    error => {
        let code = error.response.data.status
        ElMessage.error(code + ' ' + error.response.data.message);

        if (code === 401) { //如果认证失败,则实行注销操作
            removeToken(Config.TokenKey)
            router.replace('/').then(res => {})
        }
        return Promise.reject(error)
    })

2.4 添加验证码功能

2.5 添加记住我功能

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Vue后台管理项目是一种用于管理和操作后台数据的web应用程序。它基于Vue.js这个流行的JavaScript框架,并结合了其他插件和工具来实现丰富的功能和良好的用户体验。 首先,Vue后台管理项目采用了组件化的架构,将一个页面拆分为多个可重用的组件,这样可以提高代码的可维护性和重用性。每个组件负责不同的功能,例如用户管理、商品管理、订单管理等,通过组合这些组件可以构建出完整的后台管理系统。 其次,Vue后台管理项目具有响应式设计,可以适应不同尺寸的屏幕,包括电脑、平板和手机等。这使得管理员可以随时随地使用这个应用程序来管理后台数据,提升了工作的灵活性和效率。 此外,Vue后台管理项目还支持实时数据更新和交互。通过使用Vue的数据绑定和虚拟DOM技术,可以实现数据的双向绑定,当后台数据发生改变时,页面上的内容会自动更新,而不需要手动刷新页面。同时,它还支持一些交互操作,比如表单验证、搜索、排序、筛选等,方便管理员进行数据的查找和管理。 最后,Vue后台管理项目还提供了一些可自定义的主题和UI组件,使得管理员可以根据自己的需求来定制页面风格和用户界面。这些主题和UI组件可以提高页面的美观度和用户体验。 综上所述,Vue后台管理项目是一种功能丰富、灵活性高、用户体验好的web应用程序,适用于各种后台管理系统的开发。 ### 回答2: Vue后台管理项目是一种基于Vue.js框架开发的管理系统,用于管理和统计企业的各种数据信息以及业务流程。这种项目通常包含了用户管理、权限管理、数据可视化、数据统计、业务处理等功能模块。 在Vue后台管理项目中,用户管理模块负责管理系统的用户,包括用户的注册、登录、修改密码等功能,同时也包括用户权限的管理和分配。权限管理模块用于控制系统各个功能模块的访问权限,保证只有拥有相应权限的用户才能进行操作。 数据可视化模块是Vue后台管理项目的重要组成部分,它通过各种图表和图形展示企业的数据信息,帮助用户更直观地了解企业的运营情况和趋势。数据统计模块则对企业的各项指标进行统计分析,提供数据报表和图像展示,帮助用户更深入地了解企业的业务情况。 业务处理模块是Vue后台管理项目的核心功能模块,通过对各种业务流程的管理和处理,使企业能够高效地进行各项业务活动。该模块通常包括订单管理、库存管理、销售管理等功能,可以帮助企业实现订单的创建、处理和查询,库存的管理和统计,以及销售情况的跟踪和分析。 总之,Vue后台管理项目是一种集用户管理、权限管理、数据可视化、数据统计和业务处理于一体的管理系统,能够帮助企业高效地管理和处理各项业务。它以简洁高效的代码结构、灵活可扩展的功能模块、友好的用户界面和良好的用户体验,成为在企业中广泛应用的管理工具。 ### 回答3: Vue后台管理项目是一种基于Vue框架开发的一种管理系统,用于帮助企业、机构或个人管理和维护其业务数据和功能。该项目具有以下特点: 首先,Vue后台管理项目具有良好的用户界面设计。通过使用Vue的组件化开发,可以构建出现代化的用户界面,使用户能够直观地查看和操作系统的各种功能和数据。 其次,该项目具有响应式布局和自适应功能。通过使用Vue的响应式布局和强大的CSS库,可以使管理系统在不同屏幕大小和设备上能够自动适应,使用户在不同设备上都能够方便地使用管理功能。 再次,Vue后台管理项目具有灵活的数据管理和展示功能。通过Vue的数据双向绑定和组件化开发,可以轻松地读取、展示和修改后台数据库中的数据,使管理员可以方便地对数据进行增删改查操作。 此外,该项目还具有丰富的插件和组件库支持。通过Vue的插件系统和第三方组件库,可以快速引入各种强大的功能和界面组件,如图表、表单验证、富文本编辑器等,使系统具有更多的扩展性和灵活性。 最后,Vue后台管理项目还具备定制化和安全性。通过使用Vue的模块化开发和权限控制等技术,可以根据具体的业务需求和安全要求,对系统进行定制化和安全性的调整,以满足用户的特定需求和保护系统的安全性。 综上所述,Vue后台管理项目是一种强大、灵活和易用的管理系统,具有良好的用户界面设计、响应式布局和自适应功能、灵活的数据管理和展示功能、丰富的插件和组件库支持,以及定制化和安全性等特点,可以帮助用户更好地管理和维护其业务数据和功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值