7 changed files with 540 additions and 55 deletions
-
51api/user.js
-
62components/book-list-item/book-list-item.vue
-
33subpkg/pages/collect-list/collect-list.vue
-
49subpkg/pages/feedback-detail/feedback-detail.vue
-
160subpkg/pages/feedback-list/feedback-list.vue
-
46subpkg/pages/feedback/feedback.vue
-
184utils/bookCover.js
@ -0,0 +1,184 @@ |
|||
/** |
|||
* 获取已加载的 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 |
|||
}; |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue