diff --git a/Web12306/Scripts/_references.js b/Web12306/Scripts/_references.js new file mode 100644 index 0000000..a8f8d01 --- /dev/null +++ b/Web12306/Scripts/_references.js @@ -0,0 +1,2 @@ +/// +/// \ No newline at end of file diff --git a/Web12306/Web12306.csproj b/Web12306/Web12306.csproj index 1460813..6d29388 100644 --- a/Web12306/Web12306.csproj +++ b/Web12306/Web12306.csproj @@ -205,12 +205,14 @@ + + Web.config diff --git a/Web12306/css/buttons.css b/Web12306/css/buttons.css index 5196f0e..c0447ba 100644 --- a/Web12306/css/buttons.css +++ b/Web12306/css/buttons.css @@ -42,12 +42,18 @@ font-weight: bold; } +a.button-primary { + color: #fff; +} + .button-primary:hover { background: linear-gradient(to top, #ff912d, #ffb72e); + color: #ffffff; } .button-primary:active { background: linear-gradient(to top, #ee7609, #ff9712); + color: #ffffff; } diff --git a/Web12306/css/ui/index-search-base.css b/Web12306/css/ui/index-search-base.css index 48900c0..1afb033 100644 --- a/Web12306/css/ui/index-search-base.css +++ b/Web12306/css/ui/index-search-base.css @@ -1,4 +1,8 @@ -.search-box { +.options-param { + display: none; +} + +.search-box { height: 193px; margin-top: 27px; padding-top: 15px; @@ -52,12 +56,16 @@ background-position: 0 -321px; } - .search-box .search-tips span { + .search-box .search-tips .order-tips { display: inline-block; cursor: pointer; } + .search-box .search-tips .net-tips { + display: none; + } .search-box .search-tips .reset-btn { + display: none; width: 87px; height: 30px; background: url(../../images/css-sprite.png) no-repeat; diff --git a/Web12306/css/ui/options-param.css b/Web12306/css/ui/options-param.css index 33819d9..d2691df 100644 --- a/Web12306/css/ui/options-param.css +++ b/Web12306/css/ui/options-param.css @@ -158,3 +158,7 @@ display: block; float: left; } + +#index-tip-body { + cursor: pointer; +} diff --git a/Web12306/css/ui/query-result.css b/Web12306/css/ui/query-result.css index 6420790..23b4997 100644 --- a/Web12306/css/ui/query-result.css +++ b/Web12306/css/ui/query-result.css @@ -3,10 +3,10 @@ margin-bottom: 55px; background: #fffefa; border-top: 1px solid #c6701a; + margin-bottom: 220px; } .result .auto-refresh { - margin-bottom: 220px; } .result table { @@ -163,6 +163,7 @@ border-right: 1px solid #ccc; border-top: 1px solid #ccc; } - .result .train-needauto td button { - margin-left: 20px; - } \ No newline at end of file + + .result .train-needauto td button { + margin-left: 20px; + } diff --git a/Web12306/css/ui/widget-ticketsubmit.css b/Web12306/css/ui/widget-ticketsubmit.css index 560b020..02d12d7 100644 --- a/Web12306/css/ui/widget-ticketsubmit.css +++ b/Web12306/css/ui/widget-ticketsubmit.css @@ -42,7 +42,7 @@ #ticket-info .from-station, #ticket-info .to-station { display: inline-block; - max-width: 90px; + max-width: 110px; -ms-text-overflow: ellipsis; -o-text-overflow: ellipsis; text-overflow: ellipsis; diff --git a/Web12306/index.html b/Web12306/index.html index 1b75133..d1d008f 100644 --- a/Web12306/index.html +++ b/Web12306/index.html @@ -54,7 +54,7 @@
已分配到畅通的网络环境,为你提速80%:乌鲁木齐 还原到默认 - 今日可预定:9月10日-10月2日的火车票 + 1
@@ -384,7 +384,7 @@ {{~}} - {{?!it.original}} + {{?!it.original||!it.original.length}} 没有查询到车次,请更换条件或时间试试.. @@ -573,14 +573,14 @@

diff --git a/Web12306/js/account/sessionMgr.js b/Web12306/js/account/sessionMgr.js index 787806d..c65a81a 100644 --- a/Web12306/js/account/sessionMgr.js +++ b/Web12306/js/account/sessionMgr.js @@ -80,7 +80,13 @@ }); }; that.loadProfile = function (username, checkData) { + //备份当前的查询,并取代为默认的查询 + var cp = that.currentProfile; + if (cp && (!cp.fromText || !cp.toText || !cp.depDate)) + cp = null; + var profile = storage.obj("12306_user_" + username) || { username: username, passengers: [], savedProfile: {}, currentProfile: {}, rawPassenger: [], options: {} }; + profile.currentProfile = cp || $.extend({}, that.defaultProfile, profile.currentProfile); that.current = profile; if (username) { @@ -170,7 +176,7 @@ get: function () { return session && session.currentProfile; }, set: function (value) { - session.currentProfile = value || that.defaultProfile; + session.currentProfile = $.extend({}, that.defaultProfile, value); that.fireEvent("currentProfileChanged"); that.save(); } diff --git a/Web12306/js/data.js b/Web12306/js/data.js index e14eb59..db018fd 100644 --- a/Web12306/js/data.js +++ b/Web12306/js/data.js @@ -1,6 +1,22 @@ define(function (require, exports, module) { var citydata = require("./station/station_data.js"); + exports.trimToDay = function (d) { + d = d || new Date(); + if (!(d instanceof Date)) { + d = new Date(d + ''); + } + + var x = new Date(); + x.setTime(d.getTime() - d.getTime() % (1000 * 3600 * 24)); + return x; + }; + exports.addDays = function (date, days) { + var x = new Date(); + x.setTime(date.getTime() - date.getTime() % (1000 * 3600 * 24) + 1000 * 3600 * 24 * days); + return x; + }; + exports.citydata = citydata; exports.cities = _(_.flatten(_.map(_.values(citydata.data), function (e) { return _.values(e); }))).mapObject(function (e) { return e.c; });; exports.identityCardTypes = { @@ -46,12 +62,35 @@ exports.toSeatTypeName = function (code) { return exports.seatNameInvMap[exports.tagOtnMap[code]]; }; - exports.seatDisplayOrder = '9PMO643210'.split(''); + exports.seatDisplayOrder = 'O219PM6430'.split(''); exports.isDebug = ((function () { return false; }) + '').indexOf("false;") != -1; - exports.log = function() { + exports.log = function () { if (!exports.isDebug) return; console.log.apply(console, Array.prototype.slice.call(arguments)); }; + + exports.showMoreOptRange = [ + [new Date(2014, 9, 5), new Date(2014, 9, 20)], + [new Date(2015, 1, 20), new Date(2014, 2, 18)] + ]; + + exports.maxSellDays = 19; + exports.minDate = exports.trimToDay(new Date()); + exports.maxDate = exports.addDays(exports.minDate, exports.maxSellDays); + exports.isValidDate = function(date) { + date = exports.trimToDay(date); + return date >= exports.minDate; + }; + + Object.defineProperty(exports, "moreOptDefault", { + get: function () { + var d = exports.minDate; + + return _.any(exports.showMoreOptRange,function(v) { + return v[0] <= d && d <= v[1]; + }); + } + }); }); \ No newline at end of file diff --git a/Web12306/js/otn/orderprocess.js b/Web12306/js/otn/orderprocess.js index 5e6513d..fb26323 100644 --- a/Web12306/js/otn/orderprocess.js +++ b/Web12306/js/otn/orderprocess.js @@ -53,7 +53,7 @@ submitData = JSON.parse(exports.formatJson(formData["ticketInfoForPassengerForm"] || "{}")); }; - return def; + return def.promise(); }; exports.fastPrepareOrder = function (train, profile, passenger) { @@ -132,7 +132,7 @@ }; autoSubmitRequest(); - return def; + return def.promise(); }; exports.fastSubmitOrder = function (train, profile, passenger, randcode) { @@ -222,7 +222,7 @@ }; submitOrder(); - return def; + return def.promise(); }; exports.submitOrder = function (train, profile, passenger, randcode) { @@ -379,6 +379,6 @@ checkOrderInfo(); - return def; + return def.promise(); }; }); diff --git a/Web12306/js/otn/queryticket.js b/Web12306/js/otn/queryticket.js index 7cf5213..654925f 100644 --- a/Web12306/js/otn/queryticket.js +++ b/Web12306/js/otn/queryticket.js @@ -2,6 +2,9 @@ var ajax = require("../platform/webRequest.js"); var param = require("../data.js"); var parser = require("../platform/parser.js"); + var ev = require("../platform/EventObject.js"); + + exports.events = new ev(); var getTicketInfo = function (v) { var data = [], info = v.indexOf("#") === -1 ? v : /getSelected\(['"](.*?)['"]\)/i.exec(v)[1].split('#')[11], @@ -38,7 +41,9 @@ var transferData = function (data, noProcess) { var result = data; - if (!Array.isArray(result.data) || !result.data.length || !result.data[0].queryLeftNewDTO) return null; + if (!Array.isArray(result.data) || !result.data.length || !result.data[0].queryLeftNewDTO) { + exports.events.fireEvent("requestFailed"); + }; var trainData = { raw: result, rawTrainMap: {}, trainMap: {}, auto: null, nextTime: null }; @@ -116,9 +121,9 @@ if (!noProcess) { //执行车次预过滤。过滤内容:出发地,目标地,时间 - $(document).trigger("filterTrains", trainData); + exports.events.fireEvent("filterTrains", trainData); //处理车次 - $(document).trigger("processTrains", trainData); + exports.events.fireEvent("processTrains", trainData); //过滤数据 if (trainData.filtered && trainData.filtered.length) { @@ -152,7 +157,7 @@ def.reject(); }); - return def; + return def.promise(); }; exports.queryTrainStop = function (id, from, to, date) { @@ -173,6 +178,6 @@ def.reject("网络错误"); }); - return def; + return def.promise(); }; }); diff --git a/Web12306/js/platform/EventObject.js b/Web12306/js/platform/EventObject.js index 270a7d0..f0fd02c 100644 --- a/Web12306/js/platform/EventObject.js +++ b/Web12306/js/platform/EventObject.js @@ -8,6 +8,8 @@ var handleQueue = handles[name] || []; handles[name] = handleQueue; handleQueue.push(callback); + + return this; }; this.off = function (name, callback) { @@ -25,6 +27,8 @@ handleQueue.length = 0; } handles[name] = handleQueue; + + return this; }; this.fireEvent = function (type) { diff --git a/Web12306/js/platform/media.js b/Web12306/js/platform/media.js index 7773a8a..9f254fb 100644 --- a/Web12306/js/platform/media.js +++ b/Web12306/js/platform/media.js @@ -1,18 +1,23 @@ -define(function(require, exports, module) { +define(function (require, exports, module) { + var port = require("./extensionPort.js"); var audio = new Audio("http://static.liebao.cn/resources/audio/music2.ogg"); audio.loop = true; - exports.play = function() { + exports.play = function () { audio.play(); $("#music_controller").show(); }; - exports.stop = function() { + exports.stop = function () { audio.pause(); $("#music_controller").hide(); }; + window.test = exports.notify = function (title, content) { + port.sendMessage({ action: "notify", title: title, content: content }); + } + $("#btn_stop_sound").click(exports.stop); $("#music_controller button").click(exports.stop); }); diff --git a/Web12306/js/ui/index.js b/Web12306/js/ui/index.js index a09d366..8987f36 100644 --- a/Web12306/js/ui/index.js +++ b/Web12306/js/ui/index.js @@ -1,12 +1,11 @@ define(function (require) { var param = require("../data.js"); - var ajax = require("../platform/webRequest.js"); - var storage = require('../platform/storage.js'); var widget = require("./widget.js"); var sessMgr = require("../account/sessionMgr.js"); var mp = require("./widget_message_popup.js"); var datebar = require("./widget_datebar.js"); var parser = require("../platform/parser.js"); + var media = require("../platform/media.js"); //会话管理器事件 sessMgr.on("notValidPassengerFound", function () { @@ -31,7 +30,7 @@ //自动刷新呢 var autorefresh = require("./ui-autorefresh.js"); autorefresh.init(); - autorefresh.on("requestQueryTicket", function() { + autorefresh.on("requestQueryTicket", function () { ui_result.load(); }); @@ -54,6 +53,7 @@ //订票列表交互 (function () { ui_result.on("requireSubmitOrder", function (e, d) { + autorefresh.stop(); uiOrderProcess.start(d.train, d.seat, sessMgr.currentProfile, null); }); autorefresh.on("requireSubmitOrder", function (e, d) { @@ -64,17 +64,21 @@ //界面交互初始化 (function () { + $(".order-tips").html("今日可预定:" + parser.formatDate(param.minDate, "MM月dd日") + "-" + parser.formatDate(param.maxDate, "MM月dd日") + "的火车票"); + + //自动加速关闭 + $(".net-tips, .reset-btn").hide(); + var resetInterfaceByProfile = function () { var user = sessMgr.current; if (!user) { return; } - if (user.options.showMoreOpt !== undefined) { - var div = $("div.options-param"); - if (user.options.showMoreOpt ^ div.is(":visible")) - !user.options.showMoreOpt ? (div.hide(), $(".search-more-option").html("显示更多选项")) : (div.show(), $(".search-more-option").html("隐藏更多选项")); - } + var showMoreOpt = user.options.showMoreOpt !== undefined ? user.options.showMoreOpt : param.moreOptDefault; + var div = $("div.options-param"); + if (showMoreOpt ^ div.is(":visible")) + !user.options.showMoreOpt ? (div.hide(), $(".search-more-option").html("显示更多选项")) : (div.show(), $(".search-more-option").html("隐藏更多选项")); var p = user.currentProfile; $("#from_city").val(p.fromText).attr("data-code", p.fromCode); @@ -127,7 +131,7 @@ sessMgr.currentProfile.studentTicket = this.value === "1"; sessMgr.save(); }); - $("div.transfer-city-btn").click(function() { + $("div.transfer-city-btn").click(function () { var f = document.getElementById("from_city"); var t = document.getElementById("to_city"); @@ -142,6 +146,7 @@ }); $("#btnQuery").click(function () { autorefresh.stop(); + media.stop(); if (!sessMgr.currentProfile.fromCode || !sessMgr.currentProfile.toCode || !sessMgr.currentProfile.depDate) { mp.showMessagePopup("error", "亲,还没有设置查询的条件哦。"); return; diff --git a/Web12306/js/ui/ui-autorefresh.js b/Web12306/js/ui/ui-autorefresh.js index a74654a..295383e 100644 --- a/Web12306/js/ui/ui-autorefresh.js +++ b/Web12306/js/ui/ui-autorefresh.js @@ -5,6 +5,7 @@ var expdata = require("../data.js"); var inAutoRefresh = false; var media = require("../platform/media.js"); + var query = require("../otn/queryticket.js"); sessMgr.on("sessionChanged", function () { session = sessMgr.current; @@ -73,7 +74,7 @@ })(); //如果开启了自动预定,那么不显示预定结果以外的车次 if (currentProfile.selectedTrain && currentProfile.selectedTrain.length) { - var rule = new RegExp("^" + currentProfile.selectedTrain.join("|") + "$", "i"); + var rule = new RegExp("^(" + currentProfile.selectedTrain.join("|") + ")$", "i"); var filtered3 = _.filter(data.available, function (e) { return !rule.test(e.code); }); data.include = _.difference(data.available, filtered3); @@ -92,7 +93,7 @@ }; var processTrains = function (data) { - if (!currentProfile || !session.options.showMoreOpt) + if (!currentProfile || (!session.options.showMoreOpt && !inAutoRefresh)) return; //预置参数 @@ -161,9 +162,10 @@ data.nextTime = null; if (inAutoRefresh) { media.play(); + media.notify("可以订票了!", "终于等到可以订的 " + data.auto.train + "次列车" + expdata.toSeatTypeName(data.auto.seat) + "!"); } if (currentProfile.autoSubmitEnabled && data.enableAuto) { - $(document).trigger("performAutoSubmit", data.auto); + auto.fireEvent("performAutoSubmit", data.auto); } } else { //规则:如果只有待售的,那么等到指定的时间 @@ -200,9 +202,9 @@ var currentDateLoopIndex = -1; this.init = function () { - $(document).on("filterTrains", function (e, d) { + query.events.on("filterTrains", function(e, d) { filterTrains(d); - }).on("processTrains", function (e, d) { + }).on("processTrains", function(e, d) { processTrains(d); if (!d.auto && (d.nextTime && inAutoRefresh)) { @@ -212,7 +214,10 @@ } else if (d.auto) { that.stop(); } - }).on("performAutoSubmit", function (e, d) { + }).on("requestFailed", function () { + //失败?不做任何处理 + }); + that.on("performAutoSubmit", function (e, d) { that.dispatchEvent("requireSubmitOrder", d); }); }; @@ -317,5 +322,6 @@ AutoRefresh.prototype = Object.create(ev); AutoRefresh.constructor = AutoRefresh; - return new AutoRefresh(); + var auto = new AutoRefresh(); + return auto; }); diff --git a/Web12306/js/ui/ui-autosubmitform.js b/Web12306/js/ui/ui-autosubmitform.js index 390ff08..cd248d5 100644 --- a/Web12306/js/ui/ui-autosubmitform.js +++ b/Web12306/js/ui/ui-autosubmitform.js @@ -24,6 +24,7 @@ allpasseengers = data; currentSearchKey = null; if (!data.length) { + uiDlgList.empty(); uiDlg.find(".empty-indicator").show(); } performSearch(); @@ -104,7 +105,7 @@ break; } } - span.fadeOut('fast', function () { $(this).remove(); }); + span.remove(); e.stopPropagation(); }).on("click", ".optional-block", function (e) { @@ -192,6 +193,7 @@ } queryLoadingRow.show(); + queryErrorRow.hide(); query.queryTicket(cp.fromCode, cp.toCode, cp.depDate, cp.studentTicket, true) .done(function () { traindata = this; @@ -248,7 +250,7 @@ container.on("click", ".optional-block", function () { var obj = $(this).closest("span[data-code]"); exports.removeTrainFromList(obj[0].dataset.code); - obj.fadeOut('fast', function () { $(this).remove(); }); + obj.remove(); }); exports.addTrainToList = function (t) { @@ -298,7 +300,12 @@ var initProfile = function () { container.find(">span").remove(); if (cp && cp.dateloop) { - container.append(tpl(cp.dateloop)); + var filteredDate = _.filter(cp.dateloop, data.isValidDate); + if (filteredDate.length !== cp.dateloop.length) { + cp.dateloop = filteredDate; + sessmgr.save(); + } + container.append(tpl(_.filter(cp.dateloop, data.isValidDate))); } }; diff --git a/Web12306/js/ui/ui-submit-order.js b/Web12306/js/ui/ui-submit-order.js index 1421b73..0da6d5f 100644 --- a/Web12306/js/ui/ui-submit-order.js +++ b/Web12306/js/ui/ui-submit-order.js @@ -6,6 +6,8 @@ var op = require("../otn/orderprocess.js"); var vc = require("./widget_verifycode.js"); var param = require("../data.js"); + var media = require("../platform/media.js"); + var share = require("./ui_sns_share.js"); //提交参数 var pTrain, pStu, pPassengers, pProfile; var submitDef; @@ -75,6 +77,8 @@ } }; this.submitOrder = function () { + media.stop(); + var randCode = $("#ticket-submit-info .ticket-submit-vc input:text").val(); if (randCode.length !== 4) { mp.showMessagePopup("error", "请输入验证码..."); @@ -93,6 +97,7 @@ dom.find("div>p:eq(0) span").html(data.orderId); submitProgress.removeClass().addClass("ticket-submit-status ticket-submit-status-ok"); submitProgress.find("span").html("订票成功!订单号为 " + data.orderId); + share.makeWeiboShare(document.getElementById("lnkShareWb"), null, "我刚在#猎豹浏览器#上用#订票助手#抢到了" + pPassengers.length + "张车票!你的车票买到了吗?", null); submitBtn[0].disabled = false; }); submitDef.fail(function (data) { diff --git a/Web12306/js/ui/ui-trainlist.js b/Web12306/js/ui/ui-trainlist.js index 659f4ac..b2ecb05 100644 --- a/Web12306/js/ui/ui-trainlist.js +++ b/Web12306/js/ui/ui-trainlist.js @@ -9,6 +9,7 @@ var tsquery = require("./ui-train-stop.js"); var datebar = require("./widget_datebar.js"); var parser = require("../platform/parser.js"); + var autorefresh = require("./ui-autorefresh.js"); var TrainListObj = function () { var __ = this; @@ -61,6 +62,7 @@ datebar.init(); datebar.on("requireChangeDate", function (e, d) { + autorefresh.stop(); //请求切换时间 $("#dep_date").val(d).change(); sessMgr.save(); diff --git a/Web12306/js/ui/ui_sns_share.js b/Web12306/js/ui/ui_sns_share.js new file mode 100644 index 0000000..989c05e --- /dev/null +++ b/Web12306/js/ui/ui_sns_share.js @@ -0,0 +1,13 @@ +define(function (require, exports, module) { + exports.makeWeiboShare = function (target, url, text, imageUrl) { + url = url || self.location + ''; + ((function (s, d, e, r, l, p, t, z, c) { + var f = 'http://v.t.sina.com.cn/share/share.php?', + u = z || d.location, + p = ['url=', e(u), '&title=', e(t || d.title), '&source=', e(r), '&sourceUrl=', e(l), '&content=', c || 'gb2312', '&pic=', e(p || '')].join(''); + + target.setAttribute("href", [f, p].join('')); + })(screen, document, encodeURIComponent, '', '', imageUrl || "", text, url, 'utf-8')); + + }; +}); diff --git a/Web12306/js/ui/widget_datedropdown.js b/Web12306/js/ui/widget_datedropdown.js index d8658a8..43cfec2 100644 --- a/Web12306/js/ui/widget_datedropdown.js +++ b/Web12306/js/ui/widget_datedropdown.js @@ -1,5 +1,6 @@ define(function (require, exports, module) { var eo = require("../platform/EventObject.js"); + var data = require("../data.js"); var getCurDate = function () { var now = new Date();