From 52d90d7aeae25f5f5b5a0b6ad03878c437450408 Mon Sep 17 00:00:00 2001 From: gtz217 <535262213@qq.com> Date: Mon, 27 Sep 2021 10:01:12 +0800 Subject: [PATCH] init --- .editorconfig | 14 + .env.development | 5 + .env.production | 6 + .env.staging | 8 + .eslintignore | 4 + .eslintrc.js | 198 ++ .github/FUNDING.yml | 4 + .github/ISSUE_TEMPLATE/bug_report.md | 33 + .github/ISSUE_TEMPLATE/feature_request.md | 7 + .github/ISSUE_TEMPLATE/question.md | 35 + .gitignore | 23 + .travis.yml | 5 + LICENSE | 21 + README.es.md | 228 +++ README.ja.md | 224 +++ README.md | 250 +++ README.zh-CN.md | 273 +++ babel.config.js | 14 + build/index.js | 35 + jest.config.js | 24 + jsconfig.json | 9 + mock/article.js | 116 ++ mock/index.js | 60 + mock/mock-server.js | 81 + mock/remote-search.js | 51 + mock/role/index.js | 98 + mock/role/routes.js | 530 +++++ mock/user.js | 84 + mock/utils.js | 48 + package.json | 111 + plop-templates/component/index.hbs | 26 + plop-templates/component/prompt.js | 55 + plop-templates/store/index.hbs | 16 + plop-templates/store/prompt.js | 62 + plop-templates/utils.js | 2 + plop-templates/view/index.hbs | 26 + plop-templates/view/prompt.js | 55 + plopfile.js | 9 + postcss.config.js | 5 + public/favicon.ico | Bin 0 -> 67646 bytes public/index.html | 15 + src/App.vue | 11 + src/api/article.js | 41 + src/api/qiniu.js | 8 + src/api/remote-search.js | 17 + src/api/role.js | 38 + src/api/user.js | 24 + src/assets/401_images/401.gif | Bin 0 -> 164227 bytes src/assets/404_images/404.png | Bin 0 -> 98071 bytes src/assets/404_images/404_cloud.png | Bin 0 -> 4766 bytes .../custom-theme/fonts/element-icons.ttf | Bin 0 -> 11028 bytes .../custom-theme/fonts/element-icons.woff | Bin 0 -> 6124 bytes src/assets/custom-theme/index.css | 1 + src/components/BackToTop/index.vue | 111 + src/components/Breadcrumb/index.vue | 82 + src/components/Charts/Keyboard.vue | 155 ++ src/components/Charts/LineMarker.vue | 227 +++ src/components/Charts/MixChart.vue | 271 +++ src/components/Charts/mixins/resize.js | 56 + src/components/DndList/index.vue | 166 ++ src/components/DragSelect/index.vue | 65 + src/components/Dropzone/index.vue | 297 +++ src/components/ErrorLog/index.vue | 78 + src/components/GithubCorner/index.vue | 54 + src/components/Hamburger/index.vue | 44 + src/components/HeaderSearch/index.vue | 180 ++ src/components/ImageCropper/index.vue | 1779 +++++++++++++++++ .../ImageCropper/utils/data2blob.js | 19 + .../ImageCropper/utils/effectRipple.js | 39 + src/components/ImageCropper/utils/language.js | 232 +++ src/components/ImageCropper/utils/mimes.js | 7 + src/components/JsonEditor/index.vue | 77 + src/components/Kanban/index.vue | 99 + src/components/MDinput/index.vue | 360 ++++ .../MarkdownEditor/default-options.js | 31 + src/components/MarkdownEditor/index.vue | 118 ++ src/components/Pagination/index.vue | 101 + src/components/PanThumb/index.vue | 142 ++ src/components/RightPanel/index.vue | 145 ++ src/components/Screenfull/index.vue | 60 + src/components/Share/DropdownMenu.vue | 103 + src/components/SizeSelect/index.vue | 57 + src/components/Sticky/index.vue | 91 + src/components/SvgIcon/index.vue | 62 + src/components/TextHoverEffect/Mallki.vue | 113 ++ src/components/ThemePicker/index.vue | 175 ++ .../Tinymce/components/EditorImage.vue | 111 + src/components/Tinymce/dynamicLoadScript.js | 59 + src/components/Tinymce/index.vue | 247 +++ src/components/Tinymce/plugins.js | 7 + src/components/Tinymce/toolbar.js | 6 + src/components/Upload/SingleImage.vue | 134 ++ src/components/Upload/SingleImage2.vue | 130 ++ src/components/Upload/SingleImage3.vue | 157 ++ src/components/UploadExcel/index.vue | 138 ++ src/directive/clipboard/clipboard.js | 49 + src/directive/clipboard/index.js | 13 + src/directive/el-drag-dialog/drag.js | 77 + src/directive/el-drag-dialog/index.js | 13 + src/directive/el-table/adaptive.js | 41 + src/directive/el-table/index.js | 13 + src/directive/permission/index.js | 13 + src/directive/permission/permission.js | 31 + src/directive/sticky.js | 91 + src/directive/waves/index.js | 13 + src/directive/waves/waves.css | 26 + src/directive/waves/waves.js | 72 + src/filters/index.js | 68 + src/icons/index.js | 9 + src/icons/svg/404.svg | 1 + src/icons/svg/bug.svg | 1 + src/icons/svg/chart.svg | 1 + src/icons/svg/clipboard.svg | 1 + src/icons/svg/component.svg | 1 + src/icons/svg/dashboard.svg | 1 + src/icons/svg/documentation.svg | 1 + src/icons/svg/drag.svg | 1 + src/icons/svg/edit.svg | 1 + src/icons/svg/education.svg | 1 + src/icons/svg/email.svg | 1 + src/icons/svg/example.svg | 1 + src/icons/svg/excel.svg | 1 + src/icons/svg/exit-fullscreen.svg | 1 + src/icons/svg/eye-open.svg | 1 + src/icons/svg/eye.svg | 1 + src/icons/svg/form.svg | 1 + src/icons/svg/fullscreen.svg | 1 + src/icons/svg/guide.svg | 1 + src/icons/svg/icon.svg | 1 + src/icons/svg/international.svg | 1 + src/icons/svg/language.svg | 1 + src/icons/svg/link.svg | 1 + src/icons/svg/list.svg | 1 + src/icons/svg/lock.svg | 1 + src/icons/svg/message.svg | 1 + src/icons/svg/money.svg | 1 + src/icons/svg/nested.svg | 1 + src/icons/svg/password.svg | 1 + src/icons/svg/pdf.svg | 1 + src/icons/svg/people.svg | 1 + src/icons/svg/peoples.svg | 1 + src/icons/svg/qq.svg | 1 + src/icons/svg/search.svg | 1 + src/icons/svg/shopping.svg | 1 + src/icons/svg/size.svg | 1 + src/icons/svg/skill.svg | 1 + src/icons/svg/star.svg | 1 + src/icons/svg/tab.svg | 1 + src/icons/svg/table.svg | 1 + src/icons/svg/theme.svg | 1 + src/icons/svg/tree-table.svg | 1 + src/icons/svg/tree.svg | 1 + src/icons/svg/user.svg | 1 + src/icons/svg/wechat.svg | 1 + src/icons/svg/zip.svg | 1 + src/icons/svgo.yml | 22 + src/layout/components/AppMain.vue | 57 + src/layout/components/Navbar.vue | 167 ++ src/layout/components/Settings/index.vue | 108 + src/layout/components/Sidebar/FixiOSBug.js | 26 + src/layout/components/Sidebar/Item.vue | 41 + src/layout/components/Sidebar/Link.vue | 43 + src/layout/components/Sidebar/Logo.vue | 82 + src/layout/components/Sidebar/SidebarItem.vue | 95 + src/layout/components/Sidebar/index.vue | 54 + src/layout/components/TagsView/ScrollPane.vue | 94 + src/layout/components/TagsView/index.vue | 292 +++ src/layout/components/index.js | 5 + src/layout/index.vue | 102 + src/layout/mixin/ResizeHandler.js | 45 + src/main.js | 53 + src/permission.js | 74 + src/router/index.js | 404 ++++ src/router/modules/charts.js | 36 + src/router/modules/components.js | 102 + src/router/modules/nested.js | 66 + src/router/modules/table.js | 41 + src/settings.js | 35 + src/store/getters.js | 15 + src/store/index.js | 25 + src/store/modules/app.js | 56 + src/store/modules/errorLog.js | 28 + src/store/modules/permission.js | 69 + src/store/modules/settings.js | 35 + src/store/modules/tagsView.js | 160 ++ src/store/modules/user.js | 131 ++ src/styles/btn.scss | 99 + src/styles/element-ui.scss | 84 + src/styles/element-variables.scss | 31 + src/styles/index.scss | 191 ++ src/styles/mixin.scss | 66 + src/styles/sidebar.scss | 226 +++ src/styles/transition.scss | 48 + src/styles/variables.scss | 35 + src/utils/auth.js | 15 + src/utils/clipboard.js | 32 + src/utils/error-log.js | 35 + src/utils/get-page-title.js | 10 + src/utils/index.js | 357 ++++ src/utils/open-window.js | 25 + src/utils/permission.js | 21 + src/utils/request.js | 85 + src/utils/scroll-to.js | 58 + src/utils/validate.js | 87 + src/vendor/Export2Excel.js | 220 ++ src/vendor/Export2Zip.js | 24 + src/views/charts/keyboard.vue | 23 + src/views/charts/line.vue | 23 + src/views/charts/mix-chart.vue | 23 + src/views/clipboard/index.vue | 49 + src/views/components-demo/avatar-upload.vue | 61 + src/views/components-demo/back-to-top.vue | 154 ++ src/views/components-demo/count-to.vue | 218 ++ src/views/components-demo/dnd-list.vue | 39 + src/views/components-demo/drag-dialog.vue | 61 + src/views/components-demo/drag-kanban.vue | 66 + src/views/components-demo/drag-select.vue | 43 + src/views/components-demo/dropzone.vue | 31 + src/views/components-demo/json-editor.vue | 36 + src/views/components-demo/markdown.vue | 101 + src/views/components-demo/mixin.vue | 169 ++ src/views/components-demo/split-pane.vue | 67 + src/views/components-demo/sticky.vue | 135 ++ src/views/components-demo/tinymce.vue | 36 + .../dashboard/admin/components/BarChart.vue | 102 + .../dashboard/admin/components/BoxCard.vue | 118 ++ .../dashboard/admin/components/LineChart.vue | 135 ++ .../dashboard/admin/components/PanelGroup.vue | 181 ++ .../dashboard/admin/components/PieChart.vue | 79 + .../admin/components/RaddarChart.vue | 116 ++ .../admin/components/TodoList/Todo.vue | 81 + .../admin/components/TodoList/index.scss | 320 +++ .../admin/components/TodoList/index.vue | 127 ++ .../admin/components/TransactionTable.vue | 55 + .../admin/components/mixins/resize.js | 55 + src/views/dashboard/admin/index.vue | 124 ++ src/views/dashboard/editor/index.vue | 74 + src/views/dashboard/index.vue | 31 + src/views/documentation/index.vue | 57 + src/views/error-log/components/ErrorTestA.vue | 13 + src/views/error-log/components/ErrorTestB.vue | 11 + src/views/error-log/index.vue | 32 + src/views/error-page/401.vue | 99 + src/views/error-page/404.vue | 228 +++ .../example/components/ArticleDetail.vue | 289 +++ .../example/components/Dropdown/Comment.vue | 41 + .../example/components/Dropdown/Platform.vue | 46 + .../example/components/Dropdown/SourceUrl.vue | 38 + .../example/components/Dropdown/index.js | 3 + src/views/example/components/Warning.vue | 13 + src/views/example/create.vue | 13 + src/views/example/edit.vue | 13 + src/views/example/list.vue | 112 ++ .../excel/components/AutoWidthOption.vue | 34 + src/views/excel/components/BookTypeOption.vue | 39 + src/views/excel/components/FilenameOption.vue | 27 + src/views/excel/export-excel.vue | 116 ++ src/views/excel/merge-header.vue | 101 + src/views/excel/select-excel.vue | 107 + src/views/excel/upload-excel.vue | 42 + src/views/guide/index.vue | 36 + src/views/guide/steps.js | 53 + src/views/icons/element-icons.js | 3 + src/views/icons/index.vue | 101 + src/views/icons/svg-icons.js | 10 + src/views/login/auth-redirect.vue | 15 + src/views/login/components/SocialSignin.vue | 72 + src/views/login/index.vue | 324 +++ src/views/nested/menu1/index.vue | 7 + src/views/nested/menu1/menu1-1/index.vue | 7 + src/views/nested/menu1/menu1-2/index.vue | 7 + .../nested/menu1/menu1-2/menu1-2-1/index.vue | 5 + .../nested/menu1/menu1-2/menu1-2-2/index.vue | 5 + src/views/nested/menu1/menu1-3/index.vue | 5 + src/views/nested/menu2/index.vue | 5 + src/views/pdf/content.js | 58 + src/views/pdf/download.vue | 201 ++ src/views/pdf/index.vue | 13 + .../permission/components/SwitchRoles.vue | 32 + src/views/permission/directive.vue | 111 + src/views/permission/page.vue | 19 + src/views/permission/role.vue | 270 +++ src/views/profile/components/Account.vue | 38 + src/views/profile/components/Activity.vue | 185 ++ src/views/profile/components/Timeline.vue | 43 + src/views/profile/components/UserCard.vue | 134 ++ src/views/profile/index.vue | 68 + src/views/qiniu/upload.vue | 41 + src/views/redirect/index.vue | 12 + src/views/tab/components/TabPane.vue | 103 + src/views/tab/index.vue | 57 + src/views/table/complex-table.vue | 379 ++++ src/views/table/drag-table.vue | 153 ++ .../dynamic-table/components/FixedThead.vue | 62 + .../dynamic-table/components/UnfixedThead.vue | 50 + src/views/table/dynamic-table/index.vue | 24 + src/views/table/inline-edit-table.vue | 149 ++ src/views/theme/index.vue | 120 ++ src/views/zip/index.vue | 77 + tests/unit/.eslintrc.js | 5 + tests/unit/components/Hamburger.spec.js | 18 + tests/unit/components/SvgIcon.spec.js | 22 + tests/unit/utils/formatTime.spec.js | 29 + tests/unit/utils/param2Obj.spec.js | 14 + tests/unit/utils/parseTime.spec.js | 37 + tests/unit/utils/validate.spec.js | 28 + vue.config.js | 124 ++ 307 files changed, 22220 insertions(+) create mode 100644 .editorconfig create mode 100644 .env.development create mode 100644 .env.production create mode 100644 .env.staging create mode 100644 .eslintignore create mode 100644 .eslintrc.js create mode 100644 .github/FUNDING.yml create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/ISSUE_TEMPLATE/question.md create mode 100644 .gitignore create mode 100644 .travis.yml create mode 100644 LICENSE create mode 100644 README.es.md create mode 100644 README.ja.md create mode 100644 README.md create mode 100644 README.zh-CN.md create mode 100644 babel.config.js create mode 100644 build/index.js create mode 100644 jest.config.js create mode 100644 jsconfig.json create mode 100644 mock/article.js create mode 100644 mock/index.js create mode 100644 mock/mock-server.js create mode 100644 mock/remote-search.js create mode 100644 mock/role/index.js create mode 100644 mock/role/routes.js create mode 100644 mock/user.js create mode 100644 mock/utils.js create mode 100644 package.json create mode 100644 plop-templates/component/index.hbs create mode 100644 plop-templates/component/prompt.js create mode 100644 plop-templates/store/index.hbs create mode 100644 plop-templates/store/prompt.js create mode 100644 plop-templates/utils.js create mode 100644 plop-templates/view/index.hbs create mode 100644 plop-templates/view/prompt.js create mode 100644 plopfile.js create mode 100644 postcss.config.js create mode 100644 public/favicon.ico create mode 100644 public/index.html create mode 100644 src/App.vue create mode 100644 src/api/article.js create mode 100644 src/api/qiniu.js create mode 100644 src/api/remote-search.js create mode 100644 src/api/role.js create mode 100644 src/api/user.js create mode 100644 src/assets/401_images/401.gif create mode 100644 src/assets/404_images/404.png create mode 100644 src/assets/404_images/404_cloud.png create mode 100644 src/assets/custom-theme/fonts/element-icons.ttf create mode 100644 src/assets/custom-theme/fonts/element-icons.woff create mode 100644 src/assets/custom-theme/index.css create mode 100644 src/components/BackToTop/index.vue create mode 100644 src/components/Breadcrumb/index.vue create mode 100644 src/components/Charts/Keyboard.vue create mode 100644 src/components/Charts/LineMarker.vue create mode 100644 src/components/Charts/MixChart.vue create mode 100644 src/components/Charts/mixins/resize.js create mode 100644 src/components/DndList/index.vue create mode 100644 src/components/DragSelect/index.vue create mode 100644 src/components/Dropzone/index.vue create mode 100644 src/components/ErrorLog/index.vue create mode 100644 src/components/GithubCorner/index.vue create mode 100644 src/components/Hamburger/index.vue create mode 100644 src/components/HeaderSearch/index.vue create mode 100644 src/components/ImageCropper/index.vue create mode 100644 src/components/ImageCropper/utils/data2blob.js create mode 100644 src/components/ImageCropper/utils/effectRipple.js create mode 100644 src/components/ImageCropper/utils/language.js create mode 100644 src/components/ImageCropper/utils/mimes.js create mode 100644 src/components/JsonEditor/index.vue create mode 100644 src/components/Kanban/index.vue create mode 100644 src/components/MDinput/index.vue create mode 100644 src/components/MarkdownEditor/default-options.js create mode 100644 src/components/MarkdownEditor/index.vue create mode 100644 src/components/Pagination/index.vue create mode 100644 src/components/PanThumb/index.vue create mode 100644 src/components/RightPanel/index.vue create mode 100644 src/components/Screenfull/index.vue create mode 100644 src/components/Share/DropdownMenu.vue create mode 100644 src/components/SizeSelect/index.vue create mode 100644 src/components/Sticky/index.vue create mode 100644 src/components/SvgIcon/index.vue create mode 100644 src/components/TextHoverEffect/Mallki.vue create mode 100644 src/components/ThemePicker/index.vue create mode 100644 src/components/Tinymce/components/EditorImage.vue create mode 100644 src/components/Tinymce/dynamicLoadScript.js create mode 100644 src/components/Tinymce/index.vue create mode 100644 src/components/Tinymce/plugins.js create mode 100644 src/components/Tinymce/toolbar.js create mode 100644 src/components/Upload/SingleImage.vue create mode 100644 src/components/Upload/SingleImage2.vue create mode 100644 src/components/Upload/SingleImage3.vue create mode 100644 src/components/UploadExcel/index.vue create mode 100644 src/directive/clipboard/clipboard.js create mode 100644 src/directive/clipboard/index.js create mode 100644 src/directive/el-drag-dialog/drag.js create mode 100644 src/directive/el-drag-dialog/index.js create mode 100644 src/directive/el-table/adaptive.js create mode 100644 src/directive/el-table/index.js create mode 100644 src/directive/permission/index.js create mode 100644 src/directive/permission/permission.js create mode 100644 src/directive/sticky.js create mode 100644 src/directive/waves/index.js create mode 100644 src/directive/waves/waves.css create mode 100644 src/directive/waves/waves.js create mode 100644 src/filters/index.js create mode 100644 src/icons/index.js create mode 100644 src/icons/svg/404.svg create mode 100644 src/icons/svg/bug.svg create mode 100644 src/icons/svg/chart.svg create mode 100644 src/icons/svg/clipboard.svg create mode 100644 src/icons/svg/component.svg create mode 100644 src/icons/svg/dashboard.svg create mode 100644 src/icons/svg/documentation.svg create mode 100644 src/icons/svg/drag.svg create mode 100644 src/icons/svg/edit.svg create mode 100644 src/icons/svg/education.svg create mode 100644 src/icons/svg/email.svg create mode 100644 src/icons/svg/example.svg create mode 100644 src/icons/svg/excel.svg create mode 100644 src/icons/svg/exit-fullscreen.svg create mode 100644 src/icons/svg/eye-open.svg create mode 100644 src/icons/svg/eye.svg create mode 100644 src/icons/svg/form.svg create mode 100644 src/icons/svg/fullscreen.svg create mode 100644 src/icons/svg/guide.svg create mode 100644 src/icons/svg/icon.svg create mode 100644 src/icons/svg/international.svg create mode 100644 src/icons/svg/language.svg create mode 100644 src/icons/svg/link.svg create mode 100644 src/icons/svg/list.svg create mode 100644 src/icons/svg/lock.svg create mode 100644 src/icons/svg/message.svg create mode 100644 src/icons/svg/money.svg create mode 100644 src/icons/svg/nested.svg create mode 100644 src/icons/svg/password.svg create mode 100644 src/icons/svg/pdf.svg create mode 100644 src/icons/svg/people.svg create mode 100644 src/icons/svg/peoples.svg create mode 100644 src/icons/svg/qq.svg create mode 100644 src/icons/svg/search.svg create mode 100644 src/icons/svg/shopping.svg create mode 100644 src/icons/svg/size.svg create mode 100644 src/icons/svg/skill.svg create mode 100644 src/icons/svg/star.svg create mode 100644 src/icons/svg/tab.svg create mode 100644 src/icons/svg/table.svg create mode 100644 src/icons/svg/theme.svg create mode 100644 src/icons/svg/tree-table.svg create mode 100644 src/icons/svg/tree.svg create mode 100644 src/icons/svg/user.svg create mode 100644 src/icons/svg/wechat.svg create mode 100644 src/icons/svg/zip.svg create mode 100644 src/icons/svgo.yml create mode 100644 src/layout/components/AppMain.vue create mode 100644 src/layout/components/Navbar.vue create mode 100644 src/layout/components/Settings/index.vue create mode 100644 src/layout/components/Sidebar/FixiOSBug.js create mode 100644 src/layout/components/Sidebar/Item.vue create mode 100644 src/layout/components/Sidebar/Link.vue create mode 100644 src/layout/components/Sidebar/Logo.vue create mode 100644 src/layout/components/Sidebar/SidebarItem.vue create mode 100644 src/layout/components/Sidebar/index.vue create mode 100644 src/layout/components/TagsView/ScrollPane.vue create mode 100644 src/layout/components/TagsView/index.vue create mode 100644 src/layout/components/index.js create mode 100644 src/layout/index.vue create mode 100644 src/layout/mixin/ResizeHandler.js create mode 100644 src/main.js create mode 100644 src/permission.js create mode 100644 src/router/index.js create mode 100644 src/router/modules/charts.js create mode 100644 src/router/modules/components.js create mode 100644 src/router/modules/nested.js create mode 100644 src/router/modules/table.js create mode 100644 src/settings.js create mode 100644 src/store/getters.js create mode 100644 src/store/index.js create mode 100644 src/store/modules/app.js create mode 100644 src/store/modules/errorLog.js create mode 100644 src/store/modules/permission.js create mode 100644 src/store/modules/settings.js create mode 100644 src/store/modules/tagsView.js create mode 100644 src/store/modules/user.js create mode 100644 src/styles/btn.scss create mode 100644 src/styles/element-ui.scss create mode 100644 src/styles/element-variables.scss create mode 100644 src/styles/index.scss create mode 100644 src/styles/mixin.scss create mode 100644 src/styles/sidebar.scss create mode 100644 src/styles/transition.scss create mode 100644 src/styles/variables.scss create mode 100644 src/utils/auth.js create mode 100644 src/utils/clipboard.js create mode 100644 src/utils/error-log.js create mode 100644 src/utils/get-page-title.js create mode 100644 src/utils/index.js create mode 100644 src/utils/open-window.js create mode 100644 src/utils/permission.js create mode 100644 src/utils/request.js create mode 100644 src/utils/scroll-to.js create mode 100644 src/utils/validate.js create mode 100644 src/vendor/Export2Excel.js create mode 100644 src/vendor/Export2Zip.js create mode 100644 src/views/charts/keyboard.vue create mode 100644 src/views/charts/line.vue create mode 100644 src/views/charts/mix-chart.vue create mode 100644 src/views/clipboard/index.vue create mode 100644 src/views/components-demo/avatar-upload.vue create mode 100644 src/views/components-demo/back-to-top.vue create mode 100644 src/views/components-demo/count-to.vue create mode 100644 src/views/components-demo/dnd-list.vue create mode 100644 src/views/components-demo/drag-dialog.vue create mode 100644 src/views/components-demo/drag-kanban.vue create mode 100644 src/views/components-demo/drag-select.vue create mode 100644 src/views/components-demo/dropzone.vue create mode 100644 src/views/components-demo/json-editor.vue create mode 100644 src/views/components-demo/markdown.vue create mode 100644 src/views/components-demo/mixin.vue create mode 100644 src/views/components-demo/split-pane.vue create mode 100644 src/views/components-demo/sticky.vue create mode 100644 src/views/components-demo/tinymce.vue create mode 100644 src/views/dashboard/admin/components/BarChart.vue create mode 100644 src/views/dashboard/admin/components/BoxCard.vue create mode 100644 src/views/dashboard/admin/components/LineChart.vue create mode 100644 src/views/dashboard/admin/components/PanelGroup.vue create mode 100644 src/views/dashboard/admin/components/PieChart.vue create mode 100644 src/views/dashboard/admin/components/RaddarChart.vue create mode 100644 src/views/dashboard/admin/components/TodoList/Todo.vue create mode 100644 src/views/dashboard/admin/components/TodoList/index.scss create mode 100644 src/views/dashboard/admin/components/TodoList/index.vue create mode 100644 src/views/dashboard/admin/components/TransactionTable.vue create mode 100644 src/views/dashboard/admin/components/mixins/resize.js create mode 100644 src/views/dashboard/admin/index.vue create mode 100644 src/views/dashboard/editor/index.vue create mode 100644 src/views/dashboard/index.vue create mode 100644 src/views/documentation/index.vue create mode 100644 src/views/error-log/components/ErrorTestA.vue create mode 100644 src/views/error-log/components/ErrorTestB.vue create mode 100644 src/views/error-log/index.vue create mode 100644 src/views/error-page/401.vue create mode 100644 src/views/error-page/404.vue create mode 100644 src/views/example/components/ArticleDetail.vue create mode 100644 src/views/example/components/Dropdown/Comment.vue create mode 100644 src/views/example/components/Dropdown/Platform.vue create mode 100644 src/views/example/components/Dropdown/SourceUrl.vue create mode 100644 src/views/example/components/Dropdown/index.js create mode 100644 src/views/example/components/Warning.vue create mode 100644 src/views/example/create.vue create mode 100644 src/views/example/edit.vue create mode 100644 src/views/example/list.vue create mode 100644 src/views/excel/components/AutoWidthOption.vue create mode 100644 src/views/excel/components/BookTypeOption.vue create mode 100644 src/views/excel/components/FilenameOption.vue create mode 100644 src/views/excel/export-excel.vue create mode 100644 src/views/excel/merge-header.vue create mode 100644 src/views/excel/select-excel.vue create mode 100644 src/views/excel/upload-excel.vue create mode 100644 src/views/guide/index.vue create mode 100644 src/views/guide/steps.js create mode 100644 src/views/icons/element-icons.js create mode 100644 src/views/icons/index.vue create mode 100644 src/views/icons/svg-icons.js create mode 100644 src/views/login/auth-redirect.vue create mode 100644 src/views/login/components/SocialSignin.vue create mode 100644 src/views/login/index.vue create mode 100644 src/views/nested/menu1/index.vue create mode 100644 src/views/nested/menu1/menu1-1/index.vue create mode 100644 src/views/nested/menu1/menu1-2/index.vue create mode 100644 src/views/nested/menu1/menu1-2/menu1-2-1/index.vue create mode 100644 src/views/nested/menu1/menu1-2/menu1-2-2/index.vue create mode 100644 src/views/nested/menu1/menu1-3/index.vue create mode 100644 src/views/nested/menu2/index.vue create mode 100644 src/views/pdf/content.js create mode 100644 src/views/pdf/download.vue create mode 100644 src/views/pdf/index.vue create mode 100644 src/views/permission/components/SwitchRoles.vue create mode 100644 src/views/permission/directive.vue create mode 100644 src/views/permission/page.vue create mode 100644 src/views/permission/role.vue create mode 100644 src/views/profile/components/Account.vue create mode 100644 src/views/profile/components/Activity.vue create mode 100644 src/views/profile/components/Timeline.vue create mode 100644 src/views/profile/components/UserCard.vue create mode 100644 src/views/profile/index.vue create mode 100644 src/views/qiniu/upload.vue create mode 100644 src/views/redirect/index.vue create mode 100644 src/views/tab/components/TabPane.vue create mode 100644 src/views/tab/index.vue create mode 100644 src/views/table/complex-table.vue create mode 100644 src/views/table/drag-table.vue create mode 100644 src/views/table/dynamic-table/components/FixedThead.vue create mode 100644 src/views/table/dynamic-table/components/UnfixedThead.vue create mode 100644 src/views/table/dynamic-table/index.vue create mode 100644 src/views/table/inline-edit-table.vue create mode 100644 src/views/theme/index.vue create mode 100644 src/views/zip/index.vue create mode 100644 tests/unit/.eslintrc.js create mode 100644 tests/unit/components/Hamburger.spec.js create mode 100644 tests/unit/components/SvgIcon.spec.js create mode 100644 tests/unit/utils/formatTime.spec.js create mode 100644 tests/unit/utils/param2Obj.spec.js create mode 100644 tests/unit/utils/parseTime.spec.js create mode 100644 tests/unit/utils/validate.spec.js create mode 100644 vue.config.js diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..3454886 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,14 @@ +# https://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +insert_final_newline = false +trim_trailing_whitespace = false diff --git a/.env.development b/.env.development new file mode 100644 index 0000000..de583d0 --- /dev/null +++ b/.env.development @@ -0,0 +1,5 @@ +# just a flag +ENV = 'development' + +# base api +VUE_APP_BASE_API = '/dev-api' diff --git a/.env.production b/.env.production new file mode 100644 index 0000000..80c8103 --- /dev/null +++ b/.env.production @@ -0,0 +1,6 @@ +# just a flag +ENV = 'production' + +# base api +VUE_APP_BASE_API = '/prod-api' + diff --git a/.env.staging b/.env.staging new file mode 100644 index 0000000..a8793a0 --- /dev/null +++ b/.env.staging @@ -0,0 +1,8 @@ +NODE_ENV = production + +# just a flag +ENV = 'staging' + +# base api +VUE_APP_BASE_API = '/stage-api' + diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..e6529fc --- /dev/null +++ b/.eslintignore @@ -0,0 +1,4 @@ +build/*.js +src/assets +public +dist diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..c977505 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,198 @@ +module.exports = { + root: true, + parserOptions: { + parser: 'babel-eslint', + sourceType: 'module' + }, + env: { + browser: true, + node: true, + es6: true, + }, + extends: ['plugin:vue/recommended', 'eslint:recommended'], + + // add your custom rules here + //it is base on https://github.com/vuejs/eslint-config-vue + rules: { + "vue/max-attributes-per-line": [2, { + "singleline": 10, + "multiline": { + "max": 1, + "allowFirstLine": false + } + }], + "vue/singleline-html-element-content-newline": "off", + "vue/multiline-html-element-content-newline":"off", + "vue/name-property-casing": ["error", "PascalCase"], + "vue/no-v-html": "off", + 'accessor-pairs': 2, + 'arrow-spacing': [2, { + 'before': true, + 'after': true + }], + 'block-spacing': [2, 'always'], + 'brace-style': [2, '1tbs', { + 'allowSingleLine': true + }], + 'camelcase': [0, { + 'properties': 'always' + }], + 'comma-dangle': [2, 'never'], + 'comma-spacing': [2, { + 'before': false, + 'after': true + }], + 'comma-style': [2, 'last'], + 'constructor-super': 2, + 'curly': [2, 'multi-line'], + 'dot-location': [2, 'property'], + 'eol-last': 2, + 'eqeqeq': ["error", "always", {"null": "ignore"}], + 'generator-star-spacing': [2, { + 'before': true, + 'after': true + }], + 'handle-callback-err': [2, '^(err|error)$'], + 'indent': [2, 2, { + 'SwitchCase': 1 + }], + 'jsx-quotes': [2, 'prefer-single'], + 'key-spacing': [2, { + 'beforeColon': false, + 'afterColon': true + }], + 'keyword-spacing': [2, { + 'before': true, + 'after': true + }], + 'new-cap': [2, { + 'newIsCap': true, + 'capIsNew': false + }], + 'new-parens': 2, + 'no-array-constructor': 2, + 'no-caller': 2, + 'no-console': 'off', + 'no-class-assign': 2, + 'no-cond-assign': 2, + 'no-const-assign': 2, + 'no-control-regex': 0, + 'no-delete-var': 2, + 'no-dupe-args': 2, + 'no-dupe-class-members': 2, + 'no-dupe-keys': 2, + 'no-duplicate-case': 2, + 'no-empty-character-class': 2, + 'no-empty-pattern': 2, + 'no-eval': 2, + 'no-ex-assign': 2, + 'no-extend-native': 2, + 'no-extra-bind': 2, + 'no-extra-boolean-cast': 2, + 'no-extra-parens': [2, 'functions'], + 'no-fallthrough': 2, + 'no-floating-decimal': 2, + 'no-func-assign': 2, + 'no-implied-eval': 2, + 'no-inner-declarations': [2, 'functions'], + 'no-invalid-regexp': 2, + 'no-irregular-whitespace': 2, + 'no-iterator': 2, + 'no-label-var': 2, + 'no-labels': [2, { + 'allowLoop': false, + 'allowSwitch': false + }], + 'no-lone-blocks': 2, + 'no-mixed-spaces-and-tabs': 2, + 'no-multi-spaces': 2, + 'no-multi-str': 2, + 'no-multiple-empty-lines': [2, { + 'max': 1 + }], + 'no-native-reassign': 2, + 'no-negated-in-lhs': 2, + 'no-new-object': 2, + 'no-new-require': 2, + 'no-new-symbol': 2, + 'no-new-wrappers': 2, + 'no-obj-calls': 2, + 'no-octal': 2, + 'no-octal-escape': 2, + 'no-path-concat': 2, + 'no-proto': 2, + 'no-redeclare': 2, + 'no-regex-spaces': 2, + 'no-return-assign': [2, 'except-parens'], + 'no-self-assign': 2, + 'no-self-compare': 2, + 'no-sequences': 2, + 'no-shadow-restricted-names': 2, + 'no-spaced-func': 2, + 'no-sparse-arrays': 2, + 'no-this-before-super': 2, + 'no-throw-literal': 2, + 'no-trailing-spaces': 2, + 'no-undef': 2, + 'no-undef-init': 2, + 'no-unexpected-multiline': 2, + 'no-unmodified-loop-condition': 2, + 'no-unneeded-ternary': [2, { + 'defaultAssignment': false + }], + 'no-unreachable': 2, + 'no-unsafe-finally': 2, + 'no-unused-vars': [2, { + 'vars': 'all', + 'args': 'none' + }], + 'no-useless-call': 2, + 'no-useless-computed-key': 2, + 'no-useless-constructor': 2, + 'no-useless-escape': 0, + 'no-whitespace-before-property': 2, + 'no-with': 2, + 'one-var': [2, { + 'initialized': 'never' + }], + 'operator-linebreak': [2, 'after', { + 'overrides': { + '?': 'before', + ':': 'before' + } + }], + 'padded-blocks': [2, 'never'], + 'quotes': [2, 'single', { + 'avoidEscape': true, + 'allowTemplateLiterals': true + }], + 'semi': [2, 'never'], + 'semi-spacing': [2, { + 'before': false, + 'after': true + }], + 'space-before-blocks': [2, 'always'], + 'space-before-function-paren': [2, 'never'], + 'space-in-parens': [2, 'never'], + 'space-infix-ops': 2, + 'space-unary-ops': [2, { + 'words': true, + 'nonwords': false + }], + 'spaced-comment': [2, 'always', { + 'markers': ['global', 'globals', 'eslint', 'eslint-disable', '*package', '!', ','] + }], + 'template-curly-spacing': [2, 'never'], + 'use-isnan': 2, + 'valid-typeof': 2, + 'wrap-iife': [2, 'any'], + 'yield-star-spacing': [2, 'both'], + 'yoda': [2, 'never'], + 'prefer-const': 2, + 'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0, + 'object-curly-spacing': [2, 'always', { + objectsInObjects: false + }], + 'array-bracket-spacing': [2, 'never'] + } +} diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..d540802 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,4 @@ +# These are supported funding model platforms + +patreon: panjiachen +custom: https://panjiachen.github.io/vue-element-admin-site/donate diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..1a114bc --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,33 @@ +--- +name: Bug report(报告问题) +about: Create a report to help us improve +--- + + + +## Bug report(问题描述) + +#### Steps to reproduce(问题复现步骤) + + +#### Screenshot or Gif(截图或动态图) + + +#### Link to minimal reproduction(最小可在线还原demo) + + + +#### Other relevant information(格外信息) +- Your OS: +- Node.js version: +- vue-element-admin version: diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..c33d10d --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,7 @@ +--- +name: Feature Request(新功能建议) +about: Suggest an idea for this project +--- + +## Feature request(新功能建议) + diff --git a/.github/ISSUE_TEMPLATE/question.md b/.github/ISSUE_TEMPLATE/question.md new file mode 100644 index 0000000..7608354 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/question.md @@ -0,0 +1,35 @@ +--- +name: Question(提问) +about: Asking questions about use +--- + +## Question(提问) + + + +#### Steps to reproduce(问题复现步骤) + + +#### Screenshot or Gif(截图或动态图) + + +#### Link to minimal reproduction(最小可在线还原demo) + + + +#### Other relevant information(格外信息) +- Your OS: +- Node.js version: +- vue-element-admin version: diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..78a752d --- /dev/null +++ b/.gitignore @@ -0,0 +1,23 @@ +.DS_Store +node_modules/ +dist/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* +**/*.log + +tests/**/coverage/ +tests/e2e/reports +selenium-debug.log + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.local + +package-lock.json +yarn.lock diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..f4be7a0 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,5 @@ +language: node_js +node_js: 10 +script: npm run test +notifications: + email: false diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..6151575 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017-present PanJiaChen + +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. diff --git a/README.es.md b/README.es.md new file mode 100644 index 0000000..dc20fa4 --- /dev/null +++ b/README.es.md @@ -0,0 +1,228 @@ +

+ +

+ +

+ + vue + + + element-ui + + + Estado de Construcción + + + Licencia + + + Liberación Github + + + Gitter + + + Donación + +

+ +Español | [English](./README.md) | [简体中文](./README.zh-CN.md) | [日本語](./README.ja.md) + +## Introducción + +[vue-element-admin](https://panjiachen.github.io/vue-element-admin) es una interfáz de administración preparada para producción. Está basada en [vue](https://github.com/vuejs/vue) y usa [element-ui](https://github.com/ElemeFE/element) como conjunto de herramientas de interfáz de usuario. + +Vue Element Admin es una solución práctica basada en la nueva plataforma de desarrollo de vue, construida con soporte a i18 para el manejo de múltiples lenguajes, plantillas estándares para aplicaciones de negocio y un conjunto de asombrosas características. Esta herramienta ayuda a construir largas y complejas Aplicacones de una sola página (SPA). Creo que lo que necesites hacer, este proyecto te ayudará. + +- [Vista Prévia de la Aplicación](https://panjiachen.github.io/vue-element-admin) + +- [Documentación](https://panjiachen.github.io/vue-element-admin-site/) + +- [Canal de Gitter](https://gitter.im/vue-element-admin/discuss) + +- [Para Donaciones](https://panjiachen.github.io/vue-element-admin-site/donate/) + +- [Enlace de Wiki](https://github.com/PanJiaChen/vue-element-admin/wiki) + +- [Canal de Gitee](https://panjiachen.gitee.io/vue-element-admin/) + +- Plantilla base recomendada para usar: [vue-admin-template](https://github.com/PanJiaChen/vue-admin-template) +- Aplicación de Escritorio: [electron-vue-admin](https://github.com/PanJiaChen/electron-vue-admin) +- Plantilla de Typescript: [vue-typescript-admin-template](https://github.com/Armour/vue-typescript-admin-template) (Créditos: [@Armour](https://github.com/Armour)) +- [awesome-project](https://github.com/PanJiaChen/vue-element-admin/issues/2312) + +**Después de la versión `v4.1.0+`, la rama por defecto master no tendrá soporte para i18n. Por favor utilice la rama [i18n](https://github.com/PanJiaChen/vue-element-admin/tree/i18n), los cambios serán incluidos en la rama master** + +**la versión actual es `v4.0+` construida con `vue-cli`. Si encuentra algún problema, por favor coloque un [issue](https://github.com/PanJiaChen/vue-element-admin/issues/new). Si desea usar la versión anterior, puede cambiar de rama a [tag/3.11.0](https://github.com/PanJiaChen/vue-element-admin/tree/tag/3.11.0), no relacionado con `vue-cli`** + +**Este proyecto no está soportado para versiones antigüas de navegadores (ej. IE).** + +## Preparación + +Necesita instalar [node](https://nodejs.org/) y [git](https://git-scm.com/) localmente. El proyecto es basado en [ES2015+](https://es6.ruanyifeng.com/), [vue](https://cn.vuejs.org/index.html), [vuex](https://vuex.vuejs.org/zh-cn/), [vue-router](https://router.vuejs.org/zh-cn/), [vue-cli](https://github.com/vuejs/vue-cli) , [axios](https://github.com/axios/axios) and [element-ui](https://github.com/ElemeFE/element), toda la solicitud de datos simulada se realiza a través de [Mock.js](https://github.com/nuysoft/Mock). +Entendiendo y aprendiendo esto pudiera ayudarle con su proyecto. + +[![Edit on CodeSandbox](https://codesandbox.io/static/img/play-codesandbox.svg)](https://codesandbox.io/s/github/PanJiaChen/vue-element-admin/tree/CodeSandbox) + +

+ +

+ +## Patrocinantes + +Sea un patrocinante y coloque su logo en nuestro LEEME en GitHub con un enlace directo a su sitio web. [[Se un Patrocinante]](https://www.patreon.com/panjiachen) + +### Akveo +

Get Java backend for Vue admin with 20% discount for 39$ use coupon code SWB0RAZPZR1M +

+ +### Flatlogic + +

Admin Dashboard Templates made with Vue, React and Angular.

+ +## Características + +``` +- Iniciar / Cerrar Sesión + +- Permisos de Autenticación + - Página de Permisos + - Directivas de permisos + - Página de configuración de permisos + - Autenticación por dos pasos + +- Construcción Multi-entorno + - Desarrollo (dev) + - sit + - Escenario de pruebas (stage), + - Producción (prod) + +- Características Globales + - I18n + - Temas dinámicos + - Menu lateral dinámico (soporte a rutas multi-nivel) + - Barra de rutas dinámica + - Tags-view (Pestañas de página, Soporta operación de clic derecho) + - Svg Sprite + - Datos de simulación con Mock + - Pantalla completa + - Menu lateral responsivo + +- Editor + - Editor de Texto Enriquecido + - Editor Markdown + - Editor JSON + +- Excel + - Exportación a Excel + - Carga de Excel + - Visualización de Excel + - Exportación como ZIP + +- Tabla + - Tabla Dinámica + - Tabla con Arrastrar y Soltar + - Tabla de edición en línea + +- Páginas de Error + - 401 + - 404 + +- Componentes + - Carga de Avatar + - Botón para subir al inicio + - Arrastrar y Soltar (Diaglogo) + - Arrastrar y Soltar (Seleccionar) + - Arrastrar y Soltar (Kanban) + - Arrastrar y Soltar (Lista) + - Panel de división + - Componente para soltar archivos + - Adhesión de objetos + - Contador hasta + +- Ejemplo Avanzado +- Registro de Errores +- Tablero de indicadores +- Página de Guías +- ECharts (Gráficos) +- Portapapeles +- Convertidor de Markdown a HTML +``` + +## Iniciando + +```bash +# clone el proyecto +git clone https://github.com/PanJiaChen/vue-element-admin.git + +# vaya al directorio clonado +cd vue-element-admin + +# instale las dependencias +npm install + +# corra el proyecto como desarrollador +npm run dev +``` + +Automáticamente se abrirá el siguiente enlace en su navegador http://localhost:9527 + +## Construcción + +```bash +# Construcción para entornos de prueba +npm run build:stage + +# Construcción para entornos de producción +npm run build:prod +``` + +## Avanzado + +```bash +# Vista previa con efectos de entorno +npm run preview + +# Vista previa con efectos + análisis de recursos estáticos +npm run preview -- --report + +# Chequeo de formato de código +npm run lint + +# Chequeo de formato de código y auto-corrección +npm run lint -- --fix +``` + +Vaya a [Documentación](https://panjiachen.github.io/vue-element-admin-site/guide/essentials/deploy.html) para mayor información + +## Registro de Cambios + +Los cambios detallados por cada liberación se encuentran en [notas de liberación](https://github.com/PanJiaChen/vue-element-admin/releases). + +## Demostración en línea + +[Vista Prévia de la Aplicación](https://panjiachen.github.io/vue-element-admin) + +## Donación + +Si este proyecto es de mucha ayuda para ti, puedes comprarle al autor un vaso de jugo :tropical_drink: + +![Donar](https://wpimg.wallstcn.com/bd273f0d-83a0-4ef2-92e1-9ac8ed3746b9.png) + +[dona por Paypal](https://www.paypal.me/panfree23) + +[Comprame un Café](https://www.buymeacoffee.com/Pan) + +## Navegadores Soportados + +Navegadores modernos e Internet Explorer 10+. + +| [IE / Edge](https://godban.github.io/browsers-support-badges/)
IE / Edge | [Firefox](https://godban.github.io/browsers-support-badges/)
Firefox | [Chrome](https://godban.github.io/browsers-support-badges/)
Chrome | [Safari](https://godban.github.io/browsers-support-badges/)
Safari | +| --------- | --------- | --------- | --------- | +| IE10, IE11, Edge | últimas 2 versiones | últimas 2 versiones | últimas 2 versiones | + +## Licencia + +[MIT](https://github.com/PanJiaChen/vue-element-admin/blob/master/LICENSE) + +Copyright (c) 2017-presente PanJiaChen diff --git a/README.ja.md b/README.ja.md new file mode 100644 index 0000000..3bc3ce8 --- /dev/null +++ b/README.ja.md @@ -0,0 +1,224 @@ +

+ +

+ +

+ + vue + + + element-ui + + + Build Status + + + license + + + GitHub release + + + gitter + + + donate + +

+ +日本語 | [English](./README.md) | [简体中文](./README.zh-CN.md) | [Spanish](./README.es.md) + +## 概要 + +[vue-element-admin](https://panjiachen.github.io/vue-element-admin) は管理画面のフロントエンドのインタフェースで、[vue](https://github.com/vuejs/vue) と [element-ui](https://github.com/ElemeFE/element)を使っています。i18nの多言語対応、可変ルート、権限、典型的なビジネスアプリテンプレートであり、豊富なコンポーネントを提供しています。素早くビジネス用の管理画面の現型を構築に役立ちます。 + +- [デモページ](https://panjiachen.github.io/vue-element-admin) + +- [ドキュメント](https://panjiachen.github.io/vue-element-admin-site/) + +- [Gitter](https://gitter.im/vue-element-admin/discuss) + +- [Donate](https://panjiachen.gitee.io/vue-element-admin-site/zh/donate) + +- [Wiki](https://github.com/PanJiaChen/vue-element-admin/wiki) + +- おすすめシンプルテンプレート: [vue-admin-template](https://github.com/PanJiaChen/vue-admin-template) +- デスクトップバージョン: [electron-vue-admin](https://github.com/PanJiaChen/electron-vue-admin) +- Typescriptバージョン: [vue-typescript-admin-template](https://github.com/Armour/vue-typescript-admin-template) (感謝: [@Armour](https://github.com/Armour)) +- [awesome-project](https://github.com/PanJiaChen/vue-element-admin/issues/2312) + +**バージョン`v4.1.0+`以降について、デフォルトのmasterブランチではi18nをサポートしていません。masterブランチと共にアップデートされる[i18n Branch](https://github.com/PanJiaChen/vue-element-admin/tree/i18n)を使用してください。 ** + +**現在のバージョン `v4.0+` は `vue-cli` で構築していて、バグ報告は[issue](https://github.com/PanJiaChen/vue-element-admin/issues/new)のissueでお願いします。旧バージョン[tag/3.11.0](https://github.com/PanJiaChen/vue-element-admin/tree/tag/3.11.0)もあります。こちらは`vue-cli`に依存しないです。** + +**低いバージョンのブラウザはサーポートしないです(例えば ie),必要があれば polyfill を追加してください。 [詳細はこちら](https://github.com/PanJiaChen/vue-element-admin/wiki#babel-polyfill)** + +## 前準備 + +ローカル環境に [node](http://nodejs.org/) と [git](https://git-scm.com/)のインストールが必要です。[ES2015+](http://es6.ruanyifeng.com/)、[vue](https://cn.vuejs.org/index.html)、[vuex](https://vuex.vuejs.org/zh-cn/)、[vue-router](https://router.vuejs.org/zh-cn/) 、[vue-cli](https://github.com/vuejs/vue-cli) 、[axios](https://github.com/axios/axios) と [element-ui](https://github.com/ElemeFE/element)で開発しています。Requestは[Mock.js](https://github.com/nuysoft/Mock)のモックデータを使っています。 + +**バグ修正や新規機能追加のissue と pull requestは大歓迎です。** + +[![Edit on CodeSandbox](https://codesandbox.io/static/img/play-codesandbox.svg)](https://codesandbox.io/s/github/PanJiaChen/vue-element-admin/tree/CodeSandbox) + +

+ +

+ +## Sponsors + +Become a sponsor and get your logo on our README on GitHub with a link to your site. [[Become a sponsor]](https://www.patreon.com/panjiachen) + +### Akveo +

Get Java backend for Vue admin with 20% discount for 39$ use coupon code SWB0RAZPZR1M +

+ +### Flatlogic + +

Admin Dashboard Templates made with Vue, React and Angular.

+ +## 機能一覧 + +``` +- ログイン / ログアウト + +- Auth認証 + - ページ権限 + - 権限パーミッション + - 権限設定 + - 外部IDでログイン + +- 複数環境デプロイ + - dev + - sit + - stage + - prod + +- 共通機能 + - 多言語切替 + - テーマ切替 + - サイトメニュー(ルートから生成) + - パンくずリストナビゲーション + - タブナビゲーション + - Svg Sprite アイコン + - ローカル/バックエンド モック データ + - Screenfull + +- WYSIWYG + - TinyMCE + - Markdown + - JSON + +- Excel + - エクスポート + - インポート + - リード + - Zip + +- テーブル + - ダイナミックテーブル + - ドラッグアンドドロップテーブル + - インラインエディットテーブル + +- エラーページ + - 401 + - 404 + +- コンポーネント + - アバターアップロード + - トップに戻る + - ドラッグダイアログ + - ドラッグ選択 + - ドラッグKanban + - ドラッグリスト + - ペインの分割 + - Dropzone + - スティッキー + - CountTo + +- 高度なサンプル +- エラーログ +- ダッシュボード +- ガイドページ +- ECharts +- クリップボード +- Markdown to html +``` + +## Getting started + +```bash +# clone the project +git clone https://github.com/PanJiaChen/vue-element-admin.git + +# enter the project directory +cd vue-element-admin + +# install dependency +npm install + +# develop +npm run dev +``` + +http://localhost:9527 が自動的に開きます。 + +## Build + +```bash +# build for test environment +npm run build:stage + +# build for production environment +npm run build:prod +``` + +## Advanced + +```bash +# preview the release environment effect +npm run preview + +# preview the release environment effect + static resource analysis +npm run preview -- --report + +# code format check +npm run lint + +# code format check and auto fix +npm run lint -- --fix +``` + +詳細は [Documentation](https://panjiachen.github.io/vue-element-admin-site/guide/essentials/deploy.html) を参照してください。 + +## Changelog + +各リリースの詳細は [release notes](https://github.com/PanJiaChen/vue-element-admin/releases) にあります。 + +## Online Demo + +[Preview](https://panjiachen.github.io/vue-element-admin) + +## Donate + +If you find this project useful, you can buy author a glass of juice :tropical_drink: + +![donate](https://wpimg.wallstcn.com/bd273f0d-83a0-4ef2-92e1-9ac8ed3746b9.png) + +[Paypal Me](https://www.paypal.me/panfree23) + +[Buy me a coffee](https://www.buymeacoffee.com/Pan) + +## Browsers support + +Modern browsers and Internet Explorer 10+. + +| [IE / Edge](https://godban.github.io/browsers-support-badges/)
IE / Edge | [Firefox](https://godban.github.io/browsers-support-badges/)
Firefox | [Chrome](https://godban.github.io/browsers-support-badges/)
Chrome | [Safari](https://godban.github.io/browsers-support-badges/)
Safari | +| --------- | --------- | --------- | --------- | +| IE10, IE11, Edge | last 2 versions | last 2 versions | last 2 versions | + +## License + +[MIT](https://github.com/PanJiaChen/vue-element-admin/blob/master/LICENSE) + +Copyright (c) 2017-present PanJiaChen diff --git a/README.md b/README.md new file mode 100644 index 0000000..f3b7248 --- /dev/null +++ b/README.md @@ -0,0 +1,250 @@ +

+ +

+ +

+ + vue + + + element-ui + + + Build Status + + + license + + + GitHub release + + + gitter + + + donate + +

+ +English | [简体中文](./README.zh-CN.md) | [日本語](./README.ja.md) | [Spanish](./README.es.md) + +

+ SPONSORED BY +

+ + + + + + + +
+ + +

活动服务销售平台

+
+
+ + +

客户消息直达工作群

+
+
+ +## Introduction + +[vue-element-admin](https://panjiachen.github.io/vue-element-admin) is a production-ready front-end solution for admin interfaces. It is based on [vue](https://github.com/vuejs/vue) and uses the UI Toolkit [element-ui](https://github.com/ElemeFE/element). + +[vue-element-admin](https://panjiachen.github.io/vue-element-admin) is based on the newest development stack of vue and it has a built-in i18n solution, typical templates for enterprise applications, and lots of awesome features. It helps you build large and complex Single-Page Applications. I believe whatever your needs are, this project will help you. + +- [Preview](https://panjiachen.github.io/vue-element-admin) + +- [Documentation](https://panjiachen.github.io/vue-element-admin-site/) + +- [Gitter](https://gitter.im/vue-element-admin/discuss) + +- [Donate](https://panjiachen.github.io/vue-element-admin-site/donate/) + +- [Wiki](https://github.com/PanJiaChen/vue-element-admin/wiki) + +- [Gitee](https://panjiachen.gitee.io/vue-element-admin/) 国内用户可访问该地址在线预览 + +- Base template recommends using: [vue-admin-template](https://github.com/PanJiaChen/vue-admin-template) +- Desktop: [electron-vue-admin](https://github.com/PanJiaChen/electron-vue-admin) +- Typescript: [vue-typescript-admin-template](https://github.com/Armour/vue-typescript-admin-template) (Credits: [@Armour](https://github.com/Armour)) +- [awesome-project](https://github.com/PanJiaChen/vue-element-admin/issues/2312) + +**After the `v4.1.0+` version, the default master branch will not support i18n. Please use [i18n Branch](https://github.com/PanJiaChen/vue-element-admin/tree/i18n), it will keep up with the master update** + +**The current version is `v4.0+` build on `vue-cli`. If you find a problem, please put [issue](https://github.com/PanJiaChen/vue-element-admin/issues/new). If you want to use the old version , you can switch branch to [tag/3.11.0](https://github.com/PanJiaChen/vue-element-admin/tree/tag/3.11.0), it does not rely on `vue-cli`** + +**This project does not support low version browsers (e.g. IE). Please add polyfill by yourself.** + +## Preparation + +You need to install [node](https://nodejs.org/) and [git](https://git-scm.com/) locally. The project is based on [ES2015+](https://es6.ruanyifeng.com/), [vue](https://cn.vuejs.org/index.html), [vuex](https://vuex.vuejs.org/zh-cn/), [vue-router](https://router.vuejs.org/zh-cn/), [vue-cli](https://github.com/vuejs/vue-cli) , [axios](https://github.com/axios/axios) and [element-ui](https://github.com/ElemeFE/element), all request data is simulated using [Mock.js](https://github.com/nuysoft/Mock). +Understanding and learning this knowledge in advance will greatly help the use of this project. + +[![Edit on CodeSandbox](https://codesandbox.io/static/img/play-codesandbox.svg)](https://codesandbox.io/s/github/PanJiaChen/vue-element-admin/tree/CodeSandbox) + +

+ +

+ +## Sponsors + +Become a sponsor and get your logo on our README on GitHub with a link to your site. [[Become a sponsor]](https://www.patreon.com/panjiachen) + +### Akveo +

Get Java backend for Vue admin with 20% discount for 39$ use coupon code SWB0RAZPZR1M +

+ +### Flatlogic + +

Admin Dashboard Templates made with Vue, React and Angular.

+ +## Features + +``` +- Login / Logout + +- Permission Authentication + - Page permission + - Directive permission + - Permission configuration page + - Two-step login + +- Multi-environment build + - Develop (dev) + - sit + - Stage Test (stage) + - Production (prod) + +- Global Features + - I18n + - Multiple dynamic themes + - Dynamic sidebar (supports multi-level routing) + - Dynamic breadcrumb + - Tags-view (Tab page Support right-click operation) + - Svg Sprite + - Mock data + - Screenfull + - Responsive Sidebar + +- Editor + - Rich Text Editor + - Markdown Editor + - JSON Editor + +- Excel + - Export Excel + - Upload Excel + - Visualization Excel + - Export zip + +- Table + - Dynamic Table + - Drag And Drop Table + - Inline Edit Table + +- Error Page + - 401 + - 404 + +- Components + - Avatar Upload + - Back To Top + - Drag Dialog + - Drag Select + - Drag Kanban + - Drag List + - SplitPane + - Dropzone + - Sticky + - CountTo + +- Advanced Example +- Error Log +- Dashboard +- Guide Page +- ECharts +- Clipboard +- Markdown to html +``` + +## Getting started + +```bash +# clone the project +git clone https://github.com/PanJiaChen/vue-element-admin.git + +# enter the project directory +cd vue-element-admin + +# install dependency +npm install + +# develop +npm run dev +``` + +This will automatically open http://localhost:9527 + +## Build + +```bash +# build for test environment +npm run build:stage + +# build for production environment +npm run build:prod +``` + +## Advanced + +```bash +# preview the release environment effect +npm run preview + +# preview the release environment effect + static resource analysis +npm run preview -- --report + +# code format check +npm run lint + +# code format check and auto fix +npm run lint -- --fix +``` + +Refer to [Documentation](https://panjiachen.github.io/vue-element-admin-site/guide/essentials/deploy.html) for more information + +## Changelog + +Detailed changes for each release are documented in the [release notes](https://github.com/PanJiaChen/vue-element-admin/releases). + +## Online Demo + +[Preview](https://panjiachen.github.io/vue-element-admin) + +## Donate + +If you find this project useful, you can buy author a glass of juice :tropical_drink: + +![donate](https://wpimg.wallstcn.com/bd273f0d-83a0-4ef2-92e1-9ac8ed3746b9.png) + +[Paypal Me](https://www.paypal.me/panfree23) + +[Buy me a coffee](https://www.buymeacoffee.com/Pan) + +## Browsers support + +Modern browsers and Internet Explorer 10+. + +| [IE / Edge](https://godban.github.io/browsers-support-badges/)
IE / Edge | [Firefox](https://godban.github.io/browsers-support-badges/)
Firefox | [Chrome](https://godban.github.io/browsers-support-badges/)
Chrome | [Safari](https://godban.github.io/browsers-support-badges/)
Safari | +| --------- | --------- | --------- | --------- | +| IE10, IE11, Edge | last 2 versions | last 2 versions | last 2 versions | + +## License + +[MIT](https://github.com/PanJiaChen/vue-element-admin/blob/master/LICENSE) + +Copyright (c) 2017-present PanJiaChen diff --git a/README.zh-CN.md b/README.zh-CN.md new file mode 100644 index 0000000..b6d34e3 --- /dev/null +++ b/README.zh-CN.md @@ -0,0 +1,273 @@ +

+ +

+ +

+ + vue + + + element-ui + + + Build Status + + + license + + + GitHub release + + + gitter + + + donate + +

+ +简体中文 | [English](./README.md) | [日本語](./README.ja.md) | [Spanish](./README.es.md) + +

+ SPONSORED BY +

+ + + + + + + +
+ + +

活动服务销售平台

+
+
+ + +

客户消息直达工作群

+
+
+ +## 简介 + +[vue-element-admin](https://panjiachen.github.io/vue-element-admin) 是一个后台前端解决方案,它基于 [vue](https://github.com/vuejs/vue) 和 [element-ui](https://github.com/ElemeFE/element)实现。它使用了最新的前端技术栈,内置了 i18n 国际化解决方案,动态路由,权限验证,提炼了典型的业务模型,提供了丰富的功能组件,它可以帮助你快速搭建企业级中后台产品原型。相信不管你的需求是什么,本项目都能帮助到你。 + +- [在线预览](https://panjiachen.github.io/vue-element-admin) + +- [使用文档](https://panjiachen.github.io/vue-element-admin-site/zh/) + +- [Gitter 讨论组](https://gitter.im/vue-element-admin/discuss) + +- [Donate](https://panjiachen.gitee.io/vue-element-admin-site/zh/donate) + +- [Wiki](https://github.com/PanJiaChen/vue-element-admin/wiki) + +- [Gitee](https://panjiachen.gitee.io/vue-element-admin/) 在线预览(国内用户可访问该地址) + +- [国内访问文档](https://panjiachen.gitee.io/vue-element-admin-site/zh/) 文档(方便没翻墙的用户查看) + +- 基础模板建议使用: [vue-admin-template](https://github.com/PanJiaChen/vue-admin-template) +- 桌面端: [electron-vue-admin](https://github.com/PanJiaChen/electron-vue-admin) +- Typescript 版: [vue-typescript-admin-template](https://github.com/Armour/vue-typescript-admin-template) (鸣谢: [@Armour](https://github.com/Armour)) +- [awesome-project](https://github.com/PanJiaChen/vue-element-admin/issues/2312) + +**`v4.1.0+`版本之后默认 master 分支将不支持国际化,有需要的请使用[i18n](https://github.com/PanJiaChen/vue-element-admin/tree/i18n)分支,它会和 master 保持同步更新** + +**该项目不支持低版本浏览器(如 ie),有需求请自行添加 polyfill [详情](https://github.com/PanJiaChen/vue-element-admin/wiki#babel-polyfill)** + +**目前版本为 `v4.0+` 基于 `vue-cli` 进行构建,若发现问题,欢迎提[issue](https://github.com/PanJiaChen/vue-element-admin/issues/new)。若你想使用旧版本,可以切换分支到[tag/3.11.0](https://github.com/PanJiaChen/vue-element-admin/tree/tag/3.11.0),它不依赖 `vue-cli`** + +群主 **[圈子](https://jianshiapp.com/circles/1209)** 群主会经常分享一些技术相关的东西,或者加入 [qq 群](https://github.com/PanJiaChen/vue-element-admin/issues/602) 或者关注 [微博](https://weibo.com/u/3423485724?is_all=1) + +## 前序准备 + +你需要在本地安装 [node](http://nodejs.org/) 和 [git](https://git-scm.com/)。本项目技术栈基于 [ES2015+](http://es6.ruanyifeng.com/)、[vue](https://cn.vuejs.org/index.html)、[vuex](https://vuex.vuejs.org/zh-cn/)、[vue-router](https://router.vuejs.org/zh-cn/) 、[vue-cli](https://github.com/vuejs/vue-cli) 、[axios](https://github.com/axios/axios) 和 [element-ui](https://github.com/ElemeFE/element),所有的请求数据都使用[Mock.js](https://github.com/nuysoft/Mock)进行模拟,提前了解和学习这些知识会对使用本项目有很大的帮助。 + +同时配套了系列教程文章,如何从零构建后一个完整的后台项目,建议大家先看完这些文章再来实践本项目 + +- [手摸手,带你用 vue 撸后台 系列一(基础篇)](https://juejin.im/post/59097cd7a22b9d0065fb61d2) +- [手摸手,带你用 vue 撸后台 系列二(登录权限篇)](https://juejin.im/post/591aa14f570c35006961acac) +- [手摸手,带你用 vue 撸后台 系列三 (实战篇)](https://juejin.im/post/593121aa0ce4630057f70d35) +- [手摸手,带你用 vue 撸后台 系列四(vueAdmin 一个极简的后台基础模板)](https://juejin.im/post/595b4d776fb9a06bbe7dba56) +- [手摸手,带你用vue撸后台 系列五(v4.0新版本)](https://juejin.im/post/5c92ff94f265da6128275a85) +- [手摸手,带你封装一个 vue component](https://segmentfault.com/a/1190000009090836) +- [手摸手,带你优雅的使用 icon](https://juejin.im/post/59bb864b5188257e7a427c09) +- [手摸手,带你用合理的姿势使用 webpack4(上)](https://juejin.im/post/5b56909a518825195f499806) +- [手摸手,带你用合理的姿势使用 webpack4(下)](https://juejin.im/post/5b5d6d6f6fb9a04fea58aabc) + +**如有问题请先看上述使用文档和文章,若不能满足,欢迎 issue 和 pr** + +[![Edit on CodeSandbox](https://codesandbox.io/static/img/play-codesandbox.svg)](https://codesandbox.io/s/github/PanJiaChen/vue-element-admin/tree/CodeSandbox) + +

+ +

+ +## Sponsors + +Become a sponsor and get your logo on our README on GitHub with a link to your site. [[Become a sponsor]](https://www.patreon.com/panjiachen) + +### Akveo +

Java 后端整合,可以使用优惠码:SWB0RAZPZR1M,获得20%的价格优化

+ +### Flatlogic + +

Admin Dashboard Templates made with Vue, React and Angular.

+ + +## 功能 + +``` +- 登录 / 注销 + +- 权限验证 + - 页面权限 + - 指令权限 + - 权限配置 + - 二步登录 + +- 多环境发布 + - dev + - sit + - stage + - prod + +- 全局功能 + - 国际化多语言 + - 多种动态换肤 + - 动态侧边栏(支持多级路由嵌套) + - 动态面包屑 + - 快捷导航(标签页) + - Svg Sprite 图标 + - 本地/后端 mock 数据 + - Screenfull全屏 + - 自适应收缩侧边栏 + +- 编辑器 + - 富文本 + - Markdown + - JSON 等多格式 + +- Excel + - 导出excel + - 导入excel + - 前端可视化excel + - 导出zip + +- 表格 + - 动态表格 + - 拖拽表格 + - 内联编辑 + +- 错误页面 + - 401 + - 404 + +- 組件 + - 头像上传 + - 返回顶部 + - 拖拽Dialog + - 拖拽Select + - 拖拽看板 + - 列表拖拽 + - SplitPane + - Dropzone + - Sticky + - CountTo + +- 综合实例 +- 错误日志 +- Dashboard +- 引导页 +- ECharts 图表 +- Clipboard(剪贴复制) +- Markdown2html +``` + +## 开发 + +```bash +# 克隆项目 +git clone https://github.com/PanJiaChen/vue-element-admin.git + +# 进入项目目录 +cd vue-element-admin + +# 安装依赖 +npm install + +# 建议不要直接使用 cnpm 安装依赖,会有各种诡异的 bug。可以通过如下操作解决 npm 下载速度慢的问题 +npm install --registry=https://registry.npm.taobao.org + +# 启动服务 +npm run dev +``` + +浏览器访问 http://localhost:9527 + +## 发布 + +```bash +# 构建测试环境 +npm run build:stage + +# 构建生产环境 +npm run build:prod +``` + +## 其它 + +```bash +# 预览发布环境效果 +npm run preview + +# 预览发布环境效果 + 静态资源分析 +npm run preview -- --report + +# 代码格式检查 +npm run lint + +# 代码格式检查并自动修复 +npm run lint -- --fix +``` + +更多信息请参考 [使用文档](https://panjiachen.github.io/vue-element-admin-site/zh/) + +## Changelog + +Detailed changes for each release are documented in the [release notes](https://github.com/PanJiaChen/vue-element-admin/releases). + +## Online Demo + +[在线 Demo](https://panjiachen.github.io/vue-element-admin) + +## Donate + +如果你觉得这个项目帮助到了你,你可以帮作者买一杯果汁表示鼓励 :tropical_drink: +![donate](https://panjiachen.github.io/donate/donation.png) + +[更多捐赠方式](https://panjiachen.gitee.io/vue-element-admin-site/zh/donate) + +[Paypal Me](https://www.paypal.me/panfree23) + +[Buy me a coffee](https://www.buymeacoffee.com/Pan) + +## 购买贴纸 + +你也可以通过 购买[官方授权的贴纸](https://smallsticker.com/product/vue-element-admin) 的方式来支持 vue-element-admin - 每售出一张贴纸,本项目将获得 2 元的捐赠。 + +## Browsers support + +Modern browsers and Internet Explorer 10+. + +| [IE / Edge](https://godban.github.io/browsers-support-badges/)
IE / Edge | [Firefox](https://godban.github.io/browsers-support-badges/)
Firefox | [Chrome](https://godban.github.io/browsers-support-badges/)
Chrome | [Safari](https://godban.github.io/browsers-support-badges/)
Safari | +| --------- | --------- | --------- | --------- | +| IE10, IE11, Edge | last 2 versions | last 2 versions | last 2 versions | + +## License + +[MIT](https://github.com/PanJiaChen/vue-element-admin/blob/master/LICENSE) + +Copyright (c) 2017-present PanJiaChen diff --git a/babel.config.js b/babel.config.js new file mode 100644 index 0000000..fb82b27 --- /dev/null +++ b/babel.config.js @@ -0,0 +1,14 @@ +module.exports = { + presets: [ + // https://github.com/vuejs/vue-cli/tree/master/packages/@vue/babel-preset-app + '@vue/cli-plugin-babel/preset' + ], + 'env': { + 'development': { + // babel-plugin-dynamic-import-node plugin only does one thing by converting all import() to require(). + // This plugin can significantly increase the speed of hot updates, when you have a large number of pages. + // https://panjiachen.github.io/vue-element-admin-site/guide/advanced/lazy-loading.html + 'plugins': ['dynamic-import-node'] + } + } +} diff --git a/build/index.js b/build/index.js new file mode 100644 index 0000000..0c57de2 --- /dev/null +++ b/build/index.js @@ -0,0 +1,35 @@ +const { run } = require('runjs') +const chalk = require('chalk') +const config = require('../vue.config.js') +const rawArgv = process.argv.slice(2) +const args = rawArgv.join(' ') + +if (process.env.npm_config_preview || rawArgv.includes('--preview')) { + const report = rawArgv.includes('--report') + + run(`vue-cli-service build ${args}`) + + const port = 9526 + const publicPath = config.publicPath + + var connect = require('connect') + var serveStatic = require('serve-static') + const app = connect() + + app.use( + publicPath, + serveStatic('./dist', { + index: ['index.html', '/'] + }) + ) + + app.listen(port, function () { + console.log(chalk.green(`> Preview at http://localhost:${port}${publicPath}`)) + if (report) { + console.log(chalk.green(`> Report at http://localhost:${port}${publicPath}report.html`)) + } + + }) +} else { + run(`vue-cli-service build ${args}`) +} diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 0000000..143cdc8 --- /dev/null +++ b/jest.config.js @@ -0,0 +1,24 @@ +module.exports = { + moduleFileExtensions: ['js', 'jsx', 'json', 'vue'], + transform: { + '^.+\\.vue$': 'vue-jest', + '.+\\.(css|styl|less|sass|scss|svg|png|jpg|ttf|woff|woff2)$': + 'jest-transform-stub', + '^.+\\.jsx?$': 'babel-jest' + }, + moduleNameMapper: { + '^@/(.*)$': '/src/$1' + }, + snapshotSerializers: ['jest-serializer-vue'], + testMatch: [ + '**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)' + ], + collectCoverageFrom: ['src/utils/**/*.{js,vue}', '!src/utils/auth.js', '!src/utils/request.js', 'src/components/**/*.{js,vue}'], + coverageDirectory: '/tests/unit/coverage', + // 'collectCoverage': true, + 'coverageReporters': [ + 'lcov', + 'text-summary' + ], + testURL: 'http://localhost/' +} diff --git a/jsconfig.json b/jsconfig.json new file mode 100644 index 0000000..958df04 --- /dev/null +++ b/jsconfig.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "baseUrl": "./", + "paths": { + "@/*": ["src/*"] + } + }, + "exclude": ["node_modules", "dist"] +} \ No newline at end of file diff --git a/mock/article.js b/mock/article.js new file mode 100644 index 0000000..23d8ba5 --- /dev/null +++ b/mock/article.js @@ -0,0 +1,116 @@ +const Mock = require('mockjs') + +const List = [] +const count = 100 + +const baseContent = '

I am testing data, I am testing data.

' +const image_uri = 'https://wpimg.wallstcn.com/e4558086-631c-425c-9430-56ffb46e70b3' + +for (let i = 0; i < count; i++) { + List.push(Mock.mock({ + id: '@increment', + timestamp: +Mock.Random.date('T'), + author: '@first', + reviewer: '@first', + title: '@title(5, 10)', + content_short: 'mock data', + content: baseContent, + forecast: '@float(0, 100, 2, 2)', + importance: '@integer(1, 3)', + 'type|1': ['CN', 'US', 'JP', 'EU'], + 'status|1': ['published', 'draft'], + display_time: '@datetime', + comment_disabled: true, + pageviews: '@integer(300, 5000)', + image_uri, + platforms: ['a-platform'] + })) +} + +module.exports = [ + { + url: '/vue-element-admin/article/list', + type: 'get', + response: config => { + const { importance, type, title, page = 1, limit = 20, sort } = config.query + + let mockList = List.filter(item => { + if (importance && item.importance !== +importance) return false + if (type && item.type !== type) return false + if (title && item.title.indexOf(title) < 0) return false + return true + }) + + if (sort === '-id') { + mockList = mockList.reverse() + } + + const pageList = mockList.filter((item, index) => index < limit * page && index >= limit * (page - 1)) + + return { + code: 20000, + data: { + total: mockList.length, + items: pageList + } + } + } + }, + + { + url: '/vue-element-admin/article/detail', + type: 'get', + response: config => { + const { id } = config.query + for (const article of List) { + if (article.id === +id) { + return { + code: 20000, + data: article + } + } + } + } + }, + + { + url: '/vue-element-admin/article/pv', + type: 'get', + response: _ => { + return { + code: 20000, + data: { + pvData: [ + { key: 'PC', pv: 1024 }, + { key: 'mobile', pv: 1024 }, + { key: 'ios', pv: 1024 }, + { key: 'android', pv: 1024 } + ] + } + } + } + }, + + { + url: '/vue-element-admin/article/create', + type: 'post', + response: _ => { + return { + code: 20000, + data: 'success' + } + } + }, + + { + url: '/vue-element-admin/article/update', + type: 'post', + response: _ => { + return { + code: 20000, + data: 'success' + } + } + } +] + diff --git a/mock/index.js b/mock/index.js new file mode 100644 index 0000000..2eed65d --- /dev/null +++ b/mock/index.js @@ -0,0 +1,60 @@ +const Mock = require('mockjs') +const { param2Obj } = require('./utils') + +const user = require('./user') +const role = require('./role') +const article = require('./article') +const search = require('./remote-search') + +const mocks = [ + ...user, + ...role, + ...article, + ...search +] + +// for front mock +// please use it cautiously, it will redefine XMLHttpRequest, +// which will cause many of your third-party libraries to be invalidated(like progress event). +function mockXHR() { + // mock patch + // https://github.com/nuysoft/Mock/issues/300 + Mock.XHR.prototype.proxy_send = Mock.XHR.prototype.send + Mock.XHR.prototype.send = function() { + if (this.custom.xhr) { + this.custom.xhr.withCredentials = this.withCredentials || false + + if (this.responseType) { + this.custom.xhr.responseType = this.responseType + } + } + this.proxy_send(...arguments) + } + + function XHR2ExpressReqWrap(respond) { + return function(options) { + let result = null + if (respond instanceof Function) { + const { body, type, url } = options + // https://expressjs.com/en/4x/api.html#req + result = respond({ + method: type, + body: JSON.parse(body), + query: param2Obj(url) + }) + } else { + result = respond + } + return Mock.mock(result) + } + } + + for (const i of mocks) { + Mock.mock(new RegExp(i.url), i.type || 'get', XHR2ExpressReqWrap(i.response)) + } +} + +module.exports = { + mocks, + mockXHR +} diff --git a/mock/mock-server.js b/mock/mock-server.js new file mode 100644 index 0000000..8941ec0 --- /dev/null +++ b/mock/mock-server.js @@ -0,0 +1,81 @@ +const chokidar = require('chokidar') +const bodyParser = require('body-parser') +const chalk = require('chalk') +const path = require('path') +const Mock = require('mockjs') + +const mockDir = path.join(process.cwd(), 'mock') + +function registerRoutes(app) { + let mockLastIndex + const { mocks } = require('./index.js') + const mocksForServer = mocks.map(route => { + return responseFake(route.url, route.type, route.response) + }) + for (const mock of mocksForServer) { + app[mock.type](mock.url, mock.response) + mockLastIndex = app._router.stack.length + } + const mockRoutesLength = Object.keys(mocksForServer).length + return { + mockRoutesLength: mockRoutesLength, + mockStartIndex: mockLastIndex - mockRoutesLength + } +} + +function unregisterRoutes() { + Object.keys(require.cache).forEach(i => { + if (i.includes(mockDir)) { + delete require.cache[require.resolve(i)] + } + }) +} + +// for mock server +const responseFake = (url, type, respond) => { + return { + url: new RegExp(`${process.env.VUE_APP_BASE_API}${url}`), + type: type || 'get', + response(req, res) { + console.log('request invoke:' + req.path) + res.json(Mock.mock(respond instanceof Function ? respond(req, res) : respond)) + } + } +} + +module.exports = app => { + // parse app.body + // https://expressjs.com/en/4x/api.html#req.body + app.use(bodyParser.json()) + app.use(bodyParser.urlencoded({ + extended: true + })) + + const mockRoutes = registerRoutes(app) + var mockRoutesLength = mockRoutes.mockRoutesLength + var mockStartIndex = mockRoutes.mockStartIndex + + // watch files, hot reload mock server + chokidar.watch(mockDir, { + ignored: /mock-server/, + ignoreInitial: true + }).on('all', (event, path) => { + if (event === 'change' || event === 'add') { + try { + // remove mock routes stack + app._router.stack.splice(mockStartIndex, mockRoutesLength) + + // clear routes cache + unregisterRoutes() + + const mockRoutes = registerRoutes(app) + mockRoutesLength = mockRoutes.mockRoutesLength + mockStartIndex = mockRoutes.mockStartIndex + + console.log(chalk.magentaBright(`\n > Mock Server hot reload success! changed ${path}`)) + } catch (error) { + console.log(chalk.redBright(error)) + } + } + }) +} diff --git a/mock/remote-search.js b/mock/remote-search.js new file mode 100644 index 0000000..8fc4926 --- /dev/null +++ b/mock/remote-search.js @@ -0,0 +1,51 @@ +const Mock = require('mockjs') + +const NameList = [] +const count = 100 + +for (let i = 0; i < count; i++) { + NameList.push(Mock.mock({ + name: '@first' + })) +} +NameList.push({ name: 'mock-Pan' }) + +module.exports = [ + // username search + { + url: '/vue-element-admin/search/user', + type: 'get', + response: config => { + const { name } = config.query + const mockNameList = NameList.filter(item => { + const lowerCaseName = item.name.toLowerCase() + return !(name && lowerCaseName.indexOf(name.toLowerCase()) < 0) + }) + return { + code: 20000, + data: { items: mockNameList } + } + } + }, + + // transaction list + { + url: '/vue-element-admin/transaction/list', + type: 'get', + response: _ => { + return { + code: 20000, + data: { + total: 20, + 'items|20': [{ + order_no: '@guid()', + timestamp: +Mock.Random.date('T'), + username: '@name()', + price: '@float(1000, 15000, 0, 2)', + 'status|1': ['success', 'pending'] + }] + } + } + } + } +] diff --git a/mock/role/index.js b/mock/role/index.js new file mode 100644 index 0000000..4643f00 --- /dev/null +++ b/mock/role/index.js @@ -0,0 +1,98 @@ +const Mock = require('mockjs') +const { deepClone } = require('../utils') +const { asyncRoutes, constantRoutes } = require('./routes.js') + +const routes = deepClone([...constantRoutes, ...asyncRoutes]) + +const roles = [ + { + key: 'admin', + name: 'admin', + description: 'Super Administrator. Have access to view all pages.', + routes: routes + }, + { + key: 'editor', + name: 'editor', + description: 'Normal Editor. Can see all pages except permission page', + routes: routes.filter(i => i.path !== '/permission')// just a mock + }, + { + key: 'visitor', + name: 'visitor', + description: 'Just a visitor. Can only see the home page and the document page', + routes: [{ + path: '', + redirect: 'dashboard', + children: [ + { + path: 'dashboard', + name: 'Dashboard', + meta: { title: 'dashboard', icon: 'dashboard' } + } + ] + }] + } +] + +module.exports = [ + // mock get all routes form server + { + url: '/vue-element-admin/routes', + type: 'get', + response: _ => { + return { + code: 20000, + data: routes + } + } + }, + + // mock get all roles form server + { + url: '/vue-element-admin/roles', + type: 'get', + response: _ => { + return { + code: 20000, + data: roles + } + } + }, + + // add role + { + url: '/vue-element-admin/role', + type: 'post', + response: { + code: 20000, + data: { + key: Mock.mock('@integer(300, 5000)') + } + } + }, + + // update role + { + url: '/vue-element-admin/role/[A-Za-z0-9]', + type: 'put', + response: { + code: 20000, + data: { + status: 'success' + } + } + }, + + // delete role + { + url: '/vue-element-admin/role/[A-Za-z0-9]', + type: 'delete', + response: { + code: 20000, + data: { + status: 'success' + } + } + } +] diff --git a/mock/role/routes.js b/mock/role/routes.js new file mode 100644 index 0000000..d33f162 --- /dev/null +++ b/mock/role/routes.js @@ -0,0 +1,530 @@ +// Just a mock data + +const constantRoutes = [ + { + path: '/redirect', + component: 'layout/Layout', + hidden: true, + children: [ + { + path: '/redirect/:path*', + component: 'views/redirect/index' + } + ] + }, + { + path: '/login', + component: 'views/login/index', + hidden: true + }, + { + path: '/auth-redirect', + component: 'views/login/auth-redirect', + hidden: true + }, + { + path: '/404', + component: 'views/error-page/404', + hidden: true + }, + { + path: '/401', + component: 'views/error-page/401', + hidden: true + }, + { + path: '', + component: 'layout/Layout', + redirect: 'dashboard', + children: [ + { + path: 'dashboard', + component: 'views/dashboard/index', + name: 'Dashboard', + meta: { title: 'Dashboard', icon: 'dashboard', affix: true } + } + ] + }, + { + path: '/documentation', + component: 'layout/Layout', + children: [ + { + path: 'index', + component: 'views/documentation/index', + name: 'Documentation', + meta: { title: 'Documentation', icon: 'documentation', affix: true } + } + ] + }, + { + path: '/guide', + component: 'layout/Layout', + redirect: '/guide/index', + children: [ + { + path: 'index', + component: 'views/guide/index', + name: 'Guide', + meta: { title: 'Guide', icon: 'guide', noCache: true } + } + ] + } +] + +const asyncRoutes = [ + { + path: '/permission', + component: 'layout/Layout', + redirect: '/permission/index', + alwaysShow: true, + meta: { + title: 'Permission', + icon: 'lock', + roles: ['admin', 'editor'] + }, + children: [ + { + path: 'page', + component: 'views/permission/page', + name: 'PagePermission', + meta: { + title: 'Page Permission', + roles: ['admin'] + } + }, + { + path: 'directive', + component: 'views/permission/directive', + name: 'DirectivePermission', + meta: { + title: 'Directive Permission' + } + }, + { + path: 'role', + component: 'views/permission/role', + name: 'RolePermission', + meta: { + title: 'Role Permission', + roles: ['admin'] + } + } + ] + }, + + { + path: '/icon', + component: 'layout/Layout', + children: [ + { + path: 'index', + component: 'views/icons/index', + name: 'Icons', + meta: { title: 'Icons', icon: 'icon', noCache: true } + } + ] + }, + + { + path: '/components', + component: 'layout/Layout', + redirect: 'noRedirect', + name: 'ComponentDemo', + meta: { + title: 'Components', + icon: 'component' + }, + children: [ + { + path: 'tinymce', + component: 'views/components-demo/tinymce', + name: 'TinymceDemo', + meta: { title: 'Tinymce' } + }, + { + path: 'markdown', + component: 'views/components-demo/markdown', + name: 'MarkdownDemo', + meta: { title: 'Markdown' } + }, + { + path: 'json-editor', + component: 'views/components-demo/json-editor', + name: 'JsonEditorDemo', + meta: { title: 'Json Editor' } + }, + { + path: 'split-pane', + component: 'views/components-demo/split-pane', + name: 'SplitpaneDemo', + meta: { title: 'SplitPane' } + }, + { + path: 'avatar-upload', + component: 'views/components-demo/avatar-upload', + name: 'AvatarUploadDemo', + meta: { title: 'Avatar Upload' } + }, + { + path: 'dropzone', + component: 'views/components-demo/dropzone', + name: 'DropzoneDemo', + meta: { title: 'Dropzone' } + }, + { + path: 'sticky', + component: 'views/components-demo/sticky', + name: 'StickyDemo', + meta: { title: 'Sticky' } + }, + { + path: 'count-to', + component: 'views/components-demo/count-to', + name: 'CountToDemo', + meta: { title: 'Count To' } + }, + { + path: 'mixin', + component: 'views/components-demo/mixin', + name: 'ComponentMixinDemo', + meta: { title: 'componentMixin' } + }, + { + path: 'back-to-top', + component: 'views/components-demo/back-to-top', + name: 'BackToTopDemo', + meta: { title: 'Back To Top' } + }, + { + path: 'drag-dialog', + component: 'views/components-demo/drag-dialog', + name: 'DragDialogDemo', + meta: { title: 'Drag Dialog' } + }, + { + path: 'drag-select', + component: 'views/components-demo/drag-select', + name: 'DragSelectDemo', + meta: { title: 'Drag Select' } + }, + { + path: 'dnd-list', + component: 'views/components-demo/dnd-list', + name: 'DndListDemo', + meta: { title: 'Dnd List' } + }, + { + path: 'drag-kanban', + component: 'views/components-demo/drag-kanban', + name: 'DragKanbanDemo', + meta: { title: 'Drag Kanban' } + } + ] + }, + { + path: '/charts', + component: 'layout/Layout', + redirect: 'noRedirect', + name: 'Charts', + meta: { + title: 'Charts', + icon: 'chart' + }, + children: [ + { + path: 'keyboard', + component: 'views/charts/keyboard', + name: 'KeyboardChart', + meta: { title: 'Keyboard Chart', noCache: true } + }, + { + path: 'line', + component: 'views/charts/line', + name: 'LineChart', + meta: { title: 'Line Chart', noCache: true } + }, + { + path: 'mixchart', + component: 'views/charts/mixChart', + name: 'MixChart', + meta: { title: 'Mix Chart', noCache: true } + } + ] + }, + { + path: '/nested', + component: 'layout/Layout', + redirect: '/nested/menu1/menu1-1', + name: 'Nested', + meta: { + title: 'Nested', + icon: 'nested' + }, + children: [ + { + path: 'menu1', + component: 'views/nested/menu1/index', + name: 'Menu1', + meta: { title: 'Menu1' }, + redirect: '/nested/menu1/menu1-1', + children: [ + { + path: 'menu1-1', + component: 'views/nested/menu1/menu1-1', + name: 'Menu1-1', + meta: { title: 'Menu1-1' } + }, + { + path: 'menu1-2', + component: 'views/nested/menu1/menu1-2', + name: 'Menu1-2', + redirect: '/nested/menu1/menu1-2/menu1-2-1', + meta: { title: 'Menu1-2' }, + children: [ + { + path: 'menu1-2-1', + component: 'views/nested/menu1/menu1-2/menu1-2-1', + name: 'Menu1-2-1', + meta: { title: 'Menu1-2-1' } + }, + { + path: 'menu1-2-2', + component: 'views/nested/menu1/menu1-2/menu1-2-2', + name: 'Menu1-2-2', + meta: { title: 'Menu1-2-2' } + } + ] + }, + { + path: 'menu1-3', + component: 'views/nested/menu1/menu1-3', + name: 'Menu1-3', + meta: { title: 'Menu1-3' } + } + ] + }, + { + path: 'menu2', + name: 'Menu2', + component: 'views/nested/menu2/index', + meta: { title: 'Menu2' } + } + ] + }, + + { + path: '/example', + component: 'layout/Layout', + redirect: '/example/list', + name: 'Example', + meta: { + title: 'Example', + icon: 'example' + }, + children: [ + { + path: 'create', + component: 'views/example/create', + name: 'CreateArticle', + meta: { title: 'Create Article', icon: 'edit' } + }, + { + path: 'edit/:id(\\d+)', + component: 'views/example/edit', + name: 'EditArticle', + meta: { title: 'Edit Article', noCache: true }, + hidden: true + }, + { + path: 'list', + component: 'views/example/list', + name: 'ArticleList', + meta: { title: 'Article List', icon: 'list' } + } + ] + }, + + { + path: '/tab', + component: 'layout/Layout', + children: [ + { + path: 'index', + component: 'views/tab/index', + name: 'Tab', + meta: { title: 'Tab', icon: 'tab' } + } + ] + }, + + { + path: '/error', + component: 'layout/Layout', + redirect: 'noRedirect', + name: 'ErrorPages', + meta: { + title: 'Error Pages', + icon: '404' + }, + children: [ + { + path: '401', + component: 'views/error-page/401', + name: 'Page401', + meta: { title: 'Page 401', noCache: true } + }, + { + path: '404', + component: 'views/error-page/404', + name: 'Page404', + meta: { title: 'Page 404', noCache: true } + } + ] + }, + + { + path: '/error-log', + component: 'layout/Layout', + redirect: 'noRedirect', + children: [ + { + path: 'log', + component: 'views/error-log/index', + name: 'ErrorLog', + meta: { title: 'Error Log', icon: 'bug' } + } + ] + }, + + { + path: '/excel', + component: 'layout/Layout', + redirect: '/excel/export-excel', + name: 'Excel', + meta: { + title: 'Excel', + icon: 'excel' + }, + children: [ + { + path: 'export-excel', + component: 'views/excel/export-excel', + name: 'ExportExcel', + meta: { title: 'Export Excel' } + }, + { + path: 'export-selected-excel', + component: 'views/excel/select-excel', + name: 'SelectExcel', + meta: { title: 'Select Excel' } + }, + { + path: 'export-merge-header', + component: 'views/excel/merge-header', + name: 'MergeHeader', + meta: { title: 'Merge Header' } + }, + { + path: 'upload-excel', + component: 'views/excel/upload-excel', + name: 'UploadExcel', + meta: { title: 'Upload Excel' } + } + ] + }, + + { + path: '/zip', + component: 'layout/Layout', + redirect: '/zip/download', + alwaysShow: true, + meta: { title: 'Zip', icon: 'zip' }, + children: [ + { + path: 'download', + component: 'views/zip/index', + name: 'ExportZip', + meta: { title: 'Export Zip' } + } + ] + }, + + { + path: '/pdf', + component: 'layout/Layout', + redirect: '/pdf/index', + children: [ + { + path: 'index', + component: 'views/pdf/index', + name: 'PDF', + meta: { title: 'PDF', icon: 'pdf' } + } + ] + }, + { + path: '/pdf/download', + component: 'views/pdf/download', + hidden: true + }, + + { + path: '/theme', + component: 'layout/Layout', + redirect: 'noRedirect', + children: [ + { + path: 'index', + component: 'views/theme/index', + name: 'Theme', + meta: { title: 'Theme', icon: 'theme' } + } + ] + }, + + { + path: '/clipboard', + component: 'layout/Layout', + redirect: 'noRedirect', + children: [ + { + path: 'index', + component: 'views/clipboard/index', + name: 'ClipboardDemo', + meta: { title: 'Clipboard Demo', icon: 'clipboard' } + } + ] + }, + + { + path: '/i18n', + component: 'layout/Layout', + children: [ + { + path: 'index', + component: 'views/i18n-demo/index', + name: 'I18n', + meta: { title: 'I18n', icon: 'international' } + } + ] + }, + + { + path: 'external-link', + component: 'layout/Layout', + children: [ + { + path: 'https://github.com/PanJiaChen/vue-element-admin', + meta: { title: 'External Link', icon: 'link' } + } + ] + }, + + { path: '*', redirect: '/404', hidden: true } +] + +module.exports = { + constantRoutes, + asyncRoutes +} diff --git a/mock/user.js b/mock/user.js new file mode 100644 index 0000000..d82e079 --- /dev/null +++ b/mock/user.js @@ -0,0 +1,84 @@ + +const tokens = { + admin: { + token: 'admin-token' + }, + editor: { + token: 'editor-token' + } +} + +const users = { + 'admin-token': { + roles: ['admin'], + introduction: 'I am a super administrator', + avatar: 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif', + name: 'Super Admin' + }, + 'editor-token': { + roles: ['editor'], + introduction: 'I am an editor', + avatar: 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif', + name: 'Normal Editor' + } +} + +module.exports = [ + // user login + { + url: '/vue-element-admin/user/login', + type: 'post', + response: config => { + const { username } = config.body + const token = tokens[username] + + // mock error + if (!token) { + return { + code: 60204, + message: 'Account and password are incorrect.' + } + } + + return { + code: 20000, + data: token + } + } + }, + + // get user info + { + url: '/vue-element-admin/user/info\.*', + type: 'get', + response: config => { + const { token } = config.query + const info = users[token] + + // mock error + if (!info) { + return { + code: 50008, + message: 'Login failed, unable to get user details.' + } + } + + return { + code: 20000, + data: info + } + } + }, + + // user logout + { + url: '/vue-element-admin/user/logout', + type: 'post', + response: _ => { + return { + code: 20000, + data: 'success' + } + } + } +] diff --git a/mock/utils.js b/mock/utils.js new file mode 100644 index 0000000..f909a29 --- /dev/null +++ b/mock/utils.js @@ -0,0 +1,48 @@ +/** + * @param {string} url + * @returns {Object} + */ +function param2Obj(url) { + const search = decodeURIComponent(url.split('?')[1]).replace(/\+/g, ' ') + if (!search) { + return {} + } + const obj = {} + const searchArr = search.split('&') + searchArr.forEach(v => { + const index = v.indexOf('=') + if (index !== -1) { + const name = v.substring(0, index) + const val = v.substring(index + 1, v.length) + obj[name] = val + } + }) + return obj +} + +/** + * This is just a simple version of deep copy + * Has a lot of edge cases bug + * If you want to use a perfect deep copy, use lodash's _.cloneDeep + * @param {Object} source + * @returns {Object} + */ +function deepClone(source) { + if (!source && typeof source !== 'object') { + throw new Error('error arguments', 'deepClone') + } + const targetObj = source.constructor === Array ? [] : {} + Object.keys(source).forEach(keys => { + if (source[keys] && typeof source[keys] === 'object') { + targetObj[keys] = deepClone(source[keys]) + } else { + targetObj[keys] = source[keys] + } + }) + return targetObj +} + +module.exports = { + param2Obj, + deepClone +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..02f68e2 --- /dev/null +++ b/package.json @@ -0,0 +1,111 @@ +{ + "name": "vue-element-admin", + "version": "4.4.0", + "description": "A magical vue admin. An out-of-box UI solution for enterprise applications. Newest development stack of vue. Lots of awesome features", + "author": "Pan ", + "scripts": { + "dev": "vue-cli-service serve", + "lint": "eslint --ext .js,.vue src", + "build:prod": "vue-cli-service build", + "build:stage": "vue-cli-service build --mode staging", + "preview": "node build/index.js --preview", + "new": "plop", + "svgo": "svgo -f src/icons/svg --config=src/icons/svgo.yml", + "test:unit": "jest --clearCache && vue-cli-service test:unit", + "test:ci": "npm run lint && npm run test:unit" + }, + "dependencies": { + "axios": "0.18.1", + "clipboard": "2.0.4", + "codemirror": "5.45.0", + "core-js": "3.6.5", + "driver.js": "0.9.5", + "dropzone": "5.5.1", + "echarts": "4.2.1", + "element-ui": "2.13.2", + "file-saver": "2.0.1", + "fuse.js": "3.4.4", + "js-cookie": "2.2.0", + "jsonlint": "1.6.3", + "jszip": "3.2.1", + "normalize.css": "7.0.0", + "nprogress": "0.2.0", + "path-to-regexp": "2.4.0", + "screenfull": "4.2.0", + "script-loader": "0.7.2", + "sortablejs": "1.8.4", + "tui-editor": "1.3.3", + "vue": "2.6.10", + "vue-count-to": "1.0.13", + "vue-router": "3.0.2", + "vue-splitpane": "1.0.4", + "vuedraggable": "2.20.0", + "vuex": "3.1.0", + "xlsx": "0.14.1" + }, + "devDependencies": { + "@vue/cli-plugin-babel": "4.4.4", + "@vue/cli-plugin-eslint": "4.4.4", + "@vue/cli-plugin-unit-jest": "4.4.4", + "@vue/cli-service": "4.4.4", + "@vue/test-utils": "1.0.0-beta.29", + "autoprefixer": "9.5.1", + "babel-eslint": "10.1.0", + "babel-jest": "23.6.0", + "babel-plugin-dynamic-import-node": "2.3.3", + "chalk": "2.4.2", + "chokidar": "2.1.5", + "connect": "3.6.6", + "eslint": "6.7.2", + "eslint-plugin-vue": "6.2.2", + "html-webpack-plugin": "3.2.0", + "husky": "1.3.1", + "lint-staged": "8.1.5", + "mockjs": "1.0.1-beta3", + "plop": "2.3.0", + "runjs": "4.3.2", + "sass": "1.26.2", + "sass-loader": "8.0.2", + "script-ext-html-webpack-plugin": "2.1.3", + "serve-static": "1.13.2", + "svg-sprite-loader": "4.1.3", + "svgo": "1.2.0", + "vue-template-compiler": "2.6.10" + }, + "browserslist": [ + "> 1%", + "last 2 versions" + ], + "bugs": { + "url": "https://github.com/PanJiaChen/vue-element-admin/issues" + }, + "engines": { + "node": ">=8.9", + "npm": ">= 3.0.0" + }, + "keywords": [ + "vue", + "admin", + "dashboard", + "element-ui", + "boilerplate", + "admin-template", + "management-system" + ], + "license": "MIT", + "lint-staged": { + "src/**/*.{js,vue}": [ + "eslint --fix", + "git add" + ] + }, + "husky": { + "hooks": { + "pre-commit": "lint-staged" + } + }, + "repository": { + "type": "git", + "url": "git+https://github.com/PanJiaChen/vue-element-admin.git" + } +} diff --git a/plop-templates/component/index.hbs b/plop-templates/component/index.hbs new file mode 100644 index 0000000..7661055 --- /dev/null +++ b/plop-templates/component/index.hbs @@ -0,0 +1,26 @@ +{{#if template}} + +{{/if}} + +{{#if script}} + +{{/if}} + +{{#if style}} + +{{/if}} diff --git a/plop-templates/component/prompt.js b/plop-templates/component/prompt.js new file mode 100644 index 0000000..3723e8e --- /dev/null +++ b/plop-templates/component/prompt.js @@ -0,0 +1,55 @@ +const { notEmpty } = require('../utils.js') + +module.exports = { + description: 'generate vue component', + prompts: [{ + type: 'input', + name: 'name', + message: 'component name please', + validate: notEmpty('name') + }, + { + type: 'checkbox', + name: 'blocks', + message: 'Blocks:', + choices: [{ + name: '