其他章节请看:

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. uoj348【WC2018】州区划分

    题目链接 直接讲吨吨吨给的标准做法吧.记\(f(i,j)\)表示各个州(可以重叠)的城市数量之和为i,这些州的并集为j的方案数,反正若有两个州之间有交集最后的\(|j|\)会不等于\(i\).有 \( ...

  2. springboot+thymeleaf中前台页面展示中、将不同的数字替换成不同的字符串。使用条件运算符

    主要用到的知识就是thyme leaf中的条件运算符 表达式:(condition)?:then:else 当条件condition成立时返回then.否则返回else 具体代码:<td th: ...

  3. 22.通用视图GenericAPIView、属性和方法

    generics.ListCreateAPIView #源码 class ListCreateAPIView(mixins.ListModelMixin, mixins.CreateModelMixi ...

  4. Sql Server 数据库分页存储过程书写

    create proc 存储过程名称( @page int, //pageindex @rows int, //pagesize @rowCount int out)as begin--定义字符串变量 ...

  5. nginx.conf指令注释

    nginx.conf指令注释 ######Nginx配置文件nginx.conf中文详解##### #定义Nginx运行的用户和用户组 user www www; #nginx进程数,建议设置为等于C ...

  6. 畅联新设备接入情况:新增威隆NB烟感

    双美接入,应该是电信AEP平台的. ---------------------------------------------------------------------------------- ...

  7. Linux环境下执行脚本重启Weblogic控制台中部署的应用程序

    之前有写过一篇博文介绍切换登录方式的脚本,脚本中存在一个缺点:仍需手动去Weblogic控制台重启应用程序:本文即介绍如何在脚本中更新Weblogic控制台中部署的应用程序. 一.配置Weblogic ...

  8. 从0搭建vue3组件库: Input组件

    本篇文章将为我们的组件库添加一个新成员:Input组件.其中Input组件要实现的功能有: 基础用法 禁用状态 尺寸大小 输入长度 可清空 密码框 带Icon的输入框 文本域 自适应文本高度的文本域 ...

  9. Redis Cluster 数据分片

    介绍 Redis Cluster Redis 集群是 Redis 提供的分布式数据库方案, 集群通过分片(sharding) 来进行数据共享, 并提供复制和故障转移功能. 节点 一个 Redis 集群 ...

  10. hutool包的DateUtil工具类

    [首先引入依赖 ] <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-core& ...