VUE3 实战教程

登录页

Preview

创建项目什么的,这里就不多讲了,因为前面的文章都是为实战准备的,看好前面的文章,就没有什么难点了。其实最重要的还是实战之前的文章,实战只是我们知识的巩固和整合。

登录页我们就讲一下登录的流程,登录接口的调用,还是store接收token,改变token。之前就有写过pinia的用法,这里就不啰嗦了。

初始化token 在store/module/common.js中定义

import { defineStore } from 'pinia'
export const useCommonStore = defineStore('common', {
  state: () => {
    return {
      token: null,
    }
  },
  persist: true,
})

登录页详细代码:

<template>
  <div class="login-card ga-flex ga-ai-c ga-j-c">
    <div class="ga-flex ga-flex-column ga-ai-c">
      <div>
        <img width="80" src="./../assets/images/galaxy-logo.png" alt="logo">
      </div>
      <div class="login-main m-t-15">
        <el-form :model="form"  >
          <h2 class="text-center">Sign in to account</h2>
          <p class="text-center font-dark f-14 m-b-25">Enter your email & password to login</p>
          <el-form-item>
            <label class="col-form-label">User Name</label>
            <el-input v-model="form.username" class="form-control"  type="text" />
          </el-form-item>
          <el-form-item >
            <label class="col-form-label">Password</label>
            <el-input v-model="form.password" class="form-control"  type="password" />
          </el-form-item>
          <el-form-item >
            <div class="ga-flex ga-ai-c" style="flex: 1">
              <el-checkbox v-model="checked" size="large"/>
              <label class="font-dark m-l-10 " for="checkbox1">Remember password</label>
            </div>
            <div>
              <a class="font-primary">Forgot password?</a>
            </div>
          </el-form-item>
          <div class="m-t-15">
            <ga-button @click="login" style="width: 100%"> <text class="f-w-600">Sign in </text> </ga-button>
          </div>
          <div class="login-social-title">
            <h3>Or Sign in with</h3>
          </div>
          <div class="login-social ga-flex ga-j-c ga-ai-c">
            <div class="ga-flex ga-ai-c ga-j-c m-r-10"><a href="https://www.facebook.com" target="_blank"><i class="fa fa-facebook"></i></a></div>
            <div class="ga-flex ga-ai-c ga-j-c m-r-10"><a href="https://www.linkedin.com" target="_blank"><i class="fa fa-linkedin"> </i></a></div>
            <div class="ga-flex ga-ai-c ga-j-c m-r-10"><a href="https://www.twitter.com" target="_blank"><i class="fa fa-twitter"></i></a></div>
            <div class="ga-flex ga-ai-c ga-j-c m-r-10"><a href="https://www.instagram.com" target="_blank"><i class="fa fa-instagram"></i></a></div>
          </div>
        </el-form>
      </div>
    </div>

  </div>
</template>

<script setup>
import {reactive, ref} from "vue"
import { useRouter } from 'vue-router'
import { useCommonStore } from '../store/module/common.js'
import {UserApi} from "../api/api.js";
const checked = ref(true)
const form = reactive({
  username:'',
  password:''
})
const router = useRouter()
const commonStore = useCommonStore()

// 模拟登录
const login = async () => {
  const params = form
  const res = await UserApi.login(params)
 // localStorage.setItem('token', res.data.token)
  // 修改store的token,并且存起来(设置persist: true),以后就行store存的缓存中获取
  commonStore.$patch({
    token: res.data.token,
  })
  router.push('/')
}
</script>

<style lang="scss" scoped>
.login-card{
  min-height: 100vh;
  background: rgba(83, 70, 134, 0.14);
  padding: 30px 12px;
  .login-main{
    width: 450px;
    padding: 40px;
    box-sizing: border-box;
    border-radius: 10px;
    box-shadow: 0 0 37px rgba(8, 21, 66, 0.05);
    margin: 0 auto;
    background-color: #ffffff;
  }
  .col-form-label{
    letter-spacing: 0.4px;
  }

  .form-control{
    height: 47px;
    line-height: 47px;
  }

  .login-social-title{
    position: relative;
    z-index: 1;
    text-align: center;
    margin-top: 30px;
    margin-bottom: 30px;
    &:before{
      content: "";
      position: absolute;
      width: 100%;
      height: 2px;
      background-color: rgba(83, 70, 134, 0.1019607843);
      top: 10px;
      z-index: -1;
      right: 0;
    }
    h3{
      width: fit-content;
      margin-left: auto;
      margin-right: auto;
      color: #9993B4;
      background-color: #ffffff;
      padding-left: 25px;
      padding-right: 25px;
      font-size: 20px;
      font-weight: 500;
      letter-spacing: 0.5px;
    }

  }
  .login-social div {
    width: 40px;
    height: 40px;
    border-radius: 50%;
    border: 1px solid rgba(83, 70, 134, 0.1019607843);
    background-color: rgba(83, 70, 134, 0.05);
    &:hover{
      background-color: #534686;
      a{
        color: #ffffff !important;
      }
    }
    a{
      width: auto;
      color: #534686;
    }

  }

}
</style>

登录页效果: image.png