From 67333b5f011fca444eda85908aff87b19daeb0c0 Mon Sep 17 00:00:00 2001 From: kjqwer <2990346238@qq.com> Date: Mon, 25 Aug 2025 07:45:43 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D=EF=BC=8C?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=94=B6=E8=97=8F=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- backend/routes/artwork.js | 85 +++++++ backend/services/artwork.js | 80 +++++++ ui/src/App.vue | 30 ++- ui/src/components/artwork/ArtworkCard.vue | 2 +- ui/src/components/search/ArtistSearch.vue | 49 ++-- ui/src/main.ts | 8 + ui/src/router/index.ts | 6 + ui/src/services/artwork.ts | 20 ++ ui/src/views/ArtistView.vue | 3 +- ui/src/views/ArtistsView.vue | 3 +- ui/src/views/ArtworkView.vue | 43 +++- ui/src/views/BookmarksView.vue | 258 ++++++++++++++++++++++ ui/src/views/DownloadsView.vue | 79 ++----- ui/src/views/HomeView.vue | 162 ++++---------- ui/src/views/LoginView.vue | 52 ++--- ui/src/views/RankingView.vue | 71 +++--- ui/src/views/SearchView.vue | 3 +- 18 files changed, 632 insertions(+), 324 deletions(-) create mode 100644 ui/src/views/BookmarksView.vue diff --git a/README.md b/README.md index 5a62e26..c5c5497 100644 --- a/README.md +++ b/README.md @@ -69,7 +69,7 @@ Pixiv 下载浏览管理器是一个基于 Web 的应用程序,提供以下功 - 双击 `start.bat` 文件启动 5. **访问应用** - - 打开浏览器访问:http://localhost:3000(默认端口,可修改) + - 打开浏览器访问:http://localhost:3000 (默认端口,可修改) ## 🌐 代理配置 diff --git a/backend/routes/artwork.js b/backend/routes/artwork.js index 33b7dfb..ddf008f 100644 --- a/backend/routes/artwork.js +++ b/backend/routes/artwork.js @@ -65,6 +65,46 @@ router.get('/search', async (req, res) => { } }); +/** + * 获取用户收藏的作品列表 + * GET /api/artwork/bookmarks + */ +router.get('/bookmarks', async (req, res) => { + try { + const { + type = 'all', + offset = 0, + limit = 30 + } = req.query; + + const artworkService = new ArtworkService(req.backend.getAuth()); + const result = await artworkService.getBookmarks({ + type, + offset: parseInt(offset), + limit: parseInt(limit) + }); + + if (result.success) { + res.json({ + success: true, + data: result.data + }); + } else { + res.status(400).json({ + success: false, + error: result.error + }); + } + } catch (error) { + res.status(500).json({ + success: false, + error: error.message + }); + } +}); + + + /** * 获取作品详情 * GET /api/artwork/:id @@ -181,4 +221,49 @@ router.get('/:id/images', async (req, res) => { } }); +/** + * 收藏/取消收藏作品 + * POST /api/artwork/:id/bookmark + */ +router.post('/:id/bookmark', async (req, res) => { + try { + const { id } = req.params; + const { action = 'add' } = req.body; // 'add' 或 'remove' + + if (!id || isNaN(parseInt(id))) { + return res.status(400).json({ + success: false, + error: 'Invalid artwork ID' + }); + } + + if (!['add', 'remove'].includes(action)) { + return res.status(400).json({ + success: false, + error: 'Invalid action. Must be "add" or "remove"' + }); + } + + const artworkService = new ArtworkService(req.backend.getAuth()); + const result = await artworkService.toggleBookmark(parseInt(id), action); + + if (result.success) { + res.json({ + success: true, + data: result.data + }); + } else { + res.status(400).json({ + success: false, + error: result.error + }); + } + } catch (error) { + res.status(500).json({ + success: false, + error: error.message + }); + } +}); + module.exports = router; \ No newline at end of file diff --git a/backend/services/artwork.js b/backend/services/artwork.js index a9896aa..9457cef 100644 --- a/backend/services/artwork.js +++ b/backend/services/artwork.js @@ -277,6 +277,86 @@ class ArtworkService { } } + /** + * 收藏/取消收藏作品 + */ + /** + * 收藏/取消收藏作品 + * TODO: Pixiv API 端点已更改,需要研究新的端点 + * 当前端点 /v1/illust/bookmark/add 和 /v1/illust/bookmark/delete 已不可用 + */ + async toggleBookmark(artworkId, action = 'add') { + try { + // TODO: 需要研究新的 Pixiv API 端点 + // 当前所有收藏相关的 API 端点都返回 404 错误 + console.log(`尝试${action === 'add' ? '添加' : '删除'}收藏 ${artworkId},但API端点不可用`); + + return { + success: false, + error: `收藏功能暂时不可用。请前往 Pixiv 官方网站进行${action === 'add' ? '收藏' : '取消收藏'}操作。` + }; + } catch (error) { + return { + success: false, + error: error.message, + }; + } + } + + /** + * 获取用户收藏的作品列表 + */ + async getBookmarks(options = {}) { + try { + const { type = 'all', offset = 0, limit = 30 } = options; + + // 从认证状态获取用户ID + const status = this.auth.getStatus(); + if (!status.isLoggedIn || !this.auth.user || !this.auth.user.id) { + throw new Error('用户未登录或无法获取用户ID'); + } + + const userId = this.auth.user.id; + + // 根据类型选择不同的API端点 + let endpoint = '/v1/user/bookmarks/illust'; + if (type === 'manga') { + endpoint = '/v1/user/bookmarks/novel'; + } else if (type === 'novel') { + endpoint = '/v1/user/bookmarks/novel'; + } + + const params = { + user_id: userId, + restrict: 'public', + offset, + limit, + }; + + const response = await this.makeRequest('GET', `${endpoint}?${stringify(params)}`); + + return { + success: true, + data: { + artworks: response.illusts || [], + next_url: response.next_url, + total: response.total || 0, + }, + }; + } catch (error) { + console.error('获取收藏列表失败:', { + message: error.message, + status: error.response?.status, + data: error.response?.data, + config: error.config + }); + return { + success: false, + error: error.message, + }; + } + } + /** * 发送API请求 */ diff --git a/ui/src/App.vue b/ui/src/App.vue index faef1af..cdeda5b 100644 --- a/ui/src/App.vue +++ b/ui/src/App.vue @@ -21,7 +21,8 @@ onMounted(async () => {
开始下载作品后,任务将显示在这里
@@ -59,11 +49,7 @@下载完成后,历史记录将显示在这里
@@ -135,11 +115,7 @@下载完成后,文件将显示在这里
@@ -198,27 +172,17 @@{{ file.artist }}
发现、收藏、下载你喜欢的 Pixiv 作品
- ++ 查看日榜、周榜、月榜热门作品,一键批量下载 +
+欢迎回来,{{ username }}!