├── src ├── assets │ ├── css │ │ ├── theme-chalk │ │ │ ├── submenu.css │ │ │ ├── button-group.css │ │ │ ├── form-item.css │ │ │ ├── menu-item.css │ │ │ ├── tab-pane.css │ │ │ ├── breadcrumb-item.css │ │ │ ├── checkbox-button.css │ │ │ ├── checkbox-group.css │ │ │ ├── collapse-item.css │ │ │ ├── dropdown-item.css │ │ │ ├── dropdown-menu.css │ │ │ ├── menu-item-group.css │ │ │ ├── radio-group.css │ │ │ ├── aside.css │ │ │ ├── footer.css │ │ │ ├── header.css │ │ │ ├── fonts │ │ │ │ ├── element-icons.ttf │ │ │ │ └── element-icons.woff │ │ │ ├── main.css │ │ │ ├── steps.css │ │ │ ├── container.css │ │ │ ├── card.css │ │ │ ├── option-group.css │ │ │ ├── option.css │ │ │ ├── rate.css │ │ │ ├── reset.css │ │ │ ├── badge.css │ │ │ ├── row.css │ │ │ ├── spinner.css │ │ │ ├── display.css │ │ │ ├── breadcrumb.css │ │ │ ├── scrollbar.css │ │ │ ├── carousel-item.css │ │ │ ├── alert.css │ │ │ ├── popper.css │ │ │ ├── notification.css │ │ │ ├── loading.css │ │ │ ├── switch.css │ │ │ ├── progress.css │ │ │ ├── message.css │ │ │ ├── tag.css │ │ │ ├── carousel.css │ │ │ ├── popover.css │ │ │ └── radio-button.css │ │ ├── index.styl │ │ └── global.styl │ ├── img │ │ ├── 404.gif │ │ ├── echo.jpg │ │ ├── logo.png │ │ ├── health.gif │ │ ├── people.png │ │ ├── toutiao.jpg │ │ └── uncleLian.jpg │ ├── iconfont │ │ ├── iconfont.eot │ │ ├── iconfont.ttf │ │ ├── iconfont.woff │ │ └── iconfont.woff2 │ ├── index.js │ └── icons │ │ ├── index.js │ │ └── svg │ │ ├── issue.svg │ │ ├── guide.svg │ │ ├── chart.svg │ │ ├── component.svg │ │ ├── documentation.svg │ │ ├── lock.svg │ │ ├── fullscreen.svg │ │ ├── user.svg │ │ ├── view.svg │ │ ├── markdown.svg │ │ ├── github.svg │ │ ├── backtop.svg │ │ ├── flex-left.svg │ │ ├── thumbtack.svg │ │ ├── users.svg │ │ ├── clipboard.svg │ │ ├── number.svg │ │ ├── excel.svg │ │ ├── editor.svg │ │ ├── flex-right.svg │ │ ├── link.svg │ │ ├── move.svg │ │ ├── spinner.svg │ │ ├── message.svg │ │ ├── qq.svg │ │ ├── progressbar.svg │ │ ├── global.svg │ │ └── icons.svg ├── api │ ├── list.js │ └── login.js ├── directive │ ├── dragDialog │ │ └── index.js │ ├── index.js │ └── permission │ │ ├── index.js │ │ └── permission.js ├── utils │ ├── validate.js │ ├── i18n.js │ ├── errorLog.js │ ├── Export2Zip.js │ ├── singleMessage.js │ ├── cache.js │ ├── permission.js │ └── request.js ├── components │ ├── index.js │ ├── Base │ │ ├── Cola │ │ │ └── index.vue │ │ ├── SvgIcon │ │ │ └── index.vue │ │ ├── Breadcrumb │ │ │ └── index.vue │ │ └── ErrorLog │ │ │ └── index.vue │ ├── Loading │ │ └── index.vue │ └── GithubCorner │ │ └── index.vue ├── pages │ ├── index │ │ ├── children │ │ │ ├── icons │ │ │ │ ├── requireIcons.js │ │ │ │ └── icons.vue │ │ │ ├── errorLog │ │ │ │ └── errorLog.vue │ │ │ ├── guide │ │ │ │ ├── steps.js │ │ │ │ └── guide.vue │ │ │ ├── components-demo │ │ │ │ ├── singleMessage.vue │ │ │ │ ├── backTop.vue │ │ │ │ ├── dragDialog.vue │ │ │ │ ├── progressbar.vue │ │ │ │ ├── editor.vue │ │ │ │ ├── sticky.vue │ │ │ │ └── loading.vue │ │ │ ├── dashboard │ │ │ │ ├── index.vue │ │ │ │ └── components │ │ │ │ │ └── banner.vue │ │ │ ├── i18n-demo │ │ │ │ └── local.js │ │ │ ├── excel │ │ │ │ └── importExcel.vue │ │ │ └── permission │ │ │ │ └── permission.vue │ │ └── index.vue │ └── other │ │ ├── redirect.vue │ │ └── page404.vue ├── layout │ ├── Sidebar │ │ ├── sideLink.vue │ │ ├── sideValue.vue │ │ └── sideItem.vue │ ├── PageView │ │ └── index.vue │ ├── NavBar │ │ ├── LanguageSelect │ │ │ └── index.vue │ │ ├── Screenfull │ │ │ └── index.vue │ │ ├── UserSelect │ │ │ └── infoDialog.vue │ │ └── index.vue │ └── TagsView │ │ └── scrollPane.vue ├── language │ └── index.js ├── App.vue ├── main.js ├── filters │ └── index.js └── store │ ├── index.js │ └── modules │ └── login.js ├── public ├── favicon.ico ├── static │ └── tinymce │ │ ├── skins │ │ ├── ui │ │ │ └── oxide │ │ │ │ ├── fonts │ │ │ │ └── tinymce-mobile.woff │ │ │ │ └── content.mobile.min.css │ │ └── content │ │ │ ├── default │ │ │ ├── content.min.css │ │ │ └── content.css │ │ │ ├── writer │ │ │ ├── content.min.css │ │ │ └── content.css │ │ │ └── document │ │ │ ├── content.min.css │ │ │ └── content.css │ │ ├── plugins │ │ ├── hr │ │ │ ├── index.js │ │ │ ├── plugin.min.js │ │ │ └── plugin.js │ │ ├── code │ │ │ ├── index.js │ │ │ └── plugin.min.js │ │ ├── help │ │ │ └── index.js │ │ ├── link │ │ │ └── index.js │ │ ├── save │ │ │ ├── index.js │ │ │ └── plugin.min.js │ │ ├── toc │ │ │ └── index.js │ │ ├── image │ │ │ └── index.js │ │ ├── lists │ │ │ └── index.js │ │ ├── media │ │ │ └── index.js │ │ ├── paste │ │ │ └── index.js │ │ ├── print │ │ │ ├── index.js │ │ │ ├── plugin.min.js │ │ │ └── plugin.js │ │ ├── table │ │ │ └── index.js │ │ ├── anchor │ │ │ ├── index.js │ │ │ └── plugin.min.js │ │ ├── bbcode │ │ │ └── index.js │ │ ├── advlist │ │ │ └── index.js │ │ ├── charmap │ │ │ └── index.js │ │ ├── preview │ │ │ ├── index.js │ │ │ └── plugin.min.js │ │ ├── autolink │ │ │ ├── index.js │ │ │ └── plugin.min.js │ │ ├── autosave │ │ │ └── index.js │ │ ├── emoticons │ │ │ └── index.js │ │ ├── fullpage │ │ │ └── index.js │ │ ├── importcss │ │ │ └── index.js │ │ ├── pagebreak │ │ │ ├── index.js │ │ │ └── plugin.min.js │ │ ├── quickbars │ │ │ └── index.js │ │ ├── tabfocus │ │ │ ├── index.js │ │ │ └── plugin.min.js │ │ ├── template │ │ │ └── index.js │ │ ├── textcolor │ │ │ ├── index.js │ │ │ ├── plugin.min.js │ │ │ └── plugin.js │ │ ├── wordcount │ │ │ └── index.js │ │ ├── autoresize │ │ │ ├── index.js │ │ │ └── plugin.min.js │ │ ├── codesample │ │ │ └── index.js │ │ ├── fullscreen │ │ │ └── index.js │ │ ├── imagetools │ │ │ └── index.js │ │ ├── colorpicker │ │ │ ├── index.js │ │ │ ├── plugin.min.js │ │ │ └── plugin.js │ │ ├── contextmenu │ │ │ ├── index.js │ │ │ ├── plugin.min.js │ │ │ └── plugin.js │ │ ├── nonbreaking │ │ │ ├── index.js │ │ │ └── plugin.min.js │ │ ├── noneditable │ │ │ ├── index.js │ │ │ └── plugin.min.js │ │ ├── textpattern │ │ │ └── index.js │ │ ├── visualchars │ │ │ └── index.js │ │ ├── legacyoutput │ │ │ └── index.js │ │ ├── spellchecker │ │ │ └── index.js │ │ ├── visualblocks │ │ │ ├── index.js │ │ │ └── plugin.min.js │ │ ├── directionality │ │ │ ├── index.js │ │ │ └── plugin.min.js │ │ ├── insertdatetime │ │ │ └── index.js │ │ └── searchreplace │ │ │ └── index.js │ │ └── themes │ │ ├── mobile │ │ └── index.js │ │ └── silver │ │ └── index.js └── index.html ├── .env.development ├── .env.production ├── .env.stage ├── .gitignore ├── babel.config.js └── LICENSE /src/assets/css/theme-chalk/submenu.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/css/theme-chalk/button-group.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/css/theme-chalk/form-item.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/css/theme-chalk/menu-item.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/css/theme-chalk/tab-pane.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/css/theme-chalk/breadcrumb-item.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/css/theme-chalk/checkbox-button.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/css/theme-chalk/checkbox-group.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/css/theme-chalk/collapse-item.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/css/theme-chalk/dropdown-item.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/css/theme-chalk/dropdown-menu.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/css/theme-chalk/menu-item-group.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uncleLian/vue-blog/HEAD/public/favicon.ico -------------------------------------------------------------------------------- /.env.development: -------------------------------------------------------------------------------- 1 | VUE_APP_ENV_CONFIG = 'dev' 2 | VUE_APP_BASE_API = 'http://www.exapmple.com/dev' -------------------------------------------------------------------------------- /.env.production: -------------------------------------------------------------------------------- 1 | VUE_APP_ENV_CONFIG = 'prod' 2 | VUE_APP_BASE_API = 'http://www.exapmple.com/prod' -------------------------------------------------------------------------------- /src/assets/img/404.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uncleLian/vue-blog/HEAD/src/assets/img/404.gif -------------------------------------------------------------------------------- /src/assets/img/echo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uncleLian/vue-blog/HEAD/src/assets/img/echo.jpg -------------------------------------------------------------------------------- /src/assets/img/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uncleLian/vue-blog/HEAD/src/assets/img/logo.png -------------------------------------------------------------------------------- /src/assets/img/health.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uncleLian/vue-blog/HEAD/src/assets/img/health.gif -------------------------------------------------------------------------------- /src/assets/img/people.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uncleLian/vue-blog/HEAD/src/assets/img/people.png -------------------------------------------------------------------------------- /src/assets/img/toutiao.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uncleLian/vue-blog/HEAD/src/assets/img/toutiao.jpg -------------------------------------------------------------------------------- /src/assets/img/uncleLian.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uncleLian/vue-blog/HEAD/src/assets/img/uncleLian.jpg -------------------------------------------------------------------------------- /src/assets/iconfont/iconfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uncleLian/vue-blog/HEAD/src/assets/iconfont/iconfont.eot -------------------------------------------------------------------------------- /src/assets/iconfont/iconfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uncleLian/vue-blog/HEAD/src/assets/iconfont/iconfont.ttf -------------------------------------------------------------------------------- /.env.stage: -------------------------------------------------------------------------------- 1 | NODE_ENV = production 2 | VUE_APP_ENV_CONFIG = 'stage' 3 | VUE_APP_BASE_API = 'http://www.exapmple.com/stage' -------------------------------------------------------------------------------- /src/assets/iconfont/iconfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uncleLian/vue-blog/HEAD/src/assets/iconfont/iconfont.woff -------------------------------------------------------------------------------- /src/assets/iconfont/iconfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uncleLian/vue-blog/HEAD/src/assets/iconfont/iconfont.woff2 -------------------------------------------------------------------------------- /src/assets/css/theme-chalk/radio-group.css: -------------------------------------------------------------------------------- 1 | .el-radio-group{display:inline-block;line-height:1;vertical-align:middle;font-size:0} -------------------------------------------------------------------------------- /src/assets/css/theme-chalk/aside.css: -------------------------------------------------------------------------------- 1 | .el-aside{overflow:auto;-webkit-box-sizing:border-box;box-sizing:border-box;-ms-flex-negative:0;flex-shrink:0} -------------------------------------------------------------------------------- /src/assets/css/theme-chalk/footer.css: -------------------------------------------------------------------------------- 1 | .el-footer{padding:0 20px;-webkit-box-sizing:border-box;box-sizing:border-box;-ms-flex-negative:0;flex-shrink:0} -------------------------------------------------------------------------------- /src/assets/css/theme-chalk/header.css: -------------------------------------------------------------------------------- 1 | .el-header{padding:0 20px;-webkit-box-sizing:border-box;box-sizing:border-box;-ms-flex-negative:0;flex-shrink:0} -------------------------------------------------------------------------------- /src/assets/css/theme-chalk/fonts/element-icons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uncleLian/vue-blog/HEAD/src/assets/css/theme-chalk/fonts/element-icons.ttf -------------------------------------------------------------------------------- /src/assets/css/theme-chalk/fonts/element-icons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uncleLian/vue-blog/HEAD/src/assets/css/theme-chalk/fonts/element-icons.woff -------------------------------------------------------------------------------- /public/static/tinymce/skins/ui/oxide/fonts/tinymce-mobile.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uncleLian/vue-blog/HEAD/public/static/tinymce/skins/ui/oxide/fonts/tinymce-mobile.woff -------------------------------------------------------------------------------- /src/api/list.js: -------------------------------------------------------------------------------- 1 | import { request } from '@/utils/request' 2 | 3 | // 列表 4 | export function getList() { 5 | let res = request('/api/list', 'GET') 6 | return res 7 | } 8 | -------------------------------------------------------------------------------- /src/directive/dragDialog/index.js: -------------------------------------------------------------------------------- 1 | import drag from './drag' 2 | 3 | drag.install = function (Vue) { 4 | // 注册全局指令 5 | Vue.directive('drag', drag) 6 | } 7 | // 供局部注册指令使用 8 | export default drag 9 | -------------------------------------------------------------------------------- /src/utils/validate.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @param {String} path 3 | * @returns {Boolean} 4 | */ 5 | // 是否外链 6 | export function isExternal(path) { 7 | return /^(https?:|mailto:|tel:)/.test(path) 8 | } 9 | -------------------------------------------------------------------------------- /src/utils/i18n.js: -------------------------------------------------------------------------------- 1 | export function translationRouteTitle(title) { 2 | let res = title 3 | if (this.$te('route.' + title)) { 4 | res = this.$t('route.' + title) 5 | } 6 | return res 7 | } 8 | -------------------------------------------------------------------------------- /src/assets/css/theme-chalk/main.css: -------------------------------------------------------------------------------- 1 | .el-main{display:block;-webkit-box-flex:1;-ms-flex:1;flex:1;-ms-flex-preferred-size:auto;flex-basis:auto;overflow:auto;-webkit-box-sizing:border-box;box-sizing:border-box;padding:20px} -------------------------------------------------------------------------------- /public/static/tinymce/plugins/hr/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "hr" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/hr') 5 | // ES2015: 6 | // import 'tinymce/plugins/hr' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /src/assets/index.js: -------------------------------------------------------------------------------- 1 | import 'normalize.css' // 重置样式 2 | import '@/assets/css/theme-chalk/index.css' // 自定义主题颜色 3 | import '@/assets/iconfont/iconfont.css' // iconfont 4 | import '@/assets/icons' // svg icon 5 | import '@/assets/css/global.styl' // 全局样式 6 | -------------------------------------------------------------------------------- /public/static/tinymce/plugins/code/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "code" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/code') 5 | // ES2015: 6 | // import 'tinymce/plugins/code' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /public/static/tinymce/plugins/help/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "help" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/help') 5 | // ES2015: 6 | // import 'tinymce/plugins/help' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /public/static/tinymce/plugins/link/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "link" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/link') 5 | // ES2015: 6 | // import 'tinymce/plugins/link' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /public/static/tinymce/plugins/save/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "save" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/save') 5 | // ES2015: 6 | // import 'tinymce/plugins/save' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /public/static/tinymce/plugins/toc/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "toc" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/toc') 5 | // ES2015: 6 | // import 'tinymce/plugins/toc' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /public/static/tinymce/plugins/image/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "image" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/image') 5 | // ES2015: 6 | // import 'tinymce/plugins/image' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /public/static/tinymce/plugins/lists/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "lists" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/lists') 5 | // ES2015: 6 | // import 'tinymce/plugins/lists' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /public/static/tinymce/plugins/media/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "media" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/media') 5 | // ES2015: 6 | // import 'tinymce/plugins/media' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /public/static/tinymce/plugins/paste/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "paste" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/paste') 5 | // ES2015: 6 | // import 'tinymce/plugins/paste' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /public/static/tinymce/plugins/print/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "print" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/print') 5 | // ES2015: 6 | // import 'tinymce/plugins/print' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /public/static/tinymce/plugins/table/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "table" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/table') 5 | // ES2015: 6 | // import 'tinymce/plugins/table' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /public/static/tinymce/themes/mobile/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "mobile" theme for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/themes/mobile') 5 | // ES2015: 6 | // import 'tinymce/themes/mobile' 7 | require('./theme.js'); -------------------------------------------------------------------------------- /public/static/tinymce/themes/silver/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "silver" theme for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/themes/silver') 5 | // ES2015: 6 | // import 'tinymce/themes/silver' 7 | require('./theme.js'); -------------------------------------------------------------------------------- /public/static/tinymce/plugins/anchor/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "anchor" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/anchor') 5 | // ES2015: 6 | // import 'tinymce/plugins/anchor' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /public/static/tinymce/plugins/bbcode/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "bbcode" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/bbcode') 5 | // ES2015: 6 | // import 'tinymce/plugins/bbcode' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /public/static/tinymce/plugins/advlist/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "advlist" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/advlist') 5 | // ES2015: 6 | // import 'tinymce/plugins/advlist' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /public/static/tinymce/plugins/charmap/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "charmap" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/charmap') 5 | // ES2015: 6 | // import 'tinymce/plugins/charmap' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /public/static/tinymce/plugins/preview/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "preview" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/preview') 5 | // ES2015: 6 | // import 'tinymce/plugins/preview' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /public/static/tinymce/plugins/autolink/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "autolink" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/autolink') 5 | // ES2015: 6 | // import 'tinymce/plugins/autolink' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /public/static/tinymce/plugins/autosave/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "autosave" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/autosave') 5 | // ES2015: 6 | // import 'tinymce/plugins/autosave' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /public/static/tinymce/plugins/emoticons/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "emoticons" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/emoticons') 5 | // ES2015: 6 | // import 'tinymce/plugins/emoticons' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /public/static/tinymce/plugins/fullpage/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "fullpage" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/fullpage') 5 | // ES2015: 6 | // import 'tinymce/plugins/fullpage' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /public/static/tinymce/plugins/importcss/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "importcss" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/importcss') 5 | // ES2015: 6 | // import 'tinymce/plugins/importcss' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /public/static/tinymce/plugins/pagebreak/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "pagebreak" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/pagebreak') 5 | // ES2015: 6 | // import 'tinymce/plugins/pagebreak' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /public/static/tinymce/plugins/quickbars/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "quickbars" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/quickbars') 5 | // ES2015: 6 | // import 'tinymce/plugins/quickbars' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /public/static/tinymce/plugins/tabfocus/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "tabfocus" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/tabfocus') 5 | // ES2015: 6 | // import 'tinymce/plugins/tabfocus' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /public/static/tinymce/plugins/template/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "template" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/template') 5 | // ES2015: 6 | // import 'tinymce/plugins/template' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /public/static/tinymce/plugins/textcolor/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "textcolor" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/textcolor') 5 | // ES2015: 6 | // import 'tinymce/plugins/textcolor' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /public/static/tinymce/plugins/wordcount/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "wordcount" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/wordcount') 5 | // ES2015: 6 | // import 'tinymce/plugins/wordcount' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /public/static/tinymce/plugins/autoresize/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "autoresize" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/autoresize') 5 | // ES2015: 6 | // import 'tinymce/plugins/autoresize' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /public/static/tinymce/plugins/codesample/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "codesample" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/codesample') 5 | // ES2015: 6 | // import 'tinymce/plugins/codesample' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /public/static/tinymce/plugins/fullscreen/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "fullscreen" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/fullscreen') 5 | // ES2015: 6 | // import 'tinymce/plugins/fullscreen' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /public/static/tinymce/plugins/imagetools/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "imagetools" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/imagetools') 5 | // ES2015: 6 | // import 'tinymce/plugins/imagetools' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /public/static/tinymce/plugins/colorpicker/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "colorpicker" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/colorpicker') 5 | // ES2015: 6 | // import 'tinymce/plugins/colorpicker' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /public/static/tinymce/plugins/contextmenu/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "contextmenu" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/contextmenu') 5 | // ES2015: 6 | // import 'tinymce/plugins/contextmenu' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /public/static/tinymce/plugins/nonbreaking/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "nonbreaking" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/nonbreaking') 5 | // ES2015: 6 | // import 'tinymce/plugins/nonbreaking' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /public/static/tinymce/plugins/noneditable/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "noneditable" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/noneditable') 5 | // ES2015: 6 | // import 'tinymce/plugins/noneditable' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /public/static/tinymce/plugins/textpattern/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "textpattern" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/textpattern') 5 | // ES2015: 6 | // import 'tinymce/plugins/textpattern' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /public/static/tinymce/plugins/visualchars/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "visualchars" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/visualchars') 5 | // ES2015: 6 | // import 'tinymce/plugins/visualchars' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /public/static/tinymce/skins/ui/oxide/content.mobile.min.css: -------------------------------------------------------------------------------- 1 | .tinymce-mobile-unfocused-selections .tinymce-mobile-unfocused-selection{position:absolute;display:inline-block;background-color:green;opacity:.5}body{-webkit-text-size-adjust:none}body img{max-width:96vw}body table img{max-width:95%} -------------------------------------------------------------------------------- /src/components/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import PageView from '@/layout/PageView' 3 | 4 | const components = { 5 | 'app-pageView': PageView 6 | } 7 | 8 | // 注册全局组件 9 | Object.keys(components).forEach(key => { 10 | Vue.component(key, components[key]) 11 | }) 12 | -------------------------------------------------------------------------------- /public/static/tinymce/plugins/legacyoutput/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "legacyoutput" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/legacyoutput') 5 | // ES2015: 6 | // import 'tinymce/plugins/legacyoutput' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /public/static/tinymce/plugins/spellchecker/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "spellchecker" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/spellchecker') 5 | // ES2015: 6 | // import 'tinymce/plugins/spellchecker' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /public/static/tinymce/plugins/visualblocks/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "visualblocks" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/visualblocks') 5 | // ES2015: 6 | // import 'tinymce/plugins/visualblocks' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /public/static/tinymce/plugins/directionality/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "directionality" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/directionality') 5 | // ES2015: 6 | // import 'tinymce/plugins/directionality' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /public/static/tinymce/plugins/insertdatetime/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "insertdatetime" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/insertdatetime') 5 | // ES2015: 6 | // import 'tinymce/plugins/insertdatetime' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /public/static/tinymce/plugins/searchreplace/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "searchreplace" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/searchreplace') 5 | // ES2015: 6 | // import 'tinymce/plugins/searchreplace' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /src/directive/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import permission from './permission' 3 | import dragDialog from './dragDialog' 4 | 5 | const directive = [ 6 | permission, 7 | dragDialog 8 | ] 9 | 10 | // 注册全局指令 11 | directive.forEach(item => { 12 | Vue.use(item) 13 | }) 14 | -------------------------------------------------------------------------------- /src/assets/icons/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import SvgIcon from '@/components/Base/SvgIcon' 3 | 4 | Vue.component('svg-icon', SvgIcon) 5 | 6 | const req = require.context('./svg', false, /\.svg$/) 7 | const requireAll = requireContext => requireContext.keys().map(requireContext) 8 | requireAll(req) 9 | -------------------------------------------------------------------------------- /src/directive/permission/index.js: -------------------------------------------------------------------------------- 1 | import permission, { checkPermission } from './permission' 2 | 3 | export default { 4 | install: function (Vue) { 5 | Vue.directive('permission', permission) // 注册全局指令 6 | Vue.prototype.$checkPermission = checkPermission // 挂在到全局,供动态渲染dom调用 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/api/login.js: -------------------------------------------------------------------------------- 1 | import { request } from '@/utils/request' 2 | 3 | // 登录 4 | export function getLogin(form) { 5 | let res = request('/api/login', 'POST', form) 6 | return res 7 | } 8 | // 用户信息 9 | export function getUser(token) { 10 | let res = request('/api/user', 'POST', token) 11 | return res 12 | } 13 | -------------------------------------------------------------------------------- /src/assets/css/theme-chalk/steps.css: -------------------------------------------------------------------------------- 1 | .el-steps{display:-webkit-box;display:-ms-flexbox;display:flex}.el-steps--simple{padding:13px 8%;border-radius:4px;background:#f5f7fa}.el-steps--horizontal{white-space:nowrap}.el-steps--vertical{height:100%;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-flow:column;flex-flow:column} -------------------------------------------------------------------------------- /src/pages/index/children/icons/requireIcons.js: -------------------------------------------------------------------------------- 1 | const req = require.context('../../../../assets/icons/svg', false, /\.svg$/) 2 | const requireAll = requireContext => requireContext.keys() 3 | 4 | const re = /\.\/(.*)\.svg/ 5 | 6 | const icons = requireAll(req).map(i => { 7 | return i.match(re)[1] 8 | }) 9 | 10 | export default icons 11 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | package-lock.json 4 | /dist 5 | /public/CNAME 6 | 7 | # local env files 8 | .env.local 9 | .env.*.local 10 | 11 | # Log files 12 | npm-debug.log* 13 | yarn-debug.log* 14 | yarn-error.log* 15 | 16 | # Editor directories and files 17 | .idea 18 | .vscode 19 | *.suo 20 | *.ntvs* 21 | *.njsproj 22 | *.sln 23 | *.sw* 24 | -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [ 3 | '@vue/app', 4 | '@vue/babel-preset-jsx' 5 | ], 6 | plugins: [ 7 | [ 8 | 'component', 9 | { 10 | 'libraryName': 'element-ui', 11 | 'styleLibraryName': 'theme-chalk' 12 | } 13 | ] 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /src/pages/other/redirect.vue: -------------------------------------------------------------------------------- 1 | 14 | -------------------------------------------------------------------------------- /src/assets/css/index.styl: -------------------------------------------------------------------------------- 1 | // 主色调 2 | $appColor = #42b983; 3 | $appColorRGB = 66, 185, 131; 4 | 5 | // 水平垂直居中 6 | flex-center() { 7 | display: flex; 8 | align-items: center; 9 | justify-content: center; 10 | } 11 | // 单行溢出省略号 12 | text-ellipsis() { 13 | white-space: nowrap; 14 | text-overflow: ellipsis; 15 | overflow: hidden; 16 | } 17 | 18 | :export { 19 | appColor: $appColor; 20 | appColorRGB: $appColorRGB 21 | } 22 | -------------------------------------------------------------------------------- /src/assets/css/theme-chalk/container.css: -------------------------------------------------------------------------------- 1 | .el-container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-flex:1;-ms-flex:1;flex:1;-ms-flex-preferred-size:auto;flex-basis:auto;-webkit-box-sizing:border-box;box-sizing:border-box;min-width:0}.el-container.is-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column} -------------------------------------------------------------------------------- /src/utils/errorLog.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import store from '@/store' 3 | 4 | // you can set only in production env show the error-log 5 | if (process.env.NODE_ENV === 'production') { 6 | Vue.config.errorHandler = function (error, vm, info) { 7 | store.commit('SET_LOGS', { 8 | error, 9 | vm, 10 | info, 11 | url: window.location.href, 12 | time: new Date() 13 | }) 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/assets/css/theme-chalk/card.css: -------------------------------------------------------------------------------- 1 | .el-card{border-radius:4px;border:1px solid #ebeef5;background-color:#fff;overflow:hidden;color:#303133;-webkit-transition:.3s;transition:.3s}.el-card.is-always-shadow,.el-card.is-hover-shadow:focus,.el-card.is-hover-shadow:hover{-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-card__header{padding:18px 20px;border-bottom:1px solid #ebeef5;-webkit-box-sizing:border-box;box-sizing:border-box}.el-card__body{padding:20px} -------------------------------------------------------------------------------- /src/assets/css/theme-chalk/option-group.css: -------------------------------------------------------------------------------- 1 | .el-select-group{margin:0;padding:0}.el-select-group__wrap{position:relative;list-style:none;margin:0;padding:0}.el-select-group__wrap:not(:last-of-type){padding-bottom:24px}.el-select-group__wrap:not(:last-of-type)::after{content:'';position:absolute;display:block;left:20px;right:20px;bottom:12px;height:1px;background:#e4e7ed}.el-select-group__title{padding-left:20px;font-size:12px;color:#909399;line-height:30px}.el-select-group .el-select-dropdown__item{padding-left:20px} -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | <%= webpackConfig.name %> 12 | 13 | 14 | 15 |
16 | 17 | 18 | -------------------------------------------------------------------------------- /src/assets/css/theme-chalk/option.css: -------------------------------------------------------------------------------- 1 | .el-select-dropdown__item{font-size:14px;padding:0 20px;position:relative;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#606266;height:34px;line-height:34px;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:pointer}.el-select-dropdown__item.is-disabled{color:#c0c4cc;cursor:not-allowed}.el-select-dropdown__item.is-disabled:hover{background-color:#fff}.el-select-dropdown__item.hover,.el-select-dropdown__item:hover{background-color:#f5f7fa}.el-select-dropdown__item.selected{color:#42B983;font-weight:700} -------------------------------------------------------------------------------- /src/assets/css/theme-chalk/rate.css: -------------------------------------------------------------------------------- 1 | .el-rate__icon,.el-rate__item{position:relative;display:inline-block}.el-rate{height:20px;line-height:1}.el-rate:active,.el-rate:focus{outline-width:0}.el-rate__item{font-size:0;vertical-align:middle}.el-rate__icon{font-size:18px;margin-right:6px;color:#c0c4cc;-webkit-transition:.3s;transition:.3s}.el-rate__decimal,.el-rate__icon .path2{position:absolute;top:0;left:0}.el-rate__icon.hover{-webkit-transform:scale(1.15);transform:scale(1.15)}.el-rate__decimal{display:inline-block;overflow:hidden}.el-rate__text{font-size:14px;vertical-align:middle} -------------------------------------------------------------------------------- /public/static/tinymce/plugins/textcolor/plugin.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Tiny Technologies, Inc. All rights reserved. 3 | * Licensed under the LGPL or a commercial license. 4 | * For LGPL see License.txt in the project root for license information. 5 | * For commercial licenses see https://www.tiny.cloud/ 6 | * 7 | * Version: 5.0.1 (2019-02-21) 8 | */ 9 | !function(){"use strict";tinymce.util.Tools.resolve("tinymce.PluginManager").add("textcolor",function(){console.warn("Text color plugin is now built in to the core editor, please remove it from your editor configuration")}),function o(){}}(); -------------------------------------------------------------------------------- /public/static/tinymce/plugins/colorpicker/plugin.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Tiny Technologies, Inc. All rights reserved. 3 | * Licensed under the LGPL or a commercial license. 4 | * For LGPL see License.txt in the project root for license information. 5 | * For commercial licenses see https://www.tiny.cloud/ 6 | * 7 | * Version: 5.0.1 (2019-02-21) 8 | */ 9 | !function(){"use strict";tinymce.util.Tools.resolve("tinymce.PluginManager").add("colorpicker",function(){console.warn("Color picker plugin is now built in to the core editor, please remove it from your editor configuration")}),function o(){}}(); -------------------------------------------------------------------------------- /public/static/tinymce/plugins/contextmenu/plugin.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Tiny Technologies, Inc. All rights reserved. 3 | * Licensed under the LGPL or a commercial license. 4 | * For LGPL see License.txt in the project root for license information. 5 | * For commercial licenses see https://www.tiny.cloud/ 6 | * 7 | * Version: 5.0.1 (2019-02-21) 8 | */ 9 | !function(){"use strict";tinymce.util.Tools.resolve("tinymce.PluginManager").add("contextmenu",function(){console.warn("Context menu plugin is now built in to the core editor, please remove it from your editor configuration")}),function n(){}}(); -------------------------------------------------------------------------------- /src/assets/icons/svg/issue.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/components/Base/Cola/index.vue: -------------------------------------------------------------------------------- 1 | 6 | 21 | 26 | -------------------------------------------------------------------------------- /src/layout/Sidebar/sideLink.vue: -------------------------------------------------------------------------------- 1 | 23 | -------------------------------------------------------------------------------- /src/language/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import VueI18n from 'vue-i18n' 3 | import cache from '@/utils/cache' 4 | import elementEnLocale from 'element-ui/lib/locale/lang/en' 5 | import elementZhLocale from 'element-ui/lib/locale/lang/zh-CN' 6 | import enLocale from './en.js' 7 | import zhLocale from './zh.js' 8 | 9 | Vue.use(VueI18n) 10 | 11 | const i18n = new VueI18n({ 12 | locale: cache.getCookie('language') || 'zh', 13 | messages: { 14 | zh: { 15 | ...zhLocale, 16 | ...elementZhLocale 17 | }, 18 | en: { 19 | ...enLocale, 20 | ...elementEnLocale 21 | } 22 | } 23 | }) 24 | 25 | export default i18n 26 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 26 | 27 | 33 | -------------------------------------------------------------------------------- /src/utils/Export2Zip.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | require('script-loader!file-saver'); 3 | import JSZip from 'jszip' 4 | 5 | export function export_txt_to_zip({header, data, txtName, zipName}) { 6 | const zip = new JSZip() 7 | const txt_name = txtName || 'file' 8 | const zip_name = zipName || 'file' 9 | let txtData = `${header}\r\n` 10 | data.forEach((row) => { 11 | let tempStr = '' 12 | tempStr = row.toString() 13 | txtData += `${tempStr}\r\n` 14 | }) 15 | zip.file(`${txt_name}.txt`, txtData) 16 | zip.generateAsync({ 17 | type: "blob" 18 | }).then((blob) => { 19 | saveAs(blob, `${zip_name}.zip`) 20 | }, (err) => { 21 | alert('导出失败') 22 | }) 23 | } 24 | -------------------------------------------------------------------------------- /src/assets/icons/svg/guide.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/layout/PageView/index.vue: -------------------------------------------------------------------------------- 1 | 8 | 29 | -------------------------------------------------------------------------------- /src/assets/icons/svg/chart.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/static/tinymce/plugins/textcolor/plugin.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Tiny Technologies, Inc. All rights reserved. 3 | * Licensed under the LGPL or a commercial license. 4 | * For LGPL see License.txt in the project root for license information. 5 | * For commercial licenses see https://www.tiny.cloud/ 6 | * 7 | * Version: 5.0.1 (2019-02-21) 8 | */ 9 | (function () { 10 | var textcolor = (function () { 11 | 'use strict'; 12 | 13 | var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); 14 | 15 | global.add('textcolor', function () { 16 | console.warn('Text color plugin is now built in to the core editor, please remove it from your editor configuration'); 17 | }); 18 | function Plugin () { 19 | } 20 | 21 | return Plugin; 22 | 23 | }()); 24 | })(); 25 | -------------------------------------------------------------------------------- /public/static/tinymce/plugins/colorpicker/plugin.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Tiny Technologies, Inc. All rights reserved. 3 | * Licensed under the LGPL or a commercial license. 4 | * For LGPL see License.txt in the project root for license information. 5 | * For commercial licenses see https://www.tiny.cloud/ 6 | * 7 | * Version: 5.0.1 (2019-02-21) 8 | */ 9 | (function () { 10 | var colorpicker = (function () { 11 | 'use strict'; 12 | 13 | var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); 14 | 15 | global.add('colorpicker', function () { 16 | console.warn('Color picker plugin is now built in to the core editor, please remove it from your editor configuration'); 17 | }); 18 | function Plugin () { 19 | } 20 | 21 | return Plugin; 22 | 23 | }()); 24 | })(); 25 | -------------------------------------------------------------------------------- /public/static/tinymce/plugins/contextmenu/plugin.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Tiny Technologies, Inc. All rights reserved. 3 | * Licensed under the LGPL or a commercial license. 4 | * For LGPL see License.txt in the project root for license information. 5 | * For commercial licenses see https://www.tiny.cloud/ 6 | * 7 | * Version: 5.0.1 (2019-02-21) 8 | */ 9 | (function () { 10 | var contextmenu = (function () { 11 | 'use strict'; 12 | 13 | var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); 14 | 15 | global.add('contextmenu', function () { 16 | console.warn('Context menu plugin is now built in to the core editor, please remove it from your editor configuration'); 17 | }); 18 | function Plugin () { 19 | } 20 | 21 | return Plugin; 22 | 23 | }()); 24 | })(); 25 | -------------------------------------------------------------------------------- /src/assets/css/theme-chalk/reset.css: -------------------------------------------------------------------------------- 1 | @charset "UTF-8";body{font-family:"Helvetica Neue",Helvetica,"PingFang SC","Hiragino Sans GB","Microsoft YaHei","微软雅黑",Arial,sans-serif;font-weight:400;font-size:14px;color:#000;-webkit-font-smoothing:antialiased}a{color:#42B983;text-decoration:none}a:focus,a:hover{color:rgb(104, 199, 156)}a:active{color:rgb(59, 167, 118)}h1,h2,h3,h4,h5,h6{color:#606266;font-weight:inherit}h1:first-child,h2:first-child,h3:first-child,h4:first-child,h5:first-child,h6:first-child,p:first-child{margin-top:0}h1:last-child,h2:last-child,h3:last-child,h4:last-child,h5:last-child,h6:last-child,p:last-child{margin-bottom:0}h1{font-size:20px}h2{font-size:18px}h3{font-size:16px}h4,h5,h6,p{font-size:inherit}p{line-height:1.8}sub,sup{font-size:13px}small{font-size:12px}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee} -------------------------------------------------------------------------------- /public/static/tinymce/plugins/print/plugin.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Tiny Technologies, Inc. All rights reserved. 3 | * Licensed under the LGPL or a commercial license. 4 | * For LGPL see License.txt in the project root for license information. 5 | * For commercial licenses see https://www.tiny.cloud/ 6 | * 7 | * Version: 5.0.1 (2019-02-21) 8 | */ 9 | !function(){"use strict";var n=tinymce.util.Tools.resolve("tinymce.PluginManager"),t=function(n){n.addCommand("mcePrint",function(){n.getWin().print()})},i=function(n){n.ui.registry.addButton("print",{icon:"print",tooltip:"Print",onAction:function(){return n.execCommand("mcePrint")}}),n.ui.registry.addMenuItem("print",{text:"Print...",icon:"print",onAction:function(){return n.execCommand("mcePrint")}})};n.add("print",function(n){t(n),i(n),n.addShortcut("Meta+P","","mcePrint")}),function r(){}}(); -------------------------------------------------------------------------------- /src/assets/css/theme-chalk/badge.css: -------------------------------------------------------------------------------- 1 | .el-badge{position:relative;vertical-align:middle;display:inline-block}.el-badge__content{background-color:#f56c6c;border-radius:10px;color:#fff;display:inline-block;font-size:12px;height:18px;line-height:18px;padding:0 6px;text-align:center;white-space:nowrap;border:1px solid #fff}.el-badge__content.is-fixed{position:absolute;top:0;right:10px;-webkit-transform:translateY(-50%) translateX(100%);transform:translateY(-50%) translateX(100%)}.el-badge__content.is-fixed.is-dot{right:5px}.el-badge__content.is-dot{height:8px;width:8px;padding:0;right:0;border-radius:50%}.el-badge__content--primary{background-color:#42B983}.el-badge__content--success{background-color:#67c23a}.el-badge__content--warning{background-color:#e6a23c}.el-badge__content--info{background-color:#909399}.el-badge__content--danger{background-color:#f56c6c} -------------------------------------------------------------------------------- /src/components/Base/SvgIcon/index.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 27 | 28 | 37 | -------------------------------------------------------------------------------- /src/pages/index/children/errorLog/errorLog.vue: -------------------------------------------------------------------------------- 1 | 11 | 25 | 33 | -------------------------------------------------------------------------------- /src/pages/index/children/guide/steps.js: -------------------------------------------------------------------------------- 1 | const steps = [ 2 | { 3 | element: '#cola', 4 | popover: { 5 | name: 'Cola', 6 | title: 'Cola', 7 | description: 'Open && Close sidebar', 8 | position: 'bottom' 9 | } 10 | }, 11 | { 12 | element: '#app-breadcrumb', 13 | popover: { 14 | name: 'Breadcrumb', 15 | title: 'Breadcrumb', 16 | description: 'Indicate the current page location', 17 | position: 'bottom' 18 | } 19 | }, 20 | { 21 | element: '#languageSelect', 22 | popover: { 23 | name: 'Language', 24 | title: 'Language', 25 | description: 'Switch the system language', 26 | position: 'left' 27 | } 28 | } 29 | ] 30 | export default steps 31 | -------------------------------------------------------------------------------- /src/assets/icons/svg/component.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/css/theme-chalk/row.css: -------------------------------------------------------------------------------- 1 | .el-row{position:relative;-webkit-box-sizing:border-box;box-sizing:border-box}.el-row::after,.el-row::before{display:table;content:""}.el-row::after{clear:both}.el-row--flex{display:-webkit-box;display:-ms-flexbox;display:flex}.el-row--flex:after,.el-row--flex:before{display:none}.el-row--flex.is-justify-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.el-row--flex.is-justify-end{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.el-row--flex.is-justify-space-between{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.el-row--flex.is-justify-space-around{-ms-flex-pack:distribute;justify-content:space-around}.el-row--flex.is-align-middle{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-row--flex.is-align-bottom{-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end} -------------------------------------------------------------------------------- /public/static/tinymce/plugins/hr/plugin.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Tiny Technologies, Inc. All rights reserved. 3 | * Licensed under the LGPL or a commercial license. 4 | * For LGPL see License.txt in the project root for license information. 5 | * For commercial licenses see https://www.tiny.cloud/ 6 | * 7 | * Version: 5.0.1 (2019-02-21) 8 | */ 9 | !function(){"use strict";var n=tinymce.util.Tools.resolve("tinymce.PluginManager"),o=function(n){n.addCommand("InsertHorizontalRule",function(){n.execCommand("mceInsertContent",!1,"
")})},t=function(n){n.ui.registry.addButton("hr",{icon:"horizontal-rule",tooltip:"Horizontal line",onAction:function(){return n.execCommand("InsertHorizontalRule")}}),n.ui.registry.addMenuItem("hr",{icon:"horizontal-rule",text:"Horizontal line",onAction:function(){return n.execCommand("InsertHorizontalRule")}})};n.add("hr",function(n){o(n),t(n)}),function e(){}}(); -------------------------------------------------------------------------------- /src/assets/css/theme-chalk/spinner.css: -------------------------------------------------------------------------------- 1 | .el-time-spinner{width:100%;white-space:nowrap}.el-spinner{display:inline-block;vertical-align:middle}.el-spinner-inner{-webkit-animation:rotate 2s linear infinite;animation:rotate 2s linear infinite;width:50px;height:50px}.el-spinner-inner .path{stroke:#ececec;stroke-linecap:round;-webkit-animation:dash 1.5s ease-in-out infinite;animation:dash 1.5s ease-in-out infinite}@-webkit-keyframes rotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes rotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes dash{0%{stroke-dasharray:1,150;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-35}100%{stroke-dasharray:90,150;stroke-dashoffset:-124}}@keyframes dash{0%{stroke-dasharray:1,150;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-35}100%{stroke-dasharray:90,150;stroke-dashoffset:-124}} -------------------------------------------------------------------------------- /src/layout/NavBar/LanguageSelect/index.vue: -------------------------------------------------------------------------------- 1 | 12 | 27 | -------------------------------------------------------------------------------- /public/static/tinymce/skins/content/default/content.min.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Tiny Technologies, Inc. All rights reserved. 3 | * Licensed under the LGPL or a commercial license. 4 | * For LGPL see License.txt in the project root for license information. 5 | * For commercial licenses see https://www.tiny.cloud/ 6 | */ 7 | body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif;line-height:1.4;margin:1rem}table{border-collapse:collapse}table td,table th{border:1px solid #ccc;padding:.4rem}blockquote{border-left:2px solid #ccc;margin-left:1.5rem;padding-left:1rem}figure{display:table;margin:1rem auto}figure figcaption{color:#999;display:block;margin-top:.25rem;text-align:center}hr{border-color:#ccc;border-style:solid;border-width:1px 0 0 0}code{background-color:#e8e8e8;border-radius:3px;padding:.1rem .2rem} 8 | /*# sourceMappingURL=content.min.css.map */ 9 | -------------------------------------------------------------------------------- /public/static/tinymce/skins/content/writer/content.min.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Tiny Technologies, Inc. All rights reserved. 3 | * Licensed under the LGPL or a commercial license. 4 | * For LGPL see License.txt in the project root for license information. 5 | * For commercial licenses see https://www.tiny.cloud/ 6 | */ 7 | body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif;line-height:1.4;margin:1rem auto;max-width:900px}table{border-collapse:collapse}table td,table th{border:1px solid #ccc;padding:.4rem}blockquote{border-left:2px solid #ccc;margin-left:1.5rem;padding-left:1rem}figure{display:table;margin:1rem auto}figure figcaption{color:#999;display:block;margin-top:.25rem;text-align:center}hr{border-color:#ccc;border-style:solid;border-width:1px 0 0 0}code{background-color:#e8e8e8;border-radius:3px;padding:.1rem .2rem} 8 | /*# sourceMappingURL=content.min.css.map */ 9 | -------------------------------------------------------------------------------- /public/static/tinymce/skins/content/document/content.min.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Tiny Technologies, Inc. All rights reserved. 3 | * Licensed under the LGPL or a commercial license. 4 | * For LGPL see License.txt in the project root for license information. 5 | * For commercial licenses see https://www.tiny.cloud/ 6 | */ 7 | @media screen{html{background:#f4f4f4}}body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif}@media screen{body{background-color:#fff;box-shadow:0 0 4px rgba(0,0,0,.15);box-sizing:border-box;margin:1rem auto 0;max-width:820px;min-height:calc(99vh);padding:4rem 6rem 6rem 6rem}}table{border-collapse:collapse}table td,table th{border:1px solid #ccc;padding:.4rem}blockquote{border-left:2px solid #ccc;margin-left:1.5rem;padding-left:1rem}figure figcaption{color:#999;margin-top:.25rem;text-align:center}hr{border-color:#ccc;border-style:solid;border-width:1px 0 0 0} 8 | /*# sourceMappingURL=content.min.css.map */ 9 | -------------------------------------------------------------------------------- /src/assets/css/theme-chalk/display.css: -------------------------------------------------------------------------------- 1 | @media only screen and (max-width:767px){.hidden-xs-only{display:none!important}}@media only screen and (min-width:768px){.hidden-sm-and-up{display:none!important}}@media only screen and (min-width:768px) and (max-width:992px - 1){.hidden-sm-only{display:none!important}}@media only screen and (max-width:991px){.hidden-sm-and-down{display:none!important}}@media only screen and (min-width:992px){.hidden-md-and-up{display:none!important}}@media only screen and (min-width:992px) and (max-width:1200px - 1){.hidden-md-only{display:none!important}}@media only screen and (max-width:1199px){.hidden-md-and-down{display:none!important}}@media only screen and (min-width:1200px){.hidden-lg-and-up{display:none!important}}@media only screen and (min-width:1200px) and (max-width:1920px - 1){.hidden-lg-only{display:none!important}}@media only screen and (max-width:1919px){.hidden-lg-and-down{display:none!important}}@media only screen and (min-width:1920px){.hidden-xl-only{display:none!important}} -------------------------------------------------------------------------------- /src/assets/css/theme-chalk/breadcrumb.css: -------------------------------------------------------------------------------- 1 | .el-breadcrumb{font-size:14px;line-height:1}.el-breadcrumb::after,.el-breadcrumb::before{display:table;content:""}.el-breadcrumb::after{clear:both}.el-breadcrumb__separator{margin:0 9px;font-weight:700;color:#c0c4cc}.el-breadcrumb__separator[class*=icon]{margin:0 6px;font-weight:400}.el-breadcrumb__item{float:left}.el-breadcrumb__inner{color:#606266}.el-breadcrumb__inner a,.el-breadcrumb__inner.is-link{font-weight:700;text-decoration:none;-webkit-transition:color .2s cubic-bezier(.645,.045,.355,1);transition:color .2s cubic-bezier(.645,.045,.355,1);color:#303133}.el-breadcrumb__inner a:hover,.el-breadcrumb__inner.is-link:hover{color:#42B983;cursor:pointer}.el-breadcrumb__item:last-child .el-breadcrumb__inner,.el-breadcrumb__item:last-child .el-breadcrumb__inner a,.el-breadcrumb__item:last-child .el-breadcrumb__inner a:hover,.el-breadcrumb__item:last-child .el-breadcrumb__inner:hover{font-weight:400;color:#606266;cursor:text}.el-breadcrumb__item:last-child .el-breadcrumb__separator{display:none} -------------------------------------------------------------------------------- /src/directive/permission/permission.js: -------------------------------------------------------------------------------- 1 | import store from '@/store' 2 | 3 | export default { 4 | inserted(el, binding, vnode) { 5 | const permissionRole = binding.value 6 | const hasPermission = checkPermission(permissionRole) 7 | if (!hasPermission) { 8 | el.parentNode && el.parentNode.removeChild(el) 9 | } 10 | } 11 | } 12 | 13 | export function checkPermission(permissionRole) { 14 | // 不能作为通用方案,判断权限的方法需自行实现 15 | // 当前采用登录角色是否包含被验证的permissionRole 16 | let currentRole = (store.state.login.user && store.state.login.user.roles) || 'visitor' 17 | if (typeof currentRole === 'string') { 18 | currentRole = [currentRole] 19 | } 20 | if (permissionRole && Array.isArray(permissionRole)) { 21 | const hasPermission = currentRole.some(role => { 22 | return permissionRole.includes(role) 23 | }) 24 | return hasPermission 25 | } else { 26 | throw new Error(`Error! Please Enter Array Type"`) 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/assets/css/theme-chalk/scrollbar.css: -------------------------------------------------------------------------------- 1 | .el-scrollbar{overflow:hidden;position:relative}.el-scrollbar:active>.el-scrollbar__bar,.el-scrollbar:focus>.el-scrollbar__bar,.el-scrollbar:hover>.el-scrollbar__bar{opacity:1;-webkit-transition:opacity 340ms ease-out;transition:opacity 340ms ease-out}.el-scrollbar__wrap{overflow:scroll;height:100%}.el-scrollbar__wrap--hidden-default::-webkit-scrollbar{width:0;height:0}.el-scrollbar__thumb{position:relative;display:block;width:0;height:0;cursor:pointer;border-radius:inherit;background-color:rgba(144,147,153,.3);-webkit-transition:.3s background-color;transition:.3s background-color}.el-scrollbar__thumb:hover{background-color:rgba(144,147,153,.5)}.el-scrollbar__bar{position:absolute;right:2px;bottom:2px;z-index:1;border-radius:4px;opacity:0;-webkit-transition:opacity 120ms ease-out;transition:opacity 120ms ease-out}.el-scrollbar__bar.is-vertical{width:6px;top:2px}.el-scrollbar__bar.is-vertical>div{width:100%}.el-scrollbar__bar.is-horizontal{height:6px;left:2px}.el-scrollbar__bar.is-horizontal>div{height:100%} -------------------------------------------------------------------------------- /src/assets/css/theme-chalk/carousel-item.css: -------------------------------------------------------------------------------- 1 | .el-carousel__item,.el-carousel__mask{position:absolute;height:100%;top:0;left:0}.el-carousel__item{width:100%;display:inline-block;overflow:hidden;z-index:0}.el-carousel__item.is-active{z-index:2}.el-carousel__item.is-animating{-webkit-transition:-webkit-transform .4s ease-in-out;transition:-webkit-transform .4s ease-in-out;transition:transform .4s ease-in-out;transition:transform .4s ease-in-out,-webkit-transform .4s ease-in-out}.el-carousel__item--card{width:50%;-webkit-transition:-webkit-transform .4s ease-in-out;transition:-webkit-transform .4s ease-in-out;transition:transform .4s ease-in-out;transition:transform .4s ease-in-out,-webkit-transform .4s ease-in-out}.el-carousel__item--card.is-in-stage{cursor:pointer;z-index:1}.el-carousel__item--card.is-in-stage.is-hover .el-carousel__mask,.el-carousel__item--card.is-in-stage:hover .el-carousel__mask{opacity:.12}.el-carousel__item--card.is-active{z-index:2}.el-carousel__mask{width:100%;background-color:#fff;opacity:.24;-webkit-transition:.2s;transition:.2s} -------------------------------------------------------------------------------- /src/layout/Sidebar/sideValue.vue: -------------------------------------------------------------------------------- 1 | 30 | 41 | -------------------------------------------------------------------------------- /src/assets/icons/svg/documentation.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/layout/NavBar/Screenfull/index.vue: -------------------------------------------------------------------------------- 1 | 6 | 39 | -------------------------------------------------------------------------------- /src/assets/icons/svg/lock.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 uncleLian 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /public/static/tinymce/skins/content/default/content.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Tiny Technologies, Inc. All rights reserved. 3 | * Licensed under the LGPL or a commercial license. 4 | * For LGPL see License.txt in the project root for license information. 5 | * For commercial licenses see https://www.tiny.cloud/ 6 | */ 7 | body { 8 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; 9 | line-height: 1.4; 10 | margin: 1rem; 11 | } 12 | table { 13 | border-collapse: collapse; 14 | } 15 | table th, 16 | table td { 17 | border: 1px solid #ccc; 18 | padding: .4rem; 19 | } 20 | blockquote { 21 | border-left: 2px solid #ccc; 22 | margin-left: 1.5rem; 23 | padding-left: 1rem; 24 | } 25 | figure { 26 | display: table; 27 | margin: 1rem auto; 28 | } 29 | figure figcaption { 30 | color: #999; 31 | display: block; 32 | margin-top: .25rem; 33 | text-align: center; 34 | } 35 | hr { 36 | border-color: #ccc; 37 | border-style: solid; 38 | border-width: 1px 0 0 0; 39 | } 40 | code { 41 | background-color: #e8e8e8; 42 | border-radius: 3px; 43 | padding: .1rem .2rem; 44 | } -------------------------------------------------------------------------------- /src/assets/icons/svg/fullscreen.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/static/tinymce/skins/content/writer/content.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Tiny Technologies, Inc. All rights reserved. 3 | * Licensed under the LGPL or a commercial license. 4 | * For LGPL see License.txt in the project root for license information. 5 | * For commercial licenses see https://www.tiny.cloud/ 6 | */ 7 | body { 8 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; 9 | line-height: 1.4; 10 | margin: 1rem auto; 11 | max-width: 900px; 12 | } 13 | table { 14 | border-collapse: collapse; 15 | } 16 | table th, 17 | table td { 18 | border: 1px solid #ccc; 19 | padding: .4rem; 20 | } 21 | blockquote { 22 | border-left: 2px solid #ccc; 23 | margin-left: 1.5rem; 24 | padding-left: 1rem; 25 | } 26 | figure { 27 | display: table; 28 | margin: 1rem auto; 29 | } 30 | figure figcaption { 31 | color: #999; 32 | display: block; 33 | margin-top: .25rem; 34 | text-align: center; 35 | } 36 | hr { 37 | border-color: #ccc; 38 | border-style: solid; 39 | border-width: 1px 0 0 0; 40 | } 41 | code { 42 | background-color: #e8e8e8; 43 | border-radius: 3px; 44 | padding: .1rem .2rem; 45 | } -------------------------------------------------------------------------------- /src/utils/singleMessage.js: -------------------------------------------------------------------------------- 1 | import { Message } from 'element-ui' 2 | 3 | /** 4 | * 只显示一条弹框,使用element-ui的message完成 5 | * single默认值true,因为项目需求,默认只弹出一个,可以根据实际需要设置 6 | * singleMessage基本用法和Message一样,但缺少close、closeAll等方法 7 | * 全局使用可以挂载到Vue.prototype.$singleMessage = Message 8 | * 也可以替换$message,但需要放到Vue.use(ElementUI)之后 9 | */ 10 | 11 | const singleMessage = function (options) { 12 | options = options || {} 13 | if (typeof options === 'string') { 14 | options = { 15 | message: options 16 | } 17 | } 18 | handleMessage(options) 19 | } 20 | 21 | const MessageType = ['success', 'warning', 'info', 'error'] 22 | MessageType.forEach(type => { 23 | singleMessage[type] = options => { 24 | if (typeof options === 'string') { 25 | options = { 26 | message: options 27 | } 28 | } 29 | options.type = type 30 | return handleMessage(options) 31 | } 32 | }) 33 | 34 | const handleMessage = (options, single = true) => { 35 | if (single) { 36 | Message.closeAll() // 关闭之前所有Message 37 | Message(options) 38 | } else { 39 | Message(options) 40 | } 41 | } 42 | 43 | export default singleMessage 44 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import App from '@/App' 3 | import router from '@/router' 4 | import store from '@/store' 5 | 6 | // 第三方 7 | import ElementUI from 'element-ui' 8 | // import 'element-ui/lib/theme-chalk/index.css' // element-ui 默认颜色 9 | import VueProgressBar from 'vue-progressbar' // 进度条 10 | import vueSticky from 'vue-position-sticky' // 图钉 11 | import vueBacktop from 'vue-backtop-pack' // 返回顶部 12 | import vueNumTo from 'vue-num-to' // 动态数值 13 | import vueClipboard from 'vue-clipboard-pack' // 剪切板 14 | 15 | // 自定义 16 | import '@/assets' // 字体、样式等资源 17 | import '@/components' // 全局组件 18 | import '@/directive' // 全局指令 19 | import '@/filters' // 全局过滤 20 | import '@/utils/permission' // 权限验证 21 | import '@/utils/errorLog' // 错误捕捉 22 | import '@/utils/cache' // 缓存 23 | import i18n from '@/language' // 国际化 24 | 25 | import '@/mock' // 模拟数据 26 | 27 | Vue.config.productionTip = false 28 | 29 | // 第三方 30 | Vue.use(ElementUI, { size: 'small', i18n: (key, value) => i18n.t(key, value) }) 31 | Vue.use(VueProgressBar) 32 | Vue.use(vueSticky) 33 | Vue.use(vueBacktop) 34 | Vue.use(vueNumTo) 35 | Vue.use(vueClipboard) 36 | 37 | new Vue({ 38 | router, 39 | store, 40 | i18n, 41 | render: h => h(App) 42 | }).$mount('#app') 43 | -------------------------------------------------------------------------------- /src/pages/index/children/components-demo/singleMessage.vue: -------------------------------------------------------------------------------- 1 | 14 | 36 | -------------------------------------------------------------------------------- /src/components/Base/Breadcrumb/index.vue: -------------------------------------------------------------------------------- 1 | 6 | 30 | 45 | -------------------------------------------------------------------------------- /public/static/tinymce/plugins/code/plugin.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Tiny Technologies, Inc. All rights reserved. 3 | * Licensed under the LGPL or a commercial license. 4 | * For LGPL see License.txt in the project root for license information. 5 | * For commercial licenses see https://www.tiny.cloud/ 6 | * 7 | * Version: 5.0.1 (2019-02-21) 8 | */ 9 | !function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),t=function(e,n){e.focus(),e.undoManager.transact(function(){e.setContent(n)}),e.selection.setCursorLocation(),e.nodeChanged()},o=function(e){return e.getContent({source_view:!0})},n=function(n){var e=o(n);n.windowManager.open({title:"Source Code",size:"large",body:{type:"panel",items:[{type:"textarea",name:"code"}]},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:{code:e},onSubmit:function(e){t(n,e.getData().code),e.close()}})},c=function(e){e.addCommand("mceCodeEditor",function(){n(e)})},i=function(e){e.ui.registry.addButton("code",{icon:"sourcecode",tooltip:"Source code",onAction:function(){return n(e)}}),e.ui.registry.addMenuItem("code",{icon:"sourcecode",text:"Source code",onAction:function(){return n(e)}})};e.add("code",function(e){return c(e),i(e),{}}),function u(){}}(); -------------------------------------------------------------------------------- /src/assets/icons/svg/user.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/icons/svg/view.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/icons/svg/markdown.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/pages/index/children/components-demo/backTop.vue: -------------------------------------------------------------------------------- 1 | 23 | 33 | 40 | -------------------------------------------------------------------------------- /src/pages/index/children/guide/guide.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 41 | -------------------------------------------------------------------------------- /public/static/tinymce/skins/content/document/content.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Tiny Technologies, Inc. All rights reserved. 3 | * Licensed under the LGPL or a commercial license. 4 | * For LGPL see License.txt in the project root for license information. 5 | * For commercial licenses see https://www.tiny.cloud/ 6 | */ 7 | @media screen { 8 | html { 9 | background: #f4f4f4; 10 | } 11 | } 12 | body { 13 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; 14 | } 15 | @media screen { 16 | body { 17 | background-color: #fff; 18 | box-shadow: 0 0 4px rgba(0, 0, 0, 0.15); 19 | box-sizing: border-box; 20 | margin: 1rem auto 0; 21 | max-width: 820px; 22 | min-height: calc(99vh); 23 | padding: 4rem 6rem 6rem 6rem; 24 | } 25 | } 26 | table { 27 | border-collapse: collapse; 28 | } 29 | table th, 30 | table td { 31 | border: 1px solid #ccc; 32 | padding: .4rem; 33 | } 34 | blockquote { 35 | border-left: 2px solid #ccc; 36 | margin-left: 1.5rem; 37 | padding-left: 1rem; 38 | } 39 | figure figcaption { 40 | color: #999; 41 | margin-top: .25rem; 42 | text-align: center; 43 | } 44 | hr { 45 | border-color: #ccc; 46 | border-style: solid; 47 | border-width: 1px 0 0 0; 48 | } -------------------------------------------------------------------------------- /src/pages/index/children/dashboard/index.vue: -------------------------------------------------------------------------------- 1 | 20 | 39 | 47 | -------------------------------------------------------------------------------- /src/assets/icons/svg/github.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/icons/svg/backtop.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/pages/index/children/components-demo/dragDialog.vue: -------------------------------------------------------------------------------- 1 | 15 | 37 | 41 | -------------------------------------------------------------------------------- /src/assets/icons/svg/flex-left.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/icons/svg/thumbtack.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/pages/index/children/i18n-demo/local.js: -------------------------------------------------------------------------------- 1 | export default { 2 | zh: { 3 | i18nDemo: { 4 | switchLang: '切换语言', 5 | note: '本项目国际化基于', 6 | button: { 7 | round: '圆形按钮', 8 | primary: '主要按钮', 9 | success: '成功按钮', 10 | info: '信息按钮', 11 | warning: '警告按钮', 12 | danger: '危险按钮' 13 | }, 14 | alert: { 15 | success: '成功提示的文案', 16 | info: '消息提示的文案', 17 | warning: '警告提示的文案', 18 | error: '错误提示的文案' 19 | }, 20 | datePickr: '选择日期' 21 | } 22 | }, 23 | en: { 24 | i18nDemo: { 25 | switchLang: 'Switch Languange', 26 | note: 'The internationalization of the project is based on', 27 | button: { 28 | round: 'Round', 29 | primary: 'Primary', 30 | success: 'Success', 31 | info: 'Info', 32 | warning: 'Warning', 33 | danger: 'Danger' 34 | }, 35 | alert: { 36 | success: 'success alert', 37 | info: 'info alert', 38 | warning: 'warning alert', 39 | error: 'error alert' 40 | }, 41 | datePickr: 'Pick a day' 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/assets/css/theme-chalk/alert.css: -------------------------------------------------------------------------------- 1 | .el-alert{width:100%;padding:8px 16px;margin:0;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:4px;position:relative;background-color:#fff;overflow:hidden;opacity:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-transition:opacity .2s;transition:opacity .2s}.el-alert.is-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.el-alert--success{background-color:#f0f9eb;color:#67c23a}.el-alert--success .el-alert__description{color:#67c23a}.el-alert--info{background-color:#f4f4f5;color:#909399}.el-alert--info .el-alert__description{color:#909399}.el-alert--warning{background-color:#fdf6ec;color:#e6a23c}.el-alert--warning .el-alert__description{color:#e6a23c}.el-alert--error{background-color:#fef0f0;color:#f56c6c}.el-alert--error .el-alert__description{color:#f56c6c}.el-alert__content{display:table-cell;padding:0 8px}.el-alert__icon{font-size:16px;width:16px}.el-alert__icon.is-big{font-size:28px;width:28px}.el-alert__title{font-size:13px;line-height:18px}.el-alert__title.is-bold{font-weight:700}.el-alert .el-alert__description{font-size:12px;margin:5px 0 0}.el-alert__closebtn{font-size:12px;color:#c0c4cc;opacity:1;position:absolute;top:12px;right:15px;cursor:pointer}.el-alert__closebtn.is-customed{font-style:normal;font-size:13px;top:9px}.el-alert-fade-enter,.el-alert-fade-leave-active{opacity:0} -------------------------------------------------------------------------------- /src/assets/icons/svg/users.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/static/tinymce/plugins/nonbreaking/plugin.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Tiny Technologies, Inc. All rights reserved. 3 | * Licensed under the LGPL or a commercial license. 4 | * For LGPL see License.txt in the project root for license information. 5 | * For commercial licenses see https://www.tiny.cloud/ 6 | * 7 | * Version: 5.0.1 (2019-02-21) 8 | */ 9 | !function(){"use strict";var n=tinymce.util.Tools.resolve("tinymce.PluginManager"),t=function(n,e){var o,t=(o=n).plugins.visualchars&&o.plugins.visualchars.isEnabled()?' ':" ";n.insertContent(function(n,e){for(var o="",t=0;t -------------------------------------------------------------------------------- /src/filters/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | 3 | const filters = { 4 | devide_10k: function (num) { 5 | return num >= 10000 ? (num / 10000).toFixed(1) + '万' : num 6 | }, 7 | // 时间格式化 8 | formatTime: function (time, formatType) { 9 | if (arguments.length === 0) { 10 | return null 11 | } 12 | const format = formatType || '{y}-{m}-{d} {h}:{i}:{s}' 13 | let date 14 | if (typeof time === 'object') { 15 | date = time 16 | } else { 17 | if (('' + time).length === 10) time = parseInt(time) * 1000 18 | date = new Date(time) 19 | } 20 | const formatObj = { 21 | y: date.getFullYear(), 22 | m: date.getMonth() + 1, 23 | d: date.getDate(), 24 | h: date.getHours(), 25 | i: date.getMinutes(), 26 | s: date.getSeconds(), 27 | a: date.getDay() 28 | } 29 | const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => { 30 | let value = formatObj[key] 31 | if (key === 'a') return ['一', '二', '三', '四', '五', '六', '日'][value - 1] 32 | if (result.length > 0 && value < 10) { 33 | value = '0' + value 34 | } 35 | return value || 0 36 | }) 37 | return time_str 38 | } 39 | } 40 | 41 | // 注册全局过滤 42 | Object.keys(filters).forEach(key => { 43 | Vue.filter(key, filters[key]) 44 | }) 45 | // 挂在到全局 46 | Vue.prototype.$filter = filters 47 | -------------------------------------------------------------------------------- /src/assets/icons/svg/number.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/pages/other/page404.vue: -------------------------------------------------------------------------------- 1 | 15 | 20 | 53 | -------------------------------------------------------------------------------- /src/pages/index/children/components-demo/progressbar.vue: -------------------------------------------------------------------------------- 1 | 15 | 45 | 49 | -------------------------------------------------------------------------------- /src/assets/css/theme-chalk/popper.css: -------------------------------------------------------------------------------- 1 | .el-popper .popper__arrow,.el-popper .popper__arrow::after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.el-popper .popper__arrow{border-width:6px;-webkit-filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03));filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03))}.el-popper .popper__arrow::after{content:" ";border-width:6px}.el-popper[x-placement^=top]{margin-bottom:12px}.el-popper[x-placement^=top] .popper__arrow{bottom:-6px;left:50%;margin-right:3px;border-top-color:#ebeef5;border-bottom-width:0}.el-popper[x-placement^=top] .popper__arrow::after{bottom:1px;margin-left:-6px;border-top-color:#fff;border-bottom-width:0}.el-popper[x-placement^=bottom]{margin-top:12px}.el-popper[x-placement^=bottom] .popper__arrow{top:-6px;left:50%;margin-right:3px;border-top-width:0;border-bottom-color:#ebeef5}.el-popper[x-placement^=bottom] .popper__arrow::after{top:1px;margin-left:-6px;border-top-width:0;border-bottom-color:#fff}.el-popper[x-placement^=right]{margin-left:12px}.el-popper[x-placement^=right] .popper__arrow{top:50%;left:-6px;margin-bottom:3px;border-right-color:#ebeef5;border-left-width:0}.el-popper[x-placement^=right] .popper__arrow::after{bottom:-6px;left:1px;border-right-color:#fff;border-left-width:0}.el-popper[x-placement^=left]{margin-right:12px}.el-popper[x-placement^=left] .popper__arrow{top:50%;right:-6px;margin-bottom:3px;border-right-width:0;border-left-color:#ebeef5}.el-popper[x-placement^=left] .popper__arrow::after{right:1px;bottom:-6px;margin-left:-6px;border-right-width:0;border-left-color:#fff} -------------------------------------------------------------------------------- /src/assets/icons/svg/excel.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/static/tinymce/plugins/print/plugin.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Tiny Technologies, Inc. All rights reserved. 3 | * Licensed under the LGPL or a commercial license. 4 | * For LGPL see License.txt in the project root for license information. 5 | * For commercial licenses see https://www.tiny.cloud/ 6 | * 7 | * Version: 5.0.1 (2019-02-21) 8 | */ 9 | (function () { 10 | var print = (function () { 11 | 'use strict'; 12 | 13 | var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); 14 | 15 | var register = function (editor) { 16 | editor.addCommand('mcePrint', function () { 17 | editor.getWin().print(); 18 | }); 19 | }; 20 | var Commands = { register: register }; 21 | 22 | var register$1 = function (editor) { 23 | editor.ui.registry.addButton('print', { 24 | icon: 'print', 25 | tooltip: 'Print', 26 | onAction: function () { 27 | return editor.execCommand('mcePrint'); 28 | } 29 | }); 30 | editor.ui.registry.addMenuItem('print', { 31 | text: 'Print...', 32 | icon: 'print', 33 | onAction: function () { 34 | return editor.execCommand('mcePrint'); 35 | } 36 | }); 37 | }; 38 | var Buttons = { register: register$1 }; 39 | 40 | global.add('print', function (editor) { 41 | Commands.register(editor); 42 | Buttons.register(editor); 43 | editor.addShortcut('Meta+P', '', 'mcePrint'); 44 | }); 45 | function Plugin () { 46 | } 47 | 48 | return Plugin; 49 | 50 | }()); 51 | })(); 52 | -------------------------------------------------------------------------------- /src/assets/icons/svg/editor.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/static/tinymce/plugins/hr/plugin.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Tiny Technologies, Inc. All rights reserved. 3 | * Licensed under the LGPL or a commercial license. 4 | * For LGPL see License.txt in the project root for license information. 5 | * For commercial licenses see https://www.tiny.cloud/ 6 | * 7 | * Version: 5.0.1 (2019-02-21) 8 | */ 9 | (function () { 10 | var hr = (function () { 11 | 'use strict'; 12 | 13 | var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); 14 | 15 | var register = function (editor) { 16 | editor.addCommand('InsertHorizontalRule', function () { 17 | editor.execCommand('mceInsertContent', false, '
'); 18 | }); 19 | }; 20 | var Commands = { register: register }; 21 | 22 | var register$1 = function (editor) { 23 | editor.ui.registry.addButton('hr', { 24 | icon: 'horizontal-rule', 25 | tooltip: 'Horizontal line', 26 | onAction: function () { 27 | return editor.execCommand('InsertHorizontalRule'); 28 | } 29 | }); 30 | editor.ui.registry.addMenuItem('hr', { 31 | icon: 'horizontal-rule', 32 | text: 'Horizontal line', 33 | onAction: function () { 34 | return editor.execCommand('InsertHorizontalRule'); 35 | } 36 | }); 37 | }; 38 | var Buttons = { register: register$1 }; 39 | 40 | global.add('hr', function (editor) { 41 | Commands.register(editor); 42 | Buttons.register(editor); 43 | }); 44 | function Plugin () { 45 | } 46 | 47 | return Plugin; 48 | 49 | }()); 50 | })(); 51 | -------------------------------------------------------------------------------- /src/assets/css/global.styl: -------------------------------------------------------------------------------- 1 | @import './index'; 2 | 3 | * { 4 | box-sizing: border-box; 5 | } 6 | html, body { 7 | width: 100%; 8 | height: 100%; 9 | min-width: 1024px; 10 | min-height: 100%; 11 | background: #f4f5f6; 12 | } 13 | body { 14 | font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, SimSun, sans-serif; 15 | font-weight: 400; 16 | font-size: 14px; 17 | color: #333; 18 | overflow-x: hidden; 19 | overflow-y: auto; 20 | } 21 | a { 22 | color: $appColor; 23 | text-decoration: none; 24 | outline: none; 25 | } 26 | // introduce; 27 | .app-introduce { 28 | width: fit-content; 29 | font-weight: 500; 30 | text-align: justify; 31 | line-height: 1.6em; 32 | padding: 1em; 33 | margin-bottom: 1.5em; 34 | background: rgba($appColor, 0.1); 35 | border-radius: 3px; 36 | a { 37 | margin-left: 5px; 38 | } 39 | p { 40 | margin: 1em 0 0 0; 41 | } 42 | } 43 | // hover 44 | .ishover { 45 | transition: background 0.3s; 46 | &:hover { 47 | background: rgba(0, 0, 0, 0.025); 48 | } 49 | } 50 | // table 51 | .tablePage-container { 52 | display: flex; 53 | align-items: center; 54 | flex-wrap: wrap; 55 | margin-bottom: 20px; 56 | .left-item { 57 | margin-right: 10px; 58 | &:last-child { 59 | margin-right: 0; 60 | } 61 | } 62 | } 63 | // drag style 64 | .sortable-chosen { 65 | background-color: #f0f9eb !important; 66 | } 67 | .sortable-ghost { 68 | background-color: rgba($appColorRGB, 0.5) !important; 69 | } 70 | -------------------------------------------------------------------------------- /src/store/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Vuex from 'vuex' 3 | import cache from '@/utils/cache' 4 | import i18n from '@/language' 5 | import variables from '@/assets/css/index.styl' 6 | import { getList } from '@/api/list' 7 | 8 | Vue.use(Vuex) 9 | 10 | const state = { 11 | logs: [], 12 | sidebarStatus: cache.getCookie('sidebarStatus') !== 'false', 13 | language: cache.getCookie('language') || 'zh', 14 | theme: variables.appColor 15 | } 16 | const getters = { 17 | } 18 | const mutations = { 19 | SET_LOGS(state, error) { 20 | state.logs.unshift(error) 21 | }, 22 | SET_SIDEBAR_STATUS(state) { 23 | let status = !state.sidebarStatus 24 | state.sidebarStatus = status 25 | cache.setCookie('sidebarStatus', status) 26 | }, 27 | SET_LANGUAGE(state, lang) { 28 | state.language = lang 29 | i18n.locale = lang 30 | cache.setCookie('language', lang) 31 | }, 32 | SET_THEME(state, color) { 33 | state.theme = color 34 | } 35 | } 36 | const actions = { 37 | GET_LIST_DATA(state) { 38 | return getList() 39 | } 40 | } 41 | 42 | // 自动引入和注册modules下的文件 43 | const modulesFiles = require.context('./modules', false, /\.js$/) 44 | const modules = modulesFiles.keys().reduce((modules, modulePath) => { 45 | const moduleName = modulePath.replace(/^\.\/(.*)\.\w+$/, '$1') 46 | const value = modulesFiles(modulePath) 47 | modules[moduleName] = value.default 48 | return modules 49 | }, {}) 50 | 51 | export default new Vuex.Store({ 52 | state, 53 | getters, 54 | mutations, 55 | actions, 56 | modules 57 | }) 58 | -------------------------------------------------------------------------------- /src/assets/icons/svg/flex-right.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/pages/index/children/components-demo/editor.vue: -------------------------------------------------------------------------------- 1 | 14 | 26 | 56 | -------------------------------------------------------------------------------- /src/assets/css/theme-chalk/notification.css: -------------------------------------------------------------------------------- 1 | .el-notification{display:-webkit-box;display:-ms-flexbox;display:flex;width:330px;padding:14px 26px 14px 13px;border-radius:8px;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #ebeef5;position:fixed;background-color:#fff;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);-webkit-transition:opacity .3s,left .3s,right .3s,top .4s,bottom .3s,-webkit-transform .3s;transition:opacity .3s,left .3s,right .3s,top .4s,bottom .3s,-webkit-transform .3s;transition:opacity .3s,transform .3s,left .3s,right .3s,top .4s,bottom .3s;transition:opacity .3s,transform .3s,left .3s,right .3s,top .4s,bottom .3s,-webkit-transform .3s;overflow:hidden}.el-notification.right{right:16px}.el-notification.left{left:16px}.el-notification__group{margin-left:13px}.el-notification__title{font-weight:700;font-size:16px;color:#303133;margin:0}.el-notification__content{font-size:14px;line-height:21px;margin:6px 0 0;color:#606266;text-align:justify}.el-notification__content p{margin:0}.el-notification__icon{height:24px;width:24px;font-size:24px}.el-notification__closeBtn{position:absolute;top:18px;right:15px;cursor:pointer;color:#909399;font-size:16px}.el-notification__closeBtn:hover{color:#606266}.el-notification .el-icon-success{color:#67c23a}.el-notification .el-icon-error{color:#f56c6c}.el-notification .el-icon-info{color:#909399}.el-notification .el-icon-warning{color:#e6a23c}.el-notification-fade-enter.right{right:0;-webkit-transform:translateX(100%);transform:translateX(100%)}.el-notification-fade-enter.left{left:0;-webkit-transform:translateX(-100%);transform:translateX(-100%)}.el-notification-fade-leave-active{opacity:0} -------------------------------------------------------------------------------- /src/assets/css/theme-chalk/loading.css: -------------------------------------------------------------------------------- 1 | .el-loading-parent--relative{position:relative!important}.el-loading-parent--hidden{overflow:hidden!important}.el-loading-mask{position:absolute;z-index:2000;background-color:rgba(255,255,255,.9);margin:0;top:0;right:0;bottom:0;left:0;-webkit-transition:opacity .3s;transition:opacity .3s}.el-loading-mask.is-fullscreen{position:fixed}.el-loading-mask.is-fullscreen .el-loading-spinner{margin-top:-25px}.el-loading-mask.is-fullscreen .el-loading-spinner .circular{height:50px;width:50px}.el-loading-spinner{top:50%;margin-top:-21px;width:100%;text-align:center;position:absolute}.el-loading-spinner .el-loading-text{color:#42B983;margin:3px 0;font-size:14px}.el-loading-spinner .circular{height:42px;width:42px;-webkit-animation:loading-rotate 2s linear infinite;animation:loading-rotate 2s linear infinite}.el-loading-spinner .path{-webkit-animation:loading-dash 1.5s ease-in-out infinite;animation:loading-dash 1.5s ease-in-out infinite;stroke-dasharray:90,150;stroke-dashoffset:0;stroke-width:2;stroke:#42B983;stroke-linecap:round}.el-loading-spinner i{color:#42B983}.el-loading-fade-enter,.el-loading-fade-leave-active{opacity:0}@-webkit-keyframes loading-rotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes loading-rotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes loading-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-40px}100%{stroke-dasharray:90,150;stroke-dashoffset:-120px}}@keyframes loading-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-40px}100%{stroke-dasharray:90,150;stroke-dashoffset:-120px}} -------------------------------------------------------------------------------- /public/static/tinymce/plugins/visualblocks/plugin.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Tiny Technologies, Inc. All rights reserved. 3 | * Licensed under the LGPL or a commercial license. 4 | * For LGPL see License.txt in the project root for license information. 5 | * For commercial licenses see https://www.tiny.cloud/ 6 | * 7 | * Version: 5.0.1 (2019-02-21) 8 | */ 9 | !function(){"use strict";var e=function(t){var n=t,o=function(){return n};return{get:o,set:function(t){n=t},clone:function(){return e(o())}}},t=tinymce.util.Tools.resolve("tinymce.PluginManager"),i=function(t,n){t.fire("VisualBlocks",{state:n})},u=function(t,n,o){t.dom.toggleClass(t.getBody(),"mce-visualblocks"),o.set(!o.get()),i(t,o.get())},c=function(t,n,o){t.addCommand("mceVisualBlocks",function(){u(t,n,o)})},s=function(t){return t.getParam("visualblocks_default_state",!1,"boolean")},r=function(n,t,o){n.on("PreviewFormats AfterPreviewFormats",function(t){o.get()&&n.dom.toggleClass(n.getBody(),"mce-visualblocks","afterpreviewformats"===t.type)}),n.on("init",function(){s(n)&&u(n,t,o)}),n.on("remove",function(){n.dom.removeClass(n.getBody(),"mce-visualblocks")})},o=function(o,e){return function(n){n.setActive(e.get());var t=function(t){return n.setActive(t.state)};return o.on("VisualBlocks",t),function(){return o.off("VisualBlocks",t)}}},a=function(t,n){t.ui.registry.addToggleButton("visualblocks",{icon:"paragraph",tooltip:"Show blocks",onAction:function(){return t.execCommand("mceVisualBlocks")},onSetup:o(t,n)}),t.ui.registry.addToggleMenuItem("visualblocks",{text:"Show blocks",onAction:function(){return t.execCommand("mceVisualBlocks")},onSetup:o(t,n)})};t.add("visualblocks",function(t,n){var o=e(!1);c(t,n,o),a(t,o),r(t,n,o)}),function n(){}}(); -------------------------------------------------------------------------------- /src/assets/css/theme-chalk/switch.css: -------------------------------------------------------------------------------- 1 | .el-switch{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:relative;font-size:14px;line-height:20px;height:20px;vertical-align:middle}.el-switch.is-disabled .el-switch__core,.el-switch.is-disabled .el-switch__label{cursor:not-allowed}.el-switch__core,.el-switch__label{display:inline-block;cursor:pointer;vertical-align:middle}.el-switch__label{-webkit-transition:.2s;transition:.2s;height:20px;font-size:14px;font-weight:500;color:#303133}.el-switch__label.is-active{color:#42B983}.el-switch__label--left{margin-right:10px}.el-switch__label--right{margin-left:10px}.el-switch__label *{line-height:1;font-size:14px;display:inline-block}.el-switch__input{position:absolute;width:0;height:0;opacity:0;margin:0}.el-switch__core{margin:0;position:relative;width:40px;height:20px;border:1px solid #dcdfe6;outline:0;border-radius:10px;-webkit-box-sizing:border-box;box-sizing:border-box;background:#dcdfe6;-webkit-transition:border-color .3s,background-color .3s;transition:border-color .3s,background-color .3s}.el-switch__core:after{content:"";position:absolute;top:1px;left:1px;border-radius:100%;-webkit-transition:all .3s;transition:all .3s;width:16px;height:16px;background-color:#fff}.el-switch.is-checked .el-switch__core{border-color:#42B983;background-color:#42B983}.el-switch.is-checked .el-switch__core::after{left:100%;margin-left:-17px}.el-switch.is-disabled{opacity:.6}.el-switch--wide .el-switch__label.el-switch__label--left span{left:10px}.el-switch--wide .el-switch__label.el-switch__label--right span{right:10px}.el-switch .label-fade-enter,.el-switch .label-fade-leave-active{opacity:0} -------------------------------------------------------------------------------- /src/components/Loading/index.vue: -------------------------------------------------------------------------------- 1 | 20 | 40 | 61 | -------------------------------------------------------------------------------- /src/pages/index/index.vue: -------------------------------------------------------------------------------- 1 | 17 | 30 | 59 | -------------------------------------------------------------------------------- /src/pages/index/children/components-demo/sticky.vue: -------------------------------------------------------------------------------- 1 | 34 | 44 | 51 | -------------------------------------------------------------------------------- /src/pages/index/children/components-demo/loading.vue: -------------------------------------------------------------------------------- 1 | 13 | 47 | 54 | -------------------------------------------------------------------------------- /src/assets/icons/svg/link.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/icons/svg/move.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/static/tinymce/plugins/noneditable/plugin.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Tiny Technologies, Inc. All rights reserved. 3 | * Licensed under the LGPL or a commercial license. 4 | * For LGPL see License.txt in the project root for license information. 5 | * For commercial licenses see https://www.tiny.cloud/ 6 | * 7 | * Version: 5.0.1 (2019-02-21) 8 | */ 9 | !function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager"),c=tinymce.util.Tools.resolve("tinymce.util.Tools"),l=function(t){return t.getParam("noneditable_noneditable_class","mceNonEditable")},u=function(t){return t.getParam("noneditable_editable_class","mceEditable")},f=function(t){var n=t.getParam("noneditable_regexp",[]);return n&&n.constructor===RegExp?[n]:n},s=function(n){return function(t){return-1!==(" "+t.attr("class")+" ").indexOf(n)}},d=function(i,o,c){return function(t){var n=arguments,e=n[n.length-2],r=0"===r){var a=o.lastIndexOf("<",e);if(-1!==a&&-1!==o.substring(a,e).indexOf('contenteditable="false"'))return t}return''+i.dom.encode("string"==typeof n[1]?n[1]:n[0])+""}},n=function(n){var t,e,r="contenteditable";t=" "+c.trim(u(n))+" ",e=" "+c.trim(l(n))+" ";var a=s(t),i=s(e),o=f(n);n.on("PreInit",function(){0'},o=function(o){var c=a(o),n=new RegExp(c.replace(/[\?\.\*\[\]\(\)\{\}\+\^\$\:]/g,function(e){return"\\"+e}),"gi");o.on("BeforeSetContent",function(e){e.content=e.content.replace(n,r())}),o.on("PreInit",function(){o.serializer.addNodeFilter("img",function(e){for(var n,a,t=e.length;t--;)if((a=(n=e[t]).attr("class"))&&-1!==a.indexOf("mce-pagebreak")){var r=n.parent;if(o.schema.getBlockElements()[r.name]&&i(o)){r.type=3,r.value=c,r.raw=!0,n.remove();continue}n.type=3,n.value=c,n.raw=!0}})})},c=r,u=t,g=function(e){e.addCommand("mcePageBreak",function(){e.settings.pagebreak_split_block?e.insertContent("

"+c()+"

"):e.insertContent(c())})},m=function(n){n.on("ResolveName",function(e){"IMG"===e.target.nodeName&&n.dom.hasClass(e.target,u())&&(e.name="pagebreak")})},s=function(e){e.ui.registry.addButton("pagebreak",{icon:"page-break",tooltip:"Page break",onAction:function(){return e.execCommand("mcePageBreak")}}),e.ui.registry.addMenuItem("pagebreak",{text:"Page break",icon:"page-break",onAction:function(){return e.execCommand("mcePageBreak")}})};e.add("pagebreak",function(e){g(e),s(e),o(e),m(e)}),function l(){}}(); -------------------------------------------------------------------------------- /src/assets/css/theme-chalk/progress.css: -------------------------------------------------------------------------------- 1 | .el-progress{position:relative;line-height:1}.el-progress__text{font-size:14px;color:#606266;display:inline-block;vertical-align:middle;margin-left:10px;line-height:1}.el-progress__text i{vertical-align:middle;display:block}.el-progress--circle{display:inline-block}.el-progress--circle .el-progress__text{position:absolute;top:50%;left:0;width:100%;text-align:center;margin:0;-webkit-transform:translate(0,-50%);transform:translate(0,-50%)}.el-progress--circle .el-progress__text i{vertical-align:middle;display:inline-block}.el-progress--without-text .el-progress__text{display:none}.el-progress--without-text .el-progress-bar{padding-right:0;margin-right:0;display:block}.el-progress-bar,.el-progress-bar__inner::after,.el-progress-bar__innerText{display:inline-block;vertical-align:middle}.el-progress--text-inside .el-progress-bar{padding-right:0;margin-right:0}.el-progress.is-success .el-progress-bar__inner{background-color:#67c23a}.el-progress.is-success .el-progress__text{color:#67c23a}.el-progress.is-exception .el-progress-bar__inner{background-color:#f56c6c}.el-progress.is-exception .el-progress__text{color:#f56c6c}.el-progress-bar{padding-right:50px;width:100%;margin-right:-55px;-webkit-box-sizing:border-box;box-sizing:border-box}.el-progress-bar__outer{height:6px;border-radius:100px;background-color:#ebeef5;overflow:hidden;position:relative;vertical-align:middle}.el-progress-bar__inner{position:absolute;left:0;top:0;height:100%;background-color:#42B983;text-align:right;border-radius:100px;line-height:1;white-space:nowrap;-webkit-transition:width .6s ease;transition:width .6s ease}.el-progress-bar__inner::after{content:"";height:100%}.el-progress-bar__innerText{color:#fff;font-size:12px;margin:0 5px}@-webkit-keyframes progress{0%{background-position:0 0}100%{background-position:32px 0}}@keyframes progress{0%{background-position:0 0}100%{background-position:32px 0}} -------------------------------------------------------------------------------- /src/assets/css/theme-chalk/message.css: -------------------------------------------------------------------------------- 1 | .el-message__closeBtn:focus,.el-message__content:focus{outline-width:0}.el-message{min-width:380px;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:4px;border-width:1px;border-style:solid;border-color:#ebeef5;position:fixed;left:50%;top:20px;-webkit-transform:translateX(-50%);transform:translateX(-50%);background-color:#edf2fc;-webkit-transition:opacity .3s,-webkit-transform .4s;transition:opacity .3s,-webkit-transform .4s;transition:opacity .3s,transform .4s;transition:opacity .3s,transform .4s,-webkit-transform .4s;overflow:hidden;padding:15px 15px 15px 20px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-message.is-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.el-message.is-closable .el-message__content{padding-right:16px}.el-message p{margin:0}.el-message--info .el-message__content{color:#909399}.el-message--success{background-color:#f0f9eb;border-color:#e1f3d8}.el-message--success .el-message__content{color:#67c23a}.el-message--warning{background-color:#fdf6ec;border-color:#faecd8}.el-message--warning .el-message__content{color:#e6a23c}.el-message--error{background-color:#fef0f0;border-color:#fde2e2}.el-message--error .el-message__content{color:#f56c6c}.el-message__icon{margin-right:10px}.el-message__content{padding:0;font-size:14px;line-height:1}.el-message__closeBtn{position:absolute;top:50%;right:15px;-webkit-transform:translateY(-50%);transform:translateY(-50%);cursor:pointer;color:#c0c4cc;font-size:16px}.el-message__closeBtn:hover{color:#909399}.el-message .el-icon-success{color:#67c23a}.el-message .el-icon-error{color:#f56c6c}.el-message .el-icon-info{color:#909399}.el-message .el-icon-warning{color:#e6a23c}.el-message-fade-enter,.el-message-fade-leave-active{opacity:0;-webkit-transform:translate(-50%,-100%);transform:translate(-50%,-100%)} -------------------------------------------------------------------------------- /public/static/tinymce/plugins/save/plugin.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Tiny Technologies, Inc. All rights reserved. 3 | * Licensed under the LGPL or a commercial license. 4 | * For LGPL see License.txt in the project root for license information. 5 | * For commercial licenses see https://www.tiny.cloud/ 6 | * 7 | * Version: 5.0.1 (2019-02-21) 8 | */ 9 | !function(){"use strict";var n=tinymce.util.Tools.resolve("tinymce.PluginManager"),t=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),o=tinymce.util.Tools.resolve("tinymce.util.Tools"),a=function(n){return n.getParam("save_enablewhendirty",!0)},i=function(n){return!!n.getParam("save_onsavecallback")},c=function(n){return!!n.getParam("save_oncancelcallback")},r=function(n,e){n.notificationManager.open({text:e,type:"error"})},e=function(n){var e;if(e=t.DOM.getParent(n.id,"form"),!a(n)||n.isDirty()){if(n.save(),i(n))return n.execCallback("save_onsavecallback",n),void n.nodeChanged();e?(n.setDirty(!1),e.onsubmit&&!e.onsubmit()||("function"==typeof e.submit?e.submit():r(n,"Error: Form submit field collision.")),n.nodeChanged()):r(n,"Error: No form element found.")}},u=function(n){var e=o.trim(n.startContent);c(n)?n.execCallback("save_oncancelcallback",n):(n.setContent(e),n.undoManager.clear(),n.nodeChanged())},l=function(n){n.addCommand("mceSave",function(){e(n)}),n.addCommand("mceCancel",function(){u(n)})},d=function(t){return function(n){var e=function(){n.setDisabled(a(t)&&!t.isDirty())};return t.on("nodeChange dirty",e),function(){return t.off("nodeChange dirty",e)}}},s=function(n){n.ui.registry.addButton("save",{icon:"save",tooltip:"Save",disabled:!0,onAction:function(){return n.execCommand("mceSave")},onSetup:d(n)}),n.ui.registry.addButton("cancel",{icon:"cancel",tooltip:"Cancel",disabled:!0,onAction:function(){return n.execCommand("mceCancel")},onSetup:d(n)}),n.addShortcut("Meta+S","","mceSave")};n.add("save",function(n){s(n),l(n)}),function m(){}}(); -------------------------------------------------------------------------------- /src/components/GithubCorner/index.vue: -------------------------------------------------------------------------------- 1 | 11 | 35 | -------------------------------------------------------------------------------- /public/static/tinymce/plugins/tabfocus/plugin.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Tiny Technologies, Inc. All rights reserved. 3 | * Licensed under the LGPL or a commercial license. 4 | * For LGPL see License.txt in the project root for license information. 5 | * For commercial licenses see https://www.tiny.cloud/ 6 | * 7 | * Version: 5.0.1 (2019-02-21) 8 | */ 9 | !function(c){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),t=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),s=tinymce.util.Tools.resolve("tinymce.EditorManager"),a=tinymce.util.Tools.resolve("tinymce.Env"),y=tinymce.util.Tools.resolve("tinymce.util.Delay"),f=tinymce.util.Tools.resolve("tinymce.util.Tools"),d=tinymce.util.Tools.resolve("tinymce.util.VK"),m=function(e){return e.getParam("tab_focus",e.getParam("tabfocus_elements",":prev,:next"))},v=t.DOM,n=function(e){e.keyCode!==d.TAB||e.ctrlKey||e.altKey||e.metaKey||e.preventDefault()},i=function(r){function e(n){var i,o,e,l;if(!(n.keyCode!==d.TAB||n.ctrlKey||n.altKey||n.metaKey||n.isDefaultPrevented())&&(1===(e=f.explode(m(r))).length&&(e[1]=e[0],e[0]=":prev"),o=n.shiftKey?":prev"===e[0]?u(-1):v.get(e[0]):":next"===e[1]?u(1):v.get(e[1]))){var t=s.get(o.id||o.name);o.id&&t?t.focus():y.setTimeout(function(){a.webkit||c.window.focus(),o.focus()},10),n.preventDefault()}function u(e){function t(e){return/INPUT|TEXTAREA|BUTTON/.test(e.tagName)&&s.get(n.id)&&-1!==e.tabIndex&&function t(e){return"BODY"===e.nodeName||"hidden"!==e.type&&"none"!==e.style.display&&"hidden"!==e.style.visibility&&t(e.parentNode)}(e)}if(o=v.select(":input:enabled,*[tabindex]:not(iframe)"),f.each(o,function(e,t){if(e.id===r.id)return i=t,!1}),0',e&&(n+='"),c.each(t.contentCSS,function(e){n+=''});var o=t.settings.body_id||"tinymce";-1!==o.indexOf("=")&&(o=(o=t.getParam("body_id","","hash"))[t.id]||o);var r=t.settings.body_class||"";-1!==r.indexOf("=")&&(r=(r=t.getParam("body_class","","hash"))[t.id]||"");var a=t.settings.directionality?' dir="'+t.settings.directionality+'"':"";return""+n+'"+t.getContent()+' 49 | -------------------------------------------------------------------------------- /src/layout/NavBar/UserSelect/infoDialog.vue: -------------------------------------------------------------------------------- 1 | 17 | 58 | -------------------------------------------------------------------------------- /src/assets/css/theme-chalk/popover.css: -------------------------------------------------------------------------------- 1 | .el-popper .popper__arrow,.el-popper .popper__arrow::after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.el-popper .popper__arrow{border-width:6px;-webkit-filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03));filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03))}.el-popper .popper__arrow::after{content:" ";border-width:6px}.el-popper[x-placement^=top]{margin-bottom:12px}.el-popper[x-placement^=top] .popper__arrow{bottom:-6px;left:50%;margin-right:3px;border-top-color:#ebeef5;border-bottom-width:0}.el-popper[x-placement^=top] .popper__arrow::after{bottom:1px;margin-left:-6px;border-top-color:#fff;border-bottom-width:0}.el-popper[x-placement^=bottom]{margin-top:12px}.el-popper[x-placement^=bottom] .popper__arrow{top:-6px;left:50%;margin-right:3px;border-top-width:0;border-bottom-color:#ebeef5}.el-popper[x-placement^=bottom] .popper__arrow::after{top:1px;margin-left:-6px;border-top-width:0;border-bottom-color:#fff}.el-popper[x-placement^=right]{margin-left:12px}.el-popper[x-placement^=right] .popper__arrow{top:50%;left:-6px;margin-bottom:3px;border-right-color:#ebeef5;border-left-width:0}.el-popper[x-placement^=right] .popper__arrow::after{bottom:-6px;left:1px;border-right-color:#fff;border-left-width:0}.el-popper[x-placement^=left]{margin-right:12px}.el-popper[x-placement^=left] .popper__arrow{top:50%;right:-6px;margin-bottom:3px;border-right-width:0;border-left-color:#ebeef5}.el-popper[x-placement^=left] .popper__arrow::after{right:1px;bottom:-6px;margin-left:-6px;border-right-width:0;border-left-color:#fff}.el-popover{position:absolute;background:#fff;min-width:150px;border-radius:4px;border:1px solid #ebeef5;padding:12px;z-index:2000;color:#606266;line-height:1.4;text-align:justify;font-size:14px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-popover--plain{padding:18px 20px}.el-popover__title{color:#303133;font-size:16px;line-height:1;margin-bottom:12px}.el-popover:focus,.el-popover:focus:active,.el-popover__reference:focus:hover,.el-popover__reference:focus:not(.focusing){outline-width:0} -------------------------------------------------------------------------------- /src/assets/icons/svg/qq.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/static/tinymce/plugins/anchor/plugin.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Tiny Technologies, Inc. All rights reserved. 3 | * Licensed under the LGPL or a commercial license. 4 | * For LGPL see License.txt in the project root for license information. 5 | * For commercial licenses see https://www.tiny.cloud/ 6 | * 7 | * Version: 5.0.1 (2019-02-21) 8 | */ 9 | !function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),a=function(e){return/^[A-Za-z][A-Za-z0-9\-:._]*$/.test(e)},t=function(e){var t=e.selection.getNode();return"A"===t.tagName&&""===e.dom.getAttrib(t,"href")?t.getAttribute("id")||t.getAttribute("name"):""},r=function(e,t){var n=e.selection.getNode();"A"===n.tagName&&""===e.dom.getAttrib(n,"href")?(n.removeAttribute("name"),n.id=t,e.undoManager.add()):(e.focus(),e.selection.collapse(!0),e.execCommand("mceInsertContent",!1,e.dom.createHTML("a",{id:t})))},n=function(o){var e=t(o);o.windowManager.open({title:"Anchor",size:"normal",body:{type:"panel",items:[{name:"id",type:"input",label:"ID",placeholder:"example"}]},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:{id:e},onSubmit:function(e){var t,n;t=o,n=e.getData().id,(a(n)?(r(t,n),0):(t.windowManager.alert("Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores."),1))||e.close()}})},o=function(e){e.addCommand("mceAnchor",function(){n(e)})},i=function(o){return function(e){for(var t=0;t -------------------------------------------------------------------------------- /src/assets/icons/svg/global.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/components/Base/ErrorLog/index.vue: -------------------------------------------------------------------------------- 1 | 40 | 55 | -------------------------------------------------------------------------------- /public/static/tinymce/plugins/autoresize/plugin.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Tiny Technologies, Inc. All rights reserved. 3 | * Licensed under the LGPL or a commercial license. 4 | * For LGPL see License.txt in the project root for license information. 5 | * For commercial licenses see https://www.tiny.cloud/ 6 | * 7 | * Version: 5.0.1 (2019-02-21) 8 | */ 9 | !function(){"use strict";var i=function(e){var t=e,n=function(){return t};return{get:n,set:function(e){t=e},clone:function(){return i(n())}}},e=tinymce.util.Tools.resolve("tinymce.PluginManager"),m=tinymce.util.Tools.resolve("tinymce.Env"),r=tinymce.util.Tools.resolve("tinymce.util.Delay"),d=function(e){return e.getParam("min_height",e.getElement().offsetHeight,"number")},h=function(e){return e.getParam("max_height",0,"number")},o=function(e){return e.getParam("autoresize_overflow_padding",1,"number")},u=function(e){return e.getParam("autoresize_bottom_margin",50,"number")},a=function(e){return e.getParam("autoresize_on_init",!0,"boolean")},s=function(e,t,n,i,o){r.setEditorTimeout(e,function(){p(e,t),n--?s(e,t,n,i,o):o&&o()},i)},v=function(e,t){var n=e.getBody();n&&(n.style.overflowY=t?"":"hidden",t||(n.scrollTop=0))},y=function(e,t,n,i){var o=parseInt(e.getStyle(t,n,i),10);return isNaN(o)?0:o},p=function(e,t){var n,i,o,r=e.dom,u=e.getDoc();if(u)if((a=e).plugins.fullscreen&&a.plugins.fullscreen.isFullscreen())v(e,!0);else{var a,s=u.body;i=d(e);var c=y(r,s,"margin-top",!0),f=y(r,s,"margin-bottom",!0);(o=s.offsetHeight+c+f)<0&&(o=0);var g=e.getContainer().offsetHeight-e.getContentAreaContainer().offsetHeight;o+g>d(e)&&(i=o+g);var l=h(e);l&&l 2 | 22 | 23 | 43 | 76 | -------------------------------------------------------------------------------- /src/assets/css/theme-chalk/radio-button.css: -------------------------------------------------------------------------------- 1 | @charset "UTF-8";.el-radio-button,.el-radio-button__inner{display:inline-block;position:relative;outline:0}.el-radio-button__inner{line-height:1;white-space:nowrap;vertical-align:middle;background:#fff;border:1px solid #dcdfe6;font-weight:500;border-left:0;color:#606266;-webkit-appearance:none;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;cursor:pointer;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);padding:12px 20px;font-size:14px;border-radius:0}.el-radio-button__inner.is-round{padding:12px 20px}.el-radio-button__inner:hover{color:#42B983}.el-radio-button__inner [class*=el-icon-]{line-height:.9}.el-radio-button__inner [class*=el-icon-]+span{margin-left:5px}.el-radio-button:first-child .el-radio-button__inner{border-left:1px solid #dcdfe6;border-radius:4px 0 0 4px;-webkit-box-shadow:none!important;box-shadow:none!important}.el-radio-button__orig-radio{opacity:0;outline:0;position:absolute;z-index:-1}.el-radio-button__orig-radio:checked+.el-radio-button__inner{color:#fff;background-color:#42B983;border-color:#42B983;-webkit-box-shadow:-1px 0 0 0 #42B983;box-shadow:-1px 0 0 0 #42B983}.el-radio-button__orig-radio:disabled+.el-radio-button__inner{color:#c0c4cc;cursor:not-allowed;background-image:none;background-color:#fff;border-color:#ebeef5;-webkit-box-shadow:none;box-shadow:none}.el-radio-button__orig-radio:disabled:checked+.el-radio-button__inner{background-color:#f2f6fc}.el-radio-button:last-child .el-radio-button__inner{border-radius:0 4px 4px 0}.el-radio-button:first-child:last-child .el-radio-button__inner{border-radius:4px}.el-radio-button--medium .el-radio-button__inner{padding:10px 20px;font-size:14px;border-radius:0}.el-radio-button--medium .el-radio-button__inner.is-round{padding:10px 20px}.el-radio-button--small .el-radio-button__inner{padding:9px 15px;font-size:12px;border-radius:0}.el-radio-button--small .el-radio-button__inner.is-round{padding:9px 15px}.el-radio-button--mini .el-radio-button__inner{padding:7px 15px;font-size:12px;border-radius:0}.el-radio-button--mini .el-radio-button__inner.is-round{padding:7px 15px}.el-radio-button:focus:not(.is-focus):not(:active):not(.is-disabled){-webkit-box-shadow:0 0 2px 2px #42B983;box-shadow:0 0 2px 2px #42B983} -------------------------------------------------------------------------------- /src/utils/request.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios' 2 | import { Message } from 'element-ui' 3 | import cache from '@/utils/cache' 4 | 5 | export const instance = axios.create({ 6 | baseURL: process.env.VUE_APP_BASE_API, 7 | timeout: 20 * 1000 8 | }) 9 | 10 | // request 11 | instance.interceptors.request.use(config => { 12 | if (cache.getToken()) { 13 | config.headers['Authorization'] = `Bearer ${cache.getToken()}` 14 | } 15 | return config 16 | }, error => { 17 | Promise.reject(error) 18 | }) 19 | 20 | // response 21 | instance.interceptors.response.use(response => { 22 | const res = response.data 23 | // 自定义报错规则 24 | if (res && res.errorMessage) { 25 | return Promise.reject(res.errorMessage) 26 | } 27 | return Promise.resolve(res) 28 | }, error => { 29 | // 请求直接报错 30 | Message({ 31 | message: error.message, 32 | type: 'error', 33 | duration: 3 * 1000 34 | }) 35 | return Promise.reject(error) 36 | }) 37 | 38 | /** 39 | * @param {String} url 请求链接 40 | * @param {String} type http方法 41 | * @param {Object} data 数据 42 | * @param {Boolean} isForm 是否表单格式 43 | * @returns {Promise} 44 | */ 45 | export const request = async (url = '', type = 'GET', data = {}, isForm = false) => { 46 | let result 47 | type = type.toUpperCase() 48 | let requestOptions = { 49 | method: type, 50 | url: url 51 | } 52 | if (isForm) { 53 | let form = new FormData() 54 | Object.keys(data).forEach(key => { 55 | let value = data[key] 56 | if (Array.isArray(value)) { 57 | value.forEach(item => { 58 | form.append(key, item) 59 | }) 60 | } else { 61 | form.append(key, data[key]) 62 | } 63 | }) 64 | data = form 65 | } 66 | requestOptions['headers'] = { 67 | 'Content-type': isForm ? 'multipart/form-data' : 'application/json' 68 | } 69 | if (type === 'GET') { 70 | requestOptions['params'] = data 71 | } else { 72 | requestOptions['data'] = data 73 | } 74 | await instance(requestOptions).then(res => { 75 | result = res 76 | }) 77 | return result 78 | } 79 | -------------------------------------------------------------------------------- /src/store/modules/login.js: -------------------------------------------------------------------------------- 1 | import { getLogin, getUser } from '@/api/login' 2 | import router, { resetRouter } from '@/router' 3 | import cache from '@/utils/cache' 4 | 5 | export default { 6 | namespaced: true, 7 | state: { 8 | user: '' 9 | }, 10 | mutations: { 11 | SET_USER(state, val) { 12 | state.user = val 13 | }, 14 | // 只做权限测试页使用 15 | SET_ROLE(state, val) { 16 | state.user.roles = val 17 | } 18 | }, 19 | actions: { 20 | // 获取登录数据 21 | async getLoginToken({ commit }, params) { 22 | return new Promise((resolve, reject) => { 23 | getLogin(params).then(res => { 24 | // console.log('login', res) 25 | if (res && res.token) { 26 | cache.setToken(res.token) 27 | resolve(res) 28 | } else { 29 | reject(new Error('nothing login data')) 30 | } 31 | }).catch(err => { 32 | reject(err) 33 | }) 34 | }) 35 | }, 36 | // 获取用户数据 37 | async getUserData({ commit }) { 38 | return new Promise((resolve, reject) => { 39 | let token = cache.getToken() 40 | getUser(token).then(res => { 41 | // console.log('user', res) 42 | if (res.data) { 43 | commit('SET_USER', res.data) 44 | resolve(res.data) 45 | } else { 46 | reject(new Error('nothing user data')) 47 | } 48 | }).catch(err => { 49 | reject(err) 50 | }) 51 | }) 52 | }, 53 | logout({ commit }) { 54 | return new Promise((resolve, reject) => { 55 | // 删除本地token 56 | cache.removeToken() 57 | // 重置路由 58 | resetRouter() 59 | // 删除用户信息 60 | commit('SET_USER', '') 61 | // 跳转到登录页 62 | router.push('/login') 63 | resolve() 64 | }) 65 | } 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /src/pages/index/children/icons/icons.vue: -------------------------------------------------------------------------------- 1 | 17 | 36 | 76 | -------------------------------------------------------------------------------- /src/layout/TagsView/scrollPane.vue: -------------------------------------------------------------------------------- 1 | 6 | 57 | -------------------------------------------------------------------------------- /src/pages/index/children/permission/permission.vue: -------------------------------------------------------------------------------- 1 | 37 | 59 | 66 | -------------------------------------------------------------------------------- /src/pages/index/children/dashboard/components/banner.vue: -------------------------------------------------------------------------------- 1 | 13 | 41 | 72 | -------------------------------------------------------------------------------- /src/assets/icons/svg/icons.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/static/tinymce/plugins/autolink/plugin.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Tiny Technologies, Inc. All rights reserved. 3 | * Licensed under the LGPL or a commercial license. 4 | * For LGPL see License.txt in the project root for license information. 5 | * For commercial licenses see https://www.tiny.cloud/ 6 | * 7 | * Version: 5.0.1 (2019-02-21) 8 | */ 9 | !function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),i=tinymce.util.Tools.resolve("tinymce.Env"),m=function(e){return e.getParam("autolink_pattern",/^(https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.|(?:mailto:)?[A-Z0-9._%+\-]+@)(.+)$/i)},y=function(e){return e.getParam("default_link_target","")},o=function(e,t){if(t<0&&(t=0),3===e.nodeType){var n=e.data.length;n 2 |
3 | 27 |
28 | 29 | 58 | 65 | --------------------------------------------------------------------------------