Light12306/Web12306/js/account/sessionMgr.js

307 lines
8.8 KiB
JavaScript
Raw Normal View History

2014-05-16 20:10:45 +08:00
define(function (require, exports, module) {
var session = null;
var ev = require("../platform/EventObject.js");
2014-05-29 19:41:38 +08:00
var ajax = require("../platform/webRequest.js");
2014-06-12 21:36:05 +08:00
var storage = require("../platform/storage.js");
var keepAlive = require("../account/keepalive.js");
2014-06-26 22:24:54 +08:00
var passengers = null;
2014-08-30 01:32:27 +08:00
var currentuser = sessionStorage["_currentuser"] || undefined;
var currentuserName = sessionStorage["_currentuserName"] || undefined;
2014-06-26 22:24:54 +08:00
var parser = require("../platform/parser.js");
2014-07-04 20:57:57 +08:00
var data = require("../data.js");
2014-08-06 20:56:47 +08:00
var utility = require("../utility.js");
2014-06-26 22:24:54 +08:00
if (sessionStorage["_passenger"])
passengers = JSON.parse(sessionStorage["_passenger"]);
2014-05-29 19:41:38 +08:00
2014-05-16 20:10:45 +08:00
var SessionMgr = function () {
var that = this;
2014-08-26 21:29:58 +08:00
var _passengerInLoad = null;
2014-05-16 20:10:45 +08:00
ev.apply(this, arguments);
2014-05-29 19:41:38 +08:00
2014-08-26 21:29:58 +08:00
var loadPassengers = function (callback) {
if (!that.isLogined) {
if (callback)
2014-08-30 01:32:27 +08:00
callback([]);
2014-06-26 22:24:54 +08:00
2014-08-26 21:29:58 +08:00
var def = new $.Deferred();
2014-08-30 01:32:27 +08:00
def.reject("您尚未登录");
2014-08-26 21:29:58 +08:00
return def.promise();
}
2014-06-26 22:24:54 +08:00
2014-08-26 21:29:58 +08:00
if (_passengerInLoad) {
_passengerInLoad.done(callback);
return _passengerInLoad.promise();
}
_passengerInLoad = new $.Deferred();
_passengerInLoad.done(callback);
2014-06-26 22:24:54 +08:00
2014-08-30 01:32:27 +08:00
sessionStorage.removeItem("notValidPassengerFound");
2014-08-26 21:29:58 +08:00
ajax.sendPost("confirmPassenger/getPassengerDTOs", "leftTicket/init", null, "json", function () {
2014-07-11 18:34:59 +08:00
var result = this.model;
if (!result || !result.data || !result.data.normal_passengers) {
2014-06-26 22:24:54 +08:00
passengers = null;
that.fireEvent("passengerLoadFailed");
that.fireEvent("passengerLoaded", passengers);
2014-08-30 01:32:27 +08:00
_passengerInLoad.reject(result.data && result.data.exMsg);
2014-06-26 22:24:54 +08:00
} else {
2014-07-11 18:34:59 +08:00
var p1 = result.data.normal_passengers;
2014-06-26 22:24:54 +08:00
passengers = _.filter(p1, parser.canPassageAddToOrder);
//对联系人数据进行预处理
parser.processPassenger(passengers);
if (p1.length !== passengers.length) {
that.fireEvent("notValidPassengerFound");
2014-08-30 01:32:27 +08:00
sessionStorage['hasUnverifiedPassenger'] = 1;
2014-06-26 22:24:54 +08:00
document.dispatchEvent(new Event("notValidPassengerFound"));
}
sessionStorage["_passenger"] = JSON.stringify(passengers);
that.fireEvent("passengerLoaded", passengers);
2014-08-26 21:29:58 +08:00
_passengerInLoad.resolve(passengers);
2014-06-26 22:24:54 +08:00
}
2014-08-26 21:29:58 +08:00
_passengerInLoad = null;
2014-06-26 22:24:54 +08:00
}, function () {
passengers = null;
2014-08-30 01:32:27 +08:00
_passengerInLoad.reject("网络错误");
2014-06-26 22:24:54 +08:00
sessionStorage.removeItem("_passenger");
that.fireEvent("passengerLoadFailed");
that.fireEvent("passengerLoaded", passengers);
});
2014-08-26 21:29:58 +08:00
return _passengerInLoad.promise();
};
2014-08-30 01:32:27 +08:00
that.savePassengers = function () {
2014-08-26 21:29:58 +08:00
if (!passengers)
return;
sessionStorage["_passenger"] = JSON.stringify(passengers);
};
2014-08-30 01:32:27 +08:00
that.reloadPassengers = function () {
2014-08-26 21:29:58 +08:00
sessionStorage.removeItem("_passenger");
2014-08-30 01:32:27 +08:00
passengers = null;
2014-06-26 22:24:54 +08:00
};
2014-08-26 21:29:58 +08:00
2014-05-29 19:41:38 +08:00
that.checkLoginState = function (callback) {
ajax.sendGet("modifyUser/initQueryUserInfo", "", null, "text", function () {
if (this.text.indexOf("登录名:") !== -1) {
2014-08-30 01:32:27 +08:00
sessionStorage.removeItem("_currentuser");
sessionStorage.removeItem("_currentuserName");
2014-05-29 19:41:38 +08:00
callback({ logined: false });
} else {
var m = /姓名:.*[\r\n]+<div[^>]+>([^<]+)<\/div>/i.exec(this.text) && RegExp.$1;
var status = /核验状态:[\w\W]+?>([^<>]+?)<\/div>/.exec(this.text) && RegExp.$1;
2014-06-12 21:36:05 +08:00
var un = /userDTO\.loginUserDTO\.user_name.*?value=['"]([^'"]+)['"]/.exec(this.text) && RegExp.$1;
2014-05-29 19:41:38 +08:00
2014-06-26 22:24:54 +08:00
sessionStorage["_currentuser"] = un;
2014-08-30 01:32:27 +08:00
sessionStorage["_currentuserName"] = m;
2014-05-29 19:41:38 +08:00
if (!m || !status)
callback({ logined: false });
else {
2014-06-12 21:36:05 +08:00
callback({ logined: true, realName: m, status: status, isChecked: status === '已通过', username: un });
2014-05-29 19:41:38 +08:00
}
}
}, function () {
2014-07-01 20:07:44 +08:00
callback({ logined: false });
2014-05-29 19:41:38 +08:00
});
};
2014-09-01 22:09:51 +08:00
that.loadProfile = function (dispname, checkData, username) {
//备份当前的查询,并取代为默认的查询
var cp = that.currentProfile;
2014-08-01 21:54:26 +08:00
if (cp) {
cp.passengers = null; //不保留乘客
}
2014-09-01 22:09:51 +08:00
var profile = storage.obj("12306_user_" + dispname) || { hasNotVerifyedPassenger: false, dispname: dispname, passengers: [], savedProfile: { list: [] }, currentProfile: {}, rawPassenger: [], options: { soundPrompt: true } };
2014-07-29 21:19:06 +08:00
profile.currentProfile = $.extend({}, that.defaultProfile, profile.currentProfile, cp);
2014-08-30 01:32:27 +08:00
if (!profile.currentProfile.autoRefreshDelay)
profile.currentProfile.autoRefreshDelay = 5;
2014-09-01 22:09:51 +08:00
if (username)
profile.username = username;
2014-08-30 01:32:27 +08:00
//有预置参数?加载
if (location.hash && location.hash.indexOf("#ALARM-") === 0) {
try {
var predata = JSON.parse(decodeURIComponent(location.hash.substr(7)));
profile.currentProfile = _.extend(profile.currentProfile, predata);
} catch (e) {
console.log("unable to restore parameter: " + e);
}
}
2014-06-12 21:36:05 +08:00
2014-09-01 22:09:51 +08:00
if (dispname) {
2014-06-20 20:55:14 +08:00
if (checkData) {
that.current.dispname = checkData.realName;
2014-09-01 22:09:51 +08:00
that.current.username = checkData.username;
2014-06-12 21:36:05 +08:00
that.fireEvent("userInfoUpdated");
2014-06-20 20:55:14 +08:00
if (!checkData.isChecked)
2014-06-12 21:36:05 +08:00
that.fireEvent("userNotChecked");
2014-06-20 20:55:14 +08:00
} else {
that.checkLoginState(function (data) {
2014-09-01 22:09:51 +08:00
if (!data.logined) {
//被强退了
that.loadProfile("");
that.fireEvent("loginInvalid");
} else {
that.current.dispname = data.realName;
that.current.username = data.username;
that.fireEvent("userInfoUpdated");
2014-06-20 20:55:14 +08:00
2014-09-01 22:09:51 +08:00
if (!data.isChecked)
that.fireEvent("userNotChecked");
}
2014-06-20 20:55:14 +08:00
});
}
2014-06-12 21:36:05 +08:00
}
2014-09-01 22:09:51 +08:00
that.current = profile;
that.save();
2014-06-12 21:36:05 +08:00
};
that.resetProfile = function () {
2014-08-30 01:32:27 +08:00
sessionStorage.removeItem("_currentuser");
sessionStorage.removeItem("_currentuserName");
2014-06-20 20:55:14 +08:00
that.loadProfile("");
2014-06-12 21:36:05 +08:00
};
that.save = function () {
if (!that.current)
return;
2014-09-01 22:09:51 +08:00
var key = "12306_user_" + that.current.dispname;
2014-06-12 21:36:05 +08:00
storage.put(key, that.current);
2014-08-05 20:54:33 +08:00
that.fireEvent("save");
2014-06-12 21:36:05 +08:00
};
2014-06-26 22:24:54 +08:00
that.getPassengers = function (callback) {
2014-08-30 01:32:27 +08:00
if (!that.isLogined) {
callback && callback([]);
var def = new $.Deferred();
def.reject("您尚未登录");
return def.promise();
}
2014-06-26 22:24:54 +08:00
2014-08-30 01:32:27 +08:00
var d1;
if (passengers) {
callback && callback(passengers);
d1 = new $.Deferred();
d1.resolve(passengers);
}
2014-06-26 22:24:54 +08:00
else {
2014-08-26 21:29:58 +08:00
//that.once("passengerLoaded", function () {
// callback(passengers);
//});
2014-08-30 01:32:27 +08:00
d1 = loadPassengers(callback);
2014-06-26 22:24:54 +08:00
}
2014-08-30 01:32:27 +08:00
return d1;
2014-06-26 22:24:54 +08:00
};
2014-08-30 01:32:27 +08:00
this.ensureLogined = function (callback) {
2014-08-13 00:14:00 +08:00
if (!that.isLogined) {
that.fireEvent("requireLogin", callback);
} else {
callback(that.current);
}
};
2014-07-11 18:34:59 +08:00
this.defaultProfile = {
autoRefreshDelay: 5,
2014-08-30 01:32:27 +08:00
hideNotInListTrain: false,
hideNoTicket: false,
2014-07-11 18:34:59 +08:00
autoWaitToSell: true,
selectSeatFirst: true,
tryBottomSeat: true,
2014-07-25 22:28:51 +08:00
autoSubmitEnabled: true,
2014-08-01 21:54:26 +08:00
partialSubmitEnabled: false,
2014-09-01 20:24:57 +08:00
depDate: utility.formatDate(data.defaultDate),
submitStuAsCommon: false
2014-07-11 18:34:59 +08:00
};
2014-05-16 20:10:45 +08:00
Object.defineProperty(this, "current", {
get: function () {
return session;
},
2014-05-29 19:41:38 +08:00
set: function (v) {
2014-05-16 20:10:45 +08:00
if (session === v) return;
2014-06-26 22:24:54 +08:00
if (v) {
if (v.username !== currentuser) {
sessionStorage["_currentuser"] = v.username;
2014-09-01 22:09:51 +08:00
sessionStorage["_currentuserName"] = v.dispname;
2014-06-26 22:24:54 +08:00
sessionStorage.removeItem("_passenger");
passengers = null;
}
2014-08-14 21:33:47 +08:00
if (!v.options)
v.options = {};
2014-06-26 22:24:54 +08:00
session = v;
}
2014-06-12 21:36:05 +08:00
else {
that.resetProfile();
}
2014-05-16 20:10:45 +08:00
that.fireEvent("sessionChanged");
2014-07-11 18:34:59 +08:00
that.fireEvent("currentProfileChanged");
2014-06-12 21:36:05 +08:00
(that.isLogined && keepAlive.start()) || keepAlive.stop();
}
});
Object.defineProperty(this, "isLogined", {
get: function () {
return session && session.username || false;
}
});
2014-06-26 22:24:54 +08:00
Object.defineProperty(this, "currentProfile", {
get: function () {
2014-07-11 18:34:59 +08:00
return session && session.currentProfile;
2014-07-04 20:57:57 +08:00
}, set: function (value) {
2014-07-29 21:19:06 +08:00
session.currentProfile = $.extend({}, that.defaultProfile, value);
2014-07-04 20:57:57 +08:00
that.fireEvent("currentProfileChanged");
that.save();
}
});
Object.defineProperty(this, "recentStations", {
get: function () {
return (that.current.recentStations || []).map(function (c) { return data.cities[c]; });
},
set: function (value) {
var clist = that.current.recentStations || [];
if (clist[0] && clist[0] == value)
return;
for (var i = 0; i < clist.length; i++) {
if (clist[i] == value) {
clist.splice(i, 1);
break;
}
clist.unshift(value);
that.current.recentStations = value;
that.fireEvent("recentCityChanged");
that.save();
}
2014-06-12 21:36:05 +08:00
}
});
document.addEventListener("loginInvalid", function () {
if (that.isLogined) {
document.dispatchEvent(new CustomEvent("userForcedOut"));
that.fireEvent("userForcedOut");
2014-05-16 20:10:45 +08:00
}
2014-06-12 21:36:05 +08:00
that.resetProfile();
2014-05-16 20:10:45 +08:00
});
2014-06-26 22:24:54 +08:00
//主动检测
2014-08-30 01:32:27 +08:00
if (typeof (currentuserName) === "undefined") {
2014-06-26 22:24:54 +08:00
that.checkLoginState(function (data) {
if (data.logined) {
2014-08-30 01:32:27 +08:00
that.loadProfile(data.realName, data);
2014-06-26 22:24:54 +08:00
} else {
that.loadProfile("");
}
});
} else
2014-08-30 01:32:27 +08:00
this.loadProfile(currentuserName || "");
2014-05-16 20:10:45 +08:00
return this;
};
SessionMgr.prototype = Object.create(ev);
SessionMgr.constructor = SessionMgr;
module.exports = new SessionMgr();
});