@ -1,84 +0,0 @@ |
|||
# -*- coding: utf-8 -*- |
|||
"""票05 首轮 FAIL 根因探针(一次性,验证后删):operation/login/batch 日志真实行 + batch/file·download 正确姿势 + publish 被拒原因""" |
|||
import json, urllib.request, urllib.parse, urllib.error, sys, io |
|||
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') |
|||
API = "http://localhost:8080" |
|||
ADMIN = "739564171091247104" |
|||
|
|||
T = json.loads(urllib.request.urlopen(f"{API}/api/auth/debug/token?userId={ADMIN}", timeout=15).read().decode())["data"] |
|||
|
|||
def post(path, data=None): |
|||
req = urllib.request.Request(API + path, urllib.parse.urlencode(data or {}).encode(), method="POST") |
|||
req.add_header("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8") |
|||
req.add_header("Authorization", "Bearer " + T) |
|||
try: |
|||
with urllib.request.urlopen(req, timeout=30) as r: |
|||
return json.loads(r.read().decode()) |
|||
except urllib.error.HTTPError as e: |
|||
return {"code": -1, "message": f"HTTP {e.code}"} |
|||
|
|||
def raw(path, method="GET", data=None, form_pairs=None): |
|||
body = None |
|||
if form_pairs: |
|||
body = urllib.parse.urlencode(form_pairs).encode() |
|||
elif data: |
|||
body = urllib.parse.urlencode(data).encode() |
|||
req = urllib.request.Request(API + path, body, method=method) |
|||
if body: req.add_header("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8") |
|||
req.add_header("Authorization", "Bearer " + T) |
|||
try: |
|||
with urllib.request.urlopen(req, timeout=30) as r: |
|||
b = r.read() |
|||
return {"status": r.status, "len": len(b), "head": b[:120], "magic": b[:2]} |
|||
except urllib.error.HTTPError as e: |
|||
return {"status": e.code, "len": -1, "head": e.read()[:120]} |
|||
|
|||
print("== 1. operation/page 最近 30 行(无筛选,看 opType/operatorName/content 真实值)==") |
|||
d = post("/api/log/operation/page", {"current": 1, "size": 30}) |
|||
for r in (d.get("data") or {}).get("content", [])[:30]: |
|||
print(json.dumps(r, ensure_ascii=False)[:230]) |
|||
|
|||
print("== 2. login/page 最近 15 行(找「退出」行)==") |
|||
d = post("/api/log/login/page", {"current": 1, "size": 15}) |
|||
for r in (d.get("data") or {}).get("content", [])[:15]: |
|||
print(json.dumps(r, ensure_ascii=False)[:230]) |
|||
|
|||
print("== 3. batch/page 最近 5 行(rowId vs fileId)==") |
|||
d = post("/api/log/batch/page", {"current": 1, "size": 5}) |
|||
rows = (d.get("data") or {}).get("content", []) |
|||
for r in rows: |
|||
print(json.dumps(r, ensure_ascii=False)[:230]) |
|||
|
|||
if rows: |
|||
rid = rows[0]["id"] |
|||
print(f"== 4. GET batch/file?id={rid}(传日志行主键)==") |
|||
print(raw(f"/api/log/batch/file?id={rid}")) |
|||
print(f"== 5. POST batch/download ids=[{rid}](单 id)==") |
|||
print(raw("/api/log/batch/download", method="POST", form_pairs=[("ids", str(rid))])) |
|||
if len(rows) >= 2: |
|||
print("== 5b. POST batch/download ids=[两行] ==") |
|||
print(raw("/api/log/batch/download", method="POST", |
|||
form_pairs=[("ids", str(rows[0]["id"])), ("ids", str(rows[1]["id"]))])) |
|||
|
|||
print("== 6. publish 试探(e2d-绑定数规则-probe,部门专用 admin 部门)==") |
|||
d = post("/api/rule/opp-pool-rule/publish", { |
|||
"ruleName": "e2d-绑定数规则-probe", "applyScope": 2, "deptIds": "744841292348915712", |
|||
"isDefault": 0, "allowManualPool": 1, "autoRecycleEnabled": 0, "allowFreeClaim": 1, |
|||
"ruleDesc": "probe 临时"}) |
|||
print(json.dumps(d, ensure_ascii=False)[:400]) |
|||
|
|||
print("== 7. opp-pool-rule/page 最近 20 行(看占用与状态分布)==") |
|||
d = post("/api/rule/opp-pool-rule/page", {"current": 1, "size": 20}) |
|||
for r in (d.get("data") or {}).get("content", [])[:20]: |
|||
print(json.dumps(r, ensure_ascii=False)[:200]) |
|||
|
|||
print("== 8. saveOrUpdate 角色后立即查「修改」行(验证 resolveOpType 顺序 bug)==") |
|||
d = post("/api/roles/saveOrUpdate", {"roleName": "e2d-probe角色-x", "roleCode": "e2d_probe_x", "remark": "probe"}) |
|||
print("saveOrUpdate:", json.dumps(d, ensure_ascii=False)[:120]) |
|||
d = post("/api/log/operation/page", {"current": 1, "size": 5}) |
|||
for r in (d.get("data") or {}).get("content", [])[:5]: |
|||
print(json.dumps(r, ensure_ascii=False)[:200]) |
|||
# 清理 probe 角色 |
|||
d = post("/api/roles/page", {"current": 1, "size": 10, "roleName": "e2d-probe角色-x"}) |
|||
for r in (d.get("data") or {}).get("content", []): |
|||
print("cleanup role:", post("/api/roles/delete", {"id": str(r["id"])}).get("code")) |
|||
|
Before Width: | Height: | Size: 72 KiB After Width: | Height: | Size: 72 KiB |
|
Before Width: | Height: | Size: 76 KiB After Width: | Height: | Size: 77 KiB |
|
Before Width: | Height: | Size: 76 KiB After Width: | Height: | Size: 76 KiB |
|
Before Width: | Height: | Size: 75 KiB After Width: | Height: | Size: 76 KiB |
|
Before Width: | Height: | Size: 69 KiB After Width: | Height: | Size: 76 KiB |
|
Before Width: | Height: | Size: 73 KiB After Width: | Height: | Size: 72 KiB |