eladmin 1.0 版本发布
This commit is contained in:
15
src/utils/auth.js
Normal file
15
src/utils/auth.js
Normal file
@@ -0,0 +1,15 @@
|
||||
import Cookies from 'js-cookie'
|
||||
|
||||
const TokenKey = 'Admin-Token'
|
||||
|
||||
export function getToken() {
|
||||
return Cookies.get(TokenKey)
|
||||
}
|
||||
|
||||
export function setToken(token) {
|
||||
return Cookies.set(TokenKey, token)
|
||||
}
|
||||
|
||||
export function removeToken() {
|
||||
return Cookies.remove(TokenKey)
|
||||
}
|
||||
36
src/utils/clipboard.js
Normal file
36
src/utils/clipboard.js
Normal file
@@ -0,0 +1,36 @@
|
||||
import Vue from 'vue'
|
||||
import Clipboard from 'clipboard'
|
||||
|
||||
function clipboardSuccess() {
|
||||
Vue.prototype.$message({
|
||||
message: '复制成功',
|
||||
type: 'success',
|
||||
duration: 1500
|
||||
})
|
||||
}
|
||||
|
||||
function clipboardError() {
|
||||
Vue.prototype.$message({
|
||||
message: '复制失败',
|
||||
type: 'error'
|
||||
})
|
||||
}
|
||||
|
||||
export default function handleClipboard(text, event) {
|
||||
const clipboard = new Clipboard(event.target, {
|
||||
text: () => text
|
||||
})
|
||||
clipboard.on('success', () => {
|
||||
clipboardSuccess()
|
||||
clipboard.off('error')
|
||||
clipboard.off('success')
|
||||
clipboard.destroy()
|
||||
})
|
||||
clipboard.on('error', () => {
|
||||
clipboardError()
|
||||
clipboard.off('error')
|
||||
clipboard.off('success')
|
||||
clipboard.destroy()
|
||||
})
|
||||
clipboard.onClick(event)
|
||||
}
|
||||
95
src/utils/index.js
Normal file
95
src/utils/index.js
Normal file
@@ -0,0 +1,95 @@
|
||||
/**
|
||||
* Created by jiachenpan on 16/11/18.
|
||||
*/
|
||||
|
||||
export function parseTime(time) {
|
||||
if (time) {
|
||||
var date = new Date(time)
|
||||
var year = date.getFullYear()
|
||||
/* 在日期格式中,月份是从0开始的,因此要加0
|
||||
* 使用三元表达式在小于10的前面加0,以达到格式统一 如 09:11:05
|
||||
* */
|
||||
var month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1
|
||||
var day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate()
|
||||
var hours = date.getHours() < 10 ? '0' + date.getHours() : date.getHours()
|
||||
var minutes = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()
|
||||
var seconds = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds()
|
||||
// 拼接
|
||||
return year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds
|
||||
} else {
|
||||
return ''
|
||||
}
|
||||
}
|
||||
|
||||
export function formatTime(time, option) {
|
||||
time = +time * 1000
|
||||
const d = new Date(time)
|
||||
const now = Date.now()
|
||||
|
||||
const diff = (now - d) / 1000
|
||||
|
||||
if (diff < 30) {
|
||||
return '刚刚'
|
||||
} else if (diff < 3600) {
|
||||
// less 1 hour
|
||||
return Math.ceil(diff / 60) + '分钟前'
|
||||
} else if (diff < 3600 * 24) {
|
||||
return Math.ceil(diff / 3600) + '小时前'
|
||||
} else if (diff < 3600 * 24 * 2) {
|
||||
return '1天前'
|
||||
}
|
||||
if (option) {
|
||||
return parseTime(time, option)
|
||||
} else {
|
||||
return (
|
||||
d.getMonth() +
|
||||
1 +
|
||||
'月' +
|
||||
d.getDate() +
|
||||
'日' +
|
||||
d.getHours() +
|
||||
'时' +
|
||||
d.getMinutes() +
|
||||
'分'
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
export function debounce(func, wait, immediate) {
|
||||
let timeout, args, context, timestamp, result
|
||||
|
||||
const later = function() {
|
||||
// 据上一次触发时间间隔
|
||||
const last = +new Date() - timestamp
|
||||
|
||||
// 上次被包装函数被调用时间间隔last小于设定时间间隔wait
|
||||
if (last < wait && last > 0) {
|
||||
timeout = setTimeout(later, wait - last)
|
||||
} else {
|
||||
timeout = null
|
||||
// 如果设定为immediate===true,因为开始边界已经调用过了此处无需调用
|
||||
if (!immediate) {
|
||||
result = func.apply(context, args)
|
||||
if (!timeout) context = args = null
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return function(...args) {
|
||||
context = this
|
||||
timestamp = +new Date()
|
||||
const callNow = immediate && !timeout
|
||||
// 如果延时不存在,重新设定延时
|
||||
if (!timeout) timeout = setTimeout(later, wait)
|
||||
if (callNow) {
|
||||
result = func.apply(context, args)
|
||||
context = args = null
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
}
|
||||
|
||||
export function isExternal(path) {
|
||||
return /^(https?:|mailto:|tel:)/.test(path)
|
||||
}
|
||||
178
src/utils/md5.js
Normal file
178
src/utils/md5.js
Normal file
@@ -0,0 +1,178 @@
|
||||
export function md5(sMessage) {
|
||||
function RotateLeft(lValue, iShiftBits) {
|
||||
return (lValue << iShiftBits) | (lValue >>> (32 - iShiftBits))
|
||||
}
|
||||
function AddUnsigned(lX, lY) {
|
||||
var lX4, lY4, lX8, lY8, lResult
|
||||
lX8 = (lX & 0x80000000)
|
||||
lY8 = (lY & 0x80000000)
|
||||
lX4 = (lX & 0x40000000)
|
||||
lY4 = (lY & 0x40000000)
|
||||
lResult = (lX & 0x3FFFFFFF) + (lY & 0x3FFFFFFF)
|
||||
if (lX4 & lY4) return (lResult ^ 0x80000000 ^ lX8 ^ lY8)
|
||||
if (lX4 | lY4) {
|
||||
if (lResult & 0x40000000) return (lResult ^ 0xC0000000 ^ lX8 ^ lY8)
|
||||
else return (lResult ^ 0x40000000 ^ lX8 ^ lY8)
|
||||
} else return (lResult ^ lX8 ^ lY8)
|
||||
}
|
||||
function F(x, y, z) {
|
||||
return (x & y) | ((~x) & z)
|
||||
}
|
||||
function G(x, y, z) {
|
||||
return (x & z) | (y & (~z))
|
||||
}
|
||||
function H(x, y, z) {
|
||||
return (x ^ y ^ z)
|
||||
}
|
||||
function I(x, y, z) {
|
||||
return (y ^ (x | (~z)))
|
||||
}
|
||||
function FF(a, b, c, d, x, s, ac) {
|
||||
a = AddUnsigned(a, AddUnsigned(AddUnsigned(F(b, c, d), x), ac))
|
||||
return AddUnsigned(RotateLeft(a, s), b)
|
||||
}
|
||||
function GG(a, b, c, d, x, s, ac) {
|
||||
a = AddUnsigned(a, AddUnsigned(AddUnsigned(G(b, c, d), x), ac))
|
||||
return AddUnsigned(RotateLeft(a, s), b)
|
||||
}
|
||||
function HH(a, b, c, d, x, s, ac) {
|
||||
a = AddUnsigned(a, AddUnsigned(AddUnsigned(H(b, c, d), x), ac))
|
||||
return AddUnsigned(RotateLeft(a, s), b)
|
||||
}
|
||||
function II(a, b, c, d, x, s, ac) {
|
||||
a = AddUnsigned(a, AddUnsigned(AddUnsigned(I(b, c, d), x), ac))
|
||||
return AddUnsigned(RotateLeft(a, s), b)
|
||||
}
|
||||
function ConvertToWordArray(sMessage) {
|
||||
var lWordCount
|
||||
var lMessageLength = sMessage.length
|
||||
var lNumberOfWords_temp1 = lMessageLength + 8
|
||||
var lNumberOfWords_temp2 = (lNumberOfWords_temp1 - (lNumberOfWords_temp1 % 64)) / 64
|
||||
var lNumberOfWords = (lNumberOfWords_temp2 + 1) * 16
|
||||
var lWordArray = Array(lNumberOfWords - 1)
|
||||
var lBytePosition = 0
|
||||
var lByteCount = 0
|
||||
while (lByteCount < lMessageLength) {
|
||||
lWordCount = (lByteCount - (lByteCount % 4)) / 4
|
||||
lBytePosition = (lByteCount % 4) * 8
|
||||
lWordArray[lWordCount] = (lWordArray[lWordCount] | (sMessage.charCodeAt(lByteCount) << lBytePosition))
|
||||
lByteCount++
|
||||
}
|
||||
lWordCount = (lByteCount - (lByteCount % 4)) / 4
|
||||
lBytePosition = (lByteCount % 4) * 8
|
||||
lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80 << lBytePosition)
|
||||
lWordArray[lNumberOfWords - 2] = lMessageLength << 3
|
||||
lWordArray[lNumberOfWords - 1] = lMessageLength >>> 29
|
||||
return lWordArray
|
||||
}
|
||||
function WordToHex(lValue) {
|
||||
var WordToHexValue = ''
|
||||
var WordToHexValue_temp = ''
|
||||
var lByte, lCount
|
||||
for (lCount = 0; lCount <= 3; lCount++) {
|
||||
lByte = (lValue >>> (lCount * 8)) & 255
|
||||
WordToHexValue_temp = '0' + lByte.toString(16)
|
||||
WordToHexValue = WordToHexValue + WordToHexValue_temp.substr(WordToHexValue_temp.length - 2, 2)
|
||||
}
|
||||
return WordToHexValue
|
||||
}
|
||||
var x = []
|
||||
var k, AA, BB, CC, DD, a, b, c, d
|
||||
var S11 = 7
|
||||
var S12 = 12
|
||||
var S13 = 17
|
||||
var S14 = 22
|
||||
var S21 = 5
|
||||
var S22 = 9
|
||||
var S23 = 14
|
||||
var S24 = 20
|
||||
var S31 = 4
|
||||
var S32 = 11
|
||||
var S33 = 16
|
||||
var S34 = 23
|
||||
var S41 = 6
|
||||
var S42 = 10
|
||||
var S43 = 15
|
||||
var S44 = 21
|
||||
x = ConvertToWordArray(sMessage)
|
||||
a = 0x67452301
|
||||
b = 0xEFCDAB89
|
||||
c = 0x98BADCFE
|
||||
d = 0x10325476
|
||||
for (k = 0; k < x.length; k += 16) {
|
||||
AA = a
|
||||
BB = b
|
||||
CC = c
|
||||
DD = d
|
||||
a = FF(a, b, c, d, x[k + 0], S11, 0xD76AA478)
|
||||
d = FF(d, a, b, c, x[k + 1], S12, 0xE8C7B756)
|
||||
c = FF(c, d, a, b, x[k + 2], S13, 0x242070DB)
|
||||
b = FF(b, c, d, a, x[k + 3], S14, 0xC1BDCEEE)
|
||||
a = FF(a, b, c, d, x[k + 4], S11, 0xF57C0FAF)
|
||||
d = FF(d, a, b, c, x[k + 5], S12, 0x4787C62A)
|
||||
c = FF(c, d, a, b, x[k + 6], S13, 0xA8304613)
|
||||
b = FF(b, c, d, a, x[k + 7], S14, 0xFD469501)
|
||||
a = FF(a, b, c, d, x[k + 8], S11, 0x698098D8)
|
||||
d = FF(d, a, b, c, x[k + 9], S12, 0x8B44F7AF)
|
||||
c = FF(c, d, a, b, x[k + 10], S13, 0xFFFF5BB1)
|
||||
b = FF(b, c, d, a, x[k + 11], S14, 0x895CD7BE)
|
||||
a = FF(a, b, c, d, x[k + 12], S11, 0x6B901122)
|
||||
d = FF(d, a, b, c, x[k + 13], S12, 0xFD987193)
|
||||
c = FF(c, d, a, b, x[k + 14], S13, 0xA679438E)
|
||||
b = FF(b, c, d, a, x[k + 15], S14, 0x49B40821)
|
||||
a = GG(a, b, c, d, x[k + 1], S21, 0xF61E2562)
|
||||
d = GG(d, a, b, c, x[k + 6], S22, 0xC040B340)
|
||||
c = GG(c, d, a, b, x[k + 11], S23, 0x265E5A51)
|
||||
b = GG(b, c, d, a, x[k + 0], S24, 0xE9B6C7AA)
|
||||
a = GG(a, b, c, d, x[k + 5], S21, 0xD62F105D)
|
||||
d = GG(d, a, b, c, x[k + 10], S22, 0x2441453)
|
||||
c = GG(c, d, a, b, x[k + 15], S23, 0xD8A1E681)
|
||||
b = GG(b, c, d, a, x[k + 4], S24, 0xE7D3FBC8)
|
||||
a = GG(a, b, c, d, x[k + 9], S21, 0x21E1CDE6)
|
||||
d = GG(d, a, b, c, x[k + 14], S22, 0xC33707D6)
|
||||
c = GG(c, d, a, b, x[k + 3], S23, 0xF4D50D87)
|
||||
b = GG(b, c, d, a, x[k + 8], S24, 0x455A14ED)
|
||||
a = GG(a, b, c, d, x[k + 13], S21, 0xA9E3E905)
|
||||
d = GG(d, a, b, c, x[k + 2], S22, 0xFCEFA3F8)
|
||||
c = GG(c, d, a, b, x[k + 7], S23, 0x676F02D9)
|
||||
b = GG(b, c, d, a, x[k + 12], S24, 0x8D2A4C8A)
|
||||
a = HH(a, b, c, d, x[k + 5], S31, 0xFFFA3942)
|
||||
d = HH(d, a, b, c, x[k + 8], S32, 0x8771F681)
|
||||
c = HH(c, d, a, b, x[k + 11], S33, 0x6D9D6122)
|
||||
b = HH(b, c, d, a, x[k + 14], S34, 0xFDE5380C)
|
||||
a = HH(a, b, c, d, x[k + 1], S31, 0xA4BEEA44)
|
||||
d = HH(d, a, b, c, x[k + 4], S32, 0x4BDECFA9)
|
||||
c = HH(c, d, a, b, x[k + 7], S33, 0xF6BB4B60)
|
||||
b = HH(b, c, d, a, x[k + 10], S34, 0xBEBFBC70)
|
||||
a = HH(a, b, c, d, x[k + 13], S31, 0x289B7EC6)
|
||||
d = HH(d, a, b, c, x[k + 0], S32, 0xEAA127FA)
|
||||
c = HH(c, d, a, b, x[k + 3], S33, 0xD4EF3085)
|
||||
b = HH(b, c, d, a, x[k + 6], S34, 0x4881D05)
|
||||
a = HH(a, b, c, d, x[k + 9], S31, 0xD9D4D039)
|
||||
d = HH(d, a, b, c, x[k + 12], S32, 0xE6DB99E5)
|
||||
c = HH(c, d, a, b, x[k + 15], S33, 0x1FA27CF8)
|
||||
b = HH(b, c, d, a, x[k + 2], S34, 0xC4AC5665)
|
||||
a = II(a, b, c, d, x[k + 0], S41, 0xF4292244)
|
||||
d = II(d, a, b, c, x[k + 7], S42, 0x432AFF97)
|
||||
c = II(c, d, a, b, x[k + 14], S43, 0xAB9423A7)
|
||||
b = II(b, c, d, a, x[k + 5], S44, 0xFC93A039)
|
||||
a = II(a, b, c, d, x[k + 12], S41, 0x655B59C3)
|
||||
d = II(d, a, b, c, x[k + 3], S42, 0x8F0CCC92)
|
||||
c = II(c, d, a, b, x[k + 10], S43, 0xFFEFF47D)
|
||||
b = II(b, c, d, a, x[k + 1], S44, 0x85845DD1)
|
||||
a = II(a, b, c, d, x[k + 8], S41, 0x6FA87E4F)
|
||||
d = II(d, a, b, c, x[k + 15], S42, 0xFE2CE6E0)
|
||||
c = II(c, d, a, b, x[k + 6], S43, 0xA3014314)
|
||||
b = II(b, c, d, a, x[k + 13], S44, 0x4E0811A1)
|
||||
a = II(a, b, c, d, x[k + 4], S41, 0xF7537E82)
|
||||
d = II(d, a, b, c, x[k + 11], S42, 0xBD3AF235)
|
||||
c = II(c, d, a, b, x[k + 2], S43, 0x2AD7D2BB)
|
||||
b = II(b, c, d, a, x[k + 9], S44, 0xEB86D391)
|
||||
a = AddUnsigned(a, AA)
|
||||
b = AddUnsigned(b, BB)
|
||||
c = AddUnsigned(c, CC)
|
||||
d = AddUnsigned(d, DD)
|
||||
}
|
||||
var temp = WordToHex(a) + WordToHex(b) + WordToHex(c) + WordToHex(d)
|
||||
return temp.toLowerCase()
|
||||
}
|
||||
25
src/utils/permission.js
Normal file
25
src/utils/permission.js
Normal file
@@ -0,0 +1,25 @@
|
||||
import store from '@/store'
|
||||
|
||||
/**
|
||||
* @param {Array} value
|
||||
* @returns {Boolean}
|
||||
* @example see @/views/auth/directive.vue
|
||||
*/
|
||||
export default function checkPermission(value) {
|
||||
if (value && value instanceof Array && value.length > 0) {
|
||||
const roles = store.getters && store.getters.roles
|
||||
const permissionRoles = value
|
||||
|
||||
const hasPermission = roles.some(role => {
|
||||
return permissionRoles.includes(role)
|
||||
})
|
||||
|
||||
if (!hasPermission) {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
} else {
|
||||
console.error(`need roles! Like v-permission="['admin','editor']"`)
|
||||
return false
|
||||
}
|
||||
}
|
||||
69
src/utils/request.js
Normal file
69
src/utils/request.js
Normal file
@@ -0,0 +1,69 @@
|
||||
import axios from 'axios'
|
||||
import { Notification, MessageBox } from 'element-ui'
|
||||
import store from '../store'
|
||||
import { getToken } from '@/utils/auth'
|
||||
|
||||
// 创建axios实例
|
||||
const service = axios.create({
|
||||
baseURL: process.env.BASE_API, // api 的 base_url
|
||||
timeout: 5000 // 请求超时时间
|
||||
})
|
||||
|
||||
// request拦截器
|
||||
service.interceptors.request.use(
|
||||
config => {
|
||||
if (store.getters.token) {
|
||||
config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
|
||||
}
|
||||
config.headers['Content-Type'] = 'application/json'
|
||||
return config
|
||||
},
|
||||
error => {
|
||||
// Do something with request error
|
||||
console.log(error) // for debug
|
||||
Promise.reject(error)
|
||||
}
|
||||
)
|
||||
|
||||
// response 拦截器
|
||||
service.interceptors.response.use(
|
||||
response => {
|
||||
const code = response.status
|
||||
if (code < 200 || code > 300) {
|
||||
Notification.error({
|
||||
title: response.message
|
||||
})
|
||||
return Promise.reject('error')
|
||||
} else {
|
||||
return response.data
|
||||
}
|
||||
},
|
||||
error => {
|
||||
const code = error.response.data.status
|
||||
if (code === 403 || code === 401) {
|
||||
MessageBox.confirm(
|
||||
'Token 无效或已经过期,你可以取消继续留在该页面,或者重新登录',
|
||||
'提示',
|
||||
{
|
||||
confirmButtonText: '重新登录',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning'
|
||||
}
|
||||
).then(() => {
|
||||
store.dispatch('LogOut').then(() => {
|
||||
location.reload() // 为了重新实例化vue-router对象 避免bug
|
||||
})
|
||||
})
|
||||
} else {
|
||||
const errorMsg = error.response.data.message
|
||||
if (errorMsg !== undefined) {
|
||||
Notification.error({
|
||||
title: errorMsg,
|
||||
duration: 2500
|
||||
})
|
||||
}
|
||||
}
|
||||
return Promise.reject(error)
|
||||
}
|
||||
)
|
||||
export default service
|
||||
27
src/utils/validate.js
Normal file
27
src/utils/validate.js
Normal file
@@ -0,0 +1,27 @@
|
||||
/**
|
||||
* Created by jiachenpan on 16/11/18.
|
||||
*/
|
||||
|
||||
/* 合法uri*/
|
||||
export function validateURL(textval) {
|
||||
const urlregex = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/
|
||||
return urlregex.test(textval)
|
||||
}
|
||||
|
||||
/* 小写字母*/
|
||||
export function validateLowerCase(str) {
|
||||
const reg = /^[a-z]+$/
|
||||
return reg.test(str)
|
||||
}
|
||||
|
||||
/* 大写字母*/
|
||||
export function validateUpperCase(str) {
|
||||
const reg = /^[A-Z]+$/
|
||||
return reg.test(str)
|
||||
}
|
||||
|
||||
/* 大小写字母*/
|
||||
export function validatAlphabets(str) {
|
||||
const reg = /^[A-Za-z]+$/
|
||||
return reg.test(str)
|
||||
}
|
||||
Reference in New Issue
Block a user