基于Vue+Less+axios封装+ElementUI搭建项目底层支撑实战

news2025/7/7 8:24:32

 

目录

一、本节介绍和上节回顾

1. 上节介绍

2. Vue + SpringBoot前后端分离项目实战目录

3. 本节介绍

二、项目前置所需应用安装

1. Less的安装

2. Less安装后的验证 

3. axios的安装

4. axios请求的封装与拆解 

5. axios请求封装后的验证 

6. ElementUI的安装、验证

三、本项目进展图例介绍

1. 内容架构

2. 代码目录

四、读完本小节需要思考的几个问题


一、本节介绍和上节回顾

1. 上节介绍

上一节,我们基于Vue技术栈 + Vue-cli脚手架,再结合webpack把项目搭建起来了,对初始化的一些业务目录做了简单的介绍,但官方搭建的目录很显然不足以支撑我们后期需求迭代的使用,所以我们基于渐进性的考虑对业务目录做了一定的调整。不太了解上下文的同学可以去专栏里查找。

2. Vue + SpringBoot前后端分离项目实战目录

一直到现在,项目需求已经敲定,我和天哥也在加紧项目的联调,其实大家可以发现,目前互联网中的文章,讲知识点的多,打包整体项目源码的多,但如果真正要将整个项目的实现过程以博文的形式输出,其实并非一件简单的事

而从前端这个角度出发,要让初学者既要学到实战项目经验,又要从业务模块出发去将第三方UI组件自己实现一遍,还要在项目的推进过程中不断反补开发知识点和考点,对狗哥来说,可能也是一个挑战。

但好在不断有粉丝小伙伴的鼓励,我想这就足够了。写不出郭敬明《夏至未至》那样的感伤,我写点项目经验的平凡还是没问题哒。目前专栏的进展给大家做一个汇报:

Vue + SpringBoot前后端分离项目实战 - 前端部分

1. 手把手带你做一套毕业设计-征程开启
2. 我应该把毕业设计做到什么程度才能过关?
3. 做毕业设计,前端部分你需要掌握的6个核心技能
4. 基于Vue+Vue-cli+webpack搭建渐进式高可维护性前端实战项目

SpringBoot+Vue前后端分离项目实战 - 服务端部分

1. 基于SpringBoot+SpringCloud+Vue前后端分离项目实战 --开篇
2. 天狗实战SpringBoot+Vue(一)环境安装
3. 天狗实战SpringBoot+Vue(二)项目结构搭建(上)

3. 本节介绍

本小节将会在之前搭建项目的基础上,对一些所需底层基建应用的安装、验证做一些实战讲解。包括Less的安装,可能会遇到的问题,安装后的初步验证;axios的安装,初步使用,以及基于内聚性和耦合性做一些封装以及功能拆解;ElementUI的安装,验证等等。

二、项目前置所需应用安装

1. Less的安装

Less是一门CSS的预处理语言,它扩充了CSS语言,让CSS更易维护方便制作主体、扩充。我们本节不展开说Less和Sass的区别,后边会有相关知识点。而在初学者来说,可以熟练使用其中一种即可。

安装命令:

npm install less-loader@5.0.0 –save
npm install less –save

如果你之前安装过并且安装失败,很可能是webpack版本低,而less-loader的版本高造成的,可先执行命令

npm uninstall less-loade

然后再执行以上两行安装命令即可。

2. Less安装后的验证 

我们再在代码中试一试,已知less嵌套功能,我们在HelloWorld.vue中修改代码:

<template>
  <div class="box">
    <span class="word">天狗实战项目,学着学着就精通了</span>
  </div>
</template>

<style scoped lang="less">
  .box {
    border: 1px solid red;
    .word {
      font-size: 22px;
      color: red;
    }
  }
</style>

 

3. axios的安装

我们知道axios是基于ajax加promise的封装,更加利于我们当下项目的异步场景。安装命令:

npm install axios

 

安装完成后我们先以HelloWorld.vue为例演示,先在业务组件HelloWorld.vue中引入Axios,然后再分别调用一下他的get请求和post请求,看一下基本用法。天哥已经为我们准备好了测试接口,

import Axios from "axios";
// 测试get请求
    Axios.get("http://192.168.3.12/admin/book", {
      params: {
        id: 1,
      }
    }).then(response => {
      console.log('----get请求----', response);
    });
// 测试post请求
    Axios.post("http://192.168.3.12/admin/book", 
        {
          "bookName":"书名1",
          "bookNo":"编号1",
          "bookAuthor":"作者1",
          "bookType":1,
          "bookDesc":"描述1",
          "publisher":"出版社1",
          "publishDate": "2023-01-01"
        }
    ).then(response => {
      console.log('----post请求----', response);
    });

 

 

4. axios请求的封装与拆解 

但很明显这样做是有问题的,我们之前说过,在大型项目中,要具备内聚性与耦合性的表现,这里正好可以体现一下,说白了就是尽量让每段代码单独做他自己该做的事情,该复用的要复用,该和复用代码分离的要尽量分离开。所以这里就涉及到了axios的二次封装以及请求拆解

单说此处axios请求的处理,可针对IP地址请求路径数据组装业务请求的单独拆分。代码如下:

/src/config/目录下添加 httpIp.js文件

// 全站请求IP地址常量控制
export const HPPT_IP = 'http://192.168.3.12';

 /src/config/目录下添加 httpUrl.js文件

import { HPPT_IP } from "./httpIp";

export const URLS = {
  testPost: HPPT_IP + '/admin/book', // post测试路径
  testGet: HPPT_IP + '/admin/book', // post测试路径
}

 /src/utils/目录下添加httpRequire.js文件(这里只是初步封装,后续会根据需求迭代继续补充

import axios from "axios";

let timeout = 6000; // 设置请求过期时间

const service = axios.create({
  timeout,
});

service.interceptors.request.use(
  (config) => {
    if (config.method === "get" && config.params == null) {
      config.params = config.data;
    }

    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);

service.interceptors.response.use(
  (response) => {
    const res = response.data;
    if (res.code != 200) {
      // 这里做异常处理,后续会继续补充
      return Promise.reject(res || "Error");
    } else {
      return res;
    }
})

export default service;

 /src/api/目录下添加test.js文件

import request from '../utils/httpRequire.js';
import { URLS } from '../config/httpUrl.js';

// 测试post接口
export function testPost(data) {
    return request({
        url: URLS.testPost,
        method: 'post',
        data,
    });
}

// 测试get接口
export function testGet(data) {
    return request({
        url: URLS.testGet,
        method: 'get',
        data,
    });
}

 HelloWorld.vue业务组件调用请求API,组装入参数据,并验证结果

import { testPost, testGet } from '@/api/test.js';

// 测试post接口
    let postParam = {
      "bookName":"书名1",
      "bookNo":"编号1",
      "bookAuthor":"作者1",
      "bookType":1,
      "bookDesc":"描述1",
      "publisher":"出版社1",
      "publishDate": "2023-01-01",
    }
    testPost(postParam).then((res) => {
      console.log('====post请求====', res);
    })
// 测试get接口
    let getParam = {
      id: 1,
    }
    testGet(getParam).then((res) => {
      console.log('====get请求====', res);
    })

5. axios请求封装后的验证 

封装完成,就可以在业务组件中进行调用验证了,这里依然使用HelloWorld.vue进行验证,把该验证的都验证完成,我们就可以开始做登录的需求了。

 

我们做axios的封装不单单是准备使业务组件内进行数据请求的时候看上去代码更清爽,只是组装一下数据,调一下请求方法,再直接获取返回数据就好了,同时也是希望在前后端联调的时候,可以有一个共有的地方,提供一个口子,可以做更多的事情。比如做一个异常请求的拦截跳转啦,比如做一个公共数据的拦截封装啦,都会使我们的项目业务推展更加方便而且高效

说的更直白一些就是,

  • 我们有个业务组件HelloWorld.vue,
  • 需要调一个请求
  • 然后我们写了一个testGet的方法,而testGet这个方法呢,是在/src/api/test.js中定义着的;
  • 而到了test.js中,结合了封装起来的axios和我们提前定义好的常量URLS
  • 而URLS的请求前缀,被HTTP_IP统一指挥着,
  • 从而达到了将请求过程解耦的操作。

6. ElementUI的安装、验证

我们本项目使用比较成熟的elementUI进行开发,当然后面我们还会自己实现一些其中的UI组件,更方便大家对组件开发有个认识。安装命令:

npm i element-ui –save

 同时在main.js中引入elementUI的入口文件,代码如下:

import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'

Vue.config.productionTip = false

Vue.use(ElementUI)

我们在HelloWorld.vue示例组件中随便引入一个表单组件,查看是否引入成功。

<template>
  <div class="box">
    <el-form ref="form">
        <el-form-item label="用户名" prop="username" class="is-required">
          <el-input v-model="form.username" placeholder="请输入用户名"></el-input>
        </el-form-item>
    </el-form>
  </div>
</template>

 

虽然有点丑,但已经成功了。至此,我们的前期预备工作已经完成了,可以正式开始后续的需求组件开发啦。

三、本项目进展图例介绍

本项目是一个不断迭代的实战项目,所以需求内容,模块,组件,知识点都会不断丰富起来,下面介绍2个进展图例,好让大家对目前以及后续的项目发展有个更好的认识。

1. 内容架构

  

2. 代码目录

 

四、读完本小节需要思考的几个问题

做项目不仅仅是为了有个实战经验,也不单单是为了巩固知识点,很多时候,很多问题,我们会在不断积累项目经验的同时,去寻找答案,去沉淀下属于自己的思考,下面结合本文的内容,我提出几个问题,希望小伙伴们可以实战完以后去思考一下。其实这些问题也没有太固定的答案,而你需要做的就是:不断总结出属于自己的答案

  • 如果让你负责一个大型的前端项目,你会如何搭建项目
  • 你在项目中是如何使用axios的?
  • 为什么要使用Less?
  • 你的项目中是如何解决前后端联调跨域问题的?

为了能够得到大家更多的反馈,我为大家准备了投票环节,请你投出自己宝贵的一票吧:

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

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

相关文章

闭包是什么?五分钟带你了解闭包

闭包 前言 闭包对每个前端来说都是一个绕不开的话题。学习之初也因为搞清闭包的概念耗费了不少精力&#xff0c;今天写一篇博客来记录本人对闭包的理解&#xff0c;笔者水平有限&#xff0c;若有疏漏及错误&#xff0c;愿不吝赐教。 什么是闭包&#xff1f; 你可以在一个函…

创建vue2项目

如何创建一个vue2项目 &#xff08;1&#xff09; 使用cmd终端直接创建 在键盘上winr&#xff0c;输入cmd打开终端窗口&#xff0c;cd进入到vue项目所创建的目录里&#xff08;我是直接创建在桌面上&#xff09; 输入创建项目指令&#xff08;vue create 项目名称&#xff09;…

走进Vue【一】初识Vue

文章目录&#x1f31f;前言&#x1f31f;MVVM模式&#x1f31f;Vue简介&#x1f31f;Vue重要版本发布&#x1f31f;Vue特点&#x1f31f;快速上手Vue&#x1f31f;Hello Vue&#x1f31f;Vue实例&#x1f31f;写在最后&#x1f31f;前言 从历史的潮流来说&#xff0c;人们从之…

Promise.all的使用

Promise的基本使用Promise.all() 传参和返回结果Promise.all() 完成状态Promise.all() 失败状态Promise.all() 使用案例Promise.all() 传参和返回结果 Promise.all() 传入一个promise的数组&#xff0c;并返回一个Promise实例&#xff0c;传入数组中的promise返回的 resolve 回…

探究前端的跑马灯效果是如何用css实现的

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;…

学习 Python 之 Pygame 开发魂斗罗(十二)

学习 Python 之 Pygame 开发魂斗罗&#xff08;十二&#xff09;继续编写魂斗罗1. 修改玩家扣减生命值2. 解决玩家下蹲子弹不会击中玩家而是直接让玩家死亡的问题3. 完善地图4. 增加产生敌人函数&#xff0c;解决一直产生敌人的问题5. 给玩家类增加计算玩家中心的方法继续编写魂…

软件行业的最后十年【ChatGPT】

在这篇文章中&#xff0c;我将说明像 ChatGPT 这样的生成式人工智能 (GAI) 将如何在十年内取代软件工程师。 预测被离散化为 5 个阶段&#xff0c;总体轨迹趋向于完全接管。 但首先&#xff0c;一个简短的前言。 推荐&#xff1a;用 NSDT场景设计器 快速搭建3D场景。 1、关于AI…

ChatGPT-4.0 : 未来已来,你来不来

文章目录前言ChatGPT 3.5 介绍ChatGPT 4.0 介绍ChatGPT -4出逃计划&#xff01;我们应如何看待ChatGPT前言 好久没有更新过技术文章了&#xff0c;这个周末听说了一个非常火的技术ChatGPT 4.0&#xff0c;于是在闲暇之余我也进行了测试&#xff0c;今天这篇文章就给大家介绍一…

七夕节,我用代码制作了表白信封

大家好&#xff0c;我是小周&#xff0c;明天就是七夕了&#xff0c;这么浪漫的节日&#xff0c;自然少不了我这个浪漫博主&#xff0c;本次为大家贡献表白信封的制作&#xff0c;其他的就看缘分啦&#xff0c;哈哈&#xff0c;最后会放上资源包&#xff0c;需要的小伙伴自取就…

Nginx反向代理WebSocket服务连接报错:WebSocket connection to “wss://xxx/xxx“ failed

最近使用 node.js 搭建 WebSocket 服务&#xff0c;在本地测试 connection 都是正常&#xff0c;于是部署到 Linux 服务上&#xff0c;需要用 Nginx 来反向代理 WebSocket 服务。浏览器控制台报错&#xff1a;WebSocket connection to wss://tiven.cn/ws/xxx failed:&#xff0…

学会iframe并用其解决跨域问题

了解iframe 官方定义为&#xff1a;iframe是HTML标签&#xff0c;作用是文档中的文档&#xff0c;或者浮动的框架(FRAME)。iframe元素会创建包含另外一个文档的内联框架&#xff08;即行内框架&#xff09;。 简单理解为&#xff1a;iframe是一个内联框架&#xff0c;可以在当…

ES6 --- 解构赋值(数组,对象,函数)使用详解

解构赋值 JavaScript 中最常用的两种数据结构是 Object 和 Array。 对象让我们能够创建通过键来存储数据项的单个实体。数组则让我们能够将数据收集到一个有序的集合中。 但是&#xff0c;当我们把它们传递给函数时&#xff0c;函数可能不需要整个对象/数组。它可能只需要对…

[Vue warn]: Error in v-on handler: “TypeError: Cannot read properties of undefined (reading ‘$refs‘)

报错&#xff1a;[Vue warn]: Error in v-on handler: "TypeError: Cannot read properties of undefined (reading $refs)" 背景&#xff1a;1.在做vue项目时&#xff0c;在功能弹框中&#xff0c;想实现新增内容。 2. 报错原因是要触发menuCheckall组件后&#xff…

background-image使用

目录 background-image: url(" ")&#xff1b; background-repeat属性&#xff08;背景平铺&#xff09; background-size属性&#xff08;设置背景图片大小&#xff09; background-position属性&#xff08;背景图片位置&#xff09; 1.background-image: url…

Vue中 Vue-Baidu-Map基本使用

前言 但我们遇到一项新技术或者没有写过的东西为了不走弯路我们只能先去模仿或者看官方文档 Vue这个框架相信大家都熟悉&#xff0c;只要是需要用的第三方平台它一般都会进行集成&#xff0c;比如Vue-Baidu-map 为什么有百度原生api为什么还需要插件&#xff0c;因为使用插件…

ref 引用(vue获取DOM元素)

ref 引用 jquery 牛逼 简化了程序员操作DOM的过程 vue 优势&#xff1a; MVVM 在 vue 中&#xff0c;程序员不需要操作DOM。只需要把数据维护好&#xff01;(数据驱动视图) 结论&#xff1a;在 vue 项目&#xff0c;强烈不建议大家安装和使用jQuery&#xff01;&#xff01;&am…

CORS错误是什么如何解决?

通过http://localhost访问服务端时,出现CROS错误是什么问题该如何解决呢? 发生ajax跨域问题的原因&#xff1a;(三个原因同时满足才可能产生跨域问题) (1)浏览器限制 发生ajax跨域的问题的时候后端是正常执行的&#xff0c;从后台打印的日志可以看出&#xff0c;而且后台也会…

前端布局小案例,如何创建漂亮的毛玻璃输入表单卡片效果

在当今互联网时代&#xff0c;用户体验是至关重要的。当我们在设计网站或应用程序时&#xff0c;一个漂亮、吸引人的界面往往是吸引用户并提高用户满意度的关键因素之一。而一个好看的表单则可以提高用户提交的意愿和效率。本文将介绍如何使用HTML和CSS创建一个漂亮的毛玻璃输入…

vue3 响应式对象的 api 详解

文章目录Ⅰ. ref、reactive ( 递归监听 )Ⅱ. isRef、isReactive ( 判断 )Ⅲ. toRef 和 toRefs ( 解构 )Ⅳ. toRaw 、 markRaw ( 解除代理)Ⅴ. unref ( 拷贝 )Ⅵ. shallowRef 、shallowReactive&#xff08; 非递归监听 &#xff09;Ⅶ. triggerRef &#xff08;强制更新&#x…

使用小程序制作一个老照片修复工具,让追忆时光触手可及

一、文章前言二、准备流程三、开发步骤四、完整代码一、文章前言 此文主要通过小程序来制作一个照片修复工具,实现黑白图片上色及图像效果增强等功能。 二、准备流程 2.1、注册百度开放平台及微信公众平台账号。 2.2、下载及安装微信Web开发者工具。 2.3、如需通过SDK调用及需…