From b9fcd6a24929402f34d509a0f075e5cc9d1b377b Mon Sep 17 00:00:00 2001
From: hucan <951870319@qq.com>
Date: Sat, 12 Jul 2025 15:29:26 +0800
Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E5=88=9D=E5=A7=8B=E5=8C=96=E9=A1=B9?=
 =?UTF-8?q?=E7=9B=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
 .editorconfig                                 |   14 +
 .env.development                              |    6 +
 .env.production                               |    6 +
 .env.staging                                  |    8 +
 .eslintignore                                 |    4 +
 .eslintrc.js                                  |  198 ++
 .gitignore                                    |   23 +
 .npmrc                                        |    4 +
 .travis.yml                                   |    5 +
 Dockerfile                                    |   14 +
 LICENSE                                       |   21 +
 README.Zh-cn.md                               |  289 +++
 README.md                                     |  276 +++
 babel.config.js                               |   10 +
 build/index.js                                |   35 +
 jest.config.js                                |   24 +
 jsconfig.json                                 |    9 +
 package.json                                  |  140 ++
 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                       |    9 +
 plop-templates/view/index.hbs                 |   26 +
 plop-templates/view/prompt.js                 |   55 +
 plopfile.js                                   |    9 +
 postcss.config.js                             |    5 +
 public/favicon.ico                            |  Bin 0 -> 3628 bytes
 public/index.html                             |  219 ++
 scripts/k8s/default.conf                      |   56 +
 scripts/k8s/deploy.yml                        |   51 +
 scripts/k8s/prerun.sh                         |    3 +
 src/App.vue                                   |   23 +
 src/api/admin/dict/data.js                    |   62 +
 src/api/admin/dict/type.js                    |   62 +
 src/api/admin/member-balance.js               |   47 +
 src/api/admin/member-proxy.js                 |   47 +
 src/api/admin/member-recharge.js              |   47 +
 src/api/admin/sys-api.js                      |   46 +
 src/api/admin/sys-config.js                   |   68 +
 src/api/admin/sys-dept.js                     |   60 +
 src/api/admin/sys-login-log.js                |   28 +
 src/api/admin/sys-menu.js                     |   61 +
 src/api/admin/sys-opera-log.js                |   28 +
 src/api/admin/sys-post.js                     |   46 +
 src/api/admin/sys-role.js                     |   88 +
 src/api/admin/sys-user.js                     |  135 ++
 src/api/job/sys-job.js                        |   62 +
 src/api/login.js                              |   17 +
 src/api/monitor/server.js                     |    9 +
 src/api/remote-search.js                      |   17 +
 src/api/schedule.js                           |   43 +
 src/api/table.js                              |   20 +
 src/api/tools/gen.js                          |  103 +
 src/api/user.js                               |   36 +
 src/api/ws.js                                 |    9 +
 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/assets/dark.svg                           |   39 +
 src/assets/icons/12-01.png                    |  Bin 0 -> 5803 bytes
 src/assets/icons/AU-01.png                    |  Bin 0 -> 4392 bytes
 src/assets/icons/Access.png                   |  Bin 0 -> 9540 bytes
 src/assets/icons/AndroidStudio.png            |  Bin 0 -> 18002 bytes
 src/assets/icons/Awesome.png                  |  Bin 0 -> 12866 bytes
 src/assets/icons/AwesomeVue.png               |  Bin 0 -> 18311 bytes
 src/assets/icons/Clion-01-01.png              |  Bin 0 -> 14936 bytes
 src/assets/icons/Dm-01-01.png                 |  Bin 0 -> 2317 bytes
 src/assets/icons/Edge-01.png                  |  Bin 0 -> 17851 bytes
 src/assets/icons/Excel.png                    |  Bin 0 -> 6001 bytes
 src/assets/icons/Ic-01.png                    |  Bin 0 -> 4359 bytes
 src/assets/icons/Idea.png                     |  Bin 0 -> 13018 bytes
 src/assets/icons/Link.png                     |  Bin 0 -> 5251 bytes
 src/assets/icons/OneDrive.png                 |  Bin 0 -> 8313 bytes
 src/assets/icons/OneNote.png                  |  Bin 0 -> 4817 bytes
 src/assets/icons/PDFbeifen.png                |  Bin 0 -> 5272 bytes
 src/assets/icons/Phpstorm-01.png              |  Bin 0 -> 13873 bytes
 src/assets/icons/PictureUnknow.png            |  Bin 0 -> 4681 bytes
 src/assets/icons/Pictureloadingfailed.png     |  Bin 0 -> 5584 bytes
 src/assets/icons/Pl-01.png                    |  Bin 0 -> 3043 bytes
 src/assets/icons/Pn-01.png                    |  Bin 0 -> 3896 bytes
 src/assets/icons/PowerPoint.png               |  Bin 0 -> 8713 bytes
 src/assets/icons/PowerShell.png               |  Bin 0 -> 12383 bytes
 src/assets/icons/Pycharm.png                  |  Bin 0 -> 14542 bytes
 src/assets/icons/Typora.png                   |  Bin 0 -> 10340 bytes
 src/assets/icons/UTools.png                   |  Bin 0 -> 10287 bytes
 src/assets/icons/Unknow.png                   |  Bin 0 -> 5028 bytes
 src/assets/icons/Visio.png                    |  Bin 0 -> 7847 bytes
 src/assets/icons/VisualStudio.png             |  Bin 0 -> 14959 bytes
 src/assets/icons/Web.png                      |  Bin 0 -> 7998 bytes
 src/assets/icons/Webstorm.png                 |  Bin 0 -> 16234 bytes
 src/assets/icons/Windows.png                  |  Bin 0 -> 8300 bytes
 src/assets/icons/WindowsTerminal_PRE-01.png   |  Bin 0 -> 6972 bytes
 src/assets/icons/Word.png                     |  Bin 0 -> 5714 bytes
 src/assets/icons/Wordbeifen.png               |  Bin 0 -> 5664 bytes
 src/assets/icons/Zip.png                      |  Bin 0 -> 4452 bytes
 src/assets/icons/adobe-01-01-01.png           |  Bin 0 -> 7168 bytes
 src/assets/icons/bianxingjingang.png          |  Bin 0 -> 24075 bytes
 src/assets/icons/bianxingjingang1.png         |  Bin 0 -> 27364 bytes
 src/assets/icons/chayue2.png                  |  Bin 0 -> 6963 bytes
 src/assets/icons/daiyue.png                   |  Bin 0 -> 10512 bytes
 src/assets/icons/excelbeifen.png              |  Bin 0 -> 5662 bytes
 src/assets/icons/fl-01-01.png                 |  Bin 0 -> 4318 bytes
 src/assets/icons/nasa.png                     |  Bin 0 -> 26819 bytes
 src/assets/icons/pf-01.png                    |  Bin 0 -> 3573 bytes
 src/assets/icons/picture.png                  |  Bin 0 -> 8674 bytes
 src/assets/icons/pptbeifen.png                |  Bin 0 -> 4344 bytes
 src/assets/icons/rar.png                      |  Bin 0 -> 4036 bytes
 src/assets/icons/tubiaozhizuomo3-01.png       |  Bin 0 -> 3717 bytes
 src/assets/icons/tubiaozhizuomoban-01.png     |  Bin 0 -> 7755 bytes
 src/assets/icons/tubiaozhizuomoban10-01.png   |  Bin 0 -> 4288 bytes
 src/assets/icons/tubiaozhizuomoban11.png      |  Bin 0 -> 5099 bytes
 src/assets/icons/tubiaozhizuomoban2-01-01.png |  Bin 0 -> 3622 bytes
 src/assets/icons/tubiaozhizuomoban4-01.png    |  Bin 0 -> 8535 bytes
 src/assets/icons/tubiaozhizuomoban5-01.png    |  Bin 0 -> 6314 bytes
 src/assets/icons/tubiaozhizuomoban6-01.png    |  Bin 0 -> 3580 bytes
 src/assets/icons/tubiaozhizuomoban7-01-01.png |  Bin 0 -> 3991 bytes
 src/assets/icons/tubiaozhizuomoban8-01.png    |  Bin 0 -> 2515 bytes
 src/assets/icons/tubiaozhizuomoban9-01.png    |  Bin 0 -> 6378 bytes
 src/assets/icons/txtbeifen.png                |  Bin 0 -> 5227 bytes
 src/assets/icons/video.png                    |  Bin 0 -> 3884 bytes
 src/assets/icons/video2.png                   |  Bin 0 -> 5747 bytes
 src/assets/icons/voice.png                    |  Bin 0 -> 5143 bytes
 src/assets/icons/wendang.png                  |  Bin 0 -> 4361 bytes
 src/assets/icons/wenjianjia.png               |  Bin 0 -> 3499 bytes
 src/assets/light.svg                          |   39 +
 src/assets/login.png                          |  Bin 0 -> 30551 bytes
 src/assets/logo/logo.png                      |  Bin 0 -> 7211 bytes
 src/assets/particles.json                     |  110 +
 src/components/BackToTop/index.vue            |  111 +
 src/components/Bar.vue                        |   67 +
 src/components/Breadcrumb/index.vue           |   82 +
 src/components/Cell/index.vue                 |   93 +
 src/components/ChartCard/index.vue            |  114 ++
 src/components/Charts/Keyboard.vue            |  155 ++
 src/components/Charts/LineMarker.vue          |  227 +++
 src/components/Charts/MixChart.vue            |  271 +++
 src/components/Charts/mixins/resize.js        |   34 +
 src/components/CustomDialog/index.vue         |   90 +
 src/components/DndList/index.vue              |  166 ++
 src/components/DragColumn/index.vue           |  137 ++
 src/components/DragSelect/index.vue           |   61 +
 src/components/Dropzone/index.vue             |  297 +++
 src/components/ErrorLog/index.vue             |   78 +
 src/components/FormGenParser/Parser.vue       |  193 ++
 src/components/FormGenRender/render.js        |  122 ++
 .../FormGenRender/slots/el-button.js          |    5 +
 .../FormGenRender/slots/el-checkbox-group.js  |   13 +
 .../FormGenRender/slots/el-input.js           |    8 +
 .../FormGenRender/slots/el-radio-group.js     |   13 +
 .../FormGenRender/slots/el-select.js          |    9 +
 .../FormGenRender/slots/el-upload.js          |   17 +
 src/components/GithubCorner/index.vue         |   54 +
 src/components/Go-Admin/Doc/index.vue         |   21 +
 src/components/Go-Admin/Donate/index.vue      |   21 +
 src/components/Go-Admin/Git/index.vue         |   21 +
 src/components/Hamburger/index.vue            |   44 +
 src/components/HeaderSearch/index.vue         |  180 ++
 src/components/IconSelect/index.vue           |   68 +
 src/components/IconSelect/requireIcons.js     |   10 +
 src/components/ImageCropper/index.vue         | 1778 +++++++++++++++++
 .../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/Kanban/index.vue               |   99 +
 src/components/MDinput/index.vue              |  360 ++++
 src/components/MiniArea/index.vue             |   65 +
 src/components/MiniBar/index.vue              |   65 +
 src/components/MiniProgress/index.vue         |   71 +
 src/components/Pagination/index.vue           |  101 +
 src/components/PanThumb/index.vue             |  142 ++
 src/components/RankList/index.vue             |   69 +
 src/components/RightPanel/index.vue           |  145 ++
 src/components/Screenfull/index.vue           |   60 +
 src/components/Share/DropdownMenu.vue         |  100 +
 src/components/SizeSelect/index.vue           |   57 +
 src/components/Sticky/index.vue               |   91 +
 src/components/SvgIcon/index.vue              |   60 +
 src/components/TextHoverEffect/Mallki.vue     |  113 ++
 src/components/ThemePicker/index.vue          |  172 ++
 .../Tinymce/components/EditorImage.vue        |   57 +
 src/components/Tinymce/dynamicLoadScript.js   |   59 +
 src/components/Tinymce/index.vue              |  245 +++
 src/components/Tinymce/plugins.js             |    7 +
 src/components/Tinymce/toolbar.js             |    6 +
 src/components/TopNav/index.vue               |  144 ++
 src/components/Trend/index.vue                |   62 +
 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/components/layout.vue                     |   26 +
 src/components/richtext.vue                   |   95 +
 src/components/tableAction.vue                |  322 +++
 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             |   17 +
 src/directive/permission/permisaction.js      |   23 +
 src/directive/permission/permission.js        |   22 +
 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/access.svg                      |    1 +
 src/icons/svg/add-db.svg                      |    1 +
 src/icons/svg/add-doc.svg                     |    1 +
 src/icons/svg/alarm-settings.svg              |    1 +
 src/icons/svg/api-ctl.svg                     |    1 +
 src/icons/svg/api-doc.svg                     |    1 +
 src/icons/svg/api-gateway.svg                 |    1 +
 src/icons/svg/api-monitor.svg                 |    1 +
 src/icons/svg/api-server.svg                  |    1 +
 src/icons/svg/api-test.svg                    |    1 +
 src/icons/svg/app-group-fill.svg              |    1 +
 src/icons/svg/archived.svg                    |    1 +
 src/icons/svg/base-info.svg                   |    1 +
 src/icons/svg/batch-update.svg                |    1 +
 src/icons/svg/bug.svg                         |    1 +
 src/icons/svg/build.svg                       |    1 +
 src/icons/svg/calendar.svg                    |   44 +
 src/icons/svg/cascader.svg                    |    1 +
 src/icons/svg/chart.svg                       |    1 +
 src/icons/svg/checkbox.svg                    |    1 +
 src/icons/svg/clipboard.svg                   |    1 +
 src/icons/svg/code.svg                        |    1 +
 src/icons/svg/color.svg                       |    1 +
 src/icons/svg/component.svg                   |    1 +
 src/icons/svg/dashboard.svg                   |    1 +
 src/icons/svg/date-range.svg                  |    1 +
 src/icons/svg/date.svg                        |    1 +
 src/icons/svg/db.svg                          |    1 +
 src/icons/svg/del.svg                         |    1 +
 src/icons/svg/dev-tools.svg                   |    1 +
 src/icons/svg/dict.svg                        |    1 +
 src/icons/svg/doc.svg                         |    1 +
 src/icons/svg/documentation.svg               |    1 +
 src/icons/svg/download.svg                    |    1 +
 src/icons/svg/drag copy.svg                   |    1 +
 src/icons/svg/drag.svg                        |    1 +
 src/icons/svg/druid.svg                       |    1 +
 src/icons/svg/edit.svg                        |    1 +
 src/icons/svg/education.svg                   |    1 +
 src/icons/svg/email.svg                       |    1 +
 src/icons/svg/err-list.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/github.svg                      |    1 +
 src/icons/svg/guide.svg                       |    1 +
 src/icons/svg/heart.svg                       |    1 +
 src/icons/svg/http-err.svg                    |    1 +
 src/icons/svg/icon.svg                        |    1 +
 src/icons/svg/info-setting.svg                |    1 +
 src/icons/svg/input.svg                       |    1 +
 src/icons/svg/intel.svg                       |    1 +
 src/icons/svg/international.svg               |    1 +
 src/icons/svg/job.svg                         |    1 +
 src/icons/svg/json-push.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/log.svg                         |    1 +
 src/icons/svg/logininfor.svg                  |    1 +
 src/icons/svg/map.svg                         |    1 +
 src/icons/svg/message.svg                     |    1 +
 src/icons/svg/money.svg                       |    1 +
 src/icons/svg/monitor.svg                     |    2 +
 src/icons/svg/nested.svg                      |    1 +
 src/icons/svg/network.svg                     |  131 ++
 src/icons/svg/next-page.svg                   |    1 +
 src/icons/svg/number.svg                      |    1 +
 src/icons/svg/online.svg                      |    1 +
 src/icons/svg/operators.svg                   |    1 +
 src/icons/svg/pass.svg                        |   68 +
 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/phone.svg                       |    1 +
 src/icons/svg/post.svg                        |    1 +
 src/icons/svg/project-group.svg               |    1 +
 src/icons/svg/project-manage.svg              |    1 +
 src/icons/svg/pwd.svg                         |    1 +
 src/icons/svg/qq.svg                          |    1 +
 src/icons/svg/question.svg                    |    1 +
 src/icons/svg/radio.svg                       |    1 +
 src/icons/svg/rate.svg                        |    1 +
 src/icons/svg/return-code-doc.svg             |    1 +
 src/icons/svg/return-code.svg                 |    1 +
 src/icons/svg/root-addr.svg                   |    1 +
 src/icons/svg/row.svg                         |    1 +
 src/icons/svg/safety.svg                      |    1 +
 src/icons/svg/scene.svg                       |    1 +
 src/icons/svg/search.svg                      |    1 +
 src/icons/svg/select.svg                      |    1 +
 src/icons/svg/server.svg                      |    1 +
 src/icons/svg/shopping.svg                    |    1 +
 src/icons/svg/signature.svg                   |    1 +
 src/icons/svg/size.svg                        |    1 +
 src/icons/svg/skill.svg                       |    1 +
 src/icons/svg/slider.svg                      |    1 +
 src/icons/svg/star.svg                        |    1 +
 src/icons/svg/statistics.svg                  |    1 +
 src/icons/svg/swagger.svg                     |    1 +
 src/icons/svg/switch.svg                      |    1 +
 src/icons/svg/system-tools.svg                |    1 +
 src/icons/svg/system.svg                      |    2 +
 src/icons/svg/tab.svg                         |    1 +
 src/icons/svg/table.svg                       |    1 +
 src/icons/svg/textarea.svg                    |    1 +
 src/icons/svg/theme.svg                       |    1 +
 src/icons/svg/time-avg.svg                    |    1 +
 src/icons/svg/time-range.svg                  |    1 +
 src/icons/svg/time.svg                        |    1 +
 src/icons/svg/tool.svg                        |    1 +
 src/icons/svg/tree-table.svg                  |    1 +
 src/icons/svg/tree.svg                        |    1 +
 src/icons/svg/upload.svg                      |    1 +
 src/icons/svg/user-info.svg                   |    1 +
 src/icons/svg/user.svg                        |    1 +
 src/icons/svg/validCode.svg                   |    1 +
 src/icons/svg/vip.svg                         |   76 +
 src/icons/svg/webhock.svg                     |    1 +
 src/icons/svg/wechat.svg                      |    1 +
 src/icons/svg/zip.svg                         |    1 +
 src/icons/svgo.yml                            |   22 +
 src/layout/BasicLayout.vue                    |   18 +
 src/layout/components/AppMain.vue             |   57 +
 src/layout/components/Navbar.vue              |  175 ++
 src/layout/components/Settings/index.vue      |  212 ++
 src/layout/components/Sidebar/FixiOSBug.js    |   26 +
 src/layout/components/Sidebar/Item.vue        |   29 +
 src/layout/components/Sidebar/Link.vue        |   36 +
 src/layout/components/Sidebar/Logo.vue        |   90 +
 src/layout/components/Sidebar/SidebarItem.vue |   95 +
 src/layout/components/Sidebar/index.vue       |   66 +
 src/layout/components/TagsView/ScrollPane.vue |   85 +
 src/layout/components/TagsView/TagsView.vue   |  103 +
 src/layout/components/TagsView/index.vue      |  361 ++++
 src/layout/components/index.js                |    5 +
 src/layout/index.vue                          |  106 +
 src/layout/mixin/ResizeHandler.js             |   45 +
 src/main.js                                   |   95 +
 src/permission.js                             |   74 +
 src/router/index.js                           |  124 ++
 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                               |   42 +
 src/store/getters.js                          |   20 +
 src/store/index.js                            |   25 +
 src/store/modules/app.js                      |   56 +
 src/store/modules/errorLog.js                 |   28 +
 src/store/modules/permission.js               |  171 ++
 src/store/modules/settings.js                 |   37 +
 src/store/modules/system.js                   |   33 +
 src/store/modules/tagsView.js                 |  162 ++
 src/store/modules/user.js                     |  153 ++
 src/styles/admin.css                          |  213 ++
 src/styles/admin.min.css                      |    1 +
 src/styles/admin.scss                         |  295 +++
 src/styles/btn.scss                           |   99 +
 src/styles/element-ui.scss                    |   84 +
 src/styles/element-variables.scss             |   31 +
 src/styles/index.scss                         |  204 ++
 src/styles/mixin.scss                         |   66 +
 src/styles/sidebar.scss                       |  224 +++
 src/styles/transition.scss                    |   48 +
 src/styles/variables.css                      |   13 +
 src/styles/variables.min.css                  |    1 +
 src/styles/variables.scss                     |   44 +
 src/utils/auth.js                             |   15 +
 src/utils/clipboard.js                        |   32 +
 src/utils/costum.js                           |  106 +
 src/utils/dialog.js                           |   76 +
 src/utils/error-log.js                        |   35 +
 src/utils/eventbus.js                         |    2 +
 src/utils/generator/config.js                 |  423 ++++
 src/utils/generator/css.js                    |   18 +
 src/utils/generator/drawingDefalut.js         |   29 +
 src/utils/generator/html.js                   |  400 ++++
 src/utils/generator/icon.json                 |    1 +
 src/utils/generator/index.js                  |  158 ++
 src/utils/generator/js.js                     |  236 +++
 src/utils/generator/render.js                 |  121 ++
 src/utils/get-page-title.js                   |   10 +
 src/utils/index.js                            |  367 ++++
 src/utils/open-window.js                      |   25 +
 src/utils/permission.js                       |   25 +
 src/utils/request.js                          |  119 ++
 src/utils/scroll-to.js                        |   58 +
 src/utils/storage.js                          |   23 +
 src/utils/validate.js                         |   87 +
 src/utils/zipdownload.js                      |   49 +
 src/vendor/Export2Excel.js                    |  220 ++
 src/vendor/Export2Zip.js                      |   24 +
 src/views/admin/dict/data.vue                 |  360 ++++
 src/views/admin/dict/index.vue                |  360 ++++
 src/views/admin/member-balance/index.vue      |  249 +++
 src/views/admin/member-proxy/index.vue        |  312 +++
 src/views/admin/member-recharge/index.vue     |  383 ++++
 src/views/admin/sys-api/index.vue             |  428 ++++
 src/views/admin/sys-config/index.vue          |  434 ++++
 src/views/admin/sys-config/set.vue            |  218 ++
 src/views/admin/sys-dept/index.vue            |  370 ++++
 src/views/admin/sys-login-log/index.vue       |  296 +++
 src/views/admin/sys-menu/index.vue            |  624 ++++++
 src/views/admin/sys-oper-log/index.vue        |  334 ++++
 src/views/admin/sys-post/index.vue            |  360 ++++
 src/views/admin/sys-role/index.vue            |  611 ++++++
 src/views/admin/sys-user/index.vue            |  681 +++++++
 .../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           |  176 ++
 src/views/dashboard/editor/index.vue          |   74 +
 src/views/dashboard/index.vue                 |   31 +
 src/views/dev-tools/build/index.vue           |   36 +
 src/views/dev-tools/gen/basicInfoForm.vue     |  101 +
 src/views/dev-tools/gen/editTable.vue         |  348 ++++
 src/views/dev-tools/gen/genInfoForm.vue       |  219 ++
 src/views/dev-tools/gen/importTable.vue       |  121 ++
 src/views/dev-tools/gen/index.vue             |  443 ++++
 src/views/dev-tools/swagger/index.vue         |   34 +
 src/views/error-page/401.vue                  |   99 +
 src/views/error-page/404.vue                  |  228 +++
 .../excel/components/AutoWidthOption.vue      |   34 +
 src/views/excel/components/BookTypeOption.vue |   39 +
 src/views/excel/components/FilenameOption.vue |   27 +
 src/views/excel/upload-excel.vue              |   42 +
 src/views/log/index.vue                       |    3 +
 src/views/login/auth-redirect.vue             |   15 +
 src/views/login/components/SocialSignin.vue   |   72 +
 src/views/login/index.vue                     |  538 +++++
 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                   |  121 ++
 src/views/profile/resetPwd.vue                |   76 +
 src/views/profile/userAvatar.vue              |  137 ++
 src/views/profile/userInfo.vue                |   79 +
 src/views/redirect/index.vue                  |   12 +
 src/views/schedule/index.vue                  |  558 ++++++
 src/views/schedule/log.vue                    |  101 +
 src/views/sys-tools/monitor.vue               |  183 ++
 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/parseTime.spec.js            |   27 +
 tests/unit/utils/validate.spec.js             |   28 +
 vue.config.js                                 |  155 ++
 478 files changed, 31030 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 .gitignore
 create mode 100644 .npmrc
 create mode 100644 .travis.yml
 create mode 100644 Dockerfile
 create mode 100644 LICENSE
 create mode 100644 README.Zh-cn.md
 create mode 100644 README.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 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 scripts/k8s/default.conf
 create mode 100644 scripts/k8s/deploy.yml
 create mode 100644 scripts/k8s/prerun.sh
 create mode 100644 src/App.vue
 create mode 100644 src/api/admin/dict/data.js
 create mode 100644 src/api/admin/dict/type.js
 create mode 100644 src/api/admin/member-balance.js
 create mode 100644 src/api/admin/member-proxy.js
 create mode 100644 src/api/admin/member-recharge.js
 create mode 100644 src/api/admin/sys-api.js
 create mode 100644 src/api/admin/sys-config.js
 create mode 100644 src/api/admin/sys-dept.js
 create mode 100644 src/api/admin/sys-login-log.js
 create mode 100644 src/api/admin/sys-menu.js
 create mode 100644 src/api/admin/sys-opera-log.js
 create mode 100644 src/api/admin/sys-post.js
 create mode 100644 src/api/admin/sys-role.js
 create mode 100644 src/api/admin/sys-user.js
 create mode 100644 src/api/job/sys-job.js
 create mode 100644 src/api/login.js
 create mode 100644 src/api/monitor/server.js
 create mode 100644 src/api/remote-search.js
 create mode 100644 src/api/schedule.js
 create mode 100644 src/api/table.js
 create mode 100644 src/api/tools/gen.js
 create mode 100644 src/api/user.js
 create mode 100644 src/api/ws.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/assets/dark.svg
 create mode 100644 src/assets/icons/12-01.png
 create mode 100644 src/assets/icons/AU-01.png
 create mode 100644 src/assets/icons/Access.png
 create mode 100644 src/assets/icons/AndroidStudio.png
 create mode 100644 src/assets/icons/Awesome.png
 create mode 100644 src/assets/icons/AwesomeVue.png
 create mode 100644 src/assets/icons/Clion-01-01.png
 create mode 100644 src/assets/icons/Dm-01-01.png
 create mode 100644 src/assets/icons/Edge-01.png
 create mode 100644 src/assets/icons/Excel.png
 create mode 100644 src/assets/icons/Ic-01.png
 create mode 100644 src/assets/icons/Idea.png
 create mode 100644 src/assets/icons/Link.png
 create mode 100644 src/assets/icons/OneDrive.png
 create mode 100644 src/assets/icons/OneNote.png
 create mode 100644 src/assets/icons/PDFbeifen.png
 create mode 100644 src/assets/icons/Phpstorm-01.png
 create mode 100644 src/assets/icons/PictureUnknow.png
 create mode 100644 src/assets/icons/Pictureloadingfailed.png
 create mode 100644 src/assets/icons/Pl-01.png
 create mode 100644 src/assets/icons/Pn-01.png
 create mode 100644 src/assets/icons/PowerPoint.png
 create mode 100644 src/assets/icons/PowerShell.png
 create mode 100644 src/assets/icons/Pycharm.png
 create mode 100644 src/assets/icons/Typora.png
 create mode 100644 src/assets/icons/UTools.png
 create mode 100644 src/assets/icons/Unknow.png
 create mode 100644 src/assets/icons/Visio.png
 create mode 100644 src/assets/icons/VisualStudio.png
 create mode 100644 src/assets/icons/Web.png
 create mode 100644 src/assets/icons/Webstorm.png
 create mode 100644 src/assets/icons/Windows.png
 create mode 100644 src/assets/icons/WindowsTerminal_PRE-01.png
 create mode 100644 src/assets/icons/Word.png
 create mode 100644 src/assets/icons/Wordbeifen.png
 create mode 100644 src/assets/icons/Zip.png
 create mode 100644 src/assets/icons/adobe-01-01-01.png
 create mode 100644 src/assets/icons/bianxingjingang.png
 create mode 100644 src/assets/icons/bianxingjingang1.png
 create mode 100644 src/assets/icons/chayue2.png
 create mode 100644 src/assets/icons/daiyue.png
 create mode 100644 src/assets/icons/excelbeifen.png
 create mode 100644 src/assets/icons/fl-01-01.png
 create mode 100644 src/assets/icons/nasa.png
 create mode 100644 src/assets/icons/pf-01.png
 create mode 100644 src/assets/icons/picture.png
 create mode 100644 src/assets/icons/pptbeifen.png
 create mode 100644 src/assets/icons/rar.png
 create mode 100644 src/assets/icons/tubiaozhizuomo3-01.png
 create mode 100644 src/assets/icons/tubiaozhizuomoban-01.png
 create mode 100644 src/assets/icons/tubiaozhizuomoban10-01.png
 create mode 100644 src/assets/icons/tubiaozhizuomoban11.png
 create mode 100644 src/assets/icons/tubiaozhizuomoban2-01-01.png
 create mode 100644 src/assets/icons/tubiaozhizuomoban4-01.png
 create mode 100644 src/assets/icons/tubiaozhizuomoban5-01.png
 create mode 100644 src/assets/icons/tubiaozhizuomoban6-01.png
 create mode 100644 src/assets/icons/tubiaozhizuomoban7-01-01.png
 create mode 100644 src/assets/icons/tubiaozhizuomoban8-01.png
 create mode 100644 src/assets/icons/tubiaozhizuomoban9-01.png
 create mode 100644 src/assets/icons/txtbeifen.png
 create mode 100644 src/assets/icons/video.png
 create mode 100644 src/assets/icons/video2.png
 create mode 100644 src/assets/icons/voice.png
 create mode 100644 src/assets/icons/wendang.png
 create mode 100644 src/assets/icons/wenjianjia.png
 create mode 100644 src/assets/light.svg
 create mode 100644 src/assets/login.png
 create mode 100644 src/assets/logo/logo.png
 create mode 100644 src/assets/particles.json
 create mode 100644 src/components/BackToTop/index.vue
 create mode 100644 src/components/Bar.vue
 create mode 100644 src/components/Breadcrumb/index.vue
 create mode 100644 src/components/Cell/index.vue
 create mode 100644 src/components/ChartCard/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/CustomDialog/index.vue
 create mode 100644 src/components/DndList/index.vue
 create mode 100644 src/components/DragColumn/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/FormGenParser/Parser.vue
 create mode 100644 src/components/FormGenRender/render.js
 create mode 100644 src/components/FormGenRender/slots/el-button.js
 create mode 100644 src/components/FormGenRender/slots/el-checkbox-group.js
 create mode 100644 src/components/FormGenRender/slots/el-input.js
 create mode 100644 src/components/FormGenRender/slots/el-radio-group.js
 create mode 100644 src/components/FormGenRender/slots/el-select.js
 create mode 100644 src/components/FormGenRender/slots/el-upload.js
 create mode 100644 src/components/GithubCorner/index.vue
 create mode 100644 src/components/Go-Admin/Doc/index.vue
 create mode 100644 src/components/Go-Admin/Donate/index.vue
 create mode 100644 src/components/Go-Admin/Git/index.vue
 create mode 100644 src/components/Hamburger/index.vue
 create mode 100644 src/components/HeaderSearch/index.vue
 create mode 100644 src/components/IconSelect/index.vue
 create mode 100644 src/components/IconSelect/requireIcons.js
 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/Kanban/index.vue
 create mode 100644 src/components/MDinput/index.vue
 create mode 100644 src/components/MiniArea/index.vue
 create mode 100644 src/components/MiniBar/index.vue
 create mode 100644 src/components/MiniProgress/index.vue
 create mode 100644 src/components/Pagination/index.vue
 create mode 100644 src/components/PanThumb/index.vue
 create mode 100644 src/components/RankList/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/TopNav/index.vue
 create mode 100644 src/components/Trend/index.vue
 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/components/layout.vue
 create mode 100644 src/components/richtext.vue
 create mode 100644 src/components/tableAction.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/permisaction.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/access.svg
 create mode 100644 src/icons/svg/add-db.svg
 create mode 100644 src/icons/svg/add-doc.svg
 create mode 100644 src/icons/svg/alarm-settings.svg
 create mode 100644 src/icons/svg/api-ctl.svg
 create mode 100644 src/icons/svg/api-doc.svg
 create mode 100644 src/icons/svg/api-gateway.svg
 create mode 100644 src/icons/svg/api-monitor.svg
 create mode 100644 src/icons/svg/api-server.svg
 create mode 100644 src/icons/svg/api-test.svg
 create mode 100644 src/icons/svg/app-group-fill.svg
 create mode 100644 src/icons/svg/archived.svg
 create mode 100644 src/icons/svg/base-info.svg
 create mode 100644 src/icons/svg/batch-update.svg
 create mode 100644 src/icons/svg/bug.svg
 create mode 100644 src/icons/svg/build.svg
 create mode 100644 src/icons/svg/calendar.svg
 create mode 100644 src/icons/svg/cascader.svg
 create mode 100644 src/icons/svg/chart.svg
 create mode 100644 src/icons/svg/checkbox.svg
 create mode 100644 src/icons/svg/clipboard.svg
 create mode 100644 src/icons/svg/code.svg
 create mode 100644 src/icons/svg/color.svg
 create mode 100644 src/icons/svg/component.svg
 create mode 100644 src/icons/svg/dashboard.svg
 create mode 100644 src/icons/svg/date-range.svg
 create mode 100644 src/icons/svg/date.svg
 create mode 100644 src/icons/svg/db.svg
 create mode 100644 src/icons/svg/del.svg
 create mode 100644 src/icons/svg/dev-tools.svg
 create mode 100644 src/icons/svg/dict.svg
 create mode 100644 src/icons/svg/doc.svg
 create mode 100644 src/icons/svg/documentation.svg
 create mode 100644 src/icons/svg/download.svg
 create mode 100644 src/icons/svg/drag copy.svg
 create mode 100644 src/icons/svg/drag.svg
 create mode 100644 src/icons/svg/druid.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/err-list.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/github.svg
 create mode 100644 src/icons/svg/guide.svg
 create mode 100644 src/icons/svg/heart.svg
 create mode 100644 src/icons/svg/http-err.svg
 create mode 100644 src/icons/svg/icon.svg
 create mode 100644 src/icons/svg/info-setting.svg
 create mode 100644 src/icons/svg/input.svg
 create mode 100644 src/icons/svg/intel.svg
 create mode 100644 src/icons/svg/international.svg
 create mode 100644 src/icons/svg/job.svg
 create mode 100644 src/icons/svg/json-push.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/log.svg
 create mode 100644 src/icons/svg/logininfor.svg
 create mode 100644 src/icons/svg/map.svg
 create mode 100644 src/icons/svg/message.svg
 create mode 100644 src/icons/svg/money.svg
 create mode 100644 src/icons/svg/monitor.svg
 create mode 100644 src/icons/svg/nested.svg
 create mode 100644 src/icons/svg/network.svg
 create mode 100644 src/icons/svg/next-page.svg
 create mode 100644 src/icons/svg/number.svg
 create mode 100644 src/icons/svg/online.svg
 create mode 100644 src/icons/svg/operators.svg
 create mode 100644 src/icons/svg/pass.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/phone.svg
 create mode 100644 src/icons/svg/post.svg
 create mode 100644 src/icons/svg/project-group.svg
 create mode 100644 src/icons/svg/project-manage.svg
 create mode 100644 src/icons/svg/pwd.svg
 create mode 100644 src/icons/svg/qq.svg
 create mode 100644 src/icons/svg/question.svg
 create mode 100644 src/icons/svg/radio.svg
 create mode 100644 src/icons/svg/rate.svg
 create mode 100644 src/icons/svg/return-code-doc.svg
 create mode 100644 src/icons/svg/return-code.svg
 create mode 100644 src/icons/svg/root-addr.svg
 create mode 100644 src/icons/svg/row.svg
 create mode 100644 src/icons/svg/safety.svg
 create mode 100644 src/icons/svg/scene.svg
 create mode 100644 src/icons/svg/search.svg
 create mode 100644 src/icons/svg/select.svg
 create mode 100644 src/icons/svg/server.svg
 create mode 100644 src/icons/svg/shopping.svg
 create mode 100644 src/icons/svg/signature.svg
 create mode 100644 src/icons/svg/size.svg
 create mode 100644 src/icons/svg/skill.svg
 create mode 100644 src/icons/svg/slider.svg
 create mode 100644 src/icons/svg/star.svg
 create mode 100644 src/icons/svg/statistics.svg
 create mode 100644 src/icons/svg/swagger.svg
 create mode 100644 src/icons/svg/switch.svg
 create mode 100644 src/icons/svg/system-tools.svg
 create mode 100644 src/icons/svg/system.svg
 create mode 100644 src/icons/svg/tab.svg
 create mode 100644 src/icons/svg/table.svg
 create mode 100644 src/icons/svg/textarea.svg
 create mode 100644 src/icons/svg/theme.svg
 create mode 100644 src/icons/svg/time-avg.svg
 create mode 100644 src/icons/svg/time-range.svg
 create mode 100644 src/icons/svg/time.svg
 create mode 100644 src/icons/svg/tool.svg
 create mode 100644 src/icons/svg/tree-table.svg
 create mode 100644 src/icons/svg/tree.svg
 create mode 100644 src/icons/svg/upload.svg
 create mode 100644 src/icons/svg/user-info.svg
 create mode 100644 src/icons/svg/user.svg
 create mode 100644 src/icons/svg/validCode.svg
 create mode 100644 src/icons/svg/vip.svg
 create mode 100644 src/icons/svg/webhock.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/BasicLayout.vue
 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/TagsView.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/system.js
 create mode 100644 src/store/modules/tagsView.js
 create mode 100644 src/store/modules/user.js
 create mode 100644 src/styles/admin.css
 create mode 100644 src/styles/admin.min.css
 create mode 100644 src/styles/admin.scss
 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.css
 create mode 100644 src/styles/variables.min.css
 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/costum.js
 create mode 100644 src/utils/dialog.js
 create mode 100644 src/utils/error-log.js
 create mode 100644 src/utils/eventbus.js
 create mode 100644 src/utils/generator/config.js
 create mode 100644 src/utils/generator/css.js
 create mode 100644 src/utils/generator/drawingDefalut.js
 create mode 100644 src/utils/generator/html.js
 create mode 100644 src/utils/generator/icon.json
 create mode 100644 src/utils/generator/index.js
 create mode 100644 src/utils/generator/js.js
 create mode 100644 src/utils/generator/render.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/storage.js
 create mode 100644 src/utils/validate.js
 create mode 100644 src/utils/zipdownload.js
 create mode 100644 src/vendor/Export2Excel.js
 create mode 100644 src/vendor/Export2Zip.js
 create mode 100644 src/views/admin/dict/data.vue
 create mode 100644 src/views/admin/dict/index.vue
 create mode 100644 src/views/admin/member-balance/index.vue
 create mode 100644 src/views/admin/member-proxy/index.vue
 create mode 100644 src/views/admin/member-recharge/index.vue
 create mode 100644 src/views/admin/sys-api/index.vue
 create mode 100644 src/views/admin/sys-config/index.vue
 create mode 100644 src/views/admin/sys-config/set.vue
 create mode 100644 src/views/admin/sys-dept/index.vue
 create mode 100644 src/views/admin/sys-login-log/index.vue
 create mode 100644 src/views/admin/sys-menu/index.vue
 create mode 100644 src/views/admin/sys-oper-log/index.vue
 create mode 100644 src/views/admin/sys-post/index.vue
 create mode 100644 src/views/admin/sys-role/index.vue
 create mode 100644 src/views/admin/sys-user/index.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/dev-tools/build/index.vue
 create mode 100644 src/views/dev-tools/gen/basicInfoForm.vue
 create mode 100644 src/views/dev-tools/gen/editTable.vue
 create mode 100644 src/views/dev-tools/gen/genInfoForm.vue
 create mode 100644 src/views/dev-tools/gen/importTable.vue
 create mode 100644 src/views/dev-tools/gen/index.vue
 create mode 100644 src/views/dev-tools/swagger/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/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/upload-excel.vue
 create mode 100644 src/views/log/index.vue
 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/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/profile/resetPwd.vue
 create mode 100644 src/views/profile/userAvatar.vue
 create mode 100644 src/views/profile/userInfo.vue
 create mode 100644 src/views/redirect/index.vue
 create mode 100644 src/views/schedule/index.vue
 create mode 100644 src/views/schedule/log.vue
 create mode 100644 src/views/sys-tools/monitor.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/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..ede07c9
--- /dev/null
+++ b/.env.development
@@ -0,0 +1,6 @@
+# just a flag
+ENV = 'development'
+
+# base api
+VUE_APP_BASE_API = 'http://127.0.0.1:8086'
+
diff --git a/.env.production b/.env.production
new file mode 100644
index 0000000..8994f69
--- /dev/null
+++ b/.env.production
@@ -0,0 +1,6 @@
+# just a flag
+ENV = 'production'
+
+# base api
+VUE_APP_BASE_API = ''
+
diff --git a/.env.staging b/.env.staging
new file mode 100644
index 0000000..097edb1
--- /dev/null
+++ b/.env.staging
@@ -0,0 +1,8 @@
+NODE_ENV = production
+
+# just a flag
+ENV = 'staging'
+
+# base api
+VUE_APP_BASE_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/.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/.npmrc b/.npmrc
new file mode 100644
index 0000000..0f4c8fc
--- /dev/null
+++ b/.npmrc
@@ -0,0 +1,4 @@
+sass_binary_site=https://registry.npmmirror.com/mirrors/node-sass/
+phantomjs_cdnurl=https://registry.npmmirror.com/mirrors/phantomjs/
+electron_mirror=https://registry.npmmirror.com/mirrors/electron/
+registry=https://registry.npmmirror.com
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/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..f5afba8
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,14 @@
+FROM registry.cn-shanghai.aliyuncs.com/lwmeng/node:lts-alpine as build-stage
+WORKDIR /app
+COPY package*.json ./
+RUN npm install -g cnpm --registry=https://registry.npm.taobao.org
+RUN cnpm install
+COPY . .
+RUN npm run build:prod
+
+# production stage
+FROM registry.cn-shanghai.aliyuncs.com/lwmeng/nginx
+COPY --from=build-stage /app/dist /usr/share/nginx/html
+
+EXPOSE 80
+CMD ["nginx", "-g", "daemon off;"]
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..2e5981c
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2020 wenjianzhang
+
+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.Zh-cn.md b/README.Zh-cn.md
new file mode 100644
index 0000000..e4c9266
--- /dev/null
+++ b/README.Zh-cn.md
@@ -0,0 +1,289 @@
+# go-admin
+
+   +
+
+[](https://github.com/go-admin-team/go-admin)
+[](https://github.com/go-admin-team/go-admin/releases)
+[](https://github.com/go-admin-team/go-admin)
+
+[English](https://github.com/go-admin-team/go-admin/blob/master/README.md) | 简体中文
+
+
+基于Gin + Vue + Element UI的前后端分离权限管理系统,系统初始化极度简单,只需要配置文件中,修改数据库连接,系统支持多指令操作,迁移指令可以让初始化数据库信息变得更简单,服务指令可以很简单的启动api服务
+
+[在线文档](https://doc.go-admin.dev)
+
+[github在线文档](https://wenjianzhang.github.io)
+
+[gitee在线文档](http://mydearzwj.gitee.io/go-admin-doc/)
+
+[后端项目](https://github.com/go-admin-team/go-admin)
+
+[视频教程](https://space.bilibili.com/565616721/channel/detail?cid=125737)
+
+## ✨ 特性
+
+- 遵循 RESTful API 设计规范
+
+- 基于 GIN WEB API 框架,提供了丰富的中间件支持(用户认证、跨域、访问日志、追踪ID等)
+
+- 基于Casbin的 RBAC 访问控制模型
+
+- JWT 认证
+
+- 支持 Swagger 文档(基于swaggo)
+
+- 基于 GORM 的数据库存储,可扩展多种类型数据库 
+
+- 配置文件简单的模型映射,快速能够得到想要的配置
+
+- 代码生成工具
+
+- 表单构建工具
+
+- 多指令模式
+
+- TODO: 单元测试
+
+
+## 🎁 内置
+
+1. 用户管理:用户是系统操作者,该功能主要完成系统用户配置。
+2. 部门管理:配置系统组织机构(公司、部门、小组),树结构展现支持数据权限。
+3. 岗位管理:配置系统用户所属担任职务。
+4. 菜单管理:配置系统菜单,操作权限,按钮权限标识,接口权限等。
+5. 角色管理:角色菜单权限分配、设置角色按机构进行数据范围权限划分。
+6. 字典管理:对系统中经常使用的一些较为固定的数据进行维护。
+7. 参数管理:对系统动态配置常用参数。
+8. 操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询。
+9. 登录日志:系统登录日志记录查询包含登录异常。
+1. 接口文档:根据业务代码自动生成相关的api接口文档。
+1. 代码生成:根据数据表结构生成对应的增删改查相对应业务,全程可视化操作,让基本业务可以零代码实现。
+1. 表单构建:自定义页面样式,拖拉拽实现页面布局。
+1. 服务监控:查看一些服务器的基本信息。
+1. 内容管理:demo功能,下设分类管理、内容管理。可以参考使用方便快速入门。
+
+## 准备工作
+
+你需要在本地安装 [go] [gin] [node](http://nodejs.org/) 和 [git](https://git-scm.com/) 
+
+同时配套了系列教程包含视频和文档,如何从下载完成到熟练使用,强烈建议大家先看完这些教程再来实践本项目!!!
+
+### 轻松实现go-admin写出第一个应用 - 文档教程
+
+[步骤一 - 基础内容介绍](http://doc.zhangwj.com/go-admin-site/guide/intro/tutorial01.html)
+
+[步骤二 - 实际应用 - 编写增删改查](http://doc.zhangwj.com/go-admin-site/guide/intro/tutorial02.html) 
+
+### 手把手教你从入门到放弃 - 视频教程 
+
+[如何启动go-admin](https://www.bilibili.com/video/BV1z5411x7JG)
+
+[使用生成工具轻松实现业务](https://www.bilibili.com/video/BV1Dg4y1i79D)
+
+[v1.1.0版本代码生成工具-释放双手](https://www.bilibili.com/video/BV1N54y1i71P) [进阶]
+
+[多命令启动方式讲解以及IDE配置](https://www.bilibili.com/video/BV1Fg4y1q7ph)
+
+[go-admin菜单的配置说明](https://www.bilibili.com/video/BV1Wp4y1D715) [必看]
+
+[如何配置菜单信息以及接口信息](https://www.bilibili.com/video/BV1zv411B7nG) [必看]
+
+[go-admin权限配置使用说明](https://www.bilibili.com/video/BV1rt4y197d3) [必看]
+
+[go-admin数据权限使用说明](https://www.bilibili.com/video/BV1LK4y1s71e) [必看]
+
+
+**如有问题请先看上述使用文档和文章,若不能满足,欢迎 issue 和 pr ,视频教程和文档持续更新中**
+
+## 📦 本地开发
+
+### 开发目录创建
+
+```bash
+
+# 创建开发目录
+mkdir goadmin
+cd goadmin
+```
+
+### 获取代码
+
+> 重点注意:两个项目必须放在同一文件夹下;
+
+```bash
+# 获取后端代码
+git clone https://github.com/go-admin-team/go-admin.git
+
+# 获取前端代码
+git clone https://github.com/go-admin-team/go-admin-ui.git
+
+```
+
+
+### 启动说明
+
+#### 服务端启动说明
+
+```bash
+# 进入 go-admin 后端项目
+cd ./go-admin
+
+# 编译项目
+go build
+
+# 修改配置 
+# 文件路径  go-admin/config/settings.yml
+vi ./config/setting.yml 
+
+# 1. 配置文件中修改数据库信息 
+# 注意: settings.database 下对应的配置数据
+# 2. 确认log路径
+```
+
+:::tip ⚠️注意 在windows环境如果没有安装中CGO,会出现这个问题;
+
+```bash
+E:\go-admin>go build
+# github.com/mattn/go-sqlite3
+cgo: exec /missing-cc: exec: "/missing-cc": file does not exist
+```
+
+or
+
+```bash
+D:\Code\go-admin>go build
+# github.com/mattn/go-sqlite3
+cgo: exec gcc: exec: "gcc": executable file not found in %PATH%
+```
+
+[解决cgo问题进入](https://doc.go-admin.dev/guide/other/faq.html#_5-cgo-exec-missing-cc-exec-missing-cc-file-does-not-exist)
+
+:::
+
+#### 初始化数据库,以及服务启动
+
+``` bash
+# 首次配置需要初始化数据库资源信息
+# macOS or linux 下使用
+$ ./go-admin migrate -c=config/settings.dev.yml
+
+# ⚠️注意:windows 下使用
+$ go-admin.exe migrate -c=config/settings.dev.yml
+
+
+# 启动项目,也可以用IDE进行调试
+# macOS or linux 下使用
+$ ./go-admin server -c config/settings.yml
+
+
+# ⚠️注意:windows 下使用
+$ go-admin.exe server -c config/settings.yml
+```
+
+#### 使用docker 编译启动
+
+```shell
+# 编译镜像
+docker build -t go-admin .
+
+# 启动容器,第一个go-admin是容器名字,第二个go-admin是镜像名称
+# -v 映射配置文件 本地路径:容器路径
+docker run --name go-admin -p 8000:8000 -v /config/settings.yml:/config/settings.yml -d go-admin-server
+```
+
+
+
+#### 文档生成
+
+```bash
+go generate
+```
+
+#### 交叉编译
+```bash
+# windows
+env GOOS=windows GOARCH=amd64 go build main.go
+
+# or
+# linux
+env GOOS=linux GOARCH=amd64 go build main.go
+```
+
+### UI交互端启动说明
+
+```bash
+# 安装依赖
+npm install
+
+# 建议不要直接使用 cnpm 安装依赖,会有各种诡异的 bug。可以通过如下操作解决 npm 下载速度慢的问题
+npm install --registry=https://registry.npm.taobao.org
+
+# 启动服务
+npm run dev
+```
+
+## 🎬 在线体验
+> admin  /  123456
+
+演示地址:[http://www.go-admin.dev](http://www.go-admin.dev/#/login)
+
+
+## 📨 互动
+
+
+
+
+[](https://github.com/go-admin-team/go-admin)
+[](https://github.com/go-admin-team/go-admin/releases)
+[](https://github.com/go-admin-team/go-admin)
+
+[English](https://github.com/go-admin-team/go-admin/blob/master/README.md) | 简体中文
+
+
+基于Gin + Vue + Element UI的前后端分离权限管理系统,系统初始化极度简单,只需要配置文件中,修改数据库连接,系统支持多指令操作,迁移指令可以让初始化数据库信息变得更简单,服务指令可以很简单的启动api服务
+
+[在线文档](https://doc.go-admin.dev)
+
+[github在线文档](https://wenjianzhang.github.io)
+
+[gitee在线文档](http://mydearzwj.gitee.io/go-admin-doc/)
+
+[后端项目](https://github.com/go-admin-team/go-admin)
+
+[视频教程](https://space.bilibili.com/565616721/channel/detail?cid=125737)
+
+## ✨ 特性
+
+- 遵循 RESTful API 设计规范
+
+- 基于 GIN WEB API 框架,提供了丰富的中间件支持(用户认证、跨域、访问日志、追踪ID等)
+
+- 基于Casbin的 RBAC 访问控制模型
+
+- JWT 认证
+
+- 支持 Swagger 文档(基于swaggo)
+
+- 基于 GORM 的数据库存储,可扩展多种类型数据库 
+
+- 配置文件简单的模型映射,快速能够得到想要的配置
+
+- 代码生成工具
+
+- 表单构建工具
+
+- 多指令模式
+
+- TODO: 单元测试
+
+
+## 🎁 内置
+
+1. 用户管理:用户是系统操作者,该功能主要完成系统用户配置。
+2. 部门管理:配置系统组织机构(公司、部门、小组),树结构展现支持数据权限。
+3. 岗位管理:配置系统用户所属担任职务。
+4. 菜单管理:配置系统菜单,操作权限,按钮权限标识,接口权限等。
+5. 角色管理:角色菜单权限分配、设置角色按机构进行数据范围权限划分。
+6. 字典管理:对系统中经常使用的一些较为固定的数据进行维护。
+7. 参数管理:对系统动态配置常用参数。
+8. 操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询。
+9. 登录日志:系统登录日志记录查询包含登录异常。
+1. 接口文档:根据业务代码自动生成相关的api接口文档。
+1. 代码生成:根据数据表结构生成对应的增删改查相对应业务,全程可视化操作,让基本业务可以零代码实现。
+1. 表单构建:自定义页面样式,拖拉拽实现页面布局。
+1. 服务监控:查看一些服务器的基本信息。
+1. 内容管理:demo功能,下设分类管理、内容管理。可以参考使用方便快速入门。
+
+## 准备工作
+
+你需要在本地安装 [go] [gin] [node](http://nodejs.org/) 和 [git](https://git-scm.com/) 
+
+同时配套了系列教程包含视频和文档,如何从下载完成到熟练使用,强烈建议大家先看完这些教程再来实践本项目!!!
+
+### 轻松实现go-admin写出第一个应用 - 文档教程
+
+[步骤一 - 基础内容介绍](http://doc.zhangwj.com/go-admin-site/guide/intro/tutorial01.html)
+
+[步骤二 - 实际应用 - 编写增删改查](http://doc.zhangwj.com/go-admin-site/guide/intro/tutorial02.html) 
+
+### 手把手教你从入门到放弃 - 视频教程 
+
+[如何启动go-admin](https://www.bilibili.com/video/BV1z5411x7JG)
+
+[使用生成工具轻松实现业务](https://www.bilibili.com/video/BV1Dg4y1i79D)
+
+[v1.1.0版本代码生成工具-释放双手](https://www.bilibili.com/video/BV1N54y1i71P) [进阶]
+
+[多命令启动方式讲解以及IDE配置](https://www.bilibili.com/video/BV1Fg4y1q7ph)
+
+[go-admin菜单的配置说明](https://www.bilibili.com/video/BV1Wp4y1D715) [必看]
+
+[如何配置菜单信息以及接口信息](https://www.bilibili.com/video/BV1zv411B7nG) [必看]
+
+[go-admin权限配置使用说明](https://www.bilibili.com/video/BV1rt4y197d3) [必看]
+
+[go-admin数据权限使用说明](https://www.bilibili.com/video/BV1LK4y1s71e) [必看]
+
+
+**如有问题请先看上述使用文档和文章,若不能满足,欢迎 issue 和 pr ,视频教程和文档持续更新中**
+
+## 📦 本地开发
+
+### 开发目录创建
+
+```bash
+
+# 创建开发目录
+mkdir goadmin
+cd goadmin
+```
+
+### 获取代码
+
+> 重点注意:两个项目必须放在同一文件夹下;
+
+```bash
+# 获取后端代码
+git clone https://github.com/go-admin-team/go-admin.git
+
+# 获取前端代码
+git clone https://github.com/go-admin-team/go-admin-ui.git
+
+```
+
+
+### 启动说明
+
+#### 服务端启动说明
+
+```bash
+# 进入 go-admin 后端项目
+cd ./go-admin
+
+# 编译项目
+go build
+
+# 修改配置 
+# 文件路径  go-admin/config/settings.yml
+vi ./config/setting.yml 
+
+# 1. 配置文件中修改数据库信息 
+# 注意: settings.database 下对应的配置数据
+# 2. 确认log路径
+```
+
+:::tip ⚠️注意 在windows环境如果没有安装中CGO,会出现这个问题;
+
+```bash
+E:\go-admin>go build
+# github.com/mattn/go-sqlite3
+cgo: exec /missing-cc: exec: "/missing-cc": file does not exist
+```
+
+or
+
+```bash
+D:\Code\go-admin>go build
+# github.com/mattn/go-sqlite3
+cgo: exec gcc: exec: "gcc": executable file not found in %PATH%
+```
+
+[解决cgo问题进入](https://doc.go-admin.dev/guide/other/faq.html#_5-cgo-exec-missing-cc-exec-missing-cc-file-does-not-exist)
+
+:::
+
+#### 初始化数据库,以及服务启动
+
+``` bash
+# 首次配置需要初始化数据库资源信息
+# macOS or linux 下使用
+$ ./go-admin migrate -c=config/settings.dev.yml
+
+# ⚠️注意:windows 下使用
+$ go-admin.exe migrate -c=config/settings.dev.yml
+
+
+# 启动项目,也可以用IDE进行调试
+# macOS or linux 下使用
+$ ./go-admin server -c config/settings.yml
+
+
+# ⚠️注意:windows 下使用
+$ go-admin.exe server -c config/settings.yml
+```
+
+#### 使用docker 编译启动
+
+```shell
+# 编译镜像
+docker build -t go-admin .
+
+# 启动容器,第一个go-admin是容器名字,第二个go-admin是镜像名称
+# -v 映射配置文件 本地路径:容器路径
+docker run --name go-admin -p 8000:8000 -v /config/settings.yml:/config/settings.yml -d go-admin-server
+```
+
+
+
+#### 文档生成
+
+```bash
+go generate
+```
+
+#### 交叉编译
+```bash
+# windows
+env GOOS=windows GOARCH=amd64 go build main.go
+
+# or
+# linux
+env GOOS=linux GOARCH=amd64 go build main.go
+```
+
+### UI交互端启动说明
+
+```bash
+# 安装依赖
+npm install
+
+# 建议不要直接使用 cnpm 安装依赖,会有各种诡异的 bug。可以通过如下操作解决 npm 下载速度慢的问题
+npm install --registry=https://registry.npm.taobao.org
+
+# 启动服务
+npm run dev
+```
+
+## 🎬 在线体验
+> admin  /  123456
+
+演示地址:[http://www.go-admin.dev](http://www.go-admin.dev/#/login)
+
+
+## 📨 互动
+
+
+  
+    | + | + | + | 
+  
+    | 微信+ | 此群已满+ | + | 
+
+
+## 💎 主要成员
+
+  +
+  +
+  +
+  +
+
+
+## JetBrains 开源证书支持
+
+`go-admin` 项目一直以来都是在 JetBrains 公司旗下的 GoLand 集成开发环境中进行开发,基于 **free JetBrains Open Source license(s)** 正版免费授权,在此表达我的谢意。
+
+
+
+
+
+## JetBrains 开源证书支持
+
+`go-admin` 项目一直以来都是在 JetBrains 公司旗下的 GoLand 集成开发环境中进行开发,基于 **free JetBrains Open Source license(s)** 正版免费授权,在此表达我的谢意。
+
+ +
+
+## 🤝 特别感谢
+1. [chengxiao](https://github.com/chengxiao)
+2. [gin](https://github.com/gin-gonic/gin)
+2. [casbin](https://github.com/casbin/casbin)
+2. [spf13/viper](https://github.com/spf13/viper)
+2. [gorm](https://github.com/jinzhu/gorm)
+2. [gin-swagger](https://github.com/swaggo/gin-swagger)
+2. [jwt-go](https://github.com/dgrijalva/jwt-go)
+2. [vue-element-admin](https://github.com/PanJiaChen/vue-element-admin)
+2. [ruoyi-vue](https://gitee.com/y_project/RuoYi-Vue)
+2. [form-generator](https://github.com/JakHuang/form-generator)
+
+## 🤟 打赏
+
+> 如果你觉得这个项目帮助到了你,你可以帮作者买一杯果汁表示鼓励 :tropical_drink:
+
+
+
+
+## 🤝 特别感谢
+1. [chengxiao](https://github.com/chengxiao)
+2. [gin](https://github.com/gin-gonic/gin)
+2. [casbin](https://github.com/casbin/casbin)
+2. [spf13/viper](https://github.com/spf13/viper)
+2. [gorm](https://github.com/jinzhu/gorm)
+2. [gin-swagger](https://github.com/swaggo/gin-swagger)
+2. [jwt-go](https://github.com/dgrijalva/jwt-go)
+2. [vue-element-admin](https://github.com/PanJiaChen/vue-element-admin)
+2. [ruoyi-vue](https://gitee.com/y_project/RuoYi-Vue)
+2. [form-generator](https://github.com/JakHuang/form-generator)
+
+## 🤟 打赏
+
+> 如果你觉得这个项目帮助到了你,你可以帮作者买一杯果汁表示鼓励 :tropical_drink:
+
+ +
+## 🤝 链接
+[Go开发者成长线路图](http://www.golangroadmap.com/)
+
+## 🔑 License
+
+[MIT](https://github.com/go-admin-team/go-admin/blob/master/LICENSE.md)
+
+Copyright (c) 2020 wenjianzhang
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..5c0c61a
--- /dev/null
+++ b/README.md
@@ -0,0 +1,276 @@
+# go-admin
+
+
+
+## 🤝 链接
+[Go开发者成长线路图](http://www.golangroadmap.com/)
+
+## 🔑 License
+
+[MIT](https://github.com/go-admin-team/go-admin/blob/master/LICENSE.md)
+
+Copyright (c) 2020 wenjianzhang
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..5c0c61a
--- /dev/null
+++ b/README.md
@@ -0,0 +1,276 @@
+# go-admin
+
+   +
+
+[](https://github.com/go-admin-team/go-admin)
+[](https://github.com/go-admin-team/go-admin/releases)
+[](https://github.com/go-admin-team/go-admin)
+
+English | [简体中文](https://github.com/go-admin-team/go-admin/blob/master/README.Zh-cn.md)
+
+The front-end and back-end separation authority management system based on Gin + Vue + Element UI is extremely simple to initialize the system. You only need to modify the database connection in the configuration file. The system supports multi-instruction operations. Migration instructions can make it easier to initialize database information. Service instructions It's easy to start the api service.
+
+[documentation](https://doc.go-admin.dev)
+
+[Backend project](https://github.com/go-admin-team/go-admin)
+
+[Video tutorial](https://space.bilibili.com/565616721/channel/detail?cid=125737)
+
+## ✨ Feature
+
+- Follow RESTful API design specifications
+
+- Based on the GIN WEB API framework, it provides rich middleware support (user authentication, cross-domain, access log, tracking ID, etc.)
+
+- RBAC access control model based on Casbin
+
+- JWT authentication
+
+- Support Swagger documents (based on swaggo)
+
+- Database storage based on GORM, which can expand multiple types of databases
+
+- Simple model mapping of configuration files to quickly get the desired configuration
+
+- Code generation tool
+
+- Form builder
+
+- Multi-command mode
+
+- TODO: unit test
+
+
+## 🎁 Internal
+
+1. User management: The user is the system operator, this function mainly completes the system user configuration.
+2. Department management: configure the system organization (company, department, group), and display the tree structure to support data permissions.
+3. Position management: configure the positions of system users.
+4. Menu management: configure the system menu, operation authority, button authority identification, interface authority, etc.
+5. Role management: Role menu permission assignment and role setting are divided into data scope permissions by organization.
+6. Dictionary management: Maintain some relatively fixed data frequently used in the system.
+7. Parameter management: dynamically configure common parameters for the system.
+8. Operation log: system normal operation log record and query; system abnormal information log record and query.
+9. Login log: The system login log record query contains login exceptions.
+1. Interface documentation: Automatically generate related api interface documents according to the business code.
+1. Code generation: According to the data table structure, generate the corresponding addition, deletion, modification, and check corresponding business, and the whole process of visual operation, so that the basic business can be implemented with zero code.
+1. Form construction: Customize the page style, drag and drop to realize the page layout.
+1. Service monitoring: View the basic information of some servers.
+1. Content management: demo function, including classification management and content management. You can refer to the easy to use quick start.
+
+## Ready to work
+
+You need to install locally [go] [gin] [node](http://nodejs.org/) 和 [git](https://git-scm.com/)
+
+At the same time, a series of tutorials including videos and documents are provided. How to complete the downloading to the proficient use, it is strongly recommended that you read these tutorials before you practice this project! ! !
+
+### Easily implement go-admin to write the first application-documentation tutorial
+
+[Step 1 - basic content introduction](http://doc.zhangwj.com/go-admin-site/guide/intro/tutorial01.html)
+
+[Step 2 - Practical application - writing database operations](http://doc.zhangwj.com/go-admin-site/guide/intro/tutorial02.html)
+
+### Teach you from getting started to giving up-video tutorial
+
+[How to start go-admin](https://www.bilibili.com/video/BV1z5411x7JG)
+
+[Easily implement business using build tools](https://www.bilibili.com/video/BV1Dg4y1i79D)
+
+[v1.1.0 version code generation tool-free your hands](https://www.bilibili.com/video/BV1N54y1i71P) [Advanced]
+
+[Explanation of multi-command startup mode and IDE configuration](https://www.bilibili.com/video/BV1Fg4y1q7ph)
+
+[Configuration instructions for go-admin menu](https://www.bilibili.com/video/BV1Wp4y1D715) [Must see]
+
+[How to configure menu information and interface information](https://www.bilibili.com/video/BV1zv411B7nG) [Must see]
+
+[go-admin permission configuration instructions](https://www.bilibili.com/video/BV1rt4y197d3) [Must see]
+
+[Instructions for use of go-admin data permissions](https://www.bilibili.com/video/BV1LK4y1s71e) [Must see]
+
+**If you have any questions, please read the above-mentioned usage documents and articles first. If you are not satisfied, welcome to issue and pr. Video tutorials and documents are being updated continuously.**
+
+## 📦 Local development
+
+### Development directory creation
+
+```bash
+
+# Create a development directory
+mkdir goadmin
+cd goadmin
+```
+
+### Get the code
+
+> Important note: the two projects must be placed in the same folder;
+
+```bash
+# Get backend code
+git clone https://github.com/go-admin-team/go-admin.git
+
+# Get the front-end code
+git clone https://github.com/go-admin-team/go-admin-ui.git
+
+```
+
+### Startup instructions
+
+#### Server startup instructions
+
+```bash
+# Enter the go-admin backend project
+cd ./go-admin
+
+# Compile the project
+go build
+
+# Change setting 
+# File path go-admin/config/settings.yml
+vi ./config/setting.yml 
+
+# 1. Modify the database information in the configuration file
+# Note: The corresponding configuration data under settings.database
+# 2. Confirm the log path
+```
+
+:::tip ⚠️Note that this problem will occur if CGO is not installed in the windows environment;
+
+```bash
+E:\go-admin>go build
+# github.com/mattn/go-sqlite3
+cgo: exec /missing-cc: exec: "/missing-cc": file does not exist
+```
+
+or
+
+```bash
+D:\Code\go-admin>go build
+# github.com/mattn/go-sqlite3
+cgo: exec gcc: exec: "gcc": executable file not found in %PATH%
+```
+
+[Solve the cgo problem and enter](https://doc.go-admin.dev/guide/other/faq.html#_5-cgo-exec-missing-cc-exec-missing-cc-file-does-not-exist)
+
+:::
+
+#### Initialize the database, and start the service
+
+``` bash
+# The first configuration needs to initialize the database resource information
+# Use under macOS or linux
+$ ./go-admin migrate -c=config/settings.dev.yml
+
+# ⚠️Note: Use under windows
+$ go-admin.exe migrate -c=config/settings.dev.yml
+
+# Start the project, you can also use the IDE for debugging
+# Use under macOS or linux
+$ ./go-admin server -c config/settings.yml
+
+# ⚠️Note: Use under windows
+$ go-admin.exe server -c config/settings.yml
+```
+
+#### Use docker to compile and start
+
+```shell
+# Compile the image
+docker build -t go-admin .
+
+
+# Start the container, the first go-admin is the container name, and the second go-admin is the image name
+# -v Mapping configuration file Local path: container path
+docker run --name go-admin -p 8000:8000 -v /config/settings.yml:/config/settings.yml -d go-admin-server
+```
+
+
+
+#### Generation Document
+
+```bash
+go generate
+```
+
+#### Cross compile
+```bash
+# windows
+env GOOS=windows GOARCH=amd64 go build main.go
+
+# or
+# linux
+env GOOS=linux GOARCH=amd64 go build main.go
+```
+
+### UI interactive terminal startup instructions
+
+```bash
+# Installation dependencies
+npm install   # or cnpm install
+
+# Start service
+npm run dev
+```
+
+## 🎬 Online Demo
+> admin  /  123456
+
+演示地址:[http://www.go-admin.dev](http://www.go-admin.dev/#/login)
+
+
+## 📨 Interactive
+
+
+
+## 💎 Members
+
+
+
+
+[](https://github.com/go-admin-team/go-admin)
+[](https://github.com/go-admin-team/go-admin/releases)
+[](https://github.com/go-admin-team/go-admin)
+
+English | [简体中文](https://github.com/go-admin-team/go-admin/blob/master/README.Zh-cn.md)
+
+The front-end and back-end separation authority management system based on Gin + Vue + Element UI is extremely simple to initialize the system. You only need to modify the database connection in the configuration file. The system supports multi-instruction operations. Migration instructions can make it easier to initialize database information. Service instructions It's easy to start the api service.
+
+[documentation](https://doc.go-admin.dev)
+
+[Backend project](https://github.com/go-admin-team/go-admin)
+
+[Video tutorial](https://space.bilibili.com/565616721/channel/detail?cid=125737)
+
+## ✨ Feature
+
+- Follow RESTful API design specifications
+
+- Based on the GIN WEB API framework, it provides rich middleware support (user authentication, cross-domain, access log, tracking ID, etc.)
+
+- RBAC access control model based on Casbin
+
+- JWT authentication
+
+- Support Swagger documents (based on swaggo)
+
+- Database storage based on GORM, which can expand multiple types of databases
+
+- Simple model mapping of configuration files to quickly get the desired configuration
+
+- Code generation tool
+
+- Form builder
+
+- Multi-command mode
+
+- TODO: unit test
+
+
+## 🎁 Internal
+
+1. User management: The user is the system operator, this function mainly completes the system user configuration.
+2. Department management: configure the system organization (company, department, group), and display the tree structure to support data permissions.
+3. Position management: configure the positions of system users.
+4. Menu management: configure the system menu, operation authority, button authority identification, interface authority, etc.
+5. Role management: Role menu permission assignment and role setting are divided into data scope permissions by organization.
+6. Dictionary management: Maintain some relatively fixed data frequently used in the system.
+7. Parameter management: dynamically configure common parameters for the system.
+8. Operation log: system normal operation log record and query; system abnormal information log record and query.
+9. Login log: The system login log record query contains login exceptions.
+1. Interface documentation: Automatically generate related api interface documents according to the business code.
+1. Code generation: According to the data table structure, generate the corresponding addition, deletion, modification, and check corresponding business, and the whole process of visual operation, so that the basic business can be implemented with zero code.
+1. Form construction: Customize the page style, drag and drop to realize the page layout.
+1. Service monitoring: View the basic information of some servers.
+1. Content management: demo function, including classification management and content management. You can refer to the easy to use quick start.
+
+## Ready to work
+
+You need to install locally [go] [gin] [node](http://nodejs.org/) 和 [git](https://git-scm.com/)
+
+At the same time, a series of tutorials including videos and documents are provided. How to complete the downloading to the proficient use, it is strongly recommended that you read these tutorials before you practice this project! ! !
+
+### Easily implement go-admin to write the first application-documentation tutorial
+
+[Step 1 - basic content introduction](http://doc.zhangwj.com/go-admin-site/guide/intro/tutorial01.html)
+
+[Step 2 - Practical application - writing database operations](http://doc.zhangwj.com/go-admin-site/guide/intro/tutorial02.html)
+
+### Teach you from getting started to giving up-video tutorial
+
+[How to start go-admin](https://www.bilibili.com/video/BV1z5411x7JG)
+
+[Easily implement business using build tools](https://www.bilibili.com/video/BV1Dg4y1i79D)
+
+[v1.1.0 version code generation tool-free your hands](https://www.bilibili.com/video/BV1N54y1i71P) [Advanced]
+
+[Explanation of multi-command startup mode and IDE configuration](https://www.bilibili.com/video/BV1Fg4y1q7ph)
+
+[Configuration instructions for go-admin menu](https://www.bilibili.com/video/BV1Wp4y1D715) [Must see]
+
+[How to configure menu information and interface information](https://www.bilibili.com/video/BV1zv411B7nG) [Must see]
+
+[go-admin permission configuration instructions](https://www.bilibili.com/video/BV1rt4y197d3) [Must see]
+
+[Instructions for use of go-admin data permissions](https://www.bilibili.com/video/BV1LK4y1s71e) [Must see]
+
+**If you have any questions, please read the above-mentioned usage documents and articles first. If you are not satisfied, welcome to issue and pr. Video tutorials and documents are being updated continuously.**
+
+## 📦 Local development
+
+### Development directory creation
+
+```bash
+
+# Create a development directory
+mkdir goadmin
+cd goadmin
+```
+
+### Get the code
+
+> Important note: the two projects must be placed in the same folder;
+
+```bash
+# Get backend code
+git clone https://github.com/go-admin-team/go-admin.git
+
+# Get the front-end code
+git clone https://github.com/go-admin-team/go-admin-ui.git
+
+```
+
+### Startup instructions
+
+#### Server startup instructions
+
+```bash
+# Enter the go-admin backend project
+cd ./go-admin
+
+# Compile the project
+go build
+
+# Change setting 
+# File path go-admin/config/settings.yml
+vi ./config/setting.yml 
+
+# 1. Modify the database information in the configuration file
+# Note: The corresponding configuration data under settings.database
+# 2. Confirm the log path
+```
+
+:::tip ⚠️Note that this problem will occur if CGO is not installed in the windows environment;
+
+```bash
+E:\go-admin>go build
+# github.com/mattn/go-sqlite3
+cgo: exec /missing-cc: exec: "/missing-cc": file does not exist
+```
+
+or
+
+```bash
+D:\Code\go-admin>go build
+# github.com/mattn/go-sqlite3
+cgo: exec gcc: exec: "gcc": executable file not found in %PATH%
+```
+
+[Solve the cgo problem and enter](https://doc.go-admin.dev/guide/other/faq.html#_5-cgo-exec-missing-cc-exec-missing-cc-file-does-not-exist)
+
+:::
+
+#### Initialize the database, and start the service
+
+``` bash
+# The first configuration needs to initialize the database resource information
+# Use under macOS or linux
+$ ./go-admin migrate -c=config/settings.dev.yml
+
+# ⚠️Note: Use under windows
+$ go-admin.exe migrate -c=config/settings.dev.yml
+
+# Start the project, you can also use the IDE for debugging
+# Use under macOS or linux
+$ ./go-admin server -c config/settings.yml
+
+# ⚠️Note: Use under windows
+$ go-admin.exe server -c config/settings.yml
+```
+
+#### Use docker to compile and start
+
+```shell
+# Compile the image
+docker build -t go-admin .
+
+
+# Start the container, the first go-admin is the container name, and the second go-admin is the image name
+# -v Mapping configuration file Local path: container path
+docker run --name go-admin -p 8000:8000 -v /config/settings.yml:/config/settings.yml -d go-admin-server
+```
+
+
+
+#### Generation Document
+
+```bash
+go generate
+```
+
+#### Cross compile
+```bash
+# windows
+env GOOS=windows GOARCH=amd64 go build main.go
+
+# or
+# linux
+env GOOS=linux GOARCH=amd64 go build main.go
+```
+
+### UI interactive terminal startup instructions
+
+```bash
+# Installation dependencies
+npm install   # or cnpm install
+
+# Start service
+npm run dev
+```
+
+## 🎬 Online Demo
+> admin  /  123456
+
+演示地址:[http://www.go-admin.dev](http://www.go-admin.dev/#/login)
+
+
+## 📨 Interactive
+
+
+
+## 💎 Members
+
+  +
+  +
+  +
+  +
+
+
+## JetBrains open source certificate support
+
+The `go-admin` project has always been developed in the GoLand integrated development environment under JetBrains, based on the **free JetBrains Open Source license(s)** genuine free license. I would like to express my gratitude.
+
+
+
+
+
+## JetBrains open source certificate support
+
+The `go-admin` project has always been developed in the GoLand integrated development environment under JetBrains, based on the **free JetBrains Open Source license(s)** genuine free license. I would like to express my gratitude.
+
+ +
+
+## 🤝 Thanks
+1. [chengxiao](https://github.com/chengxiao)
+2. [gin](https://github.com/gin-gonic/gin)
+2. [casbin](https://github.com/casbin/casbin)
+2. [spf13/viper](https://github.com/spf13/viper)
+2. [gorm](https://github.com/jinzhu/gorm)
+2. [gin-swagger](https://github.com/swaggo/gin-swagger)
+2. [jwt-go](https://github.com/dgrijalva/jwt-go)
+2. [vue-element-admin](https://github.com/PanJiaChen/vue-element-admin)
+2. [ruoyi-vue](https://gitee.com/y_project/RuoYi-Vue)
+2. [form-generator](https://github.com/JakHuang/form-generator)
+
+## 🤟 Sponsor Us
+
+> If you think this project helped you, you can buy a glass of juice for the author to show encouragement :tropical_drink:
+
+
+
+
+## 🤝 Thanks
+1. [chengxiao](https://github.com/chengxiao)
+2. [gin](https://github.com/gin-gonic/gin)
+2. [casbin](https://github.com/casbin/casbin)
+2. [spf13/viper](https://github.com/spf13/viper)
+2. [gorm](https://github.com/jinzhu/gorm)
+2. [gin-swagger](https://github.com/swaggo/gin-swagger)
+2. [jwt-go](https://github.com/dgrijalva/jwt-go)
+2. [vue-element-admin](https://github.com/PanJiaChen/vue-element-admin)
+2. [ruoyi-vue](https://gitee.com/y_project/RuoYi-Vue)
+2. [form-generator](https://github.com/JakHuang/form-generator)
+
+## 🤟 Sponsor Us
+
+> If you think this project helped you, you can buy a glass of juice for the author to show encouragement :tropical_drink:
+
+ +
+## 🤝 Link
+[Go developer growth roadmap](http://www.golangroadmap.com/)
+
+## 🔑 License
+
+[MIT](https://github.com/go-admin-team/go-admin/blob/master/LICENSE.md)
+
+Copyright (c) 2020 wenjianzhang
\ No newline at end of file
diff --git a/babel.config.js b/babel.config.js
new file mode 100644
index 0000000..34be5d7
--- /dev/null
+++ b/babel.config.js
@@ -0,0 +1,10 @@
+module.exports = {
+  presets: [
+    '@vue/cli-plugin-babel/preset'
+  ],
+  env: {
+    development: {
+      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/package.json b/package.json
new file mode 100644
index 0000000..05e26f2
--- /dev/null
+++ b/package.json
@@ -0,0 +1,140 @@
+{
+  "name": "go-admin",
+  "version": "2.0.6",
+  "description": "A magical vue admin. An out-of-box UI solution for enterprise applications. Newest development stack of vue. Lots of awesome features",
+  "author": "https://github.com/wenjianzhang",
+  "license": "MIT",
+  "scripts": {
+    "dev": "vue-cli-service serve",
+    "build:prod": "vue-cli-service build",
+    "build:stage": "vue-cli-service build --mode staging",
+    "preview": "node build/index.js --preview",
+    "lint": "eslint --ext .js,.vue src",
+    "test:unit": "jest --clearCache && vue-cli-service test:unit",
+    "test:ci": "npm run lint && npm run test:unit",
+    "svgo": "svgo -f src/icons/svg --config=src/icons/svgo.yml",
+    "new": "plop"
+  },
+  "husky": {
+    "hooks": {
+      "pre-commit": "lint-staged"
+    }
+  },
+  "lint-staged": {
+    "src/**/*.{js,vue}": [
+      "eslint --fix",
+      "git add"
+    ]
+  },
+  "keywords": [
+    "vue",
+    "admin",
+    "go-admin",
+    "go-admin-ui",
+    "dashboard",
+    "element-ui",
+    "boilerplate",
+    "admin-template",
+    "management-system"
+  ],
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/go-admin-team/go-admin.git"
+  },
+  "bugs": {
+    "url": "https://github.com/go-admin-team/go-admin/issues"
+  },
+  "dependencies": {
+    "@riophae/vue-treeselect": "0.4.0",
+    "@tinymce/tinymce-vue": "^3.2.2",
+    "awe-dnd": "^0.3.4",
+    "axios": "0.21.1",
+    "clipboard": "2.0.6",
+    "codemirror": "5.62.0",
+    "core-js": "^3.6.5",
+    "driver.js": "0.9.8",
+    "dropzone": "5.7.2",
+    "echarts": "4.8.0",
+    "element-ui": "2.15.14",
+    "file-saver": "2.0.2",
+    "fuse.js": "6.4.1",
+    "js-cookie": "2.2.1",
+    "jsonlint": "1.6.3",
+    "jszip": "3.5.0",
+    "moment": "^2.27.0",
+    "monaco-editor": "^0.20.0",
+    "normalize.css": "8.0.1",
+    "nprogress": "0.2.0",
+    "path-to-regexp": "6.1.0",
+    "remixicon": "^2.5.0",
+    "sass-resources-loader": "^2.0.3",
+    "screenfull": "5.0.2",
+    "showdown": "^1.9.1",
+    "solarlunar": "^2.0.7",
+    "sortablejs": "^1.10.2",
+    "uuid": "^8.3.0",
+    "viser-vue": "^2.4.8",
+    "vue": "2.6.11",
+    "vue-codemirror": "^4.0.6",
+    "vue-count-to": "1.0.13",
+    "vue-cropper": "^0.5.5",
+    "vue-particles": "^1.0.9",
+    "vue-quill-editor": "^3.0.6",
+    "vue-router": "3.4.7",
+    "vue-splitpane": "1.0.6",
+    "vuedraggable": "2.24.0",
+    "vuex": "3.5.1",
+    "webpack-bundle-analyzer": "^3.8.0",
+    "xlsx": "0.16.5"
+  },
+  "devDependencies": {
+    "@babel/core": "7.11.1",
+    "@babel/register": "^7.10.5",
+    "@babel/runtime": "^7.12.1",
+    "@vue/babel-preset-app": "^4.5.7",
+    "@vue/cli-plugin-babel": "4.4.6",
+    "@vue/cli-plugin-eslint": "^4.4.6",
+    "@vue/cli-plugin-unit-jest": "4.4.6",
+    "@vue/cli-service": "^4.5.13",
+    "@vue/test-utils": "1.0.3",
+    "autoprefixer": "^9.8.6",
+    "babel-core": "7.0.0-bridge.0",
+    "babel-eslint": "10.1.0",
+    "babel-jest": "26.2.2",
+    "babel-plugin-dynamic-import-node": "^2.3.3",
+    "beautifier": "^0.1.7",
+    "chalk": "4.1.0",
+    "chokidar": "3.4.2",
+    "compression-webpack-plugin": "^4.0.0",
+    "connect": "3.7.0",
+    "eslint": "7.6.0",
+    "eslint-plugin-vue": "6.2.2",
+    "form-gen-parser": "^1.0.3",
+    "html-webpack-plugin": "4.3.0",
+    "husky": "4.2.5",
+    "lint-staged": "10.2.11",
+    "mockjs": "1.1.0",
+    "monaco-editor-webpack-plugin": "^1.9.0",
+    "plop": "2.7.4",
+    "runjs": "^4.4.2",
+    "sass": "^1.32.13",
+    "sass-loader": "^10.1.1",
+    "script-ext-html-webpack-plugin": "2.1.4",
+    "script-loader": "0.7.2",
+    "serve-static": "^1.14.1",
+    "svg-sprite-loader": "^5.0.0",
+    "svgo": "1.3.2",
+    "vue-quill-editor": "^3.0.6",
+    "vue-template-compiler": "2.6.11",
+    "webpack": "^4.44.2",
+    "webpack-cli": "^3.3.12"
+  },
+  "engines": {
+    "node": ">=8.9",
+    "npm": ">= 3.0.0"
+  },
+  "browserslist": [
+    "> 1%",
+    "last 2 versions"
+  ]
+}
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: '',
+      value: 'template',
+      checked: true
+    },
+    {
+      name: '
+{{/if}}
+
+{{#if style}}
+
+{{/if}}
diff --git a/plop-templates/view/prompt.js b/plop-templates/view/prompt.js
new file mode 100644
index 0000000..1d490ee
--- /dev/null
+++ b/plop-templates/view/prompt.js
@@ -0,0 +1,55 @@
+const { notEmpty } = require('../utils.js')
+
+module.exports = {
+  description: 'generate a view',
+  prompts: [{
+    type: 'input',
+    name: 'name',
+    message: 'view name please',
+    validate: notEmpty('name')
+  },
+  {
+    type: 'checkbox',
+    name: 'blocks',
+    message: 'Blocks:',
+    choices: [{
+      name: '',
+      value: 'template',
+      checked: true
+    },
+    {
+      name: '
+
+
diff --git a/src/api/admin/dict/data.js b/src/api/admin/dict/data.js
new file mode 100644
index 0000000..f8b09b7
--- /dev/null
+++ b/src/api/admin/dict/data.js
@@ -0,0 +1,62 @@
+import request from '@/utils/request'
+
+// 查询字典数据列表
+export function listData(query) {
+  return request({
+    url: '/api/v1/dict/data?dictType=' + query.dictType,
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询字典数据详细
+export function getData(dictCode) {
+  return request({
+    url: '/api/v1/dict/data/' + dictCode,
+    method: 'get'
+  })
+}
+
+// 根据字典类型查询字典数据信息
+export function getDicts(dictType) {
+  return request({
+    url: '/api/v1/dict-data/option-select?dictType=' + dictType,
+    method: 'get'
+  })
+}
+
+// 新增字典数据
+export function addData(data) {
+  return request({
+    url: '/api/v1/dict/data',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改字典数据
+export function updateData(data) {
+  return request({
+    url: '/api/v1/dict/data/' + data.dictCode,
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除字典数据
+export function delData(dictCode) {
+  return request({
+    url: '/api/v1/dict/data',
+    method: 'delete',
+    data: dictCode
+  })
+}
+
+// 导出字典数据
+export function exportData(query) {
+  return request({
+    url: '/api/v1/dict/data/export',
+    method: 'get',
+    params: query
+  })
+}
diff --git a/src/api/admin/dict/type.js b/src/api/admin/dict/type.js
new file mode 100644
index 0000000..f3d3836
--- /dev/null
+++ b/src/api/admin/dict/type.js
@@ -0,0 +1,62 @@
+import request from '@/utils/request'
+
+// 查询字典类型列表
+export function listType(query) {
+  return request({
+    url: '/api/v1/dict/type',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询字典类型详细
+export function getType(dictId) {
+  return request({
+    url: '/api/v1/dict/type/' + dictId,
+    method: 'get'
+  })
+}
+
+// 新增字典类型
+export function addType(data) {
+  return request({
+    url: '/api/v1/dict/type',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改字典类型
+export function updateType(data) {
+  return request({
+    url: '/api/v1/dict/type/' + data.id,
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除字典类型
+export function delType(dictId) {
+  return request({
+    url: '/api/v1/dict/type',
+    method: 'delete',
+    data: dictId
+  })
+}
+
+// 导出字典类型
+export function exportType(query) {
+  return request({
+    url: '/api/v1/dict/type/export',
+    method: 'get',
+    params: query
+  })
+}
+
+// 获取字典选择框列表
+export function optionselect() {
+  return request({
+    url: '/api/v1/dict/type-option-select',
+    method: 'get'
+  })
+}
diff --git a/src/api/admin/member-balance.js b/src/api/admin/member-balance.js
new file mode 100644
index 0000000..9c55d61
--- /dev/null
+++ b/src/api/admin/member-balance.js
@@ -0,0 +1,47 @@
+import request from '@/utils/request'
+
+// 查询MemberBalance列表
+export function listMemberBalance(query) {
+    return request({
+        url: '/api/v1/member-balance',
+        method: 'get',
+        params: query
+    })
+}
+
+// 查询MemberBalance详细
+export function getMemberBalance (id) {
+    return request({
+        url: '/api/v1/member-balance/' + id,
+        method: 'get'
+    })
+}
+
+
+// 新增MemberBalance
+export function addMemberBalance(data) {
+    return request({
+        url: '/api/v1/member-balance',
+        method: 'post',
+        data: data
+    })
+}
+
+// 修改MemberBalance
+export function updateMemberBalance(data) {
+    return request({
+        url: '/api/v1/member-balance/'+data.id,
+        method: 'put',
+        data: data
+    })
+}
+
+// 删除MemberBalance
+export function delMemberBalance(data) {
+    return request({
+        url: '/api/v1/member-balance',
+        method: 'delete',
+        data: data
+    })
+}
+
diff --git a/src/api/admin/member-proxy.js b/src/api/admin/member-proxy.js
new file mode 100644
index 0000000..62f2a7e
--- /dev/null
+++ b/src/api/admin/member-proxy.js
@@ -0,0 +1,47 @@
+import request from '@/utils/request'
+
+// 查询MemberProxy列表
+export function listMemberProxy(query) {
+    return request({
+        url: '/api/v1/member-proxy',
+        method: 'get',
+        params: query
+    })
+}
+
+// 查询MemberProxy详细
+export function getMemberProxy (id) {
+    return request({
+        url: '/api/v1/member-proxy/' + id,
+        method: 'get'
+    })
+}
+
+
+// 新增MemberProxy
+export function addMemberProxy(data) {
+    return request({
+        url: '/api/v1/member-proxy',
+        method: 'post',
+        data: data
+    })
+}
+
+// 修改MemberProxy
+export function updateMemberProxy(data) {
+    return request({
+        url: '/api/v1/member-proxy/'+data.id,
+        method: 'put',
+        data: data
+    })
+}
+
+// 删除MemberProxy
+export function delMemberProxy(data) {
+    return request({
+        url: '/api/v1/member-proxy',
+        method: 'delete',
+        data: data
+    })
+}
+
diff --git a/src/api/admin/member-recharge.js b/src/api/admin/member-recharge.js
new file mode 100644
index 0000000..c4af3de
--- /dev/null
+++ b/src/api/admin/member-recharge.js
@@ -0,0 +1,47 @@
+import request from '@/utils/request'
+
+// 查询MemberRecharge列表
+export function listMemberRecharge(query) {
+    return request({
+        url: '/api/v1/member-recharge',
+        method: 'get',
+        params: query
+    })
+}
+
+// 查询MemberRecharge详细
+export function getMemberRecharge (id) {
+    return request({
+        url: '/api/v1/member-recharge/' + id,
+        method: 'get'
+    })
+}
+
+
+// 新增MemberRecharge
+export function addMemberRecharge(data) {
+    return request({
+        url: '/api/v1/member-recharge',
+        method: 'post',
+        data: data
+    })
+}
+
+// 修改MemberRecharge
+export function updateMemberRecharge(data) {
+    return request({
+        url: '/api/v1/member-recharge/'+data.id,
+        method: 'put',
+        data: data
+    })
+}
+
+// 删除MemberRecharge
+export function delMemberRecharge(data) {
+    return request({
+        url: '/api/v1/member-recharge',
+        method: 'delete',
+        data: data
+    })
+}
+
diff --git a/src/api/admin/sys-api.js b/src/api/admin/sys-api.js
new file mode 100644
index 0000000..1d4ecc9
--- /dev/null
+++ b/src/api/admin/sys-api.js
@@ -0,0 +1,46 @@
+import request from '@/utils/request'
+
+// 查询SysApi列表
+export function listSysApi(query) {
+  return request({
+    url: '/api/v1/sys-api',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询SysApi详细
+export function getSysApi(id) {
+  return request({
+    url: '/api/v1/sys-api/' + id,
+    method: 'get'
+  })
+}
+
+// 新增SysApi
+export function addSysApi(data) {
+  return request({
+    url: '/api/v1/sys-api',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改SysApi
+export function updateSysApi(data) {
+  return request({
+    url: '/api/v1/sys-api/' + data.id,
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除SysApi
+export function delSysApi(data) {
+  return request({
+    url: '/api/v1/sys-api',
+    method: 'delete',
+    data: data
+  })
+}
+
diff --git a/src/api/admin/sys-config.js b/src/api/admin/sys-config.js
new file mode 100644
index 0000000..6d2059d
--- /dev/null
+++ b/src/api/admin/sys-config.js
@@ -0,0 +1,68 @@
+import request from '@/utils/request'
+
+// 查询参数列表
+export function listConfig(query) {
+  return request({
+    url: '/api/v1/config',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询参数详细
+export function getConfig(configId) {
+  return request({
+    url: '/api/v1/config/' + configId,
+    method: 'get'
+  })
+}
+
+// 根据参数键名查询参数值
+export function getConfigKey(configKey) {
+  return request({
+    url: '/api/v1/configKey/' + configKey,
+    method: 'get'
+  })
+}
+
+// 新增参数配置
+export function addConfig(data) {
+  return request({
+    url: '/api/v1/config',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改参数配置
+export function updateConfig(data) {
+  return request({
+    url: '/api/v1/config/' + data.id,
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除参数配置
+export function delConfig(data) {
+  return request({
+    url: '/api/v1/config',
+    method: 'delete',
+    data: data
+  })
+}
+
+export function getSetConfig(query) {
+  return request({
+    url: '/api/v1/set-config',
+    method: 'get'
+  })
+}
+
+export function updateSetConfig(data) {
+  return request({
+    url: '/api/v1/set-config',
+    method: 'put',
+    data: data
+  })
+}
diff --git a/src/api/admin/sys-dept.js b/src/api/admin/sys-dept.js
new file mode 100644
index 0000000..4875518
--- /dev/null
+++ b/src/api/admin/sys-dept.js
@@ -0,0 +1,60 @@
+import request from '@/utils/request'
+
+export function getDeptList(query) {
+  return request({
+    url: '/api/v1/dept',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询部门详细
+export function getDept(deptId) {
+  return request({
+    url: '/api/v1/dept/' + deptId,
+    method: 'get'
+  })
+}
+
+// 查询部门下拉树结构
+export function treeselect() {
+  return request({
+    url: '/api/v1/deptTree',
+    method: 'get'
+  })
+}
+
+// 根据角色ID查询部门树结构
+export function roleDeptTreeselect(roleId) {
+  return request({
+    url: '/api/v1/roleDeptTreeselect/' + roleId,
+    method: 'get'
+  })
+}
+
+// 新增部门
+export function addDept(data) {
+  return request({
+    url: '/api/v1/dept',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改部门
+export function updateDept(data, id) {
+  return request({
+    url: '/api/v1/dept/' + id,
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除部门
+export function delDept(data) {
+  return request({
+    url: '/api/v1/dept',
+    method: 'delete',
+    data: data
+  })
+}
diff --git a/src/api/admin/sys-login-log.js b/src/api/admin/sys-login-log.js
new file mode 100644
index 0000000..e2f417e
--- /dev/null
+++ b/src/api/admin/sys-login-log.js
@@ -0,0 +1,28 @@
+import request from '@/utils/request'
+
+// 查询SysLoginlog列表
+export function listSysLoginlog(query) {
+  return request({
+    url: '/api/v1/sys-login-log',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询SysLoginlog详细
+export function getSysLoginlog(ID) {
+  return request({
+    url: '/api/v1/sys-login-log/' + ID,
+    method: 'get'
+  })
+}
+
+// 删除SysLoginlog
+export function delSysLoginlog(data) {
+  return request({
+    url: '/api/v1/sys-login-log',
+    method: 'delete',
+    data: data
+  })
+}
+
diff --git a/src/api/admin/sys-menu.js b/src/api/admin/sys-menu.js
new file mode 100644
index 0000000..fd544c5
--- /dev/null
+++ b/src/api/admin/sys-menu.js
@@ -0,0 +1,61 @@
+import request from '@/utils/request'
+
+// 查询菜单列表
+export function listMenu(query) {
+  return request({
+    url: '/api/v1/menu',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询菜单详细
+export function getMenu(menuId) {
+  return request({
+    url: '/api/v1/menu/' + menuId,
+    method: 'get'
+  })
+}
+
+// 查询菜单下拉树结构
+// export function treeselect() {
+//   return request({
+//     url: '/api/v1/menuTreeselect',
+//     method: 'get'
+//   })
+// }
+
+// 根据角色ID查询菜单下拉树结构
+export function roleMenuTreeselect(roleId) {
+  return request({
+    url: '/api/v1/roleMenuTreeselect/' + roleId,
+    method: 'get'
+  })
+}
+
+// 新增菜单
+export function addMenu(data) {
+  return request({
+    url: '/api/v1/menu',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改菜单
+export function updateMenu(data, id) {
+  return request({
+    url: '/api/v1/menu/' + id,
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除菜单
+export function delMenu(data) {
+  return request({
+    url: '/api/v1/menu',
+    method: 'delete',
+    data: data
+  })
+}
diff --git a/src/api/admin/sys-opera-log.js b/src/api/admin/sys-opera-log.js
new file mode 100644
index 0000000..d11d96f
--- /dev/null
+++ b/src/api/admin/sys-opera-log.js
@@ -0,0 +1,28 @@
+import request from '@/utils/request'
+
+// 清空操作日志
+export function cleanOperlog() {
+  return request({
+    url: '/api/v1/operlog/clean',
+    method: 'delete'
+  })
+}
+
+// 查询SysOperlog列表
+export function listSysOperlog(query) {
+  return request({
+    url: '/api/v1/sys-opera-log',
+    method: 'get',
+    params: query
+  })
+}
+
+// 删除SysOperlog
+export function delSysOperlog(data) {
+  return request({
+    url: '/api/v1/sys-opera-log',
+    method: 'delete',
+    data: data
+  })
+}
+
diff --git a/src/api/admin/sys-post.js b/src/api/admin/sys-post.js
new file mode 100644
index 0000000..eaca6d9
--- /dev/null
+++ b/src/api/admin/sys-post.js
@@ -0,0 +1,46 @@
+import request from '@/utils/request'
+
+// 查询岗位列表
+export function listPost(query) {
+  return request({
+    url: '/api/v1/post',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询岗位详细
+export function getPost(postId) {
+  return request({
+    url: '/api/v1/post/' + postId,
+    method: 'get'
+  })
+}
+
+// 新增岗位
+export function addPost(data) {
+  return request({
+    url: '/api/v1/post',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改岗位
+export function updatePost(data, id) {
+  return request({
+    url: '/api/v1/post/' + id,
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除岗位
+export function delPost(postId) {
+  return request({
+    url: '/api/v1/post',
+    method: 'delete',
+    data: postId
+  })
+}
+
diff --git a/src/api/admin/sys-role.js b/src/api/admin/sys-role.js
new file mode 100644
index 0000000..44a483e
--- /dev/null
+++ b/src/api/admin/sys-role.js
@@ -0,0 +1,88 @@
+import request from '@/utils/request'
+
+// 查询角色列表
+export function listRole(query) {
+  return request({
+    url: '/api/v1/role',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询角色详细
+export function getRole(roleId) {
+  return request({
+    url: '/api/v1/role/' + roleId,
+    method: 'get'
+  })
+}
+
+// 新增角色
+export function addRole(data) {
+  return request({
+    url: '/api/v1/role',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改角色
+export function updateRole(data, roleId) {
+  return request({
+    url: '/api/v1/role/' + roleId,
+    method: 'put',
+    data: data
+  })
+}
+
+// 角色数据权限
+export function dataScope(data) {
+  return request({
+    url: '/api/v1/roledatascope',
+    method: 'put',
+    data: data
+  })
+}
+
+// 角色状态修改
+export function changeRoleStatus(roleId, status) {
+  const data = {
+    roleId,
+    status
+  }
+  return request({
+    url: '/api/v1/role-status',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除角色
+export function delRole(roleId) {
+  return request({
+    url: '/api/v1/role',
+    method: 'delete',
+    data: roleId
+  })
+}
+
+export function getListrole(id) {
+  return request({
+    url: '/api/v1/menu/role/' + id,
+    method: 'get'
+  })
+}
+
+export function getRoutes() {
+  return request({
+    url: '/api/v1/menurole',
+    method: 'get'
+  })
+}
+
+// export function getMenuNames() {
+//   return request({
+//     url: '/api/v1/menuids',
+//     method: 'get'
+//   })
+// }
diff --git a/src/api/admin/sys-user.js b/src/api/admin/sys-user.js
new file mode 100644
index 0000000..07c1d0a
--- /dev/null
+++ b/src/api/admin/sys-user.js
@@ -0,0 +1,135 @@
+import request from '@/utils/request'
+
+// 查询用户列表
+export function listUser(query) {
+  return request({
+    url: '/api/v1/sys-user',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询用户详细
+export function getUser(userId) {
+  return request({
+    url: '/api/v1/sys-user/' + userId,
+    method: 'get'
+  })
+}
+
+export function getUserInit() {
+  return request({
+    url: '/api/v1/sys-user/',
+    method: 'get'
+  })
+}
+
+// 新增用户
+export function addUser(data) {
+  return request({
+    url: '/api/v1/sys-user',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改用户
+export function updateUser(data) {
+  return request({
+    url: '/api/v1/sys-user',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除用户
+export function delUser(data) {
+  return request({
+    url: '/api/v1/sys-user',
+    method: 'delete',
+    data: data
+  })
+}
+
+// 导出用户
+export function exportUser(query) {
+  return request({
+    url: '/api/v1/sys-user/export',
+    method: 'get',
+    params: query
+  })
+}
+
+// 用户密码重置
+export function resetUserPwd(userId, password) {
+  const data = {
+    userId,
+    password
+  }
+  return request({
+    url: '/api/v1/user/pwd/reset',
+    method: 'put',
+    data: data
+  })
+}
+
+// 用户状态修改
+export function changeUserStatus(e) {
+  const data = {
+    userId: e.userId,
+    status: e.status
+  }
+  return request({
+    url: '/api/v1/user/status',
+    method: 'put',
+    data: data
+  })
+}
+
+// 修改用户个人信息
+export function updateUserProfile(data) {
+  return request({
+    url: '/api/v1/sys-user/profile',
+    method: 'put',
+    data: data
+  })
+}
+
+// 下载用户导入模板
+export function importTemplate() {
+  return request({
+    url: '/api/v1/sys-user/importTemplate',
+    method: 'get'
+  })
+}
+
+// 用户密码重置
+export function updateUserPwd(oldPassword, newPassword) {
+  const data = {
+    oldPassword,
+    newPassword
+  }
+  return request({
+    url: '/api/v1/user/pwd/set',
+    method: 'put',
+    data: data
+  })
+}
+
+// 用户头像上传
+export function uploadAvatar(data) {
+  return request({
+    url: '/api/v1/user/avatar',
+    method: 'post',
+    data: data
+  })
+}
+
+// 查询用户个人信息
+export function getUserProfile() {
+  return request({
+    url: '/api/v1/user/profile',
+    method: 'get'
+  })
+}
+
diff --git a/src/api/job/sys-job.js b/src/api/job/sys-job.js
new file mode 100644
index 0000000..83e5b5c
--- /dev/null
+++ b/src/api/job/sys-job.js
@@ -0,0 +1,62 @@
+import request from '@/utils/request'
+
+// 查询SysJob列表
+export function listSysJob(query) {
+  return request({
+    url: '/api/v1/sysjob',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询SysJob详细
+export function getSysJob(jobId) {
+  return request({
+    url: '/api/v1/sysjob/' + jobId,
+    method: 'get'
+  })
+}
+
+// 新增SysJob
+export function addSysJob(data) {
+  return request({
+    url: '/api/v1/sysjob',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改SysJob
+export function updateSysJob(data) {
+  return request({
+    url: '/api/v1/sysjob',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除SysJob
+export function delSysJob(data) {
+  return request({
+    url: '/api/v1/sysjob',
+    method: 'delete',
+    data: data
+  })
+}
+
+// 移除SysJob
+export function removeJob(jobId) {
+  return request({
+    url: '/api/v1/job/remove/' + jobId,
+    method: 'get'
+  })
+}
+
+// 启动SysJob
+export function startJob(jobId) {
+  return request({
+    url: '/api/v1/job/start/' + jobId,
+    method: 'get'
+  })
+}
+
diff --git a/src/api/login.js b/src/api/login.js
new file mode 100644
index 0000000..d8b2c4b
--- /dev/null
+++ b/src/api/login.js
@@ -0,0 +1,17 @@
+import request from '@/utils/request'
+
+// 获取验证码
+export function getCodeImg() {
+  return request({
+    url: '/api/v1/captcha',
+    method: 'get'
+  })
+}
+
+// 查询 此接口不在验证数据权限
+export function getSetting() {
+  return request({
+    url: '/api/v1/app-config',
+    method: 'get'
+  })
+}
diff --git a/src/api/monitor/server.js b/src/api/monitor/server.js
new file mode 100644
index 0000000..1c95fe3
--- /dev/null
+++ b/src/api/monitor/server.js
@@ -0,0 +1,9 @@
+import request from '@/utils/request'
+
+// 查询服务器详细
+export function getServer() {
+  return request({
+    url: '/api/v1/server-monitor',
+    method: 'get'
+  })
+}
diff --git a/src/api/remote-search.js b/src/api/remote-search.js
new file mode 100644
index 0000000..c7e1911
--- /dev/null
+++ b/src/api/remote-search.js
@@ -0,0 +1,17 @@
+import request from '@/utils/request'
+
+export function searchUser(name) {
+  return request({
+    url: '/search/user',
+    method: 'get',
+    params: { name }
+  })
+}
+
+export function transactionList(query) {
+  return request({
+    url: '/transaction/list',
+    method: 'get',
+    params: query
+  })
+}
diff --git a/src/api/schedule.js b/src/api/schedule.js
new file mode 100644
index 0000000..367a254
--- /dev/null
+++ b/src/api/schedule.js
@@ -0,0 +1,43 @@
+import request from '@/utils/request'
+
+export function list(data) {
+  return request({
+    url: 'api/v1/schedule/list',
+    method: 'get',
+    params: data
+  })
+}
+
+export function add(data) {
+  return request({
+    url: 'api/v1/schedule/add',
+    method: 'post',
+    data
+  })
+}
+
+export function edit(data) {
+  return request({
+    url: 'api/v1/schedule/update',
+    method: 'put',
+    data
+  })
+}
+
+export function getSchedule(id) {
+  return request({
+    url: 'api/v1/schedule/query',
+    method: 'get',
+    params: {
+      id
+    }
+  })
+}
+
+export function deleteSchedule(data) {
+  return request({
+    url: 'api/v1/schedule/delete',
+    method: 'delete',
+    data
+  })
+}
diff --git a/src/api/table.js b/src/api/table.js
new file mode 100644
index 0000000..c514499
--- /dev/null
+++ b/src/api/table.js
@@ -0,0 +1,20 @@
+// 查询列表
+export function getItems(f, query) {
+  query = query || { pageSize: 10000 }
+  return f(query)
+}
+
+export function setItems(response, k, v) {
+  const data = []
+  k = k || 'id'
+  v = v || 'name'
+  if (response.data && response.data.list && response.data.list.length > 0) {
+    response.data.list.forEach(e => {
+      data.push({
+        key: e[k].toString(),
+        value: e[v].toString()
+      })
+    })
+    return data
+  }
+}
diff --git a/src/api/tools/gen.js b/src/api/tools/gen.js
new file mode 100644
index 0000000..cc4846c
--- /dev/null
+++ b/src/api/tools/gen.js
@@ -0,0 +1,103 @@
+import request from '@/utils/request'
+
+// 查询生成表数据
+export function listTable(query) {
+  return request({
+    url: '/api/v1/sys/tables/page',
+    method: 'get',
+    params: query
+  })
+}
+// 查询db数据库列表
+export function listDbTable(query) {
+  return request({
+    url: '/api/v1/db/tables/page',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询表详细信息
+export function getGenTable(tableId) {
+  return request({
+    url: '/api/v1/sys/tables/info/' + tableId,
+    method: 'get'
+  })
+}
+
+export function getGenTableInfo(tablename) {
+  return request({
+    url: '/api/v1/sys/tables?tableName=' + tablename,
+    method: 'get'
+  })
+}
+
+// 修改代码生成信息
+export function updateGenTable(data) {
+  return request({
+    url: '/api/v1/sys/tables/info',
+    method: 'put',
+    data: data
+  })
+}
+
+// 导入表
+export function importTable(data) {
+  return request({
+    url: '/api/v1/sys/tables/info',
+    method: 'post',
+    params: data
+  })
+}
+// 预览生成代码
+export function previewTable(tableId) {
+  return request({
+    url: '/api/v1/gen/preview/' + tableId,
+    method: 'get'
+  })
+}
+// 删除表数据
+export function delTable(tableId) {
+  return request({
+    url: '/api/v1/sys/tables/info/' + tableId,
+    method: 'delete'
+  })
+}
+
+// 生成代码到项目
+export function toProjectTable(tableId) {
+  return request({
+    url: '/api/v1/gen/toproject/' + tableId,
+    method: 'get'
+  })
+}
+
+// 生成接口数据到迁移脚本
+export function apiToFile(tableId) {
+  return request({
+    url: '/api/v1/gen/apitofile/' + tableId,
+    method: 'get'
+  })
+}
+
+export function toProjectTableCheckRole(tableId, ischeckrole) {
+  return request({
+    url: '/api/v1/gen/toproject/' + tableId + '?ischeckrole=' + ischeckrole,
+    method: 'get'
+  })
+}
+
+// 生成菜单到数据库
+export function toDBTable(tableId) {
+  return request({
+    url: '/api/v1/gen/todb/' + tableId,
+    method: 'get'
+  })
+}
+
+export function getTableTree() {
+  return request({
+    url: '/api/v1/gen/tabletree',
+    method: 'get'
+  })
+}
diff --git a/src/api/user.js b/src/api/user.js
new file mode 100644
index 0000000..7b46cf8
--- /dev/null
+++ b/src/api/user.js
@@ -0,0 +1,36 @@
+import request from '@/utils/request'
+
+// login 登陆
+export function login(data) {
+  return request({
+    url: '/api/v1/login',
+    method: 'post',
+    data
+  })
+}
+
+// logout 退出
+export function logout() {
+  return request({
+    url: '/api/v1/logout',
+    method: 'post'
+  })
+}
+
+// refreshtoken 刷新token
+export function refreshtoken(data) {
+  return request({
+    url: '/refreshtoken',
+    method: 'post',
+    data
+  })
+}
+
+// getInfo 获取用户基本信息
+export function getInfo() {
+  return request({
+    url: '/api/v1/getinfo',
+    method: 'get'
+  })
+}
+
diff --git a/src/api/ws.js b/src/api/ws.js
new file mode 100644
index 0000000..4c31e09
--- /dev/null
+++ b/src/api/ws.js
@@ -0,0 +1,9 @@
+import request from '@/utils/request'
+
+// 查询SysJob列表
+export function unWsLogout(id, group) {
+  return request({
+    url: '/wslogout/' + id + '/' + group,
+    method: 'get'
+  })
+}
diff --git a/src/assets/401_images/401.gif b/src/assets/401_images/401.gif
new file mode 100644
index 0000000000000000000000000000000000000000..cd6e0d9433421b3f29d0ec0c40f755e354728000
GIT binary patch
literal 164227
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
+
+## 🤝 Link
+[Go developer growth roadmap](http://www.golangroadmap.com/)
+
+## 🔑 License
+
+[MIT](https://github.com/go-admin-team/go-admin/blob/master/LICENSE.md)
+
+Copyright (c) 2020 wenjianzhang
\ No newline at end of file
diff --git a/babel.config.js b/babel.config.js
new file mode 100644
index 0000000..34be5d7
--- /dev/null
+++ b/babel.config.js
@@ -0,0 +1,10 @@
+module.exports = {
+  presets: [
+    '@vue/cli-plugin-babel/preset'
+  ],
+  env: {
+    development: {
+      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/package.json b/package.json
new file mode 100644
index 0000000..05e26f2
--- /dev/null
+++ b/package.json
@@ -0,0 +1,140 @@
+{
+  "name": "go-admin",
+  "version": "2.0.6",
+  "description": "A magical vue admin. An out-of-box UI solution for enterprise applications. Newest development stack of vue. Lots of awesome features",
+  "author": "https://github.com/wenjianzhang",
+  "license": "MIT",
+  "scripts": {
+    "dev": "vue-cli-service serve",
+    "build:prod": "vue-cli-service build",
+    "build:stage": "vue-cli-service build --mode staging",
+    "preview": "node build/index.js --preview",
+    "lint": "eslint --ext .js,.vue src",
+    "test:unit": "jest --clearCache && vue-cli-service test:unit",
+    "test:ci": "npm run lint && npm run test:unit",
+    "svgo": "svgo -f src/icons/svg --config=src/icons/svgo.yml",
+    "new": "plop"
+  },
+  "husky": {
+    "hooks": {
+      "pre-commit": "lint-staged"
+    }
+  },
+  "lint-staged": {
+    "src/**/*.{js,vue}": [
+      "eslint --fix",
+      "git add"
+    ]
+  },
+  "keywords": [
+    "vue",
+    "admin",
+    "go-admin",
+    "go-admin-ui",
+    "dashboard",
+    "element-ui",
+    "boilerplate",
+    "admin-template",
+    "management-system"
+  ],
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/go-admin-team/go-admin.git"
+  },
+  "bugs": {
+    "url": "https://github.com/go-admin-team/go-admin/issues"
+  },
+  "dependencies": {
+    "@riophae/vue-treeselect": "0.4.0",
+    "@tinymce/tinymce-vue": "^3.2.2",
+    "awe-dnd": "^0.3.4",
+    "axios": "0.21.1",
+    "clipboard": "2.0.6",
+    "codemirror": "5.62.0",
+    "core-js": "^3.6.5",
+    "driver.js": "0.9.8",
+    "dropzone": "5.7.2",
+    "echarts": "4.8.0",
+    "element-ui": "2.15.14",
+    "file-saver": "2.0.2",
+    "fuse.js": "6.4.1",
+    "js-cookie": "2.2.1",
+    "jsonlint": "1.6.3",
+    "jszip": "3.5.0",
+    "moment": "^2.27.0",
+    "monaco-editor": "^0.20.0",
+    "normalize.css": "8.0.1",
+    "nprogress": "0.2.0",
+    "path-to-regexp": "6.1.0",
+    "remixicon": "^2.5.0",
+    "sass-resources-loader": "^2.0.3",
+    "screenfull": "5.0.2",
+    "showdown": "^1.9.1",
+    "solarlunar": "^2.0.7",
+    "sortablejs": "^1.10.2",
+    "uuid": "^8.3.0",
+    "viser-vue": "^2.4.8",
+    "vue": "2.6.11",
+    "vue-codemirror": "^4.0.6",
+    "vue-count-to": "1.0.13",
+    "vue-cropper": "^0.5.5",
+    "vue-particles": "^1.0.9",
+    "vue-quill-editor": "^3.0.6",
+    "vue-router": "3.4.7",
+    "vue-splitpane": "1.0.6",
+    "vuedraggable": "2.24.0",
+    "vuex": "3.5.1",
+    "webpack-bundle-analyzer": "^3.8.0",
+    "xlsx": "0.16.5"
+  },
+  "devDependencies": {
+    "@babel/core": "7.11.1",
+    "@babel/register": "^7.10.5",
+    "@babel/runtime": "^7.12.1",
+    "@vue/babel-preset-app": "^4.5.7",
+    "@vue/cli-plugin-babel": "4.4.6",
+    "@vue/cli-plugin-eslint": "^4.4.6",
+    "@vue/cli-plugin-unit-jest": "4.4.6",
+    "@vue/cli-service": "^4.5.13",
+    "@vue/test-utils": "1.0.3",
+    "autoprefixer": "^9.8.6",
+    "babel-core": "7.0.0-bridge.0",
+    "babel-eslint": "10.1.0",
+    "babel-jest": "26.2.2",
+    "babel-plugin-dynamic-import-node": "^2.3.3",
+    "beautifier": "^0.1.7",
+    "chalk": "4.1.0",
+    "chokidar": "3.4.2",
+    "compression-webpack-plugin": "^4.0.0",
+    "connect": "3.7.0",
+    "eslint": "7.6.0",
+    "eslint-plugin-vue": "6.2.2",
+    "form-gen-parser": "^1.0.3",
+    "html-webpack-plugin": "4.3.0",
+    "husky": "4.2.5",
+    "lint-staged": "10.2.11",
+    "mockjs": "1.1.0",
+    "monaco-editor-webpack-plugin": "^1.9.0",
+    "plop": "2.7.4",
+    "runjs": "^4.4.2",
+    "sass": "^1.32.13",
+    "sass-loader": "^10.1.1",
+    "script-ext-html-webpack-plugin": "2.1.4",
+    "script-loader": "0.7.2",
+    "serve-static": "^1.14.1",
+    "svg-sprite-loader": "^5.0.0",
+    "svgo": "1.3.2",
+    "vue-quill-editor": "^3.0.6",
+    "vue-template-compiler": "2.6.11",
+    "webpack": "^4.44.2",
+    "webpack-cli": "^3.3.12"
+  },
+  "engines": {
+    "node": ">=8.9",
+    "npm": ">= 3.0.0"
+  },
+  "browserslist": [
+    "> 1%",
+    "last 2 versions"
+  ]
+}
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: '',
+      value: 'template',
+      checked: true
+    },
+    {
+      name: '
+{{/if}}
+
+{{#if style}}
+
+{{/if}}
diff --git a/plop-templates/view/prompt.js b/plop-templates/view/prompt.js
new file mode 100644
index 0000000..1d490ee
--- /dev/null
+++ b/plop-templates/view/prompt.js
@@ -0,0 +1,55 @@
+const { notEmpty } = require('../utils.js')
+
+module.exports = {
+  description: 'generate a view',
+  prompts: [{
+    type: 'input',
+    name: 'name',
+    message: 'view name please',
+    validate: notEmpty('name')
+  },
+  {
+    type: 'checkbox',
+    name: 'blocks',
+    message: 'Blocks:',
+    choices: [{
+      name: '',
+      value: 'template',
+      checked: true
+    },
+    {
+      name: '
+
+
diff --git a/src/api/admin/dict/data.js b/src/api/admin/dict/data.js
new file mode 100644
index 0000000..f8b09b7
--- /dev/null
+++ b/src/api/admin/dict/data.js
@@ -0,0 +1,62 @@
+import request from '@/utils/request'
+
+// 查询字典数据列表
+export function listData(query) {
+  return request({
+    url: '/api/v1/dict/data?dictType=' + query.dictType,
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询字典数据详细
+export function getData(dictCode) {
+  return request({
+    url: '/api/v1/dict/data/' + dictCode,
+    method: 'get'
+  })
+}
+
+// 根据字典类型查询字典数据信息
+export function getDicts(dictType) {
+  return request({
+    url: '/api/v1/dict-data/option-select?dictType=' + dictType,
+    method: 'get'
+  })
+}
+
+// 新增字典数据
+export function addData(data) {
+  return request({
+    url: '/api/v1/dict/data',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改字典数据
+export function updateData(data) {
+  return request({
+    url: '/api/v1/dict/data/' + data.dictCode,
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除字典数据
+export function delData(dictCode) {
+  return request({
+    url: '/api/v1/dict/data',
+    method: 'delete',
+    data: dictCode
+  })
+}
+
+// 导出字典数据
+export function exportData(query) {
+  return request({
+    url: '/api/v1/dict/data/export',
+    method: 'get',
+    params: query
+  })
+}
diff --git a/src/api/admin/dict/type.js b/src/api/admin/dict/type.js
new file mode 100644
index 0000000..f3d3836
--- /dev/null
+++ b/src/api/admin/dict/type.js
@@ -0,0 +1,62 @@
+import request from '@/utils/request'
+
+// 查询字典类型列表
+export function listType(query) {
+  return request({
+    url: '/api/v1/dict/type',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询字典类型详细
+export function getType(dictId) {
+  return request({
+    url: '/api/v1/dict/type/' + dictId,
+    method: 'get'
+  })
+}
+
+// 新增字典类型
+export function addType(data) {
+  return request({
+    url: '/api/v1/dict/type',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改字典类型
+export function updateType(data) {
+  return request({
+    url: '/api/v1/dict/type/' + data.id,
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除字典类型
+export function delType(dictId) {
+  return request({
+    url: '/api/v1/dict/type',
+    method: 'delete',
+    data: dictId
+  })
+}
+
+// 导出字典类型
+export function exportType(query) {
+  return request({
+    url: '/api/v1/dict/type/export',
+    method: 'get',
+    params: query
+  })
+}
+
+// 获取字典选择框列表
+export function optionselect() {
+  return request({
+    url: '/api/v1/dict/type-option-select',
+    method: 'get'
+  })
+}
diff --git a/src/api/admin/member-balance.js b/src/api/admin/member-balance.js
new file mode 100644
index 0000000..9c55d61
--- /dev/null
+++ b/src/api/admin/member-balance.js
@@ -0,0 +1,47 @@
+import request from '@/utils/request'
+
+// 查询MemberBalance列表
+export function listMemberBalance(query) {
+    return request({
+        url: '/api/v1/member-balance',
+        method: 'get',
+        params: query
+    })
+}
+
+// 查询MemberBalance详细
+export function getMemberBalance (id) {
+    return request({
+        url: '/api/v1/member-balance/' + id,
+        method: 'get'
+    })
+}
+
+
+// 新增MemberBalance
+export function addMemberBalance(data) {
+    return request({
+        url: '/api/v1/member-balance',
+        method: 'post',
+        data: data
+    })
+}
+
+// 修改MemberBalance
+export function updateMemberBalance(data) {
+    return request({
+        url: '/api/v1/member-balance/'+data.id,
+        method: 'put',
+        data: data
+    })
+}
+
+// 删除MemberBalance
+export function delMemberBalance(data) {
+    return request({
+        url: '/api/v1/member-balance',
+        method: 'delete',
+        data: data
+    })
+}
+
diff --git a/src/api/admin/member-proxy.js b/src/api/admin/member-proxy.js
new file mode 100644
index 0000000..62f2a7e
--- /dev/null
+++ b/src/api/admin/member-proxy.js
@@ -0,0 +1,47 @@
+import request from '@/utils/request'
+
+// 查询MemberProxy列表
+export function listMemberProxy(query) {
+    return request({
+        url: '/api/v1/member-proxy',
+        method: 'get',
+        params: query
+    })
+}
+
+// 查询MemberProxy详细
+export function getMemberProxy (id) {
+    return request({
+        url: '/api/v1/member-proxy/' + id,
+        method: 'get'
+    })
+}
+
+
+// 新增MemberProxy
+export function addMemberProxy(data) {
+    return request({
+        url: '/api/v1/member-proxy',
+        method: 'post',
+        data: data
+    })
+}
+
+// 修改MemberProxy
+export function updateMemberProxy(data) {
+    return request({
+        url: '/api/v1/member-proxy/'+data.id,
+        method: 'put',
+        data: data
+    })
+}
+
+// 删除MemberProxy
+export function delMemberProxy(data) {
+    return request({
+        url: '/api/v1/member-proxy',
+        method: 'delete',
+        data: data
+    })
+}
+
diff --git a/src/api/admin/member-recharge.js b/src/api/admin/member-recharge.js
new file mode 100644
index 0000000..c4af3de
--- /dev/null
+++ b/src/api/admin/member-recharge.js
@@ -0,0 +1,47 @@
+import request from '@/utils/request'
+
+// 查询MemberRecharge列表
+export function listMemberRecharge(query) {
+    return request({
+        url: '/api/v1/member-recharge',
+        method: 'get',
+        params: query
+    })
+}
+
+// 查询MemberRecharge详细
+export function getMemberRecharge (id) {
+    return request({
+        url: '/api/v1/member-recharge/' + id,
+        method: 'get'
+    })
+}
+
+
+// 新增MemberRecharge
+export function addMemberRecharge(data) {
+    return request({
+        url: '/api/v1/member-recharge',
+        method: 'post',
+        data: data
+    })
+}
+
+// 修改MemberRecharge
+export function updateMemberRecharge(data) {
+    return request({
+        url: '/api/v1/member-recharge/'+data.id,
+        method: 'put',
+        data: data
+    })
+}
+
+// 删除MemberRecharge
+export function delMemberRecharge(data) {
+    return request({
+        url: '/api/v1/member-recharge',
+        method: 'delete',
+        data: data
+    })
+}
+
diff --git a/src/api/admin/sys-api.js b/src/api/admin/sys-api.js
new file mode 100644
index 0000000..1d4ecc9
--- /dev/null
+++ b/src/api/admin/sys-api.js
@@ -0,0 +1,46 @@
+import request from '@/utils/request'
+
+// 查询SysApi列表
+export function listSysApi(query) {
+  return request({
+    url: '/api/v1/sys-api',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询SysApi详细
+export function getSysApi(id) {
+  return request({
+    url: '/api/v1/sys-api/' + id,
+    method: 'get'
+  })
+}
+
+// 新增SysApi
+export function addSysApi(data) {
+  return request({
+    url: '/api/v1/sys-api',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改SysApi
+export function updateSysApi(data) {
+  return request({
+    url: '/api/v1/sys-api/' + data.id,
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除SysApi
+export function delSysApi(data) {
+  return request({
+    url: '/api/v1/sys-api',
+    method: 'delete',
+    data: data
+  })
+}
+
diff --git a/src/api/admin/sys-config.js b/src/api/admin/sys-config.js
new file mode 100644
index 0000000..6d2059d
--- /dev/null
+++ b/src/api/admin/sys-config.js
@@ -0,0 +1,68 @@
+import request from '@/utils/request'
+
+// 查询参数列表
+export function listConfig(query) {
+  return request({
+    url: '/api/v1/config',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询参数详细
+export function getConfig(configId) {
+  return request({
+    url: '/api/v1/config/' + configId,
+    method: 'get'
+  })
+}
+
+// 根据参数键名查询参数值
+export function getConfigKey(configKey) {
+  return request({
+    url: '/api/v1/configKey/' + configKey,
+    method: 'get'
+  })
+}
+
+// 新增参数配置
+export function addConfig(data) {
+  return request({
+    url: '/api/v1/config',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改参数配置
+export function updateConfig(data) {
+  return request({
+    url: '/api/v1/config/' + data.id,
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除参数配置
+export function delConfig(data) {
+  return request({
+    url: '/api/v1/config',
+    method: 'delete',
+    data: data
+  })
+}
+
+export function getSetConfig(query) {
+  return request({
+    url: '/api/v1/set-config',
+    method: 'get'
+  })
+}
+
+export function updateSetConfig(data) {
+  return request({
+    url: '/api/v1/set-config',
+    method: 'put',
+    data: data
+  })
+}
diff --git a/src/api/admin/sys-dept.js b/src/api/admin/sys-dept.js
new file mode 100644
index 0000000..4875518
--- /dev/null
+++ b/src/api/admin/sys-dept.js
@@ -0,0 +1,60 @@
+import request from '@/utils/request'
+
+export function getDeptList(query) {
+  return request({
+    url: '/api/v1/dept',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询部门详细
+export function getDept(deptId) {
+  return request({
+    url: '/api/v1/dept/' + deptId,
+    method: 'get'
+  })
+}
+
+// 查询部门下拉树结构
+export function treeselect() {
+  return request({
+    url: '/api/v1/deptTree',
+    method: 'get'
+  })
+}
+
+// 根据角色ID查询部门树结构
+export function roleDeptTreeselect(roleId) {
+  return request({
+    url: '/api/v1/roleDeptTreeselect/' + roleId,
+    method: 'get'
+  })
+}
+
+// 新增部门
+export function addDept(data) {
+  return request({
+    url: '/api/v1/dept',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改部门
+export function updateDept(data, id) {
+  return request({
+    url: '/api/v1/dept/' + id,
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除部门
+export function delDept(data) {
+  return request({
+    url: '/api/v1/dept',
+    method: 'delete',
+    data: data
+  })
+}
diff --git a/src/api/admin/sys-login-log.js b/src/api/admin/sys-login-log.js
new file mode 100644
index 0000000..e2f417e
--- /dev/null
+++ b/src/api/admin/sys-login-log.js
@@ -0,0 +1,28 @@
+import request from '@/utils/request'
+
+// 查询SysLoginlog列表
+export function listSysLoginlog(query) {
+  return request({
+    url: '/api/v1/sys-login-log',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询SysLoginlog详细
+export function getSysLoginlog(ID) {
+  return request({
+    url: '/api/v1/sys-login-log/' + ID,
+    method: 'get'
+  })
+}
+
+// 删除SysLoginlog
+export function delSysLoginlog(data) {
+  return request({
+    url: '/api/v1/sys-login-log',
+    method: 'delete',
+    data: data
+  })
+}
+
diff --git a/src/api/admin/sys-menu.js b/src/api/admin/sys-menu.js
new file mode 100644
index 0000000..fd544c5
--- /dev/null
+++ b/src/api/admin/sys-menu.js
@@ -0,0 +1,61 @@
+import request from '@/utils/request'
+
+// 查询菜单列表
+export function listMenu(query) {
+  return request({
+    url: '/api/v1/menu',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询菜单详细
+export function getMenu(menuId) {
+  return request({
+    url: '/api/v1/menu/' + menuId,
+    method: 'get'
+  })
+}
+
+// 查询菜单下拉树结构
+// export function treeselect() {
+//   return request({
+//     url: '/api/v1/menuTreeselect',
+//     method: 'get'
+//   })
+// }
+
+// 根据角色ID查询菜单下拉树结构
+export function roleMenuTreeselect(roleId) {
+  return request({
+    url: '/api/v1/roleMenuTreeselect/' + roleId,
+    method: 'get'
+  })
+}
+
+// 新增菜单
+export function addMenu(data) {
+  return request({
+    url: '/api/v1/menu',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改菜单
+export function updateMenu(data, id) {
+  return request({
+    url: '/api/v1/menu/' + id,
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除菜单
+export function delMenu(data) {
+  return request({
+    url: '/api/v1/menu',
+    method: 'delete',
+    data: data
+  })
+}
diff --git a/src/api/admin/sys-opera-log.js b/src/api/admin/sys-opera-log.js
new file mode 100644
index 0000000..d11d96f
--- /dev/null
+++ b/src/api/admin/sys-opera-log.js
@@ -0,0 +1,28 @@
+import request from '@/utils/request'
+
+// 清空操作日志
+export function cleanOperlog() {
+  return request({
+    url: '/api/v1/operlog/clean',
+    method: 'delete'
+  })
+}
+
+// 查询SysOperlog列表
+export function listSysOperlog(query) {
+  return request({
+    url: '/api/v1/sys-opera-log',
+    method: 'get',
+    params: query
+  })
+}
+
+// 删除SysOperlog
+export function delSysOperlog(data) {
+  return request({
+    url: '/api/v1/sys-opera-log',
+    method: 'delete',
+    data: data
+  })
+}
+
diff --git a/src/api/admin/sys-post.js b/src/api/admin/sys-post.js
new file mode 100644
index 0000000..eaca6d9
--- /dev/null
+++ b/src/api/admin/sys-post.js
@@ -0,0 +1,46 @@
+import request from '@/utils/request'
+
+// 查询岗位列表
+export function listPost(query) {
+  return request({
+    url: '/api/v1/post',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询岗位详细
+export function getPost(postId) {
+  return request({
+    url: '/api/v1/post/' + postId,
+    method: 'get'
+  })
+}
+
+// 新增岗位
+export function addPost(data) {
+  return request({
+    url: '/api/v1/post',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改岗位
+export function updatePost(data, id) {
+  return request({
+    url: '/api/v1/post/' + id,
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除岗位
+export function delPost(postId) {
+  return request({
+    url: '/api/v1/post',
+    method: 'delete',
+    data: postId
+  })
+}
+
diff --git a/src/api/admin/sys-role.js b/src/api/admin/sys-role.js
new file mode 100644
index 0000000..44a483e
--- /dev/null
+++ b/src/api/admin/sys-role.js
@@ -0,0 +1,88 @@
+import request from '@/utils/request'
+
+// 查询角色列表
+export function listRole(query) {
+  return request({
+    url: '/api/v1/role',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询角色详细
+export function getRole(roleId) {
+  return request({
+    url: '/api/v1/role/' + roleId,
+    method: 'get'
+  })
+}
+
+// 新增角色
+export function addRole(data) {
+  return request({
+    url: '/api/v1/role',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改角色
+export function updateRole(data, roleId) {
+  return request({
+    url: '/api/v1/role/' + roleId,
+    method: 'put',
+    data: data
+  })
+}
+
+// 角色数据权限
+export function dataScope(data) {
+  return request({
+    url: '/api/v1/roledatascope',
+    method: 'put',
+    data: data
+  })
+}
+
+// 角色状态修改
+export function changeRoleStatus(roleId, status) {
+  const data = {
+    roleId,
+    status
+  }
+  return request({
+    url: '/api/v1/role-status',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除角色
+export function delRole(roleId) {
+  return request({
+    url: '/api/v1/role',
+    method: 'delete',
+    data: roleId
+  })
+}
+
+export function getListrole(id) {
+  return request({
+    url: '/api/v1/menu/role/' + id,
+    method: 'get'
+  })
+}
+
+export function getRoutes() {
+  return request({
+    url: '/api/v1/menurole',
+    method: 'get'
+  })
+}
+
+// export function getMenuNames() {
+//   return request({
+//     url: '/api/v1/menuids',
+//     method: 'get'
+//   })
+// }
diff --git a/src/api/admin/sys-user.js b/src/api/admin/sys-user.js
new file mode 100644
index 0000000..07c1d0a
--- /dev/null
+++ b/src/api/admin/sys-user.js
@@ -0,0 +1,135 @@
+import request from '@/utils/request'
+
+// 查询用户列表
+export function listUser(query) {
+  return request({
+    url: '/api/v1/sys-user',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询用户详细
+export function getUser(userId) {
+  return request({
+    url: '/api/v1/sys-user/' + userId,
+    method: 'get'
+  })
+}
+
+export function getUserInit() {
+  return request({
+    url: '/api/v1/sys-user/',
+    method: 'get'
+  })
+}
+
+// 新增用户
+export function addUser(data) {
+  return request({
+    url: '/api/v1/sys-user',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改用户
+export function updateUser(data) {
+  return request({
+    url: '/api/v1/sys-user',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除用户
+export function delUser(data) {
+  return request({
+    url: '/api/v1/sys-user',
+    method: 'delete',
+    data: data
+  })
+}
+
+// 导出用户
+export function exportUser(query) {
+  return request({
+    url: '/api/v1/sys-user/export',
+    method: 'get',
+    params: query
+  })
+}
+
+// 用户密码重置
+export function resetUserPwd(userId, password) {
+  const data = {
+    userId,
+    password
+  }
+  return request({
+    url: '/api/v1/user/pwd/reset',
+    method: 'put',
+    data: data
+  })
+}
+
+// 用户状态修改
+export function changeUserStatus(e) {
+  const data = {
+    userId: e.userId,
+    status: e.status
+  }
+  return request({
+    url: '/api/v1/user/status',
+    method: 'put',
+    data: data
+  })
+}
+
+// 修改用户个人信息
+export function updateUserProfile(data) {
+  return request({
+    url: '/api/v1/sys-user/profile',
+    method: 'put',
+    data: data
+  })
+}
+
+// 下载用户导入模板
+export function importTemplate() {
+  return request({
+    url: '/api/v1/sys-user/importTemplate',
+    method: 'get'
+  })
+}
+
+// 用户密码重置
+export function updateUserPwd(oldPassword, newPassword) {
+  const data = {
+    oldPassword,
+    newPassword
+  }
+  return request({
+    url: '/api/v1/user/pwd/set',
+    method: 'put',
+    data: data
+  })
+}
+
+// 用户头像上传
+export function uploadAvatar(data) {
+  return request({
+    url: '/api/v1/user/avatar',
+    method: 'post',
+    data: data
+  })
+}
+
+// 查询用户个人信息
+export function getUserProfile() {
+  return request({
+    url: '/api/v1/user/profile',
+    method: 'get'
+  })
+}
+
diff --git a/src/api/job/sys-job.js b/src/api/job/sys-job.js
new file mode 100644
index 0000000..83e5b5c
--- /dev/null
+++ b/src/api/job/sys-job.js
@@ -0,0 +1,62 @@
+import request from '@/utils/request'
+
+// 查询SysJob列表
+export function listSysJob(query) {
+  return request({
+    url: '/api/v1/sysjob',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询SysJob详细
+export function getSysJob(jobId) {
+  return request({
+    url: '/api/v1/sysjob/' + jobId,
+    method: 'get'
+  })
+}
+
+// 新增SysJob
+export function addSysJob(data) {
+  return request({
+    url: '/api/v1/sysjob',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改SysJob
+export function updateSysJob(data) {
+  return request({
+    url: '/api/v1/sysjob',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除SysJob
+export function delSysJob(data) {
+  return request({
+    url: '/api/v1/sysjob',
+    method: 'delete',
+    data: data
+  })
+}
+
+// 移除SysJob
+export function removeJob(jobId) {
+  return request({
+    url: '/api/v1/job/remove/' + jobId,
+    method: 'get'
+  })
+}
+
+// 启动SysJob
+export function startJob(jobId) {
+  return request({
+    url: '/api/v1/job/start/' + jobId,
+    method: 'get'
+  })
+}
+
diff --git a/src/api/login.js b/src/api/login.js
new file mode 100644
index 0000000..d8b2c4b
--- /dev/null
+++ b/src/api/login.js
@@ -0,0 +1,17 @@
+import request from '@/utils/request'
+
+// 获取验证码
+export function getCodeImg() {
+  return request({
+    url: '/api/v1/captcha',
+    method: 'get'
+  })
+}
+
+// 查询 此接口不在验证数据权限
+export function getSetting() {
+  return request({
+    url: '/api/v1/app-config',
+    method: 'get'
+  })
+}
diff --git a/src/api/monitor/server.js b/src/api/monitor/server.js
new file mode 100644
index 0000000..1c95fe3
--- /dev/null
+++ b/src/api/monitor/server.js
@@ -0,0 +1,9 @@
+import request from '@/utils/request'
+
+// 查询服务器详细
+export function getServer() {
+  return request({
+    url: '/api/v1/server-monitor',
+    method: 'get'
+  })
+}
diff --git a/src/api/remote-search.js b/src/api/remote-search.js
new file mode 100644
index 0000000..c7e1911
--- /dev/null
+++ b/src/api/remote-search.js
@@ -0,0 +1,17 @@
+import request from '@/utils/request'
+
+export function searchUser(name) {
+  return request({
+    url: '/search/user',
+    method: 'get',
+    params: { name }
+  })
+}
+
+export function transactionList(query) {
+  return request({
+    url: '/transaction/list',
+    method: 'get',
+    params: query
+  })
+}
diff --git a/src/api/schedule.js b/src/api/schedule.js
new file mode 100644
index 0000000..367a254
--- /dev/null
+++ b/src/api/schedule.js
@@ -0,0 +1,43 @@
+import request from '@/utils/request'
+
+export function list(data) {
+  return request({
+    url: 'api/v1/schedule/list',
+    method: 'get',
+    params: data
+  })
+}
+
+export function add(data) {
+  return request({
+    url: 'api/v1/schedule/add',
+    method: 'post',
+    data
+  })
+}
+
+export function edit(data) {
+  return request({
+    url: 'api/v1/schedule/update',
+    method: 'put',
+    data
+  })
+}
+
+export function getSchedule(id) {
+  return request({
+    url: 'api/v1/schedule/query',
+    method: 'get',
+    params: {
+      id
+    }
+  })
+}
+
+export function deleteSchedule(data) {
+  return request({
+    url: 'api/v1/schedule/delete',
+    method: 'delete',
+    data
+  })
+}
diff --git a/src/api/table.js b/src/api/table.js
new file mode 100644
index 0000000..c514499
--- /dev/null
+++ b/src/api/table.js
@@ -0,0 +1,20 @@
+// 查询列表
+export function getItems(f, query) {
+  query = query || { pageSize: 10000 }
+  return f(query)
+}
+
+export function setItems(response, k, v) {
+  const data = []
+  k = k || 'id'
+  v = v || 'name'
+  if (response.data && response.data.list && response.data.list.length > 0) {
+    response.data.list.forEach(e => {
+      data.push({
+        key: e[k].toString(),
+        value: e[v].toString()
+      })
+    })
+    return data
+  }
+}
diff --git a/src/api/tools/gen.js b/src/api/tools/gen.js
new file mode 100644
index 0000000..cc4846c
--- /dev/null
+++ b/src/api/tools/gen.js
@@ -0,0 +1,103 @@
+import request from '@/utils/request'
+
+// 查询生成表数据
+export function listTable(query) {
+  return request({
+    url: '/api/v1/sys/tables/page',
+    method: 'get',
+    params: query
+  })
+}
+// 查询db数据库列表
+export function listDbTable(query) {
+  return request({
+    url: '/api/v1/db/tables/page',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询表详细信息
+export function getGenTable(tableId) {
+  return request({
+    url: '/api/v1/sys/tables/info/' + tableId,
+    method: 'get'
+  })
+}
+
+export function getGenTableInfo(tablename) {
+  return request({
+    url: '/api/v1/sys/tables?tableName=' + tablename,
+    method: 'get'
+  })
+}
+
+// 修改代码生成信息
+export function updateGenTable(data) {
+  return request({
+    url: '/api/v1/sys/tables/info',
+    method: 'put',
+    data: data
+  })
+}
+
+// 导入表
+export function importTable(data) {
+  return request({
+    url: '/api/v1/sys/tables/info',
+    method: 'post',
+    params: data
+  })
+}
+// 预览生成代码
+export function previewTable(tableId) {
+  return request({
+    url: '/api/v1/gen/preview/' + tableId,
+    method: 'get'
+  })
+}
+// 删除表数据
+export function delTable(tableId) {
+  return request({
+    url: '/api/v1/sys/tables/info/' + tableId,
+    method: 'delete'
+  })
+}
+
+// 生成代码到项目
+export function toProjectTable(tableId) {
+  return request({
+    url: '/api/v1/gen/toproject/' + tableId,
+    method: 'get'
+  })
+}
+
+// 生成接口数据到迁移脚本
+export function apiToFile(tableId) {
+  return request({
+    url: '/api/v1/gen/apitofile/' + tableId,
+    method: 'get'
+  })
+}
+
+export function toProjectTableCheckRole(tableId, ischeckrole) {
+  return request({
+    url: '/api/v1/gen/toproject/' + tableId + '?ischeckrole=' + ischeckrole,
+    method: 'get'
+  })
+}
+
+// 生成菜单到数据库
+export function toDBTable(tableId) {
+  return request({
+    url: '/api/v1/gen/todb/' + tableId,
+    method: 'get'
+  })
+}
+
+export function getTableTree() {
+  return request({
+    url: '/api/v1/gen/tabletree',
+    method: 'get'
+  })
+}
diff --git a/src/api/user.js b/src/api/user.js
new file mode 100644
index 0000000..7b46cf8
--- /dev/null
+++ b/src/api/user.js
@@ -0,0 +1,36 @@
+import request from '@/utils/request'
+
+// login 登陆
+export function login(data) {
+  return request({
+    url: '/api/v1/login',
+    method: 'post',
+    data
+  })
+}
+
+// logout 退出
+export function logout() {
+  return request({
+    url: '/api/v1/logout',
+    method: 'post'
+  })
+}
+
+// refreshtoken 刷新token
+export function refreshtoken(data) {
+  return request({
+    url: '/refreshtoken',
+    method: 'post',
+    data
+  })
+}
+
+// getInfo 获取用户基本信息
+export function getInfo() {
+  return request({
+    url: '/api/v1/getinfo',
+    method: 'get'
+  })
+}
+
diff --git a/src/api/ws.js b/src/api/ws.js
new file mode 100644
index 0000000..4c31e09
--- /dev/null
+++ b/src/api/ws.js
@@ -0,0 +1,9 @@
+import request from '@/utils/request'
+
+// 查询SysJob列表
+export function unWsLogout(id, group) {
+  return request({
+    url: '/wslogout/' + id + '/' + group,
+    method: 'get'
+  })
+}
diff --git a/src/assets/401_images/401.gif b/src/assets/401_images/401.gif
new file mode 100644
index 0000000000000000000000000000000000000000..cd6e0d9433421b3f29d0ec0c40f755e354728000
GIT binary patch
literal 164227
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