| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- # -*- coding: utf-8 -*-
- """盘点接口实现进度:对照 API清单.csv 与 Java 控制器的 @RequestMapping。"""
- import csv
- import re
- from pathlib import Path
- from _root import ROOT
- ROOT = Path(str(ROOT))
- CTRL = ROOT / "yoshop-java/src/main/java/cn/yoshop/store/controller"
- # 收集 Java 已实现路由
- implemented = set()
- for f in CTRL.glob("*.java"):
- src = f.read_text(encoding="utf-8")
- base = re.search(r'@RequestMapping\("([^"]+)"\)', src)
- if not base:
- continue
- base = base.group(1)
- # 支持 @RequestMapping("/x") 与 @RequestMapping(value = {"/x", "/y"}) 两种写法
- for m in re.finditer(r'@(?:Get|Post|Request)Mapping\(([^)]*)\)', src):
- for sub in re.findall(r'"([^"]*)"', m.group(1)):
- if sub.startswith("/store/"):
- implemented.add(sub)
- elif sub.startswith("/"):
- implemented.add(base + sub)
- implemented = {p.rstrip("/") for p in implemented}
- def norm(p):
- """统一大小写/下划线:清单里是 list_by_ids,Java 路由是 listByIds"""
- return re.sub(r"[^a-z0-9]", "", p.lower())
- implemented_norm = {norm(p) for p in implemented}
- # 收集 PHP 接口清单(仅 store 模块)
- php = []
- with open(ROOT / "API清单.csv", encoding="utf-8-sig") as fp:
- for row in csv.reader(fp):
- if len(row) < 7 or row[0] != "store":
- continue
- action = row[4].strip()
- if not action:
- continue
- path = row[5].rstrip("/")
- if path not in php:
- php.append(path)
- done, todo = [], []
- for p in php:
- if norm(p) in implemented_norm:
- done.append(p)
- else:
- todo.append(p)
- print("PHP 接口数:", len(php), " Java 已实现:", len(done), " 待实现:", len(todo))
- print("\n待实现清单:")
- for p in todo:
- print(" " + p)
|