`); hãy searchUrl = `/search/`; history.forEach((elem) => { prevsearch.find('#prevsearch-options').append(`
${elem}`); }); } $('#search-pretype-options').empty(); $('#search-pretype-options').append(prevsearch); hãy để prevbooks = $(false); [ {title:"Sách giáo khoa được mở gần đây", books:previous_books}, {title:"Sách giáo khoa được đề xuất", books:recommends_books} ].forEach((book_segment) => { if (Array.isArray(book_segment.books) && book_segment. books.length>0 && nsegments<2) { nsegments+=1; prevbooks = $(`
`); hãy searchUrl = "/books/xxx/"; book_segment.books.forEach((elem) => { prevbooks.find('#prevbooks-options'+nsegments.toString()).append(`
${elem.title} ${thứ tự(elem.edition)} ${elem.author}`); }); } $('#search-pretype-options').append(prevbooks); }); } hàm anon_pretype() { let prebooks = null; thử { prebooks = JSON.parse(localStorage.getItem('PRETYPE_BOOKS_ANON')); }catch(e) {} if ('previous_books' trong sách prebooks && 'recommends_books' trong prebooks) { previous_books = prebooks.previous_books; recommend_books = prebooks.recommending_books; if (typeof PREVBOOKS !== 'không xác định' && Array.isArray(PREVBOOKS)) { new_prevbooks = PREVBOOKS; previous_books.forEach(elem => { for (let i = 0; i < new_prevbooks.length; i++) { if (elem.id == new_prevbooks[i].id) { return; } } new_prevbooks.push(elem); }); new_prevbooks = new_prevbooks.slice(0,3); trước_books = new_prevbooks; } if (typeof RECBOOKS !== 'không xác định' && Array.isArray(RECBOOKS)) { new_recbooks = RECBOOKS; for (let j = 0; j < new_recbooks.length; j++) { new_recbooks[j].viewed_at = new Date(); } hãy chèn = true; for (let i=0; i < recommend_books.length; i++){ for (let j = 0; j < new_recbooks.length; j++) { if (recommends_books[i].id == new_recbooks[j].id) { chèn = sai; } } if (chèn){ new_recbooks.push(recommends_books[i]); } } new_recbooks.sort((a,b)=>{ adate = new Date(2000, 0, 1); bdate = new Date(2000, 0, 1); if ('viewed_at' in a) {adate = new Date(a.viewed_at);} if ('viewed_at' in b) {bdate = new Date(b.viewed_at);} // 100000000: thay vì chỉ xóa các đề xuất từ tuần trước, // chúng tôi chỉ chuyển chúng sang phía sau hàng đợi acurweek = ((new Date()).getDate()-adate.getDate()>7)?0:100000000 bcurweek = ((new Date()).getDate()-bdate.getDate(); >7)?0:100000000; lượt xem = 0; bviews = 0; if ('lượt xem' trong a) {aviews = acurweek+a.views;} if ('lượt xem' trong b) {bviews = bcurweek+b.views ;} return bviews - aviews }); new_recbooks = new_recbooks.slice(0,3); đề nghị_books = new_recbooks; } localStorage.setItem('PRETYPE_BOOKS_ANON', JSON.stringify({ previous_books: previous_books, recommend_books: recommend_books })); build_popup(); } } var whiletyping_search_object = null; var whiletyping_search = { books: [], giáo trình: [], chủ đề: [] } var single_whiletyping_ajax_promise = null; var whiletyping_database_initial_burst = 0; //số cuộc gọi liên tiếp, sau 3 cuộc gọi, chúng tôi bắt đầu cuộc gọi 1 lần trong 5 phút function get_whiletyping_database() { //lấy cơ sở dữ liệu từ máy chủ. // 1. bằng cách xác thực dựa trên giá trị cơ sở dữ liệu cục bộ, chúng tôi xác nhận rằng khung đang hoạt động và // giảm số lượng lệnh gọi liên tục do lỗi tạo ra xuống 1 trên 5 phút. return localforage.getItem('whiletyping_last_attempt').then(function(value) { if ( value==null || (new Date()) - (new Date(value)) > 1000*60*5 || (whiletyping_database_initial_burst < 3) ) { localforage.setItem('whiletyping_last_attempt', (new Date()).getTime()); // 2. Thực hiện lệnh gọi ajax đến máy chủ và lấy cơ sở dữ liệu tìm kiếm let dataUrl = `/search/whiletype_database/ `; let resp = single_whiletyping_ajax_promise; if (resp === null) { whiletyping_database_initial_burst = whiletyping_database_initial_burst + 1; single_whiletyping_ajax_promise = resp = new Promise((resolve, chối bỏ) => { $.ajax({ url: dataUrl, type: 'POST ', data:{csrfmiddlewaretoken: "zPNffuFSwvbn18zxfCQc8t6krv6TBqwc5m1dEXty246PkEFN38WOFSW5IbTWLzOL"}, thành công: hàm (dữ liệu) { // 3. xác minh rằng các phần tử của cơ sở dữ liệu tồn tại và là mảng if ( ('sách' trong dữ liệu) && ('chương trình giảng dạy' trong dữ liệu ) && ('chủ đề' trong dữ liệu) && Array.isArray(data.books) && Array.isArray(data.curriculum) && Array.isArray(data.topics)) { localforage.setItem('whiletyping_last_success', (new Date( )).dành thời gian()); localforage.setItem('whiletyping_database', data); giải quyết (dữ liệu); } }, lỗi: hàm (lỗi) { console.log(error); giải quyết(null); }, hoàn thành: hàm (dữ liệu) { single_whiletyping_ajax_promise = null; } }) }); } trả lại phản hồi; } return Promise.resolve(null); }).catch(function(err) { console.log(err); return Promise.resolve(null); }); } function get_whiletyping_search_object() { // lấy các đối tượng cầu chì sẽ chịu trách nhiệm tìm kiếm if (whiletyping_search_object){ return Promise.resolve(whiletyping_search_object); } cơ sở dữ liệu_promise = localforage.getItem('whiletyping_database').then(function(database) { return localforage.getItem('whiletyping_last_success').then(function(last_success) { if (database==null || (new Date()) - (Ngày mới(cuối_thành công)) > 1000*60*60*24*30 || (Ngày mới('2023-04-25T00:00:00')) - (Ngày mới(cuối_success)) > 0) { / Cập nhật cơ sở dữ liệu mới return get_whiletyping_database().then(function(new_database) { if (new_database) {database = new_database; } return cơ sở dữ liệu; } } else { return Promise.resolve(database }); return data_promise.then(function(database) { if (database) { const options = { isCaseSensitive: false, includeScore: true, ShouldSort: true, // includeMatches: false, // findAllMatches: false, // minMatchCharLength: 1, / / location: 0, ngưỡng: 0,2, // khoảng cách: 100, // useExtendsSearch: false, ignLocation: true, // ignFieldNorm: false, // fieldNormWeight: 1, Keys: [ "title" ] }; }; hãy để chủ đề_index={}; cơ sở dữ liệu.curriculum.forEach(c => chương trình giảng dạy_index[c.id]=c); cơ sở dữ liệu.topics.forEach(t => chủ đề_index[t.id]=t); 0;