From 878889816055d5595e771d4d0184ab874355a815 Mon Sep 17 00:00:00 2001 From: Francis Dong Date: Mon, 9 Nov 2020 10:11:25 +0800 Subject: [PATCH 1/4] docs: update aggregation guide --- docs/404.html | 6 +++--- docs/aggr_config_route.png | Bin 0 -> 102284 bytes .../js/{10.1253731e.js => 10.ddbb0d4d.js} | 2 +- .../js/{11.8c833bde.js => 11.93c9bc98.js} | 2 +- .../js/{12.61089982.js => 12.f815cfa2.js} | 2 +- .../js/{13.25760eda.js => 13.e5742833.js} | 2 +- .../js/{14.cc27c55a.js => 14.993243d3.js} | 2 +- .../js/{16.d04bc2ac.js => 16.5d8d970e.js} | 2 +- .../js/{17.7cec28a6.js => 17.31216161.js} | 2 +- .../js/{18.91abb322.js => 18.1301a626.js} | 2 +- .../js/{19.a05f9317.js => 19.501fe444.js} | 2 +- .../js/{20.e44fcf7d.js => 20.94c02b34.js} | 2 +- .../js/{21.8859e956.js => 21.ff5e068c.js} | 2 +- .../js/{22.69bbe610.js => 22.1f3d545e.js} | 2 +- .../js/{23.d558c8c3.js => 23.e4fc3148.js} | 2 +- .../js/{24.90d6ddb8.js => 24.7e82030a.js} | 2 +- .../js/{25.0f5aa895.js => 25.fc38ae5b.js} | 2 +- .../js/{26.48d84783.js => 26.e097ebfd.js} | 2 +- .../js/{27.b9f6747b.js => 27.06f8de31.js} | 2 +- .../js/{28.79d861a5.js => 28.9b7b0400.js} | 2 +- .../js/{29.338541e0.js => 29.214a2702.js} | 2 +- .../js/{30.37a581ce.js => 30.0222f21c.js} | 2 +- .../assets/js/{6.ee90ff38.js => 6.b5dc0bcc.js} | 2 +- .../assets/js/{7.e3b70354.js => 7.c27e364c.js} | 2 +- .../assets/js/{8.834b8e71.js => 8.99888a6b.js} | 2 +- .../assets/js/{9.5f299cef.js => 9.3d56fa0d.js} | 2 +- .../js/{app.bf39d9b6.js => app.41e48030.js} | 4 ++-- docs/guide/admin/index.html | 6 +++--- docs/guide/aggregate/configuration.html | 8 ++++---- docs/guide/aggregate/index.html | 6 +++--- docs/guide/aggregate/overview.html | 6 +++--- docs/guide/benchmark/index.html | 6 +++--- docs/guide/index.html | 6 +++--- docs/guide/installation/index.html | 6 +++--- docs/guide/intro/index.html | 6 +++--- docs/guide/manager/manager_aggregate.html | 6 +++--- .../manager/manager_aggregate_approve.html | 6 +++--- .../manager_aggregate_approve_op_log.html | 6 +++--- .../manager/manager_aggregate_my_apply.html | 6 +++--- .../manager/manager_aggregate_op_log.html | 6 +++--- docs/guide/manager/manager_api_auth.html | 6 +++--- docs/guide/manager/manager_app_id.html | 6 +++--- .../manager_gateway_aggregate_cache.html | 6 +++--- docs/guide/manager/manager_gateway_group.html | 6 +++--- docs/guide/manager/manager_overview.html | 6 +++--- docs/guide/manager/manager_plugin.html | 6 +++--- docs/guide/manager/manager_role.html | 6 +++--- docs/guide/manager/manager_service.html | 6 +++--- .../manager/manager_source_statistics.html | 6 +++--- docs/guide/manager/manager_user.html | 6 +++--- docs/guide/plugin/index.html | 6 +++--- docs/guide/proxy/index.html | 6 +++--- docs/index.html | 4 ++-- 53 files changed, 107 insertions(+), 107 deletions(-) create mode 100644 docs/aggr_config_route.png rename docs/assets/js/{10.1253731e.js => 10.ddbb0d4d.js} (93%) rename docs/assets/js/{11.8c833bde.js => 11.93c9bc98.js} (97%) rename docs/assets/js/{12.61089982.js => 12.f815cfa2.js} (99%) rename docs/assets/js/{13.25760eda.js => 13.e5742833.js} (97%) rename docs/assets/js/{14.cc27c55a.js => 14.993243d3.js} (99%) rename docs/assets/js/{16.d04bc2ac.js => 16.5d8d970e.js} (96%) rename docs/assets/js/{17.7cec28a6.js => 17.31216161.js} (98%) rename docs/assets/js/{18.91abb322.js => 18.1301a626.js} (96%) rename docs/assets/js/{19.a05f9317.js => 19.501fe444.js} (98%) rename docs/assets/js/{20.e44fcf7d.js => 20.94c02b34.js} (98%) rename docs/assets/js/{21.8859e956.js => 21.ff5e068c.js} (97%) rename docs/assets/js/{22.69bbe610.js => 22.1f3d545e.js} (98%) rename docs/assets/js/{23.d558c8c3.js => 23.e4fc3148.js} (98%) rename docs/assets/js/{24.90d6ddb8.js => 24.7e82030a.js} (99%) rename docs/assets/js/{25.0f5aa895.js => 25.fc38ae5b.js} (97%) rename docs/assets/js/{26.48d84783.js => 26.e097ebfd.js} (98%) rename docs/assets/js/{27.b9f6747b.js => 27.06f8de31.js} (97%) rename docs/assets/js/{28.79d861a5.js => 28.9b7b0400.js} (97%) rename docs/assets/js/{29.338541e0.js => 29.214a2702.js} (99%) rename docs/assets/js/{30.37a581ce.js => 30.0222f21c.js} (95%) rename docs/assets/js/{6.ee90ff38.js => 6.b5dc0bcc.js} (79%) rename docs/assets/js/{7.e3b70354.js => 7.c27e364c.js} (81%) rename docs/assets/js/{8.834b8e71.js => 8.99888a6b.js} (97%) rename docs/assets/js/{9.5f299cef.js => 9.3d56fa0d.js} (95%) rename docs/assets/js/{app.bf39d9b6.js => app.41e48030.js} (87%) diff --git a/docs/404.html b/docs/404.html index a6783d0..124dd88 100644 --- a/docs/404.html +++ b/docs/404.html @@ -7,13 +7,13 @@ - + -

404

That's a Four-Oh-Four.
+ - + diff --git a/docs/aggr_config_route.png b/docs/aggr_config_route.png new file mode 100644 index 0000000000000000000000000000000000000000..18fb5c54aa233ad7a0c144959cae37cbb30a2a8a GIT binary patch literal 102284 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 set foo bar\nOK\nredis> get foo\n"bar"\n')])])]),s("h3",{attrs:{id:"安装apollo配置中心"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#安装apollo配置中心"}},[a._v("#")]),a._v(" 安装Apollo配置中心")]),a._v(" "),s("p",[a._v("说明: apollo是可选组件,如果不使用apollo可使用本地配置文件(application.yml), 如果不使用apollo可跳过此步骤。")]),a._v(" "),s("p",[a._v("安装步骤详见apollo官方文档: "),s("a",{attrs:{href:"https://github.com/ctripcorp/apollo/wiki/Quick-Start",target:"_blank",rel:"noopener noreferrer"}},[s("OutboundLink")],1)]),a._v(" "),s("h3",{attrs:{id:"安装eureka服务注册中心"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#安装eureka服务注册中心"}},[a._v("#")]),a._v(" 安装Eureka服务注册中心")]),a._v(" "),s("p",[a._v("环境要求:")]),a._v(" "),s("ul",[s("li",[a._v("JDK 1.8 或以上版本")]),a._v(" "),s("li",[a._v("Tomcat 6.0.10 或以上版本 (如使用spring cloud已内置)")])]),a._v(" "),s("ol",[s("li",[a._v("安装JDK 1.8")])]),a._v(" "),s("p",[a._v("1)下载JDK,如: jdk-8u192-linux-x64.tar.gz")]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("tar -zxvf jdk-8u192-linux-x64.tar.gz\nmv jdk1.8.0_192 /usr/local/\n\n")])])]),s("p",[a._v("2)设置JDK环境变量,将下面内容追回到/etc/profile文件后面")]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("JAVA_HOME=/usr/local/jdk/jdk1.8.0_192\nJRE_HOME=$JAVA_HOME/jre\nPATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin\nCLASSPATH=:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib/dt.jar\nexport JAVA_HOME JRE_HOME PATH CLASSPATH\n\n")])])]),s("p",[a._v("3)执行以下命令全环境变量生效:")]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("source /etc/profile\n\n")])])]),s("p",[a._v("4)查看是否安装成功")]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("java -version\n")])])]),s("ol",{attrs:{start:"2"}},[s("li",[a._v("安装eureka")])]),a._v(" "),s("p",[a._v("1)使用IDE创建一个spring boot项目,如:sc-eureka-server")]),a._v(" "),s("p",[a._v("pom.xml:")]),a._v(" "),s("div",{staticClass:"language-xml extra-class"},[s("pre",{pre:!0,attrs:{class:"language-xml"}},[s("code",[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("<")]),a._v("dependency")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(">")])]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("<")]),a._v("groupId")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(">")])]),a._v("org.springframework.cloud"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("")])]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("<")]),a._v("artifactId")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(">")])]),a._v("spring-cloud-starter-netflix-eureka-server"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("")])]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("")])]),a._v("\n")])])]),s("p",[a._v("在启动类上添加@EnableEurekaServer注解来启用Euerka注册中心功能:")]),a._v(" "),s("div",{staticClass:"language-java extra-class"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[a._v("@SpringBootApplication")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[a._v("@EnableEurekaServer")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("public")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("class")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[a._v("ScEurekaServerApplication")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n\n\t"),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("public")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("static")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("void")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("main")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[a._v("String")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v(" args"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n\t\t"),s("span",{pre:!0,attrs:{class:"token class-name"}},[a._v("SpringApplication")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("run")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[a._v("ScEurekaServerApplication")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("class")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v(" args"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])]),s("p",[a._v("application.properties配置文件:")]),a._v(" "),s("div",{staticClass:"language-properties extra-class"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token attr-name"}},[a._v("spring.application.name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[a._v("sc-eureka-server")]),a._v("\n\n"),s("span",{pre:!0,attrs:{class:"token attr-name"}},[a._v("server.port")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[a._v("8761")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token attr-name"}},[a._v("eureka.instance.hostname")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[a._v("localhost")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token attr-name"}},[a._v("eureka.client.registerWithEureka")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[a._v("false")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token attr-name"}},[a._v("eureka.client.fetchRegistry")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[a._v("false")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token attr-name"}},[a._v("eureka.server.enableSelfPreservation")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[a._v("false")]),a._v("\n")])])]),s("p",[a._v("2) maven构建并运行sc-eureka-server应用, 启动后访问地址http://localhost:8761/可以看到Eureka注册中心的界面")]),a._v(" "),s("p",[a._v("3)把target/sc-eureka-server-1.0.0.jar传到linux服务器上运行. (仅以单机部署为例)")]),a._v(" "),s("div",{staticClass:"language-shell extra-class"},[s("pre",{pre:!0,attrs:{class:"language-shell"}},[s("code",[a._v("nohub java -jar sc-eureka-server-1.0.0.jar "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("&")]),a._v(" \n")])])]),s("p",[a._v("4)eureka客户端的注册地址为:http://localhost:8761/eureka/ (替换localhost为服务器的IP)")]),a._v(" "),s("div",{staticClass:"language-properties extra-class"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token attr-name"}},[a._v("eureka.client.serviceUrl.defaultZone")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("=")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token attr-value"}},[a._v("http://localhost:8761/eureka/")]),a._v("\n")])])]),s("h2",{attrs:{id:"安装fizz"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#安装fizz"}},[a._v("#")]),a._v(" 安装Fizz")]),a._v(" "),s("h3",{attrs:{id:"管理后台"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#管理后台"}},[a._v("#")]),a._v(" 管理后台")]),a._v(" "),s("p",[a._v("从github的releases(https://github.com/wehotel/fizz-gateway-community/releases)下载 fizz-manager-professional 和 fizz-admin-professional 的安装包")]),a._v(" "),s("ul",[s("li",[a._v("管理后台服务端(fizz-manager-professional)")])]),a._v(" "),s("ol",[s("li",[a._v("首次安装执行"),s("code",[a._v("fizz-manager-professional-1.1.0-mysql.sql")]),a._v("数据库脚本,低版本升级执行"),s("code",[a._v("update")]),a._v("目录下的升级脚本")]),a._v(" "),s("li",[a._v("将"),s("code",[a._v("application-prod.yml")]),a._v("、"),s("code",[a._v("boot.sh")]),a._v("、"),s("code",[a._v("fizz-manager-professional-1.1.0.jar")]),a._v("拷贝到"),s("code",[a._v("/data/webapps/fizz-manager-professional")]),a._v("目录下")]),a._v(" "),s("li",[a._v("修改"),s("code",[a._v("application-prod.yml")]),a._v("文件,将相关配置修改成部署环境的配置")]),a._v(" "),s("li",[a._v("修改"),s("code",[a._v("boot.sh")]),a._v("文件,将"),s("code",[a._v("RUN_CMD")]),a._v("变量值修改成部署环境的JAVA实际路径")]),a._v(" "),s("li",[a._v("执行 "),s("code",[a._v("chmod +x boot.sh")]),a._v(" 命令给"),s("code",[a._v("boot.sh")]),a._v("增加执行权限")]),a._v(" "),s("li",[a._v("执行 "),s("code",[a._v("./boot.sh start")]),a._v(" 命令启动服务,支持 start/stop/restart(升级发布时需要手动kill原进程)/status命令")]),a._v(" "),s("li",[a._v("服务启动后访问前端登录地址,使用超级管理员账户"),s("code",[a._v("admin")]),a._v("密码"),s("code",[a._v("Aa123!")]),a._v("登录")])]),a._v(" "),s("ul",[s("li",[a._v("管理后台前端(fizz-admin-professional)")])]),a._v(" "),s("p",[a._v("zip资源包解压后,取文件夹【fizzAdmin】放置于服务器静态数据存放目录 如:/home/data/")]),a._v(" "),s("p",[a._v("nginx配置")]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("server {\n listen 9000;\n server_name localhost:9000;\n location / {\n root /home/data/fizzAdmin;\n }\n location ^~ /api {\n rewrite ^/api/(.*) /$1 break;\n proxy_pass http://127.0.0.1:8000;\n }\n}\n\n# 注:root中地址需与资源包存放目录路径一致\n# 注:http://127.0.0.1:8000 为管理后台(fizz-manager-professional)的访问地址\n")])])]),s("p",[a._v("访问地址")]),a._v(" "),s("p",[a._v("【资源部署服务器IP + 端口号】如:http://127.0.0.1:9000/")]),a._v(" "),s("p",[a._v("(端口号与nginx配置端口号一致)")]),a._v(" "),s("h3",{attrs:{id:"fizz-gateway-community社区版"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#fizz-gateway-community社区版"}},[a._v("#")]),a._v(" fizz-gateway-community社区版")]),a._v(" "),s("p",[a._v("说明:如果使用apollo配置中心,可把application.yml文件内容迁到配置中心(apollo上应用名为:fizz-gateway);使用不使用apollo可去掉下面启动命令里的apollo参数。")]),a._v(" "),s("p",[a._v("脚本启动:")]),a._v(" "),s("ol",[s("li",[a._v("下载fizz-gateway-community的最新代码,修改application.yml配置文件里eureka、redis的配置,使用maven构建好并把构建好的fizz-gateway-community-1.0.0.jar和boot.sh放同一目录")]),a._v(" "),s("li",[a._v("修改boot.sh脚本的apollo连接,JVM内存配置,")]),a._v(" "),s("li",[a._v("执行 "),s("code",[a._v("./boot.sh start")]),a._v(" 命令启动服务,支持 start/stop/restart/status命令")])]),a._v(" "),s("p",[a._v("IDE启动:")]),a._v(" "),s("ol",[s("li",[a._v("本地clone仓库上的最新代码")]),a._v(" "),s("li",[a._v("将项目fizz-gateway导入IDE")]),a._v(" "),s("li",[a._v("导入完成后设置项目启动配置及修改application.yml配置文件里eureka、redis的配置,在VM选项中加入"),s("code",[a._v("-Denv=dev -Dapollo.meta=http://localhost:66")]),a._v("(Apollo配置中心地址)")])]),a._v(" "),s("p",[a._v("jar启动:")]),a._v(" "),s("ol",[s("li",[a._v("本地clone仓库上的最新代码,修改application.yml配置文件里eureka、redis的配置")]),a._v(" "),s("li",[a._v("在项目根目录fizz-gateway-community下执行Maven命令"),s("code",[a._v("mvn clean package -DskipTests=true")]),a._v("打包")]),a._v(" "),s("li",[a._v("进入target目录,使用命令"),s("code",[a._v("java -jar -Denv=DEV -Dapollo.meta=http://localhost:66 fizz-gateway-community-1.0.0.jar")]),a._v("启动服务")])]),a._v(" "),s("p",[a._v("网关访问地址格式:")]),a._v(" "),s("p",[a._v("http://127.0.0.1:8600/proxy/[服务名]/[API Path]")])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[12],{359:function(a,t,s){"use strict";s.r(t);var e=s(42),r=Object(e.a)({},(function(){var a=this,t=a.$createElement,s=a._self._c||t;return s("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[s("h2",{attrs:{id:"安装依赖"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#安装依赖"}},[a._v("#")]),a._v(" 安装依赖")]),a._v(" "),s("p",[a._v("安装以下依赖软件:")]),a._v(" "),s("ul",[s("li",[a._v("Redis 2.8或以上版本")]),a._v(" "),s("li",[a._v("MySQL 5.7或以上版本")]),a._v(" "),s("li",[a._v("Apollo配置中心 (可选)")]),a._v(" "),s("li",[a._v("Eureka服务注册中心")])]),a._v(" "),s("h3",{attrs:{id:"安装mysql"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#安装mysql"}},[a._v("#")]),a._v(" 安装MySQL")]),a._v(" "),s("ul",[s("li",[a._v("操作系统 CentOS 6.5")]),a._v(" "),s("li",[a._v("MySQL 5.7.30")])]),a._v(" "),s("ol",[s("li",[a._v("下载MySQL")])]),a._v(" "),s("div",{staticClass:"language-shell extra-class"},[s("pre",{pre:!0,attrs:{class:"language-shell"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[a._v("wget")]),a._v(" https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.30-1.el6.x86_64.rpm-bundle.tar\n")])])]),s("ol",{attrs:{start:"2"}},[s("li",[a._v("解压")])]),a._v(" "),s("div",{staticClass:"language-shell extra-class"},[s("pre",{pre:!0,attrs:{class:"language-shell"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[a._v("tar")]),a._v(" -xvf mysql-5.7.30-1.el6.x86_64.rpm-bundle.tar\n")])])]),s("ol",{attrs:{start:"3"}},[s("li",[a._v("安装")])]),a._v(" "),s("div",{staticClass:"language-shell extra-class"},[s("pre",{pre:!0,attrs:{class:"language-shell"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" yum "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("install")]),a._v(" mysql-community-"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("server,client,common,libs"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("-*\n")])])]),s("ol",{attrs:{start:"4"}},[s("li",[a._v("启动")])]),a._v(" "),s("div",{staticClass:"language-shell extra-class"},[s("pre",{pre:!0,attrs:{class:"language-shell"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("service")]),a._v(" mysqld start\n")])])]),s("p",[a._v("启动成功会显示以下信息:")]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("[root@localhost ~]# sudo service mysqld start\nInitializing MySQL database: [ OK ]\nStarting mysqld: [ OK ]\n")])])]),s("ol",{attrs:{start:"5"}},[s("li",[a._v("初始密码")])]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("sudo grep 'temporary password' /var/log/mysqld.log\n")])])]),s("ol",{attrs:{start:"6"}},[s("li",[a._v("使用初始密码登录")])]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("mysql -uroot -p\n")])])]),s("ol",{attrs:{start:"7"}},[s("li",[a._v("修改密码")])]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass4!';\n")])])]),s("ol",{attrs:{start:"8"}},[s("li",[a._v("退出登录")])]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("quit\n")])])]),s("h3",{attrs:{id:"安装redis-6-0-8"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#安装redis-6-0-8"}},[a._v("#")]),a._v(" 安装Redis 6.0.8")]),a._v(" "),s("ol",[s("li",[a._v("下载解压并编译")])]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("$ wget http://download.redis.io/releases/redis-6.0.8.tar.gz\n$ tar xzf redis-6.0.8.tar.gz\n$ cd redis-6.0.8\n$ make\n")])])]),s("ol",{attrs:{start:"2"}},[s("li",[a._v("启动redis")])]),a._v(" "),s("p",[a._v("运行编译后的文件:")]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("$ src/redis-server\n")])])]),s("ol",{attrs:{start:"3"}},[s("li",[a._v("客户端连接")])]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v('$ src/redis-cli\nredis> set foo bar\nOK\nredis> get foo\n"bar"\n')])])]),s("h3",{attrs:{id:"安装apollo配置中心"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#安装apollo配置中心"}},[a._v("#")]),a._v(" 安装Apollo配置中心")]),a._v(" "),s("p",[a._v("说明: apollo是可选组件,如果不使用apollo可使用本地配置文件(application.yml), 如果不使用apollo可跳过此步骤。")]),a._v(" "),s("p",[a._v("安装步骤详见apollo官方文档: "),s("a",{attrs:{href:"https://github.com/ctripcorp/apollo/wiki/Quick-Start",target:"_blank",rel:"noopener noreferrer"}},[s("OutboundLink")],1)]),a._v(" "),s("h3",{attrs:{id:"安装eureka服务注册中心"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#安装eureka服务注册中心"}},[a._v("#")]),a._v(" 安装Eureka服务注册中心")]),a._v(" "),s("p",[a._v("环境要求:")]),a._v(" "),s("ul",[s("li",[a._v("JDK 1.8 或以上版本")]),a._v(" "),s("li",[a._v("Tomcat 6.0.10 或以上版本 (如使用spring cloud已内置)")])]),a._v(" "),s("ol",[s("li",[a._v("安装JDK 1.8")])]),a._v(" "),s("p",[a._v("1)下载JDK,如: jdk-8u192-linux-x64.tar.gz")]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("tar -zxvf jdk-8u192-linux-x64.tar.gz\nmv jdk1.8.0_192 /usr/local/\n\n")])])]),s("p",[a._v("2)设置JDK环境变量,将下面内容追回到/etc/profile文件后面")]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("JAVA_HOME=/usr/local/jdk/jdk1.8.0_192\nJRE_HOME=$JAVA_HOME/jre\nPATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin\nCLASSPATH=:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib/dt.jar\nexport JAVA_HOME JRE_HOME PATH CLASSPATH\n\n")])])]),s("p",[a._v("3)执行以下命令全环境变量生效:")]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("source /etc/profile\n\n")])])]),s("p",[a._v("4)查看是否安装成功")]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("java -version\n")])])]),s("ol",{attrs:{start:"2"}},[s("li",[a._v("安装eureka")])]),a._v(" "),s("p",[a._v("1)使用IDE创建一个spring boot项目,如:sc-eureka-server")]),a._v(" "),s("p",[a._v("pom.xml:")]),a._v(" "),s("div",{staticClass:"language-xml extra-class"},[s("pre",{pre:!0,attrs:{class:"language-xml"}},[s("code",[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("<")]),a._v("dependency")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(">")])]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("<")]),a._v("groupId")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(">")])]),a._v("org.springframework.cloud"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("")])]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("<")]),a._v("artifactId")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(">")])]),a._v("spring-cloud-starter-netflix-eureka-server"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("")])]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("")])]),a._v("\n")])])]),s("p",[a._v("在启动类上添加@EnableEurekaServer注解来启用Euerka注册中心功能:")]),a._v(" "),s("div",{staticClass:"language-java extra-class"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[a._v("@SpringBootApplication")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[a._v("@EnableEurekaServer")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("public")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("class")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[a._v("ScEurekaServerApplication")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n\n\t"),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("public")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("static")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("void")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("main")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[a._v("String")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v(" args"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n\t\t"),s("span",{pre:!0,attrs:{class:"token class-name"}},[a._v("SpringApplication")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("run")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[a._v("ScEurekaServerApplication")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("class")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v(" args"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])]),s("p",[a._v("application.properties配置文件:")]),a._v(" "),s("div",{staticClass:"language-properties extra-class"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token attr-name"}},[a._v("spring.application.name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[a._v("sc-eureka-server")]),a._v("\n\n"),s("span",{pre:!0,attrs:{class:"token attr-name"}},[a._v("server.port")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[a._v("8761")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token attr-name"}},[a._v("eureka.instance.hostname")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[a._v("localhost")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token attr-name"}},[a._v("eureka.client.registerWithEureka")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[a._v("false")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token attr-name"}},[a._v("eureka.client.fetchRegistry")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[a._v("false")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token attr-name"}},[a._v("eureka.server.enableSelfPreservation")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[a._v("false")]),a._v("\n")])])]),s("p",[a._v("2) maven构建并运行sc-eureka-server应用, 启动后访问地址http://localhost:8761/可以看到Eureka注册中心的界面")]),a._v(" "),s("p",[a._v("3)把target/sc-eureka-server-1.0.0.jar传到linux服务器上运行. (仅以单机部署为例)")]),a._v(" "),s("div",{staticClass:"language-shell extra-class"},[s("pre",{pre:!0,attrs:{class:"language-shell"}},[s("code",[a._v("nohub java -jar sc-eureka-server-1.0.0.jar "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("&")]),a._v(" \n")])])]),s("p",[a._v("4)eureka客户端的注册地址为:http://localhost:8761/eureka/ (替换localhost为服务器的IP)")]),a._v(" "),s("div",{staticClass:"language-properties extra-class"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token attr-name"}},[a._v("eureka.client.serviceUrl.defaultZone")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("=")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token attr-value"}},[a._v("http://localhost:8761/eureka/")]),a._v("\n")])])]),s("h2",{attrs:{id:"安装fizz"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#安装fizz"}},[a._v("#")]),a._v(" 安装Fizz")]),a._v(" "),s("h3",{attrs:{id:"管理后台"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#管理后台"}},[a._v("#")]),a._v(" 管理后台")]),a._v(" "),s("p",[a._v("从github的releases(https://github.com/wehotel/fizz-gateway-community/releases)下载 fizz-manager-professional 和 fizz-admin-professional 的安装包")]),a._v(" "),s("ul",[s("li",[a._v("管理后台服务端(fizz-manager-professional)")])]),a._v(" "),s("ol",[s("li",[a._v("首次安装执行"),s("code",[a._v("fizz-manager-professional-1.1.0-mysql.sql")]),a._v("数据库脚本,低版本升级执行"),s("code",[a._v("update")]),a._v("目录下的升级脚本")]),a._v(" "),s("li",[a._v("将"),s("code",[a._v("application-prod.yml")]),a._v("、"),s("code",[a._v("boot.sh")]),a._v("、"),s("code",[a._v("fizz-manager-professional-1.1.0.jar")]),a._v("拷贝到"),s("code",[a._v("/data/webapps/fizz-manager-professional")]),a._v("目录下")]),a._v(" "),s("li",[a._v("修改"),s("code",[a._v("application-prod.yml")]),a._v("文件,将相关配置修改成部署环境的配置")]),a._v(" "),s("li",[a._v("修改"),s("code",[a._v("boot.sh")]),a._v("文件,将"),s("code",[a._v("RUN_CMD")]),a._v("变量值修改成部署环境的JAVA实际路径")]),a._v(" "),s("li",[a._v("执行 "),s("code",[a._v("chmod +x boot.sh")]),a._v(" 命令给"),s("code",[a._v("boot.sh")]),a._v("增加执行权限")]),a._v(" "),s("li",[a._v("执行 "),s("code",[a._v("./boot.sh start")]),a._v(" 命令启动服务,支持 start/stop/restart(升级发布时需要手动kill原进程)/status命令")]),a._v(" "),s("li",[a._v("服务启动后访问前端登录地址,使用超级管理员账户"),s("code",[a._v("admin")]),a._v("密码"),s("code",[a._v("Aa123!")]),a._v("登录")])]),a._v(" "),s("ul",[s("li",[a._v("管理后台前端(fizz-admin-professional)")])]),a._v(" "),s("p",[a._v("zip资源包解压后,取文件夹【fizzAdmin】放置于服务器静态数据存放目录 如:/home/data/")]),a._v(" "),s("p",[a._v("nginx配置")]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("server {\n listen 9000;\n server_name localhost:9000;\n location / {\n root /home/data/fizzAdmin;\n }\n location ^~ /api {\n rewrite ^/api/(.*) /$1 break;\n proxy_pass http://127.0.0.1:8000;\n }\n}\n\n# 注:root中地址需与资源包存放目录路径一致\n# 注:http://127.0.0.1:8000 为管理后台(fizz-manager-professional)的访问地址\n")])])]),s("p",[a._v("访问地址")]),a._v(" "),s("p",[a._v("【资源部署服务器IP + 端口号】如:http://127.0.0.1:9000/")]),a._v(" "),s("p",[a._v("(端口号与nginx配置端口号一致)")]),a._v(" "),s("h3",{attrs:{id:"fizz-gateway-community社区版"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#fizz-gateway-community社区版"}},[a._v("#")]),a._v(" fizz-gateway-community社区版")]),a._v(" "),s("p",[a._v("说明:如果使用apollo配置中心,可把application.yml文件内容迁到配置中心(apollo上应用名为:fizz-gateway);使用不使用apollo可去掉下面启动命令里的apollo参数。")]),a._v(" "),s("p",[a._v("脚本启动:")]),a._v(" "),s("ol",[s("li",[a._v("下载fizz-gateway-community的最新代码,修改application.yml配置文件里eureka、redis的配置,使用maven构建好并把构建好的fizz-gateway-community-1.0.0.jar和boot.sh放同一目录")]),a._v(" "),s("li",[a._v("修改boot.sh脚本的apollo连接,JVM内存配置,")]),a._v(" "),s("li",[a._v("执行 "),s("code",[a._v("./boot.sh start")]),a._v(" 命令启动服务,支持 start/stop/restart/status命令")])]),a._v(" "),s("p",[a._v("IDE启动:")]),a._v(" "),s("ol",[s("li",[a._v("本地clone仓库上的最新代码")]),a._v(" "),s("li",[a._v("将项目fizz-gateway导入IDE")]),a._v(" "),s("li",[a._v("导入完成后设置项目启动配置及修改application.yml配置文件里eureka、redis的配置,在VM选项中加入"),s("code",[a._v("-Denv=dev -Dapollo.meta=http://localhost:66")]),a._v("(Apollo配置中心地址)")])]),a._v(" "),s("p",[a._v("jar启动:")]),a._v(" "),s("ol",[s("li",[a._v("本地clone仓库上的最新代码,修改application.yml配置文件里eureka、redis的配置")]),a._v(" "),s("li",[a._v("在项目根目录fizz-gateway-community下执行Maven命令"),s("code",[a._v("mvn clean package -DskipTests=true")]),a._v("打包")]),a._v(" "),s("li",[a._v("进入target目录,使用命令"),s("code",[a._v("java -jar -Denv=DEV -Dapollo.meta=http://localhost:66 fizz-gateway-community-1.0.0.jar")]),a._v("启动服务")])]),a._v(" "),s("p",[a._v("网关访问地址格式:")]),a._v(" "),s("p",[a._v("http://127.0.0.1:8600/proxy/[服务名]/[API Path]")])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/13.25760eda.js b/docs/assets/js/13.e5742833.js similarity index 97% rename from docs/assets/js/13.25760eda.js rename to docs/assets/js/13.e5742833.js index ae81819..e2682a3 100644 --- a/docs/assets/js/13.25760eda.js +++ b/docs/assets/js/13.e5742833.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[13],{375:function(t,a,i){"use strict";i.r(a);var v=i(42),_=Object(v.a)({},(function(){var t=this,a=t.$createElement,i=t._self._c||a;return i("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[i("h2",{attrs:{id:"什么是fizz网关"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#什么是fizz网关"}},[t._v("#")]),t._v(" 什么是Fizz网关")]),t._v(" "),i("p",[t._v("A Managerment API Gateway in Java . Fizz Gateway 是一个基于 Java开发的微服务网关,能够实现热服务编排、自动授权选择、线上服务脚本编码、在线测试、高性能路由、API审核管理等目的,拥有强大的自定义插件系统可以自行扩展,并且提供友好的图形化配置界面,能够快速帮助企业进行API服务治理、减少中间层胶水代码以及降低编码投入、提高 API 服务的稳定性和安全性。")]),t._v(" "),i("h2",{attrs:{id:"fizz的设计"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#fizz的设计"}},[t._v("#")]),t._v(" Fizz的设计")]),t._v(" "),i("p",[i("img",{attrs:{src:"/fizz-gateway-community/fizz_design.png",alt:""}})]),t._v(" "),i("h2",{attrs:{id:"产品特性"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#产品特性"}},[t._v("#")]),t._v(" 产品特性")]),t._v(" "),i("ul",[i("li",[t._v("集群管理:Fizz网关节点是无状态的,配置信息自动同步,支持节点水平拓展和多集群部署。")]),t._v(" "),i("li",[t._v("服务编排:支持热服务编排能力,支持前后端编码,随时随地更新API。")]),t._v(" "),i("li",[t._v("负载均衡:支持round-robin负载均衡。")]),t._v(" "),i("li",[t._v("服务发现:支持从Eureka注册中心发现后端服务器。")]),t._v(" "),i("li",[t._v("配置中心:支持接入apollo配置中心。")]),t._v(" "),i("li",[t._v("HTTP反向代理:隐藏真实后端服务,支持 Rest API反向代理。")]),t._v(" "),i("li",[t._v("访问策略:支持不同策略访问不同的API、配置不同的鉴权等。")]),t._v(" "),i("li",[t._v("IP黑白名单:支持配置IP黑白名单。")]),t._v(" "),i("li",[t._v("自定义插件:强大的插件机制支持自由扩展。")]),t._v(" "),i("li",[t._v("可扩展:简单易用的插件机制方便扩展功能。")]),t._v(" "),i("li",[t._v("高性能:性能在众多网关之中表现优异。")]),t._v(" "),i("li",[t._v("版本控制:支持操作的发布和多次回滚。")]),t._v(" "),i("li",[t._v("管理后台:通过管理后台界面对网关集群进行各项配置。")])])])}),[],!1,null,null,null);a.default=_.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[13],{364:function(t,a,i){"use strict";i.r(a);var v=i(42),_=Object(v.a)({},(function(){var t=this,a=t.$createElement,i=t._self._c||a;return i("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[i("h2",{attrs:{id:"什么是fizz网关"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#什么是fizz网关"}},[t._v("#")]),t._v(" 什么是Fizz网关")]),t._v(" "),i("p",[t._v("A Managerment API Gateway in Java . Fizz Gateway 是一个基于 Java开发的微服务网关,能够实现热服务编排、自动授权选择、线上服务脚本编码、在线测试、高性能路由、API审核管理等目的,拥有强大的自定义插件系统可以自行扩展,并且提供友好的图形化配置界面,能够快速帮助企业进行API服务治理、减少中间层胶水代码以及降低编码投入、提高 API 服务的稳定性和安全性。")]),t._v(" "),i("h2",{attrs:{id:"fizz的设计"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#fizz的设计"}},[t._v("#")]),t._v(" Fizz的设计")]),t._v(" "),i("p",[i("img",{attrs:{src:"/fizz-gateway-community/fizz_design.png",alt:""}})]),t._v(" "),i("h2",{attrs:{id:"产品特性"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#产品特性"}},[t._v("#")]),t._v(" 产品特性")]),t._v(" "),i("ul",[i("li",[t._v("集群管理:Fizz网关节点是无状态的,配置信息自动同步,支持节点水平拓展和多集群部署。")]),t._v(" "),i("li",[t._v("服务编排:支持热服务编排能力,支持前后端编码,随时随地更新API。")]),t._v(" "),i("li",[t._v("负载均衡:支持round-robin负载均衡。")]),t._v(" "),i("li",[t._v("服务发现:支持从Eureka注册中心发现后端服务器。")]),t._v(" "),i("li",[t._v("配置中心:支持接入apollo配置中心。")]),t._v(" "),i("li",[t._v("HTTP反向代理:隐藏真实后端服务,支持 Rest API反向代理。")]),t._v(" "),i("li",[t._v("访问策略:支持不同策略访问不同的API、配置不同的鉴权等。")]),t._v(" "),i("li",[t._v("IP黑白名单:支持配置IP黑白名单。")]),t._v(" "),i("li",[t._v("自定义插件:强大的插件机制支持自由扩展。")]),t._v(" "),i("li",[t._v("可扩展:简单易用的插件机制方便扩展功能。")]),t._v(" "),i("li",[t._v("高性能:性能在众多网关之中表现优异。")]),t._v(" "),i("li",[t._v("版本控制:支持操作的发布和多次回滚。")]),t._v(" "),i("li",[t._v("管理后台:通过管理后台界面对网关集群进行各项配置。")])])])}),[],!1,null,null,null);a.default=_.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/14.cc27c55a.js b/docs/assets/js/14.993243d3.js similarity index 99% rename from docs/assets/js/14.cc27c55a.js rename to docs/assets/js/14.993243d3.js index 3185c2f..9155c75 100644 --- a/docs/assets/js/14.cc27c55a.js +++ b/docs/assets/js/14.993243d3.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[14],{357:function(a,t,s){"use strict";s.r(t);var r=s(42),e=Object(r.a)({},(function(){var a=this,t=a.$createElement,s=a._self._c||t;return s("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[s("h2",{attrs:{id:"概述"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[a._v("#")]),a._v(" 概述")]),a._v(" "),s("p",[a._v("接口列表功能用于维护聚合接口,聚合接口从外部调用方角度看是一个简单的接口,通过入参请求获取响应结果,内部实现会调用多个底层后端服务,将多个调用结果聚合转换成外部调用方想要的数据格式,更多详情请查看服务编排介绍,下面介绍接口列表功能的操作。")]),a._v(" "),s("h2",{attrs:{id:"接口列表"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#接口列表"}},[a._v("#")]),a._v(" 接口列表")]),a._v(" "),s("p",[a._v("菜单位置:服务编排 > 接口列表。点击菜单后进入接口列表页面,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_list_query.png",alt:"manager_aggregate_list_query"}})]),a._v(" "),s("h2",{attrs:{id:"新增接口"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#新增接口"}},[a._v("#")]),a._v(" 新增接口")]),a._v(" "),s("p",[a._v("点击 新增 按钮弹出新增窗口,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_1.png",alt:"manager_aggregate_add_1"}})]),a._v(" "),s("h3",{attrs:{id:"基础信息"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#基础信息"}},[a._v("#")]),a._v(" 基础信息")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_2.png",alt:"manager_aggregate_add_2"}})]),a._v(" "),s("p",[a._v("所属服务:接口所属服务,更多详情请查看服务管理功能介绍,必选;")]),a._v(" "),s("p",[a._v("接口名:接口名称,用于展示使用,长度不能超过200个字符,必填;")]),a._v(" "),s("p",[a._v("方法:接口请求方法类型,可选GET|POST,必选;")]),a._v(" "),s("p",[a._v("路径:接口请求路径后缀,长度不能超过2000个字符,必填;")]),a._v(" "),s("p",[a._v("开发人员:接口对应负责的开发人员,长度不能超过200个字符;")]),a._v(" "),s("p",[a._v("描述:接口功能描述,长度不能超过2000个字符;")]),a._v(" "),s("p",[a._v("举个例子,所属服务设置my-test-service,方法设置POST,路径设置test-aggregate-post,对应的聚合接口请求为 POST http://{Fizz网关ip地址}:{port端口}/proxy/my-test-service/test-aggregate-post。")]),a._v(" "),s("h3",{attrs:{id:"配置输入"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置输入"}},[a._v("#")]),a._v(" 配置输入")]),a._v(" "),s("p",[a._v("聚合接口的入参大部分是通过JSON Schema来定义的,下面先简单地介绍下JSON Schema。")]),a._v(" "),s("h4",{attrs:{id:"json-schema介绍"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#json-schema介绍"}},[a._v("#")]),a._v(" JSON Schema介绍")]),a._v(" "),s("p",[a._v("JSON Schema实际上也是JSON数据,用于标注和验证JSON文档,可以类比于XML Schema,当前最新版本2019-09。")]),a._v(" "),s("p",[a._v("作为普通用户,我们并不需要去了解JSON Schema的规范内容,只要能够构建JSON Schema即可。")]),a._v(" "),s("blockquote",[s("p",[a._v("要理解JSON Schema,首先要理解什么是JSON。JSON是JavaScript Object Notation的缩写,一种简单的数据交换格式。最初JSON是基于JavaScript,广泛的应用于万维网。由于其简洁和清晰的层次结构、易于人阅读等特性,使得越来越多的场景下被采用。")]),a._v(" "),s("p",[a._v("JSON包含以下数据结构:")]),a._v(" "),s("ul",[s("li",[a._v("object:"),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"key1"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"value1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"key2"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"value2"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])])]),a._v(" "),s("li",[a._v("array:"),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"first"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"second"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"third"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v("\n")])])])]),a._v(" "),s("li",[a._v("number:"),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token number"}},[a._v("42")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token number"}},[a._v("3.1415926")]),a._v("\n")])])])]),a._v(" "),s("li",[a._v("string:"),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"This is a string"')]),a._v("\n")])])])]),a._v(" "),s("li",[a._v("boolean:"),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token boolean"}},[a._v("true")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token boolean"}},[a._v("false")]),a._v("\n")])])])]),a._v(" "),s("li",[a._v("null:"),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("null")]),a._v("\n")])])])])]),a._v(" "),s("p",[a._v("通过以上的简单数据类型,就能构造复杂的结构化数据了。下面举两个例子:")]),a._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"George Washington"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"birthday"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"February 22, 1732"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"address"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Mount Vernon, Virginia, United States"')]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])]),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"first_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"George"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"last_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Washington"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"birthday"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"1732-02-22"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"address"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"street_address"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"3200 Mount Vernon Memorial Highway"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"city"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Mount Vernon"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"state"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Virginia"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"country"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"United States"')]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])]),s("p",[a._v("以上两个例子都是有效的JSON数据,包含一样的有效信息,但是当程序读取数据时,需要准确的知道数据是怎么组织的,比如哪些字段是必须,这些字段是什么类型。这时候JSON Schema就派上用场了,看以下JSON Schema例子:")]),a._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"object"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"properties"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"first_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"string"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"last_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"string"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"birthday"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"string"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"format"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"date"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"address"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"object"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"properties"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"street_address"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"string"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"city"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"string"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"state"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"string"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"country"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"string"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])]),s("p",[a._v("用以上JSON Schema验证第一个例子时,验证失败;但是第二个例子验证通过。")]),a._v(" "),s("p",[a._v("JSON Schema本身也是通过JSON编写,其本身也是数据,不是一个计算机程序,只是一种“描述其它数据的结构”的声明格式。这既是长处,也是弱点,JSON Schema可以简洁地描述数据的结构并且自动验证数据,但是对于数据元素间的关系表达就力不能及了。")])]),a._v(" "),s("p",[a._v("更多JSON Schema知识可以阅读"),s("a",{attrs:{href:"https://json-schema.org/understanding-json-schema/",target:"_blank",rel:"noopener noreferrer"}},[a._v("Understanding JSON Schema"),s("OutboundLink")],1),a._v("。")]),a._v(" "),s("h4",{attrs:{id:"请求头部"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#请求头部"}},[a._v("#")]),a._v(" 请求头部")]),a._v(" "),s("p",[a._v("定义聚合接口的请求Header参数。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_3.png",alt:"manager_aggregate_add_3"}})]),a._v(" "),s("p",[a._v("举个例子:")]),a._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"object"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"properties"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"headerParam1"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"string"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"title"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"请求头参数1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"titleEn"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"headerParam1"')]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"required"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"headerParam1"')]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])]),s("p",[a._v("以上例子定义了必传请求头参数"),s("code",[a._v("headerParam1")]),a._v("。")]),a._v(" "),s("p",[s("code",[a._v("title")]),a._v("字段用于验证失败时提示使用,例如请求接口时没传请求头时会提示“请求头参数1不能为空”(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_input_header_1.png",alt:"manager_aggregate_add_input_header_1"}})]),a._v(" "),s("p",[a._v("当定义了语言配置(详情请查看后文的语言配置介绍)选项为英文时会使用"),s("code",[a._v("titleEn")]),a._v("字段用于验证失败时提示使用,例如请求接口时没传请求头时会提示“headerParam1 is missing but it is required”(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_input_header_2.png",alt:"manager_aggregate_add_input_header_2"}})]),a._v(" "),s("h4",{attrs:{id:"请求体"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#请求体"}},[a._v("#")]),a._v(" 请求体")]),a._v(" "),s("p",[a._v("定义聚合接口的请求体参数。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_4.png",alt:"manager_aggregate_add_4"}})]),a._v(" "),s("p",[a._v("举个例子:")]),a._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"object"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"properties"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"bodyParam1"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"string"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"title"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"请求体参数1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"titleEn"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"bodyParam1"')]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"required"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"bodyParam1"')]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])]),s("p",[a._v("以上例子定义了必传请求体参数"),s("code",[a._v("bodyParam1")]),a._v("。")]),a._v(" "),s("p",[s("code",[a._v("title")]),a._v("字段用于验证失败时提示使用,例如请求接口时没传请求体参数时会提示“请求体参数1不能为空”(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_input_body_1.png",alt:"manager_aggregate_add_input_body_1"}})]),a._v(" "),s("p",[a._v("当定义了语言配置(详情请查看后文的语言配置介绍)选项为英文时会使用"),s("code",[a._v("titleEn")]),a._v("字段用于验证失败时提示使用,例如请求接口时没传请求体参数时会提示“bodyParam1 is missing but it is required”(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_input_body_2.png",alt:"manager_aggregate_add_input_body_2"}})]),a._v(" "),s("h4",{attrs:{id:"query参数"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#query参数"}},[a._v("#")]),a._v(" Query参数")]),a._v(" "),s("p",[a._v("定义聚合接口的Query参数。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_5.png",alt:"manager_aggregate_add_5"}})]),a._v(" "),s("p",[a._v("举个例子:")]),a._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"object"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"properties"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"queryParam1"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"string"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"title"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"query参数1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"titleEn"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"queryParam1"')]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"required"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"queryParam1"')]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])]),s("p",[a._v("以上例子定义了必传Query参数"),s("code",[a._v("queryParam1")]),a._v("。")]),a._v(" "),s("p",[s("code",[a._v("title")]),a._v("字段用于验证失败时提示使用,例如请求接口时没传Query参数时会提示“query参数1不能为空”(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_input_query_1.png",alt:"manager_aggregate_add_input_query_1"}})]),a._v(" "),s("p",[a._v("当定义了语言配置(详情请查看后文的语言配置介绍)选项为英文时会使用"),s("code",[a._v("titleEn")]),a._v("字段用于验证失败时提示使用,例如请求接口时没传Query参数时会提示“queryParam1 is missing but it is required”(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_input_query_2.png",alt:"manager_aggregate_add_input_query_2"}})]),a._v(" "),s("h4",{attrs:{id:"脚本校验"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#脚本校验"}},[a._v("#")]),a._v(" 脚本校验")]),a._v(" "),s("p",[a._v("对于JSON Schema规范无法覆盖的校验场景可以使用脚本对入参进行更加灵活的处理。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_6.png",alt:"manager_aggregate_add_6"}})]),a._v(" "),s("p",[a._v("点击 新增 按钮后弹出脚本配置窗口,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_7.png",alt:"manager_aggregate_add_7"}})]),a._v(" "),s("p",[a._v("脚本类型:可选javascript|groovy,必选;")]),a._v(" "),s("p",[a._v("脚本内容:所选的脚本类型语言编写的入参验证脚本,必填。")]),a._v(" "),s("p",[a._v("举个例子:")]),a._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[a._v("// javascript脚本函数名不能修改")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("function")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("dyFunc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[a._v("paramsJsonStr")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[a._v("// 上下文, 数据结构请参考 context.js")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("var")]),a._v(" context "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[a._v("JSON")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("parse")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),a._v("paramsJsonStr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v("'context'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[a._v("// common为内置的上下文便捷操作工具类,详情请参考common.js;例如:")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[a._v("// var data = common.getStepRespBody(context, 'step2', 'request1', 'data');")]),a._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[a._v("// do something")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("var")]),a._v(" headerParam1 "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v(" common"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("getInputReqHeader")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),a._v("context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v("'headerParam1'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("var")]),a._v(" bodyParam1 "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v(" common"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("getInputReqBody")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),a._v("context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v("'bodyParam1'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("var")]),a._v(" queryParam1 "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v(" common"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("getInputReqParam")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),a._v("context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v("'queryParam1'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("var")]),a._v(" result "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("new")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[a._v("Array")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("if")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),a._v("headerParam1 "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("!=")]),a._v(" bodyParam1"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("push")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"headerParam1与bodyParam1不一致"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("if")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),a._v("queryParam1 "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("!=")]),a._v(" bodyParam1"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("push")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"queryParam1与bodyParam1不一致"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("if")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),a._v("headerParam1 "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("!=")]),a._v(" queryParam1"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("push")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"headerParam1与queryParam1不一致"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[a._v("// 返回结果为Array或Object时要先转为json字符串")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("return")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[a._v("JSON")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("stringify")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),a._v("result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n\n")])])]),s("p",[a._v("以上例子使用javascript编写参数校验,限制入参"),s("code",[a._v("headerParam1")]),a._v("、"),s("code",[a._v("bodyParam1")]),a._v("、"),s("code",[a._v("queryParam1")]),a._v("必须一致,不一致将提示错误信息(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_input_script.png",alt:"manager_aggregate_add_input_script"}})]),a._v(" "),s("h4",{attrs:{id:"语言配置"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#语言配置"}},[a._v("#")]),a._v(" 语言配置")]),a._v(" "),s("p",[a._v("聚合接口默认使用中文响应校验失败提示,通过配置可通过入参选择不同的提示语言,目前支持中文、英文提示(已满足我们的业务使用场景,有其他语言要求的小伙伴可以联系我们添加)。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_8.png",alt:"manager_aggregate_add_8"}})]),a._v(" "),s("p",[a._v("字段:入参字段值,例如"),s("code",[a._v("input.request.body.languageCode")]),a._v("使用请求体参数"),s("code",[a._v("languageCode")]),a._v("的值来决定使用哪种语言;")]),a._v(" "),s("p",[a._v("中文:中文与入参字段值的映射关系,例如配置"),s("code",[a._v("0")]),a._v(",当请求入参字段值为"),s("code",[a._v("0")]),a._v("时使用中文提示校验结果;")]),a._v(" "),s("p",[a._v("英文:英文与入参字段值的映射关系,例如配置"),s("code",[a._v("1")]),a._v(",当请求入参字段值为"),s("code",[a._v("1")]),a._v("时使用中文提示校验结果。")]),a._v(" "),s("h3",{attrs:{id:"配置步骤"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置步骤"}},[a._v("#")]),a._v(" 配置步骤")]),a._v(" "),s("p",[a._v("聚合接口调用底层服务是通过多个step实现的,多个step串行执行,每个step包含多个request(对底层服务接口的调用),同个step里的多个request并行执行,后执行的step可以获取已执行step的执行结果,更多详情请查看服务编排文章的介绍,下面介绍配置步骤的使用。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_9.png",alt:"manager_aggregate_add_9"}})]),a._v(" "),s("p",[a._v("是否执行完此步骤后结束:勾选后实际请求只执行完该步骤后即响应结果,不执行后续步骤,用于调试使用;")]),a._v(" "),s("p",[a._v("请求方法:调用底层服务接口的请求类型,可选GET|POST,必选;")]),a._v(" "),s("p",[a._v("默认URL:调用底层服务接口的默认URL,当Fizz网关启动环境没有配置URL时使用该默认URL;")]),a._v(" "),s("p",[a._v("开发环境URL:开发环境调用底层服务接口的URL,当Fizz网关启动使用spring.profiles.active=dev时使用该URL;")]),a._v(" "),s("p",[a._v("测试环境URL:测试环境调用底层服务接口的URL,当Fizz网关启动使用spring.profiles.active=test时使用该URL;")]),a._v(" "),s("p",[a._v("预生产环境URL:预生产环境调用底层服务接口的URL,当Fizz网关启动使用spring.profiles.active=pre时使用该URL;")]),a._v(" "),s("p",[a._v("生产环境URL:生产环境调用底层服务接口的URL,当Fizz网关启动使用spring.profiles.active=prod时使用该URL;")]),a._v(" "),s("p",[a._v("超时时间(毫秒):调用底层服务接口的超时时间,超时抛出异常,单位毫秒;")]),a._v(" "),s("p",[a._v("Fallback:可选stop|continue,控制当调用底层服务接口失败后是否继续执行后续操作;")]),a._v(" "),s("p",[a._v("请求预处理:勾选后可配置预处理脚本,预处理脚本返回true时才执行调用底层服务接口。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_10.png",alt:"manager_aggregate_add_10"}})]),a._v(" "),s("p",[a._v("配置入参:配置调用底层服务接口的请求参数;")]),a._v(" "),s("p",[a._v("配置响应:配置调用底层服务接口的响应内容。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_11.png",alt:"manager_aggregate_add_11"}})]),a._v(" "),s("p",[a._v("配置步骤结果:配置step执行完成后的响应内容。")]),a._v(" "),s("h3",{attrs:{id:"配置输出"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置输出"}},[a._v("#")]),a._v(" 配置输出")]),a._v(" "),s("p",[a._v("配置聚合接口调用完成的响应内容。在响应体、响应头配置中可以配置简单的响应固定值、响应引用值,对于需要逻辑处理得到结果的响应可以通过脚本配置灵活处理,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_12.png",alt:"manager_aggregate_add_12"}})]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_13.png",alt:"manager_aggregate_add_13"}})]),a._v(" "),s("h3",{attrs:{id:"校验结果"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#校验结果"}},[a._v("#")]),a._v(" 校验结果")]),a._v(" "),s("p",[a._v("配置聚合接口入参校验失败后的响应内容,在响应体、响应头配置中可以配置简单的响应固定值、响应引用值,对于需要逻辑处理得到结果的响应可以通过脚本配置灵活处理,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_14.png",alt:"manager_aggregate_add_14"}})]),a._v(" "),s("p",[a._v("校验结果有一个专用的引用值"),s("code",[a._v("validateMsg")]),a._v(",该引用值用于存放入参验证错误提示信息。")]),a._v(" "),s("h3",{attrs:{id:"保存接口"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#保存接口"}},[a._v("#")]),a._v(" 保存接口")]),a._v(" "),s("p",[a._v("所有配置完成后点击 保存 按钮,完成聚合接口的配置。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_15.png",alt:"manager_aggregate_add_15"}})]),a._v(" "),s("h2",{attrs:{id:"导出接口"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#导出接口"}},[a._v("#")]),a._v(" 导出接口")]),a._v(" "),s("p",[a._v("导出功能将聚合接口以配置文件的形式导出,导出的文件可通过导入功能重新导入系统,当我们的系统分多个环境时,可使用导出导入功能实现聚合接口的快速同步,下面介绍导出功能。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_export_1.png",alt:"manager_aggregate_export_1"}})]),a._v(" "),s("p",[a._v("勾选想到导出的接口,点击 导出 按钮弹出确认窗口,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_export_2.png",alt:"manager_aggregate_export_2"}})]),a._v(" "),s("p",[a._v("点击 确定 按钮,浏览器保存配置文件,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_export_3.png",alt:"manager_aggregate_export_3"}})]),a._v(" "),s("h2",{attrs:{id:"导入接口"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#导入接口"}},[a._v("#")]),a._v(" 导入接口")]),a._v(" "),s("p",[a._v("导入功能将配置文件中的聚合接口转化成后台的持久化存储,导入的文件可以通过导出功能获取或者通过编写好的聚合配置JSON文件转化得到(转换工具可以联系我们获取)。当我们的系统分多个环境时,可使用导出导入功能实现聚合接口的快速同步,下面介绍导出功能。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_import_1.png",alt:"manager_aggregate_import_1"}})]),a._v(" "),s("p",[a._v("点击 导入 按钮弹出导入配置窗口,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_import_2.png",alt:"manager_aggregate_import_2"}})]),a._v(" "),s("p",[a._v("点击 选取文件 按钮后选取要导入的配置文件;")]),a._v(" "),s("p",[a._v("强制覆盖:通过请求类型(GET|POST)、请求路径(/proxy/{service}/{apiPath})可以唯一确定一个聚合接口,当聚合接口已存在时,未勾选该选项时忽略该聚合接口导入,勾选该选项时覆盖已存在的聚合接口配置;")]),a._v(" "),s("p",[a._v("点击 确定 按钮后导入聚合接口配置。")]),a._v(" "),s("h2",{attrs:{id:"调试模式"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#调试模式"}},[a._v("#")]),a._v(" 调试模式")]),a._v(" "),s("p",[a._v("调试模式用于对接口开发过程中的调试使用,当打开调试模式后,Fizz网关会将聚合接口调用底层服务接口的请求响应信息以及耗时、聚合结果、步骤上下文打印到日志中,通过日志可以清楚的了解聚合接口的实际执行情况。调试模式会对网关性能造成影响,因此不建议在生产环境打开调试模式,当调试完成后及时关闭调试模式,避免打印过多日志造成资源浪费,下面介绍调试模式的使用。")]),a._v(" "),s("p",[a._v("勾选想要打开调试模式的接口,点击 打开调试模式 按钮弹出确认窗口,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_debug_mode_1.png",alt:"manager_aggregate_debug_mode_1"}})]),a._v(" "),s("p",[a._v("点击 确定 按钮确认打开调试模式。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_debug_mode_2.png",alt:"manager_aggregate_debug_mode_2"}})]),a._v(" "),s("p",[a._v("勾选想要关闭调试模式的接口,点击 关闭调试模式 按钮弹出确认窗口,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_debug_mode_3.png",alt:"manager_aggregate_debug_mode_3"}})]),a._v(" "),s("p",[a._v("点击 确定 按钮确认关闭调试模式。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_debug_mode_4.png",alt:"manager_aggregate_debug_mode_4"}})]),a._v(" "),s("h2",{attrs:{id:"编辑接口"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#编辑接口"}},[a._v("#")]),a._v(" 编辑接口")]),a._v(" "),s("p",[a._v("点击 编辑 按钮弹出编辑窗口,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_edit_1.png",alt:"manager_aggregate_edit_1"}})]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_edit_2.png",alt:"manager_aggregate_edit_2"}})]),a._v(" "),s("h2",{attrs:{id:"删除接口"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#删除接口"}},[a._v("#")]),a._v(" 删除接口")]),a._v(" "),s("p",[a._v("点击 删除 按钮弹出删除确认窗口,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_delete_1.png",alt:"manager_aggregate_delete_1"}})]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_delete_2.png",alt:"manager_aggregate_delete_2"}})]),a._v(" "),s("p",[a._v("点击 确定 按钮后删除接口,处于已发布状态的接口无法删除,需要下线后才能操作删除。")]),a._v(" "),s("h2",{attrs:{id:"发布-下线申请"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#发布-下线申请"}},[a._v("#")]),a._v(" 发布|下线申请")]),a._v(" "),s("p",[a._v("发布|下线申请用于聚合接口的发布或者下线申请,只有通过审核人审核后申请人才能执行发布|下线操作,避免误操作‘,保证接口的安全。")]),a._v(" "),s("p",[a._v("点击 发布|下线申请 按钮,弹出发布|下线申请窗口,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_apply_1.png",alt:"manager_aggregate_apply_1"}})]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_apply_2.png",alt:"manager_aggregate_apply_2"}})]),a._v(" "),s("p",[a._v("点击 添加 按钮后,弹出接口列表,勾选需要操作的接口,点击 确定 添加进申请中。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_apply_3.png",alt:"manager_aggregate_apply_3"}})]),a._v(" "),s("p",[a._v("标题:申请的标题,长度不能超过200个字符,必填;")]),a._v(" "),s("p",[a._v("类型:申请类型,可选发布|下线,必选;")]),a._v(" "),s("p",[a._v("申请原因:申请的原因,长度不能超过2000个字符;")]),a._v(" "),s("p",[a._v("选择审核人:选择有审核权限的人对申请进行审核,列表根据需要操作的接口动态变化(未添加接口时列表为空,拥有服务权限并且有待审核菜单权限的人、操作管理员角色的人为可选审核人),必选;")]),a._v(" "),s("p",[a._v("点击 确定 按钮后提交申请,选择的审核人会收到申请审核邮件(审核人邮箱地址通过用户管理设置,更多详情请查看用户管理功能介绍),如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_apply_4.png",alt:"manager_aggregate_apply_4"}})]),a._v(" "),s("h2",{attrs:{id:"接口测试"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#接口测试"}},[a._v("#")]),a._v(" 接口测试")]),a._v(" "),s("p",[a._v("后台提供了可视化的接口调用界面,聚合接口创建完成后可通过该界面对接口进行调用测试。通过点击接口详情页面的 测试 按钮打开接口测试页面,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_test_1.png",alt:"manager_aggregate_test_1"}})]),a._v(" "),s("p",[a._v("跳转页面的同时后台会将接口当前的最新配置推送给Fizz网关生成一个测试接口,请求路径为/proxytest/{service}/{apiPath}。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_test_2.png",alt:"manager_aggregate_test_2"}})]),a._v(" "),s("p",[a._v("点击 发送 按钮向指定接口发送一次请求,Response响应结果区域显示调用接口结果,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_test_3.png",alt:"manager_aggregate_test_3"}})]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_test_4.png",alt:"manager_aggregate_test_4"}})]),a._v(" "),s("p",[a._v("请求体tab用于配置请求的请求体参数。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_test_5.png",alt:"manager_aggregate_test_5"}})]),a._v(" "),s("p",[a._v("请求头tab用于配置请求的请求头参数。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_test_6.png",alt:"manager_aggregate_test_6"}})]),a._v(" "),s("p",[a._v("Query参数用于配置请求的Query参数。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_test_7.png",alt:"manager_aggregate_test_7"}})]),a._v(" "),s("p",[a._v("返回Context:Fizz网关中一次聚合接口的请求过程中内部会持有一个Context对象,该对象保存了本次请求过程的入参信息、底层服务接口调用信息、响应信息,通过勾选该选项,接口会将Context随接口响应一起返回,通过查看Context可以清楚地了解接口的实际调用过程。")]),a._v(" "),s("p",[a._v("未勾选 返回Context 选项时,接口按配置输出的设置响应结果,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_test_8.png",alt:"manager_aggregate_test_8"}})]),a._v(" "),s("p",[a._v("勾选 返回Context 选项后,接口会将Context随接口响应一起返回,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_test_9.png",alt:"manager_aggregate_test_9"}})]),a._v(" "),s("p",[a._v("测试接口:调用测试接口,请求路径为/proxytest/{service}/{apiPath};")]),a._v(" "),s("p",[a._v("正式接口:调用正式接口,请求路径为/proxy/{service}/{apiPath};")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_test_10.png",alt:"manager_aggregate_test_10"}})]),a._v(" "),s("p",[a._v("点击 保存 按钮会将本次测试请求数据保存下来,通过选取已保存的测试记录可以快速恢复请求数据,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_test_11.png",alt:"manager_aggregate_test_11"}})]),a._v(" "),s("p",[a._v("标题:本次测试数据保存时使用的标题,长度不能超过2000个字符,保存后在历史测试记录列表显示,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_test_12.png",alt:"manager_aggregate_test_12"}})])])}),[],!1,null,null,null);t.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[14],{360:function(a,t,s){"use strict";s.r(t);var r=s(42),e=Object(r.a)({},(function(){var a=this,t=a.$createElement,s=a._self._c||t;return s("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[s("h2",{attrs:{id:"概述"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[a._v("#")]),a._v(" 概述")]),a._v(" "),s("p",[a._v("接口列表功能用于维护聚合接口,聚合接口从外部调用方角度看是一个简单的接口,通过入参请求获取响应结果,内部实现会调用多个底层后端服务,将多个调用结果聚合转换成外部调用方想要的数据格式,更多详情请查看服务编排介绍,下面介绍接口列表功能的操作。")]),a._v(" "),s("h2",{attrs:{id:"接口列表"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#接口列表"}},[a._v("#")]),a._v(" 接口列表")]),a._v(" "),s("p",[a._v("菜单位置:服务编排 > 接口列表。点击菜单后进入接口列表页面,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_list_query.png",alt:"manager_aggregate_list_query"}})]),a._v(" "),s("h2",{attrs:{id:"新增接口"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#新增接口"}},[a._v("#")]),a._v(" 新增接口")]),a._v(" "),s("p",[a._v("点击 新增 按钮弹出新增窗口,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_1.png",alt:"manager_aggregate_add_1"}})]),a._v(" "),s("h3",{attrs:{id:"基础信息"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#基础信息"}},[a._v("#")]),a._v(" 基础信息")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_2.png",alt:"manager_aggregate_add_2"}})]),a._v(" "),s("p",[a._v("所属服务:接口所属服务,更多详情请查看服务管理功能介绍,必选;")]),a._v(" "),s("p",[a._v("接口名:接口名称,用于展示使用,长度不能超过200个字符,必填;")]),a._v(" "),s("p",[a._v("方法:接口请求方法类型,可选GET|POST,必选;")]),a._v(" "),s("p",[a._v("路径:接口请求路径后缀,长度不能超过2000个字符,必填;")]),a._v(" "),s("p",[a._v("开发人员:接口对应负责的开发人员,长度不能超过200个字符;")]),a._v(" "),s("p",[a._v("描述:接口功能描述,长度不能超过2000个字符;")]),a._v(" "),s("p",[a._v("举个例子,所属服务设置my-test-service,方法设置POST,路径设置test-aggregate-post,对应的聚合接口请求为 POST http://{Fizz网关ip地址}:{port端口}/proxy/my-test-service/test-aggregate-post。")]),a._v(" "),s("h3",{attrs:{id:"配置输入"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置输入"}},[a._v("#")]),a._v(" 配置输入")]),a._v(" "),s("p",[a._v("聚合接口的入参大部分是通过JSON Schema来定义的,下面先简单地介绍下JSON Schema。")]),a._v(" "),s("h4",{attrs:{id:"json-schema介绍"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#json-schema介绍"}},[a._v("#")]),a._v(" JSON Schema介绍")]),a._v(" "),s("p",[a._v("JSON Schema实际上也是JSON数据,用于标注和验证JSON文档,可以类比于XML Schema,当前最新版本2019-09。")]),a._v(" "),s("p",[a._v("作为普通用户,我们并不需要去了解JSON Schema的规范内容,只要能够构建JSON Schema即可。")]),a._v(" "),s("blockquote",[s("p",[a._v("要理解JSON Schema,首先要理解什么是JSON。JSON是JavaScript Object Notation的缩写,一种简单的数据交换格式。最初JSON是基于JavaScript,广泛的应用于万维网。由于其简洁和清晰的层次结构、易于人阅读等特性,使得越来越多的场景下被采用。")]),a._v(" "),s("p",[a._v("JSON包含以下数据结构:")]),a._v(" "),s("ul",[s("li",[a._v("object:"),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"key1"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"value1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"key2"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"value2"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])])]),a._v(" "),s("li",[a._v("array:"),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"first"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"second"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"third"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v("\n")])])])]),a._v(" "),s("li",[a._v("number:"),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token number"}},[a._v("42")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token number"}},[a._v("3.1415926")]),a._v("\n")])])])]),a._v(" "),s("li",[a._v("string:"),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"This is a string"')]),a._v("\n")])])])]),a._v(" "),s("li",[a._v("boolean:"),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token boolean"}},[a._v("true")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token boolean"}},[a._v("false")]),a._v("\n")])])])]),a._v(" "),s("li",[a._v("null:"),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("null")]),a._v("\n")])])])])]),a._v(" "),s("p",[a._v("通过以上的简单数据类型,就能构造复杂的结构化数据了。下面举两个例子:")]),a._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"George Washington"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"birthday"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"February 22, 1732"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"address"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Mount Vernon, Virginia, United States"')]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])]),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"first_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"George"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"last_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Washington"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"birthday"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"1732-02-22"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"address"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"street_address"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"3200 Mount Vernon Memorial Highway"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"city"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Mount Vernon"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"state"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Virginia"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"country"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"United States"')]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])]),s("p",[a._v("以上两个例子都是有效的JSON数据,包含一样的有效信息,但是当程序读取数据时,需要准确的知道数据是怎么组织的,比如哪些字段是必须,这些字段是什么类型。这时候JSON Schema就派上用场了,看以下JSON Schema例子:")]),a._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"object"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"properties"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"first_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"string"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"last_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"string"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"birthday"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"string"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"format"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"date"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"address"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"object"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"properties"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"street_address"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"string"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"city"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"string"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"state"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"string"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"country"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"string"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])]),s("p",[a._v("用以上JSON Schema验证第一个例子时,验证失败;但是第二个例子验证通过。")]),a._v(" "),s("p",[a._v("JSON Schema本身也是通过JSON编写,其本身也是数据,不是一个计算机程序,只是一种“描述其它数据的结构”的声明格式。这既是长处,也是弱点,JSON Schema可以简洁地描述数据的结构并且自动验证数据,但是对于数据元素间的关系表达就力不能及了。")])]),a._v(" "),s("p",[a._v("更多JSON Schema知识可以阅读"),s("a",{attrs:{href:"https://json-schema.org/understanding-json-schema/",target:"_blank",rel:"noopener noreferrer"}},[a._v("Understanding JSON Schema"),s("OutboundLink")],1),a._v("。")]),a._v(" "),s("h4",{attrs:{id:"请求头部"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#请求头部"}},[a._v("#")]),a._v(" 请求头部")]),a._v(" "),s("p",[a._v("定义聚合接口的请求Header参数。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_3.png",alt:"manager_aggregate_add_3"}})]),a._v(" "),s("p",[a._v("举个例子:")]),a._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"object"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"properties"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"headerParam1"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"string"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"title"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"请求头参数1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"titleEn"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"headerParam1"')]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"required"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"headerParam1"')]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])]),s("p",[a._v("以上例子定义了必传请求头参数"),s("code",[a._v("headerParam1")]),a._v("。")]),a._v(" "),s("p",[s("code",[a._v("title")]),a._v("字段用于验证失败时提示使用,例如请求接口时没传请求头时会提示“请求头参数1不能为空”(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_input_header_1.png",alt:"manager_aggregate_add_input_header_1"}})]),a._v(" "),s("p",[a._v("当定义了语言配置(详情请查看后文的语言配置介绍)选项为英文时会使用"),s("code",[a._v("titleEn")]),a._v("字段用于验证失败时提示使用,例如请求接口时没传请求头时会提示“headerParam1 is missing but it is required”(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_input_header_2.png",alt:"manager_aggregate_add_input_header_2"}})]),a._v(" "),s("h4",{attrs:{id:"请求体"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#请求体"}},[a._v("#")]),a._v(" 请求体")]),a._v(" "),s("p",[a._v("定义聚合接口的请求体参数。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_4.png",alt:"manager_aggregate_add_4"}})]),a._v(" "),s("p",[a._v("举个例子:")]),a._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"object"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"properties"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"bodyParam1"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"string"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"title"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"请求体参数1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"titleEn"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"bodyParam1"')]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"required"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"bodyParam1"')]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])]),s("p",[a._v("以上例子定义了必传请求体参数"),s("code",[a._v("bodyParam1")]),a._v("。")]),a._v(" "),s("p",[s("code",[a._v("title")]),a._v("字段用于验证失败时提示使用,例如请求接口时没传请求体参数时会提示“请求体参数1不能为空”(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_input_body_1.png",alt:"manager_aggregate_add_input_body_1"}})]),a._v(" "),s("p",[a._v("当定义了语言配置(详情请查看后文的语言配置介绍)选项为英文时会使用"),s("code",[a._v("titleEn")]),a._v("字段用于验证失败时提示使用,例如请求接口时没传请求体参数时会提示“bodyParam1 is missing but it is required”(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_input_body_2.png",alt:"manager_aggregate_add_input_body_2"}})]),a._v(" "),s("h4",{attrs:{id:"query参数"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#query参数"}},[a._v("#")]),a._v(" Query参数")]),a._v(" "),s("p",[a._v("定义聚合接口的Query参数。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_5.png",alt:"manager_aggregate_add_5"}})]),a._v(" "),s("p",[a._v("举个例子:")]),a._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"object"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"properties"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"queryParam1"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"string"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"title"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"query参数1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"titleEn"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"queryParam1"')]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"required"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"queryParam1"')]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])]),s("p",[a._v("以上例子定义了必传Query参数"),s("code",[a._v("queryParam1")]),a._v("。")]),a._v(" "),s("p",[s("code",[a._v("title")]),a._v("字段用于验证失败时提示使用,例如请求接口时没传Query参数时会提示“query参数1不能为空”(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_input_query_1.png",alt:"manager_aggregate_add_input_query_1"}})]),a._v(" "),s("p",[a._v("当定义了语言配置(详情请查看后文的语言配置介绍)选项为英文时会使用"),s("code",[a._v("titleEn")]),a._v("字段用于验证失败时提示使用,例如请求接口时没传Query参数时会提示“queryParam1 is missing but it is required”(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_input_query_2.png",alt:"manager_aggregate_add_input_query_2"}})]),a._v(" "),s("h4",{attrs:{id:"脚本校验"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#脚本校验"}},[a._v("#")]),a._v(" 脚本校验")]),a._v(" "),s("p",[a._v("对于JSON Schema规范无法覆盖的校验场景可以使用脚本对入参进行更加灵活的处理。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_6.png",alt:"manager_aggregate_add_6"}})]),a._v(" "),s("p",[a._v("点击 新增 按钮后弹出脚本配置窗口,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_7.png",alt:"manager_aggregate_add_7"}})]),a._v(" "),s("p",[a._v("脚本类型:可选javascript|groovy,必选;")]),a._v(" "),s("p",[a._v("脚本内容:所选的脚本类型语言编写的入参验证脚本,必填。")]),a._v(" "),s("p",[a._v("举个例子:")]),a._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[a._v("// javascript脚本函数名不能修改")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("function")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("dyFunc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[a._v("paramsJsonStr")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[a._v("// 上下文, 数据结构请参考 context.js")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("var")]),a._v(" context "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[a._v("JSON")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("parse")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),a._v("paramsJsonStr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v("'context'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[a._v("// common为内置的上下文便捷操作工具类,详情请参考common.js;例如:")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[a._v("// var data = common.getStepRespBody(context, 'step2', 'request1', 'data');")]),a._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[a._v("// do something")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("var")]),a._v(" headerParam1 "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v(" common"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("getInputReqHeader")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),a._v("context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v("'headerParam1'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("var")]),a._v(" bodyParam1 "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v(" common"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("getInputReqBody")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),a._v("context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v("'bodyParam1'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("var")]),a._v(" queryParam1 "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v(" common"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("getInputReqParam")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),a._v("context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v("'queryParam1'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("var")]),a._v(" result "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("new")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[a._v("Array")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("if")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),a._v("headerParam1 "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("!=")]),a._v(" bodyParam1"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("push")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"headerParam1与bodyParam1不一致"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("if")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),a._v("queryParam1 "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("!=")]),a._v(" bodyParam1"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("push")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"queryParam1与bodyParam1不一致"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("if")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),a._v("headerParam1 "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("!=")]),a._v(" queryParam1"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("push")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"headerParam1与queryParam1不一致"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[a._v("// 返回结果为Array或Object时要先转为json字符串")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("return")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[a._v("JSON")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("stringify")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),a._v("result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n\n")])])]),s("p",[a._v("以上例子使用javascript编写参数校验,限制入参"),s("code",[a._v("headerParam1")]),a._v("、"),s("code",[a._v("bodyParam1")]),a._v("、"),s("code",[a._v("queryParam1")]),a._v("必须一致,不一致将提示错误信息(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_input_script.png",alt:"manager_aggregate_add_input_script"}})]),a._v(" "),s("h4",{attrs:{id:"语言配置"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#语言配置"}},[a._v("#")]),a._v(" 语言配置")]),a._v(" "),s("p",[a._v("聚合接口默认使用中文响应校验失败提示,通过配置可通过入参选择不同的提示语言,目前支持中文、英文提示(已满足我们的业务使用场景,有其他语言要求的小伙伴可以联系我们添加)。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_8.png",alt:"manager_aggregate_add_8"}})]),a._v(" "),s("p",[a._v("字段:入参字段值,例如"),s("code",[a._v("input.request.body.languageCode")]),a._v("使用请求体参数"),s("code",[a._v("languageCode")]),a._v("的值来决定使用哪种语言;")]),a._v(" "),s("p",[a._v("中文:中文与入参字段值的映射关系,例如配置"),s("code",[a._v("0")]),a._v(",当请求入参字段值为"),s("code",[a._v("0")]),a._v("时使用中文提示校验结果;")]),a._v(" "),s("p",[a._v("英文:英文与入参字段值的映射关系,例如配置"),s("code",[a._v("1")]),a._v(",当请求入参字段值为"),s("code",[a._v("1")]),a._v("时使用中文提示校验结果。")]),a._v(" "),s("h3",{attrs:{id:"配置步骤"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置步骤"}},[a._v("#")]),a._v(" 配置步骤")]),a._v(" "),s("p",[a._v("聚合接口调用底层服务是通过多个step实现的,多个step串行执行,每个step包含多个request(对底层服务接口的调用),同个step里的多个request并行执行,后执行的step可以获取已执行step的执行结果,更多详情请查看服务编排文章的介绍,下面介绍配置步骤的使用。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_9.png",alt:"manager_aggregate_add_9"}})]),a._v(" "),s("p",[a._v("是否执行完此步骤后结束:勾选后实际请求只执行完该步骤后即响应结果,不执行后续步骤,用于调试使用;")]),a._v(" "),s("p",[a._v("请求方法:调用底层服务接口的请求类型,可选GET|POST,必选;")]),a._v(" "),s("p",[a._v("默认URL:调用底层服务接口的默认URL,当Fizz网关启动环境没有配置URL时使用该默认URL;")]),a._v(" "),s("p",[a._v("开发环境URL:开发环境调用底层服务接口的URL,当Fizz网关启动使用spring.profiles.active=dev时使用该URL;")]),a._v(" "),s("p",[a._v("测试环境URL:测试环境调用底层服务接口的URL,当Fizz网关启动使用spring.profiles.active=test时使用该URL;")]),a._v(" "),s("p",[a._v("预生产环境URL:预生产环境调用底层服务接口的URL,当Fizz网关启动使用spring.profiles.active=pre时使用该URL;")]),a._v(" "),s("p",[a._v("生产环境URL:生产环境调用底层服务接口的URL,当Fizz网关启动使用spring.profiles.active=prod时使用该URL;")]),a._v(" "),s("p",[a._v("超时时间(毫秒):调用底层服务接口的超时时间,超时抛出异常,单位毫秒;")]),a._v(" "),s("p",[a._v("Fallback:可选stop|continue,控制当调用底层服务接口失败后是否继续执行后续操作;")]),a._v(" "),s("p",[a._v("请求预处理:勾选后可配置预处理脚本,预处理脚本返回true时才执行调用底层服务接口。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_10.png",alt:"manager_aggregate_add_10"}})]),a._v(" "),s("p",[a._v("配置入参:配置调用底层服务接口的请求参数;")]),a._v(" "),s("p",[a._v("配置响应:配置调用底层服务接口的响应内容。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_11.png",alt:"manager_aggregate_add_11"}})]),a._v(" "),s("p",[a._v("配置步骤结果:配置step执行完成后的响应内容。")]),a._v(" "),s("h3",{attrs:{id:"配置输出"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置输出"}},[a._v("#")]),a._v(" 配置输出")]),a._v(" "),s("p",[a._v("配置聚合接口调用完成的响应内容。在响应体、响应头配置中可以配置简单的响应固定值、响应引用值,对于需要逻辑处理得到结果的响应可以通过脚本配置灵活处理,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_12.png",alt:"manager_aggregate_add_12"}})]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_13.png",alt:"manager_aggregate_add_13"}})]),a._v(" "),s("h3",{attrs:{id:"校验结果"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#校验结果"}},[a._v("#")]),a._v(" 校验结果")]),a._v(" "),s("p",[a._v("配置聚合接口入参校验失败后的响应内容,在响应体、响应头配置中可以配置简单的响应固定值、响应引用值,对于需要逻辑处理得到结果的响应可以通过脚本配置灵活处理,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_14.png",alt:"manager_aggregate_add_14"}})]),a._v(" "),s("p",[a._v("校验结果有一个专用的引用值"),s("code",[a._v("validateMsg")]),a._v(",该引用值用于存放入参验证错误提示信息。")]),a._v(" "),s("h3",{attrs:{id:"保存接口"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#保存接口"}},[a._v("#")]),a._v(" 保存接口")]),a._v(" "),s("p",[a._v("所有配置完成后点击 保存 按钮,完成聚合接口的配置。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_15.png",alt:"manager_aggregate_add_15"}})]),a._v(" "),s("h2",{attrs:{id:"导出接口"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#导出接口"}},[a._v("#")]),a._v(" 导出接口")]),a._v(" "),s("p",[a._v("导出功能将聚合接口以配置文件的形式导出,导出的文件可通过导入功能重新导入系统,当我们的系统分多个环境时,可使用导出导入功能实现聚合接口的快速同步,下面介绍导出功能。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_export_1.png",alt:"manager_aggregate_export_1"}})]),a._v(" "),s("p",[a._v("勾选想到导出的接口,点击 导出 按钮弹出确认窗口,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_export_2.png",alt:"manager_aggregate_export_2"}})]),a._v(" "),s("p",[a._v("点击 确定 按钮,浏览器保存配置文件,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_export_3.png",alt:"manager_aggregate_export_3"}})]),a._v(" "),s("h2",{attrs:{id:"导入接口"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#导入接口"}},[a._v("#")]),a._v(" 导入接口")]),a._v(" "),s("p",[a._v("导入功能将配置文件中的聚合接口转化成后台的持久化存储,导入的文件可以通过导出功能获取或者通过编写好的聚合配置JSON文件转化得到(转换工具可以联系我们获取)。当我们的系统分多个环境时,可使用导出导入功能实现聚合接口的快速同步,下面介绍导出功能。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_import_1.png",alt:"manager_aggregate_import_1"}})]),a._v(" "),s("p",[a._v("点击 导入 按钮弹出导入配置窗口,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_import_2.png",alt:"manager_aggregate_import_2"}})]),a._v(" "),s("p",[a._v("点击 选取文件 按钮后选取要导入的配置文件;")]),a._v(" "),s("p",[a._v("强制覆盖:通过请求类型(GET|POST)、请求路径(/proxy/{service}/{apiPath})可以唯一确定一个聚合接口,当聚合接口已存在时,未勾选该选项时忽略该聚合接口导入,勾选该选项时覆盖已存在的聚合接口配置;")]),a._v(" "),s("p",[a._v("点击 确定 按钮后导入聚合接口配置。")]),a._v(" "),s("h2",{attrs:{id:"调试模式"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#调试模式"}},[a._v("#")]),a._v(" 调试模式")]),a._v(" "),s("p",[a._v("调试模式用于对接口开发过程中的调试使用,当打开调试模式后,Fizz网关会将聚合接口调用底层服务接口的请求响应信息以及耗时、聚合结果、步骤上下文打印到日志中,通过日志可以清楚的了解聚合接口的实际执行情况。调试模式会对网关性能造成影响,因此不建议在生产环境打开调试模式,当调试完成后及时关闭调试模式,避免打印过多日志造成资源浪费,下面介绍调试模式的使用。")]),a._v(" "),s("p",[a._v("勾选想要打开调试模式的接口,点击 打开调试模式 按钮弹出确认窗口,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_debug_mode_1.png",alt:"manager_aggregate_debug_mode_1"}})]),a._v(" "),s("p",[a._v("点击 确定 按钮确认打开调试模式。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_debug_mode_2.png",alt:"manager_aggregate_debug_mode_2"}})]),a._v(" "),s("p",[a._v("勾选想要关闭调试模式的接口,点击 关闭调试模式 按钮弹出确认窗口,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_debug_mode_3.png",alt:"manager_aggregate_debug_mode_3"}})]),a._v(" "),s("p",[a._v("点击 确定 按钮确认关闭调试模式。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_debug_mode_4.png",alt:"manager_aggregate_debug_mode_4"}})]),a._v(" "),s("h2",{attrs:{id:"编辑接口"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#编辑接口"}},[a._v("#")]),a._v(" 编辑接口")]),a._v(" "),s("p",[a._v("点击 编辑 按钮弹出编辑窗口,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_edit_1.png",alt:"manager_aggregate_edit_1"}})]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_edit_2.png",alt:"manager_aggregate_edit_2"}})]),a._v(" "),s("h2",{attrs:{id:"删除接口"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#删除接口"}},[a._v("#")]),a._v(" 删除接口")]),a._v(" "),s("p",[a._v("点击 删除 按钮弹出删除确认窗口,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_delete_1.png",alt:"manager_aggregate_delete_1"}})]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_delete_2.png",alt:"manager_aggregate_delete_2"}})]),a._v(" "),s("p",[a._v("点击 确定 按钮后删除接口,处于已发布状态的接口无法删除,需要下线后才能操作删除。")]),a._v(" "),s("h2",{attrs:{id:"发布-下线申请"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#发布-下线申请"}},[a._v("#")]),a._v(" 发布|下线申请")]),a._v(" "),s("p",[a._v("发布|下线申请用于聚合接口的发布或者下线申请,只有通过审核人审核后申请人才能执行发布|下线操作,避免误操作‘,保证接口的安全。")]),a._v(" "),s("p",[a._v("点击 发布|下线申请 按钮,弹出发布|下线申请窗口,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_apply_1.png",alt:"manager_aggregate_apply_1"}})]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_apply_2.png",alt:"manager_aggregate_apply_2"}})]),a._v(" "),s("p",[a._v("点击 添加 按钮后,弹出接口列表,勾选需要操作的接口,点击 确定 添加进申请中。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_apply_3.png",alt:"manager_aggregate_apply_3"}})]),a._v(" "),s("p",[a._v("标题:申请的标题,长度不能超过200个字符,必填;")]),a._v(" "),s("p",[a._v("类型:申请类型,可选发布|下线,必选;")]),a._v(" "),s("p",[a._v("申请原因:申请的原因,长度不能超过2000个字符;")]),a._v(" "),s("p",[a._v("选择审核人:选择有审核权限的人对申请进行审核,列表根据需要操作的接口动态变化(未添加接口时列表为空,拥有服务权限并且有待审核菜单权限的人、操作管理员角色的人为可选审核人),必选;")]),a._v(" "),s("p",[a._v("点击 确定 按钮后提交申请,选择的审核人会收到申请审核邮件(审核人邮箱地址通过用户管理设置,更多详情请查看用户管理功能介绍),如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_apply_4.png",alt:"manager_aggregate_apply_4"}})]),a._v(" "),s("h2",{attrs:{id:"接口测试"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#接口测试"}},[a._v("#")]),a._v(" 接口测试")]),a._v(" "),s("p",[a._v("后台提供了可视化的接口调用界面,聚合接口创建完成后可通过该界面对接口进行调用测试。通过点击接口详情页面的 测试 按钮打开接口测试页面,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_test_1.png",alt:"manager_aggregate_test_1"}})]),a._v(" "),s("p",[a._v("跳转页面的同时后台会将接口当前的最新配置推送给Fizz网关生成一个测试接口,请求路径为/proxytest/{service}/{apiPath}。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_test_2.png",alt:"manager_aggregate_test_2"}})]),a._v(" "),s("p",[a._v("点击 发送 按钮向指定接口发送一次请求,Response响应结果区域显示调用接口结果,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_test_3.png",alt:"manager_aggregate_test_3"}})]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_test_4.png",alt:"manager_aggregate_test_4"}})]),a._v(" "),s("p",[a._v("请求体tab用于配置请求的请求体参数。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_test_5.png",alt:"manager_aggregate_test_5"}})]),a._v(" "),s("p",[a._v("请求头tab用于配置请求的请求头参数。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_test_6.png",alt:"manager_aggregate_test_6"}})]),a._v(" "),s("p",[a._v("Query参数用于配置请求的Query参数。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_test_7.png",alt:"manager_aggregate_test_7"}})]),a._v(" "),s("p",[a._v("返回Context:Fizz网关中一次聚合接口的请求过程中内部会持有一个Context对象,该对象保存了本次请求过程的入参信息、底层服务接口调用信息、响应信息,通过勾选该选项,接口会将Context随接口响应一起返回,通过查看Context可以清楚地了解接口的实际调用过程。")]),a._v(" "),s("p",[a._v("未勾选 返回Context 选项时,接口按配置输出的设置响应结果,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_test_8.png",alt:"manager_aggregate_test_8"}})]),a._v(" "),s("p",[a._v("勾选 返回Context 选项后,接口会将Context随接口响应一起返回,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_test_9.png",alt:"manager_aggregate_test_9"}})]),a._v(" "),s("p",[a._v("测试接口:调用测试接口,请求路径为/proxytest/{service}/{apiPath};")]),a._v(" "),s("p",[a._v("正式接口:调用正式接口,请求路径为/proxy/{service}/{apiPath};")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_test_10.png",alt:"manager_aggregate_test_10"}})]),a._v(" "),s("p",[a._v("点击 保存 按钮会将本次测试请求数据保存下来,通过选取已保存的测试记录可以快速恢复请求数据,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_test_11.png",alt:"manager_aggregate_test_11"}})]),a._v(" "),s("p",[a._v("标题:本次测试数据保存时使用的标题,长度不能超过2000个字符,保存后在历史测试记录列表显示,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_test_12.png",alt:"manager_aggregate_test_12"}})])])}),[],!1,null,null,null);t.default=e.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/16.d04bc2ac.js b/docs/assets/js/16.5d8d970e.js similarity index 96% rename from docs/assets/js/16.d04bc2ac.js rename to docs/assets/js/16.5d8d970e.js index 89d13bf..467ba3a 100644 --- a/docs/assets/js/16.d04bc2ac.js +++ b/docs/assets/js/16.5d8d970e.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[16],{360:function(a,t,e){"use strict";e.r(t);var _=e(42),r=Object(_.a)({},(function(){var a=this,t=a.$createElement,e=a._self._c||t;return e("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[e("h2",{attrs:{id:"概述"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[a._v("#")]),a._v(" 概述")]),a._v(" "),e("p",[a._v("管理后台记录了发布|下线申请的审核操作日志,审核日志功能提供界面查询后台记录的审核操作日志。")]),a._v(" "),e("h2",{attrs:{id:"审核日志列表"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#审核日志列表"}},[a._v("#")]),a._v(" 审核日志列表")]),a._v(" "),e("p",[a._v("菜单位置:发布申请 > 审核日志。点击菜单后进入审核日志列表页面,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_approve_op_log_list_query.png",alt:"manager_aggregate_approve_op_log_list_query"}})]),a._v(" "),e("h2",{attrs:{id:"审核日志详情"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#审核日志详情"}},[a._v("#")]),a._v(" 审核日志详情")]),a._v(" "),e("p",[a._v("点击 查看 按钮弹出审核日志详情页面,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_approve_op_log_detail_1.png",alt:"manager_aggregate_approve_op_log_detail_1"}})]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_approve_op_log_detail_2.png",alt:"manager_aggregate_approve_op_log_detail_2"}})])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[16],{363:function(a,t,e){"use strict";e.r(t);var _=e(42),r=Object(_.a)({},(function(){var a=this,t=a.$createElement,e=a._self._c||t;return e("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[e("h2",{attrs:{id:"概述"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[a._v("#")]),a._v(" 概述")]),a._v(" "),e("p",[a._v("管理后台记录了发布|下线申请的审核操作日志,审核日志功能提供界面查询后台记录的审核操作日志。")]),a._v(" "),e("h2",{attrs:{id:"审核日志列表"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#审核日志列表"}},[a._v("#")]),a._v(" 审核日志列表")]),a._v(" "),e("p",[a._v("菜单位置:发布申请 > 审核日志。点击菜单后进入审核日志列表页面,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_approve_op_log_list_query.png",alt:"manager_aggregate_approve_op_log_list_query"}})]),a._v(" "),e("h2",{attrs:{id:"审核日志详情"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#审核日志详情"}},[a._v("#")]),a._v(" 审核日志详情")]),a._v(" "),e("p",[a._v("点击 查看 按钮弹出审核日志详情页面,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_approve_op_log_detail_1.png",alt:"manager_aggregate_approve_op_log_detail_1"}})]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_approve_op_log_detail_2.png",alt:"manager_aggregate_approve_op_log_detail_2"}})])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/17.7cec28a6.js b/docs/assets/js/17.31216161.js similarity index 98% rename from docs/assets/js/17.7cec28a6.js rename to docs/assets/js/17.31216161.js index 26b819a..28433b2 100644 --- a/docs/assets/js/17.7cec28a6.js +++ b/docs/assets/js/17.31216161.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[17],{359:function(a,_,e){"use strict";e.r(_);var t=e(42),g=Object(t.a)({},(function(){var a=this,_=a.$createElement,e=a._self._c||_;return e("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[e("h2",{attrs:{id:"概述"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[a._v("#")]),a._v(" 概述")]),a._v(" "),e("p",[a._v("聚合接口的发布|下线操作需要提交发布|下线申请,审核通过后申请人才能执行发布|下线操作。我的申请功能用于发布|下线申请过程的相关操作,下面介绍我的申请功能。")]),a._v(" "),e("h2",{attrs:{id:"申请列表"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#申请列表"}},[a._v("#")]),a._v(" 申请列表")]),a._v(" "),e("p",[a._v("菜单位置:发布申请 > 我的申请。点击菜单后进入申请列表页面,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_my_apply_list_query.png",alt:"manager_aggregate_my_apply_list_query"}})]),a._v(" "),e("h2",{attrs:{id:"申请撤回"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#申请撤回"}},[a._v("#")]),a._v(" 申请撤回")]),a._v(" "),e("p",[a._v("对于已提交但未被审核的申请可执行撤回操作,点击 撤回 按钮弹出确认窗口,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_my_apply_revoke_1.png",alt:"manager_aggregate_my_apply_revoke_1"}})]),a._v(" "),e("p",[a._v("点击 确定 按钮后确认撤回申请,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_my_apply_revoke_2.png",alt:"manager_aggregate_my_apply_revoke_2"}})]),a._v(" "),e("p",[a._v("撤回后审核人会收到邮箱提醒无需再处理该申请,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_my_apply_revoke_3.png",alt:"manager_aggregate_my_apply_revoke_3"}})]),a._v(" "),e("p",[a._v("撤回后可对申请重新进行编辑后再次提交,点击 编辑 按钮后弹出编辑窗口,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_my_apply_revoke_4.png",alt:"manager_aggregate_my_apply_revoke_4"}})]),a._v(" "),e("p",[a._v("点击 确定 按钮后再次提交申请,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_my_apply_revoke_5.png",alt:"manager_aggregate_my_apply_revoke_5"}})]),a._v(" "),e("h2",{attrs:{id:"申请详情"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#申请详情"}},[a._v("#")]),a._v(" 申请详情")]),a._v(" "),e("p",[a._v("点击 查看 按钮查看申请详情。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_my_apply_detail_1.png",alt:"manager_aggregate_my_apply_detail_1"}})]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_my_apply_detail_2.png",alt:"manager_aggregate_my_apply_detail_2"}})]),a._v(" "),e("p",[a._v("操作日志记录该申请的所有操作,包括申请提交、申请撤回、申请重新提交、审核不通过、审核通过、修改审核人、接口发布、接口下线 、接口回滚、接口撤回。")]),a._v(" "),e("p",[a._v("待审核状态申请可以更换审核人,点击 修改审核人 按钮后弹出修改审核人窗口,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_my_apply_detail_3.png",alt:"manager_aggregate_my_apply_detail_3"}})]),a._v(" "),e("p",[a._v("重新选择审核人后点击 确定 按钮,修改审核人完成。")]),a._v(" "),e("p",[a._v("修改后原审核人会收到邮件提醒无须再处理该申请。")]),a._v(" "),e("p",[a._v("修改后新的审核人会收到邮件提醒需要处理该申请。")]),a._v(" "),e("p",[a._v("审核通过后可以对接口进行发布操作,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_my_apply_detail_4.png",alt:"manager_aggregate_my_apply_detail_4"}})]),a._v(" "),e("p",[a._v("批量发布:对申请内的接口批量发布推送到Fizz网关。")]),a._v(" "),e("p",[a._v("批量回滚:对申请内的接口批量回滚到上一个版本,当发布后接口异常时该操作相当有用。")]),a._v(" "),e("p",[a._v("对于申请通过后又无须操作的接口可以执行撤回操作,撤回接口时必须填写备注信息用于回溯查询,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_my_apply_detail_5.png",alt:"manager_aggregate_my_apply_detail_5"}})]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_my_apply_detail_6.png",alt:"manager_aggregate_my_apply_detail_6"}})])])}),[],!1,null,null,null);_.default=g.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[17],{361:function(a,_,e){"use strict";e.r(_);var t=e(42),g=Object(t.a)({},(function(){var a=this,_=a.$createElement,e=a._self._c||_;return e("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[e("h2",{attrs:{id:"概述"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[a._v("#")]),a._v(" 概述")]),a._v(" "),e("p",[a._v("聚合接口的发布|下线操作需要提交发布|下线申请,审核通过后申请人才能执行发布|下线操作。我的申请功能用于发布|下线申请过程的相关操作,下面介绍我的申请功能。")]),a._v(" "),e("h2",{attrs:{id:"申请列表"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#申请列表"}},[a._v("#")]),a._v(" 申请列表")]),a._v(" "),e("p",[a._v("菜单位置:发布申请 > 我的申请。点击菜单后进入申请列表页面,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_my_apply_list_query.png",alt:"manager_aggregate_my_apply_list_query"}})]),a._v(" "),e("h2",{attrs:{id:"申请撤回"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#申请撤回"}},[a._v("#")]),a._v(" 申请撤回")]),a._v(" "),e("p",[a._v("对于已提交但未被审核的申请可执行撤回操作,点击 撤回 按钮弹出确认窗口,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_my_apply_revoke_1.png",alt:"manager_aggregate_my_apply_revoke_1"}})]),a._v(" "),e("p",[a._v("点击 确定 按钮后确认撤回申请,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_my_apply_revoke_2.png",alt:"manager_aggregate_my_apply_revoke_2"}})]),a._v(" "),e("p",[a._v("撤回后审核人会收到邮箱提醒无需再处理该申请,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_my_apply_revoke_3.png",alt:"manager_aggregate_my_apply_revoke_3"}})]),a._v(" "),e("p",[a._v("撤回后可对申请重新进行编辑后再次提交,点击 编辑 按钮后弹出编辑窗口,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_my_apply_revoke_4.png",alt:"manager_aggregate_my_apply_revoke_4"}})]),a._v(" "),e("p",[a._v("点击 确定 按钮后再次提交申请,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_my_apply_revoke_5.png",alt:"manager_aggregate_my_apply_revoke_5"}})]),a._v(" "),e("h2",{attrs:{id:"申请详情"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#申请详情"}},[a._v("#")]),a._v(" 申请详情")]),a._v(" "),e("p",[a._v("点击 查看 按钮查看申请详情。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_my_apply_detail_1.png",alt:"manager_aggregate_my_apply_detail_1"}})]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_my_apply_detail_2.png",alt:"manager_aggregate_my_apply_detail_2"}})]),a._v(" "),e("p",[a._v("操作日志记录该申请的所有操作,包括申请提交、申请撤回、申请重新提交、审核不通过、审核通过、修改审核人、接口发布、接口下线 、接口回滚、接口撤回。")]),a._v(" "),e("p",[a._v("待审核状态申请可以更换审核人,点击 修改审核人 按钮后弹出修改审核人窗口,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_my_apply_detail_3.png",alt:"manager_aggregate_my_apply_detail_3"}})]),a._v(" "),e("p",[a._v("重新选择审核人后点击 确定 按钮,修改审核人完成。")]),a._v(" "),e("p",[a._v("修改后原审核人会收到邮件提醒无须再处理该申请。")]),a._v(" "),e("p",[a._v("修改后新的审核人会收到邮件提醒需要处理该申请。")]),a._v(" "),e("p",[a._v("审核通过后可以对接口进行发布操作,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_my_apply_detail_4.png",alt:"manager_aggregate_my_apply_detail_4"}})]),a._v(" "),e("p",[a._v("批量发布:对申请内的接口批量发布推送到Fizz网关。")]),a._v(" "),e("p",[a._v("批量回滚:对申请内的接口批量回滚到上一个版本,当发布后接口异常时该操作相当有用。")]),a._v(" "),e("p",[a._v("对于申请通过后又无须操作的接口可以执行撤回操作,撤回接口时必须填写备注信息用于回溯查询,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_my_apply_detail_5.png",alt:"manager_aggregate_my_apply_detail_5"}})]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_my_apply_detail_6.png",alt:"manager_aggregate_my_apply_detail_6"}})])])}),[],!1,null,null,null);_.default=g.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/18.91abb322.js b/docs/assets/js/18.1301a626.js similarity index 96% rename from docs/assets/js/18.91abb322.js rename to docs/assets/js/18.1301a626.js index 2cbb4cb..819d3b6 100644 --- a/docs/assets/js/18.91abb322.js +++ b/docs/assets/js/18.1301a626.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[18],{366:function(a,t,e){"use strict";e.r(t);var _=e(42),r=Object(_.a)({},(function(){var a=this,t=a.$createElement,e=a._self._c||t;return e("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[e("h2",{attrs:{id:"概述"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[a._v("#")]),a._v(" 概述")]),a._v(" "),e("p",[a._v("管理后台记录了聚合接口的新增、修改、发布、下线、回滚、删除操作日志,通过查看操作日志可以清楚地掌握接口的操作轨迹。操作日志功能提供界面查询聚合接口的操作日志。")]),a._v(" "),e("h2",{attrs:{id:"操作日志列表"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#操作日志列表"}},[a._v("#")]),a._v(" 操作日志列表")]),a._v(" "),e("p",[a._v("菜单位置:服务编排 > 操作日志。点击菜单后进入操作日志列表页面,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_op_log_list_query.png",alt:"manager_aggregate_op_log_list_query"}})]),a._v(" "),e("h2",{attrs:{id:"查看日志详情"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#查看日志详情"}},[a._v("#")]),a._v(" 查看日志详情")]),a._v(" "),e("p",[a._v("点击 查看 按钮弹出操作日志详情页面,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_op_log_detail_1.png",alt:"manager_aggregate_op_log_detail_1"}})]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_op_log_detail_2.png",alt:"manager_aggregate_op_log_detail_2"}})])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[18],{362:function(a,t,e){"use strict";e.r(t);var _=e(42),r=Object(_.a)({},(function(){var a=this,t=a.$createElement,e=a._self._c||t;return e("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[e("h2",{attrs:{id:"概述"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[a._v("#")]),a._v(" 概述")]),a._v(" "),e("p",[a._v("管理后台记录了聚合接口的新增、修改、发布、下线、回滚、删除操作日志,通过查看操作日志可以清楚地掌握接口的操作轨迹。操作日志功能提供界面查询聚合接口的操作日志。")]),a._v(" "),e("h2",{attrs:{id:"操作日志列表"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#操作日志列表"}},[a._v("#")]),a._v(" 操作日志列表")]),a._v(" "),e("p",[a._v("菜单位置:服务编排 > 操作日志。点击菜单后进入操作日志列表页面,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_op_log_list_query.png",alt:"manager_aggregate_op_log_list_query"}})]),a._v(" "),e("h2",{attrs:{id:"查看日志详情"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#查看日志详情"}},[a._v("#")]),a._v(" 查看日志详情")]),a._v(" "),e("p",[a._v("点击 查看 按钮弹出操作日志详情页面,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_op_log_detail_1.png",alt:"manager_aggregate_op_log_detail_1"}})]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_op_log_detail_2.png",alt:"manager_aggregate_op_log_detail_2"}})])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/19.a05f9317.js b/docs/assets/js/19.501fe444.js similarity index 98% rename from docs/assets/js/19.a05f9317.js rename to docs/assets/js/19.501fe444.js index fefe63e..046b416 100644 --- a/docs/assets/js/19.a05f9317.js +++ b/docs/assets/js/19.501fe444.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[19],{361:function(a,t,_){"use strict";_.r(t);var r=_(42),e=Object(r.a)({},(function(){var a=this,t=a.$createElement,_=a._self._c||t;return _("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[_("h2",{attrs:{id:"概述"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[a._v("#")]),a._v(" 概述")]),a._v(" "),_("p",[a._v("路由管理功能用于维护网关的路由规则,支持按请求路径转发、转发到指定后端服务两种转发规则,支持插件配置。下面介绍路由管理的操作。")]),a._v(" "),_("h2",{attrs:{id:"路由列表"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#路由列表"}},[a._v("#")]),a._v(" 路由列表")]),a._v(" "),_("p",[a._v("菜单位置:网关管理 > 路由管理。点击菜单后进入路由列表页面,如图所示。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/fizz-gateway-community/manager_api_auth_list_query.png",alt:"manager_api_auth_list_query"}})]),a._v(" "),_("h2",{attrs:{id:"新增路由"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#新增路由"}},[a._v("#")]),a._v(" 新增路由")]),a._v(" "),_("p",[a._v("点击 新增 按钮弹出新增窗口,如图所示。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/fizz-gateway-community/manager_api_auth_add_1.png",alt:"manager_api_auth_add_1"}})]),a._v(" "),_("p",[_("img",{attrs:{src:"/fizz-gateway-community/manager_api_auth_add_2.png",alt:"manager_api_auth_add_2"}})]),a._v(" "),_("p",[a._v("网关分组:选取路由关联的网关分组,只有属于所选分组的网关实例路由规则才会生效,必选;")]),a._v(" "),_("p",[a._v("服务:网关的请求路径格式为 http://{ip}:{port}/proxy/{service}{apiPath},服务对应{service}段,当 转发 选择 按请求路径转发 时服务需要是聚合配置的服务或者是Eureka注册的服务,当 转发 选择 转发到指定后端服务 时服务不需要是实际存在的服务,只用于路径匹配使用,长度不能超过50个字符,必填;")]),a._v(" "),_("p",[a._v("API方法:请求的method类型,可选GET|POST;")]),a._v(" "),_("p",[a._v('API Path:网关的请求路径格式为 http://{ip}:{port}/proxy/{service}{apiPath},API Path对应{apiPath}段,使用前缀匹配原则,例如"/api/"将匹配"/api/"、"/api/1"、"/api/1/1"等路径;')]),a._v(" "),_("p",[a._v("应用:选取路由关联的应用,网关使用选取应用的信息进行鉴权,更多详情请查看appID管理功能介绍;")]),a._v(" "),_("p",[a._v("访问:可选允许|禁止,必选;")]),a._v(" "),_("p",[a._v("转发:可选按请求路径转发|转发到指定后端服务,当选择 按请求路径转发 时,请求会按请求路径转发,例如网关请求 http://{ip}:{port}/proxy/my-service/api-path 将转发到 http://my-service/api-path;当选择 转发到指定后端服务 时,需要添加转发到的后端服务URL,请求会转发到配置的后端服务,例如配置了服务为 my-service,API Path为空,后端服务URL为 http://127.0.0.1:8080/forward-service/,网关请求 http://{ip}:{port}/proxy/my-service/api-path 将转发到 http://127.0.0.1:8080/forward-service/api-path。")]),a._v(" "),_("p",[a._v("点击 添加插件 按钮为路由添加插件,如图所示。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/fizz-gateway-community/manager_api_auth_add_3.png",alt:"manager_api_auth_add_3"}})]),a._v(" "),_("p",[a._v("配置插件路由级别的自定义配置,表单界面来自于插件的表单定义,更多详情请查看插件管理功能介绍。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/fizz-gateway-community/manager_api_auth_add_4.png",alt:"manager_api_auth_add_4"}})]),a._v(" "),_("p",[a._v("配置完成后点击 保存 按钮保存路由规则。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/fizz-gateway-community/manager_api_auth_add_5.png",alt:"manager_api_auth_add_5"}})]),a._v(" "),_("h2",{attrs:{id:"编辑路由"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#编辑路由"}},[a._v("#")]),a._v(" 编辑路由")]),a._v(" "),_("p",[a._v("点击 编辑 按钮弹出编辑窗口,如图所示。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/fizz-gateway-community/manager_api_auth_edit_1.png",alt:"manager_api_auth_edit_1"}})]),a._v(" "),_("p",[_("img",{attrs:{src:"/fizz-gateway-community/manager_api_auth_edit_2.png",alt:"manager_api_auth_edit_2"}})]),a._v(" "),_("h2",{attrs:{id:"删除路由"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#删除路由"}},[a._v("#")]),a._v(" 删除路由")]),a._v(" "),_("p",[a._v("点击 删除 按钮弹出删除确认窗口,如图所示。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/fizz-gateway-community/manager_api_auth_delete_1.png",alt:"manager_api_auth_delete_1"}})]),a._v(" "),_("p",[_("img",{attrs:{src:"/fizz-gateway-community/manager_api_auth_delete_2.png",alt:"manager_api_auth_delete_2"}})])])}),[],!1,null,null,null);t.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[19],{365:function(a,t,_){"use strict";_.r(t);var r=_(42),e=Object(r.a)({},(function(){var a=this,t=a.$createElement,_=a._self._c||t;return _("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[_("h2",{attrs:{id:"概述"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[a._v("#")]),a._v(" 概述")]),a._v(" "),_("p",[a._v("路由管理功能用于维护网关的路由规则,支持按请求路径转发、转发到指定后端服务两种转发规则,支持插件配置。下面介绍路由管理的操作。")]),a._v(" "),_("h2",{attrs:{id:"路由列表"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#路由列表"}},[a._v("#")]),a._v(" 路由列表")]),a._v(" "),_("p",[a._v("菜单位置:网关管理 > 路由管理。点击菜单后进入路由列表页面,如图所示。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/fizz-gateway-community/manager_api_auth_list_query.png",alt:"manager_api_auth_list_query"}})]),a._v(" "),_("h2",{attrs:{id:"新增路由"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#新增路由"}},[a._v("#")]),a._v(" 新增路由")]),a._v(" "),_("p",[a._v("点击 新增 按钮弹出新增窗口,如图所示。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/fizz-gateway-community/manager_api_auth_add_1.png",alt:"manager_api_auth_add_1"}})]),a._v(" "),_("p",[_("img",{attrs:{src:"/fizz-gateway-community/manager_api_auth_add_2.png",alt:"manager_api_auth_add_2"}})]),a._v(" "),_("p",[a._v("网关分组:选取路由关联的网关分组,只有属于所选分组的网关实例路由规则才会生效,必选;")]),a._v(" "),_("p",[a._v("服务:网关的请求路径格式为 http://{ip}:{port}/proxy/{service}{apiPath},服务对应{service}段,当 转发 选择 按请求路径转发 时服务需要是聚合配置的服务或者是Eureka注册的服务,当 转发 选择 转发到指定后端服务 时服务不需要是实际存在的服务,只用于路径匹配使用,长度不能超过50个字符,必填;")]),a._v(" "),_("p",[a._v("API方法:请求的method类型,可选GET|POST;")]),a._v(" "),_("p",[a._v('API Path:网关的请求路径格式为 http://{ip}:{port}/proxy/{service}{apiPath},API Path对应{apiPath}段,使用前缀匹配原则,例如"/api/"将匹配"/api/"、"/api/1"、"/api/1/1"等路径;')]),a._v(" "),_("p",[a._v("应用:选取路由关联的应用,网关使用选取应用的信息进行鉴权,更多详情请查看appID管理功能介绍;")]),a._v(" "),_("p",[a._v("访问:可选允许|禁止,必选;")]),a._v(" "),_("p",[a._v("转发:可选按请求路径转发|转发到指定后端服务,当选择 按请求路径转发 时,请求会按请求路径转发,例如网关请求 http://{ip}:{port}/proxy/my-service/api-path 将转发到 http://my-service/api-path;当选择 转发到指定后端服务 时,需要添加转发到的后端服务URL,请求会转发到配置的后端服务,例如配置了服务为 my-service,API Path为空,后端服务URL为 http://127.0.0.1:8080/forward-service/,网关请求 http://{ip}:{port}/proxy/my-service/api-path 将转发到 http://127.0.0.1:8080/forward-service/api-path。")]),a._v(" "),_("p",[a._v("点击 添加插件 按钮为路由添加插件,如图所示。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/fizz-gateway-community/manager_api_auth_add_3.png",alt:"manager_api_auth_add_3"}})]),a._v(" "),_("p",[a._v("配置插件路由级别的自定义配置,表单界面来自于插件的表单定义,更多详情请查看插件管理功能介绍。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/fizz-gateway-community/manager_api_auth_add_4.png",alt:"manager_api_auth_add_4"}})]),a._v(" "),_("p",[a._v("配置完成后点击 保存 按钮保存路由规则。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/fizz-gateway-community/manager_api_auth_add_5.png",alt:"manager_api_auth_add_5"}})]),a._v(" "),_("h2",{attrs:{id:"编辑路由"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#编辑路由"}},[a._v("#")]),a._v(" 编辑路由")]),a._v(" "),_("p",[a._v("点击 编辑 按钮弹出编辑窗口,如图所示。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/fizz-gateway-community/manager_api_auth_edit_1.png",alt:"manager_api_auth_edit_1"}})]),a._v(" "),_("p",[_("img",{attrs:{src:"/fizz-gateway-community/manager_api_auth_edit_2.png",alt:"manager_api_auth_edit_2"}})]),a._v(" "),_("h2",{attrs:{id:"删除路由"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#删除路由"}},[a._v("#")]),a._v(" 删除路由")]),a._v(" "),_("p",[a._v("点击 删除 按钮弹出删除确认窗口,如图所示。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/fizz-gateway-community/manager_api_auth_delete_1.png",alt:"manager_api_auth_delete_1"}})]),a._v(" "),_("p",[_("img",{attrs:{src:"/fizz-gateway-community/manager_api_auth_delete_2.png",alt:"manager_api_auth_delete_2"}})])])}),[],!1,null,null,null);t.default=e.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/20.e44fcf7d.js b/docs/assets/js/20.94c02b34.js similarity index 98% rename from docs/assets/js/20.e44fcf7d.js rename to docs/assets/js/20.94c02b34.js index efe45fd..0f70c52 100644 --- a/docs/assets/js/20.e44fcf7d.js +++ b/docs/assets/js/20.94c02b34.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[20],{362:function(a,_,p){"use strict";p.r(_);var t=p(42),e=Object(t.a)({},(function(){var a=this,_=a.$createElement,p=a._self._c||_;return p("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[p("h2",{attrs:{id:"概述"}},[p("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[a._v("#")]),a._v(" 概述")]),a._v(" "),p("p",[a._v("appID管理功能维护应用鉴权信息,可配置是否启用签名、是否启用IP白名单,AppID级别的自定义配置供自定义插件使用。appID用于在路由管理配置中关联路由规则,当对应路由规则触发时会对应用进行鉴权。")]),a._v(" "),p("h2",{attrs:{id:"appid列表"}},[p("a",{staticClass:"header-anchor",attrs:{href:"#appid列表"}},[a._v("#")]),a._v(" appID列表")]),a._v(" "),p("p",[a._v("菜单位置:网关管理 > appID管理。点击菜单后进入appID列表页面,如图所示。")]),a._v(" "),p("p",[p("img",{attrs:{src:"/fizz-gateway-community/manager_app_id_list_query.png",alt:"manager_app_id_list_query"}})]),a._v(" "),p("h2",{attrs:{id:"新增appid"}},[p("a",{staticClass:"header-anchor",attrs:{href:"#新增appid"}},[a._v("#")]),a._v(" 新增appID")]),a._v(" "),p("p",[a._v("点击 新增 按钮弹出新增窗口,如图所示。")]),a._v(" "),p("p",[p("img",{attrs:{src:"/fizz-gateway-community/manager_app_id_add_1.png",alt:"manager_app_id_add_1"}})]),a._v(" "),p("p",[p("img",{attrs:{src:"/fizz-gateway-community/manager_app_id_add_2.png",alt:"manager_app_id_add_2"}})]),a._v(" "),p("p",[a._v("appID:第三方应用唯一标识,长度不能超过64个字符,必填;")]),a._v(" "),p("p",[a._v("应用名:第三方应用名称,长度不能超过128个字符,必填;")]),a._v(" "),p("p",[a._v("是否启用签名:当启动时必须配置 认证方式 和 密钥;")]),a._v(" "),p("p",[a._v("认证方式:可选 密钥(使用网关内置鉴权方式验证)|自定义认证插件(使用自定义的鉴权逻辑),更多信息请查看Fizz网关的介绍;启用签名时必填;")]),a._v(" "),p("p",[a._v("密钥:第三方应用使用的密钥,可通过 生成随机密钥 按钮生成一个随机的密钥,启用签名时必填;")]),a._v(" "),p("p",[a._v("是否启用IP白名单:当启用时可以配置 IP白名单,网关会根据请求来源IP地址进行过滤;")]),a._v(" "),p("p",[a._v("IP白名单:IP段支持 1.2.3.100-120 和 1.2.3.*两种格式,仅最后一段可用范围或星号表示;")]),a._v(" "),p("p",[a._v("自定义配置:AppID级别的自定义配置供自定义插件使用,所有插件均可获取到此配置信息。")]),a._v(" "),p("h2",{attrs:{id:"编辑appid"}},[p("a",{staticClass:"header-anchor",attrs:{href:"#编辑appid"}},[a._v("#")]),a._v(" 编辑appID")]),a._v(" "),p("p",[a._v("点击 编辑 按钮弹出编辑窗口,如图所示。")]),a._v(" "),p("p",[p("img",{attrs:{src:"/fizz-gateway-community/manager_app_id_edit_1.png",alt:"manager_app_id_edit_1"}})]),a._v(" "),p("p",[p("img",{attrs:{src:"/fizz-gateway-community/manager_app_id_edit_2.png",alt:"manager_app_id_edit_2"}})]),a._v(" "),p("h2",{attrs:{id:"删除appid"}},[p("a",{staticClass:"header-anchor",attrs:{href:"#删除appid"}},[a._v("#")]),a._v(" 删除appID")]),a._v(" "),p("p",[a._v("点击 删除 按钮弹出删除确认窗口,如图所示。")]),a._v(" "),p("p",[p("img",{attrs:{src:"/fizz-gateway-community/manager_app_id_delete_1.png",alt:"manager_app_id_delete_1"}})]),a._v(" "),p("p",[p("img",{attrs:{src:"/fizz-gateway-community/manager_app_id_delete_2.png",alt:"manager_app_id_delete_2"}})]),a._v(" "),p("p",[a._v("点击 确定 按钮后删除appID,如果appID存在关联的路由配置时,对应关联的路由配置也会一起删除。")])])}),[],!1,null,null,null);_.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[20],{366:function(a,_,p){"use strict";p.r(_);var t=p(42),e=Object(t.a)({},(function(){var a=this,_=a.$createElement,p=a._self._c||_;return p("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[p("h2",{attrs:{id:"概述"}},[p("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[a._v("#")]),a._v(" 概述")]),a._v(" "),p("p",[a._v("appID管理功能维护应用鉴权信息,可配置是否启用签名、是否启用IP白名单,AppID级别的自定义配置供自定义插件使用。appID用于在路由管理配置中关联路由规则,当对应路由规则触发时会对应用进行鉴权。")]),a._v(" "),p("h2",{attrs:{id:"appid列表"}},[p("a",{staticClass:"header-anchor",attrs:{href:"#appid列表"}},[a._v("#")]),a._v(" appID列表")]),a._v(" "),p("p",[a._v("菜单位置:网关管理 > appID管理。点击菜单后进入appID列表页面,如图所示。")]),a._v(" "),p("p",[p("img",{attrs:{src:"/fizz-gateway-community/manager_app_id_list_query.png",alt:"manager_app_id_list_query"}})]),a._v(" "),p("h2",{attrs:{id:"新增appid"}},[p("a",{staticClass:"header-anchor",attrs:{href:"#新增appid"}},[a._v("#")]),a._v(" 新增appID")]),a._v(" "),p("p",[a._v("点击 新增 按钮弹出新增窗口,如图所示。")]),a._v(" "),p("p",[p("img",{attrs:{src:"/fizz-gateway-community/manager_app_id_add_1.png",alt:"manager_app_id_add_1"}})]),a._v(" "),p("p",[p("img",{attrs:{src:"/fizz-gateway-community/manager_app_id_add_2.png",alt:"manager_app_id_add_2"}})]),a._v(" "),p("p",[a._v("appID:第三方应用唯一标识,长度不能超过64个字符,必填;")]),a._v(" "),p("p",[a._v("应用名:第三方应用名称,长度不能超过128个字符,必填;")]),a._v(" "),p("p",[a._v("是否启用签名:当启动时必须配置 认证方式 和 密钥;")]),a._v(" "),p("p",[a._v("认证方式:可选 密钥(使用网关内置鉴权方式验证)|自定义认证插件(使用自定义的鉴权逻辑),更多信息请查看Fizz网关的介绍;启用签名时必填;")]),a._v(" "),p("p",[a._v("密钥:第三方应用使用的密钥,可通过 生成随机密钥 按钮生成一个随机的密钥,启用签名时必填;")]),a._v(" "),p("p",[a._v("是否启用IP白名单:当启用时可以配置 IP白名单,网关会根据请求来源IP地址进行过滤;")]),a._v(" "),p("p",[a._v("IP白名单:IP段支持 1.2.3.100-120 和 1.2.3.*两种格式,仅最后一段可用范围或星号表示;")]),a._v(" "),p("p",[a._v("自定义配置:AppID级别的自定义配置供自定义插件使用,所有插件均可获取到此配置信息。")]),a._v(" "),p("h2",{attrs:{id:"编辑appid"}},[p("a",{staticClass:"header-anchor",attrs:{href:"#编辑appid"}},[a._v("#")]),a._v(" 编辑appID")]),a._v(" "),p("p",[a._v("点击 编辑 按钮弹出编辑窗口,如图所示。")]),a._v(" "),p("p",[p("img",{attrs:{src:"/fizz-gateway-community/manager_app_id_edit_1.png",alt:"manager_app_id_edit_1"}})]),a._v(" "),p("p",[p("img",{attrs:{src:"/fizz-gateway-community/manager_app_id_edit_2.png",alt:"manager_app_id_edit_2"}})]),a._v(" "),p("h2",{attrs:{id:"删除appid"}},[p("a",{staticClass:"header-anchor",attrs:{href:"#删除appid"}},[a._v("#")]),a._v(" 删除appID")]),a._v(" "),p("p",[a._v("点击 删除 按钮弹出删除确认窗口,如图所示。")]),a._v(" "),p("p",[p("img",{attrs:{src:"/fizz-gateway-community/manager_app_id_delete_1.png",alt:"manager_app_id_delete_1"}})]),a._v(" "),p("p",[p("img",{attrs:{src:"/fizz-gateway-community/manager_app_id_delete_2.png",alt:"manager_app_id_delete_2"}})]),a._v(" "),p("p",[a._v("点击 确定 按钮后删除appID,如果appID存在关联的路由配置时,对应关联的路由配置也会一起删除。")])])}),[],!1,null,null,null);_.default=e.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/21.8859e956.js b/docs/assets/js/21.ff5e068c.js similarity index 97% rename from docs/assets/js/21.8859e956.js rename to docs/assets/js/21.ff5e068c.js index 01c49f2..b3b4eb7 100644 --- a/docs/assets/js/21.8859e956.js +++ b/docs/assets/js/21.ff5e068c.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[21],{363:function(a,t,e){"use strict";e.r(t);var _=e(42),r=Object(_.a)({},(function(){var a=this,t=a.$createElement,e=a._self._c||t;return e("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[e("h2",{attrs:{id:"概述"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[a._v("#")]),a._v(" 概述")]),a._v(" "),e("p",[a._v("网关缓存功能用于查询Fizz网关实例本地缓存的已发布接口信息,可以快速的了解当前网关实例生效的全部接口,同时通过查看后台接口发布版本号与网关实例本地缓存的接口版本号是否一致可以排查接口缓存问题,下面介绍网关缓存功能的操作。")]),a._v(" "),e("h2",{attrs:{id:"网关列表"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#网关列表"}},[a._v("#")]),a._v(" 网关列表")]),a._v(" "),e("p",[a._v("菜单位置:服务编排 > 网关缓存。点击菜单后进入网关列表页面,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_gateway_list_query.png",alt:"manager_aggregate_gateway_list_query"}})]),a._v(" "),e("p",[a._v("Fizz网关与后台注册到同一个eureka注册中心,后台通过eureka获取网关的实例列表。")]),a._v(" "),e("h2",{attrs:{id:"网关缓存列表"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#网关缓存列表"}},[a._v("#")]),a._v(" 网关缓存列表")]),a._v(" "),e("p",[a._v("点击 查看 按钮后弹出网关详情页面,该页面显示所选网关实例的接口缓存列表,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_gateway_cache_list_query_1.png",alt:"manager_aggregate_gateway_cache_list_query_1"}})]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_gateway_cache_list_query_2.png",alt:"manager_aggregate_gateway_cache_list_query_2"}})]),a._v(" "),e("h2",{attrs:{id:"网关缓存详情"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#网关缓存详情"}},[a._v("#")]),a._v(" 网关缓存详情")]),a._v(" "),e("p",[a._v("点击 查看 按钮弹出所选接口的配置详情,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_gateway_cache_detail_1.png",alt:"manager_aggregate_gateway_cache_detail_1"}})]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_gateway_cache_detail_2.png",alt:"manager_aggregate_gateway_cache_detail_2"}})])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[21],{367:function(a,t,e){"use strict";e.r(t);var _=e(42),r=Object(_.a)({},(function(){var a=this,t=a.$createElement,e=a._self._c||t;return e("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[e("h2",{attrs:{id:"概述"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[a._v("#")]),a._v(" 概述")]),a._v(" "),e("p",[a._v("网关缓存功能用于查询Fizz网关实例本地缓存的已发布接口信息,可以快速的了解当前网关实例生效的全部接口,同时通过查看后台接口发布版本号与网关实例本地缓存的接口版本号是否一致可以排查接口缓存问题,下面介绍网关缓存功能的操作。")]),a._v(" "),e("h2",{attrs:{id:"网关列表"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#网关列表"}},[a._v("#")]),a._v(" 网关列表")]),a._v(" "),e("p",[a._v("菜单位置:服务编排 > 网关缓存。点击菜单后进入网关列表页面,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_gateway_list_query.png",alt:"manager_aggregate_gateway_list_query"}})]),a._v(" "),e("p",[a._v("Fizz网关与后台注册到同一个eureka注册中心,后台通过eureka获取网关的实例列表。")]),a._v(" "),e("h2",{attrs:{id:"网关缓存列表"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#网关缓存列表"}},[a._v("#")]),a._v(" 网关缓存列表")]),a._v(" "),e("p",[a._v("点击 查看 按钮后弹出网关详情页面,该页面显示所选网关实例的接口缓存列表,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_gateway_cache_list_query_1.png",alt:"manager_aggregate_gateway_cache_list_query_1"}})]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_gateway_cache_list_query_2.png",alt:"manager_aggregate_gateway_cache_list_query_2"}})]),a._v(" "),e("h2",{attrs:{id:"网关缓存详情"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#网关缓存详情"}},[a._v("#")]),a._v(" 网关缓存详情")]),a._v(" "),e("p",[a._v("点击 查看 按钮弹出所选接口的配置详情,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_gateway_cache_detail_1.png",alt:"manager_aggregate_gateway_cache_detail_1"}})]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_gateway_cache_detail_2.png",alt:"manager_aggregate_gateway_cache_detail_2"}})])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/22.69bbe610.js b/docs/assets/js/22.1f3d545e.js similarity index 98% rename from docs/assets/js/22.69bbe610.js rename to docs/assets/js/22.1f3d545e.js index 9198f86..6ad82f5 100644 --- a/docs/assets/js/22.69bbe610.js +++ b/docs/assets/js/22.1f3d545e.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[22],{364:function(a,t,_){"use strict";_.r(t);var r=_(42),e=Object(r.a)({},(function(){var a=this,t=a.$createElement,_=a._self._c||t;return _("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[_("h2",{attrs:{id:"概述"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[a._v("#")]),a._v(" 概述")]),a._v(" "),_("p",[a._v("网关分组功能用于维护分组元数据,将网关实例IP与分组关联,通过为不同的分组配置不同的路由策略,从而实现网关的分组管理。")]),a._v(" "),_("h2",{attrs:{id:"分组示例"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#分组示例"}},[a._v("#")]),a._v(" 分组示例")]),a._v(" "),_("p",[a._v("我们的线上业务涉及To C(个人用户)、To B(企业)、To T(第三方),对于不同业务会有对应的机器接受请求访问,不同的业务需要有各自的路由策略,因此进行了如下的分组划分。")]),a._v(" "),_("table",[_("thead",[_("tr",[_("th",[a._v("分组ID")]),a._v(" "),_("th",[a._v("分组名称")]),a._v(" "),_("th",[a._v("描述")])])]),a._v(" "),_("tbody",[_("tr",[_("td",[a._v("default")]),a._v(" "),_("td",[a._v("默认分组")]),a._v(" "),_("td",[a._v("默认分组是后台默认创建的分组,不用指定IP,不属于其它分组的机器都归到默认分组,默认分组不可修改或删除")])]),a._v(" "),_("tr",[_("td",[a._v("c")]),a._v(" "),_("td",[a._v("2c分组")]),a._v(" "),_("td",[a._v("只接受面向个人用户的请求")])]),a._v(" "),_("tr",[_("td",[a._v("b")]),a._v(" "),_("td",[a._v("2b分组")]),a._v(" "),_("td",[a._v("只接受面向企业的请求")])]),a._v(" "),_("tr",[_("td",[a._v("t")]),a._v(" "),_("td",[a._v("面向第三方的分组")]),a._v(" "),_("td",[a._v("只接受面向第三方的请求")])])])]),a._v(" "),_("p",[a._v("下面介绍网关分组功能的操作。")]),a._v(" "),_("h2",{attrs:{id:"分组列表"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#分组列表"}},[a._v("#")]),a._v(" 分组列表")]),a._v(" "),_("p",[a._v("菜单位置:网关管理 > 网关分组。点击菜单后进入分组列表页面,如图所示。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/fizz-gateway-community/manager_gateway_group_list_query.png",alt:"manager_gateway_group_list_query"}})]),a._v(" "),_("h2",{attrs:{id:"新增分组"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#新增分组"}},[a._v("#")]),a._v(" 新增分组")]),a._v(" "),_("p",[a._v("点击 新增 按钮弹出新增窗口,如图所示。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/fizz-gateway-community/manager_gateway_group_add_1.png",alt:"manager_gateway_group_add_1"}})]),a._v(" "),_("p",[_("img",{attrs:{src:"/fizz-gateway-community/manager_gateway_group_add_2.png",alt:"manager_gateway_group_add_2"}})]),a._v(" "),_("p",[a._v("分组ID:分组的唯一标识,长度不能超过32个字符,必填;")]),a._v(" "),_("p",[a._v("分组名称:分组的名称,用于在分组选项时展示,长度不能超过32个字符,必填;")]),a._v(" "),_("p",[a._v("网关实例IP:Fizz网关集群内的机器IP地址,多个IP地址使用逗号分隔。")]),a._v(" "),_("h2",{attrs:{id:"编辑分组"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#编辑分组"}},[a._v("#")]),a._v(" 编辑分组")]),a._v(" "),_("p",[a._v("点击 编辑 按钮弹出编辑窗口,如图所示。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/fizz-gateway-community/manager_gateway_group_edit_1.png",alt:"manager_gateway_group_edit_1"}})]),a._v(" "),_("p",[_("img",{attrs:{src:"/fizz-gateway-community/manager_gateway_group_edit_2.png",alt:"manager_gateway_group_edit_2"}})]),a._v(" "),_("h2",{attrs:{id:"删除分组"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#删除分组"}},[a._v("#")]),a._v(" 删除分组")]),a._v(" "),_("p",[a._v("点击 删除 按钮弹出删除确认窗口,如图所示。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/fizz-gateway-community/manager_gateway_group_delete_1.png",alt:"manager_gateway_group_delete_1"}})]),a._v(" "),_("p",[_("img",{attrs:{src:"/fizz-gateway-community/manager_gateway_group_delete_2.png",alt:"manager_gateway_group_delete_2"}})]),a._v(" "),_("p",[a._v("点击 确定 按钮后删除网关分组,如果网关分组存在关联的路由配置时,需要将关联的路由配置全部删除后才能删除分组。")])])}),[],!1,null,null,null);t.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[22],{370:function(a,t,_){"use strict";_.r(t);var r=_(42),e=Object(r.a)({},(function(){var a=this,t=a.$createElement,_=a._self._c||t;return _("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[_("h2",{attrs:{id:"概述"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[a._v("#")]),a._v(" 概述")]),a._v(" "),_("p",[a._v("网关分组功能用于维护分组元数据,将网关实例IP与分组关联,通过为不同的分组配置不同的路由策略,从而实现网关的分组管理。")]),a._v(" "),_("h2",{attrs:{id:"分组示例"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#分组示例"}},[a._v("#")]),a._v(" 分组示例")]),a._v(" "),_("p",[a._v("我们的线上业务涉及To C(个人用户)、To B(企业)、To T(第三方),对于不同业务会有对应的机器接受请求访问,不同的业务需要有各自的路由策略,因此进行了如下的分组划分。")]),a._v(" "),_("table",[_("thead",[_("tr",[_("th",[a._v("分组ID")]),a._v(" "),_("th",[a._v("分组名称")]),a._v(" "),_("th",[a._v("描述")])])]),a._v(" "),_("tbody",[_("tr",[_("td",[a._v("default")]),a._v(" "),_("td",[a._v("默认分组")]),a._v(" "),_("td",[a._v("默认分组是后台默认创建的分组,不用指定IP,不属于其它分组的机器都归到默认分组,默认分组不可修改或删除")])]),a._v(" "),_("tr",[_("td",[a._v("c")]),a._v(" "),_("td",[a._v("2c分组")]),a._v(" "),_("td",[a._v("只接受面向个人用户的请求")])]),a._v(" "),_("tr",[_("td",[a._v("b")]),a._v(" "),_("td",[a._v("2b分组")]),a._v(" "),_("td",[a._v("只接受面向企业的请求")])]),a._v(" "),_("tr",[_("td",[a._v("t")]),a._v(" "),_("td",[a._v("面向第三方的分组")]),a._v(" "),_("td",[a._v("只接受面向第三方的请求")])])])]),a._v(" "),_("p",[a._v("下面介绍网关分组功能的操作。")]),a._v(" "),_("h2",{attrs:{id:"分组列表"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#分组列表"}},[a._v("#")]),a._v(" 分组列表")]),a._v(" "),_("p",[a._v("菜单位置:网关管理 > 网关分组。点击菜单后进入分组列表页面,如图所示。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/fizz-gateway-community/manager_gateway_group_list_query.png",alt:"manager_gateway_group_list_query"}})]),a._v(" "),_("h2",{attrs:{id:"新增分组"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#新增分组"}},[a._v("#")]),a._v(" 新增分组")]),a._v(" "),_("p",[a._v("点击 新增 按钮弹出新增窗口,如图所示。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/fizz-gateway-community/manager_gateway_group_add_1.png",alt:"manager_gateway_group_add_1"}})]),a._v(" "),_("p",[_("img",{attrs:{src:"/fizz-gateway-community/manager_gateway_group_add_2.png",alt:"manager_gateway_group_add_2"}})]),a._v(" "),_("p",[a._v("分组ID:分组的唯一标识,长度不能超过32个字符,必填;")]),a._v(" "),_("p",[a._v("分组名称:分组的名称,用于在分组选项时展示,长度不能超过32个字符,必填;")]),a._v(" "),_("p",[a._v("网关实例IP:Fizz网关集群内的机器IP地址,多个IP地址使用逗号分隔。")]),a._v(" "),_("h2",{attrs:{id:"编辑分组"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#编辑分组"}},[a._v("#")]),a._v(" 编辑分组")]),a._v(" "),_("p",[a._v("点击 编辑 按钮弹出编辑窗口,如图所示。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/fizz-gateway-community/manager_gateway_group_edit_1.png",alt:"manager_gateway_group_edit_1"}})]),a._v(" "),_("p",[_("img",{attrs:{src:"/fizz-gateway-community/manager_gateway_group_edit_2.png",alt:"manager_gateway_group_edit_2"}})]),a._v(" "),_("h2",{attrs:{id:"删除分组"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#删除分组"}},[a._v("#")]),a._v(" 删除分组")]),a._v(" "),_("p",[a._v("点击 删除 按钮弹出删除确认窗口,如图所示。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/fizz-gateway-community/manager_gateway_group_delete_1.png",alt:"manager_gateway_group_delete_1"}})]),a._v(" "),_("p",[_("img",{attrs:{src:"/fizz-gateway-community/manager_gateway_group_delete_2.png",alt:"manager_gateway_group_delete_2"}})]),a._v(" "),_("p",[a._v("点击 确定 按钮后删除网关分组,如果网关分组存在关联的路由配置时,需要将关联的路由配置全部删除后才能删除分组。")])])}),[],!1,null,null,null);t.default=e.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/23.d558c8c3.js b/docs/assets/js/23.e4fc3148.js similarity index 98% rename from docs/assets/js/23.d558c8c3.js rename to docs/assets/js/23.e4fc3148.js index b103d0e..0cc333b 100644 --- a/docs/assets/js/23.d558c8c3.js +++ b/docs/assets/js/23.e4fc3148.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[23],{365:function(v,_,i){"use strict";i.r(_);var a=i(42),t=Object(a.a)({},(function(){var v=this,_=v.$createElement,i=v._self._c||_;return i("ContentSlotsDistributor",{attrs:{"slot-key":v.$parent.slotKey}},[i("h2",{attrs:{id:"概述"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[v._v("#")]),v._v(" 概述")]),v._v(" "),i("p",[v._v("Fizz管理后台是Fizz网关的配套系统,基于Java、Vue开发,通过界面对Fizz网关集群进行各项配置。")]),v._v(" "),i("h2",{attrs:{id:"功能"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#功能"}},[v._v("#")]),v._v(" 功能")]),v._v(" "),i("p",[v._v("Fizz管理后台包含如下功能:")]),v._v(" "),i("ul",[i("li",[v._v("网关管理\n"),i("ul",[i("li",[v._v("网关分组:对Fizz网关集群内的机器进行逻辑上的分组,针对不同的分组可配置不同的路由策略。")]),v._v(" "),i("li",[v._v("插件管理:维护插件元数据,定义路由级别的自定义属性、插件级别的自定义配置信息。")]),v._v(" "),i("li",[v._v("appID管理:配置应用鉴权信息,可配置是否启用签名、是否启用IP白名单,AppID级别的自定义配置供自定义插件使用。")]),v._v(" "),i("li",[v._v("路由管理:配置服务或API路由规则,支持按请求路径转发、转发到指定后端服务两种转发规则,支持插件配置。")]),v._v(" "),i("li",[v._v("接口统计:Fizz网关接口访问统计功能,以图表的形式展示指定时间段内每日的接口总数、访问次数,可查看接口的历史访问总次数以及最近请求时间。")])])]),v._v(" "),i("li",[v._v("服务编排\n"),i("ul",[i("li",[v._v("服务管理:聚合接口归属于服务,服务通过该功能维护,创建人自动获得服务权限,服务权限可分配,拥有权限的用户才能操作对应的接口列表。")]),v._v(" "),i("li",[v._v("接口列表:基于现有的业务微服务使用在线配置的方式快速的生成一个聚合接口,同时提供在线测试功能,发布历史版本查看。")]),v._v(" "),i("li",[v._v("操作日志:查看聚合接口的新增、修改、发布、下线、回滚、删除操作日志。")]),v._v(" "),i("li",[v._v("网关缓存:查看Fizz网关当前在线的实例列表以及对应实例本地缓存的已发布接口信息。")])])]),v._v(" "),i("li",[v._v("发布申请\n"),i("ul",[i("li",[v._v("我的申请:提交接口发布|下线申请,审核通过后可以对相关接口执行发布|下线操作。")]),v._v(" "),i("li",[v._v("待审核:审核发布|下线申请。")]),v._v(" "),i("li",[v._v("审核日志:查看审核发布|下线申请操作日志。")])])]),v._v(" "),i("li",[v._v("权限管理\n"),i("ul",[i("li",[v._v("角色管理:维护角色数据,为角色分配权限。")])])]),v._v(" "),i("li",[v._v("系统管理\n"),i("ul",[i("li",[v._v("用户管理:维护用户数据,为用户分配角色。")])])])]),v._v(" "),i("h2",{attrs:{id:"界面"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#界面"}},[v._v("#")]),v._v(" 界面")]),v._v(" "),i("p",[i("img",{attrs:{src:"/fizz-gateway-community/manager_overview_1.png",alt:"manager_overview_1"}})]),v._v(" "),i("p",[i("img",{attrs:{src:"/fizz-gateway-community/manager_overview_2.png",alt:"manager_overview_2"}})])])}),[],!1,null,null,null);_.default=t.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[23],{368:function(v,_,i){"use strict";i.r(_);var a=i(42),t=Object(a.a)({},(function(){var v=this,_=v.$createElement,i=v._self._c||_;return i("ContentSlotsDistributor",{attrs:{"slot-key":v.$parent.slotKey}},[i("h2",{attrs:{id:"概述"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[v._v("#")]),v._v(" 概述")]),v._v(" "),i("p",[v._v("Fizz管理后台是Fizz网关的配套系统,基于Java、Vue开发,通过界面对Fizz网关集群进行各项配置。")]),v._v(" "),i("h2",{attrs:{id:"功能"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#功能"}},[v._v("#")]),v._v(" 功能")]),v._v(" "),i("p",[v._v("Fizz管理后台包含如下功能:")]),v._v(" "),i("ul",[i("li",[v._v("网关管理\n"),i("ul",[i("li",[v._v("网关分组:对Fizz网关集群内的机器进行逻辑上的分组,针对不同的分组可配置不同的路由策略。")]),v._v(" "),i("li",[v._v("插件管理:维护插件元数据,定义路由级别的自定义属性、插件级别的自定义配置信息。")]),v._v(" "),i("li",[v._v("appID管理:配置应用鉴权信息,可配置是否启用签名、是否启用IP白名单,AppID级别的自定义配置供自定义插件使用。")]),v._v(" "),i("li",[v._v("路由管理:配置服务或API路由规则,支持按请求路径转发、转发到指定后端服务两种转发规则,支持插件配置。")]),v._v(" "),i("li",[v._v("接口统计:Fizz网关接口访问统计功能,以图表的形式展示指定时间段内每日的接口总数、访问次数,可查看接口的历史访问总次数以及最近请求时间。")])])]),v._v(" "),i("li",[v._v("服务编排\n"),i("ul",[i("li",[v._v("服务管理:聚合接口归属于服务,服务通过该功能维护,创建人自动获得服务权限,服务权限可分配,拥有权限的用户才能操作对应的接口列表。")]),v._v(" "),i("li",[v._v("接口列表:基于现有的业务微服务使用在线配置的方式快速的生成一个聚合接口,同时提供在线测试功能,发布历史版本查看。")]),v._v(" "),i("li",[v._v("操作日志:查看聚合接口的新增、修改、发布、下线、回滚、删除操作日志。")]),v._v(" "),i("li",[v._v("网关缓存:查看Fizz网关当前在线的实例列表以及对应实例本地缓存的已发布接口信息。")])])]),v._v(" "),i("li",[v._v("发布申请\n"),i("ul",[i("li",[v._v("我的申请:提交接口发布|下线申请,审核通过后可以对相关接口执行发布|下线操作。")]),v._v(" "),i("li",[v._v("待审核:审核发布|下线申请。")]),v._v(" "),i("li",[v._v("审核日志:查看审核发布|下线申请操作日志。")])])]),v._v(" "),i("li",[v._v("权限管理\n"),i("ul",[i("li",[v._v("角色管理:维护角色数据,为角色分配权限。")])])]),v._v(" "),i("li",[v._v("系统管理\n"),i("ul",[i("li",[v._v("用户管理:维护用户数据,为用户分配角色。")])])])]),v._v(" "),i("h2",{attrs:{id:"界面"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#界面"}},[v._v("#")]),v._v(" 界面")]),v._v(" "),i("p",[i("img",{attrs:{src:"/fizz-gateway-community/manager_overview_1.png",alt:"manager_overview_1"}})]),v._v(" "),i("p",[i("img",{attrs:{src:"/fizz-gateway-community/manager_overview_2.png",alt:"manager_overview_2"}})])])}),[],!1,null,null,null);_.default=t.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/24.90d6ddb8.js b/docs/assets/js/24.7e82030a.js similarity index 99% rename from docs/assets/js/24.90d6ddb8.js rename to docs/assets/js/24.7e82030a.js index 10dec7b..446ae44 100644 --- a/docs/assets/js/24.90d6ddb8.js +++ b/docs/assets/js/24.7e82030a.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[24],{367:function(t,s,a){"use strict";a.r(s);var n=a(42),r=Object(n.a)({},(function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h2",{attrs:{id:"概述"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[t._v("#")]),t._v(" 概述")]),t._v(" "),a("p",[t._v("插件管理功能用于维护插件元数据,定义路由级别的自定义属性、插件级别的自定义配置信息。创建的插件用于路由管理设置时启用,当网关接受请求匹配路由规则时会触发启用的插件逻辑执行,插件逻辑中可获取到自定义的属性数据。")]),t._v(" "),a("h2",{attrs:{id:"插件列表"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#插件列表"}},[t._v("#")]),t._v(" 插件列表")]),t._v(" "),a("p",[t._v("菜单位置:网关管理 > 插件管理。点击菜单后进入插件管理列表页面,如图所示。")]),t._v(" "),a("p",[a("img",{attrs:{src:"/fizz-gateway-community/manager_plugin_list_query.png",alt:"manager_plugin_list_query"}})]),t._v(" "),a("h2",{attrs:{id:"新增插件"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#新增插件"}},[t._v("#")]),t._v(" 新增插件")]),t._v(" "),a("p",[t._v("点击 新增 按钮弹出新增窗口,如图所示。")]),t._v(" "),a("p",[a("img",{attrs:{src:"/fizz-gateway-community/manager_plugin_add_1.png",alt:"manager_plugin_add_1"}})]),t._v(" "),a("p",[a("img",{attrs:{src:"/fizz-gateway-community/manager_plugin_add_2.png",alt:"manager_plugin_add_2"}})]),t._v(" "),a("p",[t._v("插件名称:插件名称由英文字母、下划线或数字组成,不能以数字开头,长度不能超过50个字符,必填;")]),t._v(" "),a("p",[t._v("插件描述:插件的简要描述,长度不能超过50个字符,必填;")]),t._v(" "),a("p",[t._v("默认执行顺序:插件的默认执行顺序,按从小到大排序,值越小越先执行,取值范围0~255,必填;")]),t._v(" "),a("p",[t._v("表单定义:路由级别的自定义属性,在路由管理配置启用插件时前端会将表单定义转化为表单输入界面,更多信息请查看路由管理介绍。表单规范说明如下:")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/*\n* plugin_config_design\n* 动态插件参考结构\n* */")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" pluginConfig "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* 必有字段 */")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"field"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"inputVal"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"输入框"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"component"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"input"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// input, select, radio, checkbox,")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"dataType"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// number(long, double), string, boolean, array")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* 可选字段 */")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"desc"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"字段的说明文字"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"placeholder"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"placeholder文字"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"default"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Aa123"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 初始默认值")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"options"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// for select, radio, checkbox")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"选项1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// number(long, double), string, boolean,")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"选项2"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"rules"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// min|max / range / length / regex pattern")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"required"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"message"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"输入框不能为空"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"trigger"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"change"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// required 必填")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// { "min": 3, "ma x": 5, "message": "长度在 3 到 5 个字符", "trigger": "change" }, // range 长度范围(for dataType:"string")')]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// { "len": 8, "message": "长度需 8 个字符", "trigger": "change" }, // length 长度限制(for dataType:"string")')]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// { "type": "number", "message": "请输入数字类型"}, // for dataType:"number" 校验数值')]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// { "type": "integer", "message": "请输入整数数值", "trigger": "change" }, // for dataType:"long" 校验整数')]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// { "type": "float", "message": "请输入浮点数数值", "trigger": "change" }, // for dataType:"double" 校验浮点数')]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"pattern"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"^[A-Za-z\\\\d]+$"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"message"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"只能是字母或数字"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"trigger"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"change"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// regex pattern正则")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"field"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"selectVal"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"选择器"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"component"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"select"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"dataType"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"options"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"选项1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"选项2"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"选项3"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"desc"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"选择器的说明文字"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"placeholder"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"请选择"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"rules"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"required"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"message"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"选择器不能为空"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"trigger"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"change"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"field"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"radioVal"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"单选框"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"component"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"radio"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"dataType"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"boolean"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"default"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"options"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"是"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"否"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"desc"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"单选框的说明文字"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"rules"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"required"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"message"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"请选择单选框"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"trigger"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"change"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"field"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"checkboxVal"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"多选框"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"component"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"checkbox"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"dataType"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"array"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"options"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"选项1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("11")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"选项2"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("22")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"选项3"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("33")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"desc"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"多选框的说明文字"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"rules"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"required"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"message"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"请选择多选框"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"trigger"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"change"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// TODO 注意!!")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// 组件 "checkbox" 的dataType = "array"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// 组件 "radio/select" 的实际值类型等于options内的value值类型')]),t._v("\n")])])]),a("p",[t._v("自定义配置:插件级别的自定义配置信息,插件逻辑中可获取到该信息。")]),t._v(" "),a("h2",{attrs:{id:"编辑插件"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#编辑插件"}},[t._v("#")]),t._v(" 编辑插件")]),t._v(" "),a("p",[t._v("点击 编辑 按钮弹出编辑窗口,如图所示。")]),t._v(" "),a("p",[a("img",{attrs:{src:"/fizz-gateway-community/manager_plugin_edit_1.png",alt:"manager_plugin_edit_1"}})]),t._v(" "),a("p",[a("img",{attrs:{src:"/fizz-gateway-community/manager_plugin_edit_2.png",alt:"manager_plugin_edit_2"}})]),t._v(" "),a("h2",{attrs:{id:"删除插件"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#删除插件"}},[t._v("#")]),t._v(" 删除插件")]),t._v(" "),a("p",[t._v("点击 删除 按钮弹出删除确认窗口,如图所示。")]),t._v(" "),a("p",[a("img",{attrs:{src:"/fizz-gateway-community/manager_plugin_delete_1.png",alt:"manager_plugin_delete_1"}})]),t._v(" "),a("p",[a("img",{attrs:{src:"/fizz-gateway-community/manager_plugin_delete_2.png",alt:"manager_plugin_delete_2"}})]),t._v(" "),a("p",[t._v("点击 确定 按钮后删除插件,如果插件存在关联的路由配置时,需要将关联的路由配置全部删除后才能删除插件。")])])}),[],!1,null,null,null);s.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[24],{369:function(t,s,a){"use strict";a.r(s);var n=a(42),r=Object(n.a)({},(function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h2",{attrs:{id:"概述"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[t._v("#")]),t._v(" 概述")]),t._v(" "),a("p",[t._v("插件管理功能用于维护插件元数据,定义路由级别的自定义属性、插件级别的自定义配置信息。创建的插件用于路由管理设置时启用,当网关接受请求匹配路由规则时会触发启用的插件逻辑执行,插件逻辑中可获取到自定义的属性数据。")]),t._v(" "),a("h2",{attrs:{id:"插件列表"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#插件列表"}},[t._v("#")]),t._v(" 插件列表")]),t._v(" "),a("p",[t._v("菜单位置:网关管理 > 插件管理。点击菜单后进入插件管理列表页面,如图所示。")]),t._v(" "),a("p",[a("img",{attrs:{src:"/fizz-gateway-community/manager_plugin_list_query.png",alt:"manager_plugin_list_query"}})]),t._v(" "),a("h2",{attrs:{id:"新增插件"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#新增插件"}},[t._v("#")]),t._v(" 新增插件")]),t._v(" "),a("p",[t._v("点击 新增 按钮弹出新增窗口,如图所示。")]),t._v(" "),a("p",[a("img",{attrs:{src:"/fizz-gateway-community/manager_plugin_add_1.png",alt:"manager_plugin_add_1"}})]),t._v(" "),a("p",[a("img",{attrs:{src:"/fizz-gateway-community/manager_plugin_add_2.png",alt:"manager_plugin_add_2"}})]),t._v(" "),a("p",[t._v("插件名称:插件名称由英文字母、下划线或数字组成,不能以数字开头,长度不能超过50个字符,必填;")]),t._v(" "),a("p",[t._v("插件描述:插件的简要描述,长度不能超过50个字符,必填;")]),t._v(" "),a("p",[t._v("默认执行顺序:插件的默认执行顺序,按从小到大排序,值越小越先执行,取值范围0~255,必填;")]),t._v(" "),a("p",[t._v("表单定义:路由级别的自定义属性,在路由管理配置启用插件时前端会将表单定义转化为表单输入界面,更多信息请查看路由管理介绍。表单规范说明如下:")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/*\n* plugin_config_design\n* 动态插件参考结构\n* */")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" pluginConfig "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* 必有字段 */")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"field"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"inputVal"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"输入框"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"component"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"input"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// input, select, radio, checkbox,")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"dataType"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// number(long, double), string, boolean, array")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* 可选字段 */")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"desc"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"字段的说明文字"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"placeholder"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"placeholder文字"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"default"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Aa123"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 初始默认值")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"options"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// for select, radio, checkbox")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"选项1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// number(long, double), string, boolean,")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"选项2"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"rules"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// min|max / range / length / regex pattern")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"required"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"message"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"输入框不能为空"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"trigger"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"change"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// required 必填")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// { "min": 3, "ma x": 5, "message": "长度在 3 到 5 个字符", "trigger": "change" }, // range 长度范围(for dataType:"string")')]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// { "len": 8, "message": "长度需 8 个字符", "trigger": "change" }, // length 长度限制(for dataType:"string")')]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// { "type": "number", "message": "请输入数字类型"}, // for dataType:"number" 校验数值')]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// { "type": "integer", "message": "请输入整数数值", "trigger": "change" }, // for dataType:"long" 校验整数')]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// { "type": "float", "message": "请输入浮点数数值", "trigger": "change" }, // for dataType:"double" 校验浮点数')]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"pattern"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"^[A-Za-z\\\\d]+$"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"message"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"只能是字母或数字"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"trigger"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"change"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// regex pattern正则")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"field"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"selectVal"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"选择器"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"component"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"select"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"dataType"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"options"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"选项1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"选项2"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"选项3"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"desc"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"选择器的说明文字"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"placeholder"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"请选择"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"rules"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"required"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"message"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"选择器不能为空"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"trigger"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"change"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"field"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"radioVal"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"单选框"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"component"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"radio"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"dataType"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"boolean"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"default"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"options"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"是"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"否"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"desc"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"单选框的说明文字"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"rules"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"required"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"message"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"请选择单选框"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"trigger"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"change"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"field"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"checkboxVal"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"多选框"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"component"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"checkbox"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"dataType"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"array"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"options"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"选项1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("11")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"选项2"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("22")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"选项3"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("33")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"desc"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"多选框的说明文字"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"rules"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"required"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"message"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"请选择多选框"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"trigger"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"change"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// TODO 注意!!")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// 组件 "checkbox" 的dataType = "array"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// 组件 "radio/select" 的实际值类型等于options内的value值类型')]),t._v("\n")])])]),a("p",[t._v("自定义配置:插件级别的自定义配置信息,插件逻辑中可获取到该信息。")]),t._v(" "),a("h2",{attrs:{id:"编辑插件"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#编辑插件"}},[t._v("#")]),t._v(" 编辑插件")]),t._v(" "),a("p",[t._v("点击 编辑 按钮弹出编辑窗口,如图所示。")]),t._v(" "),a("p",[a("img",{attrs:{src:"/fizz-gateway-community/manager_plugin_edit_1.png",alt:"manager_plugin_edit_1"}})]),t._v(" "),a("p",[a("img",{attrs:{src:"/fizz-gateway-community/manager_plugin_edit_2.png",alt:"manager_plugin_edit_2"}})]),t._v(" "),a("h2",{attrs:{id:"删除插件"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#删除插件"}},[t._v("#")]),t._v(" 删除插件")]),t._v(" "),a("p",[t._v("点击 删除 按钮弹出删除确认窗口,如图所示。")]),t._v(" "),a("p",[a("img",{attrs:{src:"/fizz-gateway-community/manager_plugin_delete_1.png",alt:"manager_plugin_delete_1"}})]),t._v(" "),a("p",[a("img",{attrs:{src:"/fizz-gateway-community/manager_plugin_delete_2.png",alt:"manager_plugin_delete_2"}})]),t._v(" "),a("p",[t._v("点击 确定 按钮后删除插件,如果插件存在关联的路由配置时,需要将关联的路由配置全部删除后才能删除插件。")])])}),[],!1,null,null,null);s.default=r.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/25.0f5aa895.js b/docs/assets/js/25.fc38ae5b.js similarity index 97% rename from docs/assets/js/25.0f5aa895.js rename to docs/assets/js/25.fc38ae5b.js index 0428327..620b4c4 100644 --- a/docs/assets/js/25.0f5aa895.js +++ b/docs/assets/js/25.fc38ae5b.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[25],{369:function(a,t,r){"use strict";r.r(t);var _=r(42),e=Object(_.a)({},(function(){var a=this,t=a.$createElement,r=a._self._c||t;return r("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[r("h2",{attrs:{id:"概述"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[a._v("#")]),a._v(" 概述")]),a._v(" "),r("p",[a._v("角色管理功能维护角色元数据,通过配置角色拥有的菜单资源,限制用户只能操作拥有的角色对应的菜单资源,下面介绍角色管理功能的操作。")]),a._v(" "),r("h2",{attrs:{id:"角色列表"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#角色列表"}},[a._v("#")]),a._v(" 角色列表")]),a._v(" "),r("p",[a._v("菜单位置:权限管理 > 角色管理。点击菜单后进入角色列表页面,如图所示。")]),a._v(" "),r("p",[r("img",{attrs:{src:"/fizz-gateway-community/manager_role_list_query.png",alt:"manager_role_list_query"}})]),a._v(" "),r("h2",{attrs:{id:"添加角色"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#添加角色"}},[a._v("#")]),a._v(" 添加角色")]),a._v(" "),r("p",[a._v("点击 新增 按钮弹出新增窗口,如图所示。")]),a._v(" "),r("p",[r("img",{attrs:{src:"/fizz-gateway-community/manager_role_add_1.png",alt:"manager_role_add_1"}})]),a._v(" "),r("p",[r("img",{attrs:{src:"/fizz-gateway-community/manager_role_add_2.png",alt:"manager_role_add_2"}})]),a._v(" "),r("h2",{attrs:{id:"权限设置"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#权限设置"}},[a._v("#")]),a._v(" 权限设置")]),a._v(" "),r("p",[a._v("勾选需要分配权限的角色,点击 权限设置 按钮弹出角色权限配置窗口,如图所示。")]),a._v(" "),r("p",[r("img",{attrs:{src:"/fizz-gateway-community/manager_role_auth_1.png",alt:"manager_role_auth_1"}})]),a._v(" "),r("p",[r("img",{attrs:{src:"/fizz-gateway-community/manager_role_auth_2.png",alt:"manager_role_auth_2"}})]),a._v(" "),r("p",[a._v("勾选菜单后点击 确定 按钮确认给角色分配菜单权限。")]),a._v(" "),r("h2",{attrs:{id:"编辑角色"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#编辑角色"}},[a._v("#")]),a._v(" 编辑角色")]),a._v(" "),r("p",[a._v("点击 编辑 按钮弹出编辑窗口,如图所示。")]),a._v(" "),r("p",[r("img",{attrs:{src:"/fizz-gateway-community/manager_role_edit_1.png",alt:"manager_role_edit_1"}})]),a._v(" "),r("p",[r("img",{attrs:{src:"/fizz-gateway-community/manager_role_edit_2.png",alt:"manager_role_edit_2"}})]),a._v(" "),r("h2",{attrs:{id:"删除角色"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#删除角色"}},[a._v("#")]),a._v(" 删除角色")]),a._v(" "),r("p",[a._v("点击 删除 按钮弹出删除确认窗口,如图所示。")]),a._v(" "),r("p",[r("img",{attrs:{src:"/fizz-gateway-community/manager_role_delete_1.png",alt:"manager_role_delete_1"}})]),a._v(" "),r("p",[r("img",{attrs:{src:"/fizz-gateway-community/manager_role_delete_2.png",alt:"manager_role_delete_2"}})]),a._v(" "),r("p",[a._v("点击 确定 按钮后删除角色。")])])}),[],!1,null,null,null);t.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[25],{371:function(a,t,r){"use strict";r.r(t);var _=r(42),e=Object(_.a)({},(function(){var a=this,t=a.$createElement,r=a._self._c||t;return r("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[r("h2",{attrs:{id:"概述"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[a._v("#")]),a._v(" 概述")]),a._v(" "),r("p",[a._v("角色管理功能维护角色元数据,通过配置角色拥有的菜单资源,限制用户只能操作拥有的角色对应的菜单资源,下面介绍角色管理功能的操作。")]),a._v(" "),r("h2",{attrs:{id:"角色列表"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#角色列表"}},[a._v("#")]),a._v(" 角色列表")]),a._v(" "),r("p",[a._v("菜单位置:权限管理 > 角色管理。点击菜单后进入角色列表页面,如图所示。")]),a._v(" "),r("p",[r("img",{attrs:{src:"/fizz-gateway-community/manager_role_list_query.png",alt:"manager_role_list_query"}})]),a._v(" "),r("h2",{attrs:{id:"添加角色"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#添加角色"}},[a._v("#")]),a._v(" 添加角色")]),a._v(" "),r("p",[a._v("点击 新增 按钮弹出新增窗口,如图所示。")]),a._v(" "),r("p",[r("img",{attrs:{src:"/fizz-gateway-community/manager_role_add_1.png",alt:"manager_role_add_1"}})]),a._v(" "),r("p",[r("img",{attrs:{src:"/fizz-gateway-community/manager_role_add_2.png",alt:"manager_role_add_2"}})]),a._v(" "),r("h2",{attrs:{id:"权限设置"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#权限设置"}},[a._v("#")]),a._v(" 权限设置")]),a._v(" "),r("p",[a._v("勾选需要分配权限的角色,点击 权限设置 按钮弹出角色权限配置窗口,如图所示。")]),a._v(" "),r("p",[r("img",{attrs:{src:"/fizz-gateway-community/manager_role_auth_1.png",alt:"manager_role_auth_1"}})]),a._v(" "),r("p",[r("img",{attrs:{src:"/fizz-gateway-community/manager_role_auth_2.png",alt:"manager_role_auth_2"}})]),a._v(" "),r("p",[a._v("勾选菜单后点击 确定 按钮确认给角色分配菜单权限。")]),a._v(" "),r("h2",{attrs:{id:"编辑角色"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#编辑角色"}},[a._v("#")]),a._v(" 编辑角色")]),a._v(" "),r("p",[a._v("点击 编辑 按钮弹出编辑窗口,如图所示。")]),a._v(" "),r("p",[r("img",{attrs:{src:"/fizz-gateway-community/manager_role_edit_1.png",alt:"manager_role_edit_1"}})]),a._v(" "),r("p",[r("img",{attrs:{src:"/fizz-gateway-community/manager_role_edit_2.png",alt:"manager_role_edit_2"}})]),a._v(" "),r("h2",{attrs:{id:"删除角色"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#删除角色"}},[a._v("#")]),a._v(" 删除角色")]),a._v(" "),r("p",[a._v("点击 删除 按钮弹出删除确认窗口,如图所示。")]),a._v(" "),r("p",[r("img",{attrs:{src:"/fizz-gateway-community/manager_role_delete_1.png",alt:"manager_role_delete_1"}})]),a._v(" "),r("p",[r("img",{attrs:{src:"/fizz-gateway-community/manager_role_delete_2.png",alt:"manager_role_delete_2"}})]),a._v(" "),r("p",[a._v("点击 确定 按钮后删除角色。")])])}),[],!1,null,null,null);t.default=e.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/26.48d84783.js b/docs/assets/js/26.e097ebfd.js similarity index 98% rename from docs/assets/js/26.48d84783.js rename to docs/assets/js/26.e097ebfd.js index 8148b3c..cfaafa4 100644 --- a/docs/assets/js/26.48d84783.js +++ b/docs/assets/js/26.e097ebfd.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[26],{368:function(a,t,e){"use strict";e.r(t);var _=e(42),r=Object(_.a)({},(function(){var a=this,t=a.$createElement,e=a._self._c||t;return e("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[e("h2",{attrs:{id:"概述"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[a._v("#")]),a._v(" 概述")]),a._v(" "),e("p",[a._v("服务管理功能维护服务元数据。服务编排中的服务是一个逻辑上的概念,用于对聚合接口的归类以及权限的分配。Fizz网关聚合接口的请求路径格式为 http://{ip}:{port}/proxy/{service}{apiPath},服务对应{service}段。")]),a._v(" "),e("h2",{attrs:{id:"服务列表"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#服务列表"}},[a._v("#")]),a._v(" 服务列表")]),a._v(" "),e("p",[a._v("菜单位置:服务编排 > 服务管理。点击菜单后进入服务列表页面,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_service_list_query.png",alt:"manager_service_list_query"}})]),a._v(" "),e("h2",{attrs:{id:"新增服务"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#新增服务"}},[a._v("#")]),a._v(" 新增服务")]),a._v(" "),e("p",[a._v("点击 新增 按钮弹出新增窗口,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_service_add_1.png",alt:"manager_service_add_1"}})]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_service_add_2.png",alt:"manager_service_add_2"}})]),a._v(" "),e("p",[a._v("服务 ID:服务唯一标识,对应Fizz网关聚合接口请求路径(格式为 http://{ip}:{port}/proxy/{service}{apiPath})的{service}段,长度不能超过200个字符,必填;")]),a._v(" "),e("p",[a._v("服务名:服务名称,用于展示或者选项使用,必填;")]),a._v(" "),e("p",[a._v("团队:团队名称,长度不能超过200个字符;")]),a._v(" "),e("p",[a._v("负责人:负责人名称,长度不能超过200个字符;")]),a._v(" "),e("p",[a._v("描述:服务描述,长度不能超过2000个字符。")]),a._v(" "),e("h2",{attrs:{id:"编辑服务"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#编辑服务"}},[a._v("#")]),a._v(" 编辑服务")]),a._v(" "),e("p",[a._v("点击 编辑 按钮弹出编辑窗口,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_service_edit_1.png",alt:"manager_service_edit_1"}})]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_service_edit_2.png",alt:"manager_service_edit_2"}})]),a._v(" "),e("h2",{attrs:{id:"删除服务"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#删除服务"}},[a._v("#")]),a._v(" 删除服务")]),a._v(" "),e("p",[a._v("点击 删除 按钮弹出删除确认窗口,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_service_delete_1.png",alt:"manager_service_delete_1"}})]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_service_delete_2.png",alt:"manager_service_delete_2"}})]),a._v(" "),e("p",[a._v("点击 确定 按钮后删除服务,如果服务存在关联的聚合接口时,需要将关联的聚合接口全部删除后才能删除服务。")]),a._v(" "),e("h2",{attrs:{id:"服务权限分配"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#服务权限分配"}},[a._v("#")]),a._v(" 服务权限分配")]),a._v(" "),e("p",[a._v("点击 权限 按钮弹出权限配置窗口,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_service_auth_1.png",alt:"manager_service_auth_1"}})]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_service_auth_2.png",alt:"manager_service_auth_2"}})]),a._v(" "),e("p",[a._v("服务创建人自动获得服务权限,服务权限可分配,拥有权限的用户才能操作对应的接口列表。")])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[26],{372:function(a,t,e){"use strict";e.r(t);var _=e(42),r=Object(_.a)({},(function(){var a=this,t=a.$createElement,e=a._self._c||t;return e("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[e("h2",{attrs:{id:"概述"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[a._v("#")]),a._v(" 概述")]),a._v(" "),e("p",[a._v("服务管理功能维护服务元数据。服务编排中的服务是一个逻辑上的概念,用于对聚合接口的归类以及权限的分配。Fizz网关聚合接口的请求路径格式为 http://{ip}:{port}/proxy/{service}{apiPath},服务对应{service}段。")]),a._v(" "),e("h2",{attrs:{id:"服务列表"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#服务列表"}},[a._v("#")]),a._v(" 服务列表")]),a._v(" "),e("p",[a._v("菜单位置:服务编排 > 服务管理。点击菜单后进入服务列表页面,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_service_list_query.png",alt:"manager_service_list_query"}})]),a._v(" "),e("h2",{attrs:{id:"新增服务"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#新增服务"}},[a._v("#")]),a._v(" 新增服务")]),a._v(" "),e("p",[a._v("点击 新增 按钮弹出新增窗口,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_service_add_1.png",alt:"manager_service_add_1"}})]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_service_add_2.png",alt:"manager_service_add_2"}})]),a._v(" "),e("p",[a._v("服务 ID:服务唯一标识,对应Fizz网关聚合接口请求路径(格式为 http://{ip}:{port}/proxy/{service}{apiPath})的{service}段,长度不能超过200个字符,必填;")]),a._v(" "),e("p",[a._v("服务名:服务名称,用于展示或者选项使用,必填;")]),a._v(" "),e("p",[a._v("团队:团队名称,长度不能超过200个字符;")]),a._v(" "),e("p",[a._v("负责人:负责人名称,长度不能超过200个字符;")]),a._v(" "),e("p",[a._v("描述:服务描述,长度不能超过2000个字符。")]),a._v(" "),e("h2",{attrs:{id:"编辑服务"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#编辑服务"}},[a._v("#")]),a._v(" 编辑服务")]),a._v(" "),e("p",[a._v("点击 编辑 按钮弹出编辑窗口,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_service_edit_1.png",alt:"manager_service_edit_1"}})]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_service_edit_2.png",alt:"manager_service_edit_2"}})]),a._v(" "),e("h2",{attrs:{id:"删除服务"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#删除服务"}},[a._v("#")]),a._v(" 删除服务")]),a._v(" "),e("p",[a._v("点击 删除 按钮弹出删除确认窗口,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_service_delete_1.png",alt:"manager_service_delete_1"}})]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_service_delete_2.png",alt:"manager_service_delete_2"}})]),a._v(" "),e("p",[a._v("点击 确定 按钮后删除服务,如果服务存在关联的聚合接口时,需要将关联的聚合接口全部删除后才能删除服务。")]),a._v(" "),e("h2",{attrs:{id:"服务权限分配"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#服务权限分配"}},[a._v("#")]),a._v(" 服务权限分配")]),a._v(" "),e("p",[a._v("点击 权限 按钮弹出权限配置窗口,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_service_auth_1.png",alt:"manager_service_auth_1"}})]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_service_auth_2.png",alt:"manager_service_auth_2"}})]),a._v(" "),e("p",[a._v("服务创建人自动获得服务权限,服务权限可分配,拥有权限的用户才能操作对应的接口列表。")])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/27.b9f6747b.js b/docs/assets/js/27.06f8de31.js similarity index 97% rename from docs/assets/js/27.b9f6747b.js rename to docs/assets/js/27.06f8de31.js index 81b6406..32ec04f 100644 --- a/docs/assets/js/27.b9f6747b.js +++ b/docs/assets/js/27.06f8de31.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[27],{372:function(t,a,s){"use strict";s.r(a);var _=s(42),r=Object(_.a)({},(function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h2",{attrs:{id:"概述"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[t._v("#")]),t._v(" 概述")]),t._v(" "),s("p",[t._v("Fizz网关会将访问请求数据(IP地址、网关分组、服务、应用、请求方法、API Path、请求时间)推送到Kafka中,管理后台消费Kafka消息统计接口访问数据。")]),t._v(" "),s("p",[t._v("接口统计功能以图表的形式展示指定时间段内每日的接口总数、访问次数,可查看接口的历史访问总次数以及最近请求时间。")]),t._v(" "),s("h2",{attrs:{id:"接口访问统计"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#接口访问统计"}},[t._v("#")]),t._v(" 接口访问统计")]),t._v(" "),s("p",[t._v("菜单位置:网关管理 > 接口统计。点击菜单后进入接口统计页面,如图所示。")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_source_statistics_1.png",alt:"manager_source_statistics_1.png"}})]),t._v(" "),s("p",[t._v("今天接口总数:从0时到当前时刻被调用不同接口的总数;")]),t._v(" "),s("p",[t._v("今天访问次数:从0时到当前时刻访问请求的总次数。")]),t._v(" "),s("p",[t._v("接口总数图表:显示指定时间段内每日被调用不同接口的总数曲线;")]),t._v(" "),s("p",[t._v("访问次数图表:显示指定时间段内每日访问请求的总次数曲线。")]),t._v(" "),s("h2",{attrs:{id:"请求统计"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#请求统计"}},[t._v("#")]),t._v(" 请求统计")]),t._v(" "),s("p",[t._v("接口统计界面下部为请求统计列表,如图所示。")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_source_statistics_2.png",alt:"manager_source_statistics_2.png"}})]),t._v(" "),s("p",[t._v("来源IP:网关请求的实际入口IP地址;")]),t._v(" "),s("p",[t._v("请求次数:( 唯一[来源IP、网关分组、服务名、请求方法、appID、API Path])历史总请求次数;")]),t._v(" "),s("p",[t._v("最近请求时间:( 唯一[来源IP、网关分组、服务名、请求方法、appID、API Path])最近一次调用时间。")])])}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[27],{374:function(t,a,s){"use strict";s.r(a);var _=s(42),r=Object(_.a)({},(function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h2",{attrs:{id:"概述"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[t._v("#")]),t._v(" 概述")]),t._v(" "),s("p",[t._v("Fizz网关会将访问请求数据(IP地址、网关分组、服务、应用、请求方法、API Path、请求时间)推送到Kafka中,管理后台消费Kafka消息统计接口访问数据。")]),t._v(" "),s("p",[t._v("接口统计功能以图表的形式展示指定时间段内每日的接口总数、访问次数,可查看接口的历史访问总次数以及最近请求时间。")]),t._v(" "),s("h2",{attrs:{id:"接口访问统计"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#接口访问统计"}},[t._v("#")]),t._v(" 接口访问统计")]),t._v(" "),s("p",[t._v("菜单位置:网关管理 > 接口统计。点击菜单后进入接口统计页面,如图所示。")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_source_statistics_1.png",alt:"manager_source_statistics_1.png"}})]),t._v(" "),s("p",[t._v("今天接口总数:从0时到当前时刻被调用不同接口的总数;")]),t._v(" "),s("p",[t._v("今天访问次数:从0时到当前时刻访问请求的总次数。")]),t._v(" "),s("p",[t._v("接口总数图表:显示指定时间段内每日被调用不同接口的总数曲线;")]),t._v(" "),s("p",[t._v("访问次数图表:显示指定时间段内每日访问请求的总次数曲线。")]),t._v(" "),s("h2",{attrs:{id:"请求统计"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#请求统计"}},[t._v("#")]),t._v(" 请求统计")]),t._v(" "),s("p",[t._v("接口统计界面下部为请求统计列表,如图所示。")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_source_statistics_2.png",alt:"manager_source_statistics_2.png"}})]),t._v(" "),s("p",[t._v("来源IP:网关请求的实际入口IP地址;")]),t._v(" "),s("p",[t._v("请求次数:( 唯一[来源IP、网关分组、服务名、请求方法、appID、API Path])历史总请求次数;")]),t._v(" "),s("p",[t._v("最近请求时间:( 唯一[来源IP、网关分组、服务名、请求方法、appID、API Path])最近一次调用时间。")])])}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/28.79d861a5.js b/docs/assets/js/28.9b7b0400.js similarity index 97% rename from docs/assets/js/28.79d861a5.js rename to docs/assets/js/28.9b7b0400.js index 2acfc6e..dd85b61 100644 --- a/docs/assets/js/28.79d861a5.js +++ b/docs/assets/js/28.9b7b0400.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[28],{370:function(a,t,e){"use strict";e.r(t);var r=e(42),_=Object(r.a)({},(function(){var a=this,t=a.$createElement,e=a._self._c||t;return e("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[e("h2",{attrs:{id:"概述"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[a._v("#")]),a._v(" 概述")]),a._v(" "),e("p",[a._v("用户管理功能用于维护用户元数据,包括用户信息维护、密码维护、角色配置。")]),a._v(" "),e("h2",{attrs:{id:"用户列表"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#用户列表"}},[a._v("#")]),a._v(" 用户列表")]),a._v(" "),e("p",[a._v("菜单位置:系统管理 > 用户管理。点击菜单后进入用户列表页面,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_user_list_query.png",alt:"manager_user_list_query"}})]),a._v(" "),e("h2",{attrs:{id:"添加用户"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#添加用户"}},[a._v("#")]),a._v(" 添加用户")]),a._v(" "),e("p",[a._v("点击 新增 按钮弹出新增窗口,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_user_add_1.png",alt:"manager_user_add_1"}})]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_user_add_2.png",alt:"manager_user_add_2"}})]),a._v(" "),e("p",[a._v("电子邮箱:用户用于接收电子邮件的邮箱地址,后台涉及邮件发送业务使用该字段设置的邮箱地址来进行邮箱发送。")]),a._v(" "),e("h2",{attrs:{id:"重置密码"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#重置密码"}},[a._v("#")]),a._v(" 重置密码")]),a._v(" "),e("p",[a._v("勾选用户后点击 密码重置 按钮可为用户重置密码。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_user_reset_password_1.png",alt:"manager_user_reset_password_1"}})]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_user_reset_password_2.png",alt:"manager_user_reset_password_2"}})]),a._v(" "),e("p",[a._v("重置后的默认密码为"),e("code",[a._v("AsdF1234!")]),a._v("。")]),a._v(" "),e("h2",{attrs:{id:"编辑用户"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#编辑用户"}},[a._v("#")]),a._v(" 编辑用户")]),a._v(" "),e("p",[a._v("点击 编辑 按钮弹出编辑窗口,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_user_edit_1.png",alt:"manager_user_edit_1"}})]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_user_edit_2.png",alt:"manager_user_edit_2"}})]),a._v(" "),e("h2",{attrs:{id:"删除用户"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#删除用户"}},[a._v("#")]),a._v(" 删除用户")]),a._v(" "),e("p",[a._v("点击 删除 按钮弹出删除确认窗口,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_user_delete_1.png",alt:"manager_user_delete_1"}})]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_user_delete_2.png",alt:"manager_user_delete_2"}})])])}),[],!1,null,null,null);t.default=_.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[28],{373:function(a,t,e){"use strict";e.r(t);var r=e(42),_=Object(r.a)({},(function(){var a=this,t=a.$createElement,e=a._self._c||t;return e("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[e("h2",{attrs:{id:"概述"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[a._v("#")]),a._v(" 概述")]),a._v(" "),e("p",[a._v("用户管理功能用于维护用户元数据,包括用户信息维护、密码维护、角色配置。")]),a._v(" "),e("h2",{attrs:{id:"用户列表"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#用户列表"}},[a._v("#")]),a._v(" 用户列表")]),a._v(" "),e("p",[a._v("菜单位置:系统管理 > 用户管理。点击菜单后进入用户列表页面,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_user_list_query.png",alt:"manager_user_list_query"}})]),a._v(" "),e("h2",{attrs:{id:"添加用户"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#添加用户"}},[a._v("#")]),a._v(" 添加用户")]),a._v(" "),e("p",[a._v("点击 新增 按钮弹出新增窗口,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_user_add_1.png",alt:"manager_user_add_1"}})]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_user_add_2.png",alt:"manager_user_add_2"}})]),a._v(" "),e("p",[a._v("电子邮箱:用户用于接收电子邮件的邮箱地址,后台涉及邮件发送业务使用该字段设置的邮箱地址来进行邮箱发送。")]),a._v(" "),e("h2",{attrs:{id:"重置密码"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#重置密码"}},[a._v("#")]),a._v(" 重置密码")]),a._v(" "),e("p",[a._v("勾选用户后点击 密码重置 按钮可为用户重置密码。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_user_reset_password_1.png",alt:"manager_user_reset_password_1"}})]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_user_reset_password_2.png",alt:"manager_user_reset_password_2"}})]),a._v(" "),e("p",[a._v("重置后的默认密码为"),e("code",[a._v("AsdF1234!")]),a._v("。")]),a._v(" "),e("h2",{attrs:{id:"编辑用户"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#编辑用户"}},[a._v("#")]),a._v(" 编辑用户")]),a._v(" "),e("p",[a._v("点击 编辑 按钮弹出编辑窗口,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_user_edit_1.png",alt:"manager_user_edit_1"}})]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_user_edit_2.png",alt:"manager_user_edit_2"}})]),a._v(" "),e("h2",{attrs:{id:"删除用户"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#删除用户"}},[a._v("#")]),a._v(" 删除用户")]),a._v(" "),e("p",[a._v("点击 删除 按钮弹出删除确认窗口,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_user_delete_1.png",alt:"manager_user_delete_1"}})]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_user_delete_2.png",alt:"manager_user_delete_2"}})])])}),[],!1,null,null,null);t.default=_.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/29.338541e0.js b/docs/assets/js/29.214a2702.js similarity index 99% rename from docs/assets/js/29.338541e0.js rename to docs/assets/js/29.214a2702.js index bd151e5..072aecc 100644 --- a/docs/assets/js/29.338541e0.js +++ b/docs/assets/js/29.214a2702.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[29],{373:function(t,s,a){"use strict";a.r(s);var n=a(42),e=Object(n.a)({},(function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h2",{attrs:{id:"概述"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[t._v("#")]),t._v(" 概述")]),t._v(" "),a("p",[t._v("当需要在gateway中加入自定义的逻辑时,可通过fizz的插件机制实现,插件:"),a("br"),t._v("\n1、类似spring的WebFilter,是fizz内部的WebFilter,由fizz调度;"),a("br"),t._v("\n2、对不同的请求,可配置不同的上下文参数,可通过manager完成配置;"),a("br"),t._v("\n3、若有多个插件,当前插件可获取前面插件的执行结果。")]),t._v(" "),a("p",[t._v("插件的开发和应用,分gateway开发、manager配置两部分,下面以一个例子,依次介绍。")]),t._v(" "),a("h2",{attrs:{id:"gateway开发"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#gateway开发"}},[t._v("#")]),t._v(" gateway开发")]),t._v(" "),a("div",{staticClass:"language-java extra-class"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[t._v(" 实现\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("abstract")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("PluginFilter")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("abstract")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Mono")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Void")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("doFilter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ServerWebExchange")]),t._v(" exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Map")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Object")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" config"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" fixedConfig"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n 即定义了一个插件。\n \n 比如\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[t._v("@Component")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TestPluginFilter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("TEST_PLUGIN_FILTER"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TestPluginFilter")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("extends")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("PluginFilter")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Logger")]),t._v(" log "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("LoggerFactory")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getLogger")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TestPluginFilter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" TEST_PLUGIN_FILTER "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"testPlugin"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[t._v("@Override")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Mono")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Void")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("doFilter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ServerWebExchange")]),t._v(" exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Map")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Object")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" config"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" fixedConfig"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" rid "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getRequest")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Boolean")]),t._v(" logReqId "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Boolean")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" config"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"logReqId"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 是否记录请求id日志,可通过manager配置")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("logReqId "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" logReqId"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n log"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("info")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getRequest")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getURI")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("toString")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('" 的请求id: "')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" rid"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Boolean")]),t._v(" appendFizzRsv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Boolean")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" config"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"appendFizzRsv"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("appendFizzRsv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" appendFizzRsv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("WebUtils")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("appendHeader")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"FIZZ-RSV"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" rid"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("WebUtils")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("transmitSuccessFilterResultAndEmptyMono")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" TEST_PLUGIN_FILTER"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 保存插件执行结果,并返回")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n 这个插件,插件必须是一个spring的"),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Component")]),t._v("(或子注解),且要有id,这个插件的id是testPlugin,它实现了两个功能,记录请求id日志,转发请求时添加FIZZ"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("RSV请求头,并且功能是可打开或关闭的。\n \n 另外可通过:\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("WebUtils")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getPrevFilterResult")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" 获取上一个插件的执行结果,\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("WebUtils")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getFilterResult")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"plugin.id"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" 获取已执行的任意一个插件的执行结果。\n")])])]),a("h2",{attrs:{id:"manager配置"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#manager配置"}},[t._v("#")]),t._v(" manager配置")]),t._v(" "),a("p",[t._v("1、定义插件")]),t._v(" "),a("div",{staticClass:"language-sql extra-class"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[t._v(" 在插件表中,定义上面的插件: \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("INSERT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("INTO")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v("tb_plugin"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v("eng_name"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v("chn_name"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v("config"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("order")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("VALUES")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'testPlugin'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'测试插件'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('\'[{\\"field\\":\\"logReqId\\",\\"label\\":\\"打印请求id日志\\",\\"component\\":\\"radio\\",\\"dataType\\":\\"boolean\\",\\"default\\":false,\\"options\\":[{\\"label\\":\\"是\\",\\"value\\":true},{\\"label\\":\\"否\\",\\"value\\":false}]},{\\"field\\":\\"appendFizzRsv\\",\\"label\\":\\"添加fizzRsv请求头\\",\\"component\\":\\"radio\\",\\"dataType\\":\\"boolean\\",\\"default\\":false,\\"options\\":[{\\"label\\":\\"是\\",\\"value\\":true},{\\"label\\":\\"否\\",\\"value\\":false}]}]\'')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("250")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("div",{staticClass:"language-json extra-class"},[a("pre",{pre:!0,attrs:{class:"language-json"}},[a("code",[t._v(" eng_name为插件的id,chn_name为插件中文名,order为插件的执行顺序,也是插件在界面上的显示顺序。\n \n config:\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"field"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"logReqId"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"打印请求id日志"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"component"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"radio"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"dataType"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"boolean"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"default"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"options"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"是"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"否"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"field"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"appendFizzRsv"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"添加fizzRsv请求头"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"component"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"radio"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"dataType"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"boolean"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"default"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"options"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"是"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"否"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n 前端据此生成插件的配置表单,具体参前端说明。\n")])])]),a("p",[t._v("2、应用插件")]),t._v(" "),a("p",[t._v("如对\n"),a("img",{attrs:{src:"/fizz-gateway-community/xapi.png",alt:""}})]),t._v(" "),a("p",[t._v("接口应用插件:\n"),a("img",{attrs:{src:"/fizz-gateway-community/test-plugin.png",alt:""}})]),t._v(" "),a("p",[t._v('上面配置的"打印请求id日志"、"添加fizzRsv请求头",对应')]),t._v(" "),a("div",{staticClass:"language-java extra-class"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Mono")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Void")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("doFilter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ServerWebExchange")]),t._v(" exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Map")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Object")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" config"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" fixedConfig"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n")])])]),a("p",[t._v("中config的logReqId和appendFizzRsv key。")])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[29],{376:function(t,s,a){"use strict";a.r(s);var n=a(42),e=Object(n.a)({},(function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h2",{attrs:{id:"概述"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[t._v("#")]),t._v(" 概述")]),t._v(" "),a("p",[t._v("当需要在gateway中加入自定义的逻辑时,可通过fizz的插件机制实现,插件:"),a("br"),t._v("\n1、类似spring的WebFilter,是fizz内部的WebFilter,由fizz调度;"),a("br"),t._v("\n2、对不同的请求,可配置不同的上下文参数,可通过manager完成配置;"),a("br"),t._v("\n3、若有多个插件,当前插件可获取前面插件的执行结果。")]),t._v(" "),a("p",[t._v("插件的开发和应用,分gateway开发、manager配置两部分,下面以一个例子,依次介绍。")]),t._v(" "),a("h2",{attrs:{id:"gateway开发"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#gateway开发"}},[t._v("#")]),t._v(" gateway开发")]),t._v(" "),a("div",{staticClass:"language-java extra-class"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[t._v(" 实现\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("abstract")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("PluginFilter")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("abstract")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Mono")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Void")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("doFilter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ServerWebExchange")]),t._v(" exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Map")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Object")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" config"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" fixedConfig"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n 即定义了一个插件。\n \n 比如\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[t._v("@Component")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TestPluginFilter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("TEST_PLUGIN_FILTER"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TestPluginFilter")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("extends")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("PluginFilter")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Logger")]),t._v(" log "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("LoggerFactory")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getLogger")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TestPluginFilter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" TEST_PLUGIN_FILTER "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"testPlugin"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[t._v("@Override")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Mono")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Void")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("doFilter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ServerWebExchange")]),t._v(" exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Map")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Object")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" config"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" fixedConfig"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" rid "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getRequest")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Boolean")]),t._v(" logReqId "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Boolean")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" config"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"logReqId"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 是否记录请求id日志,可通过manager配置")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("logReqId "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" logReqId"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n log"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("info")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getRequest")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getURI")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("toString")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('" 的请求id: "')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" rid"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Boolean")]),t._v(" appendFizzRsv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Boolean")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" config"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"appendFizzRsv"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("appendFizzRsv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" appendFizzRsv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("WebUtils")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("appendHeader")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"FIZZ-RSV"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" rid"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("WebUtils")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("transmitSuccessFilterResultAndEmptyMono")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" TEST_PLUGIN_FILTER"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 保存插件执行结果,并返回")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n 这个插件,插件必须是一个spring的"),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Component")]),t._v("(或子注解),且要有id,这个插件的id是testPlugin,它实现了两个功能,记录请求id日志,转发请求时添加FIZZ"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("RSV请求头,并且功能是可打开或关闭的。\n \n 另外可通过:\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("WebUtils")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getPrevFilterResult")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" 获取上一个插件的执行结果,\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("WebUtils")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getFilterResult")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"plugin.id"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" 获取已执行的任意一个插件的执行结果。\n")])])]),a("h2",{attrs:{id:"manager配置"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#manager配置"}},[t._v("#")]),t._v(" manager配置")]),t._v(" "),a("p",[t._v("1、定义插件")]),t._v(" "),a("div",{staticClass:"language-sql extra-class"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[t._v(" 在插件表中,定义上面的插件: \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("INSERT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("INTO")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v("tb_plugin"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v("eng_name"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v("chn_name"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v("config"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("order")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("VALUES")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'testPlugin'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'测试插件'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('\'[{\\"field\\":\\"logReqId\\",\\"label\\":\\"打印请求id日志\\",\\"component\\":\\"radio\\",\\"dataType\\":\\"boolean\\",\\"default\\":false,\\"options\\":[{\\"label\\":\\"是\\",\\"value\\":true},{\\"label\\":\\"否\\",\\"value\\":false}]},{\\"field\\":\\"appendFizzRsv\\",\\"label\\":\\"添加fizzRsv请求头\\",\\"component\\":\\"radio\\",\\"dataType\\":\\"boolean\\",\\"default\\":false,\\"options\\":[{\\"label\\":\\"是\\",\\"value\\":true},{\\"label\\":\\"否\\",\\"value\\":false}]}]\'')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("250")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("div",{staticClass:"language-json extra-class"},[a("pre",{pre:!0,attrs:{class:"language-json"}},[a("code",[t._v(" eng_name为插件的id,chn_name为插件中文名,order为插件的执行顺序,也是插件在界面上的显示顺序。\n \n config:\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"field"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"logReqId"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"打印请求id日志"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"component"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"radio"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"dataType"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"boolean"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"default"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"options"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"是"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"否"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"field"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"appendFizzRsv"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"添加fizzRsv请求头"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"component"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"radio"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"dataType"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"boolean"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"default"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"options"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"是"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"否"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n 前端据此生成插件的配置表单,具体参前端说明。\n")])])]),a("p",[t._v("2、应用插件")]),t._v(" "),a("p",[t._v("如对\n"),a("img",{attrs:{src:"/fizz-gateway-community/xapi.png",alt:""}})]),t._v(" "),a("p",[t._v("接口应用插件:\n"),a("img",{attrs:{src:"/fizz-gateway-community/test-plugin.png",alt:""}})]),t._v(" "),a("p",[t._v('上面配置的"打印请求id日志"、"添加fizzRsv请求头",对应')]),t._v(" "),a("div",{staticClass:"language-java extra-class"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Mono")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Void")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("doFilter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ServerWebExchange")]),t._v(" exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Map")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Object")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" config"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" fixedConfig"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n")])])]),a("p",[t._v("中config的logReqId和appendFizzRsv key。")])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/30.37a581ce.js b/docs/assets/js/30.0222f21c.js similarity index 95% rename from docs/assets/js/30.37a581ce.js rename to docs/assets/js/30.0222f21c.js index 5a485a1..ab69ee4 100644 --- a/docs/assets/js/30.37a581ce.js +++ b/docs/assets/js/30.0222f21c.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[30],{376:function(t,e,s){"use strict";s.r(e);var a=s(42),r=Object(a.a)({},(function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h2",{attrs:{id:"路由转发介绍"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#路由转发介绍"}},[t._v("#")]),t._v(" 路由转发介绍")]),t._v(" "),s("p",[t._v("路由转发也叫反向代理,为内部微服务提供统一的对外入口。支持以下功能:")]),t._v(" "),s("ul",[s("li",[t._v("支持服务注册与发现")]),t._v(" "),s("li",[t._v("支持负载均衡")]),t._v(" "),s("li",[t._v("支持黑白名单机制")]),t._v(" "),s("li",[t._v("支持配置插件")])]),t._v(" "),s("h2",{attrs:{id:"接入路由转发"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#接入路由转发"}},[t._v("#")]),t._v(" 接入路由转发")]),t._v(" "),s("ul",[s("li",[t._v("前提条件:接入Eureka注册中心")]),t._v(" "),s("li",[t._v("开通白名单,接入注册中心的服务默认不对公网开放 (白名单在配置文件里配置serviceWhiteList)")]),t._v(" "),s("li",[t._v("配置访问权限 (管理后台-接口代理-API查询)")])])])}),[],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[30],{375:function(t,e,s){"use strict";s.r(e);var a=s(42),r=Object(a.a)({},(function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h2",{attrs:{id:"路由转发介绍"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#路由转发介绍"}},[t._v("#")]),t._v(" 路由转发介绍")]),t._v(" "),s("p",[t._v("路由转发也叫反向代理,为内部微服务提供统一的对外入口。支持以下功能:")]),t._v(" "),s("ul",[s("li",[t._v("支持服务注册与发现")]),t._v(" "),s("li",[t._v("支持负载均衡")]),t._v(" "),s("li",[t._v("支持黑白名单机制")]),t._v(" "),s("li",[t._v("支持配置插件")])]),t._v(" "),s("h2",{attrs:{id:"接入路由转发"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#接入路由转发"}},[t._v("#")]),t._v(" 接入路由转发")]),t._v(" "),s("ul",[s("li",[t._v("前提条件:接入Eureka注册中心")]),t._v(" "),s("li",[t._v("开通白名单,接入注册中心的服务默认不对公网开放 (白名单在配置文件里配置serviceWhiteList)")]),t._v(" "),s("li",[t._v("配置访问权限 (管理后台-接口代理-API查询)")])])])}),[],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/6.ee90ff38.js b/docs/assets/js/6.b5dc0bcc.js similarity index 79% rename from docs/assets/js/6.ee90ff38.js rename to docs/assets/js/6.b5dc0bcc.js index 517cdf6..f6f6a87 100644 --- a/docs/assets/js/6.ee90ff38.js +++ b/docs/assets/js/6.b5dc0bcc.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[6],{355:function(t,e,n){"use strict";n.r(e);var s=n(42),l=Object(s.a)({},(function(){var t=this.$createElement;return(this._self._c||t)("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}})}),[],!1,null,null,null);e.default=l.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[6],{353:function(t,e,n){"use strict";n.r(e);var s=n(42),l=Object(s.a)({},(function(){var t=this.$createElement;return(this._self._c||t)("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}})}),[],!1,null,null,null);e.default=l.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/7.e3b70354.js b/docs/assets/js/7.c27e364c.js similarity index 81% rename from docs/assets/js/7.e3b70354.js rename to docs/assets/js/7.c27e364c.js index 02f8ee4..c3da9f2 100644 --- a/docs/assets/js/7.e3b70354.js +++ b/docs/assets/js/7.c27e364c.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[7],{352:function(t,n,s){"use strict";s.r(n);var e=s(42),o=Object(e.a)({},(function(){var t=this.$createElement,n=this._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[n("p",[this._v("coming soon")])])}),[],!1,null,null,null);n.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[7],{354:function(t,n,s){"use strict";s.r(n);var e=s(42),o=Object(e.a)({},(function(){var t=this.$createElement,n=this._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[n("p",[this._v("coming soon")])])}),[],!1,null,null,null);n.default=o.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/8.834b8e71.js b/docs/assets/js/8.99888a6b.js similarity index 97% rename from docs/assets/js/8.834b8e71.js rename to docs/assets/js/8.99888a6b.js index fbd9466..edbab21 100644 --- a/docs/assets/js/8.834b8e71.js +++ b/docs/assets/js/8.99888a6b.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[8],{353:function(t,a,r){"use strict";r.r(a);var s=r(42),e=Object(s.a)({},(function(){var t=this,a=t.$createElement,r=t._self._c||a;return r("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[r("h2",{attrs:{id:"什么是服务编排"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#什么是服务编排"}},[t._v("#")]),t._v(" 什么是服务编排")]),t._v(" "),r("p",[t._v("服务编排主要基于现有的业务微服务使用在线配置的方式快速的生成一个聚合接口。")]),t._v(" "),r("p",[t._v("特点: 在线API设计、在线测试、快速开发")]),t._v(" "),r("h2",{attrs:{id:"举例说明"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#举例说明"}},[t._v("#")]),t._v(" 举例说明")]),t._v(" "),r("p",[t._v("订单详情页面需要展示订单信息、商品信息和用户信息。可通过配置的方式生成一个接口先后调用底层微服务的订单详情接口、商品信息接口和用户信息接口,再从这3个接口的返回结果里提取需要的字段返回给前端页面。")]),t._v(" "),r("h2",{attrs:{id:"服务编排架构"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#服务编排架构"}},[t._v("#")]),t._v(" 服务编排架构")]),t._v(" "),r("p",[r("img",{attrs:{src:"/fizz-gateway-community/fizz_aggregate.jpg",alt:""}})]),t._v(" "),r("h2",{attrs:{id:"适用场景"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#适用场景"}},[t._v("#")]),t._v(" 适用场景")]),t._v(" "),r("h3",{attrs:{id:"前端"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#前端"}},[t._v("#")]),t._v(" 前端")]),t._v(" "),r("p",[t._v("1、一个页面调用多个接口时,可以编排好返回聚合结果,提高页面数据的加载速度")]),t._v(" "),r("p",[t._v("2、移动设备计算能力有限,可以把数据计算或业务处理逻辑放到服务端完成,加快页面响应")]),t._v(" "),r("h3",{attrs:{id:"后端"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#后端"}},[t._v("#")]),t._v(" 后端")]),t._v(" "),r("p",[t._v("1、替换应用层的聚合接口,减少应用层的胶水代码")]),t._v(" "),r("p",[t._v("2、快速生成透传数据类型的接口")]),t._v(" "),r("p",[t._v("3、数据转换和映射")])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[8],{352:function(t,a,r){"use strict";r.r(a);var s=r(42),e=Object(s.a)({},(function(){var t=this,a=t.$createElement,r=t._self._c||a;return r("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[r("h2",{attrs:{id:"什么是服务编排"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#什么是服务编排"}},[t._v("#")]),t._v(" 什么是服务编排")]),t._v(" "),r("p",[t._v("服务编排主要基于现有的业务微服务使用在线配置的方式快速的生成一个聚合接口。")]),t._v(" "),r("p",[t._v("特点: 在线API设计、在线测试、快速开发")]),t._v(" "),r("h2",{attrs:{id:"举例说明"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#举例说明"}},[t._v("#")]),t._v(" 举例说明")]),t._v(" "),r("p",[t._v("订单详情页面需要展示订单信息、商品信息和用户信息。可通过配置的方式生成一个接口先后调用底层微服务的订单详情接口、商品信息接口和用户信息接口,再从这3个接口的返回结果里提取需要的字段返回给前端页面。")]),t._v(" "),r("h2",{attrs:{id:"服务编排架构"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#服务编排架构"}},[t._v("#")]),t._v(" 服务编排架构")]),t._v(" "),r("p",[r("img",{attrs:{src:"/fizz-gateway-community/fizz_aggregate.jpg",alt:""}})]),t._v(" "),r("h2",{attrs:{id:"适用场景"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#适用场景"}},[t._v("#")]),t._v(" 适用场景")]),t._v(" "),r("h3",{attrs:{id:"前端"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#前端"}},[t._v("#")]),t._v(" 前端")]),t._v(" "),r("p",[t._v("1、一个页面调用多个接口时,可以编排好返回聚合结果,提高页面数据的加载速度")]),t._v(" "),r("p",[t._v("2、移动设备计算能力有限,可以把数据计算或业务处理逻辑放到服务端完成,加快页面响应")]),t._v(" "),r("h3",{attrs:{id:"后端"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#后端"}},[t._v("#")]),t._v(" 后端")]),t._v(" "),r("p",[t._v("1、替换应用层的聚合接口,减少应用层的胶水代码")]),t._v(" "),r("p",[t._v("2、快速生成透传数据类型的接口")]),t._v(" "),r("p",[t._v("3、数据转换和映射")])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/9.5f299cef.js b/docs/assets/js/9.3d56fa0d.js similarity index 95% rename from docs/assets/js/9.5f299cef.js rename to docs/assets/js/9.3d56fa0d.js index 661293a..c0eb373 100644 --- a/docs/assets/js/9.5f299cef.js +++ b/docs/assets/js/9.3d56fa0d.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[9],{354:function(t,a,s){"use strict";s.r(a);var n=s(42),e=Object(n.a)({},(function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h2",{attrs:{id:"创建服务"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#创建服务"}},[t._v("#")]),t._v(" 创建服务")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_newservice.png",alt:""}})]),t._v(" "),s("h2",{attrs:{id:"创建聚合接口"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#创建聚合接口"}},[t._v("#")]),t._v(" 创建聚合接口")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_newapi0.png",alt:""}}),t._v(" "),s("img",{attrs:{src:"/fizz-gateway-community/aggr_newapi.png",alt:""}})]),t._v(" "),s("h2",{attrs:{id:"配置输入"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置输入"}},[t._v("#")]),t._v(" 配置输入")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_input.png",alt:""}})]),t._v(" "),s("ul",[s("li",[t._v("配置输入的定义包括3部分:请求头、请求体和Query参数")]),t._v(" "),s("li",[t._v("基于JSON Schema规范")]),t._v(" "),s("li",[t._v("自带校验规则")]),t._v(" "),s("li",[t._v("支持自定义脚本实现复杂的逻辑校验")])]),t._v(" "),s("p",[t._v("JSON Schema规范,详见:")]),t._v(" "),s("p",[s("a",{attrs:{href:"http://json-schema.org/specification.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://json-schema.org/specification.html"),s("OutboundLink")],1)]),t._v(" "),s("p",[s("a",{attrs:{href:"http://json-schema.org/understanding-json-schema/",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://json-schema.org/understanding-json-schema/"),s("OutboundLink")],1)]),t._v(" "),s("h2",{attrs:{id:"配置校验结果"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置校验结果"}},[t._v("#")]),t._v(" 配置校验结果")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_input_validate_result.png",alt:""}})]),t._v(" "),s("ul",[s("li",[t._v("校验不通过时,Fizz会把校验失败的原因(如:订单ID不能为空)放到上下文的validateMsg字段里")]),t._v(" "),s("li",[t._v("可以自定义返回给调用方的报文格式,如 msgCode, message")]),t._v(" "),s("li",[t._v("支持自定义响应头")]),t._v(" "),s("li",[t._v("支持自定义脚本处理校验结果")])]),t._v(" "),s("h2",{attrs:{id:"配置步骤"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置步骤"}},[t._v("#")]),t._v(" 配置步骤")]),t._v(" "),s("h3",{attrs:{id:"配置步骤的基础信息"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置步骤的基础信息"}},[t._v("#")]),t._v(" 配置步骤的基础信息")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_step1.png",alt:""}})]),t._v(" "),s("h3",{attrs:{id:"配置步骤的接口入出参"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置步骤的接口入出参"}},[t._v("#")]),t._v(" 配置步骤的接口入出参")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_step2.png",alt:""}})]),t._v(" "),s("h3",{attrs:{id:"步骤说明"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#步骤说明"}},[t._v("#")]),t._v(" 步骤说明")]),t._v(" "),s("ul",[s("li",[t._v("一个聚合接口可包含多个步骤")]),t._v(" "),s("li",[t._v("一个步骤可包含多个请求(即调用多个接口)")]),t._v(" "),s("li",[t._v("步骤间是串联顺序执行")]),t._v(" "),s("li",[t._v("一个步骤内的多个请求并行执行")])]),t._v(" "),s("h3",{attrs:{id:"数据转换"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#数据转换"}},[t._v("#")]),t._v(" 数据转换")]),t._v(" "),s("p",[t._v("支持配置固定值,引用值和脚本")]),t._v(" "),s("h4",{attrs:{id:"固定值"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#固定值"}},[t._v("#")]),t._v(" 固定值")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_step_mapping_1.png",alt:""}})]),t._v(" "),s("h4",{attrs:{id:"引用值"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#引用值"}},[t._v("#")]),t._v(" 引用值")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_step_mapping_2.png",alt:""}})]),t._v(" "),s("h4",{attrs:{id:"脚本"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#脚本"}},[t._v("#")]),t._v(" 脚本")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_step_mapping_3.png",alt:""}})]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_step_mapping_4.png",alt:""}})]),t._v(" "),s("h4",{attrs:{id:"星号"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#星号"}},[t._v("#")]),t._v(" 星号 *")]),t._v(" "),s("p",[t._v("星号通配符可以接收一个返回对象类型的引用值,返回对象里的字段会合并到目标对象里")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_step_mapping_5.png",alt:""}})]),t._v(" "),s("p",[t._v('样例:userInfo = {"userName": "Fizz", "userID": 1234}')]),t._v(" "),s("h4",{attrs:{id:"优先级与覆盖顺序"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#优先级与覆盖顺序"}},[t._v("#")]),t._v(" 优先级与覆盖顺序")]),t._v(" "),s("p",[t._v("固定值 < 引用值 < 脚本 < 星号*")]),t._v(" "),s("p",[t._v("当一个字段配置了多种类型的值时按以上顺序覆盖,星号优先级最高")]),t._v(" "),s("h4",{attrs:{id:"引用值规范"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#引用值规范"}},[t._v("#")]),t._v(" 引用值规范")]),t._v(" "),s("div",{staticClass:"language-properties extra-class"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 获取入参请求头aaa的值")]),t._v("\ninput.request.headers.aaa\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 获取入参请求体bbb字段的值")]),t._v("\ninput.request.body.bbb\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 获取入参URL Query参数fff字段的值")]),t._v("\ninput.request.params.fff\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 获取步骤1里request1的请求头ccc的值")]),t._v("\nstep1.request1.request.headers.ccc\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 获取步骤1里request1的响应体ddd的值")]),t._v("\nstep1.request1.response.body.ddd\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 获取步骤1结果里eee的值")]),t._v("\nstep1.result.eee\n\n")])])]),s("ul",[s("li",[t._v("支持单值引用,如:string,int等")]),t._v(" "),s("li",[t._v("支持对象类型的引用")])]),t._v(" "),s("p",[t._v("input: 表示调用方的输入数据,如H5页面提交上来的参数")]),t._v(" "),s("p",[t._v("stepN.requestN: 表示步骤N里调用接口N的相关参数")]),t._v(" "),s("p",[t._v("stepN.result: 表示步骤N的转换结果")]),t._v(" "),s("h4",{attrs:{id:"fallback与预处理条件"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#fallback与预处理条件"}},[t._v("#")]),t._v(" Fallback与预处理条件")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_step_fallback.png",alt:""}})]),t._v(" "),s("p",[t._v("Fallback:")]),t._v(" "),s("p",[t._v("当调用接口发生异常(如超时、网络或系统异常)可配置fallback方案:")]),t._v(" "),s("ul",[s("li",[t._v("Stop: 终止请求并立即返回")]),t._v(" "),s("li",[t._v("Continue: 继续后续的操作,且要设置默认的fallback json")])]),t._v(" "),s("p",[t._v("预处理: 根据条件判断是否要调用接口,脚本返回true时才调用接口")]),t._v(" "),s("h4",{attrs:{id:"配置步骤结果处理"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置步骤结果处理"}},[t._v("#")]),t._v(" 配置步骤结果处理")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_step_result.png",alt:""}})]),t._v(" "),s("ul",[s("li",[s("p",[t._v("支持对步骤里调用的每一个接口的返回结果做数据转换,如果配置数据转换规则原样返回并存储到上下文里供后续使用")])]),t._v(" "),s("li",[s("p",[t._v("支持对步骤里调用的一个或多个接口的返回结果做处理,并把处理完的结果存储到上下文里供后续使用,不配置则不处理")])])]),t._v(" "),s("h2",{attrs:{id:"配置输出"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置输出"}},[t._v("#")]),t._v(" 配置输出")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_output.png",alt:""}})]),t._v(" "),s("p",[t._v("配置返回给调用方的结果")]),t._v(" "),s("ul",[s("li",[t._v("支持配置响应头")]),t._v(" "),s("li",[t._v("支持配置响应体")]),t._v(" "),s("li",[t._v("支持自定脚本处理复杂的业务逻辑")])]),t._v(" "),s("h2",{attrs:{id:"脚本-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#脚本-2"}},[t._v("#")]),t._v(" 脚本")]),t._v(" "),s("p",[t._v("目前支持以下脚本语言:")]),t._v(" "),s("p",[t._v("Javascript (推荐) - ECMAScript 5标准")]),t._v(" "),s("p",[t._v("JS脚本只支持单函数,且函数名不可变,在创建脚本时系统会自动生成初始模板,模板里包含相关使用说明")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_script_1.png",alt:""}})]),t._v(" "),s("p",[t._v("Groovy")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_script_2.png",alt:""}})]),t._v(" "),s("h3",{attrs:{id:"common-js-提供了操作context上下文的便捷操作函数"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#common-js-提供了操作context上下文的便捷操作函数"}},[t._v("#")]),t._v(" common.js 提供了操作context上下文的便捷操作函数")]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * context 上下文便捷操作函数\n *\n */")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" common "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* *********** private function begin *********** */")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 获取上下文中客户端请求对象")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getInputReq")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'input'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'input'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'request'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'input'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'request'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 获取上下文步骤中请求接口的请求对象")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getStepReq")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("stepName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'requests'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'requests'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'requests'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'request'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'requests'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'request'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 获取上下文步骤中请求接口的响应对象")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getStepResp")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("stepName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'requests'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'requests'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'requests'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'response'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'requests'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'response'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* *********** private function end *********** */")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* *********** input begin ************ */")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取客户端请求头\n * @param {*} ctx 上下文 【必填】\n * @param {*} headerName 请求头字段名 【选填】,不传时返回所有请求头\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getInputReqHeader")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" headerName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" req "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInputReq")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" headers "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'headers'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" headerName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("headerName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取客户端URL请求参数(query string)\n * @param {*} ctx 上下文 【必填】\n * @param {*} paramName URL参数名 【选填】,不传时返回所有请求参数\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getInputReqParam")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" paramName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" req "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInputReq")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" params "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'params'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" paramName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" params"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("paramName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" params"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取客户端请求体\n * @param {*} ctx 上下文 【必填】\n * @param {*} field 字段名 【选填】,不传时返回整个请求体\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getInputReqBody")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" field")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" req "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInputReq")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" body "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'body'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" field "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" body"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("field"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" body"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取返回给客户端的响应头\n * @param {*} ctx 上下文 【必填】\n * @param {*} headerName 响应头字段名 【选填】,不传时返回所有响应头\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getInputRespHeader")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" headerName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" req "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInputReq")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" headers "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'headers'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" headerName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("headerName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取返回给客户端的响应体\n * @param {*} ctx 上下文 【必填】\n * @param {*} field 字段名 【选填】,不传时返回整个响应体\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getInputRespBody")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" field")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" req "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInputReq")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" body "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'body'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" field "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" body"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("field"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" body"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* *********** input begin ************ */")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* *********** step request begin ************ */")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取步骤中调用的接口的请求头\n * @param {*} ctx 上下文 【必填】\n * @param {*} stepName 步骤名【必填】\n * @param {*} requestName 请求的接口名 【必填】\n * @param {*} headerName 请求头字段名 【选填】,不传时返回所有请求头\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getStepReqHeader")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" headerName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" req "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getStepReq")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" headers "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'headers'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" headerName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("headerName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取步骤中调用的接口的URL参数\n * @param {*} ctx 上下文 【必填】\n * @param {*} stepName 步骤名【必填】\n * @param {*} requestName 请求的接口名 【必填】\n * @param {*} paramName URL参数名 【选填】,不传时返回所有URL参数\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getStepReqParam")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" paramName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" req "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getStepReq")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" params "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'params'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" paramName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" params"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("paramName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" params"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取步骤中调用的接口的请求体\n * @param {*} ctx 上下文 【必填】\n * @param {*} stepName 步骤名【必填】\n * @param {*} requestName 请求的接口名 【必填】\n * @param {*} field 字段名 【选填】,不传时返回整个请求体\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getStepReqBody")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" field")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" req "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getStepReq")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" body "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'body'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" field "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" body"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("field"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" body"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取步骤中调用的接口的响应头\n * @param {*} ctx 上下文 【必填】\n * @param {*} stepName 步骤名【必填】\n * @param {*} requestName 请求的接口名 【必填】\n * @param {*} headerName 响应头字段名 【选填】,不传时返回所有响应头\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getStepRespHeader")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" headerName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" resp "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getStepResp")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" headers "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" resp"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'headers'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" headerName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("headerName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取步骤中调用的接口的响应头\n * @param {*} ctx 上下文 【必填】\n * @param {*} stepName 步骤名【必填】\n * @param {*} requestName 请求的接口名 【必填】\n * @param {*} field 字段名 【选填】,不传时返回整个响应头\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getStepRespBody")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" field")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" resp "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getStepResp")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" body "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" resp"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'body'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" field "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" body"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("field"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" body"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取步骤结果\n * @param {*} ctx 上下文 【必填】\n * @param {*} stepName 步骤名【必填】\n * @param {*} field 字段名 【选填】,不传时返回整个步骤结果对象\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getStepResult")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" field")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("stepName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" result "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'result'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" field "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("field"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* *********** step request end ************ */")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n")])])]),s("h3",{attrs:{id:"context-js-数据结构"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#context-js-数据结构"}},[t._v("#")]),t._v(" context.js 数据结构")]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 上下文,用于保存客户输入输出和每个步骤的输入与输出结果")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" context "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 是否DEBUG模式")]),t._v("\n\tdebug"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n\t"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 各个操作的耗时")]),t._v("\n\telapsedTimes"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("actionName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("123")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 操作名称:耗时")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 客户输入和接口的返回结果")]),t._v("\n input"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n request"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n path"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n method"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GET/POST"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headers"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n body"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n params"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n response"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 聚合接口的响应")]),t._v("\n headers"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n body"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 步骤")]),t._v("\n step1"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n requests"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 接口1")]),t._v("\n request1"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 请求相关参数")]),t._v("\n request"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n url"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n method"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GET/POST"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headers"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n body"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 根据转换规则转换后的接口响应")]),t._v("\n response"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n headers"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n body"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 接口2")]),t._v("\n request2"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n request"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n url"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n method"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GET/POST"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headers"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n body"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n response"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n headers"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n body"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//...")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 步骤结果")]),t._v("\n result"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n")])])]),s("h2",{attrs:{id:"异常处理"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#异常处理"}},[t._v("#")]),t._v(" 异常处理")]),t._v(" "),s("p",[t._v("当要在脚本里中止请求时可以通过以下方式来实现")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_exception.png",alt:""}})]),t._v(" "),s("p",[t._v("返回一个对象且这个对象包含一个_stopAndResponse等于true的属性,Fizz会终止后续的操作并把这个对象返回给调用方。")]),t._v(" "),s("h2",{attrs:{id:"在线测试"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#在线测试"}},[t._v("#")]),t._v(" 在线测试")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_test.png",alt:""}})]),t._v(" "),s("ul",[s("li",[t._v("支持在线实时测试")]),t._v(" "),s("li",[t._v("支持测试接口和正式接口隔离")]),t._v(" "),s("li",[t._v("支持返回上下文,可以查看整个执行过程中各个步骤及请求的输入与输出")]),t._v(" "),s("li",[t._v("支持保存历史测试记录")])]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_test2.png",alt:""}})]),t._v(" "),s("p",[t._v("支持调试模式,在测试接口和正式接口均可使用,修改后重新发布可实时生效,在调试模式下会打印请求日志及报文,主要用于排查线上问题")]),t._v(" "),s("h2",{attrs:{id:"导入导出"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#导入导出"}},[t._v("#")]),t._v(" 导入导出")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_import_export.png",alt:""}})]),t._v(" "),s("p",[t._v("导入导出主要用于在各个环境间同步接口配置,在开发环境配置好后导到测试环境中测试,测试完后导到生产环境进行发布")]),t._v(" "),s("h2",{attrs:{id:"发布-下线和审核"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#发布-下线和审核"}},[t._v("#")]),t._v(" 发布|下线和审核")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_release_1.png",alt:""}})]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_release_2.png",alt:""}})]),t._v(" "),s("p",[t._v("目前发布|下线申请有以上两个入口。")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_release_rollback1.png",alt:""}})]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_release_rollback.png",alt:""}})]),t._v(" "),s("ul",[s("li",[t._v("批量发布:对发布单里的接口进行批量发布")]),t._v(" "),s("li",[t._v("批量回滚:对发布单里的接口进行批量回滚")]),t._v(" "),s("li",[t._v("发布:实时发布到网关")]),t._v(" "),s("li",[t._v("回滚:支持回滚到历史任何一个版本,可在发布历史里指定一个版本进行回滚")]),t._v(" "),s("li",[t._v("下线:从网关删除接口,在后台可以通过发布功能再次上线")])]),t._v(" "),s("h3",{attrs:{id:"发布流程说明"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#发布流程说明"}},[t._v("#")]),t._v(" 发布流程说明")]),t._v(" "),s("p",[t._v("申请发布、审核、发布和下线功能的权限可根据需要灵活分配给不同角色,如:开发人员只能申请发布,上级领导审核,运维或测试人员执行发布、回滚或下线。在开发、测试和预生产环境为了方便开发人员调试也可把申请发布、审核、发布和下线功能都分配给开发人员。")])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[9],{355:function(t,a,s){"use strict";s.r(a);var n=s(42),e=Object(n.a)({},(function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h2",{attrs:{id:"创建服务"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#创建服务"}},[t._v("#")]),t._v(" 创建服务")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_newservice.png",alt:""}})]),t._v(" "),s("h2",{attrs:{id:"创建聚合接口"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#创建聚合接口"}},[t._v("#")]),t._v(" 创建聚合接口")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_newapi0.png",alt:""}}),t._v(" "),s("img",{attrs:{src:"/fizz-gateway-community/aggr_newapi.png",alt:""}})]),t._v(" "),s("h2",{attrs:{id:"配置输入"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置输入"}},[t._v("#")]),t._v(" 配置输入")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_input.png",alt:""}})]),t._v(" "),s("ul",[s("li",[t._v("配置输入的定义包括3部分:请求头、请求体和Query参数")]),t._v(" "),s("li",[t._v("基于JSON Schema规范")]),t._v(" "),s("li",[t._v("自带校验规则")]),t._v(" "),s("li",[t._v("支持自定义脚本实现复杂的逻辑校验")])]),t._v(" "),s("p",[t._v("JSON Schema规范,详见:")]),t._v(" "),s("p",[s("a",{attrs:{href:"http://json-schema.org/specification.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://json-schema.org/specification.html"),s("OutboundLink")],1)]),t._v(" "),s("p",[s("a",{attrs:{href:"http://json-schema.org/understanding-json-schema/",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://json-schema.org/understanding-json-schema/"),s("OutboundLink")],1)]),t._v(" "),s("h2",{attrs:{id:"配置校验结果"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置校验结果"}},[t._v("#")]),t._v(" 配置校验结果")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_input_validate_result.png",alt:""}})]),t._v(" "),s("ul",[s("li",[t._v("校验不通过时,Fizz会把校验失败的原因(如:订单ID不能为空)放到上下文的validateMsg字段里")]),t._v(" "),s("li",[t._v("可以自定义返回给调用方的报文格式,如 msgCode, message")]),t._v(" "),s("li",[t._v("支持自定义响应头")]),t._v(" "),s("li",[t._v("支持自定义脚本处理校验结果")])]),t._v(" "),s("h2",{attrs:{id:"配置步骤"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置步骤"}},[t._v("#")]),t._v(" 配置步骤")]),t._v(" "),s("h3",{attrs:{id:"配置步骤的基础信息"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置步骤的基础信息"}},[t._v("#")]),t._v(" 配置步骤的基础信息")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_step1.png",alt:""}})]),t._v(" "),s("h3",{attrs:{id:"配置步骤的接口入出参"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置步骤的接口入出参"}},[t._v("#")]),t._v(" 配置步骤的接口入出参")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_step2.png",alt:""}})]),t._v(" "),s("h3",{attrs:{id:"步骤说明"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#步骤说明"}},[t._v("#")]),t._v(" 步骤说明")]),t._v(" "),s("ul",[s("li",[t._v("一个聚合接口可包含多个步骤")]),t._v(" "),s("li",[t._v("一个步骤可包含多个请求(即调用多个接口)")]),t._v(" "),s("li",[t._v("步骤间是串联顺序执行")]),t._v(" "),s("li",[t._v("一个步骤内的多个请求并行执行")])]),t._v(" "),s("h3",{attrs:{id:"数据转换"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#数据转换"}},[t._v("#")]),t._v(" 数据转换")]),t._v(" "),s("p",[t._v("支持配置固定值,引用值和脚本")]),t._v(" "),s("h4",{attrs:{id:"固定值"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#固定值"}},[t._v("#")]),t._v(" 固定值")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_step_mapping_1.png",alt:""}})]),t._v(" "),s("h4",{attrs:{id:"引用值"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#引用值"}},[t._v("#")]),t._v(" 引用值")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_step_mapping_2.png",alt:""}})]),t._v(" "),s("h4",{attrs:{id:"脚本"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#脚本"}},[t._v("#")]),t._v(" 脚本")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_step_mapping_3.png",alt:""}})]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_step_mapping_4.png",alt:""}})]),t._v(" "),s("h4",{attrs:{id:"星号"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#星号"}},[t._v("#")]),t._v(" 星号 *")]),t._v(" "),s("p",[t._v("星号通配符可以接收一个返回对象类型的引用值,返回对象里的字段会合并到目标对象里")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_step_mapping_5.png",alt:""}})]),t._v(" "),s("p",[t._v('样例:userInfo = {"userName": "Fizz", "userID": 1234}')]),t._v(" "),s("h4",{attrs:{id:"优先级与覆盖顺序"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#优先级与覆盖顺序"}},[t._v("#")]),t._v(" 优先级与覆盖顺序")]),t._v(" "),s("p",[t._v("固定值 < 引用值 < 脚本 < 星号*")]),t._v(" "),s("p",[t._v("当一个字段配置了多种类型的值时按以上顺序覆盖,星号优先级最高")]),t._v(" "),s("h4",{attrs:{id:"引用值规范"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#引用值规范"}},[t._v("#")]),t._v(" 引用值规范")]),t._v(" "),s("div",{staticClass:"language-properties extra-class"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 获取入参请求头aaa的值")]),t._v("\ninput.request.headers.aaa\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 获取入参请求体bbb字段的值")]),t._v("\ninput.request.body.bbb\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 获取入参URL Query参数fff字段的值")]),t._v("\ninput.request.params.fff\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 获取步骤1里request1的请求头ccc的值")]),t._v("\nstep1.request1.request.headers.ccc\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 获取步骤1里request1的响应体ddd的值")]),t._v("\nstep1.request1.response.body.ddd\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 获取步骤1结果里eee的值")]),t._v("\nstep1.result.eee\n\n")])])]),s("ul",[s("li",[t._v("支持单值引用,如:string,int等")]),t._v(" "),s("li",[t._v("支持对象类型的引用")])]),t._v(" "),s("p",[t._v("input: 表示调用方的输入数据,如H5页面提交上来的参数")]),t._v(" "),s("p",[t._v("stepN.requestN: 表示步骤N里调用接口N的相关参数")]),t._v(" "),s("p",[t._v("stepN.result: 表示步骤N的转换结果")]),t._v(" "),s("h4",{attrs:{id:"fallback与预处理条件"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#fallback与预处理条件"}},[t._v("#")]),t._v(" Fallback与预处理条件")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_step_fallback.png",alt:""}})]),t._v(" "),s("p",[t._v("Fallback:")]),t._v(" "),s("p",[t._v("当调用接口发生异常(如超时、网络或系统异常)可配置fallback方案:")]),t._v(" "),s("ul",[s("li",[t._v("Stop: 终止请求并立即返回")]),t._v(" "),s("li",[t._v("Continue: 继续后续的操作,且要设置默认的fallback json")])]),t._v(" "),s("p",[t._v("预处理: 根据条件判断是否要调用接口,脚本返回true时才调用接口")]),t._v(" "),s("h4",{attrs:{id:"配置步骤结果处理"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置步骤结果处理"}},[t._v("#")]),t._v(" 配置步骤结果处理")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_step_result.png",alt:""}})]),t._v(" "),s("ul",[s("li",[s("p",[t._v("支持对步骤里调用的每一个接口的返回结果做数据转换,如果配置数据转换规则原样返回并存储到上下文里供后续使用")])]),t._v(" "),s("li",[s("p",[t._v("支持对步骤里调用的一个或多个接口的返回结果做处理,并把处理完的结果存储到上下文里供后续使用,不配置则不处理")])])]),t._v(" "),s("h2",{attrs:{id:"配置输出"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置输出"}},[t._v("#")]),t._v(" 配置输出")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_output.png",alt:""}})]),t._v(" "),s("p",[t._v("配置返回给调用方的结果")]),t._v(" "),s("ul",[s("li",[t._v("支持配置响应头")]),t._v(" "),s("li",[t._v("支持配置响应体")]),t._v(" "),s("li",[t._v("支持自定脚本处理复杂的业务逻辑")])]),t._v(" "),s("h2",{attrs:{id:"脚本-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#脚本-2"}},[t._v("#")]),t._v(" 脚本")]),t._v(" "),s("p",[t._v("目前支持以下脚本语言:")]),t._v(" "),s("p",[t._v("Javascript (推荐) - ECMAScript 5标准")]),t._v(" "),s("p",[t._v("JS脚本只支持单函数,且函数名不可变,在创建脚本时系统会自动生成初始模板,模板里包含相关使用说明")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_script_1.png",alt:""}})]),t._v(" "),s("p",[t._v("Groovy")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_script_2.png",alt:""}})]),t._v(" "),s("h3",{attrs:{id:"common-js-提供了操作context上下文的便捷操作函数"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#common-js-提供了操作context上下文的便捷操作函数"}},[t._v("#")]),t._v(" common.js 提供了操作context上下文的便捷操作函数")]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * context 上下文便捷操作函数\n *\n */")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" common "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* *********** private function begin *********** */")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 获取上下文中客户端请求对象")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getInputReq")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'input'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'input'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'request'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'input'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'request'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 获取上下文步骤中请求接口的请求对象")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getStepReq")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("stepName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'requests'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'requests'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'requests'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'request'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'requests'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'request'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 获取上下文步骤中请求接口的响应对象")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getStepResp")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("stepName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'requests'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'requests'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'requests'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'response'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'requests'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'response'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* *********** private function end *********** */")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* *********** input begin ************ */")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取客户端请求头\n * @param {*} ctx 上下文 【必填】\n * @param {*} headerName 请求头字段名 【选填】,不传时返回所有请求头\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getInputReqHeader")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" headerName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" req "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInputReq")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" headers "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'headers'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" headerName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("headerName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取客户端URL请求参数(query string)\n * @param {*} ctx 上下文 【必填】\n * @param {*} paramName URL参数名 【选填】,不传时返回所有请求参数\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getInputReqParam")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" paramName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" req "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInputReq")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" params "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'params'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" paramName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" params"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("paramName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" params"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取客户端请求体\n * @param {*} ctx 上下文 【必填】\n * @param {*} field 字段名 【选填】,不传时返回整个请求体\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getInputReqBody")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" field")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" req "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInputReq")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" body "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'body'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" field "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" body"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("field"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" body"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取返回给客户端的响应头\n * @param {*} ctx 上下文 【必填】\n * @param {*} headerName 响应头字段名 【选填】,不传时返回所有响应头\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getInputRespHeader")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" headerName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" req "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInputReq")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" headers "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'headers'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" headerName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("headerName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取返回给客户端的响应体\n * @param {*} ctx 上下文 【必填】\n * @param {*} field 字段名 【选填】,不传时返回整个响应体\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getInputRespBody")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" field")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" req "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInputReq")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" body "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'body'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" field "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" body"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("field"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" body"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* *********** input begin ************ */")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* *********** step request begin ************ */")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取步骤中调用的接口的请求头\n * @param {*} ctx 上下文 【必填】\n * @param {*} stepName 步骤名【必填】\n * @param {*} requestName 请求的接口名 【必填】\n * @param {*} headerName 请求头字段名 【选填】,不传时返回所有请求头\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getStepReqHeader")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" headerName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" req "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getStepReq")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" headers "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'headers'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" headerName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("headerName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取步骤中调用的接口的URL参数\n * @param {*} ctx 上下文 【必填】\n * @param {*} stepName 步骤名【必填】\n * @param {*} requestName 请求的接口名 【必填】\n * @param {*} paramName URL参数名 【选填】,不传时返回所有URL参数\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getStepReqParam")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" paramName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" req "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getStepReq")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" params "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'params'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" paramName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" params"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("paramName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" params"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取步骤中调用的接口的请求体\n * @param {*} ctx 上下文 【必填】\n * @param {*} stepName 步骤名【必填】\n * @param {*} requestName 请求的接口名 【必填】\n * @param {*} field 字段名 【选填】,不传时返回整个请求体\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getStepReqBody")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" field")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" req "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getStepReq")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" body "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'body'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" field "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" body"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("field"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" body"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取步骤中调用的接口的响应头\n * @param {*} ctx 上下文 【必填】\n * @param {*} stepName 步骤名【必填】\n * @param {*} requestName 请求的接口名 【必填】\n * @param {*} headerName 响应头字段名 【选填】,不传时返回所有响应头\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getStepRespHeader")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" headerName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" resp "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getStepResp")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" headers "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" resp"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'headers'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" headerName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("headerName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取步骤中调用的接口的响应头\n * @param {*} ctx 上下文 【必填】\n * @param {*} stepName 步骤名【必填】\n * @param {*} requestName 请求的接口名 【必填】\n * @param {*} field 字段名 【选填】,不传时返回整个响应头\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getStepRespBody")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" field")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" resp "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getStepResp")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" body "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" resp"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'body'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" field "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" body"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("field"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" body"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取步骤结果\n * @param {*} ctx 上下文 【必填】\n * @param {*} stepName 步骤名【必填】\n * @param {*} field 字段名 【选填】,不传时返回整个步骤结果对象\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getStepResult")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" field")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("stepName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" result "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'result'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" field "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("field"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* *********** step request end ************ */")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n")])])]),s("h3",{attrs:{id:"context-js-数据结构"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#context-js-数据结构"}},[t._v("#")]),t._v(" context.js 数据结构")]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 上下文,用于保存客户输入输出和每个步骤的输入与输出结果")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" context "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 是否DEBUG模式")]),t._v("\n\tdebug"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n\t"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 各个操作的耗时")]),t._v("\n\telapsedTimes"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("actionName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("123")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 操作名称:耗时")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 客户输入和接口的返回结果")]),t._v("\n input"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n request"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n path"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n method"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GET/POST"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headers"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n body"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n params"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n response"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 聚合接口的响应")]),t._v("\n headers"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n body"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 步骤")]),t._v("\n step1"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n requests"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 接口1")]),t._v("\n request1"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 请求相关参数")]),t._v("\n request"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n url"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n method"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GET/POST"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headers"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n body"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 根据转换规则转换后的接口响应")]),t._v("\n response"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n headers"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n body"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 接口2")]),t._v("\n request2"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n request"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n url"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n method"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GET/POST"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headers"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n body"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n response"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n headers"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n body"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//...")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 步骤结果")]),t._v("\n result"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n")])])]),s("h2",{attrs:{id:"异常处理"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#异常处理"}},[t._v("#")]),t._v(" 异常处理")]),t._v(" "),s("p",[t._v("当要在脚本里中止请求时可以通过以下方式来实现")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_exception.png",alt:""}})]),t._v(" "),s("p",[t._v("返回一个对象且这个对象包含一个_stopAndResponse等于true的属性,Fizz会终止后续的操作并把这个对象返回给调用方。")]),t._v(" "),s("h2",{attrs:{id:"配置路由"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置路由"}},[t._v("#")]),t._v(" 配置路由")]),t._v(" "),s("p",[t._v("至此服务编排的接口配置完成,但此时还不能通过网关访问接口,需要到网关管理-路由管理里配置路由")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_route.png",alt:""}})]),t._v(" "),s("h2",{attrs:{id:"在线测试"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#在线测试"}},[t._v("#")]),t._v(" 在线测试")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_test.png",alt:""}})]),t._v(" "),s("ul",[s("li",[t._v("支持在线实时测试")]),t._v(" "),s("li",[t._v("支持测试接口和正式接口隔离")]),t._v(" "),s("li",[t._v("支持返回上下文,可以查看整个执行过程中各个步骤及请求的输入与输出")]),t._v(" "),s("li",[t._v("支持保存历史测试记录")])]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_test2.png",alt:""}})]),t._v(" "),s("p",[t._v("支持调试模式,在测试接口和正式接口均可使用,修改后重新发布可实时生效,在调试模式下会打印请求日志及报文,主要用于排查线上问题")]),t._v(" "),s("h2",{attrs:{id:"导入导出"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#导入导出"}},[t._v("#")]),t._v(" 导入导出")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_import_export.png",alt:""}})]),t._v(" "),s("p",[t._v("导入导出主要用于在各个环境间同步接口配置,在开发环境配置好后导到测试环境中测试,测试完后导到生产环境进行发布")]),t._v(" "),s("h2",{attrs:{id:"发布-下线和审核"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#发布-下线和审核"}},[t._v("#")]),t._v(" 发布|下线和审核")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_release_1.png",alt:""}})]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_release_2.png",alt:""}})]),t._v(" "),s("p",[t._v("目前发布|下线申请有以上两个入口。")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_release_rollback1.png",alt:""}})]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_release_rollback.png",alt:""}})]),t._v(" "),s("ul",[s("li",[t._v("批量发布:对发布单里的接口进行批量发布")]),t._v(" "),s("li",[t._v("批量回滚:对发布单里的接口进行批量回滚")]),t._v(" "),s("li",[t._v("发布:实时发布到网关")]),t._v(" "),s("li",[t._v("回滚:支持回滚到历史任何一个版本,可在发布历史里指定一个版本进行回滚")]),t._v(" "),s("li",[t._v("下线:从网关删除接口,在后台可以通过发布功能再次上线")])]),t._v(" "),s("h3",{attrs:{id:"发布流程说明"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#发布流程说明"}},[t._v("#")]),t._v(" 发布流程说明")]),t._v(" "),s("p",[t._v("申请发布、审核、发布和下线功能的权限可根据需要灵活分配给不同角色,如:开发人员只能申请发布,上级领导审核,运维或测试人员执行发布、回滚或下线。在开发、测试和预生产环境为了方便开发人员调试也可把申请发布、审核、发布和下线功能都分配给开发人员。")])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/app.bf39d9b6.js b/docs/assets/js/app.41e48030.js similarity index 87% rename from docs/assets/js/app.bf39d9b6.js rename to docs/assets/js/app.41e48030.js index 650d810..c8507ce 100644 --- a/docs/assets/js/app.bf39d9b6.js +++ b/docs/assets/js/app.41e48030.js @@ -1,4 +1,4 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[0],[]]);!function(t){function e(e){for(var r,a,u=e[0],c=e[1],s=e[2],f=0,p=[];f0?o(r(t),9007199254740991):0}},function(t,e){var n=Array.isArray;t.exports=n},function(t,e,n){var r=n(31),o=n(23);t.exports=function(t){return r(o(t))}},function(t,e,n){var r=n(140),o="object"==typeof self&&self&&self.Object===Object&&self,i=r||o||Function("return this")();t.exports=i},function(t,e,n){var r=n(6),o=n(1),i=n(7),a=Object.defineProperty,u={},c=function(t){throw t};t.exports=function(t,e){if(i(u,t))return u[t];e||(e={});var n=[][t],s=!!i(e,"ACCESSORS")&&e.ACCESSORS,l=i(e,0)?e[0]:c,f=i(e,1)?e[1]:void 0;return u[t]=!!n&&!o((function(){if(s&&!r)return!0;var t={length:-1};s?a(t,1,{enumerable:!0,get:c}):t[1]=1,n.call(t,l,f)}))}},function(t,e){var n={}.toString;t.exports=function(t){return n.call(t).slice(8,-1)}},function(t,e,n){var r=n(110),o=n(3),i=function(t){return"function"==typeof t?t:void 0};t.exports=function(t,e){return arguments.length<2?i(r[t])||i(o[t]):r[t]&&r[t][e]||o[t]&&o[t][e]}},function(t,e){t.exports=!1},function(t,e){t.exports=function(t){if("function"!=typeof t)throw TypeError(String(t)+" is not a function");return t}},function(t,e,n){var r=n(220),o=n(223);t.exports=function(t,e){var n=o(t,e);return r(n)?n:void 0}},function(t,e){t.exports=function(t){if(null==t)throw TypeError("Can't call method on "+t);return t}},function(t,e,n){"use strict";var r=n(0),o=n(29).filter,i=n(51),a=n(17),u=i("filter"),c=a("filter");r({target:"Array",proto:!0,forced:!u||!c},{filter:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}})},function(t,e,n){var r=n(6),o=n(75),i=n(32),a=n(15),u=n(44),c=n(7),s=n(105),l=Object.getOwnPropertyDescriptor;e.f=r?l:function(t,e){if(t=a(t),e=u(e,!0),s)try{return l(t,e)}catch(t){}if(c(t,e))return i(!o.f.call(t,e),t[e])}},function(t,e){t.exports=function(t){return null!=t&&"object"==typeof t}},function(t,e,n){"use strict";var r=n(128).charAt,o=n(28),i=n(111),a=o.set,u=o.getterFor("String Iterator");i(String,"String",(function(t){a(this,{type:"String Iterator",string:String(t),index:0})}),(function(){var t,e=u(this),n=e.string,o=e.index;return o>=n.length?{value:void 0,done:!0}:(t=r(n,o),e.index+=t.length,{value:t,done:!1})}))},function(t,e,n){var r,o,i,a=n(180),u=n(3),c=n(4),s=n(11),l=n(7),f=n(48),p=n(34),d=u.WeakMap;if(a){var h=new d,v=h.get,g=h.has,m=h.set;r=function(t,e){return m.call(h,t,e),e},o=function(t){return v.call(h,t)||{}},i=function(t){return g.call(h,t)}}else{var y=f("state");p[y]=!0,r=function(t,e){return s(t,y,e),e},o=function(t){return l(t,y)?t[y]:{}},i=function(t){return l(t,y)}}t.exports={set:r,get:o,has:i,enforce:function(t){return i(t)?o(t):r(t,{})},getterFor:function(t){return function(e){var n;if(!c(e)||(n=o(e)).type!==t)throw TypeError("Incompatible receiver, "+t+" required");return n}}}},function(t,e,n){var r=n(50),o=n(31),i=n(12),a=n(13),u=n(127),c=[].push,s=function(t){var e=1==t,n=2==t,s=3==t,l=4==t,f=6==t,p=5==t||f;return function(d,h,v,g){for(var m,y,b=i(d),_=o(b),x=r(h,v,3),w=a(_.length),O=0,S=g||u,j=e?S(d,w):n?S(d,0):void 0;w>O;O++)if((p||O in _)&&(y=x(m=_[O],O,b),t))if(e)j[O]=y;else if(y)switch(t){case 3:return!0;case 5:return m;case 6:return O;case 2:c.call(j,m)}else if(l)return!1;return f?-1:s||l?l:j}};t.exports={forEach:s(0),map:s(1),filter:s(2),some:s(3),every:s(4),find:s(5),findIndex:s(6)}},function(t,e,n){var r=n(39),o=n(205),i=n(206),a=r?r.toStringTag:void 0;t.exports=function(t){return null==t?void 0===t?"[object Undefined]":"[object Null]":a&&a in Object(t)?o(t):i(t)}},function(t,e,n){var r=n(1),o=n(18),i="".split;t.exports=r((function(){return!Object("z").propertyIsEnumerable(0)}))?function(t){return"String"==o(t)?i.call(t,""):Object(t)}:Object},function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},function(t,e,n){var r,o=n(5),i=n(179),a=n(73),u=n(34),c=n(109),s=n(70),l=n(48),f=l("IE_PROTO"),p=function(){},d=function(t){return" +

coming soon

上次更新: 2020-9-8 15:3
+ diff --git a/docs/guide/aggregate/configuration.html b/docs/guide/aggregate/configuration.html index 656536b..9ccfe04 100644 --- a/docs/guide/aggregate/configuration.html +++ b/docs/guide/aggregate/configuration.html @@ -7,7 +7,7 @@ - + @@ -23,7 +23,7 @@ 使用文档
查看源码 -

# 创建服务

# 创建聚合接口

# 配置输入

  • 配置输入的定义包括3部分:请求头、请求体和Query参数
  • 基于JSON Schema规范
  • 自带校验规则
  • 支持自定义脚本实现复杂的逻辑校验

JSON Schema规范,详见:

http://json-schema.org/specification.html

http://json-schema.org/understanding-json-schema/

# 配置校验结果

  • 校验不通过时,Fizz会把校验失败的原因(如:订单ID不能为空)放到上下文的validateMsg字段里
  • 可以自定义返回给调用方的报文格式,如 msgCode, message
  • 支持自定义响应头
  • 支持自定义脚本处理校验结果

# 配置步骤

# 配置步骤的基础信息

# 配置步骤的接口入出参

# 步骤说明

  • 一个聚合接口可包含多个步骤
  • 一个步骤可包含多个请求(即调用多个接口)
  • 步骤间是串联顺序执行
  • 一个步骤内的多个请求并行执行

# 数据转换

支持配置固定值,引用值和脚本

# 固定值

# 引用值

# 脚本

# 星号 *

星号通配符可以接收一个返回对象类型的引用值,返回对象里的字段会合并到目标对象里

样例:userInfo = {"userName": "Fizz", "userID": 1234}

# 优先级与覆盖顺序

固定值 < 引用值 < 脚本 < 星号*

当一个字段配置了多种类型的值时按以上顺序覆盖,星号优先级最高

# 引用值规范

# 获取入参请求头aaa的值
+        

# 创建服务

# 创建聚合接口

# 配置输入

  • 配置输入的定义包括3部分:请求头、请求体和Query参数
  • 基于JSON Schema规范
  • 自带校验规则
  • 支持自定义脚本实现复杂的逻辑校验

JSON Schema规范,详见:

http://json-schema.org/specification.html

http://json-schema.org/understanding-json-schema/

# 配置校验结果

  • 校验不通过时,Fizz会把校验失败的原因(如:订单ID不能为空)放到上下文的validateMsg字段里
  • 可以自定义返回给调用方的报文格式,如 msgCode, message
  • 支持自定义响应头
  • 支持自定义脚本处理校验结果

# 配置步骤

# 配置步骤的基础信息

# 配置步骤的接口入出参

# 步骤说明

  • 一个聚合接口可包含多个步骤
  • 一个步骤可包含多个请求(即调用多个接口)
  • 步骤间是串联顺序执行
  • 一个步骤内的多个请求并行执行

# 数据转换

支持配置固定值,引用值和脚本

# 固定值

# 引用值

# 脚本

# 星号 *

星号通配符可以接收一个返回对象类型的引用值,返回对象里的字段会合并到目标对象里

样例:userInfo = {"userName": "Fizz", "userID": 1234}

# 优先级与覆盖顺序

固定值 < 引用值 < 脚本 < 星号*

当一个字段配置了多种类型的值时按以上顺序覆盖,星号优先级最高

# 引用值规范

# 获取入参请求头aaa的值
 input.request.headers.aaa
 
 # 获取入参请求体bbb字段的值
@@ -292,7 +292,7 @@ step1.result.eee
   }
 };
 
-

# 异常处理

当要在脚本里中止请求时可以通过以下方式来实现

返回一个对象且这个对象包含一个_stopAndResponse等于true的属性,Fizz会终止后续的操作并把这个对象返回给调用方。

# 在线测试

  • 支持在线实时测试
  • 支持测试接口和正式接口隔离
  • 支持返回上下文,可以查看整个执行过程中各个步骤及请求的输入与输出
  • 支持保存历史测试记录

支持调试模式,在测试接口和正式接口均可使用,修改后重新发布可实时生效,在调试模式下会打印请求日志及报文,主要用于排查线上问题

# 导入导出

导入导出主要用于在各个环境间同步接口配置,在开发环境配置好后导到测试环境中测试,测试完后导到生产环境进行发布

# 发布|下线和审核

目前发布|下线申请有以上两个入口。

  • 批量发布:对发布单里的接口进行批量发布
  • 批量回滚:对发布单里的接口进行批量回滚
  • 发布:实时发布到网关
  • 回滚:支持回滚到历史任何一个版本,可在发布历史里指定一个版本进行回滚
  • 下线:从网关删除接口,在后台可以通过发布功能再次上线

# 发布流程说明

申请发布、审核、发布和下线功能的权限可根据需要灵活分配给不同角色,如:开发人员只能申请发布,上级领导审核,运维或测试人员执行发布、回滚或下线。在开发、测试和预生产环境为了方便开发人员调试也可把申请发布、审核、发布和下线功能都分配给开发人员。

上次更新: 2020-9-9 17:26

# 异常处理

当要在脚本里中止请求时可以通过以下方式来实现

返回一个对象且这个对象包含一个_stopAndResponse等于true的属性,Fizz会终止后续的操作并把这个对象返回给调用方。

# 配置路由

至此服务编排的接口配置完成,但此时还不能通过网关访问接口,需要到网关管理-路由管理里配置路由

# 在线测试

  • 支持在线实时测试
  • 支持测试接口和正式接口隔离
  • 支持返回上下文,可以查看整个执行过程中各个步骤及请求的输入与输出
  • 支持保存历史测试记录

支持调试模式,在测试接口和正式接口均可使用,修改后重新发布可实时生效,在调试模式下会打印请求日志及报文,主要用于排查线上问题

# 导入导出

导入导出主要用于在各个环境间同步接口配置,在开发环境配置好后导到测试环境中测试,测试完后导到生产环境进行发布

# 发布|下线和审核

目前发布|下线申请有以上两个入口。

  • 批量发布:对发布单里的接口进行批量发布
  • 批量回滚:对发布单里的接口进行批量回滚
  • 发布:实时发布到网关
  • 回滚:支持回滚到历史任何一个版本,可在发布历史里指定一个版本进行回滚
  • 下线:从网关删除接口,在后台可以通过发布功能再次上线

# 发布流程说明

申请发布、审核、发布和下线功能的权限可根据需要灵活分配给不同角色,如:开发人员只能申请发布,上级领导审核,运维或测试人员执行发布、回滚或下线。在开发、测试和预生产环境为了方便开发人员调试也可把申请发布、审核、发布和下线功能都分配给开发人员。

上次更新: 2020-11-9 9:59
- + diff --git a/docs/guide/aggregate/index.html b/docs/guide/aggregate/index.html index 463982d..5a19b7d 100644 --- a/docs/guide/aggregate/index.html +++ b/docs/guide/aggregate/index.html @@ -7,7 +7,7 @@ - + @@ -23,7 +23,7 @@ 使用文档 查看源码 -

# 什么是服务编排

服务编排主要基于现有的业务微服务使用在线配置的方式快速的生成一个聚合接口。

特点: 在线API设计、在线测试、快速开发

# 举例说明

订单详情页面需要展示订单信息、商品信息和用户信息。可通过配置的方式生成一个接口先后调用底层微服务的订单详情接口、商品信息接口和用户信息接口,再从这3个接口的返回结果里提取需要的字段返回给前端页面。

# 服务编排架构

# 适用场景

# 前端

1、一个页面调用多个接口时,可以编排好返回聚合结果,提高页面数据的加载速度

2、移动设备计算能力有限,可以把数据计算或业务处理逻辑放到服务端完成,加快页面响应

# 后端

1、替换应用层的聚合接口,减少应用层的胶水代码

2、快速生成透传数据类型的接口

3、数据转换和映射

上次更新: 2020-9-9 17:26
- + diff --git a/docs/guide/aggregate/overview.html b/docs/guide/aggregate/overview.html index 3361607..baaa7aa 100644 --- a/docs/guide/aggregate/overview.html +++ b/docs/guide/aggregate/overview.html @@ -7,7 +7,7 @@ - + @@ -23,7 +23,7 @@ 使用文档 查看源码 -

1.创建服务

此服务是一个分组的概念,可以包含多个聚合接口,类似于微服务体系里的服务

2.创建服务编排接口

3.开通网关白名单和配置访问策略和插件

4.测试服务编排接口

5.发布接口

界面总览

上次更新: 2020-9-9 17:26
- + diff --git a/docs/guide/benchmark/index.html b/docs/guide/benchmark/index.html index 8374339..734be6a 100644 --- a/docs/guide/benchmark/index.html +++ b/docs/guide/benchmark/index.html @@ -7,7 +7,7 @@ - + @@ -23,7 +23,7 @@ 使用文档 查看源码 -

# 基准测试结果

我们将Fizz与Spring官方spring-cloud-gateway进行比较,使用相同的环境和条件,测试对象均为单个节点。

产品 QPS 90% Latency(ms)
直接访问后端服务 9087.46 10.76
fizz-gateway 5927.13 19.86
spring-cloud-gateway 5044.04 22.91

# 基准测试详情

# 硬件环境

后端服务所在服务器:

4核8G内存

Intel(R) Xeon(R) CPU X5675 @ 3.07GHz * 4

Linux version 3.10.0-327.el7.x86_64

节点所在服务器:

4核8G内存

Intel(R) Xeon(R) CPU X5675 @ 3.07GHz * 4

Linux version 3.10.0-327.el7.x86_64

压测程序所在服务器:

4核8G内存

Intel(R) Xeon(R) CPU X5675 @ 3.07GHz * 4

Linux version 3.10.0-327.el7.x86_64

# 压测工具

压测软件:wrk

并发连接: 100

# 压测结果截图

- + diff --git a/docs/guide/index.html b/docs/guide/index.html index 5bab2b2..f62ef0c 100644 --- a/docs/guide/index.html +++ b/docs/guide/index.html @@ -7,7 +7,7 @@ - + @@ -23,7 +23,7 @@ 使用文档 查看源码 -
上次更新: 2020-7-31 17:12
- +
上次更新: 2020-7-31 17:12
+ diff --git a/docs/guide/installation/index.html b/docs/guide/installation/index.html index 85144c4..a56b7eb 100644 --- a/docs/guide/installation/index.html +++ b/docs/guide/installation/index.html @@ -7,7 +7,7 @@ - + @@ -23,7 +23,7 @@ 使用文档 查看源码 -

# 安装依赖

安装以下依赖软件:

  • Redis 2.8或以上版本
  • MySQL 5.7或以上版本
  • Apollo配置中心 (可选)
  • Eureka服务注册中心

# 安装MySQL

  • 操作系统 CentOS 6.5
  • MySQL 5.7.30
  1. 下载MySQL
wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.30-1.el6.x86_64.rpm-bundle.tar
+        

# 安装依赖

安装以下依赖软件:

  • Redis 2.8或以上版本
  • MySQL 5.7或以上版本
  • Apollo配置中心 (可选)
  • Eureka服务注册中心

# 安装MySQL

  • 操作系统 CentOS 6.5
  • MySQL 5.7.30
  1. 下载MySQL
wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.30-1.el6.x86_64.rpm-bundle.tar
 
  1. 解压
tar -xvf mysql-5.7.30-1.el6.x86_64.rpm-bundle.tar
 
  1. 安装
sudo yum install mysql-community-{server,client,common,libs}-*
 
  1. 启动
sudo service mysqld start
@@ -101,6 +101,6 @@ export JAVA_HOME JRE_HOME PATH CLASSPATH
       
       →
     

- + diff --git a/docs/guide/intro/index.html b/docs/guide/intro/index.html index c46fb0e..dd09ac3 100644 --- a/docs/guide/intro/index.html +++ b/docs/guide/intro/index.html @@ -7,7 +7,7 @@ - + @@ -23,11 +23,11 @@ 使用文档 查看源码 -

# 什么是Fizz网关

A Managerment API Gateway in Java . Fizz Gateway 是一个基于 Java开发的微服务网关,能够实现热服务编排、自动授权选择、线上服务脚本编码、在线测试、高性能路由、API审核管理等目的,拥有强大的自定义插件系统可以自行扩展,并且提供友好的图形化配置界面,能够快速帮助企业进行API服务治理、减少中间层胶水代码以及降低编码投入、提高 API 服务的稳定性和安全性。

# Fizz的设计

# 产品特性

  • 集群管理:Fizz网关节点是无状态的,配置信息自动同步,支持节点水平拓展和多集群部署。
  • 服务编排:支持热服务编排能力,支持前后端编码,随时随地更新API。
  • 负载均衡:支持round-robin负载均衡。
  • 服务发现:支持从Eureka注册中心发现后端服务器。
  • 配置中心:支持接入apollo配置中心。
  • HTTP反向代理:隐藏真实后端服务,支持 Rest API反向代理。
  • 访问策略:支持不同策略访问不同的API、配置不同的鉴权等。
  • IP黑白名单:支持配置IP黑白名单。
  • 自定义插件:强大的插件机制支持自由扩展。
  • 可扩展:简单易用的插件机制方便扩展功能。
  • 高性能:性能在众多网关之中表现优异。
  • 版本控制:支持操作的发布和多次回滚。
  • 管理后台:通过管理后台界面对网关集群进行各项配置。
上次更新: 2020-9-9 17:26
- + diff --git a/docs/guide/manager/manager_aggregate.html b/docs/guide/manager/manager_aggregate.html index 446e7ae..469a9b4 100644 --- a/docs/guide/manager/manager_aggregate.html +++ b/docs/guide/manager/manager_aggregate.html @@ -7,7 +7,7 @@ - + @@ -23,7 +23,7 @@ 使用文档 查看源码 -

# 概述

接口列表功能用于维护聚合接口,聚合接口从外部调用方角度看是一个简单的接口,通过入参请求获取响应结果,内部实现会调用多个底层后端服务,将多个调用结果聚合转换成外部调用方想要的数据格式,更多详情请查看服务编排介绍,下面介绍接口列表功能的操作。

# 接口列表

菜单位置:服务编排 > 接口列表。点击菜单后进入接口列表页面,如图所示。

manager_aggregate_list_query

# 新增接口

点击 新增 按钮弹出新增窗口,如图所示。

manager_aggregate_add_1

# 基础信息

manager_aggregate_add_2

所属服务:接口所属服务,更多详情请查看服务管理功能介绍,必选;

接口名:接口名称,用于展示使用,长度不能超过200个字符,必填;

方法:接口请求方法类型,可选GET|POST,必选;

路径:接口请求路径后缀,长度不能超过2000个字符,必填;

开发人员:接口对应负责的开发人员,长度不能超过200个字符;

描述:接口功能描述,长度不能超过2000个字符;

举个例子,所属服务设置my-test-service,方法设置POST,路径设置test-aggregate-post,对应的聚合接口请求为 POST http://{Fizz网关ip地址}:{port端口}/proxy/my-test-service/test-aggregate-post。

# 配置输入

聚合接口的入参大部分是通过JSON Schema来定义的,下面先简单地介绍下JSON Schema。

# JSON Schema介绍

JSON Schema实际上也是JSON数据,用于标注和验证JSON文档,可以类比于XML Schema,当前最新版本2019-09。

作为普通用户,我们并不需要去了解JSON Schema的规范内容,只要能够构建JSON Schema即可。

要理解JSON Schema,首先要理解什么是JSON。JSON是JavaScript Object Notation的缩写,一种简单的数据交换格式。最初JSON是基于JavaScript,广泛的应用于万维网。由于其简洁和清晰的层次结构、易于人阅读等特性,使得越来越多的场景下被采用。

JSON包含以下数据结构:

- + diff --git a/docs/guide/manager/manager_aggregate_approve.html b/docs/guide/manager/manager_aggregate_approve.html index e4f65b8..55150af 100644 --- a/docs/guide/manager/manager_aggregate_approve.html +++ b/docs/guide/manager/manager_aggregate_approve.html @@ -7,7 +7,7 @@ - + @@ -23,7 +23,7 @@ 使用文档 查看源码 -

# 概述

聚合接口的发布|下线操作需要提交发布|下线申请,审核通过后申请人才能执行发布|下线操作。待审核功能用于审核发布|下线申请,下面介绍待审核功能。

# 审核列表

菜单位置:发布申请 > 待审核。点击菜单后进入审核列表页面,如图所示。

manager_aggregate_approve_list_query

# 审核操作

点击 查看 按钮可以查看发布|下线申请详情,详情页中可执行审核操作。

申请列表页提供快速审核操作,点击 审核 按钮后弹出审核确认窗口,如图所示。

manager_aggregate_approve_op_1

manager_aggregate_approve_op_2

审核结果:勾选通过,审核后申请能可执行申请的操作;勾选不通过,审核后申请失败,申请人不能执行申请的操作。

审核后申请人会收到审核结果邮件通知,如下图是审核通过的邮件通知。

manager_aggregate_approve_op_3

上次更新: 2020-10-26 18:40
- + diff --git a/docs/guide/manager/manager_aggregate_approve_op_log.html b/docs/guide/manager/manager_aggregate_approve_op_log.html index 6120f2b..28c05e6 100644 --- a/docs/guide/manager/manager_aggregate_approve_op_log.html +++ b/docs/guide/manager/manager_aggregate_approve_op_log.html @@ -7,7 +7,7 @@ - + @@ -23,7 +23,7 @@ 使用文档 查看源码 -

# 概述

管理后台记录了发布|下线申请的审核操作日志,审核日志功能提供界面查询后台记录的审核操作日志。

# 审核日志列表

菜单位置:发布申请 > 审核日志。点击菜单后进入审核日志列表页面,如图所示。

manager_aggregate_approve_op_log_list_query

# 审核日志详情

点击 查看 按钮弹出审核日志详情页面,如图所示。

manager_aggregate_approve_op_log_detail_1

manager_aggregate_approve_op_log_detail_2

上次更新: 2020-10-26 18:40
- + diff --git a/docs/guide/manager/manager_aggregate_my_apply.html b/docs/guide/manager/manager_aggregate_my_apply.html index cb6e78f..86e4a3c 100644 --- a/docs/guide/manager/manager_aggregate_my_apply.html +++ b/docs/guide/manager/manager_aggregate_my_apply.html @@ -7,7 +7,7 @@ - + @@ -23,7 +23,7 @@ 使用文档 查看源码 -

# 概述

聚合接口的发布|下线操作需要提交发布|下线申请,审核通过后申请人才能执行发布|下线操作。我的申请功能用于发布|下线申请过程的相关操作,下面介绍我的申请功能。

# 申请列表

菜单位置:发布申请 > 我的申请。点击菜单后进入申请列表页面,如图所示。

manager_aggregate_my_apply_list_query

# 申请撤回

对于已提交但未被审核的申请可执行撤回操作,点击 撤回 按钮弹出确认窗口,如图所示。

manager_aggregate_my_apply_revoke_1

点击 确定 按钮后确认撤回申请,如图所示。

manager_aggregate_my_apply_revoke_2

撤回后审核人会收到邮箱提醒无需再处理该申请,如图所示。

manager_aggregate_my_apply_revoke_3

撤回后可对申请重新进行编辑后再次提交,点击 编辑 按钮后弹出编辑窗口,如图所示。

manager_aggregate_my_apply_revoke_4

点击 确定 按钮后再次提交申请,如图所示。

manager_aggregate_my_apply_revoke_5

# 申请详情

点击 查看 按钮查看申请详情。

manager_aggregate_my_apply_detail_1

manager_aggregate_my_apply_detail_2

操作日志记录该申请的所有操作,包括申请提交、申请撤回、申请重新提交、审核不通过、审核通过、修改审核人、接口发布、接口下线 、接口回滚、接口撤回。

待审核状态申请可以更换审核人,点击 修改审核人 按钮后弹出修改审核人窗口,如图所示。

manager_aggregate_my_apply_detail_3

重新选择审核人后点击 确定 按钮,修改审核人完成。

修改后原审核人会收到邮件提醒无须再处理该申请。

修改后新的审核人会收到邮件提醒需要处理该申请。

审核通过后可以对接口进行发布操作,如图所示。

manager_aggregate_my_apply_detail_4

批量发布:对申请内的接口批量发布推送到Fizz网关。

批量回滚:对申请内的接口批量回滚到上一个版本,当发布后接口异常时该操作相当有用。

对于申请通过后又无须操作的接口可以执行撤回操作,撤回接口时必须填写备注信息用于回溯查询,如图所示。

manager_aggregate_my_apply_detail_5

manager_aggregate_my_apply_detail_6

上次更新: 2020-10-26 18:40
- + diff --git a/docs/guide/manager/manager_aggregate_op_log.html b/docs/guide/manager/manager_aggregate_op_log.html index 488b671..ae71e71 100644 --- a/docs/guide/manager/manager_aggregate_op_log.html +++ b/docs/guide/manager/manager_aggregate_op_log.html @@ -7,7 +7,7 @@ - + @@ -23,7 +23,7 @@ 使用文档 查看源码 -

# 概述

管理后台记录了聚合接口的新增、修改、发布、下线、回滚、删除操作日志,通过查看操作日志可以清楚地掌握接口的操作轨迹。操作日志功能提供界面查询聚合接口的操作日志。

# 操作日志列表

菜单位置:服务编排 > 操作日志。点击菜单后进入操作日志列表页面,如图所示。

manager_aggregate_op_log_list_query

# 查看日志详情

点击 查看 按钮弹出操作日志详情页面,如图所示。

manager_aggregate_op_log_detail_1

manager_aggregate_op_log_detail_2

上次更新: 2020-10-26 18:40
- + diff --git a/docs/guide/manager/manager_api_auth.html b/docs/guide/manager/manager_api_auth.html index 9032114..c15e3dc 100644 --- a/docs/guide/manager/manager_api_auth.html +++ b/docs/guide/manager/manager_api_auth.html @@ -7,7 +7,7 @@ - + @@ -23,7 +23,7 @@ 使用文档 查看源码 -

# 概述

路由管理功能用于维护网关的路由规则,支持按请求路径转发、转发到指定后端服务两种转发规则,支持插件配置。下面介绍路由管理的操作。

# 路由列表

菜单位置:网关管理 > 路由管理。点击菜单后进入路由列表页面,如图所示。

manager_api_auth_list_query

# 新增路由

点击 新增 按钮弹出新增窗口,如图所示。

manager_api_auth_add_1

manager_api_auth_add_2

网关分组:选取路由关联的网关分组,只有属于所选分组的网关实例路由规则才会生效,必选;

服务:网关的请求路径格式为 http://{ip}:{port}/proxy/{service}{apiPath},服务对应{service}段,当 转发 选择 按请求路径转发 时服务需要是聚合配置的服务或者是Eureka注册的服务,当 转发 选择 转发到指定后端服务 时服务不需要是实际存在的服务,只用于路径匹配使用,长度不能超过50个字符,必填;

API方法:请求的method类型,可选GET|POST;

API Path:网关的请求路径格式为 http://{ip}:{port}/proxy/{service}{apiPath},API Path对应{apiPath}段,使用前缀匹配原则,例如"/api/"将匹配"/api/"、"/api/1"、"/api/1/1"等路径;

应用:选取路由关联的应用,网关使用选取应用的信息进行鉴权,更多详情请查看appID管理功能介绍;

访问:可选允许|禁止,必选;

转发:可选按请求路径转发|转发到指定后端服务,当选择 按请求路径转发 时,请求会按请求路径转发,例如网关请求 http://{ip}:{port}/proxy/my-service/api-path 将转发到 http://my-service/api-path;当选择 转发到指定后端服务 时,需要添加转发到的后端服务URL,请求会转发到配置的后端服务,例如配置了服务为 my-service,API Path为空,后端服务URL为 http://127.0.0.1:8080/forward-service/,网关请求 http://{ip}:{port}/proxy/my-service/api-path 将转发到 http://127.0.0.1:8080/forward-service/api-path。

点击 添加插件 按钮为路由添加插件,如图所示。

manager_api_auth_add_3

配置插件路由级别的自定义配置,表单界面来自于插件的表单定义,更多详情请查看插件管理功能介绍。

manager_api_auth_add_4

配置完成后点击 保存 按钮保存路由规则。

manager_api_auth_add_5

# 编辑路由

点击 编辑 按钮弹出编辑窗口,如图所示。

manager_api_auth_edit_1

manager_api_auth_edit_2

# 删除路由

点击 删除 按钮弹出删除确认窗口,如图所示。

manager_api_auth_delete_1

manager_api_auth_delete_2

上次更新: 2020-10-26 18:40
- + diff --git a/docs/guide/manager/manager_app_id.html b/docs/guide/manager/manager_app_id.html index ba78751..7c8b0d4 100644 --- a/docs/guide/manager/manager_app_id.html +++ b/docs/guide/manager/manager_app_id.html @@ -7,7 +7,7 @@ - + @@ -23,7 +23,7 @@ 使用文档 查看源码 -

# 概述

appID管理功能维护应用鉴权信息,可配置是否启用签名、是否启用IP白名单,AppID级别的自定义配置供自定义插件使用。appID用于在路由管理配置中关联路由规则,当对应路由规则触发时会对应用进行鉴权。

# appID列表

菜单位置:网关管理 > appID管理。点击菜单后进入appID列表页面,如图所示。

manager_app_id_list_query

# 新增appID

点击 新增 按钮弹出新增窗口,如图所示。

manager_app_id_add_1

manager_app_id_add_2

appID:第三方应用唯一标识,长度不能超过64个字符,必填;

应用名:第三方应用名称,长度不能超过128个字符,必填;

是否启用签名:当启动时必须配置 认证方式 和 密钥;

认证方式:可选 密钥(使用网关内置鉴权方式验证)|自定义认证插件(使用自定义的鉴权逻辑),更多信息请查看Fizz网关的介绍;启用签名时必填;

密钥:第三方应用使用的密钥,可通过 生成随机密钥 按钮生成一个随机的密钥,启用签名时必填;

是否启用IP白名单:当启用时可以配置 IP白名单,网关会根据请求来源IP地址进行过滤;

IP白名单:IP段支持 1.2.3.100-120 和 1.2.3.*两种格式,仅最后一段可用范围或星号表示;

自定义配置:AppID级别的自定义配置供自定义插件使用,所有插件均可获取到此配置信息。

# 编辑appID

点击 编辑 按钮弹出编辑窗口,如图所示。

manager_app_id_edit_1

manager_app_id_edit_2

# 删除appID

点击 删除 按钮弹出删除确认窗口,如图所示。

manager_app_id_delete_1

manager_app_id_delete_2

点击 确定 按钮后删除appID,如果appID存在关联的路由配置时,对应关联的路由配置也会一起删除。

上次更新: 2020-10-26 18:40
- + diff --git a/docs/guide/manager/manager_gateway_aggregate_cache.html b/docs/guide/manager/manager_gateway_aggregate_cache.html index a4bc5b4..604eddc 100644 --- a/docs/guide/manager/manager_gateway_aggregate_cache.html +++ b/docs/guide/manager/manager_gateway_aggregate_cache.html @@ -7,7 +7,7 @@ - + @@ -23,7 +23,7 @@ 使用文档 查看源码 -

# 概述

网关缓存功能用于查询Fizz网关实例本地缓存的已发布接口信息,可以快速的了解当前网关实例生效的全部接口,同时通过查看后台接口发布版本号与网关实例本地缓存的接口版本号是否一致可以排查接口缓存问题,下面介绍网关缓存功能的操作。

# 网关列表

菜单位置:服务编排 > 网关缓存。点击菜单后进入网关列表页面,如图所示。

manager_aggregate_gateway_list_query

Fizz网关与后台注册到同一个eureka注册中心,后台通过eureka获取网关的实例列表。

# 网关缓存列表

点击 查看 按钮后弹出网关详情页面,该页面显示所选网关实例的接口缓存列表,如图所示。

manager_aggregate_gateway_cache_list_query_1

manager_aggregate_gateway_cache_list_query_2

# 网关缓存详情

点击 查看 按钮弹出所选接口的配置详情,如图所示。

manager_aggregate_gateway_cache_detail_1

manager_aggregate_gateway_cache_detail_2

上次更新: 2020-10-26 18:40
- + diff --git a/docs/guide/manager/manager_gateway_group.html b/docs/guide/manager/manager_gateway_group.html index 163ab7f..1c341a4 100644 --- a/docs/guide/manager/manager_gateway_group.html +++ b/docs/guide/manager/manager_gateway_group.html @@ -7,7 +7,7 @@ - + @@ -23,7 +23,7 @@ 使用文档 查看源码 -

# 概述

网关分组功能用于维护分组元数据,将网关实例IP与分组关联,通过为不同的分组配置不同的路由策略,从而实现网关的分组管理。

# 分组示例

我们的线上业务涉及To C(个人用户)、To B(企业)、To T(第三方),对于不同业务会有对应的机器接受请求访问,不同的业务需要有各自的路由策略,因此进行了如下的分组划分。

分组ID 分组名称 描述
default 默认分组 默认分组是后台默认创建的分组,不用指定IP,不属于其它分组的机器都归到默认分组,默认分组不可修改或删除
c 2c分组 只接受面向个人用户的请求
b 2b分组 只接受面向企业的请求
t 面向第三方的分组 只接受面向第三方的请求

下面介绍网关分组功能的操作。

# 分组列表

菜单位置:网关管理 > 网关分组。点击菜单后进入分组列表页面,如图所示。

manager_gateway_group_list_query

# 新增分组

点击 新增 按钮弹出新增窗口,如图所示。

manager_gateway_group_add_1

manager_gateway_group_add_2

分组ID:分组的唯一标识,长度不能超过32个字符,必填;

分组名称:分组的名称,用于在分组选项时展示,长度不能超过32个字符,必填;

网关实例IP:Fizz网关集群内的机器IP地址,多个IP地址使用逗号分隔。

# 编辑分组

点击 编辑 按钮弹出编辑窗口,如图所示。

manager_gateway_group_edit_1

manager_gateway_group_edit_2

# 删除分组

点击 删除 按钮弹出删除确认窗口,如图所示。

manager_gateway_group_delete_1

manager_gateway_group_delete_2

点击 确定 按钮后删除网关分组,如果网关分组存在关联的路由配置时,需要将关联的路由配置全部删除后才能删除分组。

上次更新: 2020-10-27 14:43
- + diff --git a/docs/guide/manager/manager_overview.html b/docs/guide/manager/manager_overview.html index 2fd899f..d602812 100644 --- a/docs/guide/manager/manager_overview.html +++ b/docs/guide/manager/manager_overview.html @@ -7,7 +7,7 @@ - + @@ -23,7 +23,7 @@ 使用文档 查看源码 -

# 概述

Fizz管理后台是Fizz网关的配套系统,基于Java、Vue开发,通过界面对Fizz网关集群进行各项配置。

# 功能

Fizz管理后台包含如下功能:

- + diff --git a/docs/guide/manager/manager_plugin.html b/docs/guide/manager/manager_plugin.html index 65a5462..913cc13 100644 --- a/docs/guide/manager/manager_plugin.html +++ b/docs/guide/manager/manager_plugin.html @@ -7,7 +7,7 @@ - + @@ -23,7 +23,7 @@ 使用文档 查看源码 -

# 概述

插件管理功能用于维护插件元数据,定义路由级别的自定义属性、插件级别的自定义配置信息。创建的插件用于路由管理设置时启用,当网关接受请求匹配路由规则时会触发启用的插件逻辑执行,插件逻辑中可获取到自定义的属性数据。

# 插件列表

菜单位置:网关管理 > 插件管理。点击菜单后进入插件管理列表页面,如图所示。

manager_plugin_list_query

# 新增插件

点击 新增 按钮弹出新增窗口,如图所示。

manager_plugin_add_1

manager_plugin_add_2

插件名称:插件名称由英文字母、下划线或数字组成,不能以数字开头,长度不能超过50个字符,必填;

插件描述:插件的简要描述,长度不能超过50个字符,必填;

默认执行顺序:插件的默认执行顺序,按从小到大排序,值越小越先执行,取值范围0~255,必填;

表单定义:路由级别的自定义属性,在路由管理配置启用插件时前端会将表单定义转化为表单输入界面,更多信息请查看路由管理介绍。表单规范说明如下:

/*
+        

# 概述

插件管理功能用于维护插件元数据,定义路由级别的自定义属性、插件级别的自定义配置信息。创建的插件用于路由管理设置时启用,当网关接受请求匹配路由规则时会触发启用的插件逻辑执行,插件逻辑中可获取到自定义的属性数据。

# 插件列表

菜单位置:网关管理 > 插件管理。点击菜单后进入插件管理列表页面,如图所示。

manager_plugin_list_query

# 新增插件

点击 新增 按钮弹出新增窗口,如图所示。

manager_plugin_add_1

manager_plugin_add_2

插件名称:插件名称由英文字母、下划线或数字组成,不能以数字开头,长度不能超过50个字符,必填;

插件描述:插件的简要描述,长度不能超过50个字符,必填;

默认执行顺序:插件的默认执行顺序,按从小到大排序,值越小越先执行,取值范围0~255,必填;

表单定义:路由级别的自定义属性,在路由管理配置启用插件时前端会将表单定义转化为表单输入界面,更多信息请查看路由管理介绍。表单规范说明如下:

/*
 * plugin_config_design
 * 动态插件参考结构
 * */
@@ -143,6 +143,6 @@
       
       →
     

- + diff --git a/docs/guide/manager/manager_role.html b/docs/guide/manager/manager_role.html index d6d6015..cfecd86 100644 --- a/docs/guide/manager/manager_role.html +++ b/docs/guide/manager/manager_role.html @@ -7,7 +7,7 @@ - + @@ -23,7 +23,7 @@ 使用文档 查看源码 -

# 概述

角色管理功能维护角色元数据,通过配置角色拥有的菜单资源,限制用户只能操作拥有的角色对应的菜单资源,下面介绍角色管理功能的操作。

# 角色列表

菜单位置:权限管理 > 角色管理。点击菜单后进入角色列表页面,如图所示。

manager_role_list_query

# 添加角色

点击 新增 按钮弹出新增窗口,如图所示。

manager_role_add_1

manager_role_add_2

# 权限设置

勾选需要分配权限的角色,点击 权限设置 按钮弹出角色权限配置窗口,如图所示。

manager_role_auth_1

manager_role_auth_2

勾选菜单后点击 确定 按钮确认给角色分配菜单权限。

# 编辑角色

点击 编辑 按钮弹出编辑窗口,如图所示。

manager_role_edit_1

manager_role_edit_2

# 删除角色

点击 删除 按钮弹出删除确认窗口,如图所示。

manager_role_delete_1

manager_role_delete_2

点击 确定 按钮后删除角色。

上次更新: 2020-10-26 18:40
- + diff --git a/docs/guide/manager/manager_service.html b/docs/guide/manager/manager_service.html index 1b56189..4d2091e 100644 --- a/docs/guide/manager/manager_service.html +++ b/docs/guide/manager/manager_service.html @@ -7,7 +7,7 @@ - + @@ -23,7 +23,7 @@ 使用文档 查看源码 -

# 概述

服务管理功能维护服务元数据。服务编排中的服务是一个逻辑上的概念,用于对聚合接口的归类以及权限的分配。Fizz网关聚合接口的请求路径格式为 http://{ip}:{port}/proxy/{service}{apiPath},服务对应{service}段。

# 服务列表

菜单位置:服务编排 > 服务管理。点击菜单后进入服务列表页面,如图所示。

manager_service_list_query

# 新增服务

点击 新增 按钮弹出新增窗口,如图所示。

manager_service_add_1

manager_service_add_2

服务 ID:服务唯一标识,对应Fizz网关聚合接口请求路径(格式为 http://{ip}:{port}/proxy/{service}{apiPath})的{service}段,长度不能超过200个字符,必填;

服务名:服务名称,用于展示或者选项使用,必填;

团队:团队名称,长度不能超过200个字符;

负责人:负责人名称,长度不能超过200个字符;

描述:服务描述,长度不能超过2000个字符。

# 编辑服务

点击 编辑 按钮弹出编辑窗口,如图所示。

manager_service_edit_1

manager_service_edit_2

# 删除服务

点击 删除 按钮弹出删除确认窗口,如图所示。

manager_service_delete_1

manager_service_delete_2

点击 确定 按钮后删除服务,如果服务存在关联的聚合接口时,需要将关联的聚合接口全部删除后才能删除服务。

# 服务权限分配

点击 权限 按钮弹出权限配置窗口,如图所示。

manager_service_auth_1

manager_service_auth_2

服务创建人自动获得服务权限,服务权限可分配,拥有权限的用户才能操作对应的接口列表。

上次更新: 2020-10-26 18:40
- + diff --git a/docs/guide/manager/manager_source_statistics.html b/docs/guide/manager/manager_source_statistics.html index b26af18..92f7229 100644 --- a/docs/guide/manager/manager_source_statistics.html +++ b/docs/guide/manager/manager_source_statistics.html @@ -7,7 +7,7 @@ - + @@ -23,7 +23,7 @@ 使用文档 查看源码 -

# 概述

Fizz网关会将访问请求数据(IP地址、网关分组、服务、应用、请求方法、API Path、请求时间)推送到Kafka中,管理后台消费Kafka消息统计接口访问数据。

接口统计功能以图表的形式展示指定时间段内每日的接口总数、访问次数,可查看接口的历史访问总次数以及最近请求时间。

# 接口访问统计

菜单位置:网关管理 > 接口统计。点击菜单后进入接口统计页面,如图所示。

manager_source_statistics_1.png

今天接口总数:从0时到当前时刻被调用不同接口的总数;

今天访问次数:从0时到当前时刻访问请求的总次数。

接口总数图表:显示指定时间段内每日被调用不同接口的总数曲线;

访问次数图表:显示指定时间段内每日访问请求的总次数曲线。

# 请求统计

接口统计界面下部为请求统计列表,如图所示。

manager_source_statistics_2.png

来源IP:网关请求的实际入口IP地址;

请求次数:( 唯一[来源IP、网关分组、服务名、请求方法、appID、API Path])历史总请求次数;

最近请求时间:( 唯一[来源IP、网关分组、服务名、请求方法、appID、API Path])最近一次调用时间。

上次更新: 2020-10-26 18:40
- +

# 概述

Fizz网关会将访问请求数据(IP地址、网关分组、服务、应用、请求方法、API Path、请求时间)推送到Kafka中,管理后台消费Kafka消息统计接口访问数据。

接口统计功能以图表的形式展示指定时间段内每日的接口总数、访问次数,可查看接口的历史访问总次数以及最近请求时间。

# 接口访问统计

菜单位置:网关管理 > 接口统计。点击菜单后进入接口统计页面,如图所示。

manager_source_statistics_1.png

今天接口总数:从0时到当前时刻被调用不同接口的总数;

今天访问次数:从0时到当前时刻访问请求的总次数。

接口总数图表:显示指定时间段内每日被调用不同接口的总数曲线;

访问次数图表:显示指定时间段内每日访问请求的总次数曲线。

# 请求统计

接口统计界面下部为请求统计列表,如图所示。

manager_source_statistics_2.png

来源IP:网关请求的实际入口IP地址;

请求次数:( 唯一[来源IP、网关分组、服务名、请求方法、appID、API Path])历史总请求次数;

最近请求时间:( 唯一[来源IP、网关分组、服务名、请求方法、appID、API Path])最近一次调用时间。

上次更新: 2020-10-26 18:40
+ diff --git a/docs/guide/manager/manager_user.html b/docs/guide/manager/manager_user.html index 82c876f..baaece7 100644 --- a/docs/guide/manager/manager_user.html +++ b/docs/guide/manager/manager_user.html @@ -7,7 +7,7 @@ - + @@ -23,11 +23,11 @@ 使用文档 查看源码 -

# 概述

用户管理功能用于维护用户元数据,包括用户信息维护、密码维护、角色配置。

# 用户列表

菜单位置:系统管理 > 用户管理。点击菜单后进入用户列表页面,如图所示。

manager_user_list_query

# 添加用户

点击 新增 按钮弹出新增窗口,如图所示。

manager_user_add_1

manager_user_add_2

电子邮箱:用户用于接收电子邮件的邮箱地址,后台涉及邮件发送业务使用该字段设置的邮箱地址来进行邮箱发送。

# 重置密码

勾选用户后点击 密码重置 按钮可为用户重置密码。

manager_user_reset_password_1

manager_user_reset_password_2

重置后的默认密码为AsdF1234!

# 编辑用户

点击 编辑 按钮弹出编辑窗口,如图所示。

manager_user_edit_1

manager_user_edit_2

# 删除用户

点击 删除 按钮弹出删除确认窗口,如图所示。

manager_user_delete_1

manager_user_delete_2

上次更新: 2020-10-26 18:40
- + diff --git a/docs/guide/plugin/index.html b/docs/guide/plugin/index.html index 4d023a7..44d1c05 100644 --- a/docs/guide/plugin/index.html +++ b/docs/guide/plugin/index.html @@ -7,7 +7,7 @@ - + @@ -23,7 +23,7 @@ 使用文档 查看源码 -

# 概述

当需要在gateway中加入自定义的逻辑时,可通过fizz的插件机制实现,插件:
+

# 概述

当需要在gateway中加入自定义的逻辑时,可通过fizz的插件机制实现,插件:
1、类似spring的WebFilter,是fizz内部的WebFilter,由fizz调度;
2、对不同的请求,可配置不同的上下文参数,可通过manager完成配置;
3、若有多个插件,当前插件可获取前面插件的执行结果。

插件的开发和应用,分gateway开发、manager配置两部分,下面以一个例子,依次介绍。

# gateway开发

    实现
@@ -120,6 +120,6 @@
       
       →
     

- + diff --git a/docs/guide/proxy/index.html b/docs/guide/proxy/index.html index f1bb5da..e7f7671 100644 --- a/docs/guide/proxy/index.html +++ b/docs/guide/proxy/index.html @@ -7,7 +7,7 @@ - + @@ -23,7 +23,7 @@ 使用文档 查看源码 -

# 路由转发介绍

路由转发也叫反向代理,为内部微服务提供统一的对外入口。支持以下功能:

  • 支持服务注册与发现
  • 支持负载均衡
  • 支持黑白名单机制
  • 支持配置插件

# 接入路由转发

  • 前提条件:接入Eureka注册中心
  • 开通白名单,接入注册中心的服务默认不对公网开放 (白名单在配置文件里配置serviceWhiteList)
  • 配置访问权限 (管理后台-接口代理-API查询)
上次更新: 2020-9-8 15:3
- + diff --git a/docs/index.html b/docs/index.html index e068b2b..88340b9 100644 --- a/docs/index.html +++ b/docs/index.html @@ -7,7 +7,7 @@ - + @@ -32,6 +32,6 @@

智能路由

支持服务注册与发现,支持负载均衡,支持配置插件和黑白名单。

服务编排

基于现有的业务微服务通过在线配置的方式快速的生成一个聚合接口。减少中间层胶水代码以及降低编码投入

插件机制

强大的插件系统,内置通用常用插件,同时支持自定义插件开发。

- + From 8768848d71d062149ae425626957beb6db8e9afd Mon Sep 17 00:00:00 2001 From: linwaiwai Date: Mon, 9 Nov 2020 10:37:35 +0800 Subject: [PATCH 2/4] Create CNAME --- docs/CNAME | 1 + 1 file changed, 1 insertion(+) create mode 100644 docs/CNAME diff --git a/docs/CNAME b/docs/CNAME new file mode 100644 index 0000000..692ef2e --- /dev/null +++ b/docs/CNAME @@ -0,0 +1 @@ +fizzgate.com \ No newline at end of file From f81d9e5326b6386a4aeadfedfd40beb477620c5c Mon Sep 17 00:00:00 2001 From: Francis Dong Date: Mon, 9 Nov 2020 10:43:53 +0800 Subject: [PATCH 3/4] update: update version number to v1.1.1 --- README.md | 9 +++++---- pom.xml | 2 +- sh/boot.sh | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index c1daf16..f9041d1 100644 --- a/README.md +++ b/README.md @@ -65,6 +65,7 @@ A Managerment API Gateway in Java . Fizz Gateway 是一个基于 Java开发的 | ---------------------- | ------------------------- | ----------------------- | | v1.0.0 | v1.0.0 | v1.0.0 | | v1.1.0 | v1.1.0 | v1.1.0 | +| v1.1.1 | v1.1.1 | v1.1.1 | 请根据社区版的版本下载对应的管理后台版本 @@ -92,8 +93,8 @@ A Managerment API Gateway in Java . Fizz Gateway 是一个基于 Java开发的 ##### 管理后台服务端(fizz-manager-professional) -1. 首次安装执行`fizz-manager-professional-1.1.0-mysql.sql`数据库脚本 -2. 将`application-prod.yml`、`boot.sh`、`fizz-manager-professional-1.1.0.jar`拷贝到`/data/webapps/fizz-manager-professional`目录下 +1. 首次安装执行`fizz-manager-professional-1.1.1-mysql.sql`数据库脚本 +2. 将`application-prod.yml`、`boot.sh`、`fizz-manager-professional-1.1.1.jar`拷贝到`/data/webapps/fizz-manager-professional`目录下 3. 修改`application-prod.yml`文件,将相关配置修改成部署环境的配置 4. 修改`boot.sh`文件,将`RUN_CMD`变量值修改成部署环境的JAVA实际路径 5. 执行 `chmod +x boot.sh` 命令给`boot.sh`增加执行权限 @@ -129,7 +130,7 @@ server { 安装方式一:脚本启动: -1. 下载fizz-gateway-community的最新代码,修改application.yml配置文件里eureka、redis的配置,使用maven命令`mvn clean package -DskipTests=true`构建并把构建好的fizz-gateway-community-1.1.0.jar和boot.sh放同一目录 +1. 下载fizz-gateway-community的最新代码,修改application.yml配置文件里eureka、redis的配置,使用maven命令`mvn clean package -DskipTests=true`构建并把构建好的fizz-gateway-community-1.1.1.jar和boot.sh放同一目录 2. 修改boot.sh脚本的apollo连接,JVM内存配置 3. 执行 `./boot.sh start` 命令启动服务,支持 start/stop/restart/status命令 @@ -143,7 +144,7 @@ server { 1. 本地clone仓库上的最新代码,修改application.yml配置文件里eureka、redis的配置 2. 在项目根目录fizz-gateway-community下执行Maven命令`mvn clean package -DskipTests=true`打包 -3. 进入target目录,使用命令`java -jar -Denv=DEV -Dapollo.meta=http://localhost:66 fizz-gateway-community-1.1.0.jar`启动服务 +3. 进入target目录,使用命令`java -jar -Denv=DEV -Dapollo.meta=http://localhost:66 fizz-gateway-community-1.1.1.jar`启动服务 最后访问网关,地址形式为:http://127.0.0.1:8600/proxy/[服务名]/[API Path] diff --git a/pom.xml b/pom.xml index 6f6fd32..41a21d4 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ we fizz-gateway-community - 1.1.0 + 1.1.1 fizz-gateway-community diff --git a/sh/boot.sh b/sh/boot.sh index 1403247..9f0a930 100644 --- a/sh/boot.sh +++ b/sh/boot.sh @@ -6,7 +6,7 @@ cd `dirname $0` #变量定义 APOLLO_META_SERVER=http://localhost:66 ENV=dev -APP_NAME=fizz-gateway-community-1.1.0.jar +APP_NAME=fizz-gateway-community-1.1.1.jar APP_DEP_DIR=/data/webapps/fizz-gateway APP_LOG_DIR=/data/logs/fizz-gateway JAVA_CMD=/usr/local/java/bin/java From 9b4a361b87764123af61a6f98c8f63ccd924b338 Mon Sep 17 00:00:00 2001 From: Francis Dong Date: Mon, 9 Nov 2020 11:57:42 +0800 Subject: [PATCH 4/4] docs: remove base path --- docs/404.html | 8 ++--- ...les.233b9b7b.css => 0.styles.34d67128.css} | 2 +- docs/assets/js/10.b57afcaa.js | 1 + docs/assets/js/10.ddbb0d4d.js | 1 - docs/assets/js/11.21242c7f.js | 1 + docs/assets/js/11.93c9bc98.js | 1 - .../js/{12.f815cfa2.js => 12.61089982.js} | 2 +- docs/assets/js/13.e5742833.js | 1 - docs/assets/js/13.fdb2bea3.js | 1 + docs/assets/js/14.62d9a88b.js | 1 + docs/assets/js/14.993243d3.js | 1 - docs/assets/js/15.0358b10e.js | 1 + docs/assets/js/15.c6e43d45.js | 1 - .../js/{16.5d8d970e.js => 16.43a475d2.js} | 2 +- docs/assets/js/17.31216161.js | 1 - docs/assets/js/17.32fa8ea0.js | 1 + .../js/{18.1301a626.js => 18.603a235b.js} | 2 +- docs/assets/js/19.501fe444.js | 1 - docs/assets/js/19.5c4af839.js | 1 + docs/assets/js/20.1bf2bcbb.js | 1 + docs/assets/js/20.94c02b34.js | 1 - docs/assets/js/21.dca6f5c4.js | 1 + docs/assets/js/21.ff5e068c.js | 1 - docs/assets/js/22.1f3d545e.js | 1 - docs/assets/js/22.db62cc12.js | 1 + .../js/{23.e4fc3148.js => 23.5b796ecf.js} | 2 +- docs/assets/js/24.72fe0b8b.js | 1 + docs/assets/js/24.7e82030a.js | 1 - docs/assets/js/25.bbf8bff1.js | 1 + docs/assets/js/25.fc38ae5b.js | 1 - docs/assets/js/26.70321f43.js | 1 + docs/assets/js/26.e097ebfd.js | 1 - docs/assets/js/27.06f8de31.js | 1 - docs/assets/js/27.505a813e.js | 1 + docs/assets/js/28.9b7b0400.js | 1 - docs/assets/js/28.cdddd7aa.js | 1 + .../js/{29.214a2702.js => 29.60b7285b.js} | 2 +- .../js/{5.abc10683.js => 5.a59b20e1.js} | 2 +- .../js/{6.b5dc0bcc.js => 6.e883523c.js} | 2 +- .../js/{7.c27e364c.js => 7.00dd2642.js} | 2 +- docs/assets/js/8.645ad4e8.js | 1 + docs/assets/js/8.99888a6b.js | 1 - docs/assets/js/9.3d56fa0d.js | 1 - docs/assets/js/9.9eb9244c.js | 1 + .../js/{app.41e48030.js => app.86b5ae26.js} | 4 +-- docs/guide/admin/index.html | 16 +++++----- docs/guide/aggregate/configuration.html | 24 +++++++-------- docs/guide/aggregate/index.html | 20 ++++++------- docs/guide/aggregate/overview.html | 20 ++++++------- docs/guide/benchmark/index.html | 26 ++++++++-------- docs/guide/index.html | 16 +++++----- docs/guide/installation/index.html | 20 ++++++------- docs/guide/intro/index.html | 16 +++++----- docs/guide/manager/manager_aggregate.html | 30 +++++++++---------- .../manager/manager_aggregate_approve.html | 20 ++++++------- .../manager_aggregate_approve_op_log.html | 20 ++++++------- .../manager/manager_aggregate_my_apply.html | 20 ++++++------- .../manager/manager_aggregate_op_log.html | 20 ++++++------- docs/guide/manager/manager_api_auth.html | 20 ++++++------- docs/guide/manager/manager_app_id.html | 20 ++++++------- .../manager_gateway_aggregate_cache.html | 20 ++++++------- docs/guide/manager/manager_gateway_group.html | 20 ++++++------- docs/guide/manager/manager_overview.html | 22 +++++++------- docs/guide/manager/manager_plugin.html | 22 +++++++------- docs/guide/manager/manager_role.html | 20 ++++++------- docs/guide/manager/manager_service.html | 20 ++++++------- .../manager/manager_source_statistics.html | 16 +++++----- docs/guide/manager/manager_user.html | 18 +++++------ docs/guide/plugin/index.html | 26 ++++++++-------- docs/guide/proxy/index.html | 20 ++++++------- docs/index.html | 16 +++++----- 71 files changed, 296 insertions(+), 296 deletions(-) rename docs/assets/css/{0.styles.233b9b7b.css => 0.styles.34d67128.css} (60%) create mode 100644 docs/assets/js/10.b57afcaa.js delete mode 100644 docs/assets/js/10.ddbb0d4d.js create mode 100644 docs/assets/js/11.21242c7f.js delete mode 100644 docs/assets/js/11.93c9bc98.js rename docs/assets/js/{12.f815cfa2.js => 12.61089982.js} (99%) delete mode 100644 docs/assets/js/13.e5742833.js create mode 100644 docs/assets/js/13.fdb2bea3.js create mode 100644 docs/assets/js/14.62d9a88b.js delete mode 100644 docs/assets/js/14.993243d3.js create mode 100644 docs/assets/js/15.0358b10e.js delete mode 100644 docs/assets/js/15.c6e43d45.js rename docs/assets/js/{16.5d8d970e.js => 16.43a475d2.js} (50%) delete mode 100644 docs/assets/js/17.31216161.js create mode 100644 docs/assets/js/17.32fa8ea0.js rename docs/assets/js/{18.1301a626.js => 18.603a235b.js} (52%) delete mode 100644 docs/assets/js/19.501fe444.js create mode 100644 docs/assets/js/19.5c4af839.js create mode 100644 docs/assets/js/20.1bf2bcbb.js delete mode 100644 docs/assets/js/20.94c02b34.js create mode 100644 docs/assets/js/21.dca6f5c4.js delete mode 100644 docs/assets/js/21.ff5e068c.js delete mode 100644 docs/assets/js/22.1f3d545e.js create mode 100644 docs/assets/js/22.db62cc12.js rename docs/assets/js/{23.e4fc3148.js => 23.5b796ecf.js} (89%) create mode 100644 docs/assets/js/24.72fe0b8b.js delete mode 100644 docs/assets/js/24.7e82030a.js create mode 100644 docs/assets/js/25.bbf8bff1.js delete mode 100644 docs/assets/js/25.fc38ae5b.js create mode 100644 docs/assets/js/26.70321f43.js delete mode 100644 docs/assets/js/26.e097ebfd.js delete mode 100644 docs/assets/js/27.06f8de31.js create mode 100644 docs/assets/js/27.505a813e.js delete mode 100644 docs/assets/js/28.9b7b0400.js create mode 100644 docs/assets/js/28.cdddd7aa.js rename docs/assets/js/{29.214a2702.js => 29.60b7285b.js} (93%) rename docs/assets/js/{5.abc10683.js => 5.a59b20e1.js} (79%) rename docs/assets/js/{6.b5dc0bcc.js => 6.e883523c.js} (79%) rename docs/assets/js/{7.c27e364c.js => 7.00dd2642.js} (81%) create mode 100644 docs/assets/js/8.645ad4e8.js delete mode 100644 docs/assets/js/8.99888a6b.js delete mode 100644 docs/assets/js/9.3d56fa0d.js create mode 100644 docs/assets/js/9.9eb9244c.js rename docs/assets/js/{app.41e48030.js => app.86b5ae26.js} (79%) diff --git a/docs/404.html b/docs/404.html index 124dd88..af112bc 100644 --- a/docs/404.html +++ b/docs/404.html @@ -7,13 +7,13 @@ - - + + -

404

There's nothing here.
+ - + diff --git a/docs/assets/css/0.styles.233b9b7b.css b/docs/assets/css/0.styles.34d67128.css similarity index 60% rename from docs/assets/css/0.styles.233b9b7b.css rename to docs/assets/css/0.styles.34d67128.css index edd606e..a164f44 100644 --- a/docs/assets/css/0.styles.233b9b7b.css +++ b/docs/assets/css/0.styles.34d67128.css @@ -1 +1 @@ -code[class*=language-],pre[class*=language-]{color:#ccc;background:none;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#2d2d2d}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.block-comment,.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#999}.token.punctuation{color:#ccc}.token.attr-name,.token.deleted,.token.namespace,.token.tag{color:#e2777a}.token.function-name{color:#6196cc}.token.boolean,.token.function,.token.number{color:#f08d49}.token.class-name,.token.constant,.token.property,.token.symbol{color:#f8c555}.token.atrule,.token.builtin,.token.important,.token.keyword,.token.selector{color:#cc99cd}.token.attr-value,.token.char,.token.regex,.token.string,.token.variable{color:#7ec699}.token.entity,.token.operator,.token.url{color:#67cdcc}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:green}.theme-default-content code{color:#476582;padding:.25rem .5rem;margin:0;font-size:.85em;background-color:rgba(27,31,35,.05);border-radius:3px}.theme-default-content code .token.deleted{color:#ec5975}.theme-default-content code .token.inserted{color:#3eaf7c}.theme-default-content pre,.theme-default-content pre[class*=language-]{line-height:1.4;padding:1.25rem 1.5rem;margin:.85rem 0;background-color:#282c34;border-radius:6px;overflow:auto}.theme-default-content pre[class*=language-] code,.theme-default-content pre code{color:#fff;padding:0;background-color:transparent;border-radius:0}div[class*=language-]{position:relative;background-color:#282c34;border-radius:6px}div[class*=language-] .highlight-lines{-webkit-user-select:none;-ms-user-select:none;user-select:none;padding-top:1.3rem;position:absolute;top:0;left:0;width:100%;line-height:1.4}div[class*=language-] .highlight-lines .highlighted{background-color:rgba(0,0,0,.66)}div[class*=language-] pre,div[class*=language-] pre[class*=language-]{background:transparent;position:relative;z-index:1}div[class*=language-]:before{position:absolute;z-index:3;top:.8em;right:1em;font-size:.75rem;color:hsla(0,0%,100%,.4)}div[class*=language-]:not(.line-numbers-mode) .line-numbers-wrapper{display:none}div[class*=language-].line-numbers-mode .highlight-lines .highlighted{position:relative}div[class*=language-].line-numbers-mode .highlight-lines .highlighted:before{content:" ";position:absolute;z-index:3;left:0;top:0;display:block;width:3.5rem;height:100%;background-color:rgba(0,0,0,.66)}div[class*=language-].line-numbers-mode pre{padding-left:4.5rem;vertical-align:middle}div[class*=language-].line-numbers-mode .line-numbers-wrapper{position:absolute;top:0;width:3.5rem;text-align:center;color:hsla(0,0%,100%,.3);padding:1.25rem 0;line-height:1.4}div[class*=language-].line-numbers-mode .line-numbers-wrapper br{-webkit-user-select:none;-ms-user-select:none;user-select:none}div[class*=language-].line-numbers-mode .line-numbers-wrapper .line-number{position:relative;z-index:4;-webkit-user-select:none;-ms-user-select:none;user-select:none;font-size:.85em}div[class*=language-].line-numbers-mode:after{content:"";position:absolute;z-index:2;top:0;left:0;width:3.5rem;height:100%;border-radius:6px 0 0 6px;border-right:1px solid rgba(0,0,0,.66);background-color:#282c34}div[class~=language-js]:before{content:"js"}div[class~=language-ts]:before{content:"ts"}div[class~=language-html]:before{content:"html"}div[class~=language-md]:before{content:"md"}div[class~=language-vue]:before{content:"vue"}div[class~=language-css]:before{content:"css"}div[class~=language-sass]:before{content:"sass"}div[class~=language-scss]:before{content:"scss"}div[class~=language-less]:before{content:"less"}div[class~=language-stylus]:before{content:"stylus"}div[class~=language-go]:before{content:"go"}div[class~=language-java]:before{content:"java"}div[class~=language-c]:before{content:"c"}div[class~=language-sh]:before{content:"sh"}div[class~=language-yaml]:before{content:"yaml"}div[class~=language-py]:before{content:"py"}div[class~=language-docker]:before{content:"docker"}div[class~=language-dockerfile]:before{content:"dockerfile"}div[class~=language-makefile]:before{content:"makefile"}div[class~=language-javascript]:before{content:"js"}div[class~=language-typescript]:before{content:"ts"}div[class~=language-markup]:before{content:"html"}div[class~=language-markdown]:before{content:"md"}div[class~=language-json]:before{content:"json"}div[class~=language-ruby]:before{content:"rb"}div[class~=language-python]:before{content:"py"}div[class~=language-bash]:before{content:"sh"}div[class~=language-php]:before{content:"php"}.custom-block .custom-block-title{font-weight:600;margin-bottom:-.4rem}.custom-block.danger,.custom-block.tip,.custom-block.warning{padding:.1rem 1.5rem;border-left-width:.5rem;border-left-style:solid;margin:1rem 0}.custom-block.tip{background-color:#f3f5f7;border-color:#42b983}.custom-block.warning{background-color:rgba(255,229,100,.3);border-color:#e7c000;color:#6b5900}.custom-block.warning .custom-block-title{color:#b29400}.custom-block.warning a{color:#2c3e50}.custom-block.danger{background-color:#ffe6e6;border-color:#c00;color:#4d0000}.custom-block.danger .custom-block-title{color:#900}.custom-block.danger a{color:#2c3e50}.custom-block.details{display:block;position:relative;border-radius:2px;margin:1.6em 0;padding:1.6em;background-color:#eee}.custom-block.details h4{margin-top:0}.custom-block.details figure:last-child,.custom-block.details p:last-child{margin-bottom:0;padding-bottom:0}.custom-block.details summary{outline:none;cursor:pointer}.arrow{display:inline-block;width:0;height:0}.arrow.up{border-bottom:6px solid #ccc}.arrow.down,.arrow.up{border-left:4px solid transparent;border-right:4px solid transparent}.arrow.down{border-top:6px solid #ccc}.arrow.right{border-left:6px solid #ccc}.arrow.left,.arrow.right{border-top:4px solid transparent;border-bottom:4px solid transparent}.arrow.left{border-right:6px solid #ccc}.theme-default-content:not(.custom){max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.theme-default-content:not(.custom){padding:2rem}}@media (max-width:419px){.theme-default-content:not(.custom){padding:1.5rem}}.table-of-contents .badge{vertical-align:middle}body,html{padding:0;margin:0;background-color:#fff}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:16px;color:#2c3e50}.page{padding-left:20rem}.navbar{z-index:20;right:0;height:3.6rem;background-color:#fff;box-sizing:border-box;border-bottom:1px solid #eaecef}.navbar,.sidebar-mask{position:fixed;top:0;left:0}.sidebar-mask{z-index:9;width:100vw;height:100vh;display:none}.sidebar{font-size:16px;background-color:#fff;width:20rem;position:fixed;z-index:10;margin:0;top:3.6rem;left:0;bottom:0;box-sizing:border-box;border-right:1px solid #eaecef;overflow-y:auto}.theme-default-content:not(.custom)>:first-child{margin-top:3.6rem}.theme-default-content:not(.custom) a:hover{text-decoration:underline}.theme-default-content:not(.custom) p.demo{padding:1rem 1.5rem;border:1px solid #ddd;border-radius:4px}.theme-default-content:not(.custom) img{max-width:100%}.theme-default-content.custom{padding:0;margin:0}.theme-default-content.custom img{max-width:100%}a{font-weight:500;text-decoration:none}a,p a code{color:#3eaf7c}p a code{font-weight:400}kbd{background:#eee;border:.15rem solid #ddd;border-bottom:.25rem solid #ddd;border-radius:.15rem;padding:0 .15em}blockquote{font-size:1rem;color:#999;border-left:.2rem solid #dfe2e5;margin:1rem 0;padding:.25rem 0 .25rem 1rem}blockquote>p{margin:0}ol,ul{padding-left:1.2em}strong{font-weight:600}h1,h2,h3,h4,h5,h6{font-weight:600;line-height:1.25}.theme-default-content:not(.custom)>h1,.theme-default-content:not(.custom)>h2,.theme-default-content:not(.custom)>h3,.theme-default-content:not(.custom)>h4,.theme-default-content:not(.custom)>h5,.theme-default-content:not(.custom)>h6{margin-top:-3.1rem;padding-top:4.6rem;margin-bottom:0}.theme-default-content:not(.custom)>h1:first-child,.theme-default-content:not(.custom)>h2:first-child,.theme-default-content:not(.custom)>h3:first-child,.theme-default-content:not(.custom)>h4:first-child,.theme-default-content:not(.custom)>h5:first-child,.theme-default-content:not(.custom)>h6:first-child{margin-top:-1.5rem;margin-bottom:1rem}.theme-default-content:not(.custom)>h1:first-child+.custom-block,.theme-default-content:not(.custom)>h1:first-child+p,.theme-default-content:not(.custom)>h1:first-child+pre,.theme-default-content:not(.custom)>h2:first-child+.custom-block,.theme-default-content:not(.custom)>h2:first-child+p,.theme-default-content:not(.custom)>h2:first-child+pre,.theme-default-content:not(.custom)>h3:first-child+.custom-block,.theme-default-content:not(.custom)>h3:first-child+p,.theme-default-content:not(.custom)>h3:first-child+pre,.theme-default-content:not(.custom)>h4:first-child+.custom-block,.theme-default-content:not(.custom)>h4:first-child+p,.theme-default-content:not(.custom)>h4:first-child+pre,.theme-default-content:not(.custom)>h5:first-child+.custom-block,.theme-default-content:not(.custom)>h5:first-child+p,.theme-default-content:not(.custom)>h5:first-child+pre,.theme-default-content:not(.custom)>h6:first-child+.custom-block,.theme-default-content:not(.custom)>h6:first-child+p,.theme-default-content:not(.custom)>h6:first-child+pre{margin-top:2rem}h1:hover .header-anchor,h2:hover .header-anchor,h3:hover .header-anchor,h4:hover .header-anchor,h5:hover .header-anchor,h6:hover .header-anchor{opacity:1}h1{font-size:2.2rem}h2{font-size:1.65rem;padding-bottom:.3rem;border-bottom:1px solid #eaecef}h3{font-size:1.35rem}a.header-anchor{font-size:.85em;float:left;margin-left:-.87em;padding-right:.23em;margin-top:.125em;opacity:0}a.header-anchor:hover{text-decoration:none}.line-number,code,kbd{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}ol,p,ul{line-height:1.7}hr{border:0;border-top:1px solid #eaecef}table{border-collapse:collapse;margin:1rem 0;display:block;overflow-x:auto}tr{border-top:1px solid #dfe2e5}tr:nth-child(2n){background-color:#f6f8fa}td,th{border:1px solid #dfe2e5;padding:.6em 1em}.theme-container.sidebar-open .sidebar-mask{display:block}.theme-container.no-navbar .theme-default-content:not(.custom)>h1,.theme-container.no-navbar h2,.theme-container.no-navbar h3,.theme-container.no-navbar h4,.theme-container.no-navbar h5,.theme-container.no-navbar h6{margin-top:1.5rem;padding-top:0}.theme-container.no-navbar .sidebar{top:0}@media (min-width:720px){.theme-container.no-sidebar .sidebar{display:none}.theme-container.no-sidebar .page{padding-left:0}}@media (max-width:959px){.sidebar{font-size:15px;width:16.4rem}.page{padding-left:16.4rem}}@media (max-width:719px){.sidebar{top:0;padding-top:3.6rem;transform:translateX(-100%);transition:transform .2s ease}.page{padding-left:0}.theme-container.sidebar-open .sidebar{transform:translateX(0)}.theme-container.no-navbar .sidebar{padding-top:0}}@media (max-width:419px){h1{font-size:1.9rem}.theme-default-content div[class*=language-]{margin:.85rem -1.5rem;border-radius:0}}#nprogress{pointer-events:none}#nprogress .bar{background:#3eaf7c;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #3eaf7c,0 0 5px #3eaf7c;opacity:1;transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border-color:#3eaf7c transparent transparent #3eaf7c;border-style:solid;border-width:2px;border-radius:50%;-webkit-animation:nprogress-spinner .4s linear infinite;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@-webkit-keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.icon.outbound{color:#aaa;display:inline-block;vertical-align:middle;position:relative;top:-1px}.home{padding:3.6rem 2rem 0;max-width:960px;margin:0 auto;display:block}.home .hero{text-align:center}.home .hero img{max-width:100%;max-height:280px;display:block;margin:3rem auto 1.5rem}.home .hero h1{font-size:3rem}.home .hero .action,.home .hero .description,.home .hero h1{margin:1.8rem auto}.home .hero .description{max-width:35rem;font-size:1.6rem;line-height:1.3;color:#6a8bad}.home .hero .action-button{display:inline-block;font-size:1.2rem;color:#fff;background-color:#3eaf7c;padding:.8rem 1.6rem;border-radius:4px;transition:background-color .1s ease;box-sizing:border-box;border-bottom:1px solid #389d70}.home .hero .action-button:hover{background-color:#4abf8a}.home .features{border-top:1px solid #eaecef;padding:1.2rem 0;margin-top:2.5rem;display:flex;flex-wrap:wrap;align-items:flex-start;align-content:stretch;justify-content:space-between}.home .feature{flex-grow:1;flex-basis:30%;max-width:30%}.home .feature h2{font-size:1.4rem;font-weight:500;border-bottom:none;padding-bottom:0;color:#3a5169}.home .feature p{color:#4e6e8e}.home .footer{padding:2.5rem;border-top:1px solid #eaecef;text-align:center;color:#4e6e8e}@media (max-width:719px){.home .features{flex-direction:column}.home .feature{max-width:100%;padding:0 2.5rem}}@media (max-width:419px){.home{padding-left:1.5rem;padding-right:1.5rem}.home .hero img{max-height:210px;margin:2rem auto 1.2rem}.home .hero h1{font-size:2rem}.home .hero .action,.home .hero .description,.home .hero h1{margin:1.2rem auto}.home .hero .description{font-size:1.2rem}.home .hero .action-button{font-size:1rem;padding:.6rem 1.2rem}.home .feature h2{font-size:1.25rem}}.search-box{display:inline-block;position:relative;margin-right:1rem}.search-box input{cursor:text;width:10rem;height:2rem;color:#4e6e8e;display:inline-block;border:1px solid #cfd4db;border-radius:2rem;font-size:.9rem;line-height:2rem;padding:0 .5rem 0 2rem;outline:none;transition:all .2s ease;background:#fff url(/fizz-gateway-community/assets/img/search.83621669.svg) .6rem .5rem no-repeat;background-size:1rem}.search-box input:focus{cursor:auto;border-color:#3eaf7c}.search-box .suggestions{background:#fff;width:20rem;position:absolute;top:2rem;border:1px solid #cfd4db;border-radius:6px;padding:.4rem;list-style-type:none}.search-box .suggestions.align-right{right:0}.search-box .suggestion{line-height:1.4;padding:.4rem .6rem;border-radius:4px;cursor:pointer}.search-box .suggestion a{white-space:normal;color:#5d82a6}.search-box .suggestion a .page-title{font-weight:600}.search-box .suggestion a .header{font-size:.9em;margin-left:.25em}.search-box .suggestion.focused{background-color:#f3f4f5}.search-box .suggestion.focused a{color:#3eaf7c}@media (max-width:959px){.search-box input{cursor:pointer;width:0;border-color:transparent;position:relative}.search-box input:focus{cursor:text;left:0;width:10rem}}@media (-ms-high-contrast:none){.search-box input{height:2rem}}@media (max-width:959px) and (min-width:719px){.search-box .suggestions{left:0}}@media (max-width:719px){.search-box{margin-right:0}.search-box input{left:1rem}.search-box .suggestions{right:0}}@media (max-width:419px){.search-box .suggestions{width:calc(100vw - 4rem)}.search-box input:focus{width:8rem}}.sidebar-button{cursor:pointer;display:none;width:1.25rem;height:1.25rem;position:absolute;padding:.6rem;top:.6rem;left:1rem}.sidebar-button .icon{display:block;width:1.25rem;height:1.25rem}@media (max-width:719px){.sidebar-button{display:block}}.dropdown-enter,.dropdown-leave-to{height:0!important}.dropdown-wrapper{cursor:pointer}.dropdown-wrapper .dropdown-title{display:block;font-size:.9rem;font-family:inherit;cursor:inherit;padding:inherit;line-height:1.4rem;background:transparent;border:none;font-weight:500;color:#2c3e50}.dropdown-wrapper .dropdown-title:hover{border-color:transparent}.dropdown-wrapper .dropdown-title .arrow{vertical-align:middle;margin-top:-1px;margin-left:.4rem}.dropdown-wrapper .nav-dropdown .dropdown-item{color:inherit;line-height:1.7rem}.dropdown-wrapper .nav-dropdown .dropdown-item h4{margin:.45rem 0 0;border-top:1px solid #eee;padding:.45rem 1.5rem 0 1.25rem}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem-wrapper{padding:0;list-style:none}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem-wrapper .dropdown-subitem{font-size:.9em}.dropdown-wrapper .nav-dropdown .dropdown-item a{display:block;line-height:1.7rem;position:relative;border-bottom:none;font-weight:400;margin-bottom:0;padding:0 1.5rem 0 1.25rem}.dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active,.dropdown-wrapper .nav-dropdown .dropdown-item a:hover{color:#3eaf7c}.dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active:after{content:"";width:0;height:0;border-left:5px solid #3eaf7c;border-top:3px solid transparent;border-bottom:3px solid transparent;position:absolute;top:calc(50% - 2px);left:9px}.dropdown-wrapper .nav-dropdown .dropdown-item:first-child h4{margin-top:0;padding-top:0;border-top:0}@media (max-width:719px){.dropdown-wrapper.open .dropdown-title{margin-bottom:.5rem}.dropdown-wrapper .dropdown-title{font-weight:600;font-size:inherit}.dropdown-wrapper .dropdown-title:hover{color:#3eaf7c}.dropdown-wrapper .nav-dropdown{transition:height .1s ease-out;overflow:hidden}.dropdown-wrapper .nav-dropdown .dropdown-item h4{border-top:0;margin-top:0;padding-top:0}.dropdown-wrapper .nav-dropdown .dropdown-item>a,.dropdown-wrapper .nav-dropdown .dropdown-item h4{font-size:15px;line-height:2rem}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem{font-size:14px;padding-left:1rem}}@media (min-width:719px){.dropdown-wrapper{height:1.8rem}.dropdown-wrapper.open .nav-dropdown,.dropdown-wrapper:hover .nav-dropdown{display:block!important}.dropdown-wrapper.open:blur{display:none}.dropdown-wrapper .dropdown-title .arrow{border-left:4px solid transparent;border-right:4px solid transparent;border-top:6px solid #ccc;border-bottom:0}.dropdown-wrapper .nav-dropdown{display:none;height:auto!important;box-sizing:border-box;max-height:calc(100vh - 2.7rem);overflow-y:auto;position:absolute;top:100%;right:0;background-color:#fff;padding:.6rem 0;border:1px solid;border-color:#ddd #ddd #ccc;text-align:left;border-radius:.25rem;white-space:nowrap;margin:0}}.nav-links{display:inline-block}.nav-links a{line-height:1.4rem;color:inherit}.nav-links a.router-link-active,.nav-links a:hover{color:#3eaf7c}.nav-links .nav-item{position:relative;display:inline-block;margin-left:1.5rem;line-height:2rem}.nav-links .nav-item:first-child{margin-left:0}.nav-links .repo-link{margin-left:1.5rem}@media (max-width:719px){.nav-links .nav-item,.nav-links .repo-link{margin-left:0}}@media (min-width:719px){.nav-links a.router-link-active,.nav-links a:hover{color:#2c3e50}.nav-item>a:not(.external).router-link-active,.nav-item>a:not(.external):hover{margin-bottom:-2px;border-bottom:2px solid #46bd87}}.navbar{padding:.7rem 1.5rem;line-height:2.2rem}.navbar a,.navbar img,.navbar span{display:inline-block}.navbar .logo{height:2.2rem;min-width:2.2rem;margin-right:.8rem;vertical-align:top}.navbar .site-name{font-size:1.3rem;font-weight:600;color:#2c3e50;position:relative}.navbar .links{padding-left:1.5rem;box-sizing:border-box;background-color:#fff;white-space:nowrap;font-size:.9rem;position:absolute;right:1.5rem;top:.7rem;display:flex}.navbar .links .search-box{flex:0 0 auto;vertical-align:top}@media (max-width:719px){.navbar{padding-left:4rem}.navbar .can-hide{display:none}.navbar .links{padding-left:1.5rem}.navbar .site-name{width:calc(100vw - 9.4rem);overflow:hidden;white-space:nowrap;text-overflow:ellipsis}}.page-edit{max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.page-edit{padding:2rem}}@media (max-width:419px){.page-edit{padding:1.5rem}}.page-edit{padding-top:1rem;padding-bottom:1rem;overflow:auto}.page-edit .edit-link{display:inline-block}.page-edit .edit-link a{color:#4e6e8e;margin-right:.25rem}.page-edit .last-updated{float:right;font-size:.9em}.page-edit .last-updated .prefix{font-weight:500;color:#4e6e8e}.page-edit .last-updated .time{font-weight:400;color:#aaa}@media (max-width:719px){.page-edit .edit-link{margin-bottom:.5rem}.page-edit .last-updated{font-size:.8em;float:none;text-align:left}}.page-nav{max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.page-nav{padding:2rem}}@media (max-width:419px){.page-nav{padding:1.5rem}}.page-nav{padding-top:1rem;padding-bottom:0}.page-nav .inner{min-height:2rem;margin-top:0;border-top:1px solid #eaecef;padding-top:1rem;overflow:auto}.page-nav .next{float:right}.page{padding-bottom:2rem;display:block}.sidebar-group .sidebar-group{padding-left:.5em}.sidebar-group:not(.collapsable) .sidebar-heading:not(.clickable){cursor:auto;color:inherit}.sidebar-group.is-sub-group{padding-left:0}.sidebar-group.is-sub-group>.sidebar-heading{font-size:.95em;line-height:1.4;font-weight:400;padding-left:2rem}.sidebar-group.is-sub-group>.sidebar-heading:not(.clickable){opacity:.5}.sidebar-group.is-sub-group>.sidebar-group-items{padding-left:1rem}.sidebar-group.is-sub-group>.sidebar-group-items>li>.sidebar-link{font-size:.95em;border-left:none}.sidebar-group.depth-2>.sidebar-heading{border-left:none}.sidebar-heading{color:#2c3e50;transition:color .15s ease;cursor:pointer;font-size:1.1em;font-weight:700;padding:.35rem 1.5rem .35rem 1.25rem;width:100%;box-sizing:border-box;margin:0;border-left:.25rem solid transparent}.sidebar-heading.open,.sidebar-heading:hover{color:inherit}.sidebar-heading .arrow{position:relative;top:-.12em;left:.5em}.sidebar-heading.clickable.active{font-weight:600;color:#3eaf7c;border-left-color:#3eaf7c}.sidebar-heading.clickable:hover{color:#3eaf7c}.sidebar-group-items{transition:height .1s ease-out;font-size:.95em;overflow:hidden}.sidebar .sidebar-sub-headers{padding-left:1rem;font-size:.95em}a.sidebar-link{font-size:1em;font-weight:400;display:inline-block;color:#2c3e50;border-left:.25rem solid transparent;padding:.35rem 1rem .35rem 1.25rem;line-height:1.4;width:100%;box-sizing:border-box}a.sidebar-link:hover{color:#3eaf7c}a.sidebar-link.active{font-weight:600;color:#3eaf7c;border-left-color:#3eaf7c}.sidebar-group a.sidebar-link{padding-left:2rem}.sidebar-sub-headers a.sidebar-link{padding-top:.25rem;padding-bottom:.25rem;border-left:none}.sidebar-sub-headers a.sidebar-link.active{font-weight:500}.sidebar ul{padding:0;margin:0;list-style-type:none}.sidebar a{display:inline-block}.sidebar .nav-links{display:none;border-bottom:1px solid #eaecef;padding:.5rem 0 .75rem}.sidebar .nav-links a{font-weight:600}.sidebar .nav-links .nav-item,.sidebar .nav-links .repo-link{display:block;line-height:1.25rem;font-size:1.1em;padding:.5rem 0 .5rem 1.5rem}.sidebar>.sidebar-links{padding:1.5rem 0}.sidebar>.sidebar-links>li>a.sidebar-link{font-size:1.1em;line-height:1.7;font-weight:700}.sidebar>.sidebar-links>li:not(:first-child){margin-top:.75rem}@media (max-width:719px){.sidebar .nav-links{display:block}.sidebar .nav-links .dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active:after{top:calc(1rem - 2px)}.sidebar>.sidebar-links{padding:1rem 0}}.badge[data-v-15b7b770]{display:inline-block;font-size:14px;height:18px;line-height:18px;border-radius:3px;padding:0 6px;color:#fff}.badge.green[data-v-15b7b770],.badge.tip[data-v-15b7b770],.badge[data-v-15b7b770]{background-color:#42b983}.badge.error[data-v-15b7b770]{background-color:#da5961}.badge.warn[data-v-15b7b770],.badge.warning[data-v-15b7b770],.badge.yellow[data-v-15b7b770]{background-color:#e7c000}.badge+.badge[data-v-15b7b770]{margin-left:5px} \ No newline at end of file +code[class*=language-],pre[class*=language-]{color:#ccc;background:none;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#2d2d2d}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.block-comment,.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#999}.token.punctuation{color:#ccc}.token.attr-name,.token.deleted,.token.namespace,.token.tag{color:#e2777a}.token.function-name{color:#6196cc}.token.boolean,.token.function,.token.number{color:#f08d49}.token.class-name,.token.constant,.token.property,.token.symbol{color:#f8c555}.token.atrule,.token.builtin,.token.important,.token.keyword,.token.selector{color:#cc99cd}.token.attr-value,.token.char,.token.regex,.token.string,.token.variable{color:#7ec699}.token.entity,.token.operator,.token.url{color:#67cdcc}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:green}.theme-default-content code{color:#476582;padding:.25rem .5rem;margin:0;font-size:.85em;background-color:rgba(27,31,35,.05);border-radius:3px}.theme-default-content code .token.deleted{color:#ec5975}.theme-default-content code .token.inserted{color:#3eaf7c}.theme-default-content pre,.theme-default-content pre[class*=language-]{line-height:1.4;padding:1.25rem 1.5rem;margin:.85rem 0;background-color:#282c34;border-radius:6px;overflow:auto}.theme-default-content pre[class*=language-] code,.theme-default-content pre code{color:#fff;padding:0;background-color:transparent;border-radius:0}div[class*=language-]{position:relative;background-color:#282c34;border-radius:6px}div[class*=language-] .highlight-lines{-webkit-user-select:none;-ms-user-select:none;user-select:none;padding-top:1.3rem;position:absolute;top:0;left:0;width:100%;line-height:1.4}div[class*=language-] .highlight-lines .highlighted{background-color:rgba(0,0,0,.66)}div[class*=language-] pre,div[class*=language-] pre[class*=language-]{background:transparent;position:relative;z-index:1}div[class*=language-]:before{position:absolute;z-index:3;top:.8em;right:1em;font-size:.75rem;color:hsla(0,0%,100%,.4)}div[class*=language-]:not(.line-numbers-mode) .line-numbers-wrapper{display:none}div[class*=language-].line-numbers-mode .highlight-lines .highlighted{position:relative}div[class*=language-].line-numbers-mode .highlight-lines .highlighted:before{content:" ";position:absolute;z-index:3;left:0;top:0;display:block;width:3.5rem;height:100%;background-color:rgba(0,0,0,.66)}div[class*=language-].line-numbers-mode pre{padding-left:4.5rem;vertical-align:middle}div[class*=language-].line-numbers-mode .line-numbers-wrapper{position:absolute;top:0;width:3.5rem;text-align:center;color:hsla(0,0%,100%,.3);padding:1.25rem 0;line-height:1.4}div[class*=language-].line-numbers-mode .line-numbers-wrapper br{-webkit-user-select:none;-ms-user-select:none;user-select:none}div[class*=language-].line-numbers-mode .line-numbers-wrapper .line-number{position:relative;z-index:4;-webkit-user-select:none;-ms-user-select:none;user-select:none;font-size:.85em}div[class*=language-].line-numbers-mode:after{content:"";position:absolute;z-index:2;top:0;left:0;width:3.5rem;height:100%;border-radius:6px 0 0 6px;border-right:1px solid rgba(0,0,0,.66);background-color:#282c34}div[class~=language-js]:before{content:"js"}div[class~=language-ts]:before{content:"ts"}div[class~=language-html]:before{content:"html"}div[class~=language-md]:before{content:"md"}div[class~=language-vue]:before{content:"vue"}div[class~=language-css]:before{content:"css"}div[class~=language-sass]:before{content:"sass"}div[class~=language-scss]:before{content:"scss"}div[class~=language-less]:before{content:"less"}div[class~=language-stylus]:before{content:"stylus"}div[class~=language-go]:before{content:"go"}div[class~=language-java]:before{content:"java"}div[class~=language-c]:before{content:"c"}div[class~=language-sh]:before{content:"sh"}div[class~=language-yaml]:before{content:"yaml"}div[class~=language-py]:before{content:"py"}div[class~=language-docker]:before{content:"docker"}div[class~=language-dockerfile]:before{content:"dockerfile"}div[class~=language-makefile]:before{content:"makefile"}div[class~=language-javascript]:before{content:"js"}div[class~=language-typescript]:before{content:"ts"}div[class~=language-markup]:before{content:"html"}div[class~=language-markdown]:before{content:"md"}div[class~=language-json]:before{content:"json"}div[class~=language-ruby]:before{content:"rb"}div[class~=language-python]:before{content:"py"}div[class~=language-bash]:before{content:"sh"}div[class~=language-php]:before{content:"php"}.custom-block .custom-block-title{font-weight:600;margin-bottom:-.4rem}.custom-block.danger,.custom-block.tip,.custom-block.warning{padding:.1rem 1.5rem;border-left-width:.5rem;border-left-style:solid;margin:1rem 0}.custom-block.tip{background-color:#f3f5f7;border-color:#42b983}.custom-block.warning{background-color:rgba(255,229,100,.3);border-color:#e7c000;color:#6b5900}.custom-block.warning .custom-block-title{color:#b29400}.custom-block.warning a{color:#2c3e50}.custom-block.danger{background-color:#ffe6e6;border-color:#c00;color:#4d0000}.custom-block.danger .custom-block-title{color:#900}.custom-block.danger a{color:#2c3e50}.custom-block.details{display:block;position:relative;border-radius:2px;margin:1.6em 0;padding:1.6em;background-color:#eee}.custom-block.details h4{margin-top:0}.custom-block.details figure:last-child,.custom-block.details p:last-child{margin-bottom:0;padding-bottom:0}.custom-block.details summary{outline:none;cursor:pointer}.arrow{display:inline-block;width:0;height:0}.arrow.up{border-bottom:6px solid #ccc}.arrow.down,.arrow.up{border-left:4px solid transparent;border-right:4px solid transparent}.arrow.down{border-top:6px solid #ccc}.arrow.right{border-left:6px solid #ccc}.arrow.left,.arrow.right{border-top:4px solid transparent;border-bottom:4px solid transparent}.arrow.left{border-right:6px solid #ccc}.theme-default-content:not(.custom){max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.theme-default-content:not(.custom){padding:2rem}}@media (max-width:419px){.theme-default-content:not(.custom){padding:1.5rem}}.table-of-contents .badge{vertical-align:middle}body,html{padding:0;margin:0;background-color:#fff}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:16px;color:#2c3e50}.page{padding-left:20rem}.navbar{z-index:20;right:0;height:3.6rem;background-color:#fff;box-sizing:border-box;border-bottom:1px solid #eaecef}.navbar,.sidebar-mask{position:fixed;top:0;left:0}.sidebar-mask{z-index:9;width:100vw;height:100vh;display:none}.sidebar{font-size:16px;background-color:#fff;width:20rem;position:fixed;z-index:10;margin:0;top:3.6rem;left:0;bottom:0;box-sizing:border-box;border-right:1px solid #eaecef;overflow-y:auto}.theme-default-content:not(.custom)>:first-child{margin-top:3.6rem}.theme-default-content:not(.custom) a:hover{text-decoration:underline}.theme-default-content:not(.custom) p.demo{padding:1rem 1.5rem;border:1px solid #ddd;border-radius:4px}.theme-default-content:not(.custom) img{max-width:100%}.theme-default-content.custom{padding:0;margin:0}.theme-default-content.custom img{max-width:100%}a{font-weight:500;text-decoration:none}a,p a code{color:#3eaf7c}p a code{font-weight:400}kbd{background:#eee;border:.15rem solid #ddd;border-bottom:.25rem solid #ddd;border-radius:.15rem;padding:0 .15em}blockquote{font-size:1rem;color:#999;border-left:.2rem solid #dfe2e5;margin:1rem 0;padding:.25rem 0 .25rem 1rem}blockquote>p{margin:0}ol,ul{padding-left:1.2em}strong{font-weight:600}h1,h2,h3,h4,h5,h6{font-weight:600;line-height:1.25}.theme-default-content:not(.custom)>h1,.theme-default-content:not(.custom)>h2,.theme-default-content:not(.custom)>h3,.theme-default-content:not(.custom)>h4,.theme-default-content:not(.custom)>h5,.theme-default-content:not(.custom)>h6{margin-top:-3.1rem;padding-top:4.6rem;margin-bottom:0}.theme-default-content:not(.custom)>h1:first-child,.theme-default-content:not(.custom)>h2:first-child,.theme-default-content:not(.custom)>h3:first-child,.theme-default-content:not(.custom)>h4:first-child,.theme-default-content:not(.custom)>h5:first-child,.theme-default-content:not(.custom)>h6:first-child{margin-top:-1.5rem;margin-bottom:1rem}.theme-default-content:not(.custom)>h1:first-child+.custom-block,.theme-default-content:not(.custom)>h1:first-child+p,.theme-default-content:not(.custom)>h1:first-child+pre,.theme-default-content:not(.custom)>h2:first-child+.custom-block,.theme-default-content:not(.custom)>h2:first-child+p,.theme-default-content:not(.custom)>h2:first-child+pre,.theme-default-content:not(.custom)>h3:first-child+.custom-block,.theme-default-content:not(.custom)>h3:first-child+p,.theme-default-content:not(.custom)>h3:first-child+pre,.theme-default-content:not(.custom)>h4:first-child+.custom-block,.theme-default-content:not(.custom)>h4:first-child+p,.theme-default-content:not(.custom)>h4:first-child+pre,.theme-default-content:not(.custom)>h5:first-child+.custom-block,.theme-default-content:not(.custom)>h5:first-child+p,.theme-default-content:not(.custom)>h5:first-child+pre,.theme-default-content:not(.custom)>h6:first-child+.custom-block,.theme-default-content:not(.custom)>h6:first-child+p,.theme-default-content:not(.custom)>h6:first-child+pre{margin-top:2rem}h1:hover .header-anchor,h2:hover .header-anchor,h3:hover .header-anchor,h4:hover .header-anchor,h5:hover .header-anchor,h6:hover .header-anchor{opacity:1}h1{font-size:2.2rem}h2{font-size:1.65rem;padding-bottom:.3rem;border-bottom:1px solid #eaecef}h3{font-size:1.35rem}a.header-anchor{font-size:.85em;float:left;margin-left:-.87em;padding-right:.23em;margin-top:.125em;opacity:0}a.header-anchor:hover{text-decoration:none}.line-number,code,kbd{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}ol,p,ul{line-height:1.7}hr{border:0;border-top:1px solid #eaecef}table{border-collapse:collapse;margin:1rem 0;display:block;overflow-x:auto}tr{border-top:1px solid #dfe2e5}tr:nth-child(2n){background-color:#f6f8fa}td,th{border:1px solid #dfe2e5;padding:.6em 1em}.theme-container.sidebar-open .sidebar-mask{display:block}.theme-container.no-navbar .theme-default-content:not(.custom)>h1,.theme-container.no-navbar h2,.theme-container.no-navbar h3,.theme-container.no-navbar h4,.theme-container.no-navbar h5,.theme-container.no-navbar h6{margin-top:1.5rem;padding-top:0}.theme-container.no-navbar .sidebar{top:0}@media (min-width:720px){.theme-container.no-sidebar .sidebar{display:none}.theme-container.no-sidebar .page{padding-left:0}}@media (max-width:959px){.sidebar{font-size:15px;width:16.4rem}.page{padding-left:16.4rem}}@media (max-width:719px){.sidebar{top:0;padding-top:3.6rem;transform:translateX(-100%);transition:transform .2s ease}.page{padding-left:0}.theme-container.sidebar-open .sidebar{transform:translateX(0)}.theme-container.no-navbar .sidebar{padding-top:0}}@media (max-width:419px){h1{font-size:1.9rem}.theme-default-content div[class*=language-]{margin:.85rem -1.5rem;border-radius:0}}#nprogress{pointer-events:none}#nprogress .bar{background:#3eaf7c;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #3eaf7c,0 0 5px #3eaf7c;opacity:1;transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border-color:#3eaf7c transparent transparent #3eaf7c;border-style:solid;border-width:2px;border-radius:50%;-webkit-animation:nprogress-spinner .4s linear infinite;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@-webkit-keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.icon.outbound{color:#aaa;display:inline-block;vertical-align:middle;position:relative;top:-1px}.home{padding:3.6rem 2rem 0;max-width:960px;margin:0 auto;display:block}.home .hero{text-align:center}.home .hero img{max-width:100%;max-height:280px;display:block;margin:3rem auto 1.5rem}.home .hero h1{font-size:3rem}.home .hero .action,.home .hero .description,.home .hero h1{margin:1.8rem auto}.home .hero .description{max-width:35rem;font-size:1.6rem;line-height:1.3;color:#6a8bad}.home .hero .action-button{display:inline-block;font-size:1.2rem;color:#fff;background-color:#3eaf7c;padding:.8rem 1.6rem;border-radius:4px;transition:background-color .1s ease;box-sizing:border-box;border-bottom:1px solid #389d70}.home .hero .action-button:hover{background-color:#4abf8a}.home .features{border-top:1px solid #eaecef;padding:1.2rem 0;margin-top:2.5rem;display:flex;flex-wrap:wrap;align-items:flex-start;align-content:stretch;justify-content:space-between}.home .feature{flex-grow:1;flex-basis:30%;max-width:30%}.home .feature h2{font-size:1.4rem;font-weight:500;border-bottom:none;padding-bottom:0;color:#3a5169}.home .feature p{color:#4e6e8e}.home .footer{padding:2.5rem;border-top:1px solid #eaecef;text-align:center;color:#4e6e8e}@media (max-width:719px){.home .features{flex-direction:column}.home .feature{max-width:100%;padding:0 2.5rem}}@media (max-width:419px){.home{padding-left:1.5rem;padding-right:1.5rem}.home .hero img{max-height:210px;margin:2rem auto 1.2rem}.home .hero h1{font-size:2rem}.home .hero .action,.home .hero .description,.home .hero h1{margin:1.2rem auto}.home .hero .description{font-size:1.2rem}.home .hero .action-button{font-size:1rem;padding:.6rem 1.2rem}.home .feature h2{font-size:1.25rem}}.search-box{display:inline-block;position:relative;margin-right:1rem}.search-box input{cursor:text;width:10rem;height:2rem;color:#4e6e8e;display:inline-block;border:1px solid #cfd4db;border-radius:2rem;font-size:.9rem;line-height:2rem;padding:0 .5rem 0 2rem;outline:none;transition:all .2s ease;background:#fff url(/assets/img/search.83621669.svg) .6rem .5rem no-repeat;background-size:1rem}.search-box input:focus{cursor:auto;border-color:#3eaf7c}.search-box .suggestions{background:#fff;width:20rem;position:absolute;top:2rem;border:1px solid #cfd4db;border-radius:6px;padding:.4rem;list-style-type:none}.search-box .suggestions.align-right{right:0}.search-box .suggestion{line-height:1.4;padding:.4rem .6rem;border-radius:4px;cursor:pointer}.search-box .suggestion a{white-space:normal;color:#5d82a6}.search-box .suggestion a .page-title{font-weight:600}.search-box .suggestion a .header{font-size:.9em;margin-left:.25em}.search-box .suggestion.focused{background-color:#f3f4f5}.search-box .suggestion.focused a{color:#3eaf7c}@media (max-width:959px){.search-box input{cursor:pointer;width:0;border-color:transparent;position:relative}.search-box input:focus{cursor:text;left:0;width:10rem}}@media (-ms-high-contrast:none){.search-box input{height:2rem}}@media (max-width:959px) and (min-width:719px){.search-box .suggestions{left:0}}@media (max-width:719px){.search-box{margin-right:0}.search-box input{left:1rem}.search-box .suggestions{right:0}}@media (max-width:419px){.search-box .suggestions{width:calc(100vw - 4rem)}.search-box input:focus{width:8rem}}.sidebar-button{cursor:pointer;display:none;width:1.25rem;height:1.25rem;position:absolute;padding:.6rem;top:.6rem;left:1rem}.sidebar-button .icon{display:block;width:1.25rem;height:1.25rem}@media (max-width:719px){.sidebar-button{display:block}}.dropdown-enter,.dropdown-leave-to{height:0!important}.dropdown-wrapper{cursor:pointer}.dropdown-wrapper .dropdown-title{display:block;font-size:.9rem;font-family:inherit;cursor:inherit;padding:inherit;line-height:1.4rem;background:transparent;border:none;font-weight:500;color:#2c3e50}.dropdown-wrapper .dropdown-title:hover{border-color:transparent}.dropdown-wrapper .dropdown-title .arrow{vertical-align:middle;margin-top:-1px;margin-left:.4rem}.dropdown-wrapper .nav-dropdown .dropdown-item{color:inherit;line-height:1.7rem}.dropdown-wrapper .nav-dropdown .dropdown-item h4{margin:.45rem 0 0;border-top:1px solid #eee;padding:.45rem 1.5rem 0 1.25rem}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem-wrapper{padding:0;list-style:none}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem-wrapper .dropdown-subitem{font-size:.9em}.dropdown-wrapper .nav-dropdown .dropdown-item a{display:block;line-height:1.7rem;position:relative;border-bottom:none;font-weight:400;margin-bottom:0;padding:0 1.5rem 0 1.25rem}.dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active,.dropdown-wrapper .nav-dropdown .dropdown-item a:hover{color:#3eaf7c}.dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active:after{content:"";width:0;height:0;border-left:5px solid #3eaf7c;border-top:3px solid transparent;border-bottom:3px solid transparent;position:absolute;top:calc(50% - 2px);left:9px}.dropdown-wrapper .nav-dropdown .dropdown-item:first-child h4{margin-top:0;padding-top:0;border-top:0}@media (max-width:719px){.dropdown-wrapper.open .dropdown-title{margin-bottom:.5rem}.dropdown-wrapper .dropdown-title{font-weight:600;font-size:inherit}.dropdown-wrapper .dropdown-title:hover{color:#3eaf7c}.dropdown-wrapper .nav-dropdown{transition:height .1s ease-out;overflow:hidden}.dropdown-wrapper .nav-dropdown .dropdown-item h4{border-top:0;margin-top:0;padding-top:0}.dropdown-wrapper .nav-dropdown .dropdown-item>a,.dropdown-wrapper .nav-dropdown .dropdown-item h4{font-size:15px;line-height:2rem}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem{font-size:14px;padding-left:1rem}}@media (min-width:719px){.dropdown-wrapper{height:1.8rem}.dropdown-wrapper.open .nav-dropdown,.dropdown-wrapper:hover .nav-dropdown{display:block!important}.dropdown-wrapper.open:blur{display:none}.dropdown-wrapper .dropdown-title .arrow{border-left:4px solid transparent;border-right:4px solid transparent;border-top:6px solid #ccc;border-bottom:0}.dropdown-wrapper .nav-dropdown{display:none;height:auto!important;box-sizing:border-box;max-height:calc(100vh - 2.7rem);overflow-y:auto;position:absolute;top:100%;right:0;background-color:#fff;padding:.6rem 0;border:1px solid;border-color:#ddd #ddd #ccc;text-align:left;border-radius:.25rem;white-space:nowrap;margin:0}}.nav-links{display:inline-block}.nav-links a{line-height:1.4rem;color:inherit}.nav-links a.router-link-active,.nav-links a:hover{color:#3eaf7c}.nav-links .nav-item{position:relative;display:inline-block;margin-left:1.5rem;line-height:2rem}.nav-links .nav-item:first-child{margin-left:0}.nav-links .repo-link{margin-left:1.5rem}@media (max-width:719px){.nav-links .nav-item,.nav-links .repo-link{margin-left:0}}@media (min-width:719px){.nav-links a.router-link-active,.nav-links a:hover{color:#2c3e50}.nav-item>a:not(.external).router-link-active,.nav-item>a:not(.external):hover{margin-bottom:-2px;border-bottom:2px solid #46bd87}}.navbar{padding:.7rem 1.5rem;line-height:2.2rem}.navbar a,.navbar img,.navbar span{display:inline-block}.navbar .logo{height:2.2rem;min-width:2.2rem;margin-right:.8rem;vertical-align:top}.navbar .site-name{font-size:1.3rem;font-weight:600;color:#2c3e50;position:relative}.navbar .links{padding-left:1.5rem;box-sizing:border-box;background-color:#fff;white-space:nowrap;font-size:.9rem;position:absolute;right:1.5rem;top:.7rem;display:flex}.navbar .links .search-box{flex:0 0 auto;vertical-align:top}@media (max-width:719px){.navbar{padding-left:4rem}.navbar .can-hide{display:none}.navbar .links{padding-left:1.5rem}.navbar .site-name{width:calc(100vw - 9.4rem);overflow:hidden;white-space:nowrap;text-overflow:ellipsis}}.page-edit{max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.page-edit{padding:2rem}}@media (max-width:419px){.page-edit{padding:1.5rem}}.page-edit{padding-top:1rem;padding-bottom:1rem;overflow:auto}.page-edit .edit-link{display:inline-block}.page-edit .edit-link a{color:#4e6e8e;margin-right:.25rem}.page-edit .last-updated{float:right;font-size:.9em}.page-edit .last-updated .prefix{font-weight:500;color:#4e6e8e}.page-edit .last-updated .time{font-weight:400;color:#aaa}@media (max-width:719px){.page-edit .edit-link{margin-bottom:.5rem}.page-edit .last-updated{font-size:.8em;float:none;text-align:left}}.page-nav{max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.page-nav{padding:2rem}}@media (max-width:419px){.page-nav{padding:1.5rem}}.page-nav{padding-top:1rem;padding-bottom:0}.page-nav .inner{min-height:2rem;margin-top:0;border-top:1px solid #eaecef;padding-top:1rem;overflow:auto}.page-nav .next{float:right}.page{padding-bottom:2rem;display:block}.sidebar-group .sidebar-group{padding-left:.5em}.sidebar-group:not(.collapsable) .sidebar-heading:not(.clickable){cursor:auto;color:inherit}.sidebar-group.is-sub-group{padding-left:0}.sidebar-group.is-sub-group>.sidebar-heading{font-size:.95em;line-height:1.4;font-weight:400;padding-left:2rem}.sidebar-group.is-sub-group>.sidebar-heading:not(.clickable){opacity:.5}.sidebar-group.is-sub-group>.sidebar-group-items{padding-left:1rem}.sidebar-group.is-sub-group>.sidebar-group-items>li>.sidebar-link{font-size:.95em;border-left:none}.sidebar-group.depth-2>.sidebar-heading{border-left:none}.sidebar-heading{color:#2c3e50;transition:color .15s ease;cursor:pointer;font-size:1.1em;font-weight:700;padding:.35rem 1.5rem .35rem 1.25rem;width:100%;box-sizing:border-box;margin:0;border-left:.25rem solid transparent}.sidebar-heading.open,.sidebar-heading:hover{color:inherit}.sidebar-heading .arrow{position:relative;top:-.12em;left:.5em}.sidebar-heading.clickable.active{font-weight:600;color:#3eaf7c;border-left-color:#3eaf7c}.sidebar-heading.clickable:hover{color:#3eaf7c}.sidebar-group-items{transition:height .1s ease-out;font-size:.95em;overflow:hidden}.sidebar .sidebar-sub-headers{padding-left:1rem;font-size:.95em}a.sidebar-link{font-size:1em;font-weight:400;display:inline-block;color:#2c3e50;border-left:.25rem solid transparent;padding:.35rem 1rem .35rem 1.25rem;line-height:1.4;width:100%;box-sizing:border-box}a.sidebar-link:hover{color:#3eaf7c}a.sidebar-link.active{font-weight:600;color:#3eaf7c;border-left-color:#3eaf7c}.sidebar-group a.sidebar-link{padding-left:2rem}.sidebar-sub-headers a.sidebar-link{padding-top:.25rem;padding-bottom:.25rem;border-left:none}.sidebar-sub-headers a.sidebar-link.active{font-weight:500}.sidebar ul{padding:0;margin:0;list-style-type:none}.sidebar a{display:inline-block}.sidebar .nav-links{display:none;border-bottom:1px solid #eaecef;padding:.5rem 0 .75rem}.sidebar .nav-links a{font-weight:600}.sidebar .nav-links .nav-item,.sidebar .nav-links .repo-link{display:block;line-height:1.25rem;font-size:1.1em;padding:.5rem 0 .5rem 1.5rem}.sidebar>.sidebar-links{padding:1.5rem 0}.sidebar>.sidebar-links>li>a.sidebar-link{font-size:1.1em;line-height:1.7;font-weight:700}.sidebar>.sidebar-links>li:not(:first-child){margin-top:.75rem}@media (max-width:719px){.sidebar .nav-links{display:block}.sidebar .nav-links .dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active:after{top:calc(1rem - 2px)}.sidebar>.sidebar-links{padding:1rem 0}}.badge[data-v-15b7b770]{display:inline-block;font-size:14px;height:18px;line-height:18px;border-radius:3px;padding:0 6px;color:#fff}.badge.green[data-v-15b7b770],.badge.tip[data-v-15b7b770],.badge[data-v-15b7b770]{background-color:#42b983}.badge.error[data-v-15b7b770]{background-color:#da5961}.badge.warn[data-v-15b7b770],.badge.warning[data-v-15b7b770],.badge.yellow[data-v-15b7b770]{background-color:#e7c000}.badge+.badge[data-v-15b7b770]{margin-left:5px} \ No newline at end of file diff --git a/docs/assets/js/10.b57afcaa.js b/docs/assets/js/10.b57afcaa.js new file mode 100644 index 0000000..743fe74 --- /dev/null +++ b/docs/assets/js/10.b57afcaa.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[10],{358:function(t,v,e){"use strict";e.r(v);var r=e(42),_=Object(r.a)({},(function(){var t=this,v=t.$createElement,e=t._self._c||v;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("p",[t._v("1.创建服务")]),t._v(" "),e("p",[t._v("此服务是一个分组的概念,可以包含多个聚合接口,类似于微服务体系里的服务")]),t._v(" "),e("p",[t._v("2.创建服务编排接口")]),t._v(" "),e("p",[t._v("3.开通网关白名单和配置访问策略和插件")]),t._v(" "),e("p",[t._v("4.测试服务编排接口")]),t._v(" "),e("p",[t._v("5.发布接口")]),t._v(" "),e("p",[t._v("界面总览")]),t._v(" "),e("p",[e("img",{attrs:{src:"/aggr_overview1.png",alt:""}})]),t._v(" "),e("p",[e("img",{attrs:{src:"/aggr_overview2.png",alt:""}})])])}),[],!1,null,null,null);v.default=_.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/10.ddbb0d4d.js b/docs/assets/js/10.ddbb0d4d.js deleted file mode 100644 index fa74ad7..0000000 --- a/docs/assets/js/10.ddbb0d4d.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[10],{357:function(t,e,v){"use strict";v.r(e);var n=v(42),r=Object(n.a)({},(function(){var t=this,e=t.$createElement,v=t._self._c||e;return v("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[v("p",[t._v("1.创建服务")]),t._v(" "),v("p",[t._v("此服务是一个分组的概念,可以包含多个聚合接口,类似于微服务体系里的服务")]),t._v(" "),v("p",[t._v("2.创建服务编排接口")]),t._v(" "),v("p",[t._v("3.开通网关白名单和配置访问策略和插件")]),t._v(" "),v("p",[t._v("4.测试服务编排接口")]),t._v(" "),v("p",[t._v("5.发布接口")]),t._v(" "),v("p",[t._v("界面总览")]),t._v(" "),v("p",[v("img",{attrs:{src:"/fizz-gateway-community/aggr_overview1.png",alt:""}})]),t._v(" "),v("p",[v("img",{attrs:{src:"/fizz-gateway-community/aggr_overview2.png",alt:""}})])])}),[],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/11.21242c7f.js b/docs/assets/js/11.21242c7f.js new file mode 100644 index 0000000..94c1a7b --- /dev/null +++ b/docs/assets/js/11.21242c7f.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[11],{355:function(t,_,v){"use strict";v.r(_);var a=v(42),e=Object(a.a)({},(function(){var t=this,_=t.$createElement,v=t._self._c||_;return v("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[v("h2",{attrs:{id:"基准测试结果"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#基准测试结果"}},[t._v("#")]),t._v(" 基准测试结果")]),t._v(" "),v("p",[t._v("我们将Fizz与Spring官方spring-cloud-gateway进行比较,使用相同的环境和条件,测试对象均为单个节点。")]),t._v(" "),v("table",[v("thead",[v("tr",[v("th",{staticStyle:{"text-align":"center"}},[t._v("产品")]),t._v(" "),v("th",[t._v("QPS")]),t._v(" "),v("th",[t._v("90% Latency(ms)")])])]),t._v(" "),v("tbody",[v("tr",[v("td",{staticStyle:{"text-align":"center"}},[t._v("直接访问后端服务")]),t._v(" "),v("td",[t._v("9087.46")]),t._v(" "),v("td",[t._v("10.76")])]),t._v(" "),v("tr",[v("td",{staticStyle:{"text-align":"center"}},[t._v("fizz-gateway")]),t._v(" "),v("td",[t._v("5927.13")]),t._v(" "),v("td",[t._v("19.86")])]),t._v(" "),v("tr",[v("td",{staticStyle:{"text-align":"center"}},[t._v("spring-cloud-gateway")]),t._v(" "),v("td",[t._v("5044.04")]),t._v(" "),v("td",[t._v("22.91")])])])]),t._v(" "),v("h2",{attrs:{id:"基准测试详情"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#基准测试详情"}},[t._v("#")]),t._v(" 基准测试详情")]),t._v(" "),v("h3",{attrs:{id:"硬件环境"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#硬件环境"}},[t._v("#")]),t._v(" 硬件环境")]),t._v(" "),v("p",[t._v("后端服务所在服务器:")]),t._v(" "),v("p",[t._v("4核8G内存")]),t._v(" "),v("p",[t._v("Intel(R) Xeon(R) CPU X5675 @ 3.07GHz * 4")]),t._v(" "),v("p",[t._v("Linux version 3.10.0-327.el7.x86_64")]),t._v(" "),v("p",[t._v("节点所在服务器:")]),t._v(" "),v("p",[t._v("4核8G内存")]),t._v(" "),v("p",[t._v("Intel(R) Xeon(R) CPU X5675 @ 3.07GHz * 4")]),t._v(" "),v("p",[t._v("Linux version 3.10.0-327.el7.x86_64")]),t._v(" "),v("p",[t._v("压测程序所在服务器:")]),t._v(" "),v("p",[t._v("4核8G内存")]),t._v(" "),v("p",[t._v("Intel(R) Xeon(R) CPU X5675 @ 3.07GHz * 4")]),t._v(" "),v("p",[t._v("Linux version 3.10.0-327.el7.x86_64")]),t._v(" "),v("h3",{attrs:{id:"压测工具"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#压测工具"}},[t._v("#")]),t._v(" 压测工具")]),t._v(" "),v("p",[t._v("压测软件:wrk")]),t._v(" "),v("p",[t._v("并发连接: 100")]),t._v(" "),v("h3",{attrs:{id:"压测结果截图"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#压测结果截图"}},[t._v("#")]),t._v(" 压测结果截图")]),t._v(" "),v("ul",[v("li",[v("p",[t._v("直接访问后端服务:\n"),v("img",{attrs:{src:"/benchmark_backend.png",alt:""}})])]),t._v(" "),v("li",[v("p",[t._v("fizz-gateway:\n"),v("img",{attrs:{src:"/benchmark_fizz.png",alt:""}})])]),t._v(" "),v("li",[v("p",[t._v("spring-cloud-gateway:\n"),v("img",{attrs:{src:"/benchmark_scgw.png",alt:""}})])])])])}),[],!1,null,null,null);_.default=e.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/11.93c9bc98.js b/docs/assets/js/11.93c9bc98.js deleted file mode 100644 index 52e8f3a..0000000 --- a/docs/assets/js/11.93c9bc98.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[11],{356:function(t,_,a){"use strict";a.r(_);var v=a(42),e=Object(v.a)({},(function(){var t=this,_=t.$createElement,a=t._self._c||_;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h2",{attrs:{id:"基准测试结果"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#基准测试结果"}},[t._v("#")]),t._v(" 基准测试结果")]),t._v(" "),a("p",[t._v("我们将Fizz与Spring官方spring-cloud-gateway进行比较,使用相同的环境和条件,测试对象均为单个节点。")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",{staticStyle:{"text-align":"center"}},[t._v("产品")]),t._v(" "),a("th",[t._v("QPS")]),t._v(" "),a("th",[t._v("90% Latency(ms)")])])]),t._v(" "),a("tbody",[a("tr",[a("td",{staticStyle:{"text-align":"center"}},[t._v("直接访问后端服务")]),t._v(" "),a("td",[t._v("9087.46")]),t._v(" "),a("td",[t._v("10.76")])]),t._v(" "),a("tr",[a("td",{staticStyle:{"text-align":"center"}},[t._v("fizz-gateway")]),t._v(" "),a("td",[t._v("5927.13")]),t._v(" "),a("td",[t._v("19.86")])]),t._v(" "),a("tr",[a("td",{staticStyle:{"text-align":"center"}},[t._v("spring-cloud-gateway")]),t._v(" "),a("td",[t._v("5044.04")]),t._v(" "),a("td",[t._v("22.91")])])])]),t._v(" "),a("h2",{attrs:{id:"基准测试详情"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#基准测试详情"}},[t._v("#")]),t._v(" 基准测试详情")]),t._v(" "),a("h3",{attrs:{id:"硬件环境"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#硬件环境"}},[t._v("#")]),t._v(" 硬件环境")]),t._v(" "),a("p",[t._v("后端服务所在服务器:")]),t._v(" "),a("p",[t._v("4核8G内存")]),t._v(" "),a("p",[t._v("Intel(R) Xeon(R) CPU X5675 @ 3.07GHz * 4")]),t._v(" "),a("p",[t._v("Linux version 3.10.0-327.el7.x86_64")]),t._v(" "),a("p",[t._v("节点所在服务器:")]),t._v(" "),a("p",[t._v("4核8G内存")]),t._v(" "),a("p",[t._v("Intel(R) Xeon(R) CPU X5675 @ 3.07GHz * 4")]),t._v(" "),a("p",[t._v("Linux version 3.10.0-327.el7.x86_64")]),t._v(" "),a("p",[t._v("压测程序所在服务器:")]),t._v(" "),a("p",[t._v("4核8G内存")]),t._v(" "),a("p",[t._v("Intel(R) Xeon(R) CPU X5675 @ 3.07GHz * 4")]),t._v(" "),a("p",[t._v("Linux version 3.10.0-327.el7.x86_64")]),t._v(" "),a("h3",{attrs:{id:"压测工具"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#压测工具"}},[t._v("#")]),t._v(" 压测工具")]),t._v(" "),a("p",[t._v("压测软件:wrk")]),t._v(" "),a("p",[t._v("并发连接: 100")]),t._v(" "),a("h3",{attrs:{id:"压测结果截图"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#压测结果截图"}},[t._v("#")]),t._v(" 压测结果截图")]),t._v(" "),a("ul",[a("li",[a("p",[t._v("直接访问后端服务:\n"),a("img",{attrs:{src:"/fizz-gateway-community/benchmark_backend.png",alt:""}})])]),t._v(" "),a("li",[a("p",[t._v("fizz-gateway:\n"),a("img",{attrs:{src:"/fizz-gateway-community/benchmark_fizz.png",alt:""}})])]),t._v(" "),a("li",[a("p",[t._v("spring-cloud-gateway:\n"),a("img",{attrs:{src:"/fizz-gateway-community/benchmark_scgw.png",alt:""}})])])])])}),[],!1,null,null,null);_.default=e.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/12.f815cfa2.js b/docs/assets/js/12.61089982.js similarity index 99% rename from docs/assets/js/12.f815cfa2.js rename to docs/assets/js/12.61089982.js index a491aed..f96114d 100644 --- a/docs/assets/js/12.f815cfa2.js +++ b/docs/assets/js/12.61089982.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[12],{359:function(a,t,s){"use strict";s.r(t);var e=s(42),r=Object(e.a)({},(function(){var a=this,t=a.$createElement,s=a._self._c||t;return s("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[s("h2",{attrs:{id:"安装依赖"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#安装依赖"}},[a._v("#")]),a._v(" 安装依赖")]),a._v(" "),s("p",[a._v("安装以下依赖软件:")]),a._v(" "),s("ul",[s("li",[a._v("Redis 2.8或以上版本")]),a._v(" "),s("li",[a._v("MySQL 5.7或以上版本")]),a._v(" "),s("li",[a._v("Apollo配置中心 (可选)")]),a._v(" "),s("li",[a._v("Eureka服务注册中心")])]),a._v(" "),s("h3",{attrs:{id:"安装mysql"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#安装mysql"}},[a._v("#")]),a._v(" 安装MySQL")]),a._v(" "),s("ul",[s("li",[a._v("操作系统 CentOS 6.5")]),a._v(" "),s("li",[a._v("MySQL 5.7.30")])]),a._v(" "),s("ol",[s("li",[a._v("下载MySQL")])]),a._v(" "),s("div",{staticClass:"language-shell extra-class"},[s("pre",{pre:!0,attrs:{class:"language-shell"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[a._v("wget")]),a._v(" https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.30-1.el6.x86_64.rpm-bundle.tar\n")])])]),s("ol",{attrs:{start:"2"}},[s("li",[a._v("解压")])]),a._v(" "),s("div",{staticClass:"language-shell extra-class"},[s("pre",{pre:!0,attrs:{class:"language-shell"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[a._v("tar")]),a._v(" -xvf mysql-5.7.30-1.el6.x86_64.rpm-bundle.tar\n")])])]),s("ol",{attrs:{start:"3"}},[s("li",[a._v("安装")])]),a._v(" "),s("div",{staticClass:"language-shell extra-class"},[s("pre",{pre:!0,attrs:{class:"language-shell"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" yum "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("install")]),a._v(" mysql-community-"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("server,client,common,libs"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("-*\n")])])]),s("ol",{attrs:{start:"4"}},[s("li",[a._v("启动")])]),a._v(" "),s("div",{staticClass:"language-shell extra-class"},[s("pre",{pre:!0,attrs:{class:"language-shell"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("service")]),a._v(" mysqld start\n")])])]),s("p",[a._v("启动成功会显示以下信息:")]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("[root@localhost ~]# sudo service mysqld start\nInitializing MySQL database: [ OK ]\nStarting mysqld: [ OK ]\n")])])]),s("ol",{attrs:{start:"5"}},[s("li",[a._v("初始密码")])]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("sudo grep 'temporary password' /var/log/mysqld.log\n")])])]),s("ol",{attrs:{start:"6"}},[s("li",[a._v("使用初始密码登录")])]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("mysql -uroot -p\n")])])]),s("ol",{attrs:{start:"7"}},[s("li",[a._v("修改密码")])]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass4!';\n")])])]),s("ol",{attrs:{start:"8"}},[s("li",[a._v("退出登录")])]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("quit\n")])])]),s("h3",{attrs:{id:"安装redis-6-0-8"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#安装redis-6-0-8"}},[a._v("#")]),a._v(" 安装Redis 6.0.8")]),a._v(" "),s("ol",[s("li",[a._v("下载解压并编译")])]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("$ wget http://download.redis.io/releases/redis-6.0.8.tar.gz\n$ tar xzf redis-6.0.8.tar.gz\n$ cd redis-6.0.8\n$ make\n")])])]),s("ol",{attrs:{start:"2"}},[s("li",[a._v("启动redis")])]),a._v(" "),s("p",[a._v("运行编译后的文件:")]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("$ src/redis-server\n")])])]),s("ol",{attrs:{start:"3"}},[s("li",[a._v("客户端连接")])]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v('$ src/redis-cli\nredis> set foo bar\nOK\nredis> get foo\n"bar"\n')])])]),s("h3",{attrs:{id:"安装apollo配置中心"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#安装apollo配置中心"}},[a._v("#")]),a._v(" 安装Apollo配置中心")]),a._v(" "),s("p",[a._v("说明: apollo是可选组件,如果不使用apollo可使用本地配置文件(application.yml), 如果不使用apollo可跳过此步骤。")]),a._v(" "),s("p",[a._v("安装步骤详见apollo官方文档: "),s("a",{attrs:{href:"https://github.com/ctripcorp/apollo/wiki/Quick-Start",target:"_blank",rel:"noopener noreferrer"}},[s("OutboundLink")],1)]),a._v(" "),s("h3",{attrs:{id:"安装eureka服务注册中心"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#安装eureka服务注册中心"}},[a._v("#")]),a._v(" 安装Eureka服务注册中心")]),a._v(" "),s("p",[a._v("环境要求:")]),a._v(" "),s("ul",[s("li",[a._v("JDK 1.8 或以上版本")]),a._v(" "),s("li",[a._v("Tomcat 6.0.10 或以上版本 (如使用spring cloud已内置)")])]),a._v(" "),s("ol",[s("li",[a._v("安装JDK 1.8")])]),a._v(" "),s("p",[a._v("1)下载JDK,如: jdk-8u192-linux-x64.tar.gz")]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("tar -zxvf jdk-8u192-linux-x64.tar.gz\nmv jdk1.8.0_192 /usr/local/\n\n")])])]),s("p",[a._v("2)设置JDK环境变量,将下面内容追回到/etc/profile文件后面")]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("JAVA_HOME=/usr/local/jdk/jdk1.8.0_192\nJRE_HOME=$JAVA_HOME/jre\nPATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin\nCLASSPATH=:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib/dt.jar\nexport JAVA_HOME JRE_HOME PATH CLASSPATH\n\n")])])]),s("p",[a._v("3)执行以下命令全环境变量生效:")]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("source /etc/profile\n\n")])])]),s("p",[a._v("4)查看是否安装成功")]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("java -version\n")])])]),s("ol",{attrs:{start:"2"}},[s("li",[a._v("安装eureka")])]),a._v(" "),s("p",[a._v("1)使用IDE创建一个spring boot项目,如:sc-eureka-server")]),a._v(" "),s("p",[a._v("pom.xml:")]),a._v(" "),s("div",{staticClass:"language-xml extra-class"},[s("pre",{pre:!0,attrs:{class:"language-xml"}},[s("code",[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("<")]),a._v("dependency")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(">")])]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("<")]),a._v("groupId")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(">")])]),a._v("org.springframework.cloud"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("")])]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("<")]),a._v("artifactId")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(">")])]),a._v("spring-cloud-starter-netflix-eureka-server"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("")])]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("")])]),a._v("\n")])])]),s("p",[a._v("在启动类上添加@EnableEurekaServer注解来启用Euerka注册中心功能:")]),a._v(" "),s("div",{staticClass:"language-java extra-class"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[a._v("@SpringBootApplication")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[a._v("@EnableEurekaServer")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("public")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("class")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[a._v("ScEurekaServerApplication")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n\n\t"),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("public")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("static")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("void")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("main")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[a._v("String")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v(" args"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n\t\t"),s("span",{pre:!0,attrs:{class:"token class-name"}},[a._v("SpringApplication")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("run")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[a._v("ScEurekaServerApplication")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("class")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v(" args"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])]),s("p",[a._v("application.properties配置文件:")]),a._v(" "),s("div",{staticClass:"language-properties extra-class"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token attr-name"}},[a._v("spring.application.name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[a._v("sc-eureka-server")]),a._v("\n\n"),s("span",{pre:!0,attrs:{class:"token attr-name"}},[a._v("server.port")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[a._v("8761")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token attr-name"}},[a._v("eureka.instance.hostname")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[a._v("localhost")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token attr-name"}},[a._v("eureka.client.registerWithEureka")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[a._v("false")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token attr-name"}},[a._v("eureka.client.fetchRegistry")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[a._v("false")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token attr-name"}},[a._v("eureka.server.enableSelfPreservation")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[a._v("false")]),a._v("\n")])])]),s("p",[a._v("2) maven构建并运行sc-eureka-server应用, 启动后访问地址http://localhost:8761/可以看到Eureka注册中心的界面")]),a._v(" "),s("p",[a._v("3)把target/sc-eureka-server-1.0.0.jar传到linux服务器上运行. (仅以单机部署为例)")]),a._v(" "),s("div",{staticClass:"language-shell extra-class"},[s("pre",{pre:!0,attrs:{class:"language-shell"}},[s("code",[a._v("nohub java -jar sc-eureka-server-1.0.0.jar "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("&")]),a._v(" \n")])])]),s("p",[a._v("4)eureka客户端的注册地址为:http://localhost:8761/eureka/ (替换localhost为服务器的IP)")]),a._v(" "),s("div",{staticClass:"language-properties extra-class"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token attr-name"}},[a._v("eureka.client.serviceUrl.defaultZone")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("=")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token attr-value"}},[a._v("http://localhost:8761/eureka/")]),a._v("\n")])])]),s("h2",{attrs:{id:"安装fizz"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#安装fizz"}},[a._v("#")]),a._v(" 安装Fizz")]),a._v(" "),s("h3",{attrs:{id:"管理后台"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#管理后台"}},[a._v("#")]),a._v(" 管理后台")]),a._v(" "),s("p",[a._v("从github的releases(https://github.com/wehotel/fizz-gateway-community/releases)下载 fizz-manager-professional 和 fizz-admin-professional 的安装包")]),a._v(" "),s("ul",[s("li",[a._v("管理后台服务端(fizz-manager-professional)")])]),a._v(" "),s("ol",[s("li",[a._v("首次安装执行"),s("code",[a._v("fizz-manager-professional-1.1.0-mysql.sql")]),a._v("数据库脚本,低版本升级执行"),s("code",[a._v("update")]),a._v("目录下的升级脚本")]),a._v(" "),s("li",[a._v("将"),s("code",[a._v("application-prod.yml")]),a._v("、"),s("code",[a._v("boot.sh")]),a._v("、"),s("code",[a._v("fizz-manager-professional-1.1.0.jar")]),a._v("拷贝到"),s("code",[a._v("/data/webapps/fizz-manager-professional")]),a._v("目录下")]),a._v(" "),s("li",[a._v("修改"),s("code",[a._v("application-prod.yml")]),a._v("文件,将相关配置修改成部署环境的配置")]),a._v(" "),s("li",[a._v("修改"),s("code",[a._v("boot.sh")]),a._v("文件,将"),s("code",[a._v("RUN_CMD")]),a._v("变量值修改成部署环境的JAVA实际路径")]),a._v(" "),s("li",[a._v("执行 "),s("code",[a._v("chmod +x boot.sh")]),a._v(" 命令给"),s("code",[a._v("boot.sh")]),a._v("增加执行权限")]),a._v(" "),s("li",[a._v("执行 "),s("code",[a._v("./boot.sh start")]),a._v(" 命令启动服务,支持 start/stop/restart(升级发布时需要手动kill原进程)/status命令")]),a._v(" "),s("li",[a._v("服务启动后访问前端登录地址,使用超级管理员账户"),s("code",[a._v("admin")]),a._v("密码"),s("code",[a._v("Aa123!")]),a._v("登录")])]),a._v(" "),s("ul",[s("li",[a._v("管理后台前端(fizz-admin-professional)")])]),a._v(" "),s("p",[a._v("zip资源包解压后,取文件夹【fizzAdmin】放置于服务器静态数据存放目录 如:/home/data/")]),a._v(" "),s("p",[a._v("nginx配置")]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("server {\n listen 9000;\n server_name localhost:9000;\n location / {\n root /home/data/fizzAdmin;\n }\n location ^~ /api {\n rewrite ^/api/(.*) /$1 break;\n proxy_pass http://127.0.0.1:8000;\n }\n}\n\n# 注:root中地址需与资源包存放目录路径一致\n# 注:http://127.0.0.1:8000 为管理后台(fizz-manager-professional)的访问地址\n")])])]),s("p",[a._v("访问地址")]),a._v(" "),s("p",[a._v("【资源部署服务器IP + 端口号】如:http://127.0.0.1:9000/")]),a._v(" "),s("p",[a._v("(端口号与nginx配置端口号一致)")]),a._v(" "),s("h3",{attrs:{id:"fizz-gateway-community社区版"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#fizz-gateway-community社区版"}},[a._v("#")]),a._v(" fizz-gateway-community社区版")]),a._v(" "),s("p",[a._v("说明:如果使用apollo配置中心,可把application.yml文件内容迁到配置中心(apollo上应用名为:fizz-gateway);使用不使用apollo可去掉下面启动命令里的apollo参数。")]),a._v(" "),s("p",[a._v("脚本启动:")]),a._v(" "),s("ol",[s("li",[a._v("下载fizz-gateway-community的最新代码,修改application.yml配置文件里eureka、redis的配置,使用maven构建好并把构建好的fizz-gateway-community-1.0.0.jar和boot.sh放同一目录")]),a._v(" "),s("li",[a._v("修改boot.sh脚本的apollo连接,JVM内存配置,")]),a._v(" "),s("li",[a._v("执行 "),s("code",[a._v("./boot.sh start")]),a._v(" 命令启动服务,支持 start/stop/restart/status命令")])]),a._v(" "),s("p",[a._v("IDE启动:")]),a._v(" "),s("ol",[s("li",[a._v("本地clone仓库上的最新代码")]),a._v(" "),s("li",[a._v("将项目fizz-gateway导入IDE")]),a._v(" "),s("li",[a._v("导入完成后设置项目启动配置及修改application.yml配置文件里eureka、redis的配置,在VM选项中加入"),s("code",[a._v("-Denv=dev -Dapollo.meta=http://localhost:66")]),a._v("(Apollo配置中心地址)")])]),a._v(" "),s("p",[a._v("jar启动:")]),a._v(" "),s("ol",[s("li",[a._v("本地clone仓库上的最新代码,修改application.yml配置文件里eureka、redis的配置")]),a._v(" "),s("li",[a._v("在项目根目录fizz-gateway-community下执行Maven命令"),s("code",[a._v("mvn clean package -DskipTests=true")]),a._v("打包")]),a._v(" "),s("li",[a._v("进入target目录,使用命令"),s("code",[a._v("java -jar -Denv=DEV -Dapollo.meta=http://localhost:66 fizz-gateway-community-1.0.0.jar")]),a._v("启动服务")])]),a._v(" "),s("p",[a._v("网关访问地址格式:")]),a._v(" "),s("p",[a._v("http://127.0.0.1:8600/proxy/[服务名]/[API Path]")])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[12],{356:function(a,t,s){"use strict";s.r(t);var e=s(42),r=Object(e.a)({},(function(){var a=this,t=a.$createElement,s=a._self._c||t;return s("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[s("h2",{attrs:{id:"安装依赖"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#安装依赖"}},[a._v("#")]),a._v(" 安装依赖")]),a._v(" "),s("p",[a._v("安装以下依赖软件:")]),a._v(" "),s("ul",[s("li",[a._v("Redis 2.8或以上版本")]),a._v(" "),s("li",[a._v("MySQL 5.7或以上版本")]),a._v(" "),s("li",[a._v("Apollo配置中心 (可选)")]),a._v(" "),s("li",[a._v("Eureka服务注册中心")])]),a._v(" "),s("h3",{attrs:{id:"安装mysql"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#安装mysql"}},[a._v("#")]),a._v(" 安装MySQL")]),a._v(" "),s("ul",[s("li",[a._v("操作系统 CentOS 6.5")]),a._v(" "),s("li",[a._v("MySQL 5.7.30")])]),a._v(" "),s("ol",[s("li",[a._v("下载MySQL")])]),a._v(" "),s("div",{staticClass:"language-shell extra-class"},[s("pre",{pre:!0,attrs:{class:"language-shell"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[a._v("wget")]),a._v(" https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.30-1.el6.x86_64.rpm-bundle.tar\n")])])]),s("ol",{attrs:{start:"2"}},[s("li",[a._v("解压")])]),a._v(" "),s("div",{staticClass:"language-shell extra-class"},[s("pre",{pre:!0,attrs:{class:"language-shell"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[a._v("tar")]),a._v(" -xvf mysql-5.7.30-1.el6.x86_64.rpm-bundle.tar\n")])])]),s("ol",{attrs:{start:"3"}},[s("li",[a._v("安装")])]),a._v(" "),s("div",{staticClass:"language-shell extra-class"},[s("pre",{pre:!0,attrs:{class:"language-shell"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" yum "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("install")]),a._v(" mysql-community-"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("server,client,common,libs"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("-*\n")])])]),s("ol",{attrs:{start:"4"}},[s("li",[a._v("启动")])]),a._v(" "),s("div",{staticClass:"language-shell extra-class"},[s("pre",{pre:!0,attrs:{class:"language-shell"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("service")]),a._v(" mysqld start\n")])])]),s("p",[a._v("启动成功会显示以下信息:")]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("[root@localhost ~]# sudo service mysqld start\nInitializing MySQL database: [ OK ]\nStarting mysqld: [ OK ]\n")])])]),s("ol",{attrs:{start:"5"}},[s("li",[a._v("初始密码")])]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("sudo grep 'temporary password' /var/log/mysqld.log\n")])])]),s("ol",{attrs:{start:"6"}},[s("li",[a._v("使用初始密码登录")])]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("mysql -uroot -p\n")])])]),s("ol",{attrs:{start:"7"}},[s("li",[a._v("修改密码")])]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass4!';\n")])])]),s("ol",{attrs:{start:"8"}},[s("li",[a._v("退出登录")])]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("quit\n")])])]),s("h3",{attrs:{id:"安装redis-6-0-8"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#安装redis-6-0-8"}},[a._v("#")]),a._v(" 安装Redis 6.0.8")]),a._v(" "),s("ol",[s("li",[a._v("下载解压并编译")])]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("$ wget http://download.redis.io/releases/redis-6.0.8.tar.gz\n$ tar xzf redis-6.0.8.tar.gz\n$ cd redis-6.0.8\n$ make\n")])])]),s("ol",{attrs:{start:"2"}},[s("li",[a._v("启动redis")])]),a._v(" "),s("p",[a._v("运行编译后的文件:")]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("$ src/redis-server\n")])])]),s("ol",{attrs:{start:"3"}},[s("li",[a._v("客户端连接")])]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v('$ src/redis-cli\nredis> set foo bar\nOK\nredis> get foo\n"bar"\n')])])]),s("h3",{attrs:{id:"安装apollo配置中心"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#安装apollo配置中心"}},[a._v("#")]),a._v(" 安装Apollo配置中心")]),a._v(" "),s("p",[a._v("说明: apollo是可选组件,如果不使用apollo可使用本地配置文件(application.yml), 如果不使用apollo可跳过此步骤。")]),a._v(" "),s("p",[a._v("安装步骤详见apollo官方文档: "),s("a",{attrs:{href:"https://github.com/ctripcorp/apollo/wiki/Quick-Start",target:"_blank",rel:"noopener noreferrer"}},[s("OutboundLink")],1)]),a._v(" "),s("h3",{attrs:{id:"安装eureka服务注册中心"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#安装eureka服务注册中心"}},[a._v("#")]),a._v(" 安装Eureka服务注册中心")]),a._v(" "),s("p",[a._v("环境要求:")]),a._v(" "),s("ul",[s("li",[a._v("JDK 1.8 或以上版本")]),a._v(" "),s("li",[a._v("Tomcat 6.0.10 或以上版本 (如使用spring cloud已内置)")])]),a._v(" "),s("ol",[s("li",[a._v("安装JDK 1.8")])]),a._v(" "),s("p",[a._v("1)下载JDK,如: jdk-8u192-linux-x64.tar.gz")]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("tar -zxvf jdk-8u192-linux-x64.tar.gz\nmv jdk1.8.0_192 /usr/local/\n\n")])])]),s("p",[a._v("2)设置JDK环境变量,将下面内容追回到/etc/profile文件后面")]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("JAVA_HOME=/usr/local/jdk/jdk1.8.0_192\nJRE_HOME=$JAVA_HOME/jre\nPATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin\nCLASSPATH=:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib/dt.jar\nexport JAVA_HOME JRE_HOME PATH CLASSPATH\n\n")])])]),s("p",[a._v("3)执行以下命令全环境变量生效:")]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("source /etc/profile\n\n")])])]),s("p",[a._v("4)查看是否安装成功")]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("java -version\n")])])]),s("ol",{attrs:{start:"2"}},[s("li",[a._v("安装eureka")])]),a._v(" "),s("p",[a._v("1)使用IDE创建一个spring boot项目,如:sc-eureka-server")]),a._v(" "),s("p",[a._v("pom.xml:")]),a._v(" "),s("div",{staticClass:"language-xml extra-class"},[s("pre",{pre:!0,attrs:{class:"language-xml"}},[s("code",[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("<")]),a._v("dependency")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(">")])]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("<")]),a._v("groupId")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(">")])]),a._v("org.springframework.cloud"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("")])]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("<")]),a._v("artifactId")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(">")])]),a._v("spring-cloud-starter-netflix-eureka-server"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("")])]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("")])]),a._v("\n")])])]),s("p",[a._v("在启动类上添加@EnableEurekaServer注解来启用Euerka注册中心功能:")]),a._v(" "),s("div",{staticClass:"language-java extra-class"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[a._v("@SpringBootApplication")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[a._v("@EnableEurekaServer")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("public")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("class")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[a._v("ScEurekaServerApplication")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n\n\t"),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("public")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("static")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("void")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("main")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[a._v("String")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v(" args"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n\t\t"),s("span",{pre:!0,attrs:{class:"token class-name"}},[a._v("SpringApplication")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("run")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[a._v("ScEurekaServerApplication")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("class")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v(" args"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])]),s("p",[a._v("application.properties配置文件:")]),a._v(" "),s("div",{staticClass:"language-properties extra-class"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token attr-name"}},[a._v("spring.application.name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[a._v("sc-eureka-server")]),a._v("\n\n"),s("span",{pre:!0,attrs:{class:"token attr-name"}},[a._v("server.port")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[a._v("8761")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token attr-name"}},[a._v("eureka.instance.hostname")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[a._v("localhost")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token attr-name"}},[a._v("eureka.client.registerWithEureka")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[a._v("false")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token attr-name"}},[a._v("eureka.client.fetchRegistry")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[a._v("false")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token attr-name"}},[a._v("eureka.server.enableSelfPreservation")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[a._v("false")]),a._v("\n")])])]),s("p",[a._v("2) maven构建并运行sc-eureka-server应用, 启动后访问地址http://localhost:8761/可以看到Eureka注册中心的界面")]),a._v(" "),s("p",[a._v("3)把target/sc-eureka-server-1.0.0.jar传到linux服务器上运行. (仅以单机部署为例)")]),a._v(" "),s("div",{staticClass:"language-shell extra-class"},[s("pre",{pre:!0,attrs:{class:"language-shell"}},[s("code",[a._v("nohub java -jar sc-eureka-server-1.0.0.jar "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("&")]),a._v(" \n")])])]),s("p",[a._v("4)eureka客户端的注册地址为:http://localhost:8761/eureka/ (替换localhost为服务器的IP)")]),a._v(" "),s("div",{staticClass:"language-properties extra-class"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token attr-name"}},[a._v("eureka.client.serviceUrl.defaultZone")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("=")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token attr-value"}},[a._v("http://localhost:8761/eureka/")]),a._v("\n")])])]),s("h2",{attrs:{id:"安装fizz"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#安装fizz"}},[a._v("#")]),a._v(" 安装Fizz")]),a._v(" "),s("h3",{attrs:{id:"管理后台"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#管理后台"}},[a._v("#")]),a._v(" 管理后台")]),a._v(" "),s("p",[a._v("从github的releases(https://github.com/wehotel/fizz-gateway-community/releases)下载 fizz-manager-professional 和 fizz-admin-professional 的安装包")]),a._v(" "),s("ul",[s("li",[a._v("管理后台服务端(fizz-manager-professional)")])]),a._v(" "),s("ol",[s("li",[a._v("首次安装执行"),s("code",[a._v("fizz-manager-professional-1.1.0-mysql.sql")]),a._v("数据库脚本,低版本升级执行"),s("code",[a._v("update")]),a._v("目录下的升级脚本")]),a._v(" "),s("li",[a._v("将"),s("code",[a._v("application-prod.yml")]),a._v("、"),s("code",[a._v("boot.sh")]),a._v("、"),s("code",[a._v("fizz-manager-professional-1.1.0.jar")]),a._v("拷贝到"),s("code",[a._v("/data/webapps/fizz-manager-professional")]),a._v("目录下")]),a._v(" "),s("li",[a._v("修改"),s("code",[a._v("application-prod.yml")]),a._v("文件,将相关配置修改成部署环境的配置")]),a._v(" "),s("li",[a._v("修改"),s("code",[a._v("boot.sh")]),a._v("文件,将"),s("code",[a._v("RUN_CMD")]),a._v("变量值修改成部署环境的JAVA实际路径")]),a._v(" "),s("li",[a._v("执行 "),s("code",[a._v("chmod +x boot.sh")]),a._v(" 命令给"),s("code",[a._v("boot.sh")]),a._v("增加执行权限")]),a._v(" "),s("li",[a._v("执行 "),s("code",[a._v("./boot.sh start")]),a._v(" 命令启动服务,支持 start/stop/restart(升级发布时需要手动kill原进程)/status命令")]),a._v(" "),s("li",[a._v("服务启动后访问前端登录地址,使用超级管理员账户"),s("code",[a._v("admin")]),a._v("密码"),s("code",[a._v("Aa123!")]),a._v("登录")])]),a._v(" "),s("ul",[s("li",[a._v("管理后台前端(fizz-admin-professional)")])]),a._v(" "),s("p",[a._v("zip资源包解压后,取文件夹【fizzAdmin】放置于服务器静态数据存放目录 如:/home/data/")]),a._v(" "),s("p",[a._v("nginx配置")]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("server {\n listen 9000;\n server_name localhost:9000;\n location / {\n root /home/data/fizzAdmin;\n }\n location ^~ /api {\n rewrite ^/api/(.*) /$1 break;\n proxy_pass http://127.0.0.1:8000;\n }\n}\n\n# 注:root中地址需与资源包存放目录路径一致\n# 注:http://127.0.0.1:8000 为管理后台(fizz-manager-professional)的访问地址\n")])])]),s("p",[a._v("访问地址")]),a._v(" "),s("p",[a._v("【资源部署服务器IP + 端口号】如:http://127.0.0.1:9000/")]),a._v(" "),s("p",[a._v("(端口号与nginx配置端口号一致)")]),a._v(" "),s("h3",{attrs:{id:"fizz-gateway-community社区版"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#fizz-gateway-community社区版"}},[a._v("#")]),a._v(" fizz-gateway-community社区版")]),a._v(" "),s("p",[a._v("说明:如果使用apollo配置中心,可把application.yml文件内容迁到配置中心(apollo上应用名为:fizz-gateway);使用不使用apollo可去掉下面启动命令里的apollo参数。")]),a._v(" "),s("p",[a._v("脚本启动:")]),a._v(" "),s("ol",[s("li",[a._v("下载fizz-gateway-community的最新代码,修改application.yml配置文件里eureka、redis的配置,使用maven构建好并把构建好的fizz-gateway-community-1.0.0.jar和boot.sh放同一目录")]),a._v(" "),s("li",[a._v("修改boot.sh脚本的apollo连接,JVM内存配置,")]),a._v(" "),s("li",[a._v("执行 "),s("code",[a._v("./boot.sh start")]),a._v(" 命令启动服务,支持 start/stop/restart/status命令")])]),a._v(" "),s("p",[a._v("IDE启动:")]),a._v(" "),s("ol",[s("li",[a._v("本地clone仓库上的最新代码")]),a._v(" "),s("li",[a._v("将项目fizz-gateway导入IDE")]),a._v(" "),s("li",[a._v("导入完成后设置项目启动配置及修改application.yml配置文件里eureka、redis的配置,在VM选项中加入"),s("code",[a._v("-Denv=dev -Dapollo.meta=http://localhost:66")]),a._v("(Apollo配置中心地址)")])]),a._v(" "),s("p",[a._v("jar启动:")]),a._v(" "),s("ol",[s("li",[a._v("本地clone仓库上的最新代码,修改application.yml配置文件里eureka、redis的配置")]),a._v(" "),s("li",[a._v("在项目根目录fizz-gateway-community下执行Maven命令"),s("code",[a._v("mvn clean package -DskipTests=true")]),a._v("打包")]),a._v(" "),s("li",[a._v("进入target目录,使用命令"),s("code",[a._v("java -jar -Denv=DEV -Dapollo.meta=http://localhost:66 fizz-gateway-community-1.0.0.jar")]),a._v("启动服务")])]),a._v(" "),s("p",[a._v("网关访问地址格式:")]),a._v(" "),s("p",[a._v("http://127.0.0.1:8600/proxy/[服务名]/[API Path]")])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/13.e5742833.js b/docs/assets/js/13.e5742833.js deleted file mode 100644 index e2682a3..0000000 --- a/docs/assets/js/13.e5742833.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[13],{364:function(t,a,i){"use strict";i.r(a);var v=i(42),_=Object(v.a)({},(function(){var t=this,a=t.$createElement,i=t._self._c||a;return i("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[i("h2",{attrs:{id:"什么是fizz网关"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#什么是fizz网关"}},[t._v("#")]),t._v(" 什么是Fizz网关")]),t._v(" "),i("p",[t._v("A Managerment API Gateway in Java . Fizz Gateway 是一个基于 Java开发的微服务网关,能够实现热服务编排、自动授权选择、线上服务脚本编码、在线测试、高性能路由、API审核管理等目的,拥有强大的自定义插件系统可以自行扩展,并且提供友好的图形化配置界面,能够快速帮助企业进行API服务治理、减少中间层胶水代码以及降低编码投入、提高 API 服务的稳定性和安全性。")]),t._v(" "),i("h2",{attrs:{id:"fizz的设计"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#fizz的设计"}},[t._v("#")]),t._v(" Fizz的设计")]),t._v(" "),i("p",[i("img",{attrs:{src:"/fizz-gateway-community/fizz_design.png",alt:""}})]),t._v(" "),i("h2",{attrs:{id:"产品特性"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#产品特性"}},[t._v("#")]),t._v(" 产品特性")]),t._v(" "),i("ul",[i("li",[t._v("集群管理:Fizz网关节点是无状态的,配置信息自动同步,支持节点水平拓展和多集群部署。")]),t._v(" "),i("li",[t._v("服务编排:支持热服务编排能力,支持前后端编码,随时随地更新API。")]),t._v(" "),i("li",[t._v("负载均衡:支持round-robin负载均衡。")]),t._v(" "),i("li",[t._v("服务发现:支持从Eureka注册中心发现后端服务器。")]),t._v(" "),i("li",[t._v("配置中心:支持接入apollo配置中心。")]),t._v(" "),i("li",[t._v("HTTP反向代理:隐藏真实后端服务,支持 Rest API反向代理。")]),t._v(" "),i("li",[t._v("访问策略:支持不同策略访问不同的API、配置不同的鉴权等。")]),t._v(" "),i("li",[t._v("IP黑白名单:支持配置IP黑白名单。")]),t._v(" "),i("li",[t._v("自定义插件:强大的插件机制支持自由扩展。")]),t._v(" "),i("li",[t._v("可扩展:简单易用的插件机制方便扩展功能。")]),t._v(" "),i("li",[t._v("高性能:性能在众多网关之中表现优异。")]),t._v(" "),i("li",[t._v("版本控制:支持操作的发布和多次回滚。")]),t._v(" "),i("li",[t._v("管理后台:通过管理后台界面对网关集群进行各项配置。")])])])}),[],!1,null,null,null);a.default=_.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/13.fdb2bea3.js b/docs/assets/js/13.fdb2bea3.js new file mode 100644 index 0000000..f765695 --- /dev/null +++ b/docs/assets/js/13.fdb2bea3.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[13],{361:function(t,a,v){"use strict";v.r(a);var i=v(42),_=Object(i.a)({},(function(){var t=this,a=t.$createElement,v=t._self._c||a;return v("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[v("h2",{attrs:{id:"什么是fizz网关"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#什么是fizz网关"}},[t._v("#")]),t._v(" 什么是Fizz网关")]),t._v(" "),v("p",[t._v("A Managerment API Gateway in Java . Fizz Gateway 是一个基于 Java开发的微服务网关,能够实现热服务编排、自动授权选择、线上服务脚本编码、在线测试、高性能路由、API审核管理等目的,拥有强大的自定义插件系统可以自行扩展,并且提供友好的图形化配置界面,能够快速帮助企业进行API服务治理、减少中间层胶水代码以及降低编码投入、提高 API 服务的稳定性和安全性。")]),t._v(" "),v("h2",{attrs:{id:"fizz的设计"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#fizz的设计"}},[t._v("#")]),t._v(" Fizz的设计")]),t._v(" "),v("p",[v("img",{attrs:{src:"/fizz_design.png",alt:""}})]),t._v(" "),v("h2",{attrs:{id:"产品特性"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#产品特性"}},[t._v("#")]),t._v(" 产品特性")]),t._v(" "),v("ul",[v("li",[t._v("集群管理:Fizz网关节点是无状态的,配置信息自动同步,支持节点水平拓展和多集群部署。")]),t._v(" "),v("li",[t._v("服务编排:支持热服务编排能力,支持前后端编码,随时随地更新API。")]),t._v(" "),v("li",[t._v("负载均衡:支持round-robin负载均衡。")]),t._v(" "),v("li",[t._v("服务发现:支持从Eureka注册中心发现后端服务器。")]),t._v(" "),v("li",[t._v("配置中心:支持接入apollo配置中心。")]),t._v(" "),v("li",[t._v("HTTP反向代理:隐藏真实后端服务,支持 Rest API反向代理。")]),t._v(" "),v("li",[t._v("访问策略:支持不同策略访问不同的API、配置不同的鉴权等。")]),t._v(" "),v("li",[t._v("IP黑白名单:支持配置IP黑白名单。")]),t._v(" "),v("li",[t._v("自定义插件:强大的插件机制支持自由扩展。")]),t._v(" "),v("li",[t._v("可扩展:简单易用的插件机制方便扩展功能。")]),t._v(" "),v("li",[t._v("高性能:性能在众多网关之中表现优异。")]),t._v(" "),v("li",[t._v("版本控制:支持操作的发布和多次回滚。")]),t._v(" "),v("li",[t._v("管理后台:通过管理后台界面对网关集群进行各项配置。")])])])}),[],!1,null,null,null);a.default=_.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/14.62d9a88b.js b/docs/assets/js/14.62d9a88b.js new file mode 100644 index 0000000..9678218 --- /dev/null +++ b/docs/assets/js/14.62d9a88b.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[14],{360:function(a,t,s){"use strict";s.r(t);var r=s(42),e=Object(r.a)({},(function(){var a=this,t=a.$createElement,s=a._self._c||t;return s("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[s("h2",{attrs:{id:"概述"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[a._v("#")]),a._v(" 概述")]),a._v(" "),s("p",[a._v("接口列表功能用于维护聚合接口,聚合接口从外部调用方角度看是一个简单的接口,通过入参请求获取响应结果,内部实现会调用多个底层后端服务,将多个调用结果聚合转换成外部调用方想要的数据格式,更多详情请查看服务编排介绍,下面介绍接口列表功能的操作。")]),a._v(" "),s("h2",{attrs:{id:"接口列表"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#接口列表"}},[a._v("#")]),a._v(" 接口列表")]),a._v(" "),s("p",[a._v("菜单位置:服务编排 > 接口列表。点击菜单后进入接口列表页面,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_list_query.png",alt:"manager_aggregate_list_query"}})]),a._v(" "),s("h2",{attrs:{id:"新增接口"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#新增接口"}},[a._v("#")]),a._v(" 新增接口")]),a._v(" "),s("p",[a._v("点击 新增 按钮弹出新增窗口,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_add_1.png",alt:"manager_aggregate_add_1"}})]),a._v(" "),s("h3",{attrs:{id:"基础信息"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#基础信息"}},[a._v("#")]),a._v(" 基础信息")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_add_2.png",alt:"manager_aggregate_add_2"}})]),a._v(" "),s("p",[a._v("所属服务:接口所属服务,更多详情请查看服务管理功能介绍,必选;")]),a._v(" "),s("p",[a._v("接口名:接口名称,用于展示使用,长度不能超过200个字符,必填;")]),a._v(" "),s("p",[a._v("方法:接口请求方法类型,可选GET|POST,必选;")]),a._v(" "),s("p",[a._v("路径:接口请求路径后缀,长度不能超过2000个字符,必填;")]),a._v(" "),s("p",[a._v("开发人员:接口对应负责的开发人员,长度不能超过200个字符;")]),a._v(" "),s("p",[a._v("描述:接口功能描述,长度不能超过2000个字符;")]),a._v(" "),s("p",[a._v("举个例子,所属服务设置my-test-service,方法设置POST,路径设置test-aggregate-post,对应的聚合接口请求为 POST http://{Fizz网关ip地址}:{port端口}/proxy/my-test-service/test-aggregate-post。")]),a._v(" "),s("h3",{attrs:{id:"配置输入"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置输入"}},[a._v("#")]),a._v(" 配置输入")]),a._v(" "),s("p",[a._v("聚合接口的入参大部分是通过JSON Schema来定义的,下面先简单地介绍下JSON Schema。")]),a._v(" "),s("h4",{attrs:{id:"json-schema介绍"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#json-schema介绍"}},[a._v("#")]),a._v(" JSON Schema介绍")]),a._v(" "),s("p",[a._v("JSON Schema实际上也是JSON数据,用于标注和验证JSON文档,可以类比于XML Schema,当前最新版本2019-09。")]),a._v(" "),s("p",[a._v("作为普通用户,我们并不需要去了解JSON Schema的规范内容,只要能够构建JSON Schema即可。")]),a._v(" "),s("blockquote",[s("p",[a._v("要理解JSON Schema,首先要理解什么是JSON。JSON是JavaScript Object Notation的缩写,一种简单的数据交换格式。最初JSON是基于JavaScript,广泛的应用于万维网。由于其简洁和清晰的层次结构、易于人阅读等特性,使得越来越多的场景下被采用。")]),a._v(" "),s("p",[a._v("JSON包含以下数据结构:")]),a._v(" "),s("ul",[s("li",[a._v("object:"),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"key1"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"value1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"key2"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"value2"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])])]),a._v(" "),s("li",[a._v("array:"),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"first"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"second"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"third"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v("\n")])])])]),a._v(" "),s("li",[a._v("number:"),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token number"}},[a._v("42")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token number"}},[a._v("3.1415926")]),a._v("\n")])])])]),a._v(" "),s("li",[a._v("string:"),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"This is a string"')]),a._v("\n")])])])]),a._v(" "),s("li",[a._v("boolean:"),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token boolean"}},[a._v("true")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token boolean"}},[a._v("false")]),a._v("\n")])])])]),a._v(" "),s("li",[a._v("null:"),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("null")]),a._v("\n")])])])])]),a._v(" "),s("p",[a._v("通过以上的简单数据类型,就能构造复杂的结构化数据了。下面举两个例子:")]),a._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"George Washington"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"birthday"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"February 22, 1732"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"address"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Mount Vernon, Virginia, United States"')]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])]),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"first_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"George"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"last_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Washington"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"birthday"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"1732-02-22"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"address"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"street_address"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"3200 Mount Vernon Memorial Highway"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"city"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Mount Vernon"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"state"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Virginia"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"country"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"United States"')]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])]),s("p",[a._v("以上两个例子都是有效的JSON数据,包含一样的有效信息,但是当程序读取数据时,需要准确的知道数据是怎么组织的,比如哪些字段是必须,这些字段是什么类型。这时候JSON Schema就派上用场了,看以下JSON Schema例子:")]),a._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"object"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"properties"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"first_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"string"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"last_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"string"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"birthday"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"string"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"format"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"date"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"address"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"object"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"properties"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"street_address"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"string"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"city"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"string"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"state"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"string"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"country"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"string"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])]),s("p",[a._v("用以上JSON Schema验证第一个例子时,验证失败;但是第二个例子验证通过。")]),a._v(" "),s("p",[a._v("JSON Schema本身也是通过JSON编写,其本身也是数据,不是一个计算机程序,只是一种“描述其它数据的结构”的声明格式。这既是长处,也是弱点,JSON Schema可以简洁地描述数据的结构并且自动验证数据,但是对于数据元素间的关系表达就力不能及了。")])]),a._v(" "),s("p",[a._v("更多JSON Schema知识可以阅读"),s("a",{attrs:{href:"https://json-schema.org/understanding-json-schema/",target:"_blank",rel:"noopener noreferrer"}},[a._v("Understanding JSON Schema"),s("OutboundLink")],1),a._v("。")]),a._v(" "),s("h4",{attrs:{id:"请求头部"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#请求头部"}},[a._v("#")]),a._v(" 请求头部")]),a._v(" "),s("p",[a._v("定义聚合接口的请求Header参数。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_add_3.png",alt:"manager_aggregate_add_3"}})]),a._v(" "),s("p",[a._v("举个例子:")]),a._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"object"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"properties"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"headerParam1"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"string"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"title"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"请求头参数1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"titleEn"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"headerParam1"')]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"required"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"headerParam1"')]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])]),s("p",[a._v("以上例子定义了必传请求头参数"),s("code",[a._v("headerParam1")]),a._v("。")]),a._v(" "),s("p",[s("code",[a._v("title")]),a._v("字段用于验证失败时提示使用,例如请求接口时没传请求头时会提示“请求头参数1不能为空”(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_add_input_header_1.png",alt:"manager_aggregate_add_input_header_1"}})]),a._v(" "),s("p",[a._v("当定义了语言配置(详情请查看后文的语言配置介绍)选项为英文时会使用"),s("code",[a._v("titleEn")]),a._v("字段用于验证失败时提示使用,例如请求接口时没传请求头时会提示“headerParam1 is missing but it is required”(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_add_input_header_2.png",alt:"manager_aggregate_add_input_header_2"}})]),a._v(" "),s("h4",{attrs:{id:"请求体"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#请求体"}},[a._v("#")]),a._v(" 请求体")]),a._v(" "),s("p",[a._v("定义聚合接口的请求体参数。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_add_4.png",alt:"manager_aggregate_add_4"}})]),a._v(" "),s("p",[a._v("举个例子:")]),a._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"object"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"properties"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"bodyParam1"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"string"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"title"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"请求体参数1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"titleEn"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"bodyParam1"')]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"required"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"bodyParam1"')]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])]),s("p",[a._v("以上例子定义了必传请求体参数"),s("code",[a._v("bodyParam1")]),a._v("。")]),a._v(" "),s("p",[s("code",[a._v("title")]),a._v("字段用于验证失败时提示使用,例如请求接口时没传请求体参数时会提示“请求体参数1不能为空”(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_add_input_body_1.png",alt:"manager_aggregate_add_input_body_1"}})]),a._v(" "),s("p",[a._v("当定义了语言配置(详情请查看后文的语言配置介绍)选项为英文时会使用"),s("code",[a._v("titleEn")]),a._v("字段用于验证失败时提示使用,例如请求接口时没传请求体参数时会提示“bodyParam1 is missing but it is required”(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_add_input_body_2.png",alt:"manager_aggregate_add_input_body_2"}})]),a._v(" "),s("h4",{attrs:{id:"query参数"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#query参数"}},[a._v("#")]),a._v(" Query参数")]),a._v(" "),s("p",[a._v("定义聚合接口的Query参数。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_add_5.png",alt:"manager_aggregate_add_5"}})]),a._v(" "),s("p",[a._v("举个例子:")]),a._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"object"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"properties"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"queryParam1"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"string"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"title"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"query参数1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"titleEn"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"queryParam1"')]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"required"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"queryParam1"')]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])]),s("p",[a._v("以上例子定义了必传Query参数"),s("code",[a._v("queryParam1")]),a._v("。")]),a._v(" "),s("p",[s("code",[a._v("title")]),a._v("字段用于验证失败时提示使用,例如请求接口时没传Query参数时会提示“query参数1不能为空”(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_add_input_query_1.png",alt:"manager_aggregate_add_input_query_1"}})]),a._v(" "),s("p",[a._v("当定义了语言配置(详情请查看后文的语言配置介绍)选项为英文时会使用"),s("code",[a._v("titleEn")]),a._v("字段用于验证失败时提示使用,例如请求接口时没传Query参数时会提示“queryParam1 is missing but it is required”(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_add_input_query_2.png",alt:"manager_aggregate_add_input_query_2"}})]),a._v(" "),s("h4",{attrs:{id:"脚本校验"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#脚本校验"}},[a._v("#")]),a._v(" 脚本校验")]),a._v(" "),s("p",[a._v("对于JSON Schema规范无法覆盖的校验场景可以使用脚本对入参进行更加灵活的处理。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_add_6.png",alt:"manager_aggregate_add_6"}})]),a._v(" "),s("p",[a._v("点击 新增 按钮后弹出脚本配置窗口,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_add_7.png",alt:"manager_aggregate_add_7"}})]),a._v(" "),s("p",[a._v("脚本类型:可选javascript|groovy,必选;")]),a._v(" "),s("p",[a._v("脚本内容:所选的脚本类型语言编写的入参验证脚本,必填。")]),a._v(" "),s("p",[a._v("举个例子:")]),a._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[a._v("// javascript脚本函数名不能修改")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("function")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("dyFunc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[a._v("paramsJsonStr")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[a._v("// 上下文, 数据结构请参考 context.js")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("var")]),a._v(" context "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[a._v("JSON")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("parse")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),a._v("paramsJsonStr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v("'context'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[a._v("// common为内置的上下文便捷操作工具类,详情请参考common.js;例如:")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[a._v("// var data = common.getStepRespBody(context, 'step2', 'request1', 'data');")]),a._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[a._v("// do something")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("var")]),a._v(" headerParam1 "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v(" common"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("getInputReqHeader")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),a._v("context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v("'headerParam1'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("var")]),a._v(" bodyParam1 "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v(" common"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("getInputReqBody")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),a._v("context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v("'bodyParam1'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("var")]),a._v(" queryParam1 "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v(" common"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("getInputReqParam")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),a._v("context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v("'queryParam1'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("var")]),a._v(" result "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("new")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[a._v("Array")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("if")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),a._v("headerParam1 "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("!=")]),a._v(" bodyParam1"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("push")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"headerParam1与bodyParam1不一致"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("if")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),a._v("queryParam1 "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("!=")]),a._v(" bodyParam1"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("push")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"queryParam1与bodyParam1不一致"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("if")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),a._v("headerParam1 "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("!=")]),a._v(" queryParam1"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("push")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"headerParam1与queryParam1不一致"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[a._v("// 返回结果为Array或Object时要先转为json字符串")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("return")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[a._v("JSON")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("stringify")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),a._v("result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n\n")])])]),s("p",[a._v("以上例子使用javascript编写参数校验,限制入参"),s("code",[a._v("headerParam1")]),a._v("、"),s("code",[a._v("bodyParam1")]),a._v("、"),s("code",[a._v("queryParam1")]),a._v("必须一致,不一致将提示错误信息(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_add_input_script.png",alt:"manager_aggregate_add_input_script"}})]),a._v(" "),s("h4",{attrs:{id:"语言配置"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#语言配置"}},[a._v("#")]),a._v(" 语言配置")]),a._v(" "),s("p",[a._v("聚合接口默认使用中文响应校验失败提示,通过配置可通过入参选择不同的提示语言,目前支持中文、英文提示(已满足我们的业务使用场景,有其他语言要求的小伙伴可以联系我们添加)。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_add_8.png",alt:"manager_aggregate_add_8"}})]),a._v(" "),s("p",[a._v("字段:入参字段值,例如"),s("code",[a._v("input.request.body.languageCode")]),a._v("使用请求体参数"),s("code",[a._v("languageCode")]),a._v("的值来决定使用哪种语言;")]),a._v(" "),s("p",[a._v("中文:中文与入参字段值的映射关系,例如配置"),s("code",[a._v("0")]),a._v(",当请求入参字段值为"),s("code",[a._v("0")]),a._v("时使用中文提示校验结果;")]),a._v(" "),s("p",[a._v("英文:英文与入参字段值的映射关系,例如配置"),s("code",[a._v("1")]),a._v(",当请求入参字段值为"),s("code",[a._v("1")]),a._v("时使用中文提示校验结果。")]),a._v(" "),s("h3",{attrs:{id:"配置步骤"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置步骤"}},[a._v("#")]),a._v(" 配置步骤")]),a._v(" "),s("p",[a._v("聚合接口调用底层服务是通过多个step实现的,多个step串行执行,每个step包含多个request(对底层服务接口的调用),同个step里的多个request并行执行,后执行的step可以获取已执行step的执行结果,更多详情请查看服务编排文章的介绍,下面介绍配置步骤的使用。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_add_9.png",alt:"manager_aggregate_add_9"}})]),a._v(" "),s("p",[a._v("是否执行完此步骤后结束:勾选后实际请求只执行完该步骤后即响应结果,不执行后续步骤,用于调试使用;")]),a._v(" "),s("p",[a._v("请求方法:调用底层服务接口的请求类型,可选GET|POST,必选;")]),a._v(" "),s("p",[a._v("默认URL:调用底层服务接口的默认URL,当Fizz网关启动环境没有配置URL时使用该默认URL;")]),a._v(" "),s("p",[a._v("开发环境URL:开发环境调用底层服务接口的URL,当Fizz网关启动使用spring.profiles.active=dev时使用该URL;")]),a._v(" "),s("p",[a._v("测试环境URL:测试环境调用底层服务接口的URL,当Fizz网关启动使用spring.profiles.active=test时使用该URL;")]),a._v(" "),s("p",[a._v("预生产环境URL:预生产环境调用底层服务接口的URL,当Fizz网关启动使用spring.profiles.active=pre时使用该URL;")]),a._v(" "),s("p",[a._v("生产环境URL:生产环境调用底层服务接口的URL,当Fizz网关启动使用spring.profiles.active=prod时使用该URL;")]),a._v(" "),s("p",[a._v("超时时间(毫秒):调用底层服务接口的超时时间,超时抛出异常,单位毫秒;")]),a._v(" "),s("p",[a._v("Fallback:可选stop|continue,控制当调用底层服务接口失败后是否继续执行后续操作;")]),a._v(" "),s("p",[a._v("请求预处理:勾选后可配置预处理脚本,预处理脚本返回true时才执行调用底层服务接口。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_add_10.png",alt:"manager_aggregate_add_10"}})]),a._v(" "),s("p",[a._v("配置入参:配置调用底层服务接口的请求参数;")]),a._v(" "),s("p",[a._v("配置响应:配置调用底层服务接口的响应内容。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_add_11.png",alt:"manager_aggregate_add_11"}})]),a._v(" "),s("p",[a._v("配置步骤结果:配置step执行完成后的响应内容。")]),a._v(" "),s("h3",{attrs:{id:"配置输出"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置输出"}},[a._v("#")]),a._v(" 配置输出")]),a._v(" "),s("p",[a._v("配置聚合接口调用完成的响应内容。在响应体、响应头配置中可以配置简单的响应固定值、响应引用值,对于需要逻辑处理得到结果的响应可以通过脚本配置灵活处理,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_add_12.png",alt:"manager_aggregate_add_12"}})]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_add_13.png",alt:"manager_aggregate_add_13"}})]),a._v(" "),s("h3",{attrs:{id:"校验结果"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#校验结果"}},[a._v("#")]),a._v(" 校验结果")]),a._v(" "),s("p",[a._v("配置聚合接口入参校验失败后的响应内容,在响应体、响应头配置中可以配置简单的响应固定值、响应引用值,对于需要逻辑处理得到结果的响应可以通过脚本配置灵活处理,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_add_14.png",alt:"manager_aggregate_add_14"}})]),a._v(" "),s("p",[a._v("校验结果有一个专用的引用值"),s("code",[a._v("validateMsg")]),a._v(",该引用值用于存放入参验证错误提示信息。")]),a._v(" "),s("h3",{attrs:{id:"保存接口"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#保存接口"}},[a._v("#")]),a._v(" 保存接口")]),a._v(" "),s("p",[a._v("所有配置完成后点击 保存 按钮,完成聚合接口的配置。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_add_15.png",alt:"manager_aggregate_add_15"}})]),a._v(" "),s("h2",{attrs:{id:"导出接口"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#导出接口"}},[a._v("#")]),a._v(" 导出接口")]),a._v(" "),s("p",[a._v("导出功能将聚合接口以配置文件的形式导出,导出的文件可通过导入功能重新导入系统,当我们的系统分多个环境时,可使用导出导入功能实现聚合接口的快速同步,下面介绍导出功能。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_export_1.png",alt:"manager_aggregate_export_1"}})]),a._v(" "),s("p",[a._v("勾选想到导出的接口,点击 导出 按钮弹出确认窗口,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_export_2.png",alt:"manager_aggregate_export_2"}})]),a._v(" "),s("p",[a._v("点击 确定 按钮,浏览器保存配置文件,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_export_3.png",alt:"manager_aggregate_export_3"}})]),a._v(" "),s("h2",{attrs:{id:"导入接口"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#导入接口"}},[a._v("#")]),a._v(" 导入接口")]),a._v(" "),s("p",[a._v("导入功能将配置文件中的聚合接口转化成后台的持久化存储,导入的文件可以通过导出功能获取或者通过编写好的聚合配置JSON文件转化得到(转换工具可以联系我们获取)。当我们的系统分多个环境时,可使用导出导入功能实现聚合接口的快速同步,下面介绍导出功能。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_import_1.png",alt:"manager_aggregate_import_1"}})]),a._v(" "),s("p",[a._v("点击 导入 按钮弹出导入配置窗口,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_import_2.png",alt:"manager_aggregate_import_2"}})]),a._v(" "),s("p",[a._v("点击 选取文件 按钮后选取要导入的配置文件;")]),a._v(" "),s("p",[a._v("强制覆盖:通过请求类型(GET|POST)、请求路径(/proxy/{service}/{apiPath})可以唯一确定一个聚合接口,当聚合接口已存在时,未勾选该选项时忽略该聚合接口导入,勾选该选项时覆盖已存在的聚合接口配置;")]),a._v(" "),s("p",[a._v("点击 确定 按钮后导入聚合接口配置。")]),a._v(" "),s("h2",{attrs:{id:"调试模式"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#调试模式"}},[a._v("#")]),a._v(" 调试模式")]),a._v(" "),s("p",[a._v("调试模式用于对接口开发过程中的调试使用,当打开调试模式后,Fizz网关会将聚合接口调用底层服务接口的请求响应信息以及耗时、聚合结果、步骤上下文打印到日志中,通过日志可以清楚的了解聚合接口的实际执行情况。调试模式会对网关性能造成影响,因此不建议在生产环境打开调试模式,当调试完成后及时关闭调试模式,避免打印过多日志造成资源浪费,下面介绍调试模式的使用。")]),a._v(" "),s("p",[a._v("勾选想要打开调试模式的接口,点击 打开调试模式 按钮弹出确认窗口,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_debug_mode_1.png",alt:"manager_aggregate_debug_mode_1"}})]),a._v(" "),s("p",[a._v("点击 确定 按钮确认打开调试模式。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_debug_mode_2.png",alt:"manager_aggregate_debug_mode_2"}})]),a._v(" "),s("p",[a._v("勾选想要关闭调试模式的接口,点击 关闭调试模式 按钮弹出确认窗口,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_debug_mode_3.png",alt:"manager_aggregate_debug_mode_3"}})]),a._v(" "),s("p",[a._v("点击 确定 按钮确认关闭调试模式。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_debug_mode_4.png",alt:"manager_aggregate_debug_mode_4"}})]),a._v(" "),s("h2",{attrs:{id:"编辑接口"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#编辑接口"}},[a._v("#")]),a._v(" 编辑接口")]),a._v(" "),s("p",[a._v("点击 编辑 按钮弹出编辑窗口,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_edit_1.png",alt:"manager_aggregate_edit_1"}})]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_edit_2.png",alt:"manager_aggregate_edit_2"}})]),a._v(" "),s("h2",{attrs:{id:"删除接口"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#删除接口"}},[a._v("#")]),a._v(" 删除接口")]),a._v(" "),s("p",[a._v("点击 删除 按钮弹出删除确认窗口,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_delete_1.png",alt:"manager_aggregate_delete_1"}})]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_delete_2.png",alt:"manager_aggregate_delete_2"}})]),a._v(" "),s("p",[a._v("点击 确定 按钮后删除接口,处于已发布状态的接口无法删除,需要下线后才能操作删除。")]),a._v(" "),s("h2",{attrs:{id:"发布-下线申请"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#发布-下线申请"}},[a._v("#")]),a._v(" 发布|下线申请")]),a._v(" "),s("p",[a._v("发布|下线申请用于聚合接口的发布或者下线申请,只有通过审核人审核后申请人才能执行发布|下线操作,避免误操作‘,保证接口的安全。")]),a._v(" "),s("p",[a._v("点击 发布|下线申请 按钮,弹出发布|下线申请窗口,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_apply_1.png",alt:"manager_aggregate_apply_1"}})]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_apply_2.png",alt:"manager_aggregate_apply_2"}})]),a._v(" "),s("p",[a._v("点击 添加 按钮后,弹出接口列表,勾选需要操作的接口,点击 确定 添加进申请中。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_apply_3.png",alt:"manager_aggregate_apply_3"}})]),a._v(" "),s("p",[a._v("标题:申请的标题,长度不能超过200个字符,必填;")]),a._v(" "),s("p",[a._v("类型:申请类型,可选发布|下线,必选;")]),a._v(" "),s("p",[a._v("申请原因:申请的原因,长度不能超过2000个字符;")]),a._v(" "),s("p",[a._v("选择审核人:选择有审核权限的人对申请进行审核,列表根据需要操作的接口动态变化(未添加接口时列表为空,拥有服务权限并且有待审核菜单权限的人、操作管理员角色的人为可选审核人),必选;")]),a._v(" "),s("p",[a._v("点击 确定 按钮后提交申请,选择的审核人会收到申请审核邮件(审核人邮箱地址通过用户管理设置,更多详情请查看用户管理功能介绍),如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_apply_4.png",alt:"manager_aggregate_apply_4"}})]),a._v(" "),s("h2",{attrs:{id:"接口测试"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#接口测试"}},[a._v("#")]),a._v(" 接口测试")]),a._v(" "),s("p",[a._v("后台提供了可视化的接口调用界面,聚合接口创建完成后可通过该界面对接口进行调用测试。通过点击接口详情页面的 测试 按钮打开接口测试页面,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_test_1.png",alt:"manager_aggregate_test_1"}})]),a._v(" "),s("p",[a._v("跳转页面的同时后台会将接口当前的最新配置推送给Fizz网关生成一个测试接口,请求路径为/proxytest/{service}/{apiPath}。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_test_2.png",alt:"manager_aggregate_test_2"}})]),a._v(" "),s("p",[a._v("点击 发送 按钮向指定接口发送一次请求,Response响应结果区域显示调用接口结果,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_test_3.png",alt:"manager_aggregate_test_3"}})]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_test_4.png",alt:"manager_aggregate_test_4"}})]),a._v(" "),s("p",[a._v("请求体tab用于配置请求的请求体参数。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_test_5.png",alt:"manager_aggregate_test_5"}})]),a._v(" "),s("p",[a._v("请求头tab用于配置请求的请求头参数。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_test_6.png",alt:"manager_aggregate_test_6"}})]),a._v(" "),s("p",[a._v("Query参数用于配置请求的Query参数。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_test_7.png",alt:"manager_aggregate_test_7"}})]),a._v(" "),s("p",[a._v("返回Context:Fizz网关中一次聚合接口的请求过程中内部会持有一个Context对象,该对象保存了本次请求过程的入参信息、底层服务接口调用信息、响应信息,通过勾选该选项,接口会将Context随接口响应一起返回,通过查看Context可以清楚地了解接口的实际调用过程。")]),a._v(" "),s("p",[a._v("未勾选 返回Context 选项时,接口按配置输出的设置响应结果,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_test_8.png",alt:"manager_aggregate_test_8"}})]),a._v(" "),s("p",[a._v("勾选 返回Context 选项后,接口会将Context随接口响应一起返回,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_test_9.png",alt:"manager_aggregate_test_9"}})]),a._v(" "),s("p",[a._v("测试接口:调用测试接口,请求路径为/proxytest/{service}/{apiPath};")]),a._v(" "),s("p",[a._v("正式接口:调用正式接口,请求路径为/proxy/{service}/{apiPath};")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_test_10.png",alt:"manager_aggregate_test_10"}})]),a._v(" "),s("p",[a._v("点击 保存 按钮会将本次测试请求数据保存下来,通过选取已保存的测试记录可以快速恢复请求数据,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_test_11.png",alt:"manager_aggregate_test_11"}})]),a._v(" "),s("p",[a._v("标题:本次测试数据保存时使用的标题,长度不能超过2000个字符,保存后在历史测试记录列表显示,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_test_12.png",alt:"manager_aggregate_test_12"}})])])}),[],!1,null,null,null);t.default=e.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/14.993243d3.js b/docs/assets/js/14.993243d3.js deleted file mode 100644 index 9155c75..0000000 --- a/docs/assets/js/14.993243d3.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[14],{360:function(a,t,s){"use strict";s.r(t);var r=s(42),e=Object(r.a)({},(function(){var a=this,t=a.$createElement,s=a._self._c||t;return s("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[s("h2",{attrs:{id:"概述"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[a._v("#")]),a._v(" 概述")]),a._v(" "),s("p",[a._v("接口列表功能用于维护聚合接口,聚合接口从外部调用方角度看是一个简单的接口,通过入参请求获取响应结果,内部实现会调用多个底层后端服务,将多个调用结果聚合转换成外部调用方想要的数据格式,更多详情请查看服务编排介绍,下面介绍接口列表功能的操作。")]),a._v(" "),s("h2",{attrs:{id:"接口列表"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#接口列表"}},[a._v("#")]),a._v(" 接口列表")]),a._v(" "),s("p",[a._v("菜单位置:服务编排 > 接口列表。点击菜单后进入接口列表页面,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_list_query.png",alt:"manager_aggregate_list_query"}})]),a._v(" "),s("h2",{attrs:{id:"新增接口"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#新增接口"}},[a._v("#")]),a._v(" 新增接口")]),a._v(" "),s("p",[a._v("点击 新增 按钮弹出新增窗口,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_1.png",alt:"manager_aggregate_add_1"}})]),a._v(" "),s("h3",{attrs:{id:"基础信息"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#基础信息"}},[a._v("#")]),a._v(" 基础信息")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_2.png",alt:"manager_aggregate_add_2"}})]),a._v(" "),s("p",[a._v("所属服务:接口所属服务,更多详情请查看服务管理功能介绍,必选;")]),a._v(" "),s("p",[a._v("接口名:接口名称,用于展示使用,长度不能超过200个字符,必填;")]),a._v(" "),s("p",[a._v("方法:接口请求方法类型,可选GET|POST,必选;")]),a._v(" "),s("p",[a._v("路径:接口请求路径后缀,长度不能超过2000个字符,必填;")]),a._v(" "),s("p",[a._v("开发人员:接口对应负责的开发人员,长度不能超过200个字符;")]),a._v(" "),s("p",[a._v("描述:接口功能描述,长度不能超过2000个字符;")]),a._v(" "),s("p",[a._v("举个例子,所属服务设置my-test-service,方法设置POST,路径设置test-aggregate-post,对应的聚合接口请求为 POST http://{Fizz网关ip地址}:{port端口}/proxy/my-test-service/test-aggregate-post。")]),a._v(" "),s("h3",{attrs:{id:"配置输入"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置输入"}},[a._v("#")]),a._v(" 配置输入")]),a._v(" "),s("p",[a._v("聚合接口的入参大部分是通过JSON Schema来定义的,下面先简单地介绍下JSON Schema。")]),a._v(" "),s("h4",{attrs:{id:"json-schema介绍"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#json-schema介绍"}},[a._v("#")]),a._v(" JSON Schema介绍")]),a._v(" "),s("p",[a._v("JSON Schema实际上也是JSON数据,用于标注和验证JSON文档,可以类比于XML Schema,当前最新版本2019-09。")]),a._v(" "),s("p",[a._v("作为普通用户,我们并不需要去了解JSON Schema的规范内容,只要能够构建JSON Schema即可。")]),a._v(" "),s("blockquote",[s("p",[a._v("要理解JSON Schema,首先要理解什么是JSON。JSON是JavaScript Object Notation的缩写,一种简单的数据交换格式。最初JSON是基于JavaScript,广泛的应用于万维网。由于其简洁和清晰的层次结构、易于人阅读等特性,使得越来越多的场景下被采用。")]),a._v(" "),s("p",[a._v("JSON包含以下数据结构:")]),a._v(" "),s("ul",[s("li",[a._v("object:"),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"key1"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"value1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"key2"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"value2"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])])]),a._v(" "),s("li",[a._v("array:"),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"first"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"second"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"third"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v("\n")])])])]),a._v(" "),s("li",[a._v("number:"),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token number"}},[a._v("42")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token number"}},[a._v("3.1415926")]),a._v("\n")])])])]),a._v(" "),s("li",[a._v("string:"),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"This is a string"')]),a._v("\n")])])])]),a._v(" "),s("li",[a._v("boolean:"),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token boolean"}},[a._v("true")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token boolean"}},[a._v("false")]),a._v("\n")])])])]),a._v(" "),s("li",[a._v("null:"),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("null")]),a._v("\n")])])])])]),a._v(" "),s("p",[a._v("通过以上的简单数据类型,就能构造复杂的结构化数据了。下面举两个例子:")]),a._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"George Washington"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"birthday"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"February 22, 1732"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"address"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Mount Vernon, Virginia, United States"')]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])]),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"first_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"George"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"last_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Washington"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"birthday"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"1732-02-22"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"address"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"street_address"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"3200 Mount Vernon Memorial Highway"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"city"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Mount Vernon"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"state"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Virginia"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"country"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"United States"')]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])]),s("p",[a._v("以上两个例子都是有效的JSON数据,包含一样的有效信息,但是当程序读取数据时,需要准确的知道数据是怎么组织的,比如哪些字段是必须,这些字段是什么类型。这时候JSON Schema就派上用场了,看以下JSON Schema例子:")]),a._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"object"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"properties"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"first_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"string"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"last_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"string"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"birthday"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"string"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"format"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"date"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"address"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"object"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"properties"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"street_address"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"string"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"city"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"string"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"state"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"string"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"country"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"string"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])]),s("p",[a._v("用以上JSON Schema验证第一个例子时,验证失败;但是第二个例子验证通过。")]),a._v(" "),s("p",[a._v("JSON Schema本身也是通过JSON编写,其本身也是数据,不是一个计算机程序,只是一种“描述其它数据的结构”的声明格式。这既是长处,也是弱点,JSON Schema可以简洁地描述数据的结构并且自动验证数据,但是对于数据元素间的关系表达就力不能及了。")])]),a._v(" "),s("p",[a._v("更多JSON Schema知识可以阅读"),s("a",{attrs:{href:"https://json-schema.org/understanding-json-schema/",target:"_blank",rel:"noopener noreferrer"}},[a._v("Understanding JSON Schema"),s("OutboundLink")],1),a._v("。")]),a._v(" "),s("h4",{attrs:{id:"请求头部"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#请求头部"}},[a._v("#")]),a._v(" 请求头部")]),a._v(" "),s("p",[a._v("定义聚合接口的请求Header参数。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_3.png",alt:"manager_aggregate_add_3"}})]),a._v(" "),s("p",[a._v("举个例子:")]),a._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"object"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"properties"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"headerParam1"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"string"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"title"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"请求头参数1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"titleEn"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"headerParam1"')]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"required"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"headerParam1"')]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])]),s("p",[a._v("以上例子定义了必传请求头参数"),s("code",[a._v("headerParam1")]),a._v("。")]),a._v(" "),s("p",[s("code",[a._v("title")]),a._v("字段用于验证失败时提示使用,例如请求接口时没传请求头时会提示“请求头参数1不能为空”(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_input_header_1.png",alt:"manager_aggregate_add_input_header_1"}})]),a._v(" "),s("p",[a._v("当定义了语言配置(详情请查看后文的语言配置介绍)选项为英文时会使用"),s("code",[a._v("titleEn")]),a._v("字段用于验证失败时提示使用,例如请求接口时没传请求头时会提示“headerParam1 is missing but it is required”(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_input_header_2.png",alt:"manager_aggregate_add_input_header_2"}})]),a._v(" "),s("h4",{attrs:{id:"请求体"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#请求体"}},[a._v("#")]),a._v(" 请求体")]),a._v(" "),s("p",[a._v("定义聚合接口的请求体参数。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_4.png",alt:"manager_aggregate_add_4"}})]),a._v(" "),s("p",[a._v("举个例子:")]),a._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"object"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"properties"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"bodyParam1"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"string"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"title"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"请求体参数1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"titleEn"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"bodyParam1"')]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"required"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"bodyParam1"')]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])]),s("p",[a._v("以上例子定义了必传请求体参数"),s("code",[a._v("bodyParam1")]),a._v("。")]),a._v(" "),s("p",[s("code",[a._v("title")]),a._v("字段用于验证失败时提示使用,例如请求接口时没传请求体参数时会提示“请求体参数1不能为空”(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_input_body_1.png",alt:"manager_aggregate_add_input_body_1"}})]),a._v(" "),s("p",[a._v("当定义了语言配置(详情请查看后文的语言配置介绍)选项为英文时会使用"),s("code",[a._v("titleEn")]),a._v("字段用于验证失败时提示使用,例如请求接口时没传请求体参数时会提示“bodyParam1 is missing but it is required”(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_input_body_2.png",alt:"manager_aggregate_add_input_body_2"}})]),a._v(" "),s("h4",{attrs:{id:"query参数"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#query参数"}},[a._v("#")]),a._v(" Query参数")]),a._v(" "),s("p",[a._v("定义聚合接口的Query参数。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_5.png",alt:"manager_aggregate_add_5"}})]),a._v(" "),s("p",[a._v("举个例子:")]),a._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"object"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"properties"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"queryParam1"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"string"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"title"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"query参数1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"titleEn"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"queryParam1"')]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"required"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"queryParam1"')]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])]),s("p",[a._v("以上例子定义了必传Query参数"),s("code",[a._v("queryParam1")]),a._v("。")]),a._v(" "),s("p",[s("code",[a._v("title")]),a._v("字段用于验证失败时提示使用,例如请求接口时没传Query参数时会提示“query参数1不能为空”(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_input_query_1.png",alt:"manager_aggregate_add_input_query_1"}})]),a._v(" "),s("p",[a._v("当定义了语言配置(详情请查看后文的语言配置介绍)选项为英文时会使用"),s("code",[a._v("titleEn")]),a._v("字段用于验证失败时提示使用,例如请求接口时没传Query参数时会提示“queryParam1 is missing but it is required”(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_input_query_2.png",alt:"manager_aggregate_add_input_query_2"}})]),a._v(" "),s("h4",{attrs:{id:"脚本校验"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#脚本校验"}},[a._v("#")]),a._v(" 脚本校验")]),a._v(" "),s("p",[a._v("对于JSON Schema规范无法覆盖的校验场景可以使用脚本对入参进行更加灵活的处理。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_6.png",alt:"manager_aggregate_add_6"}})]),a._v(" "),s("p",[a._v("点击 新增 按钮后弹出脚本配置窗口,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_7.png",alt:"manager_aggregate_add_7"}})]),a._v(" "),s("p",[a._v("脚本类型:可选javascript|groovy,必选;")]),a._v(" "),s("p",[a._v("脚本内容:所选的脚本类型语言编写的入参验证脚本,必填。")]),a._v(" "),s("p",[a._v("举个例子:")]),a._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[a._v("// javascript脚本函数名不能修改")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("function")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("dyFunc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[a._v("paramsJsonStr")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[a._v("// 上下文, 数据结构请参考 context.js")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("var")]),a._v(" context "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[a._v("JSON")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("parse")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),a._v("paramsJsonStr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v("'context'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[a._v("// common为内置的上下文便捷操作工具类,详情请参考common.js;例如:")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[a._v("// var data = common.getStepRespBody(context, 'step2', 'request1', 'data');")]),a._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[a._v("// do something")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("var")]),a._v(" headerParam1 "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v(" common"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("getInputReqHeader")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),a._v("context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v("'headerParam1'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("var")]),a._v(" bodyParam1 "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v(" common"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("getInputReqBody")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),a._v("context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v("'bodyParam1'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("var")]),a._v(" queryParam1 "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v(" common"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("getInputReqParam")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),a._v("context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v("'queryParam1'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("var")]),a._v(" result "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("new")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[a._v("Array")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("if")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),a._v("headerParam1 "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("!=")]),a._v(" bodyParam1"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("push")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"headerParam1与bodyParam1不一致"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("if")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),a._v("queryParam1 "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("!=")]),a._v(" bodyParam1"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("push")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"queryParam1与bodyParam1不一致"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("if")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),a._v("headerParam1 "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("!=")]),a._v(" queryParam1"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("push")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"headerParam1与queryParam1不一致"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[a._v("// 返回结果为Array或Object时要先转为json字符串")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("return")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[a._v("JSON")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("stringify")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),a._v("result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n\n")])])]),s("p",[a._v("以上例子使用javascript编写参数校验,限制入参"),s("code",[a._v("headerParam1")]),a._v("、"),s("code",[a._v("bodyParam1")]),a._v("、"),s("code",[a._v("queryParam1")]),a._v("必须一致,不一致将提示错误信息(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_input_script.png",alt:"manager_aggregate_add_input_script"}})]),a._v(" "),s("h4",{attrs:{id:"语言配置"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#语言配置"}},[a._v("#")]),a._v(" 语言配置")]),a._v(" "),s("p",[a._v("聚合接口默认使用中文响应校验失败提示,通过配置可通过入参选择不同的提示语言,目前支持中文、英文提示(已满足我们的业务使用场景,有其他语言要求的小伙伴可以联系我们添加)。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_8.png",alt:"manager_aggregate_add_8"}})]),a._v(" "),s("p",[a._v("字段:入参字段值,例如"),s("code",[a._v("input.request.body.languageCode")]),a._v("使用请求体参数"),s("code",[a._v("languageCode")]),a._v("的值来决定使用哪种语言;")]),a._v(" "),s("p",[a._v("中文:中文与入参字段值的映射关系,例如配置"),s("code",[a._v("0")]),a._v(",当请求入参字段值为"),s("code",[a._v("0")]),a._v("时使用中文提示校验结果;")]),a._v(" "),s("p",[a._v("英文:英文与入参字段值的映射关系,例如配置"),s("code",[a._v("1")]),a._v(",当请求入参字段值为"),s("code",[a._v("1")]),a._v("时使用中文提示校验结果。")]),a._v(" "),s("h3",{attrs:{id:"配置步骤"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置步骤"}},[a._v("#")]),a._v(" 配置步骤")]),a._v(" "),s("p",[a._v("聚合接口调用底层服务是通过多个step实现的,多个step串行执行,每个step包含多个request(对底层服务接口的调用),同个step里的多个request并行执行,后执行的step可以获取已执行step的执行结果,更多详情请查看服务编排文章的介绍,下面介绍配置步骤的使用。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_9.png",alt:"manager_aggregate_add_9"}})]),a._v(" "),s("p",[a._v("是否执行完此步骤后结束:勾选后实际请求只执行完该步骤后即响应结果,不执行后续步骤,用于调试使用;")]),a._v(" "),s("p",[a._v("请求方法:调用底层服务接口的请求类型,可选GET|POST,必选;")]),a._v(" "),s("p",[a._v("默认URL:调用底层服务接口的默认URL,当Fizz网关启动环境没有配置URL时使用该默认URL;")]),a._v(" "),s("p",[a._v("开发环境URL:开发环境调用底层服务接口的URL,当Fizz网关启动使用spring.profiles.active=dev时使用该URL;")]),a._v(" "),s("p",[a._v("测试环境URL:测试环境调用底层服务接口的URL,当Fizz网关启动使用spring.profiles.active=test时使用该URL;")]),a._v(" "),s("p",[a._v("预生产环境URL:预生产环境调用底层服务接口的URL,当Fizz网关启动使用spring.profiles.active=pre时使用该URL;")]),a._v(" "),s("p",[a._v("生产环境URL:生产环境调用底层服务接口的URL,当Fizz网关启动使用spring.profiles.active=prod时使用该URL;")]),a._v(" "),s("p",[a._v("超时时间(毫秒):调用底层服务接口的超时时间,超时抛出异常,单位毫秒;")]),a._v(" "),s("p",[a._v("Fallback:可选stop|continue,控制当调用底层服务接口失败后是否继续执行后续操作;")]),a._v(" "),s("p",[a._v("请求预处理:勾选后可配置预处理脚本,预处理脚本返回true时才执行调用底层服务接口。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_10.png",alt:"manager_aggregate_add_10"}})]),a._v(" "),s("p",[a._v("配置入参:配置调用底层服务接口的请求参数;")]),a._v(" "),s("p",[a._v("配置响应:配置调用底层服务接口的响应内容。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_11.png",alt:"manager_aggregate_add_11"}})]),a._v(" "),s("p",[a._v("配置步骤结果:配置step执行完成后的响应内容。")]),a._v(" "),s("h3",{attrs:{id:"配置输出"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置输出"}},[a._v("#")]),a._v(" 配置输出")]),a._v(" "),s("p",[a._v("配置聚合接口调用完成的响应内容。在响应体、响应头配置中可以配置简单的响应固定值、响应引用值,对于需要逻辑处理得到结果的响应可以通过脚本配置灵活处理,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_12.png",alt:"manager_aggregate_add_12"}})]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_13.png",alt:"manager_aggregate_add_13"}})]),a._v(" "),s("h3",{attrs:{id:"校验结果"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#校验结果"}},[a._v("#")]),a._v(" 校验结果")]),a._v(" "),s("p",[a._v("配置聚合接口入参校验失败后的响应内容,在响应体、响应头配置中可以配置简单的响应固定值、响应引用值,对于需要逻辑处理得到结果的响应可以通过脚本配置灵活处理,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_14.png",alt:"manager_aggregate_add_14"}})]),a._v(" "),s("p",[a._v("校验结果有一个专用的引用值"),s("code",[a._v("validateMsg")]),a._v(",该引用值用于存放入参验证错误提示信息。")]),a._v(" "),s("h3",{attrs:{id:"保存接口"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#保存接口"}},[a._v("#")]),a._v(" 保存接口")]),a._v(" "),s("p",[a._v("所有配置完成后点击 保存 按钮,完成聚合接口的配置。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_add_15.png",alt:"manager_aggregate_add_15"}})]),a._v(" "),s("h2",{attrs:{id:"导出接口"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#导出接口"}},[a._v("#")]),a._v(" 导出接口")]),a._v(" "),s("p",[a._v("导出功能将聚合接口以配置文件的形式导出,导出的文件可通过导入功能重新导入系统,当我们的系统分多个环境时,可使用导出导入功能实现聚合接口的快速同步,下面介绍导出功能。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_export_1.png",alt:"manager_aggregate_export_1"}})]),a._v(" "),s("p",[a._v("勾选想到导出的接口,点击 导出 按钮弹出确认窗口,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_export_2.png",alt:"manager_aggregate_export_2"}})]),a._v(" "),s("p",[a._v("点击 确定 按钮,浏览器保存配置文件,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_export_3.png",alt:"manager_aggregate_export_3"}})]),a._v(" "),s("h2",{attrs:{id:"导入接口"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#导入接口"}},[a._v("#")]),a._v(" 导入接口")]),a._v(" "),s("p",[a._v("导入功能将配置文件中的聚合接口转化成后台的持久化存储,导入的文件可以通过导出功能获取或者通过编写好的聚合配置JSON文件转化得到(转换工具可以联系我们获取)。当我们的系统分多个环境时,可使用导出导入功能实现聚合接口的快速同步,下面介绍导出功能。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_import_1.png",alt:"manager_aggregate_import_1"}})]),a._v(" "),s("p",[a._v("点击 导入 按钮弹出导入配置窗口,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_import_2.png",alt:"manager_aggregate_import_2"}})]),a._v(" "),s("p",[a._v("点击 选取文件 按钮后选取要导入的配置文件;")]),a._v(" "),s("p",[a._v("强制覆盖:通过请求类型(GET|POST)、请求路径(/proxy/{service}/{apiPath})可以唯一确定一个聚合接口,当聚合接口已存在时,未勾选该选项时忽略该聚合接口导入,勾选该选项时覆盖已存在的聚合接口配置;")]),a._v(" "),s("p",[a._v("点击 确定 按钮后导入聚合接口配置。")]),a._v(" "),s("h2",{attrs:{id:"调试模式"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#调试模式"}},[a._v("#")]),a._v(" 调试模式")]),a._v(" "),s("p",[a._v("调试模式用于对接口开发过程中的调试使用,当打开调试模式后,Fizz网关会将聚合接口调用底层服务接口的请求响应信息以及耗时、聚合结果、步骤上下文打印到日志中,通过日志可以清楚的了解聚合接口的实际执行情况。调试模式会对网关性能造成影响,因此不建议在生产环境打开调试模式,当调试完成后及时关闭调试模式,避免打印过多日志造成资源浪费,下面介绍调试模式的使用。")]),a._v(" "),s("p",[a._v("勾选想要打开调试模式的接口,点击 打开调试模式 按钮弹出确认窗口,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_debug_mode_1.png",alt:"manager_aggregate_debug_mode_1"}})]),a._v(" "),s("p",[a._v("点击 确定 按钮确认打开调试模式。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_debug_mode_2.png",alt:"manager_aggregate_debug_mode_2"}})]),a._v(" "),s("p",[a._v("勾选想要关闭调试模式的接口,点击 关闭调试模式 按钮弹出确认窗口,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_debug_mode_3.png",alt:"manager_aggregate_debug_mode_3"}})]),a._v(" "),s("p",[a._v("点击 确定 按钮确认关闭调试模式。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_debug_mode_4.png",alt:"manager_aggregate_debug_mode_4"}})]),a._v(" "),s("h2",{attrs:{id:"编辑接口"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#编辑接口"}},[a._v("#")]),a._v(" 编辑接口")]),a._v(" "),s("p",[a._v("点击 编辑 按钮弹出编辑窗口,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_edit_1.png",alt:"manager_aggregate_edit_1"}})]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_edit_2.png",alt:"manager_aggregate_edit_2"}})]),a._v(" "),s("h2",{attrs:{id:"删除接口"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#删除接口"}},[a._v("#")]),a._v(" 删除接口")]),a._v(" "),s("p",[a._v("点击 删除 按钮弹出删除确认窗口,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_delete_1.png",alt:"manager_aggregate_delete_1"}})]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_delete_2.png",alt:"manager_aggregate_delete_2"}})]),a._v(" "),s("p",[a._v("点击 确定 按钮后删除接口,处于已发布状态的接口无法删除,需要下线后才能操作删除。")]),a._v(" "),s("h2",{attrs:{id:"发布-下线申请"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#发布-下线申请"}},[a._v("#")]),a._v(" 发布|下线申请")]),a._v(" "),s("p",[a._v("发布|下线申请用于聚合接口的发布或者下线申请,只有通过审核人审核后申请人才能执行发布|下线操作,避免误操作‘,保证接口的安全。")]),a._v(" "),s("p",[a._v("点击 发布|下线申请 按钮,弹出发布|下线申请窗口,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_apply_1.png",alt:"manager_aggregate_apply_1"}})]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_apply_2.png",alt:"manager_aggregate_apply_2"}})]),a._v(" "),s("p",[a._v("点击 添加 按钮后,弹出接口列表,勾选需要操作的接口,点击 确定 添加进申请中。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_apply_3.png",alt:"manager_aggregate_apply_3"}})]),a._v(" "),s("p",[a._v("标题:申请的标题,长度不能超过200个字符,必填;")]),a._v(" "),s("p",[a._v("类型:申请类型,可选发布|下线,必选;")]),a._v(" "),s("p",[a._v("申请原因:申请的原因,长度不能超过2000个字符;")]),a._v(" "),s("p",[a._v("选择审核人:选择有审核权限的人对申请进行审核,列表根据需要操作的接口动态变化(未添加接口时列表为空,拥有服务权限并且有待审核菜单权限的人、操作管理员角色的人为可选审核人),必选;")]),a._v(" "),s("p",[a._v("点击 确定 按钮后提交申请,选择的审核人会收到申请审核邮件(审核人邮箱地址通过用户管理设置,更多详情请查看用户管理功能介绍),如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_apply_4.png",alt:"manager_aggregate_apply_4"}})]),a._v(" "),s("h2",{attrs:{id:"接口测试"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#接口测试"}},[a._v("#")]),a._v(" 接口测试")]),a._v(" "),s("p",[a._v("后台提供了可视化的接口调用界面,聚合接口创建完成后可通过该界面对接口进行调用测试。通过点击接口详情页面的 测试 按钮打开接口测试页面,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_test_1.png",alt:"manager_aggregate_test_1"}})]),a._v(" "),s("p",[a._v("跳转页面的同时后台会将接口当前的最新配置推送给Fizz网关生成一个测试接口,请求路径为/proxytest/{service}/{apiPath}。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_test_2.png",alt:"manager_aggregate_test_2"}})]),a._v(" "),s("p",[a._v("点击 发送 按钮向指定接口发送一次请求,Response响应结果区域显示调用接口结果,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_test_3.png",alt:"manager_aggregate_test_3"}})]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_test_4.png",alt:"manager_aggregate_test_4"}})]),a._v(" "),s("p",[a._v("请求体tab用于配置请求的请求体参数。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_test_5.png",alt:"manager_aggregate_test_5"}})]),a._v(" "),s("p",[a._v("请求头tab用于配置请求的请求头参数。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_test_6.png",alt:"manager_aggregate_test_6"}})]),a._v(" "),s("p",[a._v("Query参数用于配置请求的Query参数。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_test_7.png",alt:"manager_aggregate_test_7"}})]),a._v(" "),s("p",[a._v("返回Context:Fizz网关中一次聚合接口的请求过程中内部会持有一个Context对象,该对象保存了本次请求过程的入参信息、底层服务接口调用信息、响应信息,通过勾选该选项,接口会将Context随接口响应一起返回,通过查看Context可以清楚地了解接口的实际调用过程。")]),a._v(" "),s("p",[a._v("未勾选 返回Context 选项时,接口按配置输出的设置响应结果,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_test_8.png",alt:"manager_aggregate_test_8"}})]),a._v(" "),s("p",[a._v("勾选 返回Context 选项后,接口会将Context随接口响应一起返回,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_test_9.png",alt:"manager_aggregate_test_9"}})]),a._v(" "),s("p",[a._v("测试接口:调用测试接口,请求路径为/proxytest/{service}/{apiPath};")]),a._v(" "),s("p",[a._v("正式接口:调用正式接口,请求路径为/proxy/{service}/{apiPath};")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_test_10.png",alt:"manager_aggregate_test_10"}})]),a._v(" "),s("p",[a._v("点击 保存 按钮会将本次测试请求数据保存下来,通过选取已保存的测试记录可以快速恢复请求数据,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_test_11.png",alt:"manager_aggregate_test_11"}})]),a._v(" "),s("p",[a._v("标题:本次测试数据保存时使用的标题,长度不能超过2000个字符,保存后在历史测试记录列表显示,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_test_12.png",alt:"manager_aggregate_test_12"}})])])}),[],!1,null,null,null);t.default=e.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/15.0358b10e.js b/docs/assets/js/15.0358b10e.js new file mode 100644 index 0000000..75de6b9 --- /dev/null +++ b/docs/assets/js/15.0358b10e.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[15],{359:function(a,r,t){"use strict";t.r(r);var e=t(42),_=Object(e.a)({},(function(){var a=this,r=a.$createElement,t=a._self._c||r;return t("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[t("h2",{attrs:{id:"概述"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[a._v("#")]),a._v(" 概述")]),a._v(" "),t("p",[a._v("聚合接口的发布|下线操作需要提交发布|下线申请,审核通过后申请人才能执行发布|下线操作。待审核功能用于审核发布|下线申请,下面介绍待审核功能。")]),a._v(" "),t("h2",{attrs:{id:"审核列表"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#审核列表"}},[a._v("#")]),a._v(" 审核列表")]),a._v(" "),t("p",[a._v("菜单位置:发布申请 > 待审核。点击菜单后进入审核列表页面,如图所示。")]),a._v(" "),t("p",[t("img",{attrs:{src:"/manager_aggregate_approve_list_query.png",alt:"manager_aggregate_approve_list_query"}})]),a._v(" "),t("h2",{attrs:{id:"审核操作"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#审核操作"}},[a._v("#")]),a._v(" 审核操作")]),a._v(" "),t("p",[a._v("点击 查看 按钮可以查看发布|下线申请详情,详情页中可执行审核操作。")]),a._v(" "),t("p",[a._v("申请列表页提供快速审核操作,点击 审核 按钮后弹出审核确认窗口,如图所示。")]),a._v(" "),t("p",[t("img",{attrs:{src:"/manager_aggregate_approve_op_1.png",alt:"manager_aggregate_approve_op_1"}})]),a._v(" "),t("p",[t("img",{attrs:{src:"/manager_aggregate_approve_op_2.png",alt:"manager_aggregate_approve_op_2"}})]),a._v(" "),t("p",[a._v("审核结果:勾选通过,审核后申请能可执行申请的操作;勾选不通过,审核后申请失败,申请人不能执行申请的操作。")]),a._v(" "),t("p",[a._v("审核后申请人会收到审核结果邮件通知,如下图是审核通过的邮件通知。")]),a._v(" "),t("p",[t("img",{attrs:{src:"/manager_aggregate_approve_op_3.png",alt:"manager_aggregate_approve_op_3"}})])])}),[],!1,null,null,null);r.default=_.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/15.c6e43d45.js b/docs/assets/js/15.c6e43d45.js deleted file mode 100644 index 19957f6..0000000 --- a/docs/assets/js/15.c6e43d45.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[15],{358:function(a,t,e){"use strict";e.r(t);var r=e(42),_=Object(r.a)({},(function(){var a=this,t=a.$createElement,e=a._self._c||t;return e("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[e("h2",{attrs:{id:"概述"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[a._v("#")]),a._v(" 概述")]),a._v(" "),e("p",[a._v("聚合接口的发布|下线操作需要提交发布|下线申请,审核通过后申请人才能执行发布|下线操作。待审核功能用于审核发布|下线申请,下面介绍待审核功能。")]),a._v(" "),e("h2",{attrs:{id:"审核列表"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#审核列表"}},[a._v("#")]),a._v(" 审核列表")]),a._v(" "),e("p",[a._v("菜单位置:发布申请 > 待审核。点击菜单后进入审核列表页面,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_approve_list_query.png",alt:"manager_aggregate_approve_list_query"}})]),a._v(" "),e("h2",{attrs:{id:"审核操作"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#审核操作"}},[a._v("#")]),a._v(" 审核操作")]),a._v(" "),e("p",[a._v("点击 查看 按钮可以查看发布|下线申请详情,详情页中可执行审核操作。")]),a._v(" "),e("p",[a._v("申请列表页提供快速审核操作,点击 审核 按钮后弹出审核确认窗口,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_approve_op_1.png",alt:"manager_aggregate_approve_op_1"}})]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_approve_op_2.png",alt:"manager_aggregate_approve_op_2"}})]),a._v(" "),e("p",[a._v("审核结果:勾选通过,审核后申请能可执行申请的操作;勾选不通过,审核后申请失败,申请人不能执行申请的操作。")]),a._v(" "),e("p",[a._v("审核后申请人会收到审核结果邮件通知,如下图是审核通过的邮件通知。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_approve_op_3.png",alt:"manager_aggregate_approve_op_3"}})])])}),[],!1,null,null,null);t.default=_.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/16.5d8d970e.js b/docs/assets/js/16.43a475d2.js similarity index 50% rename from docs/assets/js/16.5d8d970e.js rename to docs/assets/js/16.43a475d2.js index 467ba3a..3337d04 100644 --- a/docs/assets/js/16.5d8d970e.js +++ b/docs/assets/js/16.43a475d2.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[16],{363:function(a,t,e){"use strict";e.r(t);var _=e(42),r=Object(_.a)({},(function(){var a=this,t=a.$createElement,e=a._self._c||t;return e("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[e("h2",{attrs:{id:"概述"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[a._v("#")]),a._v(" 概述")]),a._v(" "),e("p",[a._v("管理后台记录了发布|下线申请的审核操作日志,审核日志功能提供界面查询后台记录的审核操作日志。")]),a._v(" "),e("h2",{attrs:{id:"审核日志列表"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#审核日志列表"}},[a._v("#")]),a._v(" 审核日志列表")]),a._v(" "),e("p",[a._v("菜单位置:发布申请 > 审核日志。点击菜单后进入审核日志列表页面,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_approve_op_log_list_query.png",alt:"manager_aggregate_approve_op_log_list_query"}})]),a._v(" "),e("h2",{attrs:{id:"审核日志详情"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#审核日志详情"}},[a._v("#")]),a._v(" 审核日志详情")]),a._v(" "),e("p",[a._v("点击 查看 按钮弹出审核日志详情页面,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_approve_op_log_detail_1.png",alt:"manager_aggregate_approve_op_log_detail_1"}})]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_approve_op_log_detail_2.png",alt:"manager_aggregate_approve_op_log_detail_2"}})])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[16],{363:function(a,t,e){"use strict";e.r(t);var _=e(42),r=Object(_.a)({},(function(){var a=this,t=a.$createElement,e=a._self._c||t;return e("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[e("h2",{attrs:{id:"概述"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[a._v("#")]),a._v(" 概述")]),a._v(" "),e("p",[a._v("管理后台记录了发布|下线申请的审核操作日志,审核日志功能提供界面查询后台记录的审核操作日志。")]),a._v(" "),e("h2",{attrs:{id:"审核日志列表"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#审核日志列表"}},[a._v("#")]),a._v(" 审核日志列表")]),a._v(" "),e("p",[a._v("菜单位置:发布申请 > 审核日志。点击菜单后进入审核日志列表页面,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/manager_aggregate_approve_op_log_list_query.png",alt:"manager_aggregate_approve_op_log_list_query"}})]),a._v(" "),e("h2",{attrs:{id:"审核日志详情"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#审核日志详情"}},[a._v("#")]),a._v(" 审核日志详情")]),a._v(" "),e("p",[a._v("点击 查看 按钮弹出审核日志详情页面,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/manager_aggregate_approve_op_log_detail_1.png",alt:"manager_aggregate_approve_op_log_detail_1"}})]),a._v(" "),e("p",[e("img",{attrs:{src:"/manager_aggregate_approve_op_log_detail_2.png",alt:"manager_aggregate_approve_op_log_detail_2"}})])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/17.31216161.js b/docs/assets/js/17.31216161.js deleted file mode 100644 index 28433b2..0000000 --- a/docs/assets/js/17.31216161.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[17],{361:function(a,_,e){"use strict";e.r(_);var t=e(42),g=Object(t.a)({},(function(){var a=this,_=a.$createElement,e=a._self._c||_;return e("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[e("h2",{attrs:{id:"概述"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[a._v("#")]),a._v(" 概述")]),a._v(" "),e("p",[a._v("聚合接口的发布|下线操作需要提交发布|下线申请,审核通过后申请人才能执行发布|下线操作。我的申请功能用于发布|下线申请过程的相关操作,下面介绍我的申请功能。")]),a._v(" "),e("h2",{attrs:{id:"申请列表"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#申请列表"}},[a._v("#")]),a._v(" 申请列表")]),a._v(" "),e("p",[a._v("菜单位置:发布申请 > 我的申请。点击菜单后进入申请列表页面,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_my_apply_list_query.png",alt:"manager_aggregate_my_apply_list_query"}})]),a._v(" "),e("h2",{attrs:{id:"申请撤回"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#申请撤回"}},[a._v("#")]),a._v(" 申请撤回")]),a._v(" "),e("p",[a._v("对于已提交但未被审核的申请可执行撤回操作,点击 撤回 按钮弹出确认窗口,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_my_apply_revoke_1.png",alt:"manager_aggregate_my_apply_revoke_1"}})]),a._v(" "),e("p",[a._v("点击 确定 按钮后确认撤回申请,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_my_apply_revoke_2.png",alt:"manager_aggregate_my_apply_revoke_2"}})]),a._v(" "),e("p",[a._v("撤回后审核人会收到邮箱提醒无需再处理该申请,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_my_apply_revoke_3.png",alt:"manager_aggregate_my_apply_revoke_3"}})]),a._v(" "),e("p",[a._v("撤回后可对申请重新进行编辑后再次提交,点击 编辑 按钮后弹出编辑窗口,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_my_apply_revoke_4.png",alt:"manager_aggregate_my_apply_revoke_4"}})]),a._v(" "),e("p",[a._v("点击 确定 按钮后再次提交申请,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_my_apply_revoke_5.png",alt:"manager_aggregate_my_apply_revoke_5"}})]),a._v(" "),e("h2",{attrs:{id:"申请详情"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#申请详情"}},[a._v("#")]),a._v(" 申请详情")]),a._v(" "),e("p",[a._v("点击 查看 按钮查看申请详情。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_my_apply_detail_1.png",alt:"manager_aggregate_my_apply_detail_1"}})]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_my_apply_detail_2.png",alt:"manager_aggregate_my_apply_detail_2"}})]),a._v(" "),e("p",[a._v("操作日志记录该申请的所有操作,包括申请提交、申请撤回、申请重新提交、审核不通过、审核通过、修改审核人、接口发布、接口下线 、接口回滚、接口撤回。")]),a._v(" "),e("p",[a._v("待审核状态申请可以更换审核人,点击 修改审核人 按钮后弹出修改审核人窗口,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_my_apply_detail_3.png",alt:"manager_aggregate_my_apply_detail_3"}})]),a._v(" "),e("p",[a._v("重新选择审核人后点击 确定 按钮,修改审核人完成。")]),a._v(" "),e("p",[a._v("修改后原审核人会收到邮件提醒无须再处理该申请。")]),a._v(" "),e("p",[a._v("修改后新的审核人会收到邮件提醒需要处理该申请。")]),a._v(" "),e("p",[a._v("审核通过后可以对接口进行发布操作,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_my_apply_detail_4.png",alt:"manager_aggregate_my_apply_detail_4"}})]),a._v(" "),e("p",[a._v("批量发布:对申请内的接口批量发布推送到Fizz网关。")]),a._v(" "),e("p",[a._v("批量回滚:对申请内的接口批量回滚到上一个版本,当发布后接口异常时该操作相当有用。")]),a._v(" "),e("p",[a._v("对于申请通过后又无须操作的接口可以执行撤回操作,撤回接口时必须填写备注信息用于回溯查询,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_my_apply_detail_5.png",alt:"manager_aggregate_my_apply_detail_5"}})]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_my_apply_detail_6.png",alt:"manager_aggregate_my_apply_detail_6"}})])])}),[],!1,null,null,null);_.default=g.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/17.32fa8ea0.js b/docs/assets/js/17.32fa8ea0.js new file mode 100644 index 0000000..ceb5daa --- /dev/null +++ b/docs/assets/js/17.32fa8ea0.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[17],{362:function(a,_,e){"use strict";e.r(_);var g=e(42),t=Object(g.a)({},(function(){var a=this,_=a.$createElement,e=a._self._c||_;return e("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[e("h2",{attrs:{id:"概述"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[a._v("#")]),a._v(" 概述")]),a._v(" "),e("p",[a._v("聚合接口的发布|下线操作需要提交发布|下线申请,审核通过后申请人才能执行发布|下线操作。我的申请功能用于发布|下线申请过程的相关操作,下面介绍我的申请功能。")]),a._v(" "),e("h2",{attrs:{id:"申请列表"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#申请列表"}},[a._v("#")]),a._v(" 申请列表")]),a._v(" "),e("p",[a._v("菜单位置:发布申请 > 我的申请。点击菜单后进入申请列表页面,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/manager_aggregate_my_apply_list_query.png",alt:"manager_aggregate_my_apply_list_query"}})]),a._v(" "),e("h2",{attrs:{id:"申请撤回"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#申请撤回"}},[a._v("#")]),a._v(" 申请撤回")]),a._v(" "),e("p",[a._v("对于已提交但未被审核的申请可执行撤回操作,点击 撤回 按钮弹出确认窗口,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/manager_aggregate_my_apply_revoke_1.png",alt:"manager_aggregate_my_apply_revoke_1"}})]),a._v(" "),e("p",[a._v("点击 确定 按钮后确认撤回申请,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/manager_aggregate_my_apply_revoke_2.png",alt:"manager_aggregate_my_apply_revoke_2"}})]),a._v(" "),e("p",[a._v("撤回后审核人会收到邮箱提醒无需再处理该申请,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/manager_aggregate_my_apply_revoke_3.png",alt:"manager_aggregate_my_apply_revoke_3"}})]),a._v(" "),e("p",[a._v("撤回后可对申请重新进行编辑后再次提交,点击 编辑 按钮后弹出编辑窗口,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/manager_aggregate_my_apply_revoke_4.png",alt:"manager_aggregate_my_apply_revoke_4"}})]),a._v(" "),e("p",[a._v("点击 确定 按钮后再次提交申请,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/manager_aggregate_my_apply_revoke_5.png",alt:"manager_aggregate_my_apply_revoke_5"}})]),a._v(" "),e("h2",{attrs:{id:"申请详情"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#申请详情"}},[a._v("#")]),a._v(" 申请详情")]),a._v(" "),e("p",[a._v("点击 查看 按钮查看申请详情。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/manager_aggregate_my_apply_detail_1.png",alt:"manager_aggregate_my_apply_detail_1"}})]),a._v(" "),e("p",[e("img",{attrs:{src:"/manager_aggregate_my_apply_detail_2.png",alt:"manager_aggregate_my_apply_detail_2"}})]),a._v(" "),e("p",[a._v("操作日志记录该申请的所有操作,包括申请提交、申请撤回、申请重新提交、审核不通过、审核通过、修改审核人、接口发布、接口下线 、接口回滚、接口撤回。")]),a._v(" "),e("p",[a._v("待审核状态申请可以更换审核人,点击 修改审核人 按钮后弹出修改审核人窗口,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/manager_aggregate_my_apply_detail_3.png",alt:"manager_aggregate_my_apply_detail_3"}})]),a._v(" "),e("p",[a._v("重新选择审核人后点击 确定 按钮,修改审核人完成。")]),a._v(" "),e("p",[a._v("修改后原审核人会收到邮件提醒无须再处理该申请。")]),a._v(" "),e("p",[a._v("修改后新的审核人会收到邮件提醒需要处理该申请。")]),a._v(" "),e("p",[a._v("审核通过后可以对接口进行发布操作,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/manager_aggregate_my_apply_detail_4.png",alt:"manager_aggregate_my_apply_detail_4"}})]),a._v(" "),e("p",[a._v("批量发布:对申请内的接口批量发布推送到Fizz网关。")]),a._v(" "),e("p",[a._v("批量回滚:对申请内的接口批量回滚到上一个版本,当发布后接口异常时该操作相当有用。")]),a._v(" "),e("p",[a._v("对于申请通过后又无须操作的接口可以执行撤回操作,撤回接口时必须填写备注信息用于回溯查询,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/manager_aggregate_my_apply_detail_5.png",alt:"manager_aggregate_my_apply_detail_5"}})]),a._v(" "),e("p",[e("img",{attrs:{src:"/manager_aggregate_my_apply_detail_6.png",alt:"manager_aggregate_my_apply_detail_6"}})])])}),[],!1,null,null,null);_.default=t.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/18.1301a626.js b/docs/assets/js/18.603a235b.js similarity index 52% rename from docs/assets/js/18.1301a626.js rename to docs/assets/js/18.603a235b.js index 819d3b6..61172ba 100644 --- a/docs/assets/js/18.1301a626.js +++ b/docs/assets/js/18.603a235b.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[18],{362:function(a,t,e){"use strict";e.r(t);var _=e(42),r=Object(_.a)({},(function(){var a=this,t=a.$createElement,e=a._self._c||t;return e("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[e("h2",{attrs:{id:"概述"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[a._v("#")]),a._v(" 概述")]),a._v(" "),e("p",[a._v("管理后台记录了聚合接口的新增、修改、发布、下线、回滚、删除操作日志,通过查看操作日志可以清楚地掌握接口的操作轨迹。操作日志功能提供界面查询聚合接口的操作日志。")]),a._v(" "),e("h2",{attrs:{id:"操作日志列表"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#操作日志列表"}},[a._v("#")]),a._v(" 操作日志列表")]),a._v(" "),e("p",[a._v("菜单位置:服务编排 > 操作日志。点击菜单后进入操作日志列表页面,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_op_log_list_query.png",alt:"manager_aggregate_op_log_list_query"}})]),a._v(" "),e("h2",{attrs:{id:"查看日志详情"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#查看日志详情"}},[a._v("#")]),a._v(" 查看日志详情")]),a._v(" "),e("p",[a._v("点击 查看 按钮弹出操作日志详情页面,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_op_log_detail_1.png",alt:"manager_aggregate_op_log_detail_1"}})]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_op_log_detail_2.png",alt:"manager_aggregate_op_log_detail_2"}})])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[18],{364:function(a,t,e){"use strict";e.r(t);var _=e(42),r=Object(_.a)({},(function(){var a=this,t=a.$createElement,e=a._self._c||t;return e("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[e("h2",{attrs:{id:"概述"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[a._v("#")]),a._v(" 概述")]),a._v(" "),e("p",[a._v("管理后台记录了聚合接口的新增、修改、发布、下线、回滚、删除操作日志,通过查看操作日志可以清楚地掌握接口的操作轨迹。操作日志功能提供界面查询聚合接口的操作日志。")]),a._v(" "),e("h2",{attrs:{id:"操作日志列表"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#操作日志列表"}},[a._v("#")]),a._v(" 操作日志列表")]),a._v(" "),e("p",[a._v("菜单位置:服务编排 > 操作日志。点击菜单后进入操作日志列表页面,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/manager_aggregate_op_log_list_query.png",alt:"manager_aggregate_op_log_list_query"}})]),a._v(" "),e("h2",{attrs:{id:"查看日志详情"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#查看日志详情"}},[a._v("#")]),a._v(" 查看日志详情")]),a._v(" "),e("p",[a._v("点击 查看 按钮弹出操作日志详情页面,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/manager_aggregate_op_log_detail_1.png",alt:"manager_aggregate_op_log_detail_1"}})]),a._v(" "),e("p",[e("img",{attrs:{src:"/manager_aggregate_op_log_detail_2.png",alt:"manager_aggregate_op_log_detail_2"}})])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/19.501fe444.js b/docs/assets/js/19.501fe444.js deleted file mode 100644 index 046b416..0000000 --- a/docs/assets/js/19.501fe444.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[19],{365:function(a,t,_){"use strict";_.r(t);var r=_(42),e=Object(r.a)({},(function(){var a=this,t=a.$createElement,_=a._self._c||t;return _("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[_("h2",{attrs:{id:"概述"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[a._v("#")]),a._v(" 概述")]),a._v(" "),_("p",[a._v("路由管理功能用于维护网关的路由规则,支持按请求路径转发、转发到指定后端服务两种转发规则,支持插件配置。下面介绍路由管理的操作。")]),a._v(" "),_("h2",{attrs:{id:"路由列表"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#路由列表"}},[a._v("#")]),a._v(" 路由列表")]),a._v(" "),_("p",[a._v("菜单位置:网关管理 > 路由管理。点击菜单后进入路由列表页面,如图所示。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/fizz-gateway-community/manager_api_auth_list_query.png",alt:"manager_api_auth_list_query"}})]),a._v(" "),_("h2",{attrs:{id:"新增路由"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#新增路由"}},[a._v("#")]),a._v(" 新增路由")]),a._v(" "),_("p",[a._v("点击 新增 按钮弹出新增窗口,如图所示。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/fizz-gateway-community/manager_api_auth_add_1.png",alt:"manager_api_auth_add_1"}})]),a._v(" "),_("p",[_("img",{attrs:{src:"/fizz-gateway-community/manager_api_auth_add_2.png",alt:"manager_api_auth_add_2"}})]),a._v(" "),_("p",[a._v("网关分组:选取路由关联的网关分组,只有属于所选分组的网关实例路由规则才会生效,必选;")]),a._v(" "),_("p",[a._v("服务:网关的请求路径格式为 http://{ip}:{port}/proxy/{service}{apiPath},服务对应{service}段,当 转发 选择 按请求路径转发 时服务需要是聚合配置的服务或者是Eureka注册的服务,当 转发 选择 转发到指定后端服务 时服务不需要是实际存在的服务,只用于路径匹配使用,长度不能超过50个字符,必填;")]),a._v(" "),_("p",[a._v("API方法:请求的method类型,可选GET|POST;")]),a._v(" "),_("p",[a._v('API Path:网关的请求路径格式为 http://{ip}:{port}/proxy/{service}{apiPath},API Path对应{apiPath}段,使用前缀匹配原则,例如"/api/"将匹配"/api/"、"/api/1"、"/api/1/1"等路径;')]),a._v(" "),_("p",[a._v("应用:选取路由关联的应用,网关使用选取应用的信息进行鉴权,更多详情请查看appID管理功能介绍;")]),a._v(" "),_("p",[a._v("访问:可选允许|禁止,必选;")]),a._v(" "),_("p",[a._v("转发:可选按请求路径转发|转发到指定后端服务,当选择 按请求路径转发 时,请求会按请求路径转发,例如网关请求 http://{ip}:{port}/proxy/my-service/api-path 将转发到 http://my-service/api-path;当选择 转发到指定后端服务 时,需要添加转发到的后端服务URL,请求会转发到配置的后端服务,例如配置了服务为 my-service,API Path为空,后端服务URL为 http://127.0.0.1:8080/forward-service/,网关请求 http://{ip}:{port}/proxy/my-service/api-path 将转发到 http://127.0.0.1:8080/forward-service/api-path。")]),a._v(" "),_("p",[a._v("点击 添加插件 按钮为路由添加插件,如图所示。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/fizz-gateway-community/manager_api_auth_add_3.png",alt:"manager_api_auth_add_3"}})]),a._v(" "),_("p",[a._v("配置插件路由级别的自定义配置,表单界面来自于插件的表单定义,更多详情请查看插件管理功能介绍。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/fizz-gateway-community/manager_api_auth_add_4.png",alt:"manager_api_auth_add_4"}})]),a._v(" "),_("p",[a._v("配置完成后点击 保存 按钮保存路由规则。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/fizz-gateway-community/manager_api_auth_add_5.png",alt:"manager_api_auth_add_5"}})]),a._v(" "),_("h2",{attrs:{id:"编辑路由"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#编辑路由"}},[a._v("#")]),a._v(" 编辑路由")]),a._v(" "),_("p",[a._v("点击 编辑 按钮弹出编辑窗口,如图所示。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/fizz-gateway-community/manager_api_auth_edit_1.png",alt:"manager_api_auth_edit_1"}})]),a._v(" "),_("p",[_("img",{attrs:{src:"/fizz-gateway-community/manager_api_auth_edit_2.png",alt:"manager_api_auth_edit_2"}})]),a._v(" "),_("h2",{attrs:{id:"删除路由"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#删除路由"}},[a._v("#")]),a._v(" 删除路由")]),a._v(" "),_("p",[a._v("点击 删除 按钮弹出删除确认窗口,如图所示。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/fizz-gateway-community/manager_api_auth_delete_1.png",alt:"manager_api_auth_delete_1"}})]),a._v(" "),_("p",[_("img",{attrs:{src:"/fizz-gateway-community/manager_api_auth_delete_2.png",alt:"manager_api_auth_delete_2"}})])])}),[],!1,null,null,null);t.default=e.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/19.5c4af839.js b/docs/assets/js/19.5c4af839.js new file mode 100644 index 0000000..242cbbb --- /dev/null +++ b/docs/assets/js/19.5c4af839.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[19],{365:function(a,t,_){"use strict";_.r(t);var r=_(42),p=Object(r.a)({},(function(){var a=this,t=a.$createElement,_=a._self._c||t;return _("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[_("h2",{attrs:{id:"概述"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[a._v("#")]),a._v(" 概述")]),a._v(" "),_("p",[a._v("路由管理功能用于维护网关的路由规则,支持按请求路径转发、转发到指定后端服务两种转发规则,支持插件配置。下面介绍路由管理的操作。")]),a._v(" "),_("h2",{attrs:{id:"路由列表"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#路由列表"}},[a._v("#")]),a._v(" 路由列表")]),a._v(" "),_("p",[a._v("菜单位置:网关管理 > 路由管理。点击菜单后进入路由列表页面,如图所示。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/manager_api_auth_list_query.png",alt:"manager_api_auth_list_query"}})]),a._v(" "),_("h2",{attrs:{id:"新增路由"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#新增路由"}},[a._v("#")]),a._v(" 新增路由")]),a._v(" "),_("p",[a._v("点击 新增 按钮弹出新增窗口,如图所示。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/manager_api_auth_add_1.png",alt:"manager_api_auth_add_1"}})]),a._v(" "),_("p",[_("img",{attrs:{src:"/manager_api_auth_add_2.png",alt:"manager_api_auth_add_2"}})]),a._v(" "),_("p",[a._v("网关分组:选取路由关联的网关分组,只有属于所选分组的网关实例路由规则才会生效,必选;")]),a._v(" "),_("p",[a._v("服务:网关的请求路径格式为 http://{ip}:{port}/proxy/{service}{apiPath},服务对应{service}段,当 转发 选择 按请求路径转发 时服务需要是聚合配置的服务或者是Eureka注册的服务,当 转发 选择 转发到指定后端服务 时服务不需要是实际存在的服务,只用于路径匹配使用,长度不能超过50个字符,必填;")]),a._v(" "),_("p",[a._v("API方法:请求的method类型,可选GET|POST;")]),a._v(" "),_("p",[a._v('API Path:网关的请求路径格式为 http://{ip}:{port}/proxy/{service}{apiPath},API Path对应{apiPath}段,使用前缀匹配原则,例如"/api/"将匹配"/api/"、"/api/1"、"/api/1/1"等路径;')]),a._v(" "),_("p",[a._v("应用:选取路由关联的应用,网关使用选取应用的信息进行鉴权,更多详情请查看appID管理功能介绍;")]),a._v(" "),_("p",[a._v("访问:可选允许|禁止,必选;")]),a._v(" "),_("p",[a._v("转发:可选按请求路径转发|转发到指定后端服务,当选择 按请求路径转发 时,请求会按请求路径转发,例如网关请求 http://{ip}:{port}/proxy/my-service/api-path 将转发到 http://my-service/api-path;当选择 转发到指定后端服务 时,需要添加转发到的后端服务URL,请求会转发到配置的后端服务,例如配置了服务为 my-service,API Path为空,后端服务URL为 http://127.0.0.1:8080/forward-service/,网关请求 http://{ip}:{port}/proxy/my-service/api-path 将转发到 http://127.0.0.1:8080/forward-service/api-path。")]),a._v(" "),_("p",[a._v("点击 添加插件 按钮为路由添加插件,如图所示。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/manager_api_auth_add_3.png",alt:"manager_api_auth_add_3"}})]),a._v(" "),_("p",[a._v("配置插件路由级别的自定义配置,表单界面来自于插件的表单定义,更多详情请查看插件管理功能介绍。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/manager_api_auth_add_4.png",alt:"manager_api_auth_add_4"}})]),a._v(" "),_("p",[a._v("配置完成后点击 保存 按钮保存路由规则。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/manager_api_auth_add_5.png",alt:"manager_api_auth_add_5"}})]),a._v(" "),_("h2",{attrs:{id:"编辑路由"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#编辑路由"}},[a._v("#")]),a._v(" 编辑路由")]),a._v(" "),_("p",[a._v("点击 编辑 按钮弹出编辑窗口,如图所示。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/manager_api_auth_edit_1.png",alt:"manager_api_auth_edit_1"}})]),a._v(" "),_("p",[_("img",{attrs:{src:"/manager_api_auth_edit_2.png",alt:"manager_api_auth_edit_2"}})]),a._v(" "),_("h2",{attrs:{id:"删除路由"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#删除路由"}},[a._v("#")]),a._v(" 删除路由")]),a._v(" "),_("p",[a._v("点击 删除 按钮弹出删除确认窗口,如图所示。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/manager_api_auth_delete_1.png",alt:"manager_api_auth_delete_1"}})]),a._v(" "),_("p",[_("img",{attrs:{src:"/manager_api_auth_delete_2.png",alt:"manager_api_auth_delete_2"}})])])}),[],!1,null,null,null);t.default=p.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/20.1bf2bcbb.js b/docs/assets/js/20.1bf2bcbb.js new file mode 100644 index 0000000..5c58ea4 --- /dev/null +++ b/docs/assets/js/20.1bf2bcbb.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[20],{366:function(a,_,p){"use strict";p.r(_);var t=p(42),r=Object(t.a)({},(function(){var a=this,_=a.$createElement,p=a._self._c||_;return p("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[p("h2",{attrs:{id:"概述"}},[p("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[a._v("#")]),a._v(" 概述")]),a._v(" "),p("p",[a._v("appID管理功能维护应用鉴权信息,可配置是否启用签名、是否启用IP白名单,AppID级别的自定义配置供自定义插件使用。appID用于在路由管理配置中关联路由规则,当对应路由规则触发时会对应用进行鉴权。")]),a._v(" "),p("h2",{attrs:{id:"appid列表"}},[p("a",{staticClass:"header-anchor",attrs:{href:"#appid列表"}},[a._v("#")]),a._v(" appID列表")]),a._v(" "),p("p",[a._v("菜单位置:网关管理 > appID管理。点击菜单后进入appID列表页面,如图所示。")]),a._v(" "),p("p",[p("img",{attrs:{src:"/manager_app_id_list_query.png",alt:"manager_app_id_list_query"}})]),a._v(" "),p("h2",{attrs:{id:"新增appid"}},[p("a",{staticClass:"header-anchor",attrs:{href:"#新增appid"}},[a._v("#")]),a._v(" 新增appID")]),a._v(" "),p("p",[a._v("点击 新增 按钮弹出新增窗口,如图所示。")]),a._v(" "),p("p",[p("img",{attrs:{src:"/manager_app_id_add_1.png",alt:"manager_app_id_add_1"}})]),a._v(" "),p("p",[p("img",{attrs:{src:"/manager_app_id_add_2.png",alt:"manager_app_id_add_2"}})]),a._v(" "),p("p",[a._v("appID:第三方应用唯一标识,长度不能超过64个字符,必填;")]),a._v(" "),p("p",[a._v("应用名:第三方应用名称,长度不能超过128个字符,必填;")]),a._v(" "),p("p",[a._v("是否启用签名:当启动时必须配置 认证方式 和 密钥;")]),a._v(" "),p("p",[a._v("认证方式:可选 密钥(使用网关内置鉴权方式验证)|自定义认证插件(使用自定义的鉴权逻辑),更多信息请查看Fizz网关的介绍;启用签名时必填;")]),a._v(" "),p("p",[a._v("密钥:第三方应用使用的密钥,可通过 生成随机密钥 按钮生成一个随机的密钥,启用签名时必填;")]),a._v(" "),p("p",[a._v("是否启用IP白名单:当启用时可以配置 IP白名单,网关会根据请求来源IP地址进行过滤;")]),a._v(" "),p("p",[a._v("IP白名单:IP段支持 1.2.3.100-120 和 1.2.3.*两种格式,仅最后一段可用范围或星号表示;")]),a._v(" "),p("p",[a._v("自定义配置:AppID级别的自定义配置供自定义插件使用,所有插件均可获取到此配置信息。")]),a._v(" "),p("h2",{attrs:{id:"编辑appid"}},[p("a",{staticClass:"header-anchor",attrs:{href:"#编辑appid"}},[a._v("#")]),a._v(" 编辑appID")]),a._v(" "),p("p",[a._v("点击 编辑 按钮弹出编辑窗口,如图所示。")]),a._v(" "),p("p",[p("img",{attrs:{src:"/manager_app_id_edit_1.png",alt:"manager_app_id_edit_1"}})]),a._v(" "),p("p",[p("img",{attrs:{src:"/manager_app_id_edit_2.png",alt:"manager_app_id_edit_2"}})]),a._v(" "),p("h2",{attrs:{id:"删除appid"}},[p("a",{staticClass:"header-anchor",attrs:{href:"#删除appid"}},[a._v("#")]),a._v(" 删除appID")]),a._v(" "),p("p",[a._v("点击 删除 按钮弹出删除确认窗口,如图所示。")]),a._v(" "),p("p",[p("img",{attrs:{src:"/manager_app_id_delete_1.png",alt:"manager_app_id_delete_1"}})]),a._v(" "),p("p",[p("img",{attrs:{src:"/manager_app_id_delete_2.png",alt:"manager_app_id_delete_2"}})]),a._v(" "),p("p",[a._v("点击 确定 按钮后删除appID,如果appID存在关联的路由配置时,对应关联的路由配置也会一起删除。")])])}),[],!1,null,null,null);_.default=r.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/20.94c02b34.js b/docs/assets/js/20.94c02b34.js deleted file mode 100644 index 0f70c52..0000000 --- a/docs/assets/js/20.94c02b34.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[20],{366:function(a,_,p){"use strict";p.r(_);var t=p(42),e=Object(t.a)({},(function(){var a=this,_=a.$createElement,p=a._self._c||_;return p("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[p("h2",{attrs:{id:"概述"}},[p("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[a._v("#")]),a._v(" 概述")]),a._v(" "),p("p",[a._v("appID管理功能维护应用鉴权信息,可配置是否启用签名、是否启用IP白名单,AppID级别的自定义配置供自定义插件使用。appID用于在路由管理配置中关联路由规则,当对应路由规则触发时会对应用进行鉴权。")]),a._v(" "),p("h2",{attrs:{id:"appid列表"}},[p("a",{staticClass:"header-anchor",attrs:{href:"#appid列表"}},[a._v("#")]),a._v(" appID列表")]),a._v(" "),p("p",[a._v("菜单位置:网关管理 > appID管理。点击菜单后进入appID列表页面,如图所示。")]),a._v(" "),p("p",[p("img",{attrs:{src:"/fizz-gateway-community/manager_app_id_list_query.png",alt:"manager_app_id_list_query"}})]),a._v(" "),p("h2",{attrs:{id:"新增appid"}},[p("a",{staticClass:"header-anchor",attrs:{href:"#新增appid"}},[a._v("#")]),a._v(" 新增appID")]),a._v(" "),p("p",[a._v("点击 新增 按钮弹出新增窗口,如图所示。")]),a._v(" "),p("p",[p("img",{attrs:{src:"/fizz-gateway-community/manager_app_id_add_1.png",alt:"manager_app_id_add_1"}})]),a._v(" "),p("p",[p("img",{attrs:{src:"/fizz-gateway-community/manager_app_id_add_2.png",alt:"manager_app_id_add_2"}})]),a._v(" "),p("p",[a._v("appID:第三方应用唯一标识,长度不能超过64个字符,必填;")]),a._v(" "),p("p",[a._v("应用名:第三方应用名称,长度不能超过128个字符,必填;")]),a._v(" "),p("p",[a._v("是否启用签名:当启动时必须配置 认证方式 和 密钥;")]),a._v(" "),p("p",[a._v("认证方式:可选 密钥(使用网关内置鉴权方式验证)|自定义认证插件(使用自定义的鉴权逻辑),更多信息请查看Fizz网关的介绍;启用签名时必填;")]),a._v(" "),p("p",[a._v("密钥:第三方应用使用的密钥,可通过 生成随机密钥 按钮生成一个随机的密钥,启用签名时必填;")]),a._v(" "),p("p",[a._v("是否启用IP白名单:当启用时可以配置 IP白名单,网关会根据请求来源IP地址进行过滤;")]),a._v(" "),p("p",[a._v("IP白名单:IP段支持 1.2.3.100-120 和 1.2.3.*两种格式,仅最后一段可用范围或星号表示;")]),a._v(" "),p("p",[a._v("自定义配置:AppID级别的自定义配置供自定义插件使用,所有插件均可获取到此配置信息。")]),a._v(" "),p("h2",{attrs:{id:"编辑appid"}},[p("a",{staticClass:"header-anchor",attrs:{href:"#编辑appid"}},[a._v("#")]),a._v(" 编辑appID")]),a._v(" "),p("p",[a._v("点击 编辑 按钮弹出编辑窗口,如图所示。")]),a._v(" "),p("p",[p("img",{attrs:{src:"/fizz-gateway-community/manager_app_id_edit_1.png",alt:"manager_app_id_edit_1"}})]),a._v(" "),p("p",[p("img",{attrs:{src:"/fizz-gateway-community/manager_app_id_edit_2.png",alt:"manager_app_id_edit_2"}})]),a._v(" "),p("h2",{attrs:{id:"删除appid"}},[p("a",{staticClass:"header-anchor",attrs:{href:"#删除appid"}},[a._v("#")]),a._v(" 删除appID")]),a._v(" "),p("p",[a._v("点击 删除 按钮弹出删除确认窗口,如图所示。")]),a._v(" "),p("p",[p("img",{attrs:{src:"/fizz-gateway-community/manager_app_id_delete_1.png",alt:"manager_app_id_delete_1"}})]),a._v(" "),p("p",[p("img",{attrs:{src:"/fizz-gateway-community/manager_app_id_delete_2.png",alt:"manager_app_id_delete_2"}})]),a._v(" "),p("p",[a._v("点击 确定 按钮后删除appID,如果appID存在关联的路由配置时,对应关联的路由配置也会一起删除。")])])}),[],!1,null,null,null);_.default=e.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/21.dca6f5c4.js b/docs/assets/js/21.dca6f5c4.js new file mode 100644 index 0000000..d131c88 --- /dev/null +++ b/docs/assets/js/21.dca6f5c4.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[21],{367:function(a,e,t){"use strict";t.r(e);var _=t(42),r=Object(_.a)({},(function(){var a=this,e=a.$createElement,t=a._self._c||e;return t("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[t("h2",{attrs:{id:"概述"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[a._v("#")]),a._v(" 概述")]),a._v(" "),t("p",[a._v("网关缓存功能用于查询Fizz网关实例本地缓存的已发布接口信息,可以快速的了解当前网关实例生效的全部接口,同时通过查看后台接口发布版本号与网关实例本地缓存的接口版本号是否一致可以排查接口缓存问题,下面介绍网关缓存功能的操作。")]),a._v(" "),t("h2",{attrs:{id:"网关列表"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#网关列表"}},[a._v("#")]),a._v(" 网关列表")]),a._v(" "),t("p",[a._v("菜单位置:服务编排 > 网关缓存。点击菜单后进入网关列表页面,如图所示。")]),a._v(" "),t("p",[t("img",{attrs:{src:"/manager_aggregate_gateway_list_query.png",alt:"manager_aggregate_gateway_list_query"}})]),a._v(" "),t("p",[a._v("Fizz网关与后台注册到同一个eureka注册中心,后台通过eureka获取网关的实例列表。")]),a._v(" "),t("h2",{attrs:{id:"网关缓存列表"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#网关缓存列表"}},[a._v("#")]),a._v(" 网关缓存列表")]),a._v(" "),t("p",[a._v("点击 查看 按钮后弹出网关详情页面,该页面显示所选网关实例的接口缓存列表,如图所示。")]),a._v(" "),t("p",[t("img",{attrs:{src:"/manager_aggregate_gateway_cache_list_query_1.png",alt:"manager_aggregate_gateway_cache_list_query_1"}})]),a._v(" "),t("p",[t("img",{attrs:{src:"/manager_aggregate_gateway_cache_list_query_2.png",alt:"manager_aggregate_gateway_cache_list_query_2"}})]),a._v(" "),t("h2",{attrs:{id:"网关缓存详情"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#网关缓存详情"}},[a._v("#")]),a._v(" 网关缓存详情")]),a._v(" "),t("p",[a._v("点击 查看 按钮弹出所选接口的配置详情,如图所示。")]),a._v(" "),t("p",[t("img",{attrs:{src:"/manager_aggregate_gateway_cache_detail_1.png",alt:"manager_aggregate_gateway_cache_detail_1"}})]),a._v(" "),t("p",[t("img",{attrs:{src:"/manager_aggregate_gateway_cache_detail_2.png",alt:"manager_aggregate_gateway_cache_detail_2"}})])])}),[],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/21.ff5e068c.js b/docs/assets/js/21.ff5e068c.js deleted file mode 100644 index b3b4eb7..0000000 --- a/docs/assets/js/21.ff5e068c.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[21],{367:function(a,t,e){"use strict";e.r(t);var _=e(42),r=Object(_.a)({},(function(){var a=this,t=a.$createElement,e=a._self._c||t;return e("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[e("h2",{attrs:{id:"概述"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[a._v("#")]),a._v(" 概述")]),a._v(" "),e("p",[a._v("网关缓存功能用于查询Fizz网关实例本地缓存的已发布接口信息,可以快速的了解当前网关实例生效的全部接口,同时通过查看后台接口发布版本号与网关实例本地缓存的接口版本号是否一致可以排查接口缓存问题,下面介绍网关缓存功能的操作。")]),a._v(" "),e("h2",{attrs:{id:"网关列表"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#网关列表"}},[a._v("#")]),a._v(" 网关列表")]),a._v(" "),e("p",[a._v("菜单位置:服务编排 > 网关缓存。点击菜单后进入网关列表页面,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_gateway_list_query.png",alt:"manager_aggregate_gateway_list_query"}})]),a._v(" "),e("p",[a._v("Fizz网关与后台注册到同一个eureka注册中心,后台通过eureka获取网关的实例列表。")]),a._v(" "),e("h2",{attrs:{id:"网关缓存列表"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#网关缓存列表"}},[a._v("#")]),a._v(" 网关缓存列表")]),a._v(" "),e("p",[a._v("点击 查看 按钮后弹出网关详情页面,该页面显示所选网关实例的接口缓存列表,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_gateway_cache_list_query_1.png",alt:"manager_aggregate_gateway_cache_list_query_1"}})]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_gateway_cache_list_query_2.png",alt:"manager_aggregate_gateway_cache_list_query_2"}})]),a._v(" "),e("h2",{attrs:{id:"网关缓存详情"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#网关缓存详情"}},[a._v("#")]),a._v(" 网关缓存详情")]),a._v(" "),e("p",[a._v("点击 查看 按钮弹出所选接口的配置详情,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_gateway_cache_detail_1.png",alt:"manager_aggregate_gateway_cache_detail_1"}})]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_aggregate_gateway_cache_detail_2.png",alt:"manager_aggregate_gateway_cache_detail_2"}})])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/22.1f3d545e.js b/docs/assets/js/22.1f3d545e.js deleted file mode 100644 index 6ad82f5..0000000 --- a/docs/assets/js/22.1f3d545e.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[22],{370:function(a,t,_){"use strict";_.r(t);var r=_(42),e=Object(r.a)({},(function(){var a=this,t=a.$createElement,_=a._self._c||t;return _("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[_("h2",{attrs:{id:"概述"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[a._v("#")]),a._v(" 概述")]),a._v(" "),_("p",[a._v("网关分组功能用于维护分组元数据,将网关实例IP与分组关联,通过为不同的分组配置不同的路由策略,从而实现网关的分组管理。")]),a._v(" "),_("h2",{attrs:{id:"分组示例"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#分组示例"}},[a._v("#")]),a._v(" 分组示例")]),a._v(" "),_("p",[a._v("我们的线上业务涉及To C(个人用户)、To B(企业)、To T(第三方),对于不同业务会有对应的机器接受请求访问,不同的业务需要有各自的路由策略,因此进行了如下的分组划分。")]),a._v(" "),_("table",[_("thead",[_("tr",[_("th",[a._v("分组ID")]),a._v(" "),_("th",[a._v("分组名称")]),a._v(" "),_("th",[a._v("描述")])])]),a._v(" "),_("tbody",[_("tr",[_("td",[a._v("default")]),a._v(" "),_("td",[a._v("默认分组")]),a._v(" "),_("td",[a._v("默认分组是后台默认创建的分组,不用指定IP,不属于其它分组的机器都归到默认分组,默认分组不可修改或删除")])]),a._v(" "),_("tr",[_("td",[a._v("c")]),a._v(" "),_("td",[a._v("2c分组")]),a._v(" "),_("td",[a._v("只接受面向个人用户的请求")])]),a._v(" "),_("tr",[_("td",[a._v("b")]),a._v(" "),_("td",[a._v("2b分组")]),a._v(" "),_("td",[a._v("只接受面向企业的请求")])]),a._v(" "),_("tr",[_("td",[a._v("t")]),a._v(" "),_("td",[a._v("面向第三方的分组")]),a._v(" "),_("td",[a._v("只接受面向第三方的请求")])])])]),a._v(" "),_("p",[a._v("下面介绍网关分组功能的操作。")]),a._v(" "),_("h2",{attrs:{id:"分组列表"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#分组列表"}},[a._v("#")]),a._v(" 分组列表")]),a._v(" "),_("p",[a._v("菜单位置:网关管理 > 网关分组。点击菜单后进入分组列表页面,如图所示。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/fizz-gateway-community/manager_gateway_group_list_query.png",alt:"manager_gateway_group_list_query"}})]),a._v(" "),_("h2",{attrs:{id:"新增分组"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#新增分组"}},[a._v("#")]),a._v(" 新增分组")]),a._v(" "),_("p",[a._v("点击 新增 按钮弹出新增窗口,如图所示。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/fizz-gateway-community/manager_gateway_group_add_1.png",alt:"manager_gateway_group_add_1"}})]),a._v(" "),_("p",[_("img",{attrs:{src:"/fizz-gateway-community/manager_gateway_group_add_2.png",alt:"manager_gateway_group_add_2"}})]),a._v(" "),_("p",[a._v("分组ID:分组的唯一标识,长度不能超过32个字符,必填;")]),a._v(" "),_("p",[a._v("分组名称:分组的名称,用于在分组选项时展示,长度不能超过32个字符,必填;")]),a._v(" "),_("p",[a._v("网关实例IP:Fizz网关集群内的机器IP地址,多个IP地址使用逗号分隔。")]),a._v(" "),_("h2",{attrs:{id:"编辑分组"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#编辑分组"}},[a._v("#")]),a._v(" 编辑分组")]),a._v(" "),_("p",[a._v("点击 编辑 按钮弹出编辑窗口,如图所示。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/fizz-gateway-community/manager_gateway_group_edit_1.png",alt:"manager_gateway_group_edit_1"}})]),a._v(" "),_("p",[_("img",{attrs:{src:"/fizz-gateway-community/manager_gateway_group_edit_2.png",alt:"manager_gateway_group_edit_2"}})]),a._v(" "),_("h2",{attrs:{id:"删除分组"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#删除分组"}},[a._v("#")]),a._v(" 删除分组")]),a._v(" "),_("p",[a._v("点击 删除 按钮弹出删除确认窗口,如图所示。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/fizz-gateway-community/manager_gateway_group_delete_1.png",alt:"manager_gateway_group_delete_1"}})]),a._v(" "),_("p",[_("img",{attrs:{src:"/fizz-gateway-community/manager_gateway_group_delete_2.png",alt:"manager_gateway_group_delete_2"}})]),a._v(" "),_("p",[a._v("点击 确定 按钮后删除网关分组,如果网关分组存在关联的路由配置时,需要将关联的路由配置全部删除后才能删除分组。")])])}),[],!1,null,null,null);t.default=e.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/22.db62cc12.js b/docs/assets/js/22.db62cc12.js new file mode 100644 index 0000000..60bd5b1 --- /dev/null +++ b/docs/assets/js/22.db62cc12.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[22],{368:function(_,a,t){"use strict";t.r(a);var r=t(42),e=Object(r.a)({},(function(){var _=this,a=_.$createElement,t=_._self._c||a;return t("ContentSlotsDistributor",{attrs:{"slot-key":_.$parent.slotKey}},[t("h2",{attrs:{id:"概述"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[_._v("#")]),_._v(" 概述")]),_._v(" "),t("p",[_._v("网关分组功能用于维护分组元数据,将网关实例IP与分组关联,通过为不同的分组配置不同的路由策略,从而实现网关的分组管理。")]),_._v(" "),t("h2",{attrs:{id:"分组示例"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#分组示例"}},[_._v("#")]),_._v(" 分组示例")]),_._v(" "),t("p",[_._v("我们的线上业务涉及To C(个人用户)、To B(企业)、To T(第三方),对于不同业务会有对应的机器接受请求访问,不同的业务需要有各自的路由策略,因此进行了如下的分组划分。")]),_._v(" "),t("table",[t("thead",[t("tr",[t("th",[_._v("分组ID")]),_._v(" "),t("th",[_._v("分组名称")]),_._v(" "),t("th",[_._v("描述")])])]),_._v(" "),t("tbody",[t("tr",[t("td",[_._v("default")]),_._v(" "),t("td",[_._v("默认分组")]),_._v(" "),t("td",[_._v("默认分组是后台默认创建的分组,不用指定IP,不属于其它分组的机器都归到默认分组,默认分组不可修改或删除")])]),_._v(" "),t("tr",[t("td",[_._v("c")]),_._v(" "),t("td",[_._v("2c分组")]),_._v(" "),t("td",[_._v("只接受面向个人用户的请求")])]),_._v(" "),t("tr",[t("td",[_._v("b")]),_._v(" "),t("td",[_._v("2b分组")]),_._v(" "),t("td",[_._v("只接受面向企业的请求")])]),_._v(" "),t("tr",[t("td",[_._v("t")]),_._v(" "),t("td",[_._v("面向第三方的分组")]),_._v(" "),t("td",[_._v("只接受面向第三方的请求")])])])]),_._v(" "),t("p",[_._v("下面介绍网关分组功能的操作。")]),_._v(" "),t("h2",{attrs:{id:"分组列表"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#分组列表"}},[_._v("#")]),_._v(" 分组列表")]),_._v(" "),t("p",[_._v("菜单位置:网关管理 > 网关分组。点击菜单后进入分组列表页面,如图所示。")]),_._v(" "),t("p",[t("img",{attrs:{src:"/manager_gateway_group_list_query.png",alt:"manager_gateway_group_list_query"}})]),_._v(" "),t("h2",{attrs:{id:"新增分组"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#新增分组"}},[_._v("#")]),_._v(" 新增分组")]),_._v(" "),t("p",[_._v("点击 新增 按钮弹出新增窗口,如图所示。")]),_._v(" "),t("p",[t("img",{attrs:{src:"/manager_gateway_group_add_1.png",alt:"manager_gateway_group_add_1"}})]),_._v(" "),t("p",[t("img",{attrs:{src:"/manager_gateway_group_add_2.png",alt:"manager_gateway_group_add_2"}})]),_._v(" "),t("p",[_._v("分组ID:分组的唯一标识,长度不能超过32个字符,必填;")]),_._v(" "),t("p",[_._v("分组名称:分组的名称,用于在分组选项时展示,长度不能超过32个字符,必填;")]),_._v(" "),t("p",[_._v("网关实例IP:Fizz网关集群内的机器IP地址,多个IP地址使用逗号分隔。")]),_._v(" "),t("h2",{attrs:{id:"编辑分组"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#编辑分组"}},[_._v("#")]),_._v(" 编辑分组")]),_._v(" "),t("p",[_._v("点击 编辑 按钮弹出编辑窗口,如图所示。")]),_._v(" "),t("p",[t("img",{attrs:{src:"/manager_gateway_group_edit_1.png",alt:"manager_gateway_group_edit_1"}})]),_._v(" "),t("p",[t("img",{attrs:{src:"/manager_gateway_group_edit_2.png",alt:"manager_gateway_group_edit_2"}})]),_._v(" "),t("h2",{attrs:{id:"删除分组"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#删除分组"}},[_._v("#")]),_._v(" 删除分组")]),_._v(" "),t("p",[_._v("点击 删除 按钮弹出删除确认窗口,如图所示。")]),_._v(" "),t("p",[t("img",{attrs:{src:"/manager_gateway_group_delete_1.png",alt:"manager_gateway_group_delete_1"}})]),_._v(" "),t("p",[t("img",{attrs:{src:"/manager_gateway_group_delete_2.png",alt:"manager_gateway_group_delete_2"}})]),_._v(" "),t("p",[_._v("点击 确定 按钮后删除网关分组,如果网关分组存在关联的路由配置时,需要将关联的路由配置全部删除后才能删除分组。")])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/23.e4fc3148.js b/docs/assets/js/23.5b796ecf.js similarity index 89% rename from docs/assets/js/23.e4fc3148.js rename to docs/assets/js/23.5b796ecf.js index 0cc333b..6e6ccac 100644 --- a/docs/assets/js/23.e4fc3148.js +++ b/docs/assets/js/23.5b796ecf.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[23],{368:function(v,_,i){"use strict";i.r(_);var a=i(42),t=Object(a.a)({},(function(){var v=this,_=v.$createElement,i=v._self._c||_;return i("ContentSlotsDistributor",{attrs:{"slot-key":v.$parent.slotKey}},[i("h2",{attrs:{id:"概述"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[v._v("#")]),v._v(" 概述")]),v._v(" "),i("p",[v._v("Fizz管理后台是Fizz网关的配套系统,基于Java、Vue开发,通过界面对Fizz网关集群进行各项配置。")]),v._v(" "),i("h2",{attrs:{id:"功能"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#功能"}},[v._v("#")]),v._v(" 功能")]),v._v(" "),i("p",[v._v("Fizz管理后台包含如下功能:")]),v._v(" "),i("ul",[i("li",[v._v("网关管理\n"),i("ul",[i("li",[v._v("网关分组:对Fizz网关集群内的机器进行逻辑上的分组,针对不同的分组可配置不同的路由策略。")]),v._v(" "),i("li",[v._v("插件管理:维护插件元数据,定义路由级别的自定义属性、插件级别的自定义配置信息。")]),v._v(" "),i("li",[v._v("appID管理:配置应用鉴权信息,可配置是否启用签名、是否启用IP白名单,AppID级别的自定义配置供自定义插件使用。")]),v._v(" "),i("li",[v._v("路由管理:配置服务或API路由规则,支持按请求路径转发、转发到指定后端服务两种转发规则,支持插件配置。")]),v._v(" "),i("li",[v._v("接口统计:Fizz网关接口访问统计功能,以图表的形式展示指定时间段内每日的接口总数、访问次数,可查看接口的历史访问总次数以及最近请求时间。")])])]),v._v(" "),i("li",[v._v("服务编排\n"),i("ul",[i("li",[v._v("服务管理:聚合接口归属于服务,服务通过该功能维护,创建人自动获得服务权限,服务权限可分配,拥有权限的用户才能操作对应的接口列表。")]),v._v(" "),i("li",[v._v("接口列表:基于现有的业务微服务使用在线配置的方式快速的生成一个聚合接口,同时提供在线测试功能,发布历史版本查看。")]),v._v(" "),i("li",[v._v("操作日志:查看聚合接口的新增、修改、发布、下线、回滚、删除操作日志。")]),v._v(" "),i("li",[v._v("网关缓存:查看Fizz网关当前在线的实例列表以及对应实例本地缓存的已发布接口信息。")])])]),v._v(" "),i("li",[v._v("发布申请\n"),i("ul",[i("li",[v._v("我的申请:提交接口发布|下线申请,审核通过后可以对相关接口执行发布|下线操作。")]),v._v(" "),i("li",[v._v("待审核:审核发布|下线申请。")]),v._v(" "),i("li",[v._v("审核日志:查看审核发布|下线申请操作日志。")])])]),v._v(" "),i("li",[v._v("权限管理\n"),i("ul",[i("li",[v._v("角色管理:维护角色数据,为角色分配权限。")])])]),v._v(" "),i("li",[v._v("系统管理\n"),i("ul",[i("li",[v._v("用户管理:维护用户数据,为用户分配角色。")])])])]),v._v(" "),i("h2",{attrs:{id:"界面"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#界面"}},[v._v("#")]),v._v(" 界面")]),v._v(" "),i("p",[i("img",{attrs:{src:"/fizz-gateway-community/manager_overview_1.png",alt:"manager_overview_1"}})]),v._v(" "),i("p",[i("img",{attrs:{src:"/fizz-gateway-community/manager_overview_2.png",alt:"manager_overview_2"}})])])}),[],!1,null,null,null);_.default=t.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[23],{369:function(v,_,i){"use strict";i.r(_);var a=i(42),t=Object(a.a)({},(function(){var v=this,_=v.$createElement,i=v._self._c||_;return i("ContentSlotsDistributor",{attrs:{"slot-key":v.$parent.slotKey}},[i("h2",{attrs:{id:"概述"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[v._v("#")]),v._v(" 概述")]),v._v(" "),i("p",[v._v("Fizz管理后台是Fizz网关的配套系统,基于Java、Vue开发,通过界面对Fizz网关集群进行各项配置。")]),v._v(" "),i("h2",{attrs:{id:"功能"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#功能"}},[v._v("#")]),v._v(" 功能")]),v._v(" "),i("p",[v._v("Fizz管理后台包含如下功能:")]),v._v(" "),i("ul",[i("li",[v._v("网关管理\n"),i("ul",[i("li",[v._v("网关分组:对Fizz网关集群内的机器进行逻辑上的分组,针对不同的分组可配置不同的路由策略。")]),v._v(" "),i("li",[v._v("插件管理:维护插件元数据,定义路由级别的自定义属性、插件级别的自定义配置信息。")]),v._v(" "),i("li",[v._v("appID管理:配置应用鉴权信息,可配置是否启用签名、是否启用IP白名单,AppID级别的自定义配置供自定义插件使用。")]),v._v(" "),i("li",[v._v("路由管理:配置服务或API路由规则,支持按请求路径转发、转发到指定后端服务两种转发规则,支持插件配置。")]),v._v(" "),i("li",[v._v("接口统计:Fizz网关接口访问统计功能,以图表的形式展示指定时间段内每日的接口总数、访问次数,可查看接口的历史访问总次数以及最近请求时间。")])])]),v._v(" "),i("li",[v._v("服务编排\n"),i("ul",[i("li",[v._v("服务管理:聚合接口归属于服务,服务通过该功能维护,创建人自动获得服务权限,服务权限可分配,拥有权限的用户才能操作对应的接口列表。")]),v._v(" "),i("li",[v._v("接口列表:基于现有的业务微服务使用在线配置的方式快速的生成一个聚合接口,同时提供在线测试功能,发布历史版本查看。")]),v._v(" "),i("li",[v._v("操作日志:查看聚合接口的新增、修改、发布、下线、回滚、删除操作日志。")]),v._v(" "),i("li",[v._v("网关缓存:查看Fizz网关当前在线的实例列表以及对应实例本地缓存的已发布接口信息。")])])]),v._v(" "),i("li",[v._v("发布申请\n"),i("ul",[i("li",[v._v("我的申请:提交接口发布|下线申请,审核通过后可以对相关接口执行发布|下线操作。")]),v._v(" "),i("li",[v._v("待审核:审核发布|下线申请。")]),v._v(" "),i("li",[v._v("审核日志:查看审核发布|下线申请操作日志。")])])]),v._v(" "),i("li",[v._v("权限管理\n"),i("ul",[i("li",[v._v("角色管理:维护角色数据,为角色分配权限。")])])]),v._v(" "),i("li",[v._v("系统管理\n"),i("ul",[i("li",[v._v("用户管理:维护用户数据,为用户分配角色。")])])])]),v._v(" "),i("h2",{attrs:{id:"界面"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#界面"}},[v._v("#")]),v._v(" 界面")]),v._v(" "),i("p",[i("img",{attrs:{src:"/manager_overview_1.png",alt:"manager_overview_1"}})]),v._v(" "),i("p",[i("img",{attrs:{src:"/manager_overview_2.png",alt:"manager_overview_2"}})])])}),[],!1,null,null,null);_.default=t.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/24.72fe0b8b.js b/docs/assets/js/24.72fe0b8b.js new file mode 100644 index 0000000..2ad6773 --- /dev/null +++ b/docs/assets/js/24.72fe0b8b.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[24],{370:function(t,s,a){"use strict";a.r(s);var n=a(42),r=Object(n.a)({},(function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h2",{attrs:{id:"概述"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[t._v("#")]),t._v(" 概述")]),t._v(" "),a("p",[t._v("插件管理功能用于维护插件元数据,定义路由级别的自定义属性、插件级别的自定义配置信息。创建的插件用于路由管理设置时启用,当网关接受请求匹配路由规则时会触发启用的插件逻辑执行,插件逻辑中可获取到自定义的属性数据。")]),t._v(" "),a("h2",{attrs:{id:"插件列表"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#插件列表"}},[t._v("#")]),t._v(" 插件列表")]),t._v(" "),a("p",[t._v("菜单位置:网关管理 > 插件管理。点击菜单后进入插件管理列表页面,如图所示。")]),t._v(" "),a("p",[a("img",{attrs:{src:"/manager_plugin_list_query.png",alt:"manager_plugin_list_query"}})]),t._v(" "),a("h2",{attrs:{id:"新增插件"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#新增插件"}},[t._v("#")]),t._v(" 新增插件")]),t._v(" "),a("p",[t._v("点击 新增 按钮弹出新增窗口,如图所示。")]),t._v(" "),a("p",[a("img",{attrs:{src:"/manager_plugin_add_1.png",alt:"manager_plugin_add_1"}})]),t._v(" "),a("p",[a("img",{attrs:{src:"/manager_plugin_add_2.png",alt:"manager_plugin_add_2"}})]),t._v(" "),a("p",[t._v("插件名称:插件名称由英文字母、下划线或数字组成,不能以数字开头,长度不能超过50个字符,必填;")]),t._v(" "),a("p",[t._v("插件描述:插件的简要描述,长度不能超过50个字符,必填;")]),t._v(" "),a("p",[t._v("默认执行顺序:插件的默认执行顺序,按从小到大排序,值越小越先执行,取值范围0~255,必填;")]),t._v(" "),a("p",[t._v("表单定义:路由级别的自定义属性,在路由管理配置启用插件时前端会将表单定义转化为表单输入界面,更多信息请查看路由管理介绍。表单规范说明如下:")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/*\n* plugin_config_design\n* 动态插件参考结构\n* */")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" pluginConfig "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* 必有字段 */")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"field"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"inputVal"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"输入框"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"component"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"input"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// input, select, radio, checkbox,")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"dataType"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// number(long, double), string, boolean, array")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* 可选字段 */")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"desc"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"字段的说明文字"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"placeholder"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"placeholder文字"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"default"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Aa123"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 初始默认值")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"options"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// for select, radio, checkbox")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"选项1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// number(long, double), string, boolean,")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"选项2"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"rules"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// min|max / range / length / regex pattern")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"required"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"message"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"输入框不能为空"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"trigger"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"change"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// required 必填")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// { "min": 3, "ma x": 5, "message": "长度在 3 到 5 个字符", "trigger": "change" }, // range 长度范围(for dataType:"string")')]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// { "len": 8, "message": "长度需 8 个字符", "trigger": "change" }, // length 长度限制(for dataType:"string")')]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// { "type": "number", "message": "请输入数字类型"}, // for dataType:"number" 校验数值')]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// { "type": "integer", "message": "请输入整数数值", "trigger": "change" }, // for dataType:"long" 校验整数')]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// { "type": "float", "message": "请输入浮点数数值", "trigger": "change" }, // for dataType:"double" 校验浮点数')]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"pattern"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"^[A-Za-z\\\\d]+$"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"message"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"只能是字母或数字"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"trigger"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"change"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// regex pattern正则")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"field"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"selectVal"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"选择器"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"component"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"select"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"dataType"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"options"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"选项1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"选项2"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"选项3"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"desc"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"选择器的说明文字"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"placeholder"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"请选择"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"rules"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"required"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"message"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"选择器不能为空"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"trigger"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"change"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"field"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"radioVal"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"单选框"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"component"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"radio"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"dataType"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"boolean"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"default"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"options"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"是"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"否"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"desc"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"单选框的说明文字"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"rules"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"required"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"message"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"请选择单选框"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"trigger"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"change"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"field"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"checkboxVal"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"多选框"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"component"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"checkbox"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"dataType"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"array"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"options"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"选项1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("11")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"选项2"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("22")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"选项3"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("33")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"desc"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"多选框的说明文字"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"rules"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"required"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"message"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"请选择多选框"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"trigger"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"change"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// TODO 注意!!")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// 组件 "checkbox" 的dataType = "array"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// 组件 "radio/select" 的实际值类型等于options内的value值类型')]),t._v("\n")])])]),a("p",[t._v("自定义配置:插件级别的自定义配置信息,插件逻辑中可获取到该信息。")]),t._v(" "),a("h2",{attrs:{id:"编辑插件"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#编辑插件"}},[t._v("#")]),t._v(" 编辑插件")]),t._v(" "),a("p",[t._v("点击 编辑 按钮弹出编辑窗口,如图所示。")]),t._v(" "),a("p",[a("img",{attrs:{src:"/manager_plugin_edit_1.png",alt:"manager_plugin_edit_1"}})]),t._v(" "),a("p",[a("img",{attrs:{src:"/manager_plugin_edit_2.png",alt:"manager_plugin_edit_2"}})]),t._v(" "),a("h2",{attrs:{id:"删除插件"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#删除插件"}},[t._v("#")]),t._v(" 删除插件")]),t._v(" "),a("p",[t._v("点击 删除 按钮弹出删除确认窗口,如图所示。")]),t._v(" "),a("p",[a("img",{attrs:{src:"/manager_plugin_delete_1.png",alt:"manager_plugin_delete_1"}})]),t._v(" "),a("p",[a("img",{attrs:{src:"/manager_plugin_delete_2.png",alt:"manager_plugin_delete_2"}})]),t._v(" "),a("p",[t._v("点击 确定 按钮后删除插件,如果插件存在关联的路由配置时,需要将关联的路由配置全部删除后才能删除插件。")])])}),[],!1,null,null,null);s.default=r.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/24.7e82030a.js b/docs/assets/js/24.7e82030a.js deleted file mode 100644 index 446ae44..0000000 --- a/docs/assets/js/24.7e82030a.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[24],{369:function(t,s,a){"use strict";a.r(s);var n=a(42),r=Object(n.a)({},(function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h2",{attrs:{id:"概述"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[t._v("#")]),t._v(" 概述")]),t._v(" "),a("p",[t._v("插件管理功能用于维护插件元数据,定义路由级别的自定义属性、插件级别的自定义配置信息。创建的插件用于路由管理设置时启用,当网关接受请求匹配路由规则时会触发启用的插件逻辑执行,插件逻辑中可获取到自定义的属性数据。")]),t._v(" "),a("h2",{attrs:{id:"插件列表"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#插件列表"}},[t._v("#")]),t._v(" 插件列表")]),t._v(" "),a("p",[t._v("菜单位置:网关管理 > 插件管理。点击菜单后进入插件管理列表页面,如图所示。")]),t._v(" "),a("p",[a("img",{attrs:{src:"/fizz-gateway-community/manager_plugin_list_query.png",alt:"manager_plugin_list_query"}})]),t._v(" "),a("h2",{attrs:{id:"新增插件"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#新增插件"}},[t._v("#")]),t._v(" 新增插件")]),t._v(" "),a("p",[t._v("点击 新增 按钮弹出新增窗口,如图所示。")]),t._v(" "),a("p",[a("img",{attrs:{src:"/fizz-gateway-community/manager_plugin_add_1.png",alt:"manager_plugin_add_1"}})]),t._v(" "),a("p",[a("img",{attrs:{src:"/fizz-gateway-community/manager_plugin_add_2.png",alt:"manager_plugin_add_2"}})]),t._v(" "),a("p",[t._v("插件名称:插件名称由英文字母、下划线或数字组成,不能以数字开头,长度不能超过50个字符,必填;")]),t._v(" "),a("p",[t._v("插件描述:插件的简要描述,长度不能超过50个字符,必填;")]),t._v(" "),a("p",[t._v("默认执行顺序:插件的默认执行顺序,按从小到大排序,值越小越先执行,取值范围0~255,必填;")]),t._v(" "),a("p",[t._v("表单定义:路由级别的自定义属性,在路由管理配置启用插件时前端会将表单定义转化为表单输入界面,更多信息请查看路由管理介绍。表单规范说明如下:")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/*\n* plugin_config_design\n* 动态插件参考结构\n* */")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" pluginConfig "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* 必有字段 */")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"field"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"inputVal"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"输入框"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"component"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"input"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// input, select, radio, checkbox,")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"dataType"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// number(long, double), string, boolean, array")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* 可选字段 */")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"desc"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"字段的说明文字"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"placeholder"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"placeholder文字"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"default"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Aa123"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 初始默认值")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"options"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// for select, radio, checkbox")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"选项1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// number(long, double), string, boolean,")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"选项2"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"rules"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// min|max / range / length / regex pattern")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"required"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"message"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"输入框不能为空"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"trigger"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"change"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// required 必填")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// { "min": 3, "ma x": 5, "message": "长度在 3 到 5 个字符", "trigger": "change" }, // range 长度范围(for dataType:"string")')]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// { "len": 8, "message": "长度需 8 个字符", "trigger": "change" }, // length 长度限制(for dataType:"string")')]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// { "type": "number", "message": "请输入数字类型"}, // for dataType:"number" 校验数值')]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// { "type": "integer", "message": "请输入整数数值", "trigger": "change" }, // for dataType:"long" 校验整数')]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// { "type": "float", "message": "请输入浮点数数值", "trigger": "change" }, // for dataType:"double" 校验浮点数')]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"pattern"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"^[A-Za-z\\\\d]+$"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"message"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"只能是字母或数字"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"trigger"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"change"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// regex pattern正则")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"field"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"selectVal"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"选择器"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"component"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"select"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"dataType"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"options"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"选项1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"选项2"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"选项3"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"desc"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"选择器的说明文字"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"placeholder"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"请选择"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"rules"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"required"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"message"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"选择器不能为空"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"trigger"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"change"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"field"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"radioVal"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"单选框"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"component"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"radio"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"dataType"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"boolean"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"default"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"options"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"是"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"否"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"desc"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"单选框的说明文字"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"rules"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"required"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"message"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"请选择单选框"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"trigger"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"change"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"field"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"checkboxVal"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"多选框"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"component"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"checkbox"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"dataType"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"array"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"options"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"选项1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("11")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"选项2"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("22")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"选项3"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("33")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"desc"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"多选框的说明文字"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"rules"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"required"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"message"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"请选择多选框"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"trigger"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"change"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// TODO 注意!!")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// 组件 "checkbox" 的dataType = "array"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// 组件 "radio/select" 的实际值类型等于options内的value值类型')]),t._v("\n")])])]),a("p",[t._v("自定义配置:插件级别的自定义配置信息,插件逻辑中可获取到该信息。")]),t._v(" "),a("h2",{attrs:{id:"编辑插件"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#编辑插件"}},[t._v("#")]),t._v(" 编辑插件")]),t._v(" "),a("p",[t._v("点击 编辑 按钮弹出编辑窗口,如图所示。")]),t._v(" "),a("p",[a("img",{attrs:{src:"/fizz-gateway-community/manager_plugin_edit_1.png",alt:"manager_plugin_edit_1"}})]),t._v(" "),a("p",[a("img",{attrs:{src:"/fizz-gateway-community/manager_plugin_edit_2.png",alt:"manager_plugin_edit_2"}})]),t._v(" "),a("h2",{attrs:{id:"删除插件"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#删除插件"}},[t._v("#")]),t._v(" 删除插件")]),t._v(" "),a("p",[t._v("点击 删除 按钮弹出删除确认窗口,如图所示。")]),t._v(" "),a("p",[a("img",{attrs:{src:"/fizz-gateway-community/manager_plugin_delete_1.png",alt:"manager_plugin_delete_1"}})]),t._v(" "),a("p",[a("img",{attrs:{src:"/fizz-gateway-community/manager_plugin_delete_2.png",alt:"manager_plugin_delete_2"}})]),t._v(" "),a("p",[t._v("点击 确定 按钮后删除插件,如果插件存在关联的路由配置时,需要将关联的路由配置全部删除后才能删除插件。")])])}),[],!1,null,null,null);s.default=r.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/25.bbf8bff1.js b/docs/assets/js/25.bbf8bff1.js new file mode 100644 index 0000000..7f3b92c --- /dev/null +++ b/docs/assets/js/25.bbf8bff1.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[25],{371:function(a,r,t){"use strict";t.r(r);var _=t(42),e=Object(_.a)({},(function(){var a=this,r=a.$createElement,t=a._self._c||r;return t("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[t("h2",{attrs:{id:"概述"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[a._v("#")]),a._v(" 概述")]),a._v(" "),t("p",[a._v("角色管理功能维护角色元数据,通过配置角色拥有的菜单资源,限制用户只能操作拥有的角色对应的菜单资源,下面介绍角色管理功能的操作。")]),a._v(" "),t("h2",{attrs:{id:"角色列表"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#角色列表"}},[a._v("#")]),a._v(" 角色列表")]),a._v(" "),t("p",[a._v("菜单位置:权限管理 > 角色管理。点击菜单后进入角色列表页面,如图所示。")]),a._v(" "),t("p",[t("img",{attrs:{src:"/manager_role_list_query.png",alt:"manager_role_list_query"}})]),a._v(" "),t("h2",{attrs:{id:"添加角色"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#添加角色"}},[a._v("#")]),a._v(" 添加角色")]),a._v(" "),t("p",[a._v("点击 新增 按钮弹出新增窗口,如图所示。")]),a._v(" "),t("p",[t("img",{attrs:{src:"/manager_role_add_1.png",alt:"manager_role_add_1"}})]),a._v(" "),t("p",[t("img",{attrs:{src:"/manager_role_add_2.png",alt:"manager_role_add_2"}})]),a._v(" "),t("h2",{attrs:{id:"权限设置"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#权限设置"}},[a._v("#")]),a._v(" 权限设置")]),a._v(" "),t("p",[a._v("勾选需要分配权限的角色,点击 权限设置 按钮弹出角色权限配置窗口,如图所示。")]),a._v(" "),t("p",[t("img",{attrs:{src:"/manager_role_auth_1.png",alt:"manager_role_auth_1"}})]),a._v(" "),t("p",[t("img",{attrs:{src:"/manager_role_auth_2.png",alt:"manager_role_auth_2"}})]),a._v(" "),t("p",[a._v("勾选菜单后点击 确定 按钮确认给角色分配菜单权限。")]),a._v(" "),t("h2",{attrs:{id:"编辑角色"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#编辑角色"}},[a._v("#")]),a._v(" 编辑角色")]),a._v(" "),t("p",[a._v("点击 编辑 按钮弹出编辑窗口,如图所示。")]),a._v(" "),t("p",[t("img",{attrs:{src:"/manager_role_edit_1.png",alt:"manager_role_edit_1"}})]),a._v(" "),t("p",[t("img",{attrs:{src:"/manager_role_edit_2.png",alt:"manager_role_edit_2"}})]),a._v(" "),t("h2",{attrs:{id:"删除角色"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#删除角色"}},[a._v("#")]),a._v(" 删除角色")]),a._v(" "),t("p",[a._v("点击 删除 按钮弹出删除确认窗口,如图所示。")]),a._v(" "),t("p",[t("img",{attrs:{src:"/manager_role_delete_1.png",alt:"manager_role_delete_1"}})]),a._v(" "),t("p",[t("img",{attrs:{src:"/manager_role_delete_2.png",alt:"manager_role_delete_2"}})]),a._v(" "),t("p",[a._v("点击 确定 按钮后删除角色。")])])}),[],!1,null,null,null);r.default=e.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/25.fc38ae5b.js b/docs/assets/js/25.fc38ae5b.js deleted file mode 100644 index 620b4c4..0000000 --- a/docs/assets/js/25.fc38ae5b.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[25],{371:function(a,t,r){"use strict";r.r(t);var _=r(42),e=Object(_.a)({},(function(){var a=this,t=a.$createElement,r=a._self._c||t;return r("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[r("h2",{attrs:{id:"概述"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[a._v("#")]),a._v(" 概述")]),a._v(" "),r("p",[a._v("角色管理功能维护角色元数据,通过配置角色拥有的菜单资源,限制用户只能操作拥有的角色对应的菜单资源,下面介绍角色管理功能的操作。")]),a._v(" "),r("h2",{attrs:{id:"角色列表"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#角色列表"}},[a._v("#")]),a._v(" 角色列表")]),a._v(" "),r("p",[a._v("菜单位置:权限管理 > 角色管理。点击菜单后进入角色列表页面,如图所示。")]),a._v(" "),r("p",[r("img",{attrs:{src:"/fizz-gateway-community/manager_role_list_query.png",alt:"manager_role_list_query"}})]),a._v(" "),r("h2",{attrs:{id:"添加角色"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#添加角色"}},[a._v("#")]),a._v(" 添加角色")]),a._v(" "),r("p",[a._v("点击 新增 按钮弹出新增窗口,如图所示。")]),a._v(" "),r("p",[r("img",{attrs:{src:"/fizz-gateway-community/manager_role_add_1.png",alt:"manager_role_add_1"}})]),a._v(" "),r("p",[r("img",{attrs:{src:"/fizz-gateway-community/manager_role_add_2.png",alt:"manager_role_add_2"}})]),a._v(" "),r("h2",{attrs:{id:"权限设置"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#权限设置"}},[a._v("#")]),a._v(" 权限设置")]),a._v(" "),r("p",[a._v("勾选需要分配权限的角色,点击 权限设置 按钮弹出角色权限配置窗口,如图所示。")]),a._v(" "),r("p",[r("img",{attrs:{src:"/fizz-gateway-community/manager_role_auth_1.png",alt:"manager_role_auth_1"}})]),a._v(" "),r("p",[r("img",{attrs:{src:"/fizz-gateway-community/manager_role_auth_2.png",alt:"manager_role_auth_2"}})]),a._v(" "),r("p",[a._v("勾选菜单后点击 确定 按钮确认给角色分配菜单权限。")]),a._v(" "),r("h2",{attrs:{id:"编辑角色"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#编辑角色"}},[a._v("#")]),a._v(" 编辑角色")]),a._v(" "),r("p",[a._v("点击 编辑 按钮弹出编辑窗口,如图所示。")]),a._v(" "),r("p",[r("img",{attrs:{src:"/fizz-gateway-community/manager_role_edit_1.png",alt:"manager_role_edit_1"}})]),a._v(" "),r("p",[r("img",{attrs:{src:"/fizz-gateway-community/manager_role_edit_2.png",alt:"manager_role_edit_2"}})]),a._v(" "),r("h2",{attrs:{id:"删除角色"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#删除角色"}},[a._v("#")]),a._v(" 删除角色")]),a._v(" "),r("p",[a._v("点击 删除 按钮弹出删除确认窗口,如图所示。")]),a._v(" "),r("p",[r("img",{attrs:{src:"/fizz-gateway-community/manager_role_delete_1.png",alt:"manager_role_delete_1"}})]),a._v(" "),r("p",[r("img",{attrs:{src:"/fizz-gateway-community/manager_role_delete_2.png",alt:"manager_role_delete_2"}})]),a._v(" "),r("p",[a._v("点击 确定 按钮后删除角色。")])])}),[],!1,null,null,null);t.default=e.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/26.70321f43.js b/docs/assets/js/26.70321f43.js new file mode 100644 index 0000000..f503678 --- /dev/null +++ b/docs/assets/js/26.70321f43.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[26],{372:function(a,e,_){"use strict";_.r(e);var r=_(42),t=Object(r.a)({},(function(){var a=this,e=a.$createElement,_=a._self._c||e;return _("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[_("h2",{attrs:{id:"概述"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[a._v("#")]),a._v(" 概述")]),a._v(" "),_("p",[a._v("服务管理功能维护服务元数据。服务编排中的服务是一个逻辑上的概念,用于对聚合接口的归类以及权限的分配。Fizz网关聚合接口的请求路径格式为 http://{ip}:{port}/proxy/{service}{apiPath},服务对应{service}段。")]),a._v(" "),_("h2",{attrs:{id:"服务列表"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#服务列表"}},[a._v("#")]),a._v(" 服务列表")]),a._v(" "),_("p",[a._v("菜单位置:服务编排 > 服务管理。点击菜单后进入服务列表页面,如图所示。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/manager_service_list_query.png",alt:"manager_service_list_query"}})]),a._v(" "),_("h2",{attrs:{id:"新增服务"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#新增服务"}},[a._v("#")]),a._v(" 新增服务")]),a._v(" "),_("p",[a._v("点击 新增 按钮弹出新增窗口,如图所示。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/manager_service_add_1.png",alt:"manager_service_add_1"}})]),a._v(" "),_("p",[_("img",{attrs:{src:"/manager_service_add_2.png",alt:"manager_service_add_2"}})]),a._v(" "),_("p",[a._v("服务 ID:服务唯一标识,对应Fizz网关聚合接口请求路径(格式为 http://{ip}:{port}/proxy/{service}{apiPath})的{service}段,长度不能超过200个字符,必填;")]),a._v(" "),_("p",[a._v("服务名:服务名称,用于展示或者选项使用,必填;")]),a._v(" "),_("p",[a._v("团队:团队名称,长度不能超过200个字符;")]),a._v(" "),_("p",[a._v("负责人:负责人名称,长度不能超过200个字符;")]),a._v(" "),_("p",[a._v("描述:服务描述,长度不能超过2000个字符。")]),a._v(" "),_("h2",{attrs:{id:"编辑服务"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#编辑服务"}},[a._v("#")]),a._v(" 编辑服务")]),a._v(" "),_("p",[a._v("点击 编辑 按钮弹出编辑窗口,如图所示。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/manager_service_edit_1.png",alt:"manager_service_edit_1"}})]),a._v(" "),_("p",[_("img",{attrs:{src:"/manager_service_edit_2.png",alt:"manager_service_edit_2"}})]),a._v(" "),_("h2",{attrs:{id:"删除服务"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#删除服务"}},[a._v("#")]),a._v(" 删除服务")]),a._v(" "),_("p",[a._v("点击 删除 按钮弹出删除确认窗口,如图所示。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/manager_service_delete_1.png",alt:"manager_service_delete_1"}})]),a._v(" "),_("p",[_("img",{attrs:{src:"/manager_service_delete_2.png",alt:"manager_service_delete_2"}})]),a._v(" "),_("p",[a._v("点击 确定 按钮后删除服务,如果服务存在关联的聚合接口时,需要将关联的聚合接口全部删除后才能删除服务。")]),a._v(" "),_("h2",{attrs:{id:"服务权限分配"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#服务权限分配"}},[a._v("#")]),a._v(" 服务权限分配")]),a._v(" "),_("p",[a._v("点击 权限 按钮弹出权限配置窗口,如图所示。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/manager_service_auth_1.png",alt:"manager_service_auth_1"}})]),a._v(" "),_("p",[_("img",{attrs:{src:"/manager_service_auth_2.png",alt:"manager_service_auth_2"}})]),a._v(" "),_("p",[a._v("服务创建人自动获得服务权限,服务权限可分配,拥有权限的用户才能操作对应的接口列表。")])])}),[],!1,null,null,null);e.default=t.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/26.e097ebfd.js b/docs/assets/js/26.e097ebfd.js deleted file mode 100644 index cfaafa4..0000000 --- a/docs/assets/js/26.e097ebfd.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[26],{372:function(a,t,e){"use strict";e.r(t);var _=e(42),r=Object(_.a)({},(function(){var a=this,t=a.$createElement,e=a._self._c||t;return e("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[e("h2",{attrs:{id:"概述"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[a._v("#")]),a._v(" 概述")]),a._v(" "),e("p",[a._v("服务管理功能维护服务元数据。服务编排中的服务是一个逻辑上的概念,用于对聚合接口的归类以及权限的分配。Fizz网关聚合接口的请求路径格式为 http://{ip}:{port}/proxy/{service}{apiPath},服务对应{service}段。")]),a._v(" "),e("h2",{attrs:{id:"服务列表"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#服务列表"}},[a._v("#")]),a._v(" 服务列表")]),a._v(" "),e("p",[a._v("菜单位置:服务编排 > 服务管理。点击菜单后进入服务列表页面,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_service_list_query.png",alt:"manager_service_list_query"}})]),a._v(" "),e("h2",{attrs:{id:"新增服务"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#新增服务"}},[a._v("#")]),a._v(" 新增服务")]),a._v(" "),e("p",[a._v("点击 新增 按钮弹出新增窗口,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_service_add_1.png",alt:"manager_service_add_1"}})]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_service_add_2.png",alt:"manager_service_add_2"}})]),a._v(" "),e("p",[a._v("服务 ID:服务唯一标识,对应Fizz网关聚合接口请求路径(格式为 http://{ip}:{port}/proxy/{service}{apiPath})的{service}段,长度不能超过200个字符,必填;")]),a._v(" "),e("p",[a._v("服务名:服务名称,用于展示或者选项使用,必填;")]),a._v(" "),e("p",[a._v("团队:团队名称,长度不能超过200个字符;")]),a._v(" "),e("p",[a._v("负责人:负责人名称,长度不能超过200个字符;")]),a._v(" "),e("p",[a._v("描述:服务描述,长度不能超过2000个字符。")]),a._v(" "),e("h2",{attrs:{id:"编辑服务"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#编辑服务"}},[a._v("#")]),a._v(" 编辑服务")]),a._v(" "),e("p",[a._v("点击 编辑 按钮弹出编辑窗口,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_service_edit_1.png",alt:"manager_service_edit_1"}})]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_service_edit_2.png",alt:"manager_service_edit_2"}})]),a._v(" "),e("h2",{attrs:{id:"删除服务"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#删除服务"}},[a._v("#")]),a._v(" 删除服务")]),a._v(" "),e("p",[a._v("点击 删除 按钮弹出删除确认窗口,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_service_delete_1.png",alt:"manager_service_delete_1"}})]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_service_delete_2.png",alt:"manager_service_delete_2"}})]),a._v(" "),e("p",[a._v("点击 确定 按钮后删除服务,如果服务存在关联的聚合接口时,需要将关联的聚合接口全部删除后才能删除服务。")]),a._v(" "),e("h2",{attrs:{id:"服务权限分配"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#服务权限分配"}},[a._v("#")]),a._v(" 服务权限分配")]),a._v(" "),e("p",[a._v("点击 权限 按钮弹出权限配置窗口,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_service_auth_1.png",alt:"manager_service_auth_1"}})]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_service_auth_2.png",alt:"manager_service_auth_2"}})]),a._v(" "),e("p",[a._v("服务创建人自动获得服务权限,服务权限可分配,拥有权限的用户才能操作对应的接口列表。")])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/27.06f8de31.js b/docs/assets/js/27.06f8de31.js deleted file mode 100644 index 32ec04f..0000000 --- a/docs/assets/js/27.06f8de31.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[27],{374:function(t,a,s){"use strict";s.r(a);var _=s(42),r=Object(_.a)({},(function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h2",{attrs:{id:"概述"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[t._v("#")]),t._v(" 概述")]),t._v(" "),s("p",[t._v("Fizz网关会将访问请求数据(IP地址、网关分组、服务、应用、请求方法、API Path、请求时间)推送到Kafka中,管理后台消费Kafka消息统计接口访问数据。")]),t._v(" "),s("p",[t._v("接口统计功能以图表的形式展示指定时间段内每日的接口总数、访问次数,可查看接口的历史访问总次数以及最近请求时间。")]),t._v(" "),s("h2",{attrs:{id:"接口访问统计"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#接口访问统计"}},[t._v("#")]),t._v(" 接口访问统计")]),t._v(" "),s("p",[t._v("菜单位置:网关管理 > 接口统计。点击菜单后进入接口统计页面,如图所示。")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_source_statistics_1.png",alt:"manager_source_statistics_1.png"}})]),t._v(" "),s("p",[t._v("今天接口总数:从0时到当前时刻被调用不同接口的总数;")]),t._v(" "),s("p",[t._v("今天访问次数:从0时到当前时刻访问请求的总次数。")]),t._v(" "),s("p",[t._v("接口总数图表:显示指定时间段内每日被调用不同接口的总数曲线;")]),t._v(" "),s("p",[t._v("访问次数图表:显示指定时间段内每日访问请求的总次数曲线。")]),t._v(" "),s("h2",{attrs:{id:"请求统计"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#请求统计"}},[t._v("#")]),t._v(" 请求统计")]),t._v(" "),s("p",[t._v("接口统计界面下部为请求统计列表,如图所示。")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/manager_source_statistics_2.png",alt:"manager_source_statistics_2.png"}})]),t._v(" "),s("p",[t._v("来源IP:网关请求的实际入口IP地址;")]),t._v(" "),s("p",[t._v("请求次数:( 唯一[来源IP、网关分组、服务名、请求方法、appID、API Path])历史总请求次数;")]),t._v(" "),s("p",[t._v("最近请求时间:( 唯一[来源IP、网关分组、服务名、请求方法、appID、API Path])最近一次调用时间。")])])}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/27.505a813e.js b/docs/assets/js/27.505a813e.js new file mode 100644 index 0000000..2af9848 --- /dev/null +++ b/docs/assets/js/27.505a813e.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[27],{373:function(t,a,s){"use strict";s.r(a);var _=s(42),r=Object(_.a)({},(function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h2",{attrs:{id:"概述"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[t._v("#")]),t._v(" 概述")]),t._v(" "),s("p",[t._v("Fizz网关会将访问请求数据(IP地址、网关分组、服务、应用、请求方法、API Path、请求时间)推送到Kafka中,管理后台消费Kafka消息统计接口访问数据。")]),t._v(" "),s("p",[t._v("接口统计功能以图表的形式展示指定时间段内每日的接口总数、访问次数,可查看接口的历史访问总次数以及最近请求时间。")]),t._v(" "),s("h2",{attrs:{id:"接口访问统计"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#接口访问统计"}},[t._v("#")]),t._v(" 接口访问统计")]),t._v(" "),s("p",[t._v("菜单位置:网关管理 > 接口统计。点击菜单后进入接口统计页面,如图所示。")]),t._v(" "),s("p",[s("img",{attrs:{src:"/manager_source_statistics_1.png",alt:"manager_source_statistics_1.png"}})]),t._v(" "),s("p",[t._v("今天接口总数:从0时到当前时刻被调用不同接口的总数;")]),t._v(" "),s("p",[t._v("今天访问次数:从0时到当前时刻访问请求的总次数。")]),t._v(" "),s("p",[t._v("接口总数图表:显示指定时间段内每日被调用不同接口的总数曲线;")]),t._v(" "),s("p",[t._v("访问次数图表:显示指定时间段内每日访问请求的总次数曲线。")]),t._v(" "),s("h2",{attrs:{id:"请求统计"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#请求统计"}},[t._v("#")]),t._v(" 请求统计")]),t._v(" "),s("p",[t._v("接口统计界面下部为请求统计列表,如图所示。")]),t._v(" "),s("p",[s("img",{attrs:{src:"/manager_source_statistics_2.png",alt:"manager_source_statistics_2.png"}})]),t._v(" "),s("p",[t._v("来源IP:网关请求的实际入口IP地址;")]),t._v(" "),s("p",[t._v("请求次数:( 唯一[来源IP、网关分组、服务名、请求方法、appID、API Path])历史总请求次数;")]),t._v(" "),s("p",[t._v("最近请求时间:( 唯一[来源IP、网关分组、服务名、请求方法、appID、API Path])最近一次调用时间。")])])}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/28.9b7b0400.js b/docs/assets/js/28.9b7b0400.js deleted file mode 100644 index dd85b61..0000000 --- a/docs/assets/js/28.9b7b0400.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[28],{373:function(a,t,e){"use strict";e.r(t);var r=e(42),_=Object(r.a)({},(function(){var a=this,t=a.$createElement,e=a._self._c||t;return e("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[e("h2",{attrs:{id:"概述"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[a._v("#")]),a._v(" 概述")]),a._v(" "),e("p",[a._v("用户管理功能用于维护用户元数据,包括用户信息维护、密码维护、角色配置。")]),a._v(" "),e("h2",{attrs:{id:"用户列表"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#用户列表"}},[a._v("#")]),a._v(" 用户列表")]),a._v(" "),e("p",[a._v("菜单位置:系统管理 > 用户管理。点击菜单后进入用户列表页面,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_user_list_query.png",alt:"manager_user_list_query"}})]),a._v(" "),e("h2",{attrs:{id:"添加用户"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#添加用户"}},[a._v("#")]),a._v(" 添加用户")]),a._v(" "),e("p",[a._v("点击 新增 按钮弹出新增窗口,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_user_add_1.png",alt:"manager_user_add_1"}})]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_user_add_2.png",alt:"manager_user_add_2"}})]),a._v(" "),e("p",[a._v("电子邮箱:用户用于接收电子邮件的邮箱地址,后台涉及邮件发送业务使用该字段设置的邮箱地址来进行邮箱发送。")]),a._v(" "),e("h2",{attrs:{id:"重置密码"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#重置密码"}},[a._v("#")]),a._v(" 重置密码")]),a._v(" "),e("p",[a._v("勾选用户后点击 密码重置 按钮可为用户重置密码。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_user_reset_password_1.png",alt:"manager_user_reset_password_1"}})]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_user_reset_password_2.png",alt:"manager_user_reset_password_2"}})]),a._v(" "),e("p",[a._v("重置后的默认密码为"),e("code",[a._v("AsdF1234!")]),a._v("。")]),a._v(" "),e("h2",{attrs:{id:"编辑用户"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#编辑用户"}},[a._v("#")]),a._v(" 编辑用户")]),a._v(" "),e("p",[a._v("点击 编辑 按钮弹出编辑窗口,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_user_edit_1.png",alt:"manager_user_edit_1"}})]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_user_edit_2.png",alt:"manager_user_edit_2"}})]),a._v(" "),e("h2",{attrs:{id:"删除用户"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#删除用户"}},[a._v("#")]),a._v(" 删除用户")]),a._v(" "),e("p",[a._v("点击 删除 按钮弹出删除确认窗口,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_user_delete_1.png",alt:"manager_user_delete_1"}})]),a._v(" "),e("p",[e("img",{attrs:{src:"/fizz-gateway-community/manager_user_delete_2.png",alt:"manager_user_delete_2"}})])])}),[],!1,null,null,null);t.default=_.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/28.cdddd7aa.js b/docs/assets/js/28.cdddd7aa.js new file mode 100644 index 0000000..215e2d7 --- /dev/null +++ b/docs/assets/js/28.cdddd7aa.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[28],{374:function(a,r,_){"use strict";_.r(r);var t=_(42),e=Object(t.a)({},(function(){var a=this,r=a.$createElement,_=a._self._c||r;return _("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[_("h2",{attrs:{id:"概述"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[a._v("#")]),a._v(" 概述")]),a._v(" "),_("p",[a._v("用户管理功能用于维护用户元数据,包括用户信息维护、密码维护、角色配置。")]),a._v(" "),_("h2",{attrs:{id:"用户列表"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#用户列表"}},[a._v("#")]),a._v(" 用户列表")]),a._v(" "),_("p",[a._v("菜单位置:系统管理 > 用户管理。点击菜单后进入用户列表页面,如图所示。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/manager_user_list_query.png",alt:"manager_user_list_query"}})]),a._v(" "),_("h2",{attrs:{id:"添加用户"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#添加用户"}},[a._v("#")]),a._v(" 添加用户")]),a._v(" "),_("p",[a._v("点击 新增 按钮弹出新增窗口,如图所示。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/manager_user_add_1.png",alt:"manager_user_add_1"}})]),a._v(" "),_("p",[_("img",{attrs:{src:"/manager_user_add_2.png",alt:"manager_user_add_2"}})]),a._v(" "),_("p",[a._v("电子邮箱:用户用于接收电子邮件的邮箱地址,后台涉及邮件发送业务使用该字段设置的邮箱地址来进行邮箱发送。")]),a._v(" "),_("h2",{attrs:{id:"重置密码"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#重置密码"}},[a._v("#")]),a._v(" 重置密码")]),a._v(" "),_("p",[a._v("勾选用户后点击 密码重置 按钮可为用户重置密码。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/manager_user_reset_password_1.png",alt:"manager_user_reset_password_1"}})]),a._v(" "),_("p",[_("img",{attrs:{src:"/manager_user_reset_password_2.png",alt:"manager_user_reset_password_2"}})]),a._v(" "),_("p",[a._v("重置后的默认密码为"),_("code",[a._v("AsdF1234!")]),a._v("。")]),a._v(" "),_("h2",{attrs:{id:"编辑用户"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#编辑用户"}},[a._v("#")]),a._v(" 编辑用户")]),a._v(" "),_("p",[a._v("点击 编辑 按钮弹出编辑窗口,如图所示。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/manager_user_edit_1.png",alt:"manager_user_edit_1"}})]),a._v(" "),_("p",[_("img",{attrs:{src:"/manager_user_edit_2.png",alt:"manager_user_edit_2"}})]),a._v(" "),_("h2",{attrs:{id:"删除用户"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#删除用户"}},[a._v("#")]),a._v(" 删除用户")]),a._v(" "),_("p",[a._v("点击 删除 按钮弹出删除确认窗口,如图所示。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/manager_user_delete_1.png",alt:"manager_user_delete_1"}})]),a._v(" "),_("p",[_("img",{attrs:{src:"/manager_user_delete_2.png",alt:"manager_user_delete_2"}})])])}),[],!1,null,null,null);r.default=e.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/29.214a2702.js b/docs/assets/js/29.60b7285b.js similarity index 93% rename from docs/assets/js/29.214a2702.js rename to docs/assets/js/29.60b7285b.js index 072aecc..931d607 100644 --- a/docs/assets/js/29.214a2702.js +++ b/docs/assets/js/29.60b7285b.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[29],{376:function(t,s,a){"use strict";a.r(s);var n=a(42),e=Object(n.a)({},(function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h2",{attrs:{id:"概述"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[t._v("#")]),t._v(" 概述")]),t._v(" "),a("p",[t._v("当需要在gateway中加入自定义的逻辑时,可通过fizz的插件机制实现,插件:"),a("br"),t._v("\n1、类似spring的WebFilter,是fizz内部的WebFilter,由fizz调度;"),a("br"),t._v("\n2、对不同的请求,可配置不同的上下文参数,可通过manager完成配置;"),a("br"),t._v("\n3、若有多个插件,当前插件可获取前面插件的执行结果。")]),t._v(" "),a("p",[t._v("插件的开发和应用,分gateway开发、manager配置两部分,下面以一个例子,依次介绍。")]),t._v(" "),a("h2",{attrs:{id:"gateway开发"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#gateway开发"}},[t._v("#")]),t._v(" gateway开发")]),t._v(" "),a("div",{staticClass:"language-java extra-class"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[t._v(" 实现\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("abstract")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("PluginFilter")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("abstract")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Mono")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Void")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("doFilter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ServerWebExchange")]),t._v(" exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Map")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Object")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" config"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" fixedConfig"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n 即定义了一个插件。\n \n 比如\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[t._v("@Component")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TestPluginFilter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("TEST_PLUGIN_FILTER"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TestPluginFilter")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("extends")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("PluginFilter")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Logger")]),t._v(" log "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("LoggerFactory")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getLogger")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TestPluginFilter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" TEST_PLUGIN_FILTER "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"testPlugin"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[t._v("@Override")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Mono")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Void")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("doFilter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ServerWebExchange")]),t._v(" exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Map")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Object")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" config"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" fixedConfig"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" rid "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getRequest")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Boolean")]),t._v(" logReqId "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Boolean")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" config"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"logReqId"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 是否记录请求id日志,可通过manager配置")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("logReqId "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" logReqId"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n log"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("info")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getRequest")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getURI")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("toString")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('" 的请求id: "')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" rid"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Boolean")]),t._v(" appendFizzRsv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Boolean")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" config"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"appendFizzRsv"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("appendFizzRsv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" appendFizzRsv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("WebUtils")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("appendHeader")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"FIZZ-RSV"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" rid"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("WebUtils")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("transmitSuccessFilterResultAndEmptyMono")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" TEST_PLUGIN_FILTER"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 保存插件执行结果,并返回")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n 这个插件,插件必须是一个spring的"),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Component")]),t._v("(或子注解),且要有id,这个插件的id是testPlugin,它实现了两个功能,记录请求id日志,转发请求时添加FIZZ"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("RSV请求头,并且功能是可打开或关闭的。\n \n 另外可通过:\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("WebUtils")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getPrevFilterResult")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" 获取上一个插件的执行结果,\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("WebUtils")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getFilterResult")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"plugin.id"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" 获取已执行的任意一个插件的执行结果。\n")])])]),a("h2",{attrs:{id:"manager配置"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#manager配置"}},[t._v("#")]),t._v(" manager配置")]),t._v(" "),a("p",[t._v("1、定义插件")]),t._v(" "),a("div",{staticClass:"language-sql extra-class"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[t._v(" 在插件表中,定义上面的插件: \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("INSERT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("INTO")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v("tb_plugin"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v("eng_name"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v("chn_name"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v("config"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("order")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("VALUES")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'testPlugin'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'测试插件'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('\'[{\\"field\\":\\"logReqId\\",\\"label\\":\\"打印请求id日志\\",\\"component\\":\\"radio\\",\\"dataType\\":\\"boolean\\",\\"default\\":false,\\"options\\":[{\\"label\\":\\"是\\",\\"value\\":true},{\\"label\\":\\"否\\",\\"value\\":false}]},{\\"field\\":\\"appendFizzRsv\\",\\"label\\":\\"添加fizzRsv请求头\\",\\"component\\":\\"radio\\",\\"dataType\\":\\"boolean\\",\\"default\\":false,\\"options\\":[{\\"label\\":\\"是\\",\\"value\\":true},{\\"label\\":\\"否\\",\\"value\\":false}]}]\'')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("250")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("div",{staticClass:"language-json extra-class"},[a("pre",{pre:!0,attrs:{class:"language-json"}},[a("code",[t._v(" eng_name为插件的id,chn_name为插件中文名,order为插件的执行顺序,也是插件在界面上的显示顺序。\n \n config:\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"field"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"logReqId"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"打印请求id日志"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"component"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"radio"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"dataType"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"boolean"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"default"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"options"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"是"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"否"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"field"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"appendFizzRsv"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"添加fizzRsv请求头"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"component"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"radio"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"dataType"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"boolean"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"default"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"options"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"是"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"否"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n 前端据此生成插件的配置表单,具体参前端说明。\n")])])]),a("p",[t._v("2、应用插件")]),t._v(" "),a("p",[t._v("如对\n"),a("img",{attrs:{src:"/fizz-gateway-community/xapi.png",alt:""}})]),t._v(" "),a("p",[t._v("接口应用插件:\n"),a("img",{attrs:{src:"/fizz-gateway-community/test-plugin.png",alt:""}})]),t._v(" "),a("p",[t._v('上面配置的"打印请求id日志"、"添加fizzRsv请求头",对应')]),t._v(" "),a("div",{staticClass:"language-java extra-class"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Mono")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Void")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("doFilter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ServerWebExchange")]),t._v(" exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Map")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Object")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" config"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" fixedConfig"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n")])])]),a("p",[t._v("中config的logReqId和appendFizzRsv key。")])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[29],{376:function(t,s,a){"use strict";a.r(s);var n=a(42),e=Object(n.a)({},(function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h2",{attrs:{id:"概述"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[t._v("#")]),t._v(" 概述")]),t._v(" "),a("p",[t._v("当需要在gateway中加入自定义的逻辑时,可通过fizz的插件机制实现,插件:"),a("br"),t._v("\n1、类似spring的WebFilter,是fizz内部的WebFilter,由fizz调度;"),a("br"),t._v("\n2、对不同的请求,可配置不同的上下文参数,可通过manager完成配置;"),a("br"),t._v("\n3、若有多个插件,当前插件可获取前面插件的执行结果。")]),t._v(" "),a("p",[t._v("插件的开发和应用,分gateway开发、manager配置两部分,下面以一个例子,依次介绍。")]),t._v(" "),a("h2",{attrs:{id:"gateway开发"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#gateway开发"}},[t._v("#")]),t._v(" gateway开发")]),t._v(" "),a("div",{staticClass:"language-java extra-class"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[t._v(" 实现\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("abstract")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("PluginFilter")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("abstract")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Mono")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Void")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("doFilter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ServerWebExchange")]),t._v(" exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Map")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Object")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" config"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" fixedConfig"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n 即定义了一个插件。\n \n 比如\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[t._v("@Component")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TestPluginFilter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("TEST_PLUGIN_FILTER"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TestPluginFilter")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("extends")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("PluginFilter")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Logger")]),t._v(" log "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("LoggerFactory")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getLogger")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TestPluginFilter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" TEST_PLUGIN_FILTER "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"testPlugin"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[t._v("@Override")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Mono")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Void")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("doFilter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ServerWebExchange")]),t._v(" exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Map")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Object")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" config"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" fixedConfig"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" rid "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getRequest")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Boolean")]),t._v(" logReqId "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Boolean")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" config"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"logReqId"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 是否记录请求id日志,可通过manager配置")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("logReqId "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" logReqId"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n log"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("info")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getRequest")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getURI")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("toString")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('" 的请求id: "')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" rid"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Boolean")]),t._v(" appendFizzRsv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Boolean")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" config"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"appendFizzRsv"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("appendFizzRsv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" appendFizzRsv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("WebUtils")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("appendHeader")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"FIZZ-RSV"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" rid"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("WebUtils")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("transmitSuccessFilterResultAndEmptyMono")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" TEST_PLUGIN_FILTER"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 保存插件执行结果,并返回")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n 这个插件,插件必须是一个spring的"),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Component")]),t._v("(或子注解),且要有id,这个插件的id是testPlugin,它实现了两个功能,记录请求id日志,转发请求时添加FIZZ"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("RSV请求头,并且功能是可打开或关闭的。\n \n 另外可通过:\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("WebUtils")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getPrevFilterResult")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" 获取上一个插件的执行结果,\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("WebUtils")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getFilterResult")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"plugin.id"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" 获取已执行的任意一个插件的执行结果。\n")])])]),a("h2",{attrs:{id:"manager配置"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#manager配置"}},[t._v("#")]),t._v(" manager配置")]),t._v(" "),a("p",[t._v("1、定义插件")]),t._v(" "),a("div",{staticClass:"language-sql extra-class"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[t._v(" 在插件表中,定义上面的插件: \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("INSERT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("INTO")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v("tb_plugin"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v("eng_name"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v("chn_name"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v("config"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("order")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("VALUES")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'testPlugin'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'测试插件'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('\'[{\\"field\\":\\"logReqId\\",\\"label\\":\\"打印请求id日志\\",\\"component\\":\\"radio\\",\\"dataType\\":\\"boolean\\",\\"default\\":false,\\"options\\":[{\\"label\\":\\"是\\",\\"value\\":true},{\\"label\\":\\"否\\",\\"value\\":false}]},{\\"field\\":\\"appendFizzRsv\\",\\"label\\":\\"添加fizzRsv请求头\\",\\"component\\":\\"radio\\",\\"dataType\\":\\"boolean\\",\\"default\\":false,\\"options\\":[{\\"label\\":\\"是\\",\\"value\\":true},{\\"label\\":\\"否\\",\\"value\\":false}]}]\'')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("250")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("div",{staticClass:"language-json extra-class"},[a("pre",{pre:!0,attrs:{class:"language-json"}},[a("code",[t._v(" eng_name为插件的id,chn_name为插件中文名,order为插件的执行顺序,也是插件在界面上的显示顺序。\n \n config:\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"field"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"logReqId"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"打印请求id日志"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"component"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"radio"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"dataType"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"boolean"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"default"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"options"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"是"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"否"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"field"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"appendFizzRsv"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"添加fizzRsv请求头"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"component"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"radio"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"dataType"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"boolean"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"default"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"options"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"是"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"否"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n 前端据此生成插件的配置表单,具体参前端说明。\n")])])]),a("p",[t._v("2、应用插件")]),t._v(" "),a("p",[t._v("如对\n"),a("img",{attrs:{src:"/xapi.png",alt:""}})]),t._v(" "),a("p",[t._v("接口应用插件:\n"),a("img",{attrs:{src:"/test-plugin.png",alt:""}})]),t._v(" "),a("p",[t._v('上面配置的"打印请求id日志"、"添加fizzRsv请求头",对应')]),t._v(" "),a("div",{staticClass:"language-java extra-class"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Mono")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Void")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("doFilter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ServerWebExchange")]),t._v(" exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Map")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Object")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" config"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" fixedConfig"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n")])])]),a("p",[t._v("中config的logReqId和appendFizzRsv key。")])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/5.abc10683.js b/docs/assets/js/5.a59b20e1.js similarity index 79% rename from docs/assets/js/5.abc10683.js rename to docs/assets/js/5.a59b20e1.js index 71e393b..010a729 100644 --- a/docs/assets/js/5.abc10683.js +++ b/docs/assets/js/5.a59b20e1.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[5],{351:function(t,e,n){"use strict";n.r(e);var s=n(42),l=Object(s.a)({},(function(){var t=this.$createElement;return(this._self._c||t)("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}})}),[],!1,null,null,null);e.default=l.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[5],{352:function(t,e,n){"use strict";n.r(e);var s=n(42),l=Object(s.a)({},(function(){var t=this.$createElement;return(this._self._c||t)("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}})}),[],!1,null,null,null);e.default=l.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/6.b5dc0bcc.js b/docs/assets/js/6.e883523c.js similarity index 79% rename from docs/assets/js/6.b5dc0bcc.js rename to docs/assets/js/6.e883523c.js index f6f6a87..b633ff3 100644 --- a/docs/assets/js/6.b5dc0bcc.js +++ b/docs/assets/js/6.e883523c.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[6],{353:function(t,e,n){"use strict";n.r(e);var s=n(42),l=Object(s.a)({},(function(){var t=this.$createElement;return(this._self._c||t)("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}})}),[],!1,null,null,null);e.default=l.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[6],{354:function(t,e,n){"use strict";n.r(e);var s=n(42),l=Object(s.a)({},(function(){var t=this.$createElement;return(this._self._c||t)("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}})}),[],!1,null,null,null);e.default=l.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/7.c27e364c.js b/docs/assets/js/7.00dd2642.js similarity index 81% rename from docs/assets/js/7.c27e364c.js rename to docs/assets/js/7.00dd2642.js index c3da9f2..04bd9a0 100644 --- a/docs/assets/js/7.c27e364c.js +++ b/docs/assets/js/7.00dd2642.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[7],{354:function(t,n,s){"use strict";s.r(n);var e=s(42),o=Object(e.a)({},(function(){var t=this.$createElement,n=this._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[n("p",[this._v("coming soon")])])}),[],!1,null,null,null);n.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[7],{353:function(t,n,s){"use strict";s.r(n);var e=s(42),o=Object(e.a)({},(function(){var t=this.$createElement,n=this._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[n("p",[this._v("coming soon")])])}),[],!1,null,null,null);n.default=o.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/8.645ad4e8.js b/docs/assets/js/8.645ad4e8.js new file mode 100644 index 0000000..2b64b46 --- /dev/null +++ b/docs/assets/js/8.645ad4e8.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[8],{351:function(t,a,r){"use strict";r.r(a);var s=r(42),_=Object(s.a)({},(function(){var t=this,a=t.$createElement,r=t._self._c||a;return r("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[r("h2",{attrs:{id:"什么是服务编排"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#什么是服务编排"}},[t._v("#")]),t._v(" 什么是服务编排")]),t._v(" "),r("p",[t._v("服务编排主要基于现有的业务微服务使用在线配置的方式快速的生成一个聚合接口。")]),t._v(" "),r("p",[t._v("特点: 在线API设计、在线测试、快速开发")]),t._v(" "),r("h2",{attrs:{id:"举例说明"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#举例说明"}},[t._v("#")]),t._v(" 举例说明")]),t._v(" "),r("p",[t._v("订单详情页面需要展示订单信息、商品信息和用户信息。可通过配置的方式生成一个接口先后调用底层微服务的订单详情接口、商品信息接口和用户信息接口,再从这3个接口的返回结果里提取需要的字段返回给前端页面。")]),t._v(" "),r("h2",{attrs:{id:"服务编排架构"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#服务编排架构"}},[t._v("#")]),t._v(" 服务编排架构")]),t._v(" "),r("p",[r("img",{attrs:{src:"/fizz_aggregate.jpg",alt:""}})]),t._v(" "),r("h2",{attrs:{id:"适用场景"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#适用场景"}},[t._v("#")]),t._v(" 适用场景")]),t._v(" "),r("h3",{attrs:{id:"前端"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#前端"}},[t._v("#")]),t._v(" 前端")]),t._v(" "),r("p",[t._v("1、一个页面调用多个接口时,可以编排好返回聚合结果,提高页面数据的加载速度")]),t._v(" "),r("p",[t._v("2、移动设备计算能力有限,可以把数据计算或业务处理逻辑放到服务端完成,加快页面响应")]),t._v(" "),r("h3",{attrs:{id:"后端"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#后端"}},[t._v("#")]),t._v(" 后端")]),t._v(" "),r("p",[t._v("1、替换应用层的聚合接口,减少应用层的胶水代码")]),t._v(" "),r("p",[t._v("2、快速生成透传数据类型的接口")]),t._v(" "),r("p",[t._v("3、数据转换和映射")])])}),[],!1,null,null,null);a.default=_.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/8.99888a6b.js b/docs/assets/js/8.99888a6b.js deleted file mode 100644 index edbab21..0000000 --- a/docs/assets/js/8.99888a6b.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[8],{352:function(t,a,r){"use strict";r.r(a);var s=r(42),e=Object(s.a)({},(function(){var t=this,a=t.$createElement,r=t._self._c||a;return r("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[r("h2",{attrs:{id:"什么是服务编排"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#什么是服务编排"}},[t._v("#")]),t._v(" 什么是服务编排")]),t._v(" "),r("p",[t._v("服务编排主要基于现有的业务微服务使用在线配置的方式快速的生成一个聚合接口。")]),t._v(" "),r("p",[t._v("特点: 在线API设计、在线测试、快速开发")]),t._v(" "),r("h2",{attrs:{id:"举例说明"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#举例说明"}},[t._v("#")]),t._v(" 举例说明")]),t._v(" "),r("p",[t._v("订单详情页面需要展示订单信息、商品信息和用户信息。可通过配置的方式生成一个接口先后调用底层微服务的订单详情接口、商品信息接口和用户信息接口,再从这3个接口的返回结果里提取需要的字段返回给前端页面。")]),t._v(" "),r("h2",{attrs:{id:"服务编排架构"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#服务编排架构"}},[t._v("#")]),t._v(" 服务编排架构")]),t._v(" "),r("p",[r("img",{attrs:{src:"/fizz-gateway-community/fizz_aggregate.jpg",alt:""}})]),t._v(" "),r("h2",{attrs:{id:"适用场景"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#适用场景"}},[t._v("#")]),t._v(" 适用场景")]),t._v(" "),r("h3",{attrs:{id:"前端"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#前端"}},[t._v("#")]),t._v(" 前端")]),t._v(" "),r("p",[t._v("1、一个页面调用多个接口时,可以编排好返回聚合结果,提高页面数据的加载速度")]),t._v(" "),r("p",[t._v("2、移动设备计算能力有限,可以把数据计算或业务处理逻辑放到服务端完成,加快页面响应")]),t._v(" "),r("h3",{attrs:{id:"后端"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#后端"}},[t._v("#")]),t._v(" 后端")]),t._v(" "),r("p",[t._v("1、替换应用层的聚合接口,减少应用层的胶水代码")]),t._v(" "),r("p",[t._v("2、快速生成透传数据类型的接口")]),t._v(" "),r("p",[t._v("3、数据转换和映射")])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/9.3d56fa0d.js b/docs/assets/js/9.3d56fa0d.js deleted file mode 100644 index c0eb373..0000000 --- a/docs/assets/js/9.3d56fa0d.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[9],{355:function(t,a,s){"use strict";s.r(a);var n=s(42),e=Object(n.a)({},(function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h2",{attrs:{id:"创建服务"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#创建服务"}},[t._v("#")]),t._v(" 创建服务")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_newservice.png",alt:""}})]),t._v(" "),s("h2",{attrs:{id:"创建聚合接口"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#创建聚合接口"}},[t._v("#")]),t._v(" 创建聚合接口")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_newapi0.png",alt:""}}),t._v(" "),s("img",{attrs:{src:"/fizz-gateway-community/aggr_newapi.png",alt:""}})]),t._v(" "),s("h2",{attrs:{id:"配置输入"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置输入"}},[t._v("#")]),t._v(" 配置输入")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_input.png",alt:""}})]),t._v(" "),s("ul",[s("li",[t._v("配置输入的定义包括3部分:请求头、请求体和Query参数")]),t._v(" "),s("li",[t._v("基于JSON Schema规范")]),t._v(" "),s("li",[t._v("自带校验规则")]),t._v(" "),s("li",[t._v("支持自定义脚本实现复杂的逻辑校验")])]),t._v(" "),s("p",[t._v("JSON Schema规范,详见:")]),t._v(" "),s("p",[s("a",{attrs:{href:"http://json-schema.org/specification.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://json-schema.org/specification.html"),s("OutboundLink")],1)]),t._v(" "),s("p",[s("a",{attrs:{href:"http://json-schema.org/understanding-json-schema/",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://json-schema.org/understanding-json-schema/"),s("OutboundLink")],1)]),t._v(" "),s("h2",{attrs:{id:"配置校验结果"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置校验结果"}},[t._v("#")]),t._v(" 配置校验结果")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_input_validate_result.png",alt:""}})]),t._v(" "),s("ul",[s("li",[t._v("校验不通过时,Fizz会把校验失败的原因(如:订单ID不能为空)放到上下文的validateMsg字段里")]),t._v(" "),s("li",[t._v("可以自定义返回给调用方的报文格式,如 msgCode, message")]),t._v(" "),s("li",[t._v("支持自定义响应头")]),t._v(" "),s("li",[t._v("支持自定义脚本处理校验结果")])]),t._v(" "),s("h2",{attrs:{id:"配置步骤"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置步骤"}},[t._v("#")]),t._v(" 配置步骤")]),t._v(" "),s("h3",{attrs:{id:"配置步骤的基础信息"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置步骤的基础信息"}},[t._v("#")]),t._v(" 配置步骤的基础信息")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_step1.png",alt:""}})]),t._v(" "),s("h3",{attrs:{id:"配置步骤的接口入出参"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置步骤的接口入出参"}},[t._v("#")]),t._v(" 配置步骤的接口入出参")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_step2.png",alt:""}})]),t._v(" "),s("h3",{attrs:{id:"步骤说明"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#步骤说明"}},[t._v("#")]),t._v(" 步骤说明")]),t._v(" "),s("ul",[s("li",[t._v("一个聚合接口可包含多个步骤")]),t._v(" "),s("li",[t._v("一个步骤可包含多个请求(即调用多个接口)")]),t._v(" "),s("li",[t._v("步骤间是串联顺序执行")]),t._v(" "),s("li",[t._v("一个步骤内的多个请求并行执行")])]),t._v(" "),s("h3",{attrs:{id:"数据转换"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#数据转换"}},[t._v("#")]),t._v(" 数据转换")]),t._v(" "),s("p",[t._v("支持配置固定值,引用值和脚本")]),t._v(" "),s("h4",{attrs:{id:"固定值"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#固定值"}},[t._v("#")]),t._v(" 固定值")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_step_mapping_1.png",alt:""}})]),t._v(" "),s("h4",{attrs:{id:"引用值"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#引用值"}},[t._v("#")]),t._v(" 引用值")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_step_mapping_2.png",alt:""}})]),t._v(" "),s("h4",{attrs:{id:"脚本"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#脚本"}},[t._v("#")]),t._v(" 脚本")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_step_mapping_3.png",alt:""}})]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_step_mapping_4.png",alt:""}})]),t._v(" "),s("h4",{attrs:{id:"星号"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#星号"}},[t._v("#")]),t._v(" 星号 *")]),t._v(" "),s("p",[t._v("星号通配符可以接收一个返回对象类型的引用值,返回对象里的字段会合并到目标对象里")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_step_mapping_5.png",alt:""}})]),t._v(" "),s("p",[t._v('样例:userInfo = {"userName": "Fizz", "userID": 1234}')]),t._v(" "),s("h4",{attrs:{id:"优先级与覆盖顺序"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#优先级与覆盖顺序"}},[t._v("#")]),t._v(" 优先级与覆盖顺序")]),t._v(" "),s("p",[t._v("固定值 < 引用值 < 脚本 < 星号*")]),t._v(" "),s("p",[t._v("当一个字段配置了多种类型的值时按以上顺序覆盖,星号优先级最高")]),t._v(" "),s("h4",{attrs:{id:"引用值规范"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#引用值规范"}},[t._v("#")]),t._v(" 引用值规范")]),t._v(" "),s("div",{staticClass:"language-properties extra-class"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 获取入参请求头aaa的值")]),t._v("\ninput.request.headers.aaa\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 获取入参请求体bbb字段的值")]),t._v("\ninput.request.body.bbb\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 获取入参URL Query参数fff字段的值")]),t._v("\ninput.request.params.fff\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 获取步骤1里request1的请求头ccc的值")]),t._v("\nstep1.request1.request.headers.ccc\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 获取步骤1里request1的响应体ddd的值")]),t._v("\nstep1.request1.response.body.ddd\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 获取步骤1结果里eee的值")]),t._v("\nstep1.result.eee\n\n")])])]),s("ul",[s("li",[t._v("支持单值引用,如:string,int等")]),t._v(" "),s("li",[t._v("支持对象类型的引用")])]),t._v(" "),s("p",[t._v("input: 表示调用方的输入数据,如H5页面提交上来的参数")]),t._v(" "),s("p",[t._v("stepN.requestN: 表示步骤N里调用接口N的相关参数")]),t._v(" "),s("p",[t._v("stepN.result: 表示步骤N的转换结果")]),t._v(" "),s("h4",{attrs:{id:"fallback与预处理条件"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#fallback与预处理条件"}},[t._v("#")]),t._v(" Fallback与预处理条件")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_step_fallback.png",alt:""}})]),t._v(" "),s("p",[t._v("Fallback:")]),t._v(" "),s("p",[t._v("当调用接口发生异常(如超时、网络或系统异常)可配置fallback方案:")]),t._v(" "),s("ul",[s("li",[t._v("Stop: 终止请求并立即返回")]),t._v(" "),s("li",[t._v("Continue: 继续后续的操作,且要设置默认的fallback json")])]),t._v(" "),s("p",[t._v("预处理: 根据条件判断是否要调用接口,脚本返回true时才调用接口")]),t._v(" "),s("h4",{attrs:{id:"配置步骤结果处理"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置步骤结果处理"}},[t._v("#")]),t._v(" 配置步骤结果处理")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_step_result.png",alt:""}})]),t._v(" "),s("ul",[s("li",[s("p",[t._v("支持对步骤里调用的每一个接口的返回结果做数据转换,如果配置数据转换规则原样返回并存储到上下文里供后续使用")])]),t._v(" "),s("li",[s("p",[t._v("支持对步骤里调用的一个或多个接口的返回结果做处理,并把处理完的结果存储到上下文里供后续使用,不配置则不处理")])])]),t._v(" "),s("h2",{attrs:{id:"配置输出"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置输出"}},[t._v("#")]),t._v(" 配置输出")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_output.png",alt:""}})]),t._v(" "),s("p",[t._v("配置返回给调用方的结果")]),t._v(" "),s("ul",[s("li",[t._v("支持配置响应头")]),t._v(" "),s("li",[t._v("支持配置响应体")]),t._v(" "),s("li",[t._v("支持自定脚本处理复杂的业务逻辑")])]),t._v(" "),s("h2",{attrs:{id:"脚本-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#脚本-2"}},[t._v("#")]),t._v(" 脚本")]),t._v(" "),s("p",[t._v("目前支持以下脚本语言:")]),t._v(" "),s("p",[t._v("Javascript (推荐) - ECMAScript 5标准")]),t._v(" "),s("p",[t._v("JS脚本只支持单函数,且函数名不可变,在创建脚本时系统会自动生成初始模板,模板里包含相关使用说明")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_script_1.png",alt:""}})]),t._v(" "),s("p",[t._v("Groovy")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_script_2.png",alt:""}})]),t._v(" "),s("h3",{attrs:{id:"common-js-提供了操作context上下文的便捷操作函数"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#common-js-提供了操作context上下文的便捷操作函数"}},[t._v("#")]),t._v(" common.js 提供了操作context上下文的便捷操作函数")]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * context 上下文便捷操作函数\n *\n */")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" common "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* *********** private function begin *********** */")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 获取上下文中客户端请求对象")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getInputReq")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'input'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'input'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'request'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'input'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'request'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 获取上下文步骤中请求接口的请求对象")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getStepReq")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("stepName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'requests'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'requests'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'requests'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'request'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'requests'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'request'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 获取上下文步骤中请求接口的响应对象")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getStepResp")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("stepName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'requests'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'requests'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'requests'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'response'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'requests'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'response'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* *********** private function end *********** */")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* *********** input begin ************ */")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取客户端请求头\n * @param {*} ctx 上下文 【必填】\n * @param {*} headerName 请求头字段名 【选填】,不传时返回所有请求头\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getInputReqHeader")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" headerName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" req "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInputReq")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" headers "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'headers'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" headerName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("headerName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取客户端URL请求参数(query string)\n * @param {*} ctx 上下文 【必填】\n * @param {*} paramName URL参数名 【选填】,不传时返回所有请求参数\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getInputReqParam")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" paramName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" req "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInputReq")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" params "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'params'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" paramName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" params"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("paramName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" params"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取客户端请求体\n * @param {*} ctx 上下文 【必填】\n * @param {*} field 字段名 【选填】,不传时返回整个请求体\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getInputReqBody")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" field")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" req "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInputReq")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" body "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'body'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" field "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" body"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("field"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" body"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取返回给客户端的响应头\n * @param {*} ctx 上下文 【必填】\n * @param {*} headerName 响应头字段名 【选填】,不传时返回所有响应头\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getInputRespHeader")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" headerName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" req "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInputReq")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" headers "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'headers'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" headerName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("headerName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取返回给客户端的响应体\n * @param {*} ctx 上下文 【必填】\n * @param {*} field 字段名 【选填】,不传时返回整个响应体\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getInputRespBody")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" field")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" req "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInputReq")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" body "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'body'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" field "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" body"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("field"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" body"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* *********** input begin ************ */")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* *********** step request begin ************ */")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取步骤中调用的接口的请求头\n * @param {*} ctx 上下文 【必填】\n * @param {*} stepName 步骤名【必填】\n * @param {*} requestName 请求的接口名 【必填】\n * @param {*} headerName 请求头字段名 【选填】,不传时返回所有请求头\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getStepReqHeader")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" headerName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" req "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getStepReq")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" headers "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'headers'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" headerName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("headerName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取步骤中调用的接口的URL参数\n * @param {*} ctx 上下文 【必填】\n * @param {*} stepName 步骤名【必填】\n * @param {*} requestName 请求的接口名 【必填】\n * @param {*} paramName URL参数名 【选填】,不传时返回所有URL参数\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getStepReqParam")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" paramName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" req "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getStepReq")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" params "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'params'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" paramName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" params"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("paramName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" params"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取步骤中调用的接口的请求体\n * @param {*} ctx 上下文 【必填】\n * @param {*} stepName 步骤名【必填】\n * @param {*} requestName 请求的接口名 【必填】\n * @param {*} field 字段名 【选填】,不传时返回整个请求体\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getStepReqBody")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" field")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" req "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getStepReq")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" body "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'body'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" field "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" body"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("field"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" body"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取步骤中调用的接口的响应头\n * @param {*} ctx 上下文 【必填】\n * @param {*} stepName 步骤名【必填】\n * @param {*} requestName 请求的接口名 【必填】\n * @param {*} headerName 响应头字段名 【选填】,不传时返回所有响应头\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getStepRespHeader")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" headerName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" resp "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getStepResp")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" headers "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" resp"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'headers'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" headerName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("headerName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取步骤中调用的接口的响应头\n * @param {*} ctx 上下文 【必填】\n * @param {*} stepName 步骤名【必填】\n * @param {*} requestName 请求的接口名 【必填】\n * @param {*} field 字段名 【选填】,不传时返回整个响应头\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getStepRespBody")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" field")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" resp "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getStepResp")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" body "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" resp"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'body'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" field "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" body"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("field"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" body"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取步骤结果\n * @param {*} ctx 上下文 【必填】\n * @param {*} stepName 步骤名【必填】\n * @param {*} field 字段名 【选填】,不传时返回整个步骤结果对象\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getStepResult")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" field")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("stepName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" result "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'result'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" field "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("field"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* *********** step request end ************ */")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n")])])]),s("h3",{attrs:{id:"context-js-数据结构"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#context-js-数据结构"}},[t._v("#")]),t._v(" context.js 数据结构")]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 上下文,用于保存客户输入输出和每个步骤的输入与输出结果")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" context "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 是否DEBUG模式")]),t._v("\n\tdebug"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n\t"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 各个操作的耗时")]),t._v("\n\telapsedTimes"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("actionName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("123")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 操作名称:耗时")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 客户输入和接口的返回结果")]),t._v("\n input"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n request"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n path"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n method"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GET/POST"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headers"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n body"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n params"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n response"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 聚合接口的响应")]),t._v("\n headers"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n body"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 步骤")]),t._v("\n step1"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n requests"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 接口1")]),t._v("\n request1"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 请求相关参数")]),t._v("\n request"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n url"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n method"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GET/POST"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headers"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n body"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 根据转换规则转换后的接口响应")]),t._v("\n response"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n headers"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n body"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 接口2")]),t._v("\n request2"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n request"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n url"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n method"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GET/POST"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headers"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n body"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n response"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n headers"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n body"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//...")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 步骤结果")]),t._v("\n result"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n")])])]),s("h2",{attrs:{id:"异常处理"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#异常处理"}},[t._v("#")]),t._v(" 异常处理")]),t._v(" "),s("p",[t._v("当要在脚本里中止请求时可以通过以下方式来实现")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_exception.png",alt:""}})]),t._v(" "),s("p",[t._v("返回一个对象且这个对象包含一个_stopAndResponse等于true的属性,Fizz会终止后续的操作并把这个对象返回给调用方。")]),t._v(" "),s("h2",{attrs:{id:"配置路由"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置路由"}},[t._v("#")]),t._v(" 配置路由")]),t._v(" "),s("p",[t._v("至此服务编排的接口配置完成,但此时还不能通过网关访问接口,需要到网关管理-路由管理里配置路由")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_route.png",alt:""}})]),t._v(" "),s("h2",{attrs:{id:"在线测试"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#在线测试"}},[t._v("#")]),t._v(" 在线测试")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_test.png",alt:""}})]),t._v(" "),s("ul",[s("li",[t._v("支持在线实时测试")]),t._v(" "),s("li",[t._v("支持测试接口和正式接口隔离")]),t._v(" "),s("li",[t._v("支持返回上下文,可以查看整个执行过程中各个步骤及请求的输入与输出")]),t._v(" "),s("li",[t._v("支持保存历史测试记录")])]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_test2.png",alt:""}})]),t._v(" "),s("p",[t._v("支持调试模式,在测试接口和正式接口均可使用,修改后重新发布可实时生效,在调试模式下会打印请求日志及报文,主要用于排查线上问题")]),t._v(" "),s("h2",{attrs:{id:"导入导出"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#导入导出"}},[t._v("#")]),t._v(" 导入导出")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_import_export.png",alt:""}})]),t._v(" "),s("p",[t._v("导入导出主要用于在各个环境间同步接口配置,在开发环境配置好后导到测试环境中测试,测试完后导到生产环境进行发布")]),t._v(" "),s("h2",{attrs:{id:"发布-下线和审核"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#发布-下线和审核"}},[t._v("#")]),t._v(" 发布|下线和审核")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_release_1.png",alt:""}})]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_release_2.png",alt:""}})]),t._v(" "),s("p",[t._v("目前发布|下线申请有以上两个入口。")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_release_rollback1.png",alt:""}})]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_release_rollback.png",alt:""}})]),t._v(" "),s("ul",[s("li",[t._v("批量发布:对发布单里的接口进行批量发布")]),t._v(" "),s("li",[t._v("批量回滚:对发布单里的接口进行批量回滚")]),t._v(" "),s("li",[t._v("发布:实时发布到网关")]),t._v(" "),s("li",[t._v("回滚:支持回滚到历史任何一个版本,可在发布历史里指定一个版本进行回滚")]),t._v(" "),s("li",[t._v("下线:从网关删除接口,在后台可以通过发布功能再次上线")])]),t._v(" "),s("h3",{attrs:{id:"发布流程说明"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#发布流程说明"}},[t._v("#")]),t._v(" 发布流程说明")]),t._v(" "),s("p",[t._v("申请发布、审核、发布和下线功能的权限可根据需要灵活分配给不同角色,如:开发人员只能申请发布,上级领导审核,运维或测试人员执行发布、回滚或下线。在开发、测试和预生产环境为了方便开发人员调试也可把申请发布、审核、发布和下线功能都分配给开发人员。")])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/9.9eb9244c.js b/docs/assets/js/9.9eb9244c.js new file mode 100644 index 0000000..bd848ab --- /dev/null +++ b/docs/assets/js/9.9eb9244c.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[9],{357:function(t,a,s){"use strict";s.r(a);var n=s(42),e=Object(n.a)({},(function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h2",{attrs:{id:"创建服务"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#创建服务"}},[t._v("#")]),t._v(" 创建服务")]),t._v(" "),s("p",[s("img",{attrs:{src:"/aggr_newservice.png",alt:""}})]),t._v(" "),s("h2",{attrs:{id:"创建聚合接口"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#创建聚合接口"}},[t._v("#")]),t._v(" 创建聚合接口")]),t._v(" "),s("p",[s("img",{attrs:{src:"/aggr_newapi0.png",alt:""}}),t._v(" "),s("img",{attrs:{src:"/aggr_newapi.png",alt:""}})]),t._v(" "),s("h2",{attrs:{id:"配置输入"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置输入"}},[t._v("#")]),t._v(" 配置输入")]),t._v(" "),s("p",[s("img",{attrs:{src:"/aggr_config_input.png",alt:""}})]),t._v(" "),s("ul",[s("li",[t._v("配置输入的定义包括3部分:请求头、请求体和Query参数")]),t._v(" "),s("li",[t._v("基于JSON Schema规范")]),t._v(" "),s("li",[t._v("自带校验规则")]),t._v(" "),s("li",[t._v("支持自定义脚本实现复杂的逻辑校验")])]),t._v(" "),s("p",[t._v("JSON Schema规范,详见:")]),t._v(" "),s("p",[s("a",{attrs:{href:"http://json-schema.org/specification.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://json-schema.org/specification.html"),s("OutboundLink")],1)]),t._v(" "),s("p",[s("a",{attrs:{href:"http://json-schema.org/understanding-json-schema/",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://json-schema.org/understanding-json-schema/"),s("OutboundLink")],1)]),t._v(" "),s("h2",{attrs:{id:"配置校验结果"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置校验结果"}},[t._v("#")]),t._v(" 配置校验结果")]),t._v(" "),s("p",[s("img",{attrs:{src:"/aggr_config_input_validate_result.png",alt:""}})]),t._v(" "),s("ul",[s("li",[t._v("校验不通过时,Fizz会把校验失败的原因(如:订单ID不能为空)放到上下文的validateMsg字段里")]),t._v(" "),s("li",[t._v("可以自定义返回给调用方的报文格式,如 msgCode, message")]),t._v(" "),s("li",[t._v("支持自定义响应头")]),t._v(" "),s("li",[t._v("支持自定义脚本处理校验结果")])]),t._v(" "),s("h2",{attrs:{id:"配置步骤"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置步骤"}},[t._v("#")]),t._v(" 配置步骤")]),t._v(" "),s("h3",{attrs:{id:"配置步骤的基础信息"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置步骤的基础信息"}},[t._v("#")]),t._v(" 配置步骤的基础信息")]),t._v(" "),s("p",[s("img",{attrs:{src:"/aggr_config_step1.png",alt:""}})]),t._v(" "),s("h3",{attrs:{id:"配置步骤的接口入出参"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置步骤的接口入出参"}},[t._v("#")]),t._v(" 配置步骤的接口入出参")]),t._v(" "),s("p",[s("img",{attrs:{src:"/aggr_config_step2.png",alt:""}})]),t._v(" "),s("h3",{attrs:{id:"步骤说明"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#步骤说明"}},[t._v("#")]),t._v(" 步骤说明")]),t._v(" "),s("ul",[s("li",[t._v("一个聚合接口可包含多个步骤")]),t._v(" "),s("li",[t._v("一个步骤可包含多个请求(即调用多个接口)")]),t._v(" "),s("li",[t._v("步骤间是串联顺序执行")]),t._v(" "),s("li",[t._v("一个步骤内的多个请求并行执行")])]),t._v(" "),s("h3",{attrs:{id:"数据转换"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#数据转换"}},[t._v("#")]),t._v(" 数据转换")]),t._v(" "),s("p",[t._v("支持配置固定值,引用值和脚本")]),t._v(" "),s("h4",{attrs:{id:"固定值"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#固定值"}},[t._v("#")]),t._v(" 固定值")]),t._v(" "),s("p",[s("img",{attrs:{src:"/aggr_config_step_mapping_1.png",alt:""}})]),t._v(" "),s("h4",{attrs:{id:"引用值"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#引用值"}},[t._v("#")]),t._v(" 引用值")]),t._v(" "),s("p",[s("img",{attrs:{src:"/aggr_config_step_mapping_2.png",alt:""}})]),t._v(" "),s("h4",{attrs:{id:"脚本"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#脚本"}},[t._v("#")]),t._v(" 脚本")]),t._v(" "),s("p",[s("img",{attrs:{src:"/aggr_config_step_mapping_3.png",alt:""}})]),t._v(" "),s("p",[s("img",{attrs:{src:"/aggr_config_step_mapping_4.png",alt:""}})]),t._v(" "),s("h4",{attrs:{id:"星号"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#星号"}},[t._v("#")]),t._v(" 星号 *")]),t._v(" "),s("p",[t._v("星号通配符可以接收一个返回对象类型的引用值,返回对象里的字段会合并到目标对象里")]),t._v(" "),s("p",[s("img",{attrs:{src:"/aggr_config_step_mapping_5.png",alt:""}})]),t._v(" "),s("p",[t._v('样例:userInfo = {"userName": "Fizz", "userID": 1234}')]),t._v(" "),s("h4",{attrs:{id:"优先级与覆盖顺序"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#优先级与覆盖顺序"}},[t._v("#")]),t._v(" 优先级与覆盖顺序")]),t._v(" "),s("p",[t._v("固定值 < 引用值 < 脚本 < 星号*")]),t._v(" "),s("p",[t._v("当一个字段配置了多种类型的值时按以上顺序覆盖,星号优先级最高")]),t._v(" "),s("h4",{attrs:{id:"引用值规范"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#引用值规范"}},[t._v("#")]),t._v(" 引用值规范")]),t._v(" "),s("div",{staticClass:"language-properties extra-class"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 获取入参请求头aaa的值")]),t._v("\ninput.request.headers.aaa\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 获取入参请求体bbb字段的值")]),t._v("\ninput.request.body.bbb\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 获取入参URL Query参数fff字段的值")]),t._v("\ninput.request.params.fff\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 获取步骤1里request1的请求头ccc的值")]),t._v("\nstep1.request1.request.headers.ccc\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 获取步骤1里request1的响应体ddd的值")]),t._v("\nstep1.request1.response.body.ddd\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 获取步骤1结果里eee的值")]),t._v("\nstep1.result.eee\n\n")])])]),s("ul",[s("li",[t._v("支持单值引用,如:string,int等")]),t._v(" "),s("li",[t._v("支持对象类型的引用")])]),t._v(" "),s("p",[t._v("input: 表示调用方的输入数据,如H5页面提交上来的参数")]),t._v(" "),s("p",[t._v("stepN.requestN: 表示步骤N里调用接口N的相关参数")]),t._v(" "),s("p",[t._v("stepN.result: 表示步骤N的转换结果")]),t._v(" "),s("h4",{attrs:{id:"fallback与预处理条件"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#fallback与预处理条件"}},[t._v("#")]),t._v(" Fallback与预处理条件")]),t._v(" "),s("p",[s("img",{attrs:{src:"/aggr_config_step_fallback.png",alt:""}})]),t._v(" "),s("p",[t._v("Fallback:")]),t._v(" "),s("p",[t._v("当调用接口发生异常(如超时、网络或系统异常)可配置fallback方案:")]),t._v(" "),s("ul",[s("li",[t._v("Stop: 终止请求并立即返回")]),t._v(" "),s("li",[t._v("Continue: 继续后续的操作,且要设置默认的fallback json")])]),t._v(" "),s("p",[t._v("预处理: 根据条件判断是否要调用接口,脚本返回true时才调用接口")]),t._v(" "),s("h4",{attrs:{id:"配置步骤结果处理"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置步骤结果处理"}},[t._v("#")]),t._v(" 配置步骤结果处理")]),t._v(" "),s("p",[s("img",{attrs:{src:"/aggr_config_step_result.png",alt:""}})]),t._v(" "),s("ul",[s("li",[s("p",[t._v("支持对步骤里调用的每一个接口的返回结果做数据转换,如果配置数据转换规则原样返回并存储到上下文里供后续使用")])]),t._v(" "),s("li",[s("p",[t._v("支持对步骤里调用的一个或多个接口的返回结果做处理,并把处理完的结果存储到上下文里供后续使用,不配置则不处理")])])]),t._v(" "),s("h2",{attrs:{id:"配置输出"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置输出"}},[t._v("#")]),t._v(" 配置输出")]),t._v(" "),s("p",[s("img",{attrs:{src:"/aggr_config_output.png",alt:""}})]),t._v(" "),s("p",[t._v("配置返回给调用方的结果")]),t._v(" "),s("ul",[s("li",[t._v("支持配置响应头")]),t._v(" "),s("li",[t._v("支持配置响应体")]),t._v(" "),s("li",[t._v("支持自定脚本处理复杂的业务逻辑")])]),t._v(" "),s("h2",{attrs:{id:"脚本-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#脚本-2"}},[t._v("#")]),t._v(" 脚本")]),t._v(" "),s("p",[t._v("目前支持以下脚本语言:")]),t._v(" "),s("p",[t._v("Javascript (推荐) - ECMAScript 5标准")]),t._v(" "),s("p",[t._v("JS脚本只支持单函数,且函数名不可变,在创建脚本时系统会自动生成初始模板,模板里包含相关使用说明")]),t._v(" "),s("p",[s("img",{attrs:{src:"/aggr_config_script_1.png",alt:""}})]),t._v(" "),s("p",[t._v("Groovy")]),t._v(" "),s("p",[s("img",{attrs:{src:"/aggr_config_script_2.png",alt:""}})]),t._v(" "),s("h3",{attrs:{id:"common-js-提供了操作context上下文的便捷操作函数"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#common-js-提供了操作context上下文的便捷操作函数"}},[t._v("#")]),t._v(" common.js 提供了操作context上下文的便捷操作函数")]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * context 上下文便捷操作函数\n *\n */")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" common "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* *********** private function begin *********** */")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 获取上下文中客户端请求对象")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getInputReq")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'input'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'input'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'request'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'input'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'request'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 获取上下文步骤中请求接口的请求对象")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getStepReq")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("stepName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'requests'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'requests'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'requests'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'request'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'requests'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'request'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 获取上下文步骤中请求接口的响应对象")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getStepResp")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("stepName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'requests'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'requests'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'requests'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'response'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'requests'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'response'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* *********** private function end *********** */")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* *********** input begin ************ */")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取客户端请求头\n * @param {*} ctx 上下文 【必填】\n * @param {*} headerName 请求头字段名 【选填】,不传时返回所有请求头\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getInputReqHeader")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" headerName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" req "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInputReq")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" headers "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'headers'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" headerName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("headerName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取客户端URL请求参数(query string)\n * @param {*} ctx 上下文 【必填】\n * @param {*} paramName URL参数名 【选填】,不传时返回所有请求参数\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getInputReqParam")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" paramName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" req "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInputReq")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" params "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'params'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" paramName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" params"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("paramName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" params"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取客户端请求体\n * @param {*} ctx 上下文 【必填】\n * @param {*} field 字段名 【选填】,不传时返回整个请求体\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getInputReqBody")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" field")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" req "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInputReq")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" body "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'body'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" field "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" body"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("field"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" body"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取返回给客户端的响应头\n * @param {*} ctx 上下文 【必填】\n * @param {*} headerName 响应头字段名 【选填】,不传时返回所有响应头\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getInputRespHeader")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" headerName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" req "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInputReq")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" headers "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'headers'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" headerName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("headerName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取返回给客户端的响应体\n * @param {*} ctx 上下文 【必填】\n * @param {*} field 字段名 【选填】,不传时返回整个响应体\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getInputRespBody")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" field")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" req "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInputReq")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" body "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'body'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" field "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" body"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("field"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" body"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* *********** input begin ************ */")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* *********** step request begin ************ */")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取步骤中调用的接口的请求头\n * @param {*} ctx 上下文 【必填】\n * @param {*} stepName 步骤名【必填】\n * @param {*} requestName 请求的接口名 【必填】\n * @param {*} headerName 请求头字段名 【选填】,不传时返回所有请求头\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getStepReqHeader")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" headerName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" req "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getStepReq")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" headers "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'headers'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" headerName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("headerName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取步骤中调用的接口的URL参数\n * @param {*} ctx 上下文 【必填】\n * @param {*} stepName 步骤名【必填】\n * @param {*} requestName 请求的接口名 【必填】\n * @param {*} paramName URL参数名 【选填】,不传时返回所有URL参数\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getStepReqParam")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" paramName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" req "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getStepReq")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" params "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'params'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" paramName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" params"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("paramName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" params"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取步骤中调用的接口的请求体\n * @param {*} ctx 上下文 【必填】\n * @param {*} stepName 步骤名【必填】\n * @param {*} requestName 请求的接口名 【必填】\n * @param {*} field 字段名 【选填】,不传时返回整个请求体\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getStepReqBody")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" field")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" req "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getStepReq")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" body "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'body'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" field "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" body"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("field"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" body"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取步骤中调用的接口的响应头\n * @param {*} ctx 上下文 【必填】\n * @param {*} stepName 步骤名【必填】\n * @param {*} requestName 请求的接口名 【必填】\n * @param {*} headerName 响应头字段名 【选填】,不传时返回所有响应头\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getStepRespHeader")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" headerName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" resp "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getStepResp")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" headers "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" resp"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'headers'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" headerName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("headerName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取步骤中调用的接口的响应头\n * @param {*} ctx 上下文 【必填】\n * @param {*} stepName 步骤名【必填】\n * @param {*} requestName 请求的接口名 【必填】\n * @param {*} field 字段名 【选填】,不传时返回整个响应头\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getStepRespBody")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" field")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" resp "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getStepResp")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" body "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" resp"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'body'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" field "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" body"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("field"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" body"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取步骤结果\n * @param {*} ctx 上下文 【必填】\n * @param {*} stepName 步骤名【必填】\n * @param {*} field 字段名 【选填】,不传时返回整个步骤结果对象\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getStepResult")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" field")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("stepName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" result "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'result'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" field "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("field"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* *********** step request end ************ */")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n")])])]),s("h3",{attrs:{id:"context-js-数据结构"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#context-js-数据结构"}},[t._v("#")]),t._v(" context.js 数据结构")]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 上下文,用于保存客户输入输出和每个步骤的输入与输出结果")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" context "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 是否DEBUG模式")]),t._v("\n\tdebug"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n\t"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 各个操作的耗时")]),t._v("\n\telapsedTimes"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("actionName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("123")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 操作名称:耗时")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 客户输入和接口的返回结果")]),t._v("\n input"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n request"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n path"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n method"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GET/POST"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headers"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n body"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n params"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n response"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 聚合接口的响应")]),t._v("\n headers"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n body"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 步骤")]),t._v("\n step1"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n requests"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 接口1")]),t._v("\n request1"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 请求相关参数")]),t._v("\n request"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n url"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n method"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GET/POST"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headers"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n body"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 根据转换规则转换后的接口响应")]),t._v("\n response"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n headers"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n body"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 接口2")]),t._v("\n request2"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n request"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n url"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n method"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GET/POST"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headers"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n body"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n response"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n headers"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n body"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//...")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 步骤结果")]),t._v("\n result"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n")])])]),s("h2",{attrs:{id:"异常处理"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#异常处理"}},[t._v("#")]),t._v(" 异常处理")]),t._v(" "),s("p",[t._v("当要在脚本里中止请求时可以通过以下方式来实现")]),t._v(" "),s("p",[s("img",{attrs:{src:"/aggr_config_exception.png",alt:""}})]),t._v(" "),s("p",[t._v("返回一个对象且这个对象包含一个_stopAndResponse等于true的属性,Fizz会终止后续的操作并把这个对象返回给调用方。")]),t._v(" "),s("h2",{attrs:{id:"配置路由"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置路由"}},[t._v("#")]),t._v(" 配置路由")]),t._v(" "),s("p",[t._v("至此服务编排的接口配置完成,但此时还不能通过网关访问接口,需要到网关管理-路由管理里配置路由")]),t._v(" "),s("p",[s("img",{attrs:{src:"/aggr_config_route.png",alt:""}})]),t._v(" "),s("h2",{attrs:{id:"在线测试"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#在线测试"}},[t._v("#")]),t._v(" 在线测试")]),t._v(" "),s("p",[s("img",{attrs:{src:"/aggr_config_test.png",alt:""}})]),t._v(" "),s("ul",[s("li",[t._v("支持在线实时测试")]),t._v(" "),s("li",[t._v("支持测试接口和正式接口隔离")]),t._v(" "),s("li",[t._v("支持返回上下文,可以查看整个执行过程中各个步骤及请求的输入与输出")]),t._v(" "),s("li",[t._v("支持保存历史测试记录")])]),t._v(" "),s("p",[s("img",{attrs:{src:"/aggr_config_test2.png",alt:""}})]),t._v(" "),s("p",[t._v("支持调试模式,在测试接口和正式接口均可使用,修改后重新发布可实时生效,在调试模式下会打印请求日志及报文,主要用于排查线上问题")]),t._v(" "),s("h2",{attrs:{id:"导入导出"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#导入导出"}},[t._v("#")]),t._v(" 导入导出")]),t._v(" "),s("p",[s("img",{attrs:{src:"/aggr_config_import_export.png",alt:""}})]),t._v(" "),s("p",[t._v("导入导出主要用于在各个环境间同步接口配置,在开发环境配置好后导到测试环境中测试,测试完后导到生产环境进行发布")]),t._v(" "),s("h2",{attrs:{id:"发布-下线和审核"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#发布-下线和审核"}},[t._v("#")]),t._v(" 发布|下线和审核")]),t._v(" "),s("p",[s("img",{attrs:{src:"/aggr_release_1.png",alt:""}})]),t._v(" "),s("p",[s("img",{attrs:{src:"/aggr_release_2.png",alt:""}})]),t._v(" "),s("p",[t._v("目前发布|下线申请有以上两个入口。")]),t._v(" "),s("p",[s("img",{attrs:{src:"/aggr_release_rollback1.png",alt:""}})]),t._v(" "),s("p",[s("img",{attrs:{src:"/aggr_release_rollback.png",alt:""}})]),t._v(" "),s("ul",[s("li",[t._v("批量发布:对发布单里的接口进行批量发布")]),t._v(" "),s("li",[t._v("批量回滚:对发布单里的接口进行批量回滚")]),t._v(" "),s("li",[t._v("发布:实时发布到网关")]),t._v(" "),s("li",[t._v("回滚:支持回滚到历史任何一个版本,可在发布历史里指定一个版本进行回滚")]),t._v(" "),s("li",[t._v("下线:从网关删除接口,在后台可以通过发布功能再次上线")])]),t._v(" "),s("h3",{attrs:{id:"发布流程说明"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#发布流程说明"}},[t._v("#")]),t._v(" 发布流程说明")]),t._v(" "),s("p",[t._v("申请发布、审核、发布和下线功能的权限可根据需要灵活分配给不同角色,如:开发人员只能申请发布,上级领导审核,运维或测试人员执行发布、回滚或下线。在开发、测试和预生产环境为了方便开发人员调试也可把申请发布、审核、发布和下线功能都分配给开发人员。")])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/app.41e48030.js b/docs/assets/js/app.86b5ae26.js similarity index 79% rename from docs/assets/js/app.41e48030.js rename to docs/assets/js/app.86b5ae26.js index c8507ce..ee18dc9 100644 --- a/docs/assets/js/app.41e48030.js +++ b/docs/assets/js/app.86b5ae26.js @@ -1,4 +1,4 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[0],[]]);!function(t){function e(e){for(var r,a,u=e[0],c=e[1],s=e[2],f=0,p=[];f0?o(r(t),9007199254740991):0}},function(t,e){var n=Array.isArray;t.exports=n},function(t,e,n){var r=n(31),o=n(23);t.exports=function(t){return r(o(t))}},function(t,e,n){var r=n(140),o="object"==typeof self&&self&&self.Object===Object&&self,i=r||o||Function("return this")();t.exports=i},function(t,e,n){var r=n(6),o=n(1),i=n(7),a=Object.defineProperty,u={},c=function(t){throw t};t.exports=function(t,e){if(i(u,t))return u[t];e||(e={});var n=[][t],s=!!i(e,"ACCESSORS")&&e.ACCESSORS,l=i(e,0)?e[0]:c,f=i(e,1)?e[1]:void 0;return u[t]=!!n&&!o((function(){if(s&&!r)return!0;var t={length:-1};s?a(t,1,{enumerable:!0,get:c}):t[1]=1,n.call(t,l,f)}))}},function(t,e){var n={}.toString;t.exports=function(t){return n.call(t).slice(8,-1)}},function(t,e,n){var r=n(110),o=n(3),i=function(t){return"function"==typeof t?t:void 0};t.exports=function(t,e){return arguments.length<2?i(r[t])||i(o[t]):r[t]&&r[t][e]||o[t]&&o[t][e]}},function(t,e){t.exports=!1},function(t,e){t.exports=function(t){if("function"!=typeof t)throw TypeError(String(t)+" is not a function");return t}},function(t,e,n){var r=n(220),o=n(223);t.exports=function(t,e){var n=o(t,e);return r(n)?n:void 0}},function(t,e){t.exports=function(t){if(null==t)throw TypeError("Can't call method on "+t);return t}},function(t,e,n){"use strict";var r=n(0),o=n(29).filter,i=n(51),a=n(17),u=i("filter"),c=a("filter");r({target:"Array",proto:!0,forced:!u||!c},{filter:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}})},function(t,e,n){var r=n(6),o=n(75),i=n(32),a=n(15),u=n(44),c=n(7),s=n(105),l=Object.getOwnPropertyDescriptor;e.f=r?l:function(t,e){if(t=a(t),e=u(e,!0),s)try{return l(t,e)}catch(t){}if(c(t,e))return i(!o.f.call(t,e),t[e])}},function(t,e){t.exports=function(t){return null!=t&&"object"==typeof t}},function(t,e,n){"use strict";var r=n(128).charAt,o=n(28),i=n(111),a=o.set,u=o.getterFor("String Iterator");i(String,"String",(function(t){a(this,{type:"String Iterator",string:String(t),index:0})}),(function(){var t,e=u(this),n=e.string,o=e.index;return o>=n.length?{value:void 0,done:!0}:(t=r(n,o),e.index+=t.length,{value:t,done:!1})}))},function(t,e,n){var r,o,i,a=n(180),u=n(3),c=n(4),s=n(11),l=n(7),f=n(48),p=n(34),d=u.WeakMap;if(a){var h=new d,v=h.get,g=h.has,m=h.set;r=function(t,e){return m.call(h,t,e),e},o=function(t){return v.call(h,t)||{}},i=function(t){return g.call(h,t)}}else{var y=f("state");p[y]=!0,r=function(t,e){return s(t,y,e),e},o=function(t){return l(t,y)?t[y]:{}},i=function(t){return l(t,y)}}t.exports={set:r,get:o,has:i,enforce:function(t){return i(t)?o(t):r(t,{})},getterFor:function(t){return function(e){var n;if(!c(e)||(n=o(e)).type!==t)throw TypeError("Incompatible receiver, "+t+" required");return n}}}},function(t,e,n){var r=n(50),o=n(31),i=n(12),a=n(13),u=n(127),c=[].push,s=function(t){var e=1==t,n=2==t,s=3==t,l=4==t,f=6==t,p=5==t||f;return function(d,h,v,g){for(var m,y,b=i(d),_=o(b),x=r(h,v,3),w=a(_.length),O=0,S=g||u,j=e?S(d,w):n?S(d,0):void 0;w>O;O++)if((p||O in _)&&(y=x(m=_[O],O,b),t))if(e)j[O]=y;else if(y)switch(t){case 3:return!0;case 5:return m;case 6:return O;case 2:c.call(j,m)}else if(l)return!1;return f?-1:s||l?l:j}};t.exports={forEach:s(0),map:s(1),filter:s(2),some:s(3),every:s(4),find:s(5),findIndex:s(6)}},function(t,e,n){var r=n(39),o=n(205),i=n(206),a=r?r.toStringTag:void 0;t.exports=function(t){return null==t?void 0===t?"[object Undefined]":"[object Null]":a&&a in Object(t)?o(t):i(t)}},function(t,e,n){var r=n(1),o=n(18),i="".split;t.exports=r((function(){return!Object("z").propertyIsEnumerable(0)}))?function(t){return"String"==o(t)?i.call(t,""):Object(t)}:Object},function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},function(t,e,n){var r,o=n(5),i=n(179),a=n(73),u=n(34),c=n(109),s=n(70),l=n(48),f=l("IE_PROTO"),p=function(){},d=function(t){return" +

coming soon

上次更新: 2020-9-8 15:3
+ diff --git a/docs/guide/aggregate/configuration.html b/docs/guide/aggregate/configuration.html index 9ccfe04..da93a75 100644 --- a/docs/guide/aggregate/configuration.html +++ b/docs/guide/aggregate/configuration.html @@ -7,23 +7,23 @@ - - + + -

# 创建服务

# 创建聚合接口

# 配置输入

  • 配置输入的定义包括3部分:请求头、请求体和Query参数
  • 基于JSON Schema规范
  • 自带校验规则
  • 支持自定义脚本实现复杂的逻辑校验

JSON Schema规范,详见:

http://json-schema.org/specification.html

http://json-schema.org/understanding-json-schema/

# 配置校验结果

  • 校验不通过时,Fizz会把校验失败的原因(如:订单ID不能为空)放到上下文的validateMsg字段里
  • 可以自定义返回给调用方的报文格式,如 msgCode, message
  • 支持自定义响应头
  • 支持自定义脚本处理校验结果

# 配置步骤

# 配置步骤的基础信息

# 配置步骤的接口入出参

# 步骤说明

  • 一个聚合接口可包含多个步骤
  • 一个步骤可包含多个请求(即调用多个接口)
  • 步骤间是串联顺序执行
  • 一个步骤内的多个请求并行执行

# 数据转换

支持配置固定值,引用值和脚本

# 固定值

# 引用值

# 脚本

# 星号 *

星号通配符可以接收一个返回对象类型的引用值,返回对象里的字段会合并到目标对象里

样例:userInfo = {"userName": "Fizz", "userID": 1234}

# 优先级与覆盖顺序

固定值 < 引用值 < 脚本 < 星号*

当一个字段配置了多种类型的值时按以上顺序覆盖,星号优先级最高

# 引用值规范

# 获取入参请求头aaa的值
+        

# 创建服务

# 创建聚合接口

# 配置输入

  • 配置输入的定义包括3部分:请求头、请求体和Query参数
  • 基于JSON Schema规范
  • 自带校验规则
  • 支持自定义脚本实现复杂的逻辑校验

JSON Schema规范,详见:

http://json-schema.org/specification.html

http://json-schema.org/understanding-json-schema/

# 配置校验结果

  • 校验不通过时,Fizz会把校验失败的原因(如:订单ID不能为空)放到上下文的validateMsg字段里
  • 可以自定义返回给调用方的报文格式,如 msgCode, message
  • 支持自定义响应头
  • 支持自定义脚本处理校验结果

# 配置步骤

# 配置步骤的基础信息

# 配置步骤的接口入出参

# 步骤说明

  • 一个聚合接口可包含多个步骤
  • 一个步骤可包含多个请求(即调用多个接口)
  • 步骤间是串联顺序执行
  • 一个步骤内的多个请求并行执行

# 数据转换

支持配置固定值,引用值和脚本

# 固定值

# 引用值

# 脚本

# 星号 *

星号通配符可以接收一个返回对象类型的引用值,返回对象里的字段会合并到目标对象里

样例:userInfo = {"userName": "Fizz", "userID": 1234}

# 优先级与覆盖顺序

固定值 < 引用值 < 脚本 < 星号*

当一个字段配置了多种类型的值时按以上顺序覆盖,星号优先级最高

# 引用值规范

# 获取入参请求头aaa的值
 input.request.headers.aaa
 
 # 获取入参请求体bbb字段的值
@@ -41,7 +41,7 @@ step1.request1.response.body.ddd
 # 获取步骤1结果里eee的值
 step1.result.eee
 
-
  • 支持单值引用,如:string,int等
  • 支持对象类型的引用

input: 表示调用方的输入数据,如H5页面提交上来的参数

stepN.requestN: 表示步骤N里调用接口N的相关参数

stepN.result: 表示步骤N的转换结果

# Fallback与预处理条件

Fallback:

当调用接口发生异常(如超时、网络或系统异常)可配置fallback方案:

  • Stop: 终止请求并立即返回
  • Continue: 继续后续的操作,且要设置默认的fallback json

预处理: 根据条件判断是否要调用接口,脚本返回true时才调用接口

# 配置步骤结果处理

  • 支持对步骤里调用的每一个接口的返回结果做数据转换,如果配置数据转换规则原样返回并存储到上下文里供后续使用

  • 支持对步骤里调用的一个或多个接口的返回结果做处理,并把处理完的结果存储到上下文里供后续使用,不配置则不处理

# 配置输出

配置返回给调用方的结果

  • 支持配置响应头
  • 支持配置响应体
  • 支持自定脚本处理复杂的业务逻辑

# 脚本

目前支持以下脚本语言:

Javascript (推荐) - ECMAScript 5标准

JS脚本只支持单函数,且函数名不可变,在创建脚本时系统会自动生成初始模板,模板里包含相关使用说明

Groovy

# common.js 提供了操作context上下文的便捷操作函数

/**
+
  • 支持单值引用,如:string,int等
  • 支持对象类型的引用

input: 表示调用方的输入数据,如H5页面提交上来的参数

stepN.requestN: 表示步骤N里调用接口N的相关参数

stepN.result: 表示步骤N的转换结果

# Fallback与预处理条件

Fallback:

当调用接口发生异常(如超时、网络或系统异常)可配置fallback方案:

  • Stop: 终止请求并立即返回
  • Continue: 继续后续的操作,且要设置默认的fallback json

预处理: 根据条件判断是否要调用接口,脚本返回true时才调用接口

# 配置步骤结果处理

  • 支持对步骤里调用的每一个接口的返回结果做数据转换,如果配置数据转换规则原样返回并存储到上下文里供后续使用

  • 支持对步骤里调用的一个或多个接口的返回结果做处理,并把处理完的结果存储到上下文里供后续使用,不配置则不处理

# 配置输出

配置返回给调用方的结果

  • 支持配置响应头
  • 支持配置响应体
  • 支持自定脚本处理复杂的业务逻辑

# 脚本

目前支持以下脚本语言:

Javascript (推荐) - ECMAScript 5标准

JS脚本只支持单函数,且函数名不可变,在创建脚本时系统会自动生成初始模板,模板里包含相关使用说明

Groovy

# common.js 提供了操作context上下文的便捷操作函数

/**
  * context 上下文便捷操作函数
  *
  */
@@ -292,15 +292,15 @@ step1.result.eee
   }
 };
 
-

# 异常处理

当要在脚本里中止请求时可以通过以下方式来实现

返回一个对象且这个对象包含一个_stopAndResponse等于true的属性,Fizz会终止后续的操作并把这个对象返回给调用方。

# 配置路由

至此服务编排的接口配置完成,但此时还不能通过网关访问接口,需要到网关管理-路由管理里配置路由

# 在线测试

  • 支持在线实时测试
  • 支持测试接口和正式接口隔离
  • 支持返回上下文,可以查看整个执行过程中各个步骤及请求的输入与输出
  • 支持保存历史测试记录

支持调试模式,在测试接口和正式接口均可使用,修改后重新发布可实时生效,在调试模式下会打印请求日志及报文,主要用于排查线上问题

# 导入导出

导入导出主要用于在各个环境间同步接口配置,在开发环境配置好后导到测试环境中测试,测试完后导到生产环境进行发布

# 发布|下线和审核

目前发布|下线申请有以上两个入口。

  • 批量发布:对发布单里的接口进行批量发布
  • 批量回滚:对发布单里的接口进行批量回滚
  • 发布:实时发布到网关
  • 回滚:支持回滚到历史任何一个版本,可在发布历史里指定一个版本进行回滚
  • 下线:从网关删除接口,在后台可以通过发布功能再次上线

# 发布流程说明

申请发布、审核、发布和下线功能的权限可根据需要灵活分配给不同角色,如:开发人员只能申请发布,上级领导审核,运维或测试人员执行发布、回滚或下线。在开发、测试和预生产环境为了方便开发人员调试也可把申请发布、审核、发布和下线功能都分配给开发人员。

上次更新: 2020-11-9 9:59

# 异常处理

当要在脚本里中止请求时可以通过以下方式来实现

返回一个对象且这个对象包含一个_stopAndResponse等于true的属性,Fizz会终止后续的操作并把这个对象返回给调用方。

# 配置路由

至此服务编排的接口配置完成,但此时还不能通过网关访问接口,需要到网关管理-路由管理里配置路由

# 在线测试

  • 支持在线实时测试
  • 支持测试接口和正式接口隔离
  • 支持返回上下文,可以查看整个执行过程中各个步骤及请求的输入与输出
  • 支持保存历史测试记录

支持调试模式,在测试接口和正式接口均可使用,修改后重新发布可实时生效,在调试模式下会打印请求日志及报文,主要用于排查线上问题

# 导入导出

导入导出主要用于在各个环境间同步接口配置,在开发环境配置好后导到测试环境中测试,测试完后导到生产环境进行发布

# 发布|下线和审核

目前发布|下线申请有以上两个入口。

  • 批量发布:对发布单里的接口进行批量发布
  • 批量回滚:对发布单里的接口进行批量回滚
  • 发布:实时发布到网关
  • 回滚:支持回滚到历史任何一个版本,可在发布历史里指定一个版本进行回滚
  • 下线:从网关删除接口,在后台可以通过发布功能再次上线

# 发布流程说明

申请发布、审核、发布和下线功能的权限可根据需要灵活分配给不同角色,如:开发人员只能申请发布,上级领导审核,运维或测试人员执行发布、回滚或下线。在开发、测试和预生产环境为了方便开发人员调试也可把申请发布、审核、发布和下线功能都分配给开发人员。

上次更新: 2020-11-9 11:50
- + diff --git a/docs/guide/aggregate/index.html b/docs/guide/aggregate/index.html index 5a19b7d..0ee3638 100644 --- a/docs/guide/aggregate/index.html +++ b/docs/guide/aggregate/index.html @@ -7,31 +7,31 @@ - - + + -

# 什么是服务编排

服务编排主要基于现有的业务微服务使用在线配置的方式快速的生成一个聚合接口。

特点: 在线API设计、在线测试、快速开发

# 举例说明

订单详情页面需要展示订单信息、商品信息和用户信息。可通过配置的方式生成一个接口先后调用底层微服务的订单详情接口、商品信息接口和用户信息接口,再从这3个接口的返回结果里提取需要的字段返回给前端页面。

# 服务编排架构

# 适用场景

# 前端

1、一个页面调用多个接口时,可以编排好返回聚合结果,提高页面数据的加载速度

2、移动设备计算能力有限,可以把数据计算或业务处理逻辑放到服务端完成,加快页面响应

# 后端

1、替换应用层的聚合接口,减少应用层的胶水代码

2、快速生成透传数据类型的接口

3、数据转换和映射

上次更新: 2020-9-9 17:26
- + diff --git a/docs/guide/aggregate/overview.html b/docs/guide/aggregate/overview.html index baaa7aa..a9d9a0f 100644 --- a/docs/guide/aggregate/overview.html +++ b/docs/guide/aggregate/overview.html @@ -7,31 +7,31 @@ - - + + -

1.创建服务

此服务是一个分组的概念,可以包含多个聚合接口,类似于微服务体系里的服务

2.创建服务编排接口

3.开通网关白名单和配置访问策略和插件

4.测试服务编排接口

5.发布接口

界面总览

上次更新: 2020-9-9 17:26
- + diff --git a/docs/guide/benchmark/index.html b/docs/guide/benchmark/index.html index 734be6a..c8edd58 100644 --- a/docs/guide/benchmark/index.html +++ b/docs/guide/benchmark/index.html @@ -7,34 +7,34 @@ - - + + -

# 基准测试结果

我们将Fizz与Spring官方spring-cloud-gateway进行比较,使用相同的环境和条件,测试对象均为单个节点。

产品 QPS 90% Latency(ms)
直接访问后端服务 9087.46 10.76
fizz-gateway 5927.13 19.86
spring-cloud-gateway 5044.04 22.91

# 基准测试详情

# 硬件环境

后端服务所在服务器:

4核8G内存

Intel(R) Xeon(R) CPU X5675 @ 3.07GHz * 4

Linux version 3.10.0-327.el7.x86_64

节点所在服务器:

4核8G内存

Intel(R) Xeon(R) CPU X5675 @ 3.07GHz * 4

Linux version 3.10.0-327.el7.x86_64

压测程序所在服务器:

4核8G内存

Intel(R) Xeon(R) CPU X5675 @ 3.07GHz * 4

Linux version 3.10.0-327.el7.x86_64

# 压测工具

压测软件:wrk

并发连接: 100

# 压测结果截图

  • 直接访问后端服务: -

  • fizz-gateway: -

  • spring-cloud-gateway: -

上次更新: 2020-9-9 17:26
- + diff --git a/docs/guide/index.html b/docs/guide/index.html index f62ef0c..ac45d19 100644 --- a/docs/guide/index.html +++ b/docs/guide/index.html @@ -7,23 +7,23 @@ - - + + - - +
上次更新: 2020-7-31 17:12
+ diff --git a/docs/guide/installation/index.html b/docs/guide/installation/index.html index a56b7eb..7dad870 100644 --- a/docs/guide/installation/index.html +++ b/docs/guide/installation/index.html @@ -7,23 +7,23 @@ - - + + -

# 安装依赖

安装以下依赖软件:

  • Redis 2.8或以上版本
  • MySQL 5.7或以上版本
  • Apollo配置中心 (可选)
  • Eureka服务注册中心

# 安装MySQL

  • 操作系统 CentOS 6.5
  • MySQL 5.7.30
  1. 下载MySQL
wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.30-1.el6.x86_64.rpm-bundle.tar
+        

# 安装依赖

安装以下依赖软件:

  • Redis 2.8或以上版本
  • MySQL 5.7或以上版本
  • Apollo配置中心 (可选)
  • Eureka服务注册中心

# 安装MySQL

  • 操作系统 CentOS 6.5
  • MySQL 5.7.30
  1. 下载MySQL
wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.30-1.el6.x86_64.rpm-bundle.tar
 
  1. 解压
tar -xvf mysql-5.7.30-1.el6.x86_64.rpm-bundle.tar
 
  1. 安装
sudo yum install mysql-community-{server,client,common,libs}-*
 
  1. 启动
sudo service mysqld start
@@ -94,13 +94,13 @@ export JAVA_HOME JRE_HOME PATH CLASSPATH
 # 注:http://127.0.0.1:8000 为管理后台(fizz-manager-professional)的访问地址
 

访问地址

【资源部署服务器IP + 端口号】如:http://127.0.0.1:9000/

(端口号与nginx配置端口号一致)

# fizz-gateway-community社区版

说明:如果使用apollo配置中心,可把application.yml文件内容迁到配置中心(apollo上应用名为:fizz-gateway);使用不使用apollo可去掉下面启动命令里的apollo参数。

脚本启动:

  1. 下载fizz-gateway-community的最新代码,修改application.yml配置文件里eureka、redis的配置,使用maven构建好并把构建好的fizz-gateway-community-1.0.0.jar和boot.sh放同一目录
  2. 修改boot.sh脚本的apollo连接,JVM内存配置,
  3. 执行 ./boot.sh start 命令启动服务,支持 start/stop/restart/status命令

IDE启动:

  1. 本地clone仓库上的最新代码
  2. 将项目fizz-gateway导入IDE
  3. 导入完成后设置项目启动配置及修改application.yml配置文件里eureka、redis的配置,在VM选项中加入-Denv=dev -Dapollo.meta=http://localhost:66(Apollo配置中心地址)

jar启动:

  1. 本地clone仓库上的最新代码,修改application.yml配置文件里eureka、redis的配置
  2. 在项目根目录fizz-gateway-community下执行Maven命令mvn clean package -DskipTests=true打包
  3. 进入target目录,使用命令java -jar -Denv=DEV -Dapollo.meta=http://localhost:66 fizz-gateway-community-1.0.0.jar启动服务

网关访问地址格式:

http://127.0.0.1:8600/proxy/[服务名]/[API Path]

上次更新: 2020-10-27 14:46
- + diff --git a/docs/guide/intro/index.html b/docs/guide/intro/index.html index dd09ac3..8013d9d 100644 --- a/docs/guide/intro/index.html +++ b/docs/guide/intro/index.html @@ -7,27 +7,27 @@ - - + + -

# 什么是Fizz网关

A Managerment API Gateway in Java . Fizz Gateway 是一个基于 Java开发的微服务网关,能够实现热服务编排、自动授权选择、线上服务脚本编码、在线测试、高性能路由、API审核管理等目的,拥有强大的自定义插件系统可以自行扩展,并且提供友好的图形化配置界面,能够快速帮助企业进行API服务治理、减少中间层胶水代码以及降低编码投入、提高 API 服务的稳定性和安全性。

# Fizz的设计

# 产品特性

  • 集群管理:Fizz网关节点是无状态的,配置信息自动同步,支持节点水平拓展和多集群部署。
  • 服务编排:支持热服务编排能力,支持前后端编码,随时随地更新API。
  • 负载均衡:支持round-robin负载均衡。
  • 服务发现:支持从Eureka注册中心发现后端服务器。
  • 配置中心:支持接入apollo配置中心。
  • HTTP反向代理:隐藏真实后端服务,支持 Rest API反向代理。
  • 访问策略:支持不同策略访问不同的API、配置不同的鉴权等。
  • IP黑白名单:支持配置IP黑白名单。
  • 自定义插件:强大的插件机制支持自由扩展。
  • 可扩展:简单易用的插件机制方便扩展功能。
  • 高性能:性能在众多网关之中表现优异。
  • 版本控制:支持操作的发布和多次回滚。
  • 管理后台:通过管理后台界面对网关集群进行各项配置。
上次更新: 2020-9-9 17:26
- + diff --git a/docs/guide/manager/manager_aggregate.html b/docs/guide/manager/manager_aggregate.html index 469a9b4..2b3b80f 100644 --- a/docs/guide/manager/manager_aggregate.html +++ b/docs/guide/manager/manager_aggregate.html @@ -7,23 +7,23 @@ - - + + -

# 概述

接口列表功能用于维护聚合接口,聚合接口从外部调用方角度看是一个简单的接口,通过入参请求获取响应结果,内部实现会调用多个底层后端服务,将多个调用结果聚合转换成外部调用方想要的数据格式,更多详情请查看服务编排介绍,下面介绍接口列表功能的操作。

# 接口列表

菜单位置:服务编排 > 接口列表。点击菜单后进入接口列表页面,如图所示。

manager_aggregate_list_query

# 新增接口

点击 新增 按钮弹出新增窗口,如图所示。

manager_aggregate_add_1

# 基础信息

manager_aggregate_add_2

所属服务:接口所属服务,更多详情请查看服务管理功能介绍,必选;

接口名:接口名称,用于展示使用,长度不能超过200个字符,必填;

方法:接口请求方法类型,可选GET|POST,必选;

路径:接口请求路径后缀,长度不能超过2000个字符,必填;

开发人员:接口对应负责的开发人员,长度不能超过200个字符;

描述:接口功能描述,长度不能超过2000个字符;

举个例子,所属服务设置my-test-service,方法设置POST,路径设置test-aggregate-post,对应的聚合接口请求为 POST http://{Fizz网关ip地址}:{port端口}/proxy/my-test-service/test-aggregate-post。

# 配置输入

聚合接口的入参大部分是通过JSON Schema来定义的,下面先简单地介绍下JSON Schema。

# JSON Schema介绍

JSON Schema实际上也是JSON数据,用于标注和验证JSON文档,可以类比于XML Schema,当前最新版本2019-09。

作为普通用户,我们并不需要去了解JSON Schema的规范内容,只要能够构建JSON Schema即可。

要理解JSON Schema,首先要理解什么是JSON。JSON是JavaScript Object Notation的缩写,一种简单的数据交换格式。最初JSON是基于JavaScript,广泛的应用于万维网。由于其简洁和清晰的层次结构、易于人阅读等特性,使得越来越多的场景下被采用。

JSON包含以下数据结构:

  • object:
    { "key1": "value1", "key2": "value2" }
    +        

    # 概述

    接口列表功能用于维护聚合接口,聚合接口从外部调用方角度看是一个简单的接口,通过入参请求获取响应结果,内部实现会调用多个底层后端服务,将多个调用结果聚合转换成外部调用方想要的数据格式,更多详情请查看服务编排介绍,下面介绍接口列表功能的操作。

    # 接口列表

    菜单位置:服务编排 > 接口列表。点击菜单后进入接口列表页面,如图所示。

    manager_aggregate_list_query

    # 新增接口

    点击 新增 按钮弹出新增窗口,如图所示。

    manager_aggregate_add_1

    # 基础信息

    manager_aggregate_add_2

    所属服务:接口所属服务,更多详情请查看服务管理功能介绍,必选;

    接口名:接口名称,用于展示使用,长度不能超过200个字符,必填;

    方法:接口请求方法类型,可选GET|POST,必选;

    路径:接口请求路径后缀,长度不能超过2000个字符,必填;

    开发人员:接口对应负责的开发人员,长度不能超过200个字符;

    描述:接口功能描述,长度不能超过2000个字符;

    举个例子,所属服务设置my-test-service,方法设置POST,路径设置test-aggregate-post,对应的聚合接口请求为 POST http://{Fizz网关ip地址}:{port端口}/proxy/my-test-service/test-aggregate-post。

    # 配置输入

    聚合接口的入参大部分是通过JSON Schema来定义的,下面先简单地介绍下JSON Schema。

    # JSON Schema介绍

    JSON Schema实际上也是JSON数据,用于标注和验证JSON文档,可以类比于XML Schema,当前最新版本2019-09。

    作为普通用户,我们并不需要去了解JSON Schema的规范内容,只要能够构建JSON Schema即可。

    要理解JSON Schema,首先要理解什么是JSON。JSON是JavaScript Object Notation的缩写,一种简单的数据交换格式。最初JSON是基于JavaScript,广泛的应用于万维网。由于其简洁和清晰的层次结构、易于人阅读等特性,使得越来越多的场景下被采用。

    JSON包含以下数据结构:

    • object:
      { "key1": "value1", "key2": "value2" }
       
    • array:
      [ "first", "second", "third" ]
       
    • number:
      42
       3.1415926
      @@ -64,7 +64,7 @@
           }
         }
       }
      -

      用以上JSON Schema验证第一个例子时,验证失败;但是第二个例子验证通过。

      JSON Schema本身也是通过JSON编写,其本身也是数据,不是一个计算机程序,只是一种“描述其它数据的结构”的声明格式。这既是长处,也是弱点,JSON Schema可以简洁地描述数据的结构并且自动验证数据,但是对于数据元素间的关系表达就力不能及了。

    更多JSON Schema知识可以阅读Understanding JSON Schema

    # 请求头部

    定义聚合接口的请求Header参数。

    manager_aggregate_add_3

    举个例子:

    {
    +

    用以上JSON Schema验证第一个例子时,验证失败;但是第二个例子验证通过。

    JSON Schema本身也是通过JSON编写,其本身也是数据,不是一个计算机程序,只是一种“描述其它数据的结构”的声明格式。这既是长处,也是弱点,JSON Schema可以简洁地描述数据的结构并且自动验证数据,但是对于数据元素间的关系表达就力不能及了。

更多JSON Schema知识可以阅读Understanding JSON Schema

# 请求头部

定义聚合接口的请求Header参数。

manager_aggregate_add_3

举个例子:

{
   "type": "object",
   "properties": {
     "headerParam1": {
@@ -77,7 +77,7 @@
     "headerParam1"
   ]
 }
-

以上例子定义了必传请求头参数headerParam1

title字段用于验证失败时提示使用,例如请求接口时没传请求头时会提示“请求头参数1不能为空”(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。

manager_aggregate_add_input_header_1

当定义了语言配置(详情请查看后文的语言配置介绍)选项为英文时会使用titleEn字段用于验证失败时提示使用,例如请求接口时没传请求头时会提示“headerParam1 is missing but it is required”(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。

manager_aggregate_add_input_header_2

# 请求体

定义聚合接口的请求体参数。

manager_aggregate_add_4

举个例子:

{
+

以上例子定义了必传请求头参数headerParam1

title字段用于验证失败时提示使用,例如请求接口时没传请求头时会提示“请求头参数1不能为空”(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。

manager_aggregate_add_input_header_1

当定义了语言配置(详情请查看后文的语言配置介绍)选项为英文时会使用titleEn字段用于验证失败时提示使用,例如请求接口时没传请求头时会提示“headerParam1 is missing but it is required”(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。

manager_aggregate_add_input_header_2

# 请求体

定义聚合接口的请求体参数。

manager_aggregate_add_4

举个例子:

{
   "type": "object",
   "properties": {
     "bodyParam1": {
@@ -90,7 +90,7 @@
     "bodyParam1"
   ]
 }
-

以上例子定义了必传请求体参数bodyParam1

title字段用于验证失败时提示使用,例如请求接口时没传请求体参数时会提示“请求体参数1不能为空”(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。

manager_aggregate_add_input_body_1

当定义了语言配置(详情请查看后文的语言配置介绍)选项为英文时会使用titleEn字段用于验证失败时提示使用,例如请求接口时没传请求体参数时会提示“bodyParam1 is missing but it is required”(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。

manager_aggregate_add_input_body_2

# Query参数

定义聚合接口的Query参数。

manager_aggregate_add_5

举个例子:

{
+

以上例子定义了必传请求体参数bodyParam1

title字段用于验证失败时提示使用,例如请求接口时没传请求体参数时会提示“请求体参数1不能为空”(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。

manager_aggregate_add_input_body_1

当定义了语言配置(详情请查看后文的语言配置介绍)选项为英文时会使用titleEn字段用于验证失败时提示使用,例如请求接口时没传请求体参数时会提示“bodyParam1 is missing but it is required”(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。

manager_aggregate_add_input_body_2

# Query参数

定义聚合接口的Query参数。

manager_aggregate_add_5

举个例子:

{
   "type": "object",
   "properties": {
     "queryParam1": {
@@ -103,7 +103,7 @@
     "queryParam1"
   ]
 }
-

以上例子定义了必传Query参数queryParam1

title字段用于验证失败时提示使用,例如请求接口时没传Query参数时会提示“query参数1不能为空”(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。

manager_aggregate_add_input_query_1

当定义了语言配置(详情请查看后文的语言配置介绍)选项为英文时会使用titleEn字段用于验证失败时提示使用,例如请求接口时没传Query参数时会提示“queryParam1 is missing but it is required”(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。

manager_aggregate_add_input_query_2

# 脚本校验

对于JSON Schema规范无法覆盖的校验场景可以使用脚本对入参进行更加灵活的处理。

manager_aggregate_add_6

点击 新增 按钮后弹出脚本配置窗口,如图所示。

manager_aggregate_add_7

脚本类型:可选javascript|groovy,必选;

脚本内容:所选的脚本类型语言编写的入参验证脚本,必填。

举个例子:

// javascript脚本函数名不能修改
+

以上例子定义了必传Query参数queryParam1

title字段用于验证失败时提示使用,例如请求接口时没传Query参数时会提示“query参数1不能为空”(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。

manager_aggregate_add_input_query_1

当定义了语言配置(详情请查看后文的语言配置介绍)选项为英文时会使用titleEn字段用于验证失败时提示使用,例如请求接口时没传Query参数时会提示“queryParam1 is missing but it is required”(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。

manager_aggregate_add_input_query_2

# 脚本校验

对于JSON Schema规范无法覆盖的校验场景可以使用脚本对入参进行更加灵活的处理。

manager_aggregate_add_6

点击 新增 按钮后弹出脚本配置窗口,如图所示。

manager_aggregate_add_7

脚本类型:可选javascript|groovy,必选;

脚本内容:所选的脚本类型语言编写的入参验证脚本,必填。

举个例子:

// javascript脚本函数名不能修改
 function dyFunc(paramsJsonStr) {
   // 上下文, 数据结构请参考 context.js
   var context = JSON.parse(paramsJsonStr)['context'];
@@ -129,15 +129,15 @@
   return JSON.stringify(result);
 }
 
-

以上例子使用javascript编写参数校验,限制入参headerParam1bodyParam1queryParam1必须一致,不一致将提示错误信息(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。

manager_aggregate_add_input_script

# 语言配置

聚合接口默认使用中文响应校验失败提示,通过配置可通过入参选择不同的提示语言,目前支持中文、英文提示(已满足我们的业务使用场景,有其他语言要求的小伙伴可以联系我们添加)。

manager_aggregate_add_8

字段:入参字段值,例如input.request.body.languageCode使用请求体参数languageCode的值来决定使用哪种语言;

中文:中文与入参字段值的映射关系,例如配置0,当请求入参字段值为0时使用中文提示校验结果;

英文:英文与入参字段值的映射关系,例如配置1,当请求入参字段值为1时使用中文提示校验结果。

# 配置步骤

聚合接口调用底层服务是通过多个step实现的,多个step串行执行,每个step包含多个request(对底层服务接口的调用),同个step里的多个request并行执行,后执行的step可以获取已执行step的执行结果,更多详情请查看服务编排文章的介绍,下面介绍配置步骤的使用。

manager_aggregate_add_9

是否执行完此步骤后结束:勾选后实际请求只执行完该步骤后即响应结果,不执行后续步骤,用于调试使用;

请求方法:调用底层服务接口的请求类型,可选GET|POST,必选;

默认URL:调用底层服务接口的默认URL,当Fizz网关启动环境没有配置URL时使用该默认URL;

开发环境URL:开发环境调用底层服务接口的URL,当Fizz网关启动使用spring.profiles.active=dev时使用该URL;

测试环境URL:测试环境调用底层服务接口的URL,当Fizz网关启动使用spring.profiles.active=test时使用该URL;

预生产环境URL:预生产环境调用底层服务接口的URL,当Fizz网关启动使用spring.profiles.active=pre时使用该URL;

生产环境URL:生产环境调用底层服务接口的URL,当Fizz网关启动使用spring.profiles.active=prod时使用该URL;

超时时间(毫秒):调用底层服务接口的超时时间,超时抛出异常,单位毫秒;

Fallback:可选stop|continue,控制当调用底层服务接口失败后是否继续执行后续操作;

请求预处理:勾选后可配置预处理脚本,预处理脚本返回true时才执行调用底层服务接口。

manager_aggregate_add_10

配置入参:配置调用底层服务接口的请求参数;

配置响应:配置调用底层服务接口的响应内容。

manager_aggregate_add_11

配置步骤结果:配置step执行完成后的响应内容。

# 配置输出

配置聚合接口调用完成的响应内容。在响应体、响应头配置中可以配置简单的响应固定值、响应引用值,对于需要逻辑处理得到结果的响应可以通过脚本配置灵活处理,如图所示。

manager_aggregate_add_12

manager_aggregate_add_13

# 校验结果

配置聚合接口入参校验失败后的响应内容,在响应体、响应头配置中可以配置简单的响应固定值、响应引用值,对于需要逻辑处理得到结果的响应可以通过脚本配置灵活处理,如图所示。

manager_aggregate_add_14

校验结果有一个专用的引用值validateMsg,该引用值用于存放入参验证错误提示信息。

# 保存接口

所有配置完成后点击 保存 按钮,完成聚合接口的配置。

manager_aggregate_add_15

# 导出接口

导出功能将聚合接口以配置文件的形式导出,导出的文件可通过导入功能重新导入系统,当我们的系统分多个环境时,可使用导出导入功能实现聚合接口的快速同步,下面介绍导出功能。

manager_aggregate_export_1

勾选想到导出的接口,点击 导出 按钮弹出确认窗口,如图所示。

manager_aggregate_export_2

点击 确定 按钮,浏览器保存配置文件,如图所示。

manager_aggregate_export_3

# 导入接口

导入功能将配置文件中的聚合接口转化成后台的持久化存储,导入的文件可以通过导出功能获取或者通过编写好的聚合配置JSON文件转化得到(转换工具可以联系我们获取)。当我们的系统分多个环境时,可使用导出导入功能实现聚合接口的快速同步,下面介绍导出功能。

manager_aggregate_import_1

点击 导入 按钮弹出导入配置窗口,如图所示。

manager_aggregate_import_2

点击 选取文件 按钮后选取要导入的配置文件;

强制覆盖:通过请求类型(GET|POST)、请求路径(/proxy/{service}/{apiPath})可以唯一确定一个聚合接口,当聚合接口已存在时,未勾选该选项时忽略该聚合接口导入,勾选该选项时覆盖已存在的聚合接口配置;

点击 确定 按钮后导入聚合接口配置。

# 调试模式

调试模式用于对接口开发过程中的调试使用,当打开调试模式后,Fizz网关会将聚合接口调用底层服务接口的请求响应信息以及耗时、聚合结果、步骤上下文打印到日志中,通过日志可以清楚的了解聚合接口的实际执行情况。调试模式会对网关性能造成影响,因此不建议在生产环境打开调试模式,当调试完成后及时关闭调试模式,避免打印过多日志造成资源浪费,下面介绍调试模式的使用。

勾选想要打开调试模式的接口,点击 打开调试模式 按钮弹出确认窗口,如图所示。

manager_aggregate_debug_mode_1

点击 确定 按钮确认打开调试模式。

manager_aggregate_debug_mode_2

勾选想要关闭调试模式的接口,点击 关闭调试模式 按钮弹出确认窗口,如图所示。

manager_aggregate_debug_mode_3

点击 确定 按钮确认关闭调试模式。

manager_aggregate_debug_mode_4

# 编辑接口

点击 编辑 按钮弹出编辑窗口,如图所示。

manager_aggregate_edit_1

manager_aggregate_edit_2

# 删除接口

点击 删除 按钮弹出删除确认窗口,如图所示。

manager_aggregate_delete_1

manager_aggregate_delete_2

点击 确定 按钮后删除接口,处于已发布状态的接口无法删除,需要下线后才能操作删除。

# 发布|下线申请

发布|下线申请用于聚合接口的发布或者下线申请,只有通过审核人审核后申请人才能执行发布|下线操作,避免误操作‘,保证接口的安全。

点击 发布|下线申请 按钮,弹出发布|下线申请窗口,如图所示。

manager_aggregate_apply_1

manager_aggregate_apply_2

点击 添加 按钮后,弹出接口列表,勾选需要操作的接口,点击 确定 添加进申请中。

manager_aggregate_apply_3

标题:申请的标题,长度不能超过200个字符,必填;

类型:申请类型,可选发布|下线,必选;

申请原因:申请的原因,长度不能超过2000个字符;

选择审核人:选择有审核权限的人对申请进行审核,列表根据需要操作的接口动态变化(未添加接口时列表为空,拥有服务权限并且有待审核菜单权限的人、操作管理员角色的人为可选审核人),必选;

点击 确定 按钮后提交申请,选择的审核人会收到申请审核邮件(审核人邮箱地址通过用户管理设置,更多详情请查看用户管理功能介绍),如图所示。

manager_aggregate_apply_4

# 接口测试

后台提供了可视化的接口调用界面,聚合接口创建完成后可通过该界面对接口进行调用测试。通过点击接口详情页面的 测试 按钮打开接口测试页面,如图所示。

manager_aggregate_test_1

跳转页面的同时后台会将接口当前的最新配置推送给Fizz网关生成一个测试接口,请求路径为/proxytest/{service}/{apiPath}。

manager_aggregate_test_2

点击 发送 按钮向指定接口发送一次请求,Response响应结果区域显示调用接口结果,如图所示。

manager_aggregate_test_3

manager_aggregate_test_4

请求体tab用于配置请求的请求体参数。

manager_aggregate_test_5

请求头tab用于配置请求的请求头参数。

manager_aggregate_test_6

Query参数用于配置请求的Query参数。

manager_aggregate_test_7

返回Context:Fizz网关中一次聚合接口的请求过程中内部会持有一个Context对象,该对象保存了本次请求过程的入参信息、底层服务接口调用信息、响应信息,通过勾选该选项,接口会将Context随接口响应一起返回,通过查看Context可以清楚地了解接口的实际调用过程。

未勾选 返回Context 选项时,接口按配置输出的设置响应结果,如图所示。

manager_aggregate_test_8

勾选 返回Context 选项后,接口会将Context随接口响应一起返回,如图所示。

manager_aggregate_test_9

测试接口:调用测试接口,请求路径为/proxytest/{service}/{apiPath};

正式接口:调用正式接口,请求路径为/proxy/{service}/{apiPath};

manager_aggregate_test_10

点击 保存 按钮会将本次测试请求数据保存下来,通过选取已保存的测试记录可以快速恢复请求数据,如图所示。

manager_aggregate_test_11

标题:本次测试数据保存时使用的标题,长度不能超过2000个字符,保存后在历史测试记录列表显示,如图所示。

manager_aggregate_test_12

上次更新: 2020-10-26 18:40

以上例子使用javascript编写参数校验,限制入参headerParam1bodyParam1queryParam1必须一致,不一致将提示错误信息(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。

manager_aggregate_add_input_script

# 语言配置

聚合接口默认使用中文响应校验失败提示,通过配置可通过入参选择不同的提示语言,目前支持中文、英文提示(已满足我们的业务使用场景,有其他语言要求的小伙伴可以联系我们添加)。

manager_aggregate_add_8

字段:入参字段值,例如input.request.body.languageCode使用请求体参数languageCode的值来决定使用哪种语言;

中文:中文与入参字段值的映射关系,例如配置0,当请求入参字段值为0时使用中文提示校验结果;

英文:英文与入参字段值的映射关系,例如配置1,当请求入参字段值为1时使用中文提示校验结果。

# 配置步骤

聚合接口调用底层服务是通过多个step实现的,多个step串行执行,每个step包含多个request(对底层服务接口的调用),同个step里的多个request并行执行,后执行的step可以获取已执行step的执行结果,更多详情请查看服务编排文章的介绍,下面介绍配置步骤的使用。

manager_aggregate_add_9

是否执行完此步骤后结束:勾选后实际请求只执行完该步骤后即响应结果,不执行后续步骤,用于调试使用;

请求方法:调用底层服务接口的请求类型,可选GET|POST,必选;

默认URL:调用底层服务接口的默认URL,当Fizz网关启动环境没有配置URL时使用该默认URL;

开发环境URL:开发环境调用底层服务接口的URL,当Fizz网关启动使用spring.profiles.active=dev时使用该URL;

测试环境URL:测试环境调用底层服务接口的URL,当Fizz网关启动使用spring.profiles.active=test时使用该URL;

预生产环境URL:预生产环境调用底层服务接口的URL,当Fizz网关启动使用spring.profiles.active=pre时使用该URL;

生产环境URL:生产环境调用底层服务接口的URL,当Fizz网关启动使用spring.profiles.active=prod时使用该URL;

超时时间(毫秒):调用底层服务接口的超时时间,超时抛出异常,单位毫秒;

Fallback:可选stop|continue,控制当调用底层服务接口失败后是否继续执行后续操作;

请求预处理:勾选后可配置预处理脚本,预处理脚本返回true时才执行调用底层服务接口。

manager_aggregate_add_10

配置入参:配置调用底层服务接口的请求参数;

配置响应:配置调用底层服务接口的响应内容。

manager_aggregate_add_11

配置步骤结果:配置step执行完成后的响应内容。

# 配置输出

配置聚合接口调用完成的响应内容。在响应体、响应头配置中可以配置简单的响应固定值、响应引用值,对于需要逻辑处理得到结果的响应可以通过脚本配置灵活处理,如图所示。

manager_aggregate_add_12

manager_aggregate_add_13

# 校验结果

配置聚合接口入参校验失败后的响应内容,在响应体、响应头配置中可以配置简单的响应固定值、响应引用值,对于需要逻辑处理得到结果的响应可以通过脚本配置灵活处理,如图所示。

manager_aggregate_add_14

校验结果有一个专用的引用值validateMsg,该引用值用于存放入参验证错误提示信息。

# 保存接口

所有配置完成后点击 保存 按钮,完成聚合接口的配置。

manager_aggregate_add_15

# 导出接口

导出功能将聚合接口以配置文件的形式导出,导出的文件可通过导入功能重新导入系统,当我们的系统分多个环境时,可使用导出导入功能实现聚合接口的快速同步,下面介绍导出功能。

manager_aggregate_export_1

勾选想到导出的接口,点击 导出 按钮弹出确认窗口,如图所示。

manager_aggregate_export_2

点击 确定 按钮,浏览器保存配置文件,如图所示。

manager_aggregate_export_3

# 导入接口

导入功能将配置文件中的聚合接口转化成后台的持久化存储,导入的文件可以通过导出功能获取或者通过编写好的聚合配置JSON文件转化得到(转换工具可以联系我们获取)。当我们的系统分多个环境时,可使用导出导入功能实现聚合接口的快速同步,下面介绍导出功能。

manager_aggregate_import_1

点击 导入 按钮弹出导入配置窗口,如图所示。

manager_aggregate_import_2

点击 选取文件 按钮后选取要导入的配置文件;

强制覆盖:通过请求类型(GET|POST)、请求路径(/proxy/{service}/{apiPath})可以唯一确定一个聚合接口,当聚合接口已存在时,未勾选该选项时忽略该聚合接口导入,勾选该选项时覆盖已存在的聚合接口配置;

点击 确定 按钮后导入聚合接口配置。

# 调试模式

调试模式用于对接口开发过程中的调试使用,当打开调试模式后,Fizz网关会将聚合接口调用底层服务接口的请求响应信息以及耗时、聚合结果、步骤上下文打印到日志中,通过日志可以清楚的了解聚合接口的实际执行情况。调试模式会对网关性能造成影响,因此不建议在生产环境打开调试模式,当调试完成后及时关闭调试模式,避免打印过多日志造成资源浪费,下面介绍调试模式的使用。

勾选想要打开调试模式的接口,点击 打开调试模式 按钮弹出确认窗口,如图所示。

manager_aggregate_debug_mode_1

点击 确定 按钮确认打开调试模式。

manager_aggregate_debug_mode_2

勾选想要关闭调试模式的接口,点击 关闭调试模式 按钮弹出确认窗口,如图所示。

manager_aggregate_debug_mode_3

点击 确定 按钮确认关闭调试模式。

manager_aggregate_debug_mode_4

# 编辑接口

点击 编辑 按钮弹出编辑窗口,如图所示。

manager_aggregate_edit_1

manager_aggregate_edit_2

# 删除接口

点击 删除 按钮弹出删除确认窗口,如图所示。

manager_aggregate_delete_1

manager_aggregate_delete_2

点击 确定 按钮后删除接口,处于已发布状态的接口无法删除,需要下线后才能操作删除。

# 发布|下线申请

发布|下线申请用于聚合接口的发布或者下线申请,只有通过审核人审核后申请人才能执行发布|下线操作,避免误操作‘,保证接口的安全。

点击 发布|下线申请 按钮,弹出发布|下线申请窗口,如图所示。

manager_aggregate_apply_1

manager_aggregate_apply_2

点击 添加 按钮后,弹出接口列表,勾选需要操作的接口,点击 确定 添加进申请中。

manager_aggregate_apply_3

标题:申请的标题,长度不能超过200个字符,必填;

类型:申请类型,可选发布|下线,必选;

申请原因:申请的原因,长度不能超过2000个字符;

选择审核人:选择有审核权限的人对申请进行审核,列表根据需要操作的接口动态变化(未添加接口时列表为空,拥有服务权限并且有待审核菜单权限的人、操作管理员角色的人为可选审核人),必选;

点击 确定 按钮后提交申请,选择的审核人会收到申请审核邮件(审核人邮箱地址通过用户管理设置,更多详情请查看用户管理功能介绍),如图所示。

manager_aggregate_apply_4

# 接口测试

后台提供了可视化的接口调用界面,聚合接口创建完成后可通过该界面对接口进行调用测试。通过点击接口详情页面的 测试 按钮打开接口测试页面,如图所示。

manager_aggregate_test_1

跳转页面的同时后台会将接口当前的最新配置推送给Fizz网关生成一个测试接口,请求路径为/proxytest/{service}/{apiPath}。

manager_aggregate_test_2

点击 发送 按钮向指定接口发送一次请求,Response响应结果区域显示调用接口结果,如图所示。

manager_aggregate_test_3

manager_aggregate_test_4

请求体tab用于配置请求的请求体参数。

manager_aggregate_test_5

请求头tab用于配置请求的请求头参数。

manager_aggregate_test_6

Query参数用于配置请求的Query参数。

manager_aggregate_test_7

返回Context:Fizz网关中一次聚合接口的请求过程中内部会持有一个Context对象,该对象保存了本次请求过程的入参信息、底层服务接口调用信息、响应信息,通过勾选该选项,接口会将Context随接口响应一起返回,通过查看Context可以清楚地了解接口的实际调用过程。

未勾选 返回Context 选项时,接口按配置输出的设置响应结果,如图所示。

manager_aggregate_test_8

勾选 返回Context 选项后,接口会将Context随接口响应一起返回,如图所示。

manager_aggregate_test_9

测试接口:调用测试接口,请求路径为/proxytest/{service}/{apiPath};

正式接口:调用正式接口,请求路径为/proxy/{service}/{apiPath};

manager_aggregate_test_10

点击 保存 按钮会将本次测试请求数据保存下来,通过选取已保存的测试记录可以快速恢复请求数据,如图所示。

manager_aggregate_test_11

标题:本次测试数据保存时使用的标题,长度不能超过2000个字符,保存后在历史测试记录列表显示,如图所示。

manager_aggregate_test_12

上次更新: 2020-11-9 11:50
- + diff --git a/docs/guide/manager/manager_aggregate_approve.html b/docs/guide/manager/manager_aggregate_approve.html index 55150af..a3e9c89 100644 --- a/docs/guide/manager/manager_aggregate_approve.html +++ b/docs/guide/manager/manager_aggregate_approve.html @@ -7,31 +7,31 @@ - - + + -

# 概述

聚合接口的发布|下线操作需要提交发布|下线申请,审核通过后申请人才能执行发布|下线操作。待审核功能用于审核发布|下线申请,下面介绍待审核功能。

# 审核列表

菜单位置:发布申请 > 待审核。点击菜单后进入审核列表页面,如图所示。

manager_aggregate_approve_list_query

# 审核操作

点击 查看 按钮可以查看发布|下线申请详情,详情页中可执行审核操作。

申请列表页提供快速审核操作,点击 审核 按钮后弹出审核确认窗口,如图所示。

manager_aggregate_approve_op_1

manager_aggregate_approve_op_2

审核结果:勾选通过,审核后申请能可执行申请的操作;勾选不通过,审核后申请失败,申请人不能执行申请的操作。

审核后申请人会收到审核结果邮件通知,如下图是审核通过的邮件通知。

manager_aggregate_approve_op_3

上次更新: 2020-10-26 18:40
- + diff --git a/docs/guide/manager/manager_aggregate_approve_op_log.html b/docs/guide/manager/manager_aggregate_approve_op_log.html index 28c05e6..7afd272 100644 --- a/docs/guide/manager/manager_aggregate_approve_op_log.html +++ b/docs/guide/manager/manager_aggregate_approve_op_log.html @@ -7,31 +7,31 @@ - - + + -

# 概述

管理后台记录了发布|下线申请的审核操作日志,审核日志功能提供界面查询后台记录的审核操作日志。

# 审核日志列表

菜单位置:发布申请 > 审核日志。点击菜单后进入审核日志列表页面,如图所示。

manager_aggregate_approve_op_log_list_query

# 审核日志详情

点击 查看 按钮弹出审核日志详情页面,如图所示。

manager_aggregate_approve_op_log_detail_1

manager_aggregate_approve_op_log_detail_2

上次更新: 2020-10-26 18:40
- + diff --git a/docs/guide/manager/manager_aggregate_my_apply.html b/docs/guide/manager/manager_aggregate_my_apply.html index 86e4a3c..4a40314 100644 --- a/docs/guide/manager/manager_aggregate_my_apply.html +++ b/docs/guide/manager/manager_aggregate_my_apply.html @@ -7,31 +7,31 @@ - - + + -

# 概述

聚合接口的发布|下线操作需要提交发布|下线申请,审核通过后申请人才能执行发布|下线操作。我的申请功能用于发布|下线申请过程的相关操作,下面介绍我的申请功能。

# 申请列表

菜单位置:发布申请 > 我的申请。点击菜单后进入申请列表页面,如图所示。

manager_aggregate_my_apply_list_query

# 申请撤回

对于已提交但未被审核的申请可执行撤回操作,点击 撤回 按钮弹出确认窗口,如图所示。

manager_aggregate_my_apply_revoke_1

点击 确定 按钮后确认撤回申请,如图所示。

manager_aggregate_my_apply_revoke_2

撤回后审核人会收到邮箱提醒无需再处理该申请,如图所示。

manager_aggregate_my_apply_revoke_3

撤回后可对申请重新进行编辑后再次提交,点击 编辑 按钮后弹出编辑窗口,如图所示。

manager_aggregate_my_apply_revoke_4

点击 确定 按钮后再次提交申请,如图所示。

manager_aggregate_my_apply_revoke_5

# 申请详情

点击 查看 按钮查看申请详情。

manager_aggregate_my_apply_detail_1

manager_aggregate_my_apply_detail_2

操作日志记录该申请的所有操作,包括申请提交、申请撤回、申请重新提交、审核不通过、审核通过、修改审核人、接口发布、接口下线 、接口回滚、接口撤回。

待审核状态申请可以更换审核人,点击 修改审核人 按钮后弹出修改审核人窗口,如图所示。

manager_aggregate_my_apply_detail_3

重新选择审核人后点击 确定 按钮,修改审核人完成。

修改后原审核人会收到邮件提醒无须再处理该申请。

修改后新的审核人会收到邮件提醒需要处理该申请。

审核通过后可以对接口进行发布操作,如图所示。

manager_aggregate_my_apply_detail_4

批量发布:对申请内的接口批量发布推送到Fizz网关。

批量回滚:对申请内的接口批量回滚到上一个版本,当发布后接口异常时该操作相当有用。

对于申请通过后又无须操作的接口可以执行撤回操作,撤回接口时必须填写备注信息用于回溯查询,如图所示。

manager_aggregate_my_apply_detail_5

manager_aggregate_my_apply_detail_6

上次更新: 2020-10-26 18:40
- + diff --git a/docs/guide/manager/manager_aggregate_op_log.html b/docs/guide/manager/manager_aggregate_op_log.html index ae71e71..4e76b1d 100644 --- a/docs/guide/manager/manager_aggregate_op_log.html +++ b/docs/guide/manager/manager_aggregate_op_log.html @@ -7,31 +7,31 @@ - - + + -

# 概述

管理后台记录了聚合接口的新增、修改、发布、下线、回滚、删除操作日志,通过查看操作日志可以清楚地掌握接口的操作轨迹。操作日志功能提供界面查询聚合接口的操作日志。

# 操作日志列表

菜单位置:服务编排 > 操作日志。点击菜单后进入操作日志列表页面,如图所示。

manager_aggregate_op_log_list_query

# 查看日志详情

点击 查看 按钮弹出操作日志详情页面,如图所示。

manager_aggregate_op_log_detail_1

manager_aggregate_op_log_detail_2

上次更新: 2020-10-26 18:40
- + diff --git a/docs/guide/manager/manager_api_auth.html b/docs/guide/manager/manager_api_auth.html index c15e3dc..aa47201 100644 --- a/docs/guide/manager/manager_api_auth.html +++ b/docs/guide/manager/manager_api_auth.html @@ -7,31 +7,31 @@ - - + + -

# 概述

路由管理功能用于维护网关的路由规则,支持按请求路径转发、转发到指定后端服务两种转发规则,支持插件配置。下面介绍路由管理的操作。

# 路由列表

菜单位置:网关管理 > 路由管理。点击菜单后进入路由列表页面,如图所示。

manager_api_auth_list_query

# 新增路由

点击 新增 按钮弹出新增窗口,如图所示。

manager_api_auth_add_1

manager_api_auth_add_2

网关分组:选取路由关联的网关分组,只有属于所选分组的网关实例路由规则才会生效,必选;

服务:网关的请求路径格式为 http://{ip}:{port}/proxy/{service}{apiPath},服务对应{service}段,当 转发 选择 按请求路径转发 时服务需要是聚合配置的服务或者是Eureka注册的服务,当 转发 选择 转发到指定后端服务 时服务不需要是实际存在的服务,只用于路径匹配使用,长度不能超过50个字符,必填;

API方法:请求的method类型,可选GET|POST;

API Path:网关的请求路径格式为 http://{ip}:{port}/proxy/{service}{apiPath},API Path对应{apiPath}段,使用前缀匹配原则,例如"/api/"将匹配"/api/"、"/api/1"、"/api/1/1"等路径;

应用:选取路由关联的应用,网关使用选取应用的信息进行鉴权,更多详情请查看appID管理功能介绍;

访问:可选允许|禁止,必选;

转发:可选按请求路径转发|转发到指定后端服务,当选择 按请求路径转发 时,请求会按请求路径转发,例如网关请求 http://{ip}:{port}/proxy/my-service/api-path 将转发到 http://my-service/api-path;当选择 转发到指定后端服务 时,需要添加转发到的后端服务URL,请求会转发到配置的后端服务,例如配置了服务为 my-service,API Path为空,后端服务URL为 http://127.0.0.1:8080/forward-service/,网关请求 http://{ip}:{port}/proxy/my-service/api-path 将转发到 http://127.0.0.1:8080/forward-service/api-path。

点击 添加插件 按钮为路由添加插件,如图所示。

manager_api_auth_add_3

配置插件路由级别的自定义配置,表单界面来自于插件的表单定义,更多详情请查看插件管理功能介绍。

manager_api_auth_add_4

配置完成后点击 保存 按钮保存路由规则。

manager_api_auth_add_5

# 编辑路由

点击 编辑 按钮弹出编辑窗口,如图所示。

manager_api_auth_edit_1

manager_api_auth_edit_2

# 删除路由

点击 删除 按钮弹出删除确认窗口,如图所示。

manager_api_auth_delete_1

manager_api_auth_delete_2

上次更新: 2020-10-26 18:40
- + diff --git a/docs/guide/manager/manager_app_id.html b/docs/guide/manager/manager_app_id.html index 7c8b0d4..980c494 100644 --- a/docs/guide/manager/manager_app_id.html +++ b/docs/guide/manager/manager_app_id.html @@ -7,31 +7,31 @@ - - + + -

# 概述

appID管理功能维护应用鉴权信息,可配置是否启用签名、是否启用IP白名单,AppID级别的自定义配置供自定义插件使用。appID用于在路由管理配置中关联路由规则,当对应路由规则触发时会对应用进行鉴权。

# appID列表

菜单位置:网关管理 > appID管理。点击菜单后进入appID列表页面,如图所示。

manager_app_id_list_query

# 新增appID

点击 新增 按钮弹出新增窗口,如图所示。

manager_app_id_add_1

manager_app_id_add_2

appID:第三方应用唯一标识,长度不能超过64个字符,必填;

应用名:第三方应用名称,长度不能超过128个字符,必填;

是否启用签名:当启动时必须配置 认证方式 和 密钥;

认证方式:可选 密钥(使用网关内置鉴权方式验证)|自定义认证插件(使用自定义的鉴权逻辑),更多信息请查看Fizz网关的介绍;启用签名时必填;

密钥:第三方应用使用的密钥,可通过 生成随机密钥 按钮生成一个随机的密钥,启用签名时必填;

是否启用IP白名单:当启用时可以配置 IP白名单,网关会根据请求来源IP地址进行过滤;

IP白名单:IP段支持 1.2.3.100-120 和 1.2.3.*两种格式,仅最后一段可用范围或星号表示;

自定义配置:AppID级别的自定义配置供自定义插件使用,所有插件均可获取到此配置信息。

# 编辑appID

点击 编辑 按钮弹出编辑窗口,如图所示。

manager_app_id_edit_1

manager_app_id_edit_2

# 删除appID

点击 删除 按钮弹出删除确认窗口,如图所示。

manager_app_id_delete_1

manager_app_id_delete_2

点击 确定 按钮后删除appID,如果appID存在关联的路由配置时,对应关联的路由配置也会一起删除。

上次更新: 2020-10-26 18:40
- + diff --git a/docs/guide/manager/manager_gateway_aggregate_cache.html b/docs/guide/manager/manager_gateway_aggregate_cache.html index 604eddc..3c95485 100644 --- a/docs/guide/manager/manager_gateway_aggregate_cache.html +++ b/docs/guide/manager/manager_gateway_aggregate_cache.html @@ -7,31 +7,31 @@ - - + + -

# 概述

网关缓存功能用于查询Fizz网关实例本地缓存的已发布接口信息,可以快速的了解当前网关实例生效的全部接口,同时通过查看后台接口发布版本号与网关实例本地缓存的接口版本号是否一致可以排查接口缓存问题,下面介绍网关缓存功能的操作。

# 网关列表

菜单位置:服务编排 > 网关缓存。点击菜单后进入网关列表页面,如图所示。

manager_aggregate_gateway_list_query

Fizz网关与后台注册到同一个eureka注册中心,后台通过eureka获取网关的实例列表。

# 网关缓存列表

点击 查看 按钮后弹出网关详情页面,该页面显示所选网关实例的接口缓存列表,如图所示。

manager_aggregate_gateway_cache_list_query_1

manager_aggregate_gateway_cache_list_query_2

# 网关缓存详情

点击 查看 按钮弹出所选接口的配置详情,如图所示。

manager_aggregate_gateway_cache_detail_1

manager_aggregate_gateway_cache_detail_2

上次更新: 2020-10-26 18:40
- + diff --git a/docs/guide/manager/manager_gateway_group.html b/docs/guide/manager/manager_gateway_group.html index 1c341a4..0e2bfa4 100644 --- a/docs/guide/manager/manager_gateway_group.html +++ b/docs/guide/manager/manager_gateway_group.html @@ -7,31 +7,31 @@ - - + + -

# 概述

网关分组功能用于维护分组元数据,将网关实例IP与分组关联,通过为不同的分组配置不同的路由策略,从而实现网关的分组管理。

# 分组示例

我们的线上业务涉及To C(个人用户)、To B(企业)、To T(第三方),对于不同业务会有对应的机器接受请求访问,不同的业务需要有各自的路由策略,因此进行了如下的分组划分。

分组ID 分组名称 描述
default 默认分组 默认分组是后台默认创建的分组,不用指定IP,不属于其它分组的机器都归到默认分组,默认分组不可修改或删除
c 2c分组 只接受面向个人用户的请求
b 2b分组 只接受面向企业的请求
t 面向第三方的分组 只接受面向第三方的请求

下面介绍网关分组功能的操作。

# 分组列表

菜单位置:网关管理 > 网关分组。点击菜单后进入分组列表页面,如图所示。

manager_gateway_group_list_query

# 新增分组

点击 新增 按钮弹出新增窗口,如图所示。

manager_gateway_group_add_1

manager_gateway_group_add_2

分组ID:分组的唯一标识,长度不能超过32个字符,必填;

分组名称:分组的名称,用于在分组选项时展示,长度不能超过32个字符,必填;

网关实例IP:Fizz网关集群内的机器IP地址,多个IP地址使用逗号分隔。

# 编辑分组

点击 编辑 按钮弹出编辑窗口,如图所示。

manager_gateway_group_edit_1

manager_gateway_group_edit_2

# 删除分组

点击 删除 按钮弹出删除确认窗口,如图所示。

manager_gateway_group_delete_1

manager_gateway_group_delete_2

点击 确定 按钮后删除网关分组,如果网关分组存在关联的路由配置时,需要将关联的路由配置全部删除后才能删除分组。

上次更新: 2020-10-27 14:43
- + diff --git a/docs/guide/manager/manager_overview.html b/docs/guide/manager/manager_overview.html index d602812..defb2f7 100644 --- a/docs/guide/manager/manager_overview.html +++ b/docs/guide/manager/manager_overview.html @@ -7,36 +7,36 @@ - - + + -

# 概述

Fizz管理后台是Fizz网关的配套系统,基于Java、Vue开发,通过界面对Fizz网关集群进行各项配置。

# 功能

Fizz管理后台包含如下功能:

# 界面

manager_overview_1

manager_overview_2

上次更新: 2020-11-9 11:50
- + diff --git a/docs/guide/manager/manager_plugin.html b/docs/guide/manager/manager_plugin.html index 913cc13..c581e2d 100644 --- a/docs/guide/manager/manager_plugin.html +++ b/docs/guide/manager/manager_plugin.html @@ -7,23 +7,23 @@ - - + + -

# 概述

插件管理功能用于维护插件元数据,定义路由级别的自定义属性、插件级别的自定义配置信息。创建的插件用于路由管理设置时启用,当网关接受请求匹配路由规则时会触发启用的插件逻辑执行,插件逻辑中可获取到自定义的属性数据。

# 插件列表

菜单位置:网关管理 > 插件管理。点击菜单后进入插件管理列表页面,如图所示。

manager_plugin_list_query

# 新增插件

点击 新增 按钮弹出新增窗口,如图所示。

manager_plugin_add_1

manager_plugin_add_2

插件名称:插件名称由英文字母、下划线或数字组成,不能以数字开头,长度不能超过50个字符,必填;

插件描述:插件的简要描述,长度不能超过50个字符,必填;

默认执行顺序:插件的默认执行顺序,按从小到大排序,值越小越先执行,取值范围0~255,必填;

表单定义:路由级别的自定义属性,在路由管理配置启用插件时前端会将表单定义转化为表单输入界面,更多信息请查看路由管理介绍。表单规范说明如下:

/*
+        

# 概述

插件管理功能用于维护插件元数据,定义路由级别的自定义属性、插件级别的自定义配置信息。创建的插件用于路由管理设置时启用,当网关接受请求匹配路由规则时会触发启用的插件逻辑执行,插件逻辑中可获取到自定义的属性数据。

# 插件列表

菜单位置:网关管理 > 插件管理。点击菜单后进入插件管理列表页面,如图所示。

manager_plugin_list_query

# 新增插件

点击 新增 按钮弹出新增窗口,如图所示。

manager_plugin_add_1

manager_plugin_add_2

插件名称:插件名称由英文字母、下划线或数字组成,不能以数字开头,长度不能超过50个字符,必填;

插件描述:插件的简要描述,长度不能超过50个字符,必填;

默认执行顺序:插件的默认执行顺序,按从小到大排序,值越小越先执行,取值范围0~255,必填;

表单定义:路由级别的自定义属性,在路由管理配置启用插件时前端会将表单定义转化为表单输入界面,更多信息请查看路由管理介绍。表单规范说明如下:

/*
 * plugin_config_design
 * 动态插件参考结构
 * */
@@ -134,15 +134,15 @@
 // TODO 注意!!
 //  组件 "checkbox" 的dataType = "array"
 //  组件 "radio/select" 的实际值类型等于options内的value值类型
-

自定义配置:插件级别的自定义配置信息,插件逻辑中可获取到该信息。

# 编辑插件

点击 编辑 按钮弹出编辑窗口,如图所示。

manager_plugin_edit_1

manager_plugin_edit_2

# 删除插件

点击 删除 按钮弹出删除确认窗口,如图所示。

manager_plugin_delete_1

manager_plugin_delete_2

点击 确定 按钮后删除插件,如果插件存在关联的路由配置时,需要将关联的路由配置全部删除后才能删除插件。

上次更新: 2020-10-26 18:40

自定义配置:插件级别的自定义配置信息,插件逻辑中可获取到该信息。

# 编辑插件

点击 编辑 按钮弹出编辑窗口,如图所示。

manager_plugin_edit_1

manager_plugin_edit_2

# 删除插件

点击 删除 按钮弹出删除确认窗口,如图所示。

manager_plugin_delete_1

manager_plugin_delete_2

点击 确定 按钮后删除插件,如果插件存在关联的路由配置时,需要将关联的路由配置全部删除后才能删除插件。

上次更新: 2020-11-9 11:50
- + diff --git a/docs/guide/manager/manager_role.html b/docs/guide/manager/manager_role.html index cfecd86..8077cd7 100644 --- a/docs/guide/manager/manager_role.html +++ b/docs/guide/manager/manager_role.html @@ -7,31 +7,31 @@ - - + + -

# 概述

角色管理功能维护角色元数据,通过配置角色拥有的菜单资源,限制用户只能操作拥有的角色对应的菜单资源,下面介绍角色管理功能的操作。

# 角色列表

菜单位置:权限管理 > 角色管理。点击菜单后进入角色列表页面,如图所示。

manager_role_list_query

# 添加角色

点击 新增 按钮弹出新增窗口,如图所示。

manager_role_add_1

manager_role_add_2

# 权限设置

勾选需要分配权限的角色,点击 权限设置 按钮弹出角色权限配置窗口,如图所示。

manager_role_auth_1

manager_role_auth_2

勾选菜单后点击 确定 按钮确认给角色分配菜单权限。

# 编辑角色

点击 编辑 按钮弹出编辑窗口,如图所示。

manager_role_edit_1

manager_role_edit_2

# 删除角色

点击 删除 按钮弹出删除确认窗口,如图所示。

manager_role_delete_1

manager_role_delete_2

点击 确定 按钮后删除角色。

上次更新: 2020-10-26 18:40
- + diff --git a/docs/guide/manager/manager_service.html b/docs/guide/manager/manager_service.html index 4d2091e..479424a 100644 --- a/docs/guide/manager/manager_service.html +++ b/docs/guide/manager/manager_service.html @@ -7,31 +7,31 @@ - - + + -

# 概述

服务管理功能维护服务元数据。服务编排中的服务是一个逻辑上的概念,用于对聚合接口的归类以及权限的分配。Fizz网关聚合接口的请求路径格式为 http://{ip}:{port}/proxy/{service}{apiPath},服务对应{service}段。

# 服务列表

菜单位置:服务编排 > 服务管理。点击菜单后进入服务列表页面,如图所示。

manager_service_list_query

# 新增服务

点击 新增 按钮弹出新增窗口,如图所示。

manager_service_add_1

manager_service_add_2

服务 ID:服务唯一标识,对应Fizz网关聚合接口请求路径(格式为 http://{ip}:{port}/proxy/{service}{apiPath})的{service}段,长度不能超过200个字符,必填;

服务名:服务名称,用于展示或者选项使用,必填;

团队:团队名称,长度不能超过200个字符;

负责人:负责人名称,长度不能超过200个字符;

描述:服务描述,长度不能超过2000个字符。

# 编辑服务

点击 编辑 按钮弹出编辑窗口,如图所示。

manager_service_edit_1

manager_service_edit_2

# 删除服务

点击 删除 按钮弹出删除确认窗口,如图所示。

manager_service_delete_1

manager_service_delete_2

点击 确定 按钮后删除服务,如果服务存在关联的聚合接口时,需要将关联的聚合接口全部删除后才能删除服务。

# 服务权限分配

点击 权限 按钮弹出权限配置窗口,如图所示。

manager_service_auth_1

manager_service_auth_2

服务创建人自动获得服务权限,服务权限可分配,拥有权限的用户才能操作对应的接口列表。

上次更新: 2020-10-26 18:40
- + diff --git a/docs/guide/manager/manager_source_statistics.html b/docs/guide/manager/manager_source_statistics.html index 92f7229..346c9d4 100644 --- a/docs/guide/manager/manager_source_statistics.html +++ b/docs/guide/manager/manager_source_statistics.html @@ -7,23 +7,23 @@ - - + + -

# 概述

Fizz网关会将访问请求数据(IP地址、网关分组、服务、应用、请求方法、API Path、请求时间)推送到Kafka中,管理后台消费Kafka消息统计接口访问数据。

接口统计功能以图表的形式展示指定时间段内每日的接口总数、访问次数,可查看接口的历史访问总次数以及最近请求时间。

# 接口访问统计

菜单位置:网关管理 > 接口统计。点击菜单后进入接口统计页面,如图所示。

manager_source_statistics_1.png

今天接口总数:从0时到当前时刻被调用不同接口的总数;

今天访问次数:从0时到当前时刻访问请求的总次数。

接口总数图表:显示指定时间段内每日被调用不同接口的总数曲线;

访问次数图表:显示指定时间段内每日访问请求的总次数曲线。

# 请求统计

接口统计界面下部为请求统计列表,如图所示。

manager_source_statistics_2.png

来源IP:网关请求的实际入口IP地址;

请求次数:( 唯一[来源IP、网关分组、服务名、请求方法、appID、API Path])历史总请求次数;

最近请求时间:( 唯一[来源IP、网关分组、服务名、请求方法、appID、API Path])最近一次调用时间。

上次更新: 2020-10-26 18:40
- +

# 概述

Fizz网关会将访问请求数据(IP地址、网关分组、服务、应用、请求方法、API Path、请求时间)推送到Kafka中,管理后台消费Kafka消息统计接口访问数据。

接口统计功能以图表的形式展示指定时间段内每日的接口总数、访问次数,可查看接口的历史访问总次数以及最近请求时间。

# 接口访问统计

菜单位置:网关管理 > 接口统计。点击菜单后进入接口统计页面,如图所示。

manager_source_statistics_1.png

今天接口总数:从0时到当前时刻被调用不同接口的总数;

今天访问次数:从0时到当前时刻访问请求的总次数。

接口总数图表:显示指定时间段内每日被调用不同接口的总数曲线;

访问次数图表:显示指定时间段内每日访问请求的总次数曲线。

# 请求统计

接口统计界面下部为请求统计列表,如图所示。

manager_source_statistics_2.png

来源IP:网关请求的实际入口IP地址;

请求次数:( 唯一[来源IP、网关分组、服务名、请求方法、appID、API Path])历史总请求次数;

最近请求时间:( 唯一[来源IP、网关分组、服务名、请求方法、appID、API Path])最近一次调用时间。

上次更新: 2020-11-9 11:50
+ diff --git a/docs/guide/manager/manager_user.html b/docs/guide/manager/manager_user.html index baaece7..a2232a9 100644 --- a/docs/guide/manager/manager_user.html +++ b/docs/guide/manager/manager_user.html @@ -7,27 +7,27 @@ - - + + -

# 概述

用户管理功能用于维护用户元数据,包括用户信息维护、密码维护、角色配置。

# 用户列表

菜单位置:系统管理 > 用户管理。点击菜单后进入用户列表页面,如图所示。

manager_user_list_query

# 添加用户

点击 新增 按钮弹出新增窗口,如图所示。

manager_user_add_1

manager_user_add_2

电子邮箱:用户用于接收电子邮件的邮箱地址,后台涉及邮件发送业务使用该字段设置的邮箱地址来进行邮箱发送。

# 重置密码

勾选用户后点击 密码重置 按钮可为用户重置密码。

manager_user_reset_password_1

manager_user_reset_password_2

重置后的默认密码为AsdF1234!

# 编辑用户

点击 编辑 按钮弹出编辑窗口,如图所示。

manager_user_edit_1

manager_user_edit_2

# 删除用户

点击 删除 按钮弹出删除确认窗口,如图所示。

manager_user_delete_1

manager_user_delete_2

上次更新: 2020-10-26 18:40
- + diff --git a/docs/guide/plugin/index.html b/docs/guide/plugin/index.html index 44d1c05..9e7daa5 100644 --- a/docs/guide/plugin/index.html +++ b/docs/guide/plugin/index.html @@ -7,23 +7,23 @@ - - + + -

# 概述

当需要在gateway中加入自定义的逻辑时,可通过fizz的插件机制实现,插件:
+

# 概述

当需要在gateway中加入自定义的逻辑时,可通过fizz的插件机制实现,插件:
1、类似spring的WebFilter,是fizz内部的WebFilter,由fizz调度;
2、对不同的请求,可配置不同的上下文参数,可通过manager完成配置;
3、若有多个插件,当前插件可获取前面插件的执行结果。

插件的开发和应用,分gateway开发、manager配置两部分,下面以一个例子,依次介绍。

# gateway开发

    实现
@@ -109,17 +109,17 @@
     ]
     前端据此生成插件的配置表单,具体参前端说明。
 

2、应用插件

如对 -

接口应用插件: -

上面配置的"打印请求id日志"、"添加fizzRsv请求头",对应

public Mono<Void> doFilter(ServerWebExchange exchange, Map<String, Object> config, String fixedConfig) 
-

中config的logReqId和appendFizzRsv key。

上次更新: 2020-9-9 17:26
上次更新: 2020-11-9 11:50
- + diff --git a/docs/guide/proxy/index.html b/docs/guide/proxy/index.html index e7f7671..0221ec3 100644 --- a/docs/guide/proxy/index.html +++ b/docs/guide/proxy/index.html @@ -7,31 +7,31 @@ - - + + -

# 路由转发介绍

路由转发也叫反向代理,为内部微服务提供统一的对外入口。支持以下功能:

  • 支持服务注册与发现
  • 支持负载均衡
  • 支持黑白名单机制
  • 支持配置插件

# 接入路由转发

  • 前提条件:接入Eureka注册中心
  • 开通白名单,接入注册中心的服务默认不对公网开放 (白名单在配置文件里配置serviceWhiteList)
  • 配置访问权限 (管理后台-接口代理-API查询)
上次更新: 2020-9-8 15:3
- + diff --git a/docs/index.html b/docs/index.html index 88340b9..4b8fd6b 100644 --- a/docs/index.html +++ b/docs/index.html @@ -7,19 +7,19 @@ - - + + -
- +