├── .browserslistrc ├── .env ├── .env.test ├── .eslintrc.js ├── .gitignore ├── Dockerfile ├── LICENSE ├── README.md ├── README_zh.md ├── babel.config.js ├── docs ├── css │ ├── app.65cf991b.css │ ├── chunk-027ed6d5.4dc0780a.css │ ├── chunk-08959a0d.c0e5f604.css │ ├── chunk-1ddeca1d.e731e724.css │ ├── chunk-25ec708e.e4bf016d.css │ ├── chunk-3587bd2e.be6dca20.css │ ├── chunk-4a8a6705.5fbed631.css │ ├── chunk-5ef5ba5e.6134e4d9.css │ ├── chunk-71822631.7f96d67e.css │ ├── chunk-72a53978.e26162b7.css │ ├── chunk-c7db06f0.4b5299d9.css │ ├── chunk-d2e58562.aa1030c9.css │ ├── chunk-d44a0b36.7dba6caf.css │ ├── chunk-dadb0a46.53737a7e.css │ ├── chunk-e106ef38.d9b0b4a3.css │ ├── chunk-f8eaf232.f29d71c3.css │ ├── chunk-fa6692d8.569114b5.css │ └── chunk-vendors.40f5911f.css ├── favicon.ico ├── fonts │ ├── ionicons.143146fa.woff2 │ ├── ionicons.99ac3308.woff │ └── ionicons.d535a25a.ttf ├── images │ ├── basic_info.png │ ├── certificate_add.png │ ├── config.png │ ├── consumer_detail.png │ ├── consumer_list.png │ ├── plugin_list.png │ ├── route_list.png │ ├── service_detail.png │ ├── service_list.png │ └── upstream_list.png ├── img │ └── ionicons.a2c4a261.svg ├── index.html └── js │ ├── app.9434f361.js │ ├── app.9434f361.js.map │ ├── chunk-027ed6d5.7d223b46.js │ ├── chunk-027ed6d5.7d223b46.js.map │ ├── chunk-08959a0d.d8df3269.js │ ├── chunk-08959a0d.d8df3269.js.map │ ├── chunk-1ddeca1d.3c64b94f.js │ ├── chunk-1ddeca1d.3c64b94f.js.map │ ├── chunk-25ec708e.dd563812.js │ ├── chunk-25ec708e.dd563812.js.map │ ├── chunk-33791f6e.9885dc0c.js │ ├── chunk-33791f6e.9885dc0c.js.map │ ├── chunk-3587bd2e.48a485de.js │ ├── chunk-3587bd2e.48a485de.js.map │ ├── chunk-4a8a6705.a6d15ae0.js │ ├── chunk-4a8a6705.a6d15ae0.js.map │ ├── chunk-5ef5ba5e.d3794852.js │ ├── chunk-5ef5ba5e.d3794852.js.map │ ├── chunk-71822631.3435db1a.js │ ├── chunk-71822631.3435db1a.js.map │ ├── chunk-72a53978.f14c725c.js │ ├── chunk-72a53978.f14c725c.js.map │ ├── chunk-c7db06f0.d9755f6f.js │ ├── chunk-c7db06f0.d9755f6f.js.map │ ├── chunk-d2e58562.99f939f1.js │ ├── chunk-d2e58562.99f939f1.js.map │ ├── chunk-d44a0b36.10813040.js │ ├── chunk-d44a0b36.10813040.js.map │ ├── chunk-dadb0a46.29cd2b11.js │ ├── chunk-dadb0a46.29cd2b11.js.map │ ├── chunk-e106ef38.0da33c14.js │ ├── chunk-e106ef38.0da33c14.js.map │ ├── chunk-f8eaf232.ba289ffc.js │ ├── chunk-f8eaf232.ba289ffc.js.map │ ├── chunk-fa6692d8.4e496869.js │ ├── chunk-fa6692d8.4e496869.js.map │ ├── chunk-ff15ac3e.774fa1aa.js │ ├── chunk-ff15ac3e.774fa1aa.js.map │ ├── chunk-vendors.9d78b9fd.js │ └── chunk-vendors.9d78b9fd.js.map ├── package.json ├── postcss.config.js ├── public ├── favicon.ico └── index.html ├── src ├── App.vue ├── assets │ └── logo.png ├── components │ ├── Footer.vue │ ├── Header.vue │ ├── HelloWorld.vue │ ├── Menu.vue │ ├── consumers │ │ ├── ACLConfigTable.vue │ │ ├── BasicAuthConfigTable.vue │ │ ├── ConsumerTable.vue │ │ ├── HMACAuthConfigTable.vue │ │ ├── JWTConfigTable.vue │ │ ├── KeyAuthConfigTable.vue │ │ └── OAuth2ConfigTable.vue │ ├── plugins │ │ └── PluginTable.vue │ └── services │ │ ├── RouteTable.vue │ │ └── TargetTable.vue ├── event-bus.js ├── lang │ ├── en.js │ └── zh.js ├── main.js ├── plugins │ └── iview.js ├── request.js ├── router.js └── views │ ├── BasicInfo.vue │ ├── Config.vue │ ├── Index.vue │ ├── Login.vue │ ├── certificates │ ├── AddCertificate.vue │ └── CertificateList.vue │ ├── consumers │ ├── AddConsumer.vue │ └── ConsumerList.vue │ ├── plugins │ ├── AddPlugin.vue │ └── PluginList.vue │ ├── routes │ ├── AddRoute.vue │ └── RouteList.vue │ ├── services │ ├── AddService.vue │ ├── ServiceDetail.vue │ └── ServiceList.vue │ └── upstreams │ ├── AddUpstream.vue │ └── UpstreamList.vue └── vue.config.js /.browserslistrc: -------------------------------------------------------------------------------- 1 | > 1% 2 | last 2 versions 3 | not ie <= 8 4 | -------------------------------------------------------------------------------- /.env: -------------------------------------------------------------------------------- 1 | VUE_APP_API_HOST=http://nas.pocketdigi.com:8000/admin 2 | -------------------------------------------------------------------------------- /.env.test: -------------------------------------------------------------------------------- 1 | VUE_APP_API_HOST=http://www.qq.com 2 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { 4 | node: true 5 | }, 6 | 'extends': [ 7 | 'plugin:vue/essential', 8 | 'eslint:recommended' 9 | ], 10 | rules: { 11 | 'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off', 12 | 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off', 13 | "vue/no-parsing-error": [2, { "x-invalid-end-tag": false }] 14 | }, 15 | parserOptions: { 16 | parser: 'babel-eslint' 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | 5 | # local env files 6 | .env.local 7 | .env.*.local 8 | 9 | # Log files 10 | npm-debug.log* 11 | yarn-debug.log* 12 | yarn-error.log* 13 | 14 | # Editor directories and files 15 | .idea 16 | .vscode 17 | *.suo 18 | *.ntvs* 19 | *.njsproj 20 | *.sln 21 | *.sw* 22 | package-lock.json 23 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM nginx:1.15.12-alpine 2 | COPY dist /usr/share/nginx/html 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Kong admin UI 2 | 3 | [中文](README_zh.md) 4 | 5 | A Web UI for the Kong(The Cloud-Native API Gateway & Service Mesh) admin api. 6 | 7 | It's a font-end application,no need any back-end server.All requests to Kong admin api is send by user's browser. 8 | 9 | If you can visit our [demo](https://pocketdigi.github.io/kong-admin-ui) ,and your current device can visit kong admin api directly,you can use our demo to manage your Kong,it's safe. 10 | 11 | [demo on github page](https://pocketdigi.github.io/kong-admin-ui) `https` protocol,so your kong admin api must `https` too. 12 | 13 | [demo on pocketdigi.com](http://kong-admin.pocketdigi.com) `http` protocol,the server is in China. 14 | 15 | 16 | 17 | ### Features 18 | * Basic Info (configurations and status) 19 | * Service management 20 | * Route management 21 | * Upstream management(include target) 22 | * Consumer management 23 | * Plugin management 24 | * Authentication management(Support Basic Authentication, HMAC Authentication, JWT, Key Authentication, OAuth 2.0 Authentication) 25 | * Certificate management 26 | 27 | **Only support kong 0.14.x and above.** 28 | 29 | From version 0.3, we support custom headers,so you can use Basic Authentication plugin and Cors plugin on your Kong Admin Service,and add credential on header. 30 | 31 | [kong admin ui Custom Headers使用说明 给你的kong加个密码](https://www.pocketdigi.com/20190613/1644.html) 32 | 33 | ### How to use 34 | 1. If your computer can visit kong admin api and intenet, you can use the demo we deployed. 35 | 2. Clone the source code,compile,deploy with nginx 36 | 3. Download the zip we packed,deploy with nginx 37 | 4. Deploy with docker 38 | 39 | ``` docker run -d --name kong-admin-ui -p 8899:80 pocketdigi/kong-admin-ui:0.5.3 ``` 40 | 41 | ### Screenshots 42 | 43 | 44 | ![basic info](https://github.com/pocketdigi/kong-admin-ui/raw/master/docs/images/basic_info.png) 45 | 46 | ![config](https://github.com/pocketdigi/kong-admin-ui/raw/master/docs/images/config.png) 47 | 48 | ![route list](https://github.com/pocketdigi/kong-admin-ui/raw/master/docs/images/route_list.png) 49 | 50 | ![service list](https://github.com/pocketdigi/kong-admin-ui/raw/master/docs/images/service_list.png) 51 | 52 | ![service detail](https://github.com/pocketdigi/kong-admin-ui/raw/master/docs/images/service_detail.png) 53 | 54 | ![upstream list](https://github.com/pocketdigi/kong-admin-ui/raw/master/docs/images/upstream_list.png) 55 | 56 | ![consumer list](https://github.com/pocketdigi/kong-admin-ui/raw/master/docs/images/consumer_list.png) 57 | 58 | ![consumer detail](https://github.com/pocketdigi/kong-admin-ui/raw/master/docs/images/consumer_detail.png) 59 | 60 | ![plugin list](https://github.com/pocketdigi/kong-admin-ui/raw/master/docs/images/plugin_list.png) 61 | 62 | ![certification](https://github.com/pocketdigi/kong-admin-ui/raw/master/docs/images/certificate_add.png) 63 | ## Project setup 64 | ``` 65 | npm install 66 | ``` 67 | 68 | ### Compiles and hot-reloads for development 69 | ``` 70 | npm run serve 71 | ``` 72 | 73 | ### Compiles and minifies for production 74 | ``` 75 | npm run build 76 | ``` 77 | 78 | ### Run your tests 79 | ``` 80 | npm run test 81 | ``` 82 | 83 | ### Lints and fixes files 84 | ``` 85 | npm run lint 86 | ``` 87 | 88 | 89 | -------------------------------------------------------------------------------- /README_zh.md: -------------------------------------------------------------------------------- 1 | # Kong admin UI 2 | 3 | Kong 网关的管理界面 4 | 5 | 纯前端应用,所有请求从浏览器发出,不经过任何中间服务器,直接到达您的Kong admin api,安全、放心。如果您的电脑可以访问互联网(只要您的电脑能访问互联网,且能访问kong admin api,不需要kong admin api可以访问互联网),可直接使用部署在公网的demo,否则请本地化部署。 6 | 7 | 8 | [https demo](https://pocketdigi.github.io/kong-admin-ui) ,部署在github上,https协议,所以您的kong admin api也必须是https协议,否则会被浏览器拦截。 9 | 10 | 11 | [http demo](http://kong-admin.pocketdigi.com) http协议,部署在国内腾讯云,国内访问速度更快 12 | 13 | 14 | ### 特性 15 | * 基本信息 (配置和状态) 16 | * Service 管理 17 | * Route 管理 18 | * Upstream 管理 19 | * Consumer 管理 20 | * Plugin 管理 21 | * 授权管理(支持 Basic Authentication, HMAC Authentication, JWT, Key Authentication, OAuth 2.0 Authentication) 22 | * SSL证书 管理 23 | 24 | **只支持 0.14.x 及以上版本的kong** 25 | 26 | 从0.3版本开始,支持自定义header,所以,您可以使用kong转发kong admin api接口,再加上Basic Authentication插件和Cors插件,在公网上管理kong更安全 27 | 28 | [kong admin ui Custom Headers使用说明 给你的kong加个密码](https://www.pocketdigi.com/20190613/1644.html) 29 | 30 | ### 如何使用 31 | 1. 如果您的电脑可以访问外网,使用上面部署的demo 32 | 2. 下载源码编译,部署到自己的server 33 | 3. 下载编译好的包,解压部署到自己的server 34 | 4. 使用docker部署 35 | 36 | ``` docker run -d --name kong-admin-ui -p 8899:80 pocketdigi/kong-admin-ui:0.5.3 ``` 37 | 38 | 39 | ### 截图 40 | 41 | 42 | ![basic info](https://github.com/pocketdigi/kong-admin-ui/raw/master/docs/images/basic_info.png) 43 | 44 | ![config](https://github.com/pocketdigi/kong-admin-ui/raw/master/docs/images/config.png) 45 | 46 | ![route list](https://github.com/pocketdigi/kong-admin-ui/raw/master/docs/images/route_list.png) 47 | 48 | ![service list](https://github.com/pocketdigi/kong-admin-ui/raw/master/docs/images/service_list.png) 49 | 50 | ![service detail](https://github.com/pocketdigi/kong-admin-ui/raw/master/docs/images/service_detail.png) 51 | 52 | ![upstream list](https://github.com/pocketdigi/kong-admin-ui/raw/master/docs/images/upstream_list.png) 53 | 54 | ![consumer list](https://github.com/pocketdigi/kong-admin-ui/raw/master/docs/images/consumer_list.png) 55 | 56 | ![consumer detail](https://github.com/pocketdigi/kong-admin-ui/raw/master/docs/images/consumer_detail.png) 57 | 58 | ![plugin list](https://github.com/pocketdigi/kong-admin-ui/raw/master/docs/images/plugin_list.png) 59 | 60 | ![certification](https://github.com/pocketdigi/kong-admin-ui/raw/master/docs/images/certificate_add.png) 61 | ## Project setup 62 | ``` 63 | npm install 64 | ``` 65 | 66 | ### Compiles and hot-reloads for development 67 | ``` 68 | npm run serve 69 | ``` 70 | 71 | ### Compiles and minifies for production 72 | ``` 73 | npm run build 74 | ``` 75 | 76 | ### Run your tests 77 | ``` 78 | npm run test 79 | ``` 80 | 81 | ### Lints and fixes files 82 | ``` 83 | npm run lint 84 | ``` 85 | 86 | 87 | -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [ 3 | '@vue/app' 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /docs/css/app.65cf991b.css: -------------------------------------------------------------------------------- 1 | #app{font-family:Avenir,Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-align:center;color:#2c3e50} -------------------------------------------------------------------------------- /docs/css/chunk-027ed6d5.4dc0780a.css: -------------------------------------------------------------------------------- 1 | .ivu-icon[data-v-69aac003]{font-size:2rem}.field_desc[data-v-79f74b6c]{margin-left:10px}.text_input[data-v-79f74b6c]{max-width:200px}.text_input_multiple[data-v-79f74b6c]{max-width:400px} -------------------------------------------------------------------------------- /docs/css/chunk-08959a0d.c0e5f604.css: -------------------------------------------------------------------------------- 1 | #table[data-v-18b6b932]{margin-top:10px}.page[data-v-18b6b932]{text-align:right;margin-top:10px;font-size:1rem} -------------------------------------------------------------------------------- /docs/css/chunk-1ddeca1d.e731e724.css: -------------------------------------------------------------------------------- 1 | #table[data-v-0380ed30]{margin-top:10px}.page[data-v-0380ed30]{text-align:right;margin-top:10px;font-size:1rem} -------------------------------------------------------------------------------- /docs/css/chunk-25ec708e.e4bf016d.css: -------------------------------------------------------------------------------- 1 | .ivu-icon[data-v-69aac003]{font-size:2rem}.hljs{color:#abb2bf;background:#282c34}.hljs-comment,.hljs-quote{color:#5c6370;font-style:italic}.hljs-doctag,.hljs-formula,.hljs-keyword{color:#c678dd}.hljs-deletion,.hljs-name,.hljs-section,.hljs-selector-tag,.hljs-subst{color:#e06c75}.hljs-literal{color:#56b6c2}.hljs-addition,.hljs-attribute,.hljs-meta .hljs-string,.hljs-regexp,.hljs-string{color:#98c379}.hljs-attr,.hljs-number,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-pseudo,.hljs-template-variable,.hljs-type,.hljs-variable{color:#d19a66}.hljs-bullet,.hljs-link,.hljs-meta,.hljs-selector-id,.hljs-symbol,.hljs-title{color:#61aeee}.hljs-built_in,.hljs-class .hljs-title,.hljs-title.class_{color:#e6c07b}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.hljs-link{text-decoration:underline}#content[data-v-08f6f076]{font-size:1rem}#content span[data-v-08f6f076]{font-weight:700}#content h1[data-v-08f6f076]{margin-top:20px}Row[data-v-08f6f076]{color:#0ff} -------------------------------------------------------------------------------- /docs/css/chunk-3587bd2e.be6dca20.css: -------------------------------------------------------------------------------- 1 | #config[data-v-6ba13e5f],#config[data-v-7a1800a4],#config[data-v-56ecd378],#config[data-v-02513164],#config[data-v-cd1b7030],#config[data-v-db47fc30]{margin-top:10px}.field_desc[data-v-8c4448b2]{margin-left:10px}.text_input[data-v-8c4448b2]{max-width:200px}.text_input_multiple[data-v-8c4448b2]{max-width:400px}#plugin-config[data-v-8c4448b2]{margin-top:10px} -------------------------------------------------------------------------------- /docs/css/chunk-4a8a6705.5fbed631.css: -------------------------------------------------------------------------------- 1 | #menu[data-v-48d508d7]{background:#17233d}.router-link-active[data-v-48d508d7]{color:#fff}#title[data-v-0ab004d4]{color:#fff;font-size:1.4rem}.config[data-v-0ab004d4]{color:#fff;height:64px}.config div[data-v-0ab004d4]{position:absolute;top:30px;right:0;padding-right:20px}.config p[data-v-0ab004d4]{line-height:normal}.config a[data-v-0ab004d4]{color:#fff}.ivu-icon[data-v-ade9bf66]{font-size:1.4rem}.router-content[data-v-0e040310]{margin:20px;text-align:left} -------------------------------------------------------------------------------- /docs/css/chunk-5ef5ba5e.6134e4d9.css: -------------------------------------------------------------------------------- 1 | #login[data-v-c4e99cfc]{margin-top:200px}input[data-v-c4e99cfc]{margin-left:20px} -------------------------------------------------------------------------------- /docs/css/chunk-71822631.7f96d67e.css: -------------------------------------------------------------------------------- 1 | .field_desc[data-v-6e01a318]{margin-left:10px}.text_input[data-v-6e01a318]{max-width:200px}.text_input_multiple[data-v-6e01a318]{max-width:400px}.clear_button[data-v-6e01a318]{margin-left:10px} -------------------------------------------------------------------------------- /docs/css/chunk-72a53978.e26162b7.css: -------------------------------------------------------------------------------- 1 | .field_desc[data-v-7423a9ec]{margin-left:10px}.text_input[data-v-7423a9ec]{max-width:200px} -------------------------------------------------------------------------------- /docs/css/chunk-c7db06f0.4b5299d9.css: -------------------------------------------------------------------------------- 1 | .field_desc[data-v-d09fcf9c]{margin-left:10px}.text_input[data-v-d09fcf9c]{max-width:200px}.text_input_multiple[data-v-d09fcf9c]{max-width:400px} -------------------------------------------------------------------------------- /docs/css/chunk-d2e58562.aa1030c9.css: -------------------------------------------------------------------------------- 1 | .field_desc[data-v-b99f0954]{margin-left:10px}.text_input[data-v-b99f0954]{max-width:200px}.text_input_multiple[data-v-b99f0954]{max-width:400px} -------------------------------------------------------------------------------- /docs/css/chunk-d44a0b36.7dba6caf.css: -------------------------------------------------------------------------------- 1 | .page[data-v-223abf10]{text-align:right;margin-top:10px;font-size:1rem} -------------------------------------------------------------------------------- /docs/css/chunk-dadb0a46.53737a7e.css: -------------------------------------------------------------------------------- 1 | #table[data-v-09a8ac8b]{margin-top:10px}.page[data-v-09a8ac8b]{text-align:right;margin-top:10px;font-size:1rem} -------------------------------------------------------------------------------- /docs/css/chunk-e106ef38.d9b0b4a3.css: -------------------------------------------------------------------------------- 1 | #login[data-v-2378449c]{margin-top:200px}input[data-v-2378449c]{margin-left:20px}Col[data-v-2378449c]{padding:50px} -------------------------------------------------------------------------------- /docs/css/chunk-f8eaf232.f29d71c3.css: -------------------------------------------------------------------------------- 1 | .page[data-v-551b3078]{text-align:right;margin-top:10px;font-size:1rem} -------------------------------------------------------------------------------- /docs/css/chunk-fa6692d8.569114b5.css: -------------------------------------------------------------------------------- 1 | #config[data-v-f8be8600]{margin-top:50px}input[data-v-f8be8600]{margin-left:20px}.notice[data-v-f8be8600]{margin-top:20px;font-weight:700} -------------------------------------------------------------------------------- /docs/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocketdigi/kong-admin-ui/13c15764dea23e05fae3a73332669b36d7d144d8/docs/favicon.ico -------------------------------------------------------------------------------- /docs/fonts/ionicons.143146fa.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocketdigi/kong-admin-ui/13c15764dea23e05fae3a73332669b36d7d144d8/docs/fonts/ionicons.143146fa.woff2 -------------------------------------------------------------------------------- /docs/fonts/ionicons.99ac3308.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocketdigi/kong-admin-ui/13c15764dea23e05fae3a73332669b36d7d144d8/docs/fonts/ionicons.99ac3308.woff -------------------------------------------------------------------------------- /docs/fonts/ionicons.d535a25a.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocketdigi/kong-admin-ui/13c15764dea23e05fae3a73332669b36d7d144d8/docs/fonts/ionicons.d535a25a.ttf -------------------------------------------------------------------------------- /docs/images/basic_info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocketdigi/kong-admin-ui/13c15764dea23e05fae3a73332669b36d7d144d8/docs/images/basic_info.png -------------------------------------------------------------------------------- /docs/images/certificate_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocketdigi/kong-admin-ui/13c15764dea23e05fae3a73332669b36d7d144d8/docs/images/certificate_add.png -------------------------------------------------------------------------------- /docs/images/config.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocketdigi/kong-admin-ui/13c15764dea23e05fae3a73332669b36d7d144d8/docs/images/config.png -------------------------------------------------------------------------------- /docs/images/consumer_detail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocketdigi/kong-admin-ui/13c15764dea23e05fae3a73332669b36d7d144d8/docs/images/consumer_detail.png -------------------------------------------------------------------------------- /docs/images/consumer_list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocketdigi/kong-admin-ui/13c15764dea23e05fae3a73332669b36d7d144d8/docs/images/consumer_list.png -------------------------------------------------------------------------------- /docs/images/plugin_list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocketdigi/kong-admin-ui/13c15764dea23e05fae3a73332669b36d7d144d8/docs/images/plugin_list.png -------------------------------------------------------------------------------- /docs/images/route_list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocketdigi/kong-admin-ui/13c15764dea23e05fae3a73332669b36d7d144d8/docs/images/route_list.png -------------------------------------------------------------------------------- /docs/images/service_detail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocketdigi/kong-admin-ui/13c15764dea23e05fae3a73332669b36d7d144d8/docs/images/service_detail.png -------------------------------------------------------------------------------- /docs/images/service_list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocketdigi/kong-admin-ui/13c15764dea23e05fae3a73332669b36d7d144d8/docs/images/service_list.png -------------------------------------------------------------------------------- /docs/images/upstream_list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocketdigi/kong-admin-ui/13c15764dea23e05fae3a73332669b36d7d144d8/docs/images/upstream_list.png -------------------------------------------------------------------------------- /docs/index.html: -------------------------------------------------------------------------------- 1 | Kong admin ui
-------------------------------------------------------------------------------- /docs/js/chunk-4a8a6705.a6d15ae0.js: -------------------------------------------------------------------------------- 1 | (window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-4a8a6705"],{"1d53":function(t,e,n){"use strict";n("d47d")},"3bf3":function(t,e,n){},"3f38":function(t,e,n){"use strict";n("5494")},5494:function(t,e,n){},"81f6":function(t,e,n){"use strict";var a=n("2b0e");e["a"]=new a["default"]},ce72:function(t,e,n){"use strict";n("3bf3")},d47d:function(t,e,n){},d504:function(t,e,n){"use strict";n.r(e);var a=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"layout"},[n("Layout",[n("Header",{staticStyle:{padding:"0px"}},[n("HeaderComponent")],1),n("Layout",[n("Sider",{attrs:{"hide-trigger":""}},[n("keep-alive",[n("Menu")],1)],1),n("Content",[n("router-view",{staticClass:"router-content"})],1)],1),n("Footer",[n("FooterComponent")],1)],1)],1)},s=[],r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("Row",{attrs:{id:"menu"}},[n("Col",{attrs:{span:"24"}},[n("Menu",{ref:"menu",attrs:{theme:t.theme2,width:"auto","active-name":t.activeName,"open-names":t.openNames}},[n("router-link",{attrs:{to:"/"}},[n("MenuItem",{attrs:{name:"index"}},[n("Icon",{attrs:{type:"ios-stats"}}),t._v("\n "+t._s(t.$t("breadcrumb.info"))+"\n ")],1)],1),n("Submenu",{attrs:{name:"service"}},[n("template",{slot:"title"},[n("Icon",{attrs:{type:"ios-paper"}}),t._v("\n Service\n ")],1),n("router-link",{attrs:{to:"/services"}},[n("MenuItem",{attrs:{name:"service-list"}},[t._v(t._s(t.$t("breadcrumb.service_list")))])],1)],2),n("Submenu",{attrs:{name:"route"}},[n("template",{slot:"title"},[n("Icon",{attrs:{type:"ios-people"}}),t._v("\n Route\n ")],1),n("router-link",{attrs:{to:"/routes"}},[n("MenuItem",{attrs:{name:"route-list"}},[t._v(t._s(t.$t("breadcrumb.route_list")))])],1)],2),n("Submenu",{attrs:{name:"upstream"}},[n("template",{slot:"title"},[n("Icon",{attrs:{type:"ios-desktop"}}),t._v("\n Upstream\n ")],1),n("router-link",{attrs:{to:"/upstreams"}},[n("MenuItem",{attrs:{name:"upstream-list"}},[t._v(t._s(t.$t("breadcrumb.upstream_list")))])],1)],2),n("Submenu",{attrs:{name:"consumer"}},[n("template",{slot:"title"},[n("Icon",{attrs:{type:"ios-person"}}),t._v("\n Consumer\n ")],1),n("router-link",{attrs:{to:"/consumers"}},[n("MenuItem",{attrs:{name:"consumer-list"}},[t._v(t._s(t.$t("breadcrumb.consumer_list")))])],1)],2),n("Submenu",{attrs:{name:"plugin"}},[n("template",{slot:"title"},[n("Icon",{attrs:{type:"ios-glasses"}}),t._v("\n Plugin\n ")],1),n("router-link",{attrs:{to:"/plugins"}},[n("MenuItem",{attrs:{name:"plugin-list"}},[t._v(t._s(t.$t("breadcrumb.plugin_list")))])],1)],2),n("Submenu",{attrs:{name:"certificate"}},[n("template",{slot:"title"},[n("Icon",{attrs:{type:"ios-key"}}),t._v("\n Certificate\n ")],1),n("router-link",{attrs:{to:"/certificates"}},[n("MenuItem",{attrs:{name:"certificate-list"}},[t._v(t._s(t.$t("breadcrumb.certificate_list")))])],1)],2)],1)],1)],1)},o=[],i=n("81f6"),u={data:function(){return{theme2:"dark",activeName:"",openNames:[]}},mounted:function(){var t=this;i["a"].$on("changePage",(function(e){var n=e.activeName,a=e.openNames;t.activeName=n,t.openNames=a,t.$nextTick((function(){t.$refs.menu&&(t.$refs.menu.updateOpened(),t.$refs.menu.updateActiveName())}))}))},destroyed:function(){i["a"].$off("changePage")}},c=u,l=(n("ce72"),n("2877")),m=Object(l["a"])(c,r,o,!1,null,"48d508d7",null),d=m.exports,p=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("Row",[n("Col",{attrs:{span:"3"}},[n("div",{attrs:{id:"title"}},[t._v("Kong Admin UI")])]),n("Col",{staticClass:"config",attrs:{span:"21"}},[n("div",[n("p",[n("router-link",{attrs:{to:"/config"}},[t._v(t._s(t.address))]),t._v("     "),n("a",{on:{click:t.changeLanguage}},[t._v(t._s(t.language))])],1)])])],1)},f=[],v={name:"Header",data:function(){return{address:"aaa"}},computed:{language:function(){return"zh"===this.$i18n.locale?"English":"Chinese"}},mounted:function(){this.address=localStorage.address},methods:{changeLanguage:function(){"zh"===this.$i18n.locale?this.$i18n.locale="en":this.$i18n.locale="zh",localStorage.language=this.$i18n.locale}}},_=v,g=(n("3f38"),Object(l["a"])(_,p,f,!1,null,"0ab004d4",null)),b=g.exports,h=function(){var t=this,e=t.$createElement;t._self._c;return t._m(0)},k=[function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("p",[n("a",{attrs:{href:"https://github.com/pocketdigi/kong-admin-ui",target:"_blank"}},[n("i",{staticClass:"ivu-icon ivu-icon-logo-github"})])]),n("p",{staticStyle:{"margin-top":"10px","font-size":"0.6rem"}},[t._v("© Kong Admin UI 2019 "),n("span",[n("a",{attrs:{href:"https://www.pocketdigi.com/book/kong/"}},[t._v("Kong中文文档")])])])])}],$={name:"Footer"},I=$,C=(n("ec5c"),Object(l["a"])(I,h,k,!1,null,"ade9bf66",null)),w=C.exports,y={name:"index",methods:{},components:{Menu:d,HeaderComponent:b,FooterComponent:w},mounted:function(){}},S=y,M=(n("1d53"),Object(l["a"])(S,a,s,!1,null,"0e040310",null));e["default"]=M.exports},e9ba:function(t,e,n){},ec5c:function(t,e,n){"use strict";n("e9ba")}}]); 2 | //# sourceMappingURL=chunk-4a8a6705.a6d15ae0.js.map -------------------------------------------------------------------------------- /docs/js/chunk-5ef5ba5e.d3794852.js: -------------------------------------------------------------------------------- 1 | (window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-5ef5ba5e"],{"270a":function(e,r,t){},"7f7f":function(e,r,t){var n=t("86cc").f,s=Function.prototype,o=/^\s*function ([^ (]*)/,a="name";a in s||t("9e1e")&&n(s,a,{configurable:!0,get:function(){try{return(""+this).match(o)[1]}catch(e){return""}}})},a55b:function(e,r,t){"use strict";t.r(r);var n=function(){var e=this,r=e.$createElement,t=e._self._c||r;return t("Row",{attrs:{id:"login"}},[t("Col",{attrs:{span:"8"}},[e._v(" ")]),t("Col",{attrs:{span:"8"}},[t("Card",{attrs:{"dis-hover":""}},[t("p",{attrs:{slot:"title"},slot:"title"},[e._v("Login")]),t("Form",{ref:"formInline",attrs:{model:e.formInline,rules:e.ruleInline}},[t("FormItem",{attrs:{prop:"user"}},[t("Input",{attrs:{type:"text",placeholder:"Username"},model:{value:e.formInline.user,callback:function(r){e.$set(e.formInline,"user",r)},expression:"formInline.user"}},[t("Icon",{attrs:{slot:"prepend",type:"ios-person-outline"},slot:"prepend"})],1)],1),t("FormItem",{attrs:{prop:"password"}},[t("Input",{attrs:{type:"password",placeholder:"Password"},model:{value:e.formInline.password,callback:function(r){e.$set(e.formInline,"password",r)},expression:"formInline.password"}},[t("Icon",{attrs:{slot:"prepend",type:"ios-lock-outline"},slot:"prepend"})],1)],1),t("FormItem",[t("Button",{attrs:{type:"primary"},on:{click:function(r){return e.handleSubmit("formInline")}}},[e._v("Signin")])],1)],1)],1)],1),t("Col",{attrs:{span:"8"}},[e._v(" ")])],1)},s=[],o=(t("7f7f"),{data:function(){return{formInline:{user:"",password:""},ruleInline:{user:[{required:!0,message:"请输入用户名",trigger:"blur"},{min:1,max:20,message:"用户名长度1-20",trigger:"blur"}],password:[{required:!0,message:"请输入密码",trigger:"blur"},{type:"string",min:6,message:"密码不能少于6位",trigger:"blur"}]}}},methods:{handleSubmit:function(e){var r=this;this.$refs[e].validate((function(e){e?r.$Message.success("Success!"):r.$Message.error("Fail!")}))}}}),a=o,i=(t("f2e7"),t("2877")),l=Object(i["a"])(a,n,s,!1,null,"c4e99cfc",null);r["default"]=l.exports},f2e7:function(e,r,t){"use strict";t("270a")}}]); 2 | //# sourceMappingURL=chunk-5ef5ba5e.d3794852.js.map -------------------------------------------------------------------------------- /docs/js/chunk-5ef5ba5e.d3794852.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["webpack:///./node_modules/core-js/modules/es6.function.name.js","webpack:///./src/views/Login.vue?6989","webpack:///src/views/Login.vue","webpack:///./src/views/Login.vue?5da6","webpack:///./src/views/Login.vue?7b2b","webpack:///./src/views/Login.vue?8b3d"],"names":["dP","f","FProto","Function","prototype","nameRE","NAME","configurable","get","this","match","e","render","_vm","_h","$createElement","_c","_self","attrs","_v","slot","ref","formInline","ruleInline","model","value","callback","$$v","$set","expression","on","$event","handleSubmit","staticRenderFns","component"],"mappings":"8HAAA,IAAIA,EAAK,EAAQ,QAAgBC,EAC7BC,EAASC,SAASC,UAClBC,EAAS,wBACTC,EAAO,OAGXA,KAAQJ,GAAU,EAAQ,SAAqBF,EAAGE,EAAQI,EAAM,CAC9DC,cAAc,EACdC,IAAK,WACH,IACE,OAAQ,GAAKC,MAAMC,MAAML,GAAQ,GACjC,MAAOM,GACP,MAAO,Q,yCCZb,IAAIC,EAAS,WAAa,IAAIC,EAAIJ,KAASK,EAAGD,EAAIE,eAAmBC,EAAGH,EAAII,MAAMD,IAAIF,EAAG,OAAOE,EAAG,MAAM,CAACE,MAAM,CAAC,GAAK,UAAU,CAACF,EAAG,MAAM,CAACE,MAAM,CAAC,KAAO,MAAM,CAACL,EAAIM,GAAG,OAAOH,EAAG,MAAM,CAACE,MAAM,CAAC,KAAO,MAAM,CAACF,EAAG,OAAO,CAACE,MAAM,CAAC,YAAY,KAAK,CAACF,EAAG,IAAI,CAACE,MAAM,CAAC,KAAO,SAASE,KAAK,SAAS,CAACP,EAAIM,GAAG,WAAWH,EAAG,OAAO,CAACK,IAAI,aAAaH,MAAM,CAAC,MAAQL,EAAIS,WAAW,MAAQT,EAAIU,aAAa,CAACP,EAAG,WAAW,CAACE,MAAM,CAAC,KAAO,SAAS,CAACF,EAAG,QAAQ,CAACE,MAAM,CAAC,KAAO,OAAO,YAAc,YAAYM,MAAM,CAACC,MAAOZ,EAAIS,WAAe,KAAEI,SAAS,SAAUC,GAAMd,EAAIe,KAAKf,EAAIS,WAAY,OAAQK,IAAME,WAAW,oBAAoB,CAACb,EAAG,OAAO,CAACE,MAAM,CAAC,KAAO,UAAU,KAAO,sBAAsBE,KAAK,aAAa,IAAI,GAAGJ,EAAG,WAAW,CAACE,MAAM,CAAC,KAAO,aAAa,CAACF,EAAG,QAAQ,CAACE,MAAM,CAAC,KAAO,WAAW,YAAc,YAAYM,MAAM,CAACC,MAAOZ,EAAIS,WAAmB,SAAEI,SAAS,SAAUC,GAAMd,EAAIe,KAAKf,EAAIS,WAAY,WAAYK,IAAME,WAAW,wBAAwB,CAACb,EAAG,OAAO,CAACE,MAAM,CAAC,KAAO,UAAU,KAAO,oBAAoBE,KAAK,aAAa,IAAI,GAAGJ,EAAG,WAAW,CAACA,EAAG,SAAS,CAACE,MAAM,CAAC,KAAO,WAAWY,GAAG,CAAC,MAAQ,SAASC,GAAQ,OAAOlB,EAAImB,aAAa,iBAAiB,CAACnB,EAAIM,GAAG,aAAa,IAAI,IAAI,IAAI,GAAGH,EAAG,MAAM,CAACE,MAAM,CAAC,KAAO,MAAM,CAACL,EAAIM,GAAG,QAAQ,IAC5tCc,EAAkB,GC4BtB,G,UAAA,CACE,KADF,WAEI,MAAJ,CACM,WAAN,CACQ,KAAR,GACQ,SAAR,IAEM,WAAN,CACQ,KAAR,CACA,CAAU,UAAV,EAAU,QAAV,SAAU,QAAV,QACA,CAAU,IAAV,EAAU,IAAV,GAAU,QAAV,YAAU,QAAV,SAEQ,SAAR,CACA,CAAU,UAAV,EAAU,QAAV,QAAU,QAAV,QACA,CAAU,KAAV,SAAU,IAAV,EAAU,QAAV,WAAU,QAAV,YAKE,QAAF,CACI,aADJ,SACA,GAAM,IAAN,OACM,KAAN,+BACA,EAEU,EAAV,6BAEU,EAAV,+BCvD+U,I,wBCQ3UC,EAAY,eACd,EACAtB,EACAqB,GACA,EACA,KACA,WACA,MAIa,aAAAC,E,2CCnBf","file":"js/chunk-5ef5ba5e.d3794852.js","sourcesContent":["var dP = require('./_object-dp').f;\nvar FProto = Function.prototype;\nvar nameRE = /^\\s*function ([^ (]*)/;\nvar NAME = 'name';\n\n// 19.2.4.2 name\nNAME in FProto || require('./_descriptors') && dP(FProto, NAME, {\n configurable: true,\n get: function () {\n try {\n return ('' + this).match(nameRE)[1];\n } catch (e) {\n return '';\n }\n }\n});\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('Row',{attrs:{\"id\":\"login\"}},[_c('Col',{attrs:{\"span\":\"8\"}},[_vm._v(\" \")]),_c('Col',{attrs:{\"span\":\"8\"}},[_c('Card',{attrs:{\"dis-hover\":\"\"}},[_c('p',{attrs:{\"slot\":\"title\"},slot:\"title\"},[_vm._v(\"Login\")]),_c('Form',{ref:\"formInline\",attrs:{\"model\":_vm.formInline,\"rules\":_vm.ruleInline}},[_c('FormItem',{attrs:{\"prop\":\"user\"}},[_c('Input',{attrs:{\"type\":\"text\",\"placeholder\":\"Username\"},model:{value:(_vm.formInline.user),callback:function ($$v) {_vm.$set(_vm.formInline, \"user\", $$v)},expression:\"formInline.user\"}},[_c('Icon',{attrs:{\"slot\":\"prepend\",\"type\":\"ios-person-outline\"},slot:\"prepend\"})],1)],1),_c('FormItem',{attrs:{\"prop\":\"password\"}},[_c('Input',{attrs:{\"type\":\"password\",\"placeholder\":\"Password\"},model:{value:(_vm.formInline.password),callback:function ($$v) {_vm.$set(_vm.formInline, \"password\", $$v)},expression:\"formInline.password\"}},[_c('Icon',{attrs:{\"slot\":\"prepend\",\"type\":\"ios-lock-outline\"},slot:\"prepend\"})],1)],1),_c('FormItem',[_c('Button',{attrs:{\"type\":\"primary\"},on:{\"click\":function($event){return _vm.handleSubmit('formInline')}}},[_vm._v(\"Signin\")])],1)],1)],1)],1),_c('Col',{attrs:{\"span\":\"8\"}},[_vm._v(\" \")])],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Login.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Login.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Login.vue?vue&type=template&id=c4e99cfc&scoped=true&\"\nimport script from \"./Login.vue?vue&type=script&lang=js&\"\nexport * from \"./Login.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Login.vue?vue&type=style&index=0&id=c4e99cfc&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"c4e99cfc\",\n null\n \n)\n\nexport default component.exports","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/index.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Login.vue?vue&type=style&index=0&id=c4e99cfc&scoped=true&lang=css&\""],"sourceRoot":""} -------------------------------------------------------------------------------- /docs/js/chunk-72a53978.f14c725c.js: -------------------------------------------------------------------------------- 1 | (window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-72a53978"],{"4c90":function(t,e,s){"use strict";s("9089")},7089:function(t,e,s){"use strict";s.r(e);var r=function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",[s("Breadcrumb",[s("BreadcrumbItem",{attrs:{to:"/"}},[t._v(t._s(t.$t("breadcrumb.home")))]),s("BreadcrumbItem",{attrs:{to:"/services"}},[t._v("Service")]),t.edit?s("BreadcrumbItem",[t._v(t._s(t.serviceId))]):s("BreadcrumbItem",[t._v(t._s(t.$t("breadcrumb.addService")))])],1),s("Form",{staticStyle:{"margin-top":"20px"},attrs:{model:t.formItem,"label-width":120}},[s("FormItem",{attrs:{label:"name:"}},[s("Input",{staticClass:"text_input",attrs:{placeholder:"Enter Service name ..."},model:{value:t.formItem.name,callback:function(e){t.$set(t.formItem,"name",e)},expression:"formItem.name"}}),s("span",{staticClass:"field_desc"},[t._v(t._s(t.$t("service.fieldServiceName")))])],1),s("FormItem",{attrs:{label:"retries:"}},[s("InputNumber",{attrs:{min:1},model:{value:t.formItem.retries,callback:function(e){t.$set(t.formItem,"retries",e)},expression:"formItem.retries"}}),s("span",{staticClass:"field_desc"},[t._v(t._s(t.$t("service.fieldRetries")))])],1),s("FormItem",{attrs:{label:"protocol:"}},[s("RadioGroup",{model:{value:t.formItem.protocol,callback:function(e){t.$set(t.formItem,"protocol",e)},expression:"formItem.protocol"}},[s("Radio",{attrs:{label:"http"}},[t._v("http")]),s("Radio",{attrs:{label:"https"}},[t._v("https")]),s("Radio",{attrs:{label:"grpc"}},[t._v("grpc")]),s("Radio",{attrs:{label:"grpcs"}},[t._v("grpcs")]),s("Radio",{attrs:{label:"tcp"}},[t._v("tcp")]),s("Radio",{attrs:{label:"tls"}},[t._v("tls")]),s("Radio",{attrs:{label:"udp"}},[t._v("udp")])],1),s("span",{staticClass:"field_desc"},[t._v(t._s(t.$t("service.fieldProtocol")))])],1),s("FormItem",{attrs:{label:"host:"}},[s("AutoComplete",{staticStyle:{width:"200px"},attrs:{data:t.upstreamNames,"filter-method":t.filterMethod,placeholder:"Enter host"},model:{value:t.formItem.host,callback:function(e){t.$set(t.formItem,"host",e)},expression:"formItem.host"}}),s("span",{staticClass:"field_desc"},[t._v(t._s(t.$t("service.fieldHost")))])],1),s("FormItem",{attrs:{label:"port:"}},[s("Input",{staticClass:"text_input",attrs:{placeholder:"Enter port",number:""},model:{value:t.formItem.port,callback:function(e){t.$set(t.formItem,"port",e)},expression:"formItem.port"}}),s("span",{staticClass:"field_desc"},[t._v(t._s(t.$t("service.fieldPort")))])],1),s("FormItem",{attrs:{label:"path:"}},[s("Input",{staticClass:"text_input",attrs:{placeholder:"Enter path"},model:{value:t.formItem.path,callback:function(e){t.$set(t.formItem,"path",e)},expression:"formItem.path"}}),s("span",{staticClass:"field_desc"},[t._v(t._s(t.$t("service.fieldPath")))])],1),s("FormItem",{attrs:{label:"connect_timeout:"}},[s("InputNumber",{staticClass:"text_input",model:{value:t.formItem.connect_timeout,callback:function(e){t.$set(t.formItem,"connect_timeout",e)},expression:"formItem.connect_timeout"}}),s("span",{staticClass:"field_desc"},[t._v(t._s(t.$t("service.fieldConnectTimeout")))])],1),s("FormItem",{attrs:{label:"write_timeout:"}},[s("InputNumber",{staticClass:"text_input",model:{value:t.formItem.write_timeout,callback:function(e){t.$set(t.formItem,"write_timeout",e)},expression:"formItem.write_timeout"}}),s("span",{staticClass:"field_desc"},[t._v(t._s(t.$t("service.fieldWriteTimeout")))])],1),s("FormItem",{attrs:{label:"read_timeout:"}},[s("InputNumber",{staticClass:"text_input",model:{value:t.formItem.read_timeout,callback:function(e){t.$set(t.formItem,"read_timeout",e)},expression:"formItem.read_timeout"}}),s("span",{staticClass:"field_desc"},[t._v(t._s(t.$t("service.fieldReadTimeout")))])],1),t.edit?t._e():s("FormItem",{attrs:{label:"url:"}},[s("Input",{staticStyle:{"max-width":"400px"},attrs:{placeholder:"Enter url"},model:{value:t.formItem.url,callback:function(e){t.$set(t.formItem,"url",e)},expression:"formItem.url"}}),s("span",{staticClass:"field_desc"},[t._v(t._s(t.$t("service.fieldUrl")))])],1),s("FormItem",[s("Button",{attrs:{type:"primary"},on:{click:t.saveService}},[t._v("Save")])],1)],1)],1)},a=[],i=(s("7f7f"),{name:"AddService",data:function(){return{formItem:{name:"",retries:5,protocol:"http",host:"",port:80,path:"",connect_timeout:6e3,write_timeout:6e3,read_timeout:6e3,url:""},upstreamNames:[],serviceId:"",edit:!1}},mounted:function(){this.serviceId=this.$route.params.id,this.edit=null!=this.serviceId,this.loadUpstreams(),this.edit&&this.loadService()},methods:{loadUpstreams:function(){this.upstreamNames=[];var t=this;this._get("/upstreams/",(function(e){var s=e.data.data;s.map((function(e){t.upstreamNames.push(e.name)}))}))},filterMethod:function(t,e){return!t||-1!==e.toUpperCase().indexOf(t.toUpperCase())},saveService:function(){var t=this,e=JSON.parse(JSON.stringify(this.formItem));""===e.name&&delete e.name,""===e.host&&delete e.host,""===e.path&&(e.path=null),""===e.url&&delete e.url,this.edit?this._patch("/services/"+this.serviceId,e,(function(){t.$router.go(-1)})):this._post("/services/",e,(function(){t.$router.push("/services")}))},loadService:function(){var t=this;this._get("/services/"+this.serviceId,(function(e){t.formItem=e.data}))}}}),o=i,m=(s("4c90"),s("2877")),l=Object(m["a"])(o,r,a,!1,null,"7423a9ec",null);e["default"]=l.exports},"7f7f":function(t,e,s){var r=s("86cc").f,a=Function.prototype,i=/^\s*function ([^ (]*)/,o="name";o in a||s("9e1e")&&r(a,o,{configurable:!0,get:function(){try{return(""+this).match(i)[1]}catch(t){return""}}})},9089:function(t,e,s){}}]); 2 | //# sourceMappingURL=chunk-72a53978.f14c725c.js.map -------------------------------------------------------------------------------- /docs/js/chunk-c7db06f0.d9755f6f.js: -------------------------------------------------------------------------------- 1 | (window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-c7db06f0"],{"02f4":function(t,e,r){var i=r("4588"),n=r("be13");t.exports=function(t){return function(e,r){var s,c,a=String(n(e)),o=i(r),u=a.length;return o<0||o>=u?t?"":void 0:(s=a.charCodeAt(o),s<55296||s>56319||o+1===u||(c=a.charCodeAt(o+1))<56320||c>57343?t?a.charAt(o):s:t?a.slice(o,o+2):c-56320+(s-55296<<10)+65536)}}},"0390":function(t,e,r){"use strict";var i=r("02f4")(!0);t.exports=function(t,e,r){return e+(r?i(t,e).length:1)}},"0bfb":function(t,e,r){"use strict";var i=r("cb7c");t.exports=function(){var t=i(this),e="";return t.global&&(e+="g"),t.ignoreCase&&(e+="i"),t.multiline&&(e+="m"),t.unicode&&(e+="u"),t.sticky&&(e+="y"),e}},"164d":function(t,e,r){"use strict";r.r(e);var i=function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("div",[r("Breadcrumb",[r("BreadcrumbItem",{attrs:{to:"/"}},[t._v(t._s(t.$t("breadcrumb.home")))]),r("BreadcrumbItem",{attrs:{to:"/certificates"}},[t._v("Certificate")]),t.edit?r("BreadcrumbItem",[t._v(t._s(t.certificateId))]):r("BreadcrumbItem",[t._v(t._s(t.$t("breadcrumb.add_certificate")))])],1),r("Form",{staticStyle:{"margin-top":"20px"},attrs:{model:t.formItem,"label-width":120}},[r("FormItem",{attrs:{label:"cert:"}},[r("Input",{attrs:{type:"textarea",rows:8,placeholder:"cert ..."},model:{value:t.formItem.cert,callback:function(e){t.$set(t.formItem,"cert",e)},expression:"formItem.cert"}}),r("span",{staticClass:"field_desc"},[t._v(t._s(t.$t("certificate.cert")))])],1),r("FormItem",{attrs:{label:"key:"}},[r("Input",{attrs:{type:"textarea",rows:8,placeholder:"key ..."},model:{value:t.formItem.key,callback:function(e){t.$set(t.formItem,"key",e)},expression:"formItem.key"}}),r("span",{staticClass:"field_desc"},[t._v(t._s(t.$t("certificate.key")))])],1),r("FormItem",{attrs:{label:"snis:"}},[r("Input",{staticClass:"text_input",model:{value:t.snis_str,callback:function(e){t.snis_str=e},expression:"snis_str"}}),r("span",{staticClass:"field_desc"},[t._v(t._s(t.$t("certificate.snis")))])],1),r("FormItem",{attrs:{label:"tags:"}},[r("Input",{staticClass:"text_input",model:{value:t.tags_str,callback:function(e){t.tags_str=e},expression:"tags_str"}}),r("span",{staticClass:"field_desc"},[t._v(t._s(t.$t("certificate.tags")))])],1),r("FormItem",[r("Button",{attrs:{type:"primary"},on:{click:t.saveCertificates}},[t._v(t._s(t.$t("common.save")))])],1)],1)],1)},n=[],s=(r("28a5"),{name:"AddCertificate",data:function(){return{formItem:{cert:"",key:"",snis:[],tags:[]},certificateId:"",edit:!1}},mounted:function(){this.certificateId=this.$route.params.certificateId,this.edit=null!=this.certificateId,this.edit&&this.loadCertificate()},methods:{saveCertificates:function(){var t=this;""===this.formItem.cert&&delete this.formItem.cert,""===this.formItem.tags&&delete this.formItem.tags,this.edit?this._patch("/certificates/"+this.certificateId,this.formItem,(function(){t.$router.go(-1)})):this._post("/certificates/",this.formItem,(function(){t.$router.go(-1)}))},loadCertificate:function(){var t=this,e=this;this._get("/certificates/"+this.certificateId,(function(r){e.formItem=r.data,null==t.formItem.snis&&(t.formItem.snis=[]),t.snis_str=t.formItem.snis.join(","),null==t.formItem.tags&&(t.formItem.tags=[]),t.tags_str=t.formItem.tags.join(",")}))}},computed:{snis_str:{get:function(){return this.formItem.snis.length>0?this.formItem.snis.join(","):""},set:function(t){this.formItem.snis=t?t.split(","):[]}},tags_str:{get:function(){return this.formItem.tags.length>0?this.formItem.tags.join(","):""},set:function(t){this.formItem.tags=t?t.split(","):[]}}}}),c=s,a=(r("db0c"),r("2877")),o=Object(a["a"])(c,i,n,!1,null,"d09fcf9c",null);e["default"]=o.exports},"214f":function(t,e,r){"use strict";r("b0c5");var i=r("2aba"),n=r("32e9"),s=r("79e5"),c=r("be13"),a=r("2b4c"),o=r("520a"),u=a("species"),l=!s((function(){var t=/./;return t.exec=function(){var t=[];return t.groups={a:"7"},t},"7"!=="".replace(t,"$")})),f=function(){var t=/(?:)/,e=t.exec;t.exec=function(){return e.apply(this,arguments)};var r="ab".split(t);return 2===r.length&&"a"===r[0]&&"b"===r[1]}();t.exports=function(t,e,r){var m=a(t),d=!s((function(){var e={};return e[m]=function(){return 7},7!=""[t](e)})),p=d?!s((function(){var e=!1,r=/a/;return r.exec=function(){return e=!0,null},"split"===t&&(r.constructor={},r.constructor[u]=function(){return r}),r[m](""),!e})):void 0;if(!d||!p||"replace"===t&&!l||"split"===t&&!f){var h=/./[m],v=r(c,m,""[t],(function(t,e,r,i,n){return e.exec===o?d&&!n?{done:!0,value:h.call(e,r,i)}:{done:!0,value:t.call(r,e,i)}:{done:!1}})),g=v[0],b=v[1];i(String.prototype,t,g),n(RegExp.prototype,m,2==e?function(t,e){return b.call(t,this,e)}:function(t){return b.call(t,this)})}}},"28a5":function(t,e,r){"use strict";var i=r("aae3"),n=r("cb7c"),s=r("ebd6"),c=r("0390"),a=r("9def"),o=r("5f1b"),u=r("520a"),l=r("79e5"),f=Math.min,m=[].push,d="split",p="length",h="lastIndex",v=4294967295,g=!l((function(){RegExp(v,"y")}));r("214f")("split",2,(function(t,e,r,l){var b;return b="c"=="abbc"[d](/(b)*/)[1]||4!="test"[d](/(?:)/,-1)[p]||2!="ab"[d](/(?:ab)*/)[p]||4!="."[d](/(.?)(.?)/)[p]||"."[d](/()()/)[p]>1||""[d](/.?/)[p]?function(t,e){var n=String(this);if(void 0===t&&0===e)return[];if(!i(t))return r.call(n,t,e);var s,c,a,o=[],l=(t.ignoreCase?"i":"")+(t.multiline?"m":"")+(t.unicode?"u":"")+(t.sticky?"y":""),f=0,d=void 0===e?v:e>>>0,g=new RegExp(t.source,l+"g");while(s=u.call(g,n)){if(c=g[h],c>f&&(o.push(n.slice(f,s.index)),s[p]>1&&s.index=d))break;g[h]===s.index&&g[h]++}return f===n[p]?!a&&g.test("")||o.push(""):o.push(n.slice(f)),o[p]>d?o.slice(0,d):o}:"0"[d](void 0,0)[p]?function(t,e){return void 0===t&&0===e?[]:r.call(this,t,e)}:r,[function(r,i){var n=t(this),s=void 0==r?void 0:r[e];return void 0!==s?s.call(r,n,i):b.call(String(n),r,i)},function(t,e){var i=l(b,t,this,e,b!==r);if(i.done)return i.value;var u=n(t),m=String(this),d=s(u,RegExp),p=u.unicode,h=(u.ignoreCase?"i":"")+(u.multiline?"m":"")+(u.unicode?"u":"")+(g?"y":"g"),I=new d(g?u:"^(?:"+u.source+")",h),x=void 0===e?v:e>>>0;if(0===x)return[];if(0===m.length)return null===o(I,m)?[m]:[];var _=0,y=0,k=[];while(y1&&s.call(c[0],r,(function(){for(l=1;l=l?t?"":void 0:(i=s.charCodeAt(c),i<55296||i>56319||c+1===l||(a=s.charCodeAt(c+1))<56320||a>57343?t?s.charAt(c):i:t?s.slice(c,c+2):a-56320+(i-55296<<10)+65536)}}},"0390":function(t,e,r){"use strict";var n=r("02f4")(!0);t.exports=function(t,e,r){return e+(r?n(t,e).length:1)}},"0bfb":function(t,e,r){"use strict";var n=r("cb7c");t.exports=function(){var t=n(this),e="";return t.global&&(e+="g"),t.ignoreCase&&(e+="i"),t.multiline&&(e+="m"),t.unicode&&(e+="u"),t.sticky&&(e+="y"),e}},1071:function(t,e,r){"use strict";r.r(e);var n=function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("div",[r("h1",{staticStyle:{"margin-top":"100px"}},[t._v(t._s(t.$t("app.name")))]),r("Row",{attrs:{id:"config"}},[r("Col",{attrs:{span:"6"}},[t._v(" ")]),r("Col",{attrs:{span:"12"}},[r("Form",{ref:"form",attrs:{model:t.formItem,"label-width":280,rules:t.ruleCustom}},[r("FormItem",{attrs:{label:"Kong Admin Api url:",prop:"address"}},[r("Input",{attrs:{placeholder:"http://192.168.0.200:8001"},model:{value:t.formItem.address,callback:function(e){t.$set(t.formItem,"address",e)},expression:"formItem.address"}})],1),r("FormItem",{attrs:{label:"Custom Headers:",prop:"headers"}},[r("Input",{attrs:{placeholder:'{"Authorization":"Basic YWRtaW46YWRtaW4="}'},model:{value:t.formItem.headers,callback:function(e){t.$set(t.formItem,"headers",e)},expression:"formItem.headers"}})],1)],1),r("Button",{attrs:{type:"primary"},on:{click:t.test}},[t._v(t._s(t.$t("config.button.enter")))]),t._v(" \n "),r("Button",{attrs:{type:"success"},on:{click:t.clear}},[t._v(t._s(t.$t("config.button.clear")))])],1),r("Col",{attrs:{span:"6"}},[t._v(" ")])],1),r("div",{staticClass:"notice"},[r("p",[t._v(t._s(t.$t("config.button.notice1")))]),r("p",[t._v(t._s(t.$t("config.button.notice2")))])]),t._m(0),r("a",{staticStyle:{position:"absolute",top:"20px",right:"20px",border:"0"},on:{click:t.changeLanguage}},[t._v(t._s(t.language))])],1)},o=[function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("a",{attrs:{href:"https://github.com/pocketdigi/kong-admin-ui"}},[r("img",{staticStyle:{position:"absolute",top:"0",left:"0",border:"0"},attrs:{src:"https://s3.amazonaws.com/github/ribbons/forkme_left_green_007200.png",alt:"Fork me on GitHub"}})])}],i=(r("28a5"),r("aef6"),r("f559"),r("bc3a")),a=r.n(i),s={data:function(){var t=this,e=function(e,r,n){if(r){if(!r.startsWith("http://")&&!r.startsWith("https://"))return void n(new Error(t.$t("config.error.urlError")));if(r.endsWith("/"))return n(new Error(t.$t("config.error.urlEndWithSlash"))),void(t.formItem.address=t.formItem.address.substr(0,t.formItem.address.length-1));n()}else n(new Error(t.$t("config.error.urlEmpty")))},r=function(e,r,n){if(r)try{var o=JSON.parse(r);console.log(o),n()}catch(i){n(new Error(t.$t("config.error.header_format")))}else n()};return{formItem:{address:"",headers:""},ruleCustom:{address:[{validator:e,trigger:"blur"}],headers:[{validator:r,trigger:"blur"}]}}},mounted:function(){this.formItem.address=localStorage.address,this.formItem.headers=localStorage.headers},methods:{saveConfig:function(){console.log(this.formItem),localStorage.address=this.formItem.address,localStorage.headers!==this.formItem.headers&&(localStorage.headers=this.formItem.headers),this.$router.push("/")},test:function(){var t=this,e=this;this.$refs.form.validate((function(r){if(r){var n={};t.formItem.headers&&(n.headers=JSON.parse(t.formItem.headers)),console.log(n),a.a.get(t.formItem.address,n).then((function(e){var r=e.data,n=r.version;null==n&&t.$Message.error({content:t.$t("config.error.apiError"),duration:10});var o=n.split(".");3===o.length&&(o[0]>0||o[1]>=14)?t.saveConfig():t.versionNotSupport(n)})).catch((function(){e.$Message.error({content:e.$t("config.error.connectFail"),duration:10})}))}else t.$Message.error(t.$t("config.error.urlInvalid"))}))},versionNotSupport:function(t){this.$Message.error({content:this.$t("config.error.versionNotSupport",{version:t}),duration:10})},clear:function(){localStorage.removeItem("address"),this.formItem.address=""},changeLanguage:function(){"zh"===this.$i18n.locale?this.$i18n.locale="en":this.$i18n.locale="zh",localStorage.language=this.$i18n.locale}},computed:{language:function(){return"zh"===this.$i18n.locale?"English":"Chinese"}}},c=s,l=(r("d9e6"),r("2877")),u=Object(l["a"])(c,n,o,!1,null,"f8be8600",null);e["default"]=u.exports},"214f":function(t,e,r){"use strict";r("b0c5");var n=r("2aba"),o=r("32e9"),i=r("79e5"),a=r("be13"),s=r("2b4c"),c=r("520a"),l=s("species"),u=!i((function(){var t=/./;return t.exec=function(){var t=[];return t.groups={a:"7"},t},"7"!=="".replace(t,"$")})),f=function(){var t=/(?:)/,e=t.exec;t.exec=function(){return e.apply(this,arguments)};var r="ab".split(t);return 2===r.length&&"a"===r[0]&&"b"===r[1]}();t.exports=function(t,e,r){var d=s(t),h=!i((function(){var e={};return e[d]=function(){return 7},7!=""[t](e)})),g=h?!i((function(){var e=!1,r=/a/;return r.exec=function(){return e=!0,null},"split"===t&&(r.constructor={},r.constructor[l]=function(){return r}),r[d](""),!e})):void 0;if(!h||!g||"replace"===t&&!u||"split"===t&&!f){var p=/./[d],v=r(a,d,""[t],(function(t,e,r,n,o){return e.exec===c?h&&!o?{done:!0,value:p.call(e,r,n)}:{done:!0,value:t.call(r,e,n)}:{done:!1}})),m=v[0],b=v[1];n(String.prototype,t,m),o(RegExp.prototype,d,2==e?function(t,e){return b.call(t,this,e)}:function(t){return b.call(t,this)})}}},"28a5":function(t,e,r){"use strict";var n=r("aae3"),o=r("cb7c"),i=r("ebd6"),a=r("0390"),s=r("9def"),c=r("5f1b"),l=r("520a"),u=r("79e5"),f=Math.min,d=[].push,h="split",g="length",p="lastIndex",v=4294967295,m=!u((function(){RegExp(v,"y")}));r("214f")("split",2,(function(t,e,r,u){var b;return b="c"=="abbc"[h](/(b)*/)[1]||4!="test"[h](/(?:)/,-1)[g]||2!="ab"[h](/(?:ab)*/)[g]||4!="."[h](/(.?)(.?)/)[g]||"."[h](/()()/)[g]>1||""[h](/.?/)[g]?function(t,e){var o=String(this);if(void 0===t&&0===e)return[];if(!n(t))return r.call(o,t,e);var i,a,s,c=[],u=(t.ignoreCase?"i":"")+(t.multiline?"m":"")+(t.unicode?"u":"")+(t.sticky?"y":""),f=0,h=void 0===e?v:e>>>0,m=new RegExp(t.source,u+"g");while(i=l.call(m,o)){if(a=m[p],a>f&&(c.push(o.slice(f,i.index)),i[g]>1&&i.index=h))break;m[p]===i.index&&m[p]++}return f===o[g]?!s&&m.test("")||c.push(""):c.push(o.slice(f)),c[g]>h?c.slice(0,h):c}:"0"[h](void 0,0)[g]?function(t,e){return void 0===t&&0===e?[]:r.call(this,t,e)}:r,[function(r,n){var o=t(this),i=void 0==r?void 0:r[e];return void 0!==i?i.call(r,o,n):b.call(String(o),r,n)},function(t,e){var n=u(b,t,this,e,b!==r);if(n.done)return n.value;var l=o(t),d=String(this),h=i(l,RegExp),g=l.unicode,p=(l.ignoreCase?"i":"")+(l.multiline?"m":"")+(l.unicode?"u":"")+(m?"y":"g"),x=new h(m?l:"^(?:"+l.source+")",p),I=void 0===e?v:e>>>0;if(0===I)return[];if(0===d.length)return null===c(x,d)?[d]:[];var $=0,y=0,S=[];while(y1&&i.call(a[0],r,(function(){for(u=1;u1?arguments[1]:void 0,n=o(e.length),c=void 0===r?n:Math.min(o(r),n),l=String(t);return s?s.call(e,l,c):e.slice(c-l.length,c)===l}})},b0c5:function(t,e,r){"use strict";var n=r("520a");r("5ca1")({target:"RegExp",proto:!0,forced:n!==/./.exec},{exec:n})},d2c8:function(t,e,r){var n=r("aae3"),o=r("be13");t.exports=function(t,e,r){if(n(e))throw TypeError("String#"+r+" doesn't accept regex!");return String(o(t))}},d9e6:function(t,e,r){"use strict";r("4849")},f559:function(t,e,r){"use strict";var n=r("5ca1"),o=r("9def"),i=r("d2c8"),a="startsWith",s=""[a];n(n.P+n.F*r("5147")(a),"String",{startsWith:function(t){var e=i(this,t,a),r=o(Math.min(arguments.length>1?arguments[1]:void 0,e.length)),n=String(t);return s?s.call(e,n,r):e.slice(r,r+n.length)===n}})}}]); 2 | //# sourceMappingURL=chunk-fa6692d8.4e496869.js.map -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "kong-admin-ui", 3 | "version": "0.3.0", 4 | "private": true, 5 | "scripts": { 6 | "serve": "vue-cli-service serve", 7 | "serve-test": "vue-cli-service serve --mode test", 8 | "build": "vue-cli-service build", 9 | "lint": "vue-cli-service lint" 10 | }, 11 | "dependencies": { 12 | "axios": ">=0.21.1", 13 | "highlight.js": ">=10.4.1", 14 | "iview": "^3.2.1", 15 | "moment": "^2.23.0", 16 | "vue": "^2.5.21", 17 | "vue-i18n": "6.1.3", 18 | "vue-router": "^3.0.2" 19 | }, 20 | "devDependencies": { 21 | "@vue/cli-plugin-babel": "^3.2.0", 22 | "@vue/cli-plugin-eslint": "^3.2.0", 23 | "@vue/cli-service": "^3.2.0", 24 | "babel-eslint": "^10.0.1", 25 | "eslint": "^5.8.0", 26 | "eslint-plugin-vue": "^5.0.0-0", 27 | "vue-cli-plugin-iview": "^1.0.6", 28 | "vue-template-compiler": "^2.5.17" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | autoprefixer: {} 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocketdigi/kong-admin-ui/13c15764dea23e05fae3a73332669b36d7d144d8/public/favicon.ico -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Kong admin ui 9 | 10 | 11 | 14 |
15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 16 | -------------------------------------------------------------------------------- /src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocketdigi/kong-admin-ui/13c15764dea23e05fae3a73332669b36d7d144d8/src/assets/logo.png -------------------------------------------------------------------------------- /src/components/Footer.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 13 | 14 | 19 | -------------------------------------------------------------------------------- /src/components/Header.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 39 | 40 | 62 | -------------------------------------------------------------------------------- /src/components/HelloWorld.vue: -------------------------------------------------------------------------------- 1 | 32 | 33 | 41 | 42 | 43 | 59 | -------------------------------------------------------------------------------- /src/components/Menu.vue: -------------------------------------------------------------------------------- 1 | 74 | 102 | 103 | 112 | -------------------------------------------------------------------------------- /src/components/consumers/ACLConfigTable.vue: -------------------------------------------------------------------------------- 1 | 34 | 35 | 106 | 107 | 112 | -------------------------------------------------------------------------------- /src/components/consumers/BasicAuthConfigTable.vue: -------------------------------------------------------------------------------- 1 | 36 | 37 | 119 | 120 | 125 | -------------------------------------------------------------------------------- /src/components/consumers/ConsumerTable.vue: -------------------------------------------------------------------------------- 1 | 17 | 72 | 73 | 75 | -------------------------------------------------------------------------------- /src/components/consumers/HMACAuthConfigTable.vue: -------------------------------------------------------------------------------- 1 | 36 | 37 | 119 | 120 | 125 | -------------------------------------------------------------------------------- /src/components/consumers/JWTConfigTable.vue: -------------------------------------------------------------------------------- 1 | 45 | 46 | 157 | 158 | 163 | -------------------------------------------------------------------------------- /src/components/consumers/KeyAuthConfigTable.vue: -------------------------------------------------------------------------------- 1 | 33 | 34 | 132 | 133 | 138 | -------------------------------------------------------------------------------- /src/components/consumers/OAuth2ConfigTable.vue: -------------------------------------------------------------------------------- 1 | 42 | 43 | 150 | 151 | 156 | -------------------------------------------------------------------------------- /src/components/plugins/PluginTable.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 115 | 116 | 119 | -------------------------------------------------------------------------------- /src/components/services/RouteTable.vue: -------------------------------------------------------------------------------- 1 | 19 | 98 | 99 | 101 | -------------------------------------------------------------------------------- /src/components/services/TargetTable.vue: -------------------------------------------------------------------------------- 1 | 37 | 182 | 183 | 188 | -------------------------------------------------------------------------------- /src/event-bus.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | 3 | export default new Vue() 4 | -------------------------------------------------------------------------------- /src/lang/en.js: -------------------------------------------------------------------------------- 1 | export default { 2 | app:{ 3 | name:'Kong Admin UI' 4 | }, 5 | config:{ 6 | button:{ 7 | enter:'Enter', 8 | clear:'Clear address', 9 | notice1:'This app will not connect other servers except your kong admin api.Your kong admin api address is save in browser\'s localstorage, so it\'s safety to manage your kong.', 10 | notice2:'All requests to Kong admin api is send by your browser,so make sure your device can access Kong admin api without any security auth.', 11 | custom_header:'Custom headers(json)' 12 | }, 13 | error:{ 14 | urlEmpty:'Please enter your Kong admin api url', 15 | urlError:'url error,must start with http:// or https://', 16 | urlEndWithSlash:'url error,cant\'t end with /', 17 | apiError:'Can\'t get your Kong\'s version,please check the address you input', 18 | connectFail:'Failed to connect with your kong admin api,please check the address you input,or your computer has no permission to visit the admin api', 19 | urlInvalid:'Kong admin api url error', 20 | versionNotSupport:'Version {version} is not support,We only support 0.14.0 and higher', 21 | header_format:'Header format error,must be json', 22 | connect_fail:'Failed to connect with your kong admin api,please check the address you input,or your computer has no permission to visit the admin api' 23 | } 24 | }, 25 | common: { 26 | view: 'View', 27 | delete: 'Delete', 28 | deleteMessage: '

Are you sure you would like to delete<

{id}?

', 29 | deleted:'{type} deleted', 30 | edit:'Edit', 31 | add:'Add', 32 | save:'Save', 33 | addTarget:'Add Target', 34 | action:'Action', 35 | split_by_comma:'Split by comma' 36 | 37 | }, 38 | breadcrumb:{ 39 | home:'Home', 40 | info:'Kong info', 41 | service_list:'Service List', 42 | service_detail: 'Service Detail', 43 | route_list:'Route List', 44 | upstream_list:'Upstream List', 45 | consumer_list:'Consumer List', 46 | plugin_list:'Plugin List', 47 | addPlugin:'Add Plugin', 48 | addService: 'Add Service', 49 | addRoute: 'Add Route', 50 | certificate_list: 'Certificate List', 51 | add_certificate: 'Add Certificate', 52 | }, 53 | basicInfo:{ 54 | configuration:'Configuration', 55 | status:'Status' 56 | }, 57 | service: { 58 | 59 | serviceInfo:'Service Info', 60 | routeInfo:'Route Info', 61 | service_upstream:'Service\'s Upstream', 62 | upstreamNotExisted:'Upstream `{host}` is not existed,if it\'s not a external host,You must add a Upstream named `{host}`', 63 | fieldServiceName:'The Service name', 64 | fieldRetries:'The number of retries to execute upon failure to proxy.', 65 | fieldProtocol:'The protocol used to communicate with the upstream.', 66 | fieldHost:'The host of the upstream server.', 67 | fieldPort:'The upstream server port.', 68 | fieldPath:'The path to be used in requests to the upstream server.', 69 | fieldConnectTimeout:'The timeout in milliseconds for establishing a connection to the upstream server. ', 70 | fieldWriteTimeout:'The timeout in milliseconds between two successive write operations for transmitting a request to the upstream server.', 71 | fieldReadTimeout:'The timeout in milliseconds between two successive read operations for transmitting a request to the upstream server. ', 72 | fieldUrl:'Shorthand attribute to set protocol, host, port and path at once. This attribute is write-only (the Admin API never “returns” the url). ', 73 | }, 74 | target:{ 75 | addTarget:'Add Target', 76 | targetHint:'enter target,default port is 8000', 77 | targetNotice:'Please fill target', 78 | weightNotice:'Please fill weight', 79 | deleteTarget:'Delete Target' 80 | }, 81 | plugin:{ 82 | }, 83 | upstream:{ 84 | health:'health', 85 | healthCheck:'Health check', 86 | unhealthy:'unhealthy', 87 | healthy:'healthy', 88 | healthCheckOff:'Health check off' 89 | }, 90 | route: { 91 | fieldName: 'The name of the Route.', 92 | fieldProtocols: 'A list of the protocols this Route should allow. When set to ["https"], HTTP requests are answered with a request to upgrade to HTTPS.', 93 | fieldMethods: 'A list of HTTP methods that match this Route. When using http or https protocols, at least one of hosts, paths, or methods must be set.', 94 | fieldHosts: 'A list of domain names that match this Route. When using http or https protocols, at least one of hosts, paths, or methods must be set.', 95 | fieldPaths: 'A list of paths that match this Route. When using http or https protocols, at least one of hosts, paths, or methods must be set.', 96 | fieldHeaders: 'One or more lists of values indexed by header name that will cause this Route to match if present in the request. The Host header cannot be used with this attribute: hosts should be specified using the hosts attribute.', 97 | fieldRegexPriority: 'A number used to choose which route resolves a given request when several routes match it using regexes simultaneously. When two routes match the path and have the same regex_priority, the older one (lowest created_at) is used. Note that the priority for non-regex routes is different (longer non-regex routes are matched before shorter ones).', 98 | fieldHttpsRedirectStatusCode: 'The status code Kong responds with when all properties of a Route match except the protocol i.e. if the protocol of the request is HTTP instead of HTTPS. Location header is injected by Kong if the field is set to 301, 302, 307 or 308. Defaults to 426.', 99 | fieldStripPath: 'When matching a Route via one of the paths, strip the matching prefix from the upstream request URL.', 100 | fieldPreserveHost: 'When matching a Route via one of the hosts domain names, use the request Host header in the upstream request headers. If set to false, the upstream Host header will be that of the Service’s host.', 101 | fieldSnis: 'A list of SNIs that match this Route when using stream routing. When using tcp or tls protocols, at least one of snis, sources, or destinations must be set.', 102 | fieldSources: 'A list of IP sources of incoming connections that match this Route when using stream routing. Each entry is an object with fields “ip” (optionally in CIDR range notation) and/or “port”. When using tcp or tls protocols, at least one of snis, sources, or destinations must be set.', 103 | fieldDestinations: 'A list of IP destinations of incoming connections that match this Route when using stream routing. Each entry is an object with fields “ip” (optionally in CIDR range notation) and/or “port”. When using tcp or tls protocols, at least one of snis, sources, or destinations must be set.', 104 | }, 105 | certificate: { 106 | cert: 'PEM-encoded public certificate of the SSL key pair.', 107 | key:'PEM-encoded private key of the SSL key pair.', 108 | tags:'An optional set of strings associated with the Certificate, for grouping and filtering.', 109 | snis:'An array of zero or more hostnames to associate with this certificate as SNIs. This is a sugar parameter that will, under the hood, create an SNI object and associate it with this certificate for your convenience.' 110 | } 111 | } 112 | -------------------------------------------------------------------------------- /src/lang/zh.js: -------------------------------------------------------------------------------- 1 | export default { 2 | app: { 3 | name: 'Kong管理控制台' 4 | }, 5 | config: { 6 | button: { 7 | enter: '进入', 8 | clear: '清除地址', 9 | notice1: '我们不会连接除了您的Kong服务器以外的其他服务器,您的配置保存在浏览器的localStorage里.', 10 | notice2: '所有发送给Kong管理接口的请求都是通过你的浏览器发出的,所以确保当前网络可以无需任何验证直接访问Kong管理接口。这个应用的目的是帮助您图形化操作kong,所以,所有Kong里的名词字段都不会翻译,请自行看文档理解。', 11 | }, 12 | error: { 13 | urlEmpty: '请输入Kong管理接口地址', 14 | urlError: 'URL错误,必须是http:// 或 https://开头', 15 | urlEndWithSlash: 'URL错误,不能以/结尾 ', 16 | apiError: '无法获取Kong的版本号,请检查您输入的接口地址', 17 | connectFail: '连接管理接口失败,请检测您输入的地址,或者您的网络没有权限访问管理接口', 18 | urlInvalid: 'Kong管理接口地址错误', 19 | versionNotSupport: '不支持 {version} 版本,我们只支持 0.14.0或更高版本', 20 | header_format:'header 格式错误,必须是json', 21 | connect_fail:'连接到Kong admin 接口失败,请检查您的输入,确保当前设备有权限访问接口' 22 | 23 | } 24 | }, 25 | common: { 26 | view: '查看', 27 | delete: '删除', 28 | deleteMessage: '

是否删除

{id}?

', 29 | deleted:'{type} 已删除', 30 | edit:'编辑', 31 | add:'添加', 32 | save:'保存', 33 | addTarget:'添加Target', 34 | action:'操作', 35 | split_by_comma:'逗号隔开' 36 | }, 37 | breadcrumb: { 38 | home: '首页', 39 | info: '基本信息', 40 | service_list: 'Service列表', 41 | service_detail: 'Service详情', 42 | route_list: 'Route列表', 43 | upstream_list: 'Upstream列表', 44 | consumer_list: 'Consumer列表', 45 | plugin_list: 'Plugin列表', 46 | addPlugin:'添加 Plugin', 47 | addService: '添加Service', 48 | addRoute: '添加Route', 49 | certificate_list: '证书列表', 50 | add_certificate: '添加证书', 51 | }, 52 | basicInfo: { 53 | configuration: '配置', 54 | status: '状态' 55 | }, 56 | service: { 57 | serviceInfo:'Service信息', 58 | routeInfo:'Route信息', 59 | service_upstream:'Service的Upstream', 60 | upstreamNotExisted:'名为`{host}`的上游服务器不存在,如果不是外部host,您需要添加一个叫{host}的上游服务器', 61 | fieldServiceName:'Service名称', 62 | fieldRetries:'失败时重试次数.', 63 | fieldProtocol:'与上游服务器通讯使用的协议', 64 | fieldHost:'上游服务器的主机名(外部填域名).', 65 | fieldPort:'上游服务器端口.', 66 | fieldPath:'请求上游服务器的路径.', 67 | fieldConnectTimeout:'连接上游服务器的超时时间,单位:毫秒', 68 | fieldWriteTimeout:'向上游服务器发送写操作的超时时间,单位:毫秒.', 69 | fieldReadTimeout:'从上游服务器读的超时时间,单位:毫秒', 70 | fieldUrl:'一次同时设置protocol, host, port 和 path. 该属性只读', 71 | 72 | 73 | }, 74 | target:{ 75 | addTarget:'添加Target', 76 | targetHint:'输入target,默认端口是8000', 77 | targetNotice:'请输入target', 78 | weightNotice:'请输入weight', 79 | deleteTarget:'删除Target' 80 | }, 81 | plugin:{ 82 | }, 83 | upstream:{ 84 | health:'健康', 85 | healthCheck:'健康检测', 86 | unhealthy:'不健康', 87 | healthy:'健康', 88 | healthCheckOff:'健康检测未开启' 89 | }, 90 | route: { 91 | fieldName: 'Route名称', 92 | fieldProtocols: '该Route允许的协议.', 93 | fieldMethods: '该Route允许的HTTP 方法列表.使用http或https 协议时, hosts, paths, 或者 methods至少设置一个', 94 | fieldHosts: '该Route允许的域名列表。使用http或https 协议时, hosts, paths, 或者 methods至少设置一个', 95 | fieldPaths: '该Route允许的路径列表。 使用http或https 协议时, hosts, paths, 或者 methods至少设置一个.', 96 | fieldHeaders: '该Route允许的请求头。Host 请求头不能通过此属性设置,请使用hosts属性', 97 | fieldRegexPriority: '权重。当多个Route同时使用正则表达式匹配时,用于选择哪个Route解析给定请求。当两条路path配路径并具有相同的regex_priority时,将使用最早创建的path。请注意,非正则表达式路由的优先级不同(较长的非正则表达式Route在较短的Route之前匹配)', 98 | fieldHttpsRedirectStatusCode: '重定向到https的状态码。当除了协议以外的属性全都匹配时(用http而不是https协议发起请求),如果该字段值是301、302、307或308,则Kong会添加Location Header,执行重定向到https。默认为426。注: 要使重定向生效,需要关闭http协议访问。', 99 | fieldStripPath: '当通过path匹配Route,向上游服务器请求时,删除匹配前缀(不带path).', 100 | fieldPreserveHost: '当通过域名配置,向上游服务请求时,header是否使用该域名,若选否,使用Service的host', 101 | fieldSnis: 'A list of SNIs that match this Route when using stream routing. When using tcp or tls protocols, at least one of snis, sources, or destinations must be set.', 102 | fieldSources: 'A list of IP sources of incoming connections that match this Route when using stream routing. Each entry is an object with fields “ip” (optionally in CIDR range notation) and/or “port”. When using tcp or tls protocols, at least one of snis, sources, or destinations must be set.', 103 | fieldDestinations: 'A list of IP destinations of incoming connections that match this Route when using stream routing. Each entry is an object with fields “ip” (optionally in CIDR range notation) and/or “port”. When using tcp or tls protocols, at least one of snis, sources, or destinations must be set.', 104 | }, 105 | certificate: { 106 | cert: 'PEM编码的SSL证书公钥.一般以.crt为后缀,复制里面的内容。', 107 | key:'PEM编码的SSL证书私钥.一般以.key为后缀,复制里面的内容。', 108 | tags:'用于分组和过滤,多个逗号隔开', 109 | snis:'证书的域名,多个逗号隔开' 110 | } 111 | } 112 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import App from './App.vue' 3 | import './plugins/iview.js' 4 | import router from './router' 5 | import request from './request' 6 | import iView from 'iview'; 7 | import VueI18n from 'vue-i18n'; 8 | import iViewEn from 'iview/dist/locale/en-US'; 9 | import iViewZh from 'iview/dist/locale/zh-CN'; 10 | import {default as en} from './lang/en.js' 11 | import {default as zh} from './lang/zh.js' 12 | 13 | // Vue.use(VueI18n); 14 | // Vue.use(iView); 15 | // 16 | // Vue.config.lang = 'en-US'; 17 | // Vue.locale('en-US', en); 18 | // Vue.locale('zh-CN', zh); 19 | // 20 | // Vue.config.productionTip = true; 21 | // Vue.use(request); 22 | // 23 | // new Vue({ 24 | // render: h => h(App), 25 | // router:router 26 | // }).$mount('#app'); 27 | 28 | Vue.use(request); 29 | 30 | Vue.use(VueI18n); 31 | Vue.use(iView, { 32 | i18n: function(path, options) { 33 | let value = i18n.t(path, options) 34 | if (value !== null && value !== undefined) { 35 | return value 36 | } 37 | return '' 38 | } 39 | }); 40 | Vue.locale = () => {}; 41 | 42 | const messages = { 43 | en: Object.assign(en, iViewEn), 44 | zh: Object.assign(zh, iViewZh) 45 | }; 46 | 47 | // Create VueI18n instance with options 48 | const i18n = new VueI18n({ 49 | locale: localStorage.language==null?'en':localStorage.language, // set locale 50 | messages // set locale messages 51 | }); 52 | iView.i18n((key, value) => i18n.t(key, value)) 53 | new Vue({ 54 | i18n, 55 | render: h => h(App), 56 | router:router 57 | }).$mount('#app'); 58 | -------------------------------------------------------------------------------- /src/plugins/iview.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import iView from 'iview' 3 | 4 | Vue.use(iView) 5 | 6 | import 'iview/dist/styles/iview.css' 7 | -------------------------------------------------------------------------------- /src/request.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | export default { 3 | install: function(Vue,) { 4 | Vue.prototype._post= function (path,data,callback) { 5 | let _this=this; 6 | let checkResult = checkAddress(_this); 7 | if(!checkResult) { 8 | return; 9 | } 10 | let address=localStorage.address; 11 | 12 | axios 13 | .post(address + path, data,getConfig()) 14 | .then(response => { 15 | callback(response); 16 | }) 17 | .catch(function (error) { 18 | errorHandler(error,_this); 19 | }); 20 | }; 21 | Vue.prototype._get= function (path,callback,errorCallback) { 22 | let _this=this; 23 | let checkResult = checkAddress(_this); 24 | if(!checkResult) { 25 | return; 26 | } 27 | let address=localStorage.address; 28 | axios 29 | .get(address + path,getConfig()) 30 | .then(response => { 31 | callback(response); 32 | }) 33 | .catch(function (error) { 34 | if(errorCallback!=null) { 35 | errorCallback(error) 36 | }else{ 37 | errorHandler(error,_this); 38 | } 39 | }); 40 | }; 41 | Vue.prototype._delete = function (path,callback,errorCallback) { 42 | let _this=this; 43 | let checkResult = checkAddress(_this); 44 | if(!checkResult) { 45 | return; 46 | } 47 | let address=localStorage.address; 48 | axios.delete(address + path,getConfig()) 49 | .then(response => { 50 | callback(response); 51 | }) 52 | .catch(function (error) { 53 | if(errorCallback!=null) { 54 | errorCallback(error) 55 | }else{ 56 | errorHandler(error,_this); 57 | } 58 | }); 59 | 60 | }; 61 | Vue.prototype._patch = function (path, data, callback) { 62 | let _this=this; 63 | let checkResult = checkAddress(_this); 64 | if(!checkResult) { 65 | return; 66 | } 67 | let address=localStorage.address; 68 | axios 69 | .patch(address + path, data,getConfig()) 70 | .then(response => { 71 | callback(response); 72 | }) 73 | .catch(function (error) { 74 | errorHandler(error,_this); 75 | }); 76 | }; 77 | function checkAddress(_this) { 78 | let address=localStorage.address; 79 | if(address==null) { 80 | _this.$router.push('/config'); 81 | return false; 82 | } 83 | return true; 84 | } 85 | function errorHandler(error,_this) { 86 | if(error.response&&error.response.status!==404) { 87 | _this.$Message.error({content: error.response.data.message, duration: 5}); 88 | }else{ 89 | console.log(error); 90 | _this.$Message.error({content: 'Failed to connect with your kong admin api,please check the address you input,or your computer has no permission to visit the admin api', duration: 10}); 91 | _this.$router.push('/config'); 92 | } 93 | } 94 | 95 | function getConfig() { 96 | let config={}; 97 | if(localStorage.headers==='null') { 98 | localStorage.removeItem('headers'); 99 | return config; 100 | } 101 | if(localStorage.headers) { 102 | try{ 103 | config.headers=JSON.parse(localStorage.headers); 104 | }catch (e) { 105 | localStorage.removeItem('headers'); 106 | } 107 | 108 | } 109 | return config; 110 | } 111 | } 112 | } 113 | -------------------------------------------------------------------------------- /src/router.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Router from 'vue-router' 3 | 4 | Vue.use(Router) 5 | 6 | export default new Router({ 7 | routes: [ 8 | { 9 | path: '/login', 10 | name: 'login', 11 | component: () => import('./views/Login'), 12 | }, 13 | { 14 | path: '/config', 15 | name: 'config', 16 | component: () => import('./views/Config.vue'), 17 | }, 18 | { 19 | path: '/', 20 | component: () => import('./views/Index'), 21 | children: [ 22 | 23 | { 24 | path:'services', 25 | component: () => import('./views/services/ServiceList.vue'), 26 | }, 27 | { 28 | path:'services/add', 29 | component: () => import('./views/services/AddService'), 30 | }, 31 | { 32 | path:'services/edit/:id', 33 | component: () => import('./views/services/AddService'), 34 | 35 | }, 36 | { 37 | path:'services/:id', 38 | component: () => import('./views/services/ServiceDetail'), 39 | 40 | }, 41 | { 42 | path:'routes', 43 | component: () => import('./views/routes/RouteList'), 44 | 45 | }, 46 | { 47 | path:'routes/add', 48 | component: () => import('./views/routes/AddRoute'), 49 | 50 | }, 51 | { 52 | path:'routes/edit/:id', 53 | component: () => import('./views/routes/AddRoute'), 54 | 55 | }, 56 | { 57 | path:'routes/add/:serviceId', 58 | component: () => import('./views/routes/AddRoute'), 59 | 60 | }, 61 | { 62 | path:'upstreams', 63 | component: () => import('./views/upstreams/UpstreamList'), 64 | 65 | }, 66 | { 67 | path:'upstreams/add', 68 | component: () => import('./views/upstreams/AddUpstream'), 69 | 70 | }, 71 | { 72 | path:'upstreams/edit/:id', 73 | component: () => import('./views/upstreams/AddUpstream'), 74 | 75 | }, 76 | { 77 | path:'upstreams/add/:name', 78 | component: () => import('./views/upstreams/AddUpstream'), 79 | 80 | }, 81 | { 82 | path:'consumers', 83 | component: () => import('./views/consumers/ConsumerList'), 84 | }, 85 | { 86 | path:'consumers/add', 87 | component: () => import('./views/consumers/AddConsumer'), 88 | }, 89 | { 90 | path:'consumers/edit/:id', 91 | component: () => import('./views/consumers/AddConsumer'), 92 | }, 93 | { 94 | path:'plugins', 95 | component: () => import('./views/plugins/PluginList'), 96 | 97 | }, 98 | { 99 | path:'plugins/add', 100 | component: () => import('./views/plugins/AddPlugin'), 101 | }, 102 | { 103 | path:'plugins/add/service/:serviceId', 104 | component: () => import('./views/plugins/AddPlugin'), 105 | }, 106 | { 107 | path:'plugins/add/consumer/:consumerId', 108 | component: () => import('./views/plugins/AddPlugin'), 109 | }, 110 | { 111 | path:'plugins/edit/:pluginId', 112 | component: () => import('./views/plugins/AddPlugin'), 113 | }, 114 | { 115 | path:'certificates', 116 | component: () => import('./views/certificates/CertificateList'), 117 | 118 | }, 119 | { 120 | path:'certificates/add', 121 | component: () => import('./views/certificates/AddCertificate'), 122 | }, 123 | { 124 | path:'certificates/edit/:certificateId', 125 | component: () => import('./views/certificates/AddCertificate'), 126 | }, 127 | { 128 | path:'', 129 | component: () => import('./views/BasicInfo'), 130 | }, 131 | 132 | ] 133 | } 134 | ] 135 | }) 136 | 137 | -------------------------------------------------------------------------------- /src/views/BasicInfo.vue: -------------------------------------------------------------------------------- 1 | 40 | 41 | 82 | 83 | 96 | -------------------------------------------------------------------------------- /src/views/Config.vue: -------------------------------------------------------------------------------- 1 | 32 | 33 | 168 | 169 | 183 | -------------------------------------------------------------------------------- /src/views/Index.vue: -------------------------------------------------------------------------------- 1 | 21 | 40 | 46 | -------------------------------------------------------------------------------- /src/views/Login.vue: -------------------------------------------------------------------------------- 1 | 28 | 29 | 63 | 64 | 72 | -------------------------------------------------------------------------------- /src/views/certificates/AddCertificate.vue: -------------------------------------------------------------------------------- 1 | 37 | 132 | 145 | -------------------------------------------------------------------------------- /src/views/certificates/CertificateList.vue: -------------------------------------------------------------------------------- 1 | 37 | 38 | 136 | 137 | 144 | -------------------------------------------------------------------------------- /src/views/consumers/AddConsumer.vue: -------------------------------------------------------------------------------- 1 | 44 | 45 | 133 | 134 | 150 | -------------------------------------------------------------------------------- /src/views/consumers/ConsumerList.vue: -------------------------------------------------------------------------------- 1 | 24 | 25 | 86 | 87 | 88 | 99 | -------------------------------------------------------------------------------- /src/views/plugins/PluginList.vue: -------------------------------------------------------------------------------- 1 | 24 | 25 | 104 | 105 | 108 | -------------------------------------------------------------------------------- /src/views/routes/RouteList.vue: -------------------------------------------------------------------------------- 1 | 24 | 25 | 86 | 87 | 88 | 99 | -------------------------------------------------------------------------------- /src/views/services/AddService.vue: -------------------------------------------------------------------------------- 1 | 72 | 157 | 165 | -------------------------------------------------------------------------------- /src/views/services/ServiceList.vue: -------------------------------------------------------------------------------- 1 | 34 | 35 | 159 | 160 | 171 | -------------------------------------------------------------------------------- /src/views/upstreams/UpstreamList.vue: -------------------------------------------------------------------------------- 1 | 38 | 39 | 151 | 152 | 159 | -------------------------------------------------------------------------------- /vue.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | publicPath: process.env.NODE_ENV === 'production'? '/' : '/' 3 | } 4 | --------------------------------------------------------------------------------