nodejs+vue+element+eachers构建开源项目大型连续剧(5)前端请求封装,完成用户注册。

news2024/11/25 5:42:34

        在前端项目开发中,一个好的请求封装可以给我们带来诸多便利,减少了代码重复,优化了问题处理等。那接下来我们一起学习一下怎么做到对一个请求的简单封装吧。主要通过对axios请求的二次封装,实现页面的请求以及必要的优化。

一、引入axios

        学习第一步,安装加引入。(押韵,哈哈哈)

        安装axios

npm install axios

        新建utils文件夹下request.js文件用于请求的封装,初始化的封装,后面我们一步步来。

import axios from axios
const service=axios.create({
    baseURL: '',//请求地址
    timeout: 1000,//请求超时时间,如果超给改时间会中断
    // headers: {'X-Custom-Header': 'foobar'}//自定义请求头
})
//添加请求拦截器
service.interceptors.request.use( (config)=> {
    // 在发送请求之前做些什么
    return config;
  },  (error)=> {
    // 对请求错误做些什么
    return Promise.reject(error);
  });

  //添加响应拦截器
  service.interceptors.response.use( (response)=> {
    // 对响应数据做点什么
    return response;
  },  (error)=> {
    // 对响应错误做点什么
    return Promise.reject(error);
  });

  export default service

        大家会发现url是空的,在开发中这个url一般都是动态的,更加环境去切换的这个地方需要插播一个小知识关于.env文件的使用。

二、关于.env文件的使用

        1.模式

                在vue-cli中模式是一个重要的概念,默认情况下有三个模式。

                对于下面所说的命令,大家可以看一下项目中的package.json文件,一看就明白了

  1. development 模式用于 vue-cli-service serve
  2. production 模式用于 vue-cli-service build 和 vue-cli-service test:unit
  3. test 模式用于 vue-cli-service test:unit

development模式对应我们开发环境对应的命令是 serve命令,也就是说我们启动项目后就在development模式下运行

production模式对应打包命令build。打包后在production模式下运行

你可以通过传递 --mode 选项参数为命令行覆写默认的模式。例如,如果你想要在构建命令中使用开发环境变量:

vue-cli-service build --mode development

                总结,可以通过命令动态配置,配置对于模式下对应那些配置。

                我们一般通过.env文件进行请求地址的配置,例如存在多个地址的情况,可以通过命令进行灵活配置。

        2.process.env环境对象

                process.env 是 Node.js 中的一个环境对象。其中保存着系统的环境的变量信息。可使用 Node.js 命令行工具直接进行查看(如下图所示)。

                在不同的模式会有不同的环境变量

在 development 模式下 NODE_ENV 的值会被设置为 “development”
在 production模式下 NODE_ENV 的值会被设置为 “production” 

        3..env文件的执行顺序

.env 无论开发环境还是生产环境都会加载的配置文件
.env.development 开发环境加载的配置文件
.env.production 生产环境加载的配置文件

研发环境 加载顺序:.env .env.development 同一个变量名 后者会覆盖前者
生产环境 加载顺序:.env .env.production 同一个变量名 后者会覆盖前者

三、配置开发环境下的请求地址

        因为我们现在是在开发模式,所以在.env.development文件中配置我们需要请求的地址(如下)。

        对应的ip需要填写服务器ip和对应端口号

# just a flag
NODE_ENV = 'development'

# base api
 VUE_APP_BASE_API = 'http://10.0.0.165:9588'

        然后我们上面的请求url就可以拿到对应的值了

const service=axios.create({
    baseURL: process.env.VUE_APP_BASE_API,//请求地址
    timeout: 10000,//请求超时时间,如果超给改时间会中断
    // headers: {'X-Custom-Header': 'foobar'}//自定义请求头
})

        然后我们建立api文件夹进行接口的模块化区分,不同模块对应不同的模块js。

         进行一个get请求进行封装是否成功的测试

import request from "@/utils/request";

export function list(){
    return request({
        url: `/api/list`,
		method: "get"
    })
}

         这是第一集用于测试服务器开发get请求的接口,当时我们测试是成功的。因为测试,所以我们怎么简单怎么来,主要是测试是否成功。

        在app.vue页面,进行一个简单的请求

<template>
  <div id="app">
    <router-view/>
  </div>
</template>

<script>
import {list} from '@/api/list'
export default {
  created(){
    list().then(res=>{
      console.log(res);
    })
  }
}
</script>
<style lang="less">

@import "@/assets/style/reset.css";
</style>
       

        然后重点来了!!!哈哈哈哈,报错了,告诉我跨域了,然后就大结局了,再见了各位。

           

        然而并没有结束,让我们一起解决跨域吧,

        前端:后台,跨域了,你解决下

        后端:自己解决,前端配置代理不会么?

        前端:离职,不干了

        现在,我们是后端了,作为一个前端喜欢的后端,我只能说,我来搞,交给我!!!(虽然前后端都是我,呜呜呜)

四、后端通过cors解决跨域

        其实对于后端来说,解决跨域很简单,只需要使用CORS就可以了,一共需要两步

        第一步:安装cors

yarn add cors

npm install cors

npm和yarn都可以哈,yarn安装快一点,各凭喜好

        第二步:使用cors()解决跨域

        以下是nodejs服务器端的代码,app.js文件中引入并使用

//引入

const cors = require('cors')

//使用

app.use(cors())

        然后再继续请求试一下,发现跨域就这样解决了。

 五、关于跨域的相关知识

    cors又称跨域资源共享,由一系类HTTP响应头组成,这些HTTP响应头决定浏览器是否组织前端JS代码跨域获取资源,实际情况是,前端同意请求,服务器同意响应,浏览器不同意这门亲事

    浏览器的同源安全策略(端口、域名、协议有一个不同就不能通信)默认会阻止网页“跨域”获取资源,但如果接口服务器配置了CORS相关的响应头就可以解除浏览器端的跨域访问限制。就好像服务器拿着彩礼来了,浏览器就同意的这门亲事。

     CORS主要在服务器端配置,客户端无需做任何处理。cors有兼容性(2022年可忽略不不计,主要是低版本服务器的兼容性)。

      

六、前端页面开发

页面展示:

 

代码:

页面:

<template>
  <div class="login">
    <div id="login_box">
      <el-form
        :model="ruleForm"
        :rules="rules"
        ref="ruleForm"
        label-width="100px"
        class="demo-ruleForm"
      >
        <el-form-item label="用户名" prop="username">
          <el-input v-model="ruleForm.username"></el-input>
        </el-form-item>
        <el-form-item label="密码" prop="password">
          <el-input
            v-model="ruleForm.password"
            type="password"
            show-password
          ></el-input>
        </el-form-item>
        <el-form-item label="确认密码" prop="verification" v-if="!loginstate">
          <el-input
            v-model="ruleForm.verification"
            type="password"
            show-password
          ></el-input>
        </el-form-item>
        <el-form-item>
          <el-button type="primary" v-if="loginstate" @click="login"
            >登录</el-button
          >
          <el-button type="primary" v-else @click="login">注册</el-button>
          <el-button @click="loginstate = !loginstate">切换{{ loginstate?'注册':'登录' }}</el-button>
        </el-form-item>
      </el-form>
    </div>
  </div>
</template>

<script>
import { reguser } from "@/api/login";
export default {
  data() {
    var validatePass = (rule, value, callback) => {
      if (value === "") {
        callback(new Error("请输入密码"));
      } else {
        if (this.ruleForm.verification !== "") {
          this.$refs.ruleForm.validateField("verification");
        }
        callback();
      }
    };
    var validatePass2 = (rule, value, callback) => {
      if (value === "") {
        callback(new Error("请再次输入密码"));
      } else if (value !== this.ruleForm.password) {
        callback(new Error("两次输入密码不一致!"));
      } else {
        callback();
      }
    };
    return {
      //当前的状态,true为登录
      loginstate: true,
      ruleForm: {
        username: "",
        password: "",
        verification: "",
      },
      rules: {
        username: [
          { required: true, message: "请输入用户名", trigger: "blur" },
        ],
        password: [
          { required: true, validator: validatePass, trigger: "blur" },
        ],
        verification: [
          { required: true, validator: validatePass2, trigger: "blur" },
        ],
      },
    };
  },
  methods: {
    login() {
      //用来判断是登录还是注册
      const { loginstate } = this;
      const { username, password } = this.ruleForm;
      this.$refs.ruleForm.validate((valid) => {
        if (valid) {
          //验证成功
          if (loginstate) {
            //登录
          } else {
            //注册
            const data = {
              username,
              password,
            };
            reguser(data).then((res) => {
              const {code,data}=res.data
              if(code===200){
                this.loginstate=true
                this.$message.success('用户注册成功,请登录。');
              }else{
                this.$message.error(data);
              }
            });
          }
        }
      });
    },
  },
};
</script>

<style lang="less" scoped>
.login {
  background: url("https://cdn.pixabay.com/photo/2018/08/14/13/23/ocean-3605547_1280.jpg")
    no-repeat;
  background-size: 100% 100%;
  width: 100vw;
  height: 100vh;
  overflow: hidden;
}

#login_box {
  width: 20vw;
  background-color: #00000060;
  margin: auto;
  margin-top: 15%;
  text-align: center;
  border-radius: 10px;
  padding: 50px 50px;
}
</style>

 

后面发现请求后后台获取不到我们传递的body参数,因为axios默认传递的post参数格式是application/json,所以我们需要进行一定的配置,

通过body-parser解决上述问题,代码:(记得先安装)

//导入express
const express = require('express')
//引入cors解决跨域问题
const cors = require('cors')
//用于解决fromdata格式数据获取不到的问题
const bodyParser = require('body-parser');
//创建web服务器
const app = express()
//解决跨域
app.use(cors())
//数据JSON类型
app.use(bodyParser.json());
//解析post请求数据
app.use(bodyParser.urlencoded({ extended: false }));
//将文件部署到服务器
app.use(express.static('img'))
//配置解析表单数据(application/x-www-form-urlencoded)格式的中间件
app.use(express.urlencoded({ extended: false }))
const userRouter = require("./router/user")
app.use('/api', userRouter)
// 通过ap.listen进行服务器的配置,并启动服务器,接收两个配置参数,一个是对应的端口号,一个是启动成功的回调函数
app.listen(9588, () => {
    console.log('服务器启动成功');
})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/154283.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Word处理控件Aspose.Words功能演示:在 C# 中将 Word DOC DOCX 转换为 Markdown

Aspose.Words 是一种高级Word文档处理API&#xff0c;用于执行各种文档管理和操作任务。API支持生成&#xff0c;修改&#xff0c;转换&#xff0c;呈现和打印文档&#xff0c;而无需在跨平台应用程序中直接使用Microsoft Word。此外&#xff0c; Aspose API支持流行文件格式处…

每个Java程序员都必须知道的四种负载均衡算法

前言 一般来说&#xff0c;我们在设计系统的时候&#xff0c;为了系统的高扩展性&#xff0c;会尽可能的创建无状态的系统&#xff0c;这样我们就可以采用集群的方式部署&#xff0c;最终很方便的根据需要动态增减服务器数量。但是&#xff0c;要使系统具有更好的可扩展性&…

【UE4 第一人称射击游戏】32-添加击杀AI的提示功能(使用到控件蓝图的动画功能)

上一篇&#xff1a;【UE4 第一人称射击游戏】31-更好的UI界面本篇效果&#xff1a;可以看到在击杀AI后&#xff0c;右上角有击杀提示信息步骤&#xff1a;新建一个控件蓝图命名为“KillPopup”双击打开“KillPopup”&#xff0c;拖入一个图像控件&#xff0c;锚点设置为右上角&…

RobotFramework测试库

在RF 测试库里面&#xff0c;分为三种测试库标准测试库扩展测试库远程测试库标准测试库随 Robot Framework 版本一同发布的测试库&#xff0c; 不需要单独安装&#xff0c;但部分标准库仍然需要手动导入标准库有扩展测试库标准库以外的其他测试库都统称为扩展测试库&#xff0c…

OceanBase产品家族及基础概念

第二章&#xff1a;OceanBase产品家族及基础概念 1. OceanBase产品家族 1.1 OceanBase数据库产品家族 1.2 OceanBase数据库内核 1.2.1 高扩展 • 水平扩展 • 按需在线扩容、缩容、不停服务 • 单集群突破100台服务器 1.2.2 高性能 • 峰值6,100万次/秒&#xff08;真实业…

P12 PyTorch 常见函数梯度

目录&#xff1a;1&#xff1a; 常见函数的导数2: 梯度与微分的关系3: 常见函数的梯度4&#xff1a; 梯度更新常见问题一 常见函数的导数&#xff08;复合函数求导证明&#xff09;二 梯度与微分的关系2.1 微分&#xff1a; x 为一元变量时微分&#xff1a; x 为向量时微分矩阵…

学术加油站|机器学习应用在数据库调优领域的前沿工作解读

编者按 本文系北京理工大学科研助理牛颂登所著&#xff0c;本篇也是「 OceanBase 学术加油站」系列稿件第八篇。 「牛颂登&#xff1a;北京理工大学科研助理。 硕士期间在电子科技大学网络空间安全研究院从事聚类和强化学习相关算法研究&#xff0c;在应用聚类研究个性化在线学…

Python之Hermite多项式

文章目录Hermite多项式求导和积分求根和反演拟合其他Hermite多项式 Hermite多项式是一种非常重要的正交多项式&#xff0c;尤其在量子力学中&#xff0c;是谐振子的本征态&#xff0c;在物理学中&#xff0c;其定义为 Hn(x)(−1)nex2dndxne−x2H_n(x)(-1)^ne^{x^2}\frac{\text…

算法之动态规划实战

目录 前言&#xff1a; 如何量化两个字符串的相似度&#xff1f; 如何编程计算莱文斯坦距离&#xff1f; 如何编程计算最长公共子串长度&#xff1f; 参考资料 前言&#xff1a; 利用 Trie 树&#xff0c;可以实现搜索引擎的关键词提示功能&#xff0c;这样可以节省用户输…

【Python+pandas】学生测试成绩求和排序

✨博文作者 wangzirui32 &#x1f496; 喜欢的可以 点赞 收藏 关注哦~~ &#x1f449;本文首发于CSDN&#xff0c;未经许可禁止转载 &#x1f60e;Hello&#xff0c;大家好&#xff0c;我是wangzirui32&#xff0c;最近时间不够充足&#xff0c;鸽了几个月&#xff0c;这是2023…

【蓝桥杯第十三届C++B组】真题训练(5 / 8) - java写法

目录 4402.刷题统计 - 数学模拟 4403. 修剪灌木 - 思维 4404. X 进制减法 - 进制运算 贪心 4405. 统计子矩阵 - 前缀和 双指针​​​​​​​ 1、一维前缀和 2、二维前缀和 4406. 积木画 - dp 1、找规律dp 4402.刷题统计 - 数学模拟 4402. 刷题统计 - AcWing题库 思…

素数(prime)总结

素数的介绍 素数定义 质数(prime number)又称素数&#xff0c;有无限个。一个大于1的自然数&#xff0c;除了1和它本身外&#xff0c;不能被其他自然数整除&#xff0c;换句话说就是该数除了1和它本身以外不再有其他的因数;否则称为合数。 根据算术基本定理&#xff0c;每一个…

linux 文件夹多用户共享 解决文件删除的Permission denied

linux文件属性基础 Linux文件属主和属组 通过命令ls 可以查看文件属性&#xff1a; zcargo-MS-7D53:~/Desktop/parent_ceshi$ ll -lh total 16K drwxrwxr-x 2 zc zc 4.0K 1月 10 13:59 ceshi/ drwxrwxr-x 2 zc zc 4.0K 1月 10 13:59 ceshi02/以上展示命令的意思&#xff1…

大数据概念及Hadoop介绍

大数据概念及Hadoop介绍大数据概念数据存储单位大数据定义大数据的特点(5V特征)大数据部门组织架构分布式技术负载均衡故障转移伸缩性分布式技术总结分布式和集群的区别Hadoop介绍Hadoop核心组件Hadoop发展简史Hadoop特性优点与行业应用Hadoop特性优点行业应用Hadoop发行版本及…

14、Java网络编程

一、 网络编程概述Java是 Internet 上的语言&#xff0c;它从语言级上提供了对网络应用程序的支持&#xff0c;程序员能够很容易开发常见的网络应用程序。Java提供的网络类库&#xff0c;可以实现无痛的网络连接&#xff0c;联网的底层细节被隐藏在 Java 的本机安装系统里&…

【广度优先搜索遍历 + 染色法】判断二分图

还记得当时才大一&#xff0c;上离散数学课&#xff0c;当时觉得很不屑&#xff0c;就是觉得这学的什么玩弄啥用没有&#xff0c;但是其实很多的算法思想在解决题目时很有价值。 本文就将使用染色法解决判断二分图问题&#xff0c;使用广度优先搜索遍历和 Java 语言实现 一、题…

车辆逆行识别检测系统 opencv

车辆逆行识别检测系统通过opencvyolo网络深度学习技术&#xff0c;对现场画面中车辆逆向行驶行为进行检测抓拍预警。 OpenCV的全称是Open Source Computer Vision Library&#xff0c;是一个跨平台的计算机视觉处理开源软件库&#xff0c;支持与计算机视觉和机器学习相关的众多…

嵌入式 LINUX 驱动开发 day02 字符设备驱动 字符设备驱动 虚拟串口, 一个驱动支持多个设备

1. 驱动开发 字符设备驱动 代码&#xff1a; vser.c #include <linux/init.h> #include <linux/kernel.h> #include <linux/module.h>#include <linux/fs.h> /***** 设备相关信息 ******/ static unsigned int VSER_MAJOR 256; //主设备号…

青铜到王者,9本最好的Python从入门到进阶的书

春节长假还有2周了&#xff0c;是时候囤一些书充充电了&#xff01;新的一年群里很多小伙伴开始想学Python&#xff0c; 无论是准备转行的&#xff0c;还是想多学一份技能提高职场竞争力的&#xff0c;都想选择Python赛道&#xff0c;下面给大家推荐一些非常不错的Python入门到…

【Flask框架】—— 30 Flask-RESTful

前后端分离和前后端不分离 前后端不分离 在前后端不分离的应用模式中&#xff0c;前端页面看到的效果都是由后端控制&#xff0c;由后端渲染页面或重定向&#xff0c;也就是后端需要控制前端的展示&#xff0c;前端与后端的耦合度很高。 这种应用模式比较适合纯网页应用&…