From 5f4ff8d336df710afb45dc83372a6fd43c7f5214 Mon Sep 17 00:00:00 2001
From: zanehy
Date: Wed, 1 Mar 2023 16:18:27 +0800
Subject: [PATCH] feat: release 0.6.1 version (#58)
* docs: add LICENSE
* change: delete old framework
* feature: init new arco design framework
* feature: adjust the main frame of the project page
* feature: service list filtering and service name modification
* feat: add service publishing function
* feat: add new and modified services
* feat: add service operation form verification
* feat: navigation dynamic selection
* feat: plugin architecture development
* feat: plugin configuration addition, modification and switch function development
* feat: plugin configuration delete function development
* feat: add all supported plugin templates
* feat: dynamic menu function development
* feat: add request loading progress bar
* feat: development build package generation directory
* change: modify the packaged static file directory
* feat: Add route management page
* feat: Optimize new routing functions
* feat: Improve routing management function
* feat: Add ssl management page
* change: Delete useless code
* feat: Added jwt-auth/key-auth/limit-req/limit-conn/limit-count plug-in support
* feat: develop upstream list view
* feat: develop upstream list view
* feat: develop upstream release and delete function
* change: edit list page
* feat: Added mock plug-in support
* feat: delete debug code
* feat: develop upstream add and update
* change: modify the dynamic increase or decrease of service domains
* feat: update mock plugin bug
* feat: develop upstream add and edit function
* feat: develop upstream add and edit function
* upgrade upstream node rules
* feat: update plugin bug
* feat: update router upstream bug
* change: upgrade service to router params
* change: upgrade service to router params
* change: service information transmission when upgrading and adding routes
* change: upgrade service data in routes
* change: upgrade ssl warn
* feat: update mock plugin schema content
* change: upgrade routing method style
* change: adjust plugin style
* change: upgrade plugin list collapse effect
* change: upgrade plugin list collapse effect
* change: optimize plugin list and form validation
* change: upgrade style compatible resolution
* feat: upgrade the verification rules of the route
* docs: update readme
* docs: added change log
---------
Co-authored-by: wuxiaochen
Co-authored-by: blust
---
.browserslistrc | 3 -
.env | 8 +-
.env.development | 4 +
.eslintrc.js | 14 -
.gitignore | 34 +-
.jshintrc | 3 -
CHANGELOG.md | 77 +-
CHANGELOG_CN.md | 24 +
ISSUE_TEMPLATE.md | 13 -
README.md | 69 +-
README_CN.md | 70 +-
babel.config.js | 6 +-
jsconfig.json | 19 +
package.json | 81 +-
postcss.config.js | 5 -
public/index.html | 32 +-
src/App.vue | 4 +-
src/api/ApiCertificate.js | 59 -
src/api/ApiClusterNode.js | 35 -
src/api/ApiPlugIn.js | 103 --
src/api/ApiRouter.js | 107 --
src/api/ApiService.js | 88 --
src/api/ApiUser.js | 26 -
src/api/index.js | 7 +
src/api/plugin.js | 26 +
src/api/pluginConfig.js | 240 ++++
src/api/router.js | 148 +++
src/api/service.js | 130 ++
src/api/ssl.js | 85 ++
src/api/upstream.js | 142 +++
src/api/user.js | 41 +
.../{scss/common.scss => css/common.css} | 39 +-
src/assets/font/iconfont.css | 76 +-
src/assets/font/iconfont.js | 2 +-
src/assets/font/iconfont.json | 14 +
src/assets/font/iconfont.ttf | Bin 31336 -> 31832 bytes
src/assets/font/iconfont.woff | Bin 13980 -> 14272 bytes
src/assets/font/iconfont.woff2 | Bin 12364 -> 12632 bytes
src/assets/img/apioak-logo-err-404.png | Bin 0 -> 244931 bytes
src/assets/img/apioak-logo-no-text.png | Bin 0 -> 215849 bytes
src/assets/img/faces/marc.jpg | Bin 54633 -> 0 bytes
src/assets/img/favicon.png | Bin 4014 -> 0 bytes
src/assets/img/{login.jpg => index.jpg} | Bin
src/assets/img/logo.png | Bin 456828 -> 215849 bytes
src/assets/img/mask.png | Bin 756 -> 0 bytes
src/assets/img/new_logo.png | Bin 3557 -> 0 bytes
src/assets/img/sidebar-1.jpg | Bin 343270 -> 0 bytes
src/assets/img/sidebar-2.jpg | Bin 239551 -> 0 bytes
src/assets/img/sidebar-3.jpg | Bin 510294 -> 0 bytes
src/assets/img/sidebar-4.jpg | Bin 423768 -> 0 bytes
src/assets/img/tim_80x80.png | Bin 4821 -> 0 bytes
src/assets/img/vue-logo.png | Bin 4178 -> 0 bytes
src/assets/logo.png | Bin 0 -> 6849 bytes
src/assets/scss/material-dashboard.scss | 49 -
src/assets/scss/md/_alerts.scss | 95 --
src/assets/scss/md/_buttons.scss | 234 ----
src/assets/scss/md/_cards.scss | 382 ------
src/assets/scss/md/_chartist.scss | 254 ----
src/assets/scss/md/_checkboxes.scss | 49 -
src/assets/scss/md/_colors.scss | 339 -----
src/assets/scss/md/_dialogs.scss | 99 --
src/assets/scss/md/_dropdown.scss | 141 ---
src/assets/scss/md/_fixed-plugin.scss | 358 ------
src/assets/scss/md/_footers.scss | 56 -
src/assets/scss/md/_forms.scss | 58 -
src/assets/scss/md/_inputs-size.scss | 223 ----
src/assets/scss/md/_inputs.scss | 478 -------
src/assets/scss/md/_layout.scss | 73 --
src/assets/scss/md/_misc.scss | 155 ---
src/assets/scss/md/_mixins.scss | 319 -----
src/assets/scss/md/_navbars.scss | 320 -----
src/assets/scss/md/_pagination.scss | 92 --
src/assets/scss/md/_pills.scss | 117 --
src/assets/scss/md/_popups.scss | 56 -
src/assets/scss/md/_responsive.scss | 572 ---------
src/assets/scss/md/_ripples.scss | 40 -
src/assets/scss/md/_shadows.scss | 138 --
.../scss/md/_sidebar-and-main-panel.scss | 342 -----
src/assets/scss/md/_tables.scss | 65 -
src/assets/scss/md/_tabs.scss | 71 --
src/assets/scss/md/_togglebutton.scss | 87 --
src/assets/scss/md/_typography.scss | 76 --
src/assets/scss/md/_variables.scss | 1127 -----------------
src/assets/scss/md/mixins/_chartist.scss | 89 --
src/assets/scss/md/mixins/_transparency.scss | 20 -
.../scss/md/mixins/_vendor-prefixes.scss | 176 ---
.../scss/md/plugins/_perfect-scrollbar.scss | 113 --
src/components/404.vue | 15 +
src/components/Cards/ChartCard.vue | 96 --
src/components/Cards/NavTabsCard.vue | 13 -
src/components/Cards/StatsCard.vue | 26 -
src/components/Common/Drawer.vue | 165 ---
src/components/Common/ListHeader.vue | 73 --
src/components/Common/Pager.vue | 347 -----
src/components/Dialog/Dialog.vue | 72 --
src/components/Dialog/index.js | 38 -
src/components/Dropdown.vue | 45 -
src/components/HelloWorld.vue | 58 +
.../NotificationPlugin/Notification.vue | 134 --
.../NotificationPlugin/Notifications.vue | 52 -
src/components/NotificationPlugin/index.js | 69 -
src/components/SidebarPlugin/SideBar.vue | 97 --
src/components/SidebarPlugin/SidebarLink.vue | 53 -
src/components/SidebarPlugin/index.js | 31 -
src/components/Tables/NavTabsTable.vue | 51 -
src/components/Tables/OrderedTable.vue | 60 -
src/components/Tables/SimpleTable.vue | 67 -
src/components/index.js | 18 -
src/filters/index.js | 79 --
src/globalComponents.js | 13 -
src/globalDirectives.js | 13 -
src/hooks/common.js | 36 +
src/hooks/index.js | 4 +
src/hooks/plugin.js | 64 +
src/{pages/index.js => hooks/service.js} | 0
src/hooks/upstream.js | 13 +
src/layouts/error404.vue | 38 +
src/layouts/layout.vue | 158 +++
src/libs/axios.js | 35 -
src/libs/http.js | 92 --
src/main.js | 80 +-
src/material-dashboard.js | 20 -
src/pages/Certificate.vue | 265 ----
src/pages/Certificate/Modify.vue | 193 ---
src/pages/ClusterNode.vue | 207 ---
src/pages/Layout/Content.vue | 20 -
src/pages/Layout/ContentFooter.vue | 32 -
src/pages/Layout/DashboardLayout.vue | 64 -
src/pages/Layout/MobileMenu.vue | 31 -
src/pages/Layout/TopNavbar.vue | 77 --
src/pages/Login.vue | 158 ---
src/pages/Plugin.vue | 204 ---
src/pages/Plugin/List.vue | 773 -----------
src/pages/Plugin/Modify.vue | 166 ---
src/pages/Register.vue | 203 ---
src/pages/Router.vue | 502 --------
src/pages/Router/Modify.vue | 483 -------
src/pages/Service/Modify.vue | 210 ---
src/pages/Services.vue | 462 -------
src/router/index.js | 85 ++
src/routes/routes.js | 63 -
src/schema/common.js | 13 +
src/schema/index.js | 12 +
src/schema/plugins/cors.js | 18 +
src/schema/plugins/jwtAuth.js | 6 +
src/schema/plugins/keyAuth.js | 6 +
src/schema/plugins/limitConn.js | 19 +
src/schema/plugins/limitCount.js | 21 +
src/schema/plugins/limitReq.js | 21 +
src/schema/plugins/mock.js | 24 +
src/schema/router.js | 17 +
src/schema/service.js | 12 +
src/schema/ssl.js | 7 +
src/schema/upstream.js | 22 +
src/schema/user.js | 16 +
src/store/index.js | 60 +-
src/store/modules/params.js | 21 +
src/store/modules/user.js | 26 +
src/utils/requestAxios.js | 60 +
src/utils/time.js | 35 +
src/views/plugin/components/cors.vue | 192 +++
src/views/plugin/components/err404.vue | 41 +
src/views/plugin/components/jwtAuth.vue | 152 +++
src/views/plugin/components/keyAuth.vue | 152 +++
src/views/plugin/components/limitConn.vue | 190 +++
src/views/plugin/components/limitCount.vue | 172 +++
src/views/plugin/components/limitReq.vue | 171 +++
src/views/plugin/components/mock.vue | 286 +++++
src/views/plugin/index.vue | 442 +++++++
src/views/router/index.vue | 738 +++++++++++
src/views/router/operate.vue | 235 ++++
src/views/services/index.vue | 647 ++++++++++
src/views/services/operate.vue | 196 +++
src/views/ssl/index.vue | 375 ++++++
src/views/ssl/operate.vue | 129 ++
src/views/upstream/index.vue | 559 ++++++++
src/views/upstream/operate.vue | 258 ++++
src/views/user/login.vue | 131 ++
src/views/user/register.vue | 145 +++
vue.config.js | 43 +-
180 files changed, 7243 insertions(+), 13547 deletions(-)
delete mode 100644 .browserslistrc
create mode 100644 .env.development
delete mode 100644 .eslintrc.js
delete mode 100644 .jshintrc
create mode 100644 CHANGELOG_CN.md
delete mode 100644 ISSUE_TEMPLATE.md
create mode 100644 jsconfig.json
delete mode 100644 postcss.config.js
delete mode 100644 src/api/ApiCertificate.js
delete mode 100644 src/api/ApiClusterNode.js
delete mode 100644 src/api/ApiPlugIn.js
delete mode 100644 src/api/ApiRouter.js
delete mode 100644 src/api/ApiService.js
delete mode 100644 src/api/ApiUser.js
create mode 100644 src/api/index.js
create mode 100644 src/api/plugin.js
create mode 100644 src/api/pluginConfig.js
create mode 100644 src/api/router.js
create mode 100644 src/api/service.js
create mode 100644 src/api/ssl.js
create mode 100644 src/api/upstream.js
create mode 100644 src/api/user.js
rename src/assets/{scss/common.scss => css/common.css} (78%)
create mode 100644 src/assets/img/apioak-logo-err-404.png
create mode 100644 src/assets/img/apioak-logo-no-text.png
delete mode 100644 src/assets/img/faces/marc.jpg
delete mode 100644 src/assets/img/favicon.png
rename src/assets/img/{login.jpg => index.jpg} (100%)
delete mode 100644 src/assets/img/mask.png
delete mode 100644 src/assets/img/new_logo.png
delete mode 100644 src/assets/img/sidebar-1.jpg
delete mode 100644 src/assets/img/sidebar-2.jpg
delete mode 100644 src/assets/img/sidebar-3.jpg
delete mode 100644 src/assets/img/sidebar-4.jpg
delete mode 100644 src/assets/img/tim_80x80.png
delete mode 100644 src/assets/img/vue-logo.png
create mode 100644 src/assets/logo.png
delete mode 100644 src/assets/scss/material-dashboard.scss
delete mode 100644 src/assets/scss/md/_alerts.scss
delete mode 100644 src/assets/scss/md/_buttons.scss
delete mode 100644 src/assets/scss/md/_cards.scss
delete mode 100644 src/assets/scss/md/_chartist.scss
delete mode 100644 src/assets/scss/md/_checkboxes.scss
delete mode 100644 src/assets/scss/md/_colors.scss
delete mode 100644 src/assets/scss/md/_dialogs.scss
delete mode 100644 src/assets/scss/md/_dropdown.scss
delete mode 100644 src/assets/scss/md/_fixed-plugin.scss
delete mode 100644 src/assets/scss/md/_footers.scss
delete mode 100644 src/assets/scss/md/_forms.scss
delete mode 100644 src/assets/scss/md/_inputs-size.scss
delete mode 100644 src/assets/scss/md/_inputs.scss
delete mode 100644 src/assets/scss/md/_layout.scss
delete mode 100644 src/assets/scss/md/_misc.scss
delete mode 100644 src/assets/scss/md/_mixins.scss
delete mode 100644 src/assets/scss/md/_navbars.scss
delete mode 100644 src/assets/scss/md/_pagination.scss
delete mode 100644 src/assets/scss/md/_pills.scss
delete mode 100644 src/assets/scss/md/_popups.scss
delete mode 100644 src/assets/scss/md/_responsive.scss
delete mode 100644 src/assets/scss/md/_ripples.scss
delete mode 100644 src/assets/scss/md/_shadows.scss
delete mode 100644 src/assets/scss/md/_sidebar-and-main-panel.scss
delete mode 100644 src/assets/scss/md/_tables.scss
delete mode 100644 src/assets/scss/md/_tabs.scss
delete mode 100644 src/assets/scss/md/_togglebutton.scss
delete mode 100644 src/assets/scss/md/_typography.scss
delete mode 100644 src/assets/scss/md/_variables.scss
delete mode 100644 src/assets/scss/md/mixins/_chartist.scss
delete mode 100644 src/assets/scss/md/mixins/_transparency.scss
delete mode 100644 src/assets/scss/md/mixins/_vendor-prefixes.scss
delete mode 100644 src/assets/scss/md/plugins/_perfect-scrollbar.scss
create mode 100644 src/components/404.vue
delete mode 100644 src/components/Cards/ChartCard.vue
delete mode 100644 src/components/Cards/NavTabsCard.vue
delete mode 100644 src/components/Cards/StatsCard.vue
delete mode 100644 src/components/Common/Drawer.vue
delete mode 100644 src/components/Common/ListHeader.vue
delete mode 100644 src/components/Common/Pager.vue
delete mode 100644 src/components/Dialog/Dialog.vue
delete mode 100644 src/components/Dialog/index.js
delete mode 100644 src/components/Dropdown.vue
create mode 100644 src/components/HelloWorld.vue
delete mode 100644 src/components/NotificationPlugin/Notification.vue
delete mode 100644 src/components/NotificationPlugin/Notifications.vue
delete mode 100644 src/components/NotificationPlugin/index.js
delete mode 100644 src/components/SidebarPlugin/SideBar.vue
delete mode 100644 src/components/SidebarPlugin/SidebarLink.vue
delete mode 100644 src/components/SidebarPlugin/index.js
delete mode 100644 src/components/Tables/NavTabsTable.vue
delete mode 100644 src/components/Tables/OrderedTable.vue
delete mode 100644 src/components/Tables/SimpleTable.vue
delete mode 100644 src/components/index.js
delete mode 100644 src/filters/index.js
delete mode 100644 src/globalComponents.js
delete mode 100644 src/globalDirectives.js
create mode 100644 src/hooks/common.js
create mode 100644 src/hooks/index.js
create mode 100644 src/hooks/plugin.js
rename src/{pages/index.js => hooks/service.js} (100%)
create mode 100644 src/hooks/upstream.js
create mode 100644 src/layouts/error404.vue
create mode 100644 src/layouts/layout.vue
delete mode 100644 src/libs/axios.js
delete mode 100644 src/libs/http.js
delete mode 100644 src/material-dashboard.js
delete mode 100644 src/pages/Certificate.vue
delete mode 100644 src/pages/Certificate/Modify.vue
delete mode 100644 src/pages/ClusterNode.vue
delete mode 100644 src/pages/Layout/Content.vue
delete mode 100644 src/pages/Layout/ContentFooter.vue
delete mode 100644 src/pages/Layout/DashboardLayout.vue
delete mode 100644 src/pages/Layout/MobileMenu.vue
delete mode 100644 src/pages/Layout/TopNavbar.vue
delete mode 100644 src/pages/Login.vue
delete mode 100644 src/pages/Plugin.vue
delete mode 100644 src/pages/Plugin/List.vue
delete mode 100644 src/pages/Plugin/Modify.vue
delete mode 100644 src/pages/Register.vue
delete mode 100644 src/pages/Router.vue
delete mode 100644 src/pages/Router/Modify.vue
delete mode 100644 src/pages/Service/Modify.vue
delete mode 100644 src/pages/Services.vue
create mode 100644 src/router/index.js
delete mode 100644 src/routes/routes.js
create mode 100644 src/schema/common.js
create mode 100644 src/schema/index.js
create mode 100644 src/schema/plugins/cors.js
create mode 100644 src/schema/plugins/jwtAuth.js
create mode 100644 src/schema/plugins/keyAuth.js
create mode 100644 src/schema/plugins/limitConn.js
create mode 100644 src/schema/plugins/limitCount.js
create mode 100644 src/schema/plugins/limitReq.js
create mode 100644 src/schema/plugins/mock.js
create mode 100644 src/schema/router.js
create mode 100644 src/schema/service.js
create mode 100644 src/schema/ssl.js
create mode 100644 src/schema/upstream.js
create mode 100644 src/schema/user.js
create mode 100644 src/store/modules/params.js
create mode 100644 src/store/modules/user.js
create mode 100644 src/utils/requestAxios.js
create mode 100644 src/utils/time.js
create mode 100644 src/views/plugin/components/cors.vue
create mode 100644 src/views/plugin/components/err404.vue
create mode 100644 src/views/plugin/components/jwtAuth.vue
create mode 100644 src/views/plugin/components/keyAuth.vue
create mode 100644 src/views/plugin/components/limitConn.vue
create mode 100644 src/views/plugin/components/limitCount.vue
create mode 100644 src/views/plugin/components/limitReq.vue
create mode 100644 src/views/plugin/components/mock.vue
create mode 100644 src/views/plugin/index.vue
create mode 100644 src/views/router/index.vue
create mode 100644 src/views/router/operate.vue
create mode 100644 src/views/services/index.vue
create mode 100644 src/views/services/operate.vue
create mode 100644 src/views/ssl/index.vue
create mode 100644 src/views/ssl/operate.vue
create mode 100644 src/views/upstream/index.vue
create mode 100644 src/views/upstream/operate.vue
create mode 100644 src/views/user/login.vue
create mode 100644 src/views/user/register.vue
diff --git a/.browserslistrc b/.browserslistrc
deleted file mode 100644
index 9dee646..0000000
--- a/.browserslistrc
+++ /dev/null
@@ -1,3 +0,0 @@
-> 1%
-last 2 versions
-not ie <= 8
diff --git a/.env b/.env
index b2be1d7..e748dc7 100644
--- a/.env
+++ b/.env
@@ -1,2 +1,6 @@
-NODE_ENV=local
-VUE_APP_ROOT="http://0.0.0.0:3000"
+NODE_ENV=
+VUE_APP_PREVIEW=true
+VUE_APP_API_BASE_URL=/api
+VUE_APP_ROOT=
+
+
diff --git a/.env.development b/.env.development
new file mode 100644
index 0000000..6fee498
--- /dev/null
+++ b/.env.development
@@ -0,0 +1,4 @@
+NODE_ENV=development
+VUE_APP_PREVIEW=true
+VUE_APP_API_BASE_URL=/api
+VUE_APP_ROOT=http://0.0.0.0:3000
diff --git a/.eslintrc.js b/.eslintrc.js
deleted file mode 100644
index 9b10e0c..0000000
--- a/.eslintrc.js
+++ /dev/null
@@ -1,14 +0,0 @@
-module.exports = {
- root: true,
- env: {
- node: true,
- },
- extends: ["plugin:vue/essential", "@vue/prettier"],
- rules: {
- "no-console": process.env.NODE_ENV === "production" ? "error" : "off",
- "no-debugger": process.env.NODE_ENV === "production" ? "error" : "off",
- },
- parserOptions: {
- parser: "babel-eslint",
- },
-};
diff --git a/.gitignore b/.gitignore
index 7e69124..30b6988 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,8 +1,28 @@
-.env
-.idea/
-node_modules/
-dist/
-package-lock.json
-/docs
+**/.DS_Store
+node_modules
/dist
-**/.DS_Store
\ No newline at end of file
+/static
+/html
+package-lock.json
+npminstall-debug.log
+
+
+# local env files
+.env.local
+.env.*.local
+.env.development
+
+# Log files
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/.jshintrc b/.jshintrc
deleted file mode 100644
index 5db9558..0000000
--- a/.jshintrc
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "esversion": 6
-}
diff --git a/CHANGELOG.md b/CHANGELOG.md
index c8844f6..73ee25d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,53 +1,24 @@
-# Change Log
-
-## [1.5.0] 2021-10-08
-### Dependencies Updates
-- Updated all out of date dependencies from `package.json` file
-
-## [1.4.0] 2020-03-12
-### Dependencies Updates
-- Updated all out of date dependencies from `package.json` file
-- Add `API_KEY` file
-- Add new structure for google maps plugin
-
-## [1.3.2] 2019-12-13
-### Dependencies Updates
-- Updated all out of date dependencies from `package.json` file
-- The version is now `v1.3.2` to have the same versioning line with the PRO version of this product
-
-## [1.2.1] 2019-06-14
-### Dependencies Updates, Vue Material Update
-- Updated all out of date dependencies from `package.json` file
-- The framework `Vuematerial.io` was updated to the latest beta version `1.0.0-beta-11`
-
-## [1.2.0] 2019-04-30
-### Dependencies Updates
-- Updated all out of date dependencies from `package.json` file
-
-## [1.1.0] 2019-02-08
-### Dependencies Updates, Improvements
-- Updated all out of date dependencies from `package.json` file
-- Removed all `to=""` and replaced with `href=""` props from non router-link components for avoid this error `[Vue warn]: Error in render: "TypeError: Cannot read property 'options' of undefined"`
-- Changed links from footer
-
-## [1.0.3] 2018-11-26
-### Bug Fixing
-- Fixed error `[Vue warn]: Error in render: "TypeError: Cannot read property 'options' of undefined"`
-
-## [1.0.2] 2018-11-19
-### Plugin Updates, BugFixing
-- Updated all `dependencies` and `devDependencies` to the latest versions
-- Cleaned `package.json` file
-- Removed all lint warnings and errors
-- Github issues fixed
-- Other bug fixes
-
-## [1.0.1] 2018-07-13
-### BugFixing and Updates
-- updated all the npm packages
-- scroll issue on mobile devices fixed
-- added button `Upgrade to PRO` in the sidebar
-- another small bug fixes
-
-## [1.0.0] 2018-05-03
-- Initial Release
+## 0.6.1
+> Released on 2023.03.01
+
+#### Feature
+
+- Restructure the main design architecture and technical framework of the entire project.
+- Refactor the display form of the drawer display.
+- Refactor the way plugins are developed and designed.
+- Added upstream pool configuration function module.
+- Added route self-selection and associated upstream function.
+
+
+#### Change
+
+- Front-end framework changed from ```Vue Material``` to ```ant-design-vue```
+- ```Vue``` version changed from ```2.X``` to ```3.X```
+- Upgrade all form parameter validation rules.
+- Upgrade all page presentation styles.
+
+
+#### Document
+
+- Added change log documents, `CHANGELOG.md` and `CHANGELOG_CN.md`.
+- Update documentation in `README.md`.
\ No newline at end of file
diff --git a/CHANGELOG_CN.md b/CHANGELOG_CN.md
new file mode 100644
index 0000000..e70890e
--- /dev/null
+++ b/CHANGELOG_CN.md
@@ -0,0 +1,24 @@
+## 0.6.1
+> 发布于 2023.03.01
+
+#### 功能
+
+- 重构整个项目的设计主架构和技术框架。
+- 重构抽屉展现的展现形式。
+- 重构插件的开发设计方式。
+- 新增上游池配置功能模块。
+- 新增路由自助选择关联上游功能。
+
+
+#### 变更
+
+- 前端框架由 ```Vue Material``` 变更为 ```ant-design-vue```
+- ```Vue``` 版本由 ```2.X``` 变更为 ```3.X```
+- 升级所有表单参数校验规则。
+- 升级所有页面展现样式。
+
+
+#### 文档
+
+- 新增变更记录文档,`CHANGELOG.md` 和 `CHANGELOG_CN.md`。
+- 更新 `README.md` 的文档说明。
diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md
deleted file mode 100644
index 4235f95..0000000
--- a/ISSUE_TEMPLATE.md
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
diff --git a/README.md b/README.md
index 683b30c..cbf5fcd 100644
--- a/README.md
+++ b/README.md
@@ -3,21 +3,34 @@
+
-
+
+
-
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
[简体中文](README_CN.md) | [English](README.md)
## Introduction
-`apioak-dashboard` is the control plane of `apioak` gateway, based on Vue and Vue Material development, the project cooperates with the back-end project of the control surface apioak-admin.
+`apioak-dashboard` is the control plane of `apioak` gateway, based on Vue 3.x 、ant-design-vue 3.x、npm 6.14.13 development, the project cooperates with the back-end project of the control surface apioak-admin.
## Quick start
Download code from Github
@@ -34,7 +47,7 @@ cnpm install
### Start the development environment
```
-npm run dev
+npm run serve
```
### Edit static files in production environment
@@ -47,35 +60,31 @@ See [Configuration Reference](https://cli.vuejs.org/config/).
## Project directory structure
```
-apioak-dashboard/
+apioak-dashboard
├── public
└── src
├── api
├── assets
- │ ├── font
- │ ├── img
- │ │ └── faces
- │ └── scss
- │ └── md
- │ ├── mixins
- │ └── plugins
+ │ ├── css
+ │ ├── font
+ │ └── img
├── components
- │ ├── Cards
- │ ├── Common
- │ ├── Dialog
- │ ├── NotificationPlugin
- │ ├── SidebarPlugin
- │ └── Tables
- ├── filters
- ├── libs
- ├── pages
- │ ├── Certificate
- │ ├── Layout
- │ ├── PlugIn
- │ ├── Router
- │ └── Service
- ├── routes
- └── store
+ ├── hooks
+ ├── layouts
+ ├── router
+ ├── schema
+ │ └── plugins
+ ├── store
+ │ └── modules
+ ├── utils
+ └── views
+ ├── plugin
+ │ └── components
+ ├── router
+ ├── services
+ ├── ssl
+ ├── upstream
+ └── user
```
diff --git a/README_CN.md b/README_CN.md
index d0e035e..8f0f575 100644
--- a/README_CN.md
+++ b/README_CN.md
@@ -3,24 +3,36 @@
+
-
+
+
-
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
[简体中文](README_CN.md) | [English](README.md)
## 简介
-`apioak-dashboard` 是`apioak`网关的控制面,基于 Vue 和 Vue Material 开发,项目配合控制面的后端项目 apioak-admin 一起使用。
+`apioak-dashboard` 是`apioak`网关的控制面,基于 Vue 3.x、ant-design-vue 3.x、npm 6.14.13 开发,项目配合控制面的后端项目 apioak-admin 一起使用。
## 快速开始
- 从 Github 下载代码
+ 从 Gitee 下载代码
### 安装cnpm
```
@@ -34,7 +46,7 @@ cnpm install
### 开发环境启动项目
```
-npm run dev
+npm run serve
```
### 生产环境编辑静态文件
@@ -47,35 +59,31 @@ See [Configuration Reference](https://cli.vuejs.org/config/).
## 项目目录结构
```
-apioak-dashboard/
+apioak-dashboard
├── public
└── src
├── api
├── assets
- │ ├── font
- │ ├── img
- │ │ └── faces
- │ └── scss
- │ └── md
- │ ├── mixins
- │ └── plugins
+ │ ├── css
+ │ ├── font
+ │ └── img
├── components
- │ ├── Cards
- │ ├── Common
- │ ├── Dialog
- │ ├── NotificationPlugin
- │ ├── SidebarPlugin
- │ └── Tables
- ├── filters
- ├── libs
- ├── pages
- │ ├── Certificate
- │ ├── Layout
- │ ├── PlugIn
- │ ├── Router
- │ └── Service
- ├── routes
- └── store
+ ├── hooks
+ ├── layouts
+ ├── router
+ ├── schema
+ │ └── plugins
+ ├── store
+ │ └── modules
+ ├── utils
+ └── views
+ ├── plugin
+ │ └── components
+ ├── router
+ ├── services
+ ├── ssl
+ ├── upstream
+ └── user
```
diff --git a/babel.config.js b/babel.config.js
index 1d248fc..e955840 100644
--- a/babel.config.js
+++ b/babel.config.js
@@ -1,3 +1,5 @@
module.exports = {
- presets: ["@vue/app"],
-};
+ presets: [
+ '@vue/cli-plugin-babel/preset'
+ ]
+}
diff --git a/jsconfig.json b/jsconfig.json
new file mode 100644
index 0000000..4aafc5f
--- /dev/null
+++ b/jsconfig.json
@@ -0,0 +1,19 @@
+{
+ "compilerOptions": {
+ "target": "es5",
+ "module": "esnext",
+ "baseUrl": "./",
+ "moduleResolution": "node",
+ "paths": {
+ "@/*": [
+ "src/*"
+ ]
+ },
+ "lib": [
+ "esnext",
+ "dom",
+ "dom.iterable",
+ "scripthost"
+ ]
+ }
+}
diff --git a/package.json b/package.json
index d1b41df..93643be 100644
--- a/package.json
+++ b/package.json
@@ -1,41 +1,60 @@
{
- "name": "vue-material-dashboard",
- "version": "1.5.0",
+ "name": "antd-demo",
+ "version": "0.6.1",
"private": true,
"scripts": {
- "serve": "vue-cli-service serve --open",
- "dev": "npm run serve",
+ "serve": "vue-cli-service serve --mode development",
"build": "vue-cli-service build",
"lint": "vue-cli-service lint"
},
"dependencies": {
- "axios": "^0.24.0",
- "chartist": "0.11.4",
- "core-js": "3.18.2",
- "google-maps": "4.3.3",
- "vue": "2.6.14",
- "vue-clickaway": "2.2.2",
- "vue-github-buttons": "3.1.0",
- "vue-material": "1.0.0-beta-15",
- "vue-router": "3.5.2",
- "vue-social-sharing": "3.0.8",
- "vuelidate": "^0.7.6",
- "vuex": "^3.6.2"
+ "@ant-design/icons-vue": "^6.1.0",
+ "ant-design-vue": "^3.2.14",
+ "axios": "^1.2.2",
+ "core-js": "^3.8.3",
+ "nprogress": "^0.2.0",
+ "vue": "^3.2.13",
+ "vue-router": "^4.1.6",
+ "vuex": "^4.1.0",
+ "vuex-persistedstate": "^4.1.0"
},
"devDependencies": {
- "@vue/cli-plugin-babel": "4.5.13",
- "@vue/cli-plugin-eslint": "4.5.13",
- "@vue/cli-plugin-router": "4.5.13",
- "@vue/cli-service": "4.5.13",
- "@vue/eslint-config-prettier": "6.0.0",
- "babel-eslint": "10.1.0",
- "eslint": "7.32.0",
- "eslint-plugin-prettier": "4.0.0",
- "eslint-plugin-vue": "7.19.1",
- "es6-promise": "4.2.8",
- "prettier": "2.4.1",
- "sass": "1.42.1",
- "sass-loader": "10.1.1",
- "vue-template-compiler": "2.6.14"
- }
+ "@babel/core": "^7.12.16",
+ "@babel/eslint-parser": "^7.12.16",
+ "@vue/cli-plugin-babel": "~5.0.0",
+ "@vue/cli-plugin-eslint": "~5.0.0",
+ "@vue/cli-service": "~5.0.0",
+ "eslint": "^7.32.0",
+ "eslint-plugin-vue": "^8.0.3"
+ },
+ "eslintConfig": {
+ "root": true,
+ "env": {
+ "node": true
+ },
+ "extends": [
+ "plugin:vue/vue3-essential",
+ "eslint:recommended"
+ ],
+ "parserOptions": {
+ "parser": "@babel/eslint-parser",
+ "requireConfigFile": false
+ },
+ "rules": {
+ "space-before-function-paren": [
+ "error",
+ {
+ "anonymous": "always",
+ "named": "never",
+ "asyncArrow": "always"
+ }
+ ]
+ }
+ },
+ "browserslist": [
+ "> 1%",
+ "last 2 versions",
+ "not dead",
+ "not ie 11"
+ ]
}
diff --git a/postcss.config.js b/postcss.config.js
deleted file mode 100644
index a47ef4f..0000000
--- a/postcss.config.js
+++ /dev/null
@@ -1,5 +0,0 @@
-module.exports = {
- plugins: {
- autoprefixer: {},
- },
-};
diff --git a/public/index.html b/public/index.html
index 048479b..f8982b6 100644
--- a/public/index.html
+++ b/public/index.html
@@ -1,19 +1,19 @@
-
-
-
-
-
- APIOAK-Dashboard
-
+
-
-
-
-
+
+
+
+
+
+
+ APIOAK-Dashboard
+
-
-
-
-
-
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/App.vue b/src/App.vue
index 744c323..48e92ad 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -3,5 +3,7 @@
diff --git a/src/api/ApiCertificate.js b/src/api/ApiCertificate.js
deleted file mode 100644
index 113ac4f..0000000
--- a/src/api/ApiCertificate.js
+++ /dev/null
@@ -1,59 +0,0 @@
-import { request } from "../libs/http.js";
-
-export default {
- /**
- * 证书列表
- * @param params
- * @returns {Promise}
- */
- getList: (params) => {
- return request("admin/certificate/list", params);
- },
-
- /**
- * 证书详情
- * @param resId
- * @returns {Promise}
- */
- info: (resId) => {
- return request("admin/certificate/info/" + resId);
- },
-
- /**
- * 证书增加
- * @param params
- * @returns {Promise}
- */
- post: (params) => {
- return request("admin/certificate/add", params, "post");
- },
-
- /**
- * 证书修改
- * @param resId
- * @param params
- * @returns {Promise}
- */
- put: (resId, params) => {
- return request("admin/certificate/update/" + resId, params, "put");
- },
-
- /**
- * 证书开关
- * @param resId
- * @param enable
- * @returns {Promise}
- */
- putSwitchEnable: (resId, enable) => {
- return request("admin/certificate/switch/enable/" + resId, { enable: enable }, "put");
- },
-
- /**
- * 证书删除
- * @param resId
- * @returns {Promise}
- */
- delete: (resId) => {
- return request("admin/certificate/delete/" + resId, null, "delete");
- },
-};
diff --git a/src/api/ApiClusterNode.js b/src/api/ApiClusterNode.js
deleted file mode 100644
index d399a23..0000000
--- a/src/api/ApiClusterNode.js
+++ /dev/null
@@ -1,35 +0,0 @@
-import { request } from "../libs/http.js";
-
-export default {
- /**
- * 节点列表
- * @param params
- * @returns {Promise}
- */
- getList: (params) => {
- return request("admin/cluster-node/list", params);
- },
-
- /**
- * 节点开关
- * @param id
- * @param isEnable
- * @returns {Promise}
- */
- putSwitchEnable: (id, isEnable) => {
- return request(
- "admin/cluster-node/switch/enable/" + id,
- { is_enable: isEnable },
- "put"
- );
- },
-
- /**
- * 节点删除
- * @param id
- * @returns {Promise}
- */
- delete: (id) => {
- return request("admin/cluster-node/delete/" + id, null, "delete");
- },
-};
diff --git a/src/api/ApiPlugIn.js b/src/api/ApiPlugIn.js
deleted file mode 100644
index 7cb1e89..0000000
--- a/src/api/ApiPlugIn.js
+++ /dev/null
@@ -1,103 +0,0 @@
-import { request } from "../libs/http.js";
-
-export default {
- /**
- * 插件类型
- * @returns {Promise}
- */
- typeList: () => {
- return request("admin/plugin/type-list");
- },
-
- /**
- * 获取增加插件时的插件列表
- * @returns {Promise}
- */
- addPluginList: () => {
- return request("admin/plugin/add-list", null);
- },
-
- /**
- * 插件详情
- * @param resId
- * @returns {Promise}
- */
- info: (resId) => {
- return request("admin/plugin/info/" + resId);
- },
-
- /**
- * 获取目标插件配置列表
- * @param pluginConfigType
- * @param targetResId
- * @returns {Promise}
- */
- pluginConfigList: (pluginConfigType, targetResId) => {
- if (pluginConfigType === 1) {
- return request("admin/service/plugin/config/list/" + targetResId, null);
- } else if (pluginConfigType === 2) {
- return request("admin/router/plugin/config/list/" + targetResId, null);
- }
- },
-
- /**
- * 插件配置增加
- * @param pluginConfigType
- * @param params
- * @returns {Promise}
- */
- pluginConfigAdd: (pluginConfigType, params) => {
- if (pluginConfigType === 1) {
- return request("admin/service/plugin/config/add", params, "post");
- } else if (pluginConfigType === 2) {
- return request("admin/router/plugin/config/add", params, "post");
- }
- },
-
- /**
- * 插件配置更新
- * @param pluginConfigType
- * @param resId
- * @param params
- * @returns {Promise}
- */
- pluginConfigUpdate: (pluginConfigType, resId, params) => {
- if (pluginConfigType === 1) {
- return request("admin/service/plugin/config/update/" + resId, params, "put");
- } else if (pluginConfigType === 2) {
- return request("admin/router/plugin/config/update/" + resId, params, "put");
- }
- },
-
- /**
- * 插件配置开关
- * @param pluginConfigType
- * @param resId
- * @param enable
- * @returns {Promise}
- */
- pluginConfigSwitchEnable: (pluginConfigType, resId, enable) => {
- if (pluginConfigType === 1) {
- return request("admin/service/plugin/config/switch/enable/" + resId, { enable : enable }, "put");
- } else if (pluginConfigType === 2) {
- return request("admin/router/plugin/config/switch/enable/" + resId, { enable : enable }, "put");
- }
- },
-
- /**
- * 插件配置删除
- * @param pluginConfigType
- * @param resId
- * @returns {Promise}
- */
- pluginConfigDelete: (pluginConfigType, resId) => {
- if (pluginConfigType === 1) {
- return request("admin/service/plugin/config/delete/" + resId, null, "delete");
- } else if (pluginConfigType === 2) {
- return request("admin/router/plugin/config/delete/" + resId, null, "delete");
- }
- },
-
-
-
-};
diff --git a/src/api/ApiRouter.js b/src/api/ApiRouter.js
deleted file mode 100644
index 627c52b..0000000
--- a/src/api/ApiRouter.js
+++ /dev/null
@@ -1,107 +0,0 @@
-import { request } from "../libs/http.js";
-
-export default {
- /**
- * 路由列表
- * @param params
- * @returns {Promise}
- */
- getList: (params) => {
- return request("admin/router/list", params);
- },
-
- /**
- * 路由详情
- * @param serviceResId
- * @param routerResId
- * @returns {Promise}
- */
- info: (serviceResId, routerResId) => {
- return request("admin/router/info/" + serviceResId + "/" + routerResId);
- },
-
- /**
- * 路由增加
- * @param params
- * @returns {Promise}
- */
- post: (params) => {
- return request("admin/router/add", params, "post");
- },
-
- /**
- * 路由修改
- * @param serviceResId
- * @param routerResId
- * @param params
- * @returns {Promise}
- */
- put: (serviceResId, routerResId, params) => {
- return request("admin/router/update/" + serviceResId + "/" + routerResId, params, "put");
- },
-
- /**
- * 路由复制
- * @param serviceResId
- * @param routerResId
- * @returns {Promise}
- */
- copy: (serviceResId, routerResId) => {
- return request("admin/router/copy/" + serviceResId + "/" + routerResId, null, "post");
- },
-
- /**
- * 路由名称更新
- * @param serviceResId
- * @param routerResId
- * @param routerName
- * @returns {Promise}
- */
- putName: (serviceResId, routerResId, routerName) => {
- return request(
- "admin/router/update/name/" + serviceResId + "/" + routerResId,
- { name: routerName },
- "put"
- );
- },
-
- /**
- * 路由发布
- * @param serviceResId
- * @param routerResId
- * @returns {Promise}
- */
- putSwitchRelease: (serviceResId, routerResId) => {
- return request("admin/router/switch/release/" + serviceResId + "/" + routerResId, null, "put");
- },
-
- /**
- * 路由开关
- * @param serviceResId
- * @param routerResId
- * @param enable
- * @returns {Promise}
- */
- putSwitchEnable: (serviceResId, routerResId, enable) => {
- return request(
- "admin/router/switch/enable/" + serviceResId + "/" + routerResId,
- { enable: enable },
- "put"
- );
- },
-
- /**
- * 路由删除
- * @param serviceResId
- * @param routerResId
- * @returns {Promise}
- */
- delete: (serviceResId, routerResId) => {
- return request(
- "admin/router/delete/" + serviceResId + "/" + routerResId,
- null,
- "delete"
- );
- },
-
-};
diff --git a/src/api/ApiService.js b/src/api/ApiService.js
deleted file mode 100644
index 3c8afdd..0000000
--- a/src/api/ApiService.js
+++ /dev/null
@@ -1,88 +0,0 @@
-import { request } from "../libs/http.js";
-
-export default {
- /**
- * 服务名称列表
- * @returns {Promise}
- */
- getNameList: () => {
- return request("admin/service/name/list", null);
- },
-
- /**
- * 服务列表
- * @param params
- * @returns {Promise}
- */
- getList: (params) => {
- return request("admin/service/list", params);
- },
-
- /**
- * 服务详情
- * @param resId
- * @returns {Promise}
- */
- info: (resId) => {
- return request("admin/service/info/" + resId);
- },
- /**
- * 服务增加
- * @param params
- * @returns {Promise}
- */
- post: (params) => {
- return request("admin/service/add", params, "post");
- },
-
- /**
- * 服务修改
- * @param resId
- * @param params
- * @returns {Promise}
- */
- put: (resId, params) => {
- return request("admin/service/update/" + resId, params, "put");
- },
-
- /**
- * 服务名称更新
- * @param resId
- * @param name
- * @returns {Promise}
- */
- putName: (resId, name) => {
- return request("admin/service/update/name/" + resId, { name: name }, "put");
- },
-
- /**
- * 服务发布
- * @param resId
- * @returns {Promise}
- */
- putSwitchRelease: (resId) => {
- return request("admin/service/switch/release/" + resId, null, "put");
- },
-
- /**
- * 服务开关
- * @param resId
- * @param enable
- * @returns {Promise}
- */
- putSwitchEnable: (resId, enable) => {
- return request(
- "admin/service/switch/enable/" + resId,
- { enable: enable },
- "put"
- );
- },
- /**
- * 服务删除
- * @param resId
- * @returns {Promise}
- */
- delete: (resId) => {
- return request("admin/service/delete/" + resId, null, "delete");
- },
-};
diff --git a/src/api/ApiUser.js b/src/api/ApiUser.js
deleted file mode 100644
index 4738135..0000000
--- a/src/api/ApiUser.js
+++ /dev/null
@@ -1,26 +0,0 @@
-import { request } from "../libs/http.js";
-
-export default {
- /**
- * 登录接口
- * @param email
- * @param password
- * @returns {Promise}
- * @constructor
- */
- login: (email, password) => {
- return request(
- "admin/user/login",
- { email: email, password: password },
- "post"
- );
- },
-
- logout: (email, password) => {
- return request("admin/user/logout", null, "post");
- },
-
- register: (params) => {
- return request("admin/user/register", params, "post");
- },
-};
diff --git a/src/api/index.js b/src/api/index.js
new file mode 100644
index 0000000..7b34ddc
--- /dev/null
+++ b/src/api/index.js
@@ -0,0 +1,7 @@
+export * from '@/api/user'
+export * from '@/api/service'
+export * from '@/api/plugin'
+export * from '@/api/pluginConfig'
+export * from '@/api/router'
+export * from '@/api/upstream'
+export * from '@/api/ssl'
diff --git a/src/api/plugin.js b/src/api/plugin.js
new file mode 100644
index 0000000..a152796
--- /dev/null
+++ b/src/api/plugin.js
@@ -0,0 +1,26 @@
+import request from '../utils/requestAxios'
+
+const pluginTypeList = '/admin/plugin/type-list'
+const pluginList = '/admin/plugin/add-list'
+
+/**
+ * 获取插件类型列表
+ * @returns
+ */
+export const $pluginTypeList = async () => {
+ return request.request({
+ url: pluginTypeList,
+ method: 'GET'
+ })
+}
+
+/**
+ * 获取插件列表
+ * @returns
+ */
+export const $pluginList = async () => {
+ return request.request({
+ url: pluginList,
+ method: 'GET'
+ })
+}
diff --git a/src/api/pluginConfig.js b/src/api/pluginConfig.js
new file mode 100644
index 0000000..eb9d735
--- /dev/null
+++ b/src/api/pluginConfig.js
@@ -0,0 +1,240 @@
+import request from '../utils/requestAxios'
+
+let configTypeService = 1
+
+const servicePluginConfigList = '/admin/service/plugin/config/list/'
+const servicePluginConfigAdd = '/admin/service/plugin/config/add'
+const servicePluginConfigUpdate = '/admin/service/plugin/config/update/'
+const servicePluginConfigEnable = '/admin/service/plugin/config/switch/enable/'
+const servicePluginConfigDelete = '/admin/service/plugin/config/delete/'
+
+const routerPluginConfigList = '/admin/router/plugin/config/list/'
+const routerPluginConfigAdd = '/admin/router/plugin/config/add'
+const routerPluginConfigUpdate = '/admin/router/plugin/config/update/'
+const routerPluginConfigEnable = '/admin/router/plugin/config/switch/enable/'
+const routerPluginConfigDelete = '/admin/router/plugin/config/delete/'
+
+/**
+ * 插件配置列表
+ * @param {*} targetResId
+ * @param {*} configType
+ * @returns
+ */
+export const $pluginConfigList = async (targetResId, configType = configTypeService) => {
+ if (configType == configTypeService) {
+ return $servicePluginConfigList(targetResId)
+ } else {
+ return $routerPluginConfigList(targetResId)
+ }
+}
+
+/**
+ * 插件配置增加
+ * @param {*} data
+ * @param {*} configType
+ * @returns
+ */
+export const $pluginConfigAdd = async (data, configType = configTypeService) => {
+ if (configType == configTypeService) {
+ return $servicePluginConfigAdd(data)
+ } else {
+ return $routerPluginConfigAdd(data)
+ }
+}
+
+/**
+ * 插件配置更新
+ * @param {*} resId
+ * @param {*} data
+ * @param {*} configType
+ * @returns
+ */
+export const $pluginConfigUpdate = async (resId, data, configType = configTypeService) => {
+ if (configType == configTypeService) {
+ return $servicePluginConfigUpdate(resId, data)
+ } else {
+ return $routerPluginConfigUpdate(resId, data)
+
+ }
+}
+
+/**
+ * 插件配置开关
+ * @param {*} resId
+ * @param {*} data
+ * @param {*} configType
+ * @returns
+ */
+export const $pluginConfigEnable = async (resId, data, configType = configTypeService) => {
+ if (configType == configTypeService) {
+ return $servicePluginConfigEnable(resId, data)
+ } else {
+ return $routerPluginConfigEnable(resId, data)
+
+ }
+}
+
+/**
+ * 插件配置删除
+ * @param {*} resId
+ * @param {*} configType
+ * @returns
+ */
+export const $pluginConfigDelete = async (resId, configType = configTypeService) => {
+ if (configType == configTypeService) {
+ return $servicePluginConfigDelete(resId)
+ } else {
+ return $routerPluginConfigDelete(resId)
+
+ }
+}
+
+// *************************************service-plugin-config*******************************************
+
+/**
+ * 插件配置列表
+ * @param {*} resId
+ * @returns
+ */
+let $servicePluginConfigList = async resId => {
+ let listUri = servicePluginConfigList + resId
+
+ return request.request({
+ url: listUri,
+ method: 'GET'
+ })
+}
+
+/**
+ * 插件配置增加
+ * @param {*} data
+ * @returns
+ */
+let $servicePluginConfigAdd = async data => {
+ return request.request({
+ url: servicePluginConfigAdd,
+ method: 'POST',
+ data: data
+ })
+}
+
+/**
+ * 插件配置更新
+ * @param {*} resId
+ * @param {*} data
+ * @returns
+ */
+let $servicePluginConfigUpdate = async (resId, data) => {
+ let updateUri = servicePluginConfigUpdate + resId
+
+ return request.request({
+ url: updateUri,
+ method: 'PUT',
+ data: data
+ })
+}
+
+/**
+ * 服务插件配置开关
+ * @param {*} resId
+ * @param {*} data
+ * @returns
+ */
+let $servicePluginConfigEnable = async (resId, data) => {
+ let enableUri = servicePluginConfigEnable + resId
+
+ return request.request({
+ url: enableUri,
+ method: 'PUT',
+ data: data
+ })
+}
+
+/**
+ * 服务插件配置删除
+ * @param {*} resId
+ * @returns
+ */
+let $servicePluginConfigDelete = async resId => {
+ let deleteUri = servicePluginConfigDelete + resId
+
+ return request.request({
+ url: deleteUri,
+ method: 'DELETE'
+ })
+}
+
+// *************************************router-plugin-config*******************************************
+
+/**
+ * 插件配置列表
+ * @param {*} resId
+ * @returns
+ */
+let $routerPluginConfigList = async resId => {
+ let listUri = routerPluginConfigList + resId
+
+ return request.request({
+ url: listUri,
+ method: 'GET'
+ })
+}
+
+/**
+ * 插件配置增加
+ * @param {*} data
+ * @returns
+ */
+let $routerPluginConfigAdd = async data => {
+ return request.request({
+ url: routerPluginConfigAdd,
+ method: 'POST',
+ data: data
+ })
+}
+
+/**
+ * 插件配置更新
+ * @param {*} resId
+ * @param {*} data
+ * @returns
+ */
+let $routerPluginConfigUpdate = async (resId, data) => {
+ let updateUri = routerPluginConfigUpdate + resId
+
+ return request.request({
+ url: updateUri,
+ method: 'PUT',
+ data: data
+ })
+}
+
+/**
+ * 服务插件配置开关
+ * @param {*} resId
+ * @param {*} data
+ * @returns
+ */
+let $routerPluginConfigEnable = async (resId, data) => {
+ let enableUri = routerPluginConfigEnable + resId
+
+ return request.request({
+ url: enableUri,
+ method: 'PUT',
+ data: data
+ })
+}
+
+/**
+ * 服务插件配置删除
+ * @param {*} resId
+ * @returns
+ */
+let $routerPluginConfigDelete = async resId => {
+ let deleteUri = routerPluginConfigDelete + resId
+
+ return request.request({
+ url: deleteUri,
+ method: 'DELETE'
+ })
+}
\ No newline at end of file
diff --git a/src/api/router.js b/src/api/router.js
new file mode 100644
index 0000000..5da4ca6
--- /dev/null
+++ b/src/api/router.js
@@ -0,0 +1,148 @@
+import request from '../utils/requestAxios'
+
+const routerList = '/admin/router/list'
+const routerEditName = '/admin/router/update/name/'
+const routerEnable = '/admin/router/switch/enable/'
+const routerRelease = '/admin/router/switch/release/'
+const routerDelete = '/admin/router/delete/'
+const routerInfo = '/admin/router/info/'
+const routerAdd = '/admin/router/add'
+const routerUpdate = '/admin/router/update/'
+const routerCopy = '/admin/router/copy/'
+
+/**
+ * 获取路由列表
+ * @param {*} params
+ * @returns
+ */
+export const $routerList = async params => {
+ return request.request({
+ url: routerList,
+ method: 'GET',
+ params: params
+ })
+}
+
+/**
+ * 编辑路由名称
+ * @param {*} resId 路由资源ID
+ * @param {*} newName 新名称
+ * @param {*} serviceResId 服务ID
+ * @returns
+ */
+export const $routerEditName = async (resId, newName, serviceResId) => {
+ let editNameUri = routerEditName + serviceResId + '/' + resId
+
+ return request.request({
+ url: editNameUri,
+ method: 'PUT',
+ data: {
+ name: newName
+ }
+ })
+}
+
+/**
+ * 路由开关
+ * @param {*} resId 路由资源ID
+ * @param {*} enable 开关状态
+ * @param {*} serviceResId 服务ID
+ * @returns
+ */
+export const $routerEnable = async (resId, enable, serviceResId) => {
+ let enableUri = routerEnable + serviceResId + '/' + resId
+
+ return request.request({
+ url: enableUri,
+ method: 'PUT',
+ data: {
+ enable: enable
+ }
+ })
+}
+
+/**
+ * 路由发布
+ * @param {*} resId 路由资源ID
+ * @param {*} serviceResId 服务ID
+ * @returns
+ */
+export const $routerRelease = async (resId, serviceResId) => {
+ let releaseUri = routerRelease + serviceResId + '/' + resId
+
+ return request.request({
+ url: releaseUri,
+ method: 'PUT'
+ })
+}
+
+/**
+ * 路由删除
+ * @param {*} resId 路由资源ID
+ * @param {*} serviceResId 服务ID
+ * @returns
+ */
+export const $routerDelete = async (resId, serviceResId) => {
+ let deleteUri = routerDelete + serviceResId + '/' + resId
+
+ return request.request({
+ url: deleteUri,
+ method: 'DELETE'
+ })
+}
+
+/**
+ * 路由详情
+ * @param {*} serviceResId
+ * @param {*} resId
+ * @returns
+ */
+export const $routerInfo = async (serviceResId, resId) => {
+ let infoUri = routerInfo + serviceResId +'/' +resId
+
+ return request.request({
+ url: infoUri,
+ method: 'GET'
+ })
+}
+
+/**
+ * 路由新增
+ * @param data
+ * @returns {Promise>}
+ */
+export const $routerAdd = async data => {
+ return request.request({
+ url: routerAdd,
+ method: 'POST',
+ data: data
+ })
+}
+
+/**
+ * 路由修改
+ * @param serviceResId
+ * @param resId
+ * @param data
+ * @returns {Promise>}
+ */
+export const $routerUpdate = async (serviceResId, resId, data) => {
+ let updateUri = routerUpdate + serviceResId + '/' + resId
+
+ return request.request({
+ url: updateUri,
+ method: 'PUT',
+ data: data
+ })
+}
+
+export const $routerCopy = async (serviceResId, resId) => {
+ let copyUri = routerCopy + serviceResId + '/' + resId
+
+ return request.request({
+ url: copyUri,
+ method: 'POST',
+ data: {}
+ })
+}
+
diff --git a/src/api/service.js b/src/api/service.js
new file mode 100644
index 0000000..151d844
--- /dev/null
+++ b/src/api/service.js
@@ -0,0 +1,130 @@
+import request from '../utils/requestAxios'
+
+const serviceList = '/admin/service/list'
+const serviceEditName = '/admin/service/update/name/'
+const serviceEnable = '/admin/service/switch/enable/'
+const serviceRelease = '/admin/service/switch/release/'
+const serviceDelete = '/admin/service/delete/'
+const serviceInfo = '/admin/service/info/'
+const serviceAdd = '/admin/service/add'
+const serviceUpdate = '/admin/service/update/'
+
+/**
+ * 获取服务列表
+ * @param {*} params
+ * @returns
+ */
+export const $serviceList = async params => {
+ return request.request({
+ url: serviceList,
+ method: 'GET',
+ params: params
+ })
+}
+
+/**
+ * 编辑服务名称
+ * @param {*} resId 服务资源ID
+ * @param {*} newName 新名称
+ * @returns
+ */
+export const $serviceEditName = async (resId, newName) => {
+ let editNameUri = serviceEditName + resId
+
+ return request.request({
+ url: editNameUri,
+ method: 'PUT',
+ data: {
+ name: newName
+ }
+ })
+}
+
+/**
+ * 服务开关
+ * @param {*} resId 服务资源ID
+ * @param {*} enable 开关状态
+ * @returns
+ */
+export const $serviceEnable = async (resId, enable) => {
+ let enableUri = serviceEnable + resId
+
+ return request.request({
+ url: enableUri,
+ method: 'PUT',
+ data: {
+ enable: enable
+ }
+ })
+}
+
+/**
+ * 服务发布
+ * @param {*} resId 服务资源ID
+ * @returns
+ */
+export const $serviceRelease = async resId => {
+ let releaseUri = serviceRelease + resId
+
+ return request.request({
+ url: releaseUri,
+ method: 'PUT'
+ })
+}
+
+/**
+ * 服务删除
+ * @param {*} resId 服务资源ID
+ * @returns
+ */
+export const $serviceDelete = async resId => {
+ let deleteUri = serviceDelete + resId
+
+ return request.request({
+ url: deleteUri,
+ method: 'DELETE'
+ })
+}
+
+/**
+ * 服务详情
+ * @param {*} resId
+ * @returns
+ */
+export const $serviceInfo = async resId => {
+ let infoUri = serviceInfo + resId
+
+ return request.request({
+ url: infoUri,
+ method: 'GET'
+ })
+}
+
+/**
+ * 服务增加
+ * @param {*} data
+ * @returns
+ */
+export const $serviceAdd = async data => {
+ return request.request({
+ url: serviceAdd,
+ method: 'POST',
+ data: data
+ })
+}
+
+/**
+ * 服务更新
+ * @param {*} resId
+ * @param {*} data
+ * @returns
+ */
+export const $serviceUpdate = async (resId, data) => {
+ let updateUri = serviceUpdate + resId
+
+ return request.request({
+ url: updateUri,
+ method: 'PUT',
+ data: data
+ })
+}
diff --git a/src/api/ssl.js b/src/api/ssl.js
new file mode 100644
index 0000000..48c65f3
--- /dev/null
+++ b/src/api/ssl.js
@@ -0,0 +1,85 @@
+import request from '../utils/requestAxios'
+
+const sslList = '/admin/certificate/list'
+const sslEnable = '/admin/certificate/switch/enable/'
+const sslDelete = '/admin/certificate/delete/'
+const sslInfo = '/admin/certificate/info/'
+const sslAdd = '/admin/certificate/add'
+const sslUpdate = '/admin/certificate/update/'
+
+/**
+ * 获取证书列表
+ * @param {*} params
+ * @returns
+ */
+export const $sslList = async params => {
+ return request.request({
+ url: sslList,
+ method: 'GET',
+ params: params
+ })
+}
+
+/**
+ * 证书开关
+ * @param {*} resId 证书资源ID
+ * @param {*} enable 开关状态
+ * @returns
+ */
+export const $sslEnable = async (resId, enable) => {
+ let enableUri = sslEnable + resId
+
+ return request.request({
+ url: enableUri,
+ method: 'PUT',
+ data: {
+ enable: enable
+ }
+ })
+}
+
+/**
+ * 证书删除
+ * @param {*} resId 证书资源ID
+ * @returns
+ */
+export const $sslDelete = async resId => {
+ let deleteUri = sslDelete + resId
+
+ return request.request({
+ url: deleteUri,
+ method: 'DELETE'
+ })
+}
+
+/**
+ * 证书详情
+ * @param {*} resId
+ * @returns
+ */
+export const $sslInfo = async resId => {
+ let infoUri = sslInfo + resId
+
+ return request.request({
+ url: infoUri,
+ method: 'GET'
+ })
+}
+
+export const $sslAdd = async data => {
+ return request.request({
+ url: sslAdd,
+ method: 'POST',
+ data: data
+ })
+}
+
+export const $sslUpdate = async (resId, data) => {
+ let updateUri = sslUpdate + resId
+
+ return request.request({
+ url: updateUri,
+ method: 'PUT',
+ data: data
+ })
+}
diff --git a/src/api/upstream.js b/src/api/upstream.js
new file mode 100644
index 0000000..c566c1f
--- /dev/null
+++ b/src/api/upstream.js
@@ -0,0 +1,142 @@
+import request from '../utils/requestAxios'
+
+const upstreamList = '/admin/upstream/list'
+const upstreamNameList = '/admin/upstream/name/list'
+const upstreamEditName = '/admin/upstream/update/name/'
+const upstreamEnable = '/admin/upstream/switch/enable/'
+const upstreamDelete = '/admin/upstream/delete/'
+const upstreamRelease = '/admin/upstream/switch/release/'
+const upstreamInfo = '/admin/upstream/info/'
+const upstreamAdd = '/admin/upstream/add'
+const upstreamUpdate = '/admin/upstream/update/'
+
+/**
+ * 获取upstream列表
+ * @param {*} params
+ * @returns
+ */
+export const $upstreamList = async params => {
+ return request.request({
+ url: upstreamList,
+ method: 'GET',
+ params: params
+ })
+}
+
+/**
+ * 获取upstream列表
+ * @returns
+ */
+export const $upstreamNameList = async () => {
+ return request.request({
+ url: upstreamNameList,
+ method: 'GET',
+ })
+}
+
+/**
+ * 更新upstream名称接口
+ * @param {*} resId
+ * @param {*} newName
+ * @returns
+ */
+export const $upstreamEditName = async (resId, newName) => {
+ let editNameUri = upstreamEditName + resId
+
+ return request.request({
+ url: editNameUri,
+ method: 'PUT',
+ data: {
+ name: newName
+ }
+ })
+}
+
+/**
+ * 开关变更
+ * @param {*} resId
+ * @param {*} enable
+ * @returns
+ */
+export const $upstreamEnable = async (resId, enable) => {
+ let enableUri = upstreamEnable + resId
+
+ return request.request({
+ url: enableUri,
+ method: 'PUT',
+ data: {
+ enable: enable
+ }
+ })
+}
+
+/**
+ * 发布
+ * @param {*} resId
+ * @returns
+ */
+export const $upstreamRelease = async resId => {
+ let releaseUri = upstreamRelease + resId
+
+ return request.request({
+ url: releaseUri,
+ method: 'PUT'
+ })
+}
+
+/**
+ * 删除
+ * @param {*} resId
+ * @returns
+ */
+export const $upstreamDelete = async resId => {
+ let deleteUri = upstreamDelete + resId
+
+ return request.request({
+ url: deleteUri,
+ method: 'DELETE'
+ })
+}
+
+/**
+ * 详情
+ * @param {*} resId
+ * @returns
+ */
+export const $upstreamInfo = async resId => {
+ let infoUri = upstreamInfo + resId
+
+ return request.request({
+ url: infoUri,
+ method: 'GET'
+ })
+}
+
+/**
+ * 上游增加
+ * @param {*} data
+ * @returns
+ */
+export const $upstreamAdd = async data => {
+ return request.request({
+ url: upstreamAdd,
+ method: 'POST',
+ data: data
+ })
+}
+
+/**
+ * 上游更新
+ * @param {*} resId
+ * @param {*} data
+ * @returns
+ */
+export const $upstreamUpdate = async (resId, data) => {
+ let updateUri = upstreamUpdate + resId
+
+ return request.request({
+ url: updateUri,
+ method: 'PUT',
+ data: data
+ })
+}
diff --git a/src/api/user.js b/src/api/user.js
new file mode 100644
index 0000000..376ac82
--- /dev/null
+++ b/src/api/user.js
@@ -0,0 +1,41 @@
+import request from '@/utils/requestAxios'
+
+const login = '/admin/user/login'
+const register = '/admin/user/register'
+const logout = '/admin/user/logout'
+
+/**
+ * 登录
+ * @param {*} data
+ */
+export const $login = data => {
+ return request.request({
+ url: login,
+ method: 'POST',
+ data: data
+ })
+}
+
+/**
+ * 注册
+ * @param {*} data
+ * @returns
+ */
+export const $register = data => {
+ return request.request({
+ url: register,
+ method: 'POST',
+ data: data
+ })
+}
+
+/**
+ * 退出登录
+ * @returns
+ */
+export const $logout = () => {
+ return request.request({
+ url: logout,
+ method: 'POST'
+ })
+}
diff --git a/src/assets/scss/common.scss b/src/assets/css/common.css
similarity index 78%
rename from src/assets/scss/common.scss
rename to src/assets/css/common.css
index e3da9d3..84f9838 100644
--- a/src/assets/scss/common.scss
+++ b/src/assets/css/common.css
@@ -32,29 +32,14 @@
margin: 0 !important;
}
-.color-plugin-0 {
- color: darkgrey;
-}
-.color-plugin-1 {
- color: #00e676;
-}
-.color-plugin-2 {
- color: orange;
-}
-.color-plugin-3 {
- color: red;
-}
-.color-plugin-4 {
- color: purple;
-}
-.color-plugin-99 {
- color: blue;
-}
-
.font-bold {
font-weight: bold;
}
+.color-light-grey {
+ color: lightgrey;
+}
+
.color-grey {
color: grey;
}
@@ -64,23 +49,23 @@
}
.color-red {
- color: #ff1744;
+ color: red;
}
.color-orange {
- color: #ff9100;
+ color: orange;
}
.color-green {
- color: #00e676;
+ color: green;
}
.color-purple {
- color: #d500f9;
+ color: purple;
}
.color-blue {
- color: #2979ff;
+ color: blue;
}
.background-color-grey {
@@ -112,7 +97,7 @@
}
.font-link-color {
- color: #1e88e5;;
+ color: #1e88e5;
}
.font-block {
@@ -122,3 +107,7 @@
margin: 2px;
font-size: 10px;
}
+
+.a-delete:hover {
+ color: #ff1744;
+}
diff --git a/src/assets/font/iconfont.css b/src/assets/font/iconfont.css
index 0d0cdf8..009a435 100644
--- a/src/assets/font/iconfont.css
+++ b/src/assets/font/iconfont.css
@@ -1,123 +1,131 @@
@font-face {
- font-family: "iconfont"; /* Project id 2693038 */
- src: url('iconfont.woff2?t=1672280661917') format('woff2'),
- url('iconfont.woff?t=1672280661917') format('woff'),
- url('iconfont.ttf?t=1672280661917') format('truetype');
+ font-family: 'iconfont'; /* Project id 2693038 */
+ src: url('iconfont.woff2?t=1675152762377') format('woff2'),
+ url('iconfont.woff?t=1675152762377') format('woff'),
+ url('iconfont.ttf?t=1675152762377') format('truetype');
}
.iconfont {
- font-family: "iconfont" !important;
- font-size: 23px;
+ font-family: 'iconfont' !important;
+ font-size: 15px;
+ margin: 2px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
+.icon-error-1:before {
+ content: '\e60f';
+}
+
+.icon-right-1:before {
+ content: '\e617';
+}
+
.icon-limit-count:before {
- content: "\e613";
+ content: '\e613';
}
.icon-limit-conn:before {
- content: "\e615";
+ content: '\e615';
}
.icon-limit-req:before {
- content: "\e616";
+ content: '\e616';
}
.icon-cors:before {
- content: "\e610";
+ content: '\e610';
}
.icon-jwt-auth:before {
- content: "\e611";
+ content: '\e611';
}
.icon-mock:before {
- content: "\e612";
+ content: '\e612';
}
.icon-key-auth:before {
- content: "\e60e";
+ content: '\e60e';
}
.icon-apex_plugin1:before {
- content: "\e6d7";
+ content: '\e6d7';
}
.icon-help:before {
- content: "\e752";
+ content: '\e752';
}
.icon-yuntongbu:before {
- content: "\e699";
+ content: '\e699';
}
.icon-host:before {
- content: "\e74a";
+ content: '\e74a';
}
.icon-zhengshu-copy:before {
- content: "\e640";
+ content: '\e640';
}
.icon-jiedian:before {
- content: "\e614";
+ content: '\e614';
}
.icon-arrowright:before {
- content: "\e6ae";
+ content: '\e6ae';
}
.icon-fuzhi:before {
- content: "\ec7a";
+ content: '\ec7a';
}
.icon-chajiangongneng:before {
- content: "\e64f";
+ content: '\e64f';
}
.icon-xiajiantou:before {
- content: "\eb6d";
+ content: '\eb6d';
}
.icon-shangjiantou:before {
- content: "\eb6e";
+ content: '\eb6e';
}
.icon-jian:before {
- content: "\e620";
+ content: '\e620';
}
.icon-tianjia:before {
- content: "\e622";
+ content: '\e622';
}
.icon-shanchu:before {
- content: "\e68e";
+ content: '\e68e';
}
.icon-xiugai:before {
- content: "\e8cf";
+ content: '\e8cf';
}
.icon-web-icon-:before {
- content: "\e6f0";
+ content: '\e6f0';
}
.icon-fuwuqi:before {
- content: "\e607";
+ content: '\e607';
}
.icon-addNode:before {
- content: "\e600";
+ content: '\e600';
}
.icon-lianjie:before {
- content: "\e715";
+ content: '\e715';
}
.icon-SSL:before {
- content: "\e69f";
+ content: '\e69f';
}
-
diff --git a/src/assets/font/iconfont.js b/src/assets/font/iconfont.js
index 971af2c..dc59055 100644
--- a/src/assets/font/iconfont.js
+++ b/src/assets/font/iconfont.js
@@ -1 +1 @@
-window._iconfont_svg_string_2693038='',function(l){var v=(v=document.getElementsByTagName("script"))[v.length-1],h=v.getAttribute("data-injectcss"),v=v.getAttribute("data-disable-injectsvg");if(!v){var c,a,t,o,i,e=function(v,h){h.parentNode.insertBefore(v,h)};if(h&&!l.__iconfont__svg__cssinject__){l.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(v){console&&console.log(v)}}c=function(){var v,h=document.createElement("div");h.innerHTML=l._iconfont_svg_string_2693038,(h=h.getElementsByTagName("svg")[0])&&(h.setAttribute("aria-hidden","true"),h.style.position="absolute",h.style.width=0,h.style.height=0,h.style.overflow="hidden",h=h,(v=document.body).firstChild?e(h,v.firstChild):v.appendChild(h))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(c,0):(a=function(){document.removeEventListener("DOMContentLoaded",a,!1),c()},document.addEventListener("DOMContentLoaded",a,!1)):document.attachEvent&&(t=c,o=l.document,i=!1,z(),o.onreadystatechange=function(){"complete"==o.readyState&&(o.onreadystatechange=null,s())})}function s(){i||(i=!0,t())}function z(){try{o.documentElement.doScroll("left")}catch(v){return void setTimeout(z,50)}s()}}(window);
\ No newline at end of file
+window._iconfont_svg_string_2693038='',function (l){var v=(v=document.getElementsByTagName("script"))[v.length-1],h=v.getAttribute("data-injectcss"),v=v.getAttribute("data-disable-injectsvg");if(!v){var c,a,t,o,i,e=function (v,h){h.parentNode.insertBefore(v,h)};if(h&&!l.__iconfont__svg__cssinject__){l.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(v){console&&console.log(v)}}c=function (){var v,h=document.createElement("div");h.innerHTML=l._iconfont_svg_string_2693038,(h=h.getElementsByTagName("svg")[0])&&(h.setAttribute("aria-hidden","true"),h.style.position="absolute",h.style.width=0,h.style.height=0,h.style.overflow="hidden",h=h,(v=document.body).firstChild?e(h,v.firstChild):v.appendChild(h))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(c,0):(a=function (){document.removeEventListener("DOMContentLoaded",a,!1),c()},document.addEventListener("DOMContentLoaded",a,!1)):document.attachEvent&&(t=c,o=l.document,i=!1,z(),o.onreadystatechange=function (){"complete"==o.readyState&&(o.onreadystatechange=null,s())})}function s(){i||(i=!0,t())}function z(){try{o.documentElement.doScroll("left")}catch(v){return void setTimeout(z,50)}s()}}(window);
\ No newline at end of file
diff --git a/src/assets/font/iconfont.json b/src/assets/font/iconfont.json
index a6239dc..571f393 100644
--- a/src/assets/font/iconfont.json
+++ b/src/assets/font/iconfont.json
@@ -5,6 +5,20 @@
"css_prefix_text": "icon-",
"description": "",
"glyphs": [
+ {
+ "icon_id": "429241",
+ "name": "错号",
+ "font_class": "error-1",
+ "unicode": "e60f",
+ "unicode_decimal": 58895
+ },
+ {
+ "icon_id": "429242",
+ "name": "对号",
+ "font_class": "right-1",
+ "unicode": "e617",
+ "unicode_decimal": 58903
+ },
{
"icon_id": "33568370",
"name": "limit-count",
diff --git a/src/assets/font/iconfont.ttf b/src/assets/font/iconfont.ttf
index e2262d735f7ea0c4e76eecec8d272b38860e8afa..65c105dfebdf7285c4c251e0a644f7cd6768f880 100644
GIT binary patch
delta 1283
zcmaKrUrbw79LK+>x4oBJ7=PN*P6`EKX%`0$`sWr$3&d=3F&YyeM#_VPNNF)JNFlM1
zxH=vT1vO}&{JRIu9*v3mvg~0?_F#OGWDnC9_35x|Xf$Zti~+x=C-dLK&dulEbIv`#
zKi_X}Z~rR3xhJ*uHlc?MWhNv7Vq+BX(~;92tVS64omYRUYDMmINr?+;$N|KNFe|L}ra
z7_V~O0GHb3P;rr3MBMan<`%V|#KnQm`YuEeMt#=Lr@FKaL*G8YHA8L$wcG
zCu)~mowZ$8e?jn_x=uax$}mS59k7|*gvD+Qv@oNGU9}^KX7~_76S~mKx{sg}N6?6)
z@FRdWwrtie8h^fRSd}Iwf|yr#jxIp*pd
z1SG#7MP1}4oD)=3_qR0a2a-Q)Xc=}{P(kys`?Q8OV)uCs4aM!RHMACY7c?{(ch75R
zH}=*v%6N_?d}sL@Z?v^`eE#Tq?znmKwZZ1W*N6J!XA`HBNJf(Hr%t6_NUf*dO?~M+
z<6L(3(woEX;qnu42Ggg*YsNKWoNk=JQ#i|SzBd+)MU!bK?ZiXDP%vPbmf6=<+g=V-
z`uu4p8SQNmv1qRu=oXe42*$@mC>VE=Cxr`Z#e624&E$*wbNP|c(UJVzYH{*hB9%&<
zo7~AwB$CO*M6Nin>GgMbH>-BoXKz&1yt-wF{oc)ShR*H(D@P`4j6aBFl4mD!J1X5l
zrD}Kh?P}Hbh3)Ewirv^!dA78o>&A8C$-1J`;Ggp0ilXMn@kU;S$2lte-WS@nsRIjjj&2i-_okl`oYRO9MkzX|7OQ85pX)y!y*um(>?(
delta 831
zcmaKqO=uHQ6ot>s-U0-?#;0s9?Sa5zc?lZ2DgN0&cwyZaI0Ik8i
zJT-keclFanhW6KdoG9jI%UY^!KY#CK9x3IDo^0N29?w!W}
z?hL#3p%+f}wZp;hJk)2P3jwslk8aNIhnK2*5P}p(tN;K2F#rGnHX{~4?PzFaVE_O$-~a#sAOHXWBnR08
zpJ;7#cmM!3000009RL6Tcz6W=_-t=uVE_O%AOHXWJ^%m!K7MjvByC}MZ~y=`U;qFB
z9{>OVAOSZj2p?`?ZDjxeHGlvB0YCr%0%s7TJg{(Yb94XzHoyP?0R8{~0bj(m(?ydA
z0fc`!ZUR9NMc=U7#_Wq1kdPw>K7r+cm;{M)7!JT8$ceZCS0UsEHOLTf16(!VF(P)i
z-l)6vr@NL96oI_+;S?Y@An_GR&rg%=JkNc0Uf{>~?~Hs^F|2HT8`+zUZE7o9+s3xG
zw{zM}C+Y04J1$Pk%LOuJ?W%Gv^hO^2pGQo1pk|2(SkNxuJf!|0^&%6dxT?*P^m
z#D6W}UBTKSJZK$3+|d=`N$ZL5s`Z8U5gQ3Y`z8qOSP*ed1@Y!e5O=IaWN90b<+y(p
zMC^MJ{X?Vj$Iyiczs+p>j>j4fGOSyHfMtu4yP$WSs6B%7CI
zV=yF`B7xW@goh2dLh*<|Wy`4wBqV>TC>7ga%YY%_k%&|vt`wD&XEx_M_x{~~&&rDdeK3Jb+OPY951}A@bW^ztoM8U-qvJ184o(`
zPP^%>v)$S{eww&2z^yGL>Ne=0w_Xwb-nwnB3QEu(To9CGytOH0;ajgfaQ1)Pxw8*k
z`NEqXICK8|nFrqV_A7VYJ{*mPx8L>bop%hkwuX1ydFAB0lg485?kD1~hblLoh;grfdcJaeu&Z)hz$?EUFU9};K`K-Hn9#-+
ztQ=qpImw>VIHlp&(iv+J>!FG3@YuRnWfOX|+2;s>0A8wdiK&jOc&(Wc-Bd+Ro`V
zU27v1Rl4PJTSau|&U0H?>`LoeT}NB3)vn00*c83K>Q9D~;fS`$@PZmmUU0i0hA(_y
zQ9k2Iw=7yzrY1_-#gT1OQSj-~6_ghn{c`DSw<3v4oAx-8bm<&*vK8r{<-P59H|3~1
z-TJh3H^m4wz=a+iuhW0odOzH!3$))5{Bvrn-=!z!M6Fwi(YqutRGqg7UqQyAjd4a?i#OQ+d=|euaMEe0>!EJvz%VTaEcc%5v)1u`W
znrKoH>(+If&T~Z9t~+jO;)*s1hCUG*yUSF8ANrjk
ziG@j4oXL2^)!!P2dJV@^&+!F0y>hLZtk
z(GSfv+Ov^R3fF&$DYv+*ZOA}th$gzvj5#{(Id@a``mHtzHrE@S?vA)|d*{Tu%lO`Q
zTo(cYPmg-zO|c=4Q^yden!{B&;PN&-=XEAj3sAjtiWt+O15!Pi^r5QQ4^TNt`Jqfi
z4yrEd+G)EMiPc>1AD$BvPBY=E^wFWV!Y$;~W=S*x&uo8<(c?$sEzfBa`G~c~N+onr
zD_e}E(1L`bpq-Rb@G%`IsVtuhncRQyP(s%=U9?0EJZx=b@#mCsaW8`Or;qeGX=!xB
zsFL&93ZVqaUBl1vL%gR;IB-r!{-P0-F{S@*%0O!>7ClEFiCm?VT4`jXtu`nj9V>}6
z2KOTwl}&$9x-=~-QR|9|QCh1sRU%F4t`Sxk6pV63HBdSK0#p$Ma9sOz;p^#=qssBu
zIsV$nt)Ys}()gi5o#?Hmo|dA1TuiC##z`8TA`nQIjIpULCdU)HZnQEeDrlM(4IVW_
zzbL$fvW<_#v=6VNw4P-2qd*a=sME<40_FGb<&u9=Ik3e7_o*E