Compare commits

..

1 Commits

Author SHA1 Message Date
花裤衩
e76088d4d3 refactor 2019-09-29 17:35:27 +08:00
17 changed files with 891 additions and 1219 deletions

View File

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

View File

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

File diff suppressed because it is too large Load Diff

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -73,18 +73,13 @@ const actions = {
},
// user logout
logout({ commit, state, dispatch }) {
logout({ commit, state }) {
return new Promise((resolve, reject) => {
logout(state.token).then(() => {
commit('SET_TOKEN', '')
commit('SET_ROLES', [])
removeToken()
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()
}).catch(error => {
reject(error)
@@ -104,7 +99,6 @@ const actions = {
// dynamically modify permissions
changeRoles({ commit, dispatch }, role) {
// eslint-disable-next-line
return new Promise(async resolve => {
const token = role + '-token'

View File

@@ -1,32 +1,47 @@
import Vue from 'vue'
import Clipboard from 'clipboard'
function clipboardSuccess() {
const VueClipboardConfig = {
autoSetContainer: false,
appendToBody: true // This fixes IE, see #50
}
function clipboardSuccess(successText) {
Vue.prototype.$message({
message: 'Copy successfully',
message: successText || 'Copy successfully',
type: 'success',
duration: 1500
})
}
function clipboardError() {
function clipboardError(errorText) {
Vue.prototype.$message({
message: 'Copy failed',
message: errorText || 'Copy failed',
type: 'error'
})
}
export default function handleClipboard(text, event) {
const clipboard = new Clipboard(event.target, {
text: () => text
export default function handleClipboard({ text, container, successText, errorText } = {}) {
return new Promise(function(resolve, reject) {
var fakeElement = document.createElement('button')
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
* @param {(Object|string|number)} time
* @param {string} cFormat
* @returns {string | null}
* @returns {string}
*/
export function parseTime(time, cFormat) {
if (arguments.length === 0) {
@@ -34,11 +34,14 @@ export function parseTime(time, cFormat) {
s: date.getSeconds(),
a: date.getDay()
}
const time_str = format.replace(/{([ymdhisa])+}/g, (result, key) => {
const value = formatObj[key]
const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
let value = formatObj[key]
// Note: getDay() returns 0 on Sunday
if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value ] }
return value.toString().padStart(2, '0')
if (result.length > 0 && value < 10) {
value = '0' + value
}
return value || 0
})
return time_str
}

View File

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

View File

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

View File

@@ -1,9 +1,14 @@
<template>
<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-tab-pane label="use clipboard directly" name="directly">
<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,$event)">
<el-button type="primary" icon="el-icon-document" @click="handleCopy(inputData)">
copy
</el-button>
</el-tab-pane>
@@ -33,8 +38,11 @@ export default {
}
},
methods: {
handleCopy(text, event) {
clip(text, event)
handleCopy(text) {
// return a promise
clip({ text: text }).then(() => {
console.log('success')
})
},
clipboardSuccess() {
this.$message({

View File

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

View File

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

View File

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