added ESlint 语法检测
This commit is contained in:
@@ -1,3 +1,3 @@
|
||||
module.exports = file => () => {
|
||||
return import ('@/' + file)
|
||||
}
|
||||
return import ('@/' + file)
|
||||
}
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
const _import = require('./_import') //获取组件的方法
|
||||
const _import = require('./_import') // 获取组件的方法
|
||||
export const asyncRouterHandle = (asyncRouter) => {
|
||||
asyncRouter.map(item => {
|
||||
if (item.component) {
|
||||
item.component = _import(item.component)
|
||||
} else {
|
||||
delete item['component']
|
||||
}
|
||||
if (item.children) {
|
||||
asyncRouterHandle(item.children)
|
||||
}
|
||||
})
|
||||
}
|
||||
asyncRouter.map(item => {
|
||||
if (item.component) {
|
||||
item.component = _import(item.component)
|
||||
} else {
|
||||
delete item['component']
|
||||
}
|
||||
if (item.children) {
|
||||
asyncRouterHandle(item.children)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
+15
-15
@@ -1,18 +1,18 @@
|
||||
const install = (Vue) => {
|
||||
const Bus = new Vue({
|
||||
methods: {
|
||||
emit(event, ...args) {
|
||||
this.$emit(event, ...args)
|
||||
},
|
||||
on(event, cb) {
|
||||
this.$on(event, cb)
|
||||
},
|
||||
off(event, cb) {
|
||||
this.$off(event, cb)
|
||||
}
|
||||
},
|
||||
})
|
||||
Vue.prototype.$bus = Bus
|
||||
const Bus = new Vue({
|
||||
methods: {
|
||||
emit(event, ...args) {
|
||||
this.$emit(event, ...args)
|
||||
},
|
||||
on(event, cb) {
|
||||
this.$on(event, cb)
|
||||
},
|
||||
off(event, cb) {
|
||||
this.$off(event, cb)
|
||||
}
|
||||
}
|
||||
})
|
||||
Vue.prototype.$bus = Bus
|
||||
}
|
||||
|
||||
export default install
|
||||
export default install
|
||||
|
||||
+21
-21
@@ -3,28 +3,28 @@
|
||||
// 年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
|
||||
// (new Date()).Format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423
|
||||
// (new Date()).Format("yyyy-M-d h:m:s.S") ==> 2006-7-2 8:9:4.18
|
||||
// eslint-disable-next-line no-extend-native
|
||||
Date.prototype.Format = function(fmt) {
|
||||
var o = {
|
||||
"M+": this.getMonth() + 1, //月份
|
||||
"d+": this.getDate(), //日
|
||||
"h+": this.getHours(), //小时
|
||||
"m+": this.getMinutes(), //分
|
||||
"s+": this.getSeconds(), //秒
|
||||
"q+": Math.floor((this.getMonth() + 3) / 3), //季度
|
||||
"S": this.getMilliseconds() //毫秒
|
||||
};
|
||||
if (/(y+)/.test(fmt))
|
||||
fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
|
||||
for (var k in o)
|
||||
if (new RegExp("(" + k + ")").test(fmt))
|
||||
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
|
||||
return fmt;
|
||||
var o = {
|
||||
'M+': this.getMonth() + 1, // 月份
|
||||
'd+': this.getDate(), // 日
|
||||
'h+': this.getHours(), // 小时
|
||||
'm+': this.getMinutes(), // 分
|
||||
's+': this.getSeconds(), // 秒
|
||||
'q+': Math.floor((this.getMonth() + 3) / 3), // 季度
|
||||
'S': this.getMilliseconds() // 毫秒
|
||||
}
|
||||
if (/(y+)/.test(fmt)) { fmt = fmt.replace(RegExp.$1, (this.getFullYear() + '').substr(4 - RegExp.$1.length)) }
|
||||
for (var k in o) {
|
||||
if (new RegExp('(' + k + ')').test(fmt)) { fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length))) }
|
||||
}
|
||||
return fmt
|
||||
}
|
||||
|
||||
export function formatTimeToStr(times, pattern) {
|
||||
var d = new Date(times).Format("yyyy-MM-dd hh:mm:ss");
|
||||
if (pattern) {
|
||||
d = new Date(times).Format(pattern);
|
||||
}
|
||||
return d.toLocaleString();
|
||||
}
|
||||
var d = new Date(times).Format('yyyy-MM-dd hh:mm:ss')
|
||||
if (pattern) {
|
||||
d = new Date(times).Format(pattern)
|
||||
}
|
||||
return d.toLocaleString()
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { store } from '@/store/index'
|
||||
import { store } from '@/store'
|
||||
// 获取字典方法 使用示例 getDict('sex').then(res) 或者 async函数下 const res = await getDict('sex')
|
||||
export const getDict = async (type) => {
|
||||
await store.dispatch("dictionary/getDictionary", type)
|
||||
return store.getters["dictionary/getDictionary"][type]
|
||||
}
|
||||
export const getDict = async(type) => {
|
||||
await store.dispatch('dictionary/getDictionary', type)
|
||||
return store.getters['dictionary/getDictionary'][type]
|
||||
}
|
||||
|
||||
@@ -1,19 +1,19 @@
|
||||
export const downloadImage = (imgsrc, name) => { //下载图片地址和图片名
|
||||
var image = new Image();
|
||||
image.setAttribute("crossOrigin", "anonymous");
|
||||
image.onload = function() {
|
||||
var canvas = document.createElement("canvas");
|
||||
canvas.width = image.width;
|
||||
canvas.height = image.height;
|
||||
var context = canvas.getContext("2d");
|
||||
context.drawImage(image, 0, 0, image.width, image.height);
|
||||
var url = canvas.toDataURL("image/png"); //得到图片的base64编码数据
|
||||
export const downloadImage = (imgsrc, name) => { // 下载图片地址和图片名
|
||||
var image = new Image()
|
||||
image.setAttribute('crossOrigin', 'anonymous')
|
||||
image.onload = function() {
|
||||
var canvas = document.createElement('canvas')
|
||||
canvas.width = image.width
|
||||
canvas.height = image.height
|
||||
var context = canvas.getContext('2d')
|
||||
context.drawImage(image, 0, 0, image.width, image.height)
|
||||
var url = canvas.toDataURL('image/png') // 得到图片的base64编码数据
|
||||
|
||||
var a = document.createElement("a"); // 生成一个a元素
|
||||
var event = new MouseEvent("click"); // 创建一个单击事件
|
||||
a.download = name || "photo"; // 设置图片名称
|
||||
a.href = url; // 将生成的URL设置为a.href属性
|
||||
a.dispatchEvent(event); // 触发a的单击事件
|
||||
};
|
||||
image.src = imgsrc;
|
||||
}
|
||||
var a = document.createElement('a') // 生成一个a元素
|
||||
var event = new MouseEvent('click') // 创建一个单击事件
|
||||
a.download = name || 'photo' // 设置图片名称
|
||||
a.href = url // 将生成的URL设置为a.href属性
|
||||
a.dispatchEvent(event) // 触发a的单击事件
|
||||
}
|
||||
image.src = imgsrc
|
||||
}
|
||||
|
||||
+80
-82
@@ -1,94 +1,92 @@
|
||||
export default class ImageCompress {
|
||||
constructor(file, fileSize, maxWH = 1920) {
|
||||
this.file = file
|
||||
this.fileSize = fileSize
|
||||
this.maxWH = maxWH // 最大长宽
|
||||
}
|
||||
constructor(file, fileSize, maxWH = 1920) {
|
||||
this.file = file
|
||||
this.fileSize = fileSize
|
||||
this.maxWH = maxWH // 最大长宽
|
||||
}
|
||||
|
||||
compress() {
|
||||
// 压缩
|
||||
const fileType = this.file.type
|
||||
const fileSize = this.file.size / 1024
|
||||
return new Promise(resolve => {
|
||||
const reader = new FileReader();
|
||||
reader.readAsDataURL(this.file);
|
||||
reader.onload = () => {
|
||||
const canvas = document.createElement('canvas');
|
||||
const img = document.createElement('img');
|
||||
img.src = reader.result;
|
||||
img.onload = () => {
|
||||
const ctx = canvas.getContext('2d');
|
||||
let _dWH = this.dWH(img.width, img.height, this.maxWH)
|
||||
canvas.width = _dWH.width
|
||||
canvas.height = _dWH.height
|
||||
compress() {
|
||||
// 压缩
|
||||
const fileType = this.file.type
|
||||
const fileSize = this.file.size / 1024
|
||||
return new Promise(resolve => {
|
||||
const reader = new FileReader()
|
||||
reader.readAsDataURL(this.file)
|
||||
reader.onload = () => {
|
||||
const canvas = document.createElement('canvas')
|
||||
const img = document.createElement('img')
|
||||
img.src = reader.result
|
||||
img.onload = () => {
|
||||
const ctx = canvas.getContext('2d')
|
||||
const _dWH = this.dWH(img.width, img.height, this.maxWH)
|
||||
canvas.width = _dWH.width
|
||||
canvas.height = _dWH.height
|
||||
|
||||
// 清空后, 重写画布
|
||||
ctx.clearRect(0, 0, canvas.width, canvas.height)
|
||||
ctx.drawImage(img, 0, 0, canvas.width, canvas.height)
|
||||
// 清空后, 重写画布
|
||||
ctx.clearRect(0, 0, canvas.width, canvas.height)
|
||||
ctx.drawImage(img, 0, 0, canvas.width, canvas.height)
|
||||
|
||||
let newImgData = canvas.toDataURL(fileType, 0.90)
|
||||
const newImgData = canvas.toDataURL(fileType, 0.90)
|
||||
|
||||
// 压缩宽高后的图像大小
|
||||
let newImgSize = this.fileSizeKB(newImgData)
|
||||
// 压缩宽高后的图像大小
|
||||
const newImgSize = this.fileSizeKB(newImgData)
|
||||
|
||||
if (newImgSize > this.fileSize) {
|
||||
console.log('图片尺寸太大!' + fileSize + " >> " + newImgSize)
|
||||
}
|
||||
if (newImgSize > this.fileSize) {
|
||||
console.log('图片尺寸太大!' + fileSize + ' >> ' + newImgSize)
|
||||
}
|
||||
|
||||
let blob = this.dataURLtoBlob(newImgData, fileType)
|
||||
let nfile = new File([blob], this.file.name);
|
||||
resolve(nfile)
|
||||
};
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
/*
|
||||
* 长宽等比缩小
|
||||
* 图像的一边(长或宽)为最大目标值
|
||||
* */
|
||||
dWH(srcW, srcH, dMax) {
|
||||
|
||||
let defaults = {
|
||||
width: srcW,
|
||||
height: srcH
|
||||
const blob = this.dataURLtoBlob(newImgData, fileType)
|
||||
const nfile = new File([blob], this.file.name)
|
||||
resolve(nfile)
|
||||
}
|
||||
if (Math.max(srcW, srcH) > dMax) {
|
||||
if (srcW > srcH) {
|
||||
defaults.width = dMax
|
||||
defaults.height = Math.round(srcH * (dMax / srcW))
|
||||
return defaults
|
||||
} else {
|
||||
defaults.height = dMax
|
||||
defaults.width = Math.round(srcW * (dMax / srcH))
|
||||
return defaults
|
||||
}
|
||||
} else {
|
||||
return defaults
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
fileSizeKB(dataURL) {
|
||||
let sizeKB = 0
|
||||
sizeKB = Math.round((dataURL.split(',')[1].length * 3 / 4) / 1024)
|
||||
return sizeKB
|
||||
/**
|
||||
* 长宽等比缩小
|
||||
* 图像的一边(长或宽)为最大目标值
|
||||
*/
|
||||
dWH(srcW, srcH, dMax) {
|
||||
const defaults = {
|
||||
width: srcW,
|
||||
height: srcH
|
||||
}
|
||||
|
||||
/*
|
||||
* 转为Blob
|
||||
* */
|
||||
dataURLtoBlob(dataURL, fileType) {
|
||||
let byteString = atob(dataURL.split(',')[1])
|
||||
let mimeString = dataURL.split(',')[0].split(':')[1].split(';')[0]
|
||||
let ab = new ArrayBuffer(byteString.length)
|
||||
let ia = new Uint8Array(ab)
|
||||
for (let i = 0; i < byteString.length; i++) {
|
||||
ia[i] = byteString.charCodeAt(i)
|
||||
}
|
||||
if (fileType) {
|
||||
mimeString = fileType
|
||||
}
|
||||
return new Blob([ab], { type: mimeString, lastModifiedDate: new Date() })
|
||||
if (Math.max(srcW, srcH) > dMax) {
|
||||
if (srcW > srcH) {
|
||||
defaults.width = dMax
|
||||
defaults.height = Math.round(srcH * (dMax / srcW))
|
||||
return defaults
|
||||
} else {
|
||||
defaults.height = dMax
|
||||
defaults.width = Math.round(srcW * (dMax / srcH))
|
||||
return defaults
|
||||
}
|
||||
} else {
|
||||
return defaults
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
fileSizeKB(dataURL) {
|
||||
let sizeKB = 0
|
||||
sizeKB = Math.round((dataURL.split(',')[1].length * 3 / 4) / 1024)
|
||||
return sizeKB
|
||||
}
|
||||
|
||||
/**
|
||||
* 转为Blob
|
||||
*/
|
||||
dataURLtoBlob(dataURL, fileType) {
|
||||
const byteString = atob(dataURL.split(',')[1])
|
||||
let mimeString = dataURL.split(',')[0].split(':')[1].split(';')[0]
|
||||
const ab = new ArrayBuffer(byteString.length)
|
||||
const ia = new Uint8Array(ab)
|
||||
for (let i = 0; i < byteString.length; i++) {
|
||||
ia[i] = byteString.charCodeAt(i)
|
||||
}
|
||||
if (fileType) {
|
||||
mimeString = fileType
|
||||
}
|
||||
return new Blob([ab], { type: mimeString, lastModifiedDate: new Date() })
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
const title = 'GIN-VUE-ADMIN'
|
||||
|
||||
export default function getPageTitle(pageTitle) {
|
||||
if (pageTitle) {
|
||||
return `${pageTitle} - ${title}`
|
||||
}
|
||||
return `${title}`
|
||||
}
|
||||
if (pageTitle) {
|
||||
return `${pageTitle} - ${title}`
|
||||
}
|
||||
return `${title}`
|
||||
}
|
||||
|
||||
+86
-87
@@ -1,103 +1,102 @@
|
||||
import axios from 'axios'; // 引入axios
|
||||
import { Message } from 'element-ui';
|
||||
import { store } from '@/store/index'
|
||||
import context from '@/main.js'
|
||||
import axios from 'axios' // 引入axios
|
||||
import { Message } from 'element-ui'
|
||||
import { store } from '@/store'
|
||||
import context from '@/main'
|
||||
import router from '@/router/index'
|
||||
|
||||
const service = axios.create({
|
||||
baseURL: process.env.VUE_APP_BASE_API,
|
||||
timeout: 99999
|
||||
baseURL: process.env.VUE_APP_BASE_API,
|
||||
timeout: 99999
|
||||
})
|
||||
let acitveAxios = 0
|
||||
let timer
|
||||
const showLoading = () => {
|
||||
acitveAxios++
|
||||
if (timer) {
|
||||
clearTimeout(timer)
|
||||
acitveAxios++
|
||||
if (timer) {
|
||||
clearTimeout(timer)
|
||||
}
|
||||
timer = setTimeout(() => {
|
||||
if (acitveAxios > 0) {
|
||||
context.$bus.emit('showLoading')
|
||||
}
|
||||
timer = setTimeout(() => {
|
||||
if (acitveAxios > 0) {
|
||||
context.$bus.emit("showLoading")
|
||||
}
|
||||
}, 400);
|
||||
}, 400)
|
||||
}
|
||||
|
||||
const closeLoading = () => {
|
||||
acitveAxios--
|
||||
if (acitveAxios <= 0) {
|
||||
clearTimeout(timer)
|
||||
context.$bus.emit("closeLoading")
|
||||
}
|
||||
}
|
||||
//http request 拦截器
|
||||
acitveAxios--
|
||||
if (acitveAxios <= 0) {
|
||||
clearTimeout(timer)
|
||||
context.$bus.emit('closeLoading')
|
||||
}
|
||||
}
|
||||
// http request 拦截器
|
||||
service.interceptors.request.use(
|
||||
config => {
|
||||
if (!config.donNotShowLoading) {
|
||||
showLoading()
|
||||
}
|
||||
const token = store.getters['user/token']
|
||||
const user = store.getters['user/userInfo']
|
||||
config.data = JSON.stringify(config.data);
|
||||
config.headers = {
|
||||
'Content-Type': 'application/json',
|
||||
'x-token': token,
|
||||
'x-user-id': user.ID
|
||||
}
|
||||
return config;
|
||||
},
|
||||
error => {
|
||||
closeLoading()
|
||||
Message({
|
||||
showClose: true,
|
||||
message: error,
|
||||
type: 'error'
|
||||
})
|
||||
return error;
|
||||
config => {
|
||||
if (!config.donNotShowLoading) {
|
||||
showLoading()
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
//http response 拦截器
|
||||
service.interceptors.response.use(
|
||||
response => {
|
||||
closeLoading()
|
||||
|
||||
if (response.headers["new-token"]) {
|
||||
store.commit('user/setToken', response.headers["new-token"])
|
||||
}
|
||||
if(response.data.code == 0){
|
||||
if(response.data.data?.needInit){
|
||||
Message({
|
||||
type:"info",
|
||||
message:"您是第一次使用,请初始化"
|
||||
})
|
||||
store.commit("user/NeedInit")
|
||||
router.push({name:"init"})
|
||||
}
|
||||
}
|
||||
if (response.data.code == 0 || response.headers.success === "true") {
|
||||
return response.data
|
||||
} else {
|
||||
Message({
|
||||
showClose: true,
|
||||
message: response.data.msg || decodeURI(response.headers.msg),
|
||||
type: response.headers.msgtype||'error',
|
||||
})
|
||||
if (response.data.data && response.data.data.reload) {
|
||||
store.commit('user/LoginOut')
|
||||
}
|
||||
return response.data.msg ? response.data : response
|
||||
}
|
||||
},
|
||||
error => {
|
||||
closeLoading()
|
||||
Message({
|
||||
showClose: true,
|
||||
message: error,
|
||||
type: 'error'
|
||||
})
|
||||
return error
|
||||
const token = store.getters['user/token']
|
||||
const user = store.getters['user/userInfo']
|
||||
config.data = JSON.stringify(config.data)
|
||||
config.headers = {
|
||||
'Content-Type': 'application/json',
|
||||
'x-token': token,
|
||||
'x-user-id': user.ID
|
||||
}
|
||||
return config
|
||||
},
|
||||
error => {
|
||||
closeLoading()
|
||||
Message({
|
||||
showClose: true,
|
||||
message: error,
|
||||
type: 'error'
|
||||
})
|
||||
return error
|
||||
}
|
||||
)
|
||||
|
||||
export default service
|
||||
// http response 拦截器
|
||||
service.interceptors.response.use(
|
||||
response => {
|
||||
closeLoading()
|
||||
|
||||
if (response.headers['new-token']) {
|
||||
store.commit('user/setToken', response.headers['new-token'])
|
||||
}
|
||||
if (response.data.code === 0) {
|
||||
if (response.data.data?.needInit) {
|
||||
Message({
|
||||
type: 'info',
|
||||
message: '您是第一次使用,请初始化'
|
||||
})
|
||||
store.commit('user/NeedInit')
|
||||
router.push({ name: 'Init' })
|
||||
}
|
||||
}
|
||||
if (response.data.code === 0 || response.headers.success === 'true') {
|
||||
return response.data
|
||||
} else {
|
||||
Message({
|
||||
showClose: true,
|
||||
message: response.data.msg || decodeURI(response.headers.msg),
|
||||
type: response.headers.msgtype || 'error'
|
||||
})
|
||||
if (response.data.data && response.data.data.reload) {
|
||||
store.commit('user/LoginOut')
|
||||
}
|
||||
return response.data.msg ? response.data : response
|
||||
}
|
||||
},
|
||||
error => {
|
||||
closeLoading()
|
||||
Message({
|
||||
showClose: true,
|
||||
message: error,
|
||||
type: 'error'
|
||||
})
|
||||
return error
|
||||
}
|
||||
)
|
||||
|
||||
export default service
|
||||
|
||||
@@ -3,7 +3,7 @@ export const toUpperCase = (str) => {
|
||||
if (str[0]) {
|
||||
return str.replace(str[0], str[0].toUpperCase())
|
||||
} else {
|
||||
return ""
|
||||
return ''
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,13 +11,13 @@ export const toLowerCase = (str) => {
|
||||
if (str[0]) {
|
||||
return str.replace(str[0], str[0].toLowerCase())
|
||||
} else {
|
||||
return ""
|
||||
return ''
|
||||
}
|
||||
}
|
||||
|
||||
// 驼峰转换下划线
|
||||
export const toSQLLine = (str) => {
|
||||
if (str == "ID") return "ID"
|
||||
if (str === 'ID') return 'ID'
|
||||
return str.replace(/([A-Z])/g, "_$1").toLowerCase();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user