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 @@
| logoData | String | 否 | 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 @@
| updateTime | String | 更新时间 |
+
+
成功响应示例
+
{
+ "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 @@
| updateTime | String | 更新时间 |
+
+
成功响应示例
+
{
+ "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 @@
| logoData | String | 否 | 新的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
-
+
+
+
+
成功响应示例
+
{
+ "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 @@
| parentId | 0 | 父文件夹 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 @@
| updateTime | String | 更新时间 |
+
+
成功响应示例
+
{
+ "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 @@
| parentId | Long | 否 | 父文件夹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 @@
| pageSize | Integer | 每页条数 |
+
+
成功响应示例
+
{
+ "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 @@
| updateTime | String | 更新时间 |
+
+
成功响应示例
+
{
+ "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 无效 |
- | 500 | Icon 不存在或无权访问 |
-
+
失败响应示例 — Icon 不存在
+
{
+ "code": 404,
+ "message": "Icon 不存在或无权访问",
+ "data": null
+}
+
+
+
失败响应示例 — 未登录
+
{
+ "code": 401,
+ "message": "未登录或 Token 无效",
+ "data": null
+}
@@ -1635,13 +2347,36 @@
}
-
错误码
-
- | code | 说明 |
- | 400 | 文件为空/格式不支持/超过 1MB |
- | 401 | 未登录或 Token 无效 |
- | 500 | Icon 不存在或无权访问/上传失败 |
-
+
失败响应示例 — 文件为空
+
{
+ "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
-
+
+
+
功能说明
+
查询单部电影的完整详情信息,包括基本信息、海报、评分等。
+
+
+
+
成功响应示例
+
{
+ "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
-
+
+
+
+
+
成功响应示例
+
{
+ "code": 200,
+ "message": "删除成功",
+ "data": null
+}
+
+
+
失败响应示例 — 电影不存在
+
{
+ "code": 404,
+ "message": "电影不存在",
+ "data": null
+}
+
+
+
失败响应示例 — 未登录或 Token 无效
+
{
+ "code": 401,
+ "message": "未登录或 Token 已过期",
+ "data": null
+}
+
+
@@ -1990,10 +2911,40 @@
批量删除电影需Token
+
+
+
成功响应示例
+
{
+ "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 @@
| logoData | String | 否 | 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 @@
| updateTime | String | 更新时间 |
+
+
成功响应示例
+
{
+ "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 @@
| updateTime | String | 更新时间 |
+
+
成功响应示例
+
{
+ "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 @@
| logoData | String | 否 | 新的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
-
+
+
+
+
成功响应示例
+
{
+ "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 @@
| parentId | 0 | 父文件夹 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 @@
| updateTime | String | 更新时间 |
+
+
成功响应示例
+
{
+ "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 @@
| parentId | Long | 否 | 父文件夹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 @@
| pageSize | Integer | 每页条数 |
+
+
成功响应示例
+
{
+ "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 @@
| updateTime | String | 更新时间 |
+
+
成功响应示例
+
{
+ "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 无效 |
- | 500 | Icon 不存在或无权访问 |
-
+
失败响应示例 — Icon 不存在
+
{
+ "code": 404,
+ "message": "Icon 不存在或无权访问",
+ "data": null
+}
+
+
+
失败响应示例 — 未登录
+
{
+ "code": 401,
+ "message": "未登录或 Token 无效",
+ "data": null
+}
@@ -1635,13 +2347,36 @@
}
-
错误码
-
- | code | 说明 |
- | 400 | 文件为空/格式不支持/超过 1MB |
- | 401 | 未登录或 Token 无效 |
- | 500 | Icon 不存在或无权访问/上传失败 |
-
+
失败响应示例 — 文件为空
+
{
+ "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
-
+
+
+
功能说明
+
查询单部电影的完整详情信息,包括基本信息、海报、评分等。
+
+
+
+
成功响应示例
+
{
+ "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
-
+
+
+
+
+
成功响应示例
+
{
+ "code": 200,
+ "message": "删除成功",
+ "data": null
+}
+
+
+
失败响应示例 — 电影不存在
+
{
+ "code": 404,
+ "message": "电影不存在",
+ "data": null
+}
+
+
+
失败响应示例 — 未登录或 Token 无效
+
{
+ "code": 401,
+ "message": "未登录或 Token 已过期",
+ "data": null
+}
+
+
@@ -1990,10 +2911,40 @@
批量删除电影需Token
+
+
+
成功响应示例
+
{
+ "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