feat: 更新公告和链接状态接口,增强参数校验,支持跳转链接最大长度为5000字符,添加异步保存完成图片功能,优化接口文档和数据库结构

This commit is contained in:
yahaozhang
2025-11-03 20:56:34 +08:00
parent f43320138a
commit cadf8d98cb
40 changed files with 3148 additions and 17 deletions

View File

@@ -0,0 +1,252 @@
# 链接状态接口兼容性说明
## 概述
为了解决链接复制粘贴时参数丢失的问题,同时保证向后兼容,系统现在支持两种访问格式:
1. **路径参数格式**(推荐):`/api/link/{code}/status`
2. **查询参数格式**(兼容旧版):`/api/link/status?code={code}`
## 支持的访问方式
### 方式一:路径参数(推荐 ⭐)
**接口:** `GET /api/link/{code}/status`
**示例:**
```bash
curl http://localhost:8080/api/link/ABC12345/status
```
```javascript
// JavaScript
fetch('/api/link/ABC12345/status')
```
**优势:**
- ✅ 复制粘贴时不会丢失参数
- ✅ 符合 RESTful 设计规范
- ✅ URL 结构更清晰
- ✅ 浏览器地址栏直接可见完整路径
---
### 方式二:查询参数(兼容旧版)
**接口:** `GET /api/link/status`
**支持的参数:**
- `code` - 链接编号(推荐)
- `codeNo` - 链接编号(别名)
- `linkId` - 链接数据库ID
**示例:**
```bash
# 使用 code 参数
curl "http://localhost:8080/api/link/status?code=ABC12345"
# 使用 codeNo 参数
curl "http://localhost:8080/api/link/status?codeNo=ABC12345"
# 使用 linkId 参数
curl "http://localhost:8080/api/link/status?linkId=123"
```
```javascript
// JavaScript
fetch('/api/link/status?code=ABC12345')
fetch('/api/link/status?codeNo=ABC12345')
fetch('/api/link/status?linkId=123')
```
**说明:**
- `linkId``code/codeNo` 至少提供一个即可
- 如果同时提供,优先使用 `codeNo`,其次是 `code`
---
## 响应格式
两种方式返回完全相同的数据结构:
```json
{
"status": "NEW",
"machineId": null
}
```
**status 可能的值:**
- `NEW` - 新建
- `USING` - 使用中(前端会显示为 NEW
- `LOGGED_IN` - 已登录
- `COMPLETED` - 已完成
- `REFUNDED` - 已退款
- `EXPIRED` - 已过期
---
## 测试用例
### 测试 1路径参数方式
```bash
# 假设有一个 codeNo 为 ABC12345 的链接
curl http://localhost:8080/api/link/ABC12345/status
```
**期望结果:** 返回链接状态信息
---
### 测试 2查询参数方式code
```bash
curl "http://localhost:8080/api/link/status?code=ABC12345"
```
**期望结果:** 返回与测试1相同的结果
---
### 测试 3查询参数方式codeNo
```bash
curl "http://localhost:8080/api/link/status?codeNo=ABC12345"
```
**期望结果:** 返回与测试1相同的结果
---
### 测试 4查询参数方式linkId
```bash
# 假设链接的数据库 ID 为 123
curl "http://localhost:8080/api/link/status?linkId=123"
```
**期望结果:** 返回链接状态信息
---
### 测试 5错误处理
```bash
# 不存在的链接
curl http://localhost:8080/api/link/INVALID/status
# 空参数
curl "http://localhost:8080/api/link/status?code="
# 缺少参数
curl "http://localhost:8080/api/link/status"
```
**期望结果:** 返回错误信息
---
## 迁移建议
### 对于新开发的前端
**推荐使用路径参数格式:**
```javascript
const codeNo = 'ABC12345';
const response = await fetch(`/api/link/${codeNo}/status`);
```
### 对于现有系统
**无需修改,查询参数格式继续有效:**
```javascript
// 继续使用旧格式
const response = await fetch(`/api/link/status?code=${codeNo}`);
```
### 渐进式迁移
可以逐步将旧代码迁移到新格式:
```javascript
// 旧代码
async function getLinkStatus_Old(codeNo) {
return fetch(`/api/link/status?code=${codeNo}`);
}
// 新代码(推荐)
async function getLinkStatus_New(codeNo) {
return fetch(`/api/link/${codeNo}/status`);
}
```
---
## 后端实现说明
### Controller 方法
系统提供了两个独立的 Controller 方法:
1. **getUserLinkStatusByPath** - 处理路径参数请求
- 路由:`GET /api/link/{code}/status`
- 参数:`@PathVariable String code`
2. **getUserLinkStatusByQuery** - 处理查询参数请求
- 路由:`GET /api/link/status`
- 参数:`@RequestParam Long linkId`, `@RequestParam String codeNo`, `@RequestParam String code`
### 日志区分
两个方法使用不同的日志标识,便于问题排查:
- 路径参数:`=== 用户端获取链接状态(路径参数) ===`
- 查询参数:`=== 用户端获取链接状态(查询参数,兼容模式) ===`
---
## 兼容性保证
- ✅ 两种格式返回完全相同的数据结构
- ✅ 旧链接继续有效,无需修改
- ✅ 新生成的链接推荐使用路径参数格式
- ✅ 系统会长期维护两种格式的支持
- ✅ 不会影响现有功能和性能
---
## 常见问题
### Q1: 为什么推荐使用路径参数格式?
**A:** 路径参数格式的优势:
1. 复制粘贴 URL 时不会丢失参数(查询参数容易在 `?` 后被截断)
2. 符合 RESTful API 设计规范
3. URL 更清晰,更容易阅读和理解
4. 浏览器地址栏显示更完整
### Q2: 旧链接会失效吗?
**A:** 不会。查询参数格式会长期保持支持,确保兼容性。
### Q3: 能否混合使用两种格式?
**A:** 可以。同一个应用中可以同时使用两种格式,系统都会正确处理。
### Q4: 性能上有区别吗?
**A:** 没有。两种格式调用相同的底层服务方法,性能完全一致。
### Q5: 如何在 Swagger/OpenAPI 中查看?
**A:** Swagger UI 会显示两个独立的接口:
- `GET /api/link/{code}/status` - 推荐格式
- `GET /api/link/status` - 兼容格式
---
## 更新日志
- **2025-10-21**:添加路径参数格式支持,同时保留查询参数格式兼容性
- 旧的查询参数格式标记为"兼容模式",推荐新项目使用路径参数格式