├── .editorconfig ├── .eslintrc.js ├── .github └── dependabot.yml ├── .gitignore ├── README.md ├── assets ├── global.css └── variables.scss ├── components ├── AppBar.vue ├── SnackBar.vue ├── account │ ├── ForgotForm.vue │ ├── LoginForm.vue │ └── RegisterForm.vue ├── container │ └── create │ │ ├── InstanceInfo.vue │ │ ├── InstanceOptions.vue │ │ └── OptionsConfirm.vue └── table │ ├── TableFund.vue │ ├── TableProducts.vue │ ├── TableProductsAll.vue │ ├── TableProductsRetention.vue │ ├── TableTabs.vue │ ├── TableTodo.vue │ └── TableViewall.vue ├── jsconfig.json ├── layouts ├── cdn.vue ├── container.vue ├── default.vue └── error.vue ├── nuxt.config.js ├── package.json ├── pages ├── account │ ├── forgot.vue │ ├── index.vue │ ├── login.vue │ ├── register.vue │ └── settings.vue ├── addfunds │ └── vme50.vue ├── cdn │ ├── detail │ │ └── _domainName.vue │ ├── domains.vue │ └── index.vue ├── container │ ├── create │ │ └── instance.vue │ ├── index.vue │ ├── overview.vue │ ├── productdetail │ │ └── _id.vue │ └── productlist.vue ├── index.vue ├── redirect │ └── index.vue └── table │ └── index.vue ├── static ├── favicon.ico └── incloudify-logo-large.png ├── store └── README.md ├── utils ├── HttpUtils.vue └── SessionUtils.vue └── yarn.lock /.editorconfig: -------------------------------------------------------------------------------- 1 | # editorconfig.org 2 | root = true 3 | 4 | [*] 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | charset = utf-8 9 | trim_trailing_whitespace = true 10 | insert_final_newline = true 11 | 12 | [*.md] 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { 4 | browser: true, 5 | node: true 6 | }, 7 | parserOptions: { 8 | parser: '@babel/eslint-parser', 9 | requireConfigFile: false 10 | }, 11 | extends: [ 12 | '@nuxtjs', 13 | 'plugin:nuxt/recommended' 14 | ], 15 | plugins: [ 16 | ], 17 | // add your custom rules here 18 | rules: { 19 | 'no-console': 'off' 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | # Fetch and update latest `npm` packages 4 | - package-ecosystem: npm 5 | directory: '/' 6 | schedule: 7 | interval: daily 8 | time: '00:00' 9 | open-pull-requests-limit: 10 10 | reviewers: 11 | - dispure 12 | assignees: 13 | - dispure 14 | commit-message: 15 | prefix: fix 16 | prefix-development: chore 17 | include: scope 18 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by .ignore support plugin (hsz.mobi) 2 | ### Node template 3 | # Logs 4 | /logs 5 | *.log 6 | npm-debug.log* 7 | yarn-debug.log* 8 | yarn-error.log* 9 | 10 | # Runtime data 11 | pids 12 | *.pid 13 | *.seed 14 | *.pid.lock 15 | 16 | # Directory for instrumented libs generated by jscoverage/JSCover 17 | lib-cov 18 | 19 | # Coverage directory used by tools like istanbul 20 | coverage 21 | 22 | # nyc test coverage 23 | .nyc_output 24 | 25 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 26 | .grunt 27 | 28 | # Bower dependency directory (https://bower.io/) 29 | bower_components 30 | 31 | # node-waf configuration 32 | .lock-wscript 33 | 34 | # Compiled binary addons (https://nodejs.org/api/addons.html) 35 | build/Release 36 | 37 | # Dependency directories 38 | node_modules/ 39 | jspm_packages/ 40 | 41 | # TypeScript v1 declaration files 42 | typings/ 43 | 44 | # Optional npm cache directory 45 | .npm 46 | 47 | # Optional eslint cache 48 | .eslintcache 49 | 50 | # Optional REPL history 51 | .node_repl_history 52 | 53 | # Output of 'npm pack' 54 | *.tgz 55 | 56 | # Yarn Integrity file 57 | .yarn-integrity 58 | 59 | # dotenv environment variables file 60 | .env 61 | 62 | # parcel-bundler cache (https://parceljs.org/) 63 | .cache 64 | 65 | # next.js build output 66 | .next 67 | 68 | # nuxt.js build output 69 | .nuxt 70 | 71 | # Nuxt generate 72 | dist 73 | 74 | # vuepress build output 75 | .vuepress/dist 76 | 77 | # Serverless directories 78 | .serverless 79 | 80 | # IDE / Editor 81 | .idea 82 | 83 | # Service worker 84 | sw.* 85 | 86 | # macOS 87 | .DS_Store 88 | 89 | # Vim swap files 90 | *.swp 91 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Consolify 2 | 3 | ------ 4 | 5 | **一个基于Nuxt与Vuetify的云服务IDC控制台** 6 | 7 | 此项目依然处于开发状态, 欢迎您成为本项目的贡献者。但在提交Pull Request前, 请先仔细阅读 [提交代码规范](https://www.bilibili.com/video/BV1GJ411x7h7)。 8 | 9 | ### 当前已完成功能 10 | 11 | ------ 12 | 13 | ***注:** 后端需自行适配接入* 14 | 15 | - 概览页 16 | - 账户登录/注册/忘记密码页 17 | - 内容分发网络管理页 18 | - 容器云管理页 19 | 20 | ### 快速开始 21 | 22 | ------ 23 | 24 | ***注:** 若在操作过程中遇到困难, 可加入 [QQ群聊](https://jq.qq.com/?_wv=1027&k=ISEDwdTh) 寻求帮助* 25 | 26 | #### 设备环境需求 27 | 28 | - Yarn 29 | 30 | #### 启动开发构建 31 | 32 | ````` 33 | # 安装依赖项 34 | $ yarn install 35 | # 启动开发构建 36 | $ yarn dev 37 | ````` 38 | 39 | #### 启动生产构建 40 | 41 | ``` 42 | # 安装依赖项 43 | $ yarn install 44 | # 构建所需文件 45 | $ yarn build 46 | # 启动生产构建 47 | $ yarn start 48 | ``` 49 | 50 | 在启动完成后, 你将可以在 [http://localhost:3000](http://localhost:3000) 看到页面 51 | 52 | 如需更多相关帮助, 请查阅 [Wiki](https://github.com/Incloudify/consolify-frontend/wiki) 53 | 54 | -------------------------------------------------------------------------------- /assets/global.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --primary-color: #2196F3; 3 | --blur: none; 4 | } 5 | 6 | a:not(.v-btn, .v-card, .v-chip, .v-list-item) { 7 | color: var(--primary-color); 8 | text-decoration: none; 9 | } 10 | 11 | a:hover:not(.v-btn, .v-card, .v-chip, .v-list-item), 12 | a:focus:not(.v-btn, .v-card, .v-chip, .v-list-item) { 13 | text-decoration: none; 14 | } 15 | 16 | a.text-color:hover { 17 | color: var(--text) !important; 18 | } 19 | -------------------------------------------------------------------------------- /assets/variables.scss: -------------------------------------------------------------------------------- 1 | // Ref: https://github.com/nuxt-community/vuetify-module#customvariables 2 | // 3 | // The variables you want to modify 4 | // $font-size-root: 20px; 5 | -------------------------------------------------------------------------------- /components/AppBar.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 30 | 39 | -------------------------------------------------------------------------------- /components/SnackBar.vue: -------------------------------------------------------------------------------- 1 | 25 | 37 | 38 | 45 | -------------------------------------------------------------------------------- /components/account/ForgotForm.vue: -------------------------------------------------------------------------------- 1 | 61 | 62 | 180 | 181 | 196 | -------------------------------------------------------------------------------- /components/account/LoginForm.vue: -------------------------------------------------------------------------------- 1 | 67 | 68 | 191 | 192 | 217 | -------------------------------------------------------------------------------- /components/account/RegisterForm.vue: -------------------------------------------------------------------------------- 1 | 226 | 227 | 485 | 486 | 536 | -------------------------------------------------------------------------------- /components/container/create/InstanceInfo.vue: -------------------------------------------------------------------------------- 1 | 4 | 9 | -------------------------------------------------------------------------------- /components/container/create/InstanceOptions.vue: -------------------------------------------------------------------------------- 1 | 268 | 517 | 584 | -------------------------------------------------------------------------------- /components/container/create/OptionsConfirm.vue: -------------------------------------------------------------------------------- 1 | 4 | 9 | -------------------------------------------------------------------------------- /components/table/TableFund.vue: -------------------------------------------------------------------------------- 1 | 2 | 39 | 40 | 48 | 54 | -------------------------------------------------------------------------------- /components/table/TableProducts.vue: -------------------------------------------------------------------------------- 1 | 2 | 20 | 21 | 28 | -------------------------------------------------------------------------------- /components/table/TableProductsAll.vue: -------------------------------------------------------------------------------- 1 | 2 | 33 | 34 | 82 | 83 | 96 | -------------------------------------------------------------------------------- /components/table/TableProductsRetention.vue: -------------------------------------------------------------------------------- 1 | 2 | 24 | 25 | 101 | 102 | 115 | -------------------------------------------------------------------------------- /components/table/TableTabs.vue: -------------------------------------------------------------------------------- 1 | 2 | 31 | 32 | 35 | -------------------------------------------------------------------------------- /components/table/TableTodo.vue: -------------------------------------------------------------------------------- 1 | 2 | 54 | 55 | 64 | 82 | -------------------------------------------------------------------------------- /components/table/TableViewall.vue: -------------------------------------------------------------------------------- 1 | 2 | 20 | 21 | 24 | -------------------------------------------------------------------------------- /jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": ".", 4 | "paths": { 5 | "~/*": ["./*"], 6 | "@/*": ["./*"], 7 | "~~/*": ["./*"], 8 | "@@/*": ["./*"] 9 | } 10 | }, 11 | "exclude": ["node_modules", ".nuxt", "dist"] 12 | } 13 | -------------------------------------------------------------------------------- /layouts/cdn.vue: -------------------------------------------------------------------------------- 1 | 2 | 38 | 39 | 47 | -------------------------------------------------------------------------------- /layouts/container.vue: -------------------------------------------------------------------------------- 1 | 2 | 42 | 43 | 98 | 121 | -------------------------------------------------------------------------------- /layouts/default.vue: -------------------------------------------------------------------------------- 1 | 10 | 86 | 97 | -------------------------------------------------------------------------------- /layouts/error.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 36 | 37 | 54 | -------------------------------------------------------------------------------- /nuxt.config.js: -------------------------------------------------------------------------------- 1 | import colors from 'vuetify/es5/util/colors' 2 | 3 | export default { 4 | // Global page headers: https://go.nuxtjs.dev/config-head 5 | head: { 6 | titleTemplate: '%s - 玲行云端控制台', 7 | title: '玲行云端控制台', 8 | htmlAttrs: { 9 | lang: 'zh-CN' 10 | }, 11 | meta: [ 12 | { charset: 'utf-8' }, 13 | { name: 'viewport', content: 'width=device-width, initial-scale=1' }, 14 | { hid: 'description', name: 'description', content: '' }, 15 | { name: 'format-detection', content: 'telephone=no' } 16 | ], 17 | link: [ 18 | { rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' } 19 | ] 20 | }, 21 | 22 | // Global CSS: https://go.nuxtjs.dev/config-css 23 | css: [ 24 | '~/assets/global.css' 25 | ], 26 | 27 | // Plugins to run before rendering page: https://go.nuxtjs.dev/config-plugins 28 | plugins: [ 29 | ], 30 | 31 | // Auto import components: https://go.nuxtjs.dev/config-components 32 | components: true, 33 | 34 | // Modules for dev and build (recommended): https://go.nuxtjs.dev/config-modules 35 | buildModules: [ 36 | // https://go.nuxtjs.dev/eslint 37 | '@nuxtjs/eslint-module', 38 | // https://go.nuxtjs.dev/vuetify 39 | '@nuxtjs/vuetify' 40 | ], 41 | 42 | // Modules: https://go.nuxtjs.dev/config-modules 43 | modules: [ 44 | '@nuxtjs/axios' 45 | ], 46 | 47 | // Vuetify module configuration: https://go.nuxtjs.dev/config-vuetify 48 | vuetify: { 49 | customVariables: ['~/assets/variables.scss'], 50 | treeshake: true, 51 | theme: { 52 | dark: false, 53 | themes: { 54 | light: { 55 | primary: colors.blue.base, 56 | secondary: colors.blue.darken4, 57 | accent: colors.blue.accent2, 58 | grey_background: colors.grey.lighten2 59 | }, 60 | dark: { 61 | primary: colors.blue.darken2, 62 | accent: colors.grey.darken3, 63 | secondary: colors.amber.darken3, 64 | info: colors.teal.lighten1, 65 | warning: colors.amber.base, 66 | error: colors.deepOrange.accent4, 67 | success: colors.green.accent3 68 | } 69 | } 70 | } 71 | }, 72 | 73 | // Build Configuration: https://go.nuxtjs.dev/config-build 74 | build: { 75 | }, 76 | loading: { 77 | color: 'rgba(33, 150, 243)' 78 | }, 79 | pageTransition: { 80 | name: 'scroll-x-transition', 81 | mode: 'out-in' 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "consolify-frontend", 3 | "version": "1.0.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "nuxt", 7 | "build": "nuxt build", 8 | "start": "nuxt start", 9 | "generate": "nuxt generate", 10 | "lint:js": "eslint --ext \".js,.vue\" --ignore-path .gitignore .", 11 | "lint": "yarn lint:js", 12 | "lintfix": "yarn lint:js --fix" 13 | }, 14 | "dependencies": { 15 | "@nuxtjs/axios": "^5.13.6", 16 | "core-js": "^3.31.1", 17 | "lodash": "^4.17.21", 18 | "nuxt": "^2.15.8", 19 | "vue": "^2.6.14", 20 | "vue-server-renderer": "^2.6.14", 21 | "vue-template-compiler": "^2.6.14", 22 | "vuetify": "^2.7.0", 23 | "webpack": "^5.88.1" 24 | }, 25 | "devDependencies": { 26 | "@babel/eslint-parser": "^7.22.9", 27 | "@nuxtjs/eslint-config": "^12.0.0", 28 | "@nuxtjs/eslint-module": "^4.1.0", 29 | "@nuxtjs/vuetify": "^1.12.3", 30 | "eslint": "^8.44.0", 31 | "eslint-plugin-nuxt": "^4.0.0", 32 | "eslint-plugin-vue": "^9.15.1" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /pages/account/forgot.vue: -------------------------------------------------------------------------------- 1 | 20 | 21 | 38 | 65 | -------------------------------------------------------------------------------- /pages/account/index.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 13 | -------------------------------------------------------------------------------- /pages/account/login.vue: -------------------------------------------------------------------------------- 1 | 22 | 23 | 42 | 70 | -------------------------------------------------------------------------------- /pages/account/register.vue: -------------------------------------------------------------------------------- 1 | 22 | 23 | 54 | 82 | -------------------------------------------------------------------------------- /pages/account/settings.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 16 | -------------------------------------------------------------------------------- /pages/addfunds/vme50.vue: -------------------------------------------------------------------------------- 1 | 67 | 68 | 112 | 113 | 164 | -------------------------------------------------------------------------------- /pages/cdn/detail/_domainName.vue: -------------------------------------------------------------------------------- 1 | 2 | 225 | 226 | 231 | 237 | -------------------------------------------------------------------------------- /pages/cdn/domains.vue: -------------------------------------------------------------------------------- 1 | 73 | 74 | 102 | -------------------------------------------------------------------------------- /pages/cdn/index.vue: -------------------------------------------------------------------------------- 1 | 57 | 58 | 69 | -------------------------------------------------------------------------------- /pages/container/create/instance.vue: -------------------------------------------------------------------------------- 1 | 130 | 159 | 226 | -------------------------------------------------------------------------------- /pages/container/index.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 20 | -------------------------------------------------------------------------------- /pages/container/overview.vue: -------------------------------------------------------------------------------- 1 | 84 | 85 | 100 | 110 | -------------------------------------------------------------------------------- /pages/container/productdetail/_id.vue: -------------------------------------------------------------------------------- 1 | 2 | 260 | 261 | 266 | 272 | -------------------------------------------------------------------------------- /pages/container/productlist.vue: -------------------------------------------------------------------------------- 1 | 2 | 51 | 52 | 68 | -------------------------------------------------------------------------------- /pages/index.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 13 | -------------------------------------------------------------------------------- /pages/redirect/index.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 22 | -------------------------------------------------------------------------------- /pages/table/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 19 | -------------------------------------------------------------------------------- /static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Incloudify/consolify-frontend/68a2e034f0e503010a1b25553afbefab0df45eaf/static/favicon.ico -------------------------------------------------------------------------------- /static/incloudify-logo-large.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Incloudify/consolify-frontend/68a2e034f0e503010a1b25553afbefab0df45eaf/static/incloudify-logo-large.png -------------------------------------------------------------------------------- /store/README.md: -------------------------------------------------------------------------------- 1 | # STORE 2 | 3 | **This directory is not required, you can delete it if you don't want to use it.** 4 | 5 | This directory contains your Vuex Store files. 6 | Vuex Store option is implemented in the Nuxt.js framework. 7 | 8 | Creating a file in this directory automatically activates the option in the framework. 9 | 10 | More information about the usage of this directory in [the documentation](https://nuxtjs.org/guide/vuex-store). 11 | -------------------------------------------------------------------------------- /utils/HttpUtils.vue: -------------------------------------------------------------------------------- 1 | 104 | -------------------------------------------------------------------------------- /utils/SessionUtils.vue: -------------------------------------------------------------------------------- 1 | 127 | --------------------------------------------------------------------------------