docs: 更新 dogfood 全链路测试报告

包含 5 个问题(1 Critical、1 High、2 Medium、1 Low),
其中 4 个已修复,1 个为已知限制(antd v5 + React 19 兼容性警告)。
附截图与视频证据。
This commit is contained in:
张翔
2026-05-06 14:18:37 +08:00
parent 5dc53f57cc
commit 41bf87c726
37 changed files with 318 additions and 187 deletions
@@ -0,0 +1,23 @@
# Dogfood Report — Novalon 管理系统
**Date:** 2026-05-04
**Tester:** Zhang Xiang (AI Agent)
**Target URL:** http://localhost:5174
**Scope:** Full application — 前端(5174) → 网关(8080) → 后端(8084)
**Authentication:** admin / Test@123
---
## Summary
| Severity | Count |
|----------|-------|
| P0 — Critical | 0 |
| P1 — High | 0 |
| P2 — Medium | 0 |
| P3 — Low | 0 |
---
## Issues
Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

@@ -0,0 +1,30 @@
#!/bin/bash
TOKEN=$(curl -s http://localhost:8080/api/auth/login -X POST -H 'Content-Type: application/json' -d '{"username":"admin","password":"Test@123"}' | python3 -c "import sys,json; print(json.load(sys.stdin)['token'])")
endpoints=(
"/api/auth/current"
"/api/users"
"/api/users/page?page=0&size=10"
"/api/roles"
"/api/roles/page?page=0&size=10"
"/api/menus"
"/api/menus/tree"
"/api/sys/config"
"/api/sys/config/page?page=0&size=10"
"/api/dict/types"
"/api/dict/data/page?page=0&size=10"
"/api/files"
"/api/files/page?page=0&size=10"
"/api/notice/page?page=0&size=10"
"/api/logs/login/page?page=0&size=10"
"/api/logs/operation/page?page=0&size=10"
"/api/logs/exception/page?page=0&size=10"
"/api/logs/operation/count"
"/api/logs/exception/count"
"/api/permissions"
)
for ep in "${endpoints[@]}"; do
code=$(curl -s -o /dev/null -w '%{http_code}' "http://localhost:8080${ep}" -H "Authorization: Bearer $TOKEN")
echo "${ep}${code}"
done
@@ -0,0 +1,56 @@
#!/bin/bash
TOKEN=$(curl -s http://localhost:8080/api/auth/login -X POST -H 'Content-Type: application/json' -d '{"username":"admin","password":"Test@123"}' | python3 -c "import sys,json; print(json.load(sys.stdin)['token'])")
echo "=== 检查替代API路径 ==="
for ep in \
"/api/config" \
"/api/config?page=0&size=10" \
"/api/notice" \
"/api/auth/me" \
"/api/auth/info" \
"/api/auth/user" \
"/api/auth/profile" \
"/api/login-logs?page=0&size=10" \
"/api/exception-logs?page=0&size=10" \
"/api/dict/data" \
"/api/dict" \
"/api/files?page=0&size=10" \
"/api/notices" \
"/api/notices?page=0&size=10"; do
code=$(curl -s -o /dev/null -w '%{http_code}' "http://localhost:8080${ep}" -H "Authorization: Bearer $TOKEN")
echo "${ep}${code}"
done
echo ""
echo "=== 检查 config 返回格式 ==="
curl -s "http://localhost:8080/api/config" -H "Authorization: Bearer $TOKEN" | python3 -c "
import sys, json
data = json.load(sys.stdin)
if isinstance(data, list):
print(f'列表格式, {len(data)} 条记录')
if data: print('第一条:', json.dumps(data[0], ensure_ascii=False)[:200])
elif isinstance(data, dict):
if 'content' in data:
print(f'分页格式, total={data.get(\"totalElements\")}, content长度={len(data[\"content\"])}')
else:
print('dict格式:', json.dumps(data, ensure_ascii=False)[:200])
"
echo ""
echo "=== 检查 notice 返回格式 ==="
curl -s "http://localhost:8080/api/notice" -H "Authorization: Bearer $TOKEN" | python3 -c "
import sys, json
data = json.load(sys.stdin)
if isinstance(data, list):
print(f'列表格式, {len(data)} 条记录')
elif isinstance(data, dict):
print('dict格式:', json.dumps(data, ensure_ascii=False)[:200])
" 2>&1 || echo "notice API 不存在"
echo ""
echo "=== 检查 auth/current 替代 ==="
for ep in "/api/auth/me" "/api/auth/info" "/api/auth/user" "/api/auth/profile"; do
resp=$(curl -s "http://localhost:8080${ep}" -H "Authorization: Bearer $TOKEN")
code=$(curl -s -o /dev/null -w '%{http_code}' "http://localhost:8080${ep}" -H "Authorization: Bearer $TOKEN")
echo "${ep}${code}: ${resp:0:100}"
done
@@ -0,0 +1,49 @@
#!/bin/bash
echo "=== 通过网关8080测试API端点 ==="
TOKEN=$(curl -s http://localhost:8080/api/auth/login -X POST -H 'Content-Type: application/json' -d '{"username":"admin","password":"Test@123"}' | python3 -c "import sys,json; print(json.load(sys.stdin)['token'])" 2>/dev/null)
if [ -z "$TOKEN" ]; then
echo "ERROR: 无法获取token"
exit 1
fi
echo "Token获取成功"
echo ""
echo "=== 前端API路径 vs 后端实际路径 ==="
declare -A tests
tests=(
["/api/auth/current"]=200
["/api/users/page?page=0&size=10"]=200
["/api/roles/page?page=0&size=10"]=200
["/api/menus"]=200
["/api/sys/config"]=200
["/api/sys/config/page?page=0&size=10"]=200
["/api/dict/types"]=200
["/api/dict/data/page?page=0&size=10"]=200
["/api/files/page?page=0&size=10"]=200
["/api/notice/page?page=0&size=10"]=200
["/api/logs/login/page?page=0&size=10"]=200
["/api/logs/operation/page?page=0&size=10"]=200
["/api/logs/exception/page?page=0&size=10"]=200
["/api/permissions"]=200
)
for ep in "${!tests[@]}"; do
code=$(curl -s -o /dev/null -w '%{http_code}' "http://localhost:8080${ep}" -H "Authorization: Bearer $TOKEN")
expected=${tests[$ep]}
if [ "$code" = "$expected" ]; then
echo "$ep$code"
else
echo "$ep$code (期望 $expected)"
fi
done
echo ""
echo "=== 检查实际可用的替代路径 ==="
for ep in "/api/config" "/api/config?page=0&size=10" "/api/auth/me" "/api/auth/profile" "/api/notices" "/api/notices?page=0&size=10" "/api/login-logs?page=0&size=10" "/api/exception-logs?page=0&size=10"; do
code=$(curl -s -o /dev/null -w '%{http_code}' "http://localhost:8080${ep}" -H "Authorization: Bearer $TOKEN")
echo " $ep$code"
done
@@ -0,0 +1,40 @@
#!/bin/bash
TOKEN=$(curl -s http://localhost:8080/api/auth/login -X POST -H 'Content-Type: application/json' -d '{"username":"admin","password":"Test@123"}' | python3 -c "import sys,json; print(json.load(sys.stdin)['token'])" 2>/dev/null)
echo "Token: OK"
echo ""
echo "=== 前端API路径测试 ==="
for ep in \
"/api/auth/current" \
"/api/users/page?page=0&size=10" \
"/api/roles/page?page=0&size=10" \
"/api/menus" \
"/api/sys/config" \
"/api/sys/config/page?page=0&size=10" \
"/api/dict/types" \
"/api/dict/data/page?page=0&size=10" \
"/api/files/page?page=0&size=10" \
"/api/notice/page?page=0&size=10" \
"/api/logs/login/page?page=0&size=10" \
"/api/logs/operation/page?page=0&size=10" \
"/api/logs/exception/page?page=0&size=10" \
"/api/permissions"; do
code=$(curl -s -o /dev/null -w '%{http_code}' "http://localhost:8080${ep}" -H "Authorization: Bearer $TOKEN")
echo " $ep$code"
done
echo ""
echo "=== 后端实际可用路径 ==="
for ep in \
"/api/config" \
"/api/config?page=0&size=10" \
"/api/notices" \
"/api/notices?page=0&size=10" \
"/api/exception-logs?page=0&size=10" \
"/api/auth/me" \
"/api/auth/profile" \
"/api/auth/info" \
"/api/auth/user"; do
code=$(curl -s -o /dev/null -w '%{http_code}' "http://localhost:8080${ep}" -H "Authorization: Bearer $TOKEN")
echo " $ep$code"
done