From c41a054c8cfe56cb58bd65a119098d15b281d008 Mon Sep 17 00:00:00 2001 From: 0xJacky Date: Sat, 30 Jul 2022 14:53:33 +0800 Subject: [PATCH] frontend-next base layout --- demo.Dockerfile | 1 + frontend-next/.env.development | 2 + frontend-next/.env.production | 2 + frontend-next/.gitignore | 24 + frontend-next/.vscode/extensions.json | 3 + frontend-next/README.md | 16 + frontend-next/components.d.ts | 64 + frontend-next/gettext.config.js | 5 + frontend-next/index.html | 13 + frontend-next/package.json | 44 + frontend-next/public/favicon.ico | Bin 0 -> 67646 bytes frontend-next/public/vite.svg | 1 + frontend-next/src/App.vue | 35 + frontend-next/src/api/auth.ts | 23 + frontend-next/src/api/login.ts | 0 frontend-next/src/assets/img/logo.png | Bin 0 -> 2275 bytes .../src/components/Breadcrumb/Breadcrumb.vue | 49 + .../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 | 108 + .../FooterToolbar/FooterToolBar.vue | 52 + .../src/components/FooterToolbar/index.js | 3 + frontend-next/src/components/Logo/Logo.vue | 43 + .../src/components/PageHeader/PageHeader.vue | 204 ++ .../src/components/PageHeader/index.js | 3 + .../components/SetLanguage/SetLanguage.vue | 36 + .../src/components/StdDataDisplay/StdCurd.vue | 220 ++ .../StdDataDisplay/StdPagination.vue | 51 + .../components/StdDataDisplay/StdTable.vue | 374 +++ .../components/StdDataEntry/StdCheckGroup.vue | 53 + .../components/StdDataEntry/StdCheckTag.vue | 65 + .../components/StdDataEntry/StdDataEntry.vue | 237 ++ .../components/StdDataEntry/StdDatePicker.vue | 52 + .../StdDataEntry/StdMultiCheckTag.vue | 75 + .../StdDataEntry/StdMultiFilesUpload.vue | 153 ++ .../components/StdDataEntry/StdRadioGroup.vue | 49 + .../StdDataEntry/StdSelectOption.vue | 47 + .../components/StdDataEntry/StdSelector.vue | 156 ++ .../StdDataEntry/StdSingleFileUpload.vue | 105 + .../components/StdDataEntry/StdTransfer.vue | 75 + .../src/components/StdDataEntry/StdUpload.vue | 266 ++ frontend-next/src/dark.less | 1 + frontend-next/src/gettext.ts | 12 + frontend-next/src/language/LINGUAS | 1 + frontend-next/src/language/en/app.po | 508 ++++ frontend-next/src/language/messages.pot | 533 ++++ frontend-next/src/language/translations.json | 1 + frontend-next/src/language/zh_CN/app.po | 639 +++++ frontend-next/src/language/zh_TW/app.po | 642 +++++ frontend-next/src/layouts/BaseLayout.vue | 229 ++ frontend-next/src/layouts/BaseRouterView.vue | 13 + frontend-next/src/layouts/FooterLayout.vue | 22 + frontend-next/src/layouts/HeaderLayout.vue | 83 + frontend-next/src/layouts/Loading.vue | 33 + frontend-next/src/layouts/SideBar.vue | 124 + frontend-next/src/lib/http/index.ts | 52 + frontend-next/src/main.ts | 24 + frontend-next/src/pinia/settings.ts | 16 + frontend-next/src/pinia/user.ts | 20 + frontend-next/src/routes/index.ts | 163 ++ frontend-next/src/style.less | 2 + frontend-next/src/views/config/Config.vue | 56 + frontend-next/src/views/config/ConfigEdit.vue | 78 + .../src/views/dashboard/DashBoard.vue | 327 +++ frontend-next/src/views/domain/DomainAdd.vue | 159 ++ frontend-next/src/views/domain/DomainEdit.vue | 223 ++ frontend-next/src/views/domain/DomainList.vue | 95 + frontend-next/src/views/domain/cert/Cert.vue | 44 + .../src/views/domain/cert/CertInfo.vue | 74 + .../src/views/domain/cert/IssueCert.vue | 169 ++ frontend-next/src/views/domain/methods.js | 37 + .../views/domain/ngx_conf/LocationEditor.vue | 78 + .../views/domain/ngx_conf/NgxConfigEditor.vue | 181 ++ .../ngx_conf/directive/DirectiveAdd.vue | 74 + .../ngx_conf/directive/DirectiveEditor.vue | 92 + .../src/views/domain/ngx_conf/ngx_constant.js | 1 + frontend-next/src/views/other/About.vue | 48 + frontend-next/src/views/other/Error.vue | 62 + frontend-next/src/views/other/Install.vue | 145 ++ frontend-next/src/views/other/Login.vue | 133 + frontend-next/src/views/pty/Terminal.vue | 110 + frontend-next/src/views/user/User.vue | 60 + frontend-next/src/vite-env.d.ts | 7 + frontend-next/tsconfig.json | 34 + frontend-next/tsconfig.node.json | 9 + frontend-next/vite.config.ts | 101 + frontend-next/yarn.lock | 2280 +++++++++++++++++ frontend/.env.development | 4 +- frontend/conversion.log | 19 + frontend/index.html | 24 + frontend/package.json | 163 +- frontend/src/lazy.js | 4 +- frontend/src/lib/http/index.js | 2 +- frontend/src/lib/utils/index.js | 6 +- frontend/src/locale/en/LC_MESSAGES/app.po | 33 +- frontend/src/locale/zh_CN/LC_MESSAGES/app.po | 33 +- frontend/src/translations.json | 2 +- frontend/src/views/config/Config.vue | 2 +- frontend/src/views/config/ConfigEdit.vue | 12 +- frontend/src/views/domain/cert/IssueCert.vue | 18 +- frontend/src/views/other/Login.vue | 7 +- frontend/src/views/user/User.vue | 2 +- frontend/vite.config.js | 77 + frontend/yarn.lock | 1147 ++++++++- go.mod | 4 +- go.sum | 5 - resources/demo/ojbk.me | 13 + 109 files changed, 12353 insertions(+), 188 deletions(-) create mode 100644 frontend-next/.env.development create mode 100644 frontend-next/.env.production create mode 100644 frontend-next/.gitignore create mode 100644 frontend-next/.vscode/extensions.json create mode 100644 frontend-next/README.md create mode 100644 frontend-next/components.d.ts create mode 100644 frontend-next/gettext.config.js create mode 100644 frontend-next/index.html create mode 100644 frontend-next/package.json create mode 100644 frontend-next/public/favicon.ico create mode 100644 frontend-next/public/vite.svg create mode 100644 frontend-next/src/App.vue create mode 100644 frontend-next/src/api/auth.ts create mode 100644 frontend-next/src/api/login.ts create mode 100644 frontend-next/src/assets/img/logo.png create mode 100644 frontend-next/src/components/Breadcrumb/Breadcrumb.vue create mode 100644 frontend-next/src/components/Chart/CPUChart.vue create mode 100644 frontend-next/src/components/Chart/DiskChart.vue create mode 100644 frontend-next/src/components/Chart/LineChart.vue create mode 100644 frontend-next/src/components/Chart/NetChart.vue create mode 100644 frontend-next/src/components/Chart/RadialBarChart.vue create mode 100644 frontend-next/src/components/FooterToolbar/FooterToolBar.vue create mode 100644 frontend-next/src/components/FooterToolbar/index.js create mode 100644 frontend-next/src/components/Logo/Logo.vue create mode 100644 frontend-next/src/components/PageHeader/PageHeader.vue create mode 100644 frontend-next/src/components/PageHeader/index.js create mode 100644 frontend-next/src/components/SetLanguage/SetLanguage.vue create mode 100644 frontend-next/src/components/StdDataDisplay/StdCurd.vue create mode 100644 frontend-next/src/components/StdDataDisplay/StdPagination.vue create mode 100644 frontend-next/src/components/StdDataDisplay/StdTable.vue create mode 100644 frontend-next/src/components/StdDataEntry/StdCheckGroup.vue create mode 100644 frontend-next/src/components/StdDataEntry/StdCheckTag.vue create mode 100644 frontend-next/src/components/StdDataEntry/StdDataEntry.vue create mode 100644 frontend-next/src/components/StdDataEntry/StdDatePicker.vue create mode 100644 frontend-next/src/components/StdDataEntry/StdMultiCheckTag.vue create mode 100644 frontend-next/src/components/StdDataEntry/StdMultiFilesUpload.vue create mode 100644 frontend-next/src/components/StdDataEntry/StdRadioGroup.vue create mode 100644 frontend-next/src/components/StdDataEntry/StdSelectOption.vue create mode 100644 frontend-next/src/components/StdDataEntry/StdSelector.vue create mode 100644 frontend-next/src/components/StdDataEntry/StdSingleFileUpload.vue create mode 100644 frontend-next/src/components/StdDataEntry/StdTransfer.vue create mode 100644 frontend-next/src/components/StdDataEntry/StdUpload.vue create mode 100644 frontend-next/src/dark.less create mode 100644 frontend-next/src/gettext.ts create mode 100644 frontend-next/src/language/LINGUAS create mode 100644 frontend-next/src/language/en/app.po create mode 100644 frontend-next/src/language/messages.pot create mode 100644 frontend-next/src/language/translations.json create mode 100644 frontend-next/src/language/zh_CN/app.po create mode 100644 frontend-next/src/language/zh_TW/app.po create mode 100644 frontend-next/src/layouts/BaseLayout.vue create mode 100644 frontend-next/src/layouts/BaseRouterView.vue create mode 100644 frontend-next/src/layouts/FooterLayout.vue create mode 100644 frontend-next/src/layouts/HeaderLayout.vue create mode 100644 frontend-next/src/layouts/Loading.vue create mode 100644 frontend-next/src/layouts/SideBar.vue create mode 100644 frontend-next/src/lib/http/index.ts create mode 100644 frontend-next/src/main.ts create mode 100644 frontend-next/src/pinia/settings.ts create mode 100644 frontend-next/src/pinia/user.ts create mode 100644 frontend-next/src/routes/index.ts create mode 100644 frontend-next/src/style.less create mode 100644 frontend-next/src/views/config/Config.vue create mode 100644 frontend-next/src/views/config/ConfigEdit.vue create mode 100644 frontend-next/src/views/dashboard/DashBoard.vue create mode 100644 frontend-next/src/views/domain/DomainAdd.vue create mode 100644 frontend-next/src/views/domain/DomainEdit.vue create mode 100644 frontend-next/src/views/domain/DomainList.vue create mode 100644 frontend-next/src/views/domain/cert/Cert.vue create mode 100644 frontend-next/src/views/domain/cert/CertInfo.vue create mode 100644 frontend-next/src/views/domain/cert/IssueCert.vue create mode 100644 frontend-next/src/views/domain/methods.js create mode 100644 frontend-next/src/views/domain/ngx_conf/LocationEditor.vue create mode 100644 frontend-next/src/views/domain/ngx_conf/NgxConfigEditor.vue create mode 100644 frontend-next/src/views/domain/ngx_conf/directive/DirectiveAdd.vue create mode 100644 frontend-next/src/views/domain/ngx_conf/directive/DirectiveEditor.vue create mode 100644 frontend-next/src/views/domain/ngx_conf/ngx_constant.js create mode 100644 frontend-next/src/views/other/About.vue create mode 100644 frontend-next/src/views/other/Error.vue create mode 100644 frontend-next/src/views/other/Install.vue create mode 100644 frontend-next/src/views/other/Login.vue create mode 100644 frontend-next/src/views/pty/Terminal.vue create mode 100644 frontend-next/src/views/user/User.vue create mode 100644 frontend-next/src/vite-env.d.ts create mode 100644 frontend-next/tsconfig.json create mode 100644 frontend-next/tsconfig.node.json create mode 100644 frontend-next/vite.config.ts create mode 100644 frontend-next/yarn.lock create mode 100644 frontend/conversion.log create mode 100644 frontend/index.html create mode 100644 frontend/vite.config.js create mode 100644 resources/demo/ojbk.me diff --git a/demo.Dockerfile b/demo.Dockerfile index 32225b58..2448990a 100644 --- a/demo.Dockerfile +++ b/demo.Dockerfile @@ -3,6 +3,7 @@ FROM --platform=linux/amd64 uozi/nginx-ui-base:latest WORKDIR /app EXPOSE 80 +COPY resources/demo/ojbk.me /etc/nginx/sites-available/ojbk.me COPY resources/demo/app.ini /etc/nginx-ui/app.ini COPY resources/demo/demo.db /etc/nginx-ui/database.db COPY resources/docker/nginx.conf /etc/nginx/nginx.conf diff --git a/frontend-next/.env.development b/frontend-next/.env.development new file mode 100644 index 00000000..0449e433 --- /dev/null +++ b/frontend-next/.env.development @@ -0,0 +1,2 @@ +VITE_API_ROOT = /api +VITE_API_WSS_ROOT = wss://nginx.jackyu.cn/api diff --git a/frontend-next/.env.production b/frontend-next/.env.production new file mode 100644 index 00000000..cdf5288c --- /dev/null +++ b/frontend-next/.env.production @@ -0,0 +1,2 @@ +VUE_APP_API_ROOT = /api +VUE_APP_API_WSS_ROOT = /api diff --git a/frontend-next/.gitignore b/frontend-next/.gitignore new file mode 100644 index 00000000..a547bf36 --- /dev/null +++ b/frontend-next/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/frontend-next/.vscode/extensions.json b/frontend-next/.vscode/extensions.json new file mode 100644 index 00000000..a7cea0b0 --- /dev/null +++ b/frontend-next/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["Vue.volar"] +} diff --git a/frontend-next/README.md b/frontend-next/README.md new file mode 100644 index 00000000..30b15e21 --- /dev/null +++ b/frontend-next/README.md @@ -0,0 +1,16 @@ +# Vue 3 + TypeScript + Vite + +This template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 ` + + diff --git a/frontend-next/package.json b/frontend-next/package.json new file mode 100644 index 00000000..c3384740 --- /dev/null +++ b/frontend-next/package.json @@ -0,0 +1,44 @@ +{ + "name": "nginx-ui-frontend-next", + "private": true, + "version": "0.0.0", + "type": "commonjs", + "scripts": { + "dev": "vite", + "build": "vue-tsc --noEmit && vite build", + "preview": "vite preview", + "gettext:extract": "vue-gettext-extract", + "gettext:compile": "vue-gettext-compile" + }, + "dependencies": { + "@ant-design/icons-vue": "^6.1.0", + "ant-design-vue": "^3.2.10", + "axios": "^0.27.2", + "lodash": "^4.17.21", + "moment": "^2.29.4", + "path": "^0.12.7", + "pinia": "^2.0.17", + "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-gettext": "^2.3.0", + "vuex": "^4.0.2", + "xterm": "^4.19.0", + "xterm-addon-attach": "^0.6.0", + "xterm-addon-fit": "^0.5.0" + }, + "devDependencies": { + "@types/lodash": "^4.14.182", + "@vitejs/plugin-vue": "^3.0.0", + "@zougt/vite-plugin-theme-preprocessor": "^1.4.5", + "less": "^4.1.3", + "typescript": "^4.6.4", + "unplugin-vue-components": "^0.21.2", + "vite": "^3.0.0", + "vite-plugin-html": "^3.2.0", + "vue-tsc": "^0.38.4" + } +} diff --git a/frontend-next/public/favicon.ico b/frontend-next/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..6c40bc91735edc02e7d3c6b71f34845ce0e5db42 GIT binary patch literal 67646 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