Files
ruoyi-java/doc/公开订单提交功能说明.md
2025-10-21 23:29:35 +08:00

338 lines
7.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 公开订单提交功能说明
## 功能概述
本功能提供了一个公开访问的订单提交页面,允许外部用户无需登录即可提交订单信息。该功能具有以下特点:
1. **公开访问**:无需登录认证,直接访问即可使用
2. **接口限流**防止恶意刷单和攻击每个IP每分钟最多3次请求
3. **详细日志**记录所有提交请求的详细信息包括IP、时间、内容等
4. **简化界面**:去掉历史记录功能,只保留订单提交和清空功能
5. **安全保护**:只允许提交"单"指令,其他指令一律拒绝
## 访问地址
### 前端页面
```
http://your-domain.com/public/order-submit
```
### 后端接口
```
POST /public/order/submit
```
## 使用说明
### 订单格式
用户需要按照以下格式填写订单信息:
```
单:
2025-01-01 001
备注:测试订单
分销标记H-TF
型号ZQD180F-EB200
链接https://item.jd.com/...
下单付款1650
后返金额50
地址张三13800138000上海市浦东新区张江高科技园区...
物流链接https://...
订单号1234567890
下单人:张三
```
### 字段说明
| 字段 | 必填 | 说明 |
|------|------|------|
| 单号 | 是 | 格式YYYY-MM-DD XXX |
| 备注 | 是 | 订单备注信息 |
| 分销标记 | 是 | 分销渠道标识 |
| 型号 | 是 | 商品型号 |
| 链接 | 是 | 商品链接 |
| 下单付款 | 是 | 付款金额(数字) |
| 后返金额 | 是 | 返现金额(数字) |
| 地址 | 是 | 收货地址(含姓名和电话) |
| 物流链接 | 是 | 物流跟踪链接 |
| 订单号 | 是 | 订单编号 |
| 下单人 | 是 | 下单人姓名 |
## 技术实现
### 前端
**文件路径**`d:\code\ruoyi-vue\src\views\public\order-submit\index.vue`
主要功能:
- 订单信息输入框
- 提交和清空按钮
- 响应结果展示
- 使用说明折叠面板
- 警告信息弹窗
### 后端
**控制器**`d:\code\RuoYi-Vue-master\ruoyi-java\ruoyi-admin\src\main\java\com\ruoyi\web\controller\public_\PublicOrderController.java`
主要功能:
- 接收订单提交请求
- 参数验证
- 安全检查(只允许"单"指令)
- 调用订单处理服务
- 详细日志记录
### API接口
**文件路径**`d:\code\ruoyi-vue\src\api\public\order.js`
```javascript
export function submitPublicOrder(data) {
return request({
url: '/public/order/submit',
method: 'post',
data
})
}
```
### 路由配置
**前端路由**`router/index.js`
```javascript
{
path: '/public/order-submit',
component: () => import('@/views/public/order-submit/index'),
hidden: true
}
```
**后端安全配置**`SecurityConfig.java`
```java
.antMatchers("/public/**").permitAll()
```
## 限流策略
### 限流规则
使用 `@RateLimiter` 注解实现限流:
- **限流键**基于IP地址
- **时间窗口**60秒
- **请求次数**3次
- **超限提示**:访问过于频繁,请稍候再试
### 实现原理
基于Redis实现的令牌桶算法
1. 每个IP地址独立计数
2. 在指定时间窗口内统计请求次数
3. 超过限制次数后拒绝请求
4. 时间窗口过期后自动重置计数
## 日志记录
### 日志内容
每次请求都会记录以下信息:
1. **请求信息**
- 客户端IP地址
- User-Agent
- 请求时间
2. **指令信息**
- 指令内容长度
- 指令内容预览前100字符
3. **执行结果**
- 结果条数
- 是否包含警告
- 是否成功
4. **异常信息**(如果发生):
- 异常类型
- 异常消息
- 异常堆栈
### 日志格式
```
======================================
公开订单提交 - 开始
客户端IP: 192.168.1.100
User-Agent: Mozilla/5.0...
请求时间: 2025-01-01 10:00:00
指令内容长度: 256 字符
指令内容预览: 单2025-01-01 001...
开始执行订单指令...
订单指令执行完成
执行结果条数: 1
执行结果[0]: 成功
公开订单提交 - 结束(成功)
======================================
```
## 安全措施
### 1. 指令白名单
只允许以"单:"开头的订单提交指令,其他指令一律拒绝。
```java
if (!trimmedCmd.startsWith("单:") && !trimmedCmd.startsWith("单:") && !trimmedCmd.startsWith("单")) {
return AjaxResult.error("只允许提交订单信息,指令必须以'单:'开头");
}
```
### 2. IP限流
每个IP地址每分钟最多提交3次防止恶意刷单。
### 3. 参数验证
严格验证所有必填字段,缺少任何字段都会拒绝提交。
### 4. 日志审计
记录所有提交请求的详细信息,便于追溯和审计。
### 5. 地址去重
系统会检查24小时内是否有相同地址的订单防止重复提交白名单除外
## 错误处理
### 常见错误
1. **参数为空**
- 错误信息:请输入订单信息
- 解决方法:填写完整的订单信息
2. **指令格式错误**
- 错误信息:只允许提交订单信息,指令必须以'单:'开头
- 解决方法:确保指令以"单:"开头
3. **缺少字段**
- 错误信息:缺少表单字段 单号/下单人/下单价格/...
- 解决方法:补充缺失的字段信息
4. **地址重复**
- 错误信息:此地址已经存在,请勿重复生成订单
- 解决方法:检查地址是否已提交过
5. **访问频繁**
- 错误信息:访问过于频繁,请稍候再试
- 解决方法等待1分钟后再次尝试
## 监控建议
### 1. 日志监控
建议监控以下日志关键字:
- `公开订单提交`:所有提交请求
- `警告`:异常情况
- `拒绝`:被拒绝的请求
- `异常`:系统错误
### 2. 性能监控
建议监控以下指标:
- 每分钟请求数
- 平均响应时间
- 错误率
- 限流触发次数
### 3. 安全监控
建议监控以下行为:
- 高频访问的IP地址
- 频繁触发限流的IP
- 非法指令尝试
- 异常错误模式
## 部署说明
### 前端部署
1. 确保路由配置正确
2. 构建前端项目:`npm run build`
3. 部署到Web服务器
### 后端部署
1. 确保SecurityConfig配置已更新
2. 确保Redis服务正常运行限流依赖Redis
3. 打包后端项目:`mvn clean package`
4. 部署到应用服务器
### 验证部署
1. 访问前端页面:`http://your-domain.com/public/order-submit`
2. 提交测试订单
3. 检查后端日志
4. 验证限流功能快速提交4次第4次应被拒绝
## 维护建议
### 1. 定期清理日志
由于详细日志会产生大量内容,建议:
- 设置日志文件大小限制
- 配置日志自动归档
- 定期清理历史日志
### 2. 调整限流策略
根据实际使用情况,可以调整限流参数:
```java
@RateLimiter(
key = CacheConstants.RATE_LIMIT_KEY,
time = 60, // 时间窗口(秒)
count = 3, // 允许次数
limitType = LimitType.IP
)
```
### 3. 监控异常
建议设置告警规则:
- 错误率超过阈值时告警
- 限流触发频繁时告警
- 系统异常时立即告警
### 4. 备份数据
建议定期备份:
- 订单数据
- 日志文件
- Redis数据
## 常见问题
### Q1: 如何修改限流次数?
A: 修改 `PublicOrderController.java` 中的 `@RateLimiter` 注解参数。
### Q2: 如何查看提交日志?
A: 查看应用日志文件,搜索"公开订单提交"关键字。
### Q3: 如何禁用某个IP的访问
A: 在 Spring Security 配置中添加IP黑名单规则。
### Q4: 页面访问404怎么办
A: 检查前端路由配置和后端安全配置是否正确。
### Q5: 提交报错"访问过于频繁"怎么办?
A: 等待1分钟后再次尝试或联系管理员调整限流策略。
## 联系方式
如有问题或建议,请联系技术支持团队。