- Base URL:
http://localhost:8080 - 认证方式: Bearer Token
- 请求头:
Authorization: Bearer {token}
- URL:
/user/code - 方法:
GET - 需要Token: ❌ 否
- 参数:
email(query): 邮箱地址
请求示例:
GET /user/code?email=test@example.com
响应示例:
{
"code": 200,
"message": "发送成功",
"data": null
}- URL:
/user/register - 方法:
POST - 需要Token: ❌ 否
- Content-Type:
application/json
请求示例:
{
"email": "test@example.com",
"password": "123456",
"name": "张三",
"code": "123456"
}响应示例:
{
"code": 200,
"message": "success",
"data": {
"id": 1,
"email": "test@example.com",
"name": "张三",
"avatar": null,
"phone": null,
"created": "2025-10-11T10:00:00",
"updated": "2025-10-11T10:00:00"
}
}- URL:
/user/login - 方法:
POST - 需要Token: ❌ 否
- Content-Type:
application/json
请求示例:
{
"email": "test@example.com",
"password": "123456"
}响应示例:
{
"code": 200,
"message": "success",
"data": {
"id": 1,
"name": "张三",
"email": "test@example.com",
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
}- URL:
/user/logout - 方法:
POST - 需要Token: ✅ 是
请求示例:
POST /user/logout
Authorization: Bearer {token}
响应示例:
{
"code": 200,
"message": "登出成功",
"data": null
}- URL:
/user/me - 方法:
GET - 需要Token: ✅ 是
请求示例:
GET /user/me
Authorization: Bearer {token}
响应示例:
{
"code": 200,
"message": "success",
"data": {
"id": 1,
"name": "张三",
"email": "test@example.com",
"phone": "13800138000",
"avatar": "http://localhost:8080/uploads/2025/10/11/xxx.jpg"
}
}- URL:
/user/me - 方法:
PUT - 需要Token: ✅ 是
- Content-Type:
application/json
请求示例:
{
"name": "李四",
"avatar": "http://localhost:8080/uploads/2025/10/11/xxx.jpg",
"phone": "13800138000"
}响应示例:
{
"code": 200,
"message": "修改成功",
"data": {
"id": 1,
"name": "李四",
"email": "test@example.com",
"phone": "13800138000",
"avatar": "http://localhost:8080/uploads/2025/10/11/xxx.jpg"
}
}- URL:
/user/info - 方法:
GET - 需要Token: ✅ 是
- 参数:
id(query): 用户ID
请求示例:
GET /user/info?id=1
Authorization: Bearer {token}
响应示例:
{
"code": 200,
"message": "success",
"data": {
"id": 1,
"name": "张三",
"email": "test@example.com",
"phone": "13800138000",
"avatar": "http://localhost:8080/uploads/2025/10/11/xxx.jpg"
}
}- URL:
/user/ - 方法:
GET - 需要Token: ✅ 是
请求示例:
GET /user/
Authorization: Bearer {token}
响应示例:
{
"code": 200,
"message": "success",
"data": [
{
"id": 1,
"email": "test@example.com",
"name": "张三",
"avatar": "http://localhost:8080/uploads/2025/10/11/xxx.jpg",
"phone": "13800138000"
}
]
}- URL:
/item - 方法:
POST - 需要Token: ✅ 是
- Content-Type:
application/json
请求示例:
{
"title": "丢失黑色钱包",
"description": "黑色皮质钱包,内有身份证和银行卡",
"location": "图书馆三楼",
"time": "2025-10-10T14:30:00",
"imgUrl": "http://localhost:8080/uploads/2025/10/11/xxx.jpg",
"status": "LOST"
}字段说明:
status: 状态,可选值:LOST: 丢失FOUND: 拾到
响应示例:
{
"code": 200,
"message": "发布成功",
"data": {
"id": 1,
"title": "丢失黑色钱包",
"description": "黑色皮质钱包,内有身份证和银行卡",
"imgUrl": "http://localhost:8080/uploads/2025/10/11/xxx.jpg",
"time": "2025-10-10T14:30:00",
"location": "图书馆三楼",
"status": "LOST",
"createdAt": "2025-10-11T10:00:00",
"updatedAt": "2025-10-11T10:00:00"
}
}- URL:
/item - 方法:
PUT - 需要Token: ✅ 是
- Content-Type:
application/json - 权限: 只能修改自己发布的信息
请求示例:
{
"id": 1,
"title": "更新后的标题",
"description": "更新后的描述",
"location": "更新后的位置",
"time": "2025-10-10T15:00:00",
"imgUrl": "http://localhost:8080/uploads/2025/10/11/new.jpg"
}响应示例:
{
"code": 200,
"message": "修改成功",
"data": {
"id": 1,
"title": "更新后的标题",
"description": "更新后的描述",
"imgUrl": "http://localhost:8080/uploads/2025/10/11/new.jpg",
"time": "2025-10-10T15:00:00",
"location": "更新后的位置",
"status": "LOST",
"publisherId": 1,
"publisherName": "张三",
"finderId": null,
"finderName": null,
"createdAt": "2025-10-11T10:00:00",
"updatedAt": "2025-10-11T11:00:00"
}
}- URL:
/item/{id}/returned - 方法:
PUT - 需要Token: ✅ 是
- 参数:
id(path): 失物IDfinderId(query, 可选): 找到者用户ID
- 权限: 只有发布者可以操作
请求示例:
PUT /item/1/returned?finderId=2
Authorization: Bearer {token}
响应示例:
{
"code": 200,
"message": "已标记为归还",
"data": null
}- URL:
/item/{id}/done - 方法:
PUT - 需要Token: ✅ 是
- 参数:
id(path): 失物ID
- 权限: 只有发布者可以操作
请求示例:
PUT /item/1/done
Authorization: Bearer {token}
响应示例:
{
"code": 200,
"message": "已标记为完成",
"data": null
}- URL:
/item/{id} - 方法:
DELETE - 需要Token: ✅ 是
- 参数:
id(path): 失物ID
- 权限: 只能删除自己发布的信息
请求示例:
DELETE /item/1
Authorization: Bearer {token}
响应示例:
{
"code": 200,
"message": "删除成功",
"data": null
}- URL:
/item/search - 方法:
GET - 需要Token: ❌ 否
- 参数:
status(query, 可选): 状态筛选 (LOST/FOUND/RETURNED/WasDone)location(query, 可选): 位置模糊搜索keyword(query, 可选): 关键词搜索(标题和描述)startTime(query, 可选): 开始时间 (格式: yyyy-MM-dd HH:mm:ss)endTime(query, 可选): 结束时间 (格式: yyyy-MM-dd HH:mm:ss)page(query, 可选): 页码,默认0size(query, 可选): 每页大小,默认10
请求示例:
GET /item/search?status=LOST&location=图书馆&keyword=钱包&page=0&size=10
响应示例:
{
"code": 200,
"message": "success",
"data": {
"content": [
{
"id": 1,
"title": "丢失黑色钱包",
"description": "黑色皮质钱包,内有身份证和银行卡",
"imgUrl": "http://localhost:8080/uploads/2025/10/11/xxx.jpg",
"time": "2025-10-10T14:30:00",
"location": "图书馆三楼",
"status": "LOST",
"publisherId": 1,
"publisherName": "张三",
"finderId": null,
"finderName": null,
"createdAt": "2025-10-11T10:00:00",
"updatedAt": "2025-10-11T10:00:00"
}
],
"page": 0,
"size": 10,
"total": 1,
"totalPages": 1
}
}- URL:
/item/my - 方法:
GET - 需要Token: ✅ 是
- 参数:
page(query, 可选): 页码,默认0size(query, 可选): 每页大小,默认10
请求示例:
GET /item/my?page=0&size=10
Authorization: Bearer {token}
响应示例:
{
"code": 200,
"message": "success",
"data": {
"content": [
{
"id": 1,
"title": "丢失黑色钱包",
"description": "黑色皮质钱包",
"imgUrl": "http://localhost:8080/uploads/2025/10/11/xxx.jpg",
"time": "2025-10-10T14:30:00",
"location": "图书馆三楼",
"status": "LOST",
"publisherId": 1,
"publisherName": "张三",
"finderId": null,
"finderName": null,
"createdAt": "2025-10-11T10:00:00",
"updatedAt": "2025-10-11T10:00:00"
}
],
"page": 0,
"size": 10,
"total": 1,
"totalPages": 1
}
}- URL:
/item/{id} - 方法:
GET - 需要Token: ❌ 否
- 参数:
id(path): 失物ID
请求示例:
GET /item/1
响应示例:
{
"code": 200,
"message": "success",
"data": {
"id": 1,
"title": "丢失黑色钱包",
"description": "黑色皮质钱包,内有身份证和银行卡",
"imgUrl": "http://localhost:8080/uploads/2025/10/11/xxx.jpg",
"time": "2025-10-10T14:30:00",
"location": "图书馆三楼",
"status": "LOST",
"publisherId": 1,
"publisherName": "张三",
"finderId": null,
"finderName": null,
"createdAt": "2025-10-11T10:00:00",
"updatedAt": "2025-10-11T10:00:00"
}
}- URL:
/file/upload - 方法:
POST - 需要Token: ✅ 是
- Content-Type:
multipart/form-data - 参数:
file(form-data): 图片文件
支持格式: jpg, jpeg, png, gif, bmp, webp
文件大小限制: 10MB
请求示例 (使用 Postman):
POST /file/upload
Authorization: Bearer {token}
Content-Type: multipart/form-data
Body (form-data):
key: file
type: File
value: [选择图片文件]
响应示例:
{
"code": 200,
"message": "上传成功",
"data": {
"url": "http://localhost:8080/uploads/2025/10/11/uuid.jpg"
}
}- URL:
/file/upload/multiple - 方法:
POST - 需要Token: ✅ 是
- Content-Type:
multipart/form-data - 参数:
files(form-data): 多个图片文件
请求示例 (使用 Postman):
POST /file/upload/multiple
Authorization: Bearer {token}
Content-Type: multipart/form-data
Body (form-data):
key: files
type: File
value: [选择多个图片文件]
响应示例:
{
"code": 200,
"message": "上传成功",
"data": {
"url": "http://localhost:8080/uploads/2025/10/11/uuid1.jpg,http://localhost:8080/uploads/2025/10/11/uuid2.jpg"
}
}- URL:
/file/delete - 方法:
DELETE - 需要Token: ✅ 是
- 参数:
url(query): 图片URL
请求示例:
DELETE /file/delete?url=http://localhost:8080/uploads/2025/10/11/uuid.jpg
Authorization: Bearer {token}
响应示例:
{
"code": 200,
"message": "删除成功",
"data": null
}| 状态码 | 说明 |
|---|---|
| 200 | 成功 |
| 400 | 请求参数错误 |
| 401 | 未登录或登录已过期 |
| 403 | 权限不足 |
| 404 | 资源不存在 |
| 409 | 资源冲突(如邮箱已注册) |
| 500 | 服务器内部错误 |
| 状态 | 说明 |
|---|---|
| LOST | 丢失 |
| FOUND | 拾到 |
| RETURNED | 已归还 |
| WasDone | 已完成 |
1. GET /user/code?email=test@example.com (发送验证码)
2. POST /user/register (注册)
3. POST /user/login (登录,获取token)
1. POST /file/upload (上传图片,获取URL)
2. POST /item (使用URL发布失物)
1. POST /file/upload (上传头像,获取URL)
2. PUT /user/me (使用URL更新头像)
1. PUT /item/{id}/returned?finderId=2 (标记为已归还)
2. PUT /item/{id}/done (标记为已完成)
- URL:
/message - 方法:
POST - 需要Token: ✅ 是
- Content-Type:
application/json
请求示例:
{
"receiverId": 2,
"type": "TEXT",
"content": "你好,请问你的钱包找到了吗?"
}字段说明:
receiverId: 接收者用户IDtype: 消息类型,可选值:TEXT: 文本消息IMAGE: 图片消息
content: 消息内容(文本内容或图片URL)
响应示例:
{
"code": 200,
"message": "发送成功",
"data": {
"id": 1,
"senderId": 1,
"senderName": "张三",
"senderAvatar": "http://localhost:8080/uploads/xxx.jpg",
"receiverId": 2,
"receiverName": "李四",
"receiverAvatar": "http://localhost:8080/uploads/yyy.jpg",
"type": "TEXT",
"content": "你好,请问你的钱包找到了吗?",
"isRead": false,
"createdAt": "2025-10-13T15:30:00"
}
}- URL:
/message/conversation/{otherUserId} - 方法:
GET - 需要Token: ✅ 是
- 参数:
otherUserId(path): 对方用户IDpage(query, 可选): 页码,默认0size(query, 可选): 每页大小,默认20
请求示例:
GET /message/conversation/2?page=0&size=20
Authorization: Bearer {token}
响应示例:
{
"code": 200,
"message": "success",
"data": {
"content": [
{
"id": 1,
"senderId": 1,
"senderName": "张三",
"senderAvatar": "http://localhost:8080/uploads/xxx.jpg",
"receiverId": 2,
"receiverName": "李四",
"receiverAvatar": "http://localhost:8080/uploads/yyy.jpg",
"type": "TEXT",
"content": "你好",
"isRead": true,
"createdAt": "2025-10-13T15:30:00"
}
],
"page": 0,
"size": 20,
"total": 10,
"totalPages": 1
}
}- URL:
/message/read/{otherUserId} - 方法:
PUT - 需要Token: ✅ 是
- 参数:
otherUserId(path): 对方用户ID
请求示例:
PUT /message/read/2
Authorization: Bearer {token}
响应示例:
{
"code": 200,
"message": "已标记为已读",
"data": null
}- URL:
/message/conversations - 方法:
GET - 需要Token: ✅ 是
请求示例:
GET /message/conversations
Authorization: Bearer {token}
响应示例:
{
"code": 200,
"message": "success",
"data": [
{
"id": 1,
"otherUserId": 2,
"otherUserName": "李四",
"otherUserAvatar": "http://localhost:8080/uploads/xxx.jpg",
"lastMessage": "你好,请问你的钱包找到了吗?",
"unreadCount": 3,
"updatedAt": "2025-10-13T15:30:00"
}
]
}- URL:
/message/unread-count - 方法:
GET - 需要Token: ✅ 是
请求示例:
GET /message/unread-count
Authorization: Bearer {token}
响应示例:
{
"code": 200,
"message": "success",
"data": 5
}- 连接地址:
ws://localhost:8080/ws/message?token={token} - 需要Token: ✅ 是(通过URL参数传递)
- 协议: WebSocket
连接示例:
const token = "your_jwt_token";
const ws = new WebSocket(`ws://localhost:8080/ws/message?token=${token}`);
ws.onopen = function() {
console.log('WebSocket 连接成功');
// 连接成功后会自动推送离线消息
};
ws.onmessage = function(event) {
const message = JSON.parse(event.data);
console.log('收到消息:', message);
};{
"id": 1,
"senderId": 1,
"senderName": "张三",
"senderAvatar": "http://localhost:8080/uploads/xxx.jpg",
"receiverId": 2,
"receiverName": "李四",
"receiverAvatar": "http://localhost:8080/uploads/yyy.jpg",
"type": "TEXT",
"content": "你好",
"isRead": false,
"createdAt": "2025-10-13T15:30:00"
}{
"count": 5,
"message": "离线消息推送完成",
"type": "OFFLINE_MESSAGE_NOTIFICATION"
}- 发送:
ping - 响应:
pong
// 发送心跳包
ws.send('ping');
// 收到心跳响应
ws.onmessage = function(event) {
if (event.data === 'pong') {
console.log('心跳正常');
}
};1. 用户登录获取 Token
2. 连接 WebSocket (可选,用于实时推送)
3. POST /message 发送消息
4. 接收者实时收到推送 (如果在线)
1. POST /file/upload 上传图片获取 URL
2. POST /message 发送图片消息 (type=IMAGE, content=图片URL)
3. 接收者收到图片消息
1. 用户A给离线的用户B发消息
2. 消息保存到数据库,标记为未读
3. 用户B上线连接 WebSocket
4. 系统自动推送所有未读消息
5. 推送完成后发送通知
1. GET /message/conversations 获取会话列表
2. 点击会话 → GET /message/conversation/{userId} 加载聊天记录
3. PUT /message/read/{userId} 标记为已读
4. 发送新消息 → 会话列表自动更新
- URL:
/file/upload - 方法:
POST - 需要Token: ✅ 是
- Content-Type:
multipart/form-data - 参数:
file(form-data): 图片文件
支持格式: jpg, jpeg, png, gif, bmp, webp
文件大小限制: 10MB
请求示例 (使用 Postman):
POST /file/upload
Authorization: Bearer {token}
Content-Type: multipart/form-data
Body (form-data):
key: file
type: File
value: [选择图片文件]
响应示例:
{
"code": 200,
"message": "上传成功",
"data": {
"url": "http://localhost:8080/uploads/2025/10/13/uuid.jpg"
}
}- URL:
/file/upload/multiple - 方法:
POST - 需要Token: ✅ 是
- Content-Type:
multipart/form-data - 参数:
files(form-data): 多个图片文件
请求示例 (使用 Postman):
POST /file/upload/multiple
Authorization: Bearer {token}
Content-Type: multipart/form-data
Body (form-data):
key: files
type: File
value: [选择多个图片文件]
响应示例:
{
"code": 200,
"message": "上传成功",
"data": {
"url": "http://localhost:8080/uploads/2025/10/13/uuid1.jpg,http://localhost:8080/uploads/2025/10/13/uuid2.jpg"
}
}- URL:
/file/delete - 方法:
DELETE - 需要Token: ✅ 是
- 参数:
url(query): 图片URL
请求示例:
DELETE /file/delete?url=http://localhost:8080/uploads/2025/10/13/uuid.jpg
Authorization: Bearer {token}
响应示例:
{
"code": 200,
"message": "删除成功",
"data": null
}| 状态码 | 说明 |
|---|---|
| 200 | 成功 |
| 400 | 请求参数错误 |
| 401 | 未登录或登录已过期 |
| 403 | 权限不足 |
| 404 | 资源不存在 |
| 409 | 资源冲突(如邮箱已注册) |
| 500 | 服务器内部错误 |
| 类型 | 说明 | content 字段内容 |
|---|---|---|
| TEXT | 文本消息 | 文本内容 |
| IMAGE | 图片消息 | 图片完整URL |
| 状态 | 说明 |
|---|---|
| LOST | 丢失 |
| FOUND | 拾到 |
| RETURNED | 已归还 |
| WasDone | 已完成 |
1. GET /user/code?email=test@example.com (发送验证码)
2. POST /user/register (注册)
3. POST /user/login (登录,获取token)
1. POST /file/upload (上传图片,获取URL)
2. POST /item (使用URL发布失物)
1. POST /file/upload (上传头像,获取URL)
2. PUT /user/me (使用URL更新头像)
1. PUT /item/{id}/returned?finderId=2 (标记为已归还)
2. PUT /item/{id}/done (标记为已完成)
1. 用户A登录 → POST /user/login
2. 用户A连接WebSocket → ws://localhost:8080/ws/message?token=xxx
3. 用户A发送消息 → POST /message
4. 用户B上线连接WebSocket → 自动收到离线消息
5. 用户B查看会话 → GET /message/conversations
6. 用户B回复消息 → POST /message
7. 实时聊天通过WebSocket推送
- Token 使用: 需要 Token 的接口必须在请求头中携带
Authorization: Bearer {token} - WebSocket 连接: Token 通过 URL 参数传递:
?token={token} - 文件上传: 建议使用 Postman 或前端表单进行测试
- 图片 URL: 上传成功后返回的 URL 包含完整的服务器地址,可直接使用
- 时间格式: 使用 ISO 8601 格式:
yyyy-MM-ddTHH:mm:ss - 分页: 页码从 0 开始
- 权限控制: 只能修改/删除自己发布的信息,只能查看自己的聊天记录
- 跨域支持: 已配置 CORS,支持跨域访问
- 离线消息: 用户上线时自动推送未读消息
- 心跳检测: WebSocket 支持 ping/pong 心跳检测
- HTTP 接口测试: 使用项目根目录的
test.http文件 - WebSocket 测试: 使用
websocket-test.html页面进行完整聊天测试 - WebSocket 调试: 使用
websocket-debug.html页面进行连接调试
文档版本: v2.0
最后更新: 2025-10-13