رأيت شخصًا يحلل منطق خلفية 12306 من قبل. . يختلف الحجز وإلغاء الاشتراك في تذاكر القطار عن التسوق العادي.
مشكلة واحدة هي أنه يمكن بيع تذاكر القطار في محطات مختلفة. على سبيل المثال ، هناك العديد من المحطات على طول الطريق لتذكرة قطار من بكين إلى شنغهاي ، مثل بكين جينان ، جينان نانجينغ ... وهكذا. كيفية تصميم نموذج بيانات للوصول إلى هذه التذاكر مشكلة. بدلا من كمية بسيطة +-1.
فكرة واحدة جيدة جدًا: استخدم السلاسل الثنائية لتمثيل تذكرة القطار. على سبيل المثال ، هناك 10 محطات من بكين إلى شنغهاي ، ويتم التعبير عن الحالة الأولية للتذكرة الكاملة على النحو التالي: "111111111" ؛
إذا تم بيع تذكرة كاملة ، فستصبح التذكرة "000000000" ؛
إذا قمت ببيع تذكرة في منتصف الطريق ، مثل Beijing-Jinan ثلاث محطات (المحطة الأولى المحطة الأولى) ، ستصبح التذكرة "0011111111" ؛
إذا قمت ببيع تذكرة أخرى في منتصف الطريق ، مثل Xuzhou-Nanjing (Stop 6-Stop 9) ، فستصبح التذكرة السابقة: '0011100011' ؛
منطق التذاكر غير المدعومة أمر بسيط للغاية. إذا كنت أرغب في استرداد تذكرة (Xuzhou-Nanjing) ، فسوف أجد أول واحد من تجمع التذاكر ولا يمكنني شرائه.
(xuzhou-nanjing) تذكرة ، قم بتغييرها وهي على ما يرام (الاتجاه المعاكس لشراء التذاكر). على سبيل المثال ، وجدت التذكرة أعلاه '0011100011'.
بعد رد التذكرة ، تصبح التذكرة (00111111111) ؛
المنطق الأساسي على النحو الوارد أعلاه. يجب أن يضمن 12306 مداخل متعددة ، ويتطلب اتساق البيانات في نفس الوقت منطقًا فعالًا للغاية للتعامل مع فحص التذاكر.
يقال أنه سيكون هناك 200000 طلب في الثانية لشراء التذاكر واسترداد التذاكر في أوقات الذروة. احفظ بنية بيانات التذكرة في الذاكرة. ليست قاعدة بيانات.
تقاطعات البيانات الصغيرة والفعالة تصبح مهمة.
نسخة الكود كما يلي:
if (jQuery) {} آخر {
//document.write
}
خادم الوظيفة () {
var self = this ؛
self.ticketspool = [] ؛
self._init = وظيفة (رقم) {
if (typeof (number)! = 'number')
رمي ("خطأ النوع") ؛
لـ (i = 0 ؛ i <number ؛ i ++) {
self.ticketspool.push (تذكرة جديدة ()) ؛
}
} ؛
// الاتجاه ما إذا كان يمكن شراء تذكرة ، ويمكن تحقيقها من خلال و/أو العملية.
// على سبيل المثال: Order O هو Beijing-jinan (001111111) ، وتذكرة معينة هي (0000000011) (تباع بكين نانجينج) ، ثم إعادة خطأ
// على سبيل المثال: Order O هو Beijing-Jinan (001111111) ، وتذكرة معينة هي (1111100011) (تباع في Xuzhou-Nanjing) ، ثم إعادة True
self.canbuy = function (o ، t) {
var _o = ''
لـ (j = 0 ؛ j <o.length ؛ j ++) {
_o += o [j] == '0'؟ 1: 0 ؛
}
var r1 = (parseint (t.tic ، 2) | parseint (o ، 2)) & parseint (_o ، 2) ؛
var r2 = parseint (_o ، 2) ؛
إرجاع r1 == r2 ؛
} ؛
// بيع تذكرة
self.pop1ticket = function (o) {
لـ (i = 0 ؛ i <self.ticketspool.length ؛ i ++) {
if (self.canbuy (o ، self.ticketspool [i])) {
self.buy (self.ticketspool [i] ، o) ؛
العودة أنا.
}
} ؛
العودة -1 ؛
} ؛
// تنفيذ تذاكر بيع ، وتغيير السلسلة الثنائية ، مثل "11111111 '->' 00111111 '؛
self.buy = function (t ، o) {
t.tic = (parseint (t.tic ، 2) & parseint (o ، 2)). toString (2) ؛
//alert(t.tic) ؛
} ؛
// استفسار عن التذاكر المتبقية
Self.Remaintics = Function (O) {
var count = 0 ؛
لـ (i = 0 ؛ i <self.ticketspool.length ؛ i ++) {
count += self.canbuy (o ، self.ticketspool [i])؟ 1: 0 ؛
} ؛
عدد العائد
}
// استرداد ، أو العملية
self.refund = function (o) {
لـ (i = 0 ؛ i <self.ticketspool.length ؛ i ++) {
if (! self.canbuy (o ، self.ticketspool [i])) {
var _o = ''
لـ (j = 0 ؛ j <o.length ؛ j ++) {
_o += o [j] == '0'؟ 1: 0 ؛
}
self.ticketspool [i] .tic = (parseint (self.ticketspool [i].
العودة أنا.
}
} ؛
العودة -1 ؛
}
}
// نموذج البيانات: التذاكر
وظيفة وظيفة () {
var self = this ؛
// التذكرة هي بداية التذكرة
Self.tic = '1111111111' ؛
}
// نموذج البيانات: الترتيب
ترتيب الوظيفة (من ، إلى) {
var self = this ؛
var s = '' ؛
لـ (i = 0 ؛ i <10 ؛ i ++) {
S += (i> = من && i <to)؟ 0: 1 ؛
}
العودة s ؛
}
// 12306 وراء الكواليس
خادم = خادم جديد () ؛
// الحالة الأولية ، يحتوي تجمع التذاكر على 400 تذكرة كاملة
server._init (400) ؛