From 3b490535250d7e5b7d81fbbdeaad0c80dd191192 Mon Sep 17 00:00:00 2001 From: 0xJacky Date: Sun, 31 Jul 2022 10:04:11 +0800 Subject: [PATCH 1/9] [frontend-next] Refactored dashboard --- frontend-next/components.d.ts | 7 +- frontend-next/package.json | 3 +- frontend-next/src/App.vue | 15 +- frontend-next/src/api/analytic.ts | 9 + frontend-next/src/api/auth.ts | 2 +- .../src/components/Chart/AreaChart.vue | 138 +++++++ .../src/components/Chart/CPUChart.vue | 140 -------- .../src/components/Chart/DiskChart.vue | 139 ------- .../src/components/Chart/LineChart.vue | 37 -- .../src/components/Chart/NetChart.vue | 144 -------- .../src/components/Chart/RadialBarChart.vue | 132 ++++--- frontend-next/src/gettext.ts | 1 + frontend-next/src/layouts/HeaderLayout.vue | 9 +- frontend-next/src/layouts/SideBar.vue | 39 +- frontend-next/src/lib/helper/index.ts | 14 + frontend-next/src/lib/http/index.ts | 38 +- frontend-next/src/lib/theme/index.ts | 31 ++ frontend-next/src/lib/websocket/index.ts | 16 + frontend-next/src/pinia/settings.ts | 12 +- frontend-next/src/pinia/user.ts | 11 +- frontend-next/src/routes/index.ts | 1 + .../src/views/dashboard/DashBoard.vue | 340 ++++++++---------- frontend-next/src/views/pty/Terminal.vue | 12 +- frontend-next/vite.config.ts | 36 +- frontend-next/yarn.lock | 77 +++- server/analytic/analytic.go | 16 +- server/analytic/record.go | 178 ++++----- server/api/analytic.go | 192 ++++++---- 28 files changed, 795 insertions(+), 994 deletions(-) create mode 100644 frontend-next/src/api/analytic.ts create mode 100644 frontend-next/src/components/Chart/AreaChart.vue delete mode 100644 frontend-next/src/components/Chart/CPUChart.vue delete mode 100644 frontend-next/src/components/Chart/DiskChart.vue delete mode 100644 frontend-next/src/components/Chart/LineChart.vue delete mode 100644 frontend-next/src/components/Chart/NetChart.vue create mode 100644 frontend-next/src/lib/helper/index.ts create mode 100644 frontend-next/src/lib/theme/index.ts create mode 100644 frontend-next/src/lib/websocket/index.ts diff --git a/frontend-next/components.d.ts b/frontend-next/components.d.ts index 6d0e37b83..9b6901cbd 100644 --- a/frontend-next/components.d.ts +++ b/frontend-next/components.d.ts @@ -26,20 +26,15 @@ declare module '@vue/runtime-core' { ALayoutSider: typeof import('ant-design-vue/es')['LayoutSider'] AMenu: typeof import('ant-design-vue/es')['Menu'] AMenuItem: typeof import('ant-design-vue/es')['MenuItem'] + AreaChart: typeof import('./src/components/Chart/AreaChart.vue')['default'] ARow: typeof import('ant-design-vue/es')['Row'] ASelect: typeof import('ant-design-vue/es')['Select'] ASelectOption: typeof import('ant-design-vue/es')['SelectOption'] AStatistic: typeof import('ant-design-vue/es')['Statistic'] ASubMenu: typeof import('ant-design-vue/es')['SubMenu'] Breadcrumb: typeof import('./src/components/Breadcrumb/Breadcrumb.vue')['default'] - CPUChart: typeof import('./src/components/Chart/CPUChart.vue')['default'] - DiskChart: typeof import('./src/components/Chart/DiskChart.vue')['default'] - DynamicIcon: typeof import('./src/components/DynamicIcon/DynamicIcon.vue')['default'] FooterToolBar: typeof import('./src/components/FooterToolbar/FooterToolBar.vue')['default'] - HelloWorld: typeof import('./src/components/HelloWorld.vue')['default'] - LineChart: typeof import('./src/components/Chart/LineChart.vue')['default'] Logo: typeof import('./src/components/Logo/Logo.vue')['default'] - NetChart: typeof import('./src/components/Chart/NetChart.vue')['default'] PageHeader: typeof import('./src/components/PageHeader/PageHeader.vue')['default'] RadialBarChart: typeof import('./src/components/Chart/RadialBarChart.vue')['default'] RouterLink: typeof import('vue-router')['RouterLink'] diff --git a/frontend-next/package.json b/frontend-next/package.json index c33847408..318659267 100644 --- a/frontend-next/package.json +++ b/frontend-next/package.json @@ -13,6 +13,7 @@ "dependencies": { "@ant-design/icons-vue": "^6.1.0", "ant-design-vue": "^3.2.10", + "apexcharts": "^3.35.4", "axios": "^0.27.2", "lodash": "^4.17.21", "moment": "^2.29.4", @@ -21,9 +22,9 @@ "pinia-plugin-persistedstate": "^1.6.3", "reconnecting-websocket": "^4.4.0", "vue": "^3.2.37", - "vue-apexcharts": "^1.6.2", "vue-chartjs": "^4.1.1", "vue-router": "4", + "vue3-apexcharts": "^1.4.1", "vue3-gettext": "^2.3.0", "vuex": "^4.0.2", "xterm": "^4.19.0", diff --git a/frontend-next/src/App.vue b/frontend-next/src/App.vue index 210233b38..8961a920e 100644 --- a/frontend-next/src/App.vue +++ b/frontend-next/src/App.vue @@ -1,18 +1,19 @@ + + + + + diff --git a/frontend-next/src/components/Chart/CPUChart.vue b/frontend-next/src/components/Chart/CPUChart.vue deleted file mode 100644 index b6e8420d9..000000000 --- a/frontend-next/src/components/Chart/CPUChart.vue +++ /dev/null @@ -1,140 +0,0 @@ - - - - - diff --git a/frontend-next/src/components/Chart/DiskChart.vue b/frontend-next/src/components/Chart/DiskChart.vue deleted file mode 100644 index 05cc450ce..000000000 --- a/frontend-next/src/components/Chart/DiskChart.vue +++ /dev/null @@ -1,139 +0,0 @@ - - - - - diff --git a/frontend-next/src/components/Chart/LineChart.vue b/frontend-next/src/components/Chart/LineChart.vue deleted file mode 100644 index e5b39adfb..000000000 --- a/frontend-next/src/components/Chart/LineChart.vue +++ /dev/null @@ -1,37 +0,0 @@ - - - diff --git a/frontend-next/src/components/Chart/NetChart.vue b/frontend-next/src/components/Chart/NetChart.vue deleted file mode 100644 index 7486006b1..000000000 --- a/frontend-next/src/components/Chart/NetChart.vue +++ /dev/null @@ -1,144 +0,0 @@ - - - - - diff --git a/frontend-next/src/components/Chart/RadialBarChart.vue b/frontend-next/src/components/Chart/RadialBarChart.vue index ba92e4588..474f5312d 100644 --- a/frontend-next/src/components/Chart/RadialBarChart.vue +++ b/frontend-next/src/components/Chart/RadialBarChart.vue @@ -1,102 +1,90 @@ - + + + + <%- title %> diff --git a/frontend-next/package.json b/frontend-next/package.json index 318659267..f710c2d8b 100644 --- a/frontend-next/package.json +++ b/frontend-next/package.json @@ -15,8 +15,8 @@ "ant-design-vue": "^3.2.10", "apexcharts": "^3.35.4", "axios": "^0.27.2", + "dayjs": "^1.11.4", "lodash": "^4.17.21", - "moment": "^2.29.4", "path": "^0.12.7", "pinia": "^2.0.17", "pinia-plugin-persistedstate": "^1.6.3", @@ -24,6 +24,7 @@ "vue": "^3.2.37", "vue-chartjs": "^4.1.1", "vue-router": "4", + "vue3-ace-editor": "^2.2.2", "vue3-apexcharts": "^1.4.1", "vue3-gettext": "^2.3.0", "vuex": "^4.0.2", @@ -34,6 +35,7 @@ "devDependencies": { "@types/lodash": "^4.14.182", "@vitejs/plugin-vue": "^3.0.0", + "@vitejs/plugin-vue-jsx": "^2.0.0", "@zougt/vite-plugin-theme-preprocessor": "^1.4.5", "less": "^4.1.3", "typescript": "^4.6.4", diff --git a/frontend-next/public/vite.svg b/frontend-next/public/vite.svg index e7b8dfb1b..7860dd3ed 100644 --- a/frontend-next/public/vite.svg +++ b/frontend-next/public/vite.svg @@ -1 +1,18 @@ - \ No newline at end of file + diff --git a/frontend-next/src/App.vue b/frontend-next/src/App.vue index 8961a920e..e02a16d44 100644 --- a/frontend-next/src/App.vue +++ b/frontend-next/src/App.vue @@ -2,8 +2,8 @@ // This starter template is using Vue 3 + + + + diff --git a/frontend-next/src/components/Logo/Logo.vue b/frontend-next/src/components/Logo/Logo.vue index 71ee7e45e..36ed557af 100644 --- a/frontend-next/src/components/Logo/Logo.vue +++ b/frontend-next/src/components/Logo/Logo.vue @@ -1,6 +1,5 @@ +import logo from '@/assets/img/logo.png' diff --git a/frontend-next/src/views/domain/ngx_conf/directive/DirectiveAdd.vue b/frontend-next/src/views/domain/ngx_conf/directive/DirectiveAdd.vue index f460529e4..52b0b4075 100644 --- a/frontend-next/src/views/domain/ngx_conf/directive/DirectiveAdd.vue +++ b/frontend-next/src/views/domain/ngx_conf/directive/DirectiveAdd.vue @@ -1,22 +1,69 @@ + + - - diff --git a/frontend-next/src/views/domain/ngx_conf/directive/DirectiveEditor.vue b/frontend-next/src/views/domain/ngx_conf/directive/DirectiveEditor.vue index 4f583b3f6..4f7802fb3 100644 --- a/frontend-next/src/views/domain/ngx_conf/directive/DirectiveEditor.vue +++ b/frontend-next/src/views/domain/ngx_conf/directive/DirectiveEditor.vue @@ -1,75 +1,77 @@ + + - + + diff --git a/frontend-next/src/views/domain/ngx_conf/ngx_constant.js b/frontend-next/src/views/domain/ngx_conf/index.ts similarity index 100% rename from frontend-next/src/views/domain/ngx_conf/ngx_constant.js rename to frontend-next/src/views/domain/ngx_conf/index.ts diff --git a/frontend-next/version.json b/frontend-next/version.json index 398dd01ba..8dfd71540 100644 --- a/frontend-next/version.json +++ b/frontend-next/version.json @@ -1 +1 @@ -{"version":"1.5.0","build_id":6,"total_build":76} \ No newline at end of file +{"version":"1.5.0","build_id":8,"total_build":78} \ No newline at end of file diff --git a/frontend-next/vite.config.ts b/frontend-next/vite.config.ts index 26b8db042..9f6622366 100644 --- a/frontend-next/vite.config.ts +++ b/frontend-next/vite.config.ts @@ -72,4 +72,7 @@ export default defineConfig({ }, }, }, + build: { + chunkSizeWarningLimit: 600 + } }) diff --git a/server/api/cert.go b/server/api/cert.go index 158c57765..09103cdd9 100644 --- a/server/api/cert.go +++ b/server/api/cert.go @@ -1,128 +1,134 @@ package api import ( - "github.com/0xJacky/Nginx-UI/server/tool" - "github.com/0xJacky/Nginx-UI/server/tool/nginx" - "github.com/gin-gonic/gin" - "github.com/gorilla/websocket" - "log" - "net/http" - "os" + "github.com/0xJacky/Nginx-UI/server/tool" + "github.com/0xJacky/Nginx-UI/server/tool/nginx" + "github.com/gin-gonic/gin" + "github.com/gorilla/websocket" + "log" + "net/http" + "os" ) func CertInfo(c *gin.Context) { - domain := c.Param("domain") - - key, err := tool.GetCertInfo(domain) - - c.JSON(http.StatusOK, gin.H{ - "error": err, - "subject_name": key.Subject.CommonName, - "issuer_name": key.Issuer.CommonName, - "not_after": key.NotAfter, - "not_before": key.NotBefore, - }) + domain := c.Param("domain") + + key, err := tool.GetCertInfo(domain) + + if err != nil { + c.JSON(http.StatusOK, gin.H{ + "error": err, + }) + return + } + + c.JSON(http.StatusOK, gin.H{ + "subject_name": key.Subject.CommonName, + "issuer_name": key.Issuer.CommonName, + "not_after": key.NotAfter, + "not_before": key.NotBefore, + }) } func IssueCert(c *gin.Context) { - domain := c.Param("domain") - var upGrader = websocket.Upgrader{ - CheckOrigin: func(r *http.Request) bool { - return true - }, - } - - // upgrade http to websocket - ws, err := upGrader.Upgrade(c.Writer, c.Request, nil) - if err != nil { - log.Println(err) - return - } - - defer func(ws *websocket.Conn) { - err := ws.Close() - if err != nil { - log.Println("defer websocket close err", err) - } - }(ws) - - // read - mt, message, err := ws.ReadMessage() - if err != nil { - log.Println(err) - return - } - - if mt == websocket.TextMessage && string(message) == "go" { - - err = tool.IssueCert(domain) - - if err != nil { - - log.Println(err) - - err = ws.WriteJSON(gin.H{ - "status": "error", - "message": err.Error(), - }) - - if err != nil { - log.Println(err) - return - } - - return - } - - sslCertificatePath := nginx.GetNginxConfPath("ssl/" + domain + "/fullchain.cer") - _, err = os.Stat(sslCertificatePath) - - if err != nil { - log.Println(err) - return - } - - log.Println("[found]", "fullchain.cer") - - err = ws.WriteJSON(gin.H{ - "status": "success", - "message": "[found] fullchain.cer", - }) - - if err != nil { - log.Println(err) - return - } - - sslCertificateKeyPath := nginx.GetNginxConfPath("ssl/" + domain + "/" + domain + ".key") - _, err = os.Stat(sslCertificateKeyPath) - - if err != nil { - log.Println(err) - return - } - - log.Println("[found]", "cert key") - err = ws.WriteJSON(gin.H{ - "status": "success", - "message": "[found] Certificate Key", - }) - - if err != nil { - log.Println(err) - return - } - - err = ws.WriteJSON(gin.H{ - "status": "success", - "message": "Issued certificate successfully", - "ssl_certificate": sslCertificatePath, - "ssl_certificate_key": sslCertificateKeyPath, - }) - - if err != nil { - log.Println(err) - return - } - } + domain := c.Param("domain") + var upGrader = websocket.Upgrader{ + CheckOrigin: func(r *http.Request) bool { + return true + }, + } + + // upgrade http to websocket + ws, err := upGrader.Upgrade(c.Writer, c.Request, nil) + if err != nil { + log.Println(err) + return + } + + defer func(ws *websocket.Conn) { + err := ws.Close() + if err != nil { + log.Println("defer websocket close err", err) + } + }(ws) + + // read + mt, message, err := ws.ReadMessage() + if err != nil { + log.Println(err) + return + } + + if mt == websocket.TextMessage && string(message) == "go" { + + err = tool.IssueCert(domain) + + if err != nil { + + log.Println(err) + + err = ws.WriteJSON(gin.H{ + "status": "error", + "message": err.Error(), + }) + + if err != nil { + log.Println(err) + return + } + + return + } + + sslCertificatePath := nginx.GetNginxConfPath("ssl/" + domain + "/fullchain.cer") + _, err = os.Stat(sslCertificatePath) + + if err != nil { + log.Println(err) + return + } + + log.Println("[found]", "fullchain.cer") + + err = ws.WriteJSON(gin.H{ + "status": "success", + "message": "[found] fullchain.cer", + }) + + if err != nil { + log.Println(err) + return + } + + sslCertificateKeyPath := nginx.GetNginxConfPath("ssl/" + domain + "/" + domain + ".key") + _, err = os.Stat(sslCertificateKeyPath) + + if err != nil { + log.Println(err) + return + } + + log.Println("[found]", "cert key") + err = ws.WriteJSON(gin.H{ + "status": "success", + "message": "[found] Certificate Key", + }) + + if err != nil { + log.Println(err) + return + } + + err = ws.WriteJSON(gin.H{ + "status": "success", + "message": "Issued certificate successfully", + "ssl_certificate": sslCertificatePath, + "ssl_certificate_key": sslCertificateKeyPath, + }) + + if err != nil { + log.Println(err) + return + } + } } From 2f91918f54cb510642e8eeac135f159e7e230786 Mon Sep 17 00:00:00 2001 From: 0xJacky Date: Mon, 1 Aug 2022 16:54:44 +0800 Subject: [PATCH 5/9] [frontend-next] Refactored manage sites --- frontend-next/components.d.ts | 4 + frontend-next/src/routes/index.ts | 2 +- frontend-next/src/views/domain/DomainAdd.vue | 185 +++++++++--------- frontend-next/src/views/domain/DomainEdit.vue | 2 +- frontend-next/src/views/domain/DomainList.vue | 21 ++ .../views/domain/ngx_conf/LocationEditor.vue | 65 +++--- .../views/domain/ngx_conf/NgxConfigEditor.vue | 3 +- .../ngx_conf/directive/DirectiveEditor.vue | 2 +- frontend-next/version.json | 2 +- 9 files changed, 165 insertions(+), 121 deletions(-) diff --git a/frontend-next/components.d.ts b/frontend-next/components.d.ts index 85a7ac0b9..56f47171d 100644 --- a/frontend-next/components.d.ts +++ b/frontend-next/components.d.ts @@ -7,6 +7,7 @@ export {} declare module '@vue/runtime-core' { export interface GlobalComponents { + AAlert: typeof import('ant-design-vue/es')['Alert'] ABreadcrumb: typeof import('ant-design-vue/es')['Breadcrumb'] ABreadcrumbItem: typeof import('ant-design-vue/es')['BreadcrumbItem'] AButton: typeof import('ant-design-vue/es')['Button'] @@ -32,11 +33,14 @@ declare module '@vue/runtime-core' { APagination: typeof import('ant-design-vue/es')['Pagination'] APopconfirm: typeof import('ant-design-vue/es')['Popconfirm'] AreaChart: typeof import('./src/components/Chart/AreaChart.vue')['default'] + AResult: typeof import('ant-design-vue/es')['Result'] ARow: typeof import('ant-design-vue/es')['Row'] ASelect: typeof import('ant-design-vue/es')['Select'] ASelectOption: typeof import('ant-design-vue/es')['SelectOption'] ASpace: typeof import('ant-design-vue/es')['Space'] AStatistic: typeof import('ant-design-vue/es')['Statistic'] + AStep: typeof import('ant-design-vue/es')['Step'] + ASteps: typeof import('ant-design-vue/es')['Steps'] ASubMenu: typeof import('ant-design-vue/es')['SubMenu'] ASwitch: typeof import('ant-design-vue/es')['Switch'] ATable: typeof import('ant-design-vue/es')['Table'] diff --git a/frontend-next/src/routes/index.ts b/frontend-next/src/routes/index.ts index a3f9725b4..877991aff 100644 --- a/frontend-next/src/routes/index.ts +++ b/frontend-next/src/routes/index.ts @@ -52,7 +52,7 @@ export const routes = [ }, { path: 'add', name: () => $gettext('Add Site'), - // component: () => import('@/views/domain/DomainAdd.vue'), + component: () => import('@/views/domain/DomainAdd.vue'), }, { path: ':name', name: () => $gettext('Edit Site'), diff --git a/frontend-next/src/views/domain/DomainAdd.vue b/frontend-next/src/views/domain/DomainAdd.vue index d62f7be63..b8ef310a8 100644 --- a/frontend-next/src/views/domain/DomainAdd.vue +++ b/frontend-next/src/views/domain/DomainAdd.vue @@ -1,3 +1,86 @@ + +