计算机系统应用教程网站

网站首页 > 技术文章 正文

Vue3项目实践-第五篇(改造登录页-Axios模拟请求数据)

btikc 2024-09-20 15:00:34 技术文章 20 ℃ 0 评论

本文将介绍以下内容:

  • 项目中的 public 目录和访问静态资源文件的方法
  • 使用 json 文件代替http模拟请求
  • 使用 Axios 直接访问 json 文件
  • 改造登录页,配合 Axios 进行登录请求,并添加错误提示

项目中的 public 目录和访问静态资源文件的方法

项目中,public 目录用于存放静态资源文件,这些文件将直接复制到构建输出目录而不经过编译处理。public 目录下的文件可以通过相对路径直接访问。

以下是关于 public 目录的一些说明和示例:

  • 创建 public 目录:在你的项目根目录下创建一个名为 public 的目录(如果还不存在)。
  • 静态资源文件:将需要在项目中访问的静态资源文件放置在 public 目录中。这些文件可以是图片、字体、视频、音频、JSON 文件等。
  • 访问静态资源文件:在你的代码中,可以通过相对路径直接访问 public 目录下的文件。例如,如果你有一个 public/images/logo.png 图片文件,你可以在 Vue 组件中这样使用
<template>
  <div>
    <img src="/images/logo.png" alt="Logo" />
  </div>
</template>

上面的代码中,我们使用了相对路径 /images/logo.png 来引用 public 目录下的图片文件。

请注意,在使用相对路径时不需要包含 public 目录名。Vite 会自动将相对路径解析为 public 目录下对应的文件。

通过将静态资源文件放置在 public 目录中,它们将被直接复制到构建输出目录中,而无需经过编译处理。这使得访问这些文件变得非常简单和高效。

使用 json 文件代替http模拟请求

使用 JSON 文件来模拟 HTTP 请求,可以将 JSON 文件放在项目的 public 目录中,并通过 http 方法直接在浏览器中访问。

以下是一个示例:

  • 在项目的 public/data 目录中创建一个 JSON 文件,例如 page.json,并将需要的数据保存在其中。
  • 在浏览器中,直接使用http地址展示 JSON 文件并使用其中的数据。

使用 Axios 直接访问 json 文件

继续上述内容,直接通过Axios 访问 json 文件,使用 Axios 直接访问 JSON 文件时,我们可可以按照以下步骤进行操作:

  • 确保已安装 Axios,可以使用以下命令进行安装:
npm install axios
  • 在 Vue 组件中,导入 Axios 并使用它来发送 GET 请求来获取 JSON 文件的数据。
<template>
    <h1>Home Page</h1>
    <p>
        {{ pageData }}
    </p>
</template>
<script lang="ts" setup>

import { ref } from 'vue';
import axios from 'axios';

const pageData = ref({});

const load = async () => {
    console.log('执行请求');

    try {
        const {data} = await axios.get('./data/page.json');

        console.log(data);

        pageData.value = data;
      } catch (error) {
        console.error(error);
      }
}

load();

</script>

在上述示例中,首先通过 import axios from 'axios' 导入 Axios 库。然后,在组件的 pageData 中,在 load 方法中,我们使用 axios.get 发送一个 GET 请求来获取指定路径的 JSON 文件数据,并将响应的数据类型解构为 data。一旦获取到数据,我们将其赋值给 pageData.value 。

请确保将 /data/page.json 能在浏览器中被访问。

通过这种方式,项目中使用 Axios 直接访问 JSON 文件,并且能够获得类型检查的好处。记得在实际应用中,确保你的 JSON 文件的路径和文件名是正确的,并且可在服务器上正常访问。

改造登录页,配合 Axios 进行登录请求,并添加错误提示

改造登录页,结合 Axios 进行登录请求,并添加错误提示,先在public/data 文件夹下新建个login.json文件,方便校验登录输入信息的校对。

[
    {
        "userName": "admin",
        "userPass": "12345"
    },
    {
        "userName": "test",
        "userPass": "123456"
    }
]
  • 导入依赖组件(router、axios、element-plus):
import { useRouter } from 'vue-router';
import axios from 'axios';
import { ElMessage } from 'element-plus'

router:校验成功后,跳转地址

axios:模拟请求http(访问json文件)

ElMessage:提示信息

  • 修改登录逻辑
const submitForm = async () => {
    formRef.value.validate((valid: any) => {
        if (valid) {
            // 表单校验通过,可以进行提交操作
            console.log('表单校验通过');
            console.log(formData.value); // 获取表单数据
        } else {
            // 表单校验失败,可以进行错误处理
            console.log('表单校验失败');
            return false;
        }
    });

    await checkLoginValue();
};

const checkLoginValue = async () => {
    try {
        const { data } = await axios.get('./data/login.json');

        let success = false;

        for (const temp of data) {
            if (temp.userName === formData.value.username
                && temp.userPass === formData.value.password) {
                success = true;
                break;
            }
        }

        if (success) {
            router.push('/');
        } else {
            ElMessage({
                message: '用户名或密码错误,请检查后,重新登录!',
                type: 'warning',
            });
        }

    } catch (error) {
        console.error(error);
    }
}

完整示例:

<template>
    <div class="login-container">
        <el-form ref="formRef" :model="formData" :rules="formRules" class="login-form">
            <h2 class="login-title">登录</h2>
            <el-form-item prop="username">
                <el-input v-model="formData.username" placeholder="请输入用户名"></el-input>
            </el-form-item>
            <el-form-item prop="password">
                <el-input v-model="formData.password" type="password" placeholder="请输入密码"></el-input>
            </el-form-item>
            <el-form-item>
                <el-button type="primary" @click="submitForm">登录</el-button>
                <el-button type="primary" @click="resetForm">重置</el-button>
            </el-form-item>
        </el-form>
    </div>
</template>
<script lang="ts" setup>

import { useRouter } from 'vue-router';
import { ref } from 'vue';
import axios from 'axios';
import { ElMessage } from 'element-plus'

const formData = ref({
    username: '',
    password: '',
});

const formRules = ref({
    username: [
        { required: true, message: '请输入用户名', trigger: 'blur' },
    ],
    password: [
        { required: true, message: '请输入密码', trigger: 'blur' },
    ],
});

const formRef = ref();

const resetForm = () => {
    if (!formRef) return
    formRef.value.resetFields()
}

const router = useRouter();
const submitForm = async () => {

    console.log("formRef.value:", formRef.value);

    formRef.value.validate((valid: any) => {
        if (valid) {
            // 表单校验通过,可以进行提交操作
            console.log('表单校验通过');
            console.log(formData.value); // 获取表单数据
        } else {
            // 表单校验失败,可以进行错误处理
            console.log('表单校验失败');
            return false;
        }
    });

    await checkLoginValue();

};

const checkLoginValue = async () => {
    try {
        const { data } = await axios.get('./data/login.json');

        let success = false;

        for (const temp of data) {
            if (temp.userName === formData.value.username
                && temp.userPass === formData.value.password) {
                success = true;
                break;
            }
        }

        if (success) {
            router.push('/');
        } else {
            ElMessage({
                message: '用户名或密码错误,请检查后,重新登录!',
                type: 'warning',
            });
        }

    } catch (error) {
        console.error(error);
    }
}
</script>
<style scoped>
.login-container {
    width: 100%;
    height: 100vh;
    display: flex;
    justify-content: center;
    align-items: center;
}

.login-form {
    max-width: 400px;
    width: 100%;
}

.login-title {
    text-align: center;
    font-size: 24px;
    margin-bottom: 20px;
}
</style>

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表