|
|
var userAgent = navigator.userAgent;
|
|
|
var isApp = userAgent.indexOf('isapp') !== -1;
|
|
|
var localStoreMsg = false; // 是否本地存储消息
|
|
|
/* API 网关 */
|
|
|
var apigateway = config.apigateway;
|
|
|
/* 从存储载入消息 */
|
|
|
var isLoadedMSG = false;
|
|
|
|
|
|
/**
|
|
|
* 异步请求拦截器
|
|
|
* 前端网络请求封装统一处理
|
|
|
*/
|
|
|
axios.interceptors.request.use(
|
|
|
//========== 所有请求之前都要执行的操作 ==============
|
|
|
function (config) {
|
|
|
if (config.url.indexOf('.html') === -1) {
|
|
|
if (store.state.accessToken && config.url.indexOf('getToken') === -1) {
|
|
|
config.withCredentials = true;
|
|
|
config.headers['x-requested-with'] = 'XMLHttpRequest';
|
|
|
config.headers['Authorization'] = 'Bearer ' + store.state.accessToken;
|
|
|
config.headers['X-APP-VERSION'] = '2.0.0';
|
|
|
}
|
|
|
// 绝对路径替换为网关+路径 (防止多次请求重复拼接URL)
|
|
|
config.url = config.url.indexOf('/') == 0 ? apigateway + config.url : config.url;
|
|
|
}else{
|
|
|
config.url += `?v=${version}`
|
|
|
}
|
|
|
// $('#loading').show();
|
|
|
return config;
|
|
|
},
|
|
|
function (error) {
|
|
|
$('#loading').fadeOut(100);
|
|
|
return Promise.reject(error);
|
|
|
}
|
|
|
);
|
|
|
|
|
|
/**
|
|
|
* 异步请求拦截器
|
|
|
* 前端网络请求异常统一处理
|
|
|
*/
|
|
|
axios.interceptors.response.use(function (response) {
|
|
|
$('#loading').fadeOut(100);
|
|
|
//根据config内容动态设置url
|
|
|
|
|
|
return response;
|
|
|
}, function (error) {
|
|
|
console.log('拦截到返回错误:');
|
|
|
console.log(error);
|
|
|
//============== 错误处理 ====================
|
|
|
if (error && error.response) {
|
|
|
switch (error.response.status) {
|
|
|
case 400: error.message = '请求错误(400)'; break;
|
|
|
case 401: error.message = '未授权,请重新登录(401)'; break;
|
|
|
case 403: error.message = '拒绝访问(403)'; break;
|
|
|
case 404: error.message = '请求出错(404)'; break;
|
|
|
case 408: error.message = '请求超时(408)'; break;
|
|
|
case 500: error.message = '服务器错误(500)'; break;
|
|
|
case 501: error.message = '服务未实现(501)'; break;
|
|
|
case 502: error.message = '网络错误(502)'; break;
|
|
|
case 503: error.message = '服务不可用(503)'; break;
|
|
|
case 504: error.message = '网络超时(504)'; break;
|
|
|
case 505: error.message = 'HTTP版本不受支持(505)'; break;
|
|
|
default: error.message = `连接出错(${err.response.status})!`;
|
|
|
}
|
|
|
} else {
|
|
|
err.message = '连接服务器失败!'
|
|
|
}
|
|
|
if (error.response.status === 401 && error.config.url.indexOf('refreshToken') === -1) {
|
|
|
var url = '/UserCenter/api/v1/token/refreshToken';
|
|
|
var data = '"' + store.state.refreshToken + '"';
|
|
|
/**
|
|
|
* 刷新Token
|
|
|
*/
|
|
|
axios.post(url, data, { headers: { 'Content-Type': 'application/json;charset=UTF-8' } })
|
|
|
.then(function (response) {
|
|
|
|
|
|
localStorage.setItem('accessToken', response.data.accessToken);
|
|
|
localStorage.setItem('refreshToken', response.data.refreshToken);
|
|
|
|
|
|
store.commit('setToken', response.data);
|
|
|
error.config.headers['Authorization'] = 'Bearer ' + store.state.accessToken;
|
|
|
console.log('刷新token后重发api请求');
|
|
|
/* 重新发送原请求 */
|
|
|
delete error.config.headers.Authorization // 移除旧的AccessToken信息,避免拦截器无法设置新AccessToken
|
|
|
axios.request(error.config);
|
|
|
})
|
|
|
.catch(function (error) { // 如果为RefreshToken失败则跳转登录页面
|
|
|
if (error.response.status === 401) {
|
|
|
console.log('refreshToken 已过期');
|
|
|
router.push('/pages/login');
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
$('#loading').fadeOut(100);
|
|
|
return Promise.reject(error);
|
|
|
});
|
|
|
///
|
|
|
const routes = [
|
|
|
];
|
|
|
var routeList = routes.concat();
|
|
|
const router = new VueRouter({
|
|
|
//mode: 'history',
|
|
|
routes
|
|
|
});
|
|
|
router.beforeEach((to, from, next) => {
|
|
|
$('#loading').show();
|
|
|
if (!store.state.accessToken && to.path !== '/pages/login') {
|
|
|
router.push('/pages/login');
|
|
|
return;
|
|
|
}
|
|
|
if (store.state.accessToken) {
|
|
|
connect();
|
|
|
}
|
|
|
var route;
|
|
|
for (var i = 0; i < routeList.length; i++) {
|
|
|
if (routeList[i].path === to.path) {
|
|
|
route = routeList[i];
|
|
|
}
|
|
|
}
|
|
|
if (!route) {
|
|
|
var path = to.path === '/' ? '/pages/home' : to.path;
|
|
|
var url = path + '.js';
|
|
|
var method = path.replace(/\//g, '_').substr(1) + "()";
|
|
|
$.getScript(url, function () {
|
|
|
var response = eval(method);
|
|
|
var route = {
|
|
|
path: to.path,
|
|
|
component: response.component,
|
|
|
meta: { onMessage: response.onMessage }
|
|
|
};
|
|
|
router.addRoutes([route]);
|
|
|
routeList.push(route);
|
|
|
router.push(to.fullPath);
|
|
|
});
|
|
|
}
|
|
|
else {
|
|
|
next();
|
|
|
}
|
|
|
});
|
|
|
router.afterEach((route, redirect) => {
|
|
|
Vue.nextTick(() => {
|
|
|
$('#loading').fadeOut(100);
|
|
|
})
|
|
|
})
|
|
|
|
|
|
// 人人通原生返回键回调
|
|
|
var onReturnBack = function (){
|
|
|
if(window.api){
|
|
|
window.api.execScript(
|
|
|
{
|
|
|
name: window.api.winName,
|
|
|
script: "api.closeWin()"
|
|
|
}
|
|
|
)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
window.addEventListener("popstate", function(e) {
|
|
|
$('.weui-header a.weui-header-left')[0].click();
|
|
|
}, false);
|
|
|
|
|
|
// indexedDB兼容
|
|
|
var indexedDB = window.indexedDB || window.webkitindexedDB || window.msIndexedDB || mozIndexedDB || null;
|
|
|
|
|
|
if(indexedDB){
|
|
|
console.log('支持');
|
|
|
}else{
|
|
|
console.log('不支持');
|
|
|
}
|
|
|
|
|
|
var db = null;
|
|
|
var request = indexedDB.open('app', 1);
|
|
|
request.onupgradeneeded = function(e) {
|
|
|
db = e.target.result;
|
|
|
if (!db.objectStoreNames.contains('message')) {
|
|
|
var objectStore = db.createObjectStore('message', { keyPath: '_id', autoIncrement: true });
|
|
|
}
|
|
|
console.log("数据库创建成功");
|
|
|
}
|
|
|
request.onsuccess = function() {
|
|
|
db = request.result;
|
|
|
console.log("数据库打开成功");
|
|
|
/**
|
|
|
* 初始化消息列表
|
|
|
*/
|
|
|
|
|
|
//loadMessage();
|
|
|
}
|
|
|
|
|
|
function saveMessage(msg){
|
|
|
if(db){
|
|
|
console.log("数据库打开");
|
|
|
var transaction = db.transaction('message','readwrite');
|
|
|
var objectStore = transaction.objectStore('message');
|
|
|
var jsonMsg = JSON.parse(msg);
|
|
|
// 校验数据格式(当前只存储带key的消息,后续会有调整)
|
|
|
if( jsonMsg.key ){
|
|
|
// 本地存储
|
|
|
if(localStoreMsg){
|
|
|
objectStore.add({data: jsonMsg});
|
|
|
}
|
|
|
store.commit('setMessages', [{data: jsonMsg}]);
|
|
|
}
|
|
|
}else{
|
|
|
console.log("数据库未打开");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function loadMessage(callback, limit = 99){
|
|
|
if(db){
|
|
|
console.log("数据库打开");
|
|
|
var transaction = db.transaction('message','readwrite');
|
|
|
var objectStore = transaction.objectStore('message');
|
|
|
var req = objectStore.openCursor();
|
|
|
var items = [];
|
|
|
// 回调会被多次调用
|
|
|
req.onsuccess = function (evt) {
|
|
|
var cursor = evt.target.result;
|
|
|
if(cursor){ // 必要检查
|
|
|
var item = cursor.value;
|
|
|
if(item.data.device){
|
|
|
items.push(item);
|
|
|
}
|
|
|
cursor.continue(); // 移动到下一项
|
|
|
}else{
|
|
|
// 回调函数
|
|
|
callback(items);
|
|
|
// 加载后删除数据库,只缓存上次应用开启数据
|
|
|
//indexedDB.deleteDatabase('app');
|
|
|
objectStore.clear();
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
var req = objectStore.get(limit);
|
|
|
req.onerror = function(event) {
|
|
|
console.log('事务失败');
|
|
|
};
|
|
|
|
|
|
}else{
|
|
|
console.log("数据库未打开");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
///
|
|
|
const app = new Vue({
|
|
|
store: store,
|
|
|
router,
|
|
|
data: {
|
|
|
},
|
|
|
mounted: function () {
|
|
|
// 判断是否登录
|
|
|
if(localStorage.getItem('accessToken') === null){
|
|
|
//
|
|
|
router.push({path:'/pages/login'})
|
|
|
}
|
|
|
},
|
|
|
destroyed: function(){
|
|
|
//Todo
|
|
|
},
|
|
|
methods: {
|
|
|
//Todo
|
|
|
},
|
|
|
}).$mount('#app'); |