feat: 排行榜不再展示任何IP,用户列显示地区(ip2region v4 离线库)+浏览器(UA解析);IP仅后台保存,页面上方显示IP+地区

This commit is contained in:
dsh
2026-08-17 23:10:02 -04:00
parent 780e84e67e
commit d8917a666a
9 changed files with 229 additions and 83 deletions
+11 -7
View File
@@ -14,10 +14,14 @@
快速连接自动加大负载填满 10 秒,慢速连接用小负载同样 10 秒内完成
- ⬆️ **上传测试**: 同样的固定 10 秒自适应策略
- 🏆 **排行榜**: 单表同时展示延迟 / 下载 / 上传,**点击列头动态排序**(再点切换升降序,
延迟默认升序、速度默认降序);测速完成后**自动高亮"我的成绩"**(含真实名次,
localStorage 持久化,刷新页面仍高亮);公网 IP 打码,内网来源 IP 完整标注方便调试
- 🌐 **公网 IP 识别**: 服务器直接识别客户端真实 IP(Caddy `X-Real-IP`),
不依赖任何外部 IP 查询服务;路由器单向伪装/公网直连时即为真实公网 IP
延迟默认升序、速度/时间默认降序);**用户列显示地区 + 浏览器**(离线 ip2region 解析地区、
UA 解析浏览器系统),**不展示任何 IP**;测速完成后**自动高亮"我的成绩"**(含真实名次,
localStorage 持久化,刷新页面仍高亮)
- 🌐 **IP 处理**: 客户端 IP 仅后台保存(数据库),用于地区解析与调试,**不在排行榜展示**;
页面上方徽标显示"你的公网 IP · 地区";服务器直接识别 IP(Caddy `X-Real-IP`),
无外部 IP 查询依赖
- 📍 **地区解析**: 内置 ip2region v4 离线库(`data/ip2region_v4.xdb`11MB),纯本地解析
零外部依赖,加载失败时地区优雅降级为"未知地区"
- 🔒 **Unix socket 监听**: 由 Caddy 反代对外提供 HTTPS,不暴露 TCP 端口
## 项目结构
@@ -107,11 +111,11 @@ speedtest.lmve.net {
| 方法 | 路径 | 说明 |
| --- | --- | --- |
| GET | `/` | 测速页面 |
| GET | `/api/ping` | 延迟探测(返回 `{"pong":true,"ts":...,"client_ip":...}` |
| GET | `/api/ping` | 延迟探测(返回 `{"pong":true,"ts":...,"client_ip":...,"location":...}` |
| GET | `/api/download?size=N` | 下载测速,流式返回 N 字节随机数据(默认 10MB,上限 512MB |
| POST | `/api/upload` | 上传测速,接收请求体并返回 `received/elapsed_s/mbps` |
| POST | `/api/result` | 提交结果 `{latency_ms, jitter_ms, download_mbps, upload_mbps, client_ip?, server_ip?}` |
| GET | `/api/rankings?sort=&order=&include_id=` | 排行榜单表:`sort` ∈ download/upload/latency`order` ∈ asc/desc`include_id` 附加指定记录(真实名次 + `is_mine` |
| POST | `/api/result` | 提交结果 `{latency_ms, jitter_ms, download_mbps, upload_mbps}`IP/UA 由服务器识别) |
| GET | `/api/rankings?sort=&order=&include_id=` | 排行榜单表:`sort` ∈ download/upload/latency/created`order` ∈ asc/desc`include_id` 附加指定记录(真实名次 + `is_mine`;条目含 `location`/`browser`**不含 IP** |
客户端 IP 由服务器直接识别(Caddy 注入的 `X-Real-IP`),前端不调用任何外部 IP 服务;
`client_ip` / `server_ip` 字段为 API 兼容保留(可选)。公网 IP 打码保护隐私;