From 651786fafbe71bc33855b396cec2ce244afd5e45 Mon Sep 17 00:00:00 2001 From: zegezy <1098696801@qq.com> Date: Wed, 2 Aug 2023 16:00:27 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=97=A7ui=E9=A1=B9=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- magic-boot-ui/.env.demo | 1 - magic-boot-ui/.env.development | 1 - magic-boot-ui/.env.production | 1 - magic-boot-ui/README.md | 7 - magic-boot-ui/del_node_modules.cmd | 2 - magic-boot-ui/index.html | 21 - magic-boot-ui/package.json | 29 -- magic-boot-ui/public/favicon.ico | Bin 4286 -> 0 bytes magic-boot-ui/src/App.vue | 3 - magic-boot-ui/src/assets/css/common.css | 68 --- .../src/assets/fonts/PoetsenOne.woff2 | Bin 53604 -> 0 bytes magic-boot-ui/src/assets/images/login-bg.svg | 98 ---- magic-boot-ui/src/assets/images/login-bg1.svg | 138 ------ .../src/assets/images/logo-magic-boot.png | Bin 4778 -> 0 bytes magic-boot-ui/src/compiler/sfc-compiler.js | 206 --------- magic-boot-ui/src/compiler/testCode.js | 23 - magic-boot-ui/src/components/index.js | 9 - .../src/components/magic/basic/mb-button.vue | 141 ------ .../magic/basic/mb-editor-table.vue | 106 ----- .../src/components/magic/basic/mb-icon.vue | 26 -- .../components/magic/data/mb-pagination.vue | 97 ---- .../src/components/magic/data/mb-search.vue | 101 ----- .../components/magic/data/mb-table-column.vue | 63 --- .../src/components/magic/data/mb-table.vue | 300 ------------ .../src/components/magic/data/mb-tree.vue | 153 ------- .../components/magic/data/mb-treeselect.vue | 40 -- .../components/magic/feedback/mb-dialog.vue | 141 ------ .../magic/form/mb-checkbox-group.vue | 133 ------ .../src/components/magic/form/mb-date.vue | 48 -- .../src/components/magic/form/mb-input.vue | 23 - .../components/magic/form/mb-inputrange.vue | 37 -- .../components/magic/form/mb-radio-group.vue | 95 ---- .../src/components/magic/form/mb-select.vue | 151 ------ .../src/components/magic/form/mb-switch.vue | 69 --- .../components/magic/form/mb-upload-file.vue | 302 ------------ .../components/magic/form/mb-upload-image.vue | 429 ------------------ .../src/components/magic/template/mb-form.vue | 147 ------ .../src/components/magic/template/mb-list.vue | 59 --- magic-boot-ui/src/icons/component.svg | 1 - magic-boot-ui/src/icons/configure.svg | 2 - magic-boot-ui/src/icons/database.svg | 2 - magic-boot-ui/src/icons/dict.svg | 1 - magic-boot-ui/src/icons/error.svg | 1 - magic-boot-ui/src/icons/examples.svg | 1 - magic-boot-ui/src/icons/eye-open.svg | 1 - magic-boot-ui/src/icons/eye.svg | 1 - magic-boot-ui/src/icons/fullscreen.svg | 1 - magic-boot-ui/src/icons/home.svg | 1 - magic-boot-ui/src/icons/interface.svg | 2 - magic-boot-ui/src/icons/log.svg | 1 - magic-boot-ui/src/icons/login-log.svg | 2 - magic-boot-ui/src/icons/menu.svg | 1 - magic-boot-ui/src/icons/monitor.svg | 1 - magic-boot-ui/src/icons/office.svg | 1 - magic-boot-ui/src/icons/oper-log.svg | 2 - magic-boot-ui/src/icons/password.svg | 1 - magic-boot-ui/src/icons/role.svg | 1 - magic-boot-ui/src/icons/search.svg | 1 - magic-boot-ui/src/icons/settings.svg | 1 - magic-boot-ui/src/icons/user.svg | 1 - magic-boot-ui/src/icons/verification-code.svg | 2 - magic-boot-ui/src/layout/empty.vue | 3 - magic-boot-ui/src/layout/layout.vue | 123 ----- magic-boot-ui/src/layout/none.vue | 7 - magic-boot-ui/src/layout/sidebar/item.vue | 17 - magic-boot-ui/src/layout/sidebar/link.vue | 17 - .../src/layout/sidebar/sidebar-item.vue | 93 ---- magic-boot-ui/src/layout/sidebar/sidebar.vue | 33 -- magic-boot-ui/src/layout/tabs.vue | 104 ----- magic-boot-ui/src/main.js | 55 --- magic-boot-ui/src/permission.js | 83 ---- magic-boot-ui/src/scripts/auth.js | 70 --- magic-boot-ui/src/scripts/common.js | 237 ---------- magic-boot-ui/src/scripts/dynamicComponent.js | 55 --- magic-boot-ui/src/scripts/gen/gen-mb-list.js | 158 ------- magic-boot-ui/src/scripts/global.js | 14 - magic-boot-ui/src/scripts/globalProperties.js | 20 - magic-boot-ui/src/scripts/hasPermission.js | 17 - magic-boot-ui/src/scripts/magic-import.js | 14 - magic-boot-ui/src/scripts/request.js | 117 ----- magic-boot-ui/src/scripts/router.js | 66 --- magic-boot-ui/src/scripts/routerPermission.js | 111 ----- magic-boot-ui/src/scripts/scroll-to.js | 58 --- magic-boot-ui/src/scripts/svg-icons.js | 6 - magic-boot-ui/src/scripts/treeTable.js | 102 ----- magic-boot-ui/src/scripts/validate.js | 87 ---- magic-boot-ui/src/views/404.vue | 3 - magic-boot-ui/src/views/common/iframe.vue | 23 - .../src/views/common/show-component.vue | 12 - .../src/views/examples/editor-table.vue | 177 -------- .../src/views/examples/select-example.vue | 24 - .../src/views/examples/test-mb-form.vue | 142 ------ .../src/views/examples/test-mb-list.vue | 207 --------- .../src/views/examples/three-linkage.vue | 83 ---- .../src/views/examples/upload-file.vue | 45 -- magic-boot-ui/src/views/home.vue | 9 - magic-boot-ui/src/views/login.vue | 217 --------- .../src/views/lowcode/code-gen-form.vue | 416 ----------------- .../src/views/lowcode/code-gen-list.vue | 91 ---- .../src/views/lowcode/magic-editor.vue | 13 - magic-boot-ui/src/views/redirect/index.vue | 10 - .../views/system/configure/configure-list.vue | 247 ---------- .../src/views/system/dict/dict-items.vue | 235 ---------- .../src/views/system/dict/dict-list.vue | 216 --------- .../src/views/system/menu/menu-form.vue | 274 ----------- .../src/views/system/menu/menu-icons.vue | 63 --- .../src/views/system/menu/menu-list.vue | 258 ----------- .../src/views/system/monitor/druid.vue | 3 - .../src/views/system/monitor/login-log.vue | 69 --- .../src/views/system/monitor/online-user.vue | 117 ----- .../src/views/system/monitor/oper-log.vue | 90 ---- .../src/views/system/office/office-list.vue | 347 -------------- .../system/role/role-assign-permissions.vue | 41 -- .../src/views/system/role/role-list.vue | 255 ----------- .../src/views/system/test/test-list.vue | 98 ---- .../src/views/system/user/user-center.vue | 93 ---- .../src/views/system/user/user-form.vue | 126 ----- .../src/views/system/user/user-list.vue | 262 ----------- magic-boot-ui/vite.config.js | 38 -- 119 files changed, 9268 deletions(-) delete mode 100644 magic-boot-ui/.env.demo delete mode 100644 magic-boot-ui/.env.development delete mode 100644 magic-boot-ui/.env.production delete mode 100644 magic-boot-ui/README.md delete mode 100644 magic-boot-ui/del_node_modules.cmd delete mode 100644 magic-boot-ui/index.html delete mode 100644 magic-boot-ui/package.json delete mode 100644 magic-boot-ui/public/favicon.ico delete mode 100644 magic-boot-ui/src/App.vue delete mode 100644 magic-boot-ui/src/assets/css/common.css delete mode 100644 magic-boot-ui/src/assets/fonts/PoetsenOne.woff2 delete mode 100644 magic-boot-ui/src/assets/images/login-bg.svg delete mode 100644 magic-boot-ui/src/assets/images/login-bg1.svg delete mode 100644 magic-boot-ui/src/assets/images/logo-magic-boot.png delete mode 100644 magic-boot-ui/src/compiler/sfc-compiler.js delete mode 100644 magic-boot-ui/src/compiler/testCode.js delete mode 100644 magic-boot-ui/src/components/index.js delete mode 100644 magic-boot-ui/src/components/magic/basic/mb-button.vue delete mode 100644 magic-boot-ui/src/components/magic/basic/mb-editor-table.vue delete mode 100644 magic-boot-ui/src/components/magic/basic/mb-icon.vue delete mode 100644 magic-boot-ui/src/components/magic/data/mb-pagination.vue delete mode 100644 magic-boot-ui/src/components/magic/data/mb-search.vue delete mode 100644 magic-boot-ui/src/components/magic/data/mb-table-column.vue delete mode 100644 magic-boot-ui/src/components/magic/data/mb-table.vue delete mode 100644 magic-boot-ui/src/components/magic/data/mb-tree.vue delete mode 100644 magic-boot-ui/src/components/magic/data/mb-treeselect.vue delete mode 100644 magic-boot-ui/src/components/magic/feedback/mb-dialog.vue delete mode 100644 magic-boot-ui/src/components/magic/form/mb-checkbox-group.vue delete mode 100644 magic-boot-ui/src/components/magic/form/mb-date.vue delete mode 100644 magic-boot-ui/src/components/magic/form/mb-input.vue delete mode 100644 magic-boot-ui/src/components/magic/form/mb-inputrange.vue delete mode 100644 magic-boot-ui/src/components/magic/form/mb-radio-group.vue delete mode 100644 magic-boot-ui/src/components/magic/form/mb-select.vue delete mode 100644 magic-boot-ui/src/components/magic/form/mb-switch.vue delete mode 100644 magic-boot-ui/src/components/magic/form/mb-upload-file.vue delete mode 100644 magic-boot-ui/src/components/magic/form/mb-upload-image.vue delete mode 100644 magic-boot-ui/src/components/magic/template/mb-form.vue delete mode 100644 magic-boot-ui/src/components/magic/template/mb-list.vue delete mode 100644 magic-boot-ui/src/icons/component.svg delete mode 100644 magic-boot-ui/src/icons/configure.svg delete mode 100644 magic-boot-ui/src/icons/database.svg delete mode 100644 magic-boot-ui/src/icons/dict.svg delete mode 100644 magic-boot-ui/src/icons/error.svg delete mode 100644 magic-boot-ui/src/icons/examples.svg delete mode 100644 magic-boot-ui/src/icons/eye-open.svg delete mode 100644 magic-boot-ui/src/icons/eye.svg delete mode 100644 magic-boot-ui/src/icons/fullscreen.svg delete mode 100644 magic-boot-ui/src/icons/home.svg delete mode 100644 magic-boot-ui/src/icons/interface.svg delete mode 100644 magic-boot-ui/src/icons/log.svg delete mode 100644 magic-boot-ui/src/icons/login-log.svg delete mode 100644 magic-boot-ui/src/icons/menu.svg delete mode 100644 magic-boot-ui/src/icons/monitor.svg delete mode 100644 magic-boot-ui/src/icons/office.svg delete mode 100644 magic-boot-ui/src/icons/oper-log.svg delete mode 100644 magic-boot-ui/src/icons/password.svg delete mode 100644 magic-boot-ui/src/icons/role.svg delete mode 100644 magic-boot-ui/src/icons/search.svg delete mode 100644 magic-boot-ui/src/icons/settings.svg delete mode 100644 magic-boot-ui/src/icons/user.svg delete mode 100644 magic-boot-ui/src/icons/verification-code.svg delete mode 100644 magic-boot-ui/src/layout/empty.vue delete mode 100644 magic-boot-ui/src/layout/layout.vue delete mode 100644 magic-boot-ui/src/layout/none.vue delete mode 100644 magic-boot-ui/src/layout/sidebar/item.vue delete mode 100644 magic-boot-ui/src/layout/sidebar/link.vue delete mode 100644 magic-boot-ui/src/layout/sidebar/sidebar-item.vue delete mode 100644 magic-boot-ui/src/layout/sidebar/sidebar.vue delete mode 100644 magic-boot-ui/src/layout/tabs.vue delete mode 100644 magic-boot-ui/src/main.js delete mode 100644 magic-boot-ui/src/permission.js delete mode 100644 magic-boot-ui/src/scripts/auth.js delete mode 100644 magic-boot-ui/src/scripts/common.js delete mode 100644 magic-boot-ui/src/scripts/dynamicComponent.js delete mode 100644 magic-boot-ui/src/scripts/gen/gen-mb-list.js delete mode 100644 magic-boot-ui/src/scripts/global.js delete mode 100644 magic-boot-ui/src/scripts/globalProperties.js delete mode 100644 magic-boot-ui/src/scripts/hasPermission.js delete mode 100644 magic-boot-ui/src/scripts/magic-import.js delete mode 100644 magic-boot-ui/src/scripts/request.js delete mode 100644 magic-boot-ui/src/scripts/router.js delete mode 100644 magic-boot-ui/src/scripts/routerPermission.js delete mode 100644 magic-boot-ui/src/scripts/scroll-to.js delete mode 100644 magic-boot-ui/src/scripts/svg-icons.js delete mode 100644 magic-boot-ui/src/scripts/treeTable.js delete mode 100644 magic-boot-ui/src/scripts/validate.js delete mode 100644 magic-boot-ui/src/views/404.vue delete mode 100644 magic-boot-ui/src/views/common/iframe.vue delete mode 100644 magic-boot-ui/src/views/common/show-component.vue delete mode 100644 magic-boot-ui/src/views/examples/editor-table.vue delete mode 100644 magic-boot-ui/src/views/examples/select-example.vue delete mode 100644 magic-boot-ui/src/views/examples/test-mb-form.vue delete mode 100644 magic-boot-ui/src/views/examples/test-mb-list.vue delete mode 100644 magic-boot-ui/src/views/examples/three-linkage.vue delete mode 100644 magic-boot-ui/src/views/examples/upload-file.vue delete mode 100644 magic-boot-ui/src/views/home.vue delete mode 100644 magic-boot-ui/src/views/login.vue delete mode 100644 magic-boot-ui/src/views/lowcode/code-gen-form.vue delete mode 100644 magic-boot-ui/src/views/lowcode/code-gen-list.vue delete mode 100644 magic-boot-ui/src/views/lowcode/magic-editor.vue delete mode 100644 magic-boot-ui/src/views/redirect/index.vue delete mode 100644 magic-boot-ui/src/views/system/configure/configure-list.vue delete mode 100644 magic-boot-ui/src/views/system/dict/dict-items.vue delete mode 100644 magic-boot-ui/src/views/system/dict/dict-list.vue delete mode 100644 magic-boot-ui/src/views/system/menu/menu-form.vue delete mode 100644 magic-boot-ui/src/views/system/menu/menu-icons.vue delete mode 100644 magic-boot-ui/src/views/system/menu/menu-list.vue delete mode 100644 magic-boot-ui/src/views/system/monitor/druid.vue delete mode 100644 magic-boot-ui/src/views/system/monitor/login-log.vue delete mode 100644 magic-boot-ui/src/views/system/monitor/online-user.vue delete mode 100644 magic-boot-ui/src/views/system/monitor/oper-log.vue delete mode 100644 magic-boot-ui/src/views/system/office/office-list.vue delete mode 100644 magic-boot-ui/src/views/system/role/role-assign-permissions.vue delete mode 100644 magic-boot-ui/src/views/system/role/role-list.vue delete mode 100644 magic-boot-ui/src/views/system/test/test-list.vue delete mode 100644 magic-boot-ui/src/views/system/user/user-center.vue delete mode 100644 magic-boot-ui/src/views/system/user/user-form.vue delete mode 100644 magic-boot-ui/src/views/system/user/user-list.vue delete mode 100644 magic-boot-ui/vite.config.js diff --git a/magic-boot-ui/.env.demo b/magic-boot-ui/.env.demo deleted file mode 100644 index 46d0046..0000000 --- a/magic-boot-ui/.env.demo +++ /dev/null @@ -1 +0,0 @@ -VITE_APP_BASE_API = 'http://localhost:8081/' diff --git a/magic-boot-ui/.env.development b/magic-boot-ui/.env.development deleted file mode 100644 index 46d0046..0000000 --- a/magic-boot-ui/.env.development +++ /dev/null @@ -1 +0,0 @@ -VITE_APP_BASE_API = 'http://localhost:8081/' diff --git a/magic-boot-ui/.env.production b/magic-boot-ui/.env.production deleted file mode 100644 index 46d0046..0000000 --- a/magic-boot-ui/.env.production +++ /dev/null @@ -1 +0,0 @@ -VITE_APP_BASE_API = 'http://localhost:8081/' diff --git a/magic-boot-ui/README.md b/magic-boot-ui/README.md deleted file mode 100644 index c0793a8..0000000 --- a/magic-boot-ui/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# Vue 3 + Vite - -This template should help get you started developing with Vue 3 in Vite. The template uses Vue 3 ` - - diff --git a/magic-boot-ui/package.json b/magic-boot-ui/package.json deleted file mode 100644 index 0dea371..0000000 --- a/magic-boot-ui/package.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "name": "magic-boot-vite", - "private": true, - "version": "0.0.0", - "scripts": { - "dev": "vite", - "build": "vite build", - "preview": "vite preview", - "demo": "vite build --mode demo" - }, - "dependencies": { - "axios": "^0.24.0", - "element-plus": "^2.2.6", - "js-sha256": "^0.9.0", - "nprogress": "0.2.0", - "path-browserify": "^1.0.1", - "vue": "^3.2.25", - "vue-cropper": "^1.0.2", - "vue-router": "^4.0.0-0", - "vuedraggable": "^4.1.0", - "xlsx": "^0.18.3" - }, - "devDependencies": { - "@vitejs/plugin-vue": "^2.2.0", - "vite-plugin-svg-icons": "^1.1.0", - "sass": "^1.49.7", - "vite": "^2.8.0" - } -} diff --git a/magic-boot-ui/public/favicon.ico b/magic-boot-ui/public/favicon.ico deleted file mode 100644 index 57167beb77b2d0dc50cfaec3f51470626f748b29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4286 zcmeHKOGu+v6#kQ_e-!N)$0~@XS%?fSd?7k$)#wxjMR75@P!Yvv26UL(MV;EJ;70I; zE5Qc{3SFr?7mA8SLGXbOP?1uUQ9(4ml4#86*Z&+RBCTxmQJHzz^jvhq@G ztW{#AQp9|jhy@3OIM#F`Oz&^!@KKt}UvEW(`^%tmm*KgGW1&*Y5EmrJ-j5n8@O`kg{)UDIPCt{Alc0Rq*Vo7P%E}6e zyS~1j?U|VwxVyU}BO?RH$H&}eHk&~(8jTnk8F?@#+Tw3-Z)acQzSLI1I?eb)#-F-ZEa-AhmM@J(#I2gOTyS#3iAH{e|N(wwYJTN;uOZ2Q0@%8rhvfb6y zWjB9RR1^*m4_QNUGCx1hI(m6|VS0L+{a#;Rvo4e)TwPr;F)_jIOG`@_8XCgE!2#QK zb#-?0(>k}dw(erAy1M$#M@vf!E-o%uA3CSR#KbWF=;$c7lP54C9KcguWj+) zAM1$UUjqOA`v?7g9jd_hYB>_Wb1aCXFie4ipKkA8bpJH}qQu$HN}M_g=Ms - - \ No newline at end of file diff --git a/magic-boot-ui/src/assets/css/common.css b/magic-boot-ui/src/assets/css/common.css deleted file mode 100644 index f78e207..0000000 --- a/magic-boot-ui/src/assets/css/common.css +++ /dev/null @@ -1,68 +0,0 @@ -@font-face { - font-family: PoetsenOne; - src: url(../fonts/PoetsenOne.woff2) format('woff2'); - font-weight: 100; - font-style: normal; -} -::-webkit-scrollbar { - width: 6px; - height: 6px; - overflow: auto -} - -::-webkit-scrollbar-thumb { - background-color: #e6e6e6; - min-height: 25px; - min-width: 25px; - border: 1px solid #e0e0e0; - border-radius: 99px -} - -::-webkit-scrollbar-track { - background-color: #f7f7f7; - border: 1px solid #efefef -} -body{ - --mb-main-color: #409EFF; - --mb-sidebar-width: 240px; - --mb-main-icon-color: #909399; - --mb-header-height: 60px; - --mb-avatar-text-size: 18px; - /*--mb-menu-item-height: 50px;*/ -} -.el-header{ - --el-header-height: var(--mb-header-height); -} -.el-avatar{ - --el-avatar-text-size: var(--mb-avatar-text-size); - --el-avatar-bg-color: var(--mb-main-color); - border: 1px solid white; -} -.el-dialog__body{ - padding: 5px 20px; -} -/*.el-sub-menu__title, .el-menu-item{*/ -/* height: var(--mb-menu-item-height) !important;*/ -/*}*/ -.app-container hr { - border: none; - height: 1px; - background: #F3F3F3; -} -.toolbar-container{ - margin-bottom: 10px -} -.toolbar-container > div, -.toolbar-container > button{ - margin-left: 12px; -} -.toolbar-container > div:nth-child(1), -.toolbar-container > button:nth-child(1){ - margin-left: 0px; -} -.clear{ - clear: both; -} -a{ - text-decoration: none; -} diff --git a/magic-boot-ui/src/assets/fonts/PoetsenOne.woff2 b/magic-boot-ui/src/assets/fonts/PoetsenOne.woff2 deleted file mode 100644 index 2e857b7fd23151a2d0c4e5a443a5c4da61df234a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53604 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/magic-boot-ui/src/assets/images/login-bg1.svg b/magic-boot-ui/src/assets/images/login-bg1.svg deleted file mode 100644 index 192651a..0000000 --- a/magic-boot-ui/src/assets/images/login-bg1.svg +++ /dev/null @@ -1,138 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/magic-boot-ui/src/assets/images/logo-magic-boot.png b/magic-boot-ui/src/assets/images/logo-magic-boot.png deleted file mode 100644 index 22e8d06f2904eb5e45382343fae97650eeb626df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4778 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 diff --git a/magic-boot-ui/src/compiler/sfc-compiler.js b/magic-boot-ui/src/compiler/sfc-compiler.js deleted file mode 100644 index 6896e2b..0000000 --- a/magic-boot-ui/src/compiler/sfc-compiler.js +++ /dev/null @@ -1,206 +0,0 @@ -import * as SFCCompiler from '@vue/compiler-sfc' - -const COMP_IDENTIFIER = `__sfc__` - -export function compileFile(filename, code, compiled) { - if (!code.trim()) { - compiled.errors = [] - return - } - - if (!filename.endsWith('.vue')) { - compiled.js = compiled.ssr = code - compiled.errors = [] - return - } - - const id = hashId(filename) - const { errors, descriptor } = SFCCompiler.parse(code, { - filename, - sourceMap: true - }) - // console.log(descriptor) - if (errors.length) { - compiled.errors = errors - return - } - - if ( - (descriptor.script && descriptor.script.lang) || - (descriptor.scriptSetup && descriptor.scriptSetup.lang) || - descriptor.styles.some((s) => s.lang) || - (descriptor.template && descriptor.template.lang) - ) { - compiled.errors = [ - 'lang="x" pre-processors are not supported in the in-browser playground.' - ] - return - } - - const hasScoped = descriptor.styles.some((s) => s.scoped) - let clientCode = '' - let ssrCode = '' - - const appendSharedCode = (code) => { - clientCode += code - ssrCode += code - } - - const clientScriptResult = doCompileScript(descriptor, id, false) - if (!clientScriptResult) { - return - } - const [clientScript, bindings] = clientScriptResult - clientCode += clientScript - - // script ssr only needs to be performed if using - - -` \ No newline at end of file diff --git a/magic-boot-ui/src/components/index.js b/magic-boot-ui/src/components/index.js deleted file mode 100644 index 7f12fa3..0000000 --- a/magic-boot-ui/src/components/index.js +++ /dev/null @@ -1,9 +0,0 @@ -import { defineAsyncComponent } from 'vue' - -const components = import.meta.glob('./**/*.vue') -export default function install (app) { - for (const [key, value] of Object.entries(components)) { - const name = key.substring(key.lastIndexOf('/') + 1, key.lastIndexOf('.')) - app.component(name, defineAsyncComponent(value)) - } -} diff --git a/magic-boot-ui/src/components/magic/basic/mb-button.vue b/magic-boot-ui/src/components/magic/basic/mb-button.vue deleted file mode 100644 index f9c5a0d..0000000 --- a/magic-boot-ui/src/components/magic/basic/mb-button.vue +++ /dev/null @@ -1,141 +0,0 @@ - - - diff --git a/magic-boot-ui/src/components/magic/basic/mb-editor-table.vue b/magic-boot-ui/src/components/magic/basic/mb-editor-table.vue deleted file mode 100644 index 8332fed..0000000 --- a/magic-boot-ui/src/components/magic/basic/mb-editor-table.vue +++ /dev/null @@ -1,106 +0,0 @@ - - - diff --git a/magic-boot-ui/src/components/magic/basic/mb-icon.vue b/magic-boot-ui/src/components/magic/basic/mb-icon.vue deleted file mode 100644 index 064946e..0000000 --- a/magic-boot-ui/src/components/magic/basic/mb-icon.vue +++ /dev/null @@ -1,26 +0,0 @@ - - - diff --git a/magic-boot-ui/src/components/magic/data/mb-pagination.vue b/magic-boot-ui/src/components/magic/data/mb-pagination.vue deleted file mode 100644 index 61330f7..0000000 --- a/magic-boot-ui/src/components/magic/data/mb-pagination.vue +++ /dev/null @@ -1,97 +0,0 @@ - - - - - diff --git a/magic-boot-ui/src/components/magic/data/mb-search.vue b/magic-boot-ui/src/components/magic/data/mb-search.vue deleted file mode 100644 index 32f68b6..0000000 --- a/magic-boot-ui/src/components/magic/data/mb-search.vue +++ /dev/null @@ -1,101 +0,0 @@ - - - - - diff --git a/magic-boot-ui/src/components/magic/data/mb-table-column.vue b/magic-boot-ui/src/components/magic/data/mb-table-column.vue deleted file mode 100644 index 146bbdc..0000000 --- a/magic-boot-ui/src/components/magic/data/mb-table-column.vue +++ /dev/null @@ -1,63 +0,0 @@ - - - diff --git a/magic-boot-ui/src/components/magic/data/mb-table.vue b/magic-boot-ui/src/components/magic/data/mb-table.vue deleted file mode 100644 index d477a1c..0000000 --- a/magic-boot-ui/src/components/magic/data/mb-table.vue +++ /dev/null @@ -1,300 +0,0 @@ - - - - - - - diff --git a/magic-boot-ui/src/components/magic/data/mb-tree.vue b/magic-boot-ui/src/components/magic/data/mb-tree.vue deleted file mode 100644 index 0badb69..0000000 --- a/magic-boot-ui/src/components/magic/data/mb-tree.vue +++ /dev/null @@ -1,153 +0,0 @@ - - - - diff --git a/magic-boot-ui/src/components/magic/data/mb-treeselect.vue b/magic-boot-ui/src/components/magic/data/mb-treeselect.vue deleted file mode 100644 index 7e73d7b..0000000 --- a/magic-boot-ui/src/components/magic/data/mb-treeselect.vue +++ /dev/null @@ -1,40 +0,0 @@ - - - diff --git a/magic-boot-ui/src/components/magic/feedback/mb-dialog.vue b/magic-boot-ui/src/components/magic/feedback/mb-dialog.vue deleted file mode 100644 index c8613a9..0000000 --- a/magic-boot-ui/src/components/magic/feedback/mb-dialog.vue +++ /dev/null @@ -1,141 +0,0 @@ - - - diff --git a/magic-boot-ui/src/components/magic/form/mb-checkbox-group.vue b/magic-boot-ui/src/components/magic/form/mb-checkbox-group.vue deleted file mode 100644 index a75f3d6..0000000 --- a/magic-boot-ui/src/components/magic/form/mb-checkbox-group.vue +++ /dev/null @@ -1,133 +0,0 @@ - - - diff --git a/magic-boot-ui/src/components/magic/form/mb-date.vue b/magic-boot-ui/src/components/magic/form/mb-date.vue deleted file mode 100644 index cf5672f..0000000 --- a/magic-boot-ui/src/components/magic/form/mb-date.vue +++ /dev/null @@ -1,48 +0,0 @@ - - - diff --git a/magic-boot-ui/src/components/magic/form/mb-input.vue b/magic-boot-ui/src/components/magic/form/mb-input.vue deleted file mode 100644 index 8e8e573..0000000 --- a/magic-boot-ui/src/components/magic/form/mb-input.vue +++ /dev/null @@ -1,23 +0,0 @@ - - - diff --git a/magic-boot-ui/src/components/magic/form/mb-inputrange.vue b/magic-boot-ui/src/components/magic/form/mb-inputrange.vue deleted file mode 100644 index 9264821..0000000 --- a/magic-boot-ui/src/components/magic/form/mb-inputrange.vue +++ /dev/null @@ -1,37 +0,0 @@ - - - - - diff --git a/magic-boot-ui/src/components/magic/form/mb-radio-group.vue b/magic-boot-ui/src/components/magic/form/mb-radio-group.vue deleted file mode 100644 index 77e8679..0000000 --- a/magic-boot-ui/src/components/magic/form/mb-radio-group.vue +++ /dev/null @@ -1,95 +0,0 @@ - - - diff --git a/magic-boot-ui/src/components/magic/form/mb-select.vue b/magic-boot-ui/src/components/magic/form/mb-select.vue deleted file mode 100644 index 93d8d40..0000000 --- a/magic-boot-ui/src/components/magic/form/mb-select.vue +++ /dev/null @@ -1,151 +0,0 @@ - - - diff --git a/magic-boot-ui/src/components/magic/form/mb-switch.vue b/magic-boot-ui/src/components/magic/form/mb-switch.vue deleted file mode 100644 index fec4ab7..0000000 --- a/magic-boot-ui/src/components/magic/form/mb-switch.vue +++ /dev/null @@ -1,69 +0,0 @@ - - - diff --git a/magic-boot-ui/src/components/magic/form/mb-upload-file.vue b/magic-boot-ui/src/components/magic/form/mb-upload-file.vue deleted file mode 100644 index 3d48df6..0000000 --- a/magic-boot-ui/src/components/magic/form/mb-upload-file.vue +++ /dev/null @@ -1,302 +0,0 @@ - - - - - diff --git a/magic-boot-ui/src/components/magic/form/mb-upload-image.vue b/magic-boot-ui/src/components/magic/form/mb-upload-image.vue deleted file mode 100644 index 3c94f16..0000000 --- a/magic-boot-ui/src/components/magic/form/mb-upload-image.vue +++ /dev/null @@ -1,429 +0,0 @@ - - - - - - - diff --git a/magic-boot-ui/src/components/magic/template/mb-form.vue b/magic-boot-ui/src/components/magic/template/mb-form.vue deleted file mode 100644 index f2dc6c1..0000000 --- a/magic-boot-ui/src/components/magic/template/mb-form.vue +++ /dev/null @@ -1,147 +0,0 @@ - - - diff --git a/magic-boot-ui/src/components/magic/template/mb-list.vue b/magic-boot-ui/src/components/magic/template/mb-list.vue deleted file mode 100644 index 30f21e3..0000000 --- a/magic-boot-ui/src/components/magic/template/mb-list.vue +++ /dev/null @@ -1,59 +0,0 @@ - - - diff --git a/magic-boot-ui/src/icons/component.svg b/magic-boot-ui/src/icons/component.svg deleted file mode 100644 index dd829bf..0000000 --- a/magic-boot-ui/src/icons/component.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/magic-boot-ui/src/icons/configure.svg b/magic-boot-ui/src/icons/configure.svg deleted file mode 100644 index b9b66a6..0000000 --- a/magic-boot-ui/src/icons/configure.svg +++ /dev/null @@ -1,2 +0,0 @@ - \ No newline at end of file diff --git a/magic-boot-ui/src/icons/database.svg b/magic-boot-ui/src/icons/database.svg deleted file mode 100644 index a8b8942..0000000 --- a/magic-boot-ui/src/icons/database.svg +++ /dev/null @@ -1,2 +0,0 @@ - \ No newline at end of file diff --git a/magic-boot-ui/src/icons/dict.svg b/magic-boot-ui/src/icons/dict.svg deleted file mode 100644 index a5bd659..0000000 --- a/magic-boot-ui/src/icons/dict.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/magic-boot-ui/src/icons/error.svg b/magic-boot-ui/src/icons/error.svg deleted file mode 100644 index e509005..0000000 --- a/magic-boot-ui/src/icons/error.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/magic-boot-ui/src/icons/examples.svg b/magic-boot-ui/src/icons/examples.svg deleted file mode 100644 index c30cc01..0000000 --- a/magic-boot-ui/src/icons/examples.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/magic-boot-ui/src/icons/eye-open.svg b/magic-boot-ui/src/icons/eye-open.svg deleted file mode 100644 index 88dcc98..0000000 --- a/magic-boot-ui/src/icons/eye-open.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/magic-boot-ui/src/icons/eye.svg b/magic-boot-ui/src/icons/eye.svg deleted file mode 100644 index 16ed2d8..0000000 --- a/magic-boot-ui/src/icons/eye.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/magic-boot-ui/src/icons/fullscreen.svg b/magic-boot-ui/src/icons/fullscreen.svg deleted file mode 100644 index 0e86b6f..0000000 --- a/magic-boot-ui/src/icons/fullscreen.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/magic-boot-ui/src/icons/home.svg b/magic-boot-ui/src/icons/home.svg deleted file mode 100644 index 57cbfc4..0000000 --- a/magic-boot-ui/src/icons/home.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/magic-boot-ui/src/icons/interface.svg b/magic-boot-ui/src/icons/interface.svg deleted file mode 100644 index 39fc373..0000000 --- a/magic-boot-ui/src/icons/interface.svg +++ /dev/null @@ -1,2 +0,0 @@ - \ No newline at end of file diff --git a/magic-boot-ui/src/icons/log.svg b/magic-boot-ui/src/icons/log.svg deleted file mode 100644 index a4bebdf..0000000 --- a/magic-boot-ui/src/icons/log.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/magic-boot-ui/src/icons/login-log.svg b/magic-boot-ui/src/icons/login-log.svg deleted file mode 100644 index ec896a9..0000000 --- a/magic-boot-ui/src/icons/login-log.svg +++ /dev/null @@ -1,2 +0,0 @@ - \ No newline at end of file diff --git a/magic-boot-ui/src/icons/menu.svg b/magic-boot-ui/src/icons/menu.svg deleted file mode 100644 index b687061..0000000 --- a/magic-boot-ui/src/icons/menu.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/magic-boot-ui/src/icons/monitor.svg b/magic-boot-ui/src/icons/monitor.svg deleted file mode 100644 index bea0547..0000000 --- a/magic-boot-ui/src/icons/monitor.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/magic-boot-ui/src/icons/office.svg b/magic-boot-ui/src/icons/office.svg deleted file mode 100644 index 21b749f..0000000 --- a/magic-boot-ui/src/icons/office.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/magic-boot-ui/src/icons/oper-log.svg b/magic-boot-ui/src/icons/oper-log.svg deleted file mode 100644 index 5a2db7c..0000000 --- a/magic-boot-ui/src/icons/oper-log.svg +++ /dev/null @@ -1,2 +0,0 @@ - \ No newline at end of file diff --git a/magic-boot-ui/src/icons/password.svg b/magic-boot-ui/src/icons/password.svg deleted file mode 100644 index e291d85..0000000 --- a/magic-boot-ui/src/icons/password.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/magic-boot-ui/src/icons/role.svg b/magic-boot-ui/src/icons/role.svg deleted file mode 100644 index 34cffeb..0000000 --- a/magic-boot-ui/src/icons/role.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/magic-boot-ui/src/icons/search.svg b/magic-boot-ui/src/icons/search.svg deleted file mode 100644 index 84233dd..0000000 --- a/magic-boot-ui/src/icons/search.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/magic-boot-ui/src/icons/settings.svg b/magic-boot-ui/src/icons/settings.svg deleted file mode 100644 index a8d3657..0000000 --- a/magic-boot-ui/src/icons/settings.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/magic-boot-ui/src/icons/user.svg b/magic-boot-ui/src/icons/user.svg deleted file mode 100644 index 0ba0716..0000000 --- a/magic-boot-ui/src/icons/user.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/magic-boot-ui/src/icons/verification-code.svg b/magic-boot-ui/src/icons/verification-code.svg deleted file mode 100644 index a105f8e..0000000 --- a/magic-boot-ui/src/icons/verification-code.svg +++ /dev/null @@ -1,2 +0,0 @@ - \ No newline at end of file diff --git a/magic-boot-ui/src/layout/empty.vue b/magic-boot-ui/src/layout/empty.vue deleted file mode 100644 index 36da3c3..0000000 --- a/magic-boot-ui/src/layout/empty.vue +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/magic-boot-ui/src/layout/layout.vue b/magic-boot-ui/src/layout/layout.vue deleted file mode 100644 index 02f3b80..0000000 --- a/magic-boot-ui/src/layout/layout.vue +++ /dev/null @@ -1,123 +0,0 @@ - - - - - diff --git a/magic-boot-ui/src/layout/none.vue b/magic-boot-ui/src/layout/none.vue deleted file mode 100644 index 2a46bd3..0000000 --- a/magic-boot-ui/src/layout/none.vue +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/magic-boot-ui/src/layout/sidebar/item.vue b/magic-boot-ui/src/layout/sidebar/item.vue deleted file mode 100644 index 0b74ddd..0000000 --- a/magic-boot-ui/src/layout/sidebar/item.vue +++ /dev/null @@ -1,17 +0,0 @@ - - - - - \ No newline at end of file diff --git a/magic-boot-ui/src/layout/sidebar/link.vue b/magic-boot-ui/src/layout/sidebar/link.vue deleted file mode 100644 index 2dc59f3..0000000 --- a/magic-boot-ui/src/layout/sidebar/link.vue +++ /dev/null @@ -1,17 +0,0 @@ - - - - diff --git a/magic-boot-ui/src/layout/sidebar/sidebar-item.vue b/magic-boot-ui/src/layout/sidebar/sidebar-item.vue deleted file mode 100644 index 7dcae50..0000000 --- a/magic-boot-ui/src/layout/sidebar/sidebar-item.vue +++ /dev/null @@ -1,93 +0,0 @@ - - - diff --git a/magic-boot-ui/src/layout/sidebar/sidebar.vue b/magic-boot-ui/src/layout/sidebar/sidebar.vue deleted file mode 100644 index 366cf6d..0000000 --- a/magic-boot-ui/src/layout/sidebar/sidebar.vue +++ /dev/null @@ -1,33 +0,0 @@ - - - - - \ No newline at end of file diff --git a/magic-boot-ui/src/layout/tabs.vue b/magic-boot-ui/src/layout/tabs.vue deleted file mode 100644 index 851e013..0000000 --- a/magic-boot-ui/src/layout/tabs.vue +++ /dev/null @@ -1,104 +0,0 @@ - - - diff --git a/magic-boot-ui/src/main.js b/magic-boot-ui/src/main.js deleted file mode 100644 index 078533c..0000000 --- a/magic-boot-ui/src/main.js +++ /dev/null @@ -1,55 +0,0 @@ -import {createApp} from 'vue' -const app = createApp(App) -import ElementPlus from 'element-plus' -import 'element-plus/dist/index.css' -import '@/assets/css/common.css' -import zhCn from 'element-plus/es/locale/lang/zh-cn' -import 'vite-plugin-svg-icons/register' -import App from './App.vue' -import router from './scripts/router' -import components from '@/components/index' -import globalProperties from './scripts/globalProperties' -import hasPermission from './scripts/hasPermission' -import { appComponent } from './scripts/dynamicComponent' -import '@/permission' -import global from '@/scripts/global.js' -import '@/scripts/magic-import' -app.use(globalProperties) - -var loadDynamicComponent = false -import { ElLoading } from 'element-plus' -document.title = global.title -router.beforeEach(async (to, from) => { - global.tabValue.value = to.path - if((to.name && global.visitedViews.length === 0 || global.visitedViews.every(it => it.path !== to.path)) && !to.path.startsWith('/redirect') && !to.path.startsWith('/login')){ - if(!loadDynamicComponent){ - loadDynamicComponent = true - const loading = ElLoading.service({ - lock: true, - background: 'rgba(255, 255, 255, 0)', - }) - await app.config.globalProperties.$post('/system/component/list').then((res) => { - res.data.forEach(it => { - global.dynamicComponentNames.push(it.name) - appComponent(app, it) - }) - loading.close() - }) - } - global.visitedViews.push(to) - } - global.visitedViews.forEach((it, i) => { - if(it.path == to.path){ - global.visitedViews[i] = to - } - }) - return true -}) -app.use(hasPermission) -app.use(components) -app.use(ElementPlus, { - // size: 'small', - locale: zhCn -}) -app.use(router) -app.mount('#app') diff --git a/magic-boot-ui/src/permission.js b/magic-boot-ui/src/permission.js deleted file mode 100644 index f7da8fc..0000000 --- a/magic-boot-ui/src/permission.js +++ /dev/null @@ -1,83 +0,0 @@ -import router from './scripts/router' -import { getUserInfo, removeToken } from './scripts/auth' -import { ElMessage } from 'element-plus' -import NProgress from 'nprogress' // progress bar -import 'nprogress/nprogress.css' // progress bar style -import { getToken } from '@/scripts/auth' // get token from cookie -import global from '@/scripts/global' -import common from '@/scripts/common' -import { generateRoutes, generateHiddenRoutes } from '@/scripts/routerPermission' - -NProgress.configure({ showSpinner: false }) // NProgress Configuration - -const whiteList = ['/login'] // no redirect whitelist -var loadInfo = false -router.beforeEach(async(to, from, next) => { - // start progress bar - NProgress.start() - - // determine whether the user has logged in - const hasToken = getToken() - - if (hasToken) { - if (to.path === '/login') { - // if is logged in, redirect to the home page - next({ path: '/' }) - NProgress.done() - } else { - // determine whether the user has obtained his permission roles through getInfo - if (loadInfo) { - next() - } else { - loadInfo = true - try { - // get user info - // note: roles must be a object array! such as: ['admin'] or ,['developer','editor'] - await getUserInfo() - await common.getDictData() - // await common.loadConfig() - // generate accessible routes map based on roles - await generateRoutes().then(accessRoutes => { - global.user.permissionRoutes.push(...accessRoutes) - accessRoutes.forEach(it => { - router.addRoute(it) - }) - }) - await generateHiddenRoutes().then(accessRoutes => { - accessRoutes.forEach(it => { - router.addRoute(it) - }) - }) - // dynamically add accessible routes - // hack method to ensure that addRoutes is complete - // set the replace: true, so the navigation will not leave a history record - next({ ...to, replace: true }) - } catch (error) { - console.log(error) - // remove token and go to login page to re-login - removeToken() - ElMessage.error(error.data || 'Has Error') - next(`/login`) - NProgress.done() - } - } - } - } else { - /* has no token*/ - - if (whiteList.indexOf(to.path) !== -1) { - // in the free login whitelist, go directly - next() - } else { - // other pages that do not have permission to access are redirected to the login page. - next(`/login`) - NProgress.done() - } - } -}) - -router.afterEach(() => { - // finish progress bar - NProgress.done() -}) - diff --git a/magic-boot-ui/src/scripts/auth.js b/magic-boot-ui/src/scripts/auth.js deleted file mode 100644 index b9f5e13..0000000 --- a/magic-boot-ui/src/scripts/auth.js +++ /dev/null @@ -1,70 +0,0 @@ -import global from './global' -import request from '@/scripts/request' -import { sha256 } from 'js-sha256' - -const TokenKey = 'magic_boot_token' - -export function getToken() { - return localStorage.getItem(TokenKey); -} - -export function setToken(token) { - localStorage.setItem(TokenKey, token); -} - -export function removeToken() { - localStorage.removeItem(TokenKey); - global.user = { - authorities: [], - info: {}, - permissionRoutes: [] - } -} - -export async function getUserInfo() { - await request({ - url: '/system/user/info', - method: 'get' - }).then(response => { - const { data } = response - if(data){ - var authorities_ = [] - for (var i = 0; i < data.authorities.length; i++) { - authorities_.push(data.authorities[i]) - } - global.user.authorities = authorities_ - global.user.info = data - } - }) -} - -export function login(data){ - return new Promise((resolve, reject) => { - request({ - url: '/system/security/login', - method: 'post', - data: { - username: data.username, - password: sha256(data.password), - code: data.code, - uuid: data.uuid - } - }).then(res => { - var token = res.data - setToken(token) - resolve(token) - }).catch((e) => { - reject(e) - }) - }) -} - -export function logout(){ - request({ - url: '/system/security/logout', - method: 'get' - }).then(() => { - removeToken() - location.reload() - }) -} diff --git a/magic-boot-ui/src/scripts/common.js b/magic-boot-ui/src/scripts/common.js deleted file mode 100644 index 4719d06..0000000 --- a/magic-boot-ui/src/scripts/common.js +++ /dev/null @@ -1,237 +0,0 @@ -import request from '@/scripts/request' -import { ElMessageBox, ElNotification } from 'element-plus' -import global from '@/scripts/global' -import { utils, writeFile } from 'xlsx' -import { getToken } from '@/scripts/auth' - -const common = {} - -let dictData = [] -common.getDictData = async function() { - await request({ - url: '/system/dict/items/all', - method: 'get' - }).then((response) => { - const { data } = response - dictData = data - }) -} - -common.getDictType = (type) => { - return dictData.filter(it => it.type === type) -} - -common.getDictLabel = (type, value) => { - value = (value || '') + '' - var values = [] - value.split(',').forEach(v => { - const list = dictData.filter(it => it.type === type && it.value === v + '') - values.push(list && list[0] && list[0].label || '') - }) - return values.join(',') -} - -common.handleDelete = (options) => { - const url = options.url - const id = options.id - ElMessageBox.confirm('此操作将永久删除该数据, 是否继续?', '提示', { - confirmButtonText: '确定', - cancelButtonText: '取消', - type: 'warning' - }).then(() => { - request({ - url: url, - method: 'delete', - params: { - id: id - } - }).then(() => { - ElNotification({ - title: '成功', - message: '删除成功', - type: 'success', - duration: 2000 - }) - options && options.done() - }) - }) -} - -const formatJson = (list, filterVal) => { - return list.map(v => filterVal.map(j => { - return v[j] - })) -} - -common.$get = (url, data) => request({ url, params: data }) -common.$delete = (url, data) => request({ url, method: 'delete', params: data }) -common.$post = (url, data) => request.post(url, data, { - headers: { - 'Content-Type': 'application/x-www-form-urlencoded' - }, - transformRequest: [data => data && Object.keys(data).map(it => encodeURIComponent(it) + '=' + encodeURIComponent(data[it] === null || data[it] === undefined ? '' : data[it])).join('&')] -}) -common.$postJson = (url, data) => request.post(url, JSON.stringify(data), { - headers: { - 'Content-Type': 'application/json' - } -}) - -common.renderWhere = (where) => { - var newWhere = {} - for(var key in where) { - if(where[key] instanceof Object){ - newWhere[key] = where[key].value - }else{ - newWhere[key] = where[key] - } - } - return newWhere -} - -// common.exportExcel = (options) => { -// var where = options.where || {} -// where = common.renderWhere(where) -// where.current = 1 -// where.size = 99999999 -// const url = options.url -// const headers = options.headers -// const columns = options.columns -// request({ -// url: url, -// method: 'post', -// params: where -// }).then(res => { -// import('@/vendor/Export2Excel').then(excel => { -// const data = formatJson(res.data, columns) -// excel.export_json_to_excel({ -// header: headers, -// data, -// filename: 'table-list' -// }) -// }) -// }) -// } - -common.handlerTreeData = (data, id, pid, sort, pidVal) => { - var treeData = [] - var addChildren = (it) => { - var children = data.filter(d => d[pid] === it[id]) - if (children && children.length > 0) { - children.sort((a, b) => { - return a[sort] - b[sort] - }) - it.children = children - children.forEach(chi => { - addChildren(chi) - }) - } - } - data.sort((a, b) => { - return a[sort] - b[sort] - }) - data.filter(it => it[pid] === pidVal).forEach(it => { - addChildren(it) - treeData.push(it) - }) - return treeData -} - -common.uuid = () => { - function S4() { - return (((1+Math.random())*0x10000)|0).toString(16).substring(1); - } - return (S4()+S4()+S4()+S4()+S4()+S4()+S4()+S4()); -} - -common.objAssign = (obj1, obj2, exclude) => { - exclude = exclude || '' - for (var o1 in obj1) { - for (var o2 in obj2) { - if (o1 === o2) { - if(exclude.indexOf(o1) == -1){ - obj1[o1] = obj2[o2] - } - } - } - } -} - -common.copyNew = (obj) => { - return JSON.parse(JSON.stringify(obj)) -} - -common.getParam = (data) => { - let url = '' - for (var k in data) { - const value = data[k] !== undefined ? data[k] : '' - url += `&${k}=${encodeURIComponent(value)}` - } - return url ? url.substring(1) : '' -} - -common.getUrl = (url, data) => { - url += (url.indexOf('?') < 0 ? '?' : '') + common.getParam(data) - return url -} - -common.downloadMore = (urls, filename) => { - var params = { - urls: encodeURI(urls), - filename: filename || '', - token: getToken() - } - var form = document.createElement("form"); - form.style.display = 'none'; - form.action = global.baseApi + '/system/file/download'; - form.method = 'post'; - document.body.appendChild(form); - for(var key in params){ - var input = document.createElement("input"); - input.type = 'hidden'; - input.name = key; - input.value = params[key]; - form.appendChild(input); - } - form.submit(); - form.remove(); -} - -common.download = (urls, filename) => { - location.href = common.downloadHref(urls, filename) -} - -common.downloadHref = (urls, filename) => { - return global.baseApi + `/system/file/download?urls=${encodeURI(urls)}&filename=${filename || ''}&token=${getToken()}` -} - -// common.loadConfig = async() => { -// await request({ -// url: '/system/config/list' -// }).then(res => { -// const { data } = res -// global.filePrefix = data.filePrefix -// }) -// } - -common.setDefaultValue = (obj, attr, value) => { - obj[attr] = obj[attr] === undefined ? value : obj[attr] -} - -common.isComma = (value) => { - return value.toString().indexOf(',') !== -1 -} - -common.exportExcel = (options) => { - options.suffix = options.suffix || 'xlsx' - const workBook = utils.json_to_sheet(options.data); - const wb = utils.book_new() - utils.book_append_sheet(wb, workBook, 'sheet1'); - writeFile(wb, `${options.fileName}.${options.suffix || 'xlsx'}`); -} - -common.objectAssign = (target, source) => { - return Object.assign({}, JSON.parse(JSON.stringify(target)), JSON.parse(JSON.stringify(source))) -} - -export default common diff --git a/magic-boot-ui/src/scripts/dynamicComponent.js b/magic-boot-ui/src/scripts/dynamicComponent.js deleted file mode 100644 index efff712..0000000 --- a/magic-boot-ui/src/scripts/dynamicComponent.js +++ /dev/null @@ -1,55 +0,0 @@ -import { babelParse } from '@vue/compiler-sfc' -import { compileFile } from '@/compiler/sfc-compiler.js' -import { ElLoading, ElMessage } from 'element-plus' - -export function appComponent(app, item){ - var compiled = {} - compileFile('TestCode.vue', item.code, compiled) - if(compiled.errors.length > 0){ - ElMessage({ - type: 'error', - duration: 0, - showClose: true, - message: ` - 组件“${item.name}”发生错误: - ${compiled.errors[0]} - ` - }) - throw compiled.errors[0] - }else{ - var code = compiled.js - var ast = babelParse(code, { - sourceType: 'module' - }) - var replaceCode = (node, subCode) => code.substring(0, node.start) + subCode + code.substring(node.end); - for(var i = ast.program.body.length - 1; i>=0; i--){ - var node = ast.program.body[i] - if(node.type === 'ImportDeclaration'){ - code = replaceCode(node, node.specifiers.map(it => `const ${it.local?.name || it.imported?.name || '*'} = ___magic__import__('${node.source.value}', '${it.imported?.name || '*'}');`).join('\r\n')); - } else if (node.type === 'ExportDefaultDeclaration'){ - code = replaceCode(node, `return ${node.declaration.name}`) - } - } - code = `(function(){ - ${code} - })()` - var componentStyle = document.createElement("style"); - componentStyle.innerHTML = compiled.css - document.head.appendChild(componentStyle); - app.component(item.name, eval(code)) - } -} -// -// const install = (app) => { -// const loading = ElLoading.service({ -// lock: true, -// background: 'rgba(255, 255, 255, 0)', -// }) -// app.config.globalProperties.$post('/system/component/list').then((res) => { -// res.data.forEach(it => { -// appComponent(app, it) -// }) -// loading.close() -// }) -// } -// export default install diff --git a/magic-boot-ui/src/scripts/gen/gen-mb-list.js b/magic-boot-ui/src/scripts/gen/gen-mb-list.js deleted file mode 100644 index 9284696..0000000 --- a/magic-boot-ui/src/scripts/gen/gen-mb-list.js +++ /dev/null @@ -1,158 +0,0 @@ -function gen(groupPath, data){ - var permissionPrefix = groupPath.replace(/^\//,'').replace(/\/\//, '/').replace(/\//g, ':') - var html = ` -` - return html -} -export default gen diff --git a/magic-boot-ui/src/scripts/global.js b/magic-boot-ui/src/scripts/global.js deleted file mode 100644 index 323e577..0000000 --- a/magic-boot-ui/src/scripts/global.js +++ /dev/null @@ -1,14 +0,0 @@ -import { reactive, ref } from 'vue' - -export default { - title: 'Magic Boot', - user: { - authorities: [], - info: {}, - permissionRoutes: [] - }, - baseApi: import.meta.env.VITE_APP_BASE_API, - visitedViews: reactive([]), - tabValue: ref(''), - dynamicComponentNames: [] -} diff --git a/magic-boot-ui/src/scripts/globalProperties.js b/magic-boot-ui/src/scripts/globalProperties.js deleted file mode 100644 index 6d3bcec..0000000 --- a/magic-boot-ui/src/scripts/globalProperties.js +++ /dev/null @@ -1,20 +0,0 @@ -import * as PlusIcons from '@element-plus/icons-vue' -import request from './request' -import global from './global' -import common from './common' -import treeTable from './treeTable' - -const install = (app) => { - app.config.globalProperties.$request = request - app.config.globalProperties.$post = common.$post - app.config.globalProperties.$postJson = common.$postJson - app.config.globalProperties.$get = common.$get - app.config.globalProperties.$delete = common.$delete - app.config.globalProperties.$global = global - app.config.globalProperties.$common = common - app.config.globalProperties.$treeTable = treeTable - for(var key in PlusIcons) { - app.component(`ElIcon${key}`, PlusIcons[key]) - } -} -export default install diff --git a/magic-boot-ui/src/scripts/hasPermission.js b/magic-boot-ui/src/scripts/hasPermission.js deleted file mode 100644 index 1741a50..0000000 --- a/magic-boot-ui/src/scripts/hasPermission.js +++ /dev/null @@ -1,17 +0,0 @@ - -const hasPermission = { - install(app) { - app.directive('permission', { - mounted(el, binding) { - if (binding.value) { - const permissionList = app.config.globalProperties.$global.user.authorities - if (permissionList && permissionList.length && !permissionList.includes(binding.value) && import.meta.env.MODE != 'demo') { - el.remove() - } - } - } - }) - } -} - -export default hasPermission diff --git a/magic-boot-ui/src/scripts/magic-import.js b/magic-boot-ui/src/scripts/magic-import.js deleted file mode 100644 index bdcf166..0000000 --- a/magic-boot-ui/src/scripts/magic-import.js +++ /dev/null @@ -1,14 +0,0 @@ -import * as vue from "vue"; -import ElementPlus from "element-plus"; - -const libs = { - vue, - 'element-plus': ElementPlus -} - -window.___magic__import__ = function(lib, name){ - if(Object.prototype.toString.call(libs[lib]) != '[object Module]' && name == '*'){ - return libs[lib] - } - return (libs[lib] || {})[name] -} diff --git a/magic-boot-ui/src/scripts/request.js b/magic-boot-ui/src/scripts/request.js deleted file mode 100644 index 1eb181e..0000000 --- a/magic-boot-ui/src/scripts/request.js +++ /dev/null @@ -1,117 +0,0 @@ -import axios from 'axios' -import { ElMessage, ElMessageBox } from 'element-plus' -import { logout, login } from '@/scripts/auth' -import { getToken } from '@/scripts/auth' -import global from '@/scripts/global' - -// create an axios instance -const service = axios.create({ - baseURL: import.meta.env.VITE_APP_BASE_API, // url = base url + request url - // withCredentials: true, // send cookies when cross-domain requests - timeout: 1000 * 60 // request timeout -}) - -// request interceptor -service.interceptors.request.use( - config => { - // do something before request is sent - - if (getToken()) { - // let each request carry token - // ['X-Token'] is a custom headers key - // please modify it according to the actual situation - config.headers['token'] = getToken() - } - return config - }, - error => { - // do something with request error - console.log(error) // for debug - return Promise.reject(error) - } -) - -var currentMessage -// response interceptor -service.interceptors.response.use( - /** - * If you want to get http information such as headers or status - * Please return response => response - */ - - /** - * Determine the request status by custom code - * Here is just an example - * You can also judge the status by HTTP Status Code - */ - response => { - if (response.config.url.indexOf('user/info') !== -1 && response.data.code === 402) { - logout() - } - return new Promise((reslove, reject) => { - const res = response.data - if (res.code !== 200) { - var duration = 5 - if (res.code === 402) { - duration = 1 - if(global.user.info.username){ - ElMessageBox.prompt(`当前账号:${global.user.info.username}凭证已过期,请输入密码重新登录`, '提示', { - confirmButtonText: '确定', - cancelButtonText: '退出', - inputType: 'password', - closeOnClickModal: false, - beforeClose: (action, instance, done) => { - if (action === 'confirm') { - login({ - username: global.user.info.username, - password: instance.inputValue - }).then((res) => { - if (res) { - done() - service(response.config).then(ret => reslove(ret)) - } - }) - } else if (action === 'cancel') { - logout() - } else { - done() - } - } - }) - } - } - if (res.code !== 402) { - if(currentMessage){ - currentMessage.close() - } - if(res.code == 403 && import.meta.env.MODE == 'demo'){ - res.message = '演示模式,不允许操作!' - } - currentMessage = ElMessage({ - message: res.message || 'Error', - type: 'error', - duration: duration * 1000, - showClose: true - }) - reject(res) - } - } else { - reslove(res) - } - }) - }, - error => { - // console.log('err' + error) // for debug - if(currentMessage){ - currentMessage.close() - } - currentMessage = ElMessage({ - message: error.message, - type: 'error', - duration: 5 * 1000 - }) - return Promise.reject(error) - } -) - -export default service diff --git a/magic-boot-ui/src/scripts/router.js b/magic-boot-ui/src/scripts/router.js deleted file mode 100644 index 2379166..0000000 --- a/magic-boot-ui/src/scripts/router.js +++ /dev/null @@ -1,66 +0,0 @@ -import { createRouter, createWebHashHistory } from 'vue-router' - -import Layout from '@/layout/layout.vue' - -const routes = [ - { - path: '/redirect', - component: Layout, - hidden: true, - children: [ - { - path: '/redirect/:path(.*)', - component: () => import('@/views/redirect/index') - } - ] - }, - - { - path: '/', - component: Layout, - redirect: '/home', - children: [ - { - path: '/home', - component: () => import('@/views/home.vue'), - meta: { title: '首页' } - } - ] - }, - - { - path: '/user-center', - redirect: '/system/user/user-center', - component: Layout, - hidden: true, - children: [{ - path: '/system/user/user-center', - component: () => import('@/views/system/user/user-center'), - meta: { title: '个人中心' } - }] - }, - - { - path: '/login', - component: () => import('@/views/login.vue'), - hidden: true - }, - // { - // path: '/404', - // name: '404', - // component: () => import('@/views/404.vue'), - // hidden: true - // }, - // { - // path: '/:pathMatch(.*)*', - // redirect: '/404', - // hidden: true - // } -] - -const router = createRouter({ - history: createWebHashHistory(), - routes -}) - -export default router diff --git a/magic-boot-ui/src/scripts/routerPermission.js b/magic-boot-ui/src/scripts/routerPermission.js deleted file mode 100644 index bc6c0fd..0000000 --- a/magic-boot-ui/src/scripts/routerPermission.js +++ /dev/null @@ -1,111 +0,0 @@ -import request from '@/scripts/request' -import common from '@/scripts/common' -import { sha256 } from 'js-sha256' - -const viewModules = import.meta.glob("../views/**/**.vue") -const layoutModules = import.meta.glob("../layout/**.vue") - -export const filterAsyncRouter = (routers, level) => { - level = level || 0 - const accessedRouters = routers.filter(router => { - if (router.isShow === 1) { - var setIframe = () => { - router.component = loadView(`/common/iframe`) - router.props = { url: router.url } - router.path = "/" + sha256(router.url) - } - if(router.url && router.url.startsWith('http')){ - if(router.openMode == '0'){ - setIframe() - } - } else if(router.url && router.url.startsWith('/') && router.url.indexOf('.htm') != -1) { - if(router.openMode == '0'){ - setIframe() - }else{ - router.path = location.href.substring(0, location.href.indexOf('/', location.href.indexOf('/', location.href.indexOf('/') + 1) + 1)) + router.path - } - } else if (router.componentName) { - router.component = loadView(`/common/show-component`) - router.props = { name: router.componentName } - } else if (router.component) { - const component = router.component - if (component === 'Layout') { - router.path = "/" + common.uuid() - router.component = level > 0 ? layoutModules[`../layout/none.vue`] : loadLayoutView(component) - } else { - router.path = router.path.startsWith('/') ? router.path : '/' + router.path - router.component = loadView(component) || layoutModules[`../layout/empty.vue`] - } - } - if (router.children && router.children.length) { - router.children = filterAsyncRouter(router.children, level + 1) - } - return true - } - return false - }) - return accessedRouters -} - -export const loadLayoutView = () => { - return layoutModules[`../layout/layout.vue`] -} - -export const loadView = (view) => { - view = view.substring(0, 1) === '/' ? view : '/' + view - return viewModules[`../views${view}.vue`] -} - -function loadComponent(router){ - var result = { - path: router.path, - meta: { - title: router.name, - keepAlive: router.keepAlive - } - } - if(router.componentName){ - result.component = loadView(`/common/show-component`) - result.props = { name: router.componentName } - }else if(router.path){ - result.component = loadView(router.path) || layoutModules[`../layout/empty.vue`] - } - return result -} - -export function loadHiddenRouter(routers){ - return routers.filter(router => { - router.path = router.path.startsWith('/') ? router.path : '/' + router.path - router.redirect = router.path - router.component = loadLayoutView() - router.hidden = true - router.children = [loadComponent(router)] - return true - }) -} - -export function generateRoutes(){ - return new Promise((resolve, reject) => { - request({ - url: '/system/menu/current/menus', - method: 'post' - }).then(response => { - const { data } = response - const asyncRouter = filterAsyncRouter(data) - resolve(asyncRouter) - }) - }) -} - -export function generateHiddenRoutes(){ - return new Promise((resolve, reject) => { - request({ - url: '/system/menu/current/hidden/menus', - method: 'post' - }).then(response => { - const { data } = response - const asyncRouter = loadHiddenRouter(data) - resolve(asyncRouter) - }) - }) -} diff --git a/magic-boot-ui/src/scripts/scroll-to.js b/magic-boot-ui/src/scripts/scroll-to.js deleted file mode 100644 index c5d8e04..0000000 --- a/magic-boot-ui/src/scripts/scroll-to.js +++ /dev/null @@ -1,58 +0,0 @@ -Math.easeInOutQuad = function(t, b, c, d) { - t /= d / 2 - if (t < 1) { - return c / 2 * t * t + b - } - t-- - return -c / 2 * (t * (t - 2) - 1) + b -} - -// requestAnimationFrame for Smart Animating http://goo.gl/sx5sts -var requestAnimFrame = (function() { - return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || function(callback) { window.setTimeout(callback, 1000 / 60) } -})() - -/** - * Because it's so fucking difficult to detect the scrolling element, just move them all - * @param {number} amount - */ -function move(amount) { - document.documentElement.scrollTop = amount - document.body.parentNode.scrollTop = amount - document.body.scrollTop = amount -} - -function position() { - return document.documentElement.scrollTop || document.body.parentNode.scrollTop || document.body.scrollTop -} - -/** - * @param {number} to - * @param {number} duration - * @param {Function} callback - */ -export function scrollTo(to, duration, callback) { - const start = position() - const change = to - start - const increment = 20 - let currentTime = 0 - duration = (typeof (duration) === 'undefined') ? 500 : duration - var animateScroll = function() { - // increment the time - currentTime += increment - // find the value with the quadratic in-out easing function - var val = Math.easeInOutQuad(currentTime, start, change, duration) - // move the document.body - move(val) - // do the animation unless its over - if (currentTime < duration) { - requestAnimFrame(animateScroll) - } else { - if (callback && typeof (callback) === 'function') { - // the animation is done so lets callback - callback() - } - } - } - animateScroll() -} diff --git a/magic-boot-ui/src/scripts/svg-icons.js b/magic-boot-ui/src/scripts/svg-icons.js deleted file mode 100644 index 574702e..0000000 --- a/magic-boot-ui/src/scripts/svg-icons.js +++ /dev/null @@ -1,6 +0,0 @@ -const svgs = import.meta.glob('../icons/*.svg') -const svgNames = [] -for (const [key, value] of Object.entries(svgs)) { - svgNames.push(key.substring(key.lastIndexOf('/') + 1, key.lastIndexOf('.'))) -} -export default svgNames \ No newline at end of file diff --git a/magic-boot-ui/src/scripts/treeTable.js b/magic-boot-ui/src/scripts/treeTable.js deleted file mode 100644 index 28e451b..0000000 --- a/magic-boot-ui/src/scripts/treeTable.js +++ /dev/null @@ -1,102 +0,0 @@ -import common from "@/scripts/common"; - -const treeTable = {} - -treeTable.isChildren = (children, id) => { - var result = false - for(var i in children) { - var chi = children[i] - if(chi.id == id){ - result = true - } - if(chi.children && children.length > 0){ - if(treeTable.isChildren(chi.children, id)){ - result = true - } - } - } - return result -} - -treeTable.queryChildren = (children, id) => { - var result = [] - for(var i in children){ - var chi = children[i] - if(chi.id == id){ - if(chi.children && chi.children.length > 0){ - result = chi.children - } - }else{ - var qc = treeTable.queryChildren(chi.children, id) - if(qc.length > 0){ - result = qc - } - } - } - return result -} - -treeTable.genTree = (children) => { - var treeData = [] - for(var i in children){ - var chi = {} - chi.label = children[i].name - chi.value = children[i].id - if(children[i].children && children[i].children.length > 0){ - chi.children = treeTable.genTree(children[i].children) - } - treeData.push(chi) - } - return treeData -} - -treeTable.deleteEmptyChildren = (children) => { - for(var i in children){ - var chi = children[i] - if(chi.children && chi.children.length == 0){ - delete chi.children - }else{ - treeTable.deleteEmptyChildren(chi.children) - } - } -} - -treeTable.recursionSearch = (fields, data, text, html) => { - html = html != undefined ? html : true - var searchData = [] - for(var i in data){ - var treeNode = data[i] - var children = treeNode.children - if(children && children.length > 0){ - var childrenSearch = treeTable.recursionSearch(fields, children, text, html) - treeNode.children = childrenSearch && childrenSearch.length > 0 ? childrenSearch : treeNode.children - treeTable.treeNodeReplace(fields, searchData, treeNode, text, childrenSearch, html) - }else{ - treeTable.treeNodeReplace(fields, searchData, treeNode, text, null, html) - } - } - return searchData -} - -treeTable.treeNodeReplace = (fields, searchData, treeNode, text, childrenSearch, html) => { - var exist = false - fields.forEach((f) => { - if(treeNode[f] && treeNode[f].indexOf(text) != -1){ - if(html){ - treeNode[f] = treeNode[f].replace(text, `${text}`) - } - exist = true - } - }) - if(exist || (childrenSearch && childrenSearch.length > 0)){ - searchData.push(treeNode) - } -} - -treeTable.clearFont = (data, fields) => { - fields.forEach(field => { - data[field] = data[field].replace(/(.*?)<\/font>/g,'$1') - }) -} - -export default treeTable diff --git a/magic-boot-ui/src/scripts/validate.js b/magic-boot-ui/src/scripts/validate.js deleted file mode 100644 index 6b3ac41..0000000 --- a/magic-boot-ui/src/scripts/validate.js +++ /dev/null @@ -1,87 +0,0 @@ -/** - * Created by PanJiaChen on 16/11/18. - */ - -/** - * @param {string} path - * @returns {Boolean} - */ -export function isExternal(path) { - return /^(https?:|mailto:|tel:)/.test(path) -} - -/** - * @param {string} str - * @returns {Boolean} - */ -export function validUsername(str) { - const valid_map = ['admin', 'editor'] - return valid_map.indexOf(str.trim()) >= 0 -} - -/** - * @param {string} url - * @returns {Boolean} - */ -export function validURL(url) { - const reg = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/ - return reg.test(url) -} - -/** - * @param {string} str - * @returns {Boolean} - */ -export function validLowerCase(str) { - const reg = /^[a-z]+$/ - return reg.test(str) -} - -/** - * @param {string} str - * @returns {Boolean} - */ -export function validUpperCase(str) { - const reg = /^[A-Z]+$/ - return reg.test(str) -} - -/** - * @param {string} str - * @returns {Boolean} - */ -export function validAlphabets(str) { - const reg = /^[A-Za-z]+$/ - return reg.test(str) -} - -/** - * @param {string} email - * @returns {Boolean} - */ -export function validEmail(email) { - const reg = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/ - return reg.test(email) -} - -/** - * @param {string} str - * @returns {Boolean} - */ -export function isString(str) { - if (typeof str === 'string' || str instanceof String) { - return true - } - return false -} - -/** - * @param {Array} arg - * @returns {Boolean} - */ -export function isArray(arg) { - if (typeof Array.isArray === 'undefined') { - return Object.prototype.toString.call(arg) === '[object Array]' - } - return Array.isArray(arg) -} diff --git a/magic-boot-ui/src/views/404.vue b/magic-boot-ui/src/views/404.vue deleted file mode 100644 index cd90192..0000000 --- a/magic-boot-ui/src/views/404.vue +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/magic-boot-ui/src/views/common/iframe.vue b/magic-boot-ui/src/views/common/iframe.vue deleted file mode 100644 index 6ad513f..0000000 --- a/magic-boot-ui/src/views/common/iframe.vue +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - diff --git a/magic-boot-ui/src/views/common/show-component.vue b/magic-boot-ui/src/views/common/show-component.vue deleted file mode 100644 index fe54048..0000000 --- a/magic-boot-ui/src/views/common/show-component.vue +++ /dev/null @@ -1,12 +0,0 @@ - - - diff --git a/magic-boot-ui/src/views/examples/editor-table.vue b/magic-boot-ui/src/views/examples/editor-table.vue deleted file mode 100644 index dfcc05f..0000000 --- a/magic-boot-ui/src/views/examples/editor-table.vue +++ /dev/null @@ -1,177 +0,0 @@ - - - diff --git a/magic-boot-ui/src/views/examples/select-example.vue b/magic-boot-ui/src/views/examples/select-example.vue deleted file mode 100644 index 99cc7b1..0000000 --- a/magic-boot-ui/src/views/examples/select-example.vue +++ /dev/null @@ -1,24 +0,0 @@ - - - diff --git a/magic-boot-ui/src/views/examples/test-mb-form.vue b/magic-boot-ui/src/views/examples/test-mb-form.vue deleted file mode 100644 index c4d5258..0000000 --- a/magic-boot-ui/src/views/examples/test-mb-form.vue +++ /dev/null @@ -1,142 +0,0 @@ - - - diff --git a/magic-boot-ui/src/views/examples/test-mb-list.vue b/magic-boot-ui/src/views/examples/test-mb-list.vue deleted file mode 100644 index 4c347cd..0000000 --- a/magic-boot-ui/src/views/examples/test-mb-list.vue +++ /dev/null @@ -1,207 +0,0 @@ - - - diff --git a/magic-boot-ui/src/views/examples/three-linkage.vue b/magic-boot-ui/src/views/examples/three-linkage.vue deleted file mode 100644 index 46aa831..0000000 --- a/magic-boot-ui/src/views/examples/three-linkage.vue +++ /dev/null @@ -1,83 +0,0 @@ - - - - diff --git a/magic-boot-ui/src/views/examples/upload-file.vue b/magic-boot-ui/src/views/examples/upload-file.vue deleted file mode 100644 index 04ba4e9..0000000 --- a/magic-boot-ui/src/views/examples/upload-file.vue +++ /dev/null @@ -1,45 +0,0 @@ - - - diff --git a/magic-boot-ui/src/views/home.vue b/magic-boot-ui/src/views/home.vue deleted file mode 100644 index a0def82..0000000 --- a/magic-boot-ui/src/views/home.vue +++ /dev/null @@ -1,9 +0,0 @@ - - - - - diff --git a/magic-boot-ui/src/views/login.vue b/magic-boot-ui/src/views/login.vue deleted file mode 100644 index 90f8da3..0000000 --- a/magic-boot-ui/src/views/login.vue +++ /dev/null @@ -1,217 +0,0 @@ - - - - - diff --git a/magic-boot-ui/src/views/lowcode/code-gen-form.vue b/magic-boot-ui/src/views/lowcode/code-gen-form.vue deleted file mode 100644 index 1ab08fb..0000000 --- a/magic-boot-ui/src/views/lowcode/code-gen-form.vue +++ /dev/null @@ -1,416 +0,0 @@ - - - diff --git a/magic-boot-ui/src/views/lowcode/code-gen-list.vue b/magic-boot-ui/src/views/lowcode/code-gen-list.vue deleted file mode 100644 index ca5922e..0000000 --- a/magic-boot-ui/src/views/lowcode/code-gen-list.vue +++ /dev/null @@ -1,91 +0,0 @@ - - - diff --git a/magic-boot-ui/src/views/lowcode/magic-editor.vue b/magic-boot-ui/src/views/lowcode/magic-editor.vue deleted file mode 100644 index df96158..0000000 --- a/magic-boot-ui/src/views/lowcode/magic-editor.vue +++ /dev/null @@ -1,13 +0,0 @@ - - - diff --git a/magic-boot-ui/src/views/redirect/index.vue b/magic-boot-ui/src/views/redirect/index.vue deleted file mode 100644 index 32c057f..0000000 --- a/magic-boot-ui/src/views/redirect/index.vue +++ /dev/null @@ -1,10 +0,0 @@ - - diff --git a/magic-boot-ui/src/views/system/configure/configure-list.vue b/magic-boot-ui/src/views/system/configure/configure-list.vue deleted file mode 100644 index 8a73a67..0000000 --- a/magic-boot-ui/src/views/system/configure/configure-list.vue +++ /dev/null @@ -1,247 +0,0 @@ - - - diff --git a/magic-boot-ui/src/views/system/dict/dict-items.vue b/magic-boot-ui/src/views/system/dict/dict-items.vue deleted file mode 100644 index 870e54f..0000000 --- a/magic-boot-ui/src/views/system/dict/dict-items.vue +++ /dev/null @@ -1,235 +0,0 @@ - - - diff --git a/magic-boot-ui/src/views/system/dict/dict-list.vue b/magic-boot-ui/src/views/system/dict/dict-list.vue deleted file mode 100644 index 289a026..0000000 --- a/magic-boot-ui/src/views/system/dict/dict-list.vue +++ /dev/null @@ -1,216 +0,0 @@ - - - diff --git a/magic-boot-ui/src/views/system/menu/menu-form.vue b/magic-boot-ui/src/views/system/menu/menu-form.vue deleted file mode 100644 index f14d8eb..0000000 --- a/magic-boot-ui/src/views/system/menu/menu-form.vue +++ /dev/null @@ -1,274 +0,0 @@ - - - - - diff --git a/magic-boot-ui/src/views/system/menu/menu-icons.vue b/magic-boot-ui/src/views/system/menu/menu-icons.vue deleted file mode 100644 index 2575af7..0000000 --- a/magic-boot-ui/src/views/system/menu/menu-icons.vue +++ /dev/null @@ -1,63 +0,0 @@ - - - - - diff --git a/magic-boot-ui/src/views/system/menu/menu-list.vue b/magic-boot-ui/src/views/system/menu/menu-list.vue deleted file mode 100644 index 715ec70..0000000 --- a/magic-boot-ui/src/views/system/menu/menu-list.vue +++ /dev/null @@ -1,258 +0,0 @@ - - - diff --git a/magic-boot-ui/src/views/system/monitor/druid.vue b/magic-boot-ui/src/views/system/monitor/druid.vue deleted file mode 100644 index 8b6084b..0000000 --- a/magic-boot-ui/src/views/system/monitor/druid.vue +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/magic-boot-ui/src/views/system/monitor/login-log.vue b/magic-boot-ui/src/views/system/monitor/login-log.vue deleted file mode 100644 index 7af08f3..0000000 --- a/magic-boot-ui/src/views/system/monitor/login-log.vue +++ /dev/null @@ -1,69 +0,0 @@ - - - diff --git a/magic-boot-ui/src/views/system/monitor/online-user.vue b/magic-boot-ui/src/views/system/monitor/online-user.vue deleted file mode 100644 index c7a651a..0000000 --- a/magic-boot-ui/src/views/system/monitor/online-user.vue +++ /dev/null @@ -1,117 +0,0 @@ - - - diff --git a/magic-boot-ui/src/views/system/monitor/oper-log.vue b/magic-boot-ui/src/views/system/monitor/oper-log.vue deleted file mode 100644 index 418deb0..0000000 --- a/magic-boot-ui/src/views/system/monitor/oper-log.vue +++ /dev/null @@ -1,90 +0,0 @@ - - - diff --git a/magic-boot-ui/src/views/system/office/office-list.vue b/magic-boot-ui/src/views/system/office/office-list.vue deleted file mode 100644 index b419e13..0000000 --- a/magic-boot-ui/src/views/system/office/office-list.vue +++ /dev/null @@ -1,347 +0,0 @@ - - - - - diff --git a/magic-boot-ui/src/views/system/role/role-assign-permissions.vue b/magic-boot-ui/src/views/system/role/role-assign-permissions.vue deleted file mode 100644 index a00152a..0000000 --- a/magic-boot-ui/src/views/system/role/role-assign-permissions.vue +++ /dev/null @@ -1,41 +0,0 @@ - - - diff --git a/magic-boot-ui/src/views/system/role/role-list.vue b/magic-boot-ui/src/views/system/role/role-list.vue deleted file mode 100644 index 6751f90..0000000 --- a/magic-boot-ui/src/views/system/role/role-list.vue +++ /dev/null @@ -1,255 +0,0 @@ - - - diff --git a/magic-boot-ui/src/views/system/test/test-list.vue b/magic-boot-ui/src/views/system/test/test-list.vue deleted file mode 100644 index 9299a8f..0000000 --- a/magic-boot-ui/src/views/system/test/test-list.vue +++ /dev/null @@ -1,98 +0,0 @@ - - - diff --git a/magic-boot-ui/src/views/system/user/user-center.vue b/magic-boot-ui/src/views/system/user/user-center.vue deleted file mode 100644 index ff69536..0000000 --- a/magic-boot-ui/src/views/system/user/user-center.vue +++ /dev/null @@ -1,93 +0,0 @@ - - - diff --git a/magic-boot-ui/src/views/system/user/user-form.vue b/magic-boot-ui/src/views/system/user/user-form.vue deleted file mode 100644 index fb63bcd..0000000 --- a/magic-boot-ui/src/views/system/user/user-form.vue +++ /dev/null @@ -1,126 +0,0 @@ - - - diff --git a/magic-boot-ui/src/views/system/user/user-list.vue b/magic-boot-ui/src/views/system/user/user-list.vue deleted file mode 100644 index ce01b09..0000000 --- a/magic-boot-ui/src/views/system/user/user-list.vue +++ /dev/null @@ -1,262 +0,0 @@ - - - - - diff --git a/magic-boot-ui/vite.config.js b/magic-boot-ui/vite.config.js deleted file mode 100644 index a4ea1e2..0000000 --- a/magic-boot-ui/vite.config.js +++ /dev/null @@ -1,38 +0,0 @@ -import { defineConfig } from 'vite' -import vue from '@vitejs/plugin-vue' -import path from 'path' -import viteSvgIcons from 'vite-plugin-svg-icons' - -// https://vitejs.dev/config/ -export default defineConfig({ - base: './', - plugins: [ - vue(), - viteSvgIcons({ - iconDirs: [path.resolve(process.cwd(), 'src/icons')], - symbolId: 'mb-icon-[name]' - }) - ], - resolve: { - extensions: ['.vue', '.json', '.js'], - alias: { - '@': path.resolve(__dirname,'src') - } - }, - css: {//去除@charset UTF-8规则影响 - postcss: { - plugins: [ - { - postcssPlugin: 'internal:charset-removal', - AtRule: { - charset: (atRule) => { - if (atRule.name === 'charset') { - atRule.remove(); - } - } - } - } - ] - } - } -})