From db9928d197a7316397a0c9e00e9660839ed2e6fb Mon Sep 17 00:00:00 2001 From: fhysy <1149505133@qq.com> Date: Thu, 12 Dec 2024 14:25:01 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96vue-temple=E6=A8=A1?= =?UTF-8?q?=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env | 11 + .env.development | 5 + .env.production | 5 + .eslintignore | 18 + .eslintrc.js | 76 + .gitignore | 23 + .prettierrc.js | 39 + CHANGELOG.md | 73 + LICENSE | 21 + README.md | 143 ++ index.html | 24 + jsconfig.json | 21 + package.json | 71 + public/config.js | 8 + public/favicon.ico | Bin 0 -> 9286 bytes src/App.vue | 95 ++ src/api/login/index.js | 27 + src/api/menu/index.js | 31 + src/assets/ccflowRightNextAdmin.png | Bin 0 -> 59011 bytes src/assets/login-bg.svg | 19 + src/assets/login-icon-two.svg | 1 + src/assets/login-main.svg | 1 + src/assets/logo-mini.svg | 9 + src/components/iconSelector/index.vue | 240 +++ src/components/iconSelector/list.vue | 84 + src/components/svgIcon/index.vue | 63 + src/directive/authDirective.js | 39 + src/directive/customDirective.js | 176 ++ src/directive/index.js | 17 + src/layout/component/aside.vue | 162 ++ src/layout/component/columnsAside.vue | 301 ++++ src/layout/component/header.vue | 18 + src/layout/component/main.vue | 65 + src/layout/footer/index.vue | 25 + src/layout/index.vue | 50 + src/layout/lockScreen/index.vue | 352 ++++ src/layout/logo/index.vue | 75 + src/layout/main/classic.vue | 72 + src/layout/main/columns.vue | 73 + src/layout/main/defaults.vue | 85 + src/layout/main/transverse.vue | 60 + src/layout/navBars/index.vue | 35 + src/layout/navBars/tagsView/contextmenu.vue | 133 ++ src/layout/navBars/tagsView/tagsView.vue | 733 +++++++++ src/layout/navBars/topBar/breadcrumb.vue | 145 ++ src/layout/navBars/topBar/closeFull.vue | 53 + src/layout/navBars/topBar/index.vue | 107 ++ src/layout/navBars/topBar/search.vue | 123 ++ src/layout/navBars/topBar/setings.vue | 813 +++++++++ src/layout/navBars/topBar/user.vue | 245 +++ src/layout/navBars/topBar/userNews.vue | 107 ++ src/layout/navMenu/horizontal.vue | 139 ++ src/layout/navMenu/subItem.vue | 48 + src/layout/navMenu/vertical.vue | 102 ++ src/layout/routerView/iframes.vue | 101 ++ src/layout/routerView/link.vue | 93 ++ src/layout/routerView/parent.vue | 108 ++ src/layout/sponsors/index.vue | 108 ++ src/layout/upgrade/index.vue | 148 ++ src/main.js | 16 + src/router/backEnd.js | 161 ++ src/router/frontEnd.js | 152 ++ src/router/index.js | 141 ++ src/router/route.js | 183 +++ src/stores/index.js | 8 + src/stores/keepAliveNames.js | 35 + src/stores/requestOldRoutes.js | 16 + src/stores/routesList.js | 26 + src/stores/tagsViewRoutes.js | 23 + src/stores/themeConfig.js | 156 ++ src/stores/userInfo.js | 72 + src/theme/app.scss | 326 ++++ src/theme/common/transition.scss | 147 ++ src/theme/dark.scss | 255 +++ src/theme/element.scss | 333 ++++ src/theme/iconSelector.scss | 31 + src/theme/index.scss | 8 + src/theme/loading.scss | 51 + src/theme/media/chart.scss | 94 ++ src/theme/media/cityLinkage.scss | 10 + src/theme/media/date.scss | 25 + src/theme/media/dialog.scss | 12 + src/theme/media/error.scss | 45 + src/theme/media/form.scss | 31 + src/theme/media/home.scss | 23 + src/theme/media/index.scss | 15 + src/theme/media/layout.scss | 63 + src/theme/media/login.scss | 74 + src/theme/media/media.scss | 13 + src/theme/media/pagination.scss | 15 + src/theme/media/personal.scss | 16 + src/theme/media/scrollbar.scss | 56 + src/theme/media/tagsView.scss | 11 + src/theme/mixins/index.scss | 56 + src/theme/other.scss | 36 + src/theme/tableTool.scss | 27 + src/theme/waves.scss | 101 ++ src/utils/arrayOperation.js | 66 + src/utils/authFunction.js | 38 + src/utils/build.js | 125 ++ src/utils/commonFunction.js | 64 + src/utils/formatTime.js | 137 ++ src/utils/getStyleSheets.js | 101 ++ src/utils/loading.js | 44 + src/utils/mitt.js | 8 + src/utils/other.js | 209 +++ src/utils/request.js | 67 + src/utils/setIconfont.js | 45 + src/utils/storage.js | 64 + src/utils/theme.js | 63 + src/utils/toolsValidate.js | 370 +++++ src/utils/watermark.js | 47 + src/views/error/401.vue | 90 + src/views/error/404.vue | 89 + src/views/home/index.vue | 633 +++++++ src/views/login/component/account.vue | 160 ++ src/views/login/component/mobile.vue | 72 + src/views/login/component/scan.vue | 63 + src/views/login/index.vue | 254 +++ src/views/system/dept/dialog.vue | 167 ++ src/views/system/dept/index.vue | 135 ++ src/views/system/dic/dialog.vue | 150 ++ src/views/system/dic/index.vue | 132 ++ src/views/system/menu/dialog.vue | 256 +++ src/views/system/menu/index.vue | 121 ++ src/views/system/role/dialog.vue | 236 +++ src/views/system/role/index.vue | 146 ++ src/views/system/user/dialog.vue | 187 +++ src/views/system/user/index.vue | 158 ++ vite.config.js | 65 + yarn.lock | 1645 +++++++++++++++++++ 131 files changed, 15089 insertions(+) create mode 100644 .env create mode 100644 .env.development create mode 100644 .env.production create mode 100644 .eslintignore create mode 100644 .eslintrc.js create mode 100644 .gitignore create mode 100644 .prettierrc.js create mode 100644 CHANGELOG.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 index.html create mode 100644 jsconfig.json create mode 100644 package.json create mode 100644 public/config.js create mode 100644 public/favicon.ico create mode 100644 src/App.vue create mode 100644 src/api/login/index.js create mode 100644 src/api/menu/index.js create mode 100644 src/assets/ccflowRightNextAdmin.png create mode 100644 src/assets/login-bg.svg create mode 100644 src/assets/login-icon-two.svg create mode 100644 src/assets/login-main.svg create mode 100644 src/assets/logo-mini.svg create mode 100644 src/components/iconSelector/index.vue create mode 100644 src/components/iconSelector/list.vue create mode 100644 src/components/svgIcon/index.vue create mode 100644 src/directive/authDirective.js create mode 100644 src/directive/customDirective.js create mode 100644 src/directive/index.js create mode 100644 src/layout/component/aside.vue create mode 100644 src/layout/component/columnsAside.vue create mode 100644 src/layout/component/header.vue create mode 100644 src/layout/component/main.vue create mode 100644 src/layout/footer/index.vue create mode 100644 src/layout/index.vue create mode 100644 src/layout/lockScreen/index.vue create mode 100644 src/layout/logo/index.vue create mode 100644 src/layout/main/classic.vue create mode 100644 src/layout/main/columns.vue create mode 100644 src/layout/main/defaults.vue create mode 100644 src/layout/main/transverse.vue create mode 100644 src/layout/navBars/index.vue create mode 100644 src/layout/navBars/tagsView/contextmenu.vue create mode 100644 src/layout/navBars/tagsView/tagsView.vue create mode 100644 src/layout/navBars/topBar/breadcrumb.vue create mode 100644 src/layout/navBars/topBar/closeFull.vue create mode 100644 src/layout/navBars/topBar/index.vue create mode 100644 src/layout/navBars/topBar/search.vue create mode 100644 src/layout/navBars/topBar/setings.vue create mode 100644 src/layout/navBars/topBar/user.vue create mode 100644 src/layout/navBars/topBar/userNews.vue create mode 100644 src/layout/navMenu/horizontal.vue create mode 100644 src/layout/navMenu/subItem.vue create mode 100644 src/layout/navMenu/vertical.vue create mode 100644 src/layout/routerView/iframes.vue create mode 100644 src/layout/routerView/link.vue create mode 100644 src/layout/routerView/parent.vue create mode 100644 src/layout/sponsors/index.vue create mode 100644 src/layout/upgrade/index.vue create mode 100644 src/main.js create mode 100644 src/router/backEnd.js create mode 100644 src/router/frontEnd.js create mode 100644 src/router/index.js create mode 100644 src/router/route.js create mode 100644 src/stores/index.js create mode 100644 src/stores/keepAliveNames.js create mode 100644 src/stores/requestOldRoutes.js create mode 100644 src/stores/routesList.js create mode 100644 src/stores/tagsViewRoutes.js create mode 100644 src/stores/themeConfig.js create mode 100644 src/stores/userInfo.js create mode 100644 src/theme/app.scss create mode 100644 src/theme/common/transition.scss create mode 100644 src/theme/dark.scss create mode 100644 src/theme/element.scss create mode 100644 src/theme/iconSelector.scss create mode 100644 src/theme/index.scss create mode 100644 src/theme/loading.scss create mode 100644 src/theme/media/chart.scss create mode 100644 src/theme/media/cityLinkage.scss create mode 100644 src/theme/media/date.scss create mode 100644 src/theme/media/dialog.scss create mode 100644 src/theme/media/error.scss create mode 100644 src/theme/media/form.scss create mode 100644 src/theme/media/home.scss create mode 100644 src/theme/media/index.scss create mode 100644 src/theme/media/layout.scss create mode 100644 src/theme/media/login.scss create mode 100644 src/theme/media/media.scss create mode 100644 src/theme/media/pagination.scss create mode 100644 src/theme/media/personal.scss create mode 100644 src/theme/media/scrollbar.scss create mode 100644 src/theme/media/tagsView.scss create mode 100644 src/theme/mixins/index.scss create mode 100644 src/theme/other.scss create mode 100644 src/theme/tableTool.scss create mode 100644 src/theme/waves.scss create mode 100644 src/utils/arrayOperation.js create mode 100644 src/utils/authFunction.js create mode 100644 src/utils/build.js create mode 100644 src/utils/commonFunction.js create mode 100644 src/utils/formatTime.js create mode 100644 src/utils/getStyleSheets.js create mode 100644 src/utils/loading.js create mode 100644 src/utils/mitt.js create mode 100644 src/utils/other.js create mode 100644 src/utils/request.js create mode 100644 src/utils/setIconfont.js create mode 100644 src/utils/storage.js create mode 100644 src/utils/theme.js create mode 100644 src/utils/toolsValidate.js create mode 100644 src/utils/watermark.js create mode 100644 src/views/error/401.vue create mode 100644 src/views/error/404.vue create mode 100644 src/views/home/index.vue create mode 100644 src/views/login/component/account.vue create mode 100644 src/views/login/component/mobile.vue create mode 100644 src/views/login/component/scan.vue create mode 100644 src/views/login/index.vue create mode 100644 src/views/system/dept/dialog.vue create mode 100644 src/views/system/dept/index.vue create mode 100644 src/views/system/dic/dialog.vue create mode 100644 src/views/system/dic/index.vue create mode 100644 src/views/system/menu/dialog.vue create mode 100644 src/views/system/menu/index.vue create mode 100644 src/views/system/role/dialog.vue create mode 100644 src/views/system/role/index.vue create mode 100644 src/views/system/user/dialog.vue create mode 100644 src/views/system/user/index.vue create mode 100644 vite.config.js create mode 100644 yarn.lock diff --git a/.env b/.env new file mode 100644 index 0000000..a10cc6f --- /dev/null +++ b/.env @@ -0,0 +1,11 @@ +# port 端口号 +VITE_PORT = 8888 + +# open 运行 npm run dev 时自动打开浏览器 +VITE_OPEN = false + +# 打包是否开启 cdn(源文件 utils/build.js),可自行修改 +VITE_OPEN_CDN = false + +# public path 配置线上环境路径(打包)、本地通过 http-server 访问时,请置空即可 +VITE_PUBLIC_PATH = \ No newline at end of file diff --git a/.env.development b/.env.development new file mode 100644 index 0000000..83fd5c5 --- /dev/null +++ b/.env.development @@ -0,0 +1,5 @@ +# 本地环境 +ENV = development + +# 本地环境接口地址 +VITE_API_URL = http://localhost:8888/ \ No newline at end of file diff --git a/.env.production b/.env.production new file mode 100644 index 0000000..478a841 --- /dev/null +++ b/.env.production @@ -0,0 +1,5 @@ +# 线上环境 +ENV = production + +# 线上环境接口地址 +VITE_API_URL = https://lyt-top.gitee.io/vue-next-admin-preview/ \ No newline at end of file diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..cfc877d --- /dev/null +++ b/.eslintignore @@ -0,0 +1,18 @@ + +*.sh +node_modules +lib +*.md +*.scss +*.woff +*.ttf +.vscode +.idea +dist +mock +public +bin +build +config +index.html +src/assets \ No newline at end of file diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..f4a9b6e --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,76 @@ +module.exports = { + root: true, + env: { + browser: true, + es2021: true, + node: true, + }, + parser: 'vue-eslint-parser', + parserOptions: { + ecmaVersion: 12, + parser: '@typescript-eslint/parser', + sourceType: 'module', + }, + extends: ['plugin:vue/vue3-essential', 'plugin:vue/essential', 'eslint:recommended'], + plugins: ['vue', '@typescript-eslint'], + overrides: [ + { + files: ['*.ts', '*.tsx', '*.vue'], + rules: { + 'no-undef': 'off', + }, + }, + ], + rules: { + // http://eslint.cn/docs/rules/ + // https://eslint.vuejs.org/rules/ + // https://typescript-eslint.io/rules/no-unused-vars/ + '@typescript-eslint/ban-ts-ignore': 'off', + '@typescript-eslint/explicit-function-return-type': 'off', + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-var-requires': 'off', + '@typescript-eslint/no-empty-function': 'off', + '@typescript-eslint/no-use-before-define': 'off', + '@typescript-eslint/ban-ts-comment': 'off', + '@typescript-eslint/ban-types': 'off', + '@typescript-eslint/no-non-null-assertion': 'off', + '@typescript-eslint/explicit-module-boundary-types': 'off', + '@typescript-eslint/no-redeclare': 'error', + '@typescript-eslint/no-non-null-asserted-optional-chain': 'off', + '@typescript-eslint/no-unused-vars': [2], + 'vue/custom-event-name-casing': 'off', + 'vue/attributes-order': 'off', + 'vue/one-component-per-file': 'off', + 'vue/html-closing-bracket-newline': 'off', + 'vue/max-attributes-per-line': 'off', + 'vue/multiline-html-element-content-newline': 'off', + 'vue/singleline-html-element-content-newline': 'off', + 'vue/attribute-hyphenation': 'off', + 'vue/html-self-closing': 'off', + 'vue/no-multiple-template-root': 'off', + 'vue/require-default-prop': 'off', + 'vue/no-v-model-argument': 'off', + 'vue/no-arrow-functions-in-watch': 'off', + 'vue/no-template-key': 'off', + 'vue/no-v-html': 'off', + 'vue/comment-directive': 'off', + 'vue/no-parsing-error': 'off', + 'vue/no-deprecated-v-on-native-modifier': 'off', + 'vue/multi-word-component-names': 'off', + 'no-useless-escape': 'off', + 'no-sparse-arrays': 'off', + 'no-prototype-builtins': 'off', + 'no-constant-condition': 'off', + 'no-use-before-define': 'off', + 'no-restricted-globals': 'off', + 'no-restricted-syntax': 'off', + 'generator-star-spacing': 'off', + 'no-unreachable': 'off', + 'no-multiple-template-root': 'off', + 'no-unused-vars': 'error', + 'no-v-model-argument': 'off', + 'no-case-declarations': 'off', + 'no-console': 'error', + 'no-redeclare': 'off', + }, +}; diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..403adbc --- /dev/null +++ b/.gitignore @@ -0,0 +1,23 @@ +.DS_Store +node_modules +/dist + + +# local env files +.env.local +.env.*.local + +# Log files +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/.prettierrc.js b/.prettierrc.js new file mode 100644 index 0000000..cff490a --- /dev/null +++ b/.prettierrc.js @@ -0,0 +1,39 @@ +module.exports = { + // 一行最多多少个字符 + printWidth: 150, + // 指定每个缩进级别的空格数 + tabWidth: 2, + // 使用制表符而不是空格缩进行 + useTabs: true, + // 在语句末尾打印分号 + semi: true, + // 使用单引号而不是双引号 + singleQuote: true, + // 更改引用对象属性的时间 可选值"" + quoteProps: 'as-needed', + // 在JSX中使用单引号而不是双引号 + jsxSingleQuote: false, + // 多行时尽可能打印尾随逗号。(例如,单行数组永远不会出现逗号结尾。) 可选值"",默认none + trailingComma: 'es5', + // 在对象文字中的括号之间打印空格 + bracketSpacing: true, + // jsx 标签的反尖括号需要换行 + jsxBracketSameLine: false, + // 在单独的箭头函数参数周围包括括号 always:(x) => x \ avoid:x => x + arrowParens: 'always', + // 这两个选项可用于格式化以给定字符偏移量(分别包括和不包括)开始和结束的代码 + rangeStart: 0, + rangeEnd: Infinity, + // 指定要使用的解析器,不需要写文件开头的 @prettier + requirePragma: false, + // 不需要自动在文件开头插入 @prettier + insertPragma: false, + // 使用默认的折行标准 always\never\preserve + proseWrap: 'preserve', + // 指定HTML文件的全局空格敏感度 css\strict\ignore + htmlWhitespaceSensitivity: 'css', + // Vue文件脚本和样式标签缩进 + vueIndentScriptAndStyle: false, + // 换行符使用 lf 结尾是 可选值"" + endOfLine: 'lf', +}; diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..b3da66d --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,73 @@ +# vue-next-admin-template-js(不带国际化) 更新日志 + +🎉🎉🔥 `vue-next-admin-template-js` 基于 (vue-next-admin-template v2.4.33 版本) vue3.x 、vite、Element plus 等,适配手机、平板、pc 的后台开源免费模板库(vue2.x 请切换 vue-prev-admin 分支) + +## 2.4.33 + +`2023.04.12` + +- 🎉 同步 vue-next-admin-template 基础版本(不带国际化) 分支 v2.4.33 版本内容,具体查看 master 分支 CHANGELOG.md + +## 2.4.32 + +`2023.03.26` + +- 🎉 同步 vue-next-admin-template 基础版本(不带国际化) 分支 v2.4.32 版本内容,具体查看 master 分支 CHANGELOG.md + +## 2.4.31 + +`2023.03.10` + +- 🎉 同步 vue-next-admin-template 基础版本(不带国际化) 分支 v2.4.31 版本内容,具体查看 master 分支 CHANGELOG.md + +## 2.4.3 + +`2023.02.23` + +🚩🚩🚩 感谢 [驰骋工作流引擎-表单引擎-低代码开发平台](http://www.ccflow.org/) 赞助商的赞助。驰骋公司为社会提供流程引擎+表单引擎+低代码开发平台一体的开源软件解决方案,欢迎广大开发者前去体验! + +- 🎉 同步 vue-next-admin-template 基础版本(不带国际化) 分支 v2.4.3 版本内容,具体查看 master 分支 CHANGELOG.md + +## 2.4.21 + +`2022.12.12` + +- 🎉 同步 vue-next-admin-template 基础版本(不带国际化) 分支 v2.4.21 版本内容,具体查看 master 分支 CHANGELOG.md + +## 2.4.2 + +`2022.12.10` + +- 🎉 同步 vue-next-admin-template 基础版本(不带国际化) 分支 v2.4.2 版本内容,具体查看 master 分支 CHANGELOG.md + +## 2.4.1 + +`2022.12.01` + +- 🎉 同步 vue-next-admin-template 基础版本(不带国际化) 分支 v2.4.1 版本内容,具体查看 master 分支 CHANGELOG.md + +## 2.3.0 + +`2022.11.16` + +- 🎉 同步 vue-next-admin-template 基础版本(不带国际化) 分支 v2.3.0 版本内容,具体查看 master 分支 CHANGELOG.md + +## 2.2.0 + +`2022.07.11` + +- 🎉 同步 vue-next-admin-template 基础版本(不带国际化) 分支 v2.2.0 版本内容,具体查看 master 分支 CHANGELOG.md + +## 2.1.1 + +- 🎉 同步 vue-next-admin-template 基础版本(不带国际化) 分支 v2.1.1 版本内容,具体查看 master 分支 CHANGELOG.md + +## 2.0.2 + +- 🎉 同步 vue-next-admin-template 基础版本(不带国际化) 分支 v2.0.2 版本内容,具体查看 master 分支 CHANGELOG.md + +## 0.1.0 + +`2021.12.27` + +- 🎉 新增 vue-next-admin-template 基础版本(不带国际化),切换 `vue-next-admin-template-js` 分支 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..6f6a7ea --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 lyt-Top + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..4d66ed6 --- /dev/null +++ b/README.md @@ -0,0 +1,143 @@ +
+ +

+ + vue + + + element plus + + + typescript + + + vite + + + license + +

+

 

+
+ +#### 💝 长期赞助商 + + + + + +#### 🌈 介绍 基础版 js(不带国际化,基于 vue-next-admin-template V2.4.33 版,setup 语法糖) + +基于 vue3.x + CompositionAPI setup 语法糖 + typescript + vite + element plus + vue-router-next + pinia 技术,适配手机、平板、pc 的后台开源免费模板,希望减少工作量,帮助大家实现快速开发。 + +#### ⛱️ 线上预览 + +- vue3.x 版本预览(vue-next-admin)https://lyt-top.gitee.io/vue-next-admin-preview/#/login +- vue2.x 版本预览(vue-prev-admin)https://lyt-top.gitee.io/vue-prev-admin-preview/#/login +- vue3.x + uni-app 商城 H5(vue-next-admin-shop)https://lyt-top.gitee.io/vue-next-admin-shop-preview + +#### 💒 代码仓库 + +- vue3.x 版本 https://gitee.com/lyt-top/vue-next-admin +- vue2.x 版本 https://gitee.com/lyt-top/vue-next-admin/tree/vue-prev-admin + +#### 🚧 安装 cnpm、yarn + +- 复制代码(桌面 cmd 运行) `npm install -g cnpm --registry=https://registry.npm.taobao.org` +- 复制代码(桌面 cmd 运行) `npm install -g yarn` + +#### 🏭 环境支持 + +| Edge | Firefox | Chrome | Safari | +| --------- | ------------ | ----------- | ----------- | +| Edge ≥ 88 | Firefox ≥ 78 | Chrome ≥ 87 | Safari ≥ 13 | + +> 由于 Vue3 不再支持 IE11,故而 ElementPlus 也不支持 IE11 及之前版本。 + +#### ⚡ 使用说明 + +建议使用 cnpm,因为 yarn 有时会报错。node 版本 > 14.18+/16+ + +> Vite 不再支持 Node 12 / 13 / 15,因为上述版本已经进入了 EOL 阶段。现在你必须使用 Node 14.18+ / 16+ 版本。 + +```bash +# 克隆项目 +git clone https://gitee.com/lyt-top/vue-next-admin.git + +# 进入项目 +cd vue-next-admin + +# 切换分支 +git checkout vue-next-admin-template-js + +# 安装依赖 +cnpm install + +# 运行项目 +cnpm run dev + +# 打包发布 +cnpm run build +``` + +#### 📚 开发文档 + +- 查看开发文档:vue-next-admin-doc + +#### 💯 学习交流加 QQ 群 + +> 1 - 4 交流群已满,请加 vue-next-admin 交流群 5 + +群号:556254895 + +其它交流群请查看文档首页 [vueNextAdmin 解疑问](https://lyt-top.gitee.io/vue-next-admin-doc-preview/) + +#### 💒 集成后端 + +- @zuohuaijun Admin.NET +- @熊猫 PandaGoAdmin +- @甜蜜蜜 GoPro 平台 +- @甜蜜蜜 NiuPi 平台 +- @游子 GFast-V3 +- @diygw.com gw-ui-php +- @zsvg vboot-net +- @zsvg vboot-java +- @青红造了个白 buildadmin +- @Goodwell iotfast(一个开源的物联网平台) + +#### ❤️ 鸣谢列表 + +- vue +- vue-next +- element-ui +- element-plus +- vue-router-nex +- vuex +- echarts +- axios +- mitt +- nprogress +- screenfull +- sortablejs +- sass +- typescript +- vite +- pinia +- js-cookie +- vite-plugin-cdn-import +- vite-plugin-compression +- vite-plugin-vue-setup-extend-plus + +#### 💕 特别感谢 + +特别感谢老哥们的建议、指导与帮忙,谢谢! + +- @省长 +- @唐参 +- @川歌 +- @华仔 + +#### 💌 支持作者 + +如果觉得框架不错,或者已经在使用了,希望你可以去 Github 或者 +Gitee 帮我点个 ⭐ Star,这将是对我极大的鼓励与支持。 diff --git a/index.html b/index.html new file mode 100644 index 0000000..5e83ac0 --- /dev/null +++ b/index.html @@ -0,0 +1,24 @@ + + + + + + + + 网关采集配置器 + + + +
+ + + + diff --git a/jsconfig.json b/jsconfig.json new file mode 100644 index 0000000..ca6cd38 --- /dev/null +++ b/jsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "target": "esnext", + "module": "esnext", + "lib": ["esnext", "dom", "dom.iterable", "scripthost"], + "jsx": "preserve", + "isolatedModules": true, + "strict": true, + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "experimentalDecorators": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "moduleResolution": "node", + "baseUrl": ".", + "types": ["vite/client"], + "paths": { + "/@/*": ["src/*"] + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..c9e6372 --- /dev/null +++ b/package.json @@ -0,0 +1,71 @@ +{ + "name": "vue-next-admin-template-js", + "version": "2.4.33", + "description": "vue3 vite next admin template js setup", + "author": "lyt_20201208", + "license": "MIT", + "scripts": { + "dev": "vite --force", + "build": "vite build", + "lint-fix": "eslint --fix --ext .js --ext .jsx --ext .vue src/" + }, + "dependencies": { + "@element-plus/icons-vue": "^2.1.0", + "axios": "^1.3.5", + "echarts": "^5.4.2", + "element-plus": "^2.5.0", + "js-cookie": "^3.0.1", + "mitt": "^3.0.0", + "nprogress": "^0.2.0", + "pinia": "^2.0.34", + "qrcodejs2-fixes": "^0.0.2", + "qs": "^6.11.1", + "screenfull": "^6.0.2", + "sortablejs": "^1.15.0", + "vue": "^3.2.47", + "vue-clipboard3": "^2.0.0", + "vue-demi": "^0.13.11", + "vue-next-admin-template-js": "file:", + "vue-router": "^4.1.6" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^4.1.0", + "@vue/compiler-sfc": "^3.2.47", + "eslint": "^8.38.0", + "eslint-plugin-vue": "^9.10.0", + "prettier": "^2.8.7", + "sass": "^1.62.0", + "vite": "^4.2.1", + "vite-plugin-cdn-import": "^0.3.5", + "vite-plugin-compression": "^0.5.1", + "vite-plugin-vue-setup-extend-plus": "^0.1.0", + "vue-eslint-parser": "^9.1.1" + }, + "browserslist": [ + "> 1%", + "last 2 versions", + "not dead" + ], + "bugs": { + "url": "https://gitee.com/lyt-top/vue-next-admin/issues" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">= 7.0.0" + }, + "keywords": [ + "vue", + "vue3", + "vuejs/vue-next", + "vuejs/vue-next-template", + "vuejs/vue-next-template-js", + "element-ui", + "element-plus", + "vue-next-admin", + "next-admin" + ], + "repository": { + "type": "git", + "url": "https://gitee.com/lyt-top/vue-next-admin.git" + } +} diff --git a/public/config.js b/public/config.js new file mode 100644 index 0000000..67b8ea3 --- /dev/null +++ b/public/config.js @@ -0,0 +1,8 @@ +// 手动配置的地址 +window.baseConfig = { + ip: 'digital-core.drgyen.com', + port: '', + prodApi: '', + protocol: 'https://', + wsProtocol: 'wss://' +} diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..d7c508a69fa710d195026bb10e9d1ff1d3ed13a6 GIT binary patch literal 9286 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 literal 0 HcmV?d00001 diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..0a2c80b --- /dev/null +++ b/src/App.vue @@ -0,0 +1,95 @@ + + + diff --git a/src/api/login/index.js b/src/api/login/index.js new file mode 100644 index 0000000..cf9504b --- /dev/null +++ b/src/api/login/index.js @@ -0,0 +1,27 @@ +import request from '/@/utils/request'; + +/** + * (不建议写成 request.post(xxx),因为这样 post 时,无法 params 与 data 同时传参) + * + * 登录api接口集合 + * @method signIn 用户登录 + * @method signOut 用户退出登录 + */ +export function useLoginApi() { + return { + signIn: (data) => { + return request({ + url: '/user/signIn', + method: 'post', + data, + }); + }, + signOut: (data) => { + return request({ + url: '/user/signOut', + method: 'post', + data, + }); + }, + }; +} diff --git a/src/api/menu/index.js b/src/api/menu/index.js new file mode 100644 index 0000000..1c92825 --- /dev/null +++ b/src/api/menu/index.js @@ -0,0 +1,31 @@ +import request from '/@/utils/request'; + +/** + * 以下为模拟接口地址,gitee 的不通,就换自己的真实接口地址 + * + * (不建议写成 request.post(xxx),因为这样 post 时,无法 params 与 data 同时传参) + * + * 后端控制菜单模拟json,路径在 https://gitee.com/lyt-top/vue-next-admin-images/tree/master/menu + * 后端控制路由,isRequestRoutes 为 true,则开启后端控制路由 + * @method getAdminMenu 获取后端动态路由菜单(admin) + * @method getTestMenu 获取后端动态路由菜单(test) + */ + +export function useMenuApi() { + return { + getAdminMenu: (params) => { + return request({ + url: '/gitee/lyt-top/vue-next-admin-images/raw/master/menu/adminMenu.json', + method: 'get', + params, + }); + }, + getTestMenu: (params) => { + return request({ + url: '/gitee/lyt-top/vue-next-admin-images/raw/master/menu/testMenu.json', + method: 'get', + params, + }); + }, + }; +} diff --git a/src/assets/ccflowRightNextAdmin.png b/src/assets/ccflowRightNextAdmin.png new file mode 100644 index 0000000000000000000000000000000000000000..2d882ef53ab3cc9dc0caae1de9b83f35a09e691f GIT binary patch literal 59011 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 z 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%0D4%uUnECUp+IA-ln!x0(i=wA*z_G<+~Ie{TCRK= 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 qjFkP=0+!-kj=!(2jjB<0000 + + Layer 1 + + + + + + Layer 1 + + + + + + + + \ No newline at end of file diff --git a/src/assets/login-icon-two.svg b/src/assets/login-icon-two.svg new file mode 100644 index 0000000..b930211 --- /dev/null +++ b/src/assets/login-icon-two.svg @@ -0,0 +1 @@ +sunlight \ No newline at end of file diff --git a/src/assets/login-main.svg b/src/assets/login-main.svg new file mode 100644 index 0000000..60dbe7c --- /dev/null +++ b/src/assets/login-main.svg @@ -0,0 +1 @@ +static_assets \ No newline at end of file diff --git a/src/assets/logo-mini.svg b/src/assets/logo-mini.svg new file mode 100644 index 0000000..53df94c --- /dev/null +++ b/src/assets/logo-mini.svg @@ -0,0 +1,9 @@ + + + + + + + \ No newline at end of file diff --git a/src/components/iconSelector/index.vue b/src/components/iconSelector/index.vue new file mode 100644 index 0000000..c88eb9f --- /dev/null +++ b/src/components/iconSelector/index.vue @@ -0,0 +1,240 @@ + + + diff --git a/src/components/iconSelector/list.vue b/src/components/iconSelector/list.vue new file mode 100644 index 0000000..27b007c --- /dev/null +++ b/src/components/iconSelector/list.vue @@ -0,0 +1,84 @@ + + + + + diff --git a/src/components/svgIcon/index.vue b/src/components/svgIcon/index.vue new file mode 100644 index 0000000..3e3a665 --- /dev/null +++ b/src/components/svgIcon/index.vue @@ -0,0 +1,63 @@ + + + diff --git a/src/directive/authDirective.js b/src/directive/authDirective.js new file mode 100644 index 0000000..b1b2cb1 --- /dev/null +++ b/src/directive/authDirective.js @@ -0,0 +1,39 @@ +import { useUserInfo } from '/@/stores/userInfo'; +import { judementSameArr } from '/@/utils/arrayOperation'; + +/** + * 用户权限指令 + * @directive 单个权限验证(v-auth="xxx") + * @directive 多个权限验证,满足一个则显示(v-auths="[xxx,xxx]") + * @directive 多个权限验证,全部满足则显示(v-auth-all="[xxx,xxx]") + */ +export function authDirective(app) { + // 单个权限验证(v-auth="xxx") + app.directive('auth', { + mounted(el, binding) { + const stores = useUserInfo(); + if (!stores.userInfos.authBtnList.some((v) => v === binding.value)) el.parentNode.removeChild(el); + }, + }); + // 多个权限验证,满足一个则显示(v-auths="[xxx,xxx]") + app.directive('auths', { + mounted(el, binding) { + let flag = false; + const stores = useUserInfo(); + stores.userInfos.authBtnList.map((val) => { + binding.value.map((v) => { + if (val === v) flag = true; + }); + }); + if (!flag) el.parentNode.removeChild(el); + }, + }); + // 多个权限验证,全部满足则显示(v-auth-all="[xxx,xxx]") + app.directive('auth-all', { + mounted(el, binding) { + const stores = useUserInfo(); + const flag = judementSameArr(binding.value, stores.userInfos.authBtnList); + if (!flag) el.parentNode.removeChild(el); + }, + }); +} diff --git a/src/directive/customDirective.js b/src/directive/customDirective.js new file mode 100644 index 0000000..120bf21 --- /dev/null +++ b/src/directive/customDirective.js @@ -0,0 +1,176 @@ +/** + * 按钮波浪指令 + * @directive 默认方式:v-waves,如 `
` + * @directive 参数方式:v-waves=" |light|red|orange|purple|green|teal",如 `
` + */ +export function wavesDirective(app) { + app.directive('waves', { + mounted(el, binding) { + el.classList.add('waves-effect'); + binding.value && el.classList.add(`waves-${binding.value}`); + function setConvertStyle(obj) { + let style = ''; + for (let i in obj) { + if (obj.hasOwnProperty(i)) style += `${i}:${obj[i]};`; + } + return style; + } + function onCurrentClick(e) { + let elDiv = document.createElement('div'); + elDiv.classList.add('waves-ripple'); + el.appendChild(elDiv); + let styles = { + left: `${e.layerX}px`, + top: `${e.layerY}px`, + opacity: 1, + transform: `scale(${(el.clientWidth / 100) * 10})`, + 'transition-duration': `750ms`, + 'transition-timing-function': `cubic-bezier(0.250, 0.460, 0.450, 0.940)`, + }; + elDiv.setAttribute('style', setConvertStyle(styles)); + setTimeout(() => { + elDiv.setAttribute( + 'style', + setConvertStyle({ + opacity: 0, + transform: styles.transform, + left: styles.left, + top: styles.top, + }) + ); + setTimeout(() => { + elDiv && el.removeChild(elDiv); + }, 750); + }, 450); + } + el.addEventListener('mousedown', onCurrentClick, false); + }, + unmounted(el) { + el.addEventListener('mousedown', () => {}); + }, + }); +} + +/** + * 自定义拖动指令 + * @description 使用方式:v-drag="[dragDom,dragHeader]",如 `
` + * @description dragDom 要拖动的元素,dragHeader 要拖动的 Header 位置 + * @link 注意:https://github.com/element-plus/element-plus/issues/522 + * @lick 参考:https://blog.csdn.net/weixin_46391323/article/details/105228020?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-10&spm=1001.2101.3001.4242 + */ +export function dragDirective(app) { + app.directive('drag', { + mounted(el, binding) { + if (!binding.value) return false; + + const dragDom = document.querySelector(binding.value[0]); + const dragHeader = document.querySelector(binding.value[1]); + + dragHeader.onmouseover = () => (dragHeader.style.cursor = `move`); + + function down(e, type) { + // 鼠标按下,计算当前元素距离可视区的距离 + const disX = type === 'pc' ? e.clientX - dragHeader.offsetLeft : e.touches[0].clientX - dragHeader.offsetLeft; + const disY = type === 'pc' ? e.clientY - dragHeader.offsetTop : e.touches[0].clientY - dragHeader.offsetTop; + + // body当前宽度 + const screenWidth = document.body.clientWidth; + // 可见区域高度(应为body高度,可某些环境下无法获取) + const screenHeight = document.documentElement.clientHeight; + + // 对话框宽度 + const dragDomWidth = dragDom.offsetWidth; + // 对话框高度 + const dragDomheight = dragDom.offsetHeight; + + const minDragDomLeft = dragDom.offsetLeft; + const maxDragDomLeft = screenWidth - dragDom.offsetLeft - dragDomWidth; + + const minDragDomTop = dragDom.offsetTop; + const maxDragDomTop = screenHeight - dragDom.offsetTop - dragDomheight; + + // 获取到的值带px 正则匹配替换 + let styL = getComputedStyle(dragDom).left; + let styT = getComputedStyle(dragDom).top; + + // 注意在ie中 第一次获取到的值为组件自带50% 移动之后赋值为px + if (styL.includes('%')) { + styL = +document.body.clientWidth * (+styL.replace(/\%/g, '') / 100); + styT = +document.body.clientHeight * (+styT.replace(/\%/g, '') / 100); + } else { + styL = +styL.replace(/\px/g, ''); + styT = +styT.replace(/\px/g, ''); + } + + return { + disX, + disY, + minDragDomLeft, + maxDragDomLeft, + minDragDomTop, + maxDragDomTop, + styL, + styT, + }; + } + + function move(e, type, obj) { + let { disX, disY, minDragDomLeft, maxDragDomLeft, minDragDomTop, maxDragDomTop, styL, styT } = obj; + + // 通过事件委托,计算移动的距离 + let left = type === 'pc' ? e.clientX - disX : e.touches[0].clientX - disX; + let top = type === 'pc' ? e.clientY - disY : e.touches[0].clientY - disY; + + // 边界处理 + if (-left > minDragDomLeft) { + left = -minDragDomLeft; + } else if (left > maxDragDomLeft) { + left = maxDragDomLeft; + } + + if (-top > minDragDomTop) { + top = -minDragDomTop; + } else if (top > maxDragDomTop) { + top = maxDragDomTop; + } + + // 移动当前元素 + dragDom.style.cssText += `;left:${left + styL}px;top:${top + styT}px;`; + } + + /** + * pc端 + * onmousedown 鼠标按下触发事件 + * onmousemove 鼠标按下时持续触发事件 + * onmouseup 鼠标抬起触发事件 + */ + dragHeader.onmousedown = (e) => { + const obj = down(e, 'pc'); + document.onmousemove = (e) => { + move(e, 'pc', obj); + }; + document.onmouseup = () => { + document.onmousemove = null; + document.onmouseup = null; + }; + }; + + /** + * 移动端 + * ontouchstart 当按下手指时,触发ontouchstart + * ontouchmove 当移动手指时,触发ontouchmove + * ontouchend 当移走手指时,触发ontouchend + */ + dragHeader.ontouchstart = (e) => { + const obj = down(e, 'app'); + document.ontouchmove = (e) => { + move(e, 'app', obj); + }; + document.ontouchend = () => { + document.ontouchmove = null; + document.ontouchend = null; + }; + }; + }, + }); +} diff --git a/src/directive/index.js b/src/directive/index.js new file mode 100644 index 0000000..1c46fc9 --- /dev/null +++ b/src/directive/index.js @@ -0,0 +1,17 @@ +import { authDirective } from './authDirective'; +import { wavesDirective, dragDirective } from '/@/directive/customDirective'; + +/** + * 导出指令方法:v-xxx + * @methods authDirective 用户权限指令,用法:v-auth + * @methods wavesDirective 按钮波浪指令,用法:v-waves + * @methods dragDirective 自定义拖动指令,用法:v-drag + */ +export function directive(app) { + // 用户权限指令 + authDirective(app); + // 按钮波浪指令 + wavesDirective(app); + // 自定义拖动指令 + dragDirective(app); +} diff --git a/src/layout/component/aside.vue b/src/layout/component/aside.vue new file mode 100644 index 0000000..2f55062 --- /dev/null +++ b/src/layout/component/aside.vue @@ -0,0 +1,162 @@ + + + diff --git a/src/layout/component/columnsAside.vue b/src/layout/component/columnsAside.vue new file mode 100644 index 0000000..a383fb4 --- /dev/null +++ b/src/layout/component/columnsAside.vue @@ -0,0 +1,301 @@ + + + + + diff --git a/src/layout/component/header.vue b/src/layout/component/header.vue new file mode 100644 index 0000000..c9814a3 --- /dev/null +++ b/src/layout/component/header.vue @@ -0,0 +1,18 @@ + + + diff --git a/src/layout/component/main.vue b/src/layout/component/main.vue new file mode 100644 index 0000000..d062527 --- /dev/null +++ b/src/layout/component/main.vue @@ -0,0 +1,65 @@ + + + diff --git a/src/layout/footer/index.vue b/src/layout/footer/index.vue new file mode 100644 index 0000000..b10d0d4 --- /dev/null +++ b/src/layout/footer/index.vue @@ -0,0 +1,25 @@ + + + + + diff --git a/src/layout/index.vue b/src/layout/index.vue new file mode 100644 index 0000000..331cf29 --- /dev/null +++ b/src/layout/index.vue @@ -0,0 +1,50 @@ + + + diff --git a/src/layout/lockScreen/index.vue b/src/layout/lockScreen/index.vue new file mode 100644 index 0000000..3666e66 --- /dev/null +++ b/src/layout/lockScreen/index.vue @@ -0,0 +1,352 @@ + + + + + diff --git a/src/layout/logo/index.vue b/src/layout/logo/index.vue new file mode 100644 index 0000000..b8ad31b --- /dev/null +++ b/src/layout/logo/index.vue @@ -0,0 +1,75 @@ + + + + + diff --git a/src/layout/main/classic.vue b/src/layout/main/classic.vue new file mode 100644 index 0000000..6a620f5 --- /dev/null +++ b/src/layout/main/classic.vue @@ -0,0 +1,72 @@ + + + diff --git a/src/layout/main/columns.vue b/src/layout/main/columns.vue new file mode 100644 index 0000000..bbc3889 --- /dev/null +++ b/src/layout/main/columns.vue @@ -0,0 +1,73 @@ + + + diff --git a/src/layout/main/defaults.vue b/src/layout/main/defaults.vue new file mode 100644 index 0000000..d064bc3 --- /dev/null +++ b/src/layout/main/defaults.vue @@ -0,0 +1,85 @@ + + + diff --git a/src/layout/main/transverse.vue b/src/layout/main/transverse.vue new file mode 100644 index 0000000..1ad45d1 --- /dev/null +++ b/src/layout/main/transverse.vue @@ -0,0 +1,60 @@ + + + diff --git a/src/layout/navBars/index.vue b/src/layout/navBars/index.vue new file mode 100644 index 0000000..ed45c38 --- /dev/null +++ b/src/layout/navBars/index.vue @@ -0,0 +1,35 @@ + + + + + diff --git a/src/layout/navBars/tagsView/contextmenu.vue b/src/layout/navBars/tagsView/contextmenu.vue new file mode 100644 index 0000000..f21fab4 --- /dev/null +++ b/src/layout/navBars/tagsView/contextmenu.vue @@ -0,0 +1,133 @@ + + + + + diff --git a/src/layout/navBars/tagsView/tagsView.vue b/src/layout/navBars/tagsView/tagsView.vue new file mode 100644 index 0000000..4533f49 --- /dev/null +++ b/src/layout/navBars/tagsView/tagsView.vue @@ -0,0 +1,733 @@ + + + + + diff --git a/src/layout/navBars/topBar/breadcrumb.vue b/src/layout/navBars/topBar/breadcrumb.vue new file mode 100644 index 0000000..80cc226 --- /dev/null +++ b/src/layout/navBars/topBar/breadcrumb.vue @@ -0,0 +1,145 @@ + + + + + diff --git a/src/layout/navBars/topBar/closeFull.vue b/src/layout/navBars/topBar/closeFull.vue new file mode 100644 index 0000000..418789a --- /dev/null +++ b/src/layout/navBars/topBar/closeFull.vue @@ -0,0 +1,53 @@ + + + + + diff --git a/src/layout/navBars/topBar/index.vue b/src/layout/navBars/topBar/index.vue new file mode 100644 index 0000000..2a805a2 --- /dev/null +++ b/src/layout/navBars/topBar/index.vue @@ -0,0 +1,107 @@ + + + + + diff --git a/src/layout/navBars/topBar/search.vue b/src/layout/navBars/topBar/search.vue new file mode 100644 index 0000000..116d01f --- /dev/null +++ b/src/layout/navBars/topBar/search.vue @@ -0,0 +1,123 @@ + + + + + diff --git a/src/layout/navBars/topBar/setings.vue b/src/layout/navBars/topBar/setings.vue new file mode 100644 index 0000000..0417535 --- /dev/null +++ b/src/layout/navBars/topBar/setings.vue @@ -0,0 +1,813 @@ + + + + + diff --git a/src/layout/navBars/topBar/user.vue b/src/layout/navBars/topBar/user.vue new file mode 100644 index 0000000..70376e8 --- /dev/null +++ b/src/layout/navBars/topBar/user.vue @@ -0,0 +1,245 @@ + + + + + diff --git a/src/layout/navBars/topBar/userNews.vue b/src/layout/navBars/topBar/userNews.vue new file mode 100644 index 0000000..0e0382d --- /dev/null +++ b/src/layout/navBars/topBar/userNews.vue @@ -0,0 +1,107 @@ + + + + + diff --git a/src/layout/navMenu/horizontal.vue b/src/layout/navMenu/horizontal.vue new file mode 100644 index 0000000..4f0d047 --- /dev/null +++ b/src/layout/navMenu/horizontal.vue @@ -0,0 +1,139 @@ + + + + + diff --git a/src/layout/navMenu/subItem.vue b/src/layout/navMenu/subItem.vue new file mode 100644 index 0000000..778c35e --- /dev/null +++ b/src/layout/navMenu/subItem.vue @@ -0,0 +1,48 @@ + + + diff --git a/src/layout/navMenu/vertical.vue b/src/layout/navMenu/vertical.vue new file mode 100644 index 0000000..1bf1d39 --- /dev/null +++ b/src/layout/navMenu/vertical.vue @@ -0,0 +1,102 @@ + + + diff --git a/src/layout/routerView/iframes.vue b/src/layout/routerView/iframes.vue new file mode 100644 index 0000000..127cc28 --- /dev/null +++ b/src/layout/routerView/iframes.vue @@ -0,0 +1,101 @@ +