@@ -3,7 +3,7 @@ import Mock from 'mockjs'
 | 
			
		||||
const List = []
 | 
			
		||||
const count = 100
 | 
			
		||||
 | 
			
		||||
const baseContent = '<p>我是测试数据我是测试数据</p><p><img src="https://wpimg.wallstcn.com/4c69009c-0fd4-4153-b112-6cb53d1cf943"></p>'
 | 
			
		||||
const baseContent = '<p>I am testing data, I am testing data.</p><p><img src="https://wpimg.wallstcn.com/4c69009c-0fd4-4153-b112-6cb53d1cf943"></p>'
 | 
			
		||||
const image_uri = 'https://wpimg.wallstcn.com/e4558086-631c-425c-9430-56ffb46e70b3'
 | 
			
		||||
 | 
			
		||||
for (let i = 0; i < count; i++) {
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@ import { param2Obj } from '../src/utils'
 | 
			
		||||
import user from './user'
 | 
			
		||||
import role from './role'
 | 
			
		||||
import article from './article'
 | 
			
		||||
import search from './remoteSearch'
 | 
			
		||||
import search from './remote-search'
 | 
			
		||||
 | 
			
		||||
const mocks = [
 | 
			
		||||
  ...user,
 | 
			
		||||
 
 | 
			
		||||
@@ -19,17 +19,17 @@ export const constantRoutes = [
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    path: '/auth-redirect',
 | 
			
		||||
    component: 'views/login/authRedirect',
 | 
			
		||||
    component: 'views/login/auth-redirect',
 | 
			
		||||
    hidden: true
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    path: '/404',
 | 
			
		||||
    component: 'views/errorPage/404',
 | 
			
		||||
    component: 'views/error-page/404',
 | 
			
		||||
    hidden: true
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    path: '/401',
 | 
			
		||||
    component: 'views/errorPage/401',
 | 
			
		||||
    component: 'views/error-page/401',
 | 
			
		||||
    hidden: true
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
@@ -119,7 +119,7 @@ export const asyncRoutes = [
 | 
			
		||||
    children: [
 | 
			
		||||
      {
 | 
			
		||||
        path: 'index',
 | 
			
		||||
        component: 'views/svg-icons/index',
 | 
			
		||||
        component: 'views/icons/index',
 | 
			
		||||
        name: 'Icons',
 | 
			
		||||
        meta: { title: 'icons', icon: 'icon', noCache: true }
 | 
			
		||||
      }
 | 
			
		||||
@@ -129,7 +129,7 @@ export const asyncRoutes = [
 | 
			
		||||
  {
 | 
			
		||||
    path: '/components',
 | 
			
		||||
    component: 'layout/Layout',
 | 
			
		||||
    redirect: 'noredirect',
 | 
			
		||||
    redirect: 'noRedirect',
 | 
			
		||||
    name: 'ComponentDemo',
 | 
			
		||||
    meta: {
 | 
			
		||||
      title: 'components',
 | 
			
		||||
@@ -150,19 +150,19 @@ export const asyncRoutes = [
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        path: 'json-editor',
 | 
			
		||||
        component: 'views/components-demo/jsonEditor',
 | 
			
		||||
        component: 'views/components-demo/json-editor',
 | 
			
		||||
        name: 'JsonEditorDemo',
 | 
			
		||||
        meta: { title: 'jsonEditor' }
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        path: 'splitpane',
 | 
			
		||||
        component: 'views/components-demo/splitpane',
 | 
			
		||||
        path: 'split-pane',
 | 
			
		||||
        component: 'views/components-demo/split-pane',
 | 
			
		||||
        name: 'SplitpaneDemo',
 | 
			
		||||
        meta: { title: 'splitPane' }
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        path: 'avatar-upload',
 | 
			
		||||
        component: 'views/components-demo/avatarUpload',
 | 
			
		||||
        component: 'views/components-demo/avatar-upload',
 | 
			
		||||
        name: 'AvatarUploadDemo',
 | 
			
		||||
        meta: { title: 'avatarUpload' }
 | 
			
		||||
      },
 | 
			
		||||
@@ -180,7 +180,7 @@ export const asyncRoutes = [
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        path: 'count-to',
 | 
			
		||||
        component: 'views/components-demo/countTo',
 | 
			
		||||
        component: 'views/components-demo/count-to',
 | 
			
		||||
        name: 'CountToDemo',
 | 
			
		||||
        meta: { title: 'countTo' }
 | 
			
		||||
      },
 | 
			
		||||
@@ -192,31 +192,31 @@ export const asyncRoutes = [
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        path: 'back-to-top',
 | 
			
		||||
        component: 'views/components-demo/backToTop',
 | 
			
		||||
        component: 'views/components-demo/back-to-top',
 | 
			
		||||
        name: 'BackToTopDemo',
 | 
			
		||||
        meta: { title: 'backToTop' }
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        path: 'drag-dialog',
 | 
			
		||||
        component: 'views/components-demo/dragDialog',
 | 
			
		||||
        component: 'views/components-demo/drag-dialog',
 | 
			
		||||
        name: 'DragDialogDemo',
 | 
			
		||||
        meta: { title: 'dragDialog' }
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        path: 'drag-select',
 | 
			
		||||
        component: 'views/components-demo/dragSelect',
 | 
			
		||||
        component: 'views/components-demo/drag-select',
 | 
			
		||||
        name: 'DragSelectDemo',
 | 
			
		||||
        meta: { title: 'dragSelect' }
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        path: 'dnd-list',
 | 
			
		||||
        component: 'views/components-demo/dndList',
 | 
			
		||||
        component: 'views/components-demo/dnd-list',
 | 
			
		||||
        name: 'DndListDemo',
 | 
			
		||||
        meta: { title: 'dndList' }
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        path: 'drag-kanban',
 | 
			
		||||
        component: 'views/components-demo/dragKanban',
 | 
			
		||||
        component: 'views/components-demo/drag-kanban',
 | 
			
		||||
        name: 'DragKanbanDemo',
 | 
			
		||||
        meta: { title: 'dragKanban' }
 | 
			
		||||
      }
 | 
			
		||||
@@ -225,7 +225,7 @@ export const asyncRoutes = [
 | 
			
		||||
  {
 | 
			
		||||
    path: '/charts',
 | 
			
		||||
    component: 'layout/Layout',
 | 
			
		||||
    redirect: 'noredirect',
 | 
			
		||||
    redirect: 'noRedirect',
 | 
			
		||||
    name: 'Charts',
 | 
			
		||||
    meta: {
 | 
			
		||||
      title: 'charts',
 | 
			
		||||
@@ -361,7 +361,7 @@ export const asyncRoutes = [
 | 
			
		||||
  {
 | 
			
		||||
    path: '/error',
 | 
			
		||||
    component: 'layout/Layout',
 | 
			
		||||
    redirect: 'noredirect',
 | 
			
		||||
    redirect: 'noRedirect',
 | 
			
		||||
    name: 'ErrorPages',
 | 
			
		||||
    meta: {
 | 
			
		||||
      title: 'errorPages',
 | 
			
		||||
@@ -370,13 +370,13 @@ export const asyncRoutes = [
 | 
			
		||||
    children: [
 | 
			
		||||
      {
 | 
			
		||||
        path: '401',
 | 
			
		||||
        component: 'views/errorPage/401',
 | 
			
		||||
        component: 'views/error-page/401',
 | 
			
		||||
        name: 'Page401',
 | 
			
		||||
        meta: { title: 'page401', noCache: true }
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        path: '404',
 | 
			
		||||
        component: 'views/errorPage/404',
 | 
			
		||||
        component: 'views/error-page/404',
 | 
			
		||||
        name: 'Page404',
 | 
			
		||||
        meta: { title: 'page404', noCache: true }
 | 
			
		||||
      }
 | 
			
		||||
@@ -386,11 +386,11 @@ export const asyncRoutes = [
 | 
			
		||||
  {
 | 
			
		||||
    path: '/error-log',
 | 
			
		||||
    component: 'layout/Layout',
 | 
			
		||||
    redirect: 'noredirect',
 | 
			
		||||
    redirect: 'noRedirect',
 | 
			
		||||
    children: [
 | 
			
		||||
      {
 | 
			
		||||
        path: 'log',
 | 
			
		||||
        component: 'views/errorLog/index',
 | 
			
		||||
        component: 'views/error-log/index',
 | 
			
		||||
        name: 'ErrorLog',
 | 
			
		||||
        meta: { title: 'errorLog', icon: 'bug' }
 | 
			
		||||
      }
 | 
			
		||||
@@ -409,25 +409,25 @@ export const asyncRoutes = [
 | 
			
		||||
    children: [
 | 
			
		||||
      {
 | 
			
		||||
        path: 'export-excel',
 | 
			
		||||
        component: 'views/excel/exportExcel',
 | 
			
		||||
        component: 'views/excel/export-excel',
 | 
			
		||||
        name: 'ExportExcel',
 | 
			
		||||
        meta: { title: 'exportExcel' }
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        path: 'export-selected-excel',
 | 
			
		||||
        component: 'views/excel/selectExcel',
 | 
			
		||||
        component: 'views/excel/select-excel',
 | 
			
		||||
        name: 'SelectExcel',
 | 
			
		||||
        meta: { title: 'selectExcel' }
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        path: 'export-merge-header',
 | 
			
		||||
        component: 'views/excel/mergeHeader',
 | 
			
		||||
        component: 'views/excel/merge-header',
 | 
			
		||||
        name: 'MergeHeader',
 | 
			
		||||
        meta: { title: 'mergeHeader' }
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        path: 'upload-excel',
 | 
			
		||||
        component: 'views/excel/uploadExcel',
 | 
			
		||||
        component: 'views/excel/upload-excel',
 | 
			
		||||
        name: 'UploadExcel',
 | 
			
		||||
        meta: { title: 'uploadExcel' }
 | 
			
		||||
      }
 | 
			
		||||
@@ -472,7 +472,7 @@ export const asyncRoutes = [
 | 
			
		||||
  {
 | 
			
		||||
    path: '/theme',
 | 
			
		||||
    component: 'layout/Layout',
 | 
			
		||||
    redirect: 'noredirect',
 | 
			
		||||
    redirect: 'noRedirect',
 | 
			
		||||
    children: [
 | 
			
		||||
      {
 | 
			
		||||
        path: 'index',
 | 
			
		||||
@@ -486,7 +486,7 @@ export const asyncRoutes = [
 | 
			
		||||
  {
 | 
			
		||||
    path: '/clipboard',
 | 
			
		||||
    component: 'layout/Layout',
 | 
			
		||||
    redirect: 'noredirect',
 | 
			
		||||
    redirect: 'noRedirect',
 | 
			
		||||
    children: [
 | 
			
		||||
      {
 | 
			
		||||
        path: 'index',
 | 
			
		||||
 
 | 
			
		||||
@@ -1,12 +1,7 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <transition :name="transitionName">
 | 
			
		||||
    <div v-show="visible" :style="customStyle" class="back-to-ceiling" @click="backToTop">
 | 
			
		||||
      <svg width="16" height="16" viewBox="0 0 17 17" xmlns="http://www.w3.org/2000/svg" class="Icon Icon--backToTopArrow" aria-hidden="true" style="height: 16px; width: 16px;">
 | 
			
		||||
        <title>回到顶部</title>
 | 
			
		||||
        <g>
 | 
			
		||||
          <path d="M12.036 15.59c0 .55-.453.995-.997.995H5.032c-.55 0-.997-.445-.997-.996V8.584H1.03c-1.1 0-1.36-.633-.578-1.416L7.33.29c.39-.39 1.026-.385 1.412 0l6.878 6.88c.782.78.523 1.415-.58 1.415h-3.004v7.004z" fill-rule="evenodd" />
 | 
			
		||||
        </g>
 | 
			
		||||
      </svg>
 | 
			
		||||
      <svg width="16" height="16" viewBox="0 0 17 17" xmlns="http://www.w3.org/2000/svg" class="Icon Icon--backToTopArrow" aria-hidden="true" style="height:16px;width:16px"><path d="M12.036 15.59a1 1 0 0 1-.997.995H5.032a.996.996 0 0 1-.997-.996V8.584H1.03c-1.1 0-1.36-.633-.578-1.416L7.33.29a1.003 1.003 0 0 1 1.412 0l6.878 6.88c.782.78.523 1.415-.58 1.415h-3.004v7.004z" /></svg>
 | 
			
		||||
    </div>
 | 
			
		||||
  </transition>
 | 
			
		||||
</template>
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
  <el-breadcrumb class="app-breadcrumb" separator="/">
 | 
			
		||||
    <transition-group name="breadcrumb">
 | 
			
		||||
      <el-breadcrumb-item v-for="(item,index) in levelList" :key="item.path">
 | 
			
		||||
        <span v-if="item.redirect==='noredirect'||index==levelList.length-1" class="no-redirect">{{
 | 
			
		||||
        <span v-if="item.redirect==='noRedirect'||index==levelList.length-1" class="no-redirect">{{
 | 
			
		||||
          generateTitle(item.meta.title) }}</span>
 | 
			
		||||
        <a v-else @click.prevent="handleLink(item)">{{ generateTitle(item.meta.title) }}</a>
 | 
			
		||||
      </el-breadcrumb-item>
 | 
			
		||||
@@ -31,15 +31,23 @@ export default {
 | 
			
		||||
  methods: {
 | 
			
		||||
    generateTitle,
 | 
			
		||||
    getBreadcrumb() {
 | 
			
		||||
      let matched = this.$route.matched.filter(item => item.name)
 | 
			
		||||
 | 
			
		||||
      // only show routes with meta.title
 | 
			
		||||
      let matched = this.$route.matched.filter(item => item.meta && item.meta.title)
 | 
			
		||||
      const first = matched[0]
 | 
			
		||||
      if (first && first.name.trim().toLocaleLowerCase() !== 'Dashboard'.toLocaleLowerCase()) {
 | 
			
		||||
 | 
			
		||||
      if (!this.isDashboard(first)) {
 | 
			
		||||
        matched = [{ path: '/dashboard', meta: { title: 'dashboard' }}].concat(matched)
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      this.levelList = matched.filter(item => item.meta && item.meta.title && item.meta.breadcrumb !== false)
 | 
			
		||||
    },
 | 
			
		||||
    isDashboard(route) {
 | 
			
		||||
      const name = route && route.name
 | 
			
		||||
      if (!name) {
 | 
			
		||||
        return false
 | 
			
		||||
      }
 | 
			
		||||
      return name.trim().toLocaleLowerCase() === 'Dashboard'.toLocaleLowerCase()
 | 
			
		||||
    },
 | 
			
		||||
    pathCompile(path) {
 | 
			
		||||
      // To solve this problem https://github.com/PanJiaChen/vue-element-admin/issues/561
 | 
			
		||||
      const { params } = this.$route
 | 
			
		||||
 
 | 
			
		||||
@@ -121,7 +121,7 @@ export default {
 | 
			
		||||
 | 
			
		||||
          data.title = [...data.title, i18ntitle]
 | 
			
		||||
 | 
			
		||||
          if (router.redirect !== 'noredirect') {
 | 
			
		||||
          if (router.redirect !== 'noRedirect') {
 | 
			
		||||
            // only push the routes with title
 | 
			
		||||
            // special case: need to exclude parent router without redirect
 | 
			
		||||
            res.push(data)
 | 
			
		||||
 
 | 
			
		||||
@@ -25,8 +25,8 @@ export default {
 | 
			
		||||
  },
 | 
			
		||||
  watch: {
 | 
			
		||||
    value(value) {
 | 
			
		||||
      const editor_value = this.jsonEditor.getValue()
 | 
			
		||||
      if (value !== editor_value) {
 | 
			
		||||
      const editorValue = this.jsonEditor.getValue()
 | 
			
		||||
      if (value !== editorValue) {
 | 
			
		||||
        this.jsonEditor.setValue(JSON.stringify(this.value, null, 2))
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -15,6 +15,7 @@
 | 
			
		||||
    </draggable>
 | 
			
		||||
  </div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
import draggable from 'vuedraggable'
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,7 @@ import 'tui-editor/dist/tui-editor.css' // editor ui
 | 
			
		||||
import 'tui-editor/dist/tui-editor-contents.css' // editor content
 | 
			
		||||
 | 
			
		||||
import Editor from 'tui-editor'
 | 
			
		||||
import defaultOptions from './defaultOptions'
 | 
			
		||||
import defaultOptions from './default-options'
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  name: 'MarddownEditor',
 | 
			
		||||
 
 | 
			
		||||
@@ -15,7 +15,7 @@
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
import { scrollTo } from '@/utils/scrollTo'
 | 
			
		||||
import { scrollTo } from '@/utils/scroll-to'
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  name: 'Pagination',
 | 
			
		||||
 
 | 
			
		||||
@@ -8,19 +8,28 @@
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
 | 
			
		||||
const version = require('element-ui/package.json').version // element-ui version from node_modules
 | 
			
		||||
const ORIGINAL_THEME = '#409EFF' // default color
 | 
			
		||||
import defaultSettings from '@/settings'
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  data() {
 | 
			
		||||
    return {
 | 
			
		||||
      chalk: '', // content of theme-chalk css
 | 
			
		||||
      theme: defaultSettings.theme
 | 
			
		||||
      theme: ''
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  computed: {
 | 
			
		||||
    defaultTheme() {
 | 
			
		||||
      return this.$store.state.settings.theme
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  watch: {
 | 
			
		||||
    defaultTheme: {
 | 
			
		||||
      handler: function(val, oldVal) {
 | 
			
		||||
        this.theme = val
 | 
			
		||||
      },
 | 
			
		||||
      immediate: true
 | 
			
		||||
    },
 | 
			
		||||
    async theme(val) {
 | 
			
		||||
      const oldVal = this.chalk ? this.theme : ORIGINAL_THEME
 | 
			
		||||
      if (typeof val !== 'string') return
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <div class="upload-container">
 | 
			
		||||
    <el-button :style="{background:color,borderColor:color}" icon="el-icon-upload" size="mini" type="primary" @click=" dialogVisible=true">
 | 
			
		||||
      上传图片
 | 
			
		||||
      upload
 | 
			
		||||
    </el-button>
 | 
			
		||||
    <el-dialog :visible.sync="dialogVisible">
 | 
			
		||||
      <el-upload
 | 
			
		||||
@@ -16,14 +16,14 @@
 | 
			
		||||
        list-type="picture-card"
 | 
			
		||||
      >
 | 
			
		||||
        <el-button size="small" type="primary">
 | 
			
		||||
          点击上传
 | 
			
		||||
          Click upload
 | 
			
		||||
        </el-button>
 | 
			
		||||
      </el-upload>
 | 
			
		||||
      <el-button @click="dialogVisible = false">
 | 
			
		||||
        取 消
 | 
			
		||||
        Cancel
 | 
			
		||||
      </el-button>
 | 
			
		||||
      <el-button type="primary" @click="handleSubmit">
 | 
			
		||||
        确 定
 | 
			
		||||
        Confirm
 | 
			
		||||
      </el-button>
 | 
			
		||||
    </el-dialog>
 | 
			
		||||
  </div>
 | 
			
		||||
@@ -54,7 +54,7 @@ export default {
 | 
			
		||||
    handleSubmit() {
 | 
			
		||||
      const arr = Object.keys(this.listObj).map(v => this.listObj[v])
 | 
			
		||||
      if (!this.checkAllSuccess()) {
 | 
			
		||||
        this.$message('请等待所有图片上传成功 或 出现了网络问题,请刷新页面重新上传!')
 | 
			
		||||
        this.$message('Please wait for all images to be uploaded successfully. If there is a network problem, please refresh the page and upload again!')
 | 
			
		||||
        return
 | 
			
		||||
      }
 | 
			
		||||
      this.$emit('successCBK', arr)
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
import editorImage from './components/editorImage'
 | 
			
		||||
import editorImage from './components/EditorImage'
 | 
			
		||||
import plugins from './plugins'
 | 
			
		||||
import toolbar from './toolbar'
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -26,7 +26,6 @@
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
// 预览效果见付费文章
 | 
			
		||||
import { getToken } from '@/api/qiniu'
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
@@ -1,11 +1,10 @@
 | 
			
		||||
 | 
			
		||||
import { addResizeListener, removeResizeListener } from 'element-ui/src/utils/resize-event'
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * How to use
 | 
			
		||||
 * <el-table height="100px" v-el-height-adaptive-table="{bottomOffset: 30}">...</el-table>
 | 
			
		||||
 * el-table height is must be set
 | 
			
		||||
 *  bottomOffset: 30(default)   // The height of the table from the bottom of the page.
 | 
			
		||||
 * bottomOffset: 30(default)   // The height of the table from the bottom of the page.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
const doResize = (el, binding, vnode) => {
 | 
			
		||||
@@ -30,13 +29,13 @@ export default {
 | 
			
		||||
    el.resizeListener = () => {
 | 
			
		||||
      doResize(el, binding, vnode)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    addResizeListener(el, el.resizeListener)
 | 
			
		||||
    // parameter 1 is must be "Element" type
 | 
			
		||||
    addResizeListener(window.document.body, el.resizeListener)
 | 
			
		||||
  },
 | 
			
		||||
  inserted(el, binding, vnode) {
 | 
			
		||||
    doResize(el, binding, vnode)
 | 
			
		||||
  },
 | 
			
		||||
  unbind(el) {
 | 
			
		||||
    removeResizeListener(el, el.resizeListener)
 | 
			
		||||
    removeResizeListener(window.document.body, el.resizeListener)
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,3 @@
 | 
			
		||||
 | 
			
		||||
import adaptive from './adaptive'
 | 
			
		||||
 | 
			
		||||
const install = function(Vue) {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,3 @@
 | 
			
		||||
 | 
			
		||||
import store from '@/store'
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
// set function parseTime,formatTime to filter
 | 
			
		||||
// import parseTime, formatTime and set to filter
 | 
			
		||||
export { parseTime, formatTime } from '@/utils'
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 
 | 
			
		||||
@@ -132,6 +132,9 @@ export default {
 | 
			
		||||
    cancel: 'Cancel',
 | 
			
		||||
    confirm: 'Confirm'
 | 
			
		||||
  },
 | 
			
		||||
  example: {
 | 
			
		||||
    warning: 'Creating and editing pages cannot be cached by keep-alive because keep-alive include does not currently support caching based on routes, so it is currently cached based on component name. If you want to achieve a similar caching effect, you can use a browser caching scheme such as localStorage. Or do not use keep-alive include to cache all pages directly. See details'
 | 
			
		||||
  },
 | 
			
		||||
  errorLog: {
 | 
			
		||||
    tips: 'Please click the bug icon in the upper right corner',
 | 
			
		||||
    description: 'Now the management system are basically the form of the spa, it enhances the user experience, but it also increases the possibility of page problems, a small negligence may lead to the entire page deadlock. Fortunately Vue provides a way to catch handling exceptions, where you can handle errors or report exceptions.',
 | 
			
		||||
 
 | 
			
		||||
@@ -132,6 +132,9 @@ export default {
 | 
			
		||||
    cancel: 'Cancelar',
 | 
			
		||||
    confirm: 'Confirmar'
 | 
			
		||||
  },
 | 
			
		||||
  example: {
 | 
			
		||||
    warning: 'Creating and editing pages cannot be cached by keep-alive because keep-alive include does not currently support caching based on routes, so it is currently cached based on component name. If you want to achieve a similar caching effect, you can use a browser caching scheme such as localStorage. Or do not use keep-alive include to cache all pages directly. See details'
 | 
			
		||||
  },
 | 
			
		||||
  errorLog: {
 | 
			
		||||
    tips: 'Please click the bug icon in the upper right corner',
 | 
			
		||||
    description: 'Now the management system are basically the form of the spa, it enhances the user experience, but it also increases the possibility of page problems, a small negligence may lead to the entire page deadlock. Fortunately Vue provides a way to catch handling exceptions, where you can handle errors or report exceptions.',
 | 
			
		||||
 
 | 
			
		||||
@@ -132,6 +132,9 @@ export default {
 | 
			
		||||
    cancel: '取 消',
 | 
			
		||||
    confirm: '确 定'
 | 
			
		||||
  },
 | 
			
		||||
  example: {
 | 
			
		||||
    warning: '创建和编辑页面是不能被 keep-alive 缓存的,因为keep-alive 的 include 目前不支持根据路由来缓存,所以目前都是基于 component name 来进行缓存的。如果你想类似的实现缓存效果,可以使用 localStorage 等浏览器缓存方案。或者不要使用 keep-alive 的 include,直接缓存所有页面。详情见'
 | 
			
		||||
  },
 | 
			
		||||
  errorLog: {
 | 
			
		||||
    tips: '请点击右上角bug小图标',
 | 
			
		||||
    description: '现在的管理后台基本都是spa的形式了,它增强了用户体验,但同时也会增加页面出问题的可能性,可能一个小小的疏忽就导致整个页面的死锁。好在 Vue 官网提供了一个方法来捕获处理异常,你可以在其中进行错误处理或者异常上报。',
 | 
			
		||||
 
 | 
			
		||||
@@ -7,6 +7,7 @@
 | 
			
		||||
        :collapse="isCollapse"
 | 
			
		||||
        :background-color="variables.menuBg"
 | 
			
		||||
        :text-color="variables.menuText"
 | 
			
		||||
        :unique-opened="false"
 | 
			
		||||
        :active-text-color="variables.menuActiveText"
 | 
			
		||||
        :collapse-transition="false"
 | 
			
		||||
        mode="vertical"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										20
									
								
								src/main.js
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								src/main.js
									
									
									
									
									
								
							@@ -2,7 +2,7 @@ import Vue from 'vue'
 | 
			
		||||
 | 
			
		||||
import Cookies from 'js-cookie'
 | 
			
		||||
 | 
			
		||||
import 'normalize.css/normalize.css' // A modern alternative to CSS resets
 | 
			
		||||
import 'normalize.css/normalize.css' // a modern alternative to CSS resets
 | 
			
		||||
 | 
			
		||||
import Element from 'element-ui'
 | 
			
		||||
import './styles/element-variables.scss'
 | 
			
		||||
@@ -13,24 +13,28 @@ import App from './App'
 | 
			
		||||
import store from './store'
 | 
			
		||||
import router from './router'
 | 
			
		||||
 | 
			
		||||
import i18n from './lang' // Internationalization
 | 
			
		||||
import i18n from './lang' // internationalization
 | 
			
		||||
import './icons' // icon
 | 
			
		||||
import './permission' // permission control
 | 
			
		||||
import './utils/errorLog' // error log
 | 
			
		||||
import './utils/error-log' // error log
 | 
			
		||||
 | 
			
		||||
import * as filters from './filters' // global filters
 | 
			
		||||
 | 
			
		||||
import { mockXHR } from '../mock' // simulation data
 | 
			
		||||
 | 
			
		||||
// mock api in github pages site build
 | 
			
		||||
if (process.env.NODE_ENV === 'production') { mockXHR() }
 | 
			
		||||
/**
 | 
			
		||||
 * If you don't want to use mock-server
 | 
			
		||||
 * you want to use mockjs for request interception
 | 
			
		||||
 * you can execute:
 | 
			
		||||
 *
 | 
			
		||||
 * import { mockXHR } from '../mock'
 | 
			
		||||
 * mockXHR()
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
Vue.use(Element, {
 | 
			
		||||
  size: Cookies.get('size') || 'medium', // set element-ui default size
 | 
			
		||||
  i18n: (key, value) => i18n.t(key, value)
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
// register global utility filters.
 | 
			
		||||
// register global utility filters
 | 
			
		||||
Object.keys(filters).forEach(key => {
 | 
			
		||||
  Vue.filter(key, filters[key])
 | 
			
		||||
})
 | 
			
		||||
 
 | 
			
		||||
@@ -4,6 +4,7 @@ import { Message } from 'element-ui'
 | 
			
		||||
import NProgress from 'nprogress' // progress bar
 | 
			
		||||
import 'nprogress/nprogress.css' // progress bar style
 | 
			
		||||
import { getToken } from '@/utils/auth' // get token from cookie
 | 
			
		||||
import getPageTitle from '@/utils/get-page-title'
 | 
			
		||||
 | 
			
		||||
NProgress.configure({ showSpinner: false }) // NProgress Configuration
 | 
			
		||||
 | 
			
		||||
@@ -13,6 +14,9 @@ router.beforeEach(async(to, from, next) => {
 | 
			
		||||
  // start progress bar
 | 
			
		||||
  NProgress.start()
 | 
			
		||||
 | 
			
		||||
  // set page title
 | 
			
		||||
  document.title = getPageTitle(to.meta.title)
 | 
			
		||||
 | 
			
		||||
  // determine whether the user has logged in
 | 
			
		||||
  const hasToken = getToken()
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -20,7 +20,7 @@ import nestedRouter from './modules/nested'
 | 
			
		||||
 * alwaysShow: true               if set true, will always show the root menu
 | 
			
		||||
 *                                if not set alwaysShow, when item has more than one children route,
 | 
			
		||||
 *                                it will becomes nested mode, otherwise not show the root menu
 | 
			
		||||
 * redirect: noredirect           if `redirect:noredirect` will no redirect in the breadcrumb
 | 
			
		||||
 * redirect: noRedirect           if set noRedirect will no redirect in the breadcrumb
 | 
			
		||||
 * name:'router-name'             the name is used by <keep-alive> (must set!!!)
 | 
			
		||||
 * meta : {
 | 
			
		||||
    roles: ['admin','editor']    control the page roles (you can set multiple roles)
 | 
			
		||||
@@ -57,17 +57,17 @@ export const constantRoutes = [
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    path: '/auth-redirect',
 | 
			
		||||
    component: () => import('@/views/login/authRedirect'),
 | 
			
		||||
    component: () => import('@/views/login/auth-redirect'),
 | 
			
		||||
    hidden: true
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    path: '/404',
 | 
			
		||||
    component: () => import('@/views/errorPage/404'),
 | 
			
		||||
    component: () => import('@/views/error-page/404'),
 | 
			
		||||
    hidden: true
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    path: '/401',
 | 
			
		||||
    component: () => import('@/views/errorPage/401'),
 | 
			
		||||
    component: () => import('@/views/error-page/401'),
 | 
			
		||||
    hidden: true
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
@@ -118,8 +118,9 @@ export const asyncRoutes = [
 | 
			
		||||
  {
 | 
			
		||||
    path: '/permission',
 | 
			
		||||
    component: Layout,
 | 
			
		||||
    redirect: '/permission/index',
 | 
			
		||||
    redirect: '/permission/page',
 | 
			
		||||
    alwaysShow: true, // will always show the root menu
 | 
			
		||||
    name: 'Permission',
 | 
			
		||||
    meta: {
 | 
			
		||||
      title: 'permission',
 | 
			
		||||
      icon: 'lock',
 | 
			
		||||
@@ -162,7 +163,7 @@ export const asyncRoutes = [
 | 
			
		||||
    children: [
 | 
			
		||||
      {
 | 
			
		||||
        path: 'index',
 | 
			
		||||
        component: () => import('@/views/svg-icons/index'),
 | 
			
		||||
        component: () => import('@/views/icons/index'),
 | 
			
		||||
        name: 'Icons',
 | 
			
		||||
        meta: { title: 'icons', icon: 'icon', noCache: true }
 | 
			
		||||
      }
 | 
			
		||||
@@ -223,7 +224,7 @@ export const asyncRoutes = [
 | 
			
		||||
  {
 | 
			
		||||
    path: '/error',
 | 
			
		||||
    component: Layout,
 | 
			
		||||
    redirect: 'noredirect',
 | 
			
		||||
    redirect: 'noRedirect',
 | 
			
		||||
    name: 'ErrorPages',
 | 
			
		||||
    meta: {
 | 
			
		||||
      title: 'errorPages',
 | 
			
		||||
@@ -232,13 +233,13 @@ export const asyncRoutes = [
 | 
			
		||||
    children: [
 | 
			
		||||
      {
 | 
			
		||||
        path: '401',
 | 
			
		||||
        component: () => import('@/views/errorPage/401'),
 | 
			
		||||
        component: () => import('@/views/error-page/401'),
 | 
			
		||||
        name: 'Page401',
 | 
			
		||||
        meta: { title: 'page401', noCache: true }
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        path: '404',
 | 
			
		||||
        component: () => import('@/views/errorPage/404'),
 | 
			
		||||
        component: () => import('@/views/error-page/404'),
 | 
			
		||||
        name: 'Page404',
 | 
			
		||||
        meta: { title: 'page404', noCache: true }
 | 
			
		||||
      }
 | 
			
		||||
@@ -248,11 +249,10 @@ export const asyncRoutes = [
 | 
			
		||||
  {
 | 
			
		||||
    path: '/error-log',
 | 
			
		||||
    component: Layout,
 | 
			
		||||
    redirect: 'noredirect',
 | 
			
		||||
    children: [
 | 
			
		||||
      {
 | 
			
		||||
        path: 'log',
 | 
			
		||||
        component: () => import('@/views/errorLog/index'),
 | 
			
		||||
        component: () => import('@/views/error-log/index'),
 | 
			
		||||
        name: 'ErrorLog',
 | 
			
		||||
        meta: { title: 'errorLog', icon: 'bug' }
 | 
			
		||||
      }
 | 
			
		||||
@@ -271,25 +271,25 @@ export const asyncRoutes = [
 | 
			
		||||
    children: [
 | 
			
		||||
      {
 | 
			
		||||
        path: 'export-excel',
 | 
			
		||||
        component: () => import('@/views/excel/exportExcel'),
 | 
			
		||||
        component: () => import('@/views/excel/export-excel'),
 | 
			
		||||
        name: 'ExportExcel',
 | 
			
		||||
        meta: { title: 'exportExcel' }
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        path: 'export-selected-excel',
 | 
			
		||||
        component: () => import('@/views/excel/selectExcel'),
 | 
			
		||||
        component: () => import('@/views/excel/select-excel'),
 | 
			
		||||
        name: 'SelectExcel',
 | 
			
		||||
        meta: { title: 'selectExcel' }
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        path: 'export-merge-header',
 | 
			
		||||
        component: () => import('@/views/excel/mergeHeader'),
 | 
			
		||||
        component: () => import('@/views/excel/merge-header'),
 | 
			
		||||
        name: 'MergeHeader',
 | 
			
		||||
        meta: { title: 'mergeHeader' }
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        path: 'upload-excel',
 | 
			
		||||
        component: () => import('@/views/excel/uploadExcel'),
 | 
			
		||||
        component: () => import('@/views/excel/upload-excel'),
 | 
			
		||||
        name: 'UploadExcel',
 | 
			
		||||
        meta: { title: 'uploadExcel' }
 | 
			
		||||
      }
 | 
			
		||||
@@ -301,6 +301,7 @@ export const asyncRoutes = [
 | 
			
		||||
    component: Layout,
 | 
			
		||||
    redirect: '/zip/download',
 | 
			
		||||
    alwaysShow: true,
 | 
			
		||||
    name: 'Zip',
 | 
			
		||||
    meta: { title: 'zip', icon: 'zip' },
 | 
			
		||||
    children: [
 | 
			
		||||
      {
 | 
			
		||||
@@ -334,7 +335,6 @@ export const asyncRoutes = [
 | 
			
		||||
  {
 | 
			
		||||
    path: '/theme',
 | 
			
		||||
    component: Layout,
 | 
			
		||||
    redirect: 'noredirect',
 | 
			
		||||
    children: [
 | 
			
		||||
      {
 | 
			
		||||
        path: 'index',
 | 
			
		||||
@@ -348,7 +348,6 @@ export const asyncRoutes = [
 | 
			
		||||
  {
 | 
			
		||||
    path: '/clipboard',
 | 
			
		||||
    component: Layout,
 | 
			
		||||
    redirect: 'noredirect',
 | 
			
		||||
    children: [
 | 
			
		||||
      {
 | 
			
		||||
        path: 'index',
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,7 @@ import Layout from '@/layout'
 | 
			
		||||
const chartsRouter = {
 | 
			
		||||
  path: '/charts',
 | 
			
		||||
  component: Layout,
 | 
			
		||||
  redirect: 'noredirect',
 | 
			
		||||
  redirect: 'noRedirect',
 | 
			
		||||
  name: 'Charts',
 | 
			
		||||
  meta: {
 | 
			
		||||
    title: 'charts',
 | 
			
		||||
@@ -25,8 +25,8 @@ const chartsRouter = {
 | 
			
		||||
      meta: { title: 'lineChart', noCache: true }
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      path: 'mixchart',
 | 
			
		||||
      component: () => import('@/views/charts/mixChart'),
 | 
			
		||||
      path: 'mix-chart',
 | 
			
		||||
      component: () => import('@/views/charts/mix-chart'),
 | 
			
		||||
      name: 'MixChart',
 | 
			
		||||
      meta: { title: 'mixChart', noCache: true }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,11 +1,11 @@
 | 
			
		||||
/** When your routing table is too long, you can split it into small modules**/
 | 
			
		||||
/** When your routing table is too long, you can split it into small modules **/
 | 
			
		||||
 | 
			
		||||
import Layout from '@/layout'
 | 
			
		||||
 | 
			
		||||
const componentsRouter = {
 | 
			
		||||
  path: '/components',
 | 
			
		||||
  component: Layout,
 | 
			
		||||
  redirect: 'noredirect',
 | 
			
		||||
  redirect: 'noRedirect',
 | 
			
		||||
  name: 'ComponentDemo',
 | 
			
		||||
  meta: {
 | 
			
		||||
    title: 'components',
 | 
			
		||||
@@ -26,19 +26,19 @@ const componentsRouter = {
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      path: 'json-editor',
 | 
			
		||||
      component: () => import('@/views/components-demo/jsonEditor'),
 | 
			
		||||
      component: () => import('@/views/components-demo/json-editor'),
 | 
			
		||||
      name: 'JsonEditorDemo',
 | 
			
		||||
      meta: { title: 'jsonEditor' }
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      path: 'splitpane',
 | 
			
		||||
      component: () => import('@/views/components-demo/splitpane'),
 | 
			
		||||
      path: 'split-pane',
 | 
			
		||||
      component: () => import('@/views/components-demo/split-pane'),
 | 
			
		||||
      name: 'SplitpaneDemo',
 | 
			
		||||
      meta: { title: 'splitPane' }
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      path: 'avatar-upload',
 | 
			
		||||
      component: () => import('@/views/components-demo/avatarUpload'),
 | 
			
		||||
      component: () => import('@/views/components-demo/avatar-upload'),
 | 
			
		||||
      name: 'AvatarUploadDemo',
 | 
			
		||||
      meta: { title: 'avatarUpload' }
 | 
			
		||||
    },
 | 
			
		||||
@@ -56,7 +56,7 @@ const componentsRouter = {
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      path: 'count-to',
 | 
			
		||||
      component: () => import('@/views/components-demo/countTo'),
 | 
			
		||||
      component: () => import('@/views/components-demo/count-to'),
 | 
			
		||||
      name: 'CountToDemo',
 | 
			
		||||
      meta: { title: 'countTo' }
 | 
			
		||||
    },
 | 
			
		||||
@@ -68,31 +68,31 @@ const componentsRouter = {
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      path: 'back-to-top',
 | 
			
		||||
      component: () => import('@/views/components-demo/backToTop'),
 | 
			
		||||
      component: () => import('@/views/components-demo/back-to-top'),
 | 
			
		||||
      name: 'BackToTopDemo',
 | 
			
		||||
      meta: { title: 'backToTop' }
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      path: 'drag-dialog',
 | 
			
		||||
      component: () => import('@/views/components-demo/dragDialog'),
 | 
			
		||||
      component: () => import('@/views/components-demo/drag-dialog'),
 | 
			
		||||
      name: 'DragDialogDemo',
 | 
			
		||||
      meta: { title: 'dragDialog' }
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      path: 'drag-select',
 | 
			
		||||
      component: () => import('@/views/components-demo/dragSelect'),
 | 
			
		||||
      component: () => import('@/views/components-demo/drag-select'),
 | 
			
		||||
      name: 'DragSelectDemo',
 | 
			
		||||
      meta: { title: 'dragSelect' }
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      path: 'dnd-list',
 | 
			
		||||
      component: () => import('@/views/components-demo/dndList'),
 | 
			
		||||
      component: () => import('@/views/components-demo/dnd-list'),
 | 
			
		||||
      name: 'DndListDemo',
 | 
			
		||||
      meta: { title: 'dndList' }
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      path: 'drag-kanban',
 | 
			
		||||
      component: () => import('@/views/components-demo/dragKanban'),
 | 
			
		||||
      component: () => import('@/views/components-demo/drag-kanban'),
 | 
			
		||||
      name: 'DragKanbanDemo',
 | 
			
		||||
      meta: { title: 'dragKanban' }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
/** When your routing table is too long, you can split it into small modules**/
 | 
			
		||||
/** When your routing table is too long, you can split it into small modules **/
 | 
			
		||||
 | 
			
		||||
import Layout from '@/layout'
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
/** When your routing table is too long, you can split it into small modules**/
 | 
			
		||||
/** When your routing table is too long, you can split it into small modules **/
 | 
			
		||||
 | 
			
		||||
import Layout from '@/layout'
 | 
			
		||||
 | 
			
		||||
@@ -14,25 +14,25 @@ const tableRouter = {
 | 
			
		||||
  children: [
 | 
			
		||||
    {
 | 
			
		||||
      path: 'dynamic-table',
 | 
			
		||||
      component: () => import('@/views/table/dynamicTable/index'),
 | 
			
		||||
      component: () => import('@/views/table/dynamic-table/index'),
 | 
			
		||||
      name: 'DynamicTable',
 | 
			
		||||
      meta: { title: 'dynamicTable' }
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      path: 'drag-table',
 | 
			
		||||
      component: () => import('@/views/table/dragTable'),
 | 
			
		||||
      component: () => import('@/views/table/drag-table'),
 | 
			
		||||
      name: 'DragTable',
 | 
			
		||||
      meta: { title: 'dragTable' }
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      path: 'inline-edit-table',
 | 
			
		||||
      component: () => import('@/views/table/inlineEditTable'),
 | 
			
		||||
      component: () => import('@/views/table/inline-edit-table'),
 | 
			
		||||
      name: 'InlineEditTable',
 | 
			
		||||
      meta: { title: 'inlineEditTable' }
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      path: 'complex-table',
 | 
			
		||||
      component: () => import('@/views/table/complexTable'),
 | 
			
		||||
      component: () => import('@/views/table/complex-table'),
 | 
			
		||||
      name: 'ComplexTable',
 | 
			
		||||
      meta: { title: 'complexTable' }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,5 @@
 | 
			
		||||
import variables from '@/styles/element-variables.scss'
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  theme: variables.theme,
 | 
			
		||||
module.exports = {
 | 
			
		||||
  title: 'Vue Element Admin',
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @type {boolean} true | false
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
import { asyncRoutes, constantRoutes } from '@/router'
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 通过meta.role判断是否与当前用户权限匹配
 | 
			
		||||
 * Use meta.role to determine if the current user has permission
 | 
			
		||||
 * @param roles
 | 
			
		||||
 * @param route
 | 
			
		||||
 */
 | 
			
		||||
@@ -14,7 +14,7 @@ function hasPermission(roles, route) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 递归过滤异步路由表,返回符合用户角色权限的路由表
 | 
			
		||||
 * Filter asynchronous routing tables by recursion
 | 
			
		||||
 * @param routes asyncRoutes
 | 
			
		||||
 * @param roles
 | 
			
		||||
 */
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,10 @@
 | 
			
		||||
import variables from '@/styles/element-variables.scss'
 | 
			
		||||
import defaultSettings from '@/settings'
 | 
			
		||||
const { showSettings, tagsView, fixedHeader, sidebarLogo, theme } = defaultSettings
 | 
			
		||||
 | 
			
		||||
const { showSettings, tagsView, fixedHeader, sidebarLogo } = defaultSettings
 | 
			
		||||
 | 
			
		||||
const state = {
 | 
			
		||||
  theme: theme,
 | 
			
		||||
  theme: variables.theme,
 | 
			
		||||
  showSettings: showSettings,
 | 
			
		||||
  tagsView: tagsView,
 | 
			
		||||
  fixedHeader: fixedHeader,
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
//覆盖一些element-ui样式
 | 
			
		||||
// cover some element-ui styles
 | 
			
		||||
 | 
			
		||||
.el-breadcrumb__inner,
 | 
			
		||||
.el-breadcrumb__inner a {
 | 
			
		||||
@@ -46,7 +46,7 @@
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//暂时性解决dialog 问题 https://github.com/ElemeFE/element/issues/2461
 | 
			
		||||
// to fixed https://github.com/ElemeFE/element/issues/2461
 | 
			
		||||
.el-dialog {
 | 
			
		||||
  transform: none;
 | 
			
		||||
  left: 0;
 | 
			
		||||
@@ -54,18 +54,7 @@
 | 
			
		||||
  margin: 0 auto;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//文章页textarea修改样式
 | 
			
		||||
.article-textarea {
 | 
			
		||||
  textarea {
 | 
			
		||||
    padding-right: 40px;
 | 
			
		||||
    resize: none;
 | 
			
		||||
    border: none;
 | 
			
		||||
    border-radius: 0px;
 | 
			
		||||
    border-bottom: 1px solid #bfcbd9;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//element ui upload
 | 
			
		||||
// refine element ui upload
 | 
			
		||||
.upload-container {
 | 
			
		||||
  .el-upload {
 | 
			
		||||
    width: 100%;
 | 
			
		||||
@@ -77,9 +66,14 @@
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//dropdown
 | 
			
		||||
// dropdown
 | 
			
		||||
.el-dropdown-menu {
 | 
			
		||||
  a {
 | 
			
		||||
    display: block
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// fix date-picker ui bug in filter-item
 | 
			
		||||
.el-range-editor.el-input__inner {
 | 
			
		||||
  display: inline-flex !important;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -96,14 +96,18 @@ div:focus {
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
code {
 | 
			
		||||
aside {
 | 
			
		||||
  background: #eef1f6;
 | 
			
		||||
  padding: 15px 16px;
 | 
			
		||||
  padding: 8px 24px;
 | 
			
		||||
  margin-bottom: 20px;
 | 
			
		||||
  border-radius: 2px;
 | 
			
		||||
  display: block;
 | 
			
		||||
  line-height: 36px;
 | 
			
		||||
  font-size: 15px;
 | 
			
		||||
  font-family: "Source Sans Pro", "Helvetica Neue", Arial, sans-serif;
 | 
			
		||||
  line-height: 32px;
 | 
			
		||||
  font-size: 16px;
 | 
			
		||||
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;
 | 
			
		||||
  color: #2c3e50;
 | 
			
		||||
  -webkit-font-smoothing: antialiased;
 | 
			
		||||
  -moz-osx-font-smoothing: grayscale;
 | 
			
		||||
 | 
			
		||||
  a {
 | 
			
		||||
    color: #337ab7;
 | 
			
		||||
@@ -115,20 +119,6 @@ code {
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.warn-content {
 | 
			
		||||
  background: rgba(66, 185, 131, .1);
 | 
			
		||||
  border-radius: 2px;
 | 
			
		||||
  padding: 16px;
 | 
			
		||||
  padding: 1rem;
 | 
			
		||||
  line-height: 1.6rem;
 | 
			
		||||
  word-spacing: .05rem;
 | 
			
		||||
 | 
			
		||||
  a {
 | 
			
		||||
    color: #42b983;
 | 
			
		||||
    font-weight: 600;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//main-container全局样式
 | 
			
		||||
.app-container {
 | 
			
		||||
  padding: 20px;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,5 @@
 | 
			
		||||
#app {
 | 
			
		||||
 | 
			
		||||
  // 主体区域 Main container
 | 
			
		||||
  .main-container {
 | 
			
		||||
    min-height: 100%;
 | 
			
		||||
    transition: margin-left .28s;
 | 
			
		||||
@@ -8,7 +7,6 @@
 | 
			
		||||
    position: relative;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // 侧边栏 Sidebar container
 | 
			
		||||
  .sidebar-container {
 | 
			
		||||
    transition: width 0.28s;
 | 
			
		||||
    width: $sideBarWidth !important;
 | 
			
		||||
@@ -22,7 +20,7 @@
 | 
			
		||||
    z-index: 1001;
 | 
			
		||||
    overflow: hidden;
 | 
			
		||||
 | 
			
		||||
    //reset element-ui css
 | 
			
		||||
    // reset element-ui css
 | 
			
		||||
    .horizontal-collapse-transition {
 | 
			
		||||
      transition: 0s width ease-in-out, 0s padding-left ease-in-out, 0s padding-right ease-in-out;
 | 
			
		||||
    }
 | 
			
		||||
@@ -149,7 +147,7 @@
 | 
			
		||||
    min-width: $sideBarWidth !important;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // 适配移动端, Mobile responsive
 | 
			
		||||
  // mobile responsive
 | 
			
		||||
  .mobile {
 | 
			
		||||
    .main-container {
 | 
			
		||||
      margin-left: 0px;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
//global transition css
 | 
			
		||||
// global transition css
 | 
			
		||||
 | 
			
		||||
/*fade*/
 | 
			
		||||
/* fade */
 | 
			
		||||
.fade-enter-active,
 | 
			
		||||
.fade-leave-active {
 | 
			
		||||
  transition: opacity 0.28s;
 | 
			
		||||
@@ -11,7 +11,7 @@
 | 
			
		||||
  opacity: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*fade-transform*/
 | 
			
		||||
/* fade-transform */
 | 
			
		||||
.fade-transform-leave-active,
 | 
			
		||||
.fade-transform-enter-active {
 | 
			
		||||
  transition: all .5s;
 | 
			
		||||
@@ -27,7 +27,7 @@
 | 
			
		||||
  transform: translateX(30px);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*breadcrumb transition*/
 | 
			
		||||
/* breadcrumb transition */
 | 
			
		||||
.breadcrumb-enter-active,
 | 
			
		||||
.breadcrumb-leave-active {
 | 
			
		||||
  transition: all .5s;
 | 
			
		||||
 
 | 
			
		||||
@@ -8,10 +8,10 @@ $tiffany: #4AB7BD;
 | 
			
		||||
$yellow:#FEC171;
 | 
			
		||||
$panGreen: #30B08F;
 | 
			
		||||
 | 
			
		||||
//sidebar
 | 
			
		||||
// sidebar
 | 
			
		||||
$menuText:#bfcbd9;
 | 
			
		||||
$menuActiveText:#409EFF;
 | 
			
		||||
$subMenuActiveText:#f4f4f5; //https://github.com/ElemeFE/element/issues/12951
 | 
			
		||||
$subMenuActiveText:#f4f4f5; // https://github.com/ElemeFE/element/issues/12951
 | 
			
		||||
 | 
			
		||||
$menuBg:#304156;
 | 
			
		||||
$menuHover:#263445;
 | 
			
		||||
 
 | 
			
		||||
@@ -4,10 +4,10 @@ import { isString, isArray } from '@/utils/validate'
 | 
			
		||||
import settings from '@/settings'
 | 
			
		||||
 | 
			
		||||
// you can set in settings.js
 | 
			
		||||
// errorLog:'production' | ['production','development']
 | 
			
		||||
// errorLog:'production' | ['production', 'development']
 | 
			
		||||
const { errorLog: needErrorLog } = settings
 | 
			
		||||
 | 
			
		||||
function checkNeed(arg) {
 | 
			
		||||
function checkNeed() {
 | 
			
		||||
  const env = process.env.NODE_ENV
 | 
			
		||||
  if (isString(needErrorLog)) {
 | 
			
		||||
    return env === needErrorLog
 | 
			
		||||
							
								
								
									
										13
									
								
								src/utils/get-page-title.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								src/utils/get-page-title.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
			
		||||
import defaultSettings from '@/settings'
 | 
			
		||||
import i18n from '@/lang'
 | 
			
		||||
 | 
			
		||||
const title = defaultSettings.title || 'Vue Element Admin'
 | 
			
		||||
 | 
			
		||||
export default function getPageTitle(key) {
 | 
			
		||||
  const hasKey = i18n.te(`route.${key}`)
 | 
			
		||||
  if (hasKey) {
 | 
			
		||||
    const pageName = i18n.t(`route.${key}`)
 | 
			
		||||
    return `${pageName} - ${title}`
 | 
			
		||||
  }
 | 
			
		||||
  return `${title}`
 | 
			
		||||
}
 | 
			
		||||
@@ -5,23 +5,25 @@ import { getToken } from '@/utils/auth'
 | 
			
		||||
 | 
			
		||||
// create an axios instance
 | 
			
		||||
const service = axios.create({
 | 
			
		||||
  baseURL: process.env.VUE_APP_BASE_API, // api 的 base_url
 | 
			
		||||
  withCredentials: true, // 跨域请求时发送 cookies
 | 
			
		||||
  baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
 | 
			
		||||
  withCredentials: true, // send cookies when cross-domain requests
 | 
			
		||||
  timeout: 5000 // request timeout
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
// request interceptor
 | 
			
		||||
service.interceptors.request.use(
 | 
			
		||||
  config => {
 | 
			
		||||
    // Do something before request is sent
 | 
			
		||||
    // do something before request is sent
 | 
			
		||||
 | 
			
		||||
    if (store.getters.token) {
 | 
			
		||||
      // 让每个请求携带token-- ['X-Token']为自定义key 请根据实际情况自行修改
 | 
			
		||||
      // let each request carry token --['X-Token'] as a custom key.
 | 
			
		||||
      // please modify it according to the actual situation.
 | 
			
		||||
      config.headers['X-Token'] = getToken()
 | 
			
		||||
    }
 | 
			
		||||
    return config
 | 
			
		||||
  },
 | 
			
		||||
  error => {
 | 
			
		||||
    // Do something with request error
 | 
			
		||||
    // do something with request error
 | 
			
		||||
    console.log(error) // for debug
 | 
			
		||||
    return Promise.reject(error)
 | 
			
		||||
  }
 | 
			
		||||
@@ -33,31 +35,33 @@ service.interceptors.response.use(
 | 
			
		||||
   * If you want to get information such as headers or status
 | 
			
		||||
   * Please return  response => response
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * 下面的注释为通过在response里,自定义code来标示请求状态
 | 
			
		||||
   * 当code返回如下情况则说明权限有问题,登出并返回到登录页
 | 
			
		||||
   * 如想通过 XMLHttpRequest 来状态码标识 逻辑可写在下面error中
 | 
			
		||||
   * 以下代码均为样例,请结合自生需求加以修改,若不需要,则可删除
 | 
			
		||||
   * Determine the request status by custom code
 | 
			
		||||
   * Here is just an example
 | 
			
		||||
   * You can also judge the status by HTTP Status Code.
 | 
			
		||||
   */
 | 
			
		||||
  response => {
 | 
			
		||||
    const res = response.data
 | 
			
		||||
 | 
			
		||||
    // if the custom code is not 20000, it is judged as an error.
 | 
			
		||||
    if (res.code !== 20000) {
 | 
			
		||||
      Message({
 | 
			
		||||
        message: res.message || 'error',
 | 
			
		||||
        type: 'error',
 | 
			
		||||
        duration: 5 * 1000
 | 
			
		||||
      })
 | 
			
		||||
      // 50008:非法的token; 50012:其他客户端登录了;  50014:Token 过期了;
 | 
			
		||||
 | 
			
		||||
      // 50008: Illegal token; 50012: Other clients logged in; 50014: Token expired;
 | 
			
		||||
      if (res.code === 50008 || res.code === 50012 || res.code === 50014) {
 | 
			
		||||
        // 请自行在引入 MessageBox
 | 
			
		||||
        // import { Message, MessageBox } from 'element-ui'
 | 
			
		||||
        MessageBox.confirm('你已被登出,可以取消继续留在该页面,或者重新登录', '确定登出', {
 | 
			
		||||
          confirmButtonText: '重新登录',
 | 
			
		||||
          cancelButtonText: '取消',
 | 
			
		||||
        // to re-login
 | 
			
		||||
        MessageBox.confirm('You have been logged out, you can cancel to stay on this page, or log in again', 'Confirm logout', {
 | 
			
		||||
          confirmButtonText: 'Re-Login',
 | 
			
		||||
          cancelButtonText: 'Cancel',
 | 
			
		||||
          type: 'warning'
 | 
			
		||||
        }).then(() => {
 | 
			
		||||
          store.dispatch('user/resetToken').then(() => {
 | 
			
		||||
            location.reload() // 为了重新实例化vue-router对象 避免bug
 | 
			
		||||
            location.reload()
 | 
			
		||||
          })
 | 
			
		||||
        })
 | 
			
		||||
      }
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,7 @@
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
import Chart from '@/components/Charts/keyboard'
 | 
			
		||||
import Chart from '@/components/Charts/Keyboard'
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  name: 'KeyboardChart',
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,7 @@
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
import Chart from '@/components/Charts/lineMarker'
 | 
			
		||||
import Chart from '@/components/Charts/LineMarker'
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  name: 'LineChart',
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,7 @@
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
import Chart from '@/components/Charts/mixChart'
 | 
			
		||||
import Chart from '@/components/Charts/MixChart'
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  name: 'MixChart',
 | 
			
		||||
@@ -1,9 +1,9 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <div class="components-container">
 | 
			
		||||
    <code>This is based on
 | 
			
		||||
    <aside>This is based on
 | 
			
		||||
      <a class="link-type" href="//github.com/dai-siki/vue-image-crop-upload"> vue-image-crop-upload</a>.
 | 
			
		||||
      {{ $t('components.imageUploadTips') }}
 | 
			
		||||
    </code>
 | 
			
		||||
    </aside>
 | 
			
		||||
 | 
			
		||||
    <pan-thumb :image="image" />
 | 
			
		||||
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <div class="components-container">
 | 
			
		||||
    <code>{{ $t('components.backToTopTips1') }}</code>
 | 
			
		||||
    <code>{{ $t('components.backToTopTips2') }}</code>
 | 
			
		||||
    <aside>{{ $t('components.backToTopTips1') }}</aside>
 | 
			
		||||
    <aside>{{ $t('components.backToTopTips2') }}</aside>
 | 
			
		||||
    <div class="placeholder-container">
 | 
			
		||||
      <div>placeholder</div>
 | 
			
		||||
      <div>placeholder</div>
 | 
			
		||||
@@ -113,8 +113,7 @@
 | 
			
		||||
      <div>placeholder</div>
 | 
			
		||||
      <div>placeholder</div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <!--可自定义按钮的样式、show/hide临界点、返回的位置  -->
 | 
			
		||||
    <!--如需文字提示,可在外部添加element的<el-tooltip></el-tooltip>元素  -->
 | 
			
		||||
    <!-- you can add element-ui's tooltip -->
 | 
			
		||||
    <el-tooltip placement="top" content="tooltip">
 | 
			
		||||
      <back-to-top :custom-style="myBackToTopStyle" :visibility-height="300" :back-position="50" transition-name="fade" />
 | 
			
		||||
    </el-tooltip>
 | 
			
		||||
@@ -129,6 +128,7 @@ export default {
 | 
			
		||||
  components: { BackToTop },
 | 
			
		||||
  data() {
 | 
			
		||||
    return {
 | 
			
		||||
      // customizable button style, show/hide critical point, return position
 | 
			
		||||
      myBackToTopStyle: {
 | 
			
		||||
        right: '50px',
 | 
			
		||||
        bottom: '50px',
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <div class="components-container">
 | 
			
		||||
    <p class="warn-content">
 | 
			
		||||
    <aside>
 | 
			
		||||
      <a href="https://github.com/PanJiaChen/vue-countTo" target="_blank">countTo-component</a>
 | 
			
		||||
    </p>
 | 
			
		||||
    </aside>
 | 
			
		||||
    <count-to
 | 
			
		||||
      ref="example"
 | 
			
		||||
      :start-val="_startVal"
 | 
			
		||||
@@ -45,9 +45,9 @@
 | 
			
		||||
        <input v-model="setSuffix" name="suffixInput">
 | 
			
		||||
      </label>
 | 
			
		||||
    </div>
 | 
			
		||||
    <code><count-to :start-val='{{ _startVal }}' :end-val='{{ _endVal }}' :duration='{{ _duration }}'
 | 
			
		||||
    <aside><count-to :start-val='{{ _startVal }}' :end-val='{{ _endVal }}' :duration='{{ _duration }}'
 | 
			
		||||
      :decimals='{{ _decimals }}' :separator='{{ _separator }}' :prefix='{{ _prefix }}' :suffix='{{ _suffix }}'
 | 
			
		||||
      :autoplay=false></code>
 | 
			
		||||
      :autoplay=false></aside>
 | 
			
		||||
  </div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <div class="components-container">
 | 
			
		||||
    <code>drag-list base on
 | 
			
		||||
    <aside>drag-list base on
 | 
			
		||||
      <a href="https://github.com/SortableJS/Vue.Draggable" target="_blank">Vue.Draggable</a>
 | 
			
		||||
    </code>
 | 
			
		||||
    </aside>
 | 
			
		||||
    <div class="editor-container">
 | 
			
		||||
      <dnd-list :list1="list1" :list2="list2" list1-title="List" list2-title="Article pool" />
 | 
			
		||||
    </div>
 | 
			
		||||
@@ -17,7 +17,7 @@
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
import elDragDialog from '@/directive/el-dragDialog' // base on element-ui
 | 
			
		||||
import elDragDialog from '@/directive/el-drag-dialog' // base on element-ui
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  name: 'DragDialogDemo',
 | 
			
		||||
@@ -1,9 +1,9 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <div class="components-container">
 | 
			
		||||
    <code>
 | 
			
		||||
    <aside>
 | 
			
		||||
      Based on <a class="link-type" href="https://github.com/rowanwins/vue-dropzone"> dropzone </a>.
 | 
			
		||||
      {{ $t('components.dropzoneTips') }}
 | 
			
		||||
    </code>
 | 
			
		||||
    </aside>
 | 
			
		||||
    <div class="editor-container">
 | 
			
		||||
      <dropzone id="myVueDropzone" url="https://httpbin.org/post" @dropzone-removedFile="dropzoneR" @dropzone-success="dropzoneS" />
 | 
			
		||||
    </div>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,10 +1,10 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <div class="components-container">
 | 
			
		||||
    <code>Json-Editor is base on <a href="https://github.com/codemirror/CodeMirror" target="_blank">CodeMirrorr</a>. Lint
 | 
			
		||||
    <aside>Json-Editor is base on <a href="https://github.com/codemirror/CodeMirror" target="_blank">CodeMirrorr</a>. Lint
 | 
			
		||||
      base on <a
 | 
			
		||||
        href="https://github.com/codemirror/CodeMirror/blob/master/addon/lint/json-lint.js"
 | 
			
		||||
        target="_blank"
 | 
			
		||||
      >json-lint</a>.</code>
 | 
			
		||||
      >json-lint</a>.</aside>
 | 
			
		||||
    <div class="editor-container">
 | 
			
		||||
      <json-editor ref="jsonEditor" v-model="value" />
 | 
			
		||||
    </div>
 | 
			
		||||
@@ -1,13 +1,13 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <div class="components-container">
 | 
			
		||||
    <code>Markdown is based on
 | 
			
		||||
    <aside>Markdown is based on
 | 
			
		||||
      <a href="https://github.com/nhnent/tui.editor" target="_blank">tui.editor</a> ,simply wrapped with Vue.
 | 
			
		||||
      <a
 | 
			
		||||
        target="_blank"
 | 
			
		||||
        href="https://panjiachen.github.io/vue-element-admin-site/feature/component/markdown-editor.html"
 | 
			
		||||
      >
 | 
			
		||||
        Documentation </a>
 | 
			
		||||
    </code>
 | 
			
		||||
    </aside>
 | 
			
		||||
 | 
			
		||||
    <div class="editor-container">
 | 
			
		||||
      <el-tag class="tag-title">
 | 
			
		||||
 
 | 
			
		||||
@@ -115,7 +115,7 @@
 | 
			
		||||
import PanThumb from '@/components/PanThumb'
 | 
			
		||||
import MdInput from '@/components/MDinput'
 | 
			
		||||
import Mallki from '@/components/TextHoverEffect/Mallki'
 | 
			
		||||
import DropdownMenu from '@/components/Share/dropdownMenu'
 | 
			
		||||
import DropdownMenu from '@/components/Share/DropdownMenu'
 | 
			
		||||
import waves from '@/directive/waves/index.js' // 水波纹指令
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,10 +1,10 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <div class="components-container">
 | 
			
		||||
    <code><strong>SplitPane</strong> If you've used
 | 
			
		||||
    <aside><strong>SplitPane</strong> If you've used
 | 
			
		||||
      <a href="https://codepen.io/" target="_blank"> codepen</a>,
 | 
			
		||||
      <a href="https://jsfiddle.net/" target="_blank"> jsfiddle </a>will not be unfamiliar.
 | 
			
		||||
      <a href="https://github.com/PanJiaChen/vue-split-pane" target="_blank"> Github repository</a>
 | 
			
		||||
    </code>
 | 
			
		||||
    </aside>
 | 
			
		||||
    <split-pane split="vertical" @resize="resize">
 | 
			
		||||
      <template slot="paneL">
 | 
			
		||||
        <div class="left-container" />
 | 
			
		||||
@@ -37,7 +37,7 @@
 | 
			
		||||
    </sticky>
 | 
			
		||||
 | 
			
		||||
    <div class="components-container">
 | 
			
		||||
      <code>Sticky header, {{ $t('components.stickyTips') }}</code>
 | 
			
		||||
      <aside>Sticky header, {{ $t('components.stickyTips') }}</aside>
 | 
			
		||||
      <div>placeholder</div>
 | 
			
		||||
      <div>placeholder</div>
 | 
			
		||||
      <div>placeholder</div>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,9 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <div class="components-container">
 | 
			
		||||
    <code>
 | 
			
		||||
    <aside>
 | 
			
		||||
      {{ $t('components.tinymceTips') }}
 | 
			
		||||
      <a target="_blank" class="link-type" href="https://panjiachen.github.io/vue-element-admin-site/component/rich-editor.html"> {{ $t('components.documentation') }}</a>
 | 
			
		||||
    </code>
 | 
			
		||||
    </aside>
 | 
			
		||||
    <div>
 | 
			
		||||
      <tinymce v-model="content" :height="300" />
 | 
			
		||||
    </div>
 | 
			
		||||
 
 | 
			
		||||
@@ -21,7 +21,7 @@
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
import { transactionList } from '@/api/remoteSearch'
 | 
			
		||||
import { transactionList } from '@/api/remote-search'
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  filters: {
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
  </div>
 | 
			
		||||
</template>
 | 
			
		||||
<script>
 | 
			
		||||
import DropdownMenu from '@/components/Share/dropdownMenu'
 | 
			
		||||
import DropdownMenu from '@/components/Share/DropdownMenu'
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  name: 'Documentation',
 | 
			
		||||
 
 | 
			
		||||
@@ -1,15 +1,15 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <div class="errPage-container">
 | 
			
		||||
    <errorA />
 | 
			
		||||
    <errorB />
 | 
			
		||||
    <ErrorA />
 | 
			
		||||
    <ErrorB />
 | 
			
		||||
    <!-- $t is vue-i18n global function to translate lang -->
 | 
			
		||||
    <h3>{{ $t('errorLog.tips') }}</h3>
 | 
			
		||||
    <code>
 | 
			
		||||
    <aside>
 | 
			
		||||
      {{ $t('errorLog.description') }}
 | 
			
		||||
      <a target="_blank" class="link-type" href="https://panjiachen.github.io/vue-element-admin-site/guide/advanced/error.html">
 | 
			
		||||
        {{ $t('errorLog.documentation') }}
 | 
			
		||||
      </a>
 | 
			
		||||
    </code>
 | 
			
		||||
    </aside>
 | 
			
		||||
    <a href="#">
 | 
			
		||||
      <img src="https://wpimg.wallstcn.com/360e4842-4db5-42d0-b078-f9a84a825546.gif">
 | 
			
		||||
    </a>
 | 
			
		||||
@@ -17,12 +17,12 @@
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
import errorA from './errorTestA'
 | 
			
		||||
import errorB from './errorTestB'
 | 
			
		||||
import ErrorA from './components/ErrorTestA'
 | 
			
		||||
import ErrorB from './components/ErrorTestB'
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  name: 'ErrorLog',
 | 
			
		||||
  components: { errorA, errorB }
 | 
			
		||||
  components: { ErrorA, ErrorB }
 | 
			
		||||
}
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
@@ -6,10 +6,10 @@
 | 
			
		||||
        <PlatformDropdown v-model="postForm.platforms" />
 | 
			
		||||
        <SourceUrlDropdown v-model="postForm.source_uri" />
 | 
			
		||||
        <el-button v-loading="loading" style="margin-left: 10px;" type="success" @click="submitForm">
 | 
			
		||||
          发布
 | 
			
		||||
          Publush
 | 
			
		||||
        </el-button>
 | 
			
		||||
        <el-button v-loading="loading" type="warning" @click="draftForm">
 | 
			
		||||
          草稿
 | 
			
		||||
          Draft
 | 
			
		||||
        </el-button>
 | 
			
		||||
      </sticky>
 | 
			
		||||
 | 
			
		||||
@@ -20,28 +20,28 @@
 | 
			
		||||
          <el-col :span="24">
 | 
			
		||||
            <el-form-item style="margin-bottom: 40px;" prop="title">
 | 
			
		||||
              <MDinput v-model="postForm.title" :maxlength="100" name="name" required>
 | 
			
		||||
                标题
 | 
			
		||||
                Title
 | 
			
		||||
              </MDinput>
 | 
			
		||||
            </el-form-item>
 | 
			
		||||
 | 
			
		||||
            <div class="postInfo-container">
 | 
			
		||||
              <el-row>
 | 
			
		||||
                <el-col :span="8">
 | 
			
		||||
                  <el-form-item label-width="45px" label="作者:" class="postInfo-container-item">
 | 
			
		||||
                    <el-select v-model="postForm.author" :remote-method="getRemoteUserList" filterable default-first-option remote placeholder="搜索用户">
 | 
			
		||||
                  <el-form-item label-width="60px" label="Author:" class="postInfo-container-item">
 | 
			
		||||
                    <el-select v-model="postForm.author" :remote-method="getRemoteUserList" filterable default-first-option remote placeholder="Search user">
 | 
			
		||||
                      <el-option v-for="(item,index) in userListOptions" :key="item+index" :label="item" :value="item" />
 | 
			
		||||
                    </el-select>
 | 
			
		||||
                  </el-form-item>
 | 
			
		||||
                </el-col>
 | 
			
		||||
 | 
			
		||||
                <el-col :span="10">
 | 
			
		||||
                  <el-form-item label-width="80px" label="发布时间:" class="postInfo-container-item">
 | 
			
		||||
                    <el-date-picker v-model="postForm.display_time" type="datetime" format="yyyy-MM-dd HH:mm:ss" placeholder="选择日期时间" />
 | 
			
		||||
                  <el-form-item label-width="120px" label="Publush Time:" class="postInfo-container-item">
 | 
			
		||||
                    <el-date-picker v-model="postForm.display_time" type="datetime" format="yyyy-MM-dd HH:mm:ss" placeholder="Select date and time" />
 | 
			
		||||
                  </el-form-item>
 | 
			
		||||
                </el-col>
 | 
			
		||||
 | 
			
		||||
                <el-col :span="6">
 | 
			
		||||
                  <el-form-item label-width="60px" label="重要性:" class="postInfo-container-item">
 | 
			
		||||
                  <el-form-item label-width="90px" label="Importance:" class="postInfo-container-item">
 | 
			
		||||
                    <el-rate
 | 
			
		||||
                      v-model="postForm.importance"
 | 
			
		||||
                      :max="3"
 | 
			
		||||
@@ -57,9 +57,9 @@
 | 
			
		||||
          </el-col>
 | 
			
		||||
        </el-row>
 | 
			
		||||
 | 
			
		||||
        <el-form-item style="margin-bottom: 40px;" label-width="45px" label="摘要:">
 | 
			
		||||
          <el-input v-model="postForm.content_short" :rows="1" type="textarea" class="article-textarea" autosize placeholder="请输入内容" />
 | 
			
		||||
          <span v-show="contentShortLength" class="word-counter">{{ contentShortLength }}字</span>
 | 
			
		||||
        <el-form-item style="margin-bottom: 40px;" label-width="70px" label="Summary:">
 | 
			
		||||
          <el-input v-model="postForm.content_short" :rows="1" type="textarea" class="article-textarea" autosize placeholder="Please enter the content" />
 | 
			
		||||
          <span v-show="contentShortLength" class="word-counter">{{ contentShortLength }}words</span>
 | 
			
		||||
        </el-form-item>
 | 
			
		||||
 | 
			
		||||
        <el-form-item prop="content" style="margin-bottom: 30px;">
 | 
			
		||||
@@ -76,12 +76,12 @@
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
import Tinymce from '@/components/Tinymce'
 | 
			
		||||
import Upload from '@/components/Upload/singleImage3'
 | 
			
		||||
import Upload from '@/components/Upload/SingleImage3'
 | 
			
		||||
import MDinput from '@/components/MDinput'
 | 
			
		||||
import Sticky from '@/components/Sticky' // 粘性header组件
 | 
			
		||||
import { validURL } from '@/utils/validate'
 | 
			
		||||
import { fetchArticle } from '@/api/article'
 | 
			
		||||
import { searchUser } from '@/api/remoteSearch'
 | 
			
		||||
import { searchUser } from '@/api/remote-search'
 | 
			
		||||
import Warning from './Warning'
 | 
			
		||||
import { CommentDropdown, PlatformDropdown, SourceUrlDropdown } from './Dropdown'
 | 
			
		||||
 | 
			
		||||
@@ -236,24 +236,39 @@ export default {
 | 
			
		||||
 | 
			
		||||
<style lang="scss" scoped>
 | 
			
		||||
@import "~@/styles/mixin.scss";
 | 
			
		||||
 | 
			
		||||
.createPost-container {
 | 
			
		||||
  position: relative;
 | 
			
		||||
 | 
			
		||||
  .createPost-main-container {
 | 
			
		||||
    padding: 40px 45px 20px 50px;
 | 
			
		||||
 | 
			
		||||
    .postInfo-container {
 | 
			
		||||
      position: relative;
 | 
			
		||||
      @include clearfix;
 | 
			
		||||
      margin-bottom: 10px;
 | 
			
		||||
 | 
			
		||||
      .postInfo-container-item {
 | 
			
		||||
        float: left;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .word-counter {
 | 
			
		||||
    width: 40px;
 | 
			
		||||
    position: absolute;
 | 
			
		||||
    right: -10px;
 | 
			
		||||
    right: 10px;
 | 
			
		||||
    top: 0px;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.article-textarea /deep/ {
 | 
			
		||||
  textarea {
 | 
			
		||||
    padding-right: 40px;
 | 
			
		||||
    resize: none;
 | 
			
		||||
    border: none;
 | 
			
		||||
    border-radius: 0px;
 | 
			
		||||
    border-bottom: 1px solid #bfcbd9;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
</style>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,17 +1,17 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <el-dropdown :show-timeout="100" trigger="click">
 | 
			
		||||
    <el-button plain>
 | 
			
		||||
      {{ !comment_disabled?'评论已打开':'评论已关闭' }}
 | 
			
		||||
      {{ !comment_disabled?'Comment: opened':'Comment: closed' }}
 | 
			
		||||
      <i class="el-icon-caret-bottom el-icon--right" />
 | 
			
		||||
    </el-button>
 | 
			
		||||
    <el-dropdown-menu slot="dropdown" class="no-padding">
 | 
			
		||||
      <el-dropdown-item>
 | 
			
		||||
        <el-radio-group v-model="comment_disabled" style="padding: 10px;">
 | 
			
		||||
          <el-radio :label="true">
 | 
			
		||||
            关闭评论
 | 
			
		||||
            Close comment
 | 
			
		||||
          </el-radio>
 | 
			
		||||
          <el-radio :label="false">
 | 
			
		||||
            打开评论
 | 
			
		||||
            Open comment
 | 
			
		||||
          </el-radio>
 | 
			
		||||
        </el-radio-group>
 | 
			
		||||
      </el-dropdown-item>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <el-dropdown :hide-on-click="false" :show-timeout="100" trigger="click">
 | 
			
		||||
    <el-button plain>
 | 
			
		||||
      平台({{ platforms.length }})
 | 
			
		||||
      Platfroms({{ platforms.length }})
 | 
			
		||||
      <i class="el-icon-caret-bottom el-icon--right" />
 | 
			
		||||
    </el-button>
 | 
			
		||||
    <el-dropdown-menu slot="dropdown" class="no-border">
 | 
			
		||||
 
 | 
			
		||||
@@ -1,14 +1,14 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <el-dropdown :show-timeout="100" trigger="click">
 | 
			
		||||
    <el-button plain>
 | 
			
		||||
      外链
 | 
			
		||||
      Link
 | 
			
		||||
      <i class="el-icon-caret-bottom el-icon--right" />
 | 
			
		||||
    </el-button>
 | 
			
		||||
    <el-dropdown-menu slot="dropdown" class="no-padding no-border" style="width:400px">
 | 
			
		||||
      <el-form-item label-width="0px" style="margin-bottom: 0px" prop="source_uri">
 | 
			
		||||
        <el-input v-model="source_uri" placeholder="请输入内容">
 | 
			
		||||
        <el-input v-model="source_uri" placeholder="Please enter the content">
 | 
			
		||||
          <template slot="prepend">
 | 
			
		||||
            填写url
 | 
			
		||||
            URL
 | 
			
		||||
          </template>
 | 
			
		||||
        </el-input>
 | 
			
		||||
      </el-form-item>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,11 +1,10 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <p class="warn-content">
 | 
			
		||||
    创建和编辑页面是不能被keep-alive 缓存的,因为keep-alive 的include 目前不支持根据路由来缓存,所以目前都是基于component name 来缓存的,如果你想要实现缓存的效果,可以使用localstorage 等浏览器缓存方案。或者不要使用keep-alive
 | 
			
		||||
    的include,直接缓存所有页面。详情见
 | 
			
		||||
  <aside>
 | 
			
		||||
    {{ $t('example.warning') }}
 | 
			
		||||
    <a
 | 
			
		||||
      href="https://panjiachen.github.io/vue-element-admin-site/guide/essentials/tags-view.html"
 | 
			
		||||
      target="_blank"
 | 
			
		||||
    >文档</a>
 | 
			
		||||
  </p>
 | 
			
		||||
    >Document</a>
 | 
			
		||||
  </aside>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,10 +1,9 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <div class="app-container">
 | 
			
		||||
    <p class="warn-content">
 | 
			
		||||
    <aside>
 | 
			
		||||
      {{ $t('guide.description') }}
 | 
			
		||||
      <a href="https://github.com/kamranahmedse/driver.js" target="_blank">driver.js.
 | 
			
		||||
      </a>
 | 
			
		||||
    </p>
 | 
			
		||||
      <a href="https://github.com/kamranahmedse/driver.js" target="_blank">driver.js.</a>
 | 
			
		||||
    </aside>
 | 
			
		||||
    <el-button icon="el-icon-question" type="primary" @click.prevent.stop="guide">
 | 
			
		||||
      {{ $t('guide.button') }}
 | 
			
		||||
    </el-button>
 | 
			
		||||
@@ -14,7 +13,7 @@
 | 
			
		||||
<script>
 | 
			
		||||
import Driver from 'driver.js' // import driver.js
 | 
			
		||||
import 'driver.js/dist/driver.min.css' // import driver.js css
 | 
			
		||||
import steps from './defineSteps'
 | 
			
		||||
import steps from './steps'
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  name: 'Guide',
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										74
									
								
								src/views/icons/element-icons.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								src/views/icons/element-icons.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,74 @@
 | 
			
		||||
const elementIcons = [
 | 
			
		||||
  'info',
 | 
			
		||||
  'error',
 | 
			
		||||
  'success',
 | 
			
		||||
  'warning',
 | 
			
		||||
  'question',
 | 
			
		||||
  'back',
 | 
			
		||||
  'arrow-left',
 | 
			
		||||
  'arrow-down',
 | 
			
		||||
  'arrow-right',
 | 
			
		||||
  'arrow-up',
 | 
			
		||||
  'caret-left',
 | 
			
		||||
  'caret-bottom',
 | 
			
		||||
  'caret-top',
 | 
			
		||||
  'caret-right',
 | 
			
		||||
  'd-arrow-left',
 | 
			
		||||
  'd-arrow-right',
 | 
			
		||||
  'minus',
 | 
			
		||||
  'plus',
 | 
			
		||||
  'remove',
 | 
			
		||||
  'circle-plus',
 | 
			
		||||
  'remove-outline',
 | 
			
		||||
  'circle-plus-outline',
 | 
			
		||||
  'close',
 | 
			
		||||
  'check',
 | 
			
		||||
  'circle-close',
 | 
			
		||||
  'circle-check',
 | 
			
		||||
  'circle-close-outline',
 | 
			
		||||
  'circle-check-outline',
 | 
			
		||||
  'zoom-out',
 | 
			
		||||
  'zoom-in',
 | 
			
		||||
  'd-caret',
 | 
			
		||||
  'sort',
 | 
			
		||||
  'sort-down',
 | 
			
		||||
  'sort-up',
 | 
			
		||||
  'tickets',
 | 
			
		||||
  'document',
 | 
			
		||||
  'goods',
 | 
			
		||||
  'sold-out',
 | 
			
		||||
  'news',
 | 
			
		||||
  'message',
 | 
			
		||||
  'date',
 | 
			
		||||
  'printer',
 | 
			
		||||
  'time',
 | 
			
		||||
  'bell',
 | 
			
		||||
  'mobile-phone',
 | 
			
		||||
  'service',
 | 
			
		||||
  'view',
 | 
			
		||||
  'menu',
 | 
			
		||||
  'more',
 | 
			
		||||
  'more-outline',
 | 
			
		||||
  'star-on',
 | 
			
		||||
  'star-off',
 | 
			
		||||
  'location',
 | 
			
		||||
  'location-outline',
 | 
			
		||||
  'phone',
 | 
			
		||||
  'phone-outline',
 | 
			
		||||
  'picture',
 | 
			
		||||
  'picture-outline',
 | 
			
		||||
  'delete',
 | 
			
		||||
  'search',
 | 
			
		||||
  'edit',
 | 
			
		||||
  'edit-outline',
 | 
			
		||||
  'rank',
 | 
			
		||||
  'refresh',
 | 
			
		||||
  'share',
 | 
			
		||||
  'setting',
 | 
			
		||||
  'upload',
 | 
			
		||||
  'upload2',
 | 
			
		||||
  'download',
 | 
			
		||||
  'loading'
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
export default elementIcons
 | 
			
		||||
@@ -1,12 +1,12 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <div class="icons-container">
 | 
			
		||||
    <p class="warn-content">
 | 
			
		||||
    <aside>
 | 
			
		||||
      <a href="https://panjiachen.github.io/vue-element-admin-site/guide/advanced/icon.html" target="_blank">Add and use
 | 
			
		||||
      </a>
 | 
			
		||||
    </p>
 | 
			
		||||
    </aside>
 | 
			
		||||
    <el-tabs type="border-card">
 | 
			
		||||
      <el-tab-pane label="Icons">
 | 
			
		||||
        <div v-for="item of iconsMap" :key="item" @click="handleClipboard(generateIconCode(item),$event)">
 | 
			
		||||
        <div v-for="item of svgIcons" :key="item" @click="handleClipboard(generateIconCode(item),$event)">
 | 
			
		||||
          <el-tooltip placement="top">
 | 
			
		||||
            <div slot="content">
 | 
			
		||||
              {{ generateIconCode(item) }}
 | 
			
		||||
@@ -37,15 +37,15 @@
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
import clipboard from '@/utils/clipboard'
 | 
			
		||||
import icons from './requireIcons'
 | 
			
		||||
import elementIcons from './element-icon.json'
 | 
			
		||||
import svgIcons from './svg-icons'
 | 
			
		||||
import elementIcons from './element-icons'
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  name: 'Icons',
 | 
			
		||||
  data() {
 | 
			
		||||
    return {
 | 
			
		||||
      iconsMap: icons,
 | 
			
		||||
      elementIcons: elementIcons
 | 
			
		||||
      svgIcons,
 | 
			
		||||
      elementIcons
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  methods: {
 | 
			
		||||
@@ -3,8 +3,8 @@ const requireAll = requireContext => requireContext.keys()
 | 
			
		||||
 | 
			
		||||
const re = /\.\/(.*)\.svg/
 | 
			
		||||
 | 
			
		||||
const icons = requireAll(req).map(i => {
 | 
			
		||||
const svgIcons = requireAll(req).map(i => {
 | 
			
		||||
  return i.match(re)[1]
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
export default icons
 | 
			
		||||
export default svgIcons
 | 
			
		||||
@@ -10,7 +10,7 @@
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
// import openWindow from '@/utils/openWindow'
 | 
			
		||||
// import openWindow from '@/utils/open-window'
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  name: 'SocialSignin',
 | 
			
		||||
@@ -81,7 +81,7 @@
 | 
			
		||||
<script>
 | 
			
		||||
import { validUsername } from '@/utils/validate'
 | 
			
		||||
import LangSelect from '@/components/LangSelect'
 | 
			
		||||
import SocialSign from './socialSignin'
 | 
			
		||||
import SocialSign from './components/SocialSignin'
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  name: 'Login',
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <div class="app-container">
 | 
			
		||||
    <code style="margin-top:15px;">{{ $t('pdf.tips') }}</code>
 | 
			
		||||
    <aside style="margin-top:15px;">{{ $t('pdf.tips') }}</aside>
 | 
			
		||||
    <router-link target="_blank" to="/pdf/download">
 | 
			
		||||
      <el-button type="primary">
 | 
			
		||||
        Click to download PDF
 | 
			
		||||
 
 | 
			
		||||
@@ -35,10 +35,10 @@
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <div :key="'checkPermission'+key" style="margin-top:60px;">
 | 
			
		||||
      <code>
 | 
			
		||||
      <aside>
 | 
			
		||||
        {{ $t('permission.tips') }}
 | 
			
		||||
        <br> e.g.
 | 
			
		||||
      </code>
 | 
			
		||||
      </aside>
 | 
			
		||||
 | 
			
		||||
      <el-tabs type="border-card" style="width:550px;">
 | 
			
		||||
        <el-tab-pane v-if="checkPermission(['admin'])" label="Admin">
 | 
			
		||||
 
 | 
			
		||||
@@ -1 +0,0 @@
 | 
			
		||||
["info","error","success","warning","question","back","arrow-left","arrow-down","arrow-right","arrow-up","caret-left","caret-bottom","caret-top","caret-right","d-arrow-left","d-arrow-right","minus","plus","remove","circle-plus","remove-outline","circle-plus-outline","close","check","circle-close","circle-check","circle-close-outline","circle-check-outline","zoom-out","zoom-in","d-caret","sort","sort-down","sort-up","tickets","document","goods","sold-out","news","message","date","printer","time","bell","mobile-phone","service","view","menu","more","more-outline","star-on","star-off","location","location-outline","phone","phone-outline","picture","picture-outline","delete","search","edit","edit-outline","rank","refresh","share","setting","upload","upload2","download","loading"]
 | 
			
		||||
@@ -13,7 +13,7 @@
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
import tabPane from './components/tabPane'
 | 
			
		||||
import tabPane from './components/TabPane'
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  name: 'Tab',
 | 
			
		||||
 
 | 
			
		||||
@@ -148,9 +148,9 @@
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
import { fetchList, fetchPv, createArticle, updateArticle } from '@/api/article'
 | 
			
		||||
import waves from '@/directive/waves' // Waves directive
 | 
			
		||||
import waves from '@/directive/waves' // waves directive
 | 
			
		||||
import { parseTime } from '@/utils'
 | 
			
		||||
import Pagination from '@/components/Pagination' // Secondary package based on el-pagination
 | 
			
		||||
import Pagination from '@/components/Pagination' // secondary package based on el-pagination
 | 
			
		||||
 | 
			
		||||
const calendarTypeOptions = [
 | 
			
		||||
  { key: 'CN', display_name: 'China' },
 | 
			
		||||
@@ -159,7 +159,7 @@ const calendarTypeOptions = [
 | 
			
		||||
  { key: 'EU', display_name: 'Eurozone' }
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
// arr to obj ,such as { CN : "China", US : "USA" }
 | 
			
		||||
// arr to obj, such as { CN : "China", US : "USA" }
 | 
			
		||||
const calendarTypeKeyValue = calendarTypeOptions.reduce((acc, cur) => {
 | 
			
		||||
  acc[cur.key] = cur.display_name
 | 
			
		||||
  return acc
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user