/*!
* =====================================================
* 共通 JavaScript脚本
* =====================================================
*/
// 请求路径
var base_url = "";
/*!
* =====================================================
* MUI全局设定
* =====================================================
*/
(function($) {
// 设置全局initGlobal
$.initGlobal({
swipeBack: false, // 滑动返回功能禁用
statusBarBackground: '#FFFFFF', // iOS状态栏背景色
keyEventBind: { // 安卓绑定返回按钮
backbutton: true
}
});
// 设置全局beforeSend
$.ajaxSettings.beforeSend = function(xhr, setting) {
setting.timeout = 5000; // 请求超时设置5秒
console.log('ajax beforeSend:' + JSON.stringify(setting));
};
// 设置全局complete
$.ajaxSettings.complete = function(xhr, status) {
console.log('ajax complete:' + status);
};
// 设置全局success
$.ajaxSettings.success = function(data) {
console.log('ajax success:' + JSON.stringify(data));
};
// 设置全局error
$.ajaxSettings.error = function(xhr, type, errorThrown) {
console.log('ajax error:' + errorThrown);
};
})(mui);
/*!
* =====================================================
* 自定义应用组件
* =====================================================
*/
var AppUtils = (function($) {
var owner = {};
/*!
* =====================================================
* 常用共通函数
* =====================================================
*/
/**
* 验证数字
*
* @param {String} value 数字
* @return {Boolean} true:正确/false:错误
*/
owner.checkNumber = function(value) {
value = value.replace(/(\()|(\))|(\-)/g, '');
var reg = /^(([0-9]+)|([0-9]+\.[0-9]{1,3}))$/;
return reg.test(value);
};
/**
* 验证手机号码
*
* @param {String} value 手机号码
* @return {Boolean} true:正确/false:错误
*/
owner.checkMobileNumber = function(value) {
value = value.replace(/(\()|(\))|(\-)/g, '');
var reg = /^1[3|4|5|7|8](\d{9})$/;
return reg.test(value);
};
/**
* 电话号码
*
* @param {String} value 电话号码
* @return {Boolean} true:正确/false:错误
*/
owner.checkPhoneNumber = function(value) {
value = value.replace(/(\()|(\))|(\-)/g, '');
var reg = /(^1[3|4|5|7|8](\d{9})$)|(^400\d{7}$)|(^\+86[1-9]{1}\d{7,10}$)|(^0\d{8,11}$)|(\d{6,8})/;
return reg.test(value);
};
/**
* 验证身份证号码
*
* @param {String} value 身份证号码
* @return {Boolean} true:正确/false:错误
*/
owner.checkIdCard = function(value) {
value = value.replace(/(\()|(\))|(\-)/g, '');
// 权值
var powers = new Array("7", "9", "10", "5", "8", "4", "2", "1", "6", "3", "7", "9", "10", "5", "8", "4", "2");
// 验证码
var parityBit = new Array("1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2");
var valid = false;
if (value.length == 15) {
valid = validId15(value);
} else if (value.length == 18) {
valid = validId18(value);
}
return valid;
// 校验18位的身份证号码
function validId18(_id) {
_id = _id + "";
var _num = _id.substr(0, 17);
var _parityBit = _id.substr(17);
var _power = 0;
for (var i = 0; i < 17; i++) {
// 校验每一位的合法性
if (_num.charAt(i) < '0' || _num.charAt(i) > '9') {
return false;
break;
} else {
// 加权
_power += parseInt(_num.charAt(i)) * parseInt(powers[i]);
}
}
// 取模
var mod = parseInt(_power) % 11;
if (parityBit[mod] == _parityBit) {
return true;
}
return false;
};
// 校验15位的身份证号码
function validId15(_id) {
_id = _id + "";
for (var i = 0; i < _id.length; i++) {
// 校验每一位的合法性
if (_id.charAt(i) < '0' || _id.charAt(i) > '9') {
return false;
break;
}
}
var year = _id.substr(6, 2);
var month = _id.substr(8, 2);
var day = _id.substr(10, 2);
// 校验年份位
if (year < '01' || year > '90') {
return false;
}
// 校验月份
if (month < '01' || month > '12') {
return false;
}
// 校验日
if (day < '01' || day > '31') {
return false;
}
return true;
};
validId(value);
};
/**
* 判断对象是否是undefined/null
*
* @param {Object} exp 对象
*/
owner.isNull = function(exp) {
if (exp == undefined ||
exp == null ||
exp == 'null' ||
exp == '' ||
exp == 'undefined') {
return true;
}
return false;
};
/**
* 判断对象是否不是undefined/null
*
* @param {Object} exp 对象
*/
owner.isNotNull = function(exp) {
return !owner.isNull(exp);
};
/**
* NULL的场合返回空白,或者指定的默认值。
*
* @param {Object} expression 校验对象
* @param {Object} defaultValue 默认值
*/
owner.esapeNull = function(expression, defaultValue) {
if (expression == undefined ||
expression == null ||
expression == 'null' ||
expression == 'undefined') {
return defaultValue || '';
}
return expression;
};
/**
* 隐藏部分字符串,显示 xx...
*
* @param {String} value 字符串
* @param {Number} showLength 显示长度
*/
owner.hideStr = function(value, showLength) {
// Null值回避
value = owner.esapeNull(value);
// 字符串长度小于指定长度
if (value.length <= showLength) {
return value;
}
return value.substr(0, showLength) + '...';
};
/**
* 取得当前页面文件名
*
* @param {Object} href 文件路径
*/
owner.getFileName = function(href) {
var reg = /(\w+)\.html/;
var take = reg.exec(href);
if (take == null) {
return "";
} else {
return take[1];
}
};
/**
* 加载脚本文件
* @param {Object} url
*/
owner.loadScript = function(url) {
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = url;
document.getElementsByTagName('head')[0].appendChild(script);
};
/*!
* =====================================================
* MUI增强函数
* =====================================================
*/
/**
* 关闭启动页
*/
owner.closeSplashscreen = function() {
// 关闭splash画面
plus.navigator.closeSplashscreen();
};
/**
* 设置是否全屏
*/
owner.setFullscreen = function(isFullscreen) {
plus.navigator.setFullscreen(isFullscreen);
};
/**
* 重写返回按钮
*/
owner.back = function() {
// beforeback
if (typeof $.options.beforeback === 'function') {
if ($.options.beforeback() === false) {
return;
}
}
// 取得当前画面
var current = plus.webview.currentWebview();
// Popup画面
if (current.isPopup) {
current.close();
} else {
// 主体画面
$.confirm("确认退出?", "确认", ['是', '否'], function(e) {
if (e.index == 0) {
plus.runtime.quit();
}
});
}
};
/**
* 退出APP(安卓下返回按钮)
*/
owner.quitApp = function() {
$.confirm("确认退出?", "确认", ['是', '否'], function(e) {
if (e.index == 0) {
plus.runtime.quit();
}
});
};
/**
* 重启APP
*/
owner.restartApp = function() {
plus.runtime.restart();
};
/**
* 关闭所有画面
*
* @param {Object} webview 画面
*/
owner.closeAll = function(webview) {
var opened = webview.opened();
if (opened) {
for (var i = 0, len = opened.length; i < len; i++) {
var openedWebview = opened[i];
var open_open = openedWebview.opened();
if (open_open && open_open.length > 0) {
owner.closeAll(openedWebview);
}
openedWebview.close();
}
}
};
/**
* 关闭画面
*
* @param {Object} url 画面ID
* @param {int} delay 画面关闭动画时间(默认0)
*/
owner.closeWindow = function(url, delay) {
var webview;
if (typeof url === 'string') {
webview = plus.webview.getWebviewById(url);;
} else {
webview = url;
}
delay = delay || 0;
if (webview) {
webview.close("auto", delay);
}
};
/**
* 返回到指定画面
*
* @param {plus.webview} view 画面ID
* @param {plus.webview} functionName 方法名
* @param {plus.webview} data 传递参数
*/
owner.backTo = function(view, functionName, data) {
var tarview = null;
if (typeof view === 'string') {
tarview = plus.webview.getWebviewById(view);
} else {
tarview = view;
}
if (functionName) {
$.fire(tarview, functionName, data);
}
owner.closeAll(tarview);
};
/**
* 关闭父页面
*
* @param {Object} options
*/
owner.closeParent = function(options) {
var parent = plus.webview.currentWebview().opener();
if (parent) {
parent.close();
}
};
/**
* 打开新页面
*
* @param {Object} id
* @param {Object} url
* @param {Object} style
* @param {Object} extras
*/
owner.createWindow = function(id, url, style, extras) {
// 单参数时
if (!url) {
url = id;
id = owner.getFileName(id);
}
// 创建窗口参数
var options = {
id: id,
url: url,
style: style,
extras: $.extend({
isPopup: false
}, extras)
};
// 创建画面
var webview = $.createWindow(options);
// 画面加载完毕
webview.addEventListener("loaded", function() {
// 不管有没有等待框都关闭一下
owner.closeWaiting();
// 画面显示
webview.show('slide-in-right', 200);
}, false);
};
/**
* 打开新页面
*
* @param {Object} targetUrl 新画面
* @param {Object} extras 画面间传递参数
* @param {Object} options 画面配置信息
*/
owner.openWindow = function(targetUrl, extras, options) {
extras = $.extend({
isPopup: true
}, extras);
// 画面ID取得
var id = owner.getFileName(targetUrl);
options = options || {};
options = $.extend({
id: id,
url: targetUrl,
show: {
autoShow: false,
duration: 200,
aniShow: 'slide-in-right'
},
extras: extras,
waiting: {
autoShow: options.autoShowWaiting || false,
title: options.waitingTitle || '加载中...'
}
}, options);
// Popup内容画面
var contentPage = $.openWindow(options);
// Popup加载完成
contentPage.addEventListener("loaded", function() {
if (options.waiting.autoShow) {
owner.closeWaiting();
}
contentPage.show('slide-in-right', 200);
});
};
/**
* 预加载画面
*
* @param {String} url 页面ID
* @param {Object} styles 样式
* @param {Object} extras 参数
*/
owner.preload = function(url, styles, extras) {
if (owner.isNull(plus.webview.getWebviewById(url))) {
return mui.preload({
url: url,
id: owner.getFileName(url),
styles: styles,
extras: extras
});
} else {
return plus.webview.getWebviewById(url);
}
};
/**
* IOS样式选择器
*
* @param {Object} targetUrl
* @param {Object} extras
*/
owner.registerPopup = function(id, data, callback) {
var dialog = document.createElement("div");
dialog.setAttribute("id", id);
dialog.setAttribute("class", "mui-popover mui-popover-action mui-popover-bottom");
var html = "";
html = html + '<ul class="mui-table-view">';
for (var i = 0; i < data.length; i++) {
html = html + ' <li class="mui-table-view-cell">';
html = html + ' <a value="' + data[i].key + '">' + data[i].name + '</a>';
html = html + ' </li>';
}
html = html + '</ul>';
html = html + '<ul class="mui-table-view">';
html = html + ' <li class="mui-table-view-cell">';
html = html + ' <a value=""><b>取消</b></a>';
html = html + ' </li>';
html = html + '</ul>';
dialog.innerHTML = html;
document.body.appendChild(dialog);
mui.each(document.querySelectorAll("#" + id + " li>a"), function(index, item) {
item.addEventListener('tap', function() {
var a = this,
parent;
// 根据点击按钮,反推当前是哪个actionsheet
for (parent = a.parentNode; parent != document.body; parent = parent.parentNode) {
if (parent.classList.contains('mui-popover-action')) {
break;
}
}
//关闭actionsheet
mui('#' + parent.id).popover('toggle');
var value = a.getAttribute("value");
if (value != "" && callback != null) {
callback({
key: value,
name: a.innerHTML
});
}
});
});
};
/**
* ajax请求设定
*
* @param {String} url 请求路径
* @param {Object} data 请求参数
* @param {Function} success 成功回调函数
* @param {Object} options 选项
*/
owner.ajaxSettings = function(url, data, success, options) {
if (typeof url === "object") {
options = url;
url = undefined;
data = undefined;
success = undefined;
} else {
options = options || {};
}
// 上拉加载的场合,等待对话框不显示
var isPullupLoading = true;
var bottomPocket = document.querySelector('.mui-pull-bottom-pocket');
if (bottomPocket && bottomPocket.classList.contains('mui-block')) {
isPullupLoading = false;
}
// 成功返回时
var sucessCallback = function(result) {
console.log("[ajax result]:" + JSON.stringify(result));
if ('failure' == result.status) {
// 不管有没有等待框都关闭一下
owner.closeWaiting();
// TODO 异常信息处理 请重新登录/用户不存在
if ('W00001' == result.msg.msgCode || 'W00002' == result.msg.msgCode || 'E00004' == result.msg.msgCode) {
owner.clearUserInfo();
owner.showToast(result.msg.msgContent + ',请重新登录');
owner.restartApp();
} else if ('E00001' == result.msg.msgCode || 'E00002' == result.msg.msgCode) {
owner.showToast(result.msg.msgContent);
} else {
owner.showAlert(result.msg.msgContent);
}
return;
}
var callback = success || options.success;
callback && callback(result);
};
// 异常返回时
var errorCallback = function(xhr, type, errorThrown) {
console.log(type + " : " + errorThrown);
// 不管请求前有没有打开等待框,这里都关闭一下
owner.closeWaiting();
// 画面有上拉刷新时,将上拉刷新状态设回去
if (!isPullupLoading) {
var wrapper = mui('.mui-scroll-wrapper');
wrapper.pullRefresh().endPullupToRefresh(false);
}
owner.showToast('请求超时');
var callback = options.error;
callback && callback(xhr, type, errorThrown);
};
url = url || options.url;
var headers = {};
headers["x-phone-userid"] = owner.getSessionId(); // 用户缓存信息Key
headers["content-type"] = "application/json";
var settings = mui.extend({}, options);
settings.url = base_url + url;
settings.data = data || options.data;
settings.dataType = options.dataType || 'json';
settings.timeout = options.timeout || 30000;
settings.success = sucessCallback;
settings.error = errorCallback;
settings.headers = headers;
if (isPullupLoading && !options.noWaiting) {
var completeCallback = function() {
var callback = options.complete;
callback && callback();
};
settings.complete = completeCallback;
}
return settings;
};
/**
* 使用POST请求方式向服务器发送数据
*
* @param {String} url 请求路径
* @param {Object} data 请求参数
* @param {Function} success 成功回调函数
* @param {Object} options 选项
*/
owner.ajaxPost = function(url, data, success, options) {
// 检查网络
if (!owner.checkNetwork()) {
AppUtils.showToast("网络还没打开嘛,快去打开,等你回来噢~");
return;
}
var settings = owner.ajaxSettings(url, data, success, options);
settings.type = 'POST';
return $.ajax(settings);
};
/**
* 使用GET请求方式向服务器发送数据
*
* @param {String} url 请求路径
* @param {Object} data 请求参数
* @param {Function} success 成功回调函数
* @param {Object} options 选项
*/
owner.ajaxGet = function(url, data, success, options) {
// 检查网络
if (!owner.checkNetwork()) {
AppUtils.showToast("网络还没打开嘛,快去打开,等你回来噢~");
return;
}
var settings = owner.ajaxSettings(url, data, success, options);
return $.ajax(settings);
};
/**
* 上传文件
*
* @param {Object} url 上传路径
* @param {Object} options 选项
* @param {Object} callback 回调函数
*/
owner.uploadFile = function(url, options, callback) {
// 上传完成
owner.showWaiting('上传中...');
var task = plus.uploader.createUpload(base_url + url, {
method: "POST"
}, function(data, status) {
owner.closeWaiting();
callback && callback(data, status);
});
task.addData("sessionId", owner.getSessionId());
task.addFile(options.file_key, {
key: "file"
});
task.start();
};
/**
* 调用其它页面方法,目标页面可以通过data.detail取值
*
* @param {Object} view 页面
* @param {String} functionName 方法名
* @param {Object} data 传递参数
*/
owner.callFunction = function(view, functionName, data) {
var targetView = null;
if (typeof view === 'string') {
targetView = plus.webview.getWebviewById(view);
} else {
targetView = view;
}
if (functionName) {
$.fire(targetView, functionName, data);
}
};
/**
* 检查网络连接
*/
owner.checkNetwork = function() {
// 判断网络链接
var nt = plus.networkinfo.getCurrentType();
switch (nt) {
case plus.networkinfo.CONNECTION_ETHERNET:
case plus.networkinfo.CONNECTION_WIFI:
case plus.networkinfo.CONNECTION_CELL2G:
case plus.networkinfo.CONNECTION_CELL3G:
case plus.networkinfo.CONNECTION_CELL4G:
return true;
break;
default:
return false;
break;
}
};
/**
* 拨打电话(统一安卓和IOS两边的显示)
*
* @param {String} phone 手机号
*/
owner.dial = function(phone) {
owner.showConfirm("确认拨打电话:" + phone, function(e) {
if (e.index == 0) {
// iOS系统
if (mui.ios) {
plus.device.dial(phone, true);
} else {
// 安卓系统
var Uri = plus.android.importClass("android.net.Uri");
var Intent = plus.android.importClass("android.content.Intent");
var number = new Uri.parse("tel:" + phone);
var callIntent = new Intent(Intent.ACTION_CALL, number);
plus.android.runtimeMainActivity().startActivity(callIntent);
}
}
});
};
/**
* 警告对话框
*
* @param {String} message 消息内容
* @param {Function} callback 回调函数
*/
owner.showAlert = function(message, callback) {
$.alert(message, '提示', callback);
};
/**
* 自动消失提示框
*
* @param {String} message 消息内容
* @param {Object} options 调用系统控件的选项
*/
owner.showToast = function(message, options) {
// 特殊场合下,需要改变提示框显示方式,调用系统自带的
if (options) {
plus.nativeUI.toast(message, options);
} else {
// 一般场合调用Mui封装的,显示在底部居中2秒。
$.toast(message);
}
};
/**
* 确认对话框
*
* @param {String} message 消息内容
* @param {Function} callback 回调函数
*/
owner.showConfirm = function(message, callback) {
var btnArray = ['是', '否'];
$.confirm(message, '确认', btnArray, callback);
};
/**
* 弹出系统等待对话框
*
* @param {String} message
*/
owner.showWaiting = function(message) {
// 弹出系统等待对话框
plus.nativeUI.showWaiting(message || '加载中...');
};
/**
* 弹出系统等待对话框
* @param {Number} delay 延迟数(毫秒)
*/
owner.closeWaiting = function(delay) {
// 关闭系统等待对话框,防止性能非常好的手机上等待框一闪而过,这里默认延迟300毫秒关闭
setTimeout(function() {
plus.nativeUI.closeWaiting();
}, delay || 300);
};
/**
* 应用数据保存
*
* @param {String} key 键
* @param {Object} value 值
*/
owner.setItem = function(key, value) {
// 值是对象,自动转化为字符串
if (typeof value === 'object') {
plus.storage.setItem(key, JSON.stringify(value));
} else {
plus.storage.setItem(key, value + '');
}
};
/**
* 应用数据读取
*
* @param {String} key 键
*/
owner.getItem = function(key) {
var value = owner.esapeNull(plus.storage.getItem(key));
try {
return $.parseJSON(value);
} catch (e) {
return value;
}
};
/**
* 应用数据移除
*
* @param {String} key 键
*/
owner.removeItem = function(key) {
if (plus.storage.getItem(key)) {
plus.storage.removeItem(key);
}
};
/**
* 移除全部缓存项目
*/
owner.clearAllItem = function() {
plus.storage.clear();
};
/**
* 清除网页缓存
*/
owner.clearWebCache = function() {
// sessionStorage
sessionStorage.clear();
// localStorage
localStorage.clear();
}
/**
* 清除应用缓存
*/
owner.clearAppCache = function() {
// 不清理的缓存
var noClearKeys = ['userInfo'];
var contains = function(key) {
for (var i = 0; i < noClearKeys.length; i++) {
if (noClearKeys[i] == key) {
return true;
}
}
return false;
};
var keyNames = new Array();
for (var i = 0; i < plus.storage.getLength(); i++) {
var keyName = plus.storage.key(i);
console.log("clearAppCache keyName:" + keyName);
if (!contains(keyName)) {
plus.storage.removeItem(keyName);
}
}
}
/*!
* =====================================================
* 业务用共通函数
* =====================================================
*/
/**
* 用户情报
*/
owner.getUserInfo = function() {
return $.parseJSON(plus.storage.getItem("userInfo")) || null;
};
/**
* 设置用户情报
*
* @param {Object} data 用户情报
*/
owner.setUserInfo = function(data) {
plus.storage.setItem("userInfo", JSON.stringify(data));
};
/**
* 清除登陆用户信息
*/
owner.clearUserInfo = function() {
plus.storage.removeItem('userInfo');
}
/**
* 取得登录用户ID
*/
owner.getUserId = function() {
var userInfo = owner.getUserInfo();
if (userInfo) {
return userInfo.userId;
} else {
return "";
}
};
/**
* 取得登录用户SessionID
*/
owner.getSessionId = function() {
var userInfo = owner.getUserInfo();
if (userInfo) {
return userInfo.sessionId;
} else {
return "";
}
};
/**
* 用户是否登陆过
*/
owner.hasLoginedUser = function() {
var userInfo = owner.getUserInfo();
if (userInfo && owner.isNotNull(userInfo.userId) && owner.isNotNull(userInfo.password)) {
return true;
}
return false;
};
/**
* 自动登录
*/
owner.doAutoLogin = function() {
var userInfo = owner.getUserInfo();
if (!userInfo || owner.isNull(userInfo.phone)) {
owner.createWindow('login.html');
return;
}
owner.showWaiting("自动登录中...");
var param = '{"userId":"' + userInfo.userId + '","password":"' + userInfo.password + '"}';
owner.ajaxPost('login', param, function(data) {
owner.closeWaiting();
if ('success' == data.status) {
// 用户信息
var userInfo = data.result;
// 保存用户信息
owner.setUserInfo(userInfo);
// 进入主画面
owner.openWindow('mainFrame.html');
} else {
if (owner.isNotNull(data.msg)) {
owner.showAlert(data.msg.msgContent, function() {
owner.createWindow('login.html');
});
} else {
owner.createWindow('login.html');
}
}
});
};
/**
* 用户无照片时的默认图片
*/
owner.getDefaultUserPhoto = function() {
return "images/defaultHeadPhoto.jpg";
};
return owner;
})(mui);
/*!
* =====================================================
* 画面初始化的业务封装
* =====================================================
*/
(function($, owner) {
var ismuiReady = false;
var isplusReady = false;
/**
* 单页配置,初始化操作
*
* @param {Object} options 选项
*/
owner.init = function(options) {
$.init(options);
};
/**
* mui/plus对象准备
*/
owner.ready = function() {
// mui/plus对象没准备好
if (!(ismuiReady && isplusReady)) {
return;
}
// 调试模式下开启日志打印
if (plus.runtime.appid != "HBuilder") {
plus.navigator.setLogs(false);
}
var fileName = owner.getFileName(location.href);
// 加载HTML同名脚本文件
owner.loadScript("js/" + fileName + ".js");
// TODO 4Test please detete when APP production
// 会影响性能的,发布时请务必删除
var list = "";
if (plus.webview.all()) {
for (var i = 0; i < plus.webview.all().length; i++) {
list = list + (i > 0 ? "," : "");
list = list + plus.webview.all()[i].id;
}
}
console.log("webview = " + plus.webview.all().length + "; list:" + list);
// ====================== end for todo ======================
};
$.ready(function() {
ismuiReady = true;
owner.ready();
});
$.plusReady(function() {
isplusReady = true;
owner.ready();
});
$.back = function() {
owner.back();
};
})(mui, AppUtils);