Compare commits

..

14 Commits

Author SHA1 Message Date
花裤衩
6ab5763591 bump 2019-10-09 21:41:07 +08:00
花裤衩
81a44a0284 perf: fix eslint warning 2019-10-09 21:12:03 +08:00
花裤衩
c1ce24081e Merge branch 'master' into chore/update 2019-10-09 20:54:51 +08:00
花裤衩
459bef2d2f refacor[screenfull]: 4.2.0=>5.0.0 2019-10-09 20:44:17 +08:00
花裤衩
197948dc44 fix[TagsView]: fixed toLastView bug (#2634) 2019-10-08 21:20:34 +08:00
花裤衩
b4cdf528ba fix[logout]: empty tagsview when logout (#2632) 2019-10-08 20:38:19 +08:00
花裤衩
f266713daf fix[tagsView]: fixed DEL_OTHERS_CACHED_VIEWS bug 2019-10-08 18:20:11 +08:00
monkeycf
0343988f3d perf[tagsView]: pref DEL_CACHED_VIEW and DEL_OTHERS_CACHED_VIEWS function (#2626) 2019-10-08 18:15:22 +08:00
monkeycf
9c723c6618 perf[utils.js]: perf parseTime function (#2625) 2019-10-08 17:54:47 +08:00
花裤衩
e3cbf4ad90 fix[example]: fixed create.vue cache error
https://github.com/PanJiaChen/vue-element-admin/issues/2608
2019-09-30 16:38:18 +08:00
花裤衩
8504f692df bump 2019-09-30 16:35:50 +08:00
花裤衩
8235011665 fix: fixed numberFormatter bug
https://github.com/PanJiaChen/vue-element-admin/issues/2568
2019-09-30 15:06:42 +08:00
MaYuanhai
0e9ce78b8a refactor[ImageCropper]: fix lint error (#2365) 2019-09-30 13:56:56 +08:00
Serge
3a08b6e471 perf: optimize import file-saver way(#2347) 2019-09-30 13:14:55 +08:00
17 changed files with 1219 additions and 891 deletions

View File

@@ -1,4 +1,4 @@
const { run } = require('runjs') const { sh } = require('tasksfile')
const chalk = require('chalk') const chalk = require('chalk')
const config = require('../vue.config.js') const config = require('../vue.config.js')
const rawArgv = process.argv.slice(2) const rawArgv = process.argv.slice(2)
@@ -7,7 +7,7 @@ const args = rawArgv.join(' ')
if (process.env.npm_config_preview || rawArgv.includes('--preview')) { if (process.env.npm_config_preview || rawArgv.includes('--preview')) {
const report = rawArgv.includes('--report') const report = rawArgv.includes('--report')
run(`vue-cli-service build ${args}`) sh(`vue-cli-service build ${args}`)
const port = 9526 const port = 9526
const publicPath = config.publicPath const publicPath = config.publicPath
@@ -31,5 +31,5 @@ if (process.env.npm_config_preview || rawArgv.includes('--preview')) {
}) })
} else { } else {
run(`vue-cli-service build ${args}`) sh(`vue-cli-service build ${args}`)
} }

View File

@@ -45,61 +45,61 @@
"dependencies": { "dependencies": {
"axios": "0.18.1", "axios": "0.18.1",
"clipboard": "2.0.4", "clipboard": "2.0.4",
"codemirror": "5.45.0", "codemirror": "5.49.0",
"driver.js": "0.9.5", "driver.js": "0.9.7",
"dropzone": "5.5.1", "dropzone": "5.5.1",
"echarts": "4.2.1", "echarts": "4.3.0",
"element-ui": "2.7.0", "element-ui": "2.12.0",
"file-saver": "2.0.1", "file-saver": "2.0.2",
"fuse.js": "3.4.4", "fuse.js": "3.4.5",
"js-cookie": "2.2.0", "js-cookie": "2.2.1",
"jsonlint": "1.6.3", "jsonlint": "1.6.3",
"jszip": "3.2.1", "jszip": "3.2.2",
"normalize.css": "7.0.0", "normalize.css": "7.0.0",
"nprogress": "0.2.0", "nprogress": "0.2.0",
"path-to-regexp": "2.4.0", "path-to-regexp": "2.4.0",
"screenfull": "4.2.0", "screenfull": "5.0.0",
"showdown": "1.9.0", "showdown": "1.9.0",
"sortablejs": "1.8.4", "sortablejs": "1.10.1",
"tui-editor": "1.3.3", "tui-editor": "1.4.7",
"vue": "2.6.10", "vue": "2.6.10",
"vue-count-to": "1.0.13", "vue-count-to": "1.0.13",
"vue-router": "3.0.2", "vue-router": "3.1.3",
"vue-splitpane": "1.0.4", "vue-splitpane": "1.0.4",
"vuedraggable": "2.20.0", "vuedraggable": "2.23.2",
"vuex": "3.1.0", "vuex": "3.1.1",
"xlsx": "0.14.1" "xlsx": "0.15.1"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "7.0.0", "@babel/core": "7.0.0",
"@babel/register": "7.0.0", "@babel/register": "7.0.0",
"@vue/cli-plugin-babel": "3.5.3", "@vue/cli-plugin-babel": "3.11.0",
"@vue/cli-plugin-eslint": "^3.9.1", "@vue/cli-plugin-eslint": "3.11.0",
"@vue/cli-plugin-unit-jest": "3.5.3", "@vue/cli-plugin-unit-jest": "3.11.0",
"@vue/cli-service": "3.5.3", "@vue/cli-service": "3.11.0",
"@vue/test-utils": "1.0.0-beta.29", "@vue/test-utils": "1.0.0-beta.29",
"autoprefixer": "^9.5.1", "autoprefixer": "^9.5.1",
"babel-core": "7.0.0-bridge.0", "babel-core": "7.0.0-bridge.0",
"babel-eslint": "10.0.1", "babel-eslint": "10.0.3",
"babel-jest": "23.6.0", "babel-jest": "24.9.0",
"chalk": "2.4.2", "chalk": "2.4.2",
"chokidar": "2.1.5", "chokidar": "3.1.1",
"connect": "3.6.6", "connect": "3.7.0",
"eslint": "5.15.3", "eslint": "6.5.1",
"eslint-plugin-vue": "5.2.2", "eslint-plugin-vue": "5.2.3",
"html-webpack-plugin": "3.2.0", "html-webpack-plugin": "3.2.0",
"husky": "1.3.1", "husky": "3.0.8",
"lint-staged": "8.1.5", "lint-staged": "9.4.2",
"mockjs": "1.0.1-beta3", "mockjs": "1.0.1-beta3",
"node-sass": "^4.9.0", "node-sass": "^4.9.0",
"plop": "2.3.0", "plop": "2.4.0",
"runjs": "^4.3.2", "tasksfile": "5.1.0",
"sass-loader": "^7.1.0", "sass-loader": "^7.1.0",
"script-ext-html-webpack-plugin": "2.1.3", "script-ext-html-webpack-plugin": "2.1.4",
"script-loader": "0.7.2", "script-loader": "0.7.2",
"serve-static": "^1.13.2", "serve-static": "^1.13.2",
"svg-sprite-loader": "4.1.3", "svg-sprite-loader": "4.1.6",
"svgo": "1.2.0", "svgo": "1.3.0",
"vue-template-compiler": "2.6.10" "vue-template-compiler": "2.6.10"
}, },
"engines": { "engines": {

File diff suppressed because it is too large Load Diff

View File

@@ -22,7 +22,7 @@ export default {
}, },
methods: { methods: {
click() { click() {
if (!screenfull.enabled) { if (!screenfull.isEnabled) {
this.$message({ this.$message({
message: 'you browser can not work', message: 'you browser can not work',
type: 'warning' type: 'warning'
@@ -35,12 +35,12 @@ export default {
this.isFullscreen = screenfull.isFullscreen this.isFullscreen = screenfull.isFullscreen
}, },
init() { init() {
if (screenfull.enabled) { if (screenfull.isEnabled) {
screenfull.on('change', this.change) screenfull.on('change', this.change)
} }
}, },
destroy() { destroy() {
if (screenfull.enabled) { if (screenfull.isEnabled) {
screenfull.off('change', this.change) screenfull.off('change', this.change)
} }
} }

View File

@@ -45,7 +45,7 @@ export function numberFormatter(num, digits) {
] ]
for (let i = 0; i < si.length; i++) { for (let i = 0; i < si.length; i++) {
if (num >= si[i].value) { if (num >= si[i].value) {
return (num / si[i].value + 0.1).toFixed(digits).replace(/\.0+$|(\.[0-9]*[1-9])0+$/, '$1') + si[i].symbol return (num / si[i].value).toFixed(digits).replace(/\.0+$|(\.[0-9]*[1-9])0+$/, '$1') + si[i].symbol
} }
} }
return num.toString() return num.toString()

View File

@@ -155,7 +155,7 @@ export default {
toLastView(visitedViews, view) { toLastView(visitedViews, view) {
const latestView = visitedViews.slice(-1)[0] const latestView = visitedViews.slice(-1)[0]
if (latestView) { if (latestView) {
this.$router.push(latestView) this.$router.push(latestView.fullPath)
} else { } else {
// now the default is to redirect to the home page if there is no tags-view, // now the default is to redirect to the home page if there is no tags-view,
// you can adjust it according to your needs. // you can adjust it according to your needs.

View File

@@ -13,7 +13,8 @@ const state = {
const mutations = { const mutations = {
CHANGE_SETTING: (state, { key, value }) => { CHANGE_SETTING: (state, { key, value }) => {
if (state.hasOwnProperty(key)) { // https://eslint.org/docs/rules/no-prototype-builtins
if (Object.prototype.hasOwnProperty.call(state, key)) {
state[key] = value state[key] = value
} }
} }

View File

@@ -28,13 +28,8 @@ const mutations = {
} }
}, },
DEL_CACHED_VIEW: (state, view) => { DEL_CACHED_VIEW: (state, view) => {
for (const i of state.cachedViews) { const index = state.cachedViews.indexOf(view.name)
if (i === view.name) { index > -1 && state.cachedViews.splice(index, 1)
const index = state.cachedViews.indexOf(i)
state.cachedViews.splice(index, 1)
break
}
}
}, },
DEL_OTHERS_VISITED_VIEWS: (state, view) => { DEL_OTHERS_VISITED_VIEWS: (state, view) => {
@@ -43,12 +38,12 @@ const mutations = {
}) })
}, },
DEL_OTHERS_CACHED_VIEWS: (state, view) => { DEL_OTHERS_CACHED_VIEWS: (state, view) => {
for (const i of state.cachedViews) { const index = state.cachedViews.indexOf(view.name)
if (i === view.name) { if (index > -1) {
const index = state.cachedViews.indexOf(i) state.cachedViews = state.cachedViews.slice(index, index + 1)
state.cachedViews = state.cachedViews.slice(index, index + 1) } else {
break // if index = -1, there is no cached tags
} state.cachedViews = []
} }
}, },

View File

@@ -73,13 +73,18 @@ const actions = {
}, },
// user logout // user logout
logout({ commit, state }) { logout({ commit, state, dispatch }) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
logout(state.token).then(() => { logout(state.token).then(() => {
commit('SET_TOKEN', '') commit('SET_TOKEN', '')
commit('SET_ROLES', []) commit('SET_ROLES', [])
removeToken() removeToken()
resetRouter() resetRouter()
// reset visited views and cached views
// to fixed https://github.com/PanJiaChen/vue-element-admin/issues/2485
dispatch('tagsView/delAllViews', null, { root: true })
resolve() resolve()
}).catch(error => { }).catch(error => {
reject(error) reject(error)
@@ -99,6 +104,7 @@ const actions = {
// dynamically modify permissions // dynamically modify permissions
changeRoles({ commit, dispatch }, role) { changeRoles({ commit, dispatch }, role) {
// eslint-disable-next-line
return new Promise(async resolve => { return new Promise(async resolve => {
const token = role + '-token' const token = role + '-token'

View File

@@ -1,47 +1,32 @@
import Vue from 'vue' import Vue from 'vue'
import Clipboard from 'clipboard' import Clipboard from 'clipboard'
const VueClipboardConfig = { function clipboardSuccess() {
autoSetContainer: false,
appendToBody: true // This fixes IE, see #50
}
function clipboardSuccess(successText) {
Vue.prototype.$message({ Vue.prototype.$message({
message: successText || 'Copy successfully', message: 'Copy successfully',
type: 'success', type: 'success',
duration: 1500 duration: 1500
}) })
} }
function clipboardError(errorText) { function clipboardError() {
Vue.prototype.$message({ Vue.prototype.$message({
message: errorText || 'Copy failed', message: 'Copy failed',
type: 'error' type: 'error'
}) })
} }
export default function handleClipboard({ text, container, successText, errorText } = {}) { export default function handleClipboard(text, event) {
return new Promise(function(resolve, reject) { const clipboard = new Clipboard(event.target, {
var fakeElement = document.createElement('button') text: () => text
var clipboard = new Clipboard(fakeElement, {
text: function() { return text },
action: function() { return 'copy' },
container: typeof container === 'object' ? container : document.body
})
clipboard.on('success', function(e) {
clipboard.destroy()
clipboardSuccess(successText)
resolve(e)
})
clipboard.on('error', function(e) {
clipboard.destroy()
clipboardError(errorText)
reject(e)
})
if (VueClipboardConfig.appendToBody) document.body.appendChild(fakeElement)
fakeElement.click()
if (VueClipboardConfig.appendToBody) document.body.removeChild(fakeElement)
}) })
clipboard.on('success', () => {
clipboardSuccess()
clipboard.destroy()
})
clipboard.on('error', () => {
clipboardError()
clipboard.destroy()
})
clipboard.onClick(event)
} }

View File

@@ -6,7 +6,7 @@
* Parse the time to string * Parse the time to string
* @param {(Object|string|number)} time * @param {(Object|string|number)} time
* @param {string} cFormat * @param {string} cFormat
* @returns {string} * @returns {string | null}
*/ */
export function parseTime(time, cFormat) { export function parseTime(time, cFormat) {
if (arguments.length === 0) { if (arguments.length === 0) {
@@ -34,14 +34,11 @@ export function parseTime(time, cFormat) {
s: date.getSeconds(), s: date.getSeconds(),
a: date.getDay() a: date.getDay()
} }
const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => { const time_str = format.replace(/{([ymdhisa])+}/g, (result, key) => {
let value = formatObj[key] const value = formatObj[key]
// Note: getDay() returns 0 on Sunday // Note: getDay() returns 0 on Sunday
if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value ] } if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value ] }
if (result.length > 0 && value < 10) { return value.toString().padStart(2, '0')
value = '0' + value
}
return value || 0
}) })
return time_str return time_str
} }

View File

@@ -1,5 +1,5 @@
/* eslint-disable */ /* eslint-disable */
require('script-loader!file-saver'); import { saveAs } from 'file-saver'
import XLSX from 'xlsx' import XLSX from 'xlsx'
function generateArray(table) { function generateArray(table) {
@@ -151,14 +151,14 @@ export function export_json_to_excel({
filename, filename,
merges = [], merges = [],
autoWidth = true, autoWidth = true,
bookType= 'xlsx' bookType = 'xlsx'
} = {}) { } = {}) {
/* original data */ /* original data */
filename = filename || 'excel-list' filename = filename || 'excel-list'
data = [...data] data = [...data]
data.unshift(header); data.unshift(header);
for (let i = multiHeader.length-1; i > -1; i--) { for (let i = multiHeader.length - 1; i > -1; i--) {
data.unshift(multiHeader[i]) data.unshift(multiHeader[i])
} }

View File

@@ -1,5 +1,5 @@
/* eslint-disable */ /* eslint-disable */
require('script-loader!file-saver'); import { saveAs } from 'file-saver'
import JSZip from 'jszip' import JSZip from 'jszip'
export function export_txt_to_zip(th, jsonData, txtName, zipName) { export function export_txt_to_zip(th, jsonData, txtName, zipName) {

View File

@@ -1,14 +1,9 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<aside>
<a target="_blank" href="https://panjiachen.github.io/vue-element-admin-site/feature/component/clipboard.html">Documentation</a>
</aside>
<el-tabs v-model="activeName"> <el-tabs v-model="activeName">
<el-tab-pane label="use clipboard directly" name="directly"> <el-tab-pane label="use clipboard directly" name="directly">
<el-input v-model="inputData" placeholder="Please input" style="width:400px;max-width:100%;" /> <el-input v-model="inputData" placeholder="Please input" style="width:400px;max-width:100%;" />
<el-button type="primary" icon="el-icon-document" @click="handleCopy(inputData)"> <el-button type="primary" icon="el-icon-document" @click="handleCopy(inputData,$event)">
copy copy
</el-button> </el-button>
</el-tab-pane> </el-tab-pane>
@@ -38,11 +33,8 @@ export default {
} }
}, },
methods: { methods: {
handleCopy(text) { handleCopy(text, event) {
// return a promise clip(text, event)
clip({ text: text }).then(() => {
console.log('success')
})
}, },
clipboardSuccess() { clipboardSuccess() {
this.$message({ this.$message({

View File

@@ -170,8 +170,6 @@ export default {
if (this.isEdit) { if (this.isEdit) {
const id = this.$route.params && this.$route.params.id const id = this.$route.params && this.$route.params.id
this.fetchData(id) this.fetchData(id)
} else {
this.postForm = Object.assign({}, defaultForm)
} }
// Why need to make a copy of this.$route here? // Why need to make a copy of this.$route here?

View File

@@ -6,7 +6,7 @@
import ArticleDetail from './components/ArticleDetail' import ArticleDetail from './components/ArticleDetail'
export default { export default {
name: 'CreateForm', name: 'CreateArticle',
components: { ArticleDetail } components: { ArticleDetail }
} }
</script> </script>

View File

@@ -6,7 +6,7 @@
</aside> </aside>
<el-tabs type="border-card"> <el-tabs type="border-card">
<el-tab-pane label="Icons"> <el-tab-pane label="Icons">
<div v-for="item of svgIcons" :key="item" @click="handleClipboard(generateIconCode(item))"> <div v-for="item of svgIcons" :key="item" @click="handleClipboard(generateIconCode(item),$event)">
<el-tooltip placement="top"> <el-tooltip placement="top">
<div slot="content"> <div slot="content">
{{ generateIconCode(item) }} {{ generateIconCode(item) }}
@@ -19,7 +19,7 @@
</div> </div>
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="Element-UI Icons"> <el-tab-pane label="Element-UI Icons">
<div v-for="item of elementIcons" :key="item" @click="handleClipboard(generateElementIconCode(item))"> <div v-for="item of elementIcons" :key="item" @click="handleClipboard(generateElementIconCode(item),$event)">
<el-tooltip placement="top"> <el-tooltip placement="top">
<div slot="content"> <div slot="content">
{{ generateElementIconCode(item) }} {{ generateElementIconCode(item) }}
@@ -55,8 +55,8 @@ export default {
generateElementIconCode(symbol) { generateElementIconCode(symbol) {
return `<i class="el-icon-${symbol}" />` return `<i class="el-icon-${symbol}" />`
}, },
handleClipboard(text) { handleClipboard(text, event) {
clipboard({ text: text }) clipboard(text, event)
} }
} }
} }