图书馆小程序
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

184 lines
5.5 KiB

/**
* 获取已加载的 bookrecno 缓存
* @returns {Set} - 已加载的 bookrecno 集合
*/
function getLoadedBookrecnos() {
const loadedList = wx.getStorageSync('loadedBookrecnos') || [];
return new Set(loadedList);
}
/**
* 标记 bookrecno 已加载
* @param {Array} bookrecnoList - 已加载的 bookrecno 列表
*/
function markBookrecnoLoaded(bookrecnoList) {
const loadedSet = getLoadedBookrecnos();
bookrecnoList.forEach(bookrecno => loadedSet.add(bookrecno));
wx.setStorageSync('loadedBookrecnos', Array.from(loadedSet));
}
/**
* 通过远程接口获取封面(基于 ISBN)
* @param {Array} isbnList - ISBN 列表
* @returns {Promise<Object>} - 封面数据映射 { isbn: coverUrl }
*/
export async function fetchCoversByISBN(isbnList) {
if (!isbnList || isbnList.length === 0) {
return {};
}
// 移除 ISBN 中的连字符
const cleanIsbns = isbnList.map(isbn => isbn.replace(/-/g, ''));
const isbns = cleanIsbns.join(',');
const url = `https://book-resource.dataesb.com/websearch/metares?glc=EGD0755036&cmdACT=getImages&type=0&isbns=${isbns}`;
return new Promise((resolve) => {
wx.request({
url: url,
method: 'GET',
success: (res) => {
const result = {};
let list = [];
try {
// 获取响应数据
let responseData = res.data;
// 如果是字符串,尝试解析为 JSON
if (typeof responseData === 'string') {
// 移除可能的 JSONP 包装括号 ({"result":...})
const trimmed = responseData.trim();
if (trimmed.startsWith('(') && trimmed.endsWith(')')) {
responseData = trimmed.slice(1, -1);
}
responseData = JSON.parse(responseData);
}
// 获取 result 数组
if (responseData && responseData.result && Array.isArray(responseData.result)) {
list = responseData.result;
}
} catch (error) {
console.error('解析封面数据失败:', error);
list = [];
}
list.forEach(item => {
if (item.isbn && item.coverlink && item.coverlink.indexOf('http') !== -1) {
// 存储时移除连字符,便于匹配
result[item.isbn.replace(/-/g, '')] = item.coverlink;
}
});
resolve(result);
},
fail: () => {
resolve({});
}
});
});
}
/**
* 获取服务器存在的 bookrecno 列表
* @param {Array} bookrecnoList - bookrecno 列表
* @returns {Promise<Object>} - 存在的 bookrecno 映射 { bookrecno: coverUrl }
*/
export async function fetchCoversByBookrecno(bookrecnoList) {
if (!bookrecnoList || bookrecnoList.length === 0) {
return {};
}
const bookrecnos = bookrecnoList.join(',');
return new Promise((resolve) => {
wx.request({
url: `http://218.200.95.251:8081/opac/getExistsBookrecnoList/${bookrecnos}`,
method: 'POST',
success: (res) => {
const result = {};
console.log('bookrecnoList',res)
const existsList = res.data || [];
console.log('existsList',existsList)
existsList.forEach(bookrecno => {
const timestamp = new Date().getTime();
result[bookrecno] = `http://218.200.95.251:8081/opac/bscover/${bookrecno}?timestamp=${timestamp}`;
});
// 标记已加载
markBookrecnoLoaded(existsList);
resolve(result);
},
fail: () => {
resolve({});
}
});
});
}
/**
* 加载图书封面(核心方法)
* @param {Array} bookList - 图书数据列表
* @param {Function} callback - 回调函数,接收 (index, coverUrl) 参数
* @returns {Promise<void>}
*/
export async function loadBookCovers(bookList, callback) {
if (!bookList || bookList.length === 0 || typeof callback !== 'function') {
return;
}
try {
// 分离需要查询的 ISBN 和 bookrecno
const loadedSet = getLoadedBookrecnos();
const isbnMap = new Map(); // index -> isbn
const bookrecnoMap = new Map(); // index -> bookrecno(未加载过的)
bookList.forEach((book, index) => {
if (book.isbn) {
isbnMap.set(index, book.isbn.replace(/-/g, ''));
}
if (book.bookrecno && !loadedSet.has(book.bookrecno)) {
bookrecnoMap.set(index, book.bookrecno);
}
});
// 并行请求 ISBN 和 bookrecno 的封面
const [isbnCovers, bookrecnoCovers] = await Promise.all([
fetchCoversByISBN(Array.from(isbnMap.values())),
fetchCoversByBookrecno(Array.from(bookrecnoMap.values()))
]);
// 更新封面
bookList.forEach((book, index) => {
let coverUrl = null;
// 优先使用 ISBN 获取的封面
const isbn = book.isbn ? book.isbn.replace(/-/g, '') : null;
if (isbn && isbnCovers[isbn]) {
coverUrl = isbnCovers[isbn];
}
// 如果 ISBN 没获取到,尝试 bookrecno
else if (book.bookrecno && bookrecnoCovers[book.bookrecno]) {
coverUrl = bookrecnoCovers[book.bookrecno];
}
if (coverUrl) {
callback(index, coverUrl);
}
});
} catch (error) {
console.error('加载图书封面失败:', error);
}
}
/**
* 清除封面加载缓存
*/
export function clearCoverCache() {
wx.removeStorageSync('loadedBookrecnos');
}
export default {
loadBookCovers,
clearCoverCache,
fetchCoversByISBN,
fetchCoversByBookrecno
};