電商後臺管理系統——登入功能

小丕發表於2020-10-09

標題:電商後臺管理系統——登入功能

實現登入功能
A.登入狀態保持
1.如果伺服器和客戶端同源,建議可以使用cookie或者session來保持登入狀態
2.如果客戶端和伺服器跨域了,建議使用token進行維持登入狀態。
涉及知識點:【跨域解決方案】【token 原理分析 】【本地儲存區別】

B.登入邏輯:
1.在登入頁面輸入賬號和密碼進行登入,將資料傳送給伺服器,伺服器返回登入的結果,登入成功則返回資料中帶有token
2.客戶端得到token並進行本地儲存【為什麼是session】,後續的請求都需要將此token傳送給伺服器,伺服器會驗證token以保證使用者身份。(main.js中配置axios->請求頭中新增token)

實現過程
1.建立components資料夾並新建Login.vue元件
新增template,script,style標籤;//style標籤中【scope原理?】

<template>
    <div class="login_container">
  			   
    </div>
</template>

<script>
export default {
}
</script>
//scoped可以防止元件之間的樣式衝突,沒有scoped則樣式是全域性的
<style lang="less" scoped>
.login_container {
  background-color: #2b5b6b;
  height: 100%;
}
</style>

2.在router.js中匯入元件並設定規則
redirect:重定位

const router = new Router({
  routes: [
    { path: '/', redirect: '/login' },
    { path: '/login', component: Login }
  ]
})

A.頁面結構
1.div根元素login_container高度100%佈滿頁面
el-form 元件使用說明:
- ref="LoginFormRef"表示表單的引用(例項) 在傳送請求時有用
- el-form-item 的 prop 屬性設定為需校驗的欄位名
prop的值指向的是校驗規則
- :model="ruleForm"用於聯絡表單項
1.3.使用字型圖示:
- 1.fonts資料夾複製到assets
- 2.開啟demo_symbol演示文件
- 3.main.js中匯入字型圖表 import ‘./assets/fonts/iconfont.css’
- 4.參考元件庫帶 icon 的輸入框屬性方式prefix-icon=“el-icon-search”
- 5.使用第三方圖示的類名user(#icon-user)替換prefix-icon=“iconfont icon-user”
登入頁面

/*******/
 <div class="login_container"
      <div class="avatar_box">    <!-- 頭像部分 -->
      		<img
      <el-form          <!-- 登入表單區域 -->
           <el-form-item
                 <el-input
		    <el-form-item
                 <el-input
            <el-form-item
            	<el-button 
            	<el-button 
/*******/
<template>
  <div class="login_container">
    <div class="login_box">
      <!-- 頭像部分 -->
      <div class="avatar_box">
        <img src="../assets/logo.png" alt="" />
      </div>
      <!-- 登入表單區域 -->
      <el-form
        :model="loginForm"
        :rules="loginFormRules"
        ref="loginFormRef"
        label-width="0px"
        class="login_form"
      >
        <el-form-item prop="username">
          <el-input
            prefix-icon="iconfont icon-user"
            v-model="loginForm.username"
          ></el-input>
        </el-form-item>
        <el-form-item prop="password">
          <el-input
            type="password"
            prefix-icon="iconfont icon-3702mima"
            v-model="loginForm.password"
          ></el-input>
        </el-form-item>
        <el-form-item class="btns">
          <el-button type="primary" @click="login">登入</el-button>
          <el-button @click="resetLoginForm" type="info">重置</el-button>
        </el-form-item>
      </el-form>
    </div>
  </div>
</template>

<script>
export default {
data() {
    return {
      // 這是登入表單的資料繫結物件
      loginForm: {
        username: 'admin',
        password: '123456'
      },
      // 這是表單的驗證規則物件
      loginFormRules: {
        // 驗證使用者名稱是否合法
        username: [
          { required: true, message: '請輸入登入名稱', trigger: 'blur' },
          { min: 3, max: 10, message: '長度在 3 到 10 個字元', trigger: 'blur' }
        ],
        // 驗證密碼是否合法
        password: [
          { required: true, message: '請輸入登入密碼', trigger: 'blur' },
          { min: 6, max: 15, message: '長度在 6 到 15 個字元', trigger: 'blur' }
        ]
      }
    }
  },
  ......

B.功能邏輯:
1.登入、重置:
結構:<el-button type=“primary” @click=“login”>登入
<el-button @click=“resetLoginForm” type=“info”>重置
methods:
使用元件中自帶的方法:
在登入的回撥函式中傳送請求:【為什麼是sessionStorage 而不是localStorage 】
// 1. 將登入成功之後的 token,儲存到客戶端的 sessionStorage 中
// 1.1 專案中出了登入之外的其他API介面,必須在登入之後才能訪問
// 1.2 token 只應在當前網站開啟期間生效,所以將 token 儲存在 sessionStorage 中
window.sessionStorage.setItem(‘token’, res.data.token)
2.路由跳轉this.$router.push(’/home’)【路由導航】

    login() {
      this.$refs.loginFormRef.validate(async valid => {
        // console.log(this)
        // console.log(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('登入成功')
        window.sessionStorage.setItem('token', res.data.token)
        this.$router.push('/home')
      })
    },
    resetLoginForm() {
      // console.log('reset')
      this.$refs.loginFormRef.resetFields()
    }

C.樣式
0.定義全域性樣式,在mian.js中引入
import ‘./assets/css/global.css’

html,
body,
#app {
  height: 100%;
  margin: 0;
  padding: 0;
  min-width: 1366px;
}
......

1.登入頁面樣式
- 1.1.圖示居中偏上,img設定border-radius: 50%;
- 1.2.表單元件設定為box-sizing: border-box;按鈕設定flex佈局實現向右對齊justify-content: flex-end;
- 1.3 login_box居中設定項:
設定寬高;絕對定位,偏移百分比;移動transform: translate(-50%, -50%);
- 1.4 頭像avatar_box 相對login_box的上方居中設定:

<style lang="less" scoped>
.login_container {
  background-color: #2b5b6b;
  height: 100%;
}
.login_box {
  width: 450px;
  height: 300px;
  background-color: #fff;
  border-radius: 3px;
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);

  .avatar_box {
    height: 130px;
    width: 130px;
    border: 1px solid #eee;
    border-radius: 50%;
    box-shadow: 0 0 10px #ddd;
    padding: 10px;
    position: absolute;
    left: 50%;
    transform: translate(-50%, -50%);
    background-color: #fff;
    img {
      width: 100%;
      height: 100%;
      border-radius: 50%;
      background-color: #eee;
    }
  }
  .login_form {
    position: absolute;
    bottom: 0;
    width: 100%;
    padding: 0 20px;
    box-sizing: border-box;
    .btns {
      display: flex;
      justify-content: flex-end;
    }
  }
}
</style>

相關文章