UNPKG

hybridstart

Version:

A hybrid application development framework

425 lines (415 loc) 10.9 kB
/* * name: server * version: 0.5.0 * update: bug fix/ add openSelecter * date: 2017-04-28 */ define(function(require, exports, module) { "use strict"; var $ = app.util; var etpl = require('etpl'); //资源路径处理 var source = function(source, host) { if (!$.trim(source)) { return ""; } host = host && host.split ? host : appcfg.host.source; if (/^([\w-]+:)?\/\/([^\/]+)/.test(source)) { //source = host + source.replace(/^([\w-]+:)?\/\/([^\/]+)/,''); } else { source = host + source; } return source.replace(/\\/g, '/'); }; //图片域名处理 etpl.addFilter('source', function(source, host) { return source(source, host); }); //时间格式处理 var getDate = function(source, ignore_minute, logfunction) { var myDate; var separate = '-'; var minute = ''; if (source === void(0)) { source = new Date(); } logfunction && logfunction(source); if (source.split) { source = source.replace(/\-/g, '/'); } else if (isNaN(parseInt(source))) { source = source.toString().replace(/\-/g, '/'); } else { source = new Date(source); } logfunction && logfunction(source); if (new Date(source) && (new Date(source)).getDate) { myDate = new Date(source); logfunction && logfunction(myDate); if (!ignore_minute) { minute = (myDate.getHours() < 10 ? " 0" : " ") + myDate.getHours() + ":" + (myDate.getMinutes() < 10 ? "0" : "") + myDate.getMinutes(); } return myDate.getFullYear() + separate + (myDate.getMonth() + 1) + separate + (myDate.getDate() < 10 ? '0' : '') + myDate.getDate() + minute; } else { return source.slice(0, 16); } }; //退出登录 var logout = function() { app.storage.remove('user'); //注销推送 try { var ajpush = api.require('ajpush'); ajpush.bindAliasAndTags({ alias: '', tags: [] }, function(ret) { if (ret.statusCode) { console.log('推送已注销'); } }); } catch (e) { console.log(e.message) } app.openView({ closeback: true }, 'member', 'login'); }; //存储用户信息 var initUser = function(userData) { if (!userData) { return app.toast('初始化用户信息失败'); } app.storage.val('user', userData); //app初始化 app.storage.val('appInit', 1); //注册推送 if (userData.tag) { var ajpush = api.require('ajpush'); ajpush.bindAliasAndTags({ alias: "user_" + userData.id, tags: userData.tag.split(',') }, function(ret, err) { if (ret) { console.log("user_" + userData.id + "成功注册推送"); } else { console.log(JSON.stringify(err)); } }); } }; //推送开关 var push = { open: function(cb) { var ajpush = api.require('ajpush'); if (ajpush) { ajpush.resumePush(function(ret) { if (typeof cb === 'function') { cb(ret && ret.status); } }); } else { console.log('ajpush插件未就绪'); } }, close: function(cb) { var ajpush = api.require('ajpush'); if (ajpush) { ajpush.stopPush(function(ret) { if (typeof cb === 'function') { cb(ret && ret.status); } }); } else { console.log('ajpush插件未就绪'); } } }; //获取用户信息 var getUser = function(hold) { var _user = app.storage.val('user'); if (!$.isPlainObject(_user) && !hold) { app.alert('请先登录!', function() { app.openView({ closeback: true }, 'member', 'login'); }, { bgclose: false }); return null; } return _user; }; //坐标反查 var getAddrByLoc = function(lat, lng, config) { var def = { callback: null, silent: false }; var opt = $.extend(def, config || {}); var map = api.require('bMap'); var getTimeout = setTimeout(function() { app.loading.hide(); app.toast('检索超时,请重试', 2000); }, appcfg.set.longtime); if (!lat || !lng) { return app.toast('坐标反查参数错误'); } if (!opt.silent) { app.loading.show('正在检索地址...'); } map.getNameFromCoords({ lon: lng, lat: lat }, function(ret, err) { app.loading.hide(); clearTimeout(getTimeout); if (err) { var baiduerrmap = ['', '检索词有岐义', '检索地址有岐义', '没有找到检索结果', 'key错误', '网络连接错误', '网络连接超时', '还未完成鉴权,请在鉴权通过后重试']; return console.log('百度坐标反查:' + baiduerrmap[err.code]); } if (ret.status) { opt.callback(ret); } else { app.toast('百度地图API错误', 2000); } }); }; //预取队列 var preGetList = [{ key: 'preget-test', url: 'http://rap2api.taobao.org/app/mock/3567/return/Yes', data: {} }]; //数据预取 var preGet = function(callback) { var got = 0, resolved = function() { got++; if (got >= preGetList.length) { got = null; resolved = null; if(typeof(callback) === 'function'){ callback(); } } }, checkPreget = function() { var hasResolved = true; $.each(preGetList, function(i, e) { if (!app.storage.val(e.key)) { return hasResolved = false; } }); return hasResolved; }; if(checkPreget()){ if (typeof(callback) === 'function') { return callback(); } }else{ $.each(preGetList, function(i, e) { app.ajax({ url: e.url, data: e.data, success: function(res) { if (res) { app.storage.val(e.key, res); } resolved(); }, error: function() {} }); }); } }; //检查升级 var checkUpdate = function(silence) { var mam = api.require('mam'); var platform = api.systemType; mam.checkUpdate(function(ret, err) { if (ret) { var result = ret.result; if (result.update === true && result.closed === false) { app.confirm(result.updateTip, function() { if (platform == 'ios') { api.installApp({ appUri: result.source }); } else if (platform == 'android') { app.loading.show('正在下载'); api.download({ url: result.source, report: true }, function(ret, err) { if (ret && 1 === ret.state) { /* 下载完成 */ app.loading.hide(); var savePath = ret.savePath; api.installApp({ appUri: savePath }); } }); } }, null, { bar: true, title: '升级到 V' + result.version }); } else if (!silence) { app.alert("暂无更新"); } } else if (!silence) { app.alert(err.msg); } }); }; //获取地理位置 var getLocation = function(callback, errcb) { var bMap = api.require('bMap'); var chaoshi = setTimeout(function() { app.loading.hide(); bMap.stopLocation(); if (app.storage.val('gps')) { var gpsCache = app.storage.val('gps'); if (typeof(callback) === 'function') { callback(gpsCache.lat, gpsCache.lng); } console.log('定位超时,使用缓存数据'); } else { if (typeof(errcb) === 'function') { errcb(); } else { app.toast('GPS定位超时!', 1000); } } }, appcfg.set.outime); bMap.getLocation({ accuracy: '10m', autoStop: true, filter: 1 }, function(ret, err) { app.loading.hide(); if (ret && ret.status) { chaoshi = clearTimeout(chaoshi); if (ret.lat && ret.lon) { app.storage.val('gps', { lat: ret.lat, lng: ret.lon }); } else { console.log('bMap.getLocation定位异常'); } bMap.stopLocation(); if (typeof(callback) === 'function') { callback(ret.lat, ret.lon); } } else { if (typeof(errcb) === 'function') { errcb(); } else { app.toast('GPS定位失败:' + JSON.stringify(err)); } } }); }; //指定DOM打开地图 var openBaiduMap = function(dom, data, refresh) { if (!$.isPlainObject(data) || !data.longitude || !data.latitude) { return app.toast('参数缺失,无法打开地图'); } var bdMapParam = { lat: data.latitude, lng: data.longitude }; app.storage.val('bdMapData', bdMapParam); if (refresh) { app.window.evaluate('', 'bdMapView', 'refresh()'); } else { setTimeout(function() { var offset = $("#" + dom)[0].getBoundingClientRect(); app.window.popoverElement({ id: dom, name: 'bdMapView', url: seajs.root + '/view/common/baiduMap/temp.html', top: parseInt(window.selfTop) + offset.top, bounce: false }); }, 0); } }; //公用模板 var commonTemp = function(tempName, data) { var templateCache = app.storage.val('templateCache') || {}; if (!$.isPlainObject(data)) { data = {}; } if (templateCache[tempName + JSON.stringify(data)]) { return templateCache[tempName + JSON.stringify(data)]; } var etplEngine = new etpl.Engine(); var template = api.readFile({ sync: true, path: 'widget://res/temp/template.txt' }); etplEngine.compile(template); var Render = etplEngine.getRenderer(tempName); if (Render) { var html = Render(data); templateCache[tempName + JSON.stringify(data)] = html; app.storage.val('templateCache', templateCache); return html; } else { console.log('找不到指定模板:' + tempName); } }; var cacheImg = function(element, callback) { var remoteEle; var cacheCount = 0; var setImg = function(ele, url){ if (ele.tagName.toLowerCase() === 'img') { ele.setAttribute('src', url); } else { ele.style.backgroundImage = "url(" + url + ")"; } ele.removeAttribute('data-remote'); cacheCount++; if (cacheCount === remoteEle.length) { typeof callback === 'function' && callback(); } }; if ($(element)[0].getAttribute('data-remote')) { remoteEle = $(element); } else { remoteEle = $(element)[0].querySelectorAll('[data-remote]'); } app.ready(function() { $.each(remoteEle, function(i, ele) { var remote = ele.getAttribute('data-remote'); if(remote){ api.imageCache({ url: remote }, function(ret, err) { setImg(ele, ret.url); }); }else{ setImg(ele, remote); } }); }); return remoteEle; }; module.exports = { logout: logout, initUser: initUser, getUser: getUser, push: push, preGet: preGet, source: source, getDate: getDate, checkUpdate: checkUpdate, openBaiduMap: openBaiduMap, commonTemp: commonTemp, getAddrByLoc: getAddrByLoc, getLocation: getLocation, cacheImg: cacheImg }; });