300 lines
7.2 KiB
JavaScript
300 lines
7.2 KiB
JavaScript
/**
|
|
* API模块 - 封装所有后端API调用
|
|
*/
|
|
const API = (function() {
|
|
const BASE_URL = '/api';
|
|
|
|
// 通用请求方法
|
|
async function request(url, options = {}) {
|
|
const defaultOptions = {
|
|
headers: {
|
|
'Content-Type': 'application/json'
|
|
}
|
|
};
|
|
|
|
const config = { ...defaultOptions, ...options };
|
|
|
|
try {
|
|
const response = await fetch(BASE_URL + url, config);
|
|
|
|
if (!response.ok) {
|
|
throw new Error(`HTTP error! status: ${response.status}`);
|
|
}
|
|
|
|
// 204 No Content
|
|
if (response.status === 204) {
|
|
return null;
|
|
}
|
|
|
|
return await response.json();
|
|
} catch (error) {
|
|
console.error('API请求失败:', error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
// GET请求
|
|
function get(url, params = {}) {
|
|
const queryString = new URLSearchParams(params).toString();
|
|
const fullUrl = queryString ? `${url}?${queryString}` : url;
|
|
return request(fullUrl);
|
|
}
|
|
|
|
// POST请求
|
|
function post(url, data) {
|
|
return request(url, {
|
|
method: 'POST',
|
|
body: JSON.stringify(data)
|
|
});
|
|
}
|
|
|
|
// DELETE请求
|
|
function del(url, params = {}) {
|
|
const queryString = new URLSearchParams(params).toString();
|
|
const fullUrl = queryString ? `${url}?${queryString}` : url;
|
|
return request(fullUrl, { method: 'DELETE' });
|
|
}
|
|
|
|
// ========== 小说相关API ==========
|
|
|
|
/**
|
|
* 搜索小说
|
|
* @param {Object} params - { keyword, tag, page, size }
|
|
*/
|
|
function searchNovels(params = {}) {
|
|
return get('/novels', params);
|
|
}
|
|
|
|
/**
|
|
* 获取搜索建议
|
|
* @param {string} keyword
|
|
* @param {number} limit
|
|
*/
|
|
function getSearchSuggestions(keyword, limit = 10) {
|
|
return get('/novels/suggestions', { keyword, limit });
|
|
}
|
|
|
|
/**
|
|
* 获取小说详情
|
|
* @param {string} novelId
|
|
*/
|
|
function getNovelDetail(novelId) {
|
|
return get(`/novels/${novelId}`);
|
|
}
|
|
|
|
/**
|
|
* 获取章节列表
|
|
* @param {string} novelId
|
|
* @param {Object} params - { page, size }
|
|
*/
|
|
function getChapters(novelId, params = {}) {
|
|
return get(`/novels/${novelId}/chapters`, params);
|
|
}
|
|
|
|
/**
|
|
* 获取热门标签
|
|
* @param {number} limit
|
|
*/
|
|
function getPopularTags(limit = 20) {
|
|
return get('/novels/tags/popular', { limit });
|
|
}
|
|
|
|
/**
|
|
* 随机获取小说
|
|
* @param {number} size 数量
|
|
*/
|
|
function getRandomNovels(size = 10) {
|
|
return get('/novels/random', { size });
|
|
}
|
|
|
|
// ========== 章节相关API ==========
|
|
|
|
/**
|
|
* 根据章节ID获取内容
|
|
* @param {string} chapterId
|
|
*/
|
|
function getChapterById(chapterId) {
|
|
return get(`/chapters/${chapterId}`);
|
|
}
|
|
|
|
/**
|
|
* 根据小说ID和索引获取章节
|
|
* @param {string} novelId
|
|
* @param {number} index
|
|
*/
|
|
function getChapterByIndex(novelId, index) {
|
|
return get(`/chapters/novel/${novelId}`, { index });
|
|
}
|
|
|
|
/**
|
|
* 获取下一章
|
|
* @param {string} novelId
|
|
* @param {number} currentIndex
|
|
*/
|
|
function getNextChapter(novelId, currentIndex) {
|
|
return get(`/chapters/novel/${novelId}/next`, { currentIndex });
|
|
}
|
|
|
|
/**
|
|
* 获取上一章
|
|
* @param {string} novelId
|
|
* @param {number} currentIndex
|
|
*/
|
|
function getPrevChapter(novelId, currentIndex) {
|
|
return get(`/chapters/novel/${novelId}/prev`, { currentIndex });
|
|
}
|
|
|
|
/**
|
|
* 获取第一章
|
|
* @param {string} novelId
|
|
*/
|
|
function getFirstChapter(novelId) {
|
|
return get(`/chapters/novel/${novelId}/first`);
|
|
}
|
|
|
|
// ========== 书架相关API ==========
|
|
|
|
/**
|
|
* 获取书架列表
|
|
* @param {Object} params - { userId, page, size }
|
|
*/
|
|
function getShelf(params = {}) {
|
|
return get('/shelf', params);
|
|
}
|
|
|
|
/**
|
|
* 加入书架
|
|
* @param {Object} data - { userId, novelId, tags }
|
|
*/
|
|
function addToShelf(data) {
|
|
return post('/shelf', data);
|
|
}
|
|
|
|
/**
|
|
* 从书架移除
|
|
* @param {string} novelId
|
|
* @param {string} userId
|
|
*/
|
|
function removeFromShelf(novelId, userId) {
|
|
return del(`/shelf/${novelId}`, userId ? { userId } : {});
|
|
}
|
|
|
|
/**
|
|
* 检查是否在书架
|
|
* @param {string} novelId
|
|
* @param {string} userId
|
|
*/
|
|
function isInShelf(novelId, userId) {
|
|
return get(`/shelf/${novelId}/exists`, userId ? { userId } : {});
|
|
}
|
|
|
|
// ========== 历史相关API ==========
|
|
|
|
/**
|
|
* 获取阅读历史
|
|
* @param {Object} params - { userId, page, size }
|
|
*/
|
|
function getHistory(params = {}) {
|
|
return get('/history', params);
|
|
}
|
|
|
|
/**
|
|
* 获取某本书的历史进度
|
|
* @param {string} novelId
|
|
* @param {string} userId
|
|
*/
|
|
function getHistoryByNovel(novelId, userId) {
|
|
return get(`/history/novel/${novelId}`, userId ? { userId } : {});
|
|
}
|
|
|
|
/**
|
|
* 更新阅读进度
|
|
* @param {Object} data - { userId, novelId, chapterId, position }
|
|
*/
|
|
function updateHistory(data) {
|
|
return post('/history', data);
|
|
}
|
|
|
|
/**
|
|
* 删除历史记录
|
|
* @param {string} novelId
|
|
* @param {string} userId
|
|
*/
|
|
function deleteHistory(novelId, userId) {
|
|
return del(`/history/novel/${novelId}`, userId ? { userId } : {});
|
|
}
|
|
|
|
// ========== 书签相关API ==========
|
|
|
|
/**
|
|
* 获取书签列表
|
|
* @param {Object} params - { userId, page, size }
|
|
*/
|
|
function getBookmarks(params = {}) {
|
|
return get('/bookmarks', params);
|
|
}
|
|
|
|
/**
|
|
* 获取某本书的书签
|
|
* @param {string} novelId
|
|
* @param {string} userId
|
|
*/
|
|
function getBookmarksByNovel(novelId, userId) {
|
|
return get(`/bookmarks/novel/${novelId}`, userId ? { userId } : {});
|
|
}
|
|
|
|
/**
|
|
* 创建书签
|
|
* @param {Object} data - { userId, novelId, chapterId, position, note }
|
|
*/
|
|
function createBookmark(data) {
|
|
return post('/bookmarks', data);
|
|
}
|
|
|
|
/**
|
|
* 删除书签
|
|
* @param {string} bookmarkId
|
|
* @param {string} userId
|
|
*/
|
|
function deleteBookmark(bookmarkId, userId) {
|
|
return del(`/bookmarks/${bookmarkId}`, userId ? { userId } : {});
|
|
}
|
|
|
|
// 公开API
|
|
return {
|
|
// 小说
|
|
searchNovels,
|
|
getSearchSuggestions,
|
|
getNovelDetail,
|
|
getChapters,
|
|
getPopularTags,
|
|
getRandomNovels,
|
|
|
|
// 章节
|
|
getChapterById,
|
|
getChapterByIndex,
|
|
getNextChapter,
|
|
getPrevChapter,
|
|
getFirstChapter,
|
|
|
|
// 书架
|
|
getShelf,
|
|
addToShelf,
|
|
removeFromShelf,
|
|
isInShelf,
|
|
|
|
// 历史
|
|
getHistory,
|
|
getHistoryByNovel,
|
|
updateHistory,
|
|
deleteHistory,
|
|
|
|
// 书签
|
|
getBookmarks,
|
|
getBookmarksByNovel,
|
|
createBookmark,
|
|
deleteBookmark
|
|
};
|
|
})();
|
|
|