博客前端项目学习day02

登录请求的实现

  1. 安装axios
    在这里插入图片描述

  2. 封装Request
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    完整代码:

import axios from 'axios'
import { ElLoading } from 'element-plus';
import message from '@/utils/Message';
import router from '@/router'
const contentTypeForm = "application/x-www-form-urlencoded;chaset-UTF-8";
const contentTypeJson = "application/json";
const contentTypeFile = "application/form-data";
const request = (config) => {
    const {url,params} = config;
    let dataType = config.dataType;
    let showLoading = config.showLoading;
     dataType = dataType?"form":dataType;
     showLoading = showLoading ? true:showLoading;
     let contentType = contentTypeForm;
     if(dataType === "json"){
         contentType = contentTypeJson
     }else if(dataType === "file"){
        contentType = contentTypeFile

        let param = new FormData();
        for(let key in params){
            param.append(key,params[key]);
        }
        params = param;
     }

     const instantce = axios.create({
         baseURL:"/api",
         timeout:10*1000,
         headers:{
             'Content-Type':contentType,
             'X-Requested-With':'XMLHttpRequest',
         }
     })
     let loading = null;
     instantce.interceptors.request.use(
         (config)=>{
             if(showLoading){
                loading = ElLoading.service({
                    lock:true,
                    text:'加载中......',
                    background:'rgba(0,0,0,0.7)',
                })
             }
             return config;
         },
         (error)=>{
             if(showLoading&&loading){
                 loading.close();
             }
             message.error(error);
             return Promise.reject("发送请求失败");
         }
     )
     //请求后拦截
     instantce.interceptors.response.use(
         (response)=>{
            if(showLoading&&loading){
                loading.close();
            }
            const responseData = response.data;
            // debugger;
            if(responseData.status == "error"){
                if(config.errorCallback){
                    config.errorCallback();
                }
                return Promise.reject(responseData.info);
            }else{
                if(responseData.code==200){
                    return responseData;
                }else if(responseData.code==902){
                   setTimeout(()=>{
                       router.push("/login")
                   },2000)
                    return Promise.reject("登陆超时");
                }
                
            }
         },
         (error)=>{
            if(showLoading&&loading){
                loading.close();
            }
            return Promise.reject("网络异常");
         }
     )
     return instantce.post(url,params).catch(error=>{
        message.error(error);
        return null;
     })
}
export default request;

前端登录函数
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
封装的Message

import { ElMessage } from 'element-plus';
const message = {
      error:(msg)=>{
        ElMessage({
            message:msg,
            type:'error',
            duration:2000
        }) 
      },
      success:(msg)=>{
        ElMessage({
            message:msg,
            type:'success',
            duration:2000
        }) 
      },
      warning:(msg)=>{
        ElMessage({
            message:msg,
            type:'warning',
            duration:2000
        }) 
      },

}
export default message;

登陆代码

<template>
  <div class="login-body">
    <div class="login-panel">
      <div class="login-title">用户登录</div>
      <el-form :model="formData" :rules="rules" ref="formDataRef">
        <el-form-item prop="account">
          <el-input
            placeholder="请输入账号"
            v-model="formData.account"
            size="large"
          >
            <template #prefix>
              <span class="iconfont icon-account"></span>
            </template>
          </el-input>
        </el-form-item>
        <el-form-item prop="password">
          <el-input
            placeholder="请输入密码"
            v-model="formData.password"
            size="large"
            type="password"
          >
            <template #prefix>
              <span class="iconfont icon-password"></span>
            </template>
          </el-input>
        </el-form-item>

        <el-form-item prop="checkCode">
          <div class="check-code-panel">
            <el-input
              placeholder="请输入验证码"
              v-model="formData.checkCode"
              class="input-panel"
              size="large"
              @keyup.enter.native="login"
            />
            <img
              :src="checkCodeUrl"
              class="check-code"
              @click="changeCheckCode"
            />
          </div>
        </el-form-item>

        <el-form-item label="">
          <el-checkbox v-model="formData.rememberMe" :label="true"
            >记住我
          </el-checkbox>
        </el-form-item>
        <el-form-item label="">
          <el-button type="primary" :style="{ width: '100%' }" @click="login">
            登录
          </el-button>
        </el-form-item>
      </el-form>
    </div>
  </div>
</template>

<script setup>
import VueCookies from "vue-cookies";
import md5 from "js-md5";
import { getCurrentInstance, reactive, ref } from "vue";
import { useRouter } from "vue-router";

const router = useRouter();
const { proxy } = getCurrentInstance();
const api = {
  checkCode: "api/checkCode",
  login: "/login",
};
const checkCodeUrl = ref(api.checkCode);
const changeCheckCode = () => {
  checkCodeUrl.value = api.checkCode + "?" + new Date().getTime();
};

//表单相关
const formDataRef = ref();
const formData = reactive({});

const rules = {
  account: [
    {
      required: true,
      message: "请输入用户名",
    },
  ],
  password: [
    {
      required: true,
      message: "请输入密码",
    },
  ],
  checkCode: [
    {
      required: true,
      message: "请输入验证码",
    },
  ],
};
const init = () => {
  const loginInfo = VueCookies.get("loginInfo");
  if (!loginInfo) {
    return;
  }
  Object.assign(formData, loginInfo);
};
init();
const login = () => {
  formDataRef.value.validate(async (valid) => {
    if (!valid) {
      return;
    }
    let cookieloginInfo = VueCookies.get("loginInfo");
    let cookiesPassword =
      cookieloginInfo == null ? null : cookieloginInfo.password;
    if (formData.password !== cookiesPassword) {
      formData.password = md5(formData.password);
    }
    let params = {
      account: formData.account,
      password: formData.password,
      checkCode: formData.checkCode,
    };

    let result = await proxy.Request({
      url: api.login,
      params: params,
      errorCallback: () => {
        changeCheckCode();
      },
    });
    if (!result) {
      return;
    }
    proxy.Message.success("登陆成功");
    setTimeout(() => {
      router.push("/");
    }, 1500);
    const loginInfo = {
      account: params.account,
      password: params.password,
      rememberMe: formData.rememberMe,
    };
    VueCookies.set("userInfo", result.data, 0);
    if (formData.rememberMe == 1) {
      VueCookies.set("loginInfo", loginInfo, "7d");
    }
  });
};
</script>

<style lang="scss">
.login-body {
  width: "100%";
  height: calc(100vh);
  background-image: url(../assets/login-bg.jpg);
  background-size: cover;
  background-position: center;
  .login-panel {
    float: right;
    margin-right: 100px;
    margin-top: 100px;
    padding: 20px; //内容不顶着边
    width: 350px;
    border-radius: 5px; //圆角
    box-shadow: 2px 2px 10px #ddd; //阴影
    background: rgba(255, 255, 255, 0.7);
    .login-title {
      font-size: 20px;
      text-align: center;
      margin-bottom: 10px;
    }
    .check-code-panel {
      width: 100%;
      display: flex;
      align-items: center;
      .input-panel {
        flex: 1;
        // margin-right: 5px;
      }
      .check-code {
        // height: 30px;
        margin-right: auto;
        margin-left: 5px;
        cursor: pointer;
      }
    }
  }
}
</style>

相关推荐

  1. 个人项目_09

    2024-07-20 23:24:01       29 阅读
  2. 个人项目笔记_02

    2024-07-20 23:24:01       30 阅读
  3. 个人项目笔记_04

    2024-07-20 23:24:01       25 阅读
  4. 个人项目笔记_08

    2024-07-20 23:24:01       29 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-20 23:24:01       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-20 23:24:01       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-20 23:24:01       45 阅读
  4. Python语言-面向对象

    2024-07-20 23:24:01       55 阅读

热门阅读

  1. Qt项目:基于Qt实现的网络聊天室---好友申请

    2024-07-20 23:24:01       15 阅读
  2. 微软全球大蓝屏:必须手工修复

    2024-07-20 23:24:01       20 阅读
  3. 25、气象填色图绘制

    2024-07-20 23:24:01       13 阅读
  4. 【Flutter】 webview_flutter避坑

    2024-07-20 23:24:01       17 阅读
  5. C++的模板(十二):forward模板

    2024-07-20 23:24:01       16 阅读
  6. Kotlin协程最佳实践

    2024-07-20 23:24:01       11 阅读
  7. SQL Server的魔法工坊:打造数据库的自定义函数

    2024-07-20 23:24:01       20 阅读
  8. Qt判定鼠标是否在该多边形的线条上

    2024-07-20 23:24:01       15 阅读
  9. 什么是虹膜识别技术

    2024-07-20 23:24:01       14 阅读
  10. C++/Qt 信号与槽

    2024-07-20 23:24:01       18 阅读
  11. CentOS Mysql8 数据库安装

    2024-07-20 23:24:01       16 阅读