|
本帖最后由 peterwch 于 2016-9-8 10:56 编辑
花了点时间理了下铛铛登陆的流程,稍作记录,有点乱
IM.autoLogin方法采用needLogin函数判断是否需要登陆。判断方法是读取localstorage的chat_loginData:
- 如果没读取到数据,显示登陆框:justep.Shell.fireEvent('onShowLoginDialog', {});
- 否则,采用该localstorage中的用户名密码数据进行登陆:
this.login(loadLoginDataByStore()).fail(function(error) {
self.logout();
});
其中login方法依次调用:
- im.wex5.impl中的doLogin方法,与逻辑服务器交互,返回登陆信息。(此处还没有登录dangchat-server)
- 调用saveLoginDataToStore 存储登陆的账户密码信息,可以自行查看localstorage
- 调用doLoginAfter,派发以下onLoggedIn事件
- index.js 中的loggedIn事件
- contact.js中的init
- main.js中的init事件
- 读取localstorage chat_dialogData 对话数据
- 读取localstorage chat_uid 数据,和当前Uid进行比较:
如果相等, 那么用户没有改变, 那么直接加载此对话数据到dialogData 数据组件;
如果不等,那么更新localstorage chat_uid 为当前用户Uid . 此Id为用户Id不是actor返回的Id。
4.登录dangchat-server : loginActor(重点!!!!)
------------------------------------------------------------
loginActor详解:
1.根据id判断当前用户是否登陆 : ActorClient.isLoggedIn(pid),原理是比较服务端user.nick和pid是否相等(为什么是nick?)
如果用户已登陆,那么调用loadPerson(getOrgPersons)方法加载组织人员数据。
如果用户未登陆:
1.actor中client.validPerson方法,personId, name为参数,传递至dangserver进行验证,返回登陆状态:state。
如果状态为logged_in 那么说明dangchat-server登陆成功,得到一个新的client 用户的uid
此处除了加载人员信息外,还额外进行了一步操作,那就是self.updatePersonUid(uid, pid) ,通过ajax更新了用户的uid,
String sql = "update sa_opperson set sNumb=" + uid + " where sID= '"+pid+"'" ; 即更新了sa_opperson 表的sNumb字段。
同时也更新本地的person的uid.
acrtor登陆完成后:
1.派发actor已登录事件: actorLongined
2.触发inintEvent事件,主要是消息推送相关的设置,以及加载会话数据。
3.updateClientState 论坛大神解答说是判断当前app是否是后台模式,用来控制推送信息。
this.loginActorDfd.done(function() {
justep.Shell.fireEvent('actorLongined');
self.initEvent();
var uid = IM.getCurrentPerson().uid;
$(document).on('resume', function() {
IM.updateClientState("-1,"+uid+",1");
});
$(document).on('pause', function() {
IM.updateClientState("-1,"+uid+",0");
});
});
|
|