ThinkPhp知识大全(非常详细)

php框架    发瑞

一、真实项目开发步骤:

  1. 多人同时开发项目,协作开发项目、分工合理、效率有提高(代码风格不一样、分工不好)
  2. 测试阶段
  3. 上线运行
  4. 对项目进行维护、修改、升级(单个人维护项目,十分困难,代码风格不一样)
  5. 项目稳定的运行阶段
  6. 项目停止运行(旧项目的人员已经全部离职,新人开发新项目)

 

二、问题:

1. 多人开发项目,分工不合理,(html   php   mysql)

2. 代码风格不一样,后期维护十分困难

3. 项目生命周期十分短,项目生命没有延续性,造成资源浪费、人员浪费

4. 项目不能很好适应客户需求,牵一发而动全身。

 

三、其他相关框架

1. zendframework   zend php语言公司发布的官方框架,重量级(功能多)

2. yii   美国华人开发的框架,xue qiang, qiang,  重量级框架,纯OOP框架

3. CI  CodeIgniter轻量级框架,开发速度快,部署灵活

  1. cakephp外国框架,重量级,速度慢
  2. symfony外国重量级框架
  3. ThinkPHP轻量级框架,国人框架,入门容易

 

四、什么框架:

       一堆代码的集合,里边有变量、函数、类、常量,里边也有许多设计模式MVC、AR数据库、单例等等。

       框架可以节省我们50-60%的工作量,我们全部精力都集中在业务层次。

 

五、为什么使用框架

(1)框架可以帮组我们快速、稳定、高效搭建程序系统

(2)该系统由于框架的使用使得本身的维护性、灵活性、适应客户需求方面得到最大化的增强。

(3)使用框架的过程中可以使得我们的注意力全部集中业务层面,而无需关心程序的底层架构。

 

【使用框架】

thinkphp.cn

 

thinkphp 3.2版本

 

【框架项目部署】

部署一个Shop项目,使用tp框架

步骤:

创建入口文件:

  1.在ThinkPHP目录下创建一个入口文件index.php

       

  2.访问入口文件的同时系统会自动把对应的应用目录文件Shop创建出来

   

  3.打开Home文件夹

   

【MVC模式】

M:Model 数据模型层,负责数据操作

V:View 视图层,负责显示视图

C:Controller 控制器,实现业务逻辑

 

 

【控制器访问及路由解析】

通过url地址get参数找到指定的控制器,并进行对应方法调用请求

http://网址/index.php?m=模块名称&c=控制器&a=方法

以上url地址信息代码不够优雅、不安全。

 

tp框架url地址可以由以下四种

  1. http://网址/index.php?m=XX&c=XX&a=XX   基本get模式
  2. http://网址/index.php/模块/控制器/操作方法路径模式pathinfo
  3. http://网址/模块/控制器/操作方法           rewrite重写模式
  4. http://网址/index.php?s=/模块/控制器/方法兼容模式

 

具体url地址模式设置(配置文件ThinkPHP/Conf/convertion.php)

URL_MODEL  =  0/1/2/3  分别代表四种url地址模式

 

config.php是我们当前自己项目的配置文件,我们可以通过修改该文件达到配置变量的目录

这个文件在系统运行过程中会覆盖convertion.php的配置变量

include “convertion.php”;

include “config.php”;  后引入的文件要把先引入的文件配置变量给覆盖掉

 

我们系统有兼容4中url地址模式的使用

系统有的时候会自动创建url地址,它会根据当前模式进行url地址创建使用

快捷函数U();  创建url地址

  

通过url地址模式我们学习到了以下内容:

  1. 我们学习到了配置变量(核心配置变量conversion.php、当前应用配置变量config.php)
  2. 快捷函数U(“模块/控制器/方法”)  根据参数和url模式创建对应的url地址
  3. 把框架的模式调整为开发调试模式

 

【开发、生产模式】

开发调试模式:系统需要加载大概24个文件  index.php  define(“APP_DEBUG”,true);

生产模式:系统只需要加载很少的大概7个文件在入口文件

index.php中定义: define(“APP_DEBUG”,false);

节省了许多文件的开发、关闭的系统开销,节省资源

 

 

要在页面显示trace信息,需要在自己的配置文件中:

 

【控制器和对应方法创建】

控制器是MVC模式中的核心,tp默认有一个Index控制器:

 

Index控制器里面有一个操作方法:Index

 

我们在访问http://localhost:8080/Thinkphp/index.php入口文件的时候,会默认访问Index控制器下面的Index方法

 

如果要自己创建一个控制器Login:

  1.在\Shop\Home\Controller文件夹下新建一个控制器文件LoginController.class.php

注意:文件命名规则,按照驼峰法命名

 

  2.打开该文件,在里面造控制器Login类

 

  3.如果要自定义操作方法,在控制器Login类里面加一个函数Login():

 

这样我们就完成了控制器和操作方法的建立,如果要访问我们刚才的Login控制器下的Login方法:

 

  4.控制器中如果要调用视图层中的模板:

 

 

这样再次访问,会发现报错:

 

 

原因:模板文件没有创建,这时候我们就要去创建模板文件

 

【视图模板文件创建】

视图模板文件存放发位置在:

 

 

里面没有模板文件

如果我们想要访问Login控制器中的Login方法,首先我们要创建一个Login控制器对应的模板文件夹,该文件夹就对应着Login控制器:

 

 

然后在Login文件夹下再创建一个login.html的模板文件来对应Login控制器下的Login方法:

 

 

在login.html里面写入要显示的代码:

 

 

然后再次请求:

 

【url地址大小写设置】

默认是不敏感的:

在config.php里边对url大小写敏感进行设置

 

 

【空操作和空控制器处理】

空操作:就没有指定的操作方法

空控制器:没有指定控制器

http://网址/index.php/Home/User/login

http://网址/index.php/Home/User/hello空操作

http://网址/index.php/Home/beijing/login   空控制器

空操作:

 

 

一般网站处于安全考虑不给用户提示任何错误信息

       “空操作”本质意思:一个对象(控制器)调用本身不存在的方法

       在OOP里边,对象调用本身不存在方法,处于用户体验比较好的角度考虑,我们可以在类里边制作一个魔术方法:function __call();

 

在tp里面控制器的父类:

 

 

父类中有个方法:

 

 

所以空操作有两种解决方案:

①     在对应的控制器里边制作一个方法,名称为”_empty”,这个控制器的空操作都会自动执行该方法。(推荐使用)

②     给空操作的名称制作一个同名的模板出来,系统会自动调用

 

空控制器:

 

 

空控制器:在实例化控制器对象的时候,没有找到指定的类

什么时候实例化控制器对象:ThinkPHP/Library/Think/App.class.php

熟记文件:

              index.php  入口文件

              ThinkPHP/ThinkPHP.php  框架核心文件

              ThinkPHP/Library/Think/Think.class.php  框架核心文件

              ThinkPHP/Library/Think/App.class.php  框架应用文件

在App.class.php内部包括控制器对象创建,以及对象调用指定的方法呈现内容:

 

 

空控制器处理方案:可以再制作一个控制器,名称EmptyController.class.php

在该控制器内部其实只需要制作一个_empty()方法即可。

 

这样再次请求:

 

【项目分组】

系统有前台用户操作界面

系统还有后台供公司内部人员使用维护平台

两者在使用的过程中就是对“控制器”、“视图模板”、“model模型”的操作。

为了系统开发方便,及代码部署更加合理,我们的控制器、view视图等前后台文件不要混在起,要在物理结构上给分开

 

http://网址/index.php/Home/控制器/操作方法访问Home控制器及制定操作

http://网址/index.php/Admin/控制器/操作方法访问Admin分组的控制器和操作方法

 

【系统常量信息】

获取系统常量信息:

 

如果加参数true,会分组显示:

 

【跨控制器调用】

一个控制器在执行的时候,可以实例化另外一个控制,并通过对象访问其指定方法。

跨控制器调用可以节省我们代码的工作量

在Main控制器中有一个Info操作方法

 

 

 

想要在其它控制器,比如Login中调用,我们可以实例化控制器对象,调用里面的方法即可:

 

 

 

造对象有快捷函数供我们使用:

A(“[模块/]控制器标志”) 实例化控制器对象

 

 

R([模块/]控制器标志/操作方法)  实例化对象同时调用指定方法

 

【连接数据库配置及Model数据模型层】

convertion.php

config.php

  1.在config.php做数据库连接配置

 

  2.制作model模型

a)         model本身就是一个类文件

b)        数据库中的每个数据表都对应一个model模型文件

c)         最简单的数据model模型类

 

  3.字段缓存设置

tp框架执行过程中会使用到数据表中的字段信息,通过sql语句可以查询”show colums from table”,处于性能考虑,可以把字段缓存,避免每次重复执行sql语句。

  4.可以根据情况对当前的model模型进行个性化设置

 

 

实例化Model的三种方式:

  1. $goods =  new  命名空间GoodsModel(); 
  2. $goods = D(‘模型标志’);   

a)         $goods = D(“Goods”);

b)        该$goods是父类Model的对象,但是操作的数据表还是sw_goods

c)         $obj = D();  实例化Model对象,没有具体操作数据表,与M()方法效果一致

  1. $obj = M();

a)         实例化父类Model

b)        可以直接调用父类Model里边的属性,获得数据库相关操作

c)         自定义model就是一个空壳,没有必要实例化自定义model

d)        $obj = M(‘数据表标志’);  实例化Model对象,实际操作具体的数据表

$obj = D(标志);

$obj = D();

$obj = M(标志);

$obj = M();

D()和M()方法的区别:

前者是tp3.1.3里边对new操作的简化方法;

后者在使用就是实例化Model父类

       两者都在函数库文件定义ThinkPHP/Common/functions.php

 

注意:如果没有对应的model模型文件类,也可以直接实例化model对象进行操作

D()和M()方法都可以实例化操作一个没有具体model模型类文件的数据表。

【数据查询】

select()是数据模型的一个指定方法,可以获得数据表的数据信息

       返回一个二维数组信息,当前数据表的全部数据信息

$obj = D();  创建对象

$obj -> select();  查询数据

select  字段,字段  from  表名  where 条件  group 字段 having  条件   order 排序  limit 限制条数;

SELECT%DISTINCT%%FIELD%FROM %TABLE%%JOIN%%WHERE%%GROUP%%HAVING%%ORDER%%LIMIT% %UNION%%COMMENT%

 

$obj ->field(字段,字段);  查询指定字段

$obj ->table(数据表);   设置具体操作数据表

$obj ->where(参数);   参数就是正常sql语句where后边的条件信息

例如:( “goods_price >100 and  goods_name like ‘三%’”)

$obj ->group(字段);  根据字段进行分组查询

$obj ->having(参数条件);  having 条件设置

$obj ->order(‘price  desc/asc’)  排序查询

$obj ->limit([偏移量,]条数)  限制查询的条数

 

sql语句里边具体的条件设置在tp框架model模型里边体现为具体的方法操作

 

以上方法理论上是父类Model的对应方法

父类model具体存在方法:field()  where()   limit()

还有一些方法在__call()自动调用函数里边: table()  group()  order()  having()

       在__call()魔术方法里边会判断当前的执行方法是否是一个method属性的元素信息,如果存在就会执行执行。

 

以上多个方法是同时使用多个进行条件显示(并且没有顺序要求)

$obj -> limit(5)->field(‘id,name’)->order(‘price asc’) -> table(‘sw_goods’)->select();

以上许多方法执行没有顺序要求,许多方法执行后都是把具体的参数赋予到model属性options里边,最后根据options拼装sql语句。

 

 

$info = $goods -> where()->field(字段)->select();

select()方法

1.    返回一个二维数组信息

2.    返回全部数据表信息

3.    给该方法传递参数

a)         select(30)  查询主键值等于30的记录信息

b)        select(“10,12,14”)  查询主键值在10、12、14范围的记录信息

4.find()如果我们查询的结果只有一个信息,使用select()会返回一个二维数组

为了使用方便我们会希望返回一个一维数组,这时候可使用find()方法

 

5.having()方法设置查询条件,where()设置查询条件

6. 相关聚合函数 count()  sum()   avg()   max()   min()

       以上聚合函数是最后被调用的方法

       以上方法可以结合具体条件方法使用

       例如:$goods -> where(‘goods_price >1000’)->count(); 大于1000元的商品的总数目

 

【数据添加】

add()该方法返回被添加的新记录的主键id值

两种方式实现数据添加

1.数组方式数据添加

$goods = D(“Goods”);

$arr = array(‘goods_name’=>’iphone5s’,’goods_weight’=>’109’);

//注意:goods_name和goods_weight是数据表中字段名称

$goods -> add($arr);

 

2.AR方式实现数据添加

a)         ActiveRecord  活跃记录

b)        AR规定了程序与数据库之间的关系

c)         什么是AR:

d)        ①一个数据表对应一个类model

e)         ②一条数据记录对应类的一个对象

f)         ③每个字段对应该对象的具体属性

g)        tp框架的AR是假的

$goods = D(“Goods”);

$goods -> goods_name = “htc_one”;

$goods -> goods_price = 3000;

$goods -> add();

以上两种方式:数组、AR,最后add都要把新记录的主键id值返回

 

【收集表单数据入库操作】

  1. 制作一个表单
  2. 通过$_POST收集信息
  3. 通过create()方法实现数据收集,该方法对于非法的字段会自动进行过滤

注意:一个add控制器实现两个逻辑,一个是打出添加页面,一个是向数据库添加内容

 

 

注意:如果是主键值重复,这种错误会导致error()方法不跳转页面直接抛出错误信息,这是新版本问题,如果想要跳转,找到

 

 

【数据修改操作】

save()  实现数据修改,返回受影响的记录条数

具体有两种方式实现数据修改,与添加类似(数组、AR方式)

  1.数组方式

a)         $goods = D(“Goods”);

b)        $ar = array(‘goods_id’=>100,‘goods_name’=>’lenovo手机’,’goods_price’=>1200);

c)         $goods ->where(‘goods_id>50’)-> save($ar);

  2.AR方式

a)         $goods = D(“Goods”);

b)        $goods -> goods_id = 53;

c)         $goods -> goods_name = “三星手机”;

d)        $goods -> goods_price = 2000;

e)         $goods ->where(‘goods_price>10000’)->save();

以上两种方式如果可行,即要修改全部数据

以上sql语句从技术上可行,从业务上不可行(事故)

tp框架有智能考虑,以上情况的sql语句不被允许执行。

如何执行:

①     明确告诉系统那条sql语句被update更新

②     可以设置where进行sql语句更新操作

 

save()  方法返回值

0:之前没有问题,执行前后数据没有变化

自然数:受影响的记录条数

false:执行失败

 

数据修改具体实现:

通过路由给一个操作方法传递参数

http://网址/index.php/模块/控制器/方法upd/变量名1/值/变量名2/值/变量名3/值

以上路由是通过get形式给指定的操作传递了三个参数信息

$_POST方式也可以

原则三个参数信息接收的时候通过$_GET接收即可

例如:$_GET[‘变量名1’];

 

以上参数信息接收太直白,不安全,需要按照框架规则使用下边的方式接收get参数信息

http://网址/index.php/Admin/Goods/upd/name/tom/age/25/addr/beijing

function upd($name,$age,$addr){

       $name;

       $age;

       $addr;

}

以上参数表述,如果在请求的时候没有按照规则传递参数,那么当前方法禁止访问。

(除非参数有默认值)

 

修改商品信息步骤:

  1. 在“修改”按钮处把被修改商品id信息通过get形式传递给upd操作
  2. 在upd方法里边制作形式参数$goods_id,接收服务器给传递的get变量goods_id
  3. 在修改表单里边制作隐藏域goods_id,避免tp框架禁止修改语句执行
  4. 在upd操作方法内部有两个逻辑:展现表单、收集表单

 

 

【数据删除及执行原生sql语句】

delete()返回受影响的记录条数

$goods -> delete(30);   删除主键值等于30的记录信息

$goods -> delete(“10,12,13”);   删除主键值等于10 12 13的三条记录

$goods -> where(“goods_id>60”)->delete()   把符合条件的记录都给删除

 

 

执行原生sql语句

  1. 查询语句query()  返回一个二维数组信息
  2. 添加、修改、删除 execute()  返回受影响的记录条数

$goods = D(“Goods”);

$sql = “select * from sw_goods”;

$rst = $goods ->query($sql);

 

$sql = “select goods_category_id,avg(goods_price) from sw_goods group by goods_category_id having  avg(goods_price)>1000”;

$goods ->query($sql);

 

$sql = “update sw_goods set goods_name = ‘htc_two’ where goods_id=100”;

$goods ->execute($sql);

 

【表单验证】

javascript

jquery 

在服务器端通过tp框架实现表单验证

用户名、密码、重复密码、邮箱、qq、手机号码、爱好、学历

具体步骤:

  1. 制作表单
  2. 表单form数据通过create()方法收集(验证功能要求我们必须通过create()方法收集数据)
  3. 自定义数据model模型类实现具体验证规则

 

 

 

【tp框架验证码支持使用】

ThinkPHP/Library/Think/Verify.class.php

$verify = new 命名空间Verify();

$verify -> entry();  生成一个验证码

 

一个单独的方法生成验证码

 

 

在模板使用:

 

 

验证是否成功:

 

 

【Session和Cookie】

tp框架关于session操作(cookie)

//session(name,value, 有效时间)  设置session

//session(name)  获取session

//session(name,null)  删除指定session

//session(null)  清空全部session

 

【tp框架实现数据分页】

  1.我们第三方类库放的位置:

当前模块(Home)目录下,模块中的类库命名空间的根都是以模块名命名

ThinkPHP/Library/目录下,根命名空间为ThinkPHP/Library

  2.ThinkPHP/Library/Think/下面有很多类库供我们使用

  3.类的命名规则:要有命名空间,类文件名 Page.class.php

 

  4.在控制器中实例化分页类使用:

 

模板页面:

 

 

【tp框架扩展函数库】

三个位置:

  1. ThinkPHP/Common/functions.php
  2. 应用/Common/Common/function.php
  3. 模块/Common/function.php

在该文件里面写自定义方法即可

 

【tp框架文件上传中文乱码问题】

在windows操作系统下:

在ThinkPHP/Library/Think/Upload/Driver/Local.class.php

第83行将$filename 改为iconv('utf-8','gb2312',$filename)

转载于:https://www.cnblogs.com/cyrfr/p/6530447.html

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

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

相关文章

盘点2019年336起机器人及相关领域投融资事件!注重细分领域深耕行业复苏趋势显现...

来源:机器人大讲堂2019年的投资就像是随着季节气候变化的,现在到了冬季,或许有些人等不到明年春天的回暖,但终究春天还是会来。机器人是继互联网热潮逐渐褪去后,投资人寻找到的新投资项目,科创板使得机器人…

项目管理论坛_【项目管理论坛】 第15期:如何做一名优秀的项目经理

点击上方蓝字关注中铁大桥局五公司企业是个人成长的平台,个人是企业发展的力量。心在一起,力出一孔。根据公司全年生产经营的“路线图”和“时间表”,围绕今年的任务目标,展开思考讨论,凝聚全员智慧,共同探…

单行文本与多行文本省略文本

一、单行文本省略 1.text-overflow:ellipsis;该属性用于当文本溢出的时候用省略号的方式显示。它还有一个属性值是clip(溢出部分直接裁剪掉)。 2.overflow:hidden;对溢出内容进行隐藏。 3.white-space:nowrap;强制在一行显示 二、多行文本省略 用-webkit…

推荐系统技术演进趋势:召回-排序-重排

来源:DataFunTalk导读:推荐系统技术,总体而言,与 NLP 和图像领域比,发展速度不算太快。不过最近两年,由于深度学习等一些新技术的引入,总体还是表现出了一些比较明显的技术发展趋势。这篇文章试…

ansbile简单应用

一、简介 Ansible is a radically simple configuration-management, application deployment, task-execution, and multinode orchestration engine. Design Principles Have a dead simple setup process and a minimal learning curve Be super fast & parallel by def…

世界上最顶尖的技术都在哪些国家?

文章来源:深度无聊半导体加工设备基本被日本,美国霸占。目前蚀刻设备精度最高的是日立。比如东丽,帝人的炭纤维,超高精密仪器,数控机床,光栅刻画机(这个最牛的也是日立,刻画精度达到…

Spring Boot Learning(模版引擎)

一. spring boot的web应用开发,是基于spring mvc 二. Spring boot 在spring默认基础上,自动配置添加了以下特性:1. 包含了ContentNegotiatingViewResolver和BeanNameViewResolver beans。2. 对静态资源的支持&#xff…

重磅!阿里达摩院发布《2020十大科技趋势》

来源:雷锋网2019年,是新兴科技发展史上的重要年份。 这一年,各大公司的AI、云计算、大数据走向下沉市场,空中博弈进入到地面作战,技术的商业化成为生意成败的重要考量。其间,产业与场景成为大漏斗&#xff…

下一个10年,可能改变世界的5项重大发现!真正革命性的进步

来源:博科园在过去的十年里,科学上出现了一些真正革命性的进步,从发现希格斯玻色子到使用CRISPR进行科幻风格的基因编辑。但是,还有哪些更大的突破还在后面呢?《Live Science》采访了所在领域的几位专家,他…

“不确定性问题”(Nondeterministic Problem,NP)与哥德尔不完全定理“

来源:柳渝科学网博客1931年哥德尔证明:任何无矛盾的公理体系,只要包含初等算术的陈述,则必定存在一个不可判定命题,用这组公理不能判定其真假。虽然哥德尔不完全定理只是针对包含数论的公理体系而言的,由于…

深度学习不能取代计算机视觉技术背后的真正原因

来源:电子发烧友深度学习只是一种计算机视觉工具,而不是包治百病的良药,不要因为流行就一味地使用它。传统的计算机视觉技术仍然可以大显身手,了解它们可以为你省去很多的时间和烦恼;并且掌握传统计算机视觉确实可以让…

win10控制面板快捷键_你没玩过的全新版本Win10,这些操作你知多少?

不知不觉,Windows 10与我们相伴已经整整四个年头了,从最开始的组团抗拒到现在的默默接受,个中滋味相信谁心里都有个数。近日微软开始推送“Win10更新五月版”,那么Win10中到底都有哪些“骚”操作?一起来看看吧。1、夜间…

1.编写登录接口

需求:.编写登录接口输入用户名密码认证成功后显示欢迎信息输错三次后锁定 # Author rendeleiwhile True: list1 [] list2 [] count int(3) f open("login.txt",‘w’) for line in f: hostname str(line.split(\t)…

吴恩达邀请9位AI大牛畅想2020:李开复看好医疗教育,LeCun强调自监督学习

来源:凹非寺2020,AI的研究会有哪些突破?2020,AI的应用又会有什么变化?吴恩达DeepLearning.ai旗下的THE BATCH刊物,分享了包括Yann LeCun、李开复、周志华、还有他们的老板吴恩达在内的10位AI大佬的新年寄语…

R pdf大小_限时免费获取 Mac上PDF压缩工具《Enolsoft PDF Compressor》

文章末尾有获取方式,按照以下步骤就能得到。我们不破解软件,所有优秀软件均来源于网络你的pdf文件太大使用不方便吗?赶紧来试试专业PDF压缩工具Enolsoft PDF Compressor破解版吧!可以快速的压缩PDF文件的大小,支持批量…

未来十年有望改变世界的五大发现

来源:科技日报 浮云一别后,流水十年间!21世纪第二个十年已悄然离开。过去十年,不少革命性突破和发现给人类生活和认知带来重大变革:希格斯玻色子填补了“标准模型”最后一块拼图,深化了人类对物质本质的理解…

fceux模拟器linux,FCEUX模拟器

FCEUX模拟器是一款游戏模拟器,可以用于FC/NES模拟器的游戏模拟,在模拟器中玩家可以游玩到那些经典的FC游戏,也就是我们所说的那些红白机游戏,比如经典的魂斗罗、超级马里奥等等,让你回到过去,回温这些经典的…

el-table 树形表格 自定义展开图标_Image2icon for Mac(icon图标设计软件)

image2icon mac破解版是运行在Mac OS平台上的专业图标制作工具,用它可以创建你自己的Mac图标,并自定义文件和文件夹的icon图标。image2icon mac功能介绍轻松创建图标 厌倦了你的标准mac图标?您想个性化您的文件或文件夹吗?Image2i…

科技创新2030“新一代人工智能”重大项目2020年度第一批项目申报指南建议征求意见稿...

来源:锐动源编辑部设计:种 瑞审核:李建荣根据《国务院关于改进加强中央财政科研项目和资金管理的若干意见》(国发〔2014〕11号)、《国务院关于深化中央财政科技计划(专项、基金等)管理改革方案…

同时多个axios请求_用 React+Antd 封装 Axios 实现全局 Loading 效果

前言今天在做 react 后台管理的时候要实现一个全局 Loading 效果,通常使用 axios 库与后端进行数据交互。为了更好的用户体验,在每次请求前添加一个加载效果,让用户知道在等待加载。要实现这个功能,我们可以在每个组件请求手动添加…