vue 对axios二次封装,配置api层,基于mock测试数据

一、初始化环境(默认都会安装vue3项目+ts)

安装mock:全局安装

# 使用 npm 安装
npm install mockjs vite-plugin-mock
# 使用 yarn 安装
yarn add mockjs vite-plugin-mock

二、进行配置
在vite.config.ts中进行配置

import { UserConfigExport, ConfigEnv } from 'vite';
import { viteMockServe } from 'vite-plugin-mock';//command 是用于检测当前开发的环境
export default defineConfig(({command}:ConfigEnv):UserConfigExport=>{return {plugins: [//mock配置//localEnabled已经弃用,现在用enableviteMockServe({mockPath:'mock',enable: command=='serve'}),],}
})

三、开始使用

~
1.在根目录下创建mock目录(如果要起别的名字,对应上边vite.config.ts中mockPath也要做相应修改)。
2.在mock目录下创建文件,创建user.js (根据自己具体需求去取名),根据需求写几个接口路径,例子如下:

user.ts内容:

function createUserList() {return [{userId: 1,avatar:'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif',username: 'admin',password: '111111',desc: '平台管理员',roles: ['平台管理员'],buttons: ['cuser.detail'],routes: ['home'],token: 'Admin Token',},{userId: 2,avatar:'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif',username: 'system',password: '111111',desc: '系统管理员',roles: ['系统管理员'],buttons: ['cuser.detail', 'cuser.user'],routes: ['home'],token: 'System Token',},]
}
//对外暴露接口
export default [// 用户登录接口{url: '/api/user/login',//请求地址method: 'post',//请求方式response: ({ body }) => {//获取请求体携带过来的用户名与密码const { username, password } = body;//调用获取用户信息函数,用于判断是否有此用户const checkUser = createUserList().find((item) => item.username === username && item.password === password,)//没有用户返回失败信息if (!checkUser) {return { code: 201, data: { message: '账号或者密码不正确' } }}//如果有返回成功信息const { token } = checkUserreturn { code: 200, data: { token } }},},// 获取用户信息{url: '/api/user/info',method: 'get',response: (request) => {//获取请求头携带tokenconst token = request.headers.token;//查看用户信息是否包含有次token用户const checkUser = createUserList().find((item) => item.token === token)//没有返回失败的信息if (!checkUser) {return { code: 201, data: { message: '获取用户信息失败' } }}//如果有返回成功信息return { code: 200, data: { checkUser } }},},
]

好了其实里面的内容看起来很难,其实一点也不简单,要细心理解一下

就是定义一个createUserList()函数,直接返回数据集而已,然后

//对外暴露接口  export default,请求的根据就是,url、method、和response中的body参数

就像请求后端一样,在response中的{}中类似方法体,定义参数  const { username, password } =

body;,并且写一下简单的判断业务,就是判断密码是否和createUserList函数中的数据一样,这是

一个简单的登录业务。~~

四、axios二次封装 request.ts

import axios from "axios";
import { ElMessage } from "element-plus";
//创建了一个axios对象// alert(import.meta.env.VITE_APP_BASE_API);
const request = axios.create({baseURL: import.meta.env.VITE_APP_BASE_API,timeout: 5000,
});
let userStore:any = null
let token =null;
//request实例添加请求响应拦截器
request.interceptors.request.use((config) => {token = localStorage.getItem('userToken');
console.log('toekn',token);if(token!=null){// 设置请求头tokenconfig.headers.token = token;}//config配置对象,header属性配置请求头,经常给服务器端携带公共参数//返回配置对象// console.log(config);return config;
});//响应拦截器
request.interceptors.response.use((response) => {return response.data;},(error) => {//处理网络错误//失败调回//定义一个变量处理网络错误let msg = "";let status = error.response?.status || error.code;switch (status) {case 401:msg = "token过期";break;case 403:msg = "无权访问";break;case 404:msg = "请求地址错误";break;case 500:msg = "服务器出现问题";break;case "ECONNABORTED":msg = "请求超时";break;default:msg = "无网络";break;}ElMessage({type: "error",message: msg,});return { code: status, message: msg };}
);//对外暴露
export default request;

  baseURL: import.meta.env.VITE_APP_BASE_API是设置axios的一个基础路径,

import.meta.env:读取.env数据,方便切换开发和生产环境的后端服务路径

.env.development:中的变量为:

# 变量必须以 VITE_ 为前缀才能暴露给外部读取
NODE_ENV = 'development'
# VITE_NODE_ENV = 'development'
VITE_APP_TITLE = '开发中 • 硅谷甄选'#可用来区分同个域名下不同地址
VITE_APP_BASE_API = '/api' #//基础路径会携带/api
# VITE_APP_DOMAIN = 'http://sph-api.atguigu.cn'
VITE_SERVE="http://xxx.com"

这里读取的是:VITE_APP_BASE_API:'/api'

因为是mock本地测试数据,所以不用再添加本地连接默认请求本地地址。

五、创建api管理文件(ts文件)

虽然使用requts.ts可以直接请求,但是为了这篇文章的很多东西可以直接粘贴用,所以还是严谨一点。

创建src/api/user/index1.ts文件

src/api/user/type1.ts文件

index1内容:

//统一管理项目用户相关接口
import  request from '@/utils/request';
// loginFormData形参类型
import type { loginFormData,loginResultData,userInfoResultData } from './type1';enum API{LOGIN_URL="/user/login",UUSERINFO_URL="/user/info"
}
//暴露请求函数
//登录接口方法
export const reqLogin =(data:loginFormData)=>request.post<any,loginResultData>(API.LOGIN_URL,data);// 用户信息
export const reqUserInfo =()=> request.get<any,userInfoResultData>(API.UUSERINFO_URL);

type1内容:

//登录接口需要携带ts参数类型export interface loginFormData{username:string,password:string
}interface dataType{token:string
}
//登录接口返回参数
export interface loginResultData{code:any,data:any
}interface userInfo{userId:number,avatar:string,username:string,password:string,desc:string,roles:string[],bottons:string[],routes:string[],token:string
}
interface user{checkUser:userInfo
}
// 定义获取用户信息接口返回的数据
export  interface  userInfoResultData{code:number,data:user
}

这里improt:引入request、type1 这里type1是配置接口中的参数,里面是对mock返回的数据节奏来定义的参数结构,反正太难的结构就用any来定义

enum API,写的是url, export 把定义的管理api方法暴露出去。

六、调用api接口文件

在app.vue文件引入接口管理文件。

import {reqLogin,reqUserInfo} from '@/api/user/index1';

使用onMounted函数调用接口

//使用api管理接口是否能使用
//登录接口
onMounted(()=>{reqLogin({username:'admin',password:'111111'}).then(res=>{console.log('toeknset',res);if(res.code==200){//将token存储到本地缓存中localStorage.setItem('userToken',res.data.token);}console.log('成功!');})
})
//获取用户信息
onMounted(()=>{reqUserInfo().then(res=>{console.log(res);})
})

 查看控制台成功了!

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

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

相关文章

NodeRed节点编辑用于边缘计算和规则引擎,能做带UI界面和业务逻辑的上位机或前端应用吗?

先说结论&#xff0c;可以&#xff0c;但是需要有页面嵌套继承类似的技术&#xff0c;实现页面模块化封装&#xff0c;否则难以实现复杂应用。 相信目光敏锐的人都在关注节点编辑在自身行业的应用&#xff01; NodeRed在边缘计算做数据协议解析、以及物联网平台中作为规则链引…

推荐几本C#/.NET进阶书籍

前言 今天大姚给大家推荐7本C#/.NET进阶书籍&#xff0c;希望能帮助到有需要的小伙伴&#xff0c;当然假如你有更好的C#/.NET进阶书籍推荐欢迎文末留言。 C#/.NET/.NET Core推荐学习书籍&#xff08;已分类&#xff09;&#xff1a;C#/.NET/.NET Core推荐学习书籍&#xff08;…

春秋云境:CVE-2022-25578[漏洞利用]

通过题目标题查询漏洞信息 所以我们渗透的重点就要放在.htaccess文件上 这是一种分布式配置文件&#xff0c;所以我们先寻找web管理登录页面 打开主页就能看到右下角的“管理”&#xff0c;或者我们使用dirsearch进行扫描也可以 在登录页面尝试弱口令登录 输入该CMS相关的一…

【游戏专区】贪吃蛇

1&#xff0c;游戏背景 贪吃蛇&#xff08;Snake&#xff09;是一款经典的电子游戏&#xff0c;最初在1976年由 Gremlin 公司开发。它的游戏背景相对简单&#xff0c;但具有高度的成瘾性。 1. **游戏场景**&#xff1a;通常在一个有界的矩形区域内进行&#xff0c;可以是一个…

关于Android绘制这一遍就够了

Android绘制基础 Android平台提供了一套完整的UI框架&#xff0c;其中包括了绘制组件和绘制API。在Android中&#xff0c;绘制主要涉及到两个核心概念&#xff1a;Canvas和Paint。 Canvas Canvas是Android中的一个类&#xff0c;它代表了绘图的画布。你可以在这个画布上进行…

Android Studio实现页面跳转

建立文件 temp.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"…

layui--table里使用switch

1. 项目需求 在layui.table上面渲染后的列表上面加一个switch开关&#xff0c;监听switch开关的动作&#xff0c;实现本列数据的状态切换&#xff01; 实现效果如下&#xff1a; 2. 实现方式 下面介绍的思路都是利用table的templet模板实现的&#xff0c;不同的在于模板代码…

Linux-内存文件

1. 基础IO操作 1.1 c语言的IO接口 fopen&#xff1a;打开一个文件&#xff0c;按照指定方式 参数&#xff1a;filename 文件名&#xff0c;也可以是路径&#xff0c;mode&#xff1a;打开方式 返回打开的文件指针 fread&#xff1a;从指定流中读数据 参数&#xff1a;从FIL…

Vuex 的原理

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。每一个 Vuex 应用的核心就是 store&#xff08;仓库&#xff09;。“store” 基本上就是一个容器&#xff0c;它包含着你的应用中大部分的状态 ( state )。 Vuex 的状态存储是响应式的。当 Vue 组件从 store 中读取状态的…

没有理由不加倍努力

最近su7很火&#xff0c;各隐藏大佬都纷纷从后台来到前台&#xff0c;把整个网红界的网红等级提升了好几个档次。红衣大叔更是借此机会在疯狂地打造自己的网红IP。 千亿大佬都这还般努力&#xff0c;作为平民的自己哪还有不努力的理由。 加倍努力&#xff01;

29 共享内存

共享内存区是最快的IPC形式&#xff0c;一旦这样的内存映射到共享它的进程的地址空间&#xff0c;这些进程间数据传递不再涉及到内核&#xff0c;不再执行进入内核的系统调用来传递彼此的数据 原理 系统在内存中申请一段空间&#xff0c;通过页表映射挂接到进程的共享区&#…

Linux--链表 第二十五天

1. 链表 t1.next -> data t1.next->next->data .(点号)的优先级比->的大 所以 t1.next->data 就可以了 不用(t1.next)->data 2. 链表的静态增加和动态遍历 打印链表算法&#xff0c; void printLink(struct Test *head) { struct Te…

剑指Offer题目笔记32(拓扑排序)

面试题113&#xff1a; 解决方案&#xff1a; 将课程看成图中的节点&#xff0c;如果两门课程存在先修顺序那么它们在图中对应的节点之间存在一条从先修课程到后修课程的边&#xff0c;因此这是一个有向图。可行的修课序列实际上是图的拓扑排序序列。图中的每条边都是从先修课…

Web前端框架/库/工具

前言 前端从步枪&#xff08;原生js&#xff09;到了半自动武器&#xff08;jQuery&#xff09;并进化为全自动武器&#xff08;三大框架&#xff08;angular&#xff0c;react&#xff0c;vue及其生态链&#xff09;&#xff09;。 常说工欲善其事必先利其器。对于那些想要提…

【c++11】看完立马就懂--右值引用!!!

右值引用 一、什么是右值&#xff1f;什么是左值&#xff1f;二、右值引用三、右值引用的好处四、万能引用五、完美转发 一、什么是右值&#xff1f;什么是左值&#xff1f; 首先&#xff0c;当我们看到右值的时候&#xff0c;我们很自然的就会产生疑问&#xff1f; 什么的右边…

黑马鸿蒙学习5:LIST容器

LIST容器&#xff0c;其实就是如果FOREACH容器展示不全的话&#xff0c;会自动有滚动条了。要注意的是&#xff0c;LIST中必须有固定的listitem这个项&#xff0c;而且列表里面只能包含一个根组件。 必须把ROW容器放到listitem中&#xff0c;如下&#xff1a;

51、图论-岛屿数量

思路&#xff1a; 该问题要求在一个由 1&#xff08;表示陆地&#xff09;和 0&#xff08;表示水&#xff09;组成的二维网格中&#xff0c;计算岛屿的数量。岛屿被水包围&#xff0c;并且通过水平或垂直连接相邻的陆地可以形成。这个问题的核心是识别并计数网格中相连的陆地…

CSV解析

一直以为csv靠逗号&#xff08;,&#xff09;分割数据&#xff0c;那么只要用str.spilt(,,row)便可以将数据分割开。 事实证明想简单了&#xff0c;csv里还有这样的规定&#xff0c;如果数据内有双引号&#xff08;"&#xff09;和逗号&#xff08;,&#xff09;那么&…

车载电子电器架构 —— 售后诊断开发

车载电子电器架构 —— 售后诊断开发 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己…