2025-12-06 20:57:38 +08:00

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
};
})();