Skip to content

Instantly share code, notes, and snippets.

@lenconda
Created November 2, 2018 13:32
Show Gist options
  • Save lenconda/4dcccd369c054f2061e5675c1d601dcd to your computer and use it in GitHub Desktop.
Save lenconda/4dcccd369c054f2061e5675c1d601dcd to your computer and use it in GitHub Desktop.
utils.js
const baseUrl = window.isDevMode ? '/api' : 'https://os.ncuos.com/api'
// 信息提示框
/**
* @param {any} msg
* @param {any} isSucc
*/
const alertBox = function (msg, isSucc) {
msg = typeof msg !== 'undefined' ? msg : '操作失败'
try {
if (msg.indexOf('permission') >= 0) {
router.go('/index')
}
} catch (e) { }
let color, icon
try {
if (isSucc || msg.indexOf('成功') >= 0) {
color = 'btn-success'
icon = 'fa-check-circle'
} else {
color = 'btn-danger'
icon = 'fa-times-circle'
}
} catch (e) {
color = 'btn-danger'
icon = 'fa-times-circle'
}
console.log(color, icon, msg)
if (q('.alertBox').innerHTML === ' ' || q('.alertBox').innerHTML.length < 1) {
var span = document.createElement('span')
q('.alertBox').setAttribute('class', 'btn alertBox ' + color)
var i = document.createElement('i')
i.setAttribute('class', 'fa ' + icon)
span.innerText = ' ' + msg
q('.alertBox').appendChild(i)
q('.alertBox').appendChild(span)
}
setTimeout(function () {
q('.alertBox').innerHTML = ''
q('.alertBox').setAttribute('class', 'alertBox')
}, 4500)
}
// 各种状态码处理
const resOpt = {
code500: function (res, cb, ajaxData, msg) {
if (msg) {
alertBox(msg)
} else {
alertBox('操作失败')
}
cb({ status: 0 })
},
code502: function (res, cb) {
alertBox('操作失败')
cb({ status: 0 })
},
code404: function (res, cb) {
},
code400: function (res, cb) {
console.log('400')
let data = JSON.parse(res)
let msg = ''
for (let prototype in data.message) {
console.log(prototype)
msg += data.message[prototype] + ','
}
alertBox(msg.slice(0, msg.length - 1))
cb({ status: 0 })
},
code401: function (res, cb, ajaxData) {
console.log('401')
let logined = (data) => {
if (data.status || (Miracle.isApp() && data.token)) {
localStorage.setItem('token', data.token)
ajax(ajaxData.method,
ajaxData.url,
ajaxData.cb,
ajaxData.data,
ajaxData.datatype)
} else {
localStorage.removeItem('token')
localStorage.removeItem('username')
alertBox(data.message)
if (router._currentRoute.path !== '/loginBox/login') {
localStorage.setItem('url401back', router._currentRoute.path)
alertBox('重新登录')
}
router.replace('/loginBox/login')
}
}
if (Miracle.isApp()) {
// app里刷新token策略
Miracle.call('Auth', 'refreshToken', {}, (data) => {
// 成功回调
console.log(data)
logined(data)
}, (error) => {
// 失败回调
alertBox(error.message)
})
} else {
// 非app里刷新token策略
if (localStorage.getItem('username') && localStorage.getItem('userid')) {
let jsonData = JSON.stringify({
username: localStorage.getItem('username'),
password: atob(localStorage.getItem('userid'))
})
ajax('post', '/user/token', logined, jsonData, 'json')
} else {
if (router._currentRoute.path !== '/loginBox/login') {
localStorage.setItem('url401back', router._currentRoute.path)
alertBox('重新登录')
}
router.replace('/loginBox/login')
}
}
},
code403: function (res, cb) {
res = JSON.parse(res)
router.go('/index')
cb('403')
// alertBox(res.message)
},
code200: function (res, cb, jsonData, msg) {
// console.log(cb)
// console.log(res);
try {
res = JSON.parse(res)
cb(res, msg)
} catch (e) {
cb({ data: res, status: 1 }, msg)
}
},
code204: (res) => {
console.log(204)
}
}
// 选择器,因为有jq准备弃用
const q = function (css) {
return document.querySelector(css)
}
const qa = function (css) {
return document.querySelectorAll(css)
}
// token操作
const tokenOperate = {
// 获取token后
afterGetToken: function (data) {
tokenOperate.saveToken(data.token)
router.go('/')
},
// 写入token
saveToken: function (token) {
var date = new Date()
localStorage.setItem('token', token)
localStorage.setItem('time', date.getTime())
},
// 读取token
takeToken: function () {
var token = ''
token = localStorage.getItem('token')
return token
},
// 清除tooken
clearToken: function () {
localStorage.clear()
console.log('out')
}
}
// 数据埋点
var ajaxPostAsync = function (data) {
data = JSON.stringify(data)
var xmlHttp = new XMLHttpRequest()
let token = localStorage.getItem('token')
xmlHttp.onreadystatechange = function () {
if (xmlHttp.readyState === 4 && xmlHttp.status === 200) {
console.log(xmlHttp.status)
}
}
xmlHttp.open('POST', 'https://welcome.ncuhome.cn/storage/index', true)
xmlHttp.setRequestHeader('Authorization', 'passport ' + token)
xmlHttp.setRequestHeader('Content-type', 'application/json')
xmlHttp.send(data)
}
/**
* @param {string} method
* @param {any} url
* @param {any} cb
* @param {any} data
* @param {any} dataType
* @param {any} msg
* @param {any} ignore
*/
const ajax = function (method, url, cb, data, dataType, msg, ignore) {
let date = new Date()
let mm = date.getMonth() + 1
if (mm < 10) {
mm = `0${mm}`
}
let time = `${date.getFullYear()}-${mm}-${date.getDate()}T${date.getHours()}:${date.getMinutes()}:${date.getSeconds()}`
let ajaxData
if (url !== '/user/token') {
ajaxData = {
method,
url,
cb,
data,
dataType
}
}
let syncurl = url
var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP')
if (!ignore) {
url = baseUrl + url
}
let storageData = {
cip: {
cip: localStorage.getItem('cip'),
cid: localStorage.getItem('ipcid'),
cname: localStorage.getItem('cname')
},
navigator: {
appCodeName: window.navigator.appCodeName,
appName: window.navigator.appName,
appVersion: window.navigator.appVersion,
connection: window.navigator.connection,
cookieEnabled: window.navigator.cookieEnabled,
maxTouchPoints: window.navigator.maxTouchPoints,
language: window.navigator.language,
mimeTypes: window.navigator.mimeTypes,
onLine: window.navigator.onLine,
platform: window.navigator.platform,
plugins: window.navigator.plugins,
product: window.navigator.product,
productSub: window.navigator.productSub,
storage: window.navigator.storage,
userAgent: window.navigator.userAgent,
vendor: window.navigator.vendor,
vendorSub: window.navigator.vendorSub,
usb: window.navigator.usb
},
apiurl: url,
statuscode: '',
fedate: time,
res: '',
req: null
}
xhr.open(method.toUpperCase(), url, true)
if (tokenOperate.takeToken() && tokenOperate.takeToken().length > 0) {
let token = tokenOperate.takeToken()
if (syncurl !== '/go/login/sync') {
xhr.setRequestHeader('Authorization', 'passport ' + token)
}
}
if (method.toLowerCase() === 'get') {
xhr.send(null)
} else {
var contentType = 'application/x-www-form-urlencoded'
if (dataType) {
if (dataType.toLowerCase() === 'json') {
contentType = 'application/json'
};
};
xhr.setRequestHeader('Content-type', contentType)
xhr.send(data)
storageData.req = data
};
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
let res = unescape(xhr.responseText.replace(/\\u/g, '%u'))
storageData.statuscode = xhr.status
storageData.res = res
ajaxPostAsync(storageData)
try {
resOpt[`code${xhr.status}`](res, cb, ajaxData, msg)
} catch (error) {
alertBox('操作失败')
}
}
}
}
// make nianjiList
var generateNianjiList = function (xueqi) {
var list = []
for (var i = xueqi.length - 1; i >= 0; i--) {
if (list.indexOf(xueqi[i]) === -1) {
list.push({ dm: xueqi[i].dm.split('-')[0] })
}
}
list = list.reverse()
list = JSON.stringify(list)
localStorage.setItem('nianji', list)
}
// url: /info/code_name/list
const codeList = [
'pyfs', 'xslb', 'xb', 'xx', 'mz', 'gatq', 'gb',
'hkxz', 'zzmm', 'jtgx', 'hyzk', 'yxsbb',
'yxslb', 'xggblb', 'xzjb', 'xw', 'grsf', 'xiaoqu', 'pycc', 'xueqi'
]
const getCodeList = function () {
for (var i = codeList.length - 1; i >= 0; i--) {
codeNameOperate(codeList[i])
}
}
var codeNameOperate = function (codeName) {
// console.log(codeName);
var setCodeNameLists = function (data) {
// console.log(data);
if (data.status) {
if (codeName === 'xueqi') {
data.code = data.code.reverse()
console.log(data.code)
generateNianjiList(data.code)
}
localStorage.setItem(codeName, JSON.stringify(data.code))
}
}
var getCodeNameList = function () {
ajax('get', '/info/code_name/' + codeName, setCodeNameLists, {}, 'json')
}
if (localStorage.getItem(codeName)) {
} else {
getCodeNameList()
}
}
const autoChangeTitle = function () {
if ($('.breadcrumb .active')[0]) {
let title = $('.breadcrumb .active')[0].innerText
console.log(title)
document.title = '云家园-' + title
} else {
document.title = '云家园'
}
}
const datepickerInit = function (...types) {
// docs http://www.bootcss.com/p/bootstrap-datetimepicker/
this.dataView1 = function () {
$('.datetimepicker').each(function () {
var opt = {
language: 'zh-CN',
format: 'yyyy-mm-dd',
minView: 2,
autoclose: true
}
$(this).datetimepicker(opt)
})
}
this.dataView2 = function () {
$('.daterange').each(function () {
var elm = this
$(this).daterangepicker({
startDate: $(elm).prev().prev().val(),
endDate: $(elm).prev().val(),
format: 'YYYY-MM-DD'
}, function (start, end) {
$(elm).find('.date-title ').html(start.toDateStr() + '至' + end.toDateStr())
$(elm).prev().prev().val(start.toDateStr())
$(elm).prev().val(end.toDateStr())
})
})
}
this.dataView3 = function () {
$('.datetimepicker3').each(function () {
var opt = {
language: 'zh-CN',
format: 'yyyy-mm',
startView: 3,
minView: 3,
autoclose: true
}
$(this).datetimepicker(opt)
})
}
this.dataView4 = function () {
$('.datetimepicker2').each(function () {
var opt = {
language: 'zh-CN',
format: 'yyyy-mm-dd hh:ii',
autoclose: true
}
$(this).datetimepicker(opt)
})
}
this.dataView5 = function () {
$('.datetimepicker2').each(function () {
var opt = {
language: 'zh-CN',
format: 'yyyy-mm-dd hh:ii:ss',
autoclose: true
}
$(this).datetimepicker(opt)
})
}
console.log(types)
if (types.length > 0) {
for (let type of types) {
this[`dataView${type}`]()
}
} else {
this.dataView1()
this.dataView2()
this.dataView3()
this.dataView4()
this.dataView5()
}
// $(function () {
// let opt = {
// language: 'zh-CN',
// weekStart: 1,
// todayBtn: 1,
// autoclose: 1,
// minView: 2,
// maxView: 4,
// format: 'yyyy-mm-dd',
// todayHighlight: 1,
// startView: 2,
// forceParse: 0,
// showMeridian: 1
// }
// $('.datetimepicker').datetimepicker(opt)
// })
}
// 判断微信
const weixinDrag = () => {
if (typeof WeixinJSBridge !== 'undefined' || navigator.userAgent.toLowerCase().indexOf('micromessenger') > -1) {
// alert('检测到您正在用微信打开网页,这可能会降低体验或导致某些功能无法使用,请尽量用浏览器打开 www.ncuos.com') // eslint-disable-line
return true
}
}
export default {
tokenOperate,
ajax,
q,
qa,
// fetch,
alertBox,
getCodeList,
autoChangeTitle,
datepickerInit,
weixinDrag
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment