diff --git a/README.md b/README.md index b7a5cd7..c7b4bce 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@

- Downloads + Downloads Build Status Build Status - Coverage Status - Downloads + Coverage Status + Downloads Downloads diff --git a/config/router.config.js b/config/router.config.js index e8d1306..e62c8e2 100644 --- a/config/router.config.js +++ b/config/router.config.js @@ -64,7 +64,7 @@ export default [ component: './Account/Settings/NotificationView', }, ], - } + }, ], }, { diff --git a/package.json b/package.json index b3e515e..44aaef5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sword", - "version": "2.5.4", + "version": "2.6.0", "description": "An out-of-box UI solution for enterprise applications", "private": true, "scripts": { @@ -60,7 +60,8 @@ "react-media": "^1.9.2", "react-router-dom": "^4.3.1", "roadhog-api-doc": "^1.1.2", - "js-base64": "^2.5.1" + "js-base64": "^2.5.1", + "umi": "^2.4.4" }, "devDependencies": { "@types/react": "^16.8.1", diff --git a/src/pages/Dashboard/Workplace.js b/src/pages/Dashboard/Workplace.js index a62290b..c4281d2 100644 --- a/src/pages/Dashboard/Workplace.js +++ b/src/pages/Dashboard/Workplace.js @@ -1,12 +1,11 @@ import React, { PureComponent } from 'react'; -import { Card, Col, Collapse, Row } from 'antd'; +import { Card, Col, Collapse, Row, Divider, Tag } from 'antd'; import styles from '../../layouts/Sword.less'; import PageHeaderWrapper from '@/components/PageHeaderWrapper'; const { Panel } = Collapse; - class Workplace extends PureComponent { render() { return ( @@ -15,14 +14,14 @@ class Workplace extends PureComponent {

- Downloads + Downloads Build Status Coverage Status Downloads @@ -40,9 +39,11 @@ class Workplace extends PureComponent {
- - - + + + + +
1.Sword是SpringBlade前端UI系统
2.对现有的ant design pro库进行二次封装
@@ -56,168 +57,295 @@ class Workplace extends PureComponent {
3.基于稳定生产的商业项目升级优化而来,更加贴近企业级的需求
4.追求企业开发更加高效,部署更加方便,生产更加稳定
5.GVP-码云最有价值开源项目
-
6.BladeX授权地址:点击授权
+
+ 6.BladeX授权地址:点击授权 +
1.经历过较长的线上生产,积累了很多企业痛点的解决方案。
2.一套代码兼容MySql、Oracle、PostgreSQL,适应企业各种不同场景的需求。
-
3.集成了很多企业急切所需的例如多租户、Oauth2授权认证、工作流、分布式事务等等功能。
-
4.深度定制了Flowable工作流,完美支持SpringCloud分布式服务的场景,以远程调用的方式进行操作。
-
5.升级了核心驱动,新功能完全可以开箱即用,而开源版需要自己再花时间进行集成,需要花掉更多的时间成本。
-
6.拥抱微服务时代,很多企业由于项目转型或升级,传统的技术已然不能满足,反而会花更多成本,而BladeX就是为此而生。
-
7.同时提供SpringCloud版本和SpringBoot版本,两个版本的api可以与Sword和Saber无缝对接,为小型项目至大型项目保驾护航。
-
8.授权购买即永久,源码没有混淆,后续升级完全免费。企业只需花很少的钱即可获得一整套成熟的解决方案,你还在等什么?
+
+ 3.集成了很多企业急切所需的例如多租户、Oauth2授权认证、工作流、分布式事务等等功能。 +
+
+ 4.深度定制了Flowable工作流,完美支持SpringCloud分布式服务的场景,以远程调用的方式进行操作。 +
+
+ 5.升级了核心驱动,新功能完全可以开箱即用,而开源版需要自己再花时间进行集成,需要花掉更多的时间成本。 +
+
+ 6.拥抱微服务时代,很多企业由于项目转型或升级,传统的技术已然不能满足,反而会花更多成本,而BladeX就是为此而生。 +
+
+ 7.同时提供SpringCloud版本和SpringBoot版本,两个版本的api可以与Sword和Saber无缝对接,为小型项目至大型项目保驾护航。 +
+
+ 8.授权购买即永久,源码没有混淆,后续升级完全免费。企业只需花很少的钱即可获得一整套成熟的解决方案,你还在等什么? +
-
1.前后端分离-采用前后端分离模式,前端提供两套架构,Sword基于React,Saber基于Vue
-
2. 分布式单体式后端架构-提供两套后端架构,基于SpringCloud的分布式架构以及基于SpringBoot的单体式架构
-
3.API完全兼容-两套后端架构与两套前端架构,共四套架构可以任意组合,所有API完全兼容
-
4.前后端代码生成-定制针对两套前端与后端的代码生成模板,轻松生成整个模块的前后端代码,减少重复工作量
-
5.组件化、插件化架构-针对功能深度定制各个starter,引入开箱即用,为整个架构解耦,提升效率
+
+ 1.前后端分离-采用前后端分离模式,前端提供两套架构,Sword基于React,Saber基于Vue +
+
+ 2. + 分布式单体式后端架构-提供两套后端架构,基于SpringCloud的分布式架构以及基于SpringBoot的单体式架构 +
+
+ 3.API完全兼容-两套后端架构与两套前端架构,共四套架构可以任意组合,所有API完全兼容 +
+
+ 4.前后端代码生成-定制针对两套前端与后端的代码生成模板,轻松生成整个模块的前后端代码,减少重复工作量 +
+
+ 5.组件化、插件化架构-针对功能深度定制各个starter,引入开箱即用,为整个架构解耦,提升效率 +
6.Nacos-集成阿里巴巴的Nacos完成统一的服务注册与配置
-
7.Sentinel-集成Sentinel从流量控制、熔断降级、系统负载等多个维度保护服务的稳定性
+
+ 7.Sentinel-集成Sentinel从流量控制、熔断降级、系统负载等多个维度保护服务的稳定性 +
8.Dubbo-完美集成Dubbo最新版,支持远程RPC调用
9.多租户系统-完整的SaaS多租户架构
10.Oauth2-集成Oauth2协议,完美支持多终端的接入与认证授权
-
11.工作流-深度定制SpringCloud分布式场景的Flowable工作流,为复杂流程保驾护航。同时提供SpringBoot集成版本
+
+ 11.工作流-深度定制SpringCloud分布式场景的Flowable工作流,为复杂流程保驾护航。同时提供SpringBoot集成版本 +
12.独立流程设计器-提供独立的完全汉化的流程设计器,轻松定制流程模型
13.动态网关-集成基于Nacos的轻量级、高拓展性动态网关
14.动态聚合文档-实现基于Nacos的Swagger SpringCloud聚合文档
-
15.分布式文件服务-集成minio、qiniu、alioss等优秀的第三方,提供便捷的文件上传与管理
-
16.多租户对象存储系统-在SaaS系统中,各租户可自行配置文件上传至自己的私有OSS
+
+ 15.分布式文件服务-集成minio、qiniu、alioss等优秀的第三方,提供便捷的文件上传与管理 +
+
+ 16.多租户对象存储系统-在SaaS系统中,各租户可自行配置文件上传至自己的私有OSS +
17.权限管理-精心设计的权限管理方案,角色权限精确到按钮
-
18.动态数据权限-高度灵活的动态数据权限,提供注解+Web可视化两种配置方式,Web配置无需重启直接生效
-
19.动态接口权限-高度灵活的动态接口权限,提供注解+Web可视化两种配置方式,Web配置无需重启直接生效
-
20.多租户顶部菜单配置-提供给每个租户独立的顶部菜单配置模块,可以自定义顶部菜单切换
-
21.主流数据库兼容-一套代码完全兼容Mysql、Postgresql、Oracle三大主流数据库
+
+ 18.动态数据权限-高度灵活的动态数据权限,提供注解+Web可视化两种配置方式,Web配置无需重启直接生效 +
+
+ 19.动态接口权限-高度灵活的动态接口权限,提供注解+Web可视化两种配置方式,Web配置无需重启直接生效 +
+
+ 20.多租户顶部菜单配置-提供给每个租户独立的顶部菜单配置模块,可以自定义顶部菜单切换 +
+
+ 21.主流数据库兼容-一套代码完全兼容Mysql、Postgresql、Oracle三大主流数据库 +
22.动态网关鉴权-基于Nacos的动态网关鉴权,可在线配置,实时生效
-
23.全能代码生成器-支持自定义模型、模版 、业务建模,支持多种模板引擎,在线配置。大幅度提升开发效率,不再为重复工作发愁。
-
24.Seata分布式事务-定制集成Seata,支持分布式事务,无代码侵入,不失灵活与简洁
+
+ 23.全能代码生成器-支持自定义模型、模版 + 、业务建模,支持多种模板引擎,在线配置。大幅度提升开发效率,不再为重复工作发愁。 +
+
+ 24.Seata分布式事务-定制集成Seata,支持分布式事务,无代码侵入,不失灵活与简洁 +
25.未完待续...
1.接BladeX系列架构的定制服务
-
2.接3个月以内工期的react、vue、springboot、springcloud、app、小程序等软件定制服务
+
+ 2.接3个月以内工期的react、vue、springboot、springcloud、app、小程序等软件定制服务 +
3.有意向请联系唯一指定QQ:85088620
- - - - -
1.增加示例工程,增加多种常见场景的解决方案
-
2.增加不同包名运行的示例
-
3.增加多数据源调用运行的示例
-
4.增加自定义加载Naocs配置文件的示例
-
5.增加根据Nacos命名空间读取配置、注册服务的示例
-
6.修复Condition类没有过滤分页字段的问题
-
7.拆分CommonConstant出LauncherConstant
-
- -
1.封装集成zipkin,支持分布式链路追踪
-
2.seata升级至0.9.0,解决部分分布式事务遇到的bug
-
3.springboot版本升级至2.1.9
-
- -
1.增加个人中心,支持用户信息自定义修改
-
2.增加网关鉴权配置示例
-
3.token的SIGN_KEY修改为一致
-
4.admin模块增加对seata服务的过滤
-
5.blade-tool增加部分工具类方法
-
- -
1.增加网关动态鉴权
-
2.secure安全模块token校验默认关闭,交由网关处理
-
3.boot版本开启secure token校验功能
-
4.优化blade-gateway代码逻辑
-
5.修复blade-resource无法启动的问题
-
- -
1.封装集成seata,支持分布式事务
-
2.重写blade-core-cloud模块,增强cloud场景支持
-
3.增加hystrix自动fallback功能
-
4.升级springboot至2.1.8.RELEASE
-
5.升级springcloud至Greenwich.SR3
-
- -
1.升级SpringBoot至2.1.7
-
2.代码生成增加多数据源配置
-
3.增强代码生成功能,支持可选基础业务、包装器配置
-
4.优化代码生成模板
-
- -
1.升级AlibabaCloud毕业版本
-
2.升级支持Naocs 1.1.0、Sentinel 1.6.3
-
3.租户系统的tenantCode统一更改为tenantId
-
4.优化代码生成模板
-
5.优化mybatis-plus新版配置
-
6.修复排序字段sql注入问题
-
- -
1.重构令牌发放逻辑,可自定义令牌类型,增强可拓展性
-
2.增加动态配置token过期时间、令牌续期功能
-
3.增加GateWay动态聚合文档功能,简化配置
-
4.优化Wrapper定义,代码更加简洁
-
5.Swagger增加多包扫描
-
6.使用 Swagger-Bootstrap-UI 最新版排序注解
-
7.升级 SpringBoot 2.1.6,SpringCloud Greenwich.SR2
-
8.升级 Mybatis-Plus 3.1.2
-
9.修复排序字段可能导致的sql注入问题
-
10.修复部分缓存清除失效的问题
-
- -
1.增加七牛云oss-starter
-
2.增加blade-resource模块,对外提供服务,支持分布式下的oss场景
-
3.LauncherService增加排序功能
-
4.增加单元测试starter,可在启动过程中便捷地指定profile以及启动参数
-
5.增加指定启动参数的单元测试demo
-
6.优化docker脚本配置
-
- -
1.升级 SpringBoot 2.1.5
-
2.前端框架Saber升级 element-ui 2.8.2
-
3.Saber业务代码升级
-
4.优化Saber代码生成模板
-
5.统一日志业务表基础字段
-
6.优化租户过滤逻辑
-
7.BaseEntity放开主键限制,子类可自定义主键类型
-
8.XssFilter增加放行配置,可配置放行微信api接口
-
- -
1.升级 SpringCloud Greenwich
-
2.升级 SpringCloud Alibaba 组件版本为0.9.0.RELEASE,支持最新版本的nacos与sentinel
-
3.升级 SpringBoot 2.1.4
-
4.升级 mysql 驱动版本
-
5.优化 LauncherService 关于环境的判断逻辑
-
6.修复 blade-core-log 在部分情况下获取request为空的问题
-
7.修复多租户插件判断租户过滤的逻辑
-
8.修复请求日志打印插件部分格式空指针的问题
-
9.降低nacos心跳日志等级,关闭心跳日志显示
-
- -
1.增加多终端令牌认证系统
-
2.增加多租户开关
-
3.修复部分模块没有筛选已删除的问题
-
4.调整角色分配会越权的问题
-
5.优化部署脚本
-
- -
1.升级为SaaS多租户系统
-
2.优化代码生成逻辑
-
3.代码生成增加菜单sql
-
4.增加SysClient,提供系统信息远程调用
-
5.优化部署脚本,增加前端部署实例
-
6.增加父子角色过滤,使得角色无法越权配置
-
- -
1.SpringBlade 2.0 是由一个商业级项目升级优化而来的SpringCloud微服务架构,采用Java8 API重构了业务代码,完全遵循阿里巴巴编码规范
-
2.采用Spring Boot 2 、Spring Cloud Greenwich 、Mybatis 等核心技术,用于快速搭建企业级的微服务系统平台
-
3.SpringBlade 致力于创造新颖的开发模式,将开发中遇到的痛点、生产中所踩的坑整理归纳,并将解决方案都融合到框架中
-
-
- - - + + + + + + 产品名称 + + SpringBlade企业级微服务开发平台 + + 账号密码 + + 管理员(admin) + + 官网地址 + + + https://bladex.vip + + + 社区地址 + + + https://sns.bladex.vip + + + 获取文档 + + + + 免费版 + + + + + + 收费版 + + + + 获取源码 + + + + 开源版 + + + + + + 商业版 + + + + + + + + +
1.升级SpringCloud Hoxton.SR1
+
2.升级SpringBoot 2.2.2.RELEASE
+
3.升级Alibaba Cloud 2.1.1.RELEASE
+
4.升级Seata 1.0.0
+
5.升级Swagger-Bootstrap-UI为最新的Knife4j 2.0.1
+
6.升级Xss过滤机制以适配最新架构
+
7.升级前端请求机制以适配最新架构
+
8.修复blade-resource无法进行docker打包的问题
+
9.修复blade-demo没有配置LauncherService导致启动失败的问题
+
+ +
1.增加示例工程,增加多种常见场景的解决方案
+
2.增加不同包名运行的示例
+
3.增加多数据源调用运行的示例
+
4.增加自定义加载Naocs配置文件的示例
+
5.增加根据Nacos命名空间读取配置、注册服务的示例
+
6.修复Condition类没有过滤分页字段的问题
+
7.拆分CommonConstant出LauncherConstant
+
+ +
1.封装集成zipkin,支持分布式链路追踪
+
2.seata升级至0.9.0,解决部分分布式事务遇到的bug
+
3.springboot版本升级至2.1.9
+
+ +
1.增加个人中心,支持用户信息自定义修改
+
2.增加网关鉴权配置示例
+
3.token的SIGN_KEY修改为一致
+
4.admin模块增加对seata服务的过滤
+
5.blade-tool增加部分工具类方法
+
+ +
1.增加网关动态鉴权
+
2.secure安全模块token校验默认关闭,交由网关处理
+
3.boot版本开启secure token校验功能
+
4.优化blade-gateway代码逻辑
+
5.修复blade-resource无法启动的问题
+
+ +
1.封装集成seata,支持分布式事务
+
2.重写blade-core-cloud模块,增强cloud场景支持
+
3.增加hystrix自动fallback功能
+
4.升级springboot至2.1.8.RELEASE
+
5.升级springcloud至Greenwich.SR3
+
+ +
1.升级SpringBoot至2.1.7
+
2.代码生成增加多数据源配置
+
3.增强代码生成功能,支持可选基础业务、包装器配置
+
4.优化代码生成模板
+
+ +
1.升级AlibabaCloud毕业版本
+
2.升级支持Naocs 1.1.0、Sentinel 1.6.3
+
3.租户系统的tenantCode统一更改为tenantId
+
4.优化代码生成模板
+
5.优化mybatis-plus新版配置
+
6.修复排序字段sql注入问题
+
+ +
1.重构令牌发放逻辑,可自定义令牌类型,增强可拓展性
+
2.增加动态配置token过期时间、令牌续期功能
+
3.增加GateWay动态聚合文档功能,简化配置
+
4.优化Wrapper定义,代码更加简洁
+
5.Swagger增加多包扫描
+
6.使用 Swagger-Bootstrap-UI 最新版排序注解
+
7.升级 SpringBoot 2.1.6,SpringCloud Greenwich.SR2
+
8.升级 Mybatis-Plus 3.1.2
+
9.修复排序字段可能导致的sql注入问题
+
10.修复部分缓存清除失效的问题
+
+ +
1.增加七牛云oss-starter
+
2.增加blade-resource模块,对外提供服务,支持分布式下的oss场景
+
3.LauncherService增加排序功能
+
4.增加单元测试starter,可在启动过程中便捷地指定profile以及启动参数
+
5.增加指定启动参数的单元测试demo
+
6.优化docker脚本配置
+
+ +
1.升级 SpringBoot 2.1.5
+
2.前端框架Saber升级 element-ui 2.8.2
+
3.Saber业务代码升级
+
4.优化Saber代码生成模板
+
5.统一日志业务表基础字段
+
6.优化租户过滤逻辑
+
7.BaseEntity放开主键限制,子类可自定义主键类型
+
8.XssFilter增加放行配置,可配置放行微信api接口
+
+ +
1.升级 SpringCloud Greenwich
+
+ 2.升级 SpringCloud Alibaba + 组件版本为0.9.0.RELEASE,支持最新版本的nacos与sentinel +
+
3.升级 SpringBoot 2.1.4
+
4.升级 mysql 驱动版本
+
5.优化 LauncherService 关于环境的判断逻辑
+
6.修复 blade-core-log 在部分情况下获取request为空的问题
+
7.修复多租户插件判断租户过滤的逻辑
+
8.修复请求日志打印插件部分格式空指针的问题
+
9.降低nacos心跳日志等级,关闭心跳日志显示
+
+ +
1.增加多终端令牌认证系统
+
2.增加多租户开关
+
3.修复部分模块没有筛选已删除的问题
+
4.调整角色分配会越权的问题
+
5.优化部署脚本
+
+ +
1.升级为SaaS多租户系统
+
2.优化代码生成逻辑
+
3.代码生成增加菜单sql
+
4.增加SysClient,提供系统信息远程调用
+
5.优化部署脚本,增加前端部署实例
+
6.增加父子角色过滤,使得角色无法越权配置
+
+ +
+ 1.SpringBlade 2.0 + 是由一个商业级项目升级优化而来的SpringCloud微服务架构,采用Java8 + API重构了业务代码,完全遵循阿里巴巴编码规范 +
+
+ 2.采用Spring Boot 2 、Spring Cloud Greenwich 、Mybatis + 等核心技术,用于快速搭建企业级的微服务系统平台 +
+
+ 3.SpringBlade + 致力于创造新颖的开发模式,将开发中遇到的痛点、生产中所踩的坑整理归纳,并将解决方案都融合到框架中 +
+
+
+
+
+ + ); } diff --git a/src/pages/Login/Login.js b/src/pages/Login/Login.js index e790394..43553ea 100644 --- a/src/pages/Login/Login.js +++ b/src/pages/Login/Login.js @@ -1,7 +1,7 @@ import React, { Component } from 'react'; import { connect } from 'dva'; import { formatMessage, FormattedMessage } from 'umi/locale'; -import { Checkbox, Alert, notification, Icon } from 'antd'; +import { Checkbox, Alert } from 'antd'; import Login from '../../components/Login'; import styles from './Login.less'; import { tenantMode } from '../../defaultSettings'; @@ -18,44 +18,6 @@ class LoginPage extends Component { autoLogin: true, }; - componentWillMount() { - notification.config({ - placement: 'bottomRight', - }); - notification.destroy(); - notification.open({ - message: '手册信息', - description: ( -
-

Sword开发手册:点击查看

-

SpringBlade开发手册:点击查看

-
- ), - icon: , - duration: 0, - }); - setTimeout(() => { - notification.open({ - message: '授权信息', - description: ( -
-

欢迎使用Sword!

-

该系统可用BladeX增强开发,

-

若要商用强烈推荐高度定制的商业化框架,具体授权信息请访问如下地址。

-

- BladeX 授权地址: - - 点击授权 - -

-
- ), - icon: , - duration: 0, - }); - }, 500); - } - onTabChange = type => { this.setState({ type }); }; diff --git a/src/pages/System/Code/Code.js b/src/pages/System/Code/Code.js index 1115b35..8dfb7d3 100644 --- a/src/pages/System/Code/Code.js +++ b/src/pages/System/Code/Code.js @@ -1,6 +1,6 @@ import React, { Fragment, PureComponent } from 'react'; import { connect } from 'dva'; -import { Button, Col, Divider, Form, Input, message, Modal, Row } from "antd"; +import { Button, Col, Divider, Form, Input, message, Modal, Row } from 'antd'; import Panel from '../../../components/Panel'; import Grid from '../../../components/Sword/Grid'; import { CODE_LIST } from '../../../actions/code'; diff --git a/src/pages/System/Dept/DeptEdit.js b/src/pages/System/Dept/DeptEdit.js index 92a2994..5d52bdc 100644 --- a/src/pages/System/Dept/DeptEdit.js +++ b/src/pages/System/Dept/DeptEdit.js @@ -1,5 +1,5 @@ import React, { PureComponent } from 'react'; -import { Form, Input, Card, Row, Col, Button, InputNumber, TreeSelect, message } from "antd"; +import { Form, Input, Card, Row, Col, Button, InputNumber, TreeSelect, message } from 'antd'; import { connect } from 'dva'; import Panel from '../../../components/Panel'; import styles from '../../../layouts/Sword.less'; diff --git a/src/pages/System/Dict/DictEdit.js b/src/pages/System/Dict/DictEdit.js index 1ac24a1..ad0de35 100644 --- a/src/pages/System/Dict/DictEdit.js +++ b/src/pages/System/Dict/DictEdit.js @@ -1,5 +1,5 @@ import React, { PureComponent } from 'react'; -import { Form, Input, Card, Row, Col, Button, InputNumber, TreeSelect, message } from "antd"; +import { Form, Input, Card, Row, Col, Button, InputNumber, TreeSelect, message } from 'antd'; import { connect } from 'dva'; import Panel from '../../../components/Panel'; import styles from '../../../layouts/Sword.less'; diff --git a/src/pages/System/Role/RoleEdit.js b/src/pages/System/Role/RoleEdit.js index f931e6e..fd6e84c 100644 --- a/src/pages/System/Role/RoleEdit.js +++ b/src/pages/System/Role/RoleEdit.js @@ -1,5 +1,5 @@ import React, { PureComponent } from 'react'; -import { Form, Input, Card, Row, Col, Button, InputNumber, TreeSelect, message } from "antd"; +import { Form, Input, Card, Row, Col, Button, InputNumber, TreeSelect, message } from 'antd'; import { connect } from 'dva'; import Panel from '../../../components/Panel'; import styles from '../../../layouts/Sword.less'; diff --git a/src/utils/Func.js b/src/utils/Func.js index 7a674d9..9c427ec 100644 --- a/src/utils/Func.js +++ b/src/utils/Func.js @@ -1,4 +1,5 @@ import moment from 'moment'; +import RequestForm from '@/utils/RequestForm'; /** * 通用工具类 @@ -46,14 +47,10 @@ export default class Func { /** * Json强转为Form类型 * @param obj - * @returns {FormData} + * @returns {RequestForm} */ static toFormData(obj) { - const data = new FormData(); - Object.keys(obj).forEach(key => { - data.append(key, Array.isArray(obj[key]) ? obj[key].join(',') : obj[key]); - }); - return data; + return new RequestForm(obj); } /** diff --git a/src/utils/RequestForm.js b/src/utils/RequestForm.js new file mode 100644 index 0000000..7350802 --- /dev/null +++ b/src/utils/RequestForm.js @@ -0,0 +1,17 @@ +import { stringify } from 'qs'; + +export default class RequestForm { + constructor(params) { + const values = params; + Object.keys(params).forEach(key => { + if (Array.isArray(params[key])) { + values[key] = params[key].join(','); + } + }); + this.params = values; + } + + parse() { + return stringify(this.params); + } +} diff --git a/src/utils/request.js b/src/utils/request.js index 87ab3de..8454b3a 100644 --- a/src/utils/request.js +++ b/src/utils/request.js @@ -5,6 +5,7 @@ import hash from 'hash.js'; import { Base64 } from 'js-base64'; import { clientId, clientSecret } from '../defaultSettings'; import { getToken, removeAll } from './authority'; +import RequestForm from '@/utils/RequestForm'; const codeMessage = { 200: '服务器成功返回请求的数据。', @@ -135,13 +136,20 @@ export default function request(url, option) { newOptions.method === 'PUT' || newOptions.method === 'DELETE' ) { - if (!(newOptions.body instanceof FormData)) { + if (!(newOptions.body instanceof FormData) && !(newOptions.body instanceof RequestForm)) { newOptions.headers = { Accept: 'application/json', 'Content-Type': 'application/json;charset=utf-8', ...newOptions.headers, }; newOptions.body = JSON.stringify(newOptions.body); + } else if (newOptions.body instanceof RequestForm) { + newOptions.headers = { + Accept: 'application/json', + 'Content-Type': 'application/x-www-form-urlencoded', + ...newOptions.headers, + }; + newOptions.body = newOptions.body.parse(); } else { // newOptions.body is FormData newOptions.headers = {