From 3674d9da852d2af3726184e9b4721cd0bf94c6a0 Mon Sep 17 00:00:00 2001 From: RockYang Date: Wed, 21 Jun 2023 14:22:28 +0800 Subject: [PATCH] refactor: refactor the frame layout of admin module --- api/go/core/app_server.go | 2 +- api/go/handler/chat_role_handler.go | 27 +- web/package-lock.json | 450 ++++++++++-------- web/package.json | 2 + web/src/App.vue | 15 +- web/src/assets/css/color-dark.css | 23 + web/src/assets/css/main.css | 138 ++++++ web/src/assets/iconfont/iconfont.css | 50 +- web/src/assets/iconfont/iconfont.js | 2 +- .../iconfont/iconfont.js:Zone.Identifier | 4 - web/src/assets/iconfont/iconfont.json | 77 +++ web/src/assets/iconfont/iconfont.ttf | Bin 2452 -> 6108 bytes web/src/assets/iconfont/iconfont.woff | Bin 1700 -> 4080 bytes web/src/assets/iconfont/iconfont.woff2 | Bin 1276 -> 3500 bytes web/src/assets/img/avatar.jpg | Bin 0 -> 8583 bytes web/src/components/ConfigDialog.vue | 8 +- web/src/components/PasswordDialog.vue | 13 +- web/src/components/admin/AdminHeader.vue | 168 +++++++ web/src/components/admin/AdminSidebar.vue | 132 +++++ web/src/components/admin/AdminTags.vue | 171 +++++++ web/src/main.js | 81 +++- web/src/store/sidebar.js | 15 + web/src/store/tags.js | 47 ++ web/src/views/ChatPlus.vue | 72 +-- web/src/views/Home.vue | 41 +- web/src/views/admin/Admin.vue | 23 +- web/src/views/admin/ApiKey.vue | 2 +- web/src/views/admin/Home.vue | 34 ++ web/src/views/admin/LoginLog.vue | 12 +- web/src/views/admin/RoleList.vue | 2 +- web/src/views/admin/Welcome.vue | 14 +- web/src/views/admin/demo/Editor.vue | 21 + web/src/views/admin/demo/Form.vue | 155 ++++++ web/src/views/admin/demo/Import.vue | 71 +++ web/src/views/admin/demo/Table.vue | 220 +++++++++ 35 files changed, 1758 insertions(+), 334 deletions(-) create mode 100644 web/src/assets/css/color-dark.css create mode 100644 web/src/assets/css/main.css delete mode 100644 web/src/assets/iconfont/iconfont.js:Zone.Identifier create mode 100644 web/src/assets/img/avatar.jpg create mode 100644 web/src/components/admin/AdminHeader.vue create mode 100644 web/src/components/admin/AdminSidebar.vue create mode 100644 web/src/components/admin/AdminTags.vue create mode 100644 web/src/store/sidebar.js create mode 100644 web/src/store/tags.js create mode 100644 web/src/views/admin/Home.vue create mode 100644 web/src/views/admin/demo/Editor.vue create mode 100644 web/src/views/admin/demo/Form.vue create mode 100644 web/src/views/admin/demo/Import.vue create mode 100644 web/src/views/admin/demo/Table.vue diff --git a/api/go/core/app_server.go b/api/go/core/app_server.go index 3cacbbcf..b1b5ca41 100644 --- a/api/go/core/app_server.go +++ b/api/go/core/app_server.go @@ -136,7 +136,7 @@ func authorizeMiddleware(s *AppServer) gin.HandlerFunc { if c.Request.URL.Path == "/api/user/login" || c.Request.URL.Path == "/api/admin/login" || c.Request.URL.Path == "/api/user/register" || - c.Request.URL.Path == "/api/config/get" { + c.Request.URL.Path == "/api/admin/config/get" { c.Next() return } diff --git a/api/go/handler/chat_role_handler.go b/api/go/handler/chat_role_handler.go index 6b875d94..01ded3f3 100644 --- a/api/go/handler/chat_role_handler.go +++ b/api/go/handler/chat_role_handler.go @@ -30,23 +30,24 @@ func (h *ChatRoleHandler) List(c *gin.Context) { resp.ERROR(c, "No roles found,"+res.Error.Error()) return } - userId := h.GetInt(c, "user_id", 0) - if userId > 0 { - var user model.User - h.db.First(&user, userId) - var roleKeys []string - err := utils.JsonDecode(user.ChatRoles, &roleKeys) - if err == nil { - for index, r := range roles { - if utils.ContainsStr(roleKeys, r.Key) { - roles = append(roles[:index], roles[index+1:]...) - } - } - } + + user, err := utils.GetLoginUser(c, h.db) + if err != nil { + resp.NotAuth(c) + return + } + var roleKeys []string + err = utils.JsonDecode(user.ChatRoles, &roleKeys) + if err != nil { + resp.ERROR(c, "角色解析失败!") + return } // 转成 vo var roleVos = make([]vo.ChatRole, 0) for _, r := range roles { + if !utils.ContainsStr(roleKeys, r.Key) { + continue + } var v vo.ChatRole err := utils.CopyObject(r, &v) if err == nil { diff --git a/web/package-lock.json b/web/package-lock.json index 1e07dcf3..148c2539 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -17,6 +17,8 @@ "highlight.js": "^11.7.0", "json-bigint": "^1.0.0", "markdown-it": "^13.0.1", + "md-editor-v3": "^2.2.1", + "pinia": "^2.1.4", "qs": "^6.11.1", "sortablejs": "^1.15.0", "vue": "^3.2.13", @@ -1863,8 +1865,7 @@ "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.14", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.18", @@ -2771,65 +2772,49 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.2.33", - "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.2.33.tgz", - "integrity": "sha512-AAmr52ji3Zhk7IKIuigX2osWWsb2nQE5xsdFYjdnmtQ4gymmqXbjLvkSE174+fF3A3kstYrTgGkqgOEbsdLDpw==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.4.tgz", + "integrity": "sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==", "dependencies": { - "@babel/parser": "^7.16.4", - "@vue/shared": "3.2.33", + "@babel/parser": "^7.21.3", + "@vue/shared": "3.3.4", "estree-walker": "^2.0.2", - "source-map": "^0.6.1" - } - }, - "node_modules/@vue/compiler-core/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" + "source-map-js": "^1.0.2" } }, "node_modules/@vue/compiler-dom": { - "version": "3.2.33", - "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.2.33.tgz", - "integrity": "sha512-GhiG1C8X98Xz9QUX/RlA6/kgPBWJkjq0Rq6//5XTAGSYrTMBgcLpP9+CnlUg1TFxnnCVughAG+KZl28XJqw8uQ==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.4.tgz", + "integrity": "sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==", "dependencies": { - "@vue/compiler-core": "3.2.33", - "@vue/shared": "3.2.33" + "@vue/compiler-core": "3.3.4", + "@vue/shared": "3.3.4" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.2.33", - "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.2.33.tgz", - "integrity": "sha512-H8D0WqagCr295pQjUYyO8P3IejM3vEzeCO1apzByAEaAR/WimhMYczHfZVvlCE/9yBaEu/eu9RdiWr0kF8b71Q==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.4.tgz", + "integrity": "sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==", "dependencies": { - "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.33", - "@vue/compiler-dom": "3.2.33", - "@vue/compiler-ssr": "3.2.33", - "@vue/reactivity-transform": "3.2.33", - "@vue/shared": "3.2.33", + "@babel/parser": "^7.20.15", + "@vue/compiler-core": "3.3.4", + "@vue/compiler-dom": "3.3.4", + "@vue/compiler-ssr": "3.3.4", + "@vue/reactivity-transform": "3.3.4", + "@vue/shared": "3.3.4", "estree-walker": "^2.0.2", - "magic-string": "^0.25.7", + "magic-string": "^0.30.0", "postcss": "^8.1.10", - "source-map": "^0.6.1" - } - }, - "node_modules/@vue/compiler-sfc/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" + "source-map-js": "^1.0.2" } }, "node_modules/@vue/compiler-ssr": { - "version": "3.2.33", - "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.2.33.tgz", - "integrity": "sha512-XQh1Xdk3VquDpXsnoCd7JnMoWec9CfAzQDQsaMcSU79OrrO2PNR0ErlIjm/mGq3GmBfkQjzZACV+7GhfRB8xMQ==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.4.tgz", + "integrity": "sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==", "dependencies": { - "@vue/compiler-dom": "3.2.33", - "@vue/shared": "3.2.33" + "@vue/compiler-dom": "3.3.4", + "@vue/shared": "3.3.4" } }, "node_modules/@vue/component-compiler-utils": { @@ -2902,65 +2887,65 @@ "dev": true }, "node_modules/@vue/devtools-api": { - "version": "6.1.4", - "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.1.4.tgz", - "integrity": "sha512-IiA0SvDrJEgXvVxjNkHPFfDx6SXw0b/TUkqMcDZWNg9fnCAHbTpoo59YfJ9QLFkwa3raau5vSlRVzMSLDnfdtQ==" + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.0.tgz", + "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==" }, "node_modules/@vue/reactivity": { - "version": "3.2.33", - "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.2.33.tgz", - "integrity": "sha512-62Sq0mp9/0bLmDuxuLD5CIaMG2susFAGARLuZ/5jkU1FCf9EDbwUuF+BO8Ub3Rbodx0ziIecM/NsmyjardBxfQ==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.4.tgz", + "integrity": "sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==", "dependencies": { - "@vue/shared": "3.2.33" + "@vue/shared": "3.3.4" } }, "node_modules/@vue/reactivity-transform": { - "version": "3.2.33", - "resolved": "https://registry.npmmirror.com/@vue/reactivity-transform/-/reactivity-transform-3.2.33.tgz", - "integrity": "sha512-4UL5KOIvSQb254aqenW4q34qMXbfZcmEsV/yVidLUgvwYQQ/D21bGX3DlgPUGI3c4C+iOnNmDCkIxkILoX/Pyw==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.4.tgz", + "integrity": "sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==", "dependencies": { - "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.33", - "@vue/shared": "3.2.33", + "@babel/parser": "^7.20.15", + "@vue/compiler-core": "3.3.4", + "@vue/shared": "3.3.4", "estree-walker": "^2.0.2", - "magic-string": "^0.25.7" + "magic-string": "^0.30.0" } }, "node_modules/@vue/runtime-core": { - "version": "3.2.33", - "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.2.33.tgz", - "integrity": "sha512-N2D2vfaXsBPhzCV3JsXQa2NECjxP3eXgZlFqKh4tgakp3iX6LCGv76DLlc+IfFZq+TW10Y8QUfeihXOupJ1dGw==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.4.tgz", + "integrity": "sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==", "dependencies": { - "@vue/reactivity": "3.2.33", - "@vue/shared": "3.2.33" + "@vue/reactivity": "3.3.4", + "@vue/shared": "3.3.4" } }, "node_modules/@vue/runtime-dom": { - "version": "3.2.33", - "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.2.33.tgz", - "integrity": "sha512-LSrJ6W7CZTSUygX5s8aFkraDWlO6K4geOwA3quFF2O+hC3QuAMZt/0Xb7JKE3C4JD4pFwCSO7oCrZmZ0BIJUnw==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.4.tgz", + "integrity": "sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==", "dependencies": { - "@vue/runtime-core": "3.2.33", - "@vue/shared": "3.2.33", - "csstype": "^2.6.8" + "@vue/runtime-core": "3.3.4", + "@vue/shared": "3.3.4", + "csstype": "^3.1.1" } }, "node_modules/@vue/server-renderer": { - "version": "3.2.33", - "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.2.33.tgz", - "integrity": "sha512-4jpJHRD4ORv8PlbYi+/MfP8ec1okz6rybe36MdpkDrGIdEItHEUyaHSKvz+ptNEyQpALmmVfRteHkU9F8vxOew==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.4.tgz", + "integrity": "sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==", "dependencies": { - "@vue/compiler-ssr": "3.2.33", - "@vue/shared": "3.2.33" + "@vue/compiler-ssr": "3.3.4", + "@vue/shared": "3.3.4" }, "peerDependencies": { - "vue": "3.2.33" + "vue": "3.3.4" } }, "node_modules/@vue/shared": { - "version": "3.2.33", - "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.2.33.tgz", - "integrity": "sha512-UBc1Pg1T3yZ97vsA2ueER0F6GbJebLHYlEi4ou1H5YL4KWvMOOWwpYo9/QpWq93wxKG6Wo13IY74Hcn/f7c7Bg==" + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.4.tgz", + "integrity": "sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==" }, "node_modules/@vue/web-component-wrapper": { "version": "1.3.0", @@ -4708,9 +4693,9 @@ } }, "node_modules/csstype": { - "version": "2.6.20", - "resolved": "https://registry.npmmirror.com/csstype/-/csstype-2.6.20.tgz", - "integrity": "sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" }, "node_modules/dayjs": { "version": "1.11.2", @@ -5717,7 +5702,7 @@ }, "node_modules/estree-walker": { "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" }, "node_modules/esutils": { @@ -7348,11 +7333,14 @@ } }, "node_modules/magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz", + "integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==", "dependencies": { - "sourcemap-codec": "^1.4.8" + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" } }, "node_modules/make-dir": { @@ -7398,6 +7386,14 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/md-editor-v3": { + "version": "2.11.3", + "resolved": "https://registry.npmjs.org/md-editor-v3/-/md-editor-v3-2.11.3.tgz", + "integrity": "sha512-SCfS4qMy0HldFdplcIGUMCpSv8qkNWkYShSdv2gTHeViKduA34zV89BOrWcqls2EZSlvt2n3G7nHRzYUvJjDKw==", + "peerDependencies": { + "vue": "^3.2.47" + } + }, "node_modules/mdn-data": { "version": "2.0.14", "resolved": "https://registry.npmmirror.com/mdn-data/-/mdn-data-2.0.14.tgz", @@ -8253,6 +8249,56 @@ "node": ">=8.6" } }, + "node_modules/pinia": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.1.4.tgz", + "integrity": "sha512-vYlnDu+Y/FXxv1ABo1vhjC+IbqvzUdiUC3sfDRrRyY2CQSrqqaa+iiHmqtARFxJVqWQMCJfXx1PBvFs9aJVLXQ==", + "dependencies": { + "@vue/devtools-api": "^6.5.0", + "vue-demi": ">=0.14.5" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "@vue/composition-api": "^1.4.0", + "typescript": ">=4.4.4", + "vue": "^2.6.14 || ^3.3.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/pinia/node_modules/vue-demi": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.5.tgz", + "integrity": "sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, "node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -8919,9 +8965,9 @@ } }, "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "dev": true, "engines": { "node": ">=6" @@ -9639,11 +9685,6 @@ "node": ">=0.10.0" } }, - "node_modules/sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmmirror.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" - }, "node_modules/spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmmirror.com/spdx-correct/-/spdx-correct-3.1.1.tgz", @@ -10398,15 +10439,15 @@ } }, "node_modules/vue": { - "version": "3.2.33", - "resolved": "https://registry.npmmirror.com/vue/-/vue-3.2.33.tgz", - "integrity": "sha512-si1ExAlDUrLSIg/V7D/GgA4twJwfsfgG+t9w10z38HhL/HA07132pUQ2KuwAo8qbCyMJ9e6OqrmWrOCr+jW7ZQ==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.4.tgz", + "integrity": "sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==", "dependencies": { - "@vue/compiler-dom": "3.2.33", - "@vue/compiler-sfc": "3.2.33", - "@vue/runtime-dom": "3.2.33", - "@vue/server-renderer": "3.2.33", - "@vue/shared": "3.2.33" + "@vue/compiler-dom": "3.3.4", + "@vue/compiler-sfc": "3.3.4", + "@vue/runtime-dom": "3.3.4", + "@vue/server-renderer": "3.3.4", + "@vue/shared": "3.3.4" } }, "node_modules/vue-eslint-parser": { @@ -12598,8 +12639,7 @@ "@jridgewell/sourcemap-codec": { "version": "1.4.14", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" }, "@jridgewell/trace-mapping": { "version": "0.3.18", @@ -13361,63 +13401,49 @@ } }, "@vue/compiler-core": { - "version": "3.2.33", - "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.2.33.tgz", - "integrity": "sha512-AAmr52ji3Zhk7IKIuigX2osWWsb2nQE5xsdFYjdnmtQ4gymmqXbjLvkSE174+fF3A3kstYrTgGkqgOEbsdLDpw==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.4.tgz", + "integrity": "sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==", "requires": { - "@babel/parser": "^7.16.4", - "@vue/shared": "3.2.33", + "@babel/parser": "^7.21.3", + "@vue/shared": "3.3.4", "estree-walker": "^2.0.2", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } + "source-map-js": "^1.0.2" } }, "@vue/compiler-dom": { - "version": "3.2.33", - "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.2.33.tgz", - "integrity": "sha512-GhiG1C8X98Xz9QUX/RlA6/kgPBWJkjq0Rq6//5XTAGSYrTMBgcLpP9+CnlUg1TFxnnCVughAG+KZl28XJqw8uQ==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.4.tgz", + "integrity": "sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==", "requires": { - "@vue/compiler-core": "3.2.33", - "@vue/shared": "3.2.33" + "@vue/compiler-core": "3.3.4", + "@vue/shared": "3.3.4" } }, "@vue/compiler-sfc": { - "version": "3.2.33", - "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.2.33.tgz", - "integrity": "sha512-H8D0WqagCr295pQjUYyO8P3IejM3vEzeCO1apzByAEaAR/WimhMYczHfZVvlCE/9yBaEu/eu9RdiWr0kF8b71Q==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.4.tgz", + "integrity": "sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==", "requires": { - "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.33", - "@vue/compiler-dom": "3.2.33", - "@vue/compiler-ssr": "3.2.33", - "@vue/reactivity-transform": "3.2.33", - "@vue/shared": "3.2.33", + "@babel/parser": "^7.20.15", + "@vue/compiler-core": "3.3.4", + "@vue/compiler-dom": "3.3.4", + "@vue/compiler-ssr": "3.3.4", + "@vue/reactivity-transform": "3.3.4", + "@vue/shared": "3.3.4", "estree-walker": "^2.0.2", - "magic-string": "^0.25.7", + "magic-string": "^0.30.0", "postcss": "^8.1.10", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } + "source-map-js": "^1.0.2" } }, "@vue/compiler-ssr": { - "version": "3.2.33", - "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.2.33.tgz", - "integrity": "sha512-XQh1Xdk3VquDpXsnoCd7JnMoWec9CfAzQDQsaMcSU79OrrO2PNR0ErlIjm/mGq3GmBfkQjzZACV+7GhfRB8xMQ==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.4.tgz", + "integrity": "sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==", "requires": { - "@vue/compiler-dom": "3.2.33", - "@vue/shared": "3.2.33" + "@vue/compiler-dom": "3.3.4", + "@vue/shared": "3.3.4" } }, "@vue/component-compiler-utils": { @@ -13484,62 +13510,62 @@ } }, "@vue/devtools-api": { - "version": "6.1.4", - "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.1.4.tgz", - "integrity": "sha512-IiA0SvDrJEgXvVxjNkHPFfDx6SXw0b/TUkqMcDZWNg9fnCAHbTpoo59YfJ9QLFkwa3raau5vSlRVzMSLDnfdtQ==" + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.0.tgz", + "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==" }, "@vue/reactivity": { - "version": "3.2.33", - "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.2.33.tgz", - "integrity": "sha512-62Sq0mp9/0bLmDuxuLD5CIaMG2susFAGARLuZ/5jkU1FCf9EDbwUuF+BO8Ub3Rbodx0ziIecM/NsmyjardBxfQ==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.4.tgz", + "integrity": "sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==", "requires": { - "@vue/shared": "3.2.33" + "@vue/shared": "3.3.4" } }, "@vue/reactivity-transform": { - "version": "3.2.33", - "resolved": "https://registry.npmmirror.com/@vue/reactivity-transform/-/reactivity-transform-3.2.33.tgz", - "integrity": "sha512-4UL5KOIvSQb254aqenW4q34qMXbfZcmEsV/yVidLUgvwYQQ/D21bGX3DlgPUGI3c4C+iOnNmDCkIxkILoX/Pyw==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.4.tgz", + "integrity": "sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==", "requires": { - "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.33", - "@vue/shared": "3.2.33", + "@babel/parser": "^7.20.15", + "@vue/compiler-core": "3.3.4", + "@vue/shared": "3.3.4", "estree-walker": "^2.0.2", - "magic-string": "^0.25.7" + "magic-string": "^0.30.0" } }, "@vue/runtime-core": { - "version": "3.2.33", - "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.2.33.tgz", - "integrity": "sha512-N2D2vfaXsBPhzCV3JsXQa2NECjxP3eXgZlFqKh4tgakp3iX6LCGv76DLlc+IfFZq+TW10Y8QUfeihXOupJ1dGw==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.4.tgz", + "integrity": "sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==", "requires": { - "@vue/reactivity": "3.2.33", - "@vue/shared": "3.2.33" + "@vue/reactivity": "3.3.4", + "@vue/shared": "3.3.4" } }, "@vue/runtime-dom": { - "version": "3.2.33", - "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.2.33.tgz", - "integrity": "sha512-LSrJ6W7CZTSUygX5s8aFkraDWlO6K4geOwA3quFF2O+hC3QuAMZt/0Xb7JKE3C4JD4pFwCSO7oCrZmZ0BIJUnw==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.4.tgz", + "integrity": "sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==", "requires": { - "@vue/runtime-core": "3.2.33", - "@vue/shared": "3.2.33", - "csstype": "^2.6.8" + "@vue/runtime-core": "3.3.4", + "@vue/shared": "3.3.4", + "csstype": "^3.1.1" } }, "@vue/server-renderer": { - "version": "3.2.33", - "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.2.33.tgz", - "integrity": "sha512-4jpJHRD4ORv8PlbYi+/MfP8ec1okz6rybe36MdpkDrGIdEItHEUyaHSKvz+ptNEyQpALmmVfRteHkU9F8vxOew==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.4.tgz", + "integrity": "sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==", "requires": { - "@vue/compiler-ssr": "3.2.33", - "@vue/shared": "3.2.33" + "@vue/compiler-ssr": "3.3.4", + "@vue/shared": "3.3.4" } }, "@vue/shared": { - "version": "3.2.33", - "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.2.33.tgz", - "integrity": "sha512-UBc1Pg1T3yZ97vsA2ueER0F6GbJebLHYlEi4ou1H5YL4KWvMOOWwpYo9/QpWq93wxKG6Wo13IY74Hcn/f7c7Bg==" + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.4.tgz", + "integrity": "sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==" }, "@vue/web-component-wrapper": { "version": "1.3.0", @@ -14924,9 +14950,9 @@ } }, "csstype": { - "version": "2.6.20", - "resolved": "https://registry.npmmirror.com/csstype/-/csstype-2.6.20.tgz", - "integrity": "sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" }, "dayjs": { "version": "1.11.2", @@ -15716,7 +15742,7 @@ }, "estree-walker": { "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" }, "esutils": { @@ -17032,11 +17058,11 @@ } }, "magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz", + "integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==", "requires": { - "sourcemap-codec": "^1.4.8" + "@jridgewell/sourcemap-codec": "^1.4.13" } }, "make-dir": { @@ -17072,6 +17098,12 @@ } } }, + "md-editor-v3": { + "version": "2.11.3", + "resolved": "https://registry.npmjs.org/md-editor-v3/-/md-editor-v3-2.11.3.tgz", + "integrity": "sha512-SCfS4qMy0HldFdplcIGUMCpSv8qkNWkYShSdv2gTHeViKduA34zV89BOrWcqls2EZSlvt2n3G7nHRzYUvJjDKw==", + "requires": {} + }, "mdn-data": { "version": "2.0.14", "resolved": "https://registry.npmmirror.com/mdn-data/-/mdn-data-2.0.14.tgz", @@ -17752,6 +17784,23 @@ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true }, + "pinia": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.1.4.tgz", + "integrity": "sha512-vYlnDu+Y/FXxv1ABo1vhjC+IbqvzUdiUC3sfDRrRyY2CQSrqqaa+iiHmqtARFxJVqWQMCJfXx1PBvFs9aJVLXQ==", + "requires": { + "@vue/devtools-api": "^6.5.0", + "vue-demi": ">=0.14.5" + }, + "dependencies": { + "vue-demi": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.5.tgz", + "integrity": "sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==", + "requires": {} + } + } + }, "pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -18198,9 +18247,9 @@ } }, "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "dev": true }, "qs": { @@ -18803,11 +18852,6 @@ } } }, - "sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmmirror.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" - }, "spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmmirror.com/spdx-correct/-/spdx-correct-3.1.1.tgz", @@ -19391,15 +19435,15 @@ "dev": true }, "vue": { - "version": "3.2.33", - "resolved": "https://registry.npmmirror.com/vue/-/vue-3.2.33.tgz", - "integrity": "sha512-si1ExAlDUrLSIg/V7D/GgA4twJwfsfgG+t9w10z38HhL/HA07132pUQ2KuwAo8qbCyMJ9e6OqrmWrOCr+jW7ZQ==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.4.tgz", + "integrity": "sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==", "requires": { - "@vue/compiler-dom": "3.2.33", - "@vue/compiler-sfc": "3.2.33", - "@vue/runtime-dom": "3.2.33", - "@vue/server-renderer": "3.2.33", - "@vue/shared": "3.2.33" + "@vue/compiler-dom": "3.3.4", + "@vue/compiler-sfc": "3.3.4", + "@vue/runtime-dom": "3.3.4", + "@vue/server-renderer": "3.3.4", + "@vue/shared": "3.3.4" } }, "vue-eslint-parser": { diff --git a/web/package.json b/web/package.json index b0164e2c..158776cd 100644 --- a/web/package.json +++ b/web/package.json @@ -17,6 +17,8 @@ "highlight.js": "^11.7.0", "json-bigint": "^1.0.0", "markdown-it": "^13.0.1", + "md-editor-v3": "^2.2.1", + "pinia": "^2.1.4", "qs": "^6.11.1", "sortablejs": "^1.15.0", "vue": "^3.2.13", diff --git a/web/src/App.vue b/web/src/App.vue index 6a46d3f6..d966ef20 100644 --- a/web/src/App.vue +++ b/web/src/App.vue @@ -1,15 +1,12 @@ - diff --git a/web/src/assets/css/color-dark.css b/web/src/assets/css/color-dark.css new file mode 100644 index 00000000..7f322765 --- /dev/null +++ b/web/src/assets/css/color-dark.css @@ -0,0 +1,23 @@ +.header{ + background-color: #242f42; +} +.login-wrap{ + background: #324157; +} +.plugins-tips{ + background: #eef1f6; +} +.plugins-tips a{ + color: #20a0ff; +} + +.tags-li.active { + border: 1px solid #409EFF; + background-color: #409EFF; +} +.message-title{ + color: #20a0ff; +} +.collapse-btn:hover{ + background: rgb(40,52,70); +} \ No newline at end of file diff --git a/web/src/assets/css/main.css b/web/src/assets/css/main.css new file mode 100644 index 00000000..6b2241c9 --- /dev/null +++ b/web/src/assets/css/main.css @@ -0,0 +1,138 @@ +* { + margin: 0; + padding: 0; +} + +html, +body, +#app, +.wrapper { + width: 100%; + height: 100%; + overflow: hidden; +} + +body { + font-family: 'PingFang SC', "Helvetica Neue", Helvetica, "microsoft yahei", arial, STHeiTi, sans-serif; +} + +a { + text-decoration: none +} + + +.content-box { + position: absolute; + left: 250px; + right: 0; + top: 70px; + bottom: 0; + padding-bottom: 30px; + -webkit-transition: left .3s ease-in-out; + transition: left .3s ease-in-out; + background: #f0f0f0; +} + +.content { + width: auto; + height: 100%; + padding: 10px; + overflow-y: scroll; + box-sizing: border-box; +} + +.content-collapse { + left: 65px; +} + +.container { + padding: 30px; + background: #fff; + border: 1px solid #ddd; + border-radius: 5px; +} + +.crumbs { + margin: 10px 0; +} + +.el-table th { + background-color: #f5f7fa !important; +} + +.pagination { + margin: 20px 0; + text-align: right; +} + +.plugins-tips { + padding: 20px 10px; + margin-bottom: 20px; +} + +.el-button + .el-tooltip { + margin-left: 10px; +} + +.el-table tr:hover { + background: #f6faff; +} + +.mgb20 { + margin-bottom: 20px; +} + +.move-enter-active, +.move-leave-active { + transition: opacity .1s ease; +} + +.move-enter-from, +.move-leave-to { + opacity: 0; +} + +/*BaseForm*/ + +.form-box { + width: 600px; +} + +.form-box .line { + text-align: center; +} + +.el-time-panel__content::after, +.el-time-panel__content::before { + margin-top: -7px; +} + +.el-time-spinner__wrapper .el-scrollbar__wrap:not(.el-scrollbar__wrap--hidden-default) { + padding-bottom: 0; +} + + +[class*=" el-icon-"], [class^=el-icon-] { + speak: none; + font-style: normal; + font-weight: 400; + font-variant: normal; + text-transform: none; + line-height: 1; + vertical-align: baseline; + display: inline-block; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.el-sub-menu [class^=el-icon-] { + vertical-align: middle; + margin-right: 5px; + width: 24px; + text-align: center; + font-size: 18px; +} + +[hidden] { + display: none !important; +} \ No newline at end of file diff --git a/web/src/assets/iconfont/iconfont.css b/web/src/assets/iconfont/iconfont.css index f4eec58e..2a1f47eb 100644 --- a/web/src/assets/iconfont/iconfont.css +++ b/web/src/assets/iconfont/iconfont.css @@ -1,8 +1,8 @@ @font-face { font-family: "iconfont"; /* Project id 4125778 */ - src: url('iconfont.woff2?t=1686901862117') format('woff2'), - url('iconfont.woff?t=1686901862117') format('woff'), - url('iconfont.ttf?t=1686901862117') format('truetype'); + src: url('iconfont.woff2?t=1687320603149') format('woff2'), + url('iconfont.woff?t=1687320603149') format('woff'), + url('iconfont.ttf?t=1687320603149') format('truetype'); } .iconfont { @@ -13,6 +13,50 @@ -moz-osx-font-smoothing: grayscale; } +.icon-home:before { + content: "\e6cb"; +} + +.icon-menu:before { + content: "\e6a6"; +} + +.icon-log:before { + content: "\e61c"; +} + +.icon-user-fill:before { + content: "\e7d5"; +} + +.icon-user-circle:before { + content: "\e860"; +} + +.icon-chart:before { + content: "\e631"; +} + +.icon-wechat:before { + content: "\e621"; +} + +.icon-config:before { + content: "\e612"; +} + +.icon-api-key:before { + content: "\e7d8"; +} + +.icon-role:before { + content: "\e60a"; +} + +.icon-dashboard:before { + content: "\e602"; +} + .icon-password:before { content: "\e62a"; } diff --git a/web/src/assets/iconfont/iconfont.js b/web/src/assets/iconfont/iconfont.js index 10e33f86..9dd75e0c 100644 --- a/web/src/assets/iconfont/iconfont.js +++ b/web/src/assets/iconfont/iconfont.js @@ -1 +1 @@ -window._iconfont_svg_string_4125778='',function(n){var t=(t=document.getElementsByTagName("script"))[t.length-1],e=t.getAttribute("data-injectcss"),t=t.getAttribute("data-disable-injectsvg");if(!t){var o,i,c,l,d,a=function(t,e){e.parentNode.insertBefore(t,e)};if(e&&!n.__iconfont__svg__cssinject__){n.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(t){console&&console.log(t)}}o=function(){var t,e=document.createElement("div");e.innerHTML=n._iconfont_svg_string_4125778,(e=e.getElementsByTagName("svg")[0])&&(e.setAttribute("aria-hidden","true"),e.style.position="absolute",e.style.width=0,e.style.height=0,e.style.overflow="hidden",e=e,(t=document.body).firstChild?a(e,t.firstChild):t.appendChild(e))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(o,0):(i=function(){document.removeEventListener("DOMContentLoaded",i,!1),o()},document.addEventListener("DOMContentLoaded",i,!1)):document.attachEvent&&(c=o,l=n.document,d=!1,r(),l.onreadystatechange=function(){"complete"==l.readyState&&(l.onreadystatechange=null,s())})}function s(){d||(d=!0,c())}function r(){try{l.documentElement.doScroll("left")}catch(t){return void setTimeout(r,50)}s()}}(window); \ No newline at end of file +window._iconfont_svg_string_4125778='',function(t){var l=(l=document.getElementsByTagName("script"))[l.length-1],c=l.getAttribute("data-injectcss"),l=l.getAttribute("data-disable-injectsvg");if(!l){var a,e,o,i,n,s=function(l,c){c.parentNode.insertBefore(l,c)};if(c&&!t.__iconfont__svg__cssinject__){t.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(l){console&&console.log(l)}}a=function(){var l,c=document.createElement("div");c.innerHTML=t._iconfont_svg_string_4125778,(c=c.getElementsByTagName("svg")[0])&&(c.setAttribute("aria-hidden","true"),c.style.position="absolute",c.style.width=0,c.style.height=0,c.style.overflow="hidden",c=c,(l=document.body).firstChild?s(c,l.firstChild):l.appendChild(c))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(a,0):(e=function(){document.removeEventListener("DOMContentLoaded",e,!1),a()},document.addEventListener("DOMContentLoaded",e,!1)):document.attachEvent&&(o=a,i=t.document,n=!1,h(),i.onreadystatechange=function(){"complete"==i.readyState&&(i.onreadystatechange=null,d())})}function d(){n||(n=!0,o())}function h(){try{i.documentElement.doScroll("left")}catch(l){return void setTimeout(h,50)}d()}}(window); \ No newline at end of file diff --git a/web/src/assets/iconfont/iconfont.js:Zone.Identifier b/web/src/assets/iconfont/iconfont.js:Zone.Identifier deleted file mode 100644 index df2640e1..00000000 --- a/web/src/assets/iconfont/iconfont.js:Zone.Identifier +++ /dev/null @@ -1,4 +0,0 @@ -[ZoneTransfer] -ZoneId=3 -ReferrerUrl=https://www.iconfont.cn/manage/index?manage_type=myprojects&projectId=4125778 -HostUrl=https://www.iconfont.cn/api/project/download.zip?spm=a313x.7781069.1998910419.d7543c303&pid=4125778&ctoken=SHhMU2NkC6BavrZsXJmrL-LS diff --git a/web/src/assets/iconfont/iconfont.json b/web/src/assets/iconfont/iconfont.json index e3d0c29c..e73613e4 100644 --- a/web/src/assets/iconfont/iconfont.json +++ b/web/src/assets/iconfont/iconfont.json @@ -5,6 +5,83 @@ "css_prefix_text": "icon-", "description": "", "glyphs": [ + { + "icon_id": "673799", + "name": "首页", + "font_class": "home", + "unicode": "e6cb", + "unicode_decimal": 59083 + }, + { + "icon_id": "11808058", + "name": "menu", + "font_class": "menu", + "unicode": "e6a6", + "unicode_decimal": 59046 + }, + { + "icon_id": "1166053", + "name": "日志", + "font_class": "log", + "unicode": "e61c", + "unicode_decimal": 58908 + }, + { + "icon_id": "6151151", + "name": "user-fill", + "font_class": "user-fill", + "unicode": "e7d5", + "unicode_decimal": 59349 + }, + { + "icon_id": "6172778", + "name": "user-circle", + "font_class": "user-circle", + "unicode": "e860", + "unicode_decimal": 59488 + }, + { + "icon_id": "7821146", + "name": "chart", + "font_class": "chart", + "unicode": "e631", + "unicode_decimal": 58929 + }, + { + "icon_id": "8430216", + "name": "wechat", + "font_class": "wechat", + "unicode": "e621", + "unicode_decimal": 58913 + }, + { + "icon_id": "9769247", + "name": "config", + "font_class": "config", + "unicode": "e612", + "unicode_decimal": 58898 + }, + { + "icon_id": "10055632", + "name": "API密钥", + "font_class": "api-key", + "unicode": "e7d8", + "unicode_decimal": 59352 + }, + { + "icon_id": "11466716", + "name": "mg-role", + "font_class": "role", + "unicode": "e60a", + "unicode_decimal": 58890 + }, + { + "icon_id": "4194141", + "name": "首页dashboard", + "font_class": "dashboard", + "unicode": "e602", + "unicode_decimal": 58882 + }, { "icon_id": "611345", "name": "密码", diff --git a/web/src/assets/iconfont/iconfont.ttf b/web/src/assets/iconfont/iconfont.ttf index 6b8609916cf70804d8b87fb27d71daf8e98899f3..13c4338af6b74e39205e28d95548e1af1cb98602 100644 GIT binary patch literal 6108 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 H9bozaDuZJH diff --git a/web/src/assets/iconfont/iconfont.woff b/web/src/assets/iconfont/iconfont.woff index 9988cbfd0680e06685b2e945af3420321352f141..2b908ad35daac5d7168bcd78501b68fe67b8dd5d 100644 GIT binary patch delta 3647 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%0Av z6H!msyJUnFbN1xaQ_~Yp&RUYmj%8^cn+f;*-Ld{ec}XRIkv!xcY-~QTxd9ipt{iJ; zZ9Cf@Te*b}EY7%(4YVw)H2`~tm$|>V{Z@Z@(NJIC(83{@Tvg+EQ$zm))N>Z=xmk{) z5xocu_R&>yFYNP>S$H>_gLho+rky(TGH%qA?a8t zpcbkZB%Y5ts~{aQqG-YTd|iL! zz`oIcaai}z)?hH3?2QC{GTP3G`9xpT_6ADz9u^PVf6q1|La+vFgF6Z91Kh#Q2=X5 z4XpqG0C=2ZU}RumZusB85X181KM=4yVE~Gt0098U>61%wO?|G|6)02;Ib)3YZ9Ljiwnj7tuKAQ%Su6!Fzodk_zW z@GGP!hDS_qU(;?oo0-+Hg8k^&e?}B2!BIh=MuQd|dfafw0|Q1p88?0-zR{jb=hrqz z3e#ep>%XOJP>w2PWJuzq%SkA|FLtfvVW$_pdGL-}Eu)#e47xdFjHeHpN7}WxmOdx3 R+GO&~*arucvnKig003sWv7-P0 delta 1248 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 b9LlK>uEcg0u(ykr3L0clR8kIlGy(tsf{S11 diff --git a/web/src/assets/img/avatar.jpg b/web/src/assets/img/avatar.jpg new file mode 100644 index 0000000000000000000000000000000000000000..580598a1d137527fd7a1e6078480210ea030518d GIT binary patch literal 8583 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 s=CtX