migrate_camel_admin_front.py 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. # -*- coding: utf-8 -*-
  2. """admin 前端(F:\\shop\\yoshop2.0-admin)字段驼峰迁移。
  3. Java 端平台后台接口出参/入参统一驼峰,前端 PHP 时代的 snake_case 字段需要同步。
  4. 这里按显式映射替换,避免通用正则误伤 import 路径(lazy_use 等)。
  5. .vue 只处理 <template> 与 <script>,跳过 <style>。
  6. """
  7. import re
  8. from pathlib import Path
  9. ROOT = Path(r"F:\shop\yoshop2.0-admin")
  10. SRC = ROOT / "src"
  11. # snake_case -> camelCase(全部是接口字段)
  12. MAP = {
  13. "store_id": "storeId",
  14. "store_name": "storeName",
  15. "create_time": "createTime",
  16. "user_name": "userName",
  17. "admin_user_id": "adminUserId",
  18. "menu_id": "menuId",
  19. "api_id": "apiId",
  20. "parent_id": "parentId",
  21. "is_page": "isPage",
  22. "module_key": "moduleKey",
  23. "action_mark": "actionMark",
  24. "password_confirm": "passwordConfirm",
  25. "current_page": "currentPage",
  26. }
  27. PATTERN = re.compile(r"\b(" + "|".join(sorted(MAP, key=len, reverse=True)) + r")\b")
  28. def repl(m):
  29. return MAP[m.group(1)]
  30. def convert_vue(text):
  31. parts = re.split(r"(<style[^>]*>[\s\S]*?</style>)", text)
  32. out = []
  33. for p in parts:
  34. out.append(p if p.startswith("<style") else PATTERN.sub(repl, p))
  35. return "".join(out)
  36. changed = []
  37. for f in sorted(list(SRC.rglob("*.vue")) + list(SRC.rglob("*.js"))):
  38. text = f.read_text(encoding="utf-8", errors="replace")
  39. new = convert_vue(text) if f.suffix == ".vue" else PATTERN.sub(repl, text)
  40. if new != text:
  41. n = len(PATTERN.findall(text))
  42. f.write_text(new, encoding="utf-8", newline="")
  43. changed.append((str(f.relative_to(ROOT)), n))
  44. print("改动 %d 个文件" % len(changed))
  45. for name, n in sorted(changed, key=lambda x: -x[1]):
  46. print(" %-56s %d 处" % (name, n))