├── .browserslistrc ├── .editorconfig ├── .eslintrc.js ├── .gitignore ├── README.md ├── babel.config.js ├── dist ├── css │ ├── chunk-vendors.2794e51f.css │ └── index.ac309d22.css ├── favicon.ico ├── fonts │ ├── element-icons.535877f5.woff │ ├── element-icons.732389de.ttf │ ├── fontawesome-webfont.674f50d2.eot │ ├── fontawesome-webfont.af7ae505.woff2 │ ├── fontawesome-webfont.b06871f2.ttf │ └── fontawesome-webfont.fee66e71.woff ├── img │ └── fontawesome-webfont.912ec66d.svg ├── index.html └── js │ ├── chunk-vendors.c3df235d.js │ ├── chunk-vendors.c3df235d.js.map │ ├── index.b7065760.js │ └── index.b7065760.js.map ├── feihong_2019-12-20.png ├── package.json ├── postcss.config.js ├── public ├── favicon.ico └── index.html ├── src ├── App.vue ├── api │ ├── index.js │ └── user.js ├── assets │ ├── css │ │ ├── animation.less │ │ ├── app-view.css │ │ ├── app-view.less │ │ ├── main.css │ │ └── main.less │ ├── logo-img.png │ ├── logo.ai │ ├── logo.png │ ├── logo.svg │ └── user.jpg ├── components │ ├── app-aside.vue │ ├── app-header.vue │ ├── app-view.vue │ ├── dropdown │ │ ├── dropdown.css │ │ ├── dropdown.less │ │ ├── dropdown.vue │ │ └── index.js │ ├── layout │ │ ├── README.md │ │ ├── container.vue │ │ ├── footer.vue │ │ ├── header.vue │ │ ├── index.js │ │ ├── layout.css │ │ ├── layout.less │ │ ├── main.vue │ │ └── sider.vue │ └── main-view.vue ├── main.js ├── router.js ├── store │ ├── index.js │ ├── modules │ │ ├── index.js │ │ └── user.js │ └── types.js ├── utils │ ├── http.js │ ├── index.js │ └── watermark.js └── views │ ├── admin │ ├── dashboard.vue │ ├── page1.vue │ ├── page2.vue │ └── page3.vue │ ├── home.vue │ ├── login.vue │ └── logout.vue ├── vue.config.js └── yarn.lock /.browserslistrc: -------------------------------------------------------------------------------- 1 | > 1% 2 | last 2 versions 3 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | [*.{js,jsx,ts,tsx,vue}] 2 | indent_style = space 3 | indent_size = 2 4 | trim_trailing_whitespace = true 5 | insert_final_newline = true 6 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { 4 | node: true 5 | }, 6 | 'extends': [ 7 | 'plugin:vue/essential', 8 | '@vue/standard' 9 | ], 10 | rules: { 11 | 'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off', 12 | 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off' 13 | }, 14 | parserOptions: { 15 | parser: 'babel-eslint' 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | 4 | # local env files 5 | .env.local 6 | .env.*.local 7 | 8 | # Log files 9 | npm-debug.log* 10 | yarn-debug.log* 11 | yarn-error.log* 12 | 13 | # Editor directories and files 14 | .idea 15 | .vscode 16 | *.suo 17 | *.ntvs* 18 | *.njsproj 19 | *.sln 20 | *.sw? 21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # vue-element-admin-tpl 2 | 3 | [Liev Demo](http://vadmin.lanyueos.com) 4 | 5 |
6 | logo 7 |
8 | 9 | Template for admin platform base on `Vue` and `Element-UI`. 10 | 11 | 12 | ## Project Demo 13 | 14 | 1、**[Project Demo](http://www.lanyueos.com:3003/dist)** 15 | 16 | > username: admin, password: 123456 17 | 18 | ![](./feihong_2019-12-20.png) 19 | 20 | ## Project setup 21 | ``` 22 | yarn install 23 | ``` 24 | 25 | ### Compiles and hot-reloads for development 26 | ``` 27 | yarn run dev 28 | ``` 29 | 30 | ### Compiles and minifies for production 31 | ``` 32 | yarn run build 33 | ``` 34 | 35 | ### Run your tests 36 | ``` 37 | yarn run test 38 | ``` 39 | 40 | ### Lints and fixes files 41 | ``` 42 | yarn run lint 43 | ``` 44 | 45 | ### Customize configuration 46 | See [Configuration Reference](https://cli.vuejs.org/config/). 47 | -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [ 3 | '@vue/app' 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /dist/css/index.ac309d22.css: -------------------------------------------------------------------------------- 1 | .home-page[data-v-0f2aeecc]{height:100vh;background:-webkit-gradient(linear,left bottom,left top,from(#f7fafd),to(#76b9ff));background:linear-gradient(0deg,#f7fafd,#76b9ff);display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.home-page .box[data-v-0f2aeecc]{width:800px;text-align:center;margin:0 auto;margin-top:-200px}.home-page .title[data-v-0f2aeecc]{color:#394d63;margin-top:50px;font-size:1.8rem;font-weight:lighter}.home-page .home-logo[data-v-0f2aeecc]{max-width:200px;color:#fff}.home-page .rc-button[data-v-0f2aeecc]{border:none;border-radius:5px;padding:10px 20px;cursor:pointer;color:#fff;background-color:#6f76d9;outline:none;-webkit-transition:all .3s ease;transition:all .3s ease;display:inline-block}.home-page .rc-button[data-v-0f2aeecc]:hover{background-color:#484da0}.home-page .rc-button+.home-page .rc-button[data-v-0f2aeecc]{margin-left:10px}.home-page .rc-button.rc-button-round[data-v-0f2aeecc]{border-radius:100px}.home-page .rc-button.rc-button-green[data-v-0f2aeecc]{background-color:#01abc3;background:linear-gradient(70deg,#1ad7f9,#5eece4)}.home-page .rc-button.rc-button-green[data-v-0f2aeecc]:hover{background:linear-gradient(40deg,#20cdff,#2dfff3);-webkit-box-shadow:0 10px 20px #54f3ff;box-shadow:0 10px 20px #54f3ff}.home-page .link-button[data-v-0f2aeecc]{margin-top:30px}.m-list-group[data-v-423b7105]{border-radius:3px;padding:0;margin:0 0 20px}.m-list-group .m-list-group-item[data-v-423b7105]{position:relative;display:block;padding:6px 10px;margin-bottom:-1px;background-color:#fff;border:1px solid #e7ecee}.m-list-group .m-list-group-item[data-v-423b7105]:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.m-list-group .m-list-group-item[data-v-423b7105]:last-child{border-bottom-left-radius:3px;border-bottom-right-radius:3px}.fullscreen[data-v-423b7105]{position:absolute;width:100%;height:100%;background:linear-gradient(-45deg,#f7fafd,#bddeff);display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.login-box[data-v-423b7105]{position:relative;width:330px;margin:0 auto;padding:0 15px}.logo-box[data-v-423b7105]{text-align:center}.login-box .logo[data-v-423b7105]{max-width:40%;width:120px;margin-bottom:30px;text-align:center;display:inline-block;color:#36c1fa}.login-box .text-tips[data-v-423b7105]{text-align:center;color:#909db7}.login-box .m-input[data-v-423b7105]{padding:10px;border:none}.login-box .m-btn[data-v-423b7105],.login-box .m-input[data-v-423b7105]{width:100%;outline:none;-webkit-box-sizing:border-box;box-sizing:border-box}.login-box .m-btn[data-v-423b7105]{font-size:18px;color:#fff;background-color:#36c1fa;display:inline-block;padding:10px 12px;margin-bottom:5px;line-height:1.42857143;text-align:center;cursor:pointer;border-radius:2px;border:1px solid #36c1fa;text-decoration:none}.login-box .m-btn.m-btn-text[data-v-423b7105]{background:#fff;color:#36c1fa}.login-box .m-btn[data-v-423b7105]:hover{background-color:#2db7f5}.login-box .m-btn.m-btn-text[data-v-423b7105]:hover{background-color:#f4f5f5}.login-box .m-btn[data-v-423b7105]:active{opacity:.8}@media (max-width:768px){.login-box[data-v-423b7105]{width:auto}}.m-layout{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-flex:1;-ms-flex:auto;flex:auto;min-height:0;-webkit-box-sizing:border-box;box-sizing:border-box}.m-layout.is-horizontal,.m-layout .m-layout-sider{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.m-layout .m-layout-header,.m-layout .m-layout-sider{-webkit-box-sizing:border-box;box-sizing:border-box}.m-layout .m-layout-header{height:50px}.m-layout .m-layout-content{-webkit-box-flex:1;-ms-flex:1;flex:1;min-height:0;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:auto}.m-layout .m-layout-footer{height:50px;-webkit-box-sizing:border-box;box-sizing:border-box}.m-collapse-transition{-webkit-transition:height .3s ease;transition:height .3s ease;overflow:hidden}.m-collapse .m-collapse-item{border:1px solid #e1e8f3}.m-collapse .m-collapse-item+.m-collapse-item{margin-top:-2px}.m-collapse .m-collapse-item .m-collapse-item--title{background-color:#f6f8fa;border-bottom:1px solid #e1e8f3;height:38px;line-height:38px;padding-left:16px;cursor:pointer;position:relative;font-size:13px}.m-collapse .m-collapse-item:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.m-collapse .m-collapse-item:last-child{border-bottom-left-radius:3px;border-bottom-right-radius:3px}.m-collapse .m-collapse-item:last-child .m-collapse-item--title{border-bottom:none}.m-collapse .m-collapse-item:last-child.is-open .m-collapse-item--title{border-bottom:inherit}.m-collapse .m-collapse-item .m-collapse-item--arrow{display:inline-block;width:15px;height:15px;line-height:0;position:absolute;top:50%;right:10px;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.m-collapse .m-collapse-item .m-collapse-item--title:hover{background-color:#ebeff3}.m-collapse .m-collapse-item .m-collapse-item--content{padding:15px;background-color:#fff}.m-collapse.is-simple .m-collapse-item{border-left:none;border-right:none;border-radius:0}.m-collapse.is-simple .m-collapse-item .m-collapse-item--title{border:none}.m-collapse.is-simple .m-collapse-item+.m-collapse-item{margin-top:-1px}.m-menu{list-style:none;margin:0;padding:0}.m-menu .m-menu-item{width:100%}.m-menu .m-menu-item .m-menu-item--icon{margin-right:10px}.m-menu .m-group{margin-bottom:10px}.m-menu .m-group .m-group--item{line-height:25px;padding:0 10px;opacity:.5;font-size:12px}.m-menu .m-submenu .m-menu{padding-left:1rem}.m-menu .m-submenu .m-submenu--item .m-submenu--icon{margin-right:10px}.m-menu .m-submenu .m-submenu--arrow-down-icon{width:20px;color:inherit;position:absolute;top:50%;right:10px;margin-top:-10px;-webkit-transition:-webkit-transform .2s linear;transition:-webkit-transform .2s linear;transition:transform .2s linear;transition:transform .2s linear,-webkit-transform .2s linear;line-height:0}.m-menu .m-menu-item .m-menu-item--link,.m-menu .m-submenu .m-submenu--item{line-height:40px;display:block;padding:0 15px;color:inherit;cursor:pointer;-webkit-transition:all .3s linear;transition:all .3s linear;position:relative;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.m-menu .m-menu-item.active .m-menu-item--link,.m-menu .m-menu-item .m-menu-item--link:hover,.m-menu .m-submenu .m-submenu--item:hover{color:#fff;background-color:hsla(0,0%,100%,.1)}.m-menu .m-menu-item .m-menu-item--link .fa-external-link{font-size:12px;margin-left:5px}.m-menu .m-menu-line{height:1px;background-color:hsla(0,0%,100%,.1);margin:15px 10px}.m-menu.m-menu--light .m-menu-item .m-menu-item--link:hover,.m-menu.m-menu--light .m-submenu .m-submenu--item:hover{color:#283946;background-color:rgba(82,145,193,.07)}.m-menu.m-menu--light .m-menu-line{background-color:rgba(40,57,70,.1)}.m-dropdown{position:relative}.m-dropdown .m-dropdown-panel{position:absolute;background-color:#fff;max-height:400px;overflow:auto;-webkit-box-shadow:0 3px 5px rgba(0,0,0,.06);box-shadow:0 3px 5px rgba(0,0,0,.06);cursor:default}.m-dropdown .m-dropdown-panel.is-center{left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.m-dropdown .m-dropdown-panel.is-right{right:0}.m-dropdown .m-dropdown-panel.is-left{left:0}.m-css-dropdown{position:relative}.m-css-dropdown .m-css-dropdown-panel{position:absolute;background-color:#fff;max-height:400px;overflow:auto;-webkit-box-shadow:0 3px 5px rgba(0,0,0,.06);box-shadow:0 3px 5px rgba(0,0,0,.06);display:none;cursor:default}.m-css-dropdown .m-css-dropdown-panel.is-center{left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.m-css-dropdown .m-css-dropdown-panel.is-right{right:0}.m-css-dropdown .m-css-dropdown-panel.is-left{left:0}.m-css-dropdown:hover .m-css-dropdown-panel{display:block}.m-dropdown-enter-active{-webkit-animation:slide-down-in .3s;animation:slide-down-in .3s}.m-dropdown-leave-active{-webkit-animation:slide-up-out .3s;animation:slide-up-out .3s}@-webkit-keyframes slide-down-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}to{-webkit-transform:translateZ(0);transform:translateZ(0);opacity:1}}@keyframes slide-down-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}to{-webkit-transform:translateZ(0);transform:translateZ(0);opacity:1}}@-webkit-keyframes slide-up-out{0%{-webkit-transform:translateZ(0);transform:translateZ(0);opacity:1}to{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}@keyframes slide-up-out{0%{-webkit-transform:translateZ(0);transform:translateZ(0);opacity:1}to{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}} 2 | 3 | /*! 4 | * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome 5 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 6 | */@font-face{font-family:FontAwesome;src:url(../fonts/fontawesome-webfont.674f50d2.eot);src:url(../fonts/fontawesome-webfont.674f50d2.eot?#iefix&v=4.7.0) format("embedded-opentype"),url(../fonts/fontawesome-webfont.af7ae505.woff2) format("woff2"),url(../fonts/fontawesome-webfont.fee66e71.woff) format("woff"),url(../fonts/fontawesome-webfont.b06871f2.ttf) format("truetype"),url(../img/fontawesome-webfont.912ec66d.svg#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{-webkit-filter:none;filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\F000"}.fa-music:before{content:"\F001"}.fa-search:before{content:"\F002"}.fa-envelope-o:before{content:"\F003"}.fa-heart:before{content:"\F004"}.fa-star:before{content:"\F005"}.fa-star-o:before{content:"\F006"}.fa-user:before{content:"\F007"}.fa-film:before{content:"\F008"}.fa-th-large:before{content:"\F009"}.fa-th:before{content:"\F00A"}.fa-th-list:before{content:"\F00B"}.fa-check:before{content:"\F00C"}.fa-close:before,.fa-remove:before,.fa-times:before{content:"\F00D"}.fa-search-plus:before{content:"\F00E"}.fa-search-minus:before{content:"\F010"}.fa-power-off:before{content:"\F011"}.fa-signal:before{content:"\F012"}.fa-cog:before,.fa-gear:before{content:"\F013"}.fa-trash-o:before{content:"\F014"}.fa-home:before{content:"\F015"}.fa-file-o:before{content:"\F016"}.fa-clock-o:before{content:"\F017"}.fa-road:before{content:"\F018"}.fa-download:before{content:"\F019"}.fa-arrow-circle-o-down:before{content:"\F01A"}.fa-arrow-circle-o-up:before{content:"\F01B"}.fa-inbox:before{content:"\F01C"}.fa-play-circle-o:before{content:"\F01D"}.fa-repeat:before,.fa-rotate-right:before{content:"\F01E"}.fa-refresh:before{content:"\F021"}.fa-list-alt:before{content:"\F022"}.fa-lock:before{content:"\F023"}.fa-flag:before{content:"\F024"}.fa-headphones:before{content:"\F025"}.fa-volume-off:before{content:"\F026"}.fa-volume-down:before{content:"\F027"}.fa-volume-up:before{content:"\F028"}.fa-qrcode:before{content:"\F029"}.fa-barcode:before{content:"\F02A"}.fa-tag:before{content:"\F02B"}.fa-tags:before{content:"\F02C"}.fa-book:before{content:"\F02D"}.fa-bookmark:before{content:"\F02E"}.fa-print:before{content:"\F02F"}.fa-camera:before{content:"\F030"}.fa-font:before{content:"\F031"}.fa-bold:before{content:"\F032"}.fa-italic:before{content:"\F033"}.fa-text-height:before{content:"\F034"}.fa-text-width:before{content:"\F035"}.fa-align-left:before{content:"\F036"}.fa-align-center:before{content:"\F037"}.fa-align-right:before{content:"\F038"}.fa-align-justify:before{content:"\F039"}.fa-list:before{content:"\F03A"}.fa-dedent:before,.fa-outdent:before{content:"\F03B"}.fa-indent:before{content:"\F03C"}.fa-video-camera:before{content:"\F03D"}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:"\F03E"}.fa-pencil:before{content:"\F040"}.fa-map-marker:before{content:"\F041"}.fa-adjust:before{content:"\F042"}.fa-tint:before{content:"\F043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\F044"}.fa-share-square-o:before{content:"\F045"}.fa-check-square-o:before{content:"\F046"}.fa-arrows:before{content:"\F047"}.fa-step-backward:before{content:"\F048"}.fa-fast-backward:before{content:"\F049"}.fa-backward:before{content:"\F04A"}.fa-play:before{content:"\F04B"}.fa-pause:before{content:"\F04C"}.fa-stop:before{content:"\F04D"}.fa-forward:before{content:"\F04E"}.fa-fast-forward:before{content:"\F050"}.fa-step-forward:before{content:"\F051"}.fa-eject:before{content:"\F052"}.fa-chevron-left:before{content:"\F053"}.fa-chevron-right:before{content:"\F054"}.fa-plus-circle:before{content:"\F055"}.fa-minus-circle:before{content:"\F056"}.fa-times-circle:before{content:"\F057"}.fa-check-circle:before{content:"\F058"}.fa-question-circle:before{content:"\F059"}.fa-info-circle:before{content:"\F05A"}.fa-crosshairs:before{content:"\F05B"}.fa-times-circle-o:before{content:"\F05C"}.fa-check-circle-o:before{content:"\F05D"}.fa-ban:before{content:"\F05E"}.fa-arrow-left:before{content:"\F060"}.fa-arrow-right:before{content:"\F061"}.fa-arrow-up:before{content:"\F062"}.fa-arrow-down:before{content:"\F063"}.fa-mail-forward:before,.fa-share:before{content:"\F064"}.fa-expand:before{content:"\F065"}.fa-compress:before{content:"\F066"}.fa-plus:before{content:"\F067"}.fa-minus:before{content:"\F068"}.fa-asterisk:before{content:"\F069"}.fa-exclamation-circle:before{content:"\F06A"}.fa-gift:before{content:"\F06B"}.fa-leaf:before{content:"\F06C"}.fa-fire:before{content:"\F06D"}.fa-eye:before{content:"\F06E"}.fa-eye-slash:before{content:"\F070"}.fa-exclamation-triangle:before,.fa-warning:before{content:"\F071"}.fa-plane:before{content:"\F072"}.fa-calendar:before{content:"\F073"}.fa-random:before{content:"\F074"}.fa-comment:before{content:"\F075"}.fa-magnet:before{content:"\F076"}.fa-chevron-up:before{content:"\F077"}.fa-chevron-down:before{content:"\F078"}.fa-retweet:before{content:"\F079"}.fa-shopping-cart:before{content:"\F07A"}.fa-folder:before{content:"\F07B"}.fa-folder-open:before{content:"\F07C"}.fa-arrows-v:before{content:"\F07D"}.fa-arrows-h:before{content:"\F07E"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\F080"}.fa-twitter-square:before{content:"\F081"}.fa-facebook-square:before{content:"\F082"}.fa-camera-retro:before{content:"\F083"}.fa-key:before{content:"\F084"}.fa-cogs:before,.fa-gears:before{content:"\F085"}.fa-comments:before{content:"\F086"}.fa-thumbs-o-up:before{content:"\F087"}.fa-thumbs-o-down:before{content:"\F088"}.fa-star-half:before{content:"\F089"}.fa-heart-o:before{content:"\F08A"}.fa-sign-out:before{content:"\F08B"}.fa-linkedin-square:before{content:"\F08C"}.fa-thumb-tack:before{content:"\F08D"}.fa-external-link:before{content:"\F08E"}.fa-sign-in:before{content:"\F090"}.fa-trophy:before{content:"\F091"}.fa-github-square:before{content:"\F092"}.fa-upload:before{content:"\F093"}.fa-lemon-o:before{content:"\F094"}.fa-phone:before{content:"\F095"}.fa-square-o:before{content:"\F096"}.fa-bookmark-o:before{content:"\F097"}.fa-phone-square:before{content:"\F098"}.fa-twitter:before{content:"\F099"}.fa-facebook-f:before,.fa-facebook:before{content:"\F09A"}.fa-github:before{content:"\F09B"}.fa-unlock:before{content:"\F09C"}.fa-credit-card:before{content:"\F09D"}.fa-feed:before,.fa-rss:before{content:"\F09E"}.fa-hdd-o:before{content:"\F0A0"}.fa-bullhorn:before{content:"\F0A1"}.fa-bell:before{content:"\F0F3"}.fa-certificate:before{content:"\F0A3"}.fa-hand-o-right:before{content:"\F0A4"}.fa-hand-o-left:before{content:"\F0A5"}.fa-hand-o-up:before{content:"\F0A6"}.fa-hand-o-down:before{content:"\F0A7"}.fa-arrow-circle-left:before{content:"\F0A8"}.fa-arrow-circle-right:before{content:"\F0A9"}.fa-arrow-circle-up:before{content:"\F0AA"}.fa-arrow-circle-down:before{content:"\F0AB"}.fa-globe:before{content:"\F0AC"}.fa-wrench:before{content:"\F0AD"}.fa-tasks:before{content:"\F0AE"}.fa-filter:before{content:"\F0B0"}.fa-briefcase:before{content:"\F0B1"}.fa-arrows-alt:before{content:"\F0B2"}.fa-group:before,.fa-users:before{content:"\F0C0"}.fa-chain:before,.fa-link:before{content:"\F0C1"}.fa-cloud:before{content:"\F0C2"}.fa-flask:before{content:"\F0C3"}.fa-cut:before,.fa-scissors:before{content:"\F0C4"}.fa-copy:before,.fa-files-o:before{content:"\F0C5"}.fa-paperclip:before{content:"\F0C6"}.fa-floppy-o:before,.fa-save:before{content:"\F0C7"}.fa-square:before{content:"\F0C8"}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:"\F0C9"}.fa-list-ul:before{content:"\F0CA"}.fa-list-ol:before{content:"\F0CB"}.fa-strikethrough:before{content:"\F0CC"}.fa-underline:before{content:"\F0CD"}.fa-table:before{content:"\F0CE"}.fa-magic:before{content:"\F0D0"}.fa-truck:before{content:"\F0D1"}.fa-pinterest:before{content:"\F0D2"}.fa-pinterest-square:before{content:"\F0D3"}.fa-google-plus-square:before{content:"\F0D4"}.fa-google-plus:before{content:"\F0D5"}.fa-money:before{content:"\F0D6"}.fa-caret-down:before{content:"\F0D7"}.fa-caret-up:before{content:"\F0D8"}.fa-caret-left:before{content:"\F0D9"}.fa-caret-right:before{content:"\F0DA"}.fa-columns:before{content:"\F0DB"}.fa-sort:before,.fa-unsorted:before{content:"\F0DC"}.fa-sort-desc:before,.fa-sort-down:before{content:"\F0DD"}.fa-sort-asc:before,.fa-sort-up:before{content:"\F0DE"}.fa-envelope:before{content:"\F0E0"}.fa-linkedin:before{content:"\F0E1"}.fa-rotate-left:before,.fa-undo:before{content:"\F0E2"}.fa-gavel:before,.fa-legal:before{content:"\F0E3"}.fa-dashboard:before,.fa-tachometer:before{content:"\F0E4"}.fa-comment-o:before{content:"\F0E5"}.fa-comments-o:before{content:"\F0E6"}.fa-bolt:before,.fa-flash:before{content:"\F0E7"}.fa-sitemap:before{content:"\F0E8"}.fa-umbrella:before{content:"\F0E9"}.fa-clipboard:before,.fa-paste:before{content:"\F0EA"}.fa-lightbulb-o:before{content:"\F0EB"}.fa-exchange:before{content:"\F0EC"}.fa-cloud-download:before{content:"\F0ED"}.fa-cloud-upload:before{content:"\F0EE"}.fa-user-md:before{content:"\F0F0"}.fa-stethoscope:before{content:"\F0F1"}.fa-suitcase:before{content:"\F0F2"}.fa-bell-o:before{content:"\F0A2"}.fa-coffee:before{content:"\F0F4"}.fa-cutlery:before{content:"\F0F5"}.fa-file-text-o:before{content:"\F0F6"}.fa-building-o:before{content:"\F0F7"}.fa-hospital-o:before{content:"\F0F8"}.fa-ambulance:before{content:"\F0F9"}.fa-medkit:before{content:"\F0FA"}.fa-fighter-jet:before{content:"\F0FB"}.fa-beer:before{content:"\F0FC"}.fa-h-square:before{content:"\F0FD"}.fa-plus-square:before{content:"\F0FE"}.fa-angle-double-left:before{content:"\F100"}.fa-angle-double-right:before{content:"\F101"}.fa-angle-double-up:before{content:"\F102"}.fa-angle-double-down:before{content:"\F103"}.fa-angle-left:before{content:"\F104"}.fa-angle-right:before{content:"\F105"}.fa-angle-up:before{content:"\F106"}.fa-angle-down:before{content:"\F107"}.fa-desktop:before{content:"\F108"}.fa-laptop:before{content:"\F109"}.fa-tablet:before{content:"\F10A"}.fa-mobile-phone:before,.fa-mobile:before{content:"\F10B"}.fa-circle-o:before{content:"\F10C"}.fa-quote-left:before{content:"\F10D"}.fa-quote-right:before{content:"\F10E"}.fa-spinner:before{content:"\F110"}.fa-circle:before{content:"\F111"}.fa-mail-reply:before,.fa-reply:before{content:"\F112"}.fa-github-alt:before{content:"\F113"}.fa-folder-o:before{content:"\F114"}.fa-folder-open-o:before{content:"\F115"}.fa-smile-o:before{content:"\F118"}.fa-frown-o:before{content:"\F119"}.fa-meh-o:before{content:"\F11A"}.fa-gamepad:before{content:"\F11B"}.fa-keyboard-o:before{content:"\F11C"}.fa-flag-o:before{content:"\F11D"}.fa-flag-checkered:before{content:"\F11E"}.fa-terminal:before{content:"\F120"}.fa-code:before{content:"\F121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\F122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\F123"}.fa-location-arrow:before{content:"\F124"}.fa-crop:before{content:"\F125"}.fa-code-fork:before{content:"\F126"}.fa-chain-broken:before,.fa-unlink:before{content:"\F127"}.fa-question:before{content:"\F128"}.fa-info:before{content:"\F129"}.fa-exclamation:before{content:"\F12A"}.fa-superscript:before{content:"\F12B"}.fa-subscript:before{content:"\F12C"}.fa-eraser:before{content:"\F12D"}.fa-puzzle-piece:before{content:"\F12E"}.fa-microphone:before{content:"\F130"}.fa-microphone-slash:before{content:"\F131"}.fa-shield:before{content:"\F132"}.fa-calendar-o:before{content:"\F133"}.fa-fire-extinguisher:before{content:"\F134"}.fa-rocket:before{content:"\F135"}.fa-maxcdn:before{content:"\F136"}.fa-chevron-circle-left:before{content:"\F137"}.fa-chevron-circle-right:before{content:"\F138"}.fa-chevron-circle-up:before{content:"\F139"}.fa-chevron-circle-down:before{content:"\F13A"}.fa-html5:before{content:"\F13B"}.fa-css3:before{content:"\F13C"}.fa-anchor:before{content:"\F13D"}.fa-unlock-alt:before{content:"\F13E"}.fa-bullseye:before{content:"\F140"}.fa-ellipsis-h:before{content:"\F141"}.fa-ellipsis-v:before{content:"\F142"}.fa-rss-square:before{content:"\F143"}.fa-play-circle:before{content:"\F144"}.fa-ticket:before{content:"\F145"}.fa-minus-square:before{content:"\F146"}.fa-minus-square-o:before{content:"\F147"}.fa-level-up:before{content:"\F148"}.fa-level-down:before{content:"\F149"}.fa-check-square:before{content:"\F14A"}.fa-pencil-square:before{content:"\F14B"}.fa-external-link-square:before{content:"\F14C"}.fa-share-square:before{content:"\F14D"}.fa-compass:before{content:"\F14E"}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:"\F150"}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:"\F151"}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:"\F152"}.fa-eur:before,.fa-euro:before{content:"\F153"}.fa-gbp:before{content:"\F154"}.fa-dollar:before,.fa-usd:before{content:"\F155"}.fa-inr:before,.fa-rupee:before{content:"\F156"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:"\F157"}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:"\F158"}.fa-krw:before,.fa-won:before{content:"\F159"}.fa-bitcoin:before,.fa-btc:before{content:"\F15A"}.fa-file:before{content:"\F15B"}.fa-file-text:before{content:"\F15C"}.fa-sort-alpha-asc:before{content:"\F15D"}.fa-sort-alpha-desc:before{content:"\F15E"}.fa-sort-amount-asc:before{content:"\F160"}.fa-sort-amount-desc:before{content:"\F161"}.fa-sort-numeric-asc:before{content:"\F162"}.fa-sort-numeric-desc:before{content:"\F163"}.fa-thumbs-up:before{content:"\F164"}.fa-thumbs-down:before{content:"\F165"}.fa-youtube-square:before{content:"\F166"}.fa-youtube:before{content:"\F167"}.fa-xing:before{content:"\F168"}.fa-xing-square:before{content:"\F169"}.fa-youtube-play:before{content:"\F16A"}.fa-dropbox:before{content:"\F16B"}.fa-stack-overflow:before{content:"\F16C"}.fa-instagram:before{content:"\F16D"}.fa-flickr:before{content:"\F16E"}.fa-adn:before{content:"\F170"}.fa-bitbucket:before{content:"\F171"}.fa-bitbucket-square:before{content:"\F172"}.fa-tumblr:before{content:"\F173"}.fa-tumblr-square:before{content:"\F174"}.fa-long-arrow-down:before{content:"\F175"}.fa-long-arrow-up:before{content:"\F176"}.fa-long-arrow-left:before{content:"\F177"}.fa-long-arrow-right:before{content:"\F178"}.fa-apple:before{content:"\F179"}.fa-windows:before{content:"\F17A"}.fa-android:before{content:"\F17B"}.fa-linux:before{content:"\F17C"}.fa-dribbble:before{content:"\F17D"}.fa-skype:before{content:"\F17E"}.fa-foursquare:before{content:"\F180"}.fa-trello:before{content:"\F181"}.fa-female:before{content:"\F182"}.fa-male:before{content:"\F183"}.fa-gittip:before,.fa-gratipay:before{content:"\F184"}.fa-sun-o:before{content:"\F185"}.fa-moon-o:before{content:"\F186"}.fa-archive:before{content:"\F187"}.fa-bug:before{content:"\F188"}.fa-vk:before{content:"\F189"}.fa-weibo:before{content:"\F18A"}.fa-renren:before{content:"\F18B"}.fa-pagelines:before{content:"\F18C"}.fa-stack-exchange:before{content:"\F18D"}.fa-arrow-circle-o-right:before{content:"\F18E"}.fa-arrow-circle-o-left:before{content:"\F190"}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:"\F191"}.fa-dot-circle-o:before{content:"\F192"}.fa-wheelchair:before{content:"\F193"}.fa-vimeo-square:before{content:"\F194"}.fa-try:before,.fa-turkish-lira:before{content:"\F195"}.fa-plus-square-o:before{content:"\F196"}.fa-space-shuttle:before{content:"\F197"}.fa-slack:before{content:"\F198"}.fa-envelope-square:before{content:"\F199"}.fa-wordpress:before{content:"\F19A"}.fa-openid:before{content:"\F19B"}.fa-bank:before,.fa-institution:before,.fa-university:before{content:"\F19C"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\F19D"}.fa-yahoo:before{content:"\F19E"}.fa-google:before{content:"\F1A0"}.fa-reddit:before{content:"\F1A1"}.fa-reddit-square:before{content:"\F1A2"}.fa-stumbleupon-circle:before{content:"\F1A3"}.fa-stumbleupon:before{content:"\F1A4"}.fa-delicious:before{content:"\F1A5"}.fa-digg:before{content:"\F1A6"}.fa-pied-piper-pp:before{content:"\F1A7"}.fa-pied-piper-alt:before{content:"\F1A8"}.fa-drupal:before{content:"\F1A9"}.fa-joomla:before{content:"\F1AA"}.fa-language:before{content:"\F1AB"}.fa-fax:before{content:"\F1AC"}.fa-building:before{content:"\F1AD"}.fa-child:before{content:"\F1AE"}.fa-paw:before{content:"\F1B0"}.fa-spoon:before{content:"\F1B1"}.fa-cube:before{content:"\F1B2"}.fa-cubes:before{content:"\F1B3"}.fa-behance:before{content:"\F1B4"}.fa-behance-square:before{content:"\F1B5"}.fa-steam:before{content:"\F1B6"}.fa-steam-square:before{content:"\F1B7"}.fa-recycle:before{content:"\F1B8"}.fa-automobile:before,.fa-car:before{content:"\F1B9"}.fa-cab:before,.fa-taxi:before{content:"\F1BA"}.fa-tree:before{content:"\F1BB"}.fa-spotify:before{content:"\F1BC"}.fa-deviantart:before{content:"\F1BD"}.fa-soundcloud:before{content:"\F1BE"}.fa-database:before{content:"\F1C0"}.fa-file-pdf-o:before{content:"\F1C1"}.fa-file-word-o:before{content:"\F1C2"}.fa-file-excel-o:before{content:"\F1C3"}.fa-file-powerpoint-o:before{content:"\F1C4"}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:"\F1C5"}.fa-file-archive-o:before,.fa-file-zip-o:before{content:"\F1C6"}.fa-file-audio-o:before,.fa-file-sound-o:before{content:"\F1C7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\F1C8"}.fa-file-code-o:before{content:"\F1C9"}.fa-vine:before{content:"\F1CA"}.fa-codepen:before{content:"\F1CB"}.fa-jsfiddle:before{content:"\F1CC"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:"\F1CD"}.fa-circle-o-notch:before{content:"\F1CE"}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:"\F1D0"}.fa-empire:before,.fa-ge:before{content:"\F1D1"}.fa-git-square:before{content:"\F1D2"}.fa-git:before{content:"\F1D3"}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:"\F1D4"}.fa-tencent-weibo:before{content:"\F1D5"}.fa-qq:before{content:"\F1D6"}.fa-wechat:before,.fa-weixin:before{content:"\F1D7"}.fa-paper-plane:before,.fa-send:before{content:"\F1D8"}.fa-paper-plane-o:before,.fa-send-o:before{content:"\F1D9"}.fa-history:before{content:"\F1DA"}.fa-circle-thin:before{content:"\F1DB"}.fa-header:before{content:"\F1DC"}.fa-paragraph:before{content:"\F1DD"}.fa-sliders:before{content:"\F1DE"}.fa-share-alt:before{content:"\F1E0"}.fa-share-alt-square:before{content:"\F1E1"}.fa-bomb:before{content:"\F1E2"}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:"\F1E3"}.fa-tty:before{content:"\F1E4"}.fa-binoculars:before{content:"\F1E5"}.fa-plug:before{content:"\F1E6"}.fa-slideshare:before{content:"\F1E7"}.fa-twitch:before{content:"\F1E8"}.fa-yelp:before{content:"\F1E9"}.fa-newspaper-o:before{content:"\F1EA"}.fa-wifi:before{content:"\F1EB"}.fa-calculator:before{content:"\F1EC"}.fa-paypal:before{content:"\F1ED"}.fa-google-wallet:before{content:"\F1EE"}.fa-cc-visa:before{content:"\F1F0"}.fa-cc-mastercard:before{content:"\F1F1"}.fa-cc-discover:before{content:"\F1F2"}.fa-cc-amex:before{content:"\F1F3"}.fa-cc-paypal:before{content:"\F1F4"}.fa-cc-stripe:before{content:"\F1F5"}.fa-bell-slash:before{content:"\F1F6"}.fa-bell-slash-o:before{content:"\F1F7"}.fa-trash:before{content:"\F1F8"}.fa-copyright:before{content:"\F1F9"}.fa-at:before{content:"\F1FA"}.fa-eyedropper:before{content:"\F1FB"}.fa-paint-brush:before{content:"\F1FC"}.fa-birthday-cake:before{content:"\F1FD"}.fa-area-chart:before{content:"\F1FE"}.fa-pie-chart:before{content:"\F200"}.fa-line-chart:before{content:"\F201"}.fa-lastfm:before{content:"\F202"}.fa-lastfm-square:before{content:"\F203"}.fa-toggle-off:before{content:"\F204"}.fa-toggle-on:before{content:"\F205"}.fa-bicycle:before{content:"\F206"}.fa-bus:before{content:"\F207"}.fa-ioxhost:before{content:"\F208"}.fa-angellist:before{content:"\F209"}.fa-cc:before{content:"\F20A"}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:"\F20B"}.fa-meanpath:before{content:"\F20C"}.fa-buysellads:before{content:"\F20D"}.fa-connectdevelop:before{content:"\F20E"}.fa-dashcube:before{content:"\F210"}.fa-forumbee:before{content:"\F211"}.fa-leanpub:before{content:"\F212"}.fa-sellsy:before{content:"\F213"}.fa-shirtsinbulk:before{content:"\F214"}.fa-simplybuilt:before{content:"\F215"}.fa-skyatlas:before{content:"\F216"}.fa-cart-plus:before{content:"\F217"}.fa-cart-arrow-down:before{content:"\F218"}.fa-diamond:before{content:"\F219"}.fa-ship:before{content:"\F21A"}.fa-user-secret:before{content:"\F21B"}.fa-motorcycle:before{content:"\F21C"}.fa-street-view:before{content:"\F21D"}.fa-heartbeat:before{content:"\F21E"}.fa-venus:before{content:"\F221"}.fa-mars:before{content:"\F222"}.fa-mercury:before{content:"\F223"}.fa-intersex:before,.fa-transgender:before{content:"\F224"}.fa-transgender-alt:before{content:"\F225"}.fa-venus-double:before{content:"\F226"}.fa-mars-double:before{content:"\F227"}.fa-venus-mars:before{content:"\F228"}.fa-mars-stroke:before{content:"\F229"}.fa-mars-stroke-v:before{content:"\F22A"}.fa-mars-stroke-h:before{content:"\F22B"}.fa-neuter:before{content:"\F22C"}.fa-genderless:before{content:"\F22D"}.fa-facebook-official:before{content:"\F230"}.fa-pinterest-p:before{content:"\F231"}.fa-whatsapp:before{content:"\F232"}.fa-server:before{content:"\F233"}.fa-user-plus:before{content:"\F234"}.fa-user-times:before{content:"\F235"}.fa-bed:before,.fa-hotel:before{content:"\F236"}.fa-viacoin:before{content:"\F237"}.fa-train:before{content:"\F238"}.fa-subway:before{content:"\F239"}.fa-medium:before{content:"\F23A"}.fa-y-combinator:before,.fa-yc:before{content:"\F23B"}.fa-optin-monster:before{content:"\F23C"}.fa-opencart:before{content:"\F23D"}.fa-expeditedssl:before{content:"\F23E"}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:"\F240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\F241"}.fa-battery-2:before,.fa-battery-half:before{content:"\F242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\F243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\F244"}.fa-mouse-pointer:before{content:"\F245"}.fa-i-cursor:before{content:"\F246"}.fa-object-group:before{content:"\F247"}.fa-object-ungroup:before{content:"\F248"}.fa-sticky-note:before{content:"\F249"}.fa-sticky-note-o:before{content:"\F24A"}.fa-cc-jcb:before{content:"\F24B"}.fa-cc-diners-club:before{content:"\F24C"}.fa-clone:before{content:"\F24D"}.fa-balance-scale:before{content:"\F24E"}.fa-hourglass-o:before{content:"\F250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\F251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\F252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\F253"}.fa-hourglass:before{content:"\F254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\F255"}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:"\F256"}.fa-hand-scissors-o:before{content:"\F257"}.fa-hand-lizard-o:before{content:"\F258"}.fa-hand-spock-o:before{content:"\F259"}.fa-hand-pointer-o:before{content:"\F25A"}.fa-hand-peace-o:before{content:"\F25B"}.fa-trademark:before{content:"\F25C"}.fa-registered:before{content:"\F25D"}.fa-creative-commons:before{content:"\F25E"}.fa-gg:before{content:"\F260"}.fa-gg-circle:before{content:"\F261"}.fa-tripadvisor:before{content:"\F262"}.fa-odnoklassniki:before{content:"\F263"}.fa-odnoklassniki-square:before{content:"\F264"}.fa-get-pocket:before{content:"\F265"}.fa-wikipedia-w:before{content:"\F266"}.fa-safari:before{content:"\F267"}.fa-chrome:before{content:"\F268"}.fa-firefox:before{content:"\F269"}.fa-opera:before{content:"\F26A"}.fa-internet-explorer:before{content:"\F26B"}.fa-television:before,.fa-tv:before{content:"\F26C"}.fa-contao:before{content:"\F26D"}.fa-500px:before{content:"\F26E"}.fa-amazon:before{content:"\F270"}.fa-calendar-plus-o:before{content:"\F271"}.fa-calendar-minus-o:before{content:"\F272"}.fa-calendar-times-o:before{content:"\F273"}.fa-calendar-check-o:before{content:"\F274"}.fa-industry:before{content:"\F275"}.fa-map-pin:before{content:"\F276"}.fa-map-signs:before{content:"\F277"}.fa-map-o:before{content:"\F278"}.fa-map:before{content:"\F279"}.fa-commenting:before{content:"\F27A"}.fa-commenting-o:before{content:"\F27B"}.fa-houzz:before{content:"\F27C"}.fa-vimeo:before{content:"\F27D"}.fa-black-tie:before{content:"\F27E"}.fa-fonticons:before{content:"\F280"}.fa-reddit-alien:before{content:"\F281"}.fa-edge:before{content:"\F282"}.fa-credit-card-alt:before{content:"\F283"}.fa-codiepie:before{content:"\F284"}.fa-modx:before{content:"\F285"}.fa-fort-awesome:before{content:"\F286"}.fa-usb:before{content:"\F287"}.fa-product-hunt:before{content:"\F288"}.fa-mixcloud:before{content:"\F289"}.fa-scribd:before{content:"\F28A"}.fa-pause-circle:before{content:"\F28B"}.fa-pause-circle-o:before{content:"\F28C"}.fa-stop-circle:before{content:"\F28D"}.fa-stop-circle-o:before{content:"\F28E"}.fa-shopping-bag:before{content:"\F290"}.fa-shopping-basket:before{content:"\F291"}.fa-hashtag:before{content:"\F292"}.fa-bluetooth:before{content:"\F293"}.fa-bluetooth-b:before{content:"\F294"}.fa-percent:before{content:"\F295"}.fa-gitlab:before{content:"\F296"}.fa-wpbeginner:before{content:"\F297"}.fa-wpforms:before{content:"\F298"}.fa-envira:before{content:"\F299"}.fa-universal-access:before{content:"\F29A"}.fa-wheelchair-alt:before{content:"\F29B"}.fa-question-circle-o:before{content:"\F29C"}.fa-blind:before{content:"\F29D"}.fa-audio-description:before{content:"\F29E"}.fa-volume-control-phone:before{content:"\F2A0"}.fa-braille:before{content:"\F2A1"}.fa-assistive-listening-systems:before{content:"\F2A2"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:"\F2A3"}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:"\F2A4"}.fa-glide:before{content:"\F2A5"}.fa-glide-g:before{content:"\F2A6"}.fa-sign-language:before,.fa-signing:before{content:"\F2A7"}.fa-low-vision:before{content:"\F2A8"}.fa-viadeo:before{content:"\F2A9"}.fa-viadeo-square:before{content:"\F2AA"}.fa-snapchat:before{content:"\F2AB"}.fa-snapchat-ghost:before{content:"\F2AC"}.fa-snapchat-square:before{content:"\F2AD"}.fa-pied-piper:before{content:"\F2AE"}.fa-first-order:before{content:"\F2B0"}.fa-yoast:before{content:"\F2B1"}.fa-themeisle:before{content:"\F2B2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\F2B3"}.fa-fa:before,.fa-font-awesome:before{content:"\F2B4"}.fa-handshake-o:before{content:"\F2B5"}.fa-envelope-open:before{content:"\F2B6"}.fa-envelope-open-o:before{content:"\F2B7"}.fa-linode:before{content:"\F2B8"}.fa-address-book:before{content:"\F2B9"}.fa-address-book-o:before{content:"\F2BA"}.fa-address-card:before,.fa-vcard:before{content:"\F2BB"}.fa-address-card-o:before,.fa-vcard-o:before{content:"\F2BC"}.fa-user-circle:before{content:"\F2BD"}.fa-user-circle-o:before{content:"\F2BE"}.fa-user-o:before{content:"\F2C0"}.fa-id-badge:before{content:"\F2C1"}.fa-drivers-license:before,.fa-id-card:before{content:"\F2C2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\F2C3"}.fa-quora:before{content:"\F2C4"}.fa-free-code-camp:before{content:"\F2C5"}.fa-telegram:before{content:"\F2C6"}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:"\F2C7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\F2C8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\F2C9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\F2CA"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\F2CB"}.fa-shower:before{content:"\F2CC"}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:"\F2CD"}.fa-podcast:before{content:"\F2CE"}.fa-window-maximize:before{content:"\F2D0"}.fa-window-minimize:before{content:"\F2D1"}.fa-window-restore:before{content:"\F2D2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\F2D3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\F2D4"}.fa-bandcamp:before{content:"\F2D5"}.fa-grav:before{content:"\F2D6"}.fa-etsy:before{content:"\F2D7"}.fa-imdb:before{content:"\F2D8"}.fa-ravelry:before{content:"\F2D9"}.fa-eercast:before{content:"\F2DA"}.fa-microchip:before{content:"\F2DB"}.fa-snowflake-o:before{content:"\F2DC"}.fa-superpowers:before{content:"\F2DD"}.fa-wpexplorer:before{content:"\F2DE"}.fa-meetup:before{content:"\F2E0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}body{background-color:#fff;margin:0;padding:0;color:#292c38;font-size:14px;line-height:1.5;font-family:PingFang SC,Helvetica Neue,Helvetica,Hiragino Sans GB,Microsoft YaHei,"\5FAE\8F6F\96C5\9ED1",Arial,sans-serif}a{color:#4394ff;text-decoration:none;-webkit-transition:color .3s ease;transition:color .3s ease}a:hover{color:#6f76d9}.m-link-effect{position:relative}.m-link-effect:after{content:"";display:block;height:0;border-bottom:1px solid;bottom:-2px;position:absolute;-webkit-transition:all .3s ease;transition:all .3s ease;width:0;right:0}.m-link-effect:hover:after{left:0;width:100%}.float-right{float:right}.float-left{float:left}.text-center{text-align:center}.text-right{text-align:right}.clearfix:after,.clearfix:before{content:"";display:table;clear:both}::-moz-selection{background:#cbd1de}::selection{background:#cbd1de}.app-layout{position:fixed;width:100%;height:100%;background-color:#f1f4f7}.app-layout .app-sider{background-color:#19202e;color:#8c96a9;width:240px;-webkit-transition:all .3s cubic-bezier(.23,1,.32,1);transition:all .3s cubic-bezier(.23,1,.32,1);position:relative;overflow:hidden}.app-layout .app-sider.is-moving{-webkit-transition:none;transition:none}.app-layout .app-sider.is-close{width:0;padding:0}.app-layout .app-header{background-color:#fff;height:58px;-webkit-box-shadow:0 0 5px rgba(0,0,0,.06);box-shadow:0 0 5px rgba(0,0,0,.06);padding:0 15px}.app-layout .app-content{padding:10px;overflow-x:hidden;overflow-y:auto}.app-layout .app-footer{background-color:#fff;border-top:1px solid #e2e3e4}.app-layout .m-page-enter-active{-webkit-animation:page-in .3s;animation:page-in .3s}.app-layout .m-page-leave-active{-webkit-animation:page-out .3s;animation:page-out .3s}@-webkit-keyframes page-in{0%{-webkit-transform:translateX(-20px);transform:translateX(-20px);opacity:0}to{-webkit-transform:translateX(0);transform:translateX(0);opacity:1}}@keyframes page-in{0%{-webkit-transform:translateX(-20px);transform:translateX(-20px);opacity:0}to{-webkit-transform:translateX(0);transform:translateX(0);opacity:1}}@-webkit-keyframes page-out{0%{-webkit-transform:translateX(0,0,0);transform:translateX(0,0,0);opacity:1}to{-webkit-transform:translateX(20px);transform:translateX(20px);opacity:0}}@keyframes page-out{0%{-webkit-transform:translateX(0,0,0);transform:translateX(0,0,0);opacity:1}to{-webkit-transform:translateX(20px);transform:translateX(20px);opacity:0}}.app-aside .app-logo-box{-webkit-box-sizing:border-box;box-sizing:border-box;height:58px;line-height:58px;padding:0 15px;color:hsla(0,0%,100%,.9);overflow:hidden;-webkit-transition:padding .2s ease;transition:padding .2s ease;background-color:#1b8ce1;background-image:linear-gradient(20deg,#1c60e7 -20%,#1b8ce1)}.app-aside .app-logo-box .app-logo{height:40px;vertical-align:middle;margin-right:10px;-webkit-transition:all .3s ease;transition:all .3s ease}.app-aside .app-logo-box .app-name{font-size:1.5rem;vertical-align:middle}.app-aside .app-menu-box{width:100%;max-height:calc(100% - 58px);overflow:auto;position:absolute;-webkit-box-sizing:border-box;box-sizing:border-box;padding-bottom:50px}.app-aside .app-menu-box::-webkit-scrollbar{width:9px;height:9px;background:transparent}.app-aside .app-menu-box::-webkit-resizer,.app-aside .app-menu-box::-webkit-scrollbar-corner{background:transparent}.app-aside .app-menu-box::-webkit-scrollbar-thumb,.app-aside .app-menu-box::-webkit-scrollbar-track{border-radius:999px;background-clip:content-box;border:2px solid transparent}.app-aside .app-menu-box::-webkit-scrollbar-track{background-color:hsla(0,0%,100%,.1)}.app-aside .app-menu-box::-webkit-scrollbar-thumb{min-height:20px;background-color:hsla(0,0%,100%,.1)}.app-aside .app-menu-box::-webkit-scrollbar-thumb:hover{background-color:#5a6274;border-width:1px}.app-sider.is-mini .app-logo{width:100%}.app-sider.is-mini .app-name{display:none}.app-sider-control{width:0;position:relative;cursor:ew-resize}.app-sider-control .collapse-btn{position:absolute;top:calc(50% - 18px);height:36px;color:transparent;width:24px;left:-1px;cursor:pointer;background:none;border:none;outline:none;z-index:1000}.app-sider-control .collapse-btn:after,.app-sider-control .collapse-btn:before{content:"";background-color:#4c9aff;width:2px;height:8px;position:absolute;left:8px;opacity:0;-webkit-transform:rotate(0deg);transform:rotate(0deg);border-radius:16px;-webkit-transition:opacity .3s ease-in-out .2s,-webkit-transform .2s ease-in-out 0s;transition:opacity .3s ease-in-out .2s,-webkit-transform .2s ease-in-out 0s;transition:transform .2s ease-in-out 0s,opacity .3s ease-in-out .2s;transition:transform .2s ease-in-out 0s,opacity .3s ease-in-out .2s,-webkit-transform .2s ease-in-out 0s}.app-sider-control .collapse-btn:before{top:10px;-webkit-transform-origin:1px 7px 0;transform-origin:1px 7px 0}.app-sider-control .collapse-btn:after{top:16px;-webkit-transform-origin:1px 1px 0;transform-origin:1px 1px 0}.app-sider-control .collapse-btn:hover:before{-webkit-transform:rotate(40deg);transform:rotate(40deg)}.app-sider-control .collapse-btn:hover:after{-webkit-transform:rotate(-40deg);transform:rotate(-40deg)}.app-sider-control .collapse-btn.close:after,.app-sider-control .collapse-btn.close:before{left:11px}.app-sider-control .collapse-btn.close:hover:before{-webkit-transform:rotate(-40deg);transform:rotate(-40deg)}.app-sider-control .collapse-btn.close:hover:after{-webkit-transform:rotate(40deg);transform:rotate(40deg)}.app-sider-control:after{content:"";position:absolute;width:15px;height:100%;background-color:transparent;right:-7px}.app-sider-control:before{content:"";height:100%;width:2px;left:0;top:0;position:absolute;-webkit-transition:background-color .3s ease-in-out .2s;transition:background-color .3s ease-in-out .2s}.app-sider-control:hover .collapse-btn:after,.app-sider-control:hover .collapse-btn:before{opacity:1}.app-sider-control:hover:before{background:#4c9aff}.app-header-box .app-header-tool{list-style:none;margin:0;padding:0}.app-header-box .app-header-tool>li{display:inline-block;vertical-align:middle;line-height:58px;padding:0 10px;cursor:pointer;font-size:.95rem;color:#515a6e;background-color:hsla(0,0%,100%,.1);-webkit-transition:background-color .3s linear;transition:background-color .3s linear}.app-header-box .app-header-tool>li:hover{background-color:rgba(40,44,52,.03)}.app-header-box .app-header-tool>li .tool-btn{border:none;background:transparent;cursor:pointer;color:inherit}.app-header-box .app-header-tool>li .tool-btn:hover{color:#121f29}.app-header-box .app-header-tool>li .tool-search-input{border:none;border-radius:5px;background-color:rgba(40,44,52,.03);height:30px;outline:none;padding:0 10px;width:150px;-webkit-transition:all .2s ease;transition:all .2s ease}.app-header-box .app-header-tool>li .tool-search-input:focus{width:300px}.app-header-box .app-header-tool>li a{color:inherit}.app-header-box .app-header-tool>li a .fa-external-link{font-size:.8rem}.app-header-box .app-header-tool>li img{vertical-align:middle}.app-header-box .app-header-tool .user-avatar{border-radius:3px}.app-header-box .app-header-tool .m-css-dropdown-panel,.app-header-box .app-header-tool .m-dropdown-panel{min-width:200px;border-radius:0 0 3px 3px;margin-left:-10px}.app-header-box .app-header-tool .m-css-dropdown-panel.is-center,.app-header-box .app-header-tool .m-dropdown-panel.is-center{margin-left:0}.app-header-box .app-header-tool .m-css-dropdown-panel.is-right,.app-header-box .app-header-tool .m-dropdown-panel.is-right{margin-right:-10px}.app-header-box .app-header-tool .m-css-dropdown-panel::-webkit-scrollbar,.app-header-box .app-header-tool .m-dropdown-panel::-webkit-scrollbar{width:0;height:0;background:transparent}.app-header-box .app-header-tool .m-css-dropdown-panel::-webkit-resizer,.app-header-box .app-header-tool .m-css-dropdown-panel::-webkit-scrollbar-corner,.app-header-box .app-header-tool .m-dropdown-panel::-webkit-resizer,.app-header-box .app-header-tool .m-dropdown-panel::-webkit-scrollbar-corner{background:transparent} -------------------------------------------------------------------------------- /dist/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengdu/vue-element-admin-tpl/8dc21c7fead0604f083b82d4da5bbc677346f3ca/dist/favicon.ico -------------------------------------------------------------------------------- /dist/fonts/element-icons.535877f5.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengdu/vue-element-admin-tpl/8dc21c7fead0604f083b82d4da5bbc677346f3ca/dist/fonts/element-icons.535877f5.woff -------------------------------------------------------------------------------- /dist/fonts/element-icons.732389de.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengdu/vue-element-admin-tpl/8dc21c7fead0604f083b82d4da5bbc677346f3ca/dist/fonts/element-icons.732389de.ttf -------------------------------------------------------------------------------- /dist/fonts/fontawesome-webfont.674f50d2.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengdu/vue-element-admin-tpl/8dc21c7fead0604f083b82d4da5bbc677346f3ca/dist/fonts/fontawesome-webfont.674f50d2.eot -------------------------------------------------------------------------------- /dist/fonts/fontawesome-webfont.af7ae505.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengdu/vue-element-admin-tpl/8dc21c7fead0604f083b82d4da5bbc677346f3ca/dist/fonts/fontawesome-webfont.af7ae505.woff2 -------------------------------------------------------------------------------- /dist/fonts/fontawesome-webfont.b06871f2.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengdu/vue-element-admin-tpl/8dc21c7fead0604f083b82d4da5bbc677346f3ca/dist/fonts/fontawesome-webfont.b06871f2.ttf -------------------------------------------------------------------------------- /dist/fonts/fontawesome-webfont.fee66e71.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengdu/vue-element-admin-tpl/8dc21c7fead0604f083b82d4da5bbc677346f3ca/dist/fonts/fontawesome-webfont.fee66e71.woff -------------------------------------------------------------------------------- /dist/index.html: -------------------------------------------------------------------------------- 1 | Admin Platform
-------------------------------------------------------------------------------- /dist/js/index.b7065760.js: -------------------------------------------------------------------------------- 1 | (function(t){function e(e){for(var a,o,l=e[0],r=e[1],c=e[2],m=0,p=[];m1&&void 0!==arguments[1]?arguments[1]:{};t.component(e.containerName||P.name,P),t.component(e.mainName||K.name,K),t.component(e.headerName||W.name,W),t.component(e.footerName||nt.name,nt),t.component(e.silderName||rt.name,rt)};var ct=P,ut=K,mt=W,pt=rt,dt=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"app-aside"},[n("div",{staticClass:"app-logo-box"},[n("svg",{staticClass:"app-logo",attrs:{"aria-hidden":"true",focusable:"false","data-prefix":"fab","data-icon":"meetup",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512"}},[n("path",{attrs:{fill:"currentColor",d:"M99 414.3c1.1 5.7-2.3 11.1-8 12.3-5.4 1.1-10.9-2.3-12-8-1.1-5.4 2.3-11.1 7.7-12.3 5.4-1.2 11.1 2.3 12.3 8zm143.1 71.4c-6.3 4.6-8 13.4-3.7 20 4.6 6.6 13.4 8.3 20 3.7 6.3-4.6 8-13.4 3.4-20-4.2-6.5-13.1-8.3-19.7-3.7zm-86-462.3c6.3-1.4 10.3-7.7 8.9-14-1.1-6.6-7.4-10.6-13.7-9.1-6.3 1.4-10.3 7.7-9.1 14 1.4 6.6 7.6 10.6 13.9 9.1zM34.4 226.3c-10-6.9-23.7-4.3-30.6 6-6.9 10-4.3 24 5.7 30.9 10 7.1 23.7 4.6 30.6-5.7 6.9-10.4 4.3-24.1-5.7-31.2zm272-170.9c10.6-6.3 13.7-20 7.7-30.3-6.3-10.6-19.7-14-30-7.7s-13.7 20-7.4 30.6c6 10.3 19.4 13.7 29.7 7.4zm-191.1 58c7.7-5.4 9.4-16 4.3-23.7s-15.7-9.4-23.1-4.3c-7.7 5.4-9.4 16-4.3 23.7 5.1 7.8 15.6 9.5 23.1 4.3zm372.3 156c-7.4 1.7-12.3 9.1-10.6 16.9 1.4 7.4 8.9 12.3 16.3 10.6 7.4-1.4 12.3-8.9 10.6-16.6-1.5-7.4-8.9-12.3-16.3-10.9zm39.7-56.8c-1.1-5.7-6.6-9.1-12-8-5.7 1.1-9.1 6.9-8 12.6 1.1 5.4 6.6 9.1 12.3 8 5.4-1.5 9.1-6.9 7.7-12.6zM447 138.9c-8.6 6-10.6 17.7-4.9 26.3 5.7 8.6 17.4 10.6 26 4.9 8.3-6 10.3-17.7 4.6-26.3-5.7-8.7-17.4-10.9-25.7-4.9zm-6.3 139.4c26.3 43.1 15.1 100-26.3 129.1-17.4 12.3-37.1 17.7-56.9 17.1-12 47.1-69.4 64.6-105.1 32.6-1.1.9-2.6 1.7-3.7 2.9-39.1 27.1-92.3 17.4-119.4-22.3-9.7-14.3-14.6-30.6-15.1-46.9-65.4-10.9-90-94-41.1-139.7-28.3-46.9.6-107.4 53.4-114.9C151.6 70 234.1 38.6 290.1 82c67.4-22.3 136.3 29.4 130.9 101.1 41.1 12.6 52.8 66.9 19.7 95.2zm-70 74.3c-3.1-20.6-40.9-4.6-43.1-27.1-3.1-32 43.7-101.1 40-128-3.4-24-19.4-29.1-33.4-29.4-13.4-.3-16.9 2-21.4 4.6-2.9 1.7-6.6 4.9-11.7-.3-6.3-6-11.1-11.7-19.4-12.9-12.3-2-17.7 2-26.6 9.7-3.4 2.9-12 12.9-20 9.1-3.4-1.7-15.4-7.7-24-11.4-16.3-7.1-40 4.6-48.6 20-12.9 22.9-38 113.1-41.7 125.1-8.6 26.6 10.9 48.6 36.9 47.1 11.1-.6 18.3-4.6 25.4-17.4 4-7.4 41.7-107.7 44.6-112.6 2-3.4 8.9-8 14.6-5.1 5.7 3.1 6.9 9.4 6 15.1-1.1 9.7-28 70.9-28.9 77.7-3.4 22.9 26.9 26.6 38.6 4 3.7-7.1 45.7-92.6 49.4-98.3 4.3-6.3 7.4-8.3 11.7-8 3.1 0 8.3.9 7.1 10.9-1.4 9.4-35.1 72.3-38.9 87.7-4.6 20.6 6.6 41.4 24.9 50.6 11.4 5.7 62.5 15.7 58.5-11.1zm5.7 92.3c-10.3 7.4-12.9 22-5.7 32.6 7.1 10.6 21.4 13.1 32 6 10.6-7.4 13.1-22 6-32.6-7.4-10.6-21.7-13.5-32.3-6z"}})]),n("span",{staticClass:"app-name"},[t._v("Admin Platform")])]),n("div",{staticClass:"app-menu-box"},[n("Menu",{attrs:{menus:t.menus}})],1)])},ft=[],ht=(n("b54a"),function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("span",{style:{width:t.width+"px",height:t.width+"px",display:"inline-block","vertical-align":"middle",color:t.color}},[n("svg",{staticClass:"m-icon-arrow",style:{transition:"all 0.3s ease",transform:"rotate("+t.rotate+")"},attrs:{xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 35 35",fill:"currentColor"}},[n("path",{attrs:{d:"M9.4,13.9c-0.2,0.2-0.2,0.6,0,0.8l8.1,8.1l0,0l0,0l8.1-8.1c0.2-0.2,0.2-0.6,0-0.8l-1.3-1.3 c-0.2-0.2-0.6-0.2-0.8,0l-5.5,5.5c-0.2,0.2-0.6,0.2-0.8,0l-5.5-5.5c-0.2-0.2-0.6-0.2-0.8,0L9.4,13.9z"}})])])}),gt=[],vt={name:"m-icon-arrow",props:{width:[String,Number],direction:String,color:String},computed:{rotate:function(){switch(this.direction){case"left":return"90deg";case"right":return"-90deg";case"bottom":return"0deg";case"top":return"-180deg";default:return"0deg"}}}},bt=vt,Ct=Object(u["a"])(bt,ht,gt,!1,null,null,null),At=Ct.exports,wt=At,_t=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"m-collapse",class:{"is-simple":t.simple}},[t._t("default")],2)},yt=[],xt=n("75fc"),kt=(n("55dd"),{name:"m-collapse",componentName:"MCollapse",props:{value:[String,Array],simple:Boolean},data:function(){return{innerValue:""}},watch:{value:function(t){this.setInnerValue(t)},innerValue:function(t){if(Array.isArray(t)){var e=this.value.length!==t.length||Object(xt["a"])(t).sort(function(t,e){return t>e?-1:1}).join()!==Object(xt["a"])(this.value).sort(function(t,e){return t>e?-1:1}).join();e&&this.$emit("input",Object(xt["a"])(t)),this.$emit("change",t)}else this.value!==t&&(this.$emit("input",t),this.$emit("change",t))}},methods:{setInnerValue:function(t){Array.isArray(t)?this.innerValue=Object(xt["a"])(t):this.innerValue=t}},created:function(){this.setInnerValue(this.value)}}),Et=kt,St=Object(u["a"])(Et,_t,yt,!1,null,null,null),Mt=St.exports,Ot=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"m-collapse-item",class:{"is-open":t.isOpen},attrs:{"data-name":t.name}},[n("div",{staticClass:"m-collapse-item--title",on:{click:t.handleItemClick}},[t._t("title",[t._v(t._s(t.title))]),t.hideArrow?t._e():n("IconArrow",{staticClass:"m-collapse-item--arrow",attrs:{direction:t.isOpen?"bottom":"left"}})],2),n("collapse-container",{attrs:{open:t.isOpen,appear:""}},[n("div",{staticClass:"m-collapse-item--content"},[t._t("default")],2)])],1)},Bt=[],zt=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("m-collapse-transition",{attrs:{appear:t.appear,"fade-class-name":t.fadeClassName,mode:t.mode},on:{beforeEnter:t.beforeEnter,afterEnter:t.afterEnter,beforeLeave:t.beforeLeave,afterLeave:t.afterLeave}},[t.useIf?[t.open?n("div",{staticClass:"m-collapse-container"},[t._t("default")],2):t._e()]:[n("div",{directives:[{name:"show",rawName:"v-show",value:t.open,expression:"open"}],staticClass:"m-collapse-container"},[t._t("default")],2)]],2)},Lt=[],jt="m-collapse-transition",$t={name:"m-collapse-transition",props:{appear:Boolean,fadeClassName:String,mode:String},computed:{transitionClassName:function(){return this.fadeClassName||jt}},methods:{beforeEnter:function(t){t.classList.add(this.transitionClassName),t.collapse||(t.collapse={}),t.collapse.paddingTop=t.style.paddingTop,t.collapse.paddingBottom=t.style.paddingBottom,t.style.height=0,t.style.paddingTop=0,t.style.paddingBottom=0},enter:function(t){t.style.height=t.scrollHeight+"px",t.style.paddingTop=t.collapse.paddingTop,t.style.paddingBottom=t.collapse.paddingBottom},afterEnter:function(t){t.classList.remove(this.transitionClassName),t.style.height=""},beforeLeave:function(t){t.collapse||(t.collapse={}),t.style.height=t.scrollHeight+"px",t.collapse.paddingTop=t.style.paddingTop,t.collapse.paddingBottom=t.style.paddingBottom},leave:function(t){0!==t.scrollHeight&&(t.classList.add(this.transitionClassName),t.style.height=0,t.style.paddingTop=0,t.style.paddingBottom=0)},afterLeave:function(t){t.classList.remove(this.transitionClassName),t.style.height="",t.style.paddingTop=t.collapse.paddingTop,t.style.paddingBottom=t.collapse.paddingBottom}},render:function(t){var e=this,n=["beforeEnter","enter","afterEnter","beforeLeave","leave","afterLeave"],a={},i=function(t){var i=n[t];a[i]=function(t){e[i](t),e.$emit(i,t)}};for(var s in n)i(s);return t("transition",{on:a,props:{appear:this.appear,mode:this.mode}},this.$slots.default)}},Nt={name:"m-collapse",components:{MCollapseTransition:$t},props:{open:Boolean,useIf:{type:Boolean,default:!1},appear:Boolean,fadeClassName:String,mode:String},methods:{beforeEnter:function(t){this.$emit("before-open",t)},afterEnter:function(t){this.$emit("open",t)},beforeLeave:function(t){this.$emit("before-close",t)},afterLeave:function(t){this.$emit("close",t)}}},It=Nt,Ut=Object(u["a"])(It,zt,Lt,!1,null,null,null),Pt=Ut.exports,Vt={name:"m-collapse-item",components:{CollapseContainer:Pt,IconArrow:wt},props:{name:{type:[Number,String],required:!0},title:String,hideArrow:Boolean},computed:{isOpen:function(){return!!this.parent&&(Array.isArray(this.parent.innerValue)?this.parent.innerValue.indexOf(this.name)>-1:this.name===this.parent.innerValue)}},methods:{getParent:function(t){var e=this.$parent||this.$root,n=e.$options.componentName;while(e&&(!n||n!==t))e=e.$parent,e&&(n=e.$options.componentName);return e},handleItemClick:function(){if(this.parent)if(Array.isArray(this.parent.innerValue)){var t=this.parent.innerValue.indexOf(this.name);t>-1?this.parent.innerValue.splice(t,1):this.parent.innerValue.push(this.name)}else this.parent.innerValue=this.isOpen?"":this.name}},created:function(){this.parent=this.getParent("MCollapse")}},Dt=Vt,Qt=Object(u["a"])(Dt,Ot,Bt,!1,null,null,null),Tt=Qt.exports;n("a781");Mt.install=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=e.name||Mt.name;t.component(n,Mt),t.component(n+"-item",Tt),t.component(n+"-container",Pt)};var Ft=$t;function Kt(t,e,n){return"line"===n.type?Gt(t):"group"===n.type?t("li",{class:"m-group"},[t("div",{class:"m-group--item"},[t("span",{class:"m-group--title"},[n.label])]),t("ul",{class:"m-menu"},[n.items.map(function(n){return Kt(t,e,n)})])]):"submenu"===n.type?t("li",{class:"m-submenu"},[t("div",{class:"m-submenu--item",on:{click:function(){return n.open=!n.open}}},[n.icon?t("i",{class:["m-submenu--icon",n.icon]}):null,t("span",{class:"m-submenu--title"},[n.label]),t(wt,{class:"m-submenu--arrow-down-icon",attrs:{direction:n.open?"top":"bottom"}})]),t(Ft,{attrs:{appear:!0}},[t("ul",{class:"m-menu",directives:[{name:"show",value:n.open}]},[n.items.map(function(n){return Kt(t,e,n)})])])]):t("li",{class:["m-menu-item",{active:e.currentActive===n.key}],attrs:{title:n.title}},[Rt(t,e,n,[t("i",{class:["m-menu-item--icon",n.icon]}),t("span",{class:"m-menu-item--title"},[n.label])])])}function Rt(t,e,n,a){return n.link?t("a",{class:"m-menu-item--link",attrs:{href:n.link,target:n.target,title:n.title}},[a,t("i",{class:"fa fa-external-link"})]):n.handle?t("a",{class:"m-menu-item--link",attrs:{href:"javascript:void(0)",title:n.title},on:{click:function(){return n.handle()}}},[a]):t("router-link",{attrs:{to:n.path,title:n.title},class:"m-menu-item--link"},[a])}function Gt(t){return t("li",{class:"m-menu-line"})}var Ht={name:"Menu",props:{menus:{type:Array,default:function(){return[]}},theme:String},data:function(){return{currentActive:""}},render:function(t){var e=this;return t("ul",{class:["m-menu",this.theme&&"m-menu--"+this.theme]},[this.menus.map(function(n){return Kt(t,e,n)})])}},qt=(n("49c4"),Ht),Jt=[{label:"Dashboard",icon:"fa fa-dashboard",path:"/admin"},{label:"Introduce",icon:"fa fa-dot-circle-o",path:"/page1"},{label:"GROUP 1",type:"group",items:[{label:"User Manger",icon:"fa fa-user-md",path:"/page1"},{label:"Permission Manger",icon:"fa fa-tasks",path:"/page2"},{label:"Group Manger",icon:"fa fa-group",path:"/page3"}]},{label:"GROUP 2",type:"group",items:[{label:"Content Manger",icon:"fa fa-circle",path:"/test",title:"This is title",key:"test"},{label:"Content Manger",icon:"fa fa-bomb",path:"/test"},{label:"Nav Link",icon:"fa fa-circle-o",handle:function(){console.log(arguments)}}]},{label:"Submenu",type:"submenu",open:!0,icon:"fa fa-folder-open",items:[{label:"Submenu 1",icon:"fa fa-file-image-o",path:"/test"},{label:"Submenu 2",icon:"fa fa-book",path:"/test"},{type:"line"},{label:"Submenu 3",icon:"fa fa-file-word-o",path:"/test"},{label:"Submenu",type:"submenu",open:!1,items:[{label:"Submenu 1",icon:"fa fa-book",path:"/test"},{label:"Submenu 2",icon:"fa fa-book",path:"/test"},{label:"Submenu 3",icon:"fa fa-book",path:"/test"}]}]},{type:"line"},{label:"Github",icon:"fa fa-github-alt",link:"https://github.com/mengdu/vue-element-admin-tpl",title:"Github"},{label:"Element-UI",icon:"fa fa-external-link-square",link:"https://element.eleme.cn",title:"Element-UI"},{label:"About",icon:"fa fa-meetup",link:"https://github.com/mengdu",title:"About Author"}],Wt={components:{Menu:qt},data:function(){return{menus:Jt}}},Yt=Wt,Zt=Object(u["a"])(Yt,dt,ft,!1,null,null,null),Xt=Zt.exports,te=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"app-header-box"},[n("div",{staticClass:"float-left"},[n("ul",{staticClass:"app-header-tool"},[n("li",[n("router-link",{staticClass:"m-link-effect",attrs:{to:"/"}},[n("i",{staticClass:"fa fa-home"}),t._v(" Home")])],1),t._m(0)])]),n("div",{staticClass:"float-right"},[n("ul",{staticClass:"app-header-tool"},[t._m(1),t._m(2),t._m(3),n("li",[n("m-dropdown",[n("a",{staticClass:"m-link-effect dropdown-trigger",attrs:{href:"#"}},[t._v("Dropdown "),n("i",{staticClass:"fa fa-caret-down"})]),n("m-menu",{attrs:{slot:"panel",menus:t.menus,theme:"light"},slot:"panel"})],1)],1),n("li",[n("div",{staticClass:"m-css-dropdown"},[t._m(4),n("div",{staticClass:"m-css-dropdown-panel is-center"},[n("m-menu",{attrs:{menus:t.menus,theme:"light"}})],1)])]),t._m(5),t._m(6),n("li",[n("m-dropdown",{attrs:{align:"right","panel-style":{"min-width":"150px"}}},[n("button",{staticClass:"tool-btn"},[n("i",{staticClass:"fa fa-user-circle-o"})]),n("m-menu",{attrs:{slot:"panel",menus:t.userMenus,theme:"light"},slot:"panel"})],1)],1),n("li",[n("m-dropdown",{attrs:{align:"right","panel-style":{"min-width":"150px"}}},[n("button",{staticClass:"tool-btn"},[n("img",{staticClass:"user-avatar",attrs:{src:t.userImg}}),t._v(" \n "),n("span",[t._v("Administrator")]),t._v(" \n "),n("i",{staticClass:"fa fa-caret-down"})]),n("m-menu",{attrs:{slot:"panel",menus:t.userMenus,theme:"light"},slot:"panel"})],1)],1),n("li",{on:{click:t.handleFullScreen}},[t.fullScreen?n("button",{staticClass:"tool-btn"},[n("i",{staticClass:"fa fa-compress"})]):n("button",{staticClass:"tool-btn"},[n("i",{staticClass:"fa fa-expand"})])]),t._m(7)])])])},ee=[function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("li",[n("a",{staticClass:"m-link-effect",attrs:{href:"http://lanyueos.com",target:"_blank"}},[t._v("Website "),n("i",{staticClass:"fa fa-external-link"})])])},function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("li",[n("input",{staticClass:"tool-search-input",attrs:{placeholder:"Search..."}})])},function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("li",[n("a",{staticClass:"m-link-effect",attrs:{href:"https://github.com/mengdu/vue-element-admin-tpl"}},[t._v("Github "),n("i",{staticClass:"fa fa-external-link"})])])},function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("li",[n("a",{staticClass:"m-link-effect",attrs:{href:"#"}},[t._v("Docs "),n("i",{staticClass:"fa fa-external-link"})])])},function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("a",{staticClass:"m-link-effect",attrs:{href:"#"}},[t._v("Language "),n("i",{staticClass:"fa fa-language"})])},function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("li",[n("button",{staticClass:"tool-btn"},[n("i",{staticClass:"fa fa-question-circle-o"})])])},function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("li",[n("button",{staticClass:"tool-btn"},[n("i",{staticClass:"fa fa-bell-o"})])])},function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("li",[n("button",{staticClass:"tool-btn"},[n("i",{staticClass:"fa fa-wrench"})])])}],ne=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{ref:"dropdown",staticClass:"m-dropdown",on:{click:t.handleClick}},[t._t("default"),n("transition",{attrs:{name:"m-dropdown"}},[n("div",{directives:[{name:"show",rawName:"v-show",value:t.isOpen,expression:"isOpen"}],staticClass:"m-dropdown-panel",class:{"is-center":"center"===t.align,"is-right":"right"===t.align,"is-left":"left"===t.align},style:Object.assign({},{margin:t.margin},t.panelStyle)},[t._t("panel")],2)])],2)},ae=[];function ie(t,e){return!!t&&(t===e||ie(t.parentNode,e))}var se={props:{trigger:{type:String,default:"click"},align:{type:String},margin:String,panelStyle:Object},data:function(){return{isOpen:!1}},methods:{handleClick:function(){this.isOpen=!this.isOpen},handleDocClick:function(t){ie(t.target,this.$refs.dropdown)||(this.isOpen=!1)}},mounted:function(){document.addEventListener("click",this.handleDocClick,!1)},beforeDestroy:function(){document.removeEventListener("click",this.handleDocClick)}},oe=se,le=Object(u["a"])(oe,ne,ae,!1,null,null,null),re=le.exports,ce=(n("aba0"),re),ue=function(){return!0};function me(){var t=document.documentElement;t.requestFullscreen?t.requestFullscreen():t.mozRequestFullScreen?t.mozRequestFullScreen():t.webkitRequestFullScreen?t.webkitRequestFullScreen():t.msRequestFullscreen&&document.body.msRequestFullscreen()}function pe(){var t=document;t.exitFullscreen?t.exitFullscreen():t.mozCancelFullScreen?t.mozCancelFullScreen():t.webkitCancelFullScreen?t.webkitCancelFullScreen():t.msExitFullscreen&&document.msExitFullscreen()}var de=n("18d5"),fe=n.n(de),he={components:{MMenu:qt,MDropdown:ce},data:function(){return{userImg:fe.a,fullScreen:!1,menus:[{label:"Dashboard",icon:"fa fa-dashboard",path:"/admin"},{label:"Introduce",icon:"fa fa-dot-circle-o",path:"/page1"},{label:"GROUP 1",type:"group",items:[{label:"User Manger",icon:"fa fa-user-md",path:"/page1"},{label:"Permission Manger",icon:"fa fa-tasks",path:"/page2"},{label:"Group Manger",icon:"fa fa-group",path:"/page3"}]},{label:"GROUP 2",type:"group",items:[{label:"Content Manger",icon:"fa fa-circle",path:"/test"},{label:"Content Manger",icon:"fa fa-bomb",path:"/test"},{type:"line"},{label:"Content Manger",icon:"fa fa-circle-o",path:"/test"}]}],userMenus:[{label:"Your profile",icon:"fa fa-address-card",path:"/"},{label:"Logout",icon:"fa fa-arrow-circle-left",path:"/logout"}]}},methods:{handleFullScreen:function(){this.fullScreen?(pe(),this.fullScreen=!1):(me(),this.fullScreen=!0)}}},ge=he,ve=Object(u["a"])(ge,te,ee,!1,null,null,null),be=ve.exports,Ce={components:{MContainer:ct,MMain:ut,MHeader:mt,MSider:pt,AppAside:Xt,AppHeader:be},data:function(){return{navigation:{isClose:!1,isMoving:!1,isMini:!1,width:240}}},methods:{toggleNavigation:function(){this.navigation.isClose?(this.navigation.isClose=!1,this.navigation.width="undefined"!==typeof this.navigation.oldWidth?this.navigation.oldWidth:240,this.navigation.isMini&&(this.navigation.isMini=!1)):(this.navigation.isClose=!0,this.navigation.oldWidth=this.navigation.width,this.navigation.width=0)},docMousemove:function(t){var e=t.clientX-this.navigation.start.clientX,n=this.navigation.start.offsetWidth+e;n<50?(this.navigation.isClose=!0,n=0):n>60&&n<100?(this.navigation.isMini=!0,this.navigation.isClose=!1,n=60):(this.navigation.isMini=!1,this.navigation.isClose=!1),n>1e3&&(n=1e3),this.navigation.width=n},docMouseUp:function(){this.navigation.isMoving=!1,this.removeListen()},handleMousedown:function(t){var e=this;t.preventDefault(),t.stopPropagation(),this.navigation.start={clientX:t.clientX,offsetWidth:this.navigation.width||0},this.navigation.isMoving=!0,document.addEventListener("mousemove",this.docMousemove,!1),document.addEventListener("mouseup",this.docMouseUp,!1),this.removeListen=function(){document.removeEventListener("mousemove",e.docMousemove),document.removeEventListener("mouseup",e.docMouseUp)}},serialize:function(){localStorage.setItem("navigation",JSON.stringify(this.navigation))}},created:function(){try{var t=JSON.parse(localStorage.getItem("navigation"));"object"===Object(L["a"])(t)&&null!==t&&(this.navigation=t)}catch(e){console.log(e)}},mounted:function(){window.removeEventListener("blur",this.serialize),window.addEventListener("blur",this.serialize,!1)}},Ae=Ce,we=Object(u["a"])(Ae,B,z,!1,null,null,null),_e=we.exports,ye=function(){var t=this,e=t.$createElement;t._self._c;return t._m(0)},xe=[function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("p",[t._v("dashboard")]),n("h1",[t._v("Header1")]),n("h2",[t._v("Header2")]),n("h3",[t._v("Header3")]),n("h4",[t._v("Header4")]),n("h5",[t._v("Header5")]),n("h6",[t._v("Header6")])])}],ke={},Ee=Object(u["a"])(ke,ye,xe,!1,null,null,null),Se=Ee.exports,Me=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[t._v("Page1")])},Oe=[],Be={},ze=Object(u["a"])(Be,Me,Oe,!1,null,null,null),Le=ze.exports,je=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[t._v("Page2")])},$e=[],Ne={},Ie=Object(u["a"])(Ne,je,$e,!1,null,null,null),Ue=Ie.exports,Pe=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[t._v("Page3")])},Ve=[],De={},Qe=Object(u["a"])(De,Pe,Ve,!1,null,null,null),Te=Qe.exports;a["default"].use(b["a"]);var Fe=new b["a"]({mode:"hash",routes:[{path:"/",component:y},{path:"/login",component:O},{path:"/admin",component:_e,children:[{path:"",component:Se,meta:{icon:"fa fa-dashboard",label:"Dashboard"}},{path:"/page1",component:Le,meta:{icon:"fa fa-dashboard",label:"Dashboard"}},{path:"/page2",component:Ue,meta:{icon:"fa fa-dashboard",label:"Dashboard"}},{path:"/page3",component:Te,meta:{icon:"fa fa-dashboard",label:"Dashboard"}}]}]}),Ke=Fe,Re=n("2f62");a["default"].use(Re["a"]);var Ge={count:1},He=new Re["a"].Store({strict:!0,state:Ge}),qe=He,Je=n("a691"),We=n("7f32"),Ye=n.n(We),Ze=n("5c96"),Xe=n.n(Ze);n("a5d8"),n("7544"),n("0fae"),n("f266");a["default"].use(Je["a"],{name:"msg"}),a["default"].use(Ye.a,{dialogName:"m-dialog",alertName:"malert",confirmName:"mconfirm"}),a["default"].use(Xe.a),a["default"].config.productionTip=!1,Ke.beforeEach(function(t,e,n){s.a.start(),n()}),Ke.afterEach(function(t){setTimeout(function(){s.a.done()})});var tn=new a["default"]({router:Ke,store:qe,render:function(t){return t(v)}}).$mount("#app");window.app=ue()?void 0:tn},"5e74":function(t,e,n){},a03d:function(t,e,n){},a781:function(t,e,n){},aba0:function(t,e,n){},e3ca:function(t,e,n){"use strict";var a=n("327a"),i=n.n(a);i.a},f266:function(t,e,n){}}); 2 | //# sourceMappingURL=index.b7065760.js.map -------------------------------------------------------------------------------- /feihong_2019-12-20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengdu/vue-element-admin-tpl/8dc21c7fead0604f083b82d4da5bbc677346f3ca/feihong_2019-12-20.png -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vue-element-admin-tpl", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "vue-cli-service serve", 7 | "build": "vue-cli-service build", 8 | "build-test": "vue-cli-service build --mode test", 9 | "lint": "vue-cli-service lint" 10 | }, 11 | "dependencies": { 12 | "@dove-ui/menu": "^0.1.2", 13 | "axios": "^0.19.0", 14 | "core-js": "^2.6.5", 15 | "dayjs": "^1.8.35", 16 | "element-ui": "^2.11.1", 17 | "font-awesome": "^4.7.0", 18 | "normalize.css": "^8.0.1", 19 | "nprogress": "^0.2.0", 20 | "vue": "^2.6.10", 21 | "vue-m-dialog": "^1.2.1", 22 | "vue-m-message": "^2.0.0", 23 | "vue-router": "^3.0.7", 24 | "vuex": "^3.1.1" 25 | }, 26 | "devDependencies": { 27 | "@vue/cli-plugin-babel": "^3.9.0", 28 | "@vue/cli-plugin-eslint": "^3.9.0", 29 | "@vue/cli-service": "^3.9.0", 30 | "@vue/eslint-config-standard": "^4.0.0", 31 | "babel-eslint": "^10.0.1", 32 | "eslint": "^5.16.0", 33 | "eslint-plugin-vue": "^5.0.0", 34 | "less": "^3.9.0", 35 | "less-loader": "^5.0.0", 36 | "vue-template-compiler": "^2.6.10" 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | autoprefixer: {} 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengdu/vue-element-admin-tpl/8dc21c7fead0604f083b82d4da5bbc677346f3ca/public/favicon.ico -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Admin Platform 9 | 10 | 11 | 14 |
15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 26 | -------------------------------------------------------------------------------- /src/api/index.js: -------------------------------------------------------------------------------- 1 | import user from './user' 2 | 3 | export { 4 | user 5 | } 6 | -------------------------------------------------------------------------------- /src/api/user.js: -------------------------------------------------------------------------------- 1 | import http from '../utils/http' 2 | import { sleep } from '../utils' 3 | 4 | const mockData = { 5 | user: null 6 | } 7 | 8 | export const login = async (username, password) => { 9 | // return http.post('/login', { 10 | // username, 11 | // password 12 | // }) 13 | await sleep(1000) 14 | mockData.user = { 15 | id: Math.random().toString().substr(2, 4), 16 | username: username, 17 | nickname: Math.random().toString(36), 18 | avatar: 'https://avatars2.githubusercontent.com/u/11366654?s=60&v=4' 19 | } 20 | 21 | return { data: mockData.user } 22 | } 23 | 24 | export const getLoginInfo = () => { 25 | // return http.get('/login/info') 26 | // 模拟 27 | return new Promise((resolve) => { 28 | // resolve(null) 29 | setTimeout(() => { 30 | resolve(mockData.user) 31 | }, 1000) 32 | }) 33 | } 34 | 35 | export const getUserList = () => { 36 | return http.get('/api/users') 37 | } 38 | -------------------------------------------------------------------------------- /src/assets/css/animation.less: -------------------------------------------------------------------------------- 1 | // 圆形裁剪动画 2 | .am-clip-circle { 3 | // clip-path: circle(16% at 50% 50%); 4 | animation: clip-circle 900ms cubic-bezier(0,0,0,0.7) backwards 0.5s; 5 | } 6 | 7 | @keyframes clip-circle { 8 | from { 9 | clip-path: circle(0 at 50% 50%); 10 | } 11 | to { 12 | clip-path: circle(100% at 50% 50%); 13 | } 14 | } 15 | 16 | .am-fade-down { 17 | animation: fade-down 1s cubic-bezier(0,0,0,1) backwards 1s; 18 | } 19 | 20 | .am-fade-up { 21 | animation: fade-up 1s cubic-bezier(0,0,0,1) backwards 1s; 22 | } 23 | 24 | .am-fade-left { 25 | animation: fade-left 1s cubic-bezier(0,0,0,1) backwards 1s; 26 | } 27 | .am-fade-right { 28 | animation: fade-right 1s cubic-bezier(0,0,0,1) backwards 1s; 29 | } 30 | 31 | @keyframes fade-down { 32 | from { 33 | opacity: 0; 34 | transform: translateY(-32px) 35 | } 36 | to { 37 | opacity: 1; 38 | transform: none 39 | } 40 | } 41 | @keyframes fade-up { 42 | from { 43 | opacity: 0; 44 | transform: translateY(32px) 45 | } 46 | to { 47 | opacity: 1; 48 | transform: none 49 | } 50 | } 51 | @keyframes fade-left { 52 | from { 53 | opacity: 0; 54 | transform: translateX(-32px) 55 | } 56 | to { 57 | opacity: 1; 58 | transform: none 59 | } 60 | } 61 | @keyframes fade-right { 62 | from { 63 | opacity: 0; 64 | transform: translateX(32px) 65 | } 66 | to { 67 | opacity: 1; 68 | transform: none 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /src/assets/css/app-view.css: -------------------------------------------------------------------------------- 1 | .app-layout { 2 | position: fixed; 3 | width: 100%; 4 | height: 100%; 5 | background-color: #f1f4f7; 6 | } 7 | .app-layout .app-sider { 8 | background-color: #19202E; 9 | color: #8C96A9; 10 | width: 240px; 11 | transition: all 0.3s cubic-bezier(0.23, 1, 0.32, 1); 12 | position: relative; 13 | overflow: hidden; 14 | } 15 | .app-layout .app-sider.is-moving { 16 | transition: none; 17 | } 18 | .app-layout .app-sider.is-close { 19 | width: 0; 20 | padding: 0; 21 | } 22 | .app-layout .app-header { 23 | background-color: #fff; 24 | height: 58px; 25 | box-shadow: 0 0 5px rgba(0, 0, 0, 0.06); 26 | padding: 0 15px; 27 | z-index: 1; 28 | } 29 | .app-layout .app-content { 30 | padding: 10px; 31 | overflow-x: hidden; 32 | overflow-y: auto; 33 | } 34 | .app-layout .app-footer { 35 | background-color: #fff; 36 | border-top: solid 1px #E2E3E4; 37 | } 38 | .app-layout .m-page-enter-active { 39 | animation: page-in 0.3s; 40 | } 41 | .app-layout .m-page-leave-active { 42 | animation: page-out 0.3s; 43 | } 44 | @keyframes page-in { 45 | 0% { 46 | transform: translateX(-20px); 47 | opacity: 0; 48 | } 49 | 100% { 50 | transform: translateX(0); 51 | opacity: 1; 52 | } 53 | } 54 | @keyframes page-out { 55 | 0% { 56 | transform: translateX(0, 0, 0); 57 | opacity: 1; 58 | } 59 | 100% { 60 | transform: translateX(20px); 61 | opacity: 0; 62 | } 63 | } 64 | .app-aside .app-logo-box { 65 | box-sizing: border-box; 66 | height: 58px; 67 | line-height: 58px; 68 | padding: 0 15px; 69 | color: rgba(255, 255, 255, 0.9); 70 | overflow: hidden; 71 | transition: padding 0.2s ease; 72 | background-color: #1B8CE1; 73 | background-image: linear-gradient(20deg, #1C60E7 -20%, #1B8CE1); 74 | } 75 | .app-aside .app-logo-box .app-logo { 76 | height: 35px; 77 | vertical-align: middle; 78 | margin-right: 10px; 79 | transition: all 0.3s ease; 80 | } 81 | .app-aside .app-logo-box .app-name { 82 | font-size: 1.3rem; 83 | vertical-align: middle; 84 | } 85 | .app-aside .app-menu-box { 86 | width: 100%; 87 | max-height: calc(100% - 58px); 88 | overflow: auto; 89 | position: absolute; 90 | box-sizing: border-box; 91 | padding-bottom: 50px; 92 | /*滚动轨道*/ 93 | /*滚动条*/ 94 | } 95 | .app-aside .app-menu-box .menu-title { 96 | font-size: 12px; 97 | color: #5c6579; 98 | padding: 10px; 99 | } 100 | .app-aside .app-menu-box .menu-item-icon { 101 | margin-right: 7px; 102 | } 103 | .app-aside .app-menu-box .menu-item-label { 104 | margin-right: 10px; 105 | } 106 | .app-aside .app-menu-box .menu-item-des { 107 | opacity: 0.5; 108 | font-size: 12px; 109 | } 110 | .app-aside .app-menu-box .vc-menu-item .vc-menu-item--row, 111 | .app-aside .app-menu-box .vc-menu-item .vc-menu-item--label { 112 | transition: all 0.4s ease; 113 | } 114 | .app-aside .app-menu-box .vc-menu-item .vc-menu-item--row.is-hovered + .vc-menu-item--label, 115 | .app-aside .app-menu-box .vc-menu-item .vc-menu-item--row.is-clicked + .vc-menu-item--label { 116 | color: #F5F5FA; 117 | } 118 | .app-aside .app-menu-box::-webkit-scrollbar-track { 119 | background-color: rgba(255, 255, 255, 0.1); 120 | } 121 | .app-aside .app-menu-box::-webkit-scrollbar-thumb { 122 | min-height: 20px; 123 | background-color: rgba(255, 255, 255, 0.1); 124 | } 125 | .app-aside .app-menu-box::-webkit-scrollbar-thumb:hover { 126 | background-color: rgba(255, 255, 255, 0.3); 127 | border-width: 1px; 128 | } 129 | .env-test .app-aside .app-logo-box { 130 | background-color: #f7683b; 131 | background-image: linear-gradient(20deg, #FF5722 -20%, #FF9800); 132 | } 133 | .env-dev .app-aside .app-logo-box { 134 | background-color: #c52129; 135 | background-image: linear-gradient(20deg, #c52129 -20%, #de3427); 136 | } 137 | .app-sider.is-mini .app-logo { 138 | width: 100%; 139 | } 140 | .app-sider.is-mini .app-name { 141 | display: none; 142 | } 143 | .app-sider-control { 144 | width: 0px; 145 | position: relative; 146 | cursor: ew-resize; 147 | } 148 | .app-sider-control .collapse-btn { 149 | position: absolute; 150 | top: calc(50% - 18px); 151 | height: 36px; 152 | color: transparent; 153 | width: 24px; 154 | left: -1px; 155 | cursor: pointer; 156 | background: none; 157 | border: none; 158 | outline: none; 159 | z-index: 1000; 160 | } 161 | .app-sider-control .collapse-btn::before, 162 | .app-sider-control .collapse-btn::after { 163 | content: ""; 164 | background-color: #4c9aff; 165 | width: 2px; 166 | height: 8px; 167 | position: absolute; 168 | left: 8px; 169 | opacity: 0.3; 170 | transform: rotate(0deg); 171 | border-radius: 16px; 172 | transition: transform 200ms ease-in-out 0s, opacity 300ms ease-in-out 200ms; 173 | } 174 | .app-sider-control .collapse-btn::before { 175 | top: 10px; 176 | transform-origin: 1px 7px 0px; 177 | } 178 | .app-sider-control .collapse-btn::after { 179 | top: 16px; 180 | transform-origin: 1px 1px 0px; 181 | } 182 | .app-sider-control .collapse-btn:hover::before { 183 | transform: rotate(40deg); 184 | } 185 | .app-sider-control .collapse-btn:hover::after { 186 | transform: rotate(-40deg); 187 | } 188 | .app-sider-control .collapse-btn.close::before, 189 | .app-sider-control .collapse-btn.close::after { 190 | left: 11px; 191 | } 192 | .app-sider-control .collapse-btn.close:hover::before { 193 | transform: rotate(-40deg); 194 | } 195 | .app-sider-control .collapse-btn.close:hover::after { 196 | transform: rotate(40deg); 197 | } 198 | .app-sider-control::after { 199 | content: ""; 200 | position: absolute; 201 | width: 15px; 202 | height: 100%; 203 | background-color: transparent; 204 | right: -7px; 205 | } 206 | .app-sider-control::before { 207 | content: ""; 208 | height: 100%; 209 | width: 2px; 210 | left: 0px; 211 | top: 0; 212 | position: absolute; 213 | transition: background-color 300ms ease-in-out 200ms; 214 | } 215 | .app-sider-control:hover .collapse-btn::before, 216 | .app-sider-control:hover .collapse-btn::after { 217 | opacity: 1; 218 | } 219 | .app-sider-control:hover:before { 220 | background: #4c9aff; 221 | } 222 | .app-header-box .app-header-tool { 223 | list-style: none; 224 | margin: 0; 225 | padding: 0; 226 | } 227 | .app-header-box .app-header-tool > li { 228 | display: inline-block; 229 | vertical-align: middle; 230 | line-height: 58px; 231 | padding: 0 10px; 232 | font-size: 0.95rem; 233 | color: #515a6e; 234 | background-color: rgba(255, 255, 255, 0.1); 235 | transition: background-color 0.3s linear; 236 | } 237 | .app-header-box .app-header-tool > li .tool-btn { 238 | border: none; 239 | background: transparent; 240 | cursor: pointer; 241 | color: inherit; 242 | } 243 | .app-header-box .app-header-tool > li .tool-btn:hover { 244 | color: #121F29; 245 | } 246 | .app-header-box .app-header-tool > li .tool-search-input { 247 | border: none; 248 | border-radius: 5px; 249 | background-color: rgba(40, 44, 52, 0.03); 250 | height: 30px; 251 | outline: none; 252 | padding: 0 10px; 253 | width: 150px; 254 | transition: all 0.2s ease; 255 | } 256 | .app-header-box .app-header-tool > li .tool-search-input:focus { 257 | width: 300px; 258 | } 259 | .app-header-box .app-header-tool > li a { 260 | color: inherit; 261 | } 262 | .app-header-box .app-header-tool > li a .fa-external-link { 263 | font-size: 0.8rem; 264 | } 265 | .app-header-box .app-header-tool > li img { 266 | vertical-align: middle; 267 | } 268 | .app-header-box .app-header-tool .user-avatar { 269 | border-radius: 3px; 270 | width: 32px; 271 | height: 32px; 272 | } 273 | .app-header-box .app-header-tool .m-dropdown-panel, 274 | .app-header-box .app-header-tool .m-css-dropdown-panel { 275 | min-width: 200px; 276 | border-radius: 0 0 3px 3px; 277 | margin-left: -10px; 278 | } 279 | .app-header-box .app-header-tool .m-dropdown-panel.is-center, 280 | .app-header-box .app-header-tool .m-css-dropdown-panel.is-center { 281 | margin-left: 0px; 282 | } 283 | .app-header-box .app-header-tool .m-dropdown-panel.is-right, 284 | .app-header-box .app-header-tool .m-css-dropdown-panel.is-right { 285 | margin-right: -10px; 286 | } 287 | .app-header-box .app-header-tool .m-dropdown-panel::-webkit-scrollbar, 288 | .app-header-box .app-header-tool .m-css-dropdown-panel::-webkit-scrollbar { 289 | width: 0px; 290 | height: 0px; 291 | background: transparent; 292 | } 293 | .app-header-box .app-header-tool .m-dropdown-panel::-webkit-scrollbar-corner, 294 | .app-header-box .app-header-tool .m-css-dropdown-panel::-webkit-scrollbar-corner { 295 | background: transparent; 296 | } 297 | .app-header-box .app-header-tool .m-dropdown-panel::-webkit-resizer, 298 | .app-header-box .app-header-tool .m-css-dropdown-panel::-webkit-resizer { 299 | background: transparent; 300 | } 301 | -------------------------------------------------------------------------------- /src/assets/css/app-view.less: -------------------------------------------------------------------------------- 1 | 2 | .app-layout { 3 | position: fixed; 4 | width: 100%; 5 | height: 100%; 6 | background-color: #f1f4f7; 7 | 8 | .app-sider { 9 | background-color: #19202E; 10 | color: #8C96A9; 11 | width: 240px; 12 | transition: all 0.3s cubic-bezier(0.23, 1, 0.32, 1); 13 | position: relative; 14 | overflow: hidden; 15 | 16 | &.is-moving { 17 | transition: none; 18 | } 19 | 20 | &.is-close { 21 | width: 0; 22 | padding: 0; 23 | } 24 | } 25 | 26 | .app-header { 27 | background-color: #fff; 28 | height: 58px; 29 | box-shadow: 0 0 5px rgba(0, 0, 0, 0.06); 30 | padding: 0 15px; 31 | z-index: 1; 32 | } 33 | 34 | .app-content { 35 | padding: 10px; 36 | overflow-x: hidden; 37 | overflow-y: auto; 38 | } 39 | 40 | .app-footer { 41 | background-color: #fff; 42 | border-top: solid 1px #E2E3E4; 43 | } 44 | 45 | .m-page-enter-active { 46 | animation: page-in .3s; 47 | } 48 | .m-page-leave-active { 49 | animation: page-out .3s; 50 | } 51 | 52 | @keyframes page-in { 53 | 0% { 54 | transform: translateX(-20px); 55 | opacity: 0; 56 | } 57 | 100% { 58 | transform: translateX(0); 59 | opacity: 1; 60 | } 61 | } 62 | 63 | @keyframes page-out { 64 | 0% { 65 | transform: translateX(0,0,0); 66 | opacity: 1; 67 | } 68 | 100% { 69 | transform: translateX(20px); 70 | opacity: 0; 71 | } 72 | } 73 | } 74 | 75 | .app-aside { 76 | .app-logo-box { 77 | box-sizing: border-box; 78 | height: 58px; 79 | line-height: 58px; 80 | padding: 0 15px; 81 | color: rgba(255,255,255, 0.9); 82 | overflow: hidden; 83 | transition: padding 0.2s ease; 84 | background-color: #1B8CE1; 85 | background-image: linear-gradient(20deg, #1C60E7 -20%, #1B8CE1); 86 | 87 | .app-logo { 88 | height: 35px; 89 | vertical-align: middle; 90 | margin-right: 10px; 91 | transition: all 0.3s ease; 92 | } 93 | 94 | .app-name { 95 | font-size: 1.3rem; 96 | vertical-align: middle; 97 | } 98 | } 99 | 100 | .app-menu-box { 101 | width: 100%; 102 | max-height: calc(100% - 58px); 103 | overflow: auto; 104 | position: absolute; 105 | box-sizing: border-box; 106 | padding-bottom: 50px; 107 | 108 | .menu-title { 109 | font-size: 12px; 110 | color: #5c6579; 111 | padding: 10px; 112 | } 113 | .menu-item-icon { 114 | margin-right: 7px; 115 | } 116 | .menu-item-label { 117 | margin-right: 10px; 118 | } 119 | .menu-item-des { 120 | opacity: 0.5; 121 | font-size: 12px; 122 | } 123 | 124 | .vc-menu-item .vc-menu-item--row, 125 | .vc-menu-item .vc-menu-item--label { 126 | transition: all 0.4s ease; 127 | } 128 | .vc-menu-item .vc-menu-item--row.is-hovered + .vc-menu-item--label, 129 | .vc-menu-item .vc-menu-item--row.is-clicked + .vc-menu-item--label { 130 | color: #F5F5FA; 131 | } 132 | 133 | /*滚动轨道*/ 134 | &::-webkit-scrollbar-track { 135 | background-color: rgba(255,255,255, 0.1); 136 | } 137 | /*滚动条*/ 138 | &::-webkit-scrollbar-thumb { 139 | min-height: 20px; 140 | background-color: rgba(255,255,255, 0.1); 141 | } 142 | &::-webkit-scrollbar-thumb:hover{ 143 | background-color: rgba(255,255,255, 0.3); 144 | border-width: 1px; 145 | } 146 | } 147 | } 148 | 149 | .env-test { 150 | .app-aside .app-logo-box { 151 | background-color: #f7683b; 152 | background-image: linear-gradient(20deg, #FF5722 -20%, #FF9800); 153 | } 154 | } 155 | 156 | .env-dev { 157 | .app-aside .app-logo-box { 158 | background-color: #c52129; 159 | background-image: linear-gradient(20deg, #c52129 -20%, #de3427); 160 | } 161 | } 162 | 163 | .app-sider.is-mini { 164 | .app-logo { 165 | width: 100%; 166 | } 167 | .app-name { 168 | display: none; 169 | } 170 | } 171 | 172 | .app-sider-control { 173 | width: 0px; 174 | position: relative; 175 | cursor: ew-resize; 176 | 177 | .collapse-btn { 178 | position: absolute; 179 | top: calc(50% - 18px); 180 | height: 36px; 181 | color: transparent; 182 | width: 24px; 183 | left: -1px; 184 | cursor: pointer; 185 | background: none; 186 | border: none; 187 | outline: none; 188 | z-index: 1000; 189 | 190 | &::before, 191 | &::after { 192 | content: ""; 193 | background-color: rgb(76, 154, 255); 194 | width: 2px; 195 | height: 8px; 196 | position: absolute; 197 | left: 8px; 198 | opacity: 0.3; 199 | transform: rotate(0deg); 200 | border-radius: 16px; 201 | transition: transform 200ms ease-in-out 0s, opacity 300ms ease-in-out 200ms; 202 | } 203 | &::before { 204 | top: 10px; 205 | transform-origin: 1px 7px 0px; 206 | } 207 | &::after { 208 | top: 16px; 209 | transform-origin: 1px 1px 0px; 210 | } 211 | &:hover { 212 | &::before { 213 | transform: rotate(40deg); 214 | } 215 | &::after { 216 | transform: rotate(-40deg); 217 | } 218 | } 219 | &.close { 220 | &::before, 221 | &::after { 222 | left: 11px; 223 | } 224 | &:hover { 225 | &::before { 226 | transform: rotate(-40deg); 227 | } 228 | &::after { 229 | transform: rotate(40deg); 230 | } 231 | } 232 | } 233 | } 234 | 235 | &::after { 236 | content: ""; 237 | position: absolute; 238 | width: 15px; 239 | height: 100%; 240 | background-color: transparent; 241 | right: -7px; 242 | } 243 | 244 | &::before { 245 | content: ""; 246 | height: 100%; 247 | width: 2px; 248 | left: 0px; 249 | top: 0; 250 | position: absolute; 251 | transition: background-color 300ms ease-in-out 200ms; 252 | } 253 | 254 | &:hover { 255 | .collapse-btn { 256 | &::before, 257 | &::after { 258 | opacity: 1; 259 | } 260 | } 261 | } 262 | 263 | &:hover:before { 264 | background: rgb(76, 154, 255); 265 | } 266 | } 267 | 268 | .app-header-box { 269 | .app-header-tool { 270 | list-style: none; 271 | margin: 0; 272 | padding: 0; 273 | 274 | & > li { 275 | display: inline-block; 276 | vertical-align: middle; 277 | line-height: 58px; 278 | padding: 0 10px; 279 | font-size: 0.95rem; 280 | color: #515a6e; 281 | background-color: rgba(255,255,255, 0.1); 282 | transition: background-color 0.3s linear; 283 | 284 | &:hover { 285 | // background-color: rgba(40,44,52, 0.03); 286 | } 287 | 288 | .tool-btn { 289 | border: none; 290 | background: transparent; 291 | cursor: pointer; 292 | color: inherit; 293 | 294 | &:hover { 295 | color: #121F29; 296 | } 297 | } 298 | 299 | .tool-search-input { 300 | border: none; 301 | border-radius: 5px; 302 | background-color: rgba(40,44,52, 0.03); 303 | height: 30px; 304 | outline: none; 305 | padding: 0 10px; 306 | width: 150px; 307 | transition: all 0.2s ease; 308 | 309 | &:focus { 310 | width: 300px; 311 | } 312 | } 313 | 314 | a { 315 | color: inherit; 316 | 317 | .fa-external-link { 318 | font-size: 0.8rem; 319 | } 320 | } 321 | 322 | img { 323 | vertical-align: middle; 324 | } 325 | } 326 | 327 | .user-avatar { 328 | border-radius: 3px; 329 | width: 32px; 330 | height: 32px; 331 | } 332 | 333 | .m-dropdown-panel, 334 | .m-css-dropdown-panel { 335 | min-width: 200px; 336 | border-radius: 0 0 3px 3px; 337 | margin-left: -10px; 338 | 339 | &.is-center { 340 | margin-left: 0px; 341 | } 342 | 343 | &.is-right { 344 | margin-right: -10px; 345 | } 346 | 347 | &::-webkit-scrollbar { 348 | width: 0px; 349 | height: 0px; 350 | background: transparent; 351 | } 352 | &::-webkit-scrollbar-corner { 353 | background: transparent; 354 | } 355 | &::-webkit-resizer{ 356 | background: transparent; 357 | } 358 | } 359 | } 360 | } 361 | -------------------------------------------------------------------------------- /src/assets/css/main.css: -------------------------------------------------------------------------------- 1 | body { 2 | background-color: #fff; 3 | margin: 0; 4 | padding: 0; 5 | color: #292c38; 6 | font-size: 14px; 7 | line-height: 1.5; 8 | font-family: "PingFang SC", "Helvetica Neue", Helvetica, "Hiragino Sans GB", "Microsoft YaHei", "\5FAE\8F6F\96C5\9ED1", Arial, sans-serif; 9 | } 10 | a { 11 | color: #4394FF; 12 | text-decoration: none; 13 | transition: color 0.3s ease; 14 | } 15 | .m-link-effect { 16 | position: relative; 17 | } 18 | .m-link-effect::after { 19 | content: ""; 20 | display: block; 21 | height: 0px; 22 | border-bottom: solid 1px; 23 | bottom: -2px; 24 | position: absolute; 25 | transition: all 0.3s ease; 26 | width: 0; 27 | right: 0; 28 | } 29 | .m-link-effect:hover::after { 30 | left: 0; 31 | width: 100%; 32 | } 33 | .float-right { 34 | float: right; 35 | } 36 | .float-left { 37 | float: left; 38 | } 39 | .text-center { 40 | text-align: center; 41 | } 42 | .text-right { 43 | text-align: right; 44 | } 45 | .clearfix::after, 46 | .clearfix::before { 47 | content: ""; 48 | display: table; 49 | clear: both; 50 | } 51 | ::selection { 52 | background: #CBD1DE; 53 | } 54 | ::-webkit-scrollbar { 55 | width: 9px; 56 | height: 9px; 57 | background: transparent; 58 | } 59 | ::-webkit-scrollbar-corner { 60 | background: transparent; 61 | } 62 | ::-webkit-resizer { 63 | background: transparent; 64 | } 65 | ::-webkit-scrollbar-track, 66 | ::-webkit-scrollbar-thumb { 67 | border-radius: 999px; 68 | background-clip: content-box; 69 | border: solid 2px transparent; 70 | transition: all 0.3s ease; 71 | } 72 | /*滚动轨道*/ 73 | ::-webkit-scrollbar-track { 74 | background-color: rgba(53, 59, 69, 0.1); 75 | } 76 | /*滚动条*/ 77 | ::-webkit-scrollbar-thumb { 78 | min-height: 20px; 79 | background-color: rgba(53, 59, 69, 0.3); 80 | } 81 | ::-webkit-scrollbar-thumb:hover { 82 | background-color: rgba(53, 59, 69, 0.5); 83 | border-width: 1px; 84 | } 85 | .app-layout { 86 | position: fixed; 87 | width: 100%; 88 | height: 100%; 89 | background-color: #f1f4f7; 90 | } 91 | .app-layout .app-sider { 92 | background-color: #19202E; 93 | color: #8C96A9; 94 | width: 240px; 95 | transition: all 0.3s cubic-bezier(0.23, 1, 0.32, 1); 96 | position: relative; 97 | overflow: hidden; 98 | } 99 | .app-layout .app-sider.is-moving { 100 | transition: none; 101 | } 102 | .app-layout .app-sider.is-close { 103 | width: 0; 104 | padding: 0; 105 | } 106 | .app-layout .app-header { 107 | background-color: #fff; 108 | height: 58px; 109 | box-shadow: 0 0 5px rgba(0, 0, 0, 0.06); 110 | padding: 0 15px; 111 | } 112 | .app-layout .app-content { 113 | padding: 10px; 114 | overflow-x: hidden; 115 | overflow-y: auto; 116 | } 117 | .app-layout .app-footer { 118 | background-color: #fff; 119 | border-top: solid 1px #E2E3E4; 120 | } 121 | .app-layout .m-page-enter-active { 122 | animation: page-in 0.3s; 123 | } 124 | .app-layout .m-page-leave-active { 125 | animation: page-out 0.3s; 126 | } 127 | @keyframes page-in { 128 | 0% { 129 | transform: translateX(-20px); 130 | opacity: 0; 131 | } 132 | 100% { 133 | transform: translateX(0); 134 | opacity: 1; 135 | } 136 | } 137 | @keyframes page-out { 138 | 0% { 139 | transform: translateX(0, 0, 0); 140 | opacity: 1; 141 | } 142 | 100% { 143 | transform: translateX(20px); 144 | opacity: 0; 145 | } 146 | } 147 | .app-aside .app-logo-box { 148 | box-sizing: border-box; 149 | height: 58px; 150 | line-height: 58px; 151 | padding: 0 15px; 152 | color: rgba(255, 255, 255, 0.9); 153 | overflow: hidden; 154 | transition: padding 0.2s ease; 155 | background-color: #1B8CE1; 156 | background-image: linear-gradient(20deg, #1C60E7 -20%, #1B8CE1); 157 | } 158 | .app-aside .app-logo-box .app-logo { 159 | height: 40px; 160 | vertical-align: middle; 161 | margin-right: 10px; 162 | transition: all 0.3s ease; 163 | } 164 | .app-aside .app-logo-box .app-name { 165 | font-size: 1.5rem; 166 | vertical-align: middle; 167 | } 168 | .app-aside .app-menu-box { 169 | width: 100%; 170 | max-height: calc(100% - 58px); 171 | overflow: auto; 172 | position: absolute; 173 | box-sizing: border-box; 174 | padding-bottom: 50px; 175 | /*滚动轨道*/ 176 | /*滚动条*/ 177 | } 178 | .app-aside .app-menu-box .menu-item-icon { 179 | margin-right: 7px; 180 | } 181 | .app-aside .app-menu-box .menu-item-label { 182 | margin-right: 10px; 183 | } 184 | .app-aside .app-menu-box .menu-item-des { 185 | opacity: 0.5; 186 | } 187 | .app-aside .app-menu-box .vc-menu-item .vc-menu-item--row, 188 | .app-aside .app-menu-box .vc-menu-item .vc-menu-item--label { 189 | transition: all 0.4s ease; 190 | } 191 | .app-aside .app-menu-box .vc-menu-item .vc-menu-item--row.is-hovered + .vc-menu-item--label { 192 | color: #F5F5FA; 193 | } 194 | .app-aside .app-menu-box::-webkit-scrollbar-track { 195 | background-color: rgba(255, 255, 255, 0.1); 196 | } 197 | .app-aside .app-menu-box::-webkit-scrollbar-thumb { 198 | min-height: 20px; 199 | background-color: rgba(255, 255, 255, 0.1); 200 | } 201 | .app-sider.is-mini .app-logo { 202 | width: 100%; 203 | } 204 | .app-sider.is-mini .app-name { 205 | display: none; 206 | } 207 | .app-sider-control { 208 | width: 0px; 209 | position: relative; 210 | cursor: ew-resize; 211 | } 212 | .app-sider-control .collapse-btn { 213 | position: absolute; 214 | top: calc(50% - 18px); 215 | height: 36px; 216 | color: transparent; 217 | width: 24px; 218 | left: -1px; 219 | cursor: pointer; 220 | background: none; 221 | border: none; 222 | outline: none; 223 | z-index: 1000; 224 | } 225 | .app-sider-control .collapse-btn::before, 226 | .app-sider-control .collapse-btn::after { 227 | content: ""; 228 | background-color: #4c9aff; 229 | width: 2px; 230 | height: 8px; 231 | position: absolute; 232 | left: 8px; 233 | opacity: 0; 234 | transform: rotate(0deg); 235 | border-radius: 16px; 236 | transition: transform 200ms ease-in-out 0s, opacity 300ms ease-in-out 200ms; 237 | } 238 | .app-sider-control .collapse-btn::before { 239 | top: 10px; 240 | transform-origin: 1px 7px 0px; 241 | } 242 | .app-sider-control .collapse-btn::after { 243 | top: 16px; 244 | transform-origin: 1px 1px 0px; 245 | } 246 | .app-sider-control .collapse-btn:hover::before { 247 | transform: rotate(40deg); 248 | } 249 | .app-sider-control .collapse-btn:hover::after { 250 | transform: rotate(-40deg); 251 | } 252 | .app-sider-control .collapse-btn.close::before, 253 | .app-sider-control .collapse-btn.close::after { 254 | left: 11px; 255 | } 256 | .app-sider-control .collapse-btn.close:hover::before { 257 | transform: rotate(-40deg); 258 | } 259 | .app-sider-control .collapse-btn.close:hover::after { 260 | transform: rotate(40deg); 261 | } 262 | .app-sider-control::after { 263 | content: ""; 264 | position: absolute; 265 | width: 15px; 266 | height: 100%; 267 | background-color: transparent; 268 | right: -7px; 269 | } 270 | .app-sider-control::before { 271 | content: ""; 272 | height: 100%; 273 | width: 2px; 274 | left: 0px; 275 | top: 0; 276 | position: absolute; 277 | transition: background-color 300ms ease-in-out 200ms; 278 | } 279 | .app-sider-control:hover .collapse-btn::before, 280 | .app-sider-control:hover .collapse-btn::after { 281 | opacity: 1; 282 | } 283 | .app-sider-control:hover:before { 284 | background: #4c9aff; 285 | } 286 | .app-header-box .app-header-tool { 287 | list-style: none; 288 | margin: 0; 289 | padding: 0; 290 | } 291 | .app-header-box .app-header-tool > li { 292 | display: inline-block; 293 | vertical-align: middle; 294 | line-height: 58px; 295 | padding: 0 10px; 296 | cursor: pointer; 297 | font-size: 0.95rem; 298 | color: #515a6e; 299 | background-color: rgba(255, 255, 255, 0.1); 300 | transition: background-color 0.3s linear; 301 | } 302 | .app-header-box .app-header-tool > li:hover { 303 | background-color: rgba(40, 44, 52, 0.03); 304 | } 305 | .app-header-box .app-header-tool > li .tool-btn { 306 | border: none; 307 | background: transparent; 308 | cursor: pointer; 309 | color: inherit; 310 | } 311 | .app-header-box .app-header-tool > li .tool-btn:hover { 312 | color: #121F29; 313 | } 314 | .app-header-box .app-header-tool > li .tool-search-input { 315 | border: none; 316 | border-radius: 5px; 317 | background-color: rgba(40, 44, 52, 0.03); 318 | height: 30px; 319 | outline: none; 320 | padding: 0 10px; 321 | width: 150px; 322 | transition: all 0.2s ease; 323 | } 324 | .app-header-box .app-header-tool > li .tool-search-input:focus { 325 | width: 300px; 326 | } 327 | .app-header-box .app-header-tool > li a { 328 | color: inherit; 329 | } 330 | .app-header-box .app-header-tool > li a .fa-external-link { 331 | font-size: 0.8rem; 332 | } 333 | .app-header-box .app-header-tool > li img { 334 | vertical-align: middle; 335 | } 336 | .app-header-box .app-header-tool .user-avatar { 337 | border-radius: 3px; 338 | } 339 | .app-header-box .app-header-tool .m-dropdown-panel, 340 | .app-header-box .app-header-tool .m-css-dropdown-panel { 341 | min-width: 200px; 342 | border-radius: 0 0 3px 3px; 343 | margin-left: -10px; 344 | } 345 | .app-header-box .app-header-tool .m-dropdown-panel.is-center, 346 | .app-header-box .app-header-tool .m-css-dropdown-panel.is-center { 347 | margin-left: 0px; 348 | } 349 | .app-header-box .app-header-tool .m-dropdown-panel.is-right, 350 | .app-header-box .app-header-tool .m-css-dropdown-panel.is-right { 351 | margin-right: -10px; 352 | } 353 | .app-header-box .app-header-tool .m-dropdown-panel::-webkit-scrollbar, 354 | .app-header-box .app-header-tool .m-css-dropdown-panel::-webkit-scrollbar { 355 | width: 0px; 356 | height: 0px; 357 | background: transparent; 358 | } 359 | .app-header-box .app-header-tool .m-dropdown-panel::-webkit-scrollbar-corner, 360 | .app-header-box .app-header-tool .m-css-dropdown-panel::-webkit-scrollbar-corner { 361 | background: transparent; 362 | } 363 | .app-header-box .app-header-tool .m-dropdown-panel::-webkit-resizer, 364 | .app-header-box .app-header-tool .m-css-dropdown-panel::-webkit-resizer { 365 | background: transparent; 366 | } 367 | -------------------------------------------------------------------------------- /src/assets/css/main.less: -------------------------------------------------------------------------------- 1 | body { 2 | background-color: #fff; 3 | margin: 0; 4 | padding: 0; 5 | color: #292c38; 6 | font-size: 14px; 7 | line-height: 1.5; 8 | font-family: "PingFang SC","Helvetica Neue",Helvetica,"Hiragino Sans GB","Microsoft YaHei","\5FAE\8F6F\96C5\9ED1",Arial,sans-serif; 9 | } 10 | 11 | a { 12 | color: #4394FF; 13 | text-decoration: none; 14 | transition: color 0.3s ease; 15 | } 16 | 17 | // 下划线效果链接 18 | .m-link-effect { 19 | position: relative; 20 | 21 | &::after { 22 | content: ""; 23 | display: block; 24 | height: 0px; 25 | border-bottom: solid 1px; 26 | bottom: -2px; 27 | position: absolute; 28 | transition: all 0.3s ease; 29 | width: 0; 30 | right: 0; 31 | } 32 | 33 | &:hover { 34 | &::after { 35 | left: 0; 36 | width: 100%; 37 | } 38 | } 39 | } 40 | 41 | .float-right { 42 | float: right; 43 | } 44 | 45 | .float-left { 46 | float: left; 47 | } 48 | 49 | .text-center { 50 | text-align: center; 51 | } 52 | 53 | .text-right { 54 | text-align: right; 55 | } 56 | 57 | .clearfix { 58 | &::after, 59 | &::before { 60 | content: ""; 61 | display: table; 62 | clear: both; 63 | } 64 | } 65 | 66 | ::selection { 67 | background: #CBD1DE; 68 | } 69 | 70 | &::-webkit-scrollbar { 71 | width: 9px; 72 | height: 9px; 73 | background: transparent; 74 | } 75 | &::-webkit-scrollbar-corner { 76 | background: transparent; 77 | } 78 | &::-webkit-resizer{ 79 | background: transparent; 80 | } 81 | &::-webkit-scrollbar-track, 82 | &::-webkit-scrollbar-thumb { 83 | border-radius: 999px; 84 | background-clip: content-box; 85 | border: solid 2px transparent; 86 | transition: all 0.3s ease; 87 | } 88 | /*滚动轨道*/ 89 | &::-webkit-scrollbar-track { 90 | background-color: rgba(53,59,69, 0.1); 91 | } 92 | /*滚动条*/ 93 | &::-webkit-scrollbar-thumb { 94 | min-height: 20px; 95 | background-color: rgba(53,59,69, 0.3); 96 | 97 | } 98 | &::-webkit-scrollbar-thumb:hover{ 99 | background-color: rgba(53,59,69, 0.5); 100 | border-width: 1px; 101 | } 102 | 103 | .block-box { 104 | box-shadow: 0 4px 8px 0 rgba(36,46,66,0.06); 105 | background: #fff; 106 | padding: 12px; 107 | border-radius: 4px; 108 | overflow: hidden; 109 | 110 | & + & { 111 | margin-top: 15px; 112 | } 113 | 114 | .block-box--header { 115 | padding: 12px; 116 | background-color: #f4f7fd; 117 | margin: -12px -12px 0 -12px; 118 | border-radius: 4px 4px 0 0; 119 | // border-bottom: 1px solid #EBEEF5; 120 | } 121 | 122 | .block-box--content { 123 | padding: 12px; 124 | margin: 0 -12px; 125 | } 126 | 127 | .block-box--footer { 128 | padding: 12px; 129 | border-radius: 0 0 4px 4px; 130 | background-color: #f9fbfd; 131 | margin: 0 -12px -12px -12px; 132 | } 133 | } 134 | 135 | .page-breadcrumb { 136 | margin-bottom: 15px; 137 | } 138 | 139 | .watermark-bg { 140 | position: absolute; 141 | width: 100%; 142 | height: 100%; 143 | z-index: 1; 144 | pointer-events: none; 145 | background-size: 120px 120px; 146 | opacity: 0.1; 147 | // mix-blend-mode: color-burn; 148 | // background-blend-mode: screen; 149 | } 150 | 151 | // reset el-table 152 | .el-table--border td,.el-table--border th { 153 | padding: 5px 0 154 | } 155 | 156 | .el-table--border .el-table__header-wrapper th { 157 | background-color: #f4f7fd; 158 | color: #4d5965 159 | } 160 | 161 | @import url('./animation.less'); 162 | @import url('./app-view.less'); 163 | -------------------------------------------------------------------------------- /src/assets/logo-img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengdu/vue-element-admin-tpl/8dc21c7fead0604f083b82d4da5bbc677346f3ca/src/assets/logo-img.png -------------------------------------------------------------------------------- /src/assets/logo.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengdu/vue-element-admin-tpl/8dc21c7fead0604f083b82d4da5bbc677346f3ca/src/assets/logo.ai -------------------------------------------------------------------------------- /src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengdu/vue-element-admin-tpl/8dc21c7fead0604f083b82d4da5bbc677346f3ca/src/assets/logo.png -------------------------------------------------------------------------------- /src/assets/logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/user.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengdu/vue-element-admin-tpl/8dc21c7fead0604f083b82d4da5bbc677346f3ca/src/assets/user.jpg -------------------------------------------------------------------------------- /src/components/app-aside.vue: -------------------------------------------------------------------------------- 1 | 21 | 22 | 85 | -------------------------------------------------------------------------------- /src/components/app-header.vue: -------------------------------------------------------------------------------- 1 | 40 | 41 | 77 | -------------------------------------------------------------------------------- /src/components/app-view.vue: -------------------------------------------------------------------------------- 1 | 34 | 35 | 137 | -------------------------------------------------------------------------------- /src/components/dropdown/dropdown.css: -------------------------------------------------------------------------------- 1 | .m-dropdown { 2 | position: relative; 3 | } 4 | .m-dropdown .m-dropdown-panel { 5 | position: absolute; 6 | background-color: #fff; 7 | max-height: 400px; 8 | overflow: auto; 9 | box-shadow: 0 3px 5px rgba(0, 0, 0, 0.06); 10 | cursor: default; 11 | } 12 | .m-dropdown .m-dropdown-panel.is-center { 13 | left: 50%; 14 | transform: translateX(-50%); 15 | } 16 | .m-dropdown .m-dropdown-panel.is-right { 17 | right: 0; 18 | } 19 | .m-dropdown .m-dropdown-panel.is-left { 20 | left: 0; 21 | } 22 | .m-css-dropdown { 23 | position: relative; 24 | } 25 | .m-css-dropdown .m-css-dropdown-panel { 26 | position: absolute; 27 | background-color: #fff; 28 | max-height: 400px; 29 | overflow: auto; 30 | box-shadow: 0 3px 5px rgba(0, 0, 0, 0.06); 31 | display: none; 32 | cursor: default; 33 | } 34 | .m-css-dropdown .m-css-dropdown-panel.is-center { 35 | left: 50%; 36 | transform: translateX(-50%); 37 | } 38 | .m-css-dropdown .m-css-dropdown-panel.is-right { 39 | right: 0; 40 | } 41 | .m-css-dropdown .m-css-dropdown-panel.is-left { 42 | left: 0; 43 | } 44 | .m-css-dropdown:hover .m-css-dropdown-panel { 45 | display: block; 46 | } 47 | .m-dropdown-enter-active { 48 | animation: slide-down-in 0.3s; 49 | } 50 | .m-dropdown-leave-active { 51 | animation: slide-up-out 0.3s; 52 | } 53 | @keyframes slide-down-in { 54 | 0% { 55 | transform: translate3d(0, -20px, 0); 56 | opacity: 0; 57 | } 58 | 100% { 59 | transform: translate3d(0, 0, 0); 60 | opacity: 1; 61 | } 62 | } 63 | @keyframes slide-up-out { 64 | 0% { 65 | transform: translate3d(0, 0, 0); 66 | opacity: 1; 67 | } 68 | 100% { 69 | transform: translate3d(0, -20px, 0); 70 | opacity: 0; 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /src/components/dropdown/dropdown.less: -------------------------------------------------------------------------------- 1 | .m-dropdown { 2 | position: relative; 3 | 4 | .m-dropdown-panel { 5 | position: absolute; 6 | background-color: #fff; 7 | max-height: 400px; 8 | overflow: auto; 9 | box-shadow: 0 3px 5px rgba(0, 0, 0, 0.06); 10 | cursor: default; 11 | 12 | &.is-center { 13 | left: 50%; 14 | transform: translateX(-50%); 15 | } 16 | 17 | &.is-right { 18 | right: 0; 19 | } 20 | 21 | &.is-left { 22 | left: 0; 23 | } 24 | } 25 | } 26 | 27 | .m-css-dropdown { 28 | position: relative; 29 | 30 | .m-css-dropdown-panel { 31 | position: absolute; 32 | background-color: #fff; 33 | max-height: 400px; 34 | overflow: auto; 35 | box-shadow: 0 3px 5px rgba(0, 0, 0, 0.06); 36 | display: none; 37 | cursor: default; 38 | 39 | &.is-center { 40 | left: 50%; 41 | transform: translateX(-50%); 42 | } 43 | 44 | &.is-right { 45 | right: 0; 46 | } 47 | 48 | &.is-left { 49 | left: 0; 50 | } 51 | } 52 | 53 | &:hover { 54 | .m-css-dropdown-panel { 55 | display: block; 56 | } 57 | } 58 | } 59 | 60 | .m-dropdown-enter-active { 61 | animation: slide-down-in .3s; 62 | } 63 | .m-dropdown-leave-active { 64 | animation: slide-up-out .3s; 65 | } 66 | 67 | @keyframes slide-down-in { 68 | 0% { 69 | transform: translate3d(0,-20px,0); 70 | opacity: 0; 71 | } 72 | 100% { 73 | transform: translate3d(0,0,0); 74 | opacity: 1; 75 | } 76 | } 77 | 78 | @keyframes slide-up-out { 79 | 0% { 80 | transform: translate3d(0,0,0); 81 | opacity: 1; 82 | } 83 | 100% { 84 | transform: translate3d(0,-20px,0); 85 | opacity: 0; 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /src/components/dropdown/dropdown.vue: -------------------------------------------------------------------------------- 1 | 25 | 26 | 69 | -------------------------------------------------------------------------------- /src/components/dropdown/index.js: -------------------------------------------------------------------------------- 1 | import Dropdown from './dropdown' 2 | import './dropdown.less' 3 | 4 | export default Dropdown 5 | -------------------------------------------------------------------------------- /src/components/layout/README.md: -------------------------------------------------------------------------------- 1 | ## Layout 2 | 3 | 布局组件 4 | 5 | ```html 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 |
15 |
    16 |
  • 17 |
  • 18 |
  • 19 |
  • 20 |
  • 21 |
  • 22 |
  • 23 |
  • 24 |
25 |
26 | 27 | header 28 | 29 | footer 30 | 31 |
32 | ``` 33 | 34 | ### Container 35 | 36 | 容器 37 | 38 | | 参数 | 说明 | 类型 | 可选值 | 默认值 | 39 | |---------- |-------- |---------- |------------- |-------- | 40 | | direction | 排列方向 | string | vertical/horizontal | vertical | 41 | 42 | ### Sider 43 | 44 | 侧边栏 45 | 46 | | 参数 | 说明 | 类型 | 可选值 | 默认值 | 47 | |---------- |-------- |---------- |------------- |-------- | 48 | | width | 宽度 | string | — | — | 49 | | background | 背景颜色 | string | — | — | 50 | | color | 字体颜色 | string | — | — | 51 | 52 | ### Header 53 | 54 | 头部 55 | 56 | 参数 | 说明 | 类型 | 可选值 | 默认值 | 57 | |---------- |-------- |---------- |------------- |-------- | 58 | | height | 高度 | string | — | — | 59 | | background | 背景颜色 | string | — | — | 60 | | color | 字体颜色 | string | — | — | 61 | 62 | ### Footer 63 | 64 | 尾部 65 | 66 | 参数 | 说明 | 类型 | 可选值 | 默认值 | 67 | |---------- |-------- |---------- |------------- |-------- | 68 | | height | 高度 | string | — | — | 69 | | background | 背景颜色 | string | — | — | 70 | | color | 字体颜色 | string | — | — | 71 | 72 | ### Main 73 | 74 | 主体 75 | -------------------------------------------------------------------------------- /src/components/layout/container.vue: -------------------------------------------------------------------------------- 1 | 11 | 19 | -------------------------------------------------------------------------------- /src/components/layout/footer.vue: -------------------------------------------------------------------------------- 1 | 12 | 29 | -------------------------------------------------------------------------------- /src/components/layout/header.vue: -------------------------------------------------------------------------------- 1 | 12 | 29 | -------------------------------------------------------------------------------- /src/components/layout/index.js: -------------------------------------------------------------------------------- 1 | import Container from './container' 2 | import Main from './main' 3 | import Header from './header' 4 | import Footer from './footer' 5 | import Sider from './sider' 6 | import './layout.less' 7 | 8 | Container.install = function (Vue, options = {}) { 9 | Vue.component(options.containerName || Container.name, Container) 10 | Vue.component(options.mainName || Main.name, Main) 11 | Vue.component(options.headerName || Header.name, Header) 12 | Vue.component(options.footerName || Footer.name, Footer) 13 | Vue.component(options.silderName || Sider.name, Sider) 14 | } 15 | 16 | export const MContainer = Container 17 | export const MMain = Main 18 | export const MHeader = Header 19 | export const MFooter = Footer 20 | export const MSider = Sider 21 | 22 | export default Container 23 | -------------------------------------------------------------------------------- /src/components/layout/layout.css: -------------------------------------------------------------------------------- 1 | .m-layout { 2 | display: flex; 3 | flex-direction: column; 4 | flex: auto; 5 | min-height: 0; 6 | box-sizing: border-box; 7 | } 8 | .m-layout.is-horizontal { 9 | flex-direction: row; 10 | } 11 | .m-layout .m-layout-sider { 12 | flex-direction: row; 13 | box-sizing: border-box; 14 | } 15 | .m-layout .m-layout-header { 16 | height: 50px; 17 | box-sizing: border-box; 18 | } 19 | .m-layout .m-layout-content { 20 | flex: 1; 21 | min-height: 0; 22 | box-sizing: border-box; 23 | overflow: auto; 24 | } 25 | .m-layout .m-layout-footer { 26 | height: 50px; 27 | box-sizing: border-box; 28 | } 29 | -------------------------------------------------------------------------------- /src/components/layout/layout.less: -------------------------------------------------------------------------------- 1 | .m-layout { 2 | display: flex; 3 | flex-direction: column; 4 | flex: auto; 5 | min-height: 0; 6 | box-sizing: border-box; 7 | 8 | // &.is-vertical {} 9 | &.is-horizontal { 10 | flex-direction: row; 11 | } 12 | 13 | .m-layout-sider { 14 | flex-direction: row; 15 | box-sizing: border-box; 16 | } 17 | .m-layout-header { 18 | height: 50px; 19 | box-sizing: border-box; 20 | } 21 | 22 | .m-layout-content { 23 | flex: 1; 24 | min-height: 0; 25 | box-sizing: border-box; 26 | overflow: auto; 27 | } 28 | 29 | .m-layout-footer { 30 | height: 50px; 31 | box-sizing: border-box; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/components/layout/main.vue: -------------------------------------------------------------------------------- 1 | 6 | 12 | -------------------------------------------------------------------------------- /src/components/layout/sider.vue: -------------------------------------------------------------------------------- 1 | 12 | 29 | -------------------------------------------------------------------------------- /src/components/main-view.vue: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Nprogress from 'nprogress' 3 | import App from './App.vue' 4 | import router from './router' 5 | import store from './store' 6 | import Message from 'vue-m-message' 7 | import MDialog from 'vue-m-dialog/dist' 8 | import ElementUI from 'element-ui' 9 | import { isProd } from './utils' 10 | import http from './utils/http' 11 | 12 | import 'normalize.css' 13 | import 'font-awesome/css/font-awesome.min.css' 14 | import 'nprogress/nprogress.css' 15 | import 'vue-m-dialog/dist/css/default.css' 16 | import 'element-ui/lib/theme-chalk/index.css' 17 | import '@dove-ui/menu/dist/index.css' 18 | import './assets/css/main.less' 19 | 20 | Vue.use(Message, { name: 'msg' }) // mount `Vue.prototype.$msg` 21 | Vue.use(MDialog, { 22 | dialogName: 'm-dialog', 23 | alertName: 'malert', 24 | confirmName: 'mconfirm' 25 | }) 26 | Vue.use(ElementUI) 27 | Vue.config.productionTip = false 28 | 29 | // http config 30 | http.defaults.baseURL = '/' 31 | 32 | // // requeset before 33 | // http.interceptors.request.use(function (config) { 34 | // return config 35 | // }) 36 | 37 | // requeset after 38 | http.interceptors.response.use(function (res) { 39 | console.log(res) 40 | // const NO_LOGIN_CODE = 100 41 | // const noLogin = res.data.code === NO_LOGIN_CODE 42 | // const noLogin = true 43 | // if (noLogin) { 44 | // app.$router.push({ name: 'login', params: { reload: 1 } }) 45 | // return res 46 | // } 47 | return res 48 | }, function (err) { 49 | // Any status codes that falls outside the range of 2xx cause this function to trigger 50 | // Do something with response error 51 | return Promise.reject(err) 52 | }) 53 | 54 | router.beforeEach(async (to, from, next) => { 55 | // console.log(from.path, to.path) 56 | Nprogress.start() 57 | 58 | const whiteList = ['login', 'logout', 'home'] 59 | 60 | if (whiteList.indexOf(to.name) > -1) return next() 61 | 62 | const loginUser = store.state.user.loginUser 63 | 64 | if (!loginUser) { 65 | // 获取登录会话 66 | const loginUser = await store.dispatch('user/getLoginInfo') 67 | 68 | Nprogress.inc(0.5) 69 | 70 | if (!loginUser) { 71 | // 访客路由 72 | if (to.meta.isGuest) return next() 73 | return next({ name: 'login' }) 74 | } 75 | } 76 | 77 | next() 78 | }) 79 | 80 | router.afterEach(transition => { 81 | setTimeout(() => { 82 | Nprogress.done() 83 | }, 100) 84 | }) 85 | 86 | Vue.prototype.$http = http 87 | 88 | const app = new Vue({ 89 | router, 90 | store, 91 | render: h => h(App) 92 | }).$mount('#app') 93 | 94 | if (!isProd()) { 95 | window.app = app 96 | } 97 | 98 | if (!isProd()) { 99 | window.app = app 100 | } 101 | 102 | export default app 103 | -------------------------------------------------------------------------------- /src/router.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Router from 'vue-router' 3 | import Home from './views/home' 4 | import Login from './views/login' 5 | import Logout from './views/logout' 6 | import AppView from './components/app-view' 7 | import Dashboard from './views/admin/dashboard' 8 | import Pgae1 from './views/admin/page1' 9 | import Pgae2 from './views/admin/page2' 10 | import Pgae3 from './views/admin/page3' 11 | 12 | Vue.use(Router) 13 | 14 | const router = new Router({ 15 | mode: 'history', // hash, history 16 | routes: [ 17 | { path: '/', name: 'home', component: Home }, 18 | { path: '/login', name: 'login', component: Login }, 19 | { path: '/logout', name: 'logout', component: Logout }, 20 | { 21 | path: '/admin', 22 | component: AppView, 23 | children: [ 24 | { path: '', component: Dashboard }, 25 | { path: '/page1', component: Pgae1 }, 26 | { path: '/page2', component: Pgae2 }, 27 | { path: '/page3', component: Pgae3 } 28 | ] 29 | } 30 | ] 31 | }) 32 | 33 | export default router 34 | -------------------------------------------------------------------------------- /src/store/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Vuex from 'vuex' 3 | import modules from './modules' 4 | import { SET_WATERMARK } from './types' 5 | import { isProd, isTest } from '../utils' 6 | 7 | Vue.use(Vuex) 8 | 9 | const state = { 10 | env: isProd() 11 | ? 'prd' 12 | : isTest() ? 'test' : 'dev', 13 | watermark: null 14 | } 15 | 16 | console.log(process.env) 17 | 18 | const mutations = { 19 | [SET_WATERMARK] (state, img) { 20 | state.watermark = img 21 | } 22 | } 23 | 24 | const actions = { 25 | setWatermark ({ commit }, img) { 26 | commit(SET_WATERMARK, img) 27 | } 28 | } 29 | 30 | const store = new Vuex.Store({ 31 | strict: true, 32 | state, 33 | actions, 34 | mutations, 35 | modules 36 | }) 37 | 38 | export default store 39 | -------------------------------------------------------------------------------- /src/store/modules/index.js: -------------------------------------------------------------------------------- 1 | import user from './user' 2 | 3 | export default { 4 | user 5 | } 6 | -------------------------------------------------------------------------------- /src/store/modules/user.js: -------------------------------------------------------------------------------- 1 | import dayjs from 'dayjs' 2 | import { login } from '../../api/user' 3 | import { SET_LOGIN } from '../types' 4 | import watermark from '../../utils/watermark' 5 | 6 | const state = { 7 | loginUser: null 8 | } 9 | 10 | const mutations = { 11 | [SET_LOGIN] (state, user) { 12 | state.loginUser = user 13 | } 14 | } 15 | 16 | const actions = { 17 | async login ({ commit }, payload) { 18 | const res = await login(payload.username, payload.password) 19 | 20 | // save to store 21 | localStorage.setItem('user', JSON.stringify(res.data)) 22 | return res 23 | }, 24 | 25 | async getLoginInfo ({ commit, dispatch }) { 26 | // get user from backend 27 | // const user = await getLoginInfo() 28 | // get user from store 29 | const user = JSON.parse(localStorage.getItem('user') || 'null') 30 | commit(SET_LOGIN, user) 31 | 32 | if (user) { 33 | watermark(user.username, { 34 | time: dayjs().format('YYYY-MM-DD HH:mm:ss') 35 | }).then(res => { 36 | dispatch('setWatermark', res, { root: true }) 37 | }) 38 | } 39 | 40 | return user 41 | } 42 | } 43 | 44 | export default { 45 | namespaced: true, 46 | state, 47 | mutations, 48 | actions 49 | } 50 | -------------------------------------------------------------------------------- /src/store/types.js: -------------------------------------------------------------------------------- 1 | // types 定义所有操作类型 2 | 3 | // common 4 | export const SET_WATERMARK = 'SET_WATERMARK' 5 | 6 | // user 7 | export const SET_LOGIN = 'SET_LOGIN' 8 | -------------------------------------------------------------------------------- /src/utils/http.js: -------------------------------------------------------------------------------- 1 | import Axios from 'axios' 2 | 3 | const instance = Axios.create() 4 | 5 | export default instance 6 | -------------------------------------------------------------------------------- /src/utils/index.js: -------------------------------------------------------------------------------- 1 | 2 | // 判断是否 build 之后环境 3 | export const isProd = () => process.env.NODE_ENV === 'production' 4 | 5 | // 判断是否 build 之后环境 6 | export const isTest = () => process.env.NODE_ENV === 'test' 7 | 8 | // 进入全屏 9 | export function requestFullScreen () { 10 | var elem = document.documentElement 11 | if (elem.requestFullscreen) { 12 | elem.requestFullscreen() 13 | } else if (elem.mozRequestFullScreen) { 14 | elem.mozRequestFullScreen() 15 | } else if (elem.webkitRequestFullScreen) { 16 | elem.webkitRequestFullScreen() 17 | } else if (elem.msRequestFullscreen) { 18 | // elem.msRequestFullscreen() 没有指定元素 19 | document.body.msRequestFullscreen() 20 | } 21 | } 22 | // 退出全屏 23 | export function exitFullscreen () { 24 | var doc = document 25 | if (doc.exitFullscreen) { 26 | doc.exitFullscreen() 27 | } else if (doc.mozCancelFullScreen) { 28 | doc.mozCancelFullScreen() 29 | } else if (doc.webkitCancelFullScreen) { 30 | doc.webkitCancelFullScreen() 31 | } else if (doc.msExitFullscreen) { 32 | document.msExitFullscreen() 33 | } 34 | } 35 | 36 | export const sleep = (time) => { 37 | return new Promise((resolve) => { 38 | setTimeout(resolve, time) 39 | }) 40 | } 41 | -------------------------------------------------------------------------------- /src/utils/watermark.js: -------------------------------------------------------------------------------- 1 | export default function Watermark (name, opts = {}) { 2 | return new Promise(function (resolve, reject) { 3 | const options = { 4 | color: '#3E3E50', 5 | env: 'development', 6 | time: new Date(), 7 | output: '', 8 | width: 200, 9 | height: 200, 10 | ...opts 11 | } 12 | 13 | const svg = ` 19 | 20 | ${name} 21 | ${options.env} 22 | ${options.time} 23 | 24 | ` 25 | 26 | if (options.output === 'svg') { 27 | resolve(svg) 28 | return false 29 | } 30 | 31 | const img = new Image() 32 | img.width = options.width 33 | img.height = options.height 34 | 35 | img.onload = function () { 36 | if (options.output === 'img') { 37 | resolve(img) 38 | return false 39 | } 40 | 41 | const canvas = document.createElement('canvas') 42 | canvas.width = options.width 43 | canvas.height = options.height 44 | let ctx = null 45 | 46 | try { 47 | ctx = canvas.getContext('2d') 48 | } catch (err) { 49 | reject(err.message) 50 | return false 51 | } 52 | 53 | ctx.drawImage(img, 0, 0) 54 | 55 | resolve(canvas.toDataURL('image/png')) 56 | } 57 | 58 | img.onerror = function (err) { 59 | reject(err) 60 | } 61 | 62 | const url = URL.createObjectURL(new Blob([svg], { type: 'image/svg+xml;charset=utf-8' })) 63 | 64 | // 不转图片svg做背景会存在一些兼容性 65 | img.src = url 66 | }) 67 | } 68 | -------------------------------------------------------------------------------- /src/views/admin/dashboard.vue: -------------------------------------------------------------------------------- 1 | 18 | -------------------------------------------------------------------------------- /src/views/admin/page1.vue: -------------------------------------------------------------------------------- 1 | 27 | 44 | -------------------------------------------------------------------------------- /src/views/admin/page2.vue: -------------------------------------------------------------------------------- 1 | 10 | -------------------------------------------------------------------------------- /src/views/admin/page3.vue: -------------------------------------------------------------------------------- 1 | 13 | -------------------------------------------------------------------------------- /src/views/home.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 79 | -------------------------------------------------------------------------------- /src/views/login.vue: -------------------------------------------------------------------------------- 1 | 30 | 66 | 154 | -------------------------------------------------------------------------------- /src/views/logout.vue: -------------------------------------------------------------------------------- 1 | 6 | 14 | -------------------------------------------------------------------------------- /vue.config.js: -------------------------------------------------------------------------------- 1 | // const isProd = process.env.NODE_ENV === 'production' 2 | 3 | module.exports = { 4 | // publicPath: '/dist/', 5 | pages: { 6 | index: { 7 | // page 的入口 8 | entry: 'src/main.js', 9 | // 模板来源 10 | template: 'public/index.html', 11 | // 在 dist/index.html 的输出 12 | filename: 'index.html', 13 | // 当使用 title 选项时, 14 | // template 中的 title 标签需要是 <%= htmlWebpackPlugin.options.title %> 15 | title: 'Vue Component', 16 | // 在这个页面中包含的块,默认情况下会包含 17 | // 提取出来的通用 chunk 和 vendor chunk。 18 | chunks: ['chunk-vendors', 'chunk-common', 'index'] 19 | } 20 | // 当使用只有入口的字符串格式时, 21 | // 模板会被推导为 `public/subpage.html` 22 | // 并且如果找不到的话,就回退到 `public/index.html`。 23 | // 输出文件名会被推导为 `subpage.html`。 24 | // subpage: 'src/subpage/main.js' 25 | }, 26 | devServer: { 27 | proxy: { 28 | '/api': { 29 | target: 'https://api.github.com', 30 | pathRewrite: { 31 | '^/api': '' 32 | }, 33 | changeOrigin: true 34 | } 35 | } 36 | } 37 | } 38 | --------------------------------------------------------------------------------