diff --git a/wangpan-common/src/main/java/com/wangpan/common/util/EncryptUtil.java b/wangpan-common/src/main/java/com/wangpan/common/util/EncryptUtil.java index 2b89c23..388ca7d 100644 --- a/wangpan-common/src/main/java/com/wangpan/common/util/EncryptUtil.java +++ b/wangpan-common/src/main/java/com/wangpan/common/util/EncryptUtil.java @@ -32,21 +32,17 @@ public class EncryptUtil { */ private static final String ENCRYPT_SUFFIX = ")"; - /** - * 默认加密算法 - PBEWithMD5AndDES - * PBE = Password Based Encryption(基于密码的加密) - * MD5 + DES 是经典组合,兼容性好 - * 如需更高安全性可改为 PBEWITHSHA256AND256BITAES-CBC-BC + /** + * 默认加密算法 - 与 Spring Jasypt 配置保持一致 + * 必须与 application.yml 中 jasypt.encryptor.algorithm 相同 */ - private static final String DEFAULT_ALGORITHM = "PBEWithMD5AndDES"; - - /** - * 默认加密密钥(仅用于开发环境!) - * 生产环境必须通过环境变量覆盖此值: - * -Djasypt.encryptor.password=你的密钥 - * 或设置环境变量:JASYPT_ENCRYPTOR_PASSWORD=你的密钥 + private static final String DEFAULT_ALGORITHM = "PBEWITHHMACSHA512ANDAES_256"; + + /** + * 默认加密密钥 - 与 Spring Jasypt 配置保持一致 + * 必须与 application.yml 中 jasypt.encryptor.password 相同 */ - private static final String DEFAULT_PASSWORD = "wangpan2024"; + private static final String DEFAULT_PASSWORD = "wangpan-secret-key-2024"; // ==================== 单例实例 ==================== @@ -182,14 +178,15 @@ public class EncryptUtil { */ private static StandardPBEStringEncryptor createEncryptor() { StandardPBEStringEncryptor newEncryptor = new StandardPBEStringEncryptor(); - - // 创建配置对象(使用SimplePBEConfig实现类) + SimplePBEConfig config = new SimplePBEConfig(); config.setAlgorithm(DEFAULT_ALGORITHM); config.setPassword(getEncryptionPassword()); - config.setKeyObtentionIterations(1000); // 密钥派生迭代次数 - + config.setKeyObtentionIterations(1000); + config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator"); + newEncryptor.setConfig(config); + newEncryptor.setStringOutputType("base64"); return newEncryptor; } diff --git a/wangpan-common/target/classes/com/wangpan/common/dal/mapper/TmdbScraperLogMapper.class b/wangpan-common/target/classes/com/wangpan/common/dal/mapper/TmdbScraperLogMapper.class index b7a1384..b0f1ce6 100644 Binary files a/wangpan-common/target/classes/com/wangpan/common/dal/mapper/TmdbScraperLogMapper.class and b/wangpan-common/target/classes/com/wangpan/common/dal/mapper/TmdbScraperLogMapper.class differ diff --git a/wangpan-common/target/classes/com/wangpan/common/dal/repository/TmdbScraperLogRepository.class b/wangpan-common/target/classes/com/wangpan/common/dal/repository/TmdbScraperLogRepository.class index 80c3f9e..478e3be 100644 Binary files a/wangpan-common/target/classes/com/wangpan/common/dal/repository/TmdbScraperLogRepository.class and b/wangpan-common/target/classes/com/wangpan/common/dal/repository/TmdbScraperLogRepository.class differ diff --git a/wangpan-common/target/classes/com/wangpan/common/util/EncryptUtil.class b/wangpan-common/target/classes/com/wangpan/common/util/EncryptUtil.class index 2c200f3..4137640 100644 Binary files a/wangpan-common/target/classes/com/wangpan/common/util/EncryptUtil.class and b/wangpan-common/target/classes/com/wangpan/common/util/EncryptUtil.class differ diff --git a/wangpan-common/target/wangpan-common-1.0-SNAPSHOT.jar b/wangpan-common/target/wangpan-common-1.0-SNAPSHOT.jar index 97947c1..c7a27a9 100644 Binary files a/wangpan-common/target/wangpan-common-1.0-SNAPSHOT.jar and b/wangpan-common/target/wangpan-common-1.0-SNAPSHOT.jar differ diff --git a/wangpan-drive-service/target/wangpan-drive-service-1.0-SNAPSHOT.jar b/wangpan-drive-service/target/wangpan-drive-service-1.0-SNAPSHOT.jar index 8440a57..786b5b9 100644 Binary files a/wangpan-drive-service/target/wangpan-drive-service-1.0-SNAPSHOT.jar and b/wangpan-drive-service/target/wangpan-drive-service-1.0-SNAPSHOT.jar differ diff --git a/wangpan-drive-service/target/wangpan-drive-service-1.0-SNAPSHOT.jar.original b/wangpan-drive-service/target/wangpan-drive-service-1.0-SNAPSHOT.jar.original index f6b2336..6e07d45 100644 Binary files a/wangpan-drive-service/target/wangpan-drive-service-1.0-SNAPSHOT.jar.original and b/wangpan-drive-service/target/wangpan-drive-service-1.0-SNAPSHOT.jar.original differ diff --git a/wangpan-gateway/src/main/resources/META-INF/resources/api-doc.html b/wangpan-gateway/src/main/resources/META-INF/resources/api-doc.html index 83ed941..79a9879 100644 --- a/wangpan-gateway/src/main/resources/META-INF/resources/api-doc.html +++ b/wangpan-gateway/src/main/resources/META-INF/resources/api-doc.html @@ -399,6 +399,30 @@ "tokenType": "Bearer", "expireIn": 604800 } +} + +
+

失败响应示例 — 用户名或密码错误

+
{ + "code": 400, + "message": "用户名或密码错误", + "data": null +}
+
+
+

失败响应示例 — 账号被禁用

+
{ + "code": 403, + "message": "账号已被禁用,请联系管理员", + "data": null +}
+
+
+

失败响应示例 — 参数缺失

+
{ + "code": 400, + "message": "用户名和密码不能为空", + "data": null }
@@ -425,6 +449,33 @@
{ "username": "用户名", "password": "密码" +}
+
+
+

成功响应示例

+
{ + "code": 200, + "message": "注册成功", + "data": { + "id": 10, + "username": "newuser" + } +}
+
+
+

失败响应示例 — 用户名已存在

+
{ + "code": 409, + "message": "用户名已被占用", + "data": null +}
+
+
+

失败响应示例 — 参数缺失

+
{ + "code": 400, + "message": "用户名和密码不能为空", + "data": null }
@@ -441,6 +492,27 @@

请求头

Authorization: Bearer <token>
+
+

成功响应示例 — Token 有效

+
{ + "code": 200, + "message": "Token 有效", + "data": { + "valid": true, + "userId": 7, + "username": "lrq", + "expireTime": "2026-06-17T11:20:21" + } +}
+
+
+

失败响应示例 — Token 无效或已过期

+
{ + "code": 401, + "message": "Token 无效或已过期", + "data": null +}
+
@@ -472,6 +544,45 @@

提示:可组合使用多个筛选条件,如 ?result=fail&startDate=2026-06-01&endDate=2026-06-10

+
+

成功响应示例

+
{ + "code": 200, + "message": "查询成功", + "data": { + "total": 10, + "list": [ + { + "id": 1, + "userId": 7, + "username": "lrq", + "loginIp": "127.0.0.1", + "loginTime": "2026-06-10T11:20:21", + "result": "success", + "userAgent": "Mozilla/5.0..." + } + ], + "pageNo": 1, + "pageSize": 20 + } +}
+
+
+

失败响应示例 — 未登录

+
{ + "code": 401, + "message": "未登录或 Token 无效", + "data": null +}
+
+
+

失败响应示例 — 权限不足

+
{ + "code": 403, + "message": "权限不足,无法查看其他用户的登录日志", + "data": null +}
+
@@ -512,9 +623,10 @@
-

响应示例

+

成功响应示例

{ "code": 200, + "message": "查询成功", "data": { "total": 5, "list": [ @@ -523,6 +635,22 @@ "pageNo": 1, "pageSize": 20 } +}
+
+
+

失败响应示例 — 权限不足

+
{ + "code": 403, + "message": "权限不足,仅管理员可访问", + "data": null +}
+
+
+

失败响应示例 — 未登录

+
{ + "code": 401, + "message": "未登录或 Token 无效", + "data": null }
@@ -563,15 +691,36 @@ }
-

错误码

- - - - - - - -
code说明
400用户名或密码为空
409用户名已被占用
401未登录或 Token 无效
403非管理员,无权限操作
500服务器内部错误
+

失败响应示例 — 用户名已存在

+
{ + "code": 409, + "message": "用户名已被占用", + "data": null +}
+
+
+

失败响应示例 — 参数缺失

+
{ + "code": 400, + "message": "用户名或密码不能为空", + "data": null +}
+
+
+

失败响应示例 — 权限不足

+
{ + "code": 403, + "message": "非管理员,无权限操作", + "data": null +}
+
+
+

失败响应示例 — 服务器错误

+
{ + "code": 500, + "message": "服务器内部错误", + "data": null +}
@@ -616,14 +765,36 @@ }
-

错误码

- - - - - - -
code说明
404目标用户不存在
400没有需要更新的字段
403非管理员
500服务器内部错误
+

失败响应示例 — 用户不存在

+
{ + "code": 404, + "message": "目标用户不存在", + "data": null +}
+
+
+

失败响应示例 — 参数缺失

+
{ + "code": 400, + "message": "没有需要更新的字段", + "data": null +}
+
+
+

失败响应示例 — 权限不足

+
{ + "code": 403, + "message": "非管理员,无权限操作", + "data": null +}
+
+
+

失败响应示例 — 服务器错误

+
{ + "code": 500, + "message": "服务器内部错误", + "data": null +}
@@ -656,14 +827,36 @@ }
-

错误码

- - - - - - -
code说明
404目标用户不存在
400删除失败(可能已被删除)
403非管理员
500服务器内部错误
+

失败响应示例 — 用户不存在

+
{ + "code": 404, + "message": "目标用户不存在", + "data": null +}
+
+
+

失败响应示例 — 删除失败

+
{ + "code": 400, + "message": "删除失败,用户可能已被删除", + "data": null +}
+
+
+

失败响应示例 — 权限不足

+
{ + "code": 403, + "message": "非管理员,无权限操作", + "data": null +}
+
+
+

失败响应示例 — 服务器错误

+
{ + "code": 500, + "message": "服务器内部错误", + "data": null +}
@@ -688,7 +881,7 @@

获取当前登录用户的基本信息(不含密码等敏感字段)。

-

响应示例

+

成功响应示例

{ "code": 200, "message": "查询成功", @@ -703,6 +896,22 @@ "status": 1, "createTime": "2024-01-01T00:00:00" } +}
+
+
+

失败响应示例 — 未登录

+
{ + "code": 401, + "message": "未登录或 Token 无效", + "data": null +}
+
+
+

失败响应示例 — 用户不存在

+
{ + "code": 404, + "message": "用户不存在", + "data": null }
@@ -732,11 +941,27 @@ }
-

响应示例

+

成功响应示例

{ "code": 200, "message": "用户名修改成功", "data": null +}
+
+
+

失败响应示例 — 用户名已存在

+
{ + "code": 409, + "message": "用户名已被其他用户使用", + "data": null +}
+
+
+

失败响应示例 — 参数错误

+
{ + "code": 400, + "message": "新用户名不能为空或与当前用户名相同", + "data": null }
@@ -768,13 +993,29 @@ }
-

响应示例

+

成功响应示例

{ "code": 200, "message": "头像更新成功", "data": { "avatarUrl": "http://118.178.238.159:39000/wangpan/avatar/1_1719234567890.png?..." } +}
+
+
+

失败响应示例 — 图片格式不支持

+
{ + "code": 400, + "message": "不支持的图片格式,仅支持 PNG、JPG、GIF、WebP", + "data": null +}
+
+
+

失败响应示例 — MinIO 上传失败

+
{ + "code": 500, + "message": "头像上传失败,请稍后重试", + "data": null }
@@ -812,6 +1053,36 @@ logoDataString否Logo图片Base64编码,支持 data:image/xxx;base64, 前缀格式,上传后存储到MinIO,数据库仅保存URL +
+

成功响应示例

+
{ + "code": 200, + "message": "创建成功", + "data": { + "id": 1, + "name": "我的网盘", + "description": "个人网盘", + "logoUrl": "http://118.178.238.159:39000/wangpan/drive/1/logo.png", + "createTime": "2026-06-26T10:00:00" + } +}
+
+
+

失败响应示例 — 参数缺失

+
{ + "code": 400, + "message": "网盘名称不能为空", + "data": null +}
+
+
+

失败响应示例 — 未登录

+
{ + "code": 401, + "message": "未登录或 Token 无效", + "data": null +}
+
@@ -846,6 +1117,40 @@ updateTimeString更新时间 +
+

成功响应示例

+
{ + "code": 200, + "message": "查询成功", + "data": { + "total": 2, + "list": [ + { + "id": 1, + "name": "我的网盘", + "description": "个人网盘", + "logoUrl": "http://118.178.238.159:39000/wangpan/drive/1/logo.png", + "folderCount": 5, + "fileCount": 20, + "totalSize": 10737418240, + "status": "active", + "createTime": "2026-06-26T10:00:00", + "updateTime": "2026-06-26T10:00:00" + } + ], + "pageNo": 1, + "pageSize": 20 + } +}
+
+
+

失败响应示例 — 未登录

+
{ + "code": 401, + "message": "未登录或 Token 无效", + "data": null +}
+
@@ -879,6 +1184,41 @@ updateTimeString更新时间 +
+

成功响应示例

+
{ + "code": 200, + "message": "查询成功", + "data": { + "id": 1, + "name": "我的网盘", + "description": "个人网盘", + "logoUrl": "http://118.178.238.159:39000/wangpan/drive/1/logo.png", + "folderCount": 5, + "fileCount": 20, + "totalSize": 10737418240, + "status": "active", + "createTime": "2026-06-26T10:00:00", + "updateTime": "2026-06-26T10:00:00" + } +}
+
+
+

失败响应示例 — 网盘不存在

+
{ + "code": 404, + "message": "网盘不存在", + "data": null +}
+
+
+

失败响应示例 — 未登录

+
{ + "code": 401, + "message": "未登录或 Token 无效", + "data": null +}
+
@@ -906,6 +1246,36 @@ logoDataString否新的Logo图片Base64编码,传入后覆盖旧Logo;不传则保留原Logo +
+

成功响应示例

+
{ + "code": 200, + "message": "更新成功", + "data": { + "id": 1, + "name": "新网盘名称", + "description": "新描述", + "logoUrl": "http://118.178.238.159:39000/wangpan/drive/1/logo.png", + "updateTime": "2026-06-26T11:00:00" + } +}
+
+
+

失败响应示例 — 网盘不存在

+
{ + "code": 404, + "message": "网盘不存在", + "data": null +}
+
+
+

失败响应示例 — 权限不足

+
{ + "code": 403, + "message": "无权修改该网盘", + "data": null +}
+
@@ -915,7 +1285,39 @@ /api/drive/{id} 删除网盘需Token -
+
+
+

路径参数

+ + + +
参数类型说明
idLong网盘ID
+
+
+

成功响应示例

+
{ + "code": 200, + "message": "删除成功", + "data": null +}
+
+
+

失败响应示例 — 网盘不存在

+
{ + "code": 404, + "message": "网盘不存在", + "data": null +}
+
+
+

失败响应示例 — 权限不足

+
{ + "code": 403, + "message": "无权删除该网盘", + "data": null +}
+
+
@@ -930,6 +1332,38 @@
{ "name": "文件夹名称", "parentId": 0 +}
+
+
+

成功响应示例

+
{ + "code": 200, + "message": "创建成功", + "data": { + "id": 1, + "driveId": 1, + "parentId": 0, + "name": "我的电影", + "description": "", + "depth": 0, + "createTime": "2026-06-26T10:00:00" + } +}
+
+
+

失败响应示例 — 参数缺失

+
{ + "code": 400, + "message": "文件夹名称不能为空", + "data": null +}
+
+
+

失败响应示例 — 网盘不存在

+
{ + "code": 404, + "message": "网盘不存在", + "data": null }
@@ -949,6 +1383,42 @@ parentId0父文件夹 ID +
+

成功响应示例

+
{ + "code": 200, + "message": "查询成功", + "data": [ + { + "id": 1, + "driveId": 1, + "parentId": 0, + "name": "我的电影", + "description": "", + "depth": 0, + "childFolderCount": 2, + "fileCount": 5, + "createTime": "2026-06-26T10:00:00" + } + ] +}
+
+
+

失败响应示例 — 网盘不存在

+
{ + "code": 404, + "message": "网盘不存在", + "data": null +}
+
+
+

失败响应示例 — 未登录

+
{ + "code": 401, + "message": "未登录或 Token 无效", + "data": null +}
+
@@ -984,6 +1454,42 @@ updateTimeString更新时间 +
+

成功响应示例

+
{ + "code": 200, + "message": "查询成功", + "data": { + "id": 1, + "driveId": 1, + "parentId": 0, + "name": "我的电影", + "description": "收藏的电影", + "depth": 0, + "childFolderCount": 2, + "fileCount": 5, + "totalSize": 5368709120, + "createTime": "2026-06-26T10:00:00", + "updateTime": "2026-06-26T10:00:00" + } +}
+
+
+

失败响应示例 — 文件夹不存在

+
{ + "code": 404, + "message": "文件夹不存在", + "data": null +}
+
+
+

失败响应示例 — 未登录

+
{ + "code": 401, + "message": "未登录或 Token 无效", + "data": null +}
+
@@ -1019,6 +1525,37 @@ parentIdLong否父文件夹ID(可移动文件夹) +
+

成功响应示例

+
{ + "code": 200, + "message": "更新成功", + "data": { + "id": 1, + "driveId": 1, + "parentId": 0, + "name": "新文件夹名称", + "description": "新描述", + "updateTime": "2026-06-26T11:00:00" + } +}
+
+
+

失败响应示例 — 文件夹不存在

+
{ + "code": 404, + "message": "文件夹不存在", + "data": null +}
+
+
+

失败响应示例 — 权限不足

+
{ + "code": 403, + "message": "无权修改该文件夹", + "data": null +}
+
@@ -1086,6 +1623,38 @@

说明

只记录文件名,不上传文件数据。创建后通过 TMDB 刮削接口补充电影的海报、描述、评分等信息。自动检测 MIME 类型(mp4/mkv/avi → video/mp4)。

+
+

成功响应示例

+
{ + "code": 200, + "message": "创建成功", + "data": { + "id": 1, + "driveId": 1, + "folderId": 0, + "title": "电影.mp4", + "originalName": "电影.mp4", + "mimeType": "video/mp4", + "createTime": "2026-06-26T10:00:00" + } +}
+
+
+

失败响应示例 — 参数缺失

+
{ + "code": 400, + "message": "文件名不能为空", + "data": null +}
+
+
+

失败响应示例 — 网盘不存在

+
{ + "code": 404, + "message": "网盘不存在", + "data": null +}
+
@@ -1130,6 +1699,47 @@ pageSizeInteger每页条数 +
+

成功响应示例

+
{ + "code": 200, + "message": "查询成功", + "data": { + "total": 5, + "pageNo": 1, + "pageSize": 20, + "list": [ + { + "id": 1, + "title": "电影.mp4", + "originalName": "电影.mp4", + "mimeType": "video/mp4", + "fileSize": 1073741824, + "extension": "mp4", + "minioUrl": "http://...", + "rating": 85, + "tags": "动作,科幻" + } + ] + } +}
+
+
+

失败响应示例 — 网盘不存在

+
{ + "code": 404, + "message": "网盘不存在", + "data": null +}
+
+
+

失败响应示例 — 未登录

+
{ + "code": 401, + "message": "未登录或 Token 无效", + "data": null +}
+
@@ -1175,6 +1785,47 @@ updateTimeString更新时间 +
+

成功响应示例

+
{ + "code": 200, + "message": "查询成功", + "data": { + "id": 1, + "driveId": 1, + "folderId": 0, + "title": "电影.mp4", + "subtitle": "副标题", + "originalName": "电影.mp4", + "mimeType": "video/mp4", + "fileSize": 1073741824, + "extension": "mp4", + "description": "电影描述", + "rating": 85, + "tags": "动作,科幻", + "posterUrl": "http://...", + "minioUrl": "http://...", + "createTime": "2026-06-26T10:00:00", + "updateTime": "2026-06-26T10:00:00" + } +}
+
+
+

失败响应示例 — 电影不存在

+
{ + "code": 404, + "message": "电影不存在", + "data": null +}
+
+
+

失败响应示例 — 未登录

+
{ + "code": 401, + "message": "未登录或 Token 无效", + "data": null +}
+
@@ -1222,6 +1873,35 @@

说明

用于 TMDB 刮削有误时,用户可自定义修改文件名等信息。所有字段均为可选,只更新传入的字段。

+
+

成功响应示例

+
{ + "code": 200, + "message": "更新成功", + "data": { + "id": 1, + "title": "新电影名称", + "rating": 90, + "updateTime": "2026-06-26T11:00:00" + } +}
+
+
+

失败响应示例 — 电影不存在

+
{ + "code": 404, + "message": "电影不存在", + "data": null +}
+
+
+

失败响应示例 — 权限不足

+
{ + "code": 403, + "message": "无权修改该电影", + "data": null +}
+
@@ -1244,6 +1924,30 @@

说明

逻辑删除(软删除),删除后自动更新网盘和文件夹的统计信息。

+
+

成功响应示例

+
{ + "code": 200, + "message": "删除成功", + "data": null +}
+
+
+

失败响应示例 — 电影不存在

+
{ + "code": 404, + "message": "电影不存在", + "data": null +}
+
+
+

失败响应示例 — 权限不足

+
{ + "code": 403, + "message": "无权删除该电影", + "data": null +}
+
@@ -1476,12 +2180,20 @@ }
-

错误码

- - - - -
code说明
401未登录或 Token 无效
500Icon 不存在或无权访问
+

失败响应示例 — Icon 不存在

+
{ + "code": 404, + "message": "Icon 不存在或无权访问", + "data": null +}
+
+
+

失败响应示例 — 未登录

+
{ + "code": 401, + "message": "未登录或 Token 无效", + "data": null +}
@@ -1635,13 +2347,36 @@ }
-

错误码

- - - - - -
code说明
400文件为空/格式不支持/超过 1MB
401未登录或 Token 无效
500Icon 不存在或无权访问/上传失败
+

失败响应示例 — 文件为空

+
{ + "code": 400, + "message": "上传文件为空", + "data": null +}
+
+
+

失败响应示例 — 文件格式不支持

+
{ + "code": 400, + "message": "不支持的文件格式,仅支持 png/jpg/jpeg/gif/webp/ico", + "data": null +}
+
+
+

失败响应示例 — 文件超过 1MB

+
{ + "code": 400, + "message": "文件大小超过限制(最大 1MB)", + "data": null +}
+
+
+

失败响应示例 — Icon 不存在

+
{ + "code": 404, + "message": "Icon 不存在", + "data": null +}
@@ -1721,12 +2456,20 @@
-

错误码

- - - - -
code说明
401未登录或 Token 无效
500服务器内部错误
+

失败响应示例 — 未登录或 Token 无效

+
{ + "code": 401, + "message": "未登录或 Token 已过期", + "data": null +}
+
+
+

失败响应示例 — 服务器内部错误

+
{ + "code": 500, + "message": "服务器内部错误,请稍后重试", + "data": null +}
@@ -1812,6 +2555,22 @@ } ] } +} + +
+

失败响应示例 — 未登录或 Token 无效

+
{ + "code": 401, + "message": "未登录或 Token 已过期", + "data": null +}
+
+
+

失败响应示例 — 参数错误

+
{ + "code": 400, + "message": "请求参数错误", + "data": null }
@@ -1823,7 +2582,61 @@ /api/movies/{id} 电影详情查询需Token -
+
+
+

功能说明

+

查询单部电影的完整详情信息,包括基本信息、海报、评分等。

+
+
+

路径参数

+ + + +
参数类型说明
idLong电影ID
+
+
+

成功响应示例

+
{ + "code": 200, + "message": "查询成功", + "data": { + "id": 1, + "driveId": 1, + "folderId": 3, + "title": "肖申克的救赎", + "subtitle": "The Shawshank Redemption", + "originalName": "肖申克的救赎.mp4", + "mimeType": "video/mp4", + "fileSize": 2147483648, + "extension": "mp4", + "description": "电影描述", + "scrapeStatus": "success", + "rating": 93, + "posterUrl": "http://...:39000/wangpan/posters/1/poster_xxx.jpg", + "backdropUrl": "http://...:39000/wangpan/posters/1/backdrop_xxx.jpg", + "tags": "剧情,犯罪", + "createTime": "2025-01-01T10:00:00", + "updateTime": "2025-01-15T10:00:00" + } +}
+
+
+

失败响应示例 — 电影不存在

+
{ + "code": 404, + "message": "电影不存在或无权访问", + "data": null +}
+
+
+

失败响应示例 — 未登录或 Token 无效

+
{ + "code": 401, + "message": "未登录或 Token 已过期", + "data": null +}
+
+
@@ -1906,13 +2719,20 @@ }
-

错误码

- - - - - -
code说明
401未登录或 Token 无效
404电影不存在或无权访问
500服务器内部错误
+

失败响应示例 — 未登录或 Token 无效

+
{ + "code": 401, + "message": "未登录或 Token 已过期", + "data": null +}
+
+
+

失败响应示例 — 电影不存在

+
{ + "code": 404, + "message": "电影不存在或无权访问", + "data": null +}
@@ -1924,6 +2744,10 @@ 创建电影需Token
+
+

功能说明

+

创建新的电影记录,title 为必填字段。

+

请求体(所有字段可选,title 必填)

{ @@ -1937,6 +2761,35 @@ "rating": 85, // 可选:0-100 "posterUrl": "海报URL", // 可选 "tags": "标签1,标签2" // 可选 +}
+
+
+

成功响应示例

+
{ + "code": 200, + "message": "创建成功", + "data": { + "id": 1, + "title": "电影名称", + "subtitle": "副标题", + "createTime": "2025-01-01T10:00:00" + } +}
+
+
+

失败响应示例 — 缺少必填字段

+
{ + "code": 400, + "message": "电影名称不能为空", + "data": null +}
+
+
+

失败响应示例 — 未登录或 Token 无效

+
{ + "code": 401, + "message": "未登录或 Token 已过期", + "data": null }
@@ -1949,6 +2802,10 @@ 更新电影需Token
+
+

功能说明

+

更新指定电影的信息,支持部分更新。

+

路径参数

@@ -1969,6 +2826,34 @@ "rating": 90, "posterUrl": "新海报URL", "tags": "新标签" +} + +
+

成功响应示例

+
{ + "code": 200, + "message": "更新成功", + "data": { + "id": 1, + "title": "新电影名称", + "updateTime": "2025-01-15T10:00:00" + } +}
+
+
+

失败响应示例 — 电影不存在

+
{ + "code": 404, + "message": "电影不存在", + "data": null +}
+
+
+

失败响应示例 — 未登录或 Token 无效

+
{ + "code": 401, + "message": "未登录或 Token 已过期", + "data": null }
@@ -1980,7 +2865,43 @@ /api/movies/{id}删除电影需Token -
+
+
+

功能说明

+

删除指定的电影记录。

+
+
+

路径参数

+
+ + +
参数类型说明
idLong电影ID
+
+
+

成功响应示例

+
{ + "code": 200, + "message": "删除成功", + "data": null +}
+
+
+

失败响应示例 — 电影不存在

+
{ + "code": 404, + "message": "电影不存在", + "data": null +}
+
+
+

失败响应示例 — 未登录或 Token 无效

+
{ + "code": 401, + "message": "未登录或 Token 已过期", + "data": null +}
+
+
@@ -1990,10 +2911,40 @@ 批量删除电影需Token
+
+

功能说明

+

批量删除多个电影记录。

+

请求体

{ "ids": [1, 2, 3] }
+
+

成功响应示例

+
{ + "code": 200, + "message": "批量删除成功", + "data": { + "deletedCount": 3 + } +}
+
+
+

失败响应示例 — 参数错误

+
{ + "code": 400, + "message": "电影ID列表不能为空", + "data": null +}
+
+
+

失败响应示例 — 未登录或 Token 无效

+
{ + "code": 401, + "message": "未登录或 Token 已过期", + "data": null +}
+
@@ -2017,6 +2968,14 @@ "scrapedCount": 8, "pendingCount": 2 } +} + +
+

失败响应示例 — 未登录或 Token 无效

+
{ + "code": 401, + "message": "未登录或 Token 已过期", + "data": null }
@@ -2028,7 +2987,30 @@ /api/tmdb/key 获取 TMDB API Key需Token -
+
+
+

功能说明

+

获取当前用户配置的 TMDB API Key。

+
+
+

成功响应示例

+
{ + "code": 200, + "message": "查询成功", + "data": { + "tmdbApiKey": "your_api_key_here" + } +}
+
+
+

失败响应示例 — 未登录或 Token 无效

+
{ + "code": 401, + "message": "未登录或 Token 已过期", + "data": null +}
+
+
diff --git a/wangpan-gateway/target/classes/META-INF/resources/api-doc.html b/wangpan-gateway/target/classes/META-INF/resources/api-doc.html index 83ed941..79a9879 100644 --- a/wangpan-gateway/target/classes/META-INF/resources/api-doc.html +++ b/wangpan-gateway/target/classes/META-INF/resources/api-doc.html @@ -399,6 +399,30 @@ "tokenType": "Bearer", "expireIn": 604800 } +}
+ +
+

失败响应示例 — 用户名或密码错误

+
{ + "code": 400, + "message": "用户名或密码错误", + "data": null +}
+
+
+

失败响应示例 — 账号被禁用

+
{ + "code": 403, + "message": "账号已被禁用,请联系管理员", + "data": null +}
+
+
+

失败响应示例 — 参数缺失

+
{ + "code": 400, + "message": "用户名和密码不能为空", + "data": null }
@@ -425,6 +449,33 @@
{ "username": "用户名", "password": "密码" +}
+
+
+

成功响应示例

+
{ + "code": 200, + "message": "注册成功", + "data": { + "id": 10, + "username": "newuser" + } +}
+
+
+

失败响应示例 — 用户名已存在

+
{ + "code": 409, + "message": "用户名已被占用", + "data": null +}
+
+
+

失败响应示例 — 参数缺失

+
{ + "code": 400, + "message": "用户名和密码不能为空", + "data": null }
@@ -441,6 +492,27 @@

请求头

Authorization: Bearer <token>
+
+

成功响应示例 — Token 有效

+
{ + "code": 200, + "message": "Token 有效", + "data": { + "valid": true, + "userId": 7, + "username": "lrq", + "expireTime": "2026-06-17T11:20:21" + } +}
+
+
+

失败响应示例 — Token 无效或已过期

+
{ + "code": 401, + "message": "Token 无效或已过期", + "data": null +}
+
@@ -472,6 +544,45 @@

提示:可组合使用多个筛选条件,如 ?result=fail&startDate=2026-06-01&endDate=2026-06-10

+
+

成功响应示例

+
{ + "code": 200, + "message": "查询成功", + "data": { + "total": 10, + "list": [ + { + "id": 1, + "userId": 7, + "username": "lrq", + "loginIp": "127.0.0.1", + "loginTime": "2026-06-10T11:20:21", + "result": "success", + "userAgent": "Mozilla/5.0..." + } + ], + "pageNo": 1, + "pageSize": 20 + } +}
+
+
+

失败响应示例 — 未登录

+
{ + "code": 401, + "message": "未登录或 Token 无效", + "data": null +}
+
+
+

失败响应示例 — 权限不足

+
{ + "code": 403, + "message": "权限不足,无法查看其他用户的登录日志", + "data": null +}
+
@@ -512,9 +623,10 @@
-

响应示例

+

成功响应示例

{ "code": 200, + "message": "查询成功", "data": { "total": 5, "list": [ @@ -523,6 +635,22 @@ "pageNo": 1, "pageSize": 20 } +}
+
+
+

失败响应示例 — 权限不足

+
{ + "code": 403, + "message": "权限不足,仅管理员可访问", + "data": null +}
+
+
+

失败响应示例 — 未登录

+
{ + "code": 401, + "message": "未登录或 Token 无效", + "data": null }
@@ -563,15 +691,36 @@ }
-

错误码

- - - - - - - -
code说明
400用户名或密码为空
409用户名已被占用
401未登录或 Token 无效
403非管理员,无权限操作
500服务器内部错误
+

失败响应示例 — 用户名已存在

+
{ + "code": 409, + "message": "用户名已被占用", + "data": null +}
+
+
+

失败响应示例 — 参数缺失

+
{ + "code": 400, + "message": "用户名或密码不能为空", + "data": null +}
+
+
+

失败响应示例 — 权限不足

+
{ + "code": 403, + "message": "非管理员,无权限操作", + "data": null +}
+
+
+

失败响应示例 — 服务器错误

+
{ + "code": 500, + "message": "服务器内部错误", + "data": null +}
@@ -616,14 +765,36 @@ }
-

错误码

- - - - - - -
code说明
404目标用户不存在
400没有需要更新的字段
403非管理员
500服务器内部错误
+

失败响应示例 — 用户不存在

+
{ + "code": 404, + "message": "目标用户不存在", + "data": null +}
+
+
+

失败响应示例 — 参数缺失

+
{ + "code": 400, + "message": "没有需要更新的字段", + "data": null +}
+
+
+

失败响应示例 — 权限不足

+
{ + "code": 403, + "message": "非管理员,无权限操作", + "data": null +}
+
+
+

失败响应示例 — 服务器错误

+
{ + "code": 500, + "message": "服务器内部错误", + "data": null +}
@@ -656,14 +827,36 @@ }
-

错误码

- - - - - - -
code说明
404目标用户不存在
400删除失败(可能已被删除)
403非管理员
500服务器内部错误
+

失败响应示例 — 用户不存在

+
{ + "code": 404, + "message": "目标用户不存在", + "data": null +}
+
+
+

失败响应示例 — 删除失败

+
{ + "code": 400, + "message": "删除失败,用户可能已被删除", + "data": null +}
+
+
+

失败响应示例 — 权限不足

+
{ + "code": 403, + "message": "非管理员,无权限操作", + "data": null +}
+
+
+

失败响应示例 — 服务器错误

+
{ + "code": 500, + "message": "服务器内部错误", + "data": null +}
@@ -688,7 +881,7 @@

获取当前登录用户的基本信息(不含密码等敏感字段)。

-

响应示例

+

成功响应示例

{ "code": 200, "message": "查询成功", @@ -703,6 +896,22 @@ "status": 1, "createTime": "2024-01-01T00:00:00" } +}
+
+
+

失败响应示例 — 未登录

+
{ + "code": 401, + "message": "未登录或 Token 无效", + "data": null +}
+
+
+

失败响应示例 — 用户不存在

+
{ + "code": 404, + "message": "用户不存在", + "data": null }
@@ -732,11 +941,27 @@ }
-

响应示例

+

成功响应示例

{ "code": 200, "message": "用户名修改成功", "data": null +}
+
+
+

失败响应示例 — 用户名已存在

+
{ + "code": 409, + "message": "用户名已被其他用户使用", + "data": null +}
+
+
+

失败响应示例 — 参数错误

+
{ + "code": 400, + "message": "新用户名不能为空或与当前用户名相同", + "data": null }
@@ -768,13 +993,29 @@ }
-

响应示例

+

成功响应示例

{ "code": 200, "message": "头像更新成功", "data": { "avatarUrl": "http://118.178.238.159:39000/wangpan/avatar/1_1719234567890.png?..." } +}
+
+
+

失败响应示例 — 图片格式不支持

+
{ + "code": 400, + "message": "不支持的图片格式,仅支持 PNG、JPG、GIF、WebP", + "data": null +}
+
+
+

失败响应示例 — MinIO 上传失败

+
{ + "code": 500, + "message": "头像上传失败,请稍后重试", + "data": null }
@@ -812,6 +1053,36 @@ logoDataString否Logo图片Base64编码,支持 data:image/xxx;base64, 前缀格式,上传后存储到MinIO,数据库仅保存URL +
+

成功响应示例

+
{ + "code": 200, + "message": "创建成功", + "data": { + "id": 1, + "name": "我的网盘", + "description": "个人网盘", + "logoUrl": "http://118.178.238.159:39000/wangpan/drive/1/logo.png", + "createTime": "2026-06-26T10:00:00" + } +}
+
+
+

失败响应示例 — 参数缺失

+
{ + "code": 400, + "message": "网盘名称不能为空", + "data": null +}
+
+
+

失败响应示例 — 未登录

+
{ + "code": 401, + "message": "未登录或 Token 无效", + "data": null +}
+
@@ -846,6 +1117,40 @@ updateTimeString更新时间 +
+

成功响应示例

+
{ + "code": 200, + "message": "查询成功", + "data": { + "total": 2, + "list": [ + { + "id": 1, + "name": "我的网盘", + "description": "个人网盘", + "logoUrl": "http://118.178.238.159:39000/wangpan/drive/1/logo.png", + "folderCount": 5, + "fileCount": 20, + "totalSize": 10737418240, + "status": "active", + "createTime": "2026-06-26T10:00:00", + "updateTime": "2026-06-26T10:00:00" + } + ], + "pageNo": 1, + "pageSize": 20 + } +}
+
+
+

失败响应示例 — 未登录

+
{ + "code": 401, + "message": "未登录或 Token 无效", + "data": null +}
+
@@ -879,6 +1184,41 @@ updateTimeString更新时间 +
+

成功响应示例

+
{ + "code": 200, + "message": "查询成功", + "data": { + "id": 1, + "name": "我的网盘", + "description": "个人网盘", + "logoUrl": "http://118.178.238.159:39000/wangpan/drive/1/logo.png", + "folderCount": 5, + "fileCount": 20, + "totalSize": 10737418240, + "status": "active", + "createTime": "2026-06-26T10:00:00", + "updateTime": "2026-06-26T10:00:00" + } +}
+
+
+

失败响应示例 — 网盘不存在

+
{ + "code": 404, + "message": "网盘不存在", + "data": null +}
+
+
+

失败响应示例 — 未登录

+
{ + "code": 401, + "message": "未登录或 Token 无效", + "data": null +}
+
@@ -906,6 +1246,36 @@ logoDataString否新的Logo图片Base64编码,传入后覆盖旧Logo;不传则保留原Logo +
+

成功响应示例

+
{ + "code": 200, + "message": "更新成功", + "data": { + "id": 1, + "name": "新网盘名称", + "description": "新描述", + "logoUrl": "http://118.178.238.159:39000/wangpan/drive/1/logo.png", + "updateTime": "2026-06-26T11:00:00" + } +}
+
+
+

失败响应示例 — 网盘不存在

+
{ + "code": 404, + "message": "网盘不存在", + "data": null +}
+
+
+

失败响应示例 — 权限不足

+
{ + "code": 403, + "message": "无权修改该网盘", + "data": null +}
+
@@ -915,7 +1285,39 @@ /api/drive/{id} 删除网盘需Token -
+
+
+

路径参数

+ + + +
参数类型说明
idLong网盘ID
+
+
+

成功响应示例

+
{ + "code": 200, + "message": "删除成功", + "data": null +}
+
+
+

失败响应示例 — 网盘不存在

+
{ + "code": 404, + "message": "网盘不存在", + "data": null +}
+
+
+

失败响应示例 — 权限不足

+
{ + "code": 403, + "message": "无权删除该网盘", + "data": null +}
+
+
@@ -930,6 +1332,38 @@
{ "name": "文件夹名称", "parentId": 0 +}
+
+
+

成功响应示例

+
{ + "code": 200, + "message": "创建成功", + "data": { + "id": 1, + "driveId": 1, + "parentId": 0, + "name": "我的电影", + "description": "", + "depth": 0, + "createTime": "2026-06-26T10:00:00" + } +}
+
+
+

失败响应示例 — 参数缺失

+
{ + "code": 400, + "message": "文件夹名称不能为空", + "data": null +}
+
+
+

失败响应示例 — 网盘不存在

+
{ + "code": 404, + "message": "网盘不存在", + "data": null }
@@ -949,6 +1383,42 @@ parentId0父文件夹 ID +
+

成功响应示例

+
{ + "code": 200, + "message": "查询成功", + "data": [ + { + "id": 1, + "driveId": 1, + "parentId": 0, + "name": "我的电影", + "description": "", + "depth": 0, + "childFolderCount": 2, + "fileCount": 5, + "createTime": "2026-06-26T10:00:00" + } + ] +}
+
+
+

失败响应示例 — 网盘不存在

+
{ + "code": 404, + "message": "网盘不存在", + "data": null +}
+
+
+

失败响应示例 — 未登录

+
{ + "code": 401, + "message": "未登录或 Token 无效", + "data": null +}
+
@@ -984,6 +1454,42 @@ updateTimeString更新时间 +
+

成功响应示例

+
{ + "code": 200, + "message": "查询成功", + "data": { + "id": 1, + "driveId": 1, + "parentId": 0, + "name": "我的电影", + "description": "收藏的电影", + "depth": 0, + "childFolderCount": 2, + "fileCount": 5, + "totalSize": 5368709120, + "createTime": "2026-06-26T10:00:00", + "updateTime": "2026-06-26T10:00:00" + } +}
+
+
+

失败响应示例 — 文件夹不存在

+
{ + "code": 404, + "message": "文件夹不存在", + "data": null +}
+
+
+

失败响应示例 — 未登录

+
{ + "code": 401, + "message": "未登录或 Token 无效", + "data": null +}
+
@@ -1019,6 +1525,37 @@ parentIdLong否父文件夹ID(可移动文件夹) +
+

成功响应示例

+
{ + "code": 200, + "message": "更新成功", + "data": { + "id": 1, + "driveId": 1, + "parentId": 0, + "name": "新文件夹名称", + "description": "新描述", + "updateTime": "2026-06-26T11:00:00" + } +}
+
+
+

失败响应示例 — 文件夹不存在

+
{ + "code": 404, + "message": "文件夹不存在", + "data": null +}
+
+
+

失败响应示例 — 权限不足

+
{ + "code": 403, + "message": "无权修改该文件夹", + "data": null +}
+
@@ -1086,6 +1623,38 @@

说明

只记录文件名,不上传文件数据。创建后通过 TMDB 刮削接口补充电影的海报、描述、评分等信息。自动检测 MIME 类型(mp4/mkv/avi → video/mp4)。

+
+

成功响应示例

+
{ + "code": 200, + "message": "创建成功", + "data": { + "id": 1, + "driveId": 1, + "folderId": 0, + "title": "电影.mp4", + "originalName": "电影.mp4", + "mimeType": "video/mp4", + "createTime": "2026-06-26T10:00:00" + } +}
+
+
+

失败响应示例 — 参数缺失

+
{ + "code": 400, + "message": "文件名不能为空", + "data": null +}
+
+
+

失败响应示例 — 网盘不存在

+
{ + "code": 404, + "message": "网盘不存在", + "data": null +}
+
@@ -1130,6 +1699,47 @@ pageSizeInteger每页条数 +
+

成功响应示例

+
{ + "code": 200, + "message": "查询成功", + "data": { + "total": 5, + "pageNo": 1, + "pageSize": 20, + "list": [ + { + "id": 1, + "title": "电影.mp4", + "originalName": "电影.mp4", + "mimeType": "video/mp4", + "fileSize": 1073741824, + "extension": "mp4", + "minioUrl": "http://...", + "rating": 85, + "tags": "动作,科幻" + } + ] + } +}
+
+
+

失败响应示例 — 网盘不存在

+
{ + "code": 404, + "message": "网盘不存在", + "data": null +}
+
+
+

失败响应示例 — 未登录

+
{ + "code": 401, + "message": "未登录或 Token 无效", + "data": null +}
+
@@ -1175,6 +1785,47 @@ updateTimeString更新时间 +
+

成功响应示例

+
{ + "code": 200, + "message": "查询成功", + "data": { + "id": 1, + "driveId": 1, + "folderId": 0, + "title": "电影.mp4", + "subtitle": "副标题", + "originalName": "电影.mp4", + "mimeType": "video/mp4", + "fileSize": 1073741824, + "extension": "mp4", + "description": "电影描述", + "rating": 85, + "tags": "动作,科幻", + "posterUrl": "http://...", + "minioUrl": "http://...", + "createTime": "2026-06-26T10:00:00", + "updateTime": "2026-06-26T10:00:00" + } +}
+
+
+

失败响应示例 — 电影不存在

+
{ + "code": 404, + "message": "电影不存在", + "data": null +}
+
+
+

失败响应示例 — 未登录

+
{ + "code": 401, + "message": "未登录或 Token 无效", + "data": null +}
+
@@ -1222,6 +1873,35 @@

说明

用于 TMDB 刮削有误时,用户可自定义修改文件名等信息。所有字段均为可选,只更新传入的字段。

+
+

成功响应示例

+
{ + "code": 200, + "message": "更新成功", + "data": { + "id": 1, + "title": "新电影名称", + "rating": 90, + "updateTime": "2026-06-26T11:00:00" + } +}
+
+
+

失败响应示例 — 电影不存在

+
{ + "code": 404, + "message": "电影不存在", + "data": null +}
+
+
+

失败响应示例 — 权限不足

+
{ + "code": 403, + "message": "无权修改该电影", + "data": null +}
+
@@ -1244,6 +1924,30 @@

说明

逻辑删除(软删除),删除后自动更新网盘和文件夹的统计信息。

+
+

成功响应示例

+
{ + "code": 200, + "message": "删除成功", + "data": null +}
+
+
+

失败响应示例 — 电影不存在

+
{ + "code": 404, + "message": "电影不存在", + "data": null +}
+
+
+

失败响应示例 — 权限不足

+
{ + "code": 403, + "message": "无权删除该电影", + "data": null +}
+
@@ -1476,12 +2180,20 @@ }
-

错误码

- - - - -
code说明
401未登录或 Token 无效
500Icon 不存在或无权访问
+

失败响应示例 — Icon 不存在

+
{ + "code": 404, + "message": "Icon 不存在或无权访问", + "data": null +}
+
+
+

失败响应示例 — 未登录

+
{ + "code": 401, + "message": "未登录或 Token 无效", + "data": null +}
@@ -1635,13 +2347,36 @@ }
-

错误码

- - - - - -
code说明
400文件为空/格式不支持/超过 1MB
401未登录或 Token 无效
500Icon 不存在或无权访问/上传失败
+

失败响应示例 — 文件为空

+
{ + "code": 400, + "message": "上传文件为空", + "data": null +}
+
+
+

失败响应示例 — 文件格式不支持

+
{ + "code": 400, + "message": "不支持的文件格式,仅支持 png/jpg/jpeg/gif/webp/ico", + "data": null +}
+
+
+

失败响应示例 — 文件超过 1MB

+
{ + "code": 400, + "message": "文件大小超过限制(最大 1MB)", + "data": null +}
+
+
+

失败响应示例 — Icon 不存在

+
{ + "code": 404, + "message": "Icon 不存在", + "data": null +}
@@ -1721,12 +2456,20 @@
-

错误码

- - - - -
code说明
401未登录或 Token 无效
500服务器内部错误
+

失败响应示例 — 未登录或 Token 无效

+
{ + "code": 401, + "message": "未登录或 Token 已过期", + "data": null +}
+
+
+

失败响应示例 — 服务器内部错误

+
{ + "code": 500, + "message": "服务器内部错误,请稍后重试", + "data": null +}
@@ -1812,6 +2555,22 @@ } ] } +} + +
+

失败响应示例 — 未登录或 Token 无效

+
{ + "code": 401, + "message": "未登录或 Token 已过期", + "data": null +}
+
+
+

失败响应示例 — 参数错误

+
{ + "code": 400, + "message": "请求参数错误", + "data": null }
@@ -1823,7 +2582,61 @@ /api/movies/{id} 电影详情查询需Token -
+
+
+

功能说明

+

查询单部电影的完整详情信息,包括基本信息、海报、评分等。

+
+
+

路径参数

+ + + +
参数类型说明
idLong电影ID
+
+
+

成功响应示例

+
{ + "code": 200, + "message": "查询成功", + "data": { + "id": 1, + "driveId": 1, + "folderId": 3, + "title": "肖申克的救赎", + "subtitle": "The Shawshank Redemption", + "originalName": "肖申克的救赎.mp4", + "mimeType": "video/mp4", + "fileSize": 2147483648, + "extension": "mp4", + "description": "电影描述", + "scrapeStatus": "success", + "rating": 93, + "posterUrl": "http://...:39000/wangpan/posters/1/poster_xxx.jpg", + "backdropUrl": "http://...:39000/wangpan/posters/1/backdrop_xxx.jpg", + "tags": "剧情,犯罪", + "createTime": "2025-01-01T10:00:00", + "updateTime": "2025-01-15T10:00:00" + } +}
+
+
+

失败响应示例 — 电影不存在

+
{ + "code": 404, + "message": "电影不存在或无权访问", + "data": null +}
+
+
+

失败响应示例 — 未登录或 Token 无效

+
{ + "code": 401, + "message": "未登录或 Token 已过期", + "data": null +}
+
+
@@ -1906,13 +2719,20 @@ }
-

错误码

- - - - - -
code说明
401未登录或 Token 无效
404电影不存在或无权访问
500服务器内部错误
+

失败响应示例 — 未登录或 Token 无效

+
{ + "code": 401, + "message": "未登录或 Token 已过期", + "data": null +}
+
+
+

失败响应示例 — 电影不存在

+
{ + "code": 404, + "message": "电影不存在或无权访问", + "data": null +}
@@ -1924,6 +2744,10 @@ 创建电影需Token
+
+

功能说明

+

创建新的电影记录,title 为必填字段。

+

请求体(所有字段可选,title 必填)

{ @@ -1937,6 +2761,35 @@ "rating": 85, // 可选:0-100 "posterUrl": "海报URL", // 可选 "tags": "标签1,标签2" // 可选 +}
+
+
+

成功响应示例

+
{ + "code": 200, + "message": "创建成功", + "data": { + "id": 1, + "title": "电影名称", + "subtitle": "副标题", + "createTime": "2025-01-01T10:00:00" + } +}
+
+
+

失败响应示例 — 缺少必填字段

+
{ + "code": 400, + "message": "电影名称不能为空", + "data": null +}
+
+
+

失败响应示例 — 未登录或 Token 无效

+
{ + "code": 401, + "message": "未登录或 Token 已过期", + "data": null }
@@ -1949,6 +2802,10 @@ 更新电影需Token
+
+

功能说明

+

更新指定电影的信息,支持部分更新。

+

路径参数

@@ -1969,6 +2826,34 @@ "rating": 90, "posterUrl": "新海报URL", "tags": "新标签" +} + +
+

成功响应示例

+
{ + "code": 200, + "message": "更新成功", + "data": { + "id": 1, + "title": "新电影名称", + "updateTime": "2025-01-15T10:00:00" + } +}
+
+
+

失败响应示例 — 电影不存在

+
{ + "code": 404, + "message": "电影不存在", + "data": null +}
+
+
+

失败响应示例 — 未登录或 Token 无效

+
{ + "code": 401, + "message": "未登录或 Token 已过期", + "data": null }
@@ -1980,7 +2865,43 @@ /api/movies/{id}删除电影需Token -
+
+
+

功能说明

+

删除指定的电影记录。

+
+
+

路径参数

+
+ + +
参数类型说明
idLong电影ID
+
+
+

成功响应示例

+
{ + "code": 200, + "message": "删除成功", + "data": null +}
+
+
+

失败响应示例 — 电影不存在

+
{ + "code": 404, + "message": "电影不存在", + "data": null +}
+
+
+

失败响应示例 — 未登录或 Token 无效

+
{ + "code": 401, + "message": "未登录或 Token 已过期", + "data": null +}
+
+
@@ -1990,10 +2911,40 @@ 批量删除电影需Token
+
+

功能说明

+

批量删除多个电影记录。

+

请求体

{ "ids": [1, 2, 3] }
+
+

成功响应示例

+
{ + "code": 200, + "message": "批量删除成功", + "data": { + "deletedCount": 3 + } +}
+
+
+

失败响应示例 — 参数错误

+
{ + "code": 400, + "message": "电影ID列表不能为空", + "data": null +}
+
+
+

失败响应示例 — 未登录或 Token 无效

+
{ + "code": 401, + "message": "未登录或 Token 已过期", + "data": null +}
+
@@ -2017,6 +2968,14 @@ "scrapedCount": 8, "pendingCount": 2 } +} + +
+

失败响应示例 — 未登录或 Token 无效

+
{ + "code": 401, + "message": "未登录或 Token 已过期", + "data": null }
@@ -2028,7 +2987,30 @@ /api/tmdb/key 获取 TMDB API Key需Token -
+
+
+

功能说明

+

获取当前用户配置的 TMDB API Key。

+
+
+

成功响应示例

+
{ + "code": 200, + "message": "查询成功", + "data": { + "tmdbApiKey": "your_api_key_here" + } +}
+
+
+

失败响应示例 — 未登录或 Token 无效

+
{ + "code": 401, + "message": "未登录或 Token 已过期", + "data": null +}
+
+
diff --git a/wangpan-gateway/target/wangpan-gateway-1.0-SNAPSHOT.jar b/wangpan-gateway/target/wangpan-gateway-1.0-SNAPSHOT.jar index db0857e..b5ee0a9 100644 Binary files a/wangpan-gateway/target/wangpan-gateway-1.0-SNAPSHOT.jar and b/wangpan-gateway/target/wangpan-gateway-1.0-SNAPSHOT.jar differ diff --git a/wangpan-gateway/target/wangpan-gateway-1.0-SNAPSHOT.jar.original b/wangpan-gateway/target/wangpan-gateway-1.0-SNAPSHOT.jar.original index 31370c3..334f71e 100644 Binary files a/wangpan-gateway/target/wangpan-gateway-1.0-SNAPSHOT.jar.original and b/wangpan-gateway/target/wangpan-gateway-1.0-SNAPSHOT.jar.original differ diff --git a/wangpan-tmdb-service/src/main/java/com/wangpan/service/TmdbScraperService.java b/wangpan-tmdb-service/src/main/java/com/wangpan/service/TmdbScraperService.java index 7f6d96a..d0f64c7 100644 --- a/wangpan-tmdb-service/src/main/java/com/wangpan/service/TmdbScraperService.java +++ b/wangpan-tmdb-service/src/main/java/com/wangpan/service/TmdbScraperService.java @@ -53,8 +53,8 @@ public class TmdbScraperService { // ==================== TMDB API 配置常量 ==================== - /** TMDB API 基础地址(通过 Cloudflare Worker 代理访问,解决国内网络无法直连的问题) */ - public static final String TMDB_API_BASE = "https://tmdb-proxy.naihun782.workers.dev/tmdb-proxy/3"; + /** TMDB API 基础地址(通过 Vercel 自部署代理访问,解决国内网络无法直连的问题) */ + public static final String TMDB_API_BASE = "https://tmdb.ldfun.xyz/3"; /** TMDB 图片服务器基础地址(原始尺寸) */ public static final String TMDB_IMAGE_BASE = "https://image.tmdb.org/t/p/original"; @@ -153,8 +153,8 @@ public class TmdbScraperService { movieRepository.updateScrapeStatus(movieId, "failed", "用户未配置TMDB API Key"); return errorResult("用户未配置TMDB API Key,请先设置"); } - - // 解密API Key + // UserDO.tmdbApiKey 是普通 String 字段,没有 Jasypt 自动解密注解, + // 数据库中存储的是密文,必须手动解密后才能调用 TMDB API var apiKey = EncryptUtil.decrypt(encryptedKey); // 更新刮削状态为刮削中 @@ -221,9 +221,10 @@ public class TmdbScraperService { } catch (Exception e) { LOGGER.log(Level.SEVERE, "[TmdbScraper] 刮削异常: movieId=" + movieId, e); - // 更新刮削状态为失败 - movieRepository.updateScrapeStatus(movieId, "failed", "刮削异常: " + e.getMessage()); - return errorResult("刮削异常: " + e.getMessage()); + // 更新刮削状态为失败(e.getMessage() 可能为 null,如 NullPointerException) + String errorMsg = e.getMessage() != null ? e.getMessage() : e.getClass().getSimpleName(); + movieRepository.updateScrapeStatus(movieId, "failed", "刮削异常: " + errorMsg); + return errorResult("刮削异常: " + errorMsg); } } diff --git a/wangpan-tmdb-service/target/classes/com/wangpan/config/DatabaseInitializer.class b/wangpan-tmdb-service/target/classes/com/wangpan/config/DatabaseInitializer.class index ea70996..43dae81 100644 Binary files a/wangpan-tmdb-service/target/classes/com/wangpan/config/DatabaseInitializer.class and b/wangpan-tmdb-service/target/classes/com/wangpan/config/DatabaseInitializer.class differ diff --git a/wangpan-tmdb-service/target/classes/com/wangpan/controller/MovieController.class b/wangpan-tmdb-service/target/classes/com/wangpan/controller/MovieController.class index bfb93af..370afe9 100644 Binary files a/wangpan-tmdb-service/target/classes/com/wangpan/controller/MovieController.class and b/wangpan-tmdb-service/target/classes/com/wangpan/controller/MovieController.class differ diff --git a/wangpan-tmdb-service/target/classes/com/wangpan/controller/TmdbScraperController.class b/wangpan-tmdb-service/target/classes/com/wangpan/controller/TmdbScraperController.class index 71e9b66..4bc3d83 100644 Binary files a/wangpan-tmdb-service/target/classes/com/wangpan/controller/TmdbScraperController.class and b/wangpan-tmdb-service/target/classes/com/wangpan/controller/TmdbScraperController.class differ diff --git a/wangpan-tmdb-service/target/classes/com/wangpan/listener/TmdbScheduler$ScrapeTask.class b/wangpan-tmdb-service/target/classes/com/wangpan/listener/TmdbScheduler$ScrapeTask.class index 1d7dd12..37d958c 100644 Binary files a/wangpan-tmdb-service/target/classes/com/wangpan/listener/TmdbScheduler$ScrapeTask.class and b/wangpan-tmdb-service/target/classes/com/wangpan/listener/TmdbScheduler$ScrapeTask.class differ diff --git a/wangpan-tmdb-service/target/classes/com/wangpan/listener/TmdbScheduler.class b/wangpan-tmdb-service/target/classes/com/wangpan/listener/TmdbScheduler.class index 29cbe81..b4e3585 100644 Binary files a/wangpan-tmdb-service/target/classes/com/wangpan/listener/TmdbScheduler.class and b/wangpan-tmdb-service/target/classes/com/wangpan/listener/TmdbScheduler.class differ diff --git a/wangpan-tmdb-service/target/classes/com/wangpan/service/TmdbScraperService.class b/wangpan-tmdb-service/target/classes/com/wangpan/service/TmdbScraperService.class index 4c13811..76bacbb 100644 Binary files a/wangpan-tmdb-service/target/classes/com/wangpan/service/TmdbScraperService.class and b/wangpan-tmdb-service/target/classes/com/wangpan/service/TmdbScraperService.class differ diff --git a/wangpan-tmdb-service/target/wangpan-tmdb-service-1.0-SNAPSHOT.jar b/wangpan-tmdb-service/target/wangpan-tmdb-service-1.0-SNAPSHOT.jar index 4f40daa..953e822 100644 Binary files a/wangpan-tmdb-service/target/wangpan-tmdb-service-1.0-SNAPSHOT.jar and b/wangpan-tmdb-service/target/wangpan-tmdb-service-1.0-SNAPSHOT.jar differ diff --git a/wangpan-tmdb-service/target/wangpan-tmdb-service-1.0-SNAPSHOT.jar.original b/wangpan-tmdb-service/target/wangpan-tmdb-service-1.0-SNAPSHOT.jar.original index c86b4a0..bc3ea05 100644 Binary files a/wangpan-tmdb-service/target/wangpan-tmdb-service-1.0-SNAPSHOT.jar.original and b/wangpan-tmdb-service/target/wangpan-tmdb-service-1.0-SNAPSHOT.jar.original differ diff --git a/wangpan-user-service/target/wangpan-user-service-1.0-SNAPSHOT.jar b/wangpan-user-service/target/wangpan-user-service-1.0-SNAPSHOT.jar index aec84c7..6d8e701 100644 Binary files a/wangpan-user-service/target/wangpan-user-service-1.0-SNAPSHOT.jar and b/wangpan-user-service/target/wangpan-user-service-1.0-SNAPSHOT.jar differ diff --git a/wangpan-user-service/target/wangpan-user-service-1.0-SNAPSHOT.jar.original b/wangpan-user-service/target/wangpan-user-service-1.0-SNAPSHOT.jar.original index c2bda2b..f5f1987 100644 Binary files a/wangpan-user-service/target/wangpan-user-service-1.0-SNAPSHOT.jar.original and b/wangpan-user-service/target/wangpan-user-service-1.0-SNAPSHOT.jar.original differ