其他章节请看:

react 高效高质量搭建后台系统 系列

请求数据

后续要做登录模块(主页),需要先和后端约定JSON数据格式,将 axios 进行封装,实现本地的数据模拟 mockjs

Tip:spug 中后端返回 json 通常有 data 和 error两个 key。就像这样:{data: [,…], error: ""}

axios

spug 中的 axios

spug 中对 axios 的封装主要在 http.js 文件中。核心是请求拦截器返回拦截器。源码如下:

// spug\src\libs\http.js
// 引入 axios
import http from 'axios'
// 对 history 包最简单的封装,用于下面执行 `history.push`来切换 Url
import history from './history'
// X_TOKEN 登录标识,登录成功后后端返回,存在 localStorage 中
import { X_TOKEN } from './functools';
// 用户错误提示
import { message } from 'antd'; // response处理
function handleResponse(response) {
let result;
// 返回失败。例如 401、404
if (response.status === 401) {
result = '会话过期,请重新登录';
if (history.location.pathname !== '/') {
// 重新登录,登录成功后再回到当前页(from)
history.push('/', {from: history.location})
} else {
return Promise.reject()
}
// 返回成功。例如 200
} else if (response.status === 200) {
// 后端携带错误信息
// 后端返回 json 通常有 data 和 error两个 key。就像这样:{data: [,…], error: ""}
if (response.data.error) {
result = response.data.error
} else if (response.data.hasOwnProperty('data')) {
return Promise.resolve(response.data.data)
// 返回二进制数据
} else if (response.headers['content-type'] === 'application/octet-stream') {
return Promise.resolve(response)
// 不是内部(url 不是以 /api/ 开头)
} else if (!response.config.isInternal) {
return Promise.resolve(response.data)
} else {
result = '无效的数据格式'
}
} else {
result = `请求失败: ${response.status} ${response.statusText}`
}
// 报错
message.error(result);
return Promise.reject(result)
} // 请求拦截器
http.interceptors.request.use(request => {
request.isInternal = request.url.startsWith('/api/');
// 对内部 url 增加 X-Token 标识。初次登陆 X-Token 为 null
if (request.isInternal) {
request.headers['X-Token'] = X_TOKEN
}
// 请求超时设置为 30 秒
request.timeout = request.timeout || 30000;
return request;
}); // 返回拦截器
http.interceptors.response.use(response => {
return handleResponse(response)
}, error => {
if (error.response) {
return handleResponse(error.response)
}
const result = '请求异常: ' + error.message;
message.error(result);
return Promise.reject(result)
}); export default http;

用法大致就像这样(请看 Dashboard 模块中的 store.js):

import http from 'libs/http';

http.get('/api/cicd/gitlab/')
.then(res => this.gitlabList = res)

myspug 引入 axios

创建 myspug\src\libs\http.js 文件,内容和 spug 相同

创建 history.js 文件,内容和 spug 相同

// myspug\src\libs\history.js

import {createBrowserHistory} from 'history';

export default createBrowserHistory()

创建 functools.js,目前只需要导出 X_TOKEN 即可。spug 中的 functools.js 涉及权限,后续我们可能会用上。

// myspug\src\libs\functools.js

export let X_TOKEN;

疑惑:在研究 react 路由时,我们自己实现了一个路由,使用 history 时发现它会导致浏览器 url 的变化,我们会通过 history.listen 来监听地址变化,而在 spug 官网中执行 history.push 不仅可以切换url,而且路由也发生了变化,但笔者没有在源码中找到 history.listen 的相关代码

mock

详细介绍请看 这里

spug 默认没有 mockjs,笔者将其加入 myspug 中,方便后续前端开发。

Tip: 内网可以使用 docker 方式快速搭建 yapi(高效、易用、功能强大的可视化接口管理平台)

大致步骤如下:

  • 安装 mockjs 包,上文我们已经安装完毕
  • 新建 src/mock/index.js
  • 最后在 src/index.js 中引入 mock

最后在 App.js 中测试:

// myspug\src\App.js

// import http from 'libs/http';
import http from '@/libs/http';
export default function App() {
http.post('/api/account/login/', {})
.then(data => console.log('data', data))
return (
<div className="App">...</div >
);
}

控制台输出:

data {id: 1, access_token: '5bb076db06fd4001b85d12e44ab96c56', nickname: '管理员', is_supper: true, has_real_ip: true, …}

:spug 中引入 http 直接是 import http from 'libs/http';,在 vscode 中按住 ctrl 并将鼠标移至 libs/http 能进入该文件,而笔者的 myspug 却报错,提示./lib/http。找不到原因,只能求其次,通过增加别名 @ 来避免相对符号 ../../../

// config-overrides.js
const { override, fixBabelImports,addWebpackAlias } = require('customize-cra');
const path = require('path')
module.exports = override(
...,
addWebpackAlias({
'@': path.resolve(__dirname, './src')
})
);

扩展

修改默认启动端口 3000

由于 create-react-app 启动端口默认是 3000,笔者为了方便研究,需要同时启动 spug 和 myspug 两个项目,这里将 spug 的端口改为 3010

// package.json
"scripts": {
- "start": "react-app-rewired start",
+ "start": "set PORT=3010 && react-app-rewired start",

其他章节请看:

react 高效高质量搭建后台系统 系列

react 高效高质量搭建后台系统 系列 —— 请求数据的更多相关文章

  1. 使用vue1.0+es6+vue-cli+webpack+iview-ui+jQuery 撸一套高质量的后台管理系统

    首先按照vue.js官网的指令安装: 1.本地安装好node.js 2.根据官方命令行工具 详情 这样一个官方的脚手架工具就已经搭建好了:但是有一点需要注意的是由于现在按照官方的搭建方法是搭建vue2 ...

  2. 建站集成软件包 XAMPP搭建后台系统与微信小程序开发

    下载安装XAMPP软件,运行Apache和MySQL 查看项目文件放在哪个位置可以正常运行 然后访问localhost即可 下载weiphp官网的weiapp(专为微信小程序开发使用)放在htdocs ...

  3. 编写高质量的Python代码系列(八)之部署

    Python提供了一些工具,使我们可以把软件部署到不同的环境中.它也提供了一些模块,令开发者可以把程序编写的更加健壮.本章讲解如何使用Python调试.优化并测试程序,以提升其质量与性能. 第五十四条 ...

  4. 编写高质量的Python代码系列(一)之用Pythonic方式来思考

    Python开发者用Pythonic这个形容词来描述具有特定风格的代码.这种风格是大家在使用Python语言进行编程并相互协作的过程中逐渐形成的习惯.那么,如何以改风格完成常见的Python编程工作呢 ...

  5. nodejs 从helloworld到高质量的后台服务server的一点思考

    ---恢复内容开始--- 新公司用的nodejs作为app和网站的后台服务server,所以最近对nodejs一直在学习,加上之前简单的学习了一点,看了两天后台接口源码,所以就直接上手干活了,下面是我 ...

  6. 编写高质量的Python代码系列(七)之协作开发

    如果多个人要开发同一个Python程序,那就得仔细商量代码的写法了.即使你是一个人开发,也需要理解其他人所写的模块.本节讲解多人协作开发Python程序时所用的标准工具及最佳做法. 第四十九条:为每个 ...

  7. 编写高质量的Python代码系列(六)之内置模块

    Python预装了许多写程序时会用到的重要模块.这些标准软件包与通常意义上的Python语言联系得非常精密,我们可以将其当成语言规范的一部分.本节将会讲解基本的内置模块. 第四十二条:用functoo ...

  8. 编写高质量的Python代码系列(五)之并发与并行

    用Python可以很容易就能写出并发程序,这种程序可以在同一时间做许多间不同的事情.我们也可以通过系统调用.子进程(subprocess)及C语言扩展来实现并行处理. 第三十六条: 用subproce ...

  9. 编写高质量的Python代码系列(四)之元类及属性

    元类(metaclass)及动态属性(dynamic attribute)都是很强大的Python特性,然后他们也可能导致及其古怪.及其突然的行为.本节讲解这些机制的常见用法,以确保各位程序员写出来的 ...

  10. 编写高质量的Python代码系列(三)之类与继承

    用Python进行编程时,通常需要编写心累,并定义这些类应该如何通过其接口及继承体系与外界交互.本节讲解如何使用类和继承来表达对象所以更具备的行为. 第二十二条:尽量用辅助类来维护程序的状态,而不要用 ...

随机推荐

  1. 知识图谱顶会论文(KDD-2022) kgTransformer:复杂逻辑查询的预训练知识图谱Transformer

    论文标题:Mask and Reason: Pre-Training Knowledge Graph Transformers for Complex Logical Queries 论文地址: ht ...

  2. LcdTools如何实现PX01读取SD中BIN文件并通过端口发出去

    在实际应用中我们会碰到需要下载很大容量固件,比如TP固件几百K大小BIN文件,这种情况下用LcdTools写初始化代码的方式实现就不大现实:此时我们可以通过PX01 SD来实现. 首先,把需要操作的B ...

  3. vue3渲染函数(h函数)的变化

    vue3 渲染函数(h函数)的更改 h函数的更改总结 1==>h 现在全局导入,而不是作为参数传递给渲染函数 2==>渲染函数参数更改为在有状态组件和函数组件之间更加一致 3==>v ...

  4. 驱动开发:内核监控Register注册表回调

    在笔者前一篇文章<驱动开发:内核枚举Registry注册表回调>中实现了对注册表的枚举,本章将实现对注册表的监控,不同于32位系统在64位系统中,微软为我们提供了两个针对注册表的专用内核监 ...

  5. 浅入浅出 1.7和1.8的 HashMap

    前言 HashMap 是我们最最最常用的东西了,它就是我们在大学中学习数据结构的时候,学到的哈希表这种数据结构.面试中,HashMap 的问题也是常客,现在卷到必须答出来了,是必须会的知识. 我在学习 ...

  6. [Android开发学iOS系列] Auto Layout

    [Android开发学iOS系列] Auto Layout 内容: 介绍什么是Auto Layout. 基本使用方法 在代码中写约束的方法 Auto Layout的原理 尺寸和优先级 Auto Lay ...

  7. 学习ASP.NET Core Blazor编程系列十——路由(上)

    学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...

  8. 【实操日记】使用 PyQt5 设计下载远程服务器日志文件程序

    最近通过 PyQt5 设计了一个下载服务器指定日期日志文件的程序,里面有些有意思的技术点,现在做一些分享. PyQt5 是一套 Python 绑定 Digia Qt5 应用的框架,是最强大的 GUI ...

  9. Huawei OJ 题解 - 31. 整数拆分 - Go 参考解答

    ## 简介- 详情:http://oj.rnd.huawei.com/problems/31/details- 难度:简单## 思路TODO## 用例TODO## 解答```gopackage mai ...

  10. 带你从入门到精通学习WireShark

    个人名片: 因为云计算成为了监控工程师‍ 个人博客:念舒_C.ying CSDN主页️:念舒_C.ying 带你从入门到精通学习WireShark 一.什么是WireShark? 二.WireShar ...