咱們手機端的通信錄是用的技術html5 sqlite 加上jquery 實現單機緩存功能 頭像是用base 64 進行渲染 css
/*************************************/ /* Helman, heldes.com */ /* helman at heldes dot com */ /* sqlitedb.js */ /* SQLite Database Class For HTML5 */ /*************************************/ function cDB(confs){ var ret = { _db: null, _response: null, _error: null, check : function(tbl){ if(!this._db) return false; var _sql = '', _sqlField='', _field=[]; for(var i=0;i<tbl.length;i++){ _sql = "CREATE TABLE IF NOT EXISTS "+tbl[i].table+" ("; _field = tbl[i].properties; _sqlField = ''; for (var j=0;j<_field.length;j++){ _sqlField += ',`'+_field[j].name+'` '+_field[j].type; } _sql += _sqlField.substr(1)+");"; this.query(_sql,null,null,null); } return true; }, getResult:function(){ return this._response; }, getError:function(){ return this._error; }, callback_error: function(tx,_er){ var err = ''; if(typeof(tx) == 'object'){ for(var q in tx){ err += q+' = "'+tx[q]+'"; '; } }else{ err += tx+'; '; } if(typeof(_er) == 'object'){ for(var q in _er){ err += q+' = "'+_er[q]+'"; '; } }else if(typeof(_er) == 'undefined'){ err += _er+'; '; } console.log(err); //if(callback) callback(); return false; }, query: function(sql,callback,params,er){ if(!this._db) return false; var self = this; function _er(tx,__er){ __er = jQuery.extend(__er,{sql:sql}); if(er) er(tx,__er); else self.callback_error(tx,__er); }; this._db.transaction(function(tx){ tx.executeSql(sql,(params?params:[]),callback,_er); }, _er); }, update:function(tbl,sets,clauses,callback){ var __sql = 'UPDATE '+tbl, _field = null, __set = '', __clause = '',__values=[]; for(var i=0;i<sets.length;i++){0 _field = sets[i]; for(var j=0;j<_field.length;j++){ __set += ',`'+_field[j].name+'`=?'; __values.push(_field[j].value); } } for(var i=0;i<clauses.length;i++){ __clause += ',`'+clauses[i].name+'`=?'; __values.push(clauses[i].value); } __sql += ((__set!='')?' SET '+__set.substr(1):'')+((__clause!='')?' WHERE '+__clause.substr(1):'')+';'; this.query(__sql,callback,__values); return true; }, remove:function(tbl,clauses){ var __sql = 'DELETE FROM '+tbl, __clause = ''; for(var i=0;i<clauses.length;i++) __clause += ',`'+clauses[i].name+'`="'+escape(clauses[i].value)+'"'; __sql += ' WHERE '+((__clause!='')?__clause.substr(1):'FALSE')+';'; this.query(__sql); return true; }, multiInsert: function(tbl,rows,callback,er){ if(!this._db) return false; var self = this; var __sql = '', _field = null, __field = '', __qs = [], __values = []; this._db.transaction(function(tx){ for(var i=0;i<rows.length;i++){ __qs = []; __values = []; __field = ''; _field = rows[i]; for(var j=0;j<_field.length;j++){ __field += ',`'+_field[j].name+'`'; __qs.push('?'); __values.push(_field[j].value); } tx.executeSql('INSERT INTO '+tbl+' ('+__field.substr(1)+') VALUES('+__qs.join(',')+');',__values,function(){return false;},(er ? er : self.callback_error)); } }, self.callback_error, function(){ if(callback) callback(); return true; }); return true; }, insert:function(tbl,rows,callback){ var __sql = '', _field = null, __field = '', __qs = [], __values = [], __debug = ''; for(var i=0;i<rows.length;i++){ __qs = []; __field = ''; _field = rows[i]; __debug += _field[0].name+' = '+_field[0].value+';'; for(var j=0;j<_field.length;j++){ __field += ',`'+_field[j].name+'`'; __qs.push('?'); __values.push(_field[j].value); } __sql += 'INSERT INTO '+tbl+' ('+__field.substr(1)+') VALUES('+__qs.join(',')+');'; } this.query(__sql,callback,__values); return true; }, insertReplace:function(tbl,rows,debug){ var __sql = '', _field = null, __field = '', __qs = [], __values = [], __debug = ''; for(var i=0;i<rows.length;i++){ __qs = []; __field = ''; _field = rows[i]; __debug += _field[0].name+' = '+_field[0].value+';'; for(var j=0;j<_field.length;j++){ __field += ',`'+_field[j].name+'`'; __qs.push('?'); __values.push(_field[j].value); } __sql += 'INSERT OR REPLACE INTO '+tbl+' ('+__field.substr(1)+') VALUES('+__qs.join(',')+');'; } this.query(__sql,null,__values); return true; }, dropTable:function(tbl,callback){ var __sql = ''; if(tbl==null) return false; __sql = 'DROP TABLE IF EXISTS '+tbl; this.query(__sql,callback); return true; } } return jQuery.extend(ret,confs); }這個是sqlite 基本crud代碼
輸入框搜索 執行代碼 html
<input class="search-input ub ub-f1" id="search_" oninput="OnInput()" placeholder=" "/>
初始化sqlite數據庫持久化腳本 html5
db : new cDB({_db:window.openDatabase("websiteDB", "", "website DB", 5*1000*1000*10)}),建立通信錄表接口
dbTable : [ { table:'contacat',properties: [ //員工編號,主鍵 {name:'empSno', type: 'INT PRIMARY KEY ASC'}, //姓名 {name:'username',type: ''}, //頭像 {name:'imgBase64',type: ''}, //部門 {name:'deptName',type: ''}, //郵箱 {name:'email',type: ''}, //手機號 {name:'mp',type: ''}, //職位 {name:'positionName',type: ''}, //公司號碼 {name:'companySno', type: ''} , {name:'positionNameEn', type: ''} , {name:'deptNameEn',type: ''} ] } ], modifyTable : [ { table:'modifyTimeTable',properties: [ {name:'companySno', type: ''}, {name:'modifyTime', type: ''} ] } ], modifyDate:"", isGetService:true, loadDataFlag:true, reloadData:function(){ //先清空列表 $("#list").html("") //清空搜索框 $("#search_").val("") //開始從新同步 contact.isGetService=false; //設置第一次同步 setstorage("isCacheContrat",null); //變量控制 contact.isInit=null; //獲取數據 contact.initData(); },
每次點擊同步操做 檢查網絡 若是是3G狀況下提示 每次更新僅僅更新修改過的數據 jquery
reData:function(){ if(!contact.isGetService){ msgPrompt(getLang("contactWaiting")); return false; } uexDevice.getInfo('13'); uexDevice.cbGetInfo = function(opCode, dataType, data) { //獲取手機返回字符串,轉換json var device = eval('(' + data + ')'); var connectStatus=device.connectStatus; //判斷當前網絡狀況 if(connectStatus!=null&&connectStatus.length>0) { //網絡不可用返回connectionstatus=1 wifi狀況下返回0 connectionstatus1或者是conectionstatus=2是3g或者2g if(connectStatus==-1) { //網絡不可能用提示操做 msgPrompt(getLang("wlbukeyong")); return; }else if(connectStatus==0) { //wifi狀況直接同步 contact.reloadData() }else if(connectStatus==1 || connectStatus==2) { //若是對話框進行肯定或者取消會觸發回調函數 uexWindow.cbConfirm = function ConfirmSuccess(opId, dataType, data) { //若是點擊肯定的話data返回0 if (data == 0) { //同步數據 contact.reloadData() } }; //若是是3g狀況進行彈出confirm進行提示 uexWindow.confirm(getLang("sureMsg"), getLang("tongbutishi"), [getLang("sure"), getLang("nosure")]); } } } },查詢sqlite 代碼
//清空列表 $("#list").html(""); //渲染操做控制 if(!contact.loadDataFlag) { return false; } contact.loadDataFlag=false; var query = ""; //若是有搜索操做進行追加搜索條件 if(filter!=null) { query = 'SELECT * FROM contacat where (username like "%'+filter +'%" COLLATE NOCASE or email like "%'+filter+'%" COLLATE NOCASE or mp like "%' +filter+'%" COLLATE NOCASE ) and companySno="'+contact.user.companySno+'" order by email asc'; } else { query = 'SELECT * FROM contacat where companySno="'+contact.user.companySno+'" order by email asc'; } contact.db.query(query,function(tx,res) { if(res.rows.length) { //獲取數據循環操做 for (var i = 0; i < res.rows.length; i++) { //根據下標進行獲取數據 var result = res.rows.item(i); var imgpt = ""; //若是二進制圖片不存在顯示默認圖片 if (result.imgBase64 == null || result.imgBase64 == undefined|| result.imgBase64 == "") { imgpt = "css/myImg/person.png"; } else { //顯示二進制圖片 imgpt = "data:image/gif;base64," + result.imgBase64; } contact.pullAppend(result, imgpt); } } contact.loadDataFlag = true;
由於後臺是sass 架構 因此A 的通信錄看不到B通信錄 防止切換帳號產生髒數據 web
//根據companysno查詢修改時間 防止切換用戶從新加載數據 var query = "select * from modifyTimeTable where companySno='"+contact.user.companySno+"'"; //查詢操做 進行回調 由於是查詢是異步操做因此須要把同步數據放到回調操做 contact.db.query(query,function(tx,res) { //若是有數據操做把數據取出來 if(res.rows.length) { //把上次同步時間 contact.modifyDate = res.rows.item(0).modifyTime; }else { //若是是null表示沒有進行同步操做 contact.modifyDate=""; } //若是是第一次操做或者是修改成空的狀況進行同步操做,不然直接從數據庫渲染 if (contact.isInit == null||contact.isInit==""||contact.modifyDate=="") { //進度條 uexWindow.toast(1, 5,getLang("loadContacts"), -1); //延遲加載數據 setTimeout(function(){ contact.loadGetData(); },200); }else{ //渲染加載 setTimeout(function(){ contact.insertList(null); },1000); }剛裝機器第一次同步時候
//根據companysno查詢修改時間 防止切換用戶從新加載數據 var query = "select * from modifyTimeTable where companySno='"+contact.user.companySno+"'"; //查詢操做 進行回調 由於是查詢是異步操做因此須要把同步數據放到回調操做 contact.db.query(query,function(tx,res) { //若是有數據操做把數據取出來 if(res.rows.length) { //把上次同步時間 contact.modifyDate = res.rows.item(0).modifyTime; }else { //若是是null表示沒有進行同步操做 contact.modifyDate=""; } //若是是第一次操做或者是修改成空的狀況進行同步操做,不然直接從數據庫渲染 if (contact.isInit == null||contact.isInit==""||contact.modifyDate=="") { //進度條 uexWindow.toast(1, 5,getLang("loadContacts"), -1); //延遲加載數據 setTimeout(function(){ contact.loadGetData(); },200); }else{ //渲染加載 setTimeout(function(){ contact.insertList(null); },1000); }遞歸請求獲取每一個用戶的頭像
//獲取完畢進行操做 if(index>length-1){ setTimeout(function(){ contact.isGetService=true; //查詢最後一次操做事件 var query = "select * from modifyTimeTable where companySno="+contact.user.companySno; contact.db.query(query,function(tx,res) { var data= [ { 'name': 'companySno', 'value': contact.user.companySno }, { 'name': 'modifyTime', 'value': new Date().getTime() } ] //存在進行先刪除後插入 if(res.rows.length) { contact.db.remove('modifyTimeTable', [{ 'name': 'companySno', 'value': contact.user.companySno }]); } var row = []; //存放數據 row.push(data); //進行插入操做 contact.db.insert('modifyTimeTable', row); //進行渲染列表 contact.insertList(null); uexWindow.closeToast(); setstorage("isCacheContrat",123); }) contact.isInit=123; },3000) return false; } var empSno = pep[index].empSno var url = ApIp + "ManagerDemo/user/empPhotoAction.do?token=" + contact.token + "&empSno=" + empSno+"&index="+index; $.ajax({ url: url, data: { "userName": contact.user.userName, "privilegeGroupId": contact.privilegeGroupId }, type: 'POST', dataType: "json", error: function(){ contact.getImage(index,pep.length,pep) }, success: function(data) { //獲取單個頭像登陸失效 if (data.msg == 205) { //登陸失效進行跳轉登陸頁面置空session uexWindow.toast(1, 5, getLang("loginFail"), 0); setInterval(function(){ setstorage("sessionId", null); uexWindow.closeToast(); openNewWin('login', '../login/login.html', '5'); winClose() }, 2000) }else { uexWindow.toast(1, 5, sync1 + (parseInt(data.index) + 1) + sync2 + sync3 + pep.length + sync4, -1); empSno1 = pep[data.index].empSno var query = 'SELECT * FROM contacat where empSno =' + pep[index].empSno; contact.db.query(query, function(tx, res){ if (pep[data.index].status == "0") { contact.db.remove('contacat', [{ 'name': 'empSno', 'value': pep[data.index].empSno }]); } else { var contactData = [ {'name': 'empSno','value': pep[data.index].empSno}, {'name': 'positionName','value': pep[data.index].positionName}, {'name': 'mp','value': pep[data.index].mp}, {'name': 'email','value': pep[data.index].email}, {'name': 'deptName','value': pep[data.index].deptName}, {'name': 'username','value': pep[data.index].name}, {'name': 'companySno','value': pep[data.index].companySno}, {'name': 'imgBase64','value': data.data}, {name:'positionNameEn', value: pep[data.index].positionNameEn} , {name:'deptNameEn',value: pep[data.index].deptNameEn} ] if (res.rows.length) { contact.db.remove('contacat', [{ 'name': 'empSno', 'value': pep[data.index].empSno }]); } var row = []; row.push(contactData); contact.db.insert('contacat', row); } //下標 index = parseInt(data.index) + 1; //獲取下一個用戶的頭像 contact.getImage(index, pep.length, pep) }); } },error:function(XMLHttpRequest, textStatus, errorThrown){ index=index+1; contact.getImage(index,pep.length,pep) } });