├── .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 |

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 | 
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 |
2 |
10 |
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 |
2 |
3 |
4 |
5 |
6 |
Admin Platform
7 |
8 |
19 |
20 |
21 |
22 |
85 |
--------------------------------------------------------------------------------
/src/components/app-header.vue:
--------------------------------------------------------------------------------
1 |
2 |
39 |
40 |
41 |
77 |
--------------------------------------------------------------------------------
/src/components/app-view.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
13 |
14 |
15 |
18 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
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 |
2 |
6 |
7 |
8 |
20 |
21 |
22 |
23 |
24 |
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 |
2 |
8 |
9 |
10 |
11 |
19 |
--------------------------------------------------------------------------------
/src/components/layout/footer.vue:
--------------------------------------------------------------------------------
1 |
2 |
11 |
12 |
29 |
--------------------------------------------------------------------------------
/src/components/layout/header.vue:
--------------------------------------------------------------------------------
1 |
2 |
11 |
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 |
2 |
3 |
4 |
5 |
6 |
12 |
--------------------------------------------------------------------------------
/src/components/layout/sider.vue:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
11 |
12 |
29 |
--------------------------------------------------------------------------------
/src/components/main-view.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
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 = ``
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 |
2 |
3 |
4 | Home
5 | Overview
6 |
7 |
8 |
dashboard
9 |
Header1
10 |
Header2
11 |
Header3
12 |
Header4
13 |
Header5
14 |
Header6
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/src/views/admin/page1.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Home
5 | Page1
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
24 |
25 |
26 |
27 |
44 |
--------------------------------------------------------------------------------
/src/views/admin/page2.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Home
5 | Page2
6 |
7 |
Page2
8 |
9 |
10 |
--------------------------------------------------------------------------------
/src/views/admin/page3.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Home
5 | Page3
6 |
7 |
8 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/src/views/home.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
7 |
Admin Platform
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
79 |
--------------------------------------------------------------------------------
/src/views/login.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
10 |
Hi, Welcome here !
11 |
21 |
22 |
23 |
24 |
26 |
27 |
28 |
29 |
30 |
66 |
154 |
--------------------------------------------------------------------------------
/src/views/logout.vue:
--------------------------------------------------------------------------------
1 |
2 |
5 |
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 |
--------------------------------------------------------------------------------