verify_web_menu_codes.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #!/usr/bin/env python3
  2. """校验指定用户的 Web menuCodes 是否包含前端侧栏所需的 :list 权限。"""
  3. from __future__ import annotations
  4. import argparse
  5. import os
  6. import sys
  7. from pathlib import Path
  8. from sqlalchemy import create_engine, text
  9. from sqlalchemy.orm import Session
  10. BACKEND_ROOT = Path(__file__).resolve().parents[1]
  11. if str(BACKEND_ROOT) not in sys.path:
  12. sys.path.insert(0, str(BACKEND_ROOT))
  13. TENANT_NO = "shanxia2.0"
  14. # 前端侧栏关键 :list(与 sqxp.ts / pl.ts meta.menuCode 对齐)
  15. REQUIRED_LIST_CODES = [
  16. "crm:clue:list",
  17. "crm:customer:list",
  18. "crm:customerPool:list",
  19. "bx:expenseItem:list",
  20. "db:dashboard:list",
  21. "pl:plan:list",
  22. ]
  23. def main() -> int:
  24. parser = argparse.ArgumentParser()
  25. parser.add_argument("--env-file", default=".env.production")
  26. parser.add_argument("--user-no", default="方金强")
  27. args = parser.parse_args()
  28. if args.env_file:
  29. os.environ["ENV_FILE"] = args.env_file
  30. from dotenv import load_dotenv
  31. path = Path(args.env_file)
  32. if not path.is_absolute():
  33. path = BACKEND_ROOT / path
  34. if path.is_file():
  35. load_dotenv(path, override=True)
  36. from app.core.config import Settings
  37. from app.services.web_auth_roles import iter_user_menu_perm_codes
  38. engine = create_engine(Settings().DATABASE_URL, pool_pre_ping=True)
  39. with Session(engine) as db:
  40. row = db.execute(
  41. text(
  42. """
  43. SELECT id, nick_name FROM sys_user
  44. WHERE tenant_no = :tenant AND user_no = :user_no AND del_flag = 0
  45. LIMIT 1
  46. """
  47. ),
  48. {"tenant": TENANT_NO, "user_no": args.user_no},
  49. ).first()
  50. if not row:
  51. print(f"用户不存在: {args.user_no}")
  52. return 1
  53. uid, nick = str(row[0]), row[1]
  54. codes = iter_user_menu_perm_codes(db, uid, TENANT_NO)
  55. print(f"用户: {args.user_no} ({nick}) id={uid}")
  56. print(f"menuCodes 总数: {len(codes)}")
  57. list_codes = sorted(c for c in codes if c.endswith(":list"))
  58. print(f":list 数量: {len(list_codes)}")
  59. missing = [c for c in REQUIRED_LIST_CODES if c not in codes]
  60. if missing:
  61. print(f"缺少关键 :list ({len(missing)}): {', '.join(missing)}")
  62. return 1
  63. print("关键 :list 均已具备,前端侧栏应可正常展示(需配合最新 web-admin 构建)。")
  64. return 0
  65. if __name__ == "__main__":
  66. raise SystemExit(main())