+ :on-success="handleImageSuccess">
将文件拖到此处,或点击上传
@@ -50,7 +50,7 @@ export default {
emitInput(val) {
this.$emit('input', val)
},
- handleImageScucess(file) {
+ handleImageSuccess(file) {
this.emitInput(file.files.file)
},
beforeUpload() {
diff --git a/src/components/UploadExcel/index.vue b/src/components/UploadExcel/index.vue
index 49658f48..f9e6a87b 100644
--- a/src/components/UploadExcel/index.vue
+++ b/src/components/UploadExcel/index.vue
@@ -41,6 +41,11 @@ export default {
return
}
const rawFile = files[0] // only use files[0]
+
+ if (!this.isExcel(rawFile)) {
+ this.$message.error('Only supports upload .xlsx, .xls, .csv suffix files')
+ return false
+ }
this.upload(rawFile)
e.stopPropagation()
e.preventDefault()
@@ -110,6 +115,9 @@ export default {
headers.push(hdr)
}
return headers
+ },
+ isExcel(file) {
+ return /\.(xlsx|xls|csv)$/.test(file.name)
}
}
}
diff --git a/src/directive/waves/waves.js b/src/directive/waves/waves.js
index ac1d8611..83070113 100644
--- a/src/directive/waves/waves.js
+++ b/src/directive/waves/waves.js
@@ -29,8 +29,8 @@ export default{
ripple.style.left = (rect.width / 2 - ripple.offsetWidth / 2) + 'px'
break
default:
- ripple.style.top = (e.pageY - rect.top - ripple.offsetHeight / 2 - document.body.scrollTop) + 'px'
- ripple.style.left = (e.pageX - rect.left - ripple.offsetWidth / 2 - document.body.scrollLeft) + 'px'
+ ripple.style.top = (e.pageY - rect.top - ripple.offsetHeight / 2 - document.documentElement.scrollTop || document.body.scrollTop) + 'px'
+ ripple.style.left = (e.pageX - rect.left - ripple.offsetWidth / 2 - document.documentElement.scrollLeft || document.body.scrollLeft) + 'px'
}
ripple.style.backgroundColor = opts.color
ripple.className = 'waves-ripple z-active'
diff --git a/src/lang/index.js b/src/lang/index.js
index a36a9804..a77b07ea 100644
--- a/src/lang/index.js
+++ b/src/lang/index.js
@@ -20,8 +20,11 @@ const messages = {
}
const i18n = new VueI18n({
- locale: Cookies.get('language') || 'en', // set locale
- messages // set locale messages
+ // set locale
+ // options: en or zh
+ locale: Cookies.get('language') || 'en',
+ // set locale messages
+ messages
})
export default i18n
diff --git a/src/main.js b/src/main.js
index ac246444..1dc4af9e 100644
--- a/src/main.js
+++ b/src/main.js
@@ -1,6 +1,6 @@
import Vue from 'vue'
-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 'element-ui/lib/theme-chalk/index.css'
@@ -13,7 +13,7 @@ import store from './store'
import i18n from './lang' // Internationalization
import './icons' // icon
-import './errorLog'// error log
+import './errorLog' // error log
import './permission' // permission control
import './mock' // simulation data
diff --git a/src/permission.js b/src/permission.js
index 6fe91b48..22522832 100644
--- a/src/permission.js
+++ b/src/permission.js
@@ -40,7 +40,7 @@ router.beforeEach((to, from, next) => {
} else {
// 没有动态改变权限的需求可直接next() 删除下方权限判断 ↓
if (hasPermission(store.getters.roles, to.meta.roles)) {
- next()//
+ next()
} else {
next({ path: '/401', replace: true, query: { noGoBack: true }})
}
diff --git a/src/router/index.js b/src/router/index.js
index 8df2b8bf..0492a28f 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -6,9 +6,15 @@ Vue.use(Router)
/* Layout */
import Layout from '@/views/layout/Layout'
+/* Router Modules */
+import componentsRouter from './modules/components'
+import chartsRouter from './modules/charts'
+import tableRouter from './modules/table'
+import nestedRouter from './modules/nested'
+
/** note: submenu only apppear when children.length>=1
-* detail see https://panjiachen.github.io/vue-element-admin-site/guide/essentials/router-and-nav.html
-**/
+ * detail see https://panjiachen.github.io/vue-element-admin-site/guide/essentials/router-and-nav.html
+ **/
/**
* hidden: true if `hidden:true` will not show in the sidebar(default is false)
@@ -25,42 +31,64 @@ import Layout from '@/views/layout/Layout'
}
**/
export const constantRouterMap = [
- { path: '/login', component: () => import('@/views/login/index'), hidden: true },
- { path: '/authredirect', component: () => import('@/views/login/authredirect'), hidden: true },
- { path: '/404', component: () => import('@/views/errorPage/404'), hidden: true },
- { path: '/401', component: () => import('@/views/errorPage/401'), hidden: true },
+ {
+ path: '/login',
+ component: () => import('@/views/login/index'),
+ hidden: true
+ },
+ {
+ path: '/authredirect',
+ component: () => import('@/views/login/authredirect'),
+ hidden: true
+ },
+ {
+ path: '/404',
+ component: () => import('@/views/errorPage/404'),
+ hidden: true
+ },
+ {
+ path: '/401',
+ component: () => import('@/views/errorPage/401'),
+ hidden: true
+ },
{
path: '',
component: Layout,
redirect: 'dashboard',
- children: [{
- path: 'dashboard',
- component: () => import('@/views/dashboard/index'),
- name: 'dashboard',
- meta: { title: 'dashboard', icon: 'dashboard', noCache: true }
- }]
+ children: [
+ {
+ path: 'dashboard',
+ component: () => import('@/views/dashboard/index'),
+ name: 'dashboard',
+ meta: { title: 'dashboard', icon: 'dashboard', noCache: true }
+ }
+ ]
},
{
path: '/documentation',
component: Layout,
redirect: '/documentation/index',
- children: [{
- path: 'index',
- component: () => import('@/views/documentation/index'),
- name: 'documentation',
- meta: { title: 'documentation', icon: 'documentation', noCache: true }
- }]
+ children: [
+ {
+ path: 'index',
+ component: () => import('@/views/documentation/index'),
+ name: 'documentation',
+ meta: { title: 'documentation', icon: 'documentation', noCache: true }
+ }
+ ]
},
{
path: '/guide',
component: Layout,
redirect: '/guide/index',
- children: [{
- path: 'index',
- component: () => import('@/views/guide/index'),
- name: 'guide',
- meta: { title: 'guide', icon: 'guide', noCache: true }
- }]
+ children: [
+ {
+ path: 'index',
+ component: () => import('@/views/guide/index'),
+ name: 'guide',
+ meta: { title: 'guide', icon: 'guide', noCache: true }
+ }
+ ]
}
]
@@ -81,107 +109,46 @@ export const asyncRouterMap = [
icon: 'lock',
roles: ['admin', 'editor'] // you can set roles in root nav
},
- children: [{
- path: 'page',
- component: () => import('@/views/permission/page'),
- name: 'pagePermission',
- meta: {
- title: 'pagePermission',
- roles: ['admin'] // or you can only set roles in sub nav
+ children: [
+ {
+ path: 'page',
+ component: () => import('@/views/permission/page'),
+ name: 'pagePermission',
+ meta: {
+ title: 'pagePermission',
+ roles: ['admin'] // or you can only set roles in sub nav
+ }
+ },
+ {
+ path: 'directive',
+ component: () => import('@/views/permission/directive'),
+ name: 'directivePermission',
+ meta: {
+ title: 'directivePermission'
+ // if do not set roles, means: this page does not require permission
+ }
}
- }, {
- path: 'directive',
- component: () => import('@/views/permission/directive'),
- name: 'directivePermission',
- meta: {
- title: 'directivePermission'
- // if do not set roles, means: this page does not require permission
- }
- }]
+ ]
},
{
path: '/icon',
component: Layout,
- children: [{
- path: 'index',
- component: () => import('@/views/svg-icons/index'),
- name: 'icons',
- meta: { title: 'icons', icon: 'icon', noCache: true }
- }]
- },
-
- {
- path: '/components',
- component: Layout,
- redirect: 'noredirect',
- name: 'component-demo',
- meta: {
- title: 'components',
- icon: 'component'
- },
children: [
- { path: 'tinymce', component: () => import('@/views/components-demo/tinymce'), name: 'tinymce-demo', meta: { title: 'tinymce' }},
- { path: 'markdown', component: () => import('@/views/components-demo/markdown'), name: 'markdown-demo', meta: { title: 'markdown' }},
- { path: 'json-editor', component: () => import('@/views/components-demo/jsonEditor'), name: 'jsonEditor-demo', meta: { title: 'jsonEditor' }},
- { path: 'splitpane', component: () => import('@/views/components-demo/splitpane'), name: 'splitpane-demo', meta: { title: 'splitPane' }},
- { path: 'avatar-upload', component: () => import('@/views/components-demo/avatarUpload'), name: 'avatarUpload-demo', meta: { title: 'avatarUpload' }},
- { path: 'dropzone', component: () => import('@/views/components-demo/dropzone'), name: 'dropzone-demo', meta: { title: 'dropzone' }},
- { path: 'sticky', component: () => import('@/views/components-demo/sticky'), name: 'sticky-demo', meta: { title: 'sticky' }},
- { path: 'count-to', component: () => import('@/views/components-demo/countTo'), name: 'countTo-demo', meta: { title: 'countTo' }},
- { path: 'mixin', component: () => import('@/views/components-demo/mixin'), name: 'componentMixin-demo', meta: { title: 'componentMixin' }},
- { path: 'back-to-top', component: () => import('@/views/components-demo/backToTop'), name: 'backToTop-demo', meta: { title: 'backToTop' }},
- { path: 'drag-dialog', component: () => import('@/views/components-demo/dragDialog'), name: 'dragDialog-demo', meta: { title: 'dragDialog' }},
- { path: 'dnd-list', component: () => import('@/views/components-demo/dndList'), name: 'dndList-demo', meta: { title: 'dndList' }},
- { path: 'drag-kanban', component: () => import('@/views/components-demo/dragKanban'), name: 'dragKanban-demo', meta: { title: 'dragKanban' }}
+ {
+ path: 'index',
+ component: () => import('@/views/svg-icons/index'),
+ name: 'icons',
+ meta: { title: 'icons', icon: 'icon', noCache: true }
+ }
]
},
- {
- path: '/charts',
- component: Layout,
- redirect: 'noredirect',
- name: 'charts',
- meta: {
- title: 'charts',
- icon: 'chart'
- },
- children: [
- { path: 'keyboard', component: () => import('@/views/charts/keyboard'), name: 'keyboardChart', meta: { title: 'keyboardChart', noCache: true }},
- { path: 'line', component: () => import('@/views/charts/line'), name: 'lineChart', meta: { title: 'lineChart', noCache: true }},
- { path: 'mixchart', component: () => import('@/views/charts/mixChart'), name: 'mixChart', meta: { title: 'mixChart', noCache: true }}
- ]
- },
-
- {
- path: '/tab',
- component: Layout,
- children: [{
- path: 'index',
- component: () => import('@/views/tab/index'),
- name: 'tab',
- meta: { title: 'tab', icon: 'tab' }
- }]
- },
-
- {
- path: '/table',
- component: Layout,
- redirect: '/table/complex-table',
- name: 'table',
- meta: {
- title: 'Table',
- icon: 'table'
- },
- children: [
- { path: 'dynamic-table', component: () => import('@/views/table/dynamicTable/index'), name: 'dynamicTable', meta: { title: 'dynamicTable' }},
- { path: 'drag-table', component: () => import('@/views/table/dragTable'), name: 'dragTable', meta: { title: 'dragTable' }},
- { path: 'inline-edit-table', component: () => import('@/views/table/inlineEditTable'), name: 'inlineEditTable', meta: { title: 'inlineEditTable' }},
- { path: 'tree-table', component: () => import('@/views/table/treeTable/treeTable'), name: 'treeTableDemo', meta: { title: 'treeTable' }},
- { path: 'custom-tree-table', component: () => import('@/views/table/treeTable/customTreeTable'), name: 'customTreeTableDemo', meta: { title: 'customTreeTable' }},
- { path: 'complex-table', component: () => import('@/views/table/complexTable'), name: 'complexTable', meta: { title: 'complexTable' }}
- ]
- },
+ /** When your routing table is too long, you can split it into small modules**/
+ componentsRouter,
+ chartsRouter,
+ nestedRouter,
+ tableRouter,
{
path: '/example',
@@ -193,69 +160,37 @@ export const asyncRouterMap = [
icon: 'example'
},
children: [
- { path: 'create', component: () => import('@/views/example/create'), name: 'createArticle', meta: { title: 'createArticle', icon: 'edit' }},
- { path: 'edit/:id(\\d+)', component: () => import('@/views/example/edit'), name: 'editArticle', meta: { title: 'editArticle', noCache: true }, hidden: true },
- { path: 'list', component: () => import('@/views/example/list'), name: 'articleList', meta: { title: 'articleList', icon: 'list' }}
+ {
+ path: 'create',
+ component: () => import('@/views/example/create'),
+ name: 'createArticle',
+ meta: { title: 'createArticle', icon: 'edit' }
+ },
+ {
+ path: 'edit/:id(\\d+)',
+ component: () => import('@/views/example/edit'),
+ name: 'editArticle',
+ meta: { title: 'editArticle', noCache: true },
+ hidden: true
+ },
+ {
+ path: 'list',
+ component: () => import('@/views/example/list'),
+ name: 'articleList',
+ meta: { title: 'articleList', icon: 'list' }
+ }
]
},
{
- path: '/nested',
+ path: '/tab',
component: Layout,
- redirect: '/nested/menu1/menu1-1',
- name: 'nested',
- meta: {
- title: 'nested',
- icon: 'nested'
- },
children: [
{
- path: 'menu1',
- component: () => import('@/views/nested/menu1/index'), // Parent router-view
- name: 'menu1',
- meta: { title: 'menu1' },
- redirect: '/nested/menu1/menu1-1',
- children: [
- {
- path: 'menu1-1',
- component: () => import('@/views/nested/menu1/menu1-1'),
- name: 'menu1-1',
- meta: { title: 'menu1-1' }
- },
- {
- path: 'menu1-2',
- component: () => import('@/views/nested/menu1/menu1-2'),
- name: 'menu1-2',
- redirect: '/nested/menu1/menu1-2/menu1-2-1',
- meta: { title: 'menu1-2' },
- children: [
- {
- path: 'menu1-2-1',
- component: () => import('@/views/nested/menu1/menu1-2/menu1-2-1'),
- name: 'menu1-2-1',
- meta: { title: 'menu1-2-1' }
- },
- {
- path: 'menu1-2-2',
- component: () => import('@/views/nested/menu1/menu1-2/menu1-2-2'),
- name: 'menu1-2-2',
- meta: { title: 'menu1-2-2' }
- }
- ]
- },
- {
- path: 'menu1-3',
- component: () => import('@/views/nested/menu1/menu1-3'),
- name: 'menu1-3',
- meta: { title: 'menu1-3' }
- }
- ]
- },
- {
- path: 'menu2',
- name: 'menu2',
- component: () => import('@/views/nested/menu2/index'),
- meta: { title: 'menu2' }
+ path: 'index',
+ component: () => import('@/views/tab/index'),
+ name: 'tab',
+ meta: { title: 'tab', icon: 'tab' }
}
]
},
@@ -270,8 +205,18 @@ export const asyncRouterMap = [
icon: '404'
},
children: [
- { path: '401', component: () => import('@/views/errorPage/401'), name: 'page401', meta: { title: 'page401', noCache: true }},
- { path: '404', component: () => import('@/views/errorPage/404'), name: 'page404', meta: { title: 'page404', noCache: true }}
+ {
+ path: '401',
+ component: () => import('@/views/errorPage/401'),
+ name: 'page401',
+ meta: { title: 'page401', noCache: true }
+ },
+ {
+ path: '404',
+ component: () => import('@/views/errorPage/404'),
+ name: 'page404',
+ meta: { title: 'page404', noCache: true }
+ }
]
},
@@ -279,7 +224,14 @@ export const asyncRouterMap = [
path: '/error-log',
component: Layout,
redirect: 'noredirect',
- children: [{ path: 'log', component: () => import('@/views/errorLog/index'), name: 'errorLog', meta: { title: 'errorLog', icon: 'bug' }}]
+ children: [
+ {
+ path: 'log',
+ component: () => import('@/views/errorLog/index'),
+ name: 'errorLog',
+ meta: { title: 'errorLog', icon: 'bug' }
+ }
+ ]
},
{
@@ -292,9 +244,24 @@ export const asyncRouterMap = [
icon: 'excel'
},
children: [
- { path: 'export-excel', component: () => import('@/views/excel/exportExcel'), name: 'exportExcel', meta: { title: 'exportExcel' }},
- { path: 'export-selected-excel', component: () => import('@/views/excel/selectExcel'), name: 'selectExcel', meta: { title: 'selectExcel' }},
- { path: 'upload-excel', component: () => import('@/views/excel/uploadExcel'), name: 'uploadExcel', meta: { title: 'uploadExcel' }}
+ {
+ path: 'export-excel',
+ component: () => import('@/views/excel/exportExcel'),
+ name: 'exportExcel',
+ meta: { title: 'exportExcel' }
+ },
+ {
+ path: 'export-selected-excel',
+ component: () => import('@/views/excel/selectExcel'),
+ name: 'selectExcel',
+ meta: { title: 'selectExcel' }
+ },
+ {
+ path: 'upload-excel',
+ component: () => import('@/views/excel/uploadExcel'),
+ name: 'uploadExcel',
+ meta: { title: 'uploadExcel' }
+ }
]
},
@@ -304,27 +271,55 @@ export const asyncRouterMap = [
redirect: '/zip/download',
alwaysShow: true,
meta: { title: 'zip', icon: 'zip' },
- children: [{ path: 'download', component: () => import('@/views/zip/index'), name: 'exportZip', meta: { title: 'exportZip' }}]
+ children: [
+ {
+ path: 'download',
+ component: () => import('@/views/zip/index'),
+ name: 'exportZip',
+ meta: { title: 'exportZip' }
+ }
+ ]
},
{
path: '/theme',
component: Layout,
redirect: 'noredirect',
- children: [{ path: 'index', component: () => import('@/views/theme/index'), name: 'theme', meta: { title: 'theme', icon: 'theme' }}]
+ children: [
+ {
+ path: 'index',
+ component: () => import('@/views/theme/index'),
+ name: 'theme',
+ meta: { title: 'theme', icon: 'theme' }
+ }
+ ]
},
{
path: '/clipboard',
component: Layout,
redirect: 'noredirect',
- children: [{ path: 'index', component: () => import('@/views/clipboard/index'), name: 'clipboardDemo', meta: { title: 'clipboardDemo', icon: 'clipboard' }}]
+ children: [
+ {
+ path: 'index',
+ component: () => import('@/views/clipboard/index'),
+ name: 'clipboardDemo',
+ meta: { title: 'clipboardDemo', icon: 'clipboard' }
+ }
+ ]
},
{
path: '/i18n',
component: Layout,
- children: [{ path: 'index', component: () => import('@/views/i18n-demo/index'), name: 'i18n', meta: { title: 'i18n', icon: 'international' }}]
+ children: [
+ {
+ path: 'index',
+ component: () => import('@/views/i18n-demo/index'),
+ name: 'i18n',
+ meta: { title: 'i18n', icon: 'international' }
+ }
+ ]
},
{ path: '*', redirect: '/404', hidden: true }
diff --git a/src/router/modules/charts.js b/src/router/modules/charts.js
new file mode 100644
index 00000000..8bdff406
--- /dev/null
+++ b/src/router/modules/charts.js
@@ -0,0 +1,36 @@
+/** When your routing table is too long, you can split it into small modules**/
+
+import Layout from '@/views/layout/Layout'
+
+const chartsRouter = {
+ path: '/charts',
+ component: Layout,
+ redirect: 'noredirect',
+ name: 'charts',
+ meta: {
+ title: 'charts',
+ icon: 'chart'
+ },
+ children: [
+ {
+ path: 'keyboard',
+ component: () => import('@/views/charts/keyboard'),
+ name: 'keyboardChart',
+ meta: { title: 'keyboardChart', noCache: true }
+ },
+ {
+ path: 'line',
+ component: () => import('@/views/charts/line'),
+ name: 'lineChart',
+ meta: { title: 'lineChart', noCache: true }
+ },
+ {
+ path: 'mixchart',
+ component: () => import('@/views/charts/mixChart'),
+ name: 'mixChart',
+ meta: { title: 'mixChart', noCache: true }
+ }
+ ]
+}
+
+export default chartsRouter
diff --git a/src/router/modules/components.js b/src/router/modules/components.js
new file mode 100644
index 00000000..62d4520d
--- /dev/null
+++ b/src/router/modules/components.js
@@ -0,0 +1,96 @@
+/** When your routing table is too long, you can split it into small modules**/
+
+import Layout from '@/views/layout/Layout'
+
+const componentsRouter = {
+ path: '/components',
+ component: Layout,
+ redirect: 'noredirect',
+ name: 'component-demo',
+ meta: {
+ title: 'components',
+ icon: 'component'
+ },
+ children: [
+ {
+ path: 'tinymce',
+ component: () => import('@/views/components-demo/tinymce'),
+ name: 'tinymce-demo',
+ meta: { title: 'tinymce' }
+ },
+ {
+ path: 'markdown',
+ component: () => import('@/views/components-demo/markdown'),
+ name: 'markdown-demo',
+ meta: { title: 'markdown' }
+ },
+ {
+ path: 'json-editor',
+ component: () => import('@/views/components-demo/jsonEditor'),
+ name: 'jsonEditor-demo',
+ meta: { title: 'jsonEditor' }
+ },
+ {
+ path: 'splitpane',
+ component: () => import('@/views/components-demo/splitpane'),
+ name: 'splitpane-demo',
+ meta: { title: 'splitPane' }
+ },
+ {
+ path: 'avatar-upload',
+ component: () => import('@/views/components-demo/avatarUpload'),
+ name: 'avatarUpload-demo',
+ meta: { title: 'avatarUpload' }
+ },
+ {
+ path: 'dropzone',
+ component: () => import('@/views/components-demo/dropzone'),
+ name: 'dropzone-demo',
+ meta: { title: 'dropzone' }
+ },
+ {
+ path: 'sticky',
+ component: () => import('@/views/components-demo/sticky'),
+ name: 'sticky-demo',
+ meta: { title: 'sticky' }
+ },
+ {
+ path: 'count-to',
+ component: () => import('@/views/components-demo/countTo'),
+ name: 'countTo-demo',
+ meta: { title: 'countTo' }
+ },
+ {
+ path: 'mixin',
+ component: () => import('@/views/components-demo/mixin'),
+ name: 'componentMixin-demo',
+ meta: { title: 'componentMixin' }
+ },
+ {
+ path: 'back-to-top',
+ component: () => import('@/views/components-demo/backToTop'),
+ name: 'backToTop-demo',
+ meta: { title: 'backToTop' }
+ },
+ {
+ path: 'drag-dialog',
+ component: () => import('@/views/components-demo/dragDialog'),
+ name: 'dragDialog-demo',
+ meta: { title: 'dragDialog' }
+ },
+ {
+ path: 'dnd-list',
+ component: () => import('@/views/components-demo/dndList'),
+ name: 'dndList-demo',
+ meta: { title: 'dndList' }
+ },
+ {
+ path: 'drag-kanban',
+ component: () => import('@/views/components-demo/dragKanban'),
+ name: 'dragKanban-demo',
+ meta: { title: 'dragKanban' }
+ }
+ ]
+}
+
+export default componentsRouter
diff --git a/src/router/modules/nested.js b/src/router/modules/nested.js
new file mode 100644
index 00000000..0cbd9272
--- /dev/null
+++ b/src/router/modules/nested.js
@@ -0,0 +1,66 @@
+/** When your routing table is too long, you can split it into small modules**/
+
+import Layout from '@/views/layout/Layout'
+
+const nestedRouter = {
+ path: '/nested',
+ component: Layout,
+ redirect: '/nested/menu1/menu1-1',
+ name: 'nested',
+ meta: {
+ title: 'nested',
+ icon: 'nested'
+ },
+ children: [
+ {
+ path: 'menu1',
+ component: () => import('@/views/nested/menu1/index'), // Parent router-view
+ name: 'menu1',
+ meta: { title: 'menu1' },
+ redirect: '/nested/menu1/menu1-1',
+ children: [
+ {
+ path: 'menu1-1',
+ component: () => import('@/views/nested/menu1/menu1-1'),
+ name: 'menu1-1',
+ meta: { title: 'menu1-1' }
+ },
+ {
+ path: 'menu1-2',
+ component: () => import('@/views/nested/menu1/menu1-2'),
+ name: 'menu1-2',
+ redirect: '/nested/menu1/menu1-2/menu1-2-1',
+ meta: { title: 'menu1-2' },
+ children: [
+ {
+ path: 'menu1-2-1',
+ component: () => import('@/views/nested/menu1/menu1-2/menu1-2-1'),
+ name: 'menu1-2-1',
+ meta: { title: 'menu1-2-1' }
+ },
+ {
+ path: 'menu1-2-2',
+ component: () => import('@/views/nested/menu1/menu1-2/menu1-2-2'),
+ name: 'menu1-2-2',
+ meta: { title: 'menu1-2-2' }
+ }
+ ]
+ },
+ {
+ path: 'menu1-3',
+ component: () => import('@/views/nested/menu1/menu1-3'),
+ name: 'menu1-3',
+ meta: { title: 'menu1-3' }
+ }
+ ]
+ },
+ {
+ path: 'menu2',
+ name: 'menu2',
+ component: () => import('@/views/nested/menu2/index'),
+ meta: { title: 'menu2' }
+ }
+ ]
+}
+
+export default nestedRouter
diff --git a/src/router/modules/table.js b/src/router/modules/table.js
new file mode 100644
index 00000000..fde5a41f
--- /dev/null
+++ b/src/router/modules/table.js
@@ -0,0 +1,53 @@
+/** When your routing table is too long, you can split it into small modules**/
+
+import Layout from '@/views/layout/Layout'
+
+const tableRouter = {
+ path: '/table',
+ component: Layout,
+ redirect: '/table/complex-table',
+ name: 'table',
+ meta: {
+ title: 'Table',
+ icon: 'table'
+ },
+ children: [
+ {
+ path: 'dynamic-table',
+ component: () => import('@/views/table/dynamicTable/index'),
+ name: 'dynamicTable',
+ meta: { title: 'dynamicTable' }
+ },
+ {
+ path: 'drag-table',
+ component: () => import('@/views/table/dragTable'),
+ name: 'dragTable',
+ meta: { title: 'dragTable' }
+ },
+ {
+ path: 'inline-edit-table',
+ component: () => import('@/views/table/inlineEditTable'),
+ name: 'inlineEditTable',
+ meta: { title: 'inlineEditTable' }
+ },
+ {
+ path: 'tree-table',
+ component: () => import('@/views/table/treeTable/treeTable'),
+ name: 'treeTableDemo',
+ meta: { title: 'treeTable' }
+ },
+ {
+ path: 'custom-tree-table',
+ component: () => import('@/views/table/treeTable/customTreeTable'),
+ name: 'customTreeTableDemo',
+ meta: { title: 'customTreeTable' }
+ },
+ {
+ path: 'complex-table',
+ component: () => import('@/views/table/complexTable'),
+ name: 'complexTable',
+ meta: { title: 'complexTable' }
+ }
+ ]
+}
+export default tableRouter
diff --git a/src/store/modules/tagsView.js b/src/store/modules/tagsView.js
index 06d092c9..bb126492 100644
--- a/src/store/modules/tagsView.js
+++ b/src/store/modules/tagsView.js
@@ -6,9 +6,11 @@ const tagsView = {
mutations: {
ADD_VISITED_VIEWS: (state, view) => {
if (state.visitedViews.some(v => v.path === view.path)) return
- state.visitedViews.push(Object.assign({}, view, {
- title: view.meta.title || 'no-name'
- }))
+ state.visitedViews.push(
+ Object.assign({}, view, {
+ title: view.meta.title || 'no-name'
+ })
+ )
if (!view.meta.noCache) {
state.cachedViews.push(view.name)
}
@@ -38,12 +40,12 @@ const tagsView = {
for (const i of state.cachedViews) {
if (i === view.name) {
const index = state.cachedViews.indexOf(i)
- state.cachedViews = state.cachedViews.slice(index, i + 1)
+ state.cachedViews = state.cachedViews.slice(index, index + 1)
break
}
}
},
- DEL_ALL_VIEWS: (state) => {
+ DEL_ALL_VIEWS: state => {
state.visitedViews = []
state.cachedViews = []
}
@@ -53,19 +55,19 @@ const tagsView = {
commit('ADD_VISITED_VIEWS', view)
},
delVisitedViews({ commit, state }, view) {
- return new Promise((resolve) => {
+ return new Promise(resolve => {
commit('DEL_VISITED_VIEWS', view)
resolve([...state.visitedViews])
})
},
delOthersViews({ commit, state }, view) {
- return new Promise((resolve) => {
+ return new Promise(resolve => {
commit('DEL_OTHERS_VIEWS', view)
resolve([...state.visitedViews])
})
},
delAllViews({ commit, state }) {
- return new Promise((resolve) => {
+ return new Promise(resolve => {
commit('DEL_ALL_VIEWS')
resolve([...state.visitedViews])
})
diff --git a/src/utils/index.js b/src/utils/index.js
index 31295122..3e540802 100644
--- a/src/utils/index.js
+++ b/src/utils/index.js
@@ -25,7 +25,7 @@ export function parseTime(time, cFormat) {
}
const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
let value = formatObj[key]
- if (key === 'a') return ['一', '二', '三', '四', '五', '六', '日'][value - 1]
+ if (key === 'a') { return ['一', '二', '三', '四', '五', '六', '日'][value - 1] }
if (result.length > 0 && value < 10) {
value = '0' + value
}
@@ -43,7 +43,8 @@ export function formatTime(time, option) {
if (diff < 30) {
return '刚刚'
- } else if (diff < 3600) { // less 1 hour
+ } else if (diff < 3600) {
+ // less 1 hour
return Math.ceil(diff / 60) + '分钟前'
} else if (diff < 3600 * 24) {
return Math.ceil(diff / 3600) + '小时前'
@@ -53,7 +54,17 @@ export function formatTime(time, option) {
if (option) {
return parseTime(time, option)
} else {
- return d.getMonth() + 1 + '月' + d.getDate() + '日' + d.getHours() + '时' + d.getMinutes() + '分'
+ return (
+ d.getMonth() +
+ 1 +
+ '月' +
+ d.getDate() +
+ '日' +
+ d.getHours() +
+ '时' +
+ d.getMinutes() +
+ '分'
+ )
}
}
@@ -81,9 +92,11 @@ export function getQueryObject(url) {
export function getByteLen(val) {
let len = 0
for (let i = 0; i < val.length; i++) {
- if (val[i].match(/[^\x00-\xff]/ig) != null) {
+ if (val[i].match(/[^\x00-\xff]/gi) != null) {
len += 1
- } else { len += 0.5 }
+ } else {
+ len += 0.5
+ }
}
return Math.floor(len)
}
@@ -100,11 +113,12 @@ export function cleanArray(actual) {
export function param(json) {
if (!json) return ''
- return cleanArray(Object.keys(json).map(key => {
- if (json[key] === undefined) return ''
- return encodeURIComponent(key) + '=' +
- encodeURIComponent(json[key])
- })).join('&')
+ return cleanArray(
+ Object.keys(json).map(key => {
+ if (json[key] === undefined) return ''
+ return encodeURIComponent(key) + '=' + encodeURIComponent(json[key])
+ })
+ ).join('&')
}
export function param2Obj(url) {
@@ -112,7 +126,14 @@ export function param2Obj(url) {
if (!search) {
return {}
}
- return JSON.parse('{"' + decodeURIComponent(search).replace(/"/g, '\\"').replace(/&/g, '","').replace(/=/g, '":"') + '"}')
+ return JSON.parse(
+ '{"' +
+ decodeURIComponent(search)
+ .replace(/"/g, '\\"')
+ .replace(/&/g, '","')
+ .replace(/=/g, '":"') +
+ '"}'
+ )
}
export function html2Text(val) {
@@ -131,7 +152,7 @@ export function objectMerge(target, source) {
if (Array.isArray(source)) {
return source.slice()
}
- Object.keys(source).forEach((property) => {
+ Object.keys(source).forEach(property => {
const sourceProperty = source[property]
if (typeof sourceProperty === 'object') {
target[property] = objectMerge(target[property], sourceProperty)
@@ -145,7 +166,7 @@ export function objectMerge(target, source) {
export function scrollTo(element, to, duration) {
if (duration <= 0) return
const difference = to - element.scrollTop
- const perTick = difference / duration * 10
+ const perTick = (difference / duration) * 10
setTimeout(() => {
console.log(new Date())
element.scrollTop = element.scrollTop + perTick
@@ -163,7 +184,9 @@ export function toggleClass(element, className) {
if (nameIndex === -1) {
classString += '' + className
} else {
- classString = classString.substr(0, nameIndex) + classString.substr(nameIndex + className.length)
+ classString =
+ classString.substr(0, nameIndex) +
+ classString.substr(nameIndex + className.length)
}
element.className = classString
}
@@ -177,7 +200,8 @@ export const pickerOptions = [
end.setTime(start.getTime())
picker.$emit('pick', [start, end])
}
- }, {
+ },
+ {
text: '最近一周',
onClick(picker) {
const end = new Date(new Date().toDateString())
@@ -185,7 +209,8 @@ export const pickerOptions = [
start.setTime(end.getTime() - 3600 * 1000 * 24 * 7)
picker.$emit('pick', [start, end])
}
- }, {
+ },
+ {
text: '最近一个月',
onClick(picker) {
const end = new Date(new Date().toDateString())
@@ -193,7 +218,8 @@ export const pickerOptions = [
start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)
picker.$emit('pick', [start, end])
}
- }, {
+ },
+ {
text: '最近三个月',
onClick(picker) {
const end = new Date(new Date().toDateString())
@@ -201,7 +227,8 @@ export const pickerOptions = [
start.setTime(start.getTime() - 3600 * 1000 * 24 * 90)
picker.$emit('pick', [start, end])
}
- }]
+ }
+]
export function getTime(type) {
if (type === 'start') {
@@ -256,7 +283,7 @@ export function deepClone(source) {
throw new Error('error arguments', 'shallowClone')
}
const targetObj = source.constructor === Array ? [] : {}
- Object.keys(source).forEach((keys) => {
+ Object.keys(source).forEach(keys => {
if (source[keys] && typeof source[keys] === 'object') {
targetObj[keys] = deepClone(source[keys])
} else {
diff --git a/src/utils/permission.js b/src/utils/permission.js
index 7bd22e01..221d3842 100644
--- a/src/utils/permission.js
+++ b/src/utils/permission.js
@@ -23,4 +23,3 @@ export default function checkPermission(value) {
return false
}
}
-
diff --git a/src/utils/request.js b/src/utils/request.js
index 0bcb1833..5ce53933 100644
--- a/src/utils/request.js
+++ b/src/utils/request.js
@@ -10,18 +10,21 @@ const service = axios.create({
})
// request interceptor
-service.interceptors.request.use(config => {
- // Do something before request is sent
- if (store.getters.token) {
- // 让每个请求携带token-- ['X-Token']为自定义key 请根据实际情况自行修改
- config.headers['X-Token'] = getToken()
+service.interceptors.request.use(
+ config => {
+ // Do something before request is sent
+ if (store.getters.token) {
+ // 让每个请求携带token-- ['X-Token']为自定义key 请根据实际情况自行修改
+ config.headers['X-Token'] = getToken()
+ }
+ return config
+ },
+ error => {
+ // Do something with request error
+ console.log(error) // for debug
+ Promise.reject(error)
}
- return config
-}, error => {
- // Do something with request error
- console.log(error) // for debug
- Promise.reject(error)
-})
+)
// respone interceptor
service.interceptors.response.use(
@@ -67,6 +70,7 @@ service.interceptors.response.use(
duration: 5 * 1000
})
return Promise.reject(error)
- })
+ }
+)
export default service
diff --git a/src/utils/validate.js b/src/utils/validate.js
index 10579fd3..ada0e7e2 100644
--- a/src/utils/validate.js
+++ b/src/utils/validate.js
@@ -40,4 +40,3 @@ export function validateEmail(email) {
const re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
return re.test(email)
}
-
diff --git a/src/views/components-demo/markdown.vue b/src/views/components-demo/markdown.vue
index 61a3b51f..4e8b0648 100644
--- a/src/views/components-demo/markdown.vue
+++ b/src/views/components-demo/markdown.vue
@@ -2,7 +2,7 @@
Markdown is based on
simplemde-markdown-editor ,Simply encapsulated in Vue.
-
+
相关文章
diff --git a/src/views/components-demo/mixin.vue b/src/views/components-demo/mixin.vue
index 78adb069..dc80b23f 100644
--- a/src/views/components-demo/mixin.vue
+++ b/src/views/components-demo/mixin.vue
@@ -7,19 +7,19 @@
- Components
+ Documentation
- Charts
+ Icons
- Excel
+ Excel
- Table
+ Table
- Form
+ Form
Theme
@@ -130,12 +130,14 @@ export default {
title: [{ required: true, trigger: 'change', validator: validate }]
},
articleList: [
- { title: '基础篇', href: 'https://segmentfault.com/a/1190000009275424' },
- { title: '登录权限篇', href: 'https://segmentfault.com/a/1190000009506097' },
- { title: '实战篇', href: 'https://segmentfault.com/a/1190000009762198' },
- { title: 'vueAdmin-template 篇', href: 'https://segmentfault.com/a/1190000010043013' },
+ { title: '基础篇', href: 'https://juejin.im/post/59097cd7a22b9d0065fb61d2' },
+ { title: '登录权限篇', href: 'https://juejin.im/post/591aa14f570c35006961acac' },
+ { title: '实战篇', href: 'https://juejin.im/post/593121aa0ce4630057f70d35' },
+ { title: 'vueAdmin-template 篇', href: 'https://juejin.im/post/595b4d776fb9a06bbe7dba56' },
{ title: '自行封装 component', href: 'https://segmentfault.com/a/1190000009090836' },
- { title: '优雅的使用 icon', href: 'https://segmentfault.com/a/https://segmentfault.com/a/1190000012213278' }
+ { title: '优雅的使用 icon', href: 'https://juejin.im/post/59bb864b5188257e7a427c09' },
+ { title: 'webpack4(上)', href: 'https://juejin.im/post/59bb864b5188257e7a427c09' },
+ { title: 'webpack4(下)', href: 'https://juejin.im/post/5b5d6d6f6fb9a04fea58aabc' }
]
}
}
diff --git a/src/views/dashboard/admin/components/TodoList/index.vue b/src/views/dashboard/admin/components/TodoList/index.vue
index 34f0241d..207cdbab 100644
--- a/src/views/dashboard/admin/components/TodoList/index.vue
+++ b/src/views/dashboard/admin/components/TodoList/index.vue
@@ -72,7 +72,7 @@ export default {
}
},
methods: {
- setLocalStorgae() {
+ setLocalStorage() {
window.localStorage.setItem(STORAGE_KEY, JSON.stringify(this.todos))
},
addTodo(e) {
@@ -82,30 +82,30 @@ export default {
text,
done: false
})
- this.setLocalStorgae()
+ this.setLocalStorage()
}
e.target.value = ''
},
toggleTodo(val) {
val.done = !val.done
- this.setLocalStorgae()
+ this.setLocalStorage()
},
deleteTodo(todo) {
this.todos.splice(this.todos.indexOf(todo), 1)
- this.setLocalStorgae()
+ this.setLocalStorage()
},
editTodo({ todo, value }) {
todo.text = value
- this.setLocalStorgae()
+ this.setLocalStorage()
},
clearCompleted() {
this.todos = this.todos.filter(todo => !todo.done)
- this.setLocalStorgae()
+ this.setLocalStorage()
},
toggleAll({ done }) {
this.todos.forEach(todo => {
todo.done = done
- this.setLocalStorgae()
+ this.setLocalStorage()
})
}
},
diff --git a/src/views/documentation/index.vue b/src/views/documentation/index.vue
index d9f8b9e8..c0ca2657 100644
--- a/src/views/documentation/index.vue
+++ b/src/views/documentation/index.vue
@@ -14,12 +14,14 @@ export default {
data() {
return {
articleList: [
- { title: '基础篇', href: 'https://segmentfault.com/a/1190000009275424' },
- { title: '登录权限篇', href: 'https://segmentfault.com/a/1190000009506097' },
- { title: '实战篇', href: 'https://segmentfault.com/a/1190000009762198' },
- { title: 'vueAdmin-template 篇', href: 'https://segmentfault.com/a/1190000010043013' },
+ { title: '基础篇', href: 'https://juejin.im/post/59097cd7a22b9d0065fb61d2' },
+ { title: '登录权限篇', href: 'https://juejin.im/post/591aa14f570c35006961acac' },
+ { title: '实战篇', href: 'https://juejin.im/post/593121aa0ce4630057f70d35' },
+ { title: 'vueAdmin-template 篇', href: 'https://juejin.im/post/595b4d776fb9a06bbe7dba56' },
{ title: '自行封装 component', href: 'https://segmentfault.com/a/1190000009090836' },
- { title: '优雅的使用 icon', href: 'https://segmentfault.com/a/1190000012213278' }
+ { title: '优雅的使用 icon', href: 'https://juejin.im/post/59bb864b5188257e7a427c09' },
+ { title: 'webpack4(上)', href: 'https://juejin.im/post/59bb864b5188257e7a427c09' },
+ { title: 'webpack4(下)', href: 'https://juejin.im/post/5b5d6d6f6fb9a04fea58aabc' }
]
}
}
diff --git a/src/views/errorPage/404.vue b/src/views/errorPage/404.vue
index dccf5736..97e57b2f 100644
--- a/src/views/errorPage/404.vue
+++ b/src/views/errorPage/404.vue
@@ -2,10 +2,10 @@