Vue Web开发(五)

news2024/12/15 3:34:17

1. axios

  axios官方文档
在这里插入图片描述

  异步库axios和mockjs模拟后端数据,axios是一个基于promise的HTTP库,使用npm i axios。在main.js中引入,需要绑定在Vue的prototype属性上,并重命名。
在这里插入图片描述
  (1)main.js文件引用

import http from 'axios'
Vue.prototype.$http = http

在这里插入图片描述

1.1. axios简单例子

在这里插入图片描述
  (1)在home的index.vue中添加mounted

   /**
     * 拦截器部分
     * @param instance
     */
    interceptors(instance) {
        // 添加请求拦截器
        instance.interceptors.request.use(function (response) {
            console.log("添加请求拦截器:", response)
            // 在发送前做什么
            return response;
        }, function (error) {
            // 对请求错误做什么
            console.log("error错误:", error)
            return Promise.reject(error);
        });
        // 添加响应拦截器
        instance.interceptors.response.use(function (response) {
            // 对响应数据前做什么
            console.log("添加请求拦截器2:", response)
            return response;
        }, function (error) {
            console.log("error错误2:", error)
            // 响应错误后做什么
            return Promise.reject(error);
        });
    }

  在控制台中可以发现请求已发送,状态为404
在这里插入图片描述

1.2. axios函数封装

  (1)在src目录下新建config文件夹,新建index.js,主要是让系统判断当前处于生产状态还是用户状态。

//src/api/index.js
export default{
    baseUrl:{
        dev:'/api/',//开发环境
        pro:''//生产环境
    }
}

  (2)对axios函数进行二尺封装,方便后续使用。在根目录下新建api文件夹,新建axios.js文件。

//src/api/axios.js
import axios from 'axios'
import config from '../config'
// 将config和anios进行有机结合,对axios进行简单封装。
// 判断是不是生产环境,并拿到config中的dev环境,否则拿到config中的pro环境。
const baseUrl = process.env.NODE_ENV === 'development' ? config.baseUrl.dev : config.baseUrl.pro
/**
 *  axios工具类,工具类拿到对应的url后,进行相应配置
 */
class HttpRequest {
    constructor (baseUrl) {
        this.baseUrl = baseUrl
    }
    /**
     * 用于定义anios的相关配置的方法
     * @returns {{header: {}, base: *}}
     */
    getInsideConfig(){
        const config = {
            base:this.baseUrl,
            header:{}
        }
        return config
    }
    /**
     * 拦截器部分
     * @param instance
     */
    interceptors (instance) {
        // 添加请求拦截器
        instance.interceptors.request.use(function(config){
            // 在发送前做什么
            return config;
        },function (error){
            // 对请求错误做什么
            return Promise.reject(error);
        });
        // 添加响应拦截器
        instance.interceptors.response.use(function(response){
            // 对响应数据前做什么
            return response;
        },function(error){
            // 响应错误后做什么
            return Promise.reject(error);
        });
    }
    /**
     * 接口请求
     * @param options
     * @returns {*}
     */
    request(options){
        //创建axios实例
        const instance = axios.create()
        // ES6语法解构,三点表示解构
        options = {...this.getInsideConfig(), ...options}
        // 调用拦截器
        this.interceptors(instance)
        return instance(options)
    }
}

export default new HttpRequest(baseUrl)

1.3. 接口调用

  (1)在src/api下新建data.js文件,用于添加网络接口

//src/api/data.js
// 这里引入的是文件,不是依赖
import axios from './axios'
/**
 * 接口对外暴露
 * @param param
 * @returns {*}
 */
export const getMenu = (param) => {
    return axios.request({
        url:'/permission/getMenu',
        method:'post',
        data:param
    })
}

  (2)在src/views/home/index.vue中调用

//src/views/home/index.vue
 mounted() {
            // //接口请求一般在mounted下
            // const axios = require('axios');
            // // 上述请求也可以按以下方式完成(可选)
            // axios.get('/user', {
            //     params: {
            //         ID: 12345
            //     }
            // }).then(function (response) {
            //         console.log(response);
            //     })
            //     .catch(function (error) {
            //         console.log(error);
            //     })
            //     .finally(function () {
            //         // 总是会执行
            //     });
            getMenu().then(res => {
                console.log("post==",res)
            })
        }
//src/views/home/index.vue
<template>
    <el-row class="home" :gutter="20" style="height:100vh;">
        <!--用户布局-->
        <el-col :span="9" class="user-section">
            <el-card shadow="hover">
                <div class="user-layout">
                    <img class="user-header" :src="userImg"/>
                    <div class="user-info-layout">
                        <p class="user-name">Admin</p>
                        <p class="user-nickname">超级管理员</p>
                    </div>
                </div>
                <div class="login-layout">
                    <p class="login-time">上次登录时间:<span>2024-12-12</span></p>
                    <p class="login-loc">上次登录地点:<span>济南</span></p>
                </div>
            </el-card>
            <!--列表展示-->
            <el-card class="list-section">
                <el-table :data="tableData">
                    <el-table-column
                            v-for="(val,key) in tableLabel"
                            :key="key"
                            :prop="key"
                            :label="val">
                    </el-table-column>
                </el-table>
            </el-card>
        </el-col>
        <!--右侧布局-->
        <el-col :span="15">
            <!--订单统计-->
            <el-col :span="8" v-for="(item) in countData"
                    :key="item.name" :offset="0">
                <el-card class="order-section"
                         :body-style="{display:'flex', padding:0}">
                    <div class="order-layout">
                        <i class="order-icon" :class="'el-icon-'+item.icon"
                           :style="{background:item.color}"></i>
                        <div class="order-detail">
                            <p class="order-num">{{item.value}}</p>
                            <p class="order-title">{{item.name}}</p>
                        </div>
                    </div>
                </el-card>
            </el-col>
            <el-card style="height:280px;">
            </el-card>
            <div class="graph">
                <el-card style="height:260px;"></el-card>
                <el-card style="height:260px;"></el-card>
            </div>
        </el-col>
    </el-row>
</template>

<script>
    import {getMenu} from '../../api/data.js'

    export default {
        name: "home",
        data() {
            return {
                userImg: require("../../assets/images/user.png"),
                tableData: [
                    {
                        name: "华为",
                        todayBuy: 100,
                        monthBuy: 300,
                        totalBuy: 800,
                    },
                    {
                        name: "荣耀",
                        todayBuy: 100,
                        monthBuy: 300,
                        totalBuy: 800,
                    },
                    {
                        name: "oppo",
                        todayBuy: 100,
                        monthBuy: 300,
                        totalBuy: 800,
                    },
                    {
                        name: "vivo",
                        todayBuy: 100,
                        monthBuy: 300,
                        totalBuy: 800,
                    },
                    {
                        name: "苹果",
                        todayBuy: 100,
                        monthBuy: 300,
                        totalBuy: 800,
                    },
                    {
                        name: "小米",
                        todayBuy: 100,
                        monthBuy: 300,
                        totalBuy: 800,
                    },
                    {
                        name: "三星",
                        todayBuy: 100,
                        monthBuy: 300,
                        totalBuy: 800,
                    },
                    {
                        name: "魅族",
                        todayBuy: 100,
                        monthBuy: 300,
                        totalBuy: 800,
                    }
                ],
                tableLabel: {
                    name: '课程',
                    todayBuy: '今日购买',
                    monthBuy: '本月购买',
                    totalBuy: '总购买',
                },
                countData: [
                    {
                        name: "今日支付订单",
                        value: 1234,
                        icon: "success",
                        color: "#2ec7c9",
                        offset: 0,
                    },
                    {
                        name: "今日收藏订单",
                        value: 210,
                        icon: "star-on",
                        color: "#ffb980",
                        offset: 1,
                    },
                    {
                        name: "今日未支付订单",
                        value: 1234,
                        icon: "s-goods",
                        color: "#5ab1ef",
                        offset: 2,
                    },
                    {
                        name: "本月支付订单",
                        value: 1234,
                        icon: "s-home",
                        color: "#fbcc00",
                        offset: 0,
                    },
                    {
                        name: "本月收藏订单",
                        value: 210,
                        icon: "s-cooperation",
                        color: "#ff4444",
                        offset: 1,
                    },
                    {
                        name: "本月未支付订单",
                        value: 1234,
                        icon: "s-shop",
                        color: "#33cc87",
                        offset: 2,
                    },
                ]
            }
        },
        mounted() {
            // //接口请求一般在mounted下
            // const axios = require('axios');
            // // 上述请求也可以按以下方式完成(可选)
            // axios.get('/user', {
            //     params: {
            //         ID: 12345
            //     }
            // }).then(function (response) {
            //         console.log(response);
            //     })
            //     .catch(function (error) {
            //         console.log(error);
            //     })
            //     .finally(function () {
            //         // 总是会执行
            //     });
            getMenu().then(res => {
                console.log("post==",res)
            })
        }
    }
</script>
<style lang="less">
    /*用户模块*/
    .user-section {
        margin: 10px 0
    }

    .user-layout {
        display: flex;
        flex-direction: row;
        align-items: center;
        border-bottom: #999 solid 1px;
        padding: 0 10px 10px;
    }

    .user-header {
        width: 100px;
        height: 100px;
        border-radius: 50%;
    }

    .user-info-layout {
        display: flex;
        flex-direction: column;
        margin-left: 20px;
    }

    .user-name {
        font-size: 18px;
        color: black;
        font-weight: 700;
    }

    .user-nickname {
        font-size: 18px;
        color: black;
        margin-top: 5px;
        font-weight: 700;
    }

    .login-layout {
        display: flex;
        flex-direction: column;
        margin-left: 20px;
    }

    .login-time {
        font-size: 17px;
        color: black;
        margin-top: 5px;
    }

    .login-loc {
        font-size: 17px;
        color: black;
        margin-top: 8px;
    }

    /*列表展示*/
    .list-section {
        margin-top: 20px;
        height: 460px;
    }

    /*订单统计*/
    .order-section {
        padding: 0 0;
        margin: 10px 0 15px;
        background-color: white;
    }

    .order-layout {
        display: flex;
        flex-direction: row;
        align-items: center;
    }

    .order-icon {
        display: flex;
        width: 65px;
        height: 65px;
        //border-radius: 50%;
        align-items: center;
        justify-content: center;
    }

    .order-detail {
        display: flex;
        flex-direction: column;
        justify-content: center;
        margin-left: 15px;
    }

    .order-num {
        color: #333333;
        font-size: 18px;
    }

    .order-title {
        color: #333;
        font-size: 18px;
        font-weight: 700;
        margin-top: 8px;
    }

</style>

在这里插入图片描述
 &emsp;axios网络请求示例下载

1.4. 对响应拦截器进行更改

  对/src/api/index.js下的拦截器进行更改,打印拦截数据。

  /**
     * 拦截器部分
     * @param instance
     */
    interceptors(instance) {
        // 添加请求拦截器
        instance.interceptors.request.use(function (response) {
            console.log("添加请求拦截器:", response)
            // 在发送前做什么
            return response;
        }, function (error) {
            // 对请求错误做什么
            return Promise.reject(error);
        });
        // 添加响应拦截器
        instance.interceptors.response.use(function (response) {
            // 对响应数据前做什么
            return response;
        }, function (error) {
            // 响应错误后做什么
            return Promise.reject(error);
        });
    }

在这里插入图片描述

1.5. mockjs使用

  官方文档
在这里插入图片描述

  mock可以拦截ajax请求,在mock的回调函数中返回接口的响应数据。可以模拟后端发送过来的接口数据。mock可以使用数据模板生成数据。
  在api下新建mock.js,先npm i mockjs。Mock.mock(url,回调函数),这里模块化编程,提前准备好数据模板,在api下新建mockServeData文件夹,新建home.js文件,存放home页面下的mock的模拟数据。
在这里插入图片描述

//src/api/mock.js
import Mock from 'mockjs'
import homeApi from './mockServeData/home.js'
Mock.mock('/home/getData',homeApi.getStatisticalData)
//src/api/mockServeData/home.js
// mock数据模拟
import Mock from 'mockjs'

// 图表数据
let List = []
export default {
    getStatisticalData: () => {
        //Mock.Random.float 产生随机数100到8000之间 保留小数 最小0位 最大0位
        for (let i = 0; i < 7; i++) {
            List.push(
                Mock.mock({
                    苹果: Mock.Random.float(100, 8000, 0, 0),
                    vivo: Mock.Random.float(100, 8000, 0, 0),
                    oppo: Mock.Random.float(100, 8000, 0, 0),
                    魅族: Mock.Random.float(100, 8000, 0, 0),
                    三星: Mock.Random.float(100, 8000, 0, 0),
                    小米: Mock.Random.float(100, 8000, 0, 0)
                })
            )
        }
        return {
            code: 20000,
            data: {
                // 饼图
                videoData: [
                    {
                        name: '小米',
                        value: 2999
                    },
                    {
                        name: '苹果',
                        value: 5999
                    },
                    {
                        name: 'vivo',
                        value: 1500
                    },
                    {
                        name: 'oppo',
                        value: 1999
                    },
                    {
                        name: '魅族',
                        value: 2200
                    },
                    {
                        name: '三星',
                        value: 4500
                    }
                ],
                // 柱状图
                userData: [
                    {
                        date: '周一',
                        new: 5,
                        active: 200
                    },
                    {
                        date: '周二',
                        new: 10,
                        active: 500
                    },
                    {
                        date: '周三',
                        new: 12,
                        active: 550
                    },
                    {
                        date: '周四',
                        new: 60,
                        active: 800
                    },
                    {
                        date: '周五',
                        new: 65,
                        active: 550
                    },
                    {
                        date: '周六',
                        new: 53,
                        active: 770
                    },
                    {
                        date: '周日',
                        new: 33,
                        active: 170
                    }
                ],
                // 折线图
                orderData: {
                    date: ['20191001', '20191002', '20191003', '20191004', '20191005', '20191006', '20191007'],
                    data: List
                },
                tableData: [
                    {
                        name: 'oppo',
                        todayBuy: 500,
                        monthBuy: 3500,
                        totalBuy: 22000
                    },
                    {
                        name: 'vivo',
                        todayBuy: 300,
                        monthBuy: 2200,
                        totalBuy: 24000
                    },
                    {
                        name: '苹果',
                        todayBuy: 800,
                        monthBuy: 4500,
                        totalBuy: 65000
                    },
                    {
                        name: '小米',
                        todayBuy: 1200,
                        monthBuy: 6500,
                        totalBuy: 45000
                    },
                    {
                        name: '三星',
                        todayBuy: 300,
                        monthBuy: 2000,
                        totalBuy: 34000
                    },
                    {
                        name: '魅族',
                        todayBuy: 350,
                        monthBuy: 3000,
                        totalBuy: 22000
                    }
                ]
            }
        }
    }
}

  在main.js中引入import ‘./api/mock.js’。
在这里插入图片描述

  在src/views/home下index.vue中引入getData。import { getData } from ‘…/…/api/data.js’,并暴露使用。

//src/views/home/index.js
  mounted(){
    getData().then(res => {
      console.log(res)
    })
  }

  在api中data.js中编写getData,这里没有写请求类型,默认是get请求。

//data.js
export const getData = () =>{
    return axios.request({
        url:'/home/getData'
    })
}

  url为:
在这里插入图片描述
  接口拦截成功,并返回数据。
在这里插入图片描述

  将数据进行解构
  对home的index.vue的mounted进行修改,并将return中的tableData定义为空数组,tableData:[]。

  mounted(){
    getData().then(res => {
      const { code,data } = res.data
      if (code === 20000){
        this.tableData = data.tableData
      }
      console.log(res)
    })
  }

  前后数据区别:一个是原本写死的数据,一个是模拟后端的mock数据。
在这里插入图片描述
  VueWeb Mock示例下载

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

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

相关文章

论文概览 |《IJAEOG》2024.08 Vol.132(下)

本次给大家整理的是《International Journal of Applied Earth Observation and Geoinformation》杂志2024年08月第132期的论文的题目和摘要&#xff0c;一共包括88篇SCI论文&#xff01;由于论文过多&#xff0c;我们将通过两篇文章进行介绍&#xff0c;本篇文章介绍第45--第8…

「数据结构详解·十五」树状数组

「数据结构详解一」树的初步「数据结构详解二」二叉树的初步「数据结构详解三」栈「数据结构详解四」队列「数据结构详解五」链表「数据结构详解六」哈希表「数据结构详解七」并查集的初步「数据结构详解八」带权并查集 & 扩展域并查集「数据结构详解九」图的初步「数据结构…

【sgFileLink】自定义组件:基于el-link、el-icon标签构建文件超链接组件,支持垃圾桶删除、点击预览视频/音频/图片/PDF格式文件

sgFileLink源代码 <template><div :class"$options.name"><el-link click.stop"clickFile(data)"><img :src"getSrc(data)" /><span>{{ getFileNameAndSize(data) }}</span></el-link><el-linkcl…

电机驱动模块L9110S详解

电机驱动模块是一种用于控制和驱动电机的设备&#xff0c;它能够将控制信号转化为适合电机操作的电流和电压。通过电机驱动模块&#xff0c;可以实现对电机的速度、方向等参数进行精确控制。 今天我们要介绍的 L9110S 电机驱动适合大学生、工程师、个人DIY、电子爱好者们学习和…

Unity 获取鼠标点击位置物体贴图颜色

实现 Ray ray Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out RaycastHit hit)) {textureCoord hit.textureCoord;textureCoord.x * textureMat.width;textureCoord.y * textureMat.height;textureColor textureMat.GetPixel(Mathf.Flo…

openlayers+vite+vue3实现在地图上画线(四)

在前几期实现离线地图初始化以及规划某一特定区域、打点、出现弹窗的基础上&#xff0c;本文主要阐述如何实现在所规划的区域地图上画线&#xff0c;如果你实现了打点的效果&#xff0c;其实这个相对来说还是算比较简单的&#xff0c;因为和打点的代码大差不差。使用openlayers…

游戏引擎学习第45天

仓库: https://gitee.com/mrxiao_com/2d_game 回顾 我们刚刚开始研究运动方程&#xff0c;展示了如何处理当人物遇到障碍物时的情况。有一种版本是角色会从障碍物上反弹&#xff0c;而另一版本是角色会完全停下来。这种方式感觉不太自然&#xff0c;因为在游戏中&#xff0c;…

类与对象以及ES6的继承

认识class定义类 类的声明用的比较多 类与构造函数的异同 类的构造函数 类的实例方法 类的访问器方法 在类里面写拦截方法 类的静态方法 通过类名直接访问 es6类的继承-extends super关键字 子类可以重写父类方法包括父类的静态方法也可以继承父类的静态方法 babel可以将新的代…

通过IKE协商方式建立IPSec隧道

我们前面学习了H3C的IPsec VPN配置&#xff08;为什么IPsec两端内网的网段能不能重复&#xff1f;分明可以实现&#xff01;&#xff09;&#xff0c;学习了Juniper的IPsec VPN配置&#xff0c;学习了Windows的IPsec VPN配置&#xff08;配置Juniper虚墙vSRX基于策略的IPsec VP…

文献分享: EMVB——PLAID后期交互引擎的进一步优化

&#x1f449;前情提要&#xff1a; 神经网络自然语言模型概述 Transformer \text{Transformer} Transformer与注意力机制概述 &#x1f4da;相关论文&#xff1a; BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding \text{BERT: Pre-train…

vue2+element-ui实现多行行内表格编辑

效果图展示 当在表格中点击编辑按钮时:点击的行变成文本框且数据回显可以点击确定按钮修改数据或者取消修改回退数据: 具体实现步骤 1. 行数据定义编辑标记 行数据定义编辑标记 当在组件中获取到用于表格展示数据的方法中,针对每一行数据添加一个编辑标记 this.list.f…

介绍几个Linux下的杀毒软件

一&#xff1a;chkrootkit 是一个用于检测Linux系统下可能被攻击者植入的后门程序或恶意代码的扫描工具。 &#xff08;1&#xff09;安装方法&#xff08;ubuntu) sudo apt update sudo apt install chkrootkit &#xff08;2&#xff09;使用方法&#xff1a; chkrootkit -…

JS 中请求队列与锁的巧妙结合

一、引言 在 JavaScript 开发中&#xff0c;尤其是在涉及到异步操作和对共享资源的并发访问时&#xff0c;有效地控制请求顺序和资源访问权限至关重要。例如&#xff0c;在多个网络请求同时针对一个有限制访问频率的 API 或者多个异步任务竞争同一个文件写入权限的场景下&#…

MYSQL索引的分类和创建

目录 1、聚簇索引和非聚簇索引 tips&#xff1a; 小问题&#xff1a;主键为什么建议使用自增id? 2、普通索引 &#xff08;常规索引&#xff09;(normal) 3、唯一索引&#xff08;UNIQUE &#xff09; 唯一索引和主键的区别&#xff1a; 唯一约束和唯一索引的区别&#…

Oracle最佳实践-优化硬解析

前段时间参加oracle CAB&#xff0c;oracle高级服务部门做了一个数据库最佳实践的报告&#xff0c;其中就有一项就是解决未使用绑定变量但执行次数很多的SQL&#xff1b; 对于一个数据库来说如果不知道该如何优化&#xff0c;那么最简单最有效的优化就是减少硬解析&#xff0c;…

AI Agent:重塑业务流程自动化的未来力量(2/30)

《AI Agent&#xff1a;重塑业务流程自动化的未来力量》 摘要&#xff1a;整体思路是先介绍 AI Agent 的基本情况&#xff0c;再深入阐述其实现业务流程自动化的方法和在不同领域的应用&#xff0c;接着分析其价值和面临的挑战&#xff0c;最后得出结论&#xff0c;为读者全面…

哈默纳科Harmonic谐波减速机机器人精准高效动力传递的核心力量

在当今科技飞速发展的时代&#xff0c;机器人技术正以惊人的速度改变着我们的生产与生活方式。而在机器人的精密机械结构中&#xff0c;哈默纳科 Harmonic 谐波减速机扮演着不可或缺的角色&#xff0c;成为机器人精准高效动力传递的关键所在。 1.高精度与灵活性&#xff1a;哈默…

【开源项目】经典开源项目数字孪生体育馆—开源工程及源码

飞渡科技数字孪生体育馆管理平台&#xff0c;融合物联网IOT、BIM数据模型、三维GIS等技术&#xff0c;实现体育馆的全方位监控和实时全局掌握&#xff0c;同时&#xff0c;通过集成设备设施管理、人员管理等子系统&#xff0c;减少信息孤岛&#xff0c;让场馆“可视、可控、可管…

长短期记忆神经网络(LSTM)介绍

1、应用现状 长短期记忆神经网络&#xff08;LSTM&#xff09;是一种特殊的循环神经网络(RNN)。原始的RNN在训练中&#xff0c;随着训练时间的加长以及网络层数的增多&#xff0c;很容易出现梯度爆炸或者梯度消失的问题&#xff0c;导致无法处理较长序列数据&#xff0c;从而无…

SQL server学习03-创建和管理数据表

目录 一&#xff0c;SQL server的数据类型 1&#xff0c;基本数据类型 2&#xff0c;自定义数据类型 二&#xff0c;使用T-SQL创建表 1&#xff0c;数据完整性的分类 2&#xff0c;约束的类型 3&#xff0c;创建表时创建约束 4&#xff0c;任务 5&#xff0c;由任务编写…