api.py 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. # -*- coding: utf-8 -*-
  2. r"""观澜 · 前端 —— **对外公开面**(P5 起:实现已在本模块目录内)。
  3. 用户令 2026-09-22:按模块重构源代码目录,**每模块只许经 `api.py` 被别的模块调用**。
  4. 本模块负责(P5 完成):
  5. * `assets/` —— 工作台单页的前端资源件(app.js / app.css / charts.js / favicon.svg);
  6. * `pages/` —— 页面装配(`shell.html` 外壳、`build.py` 出页、`snapshot.py` 单文件烘焙、`classic.py` 经典页模板);
  7. * `design.py` / `lang.py` / `terms.py` —— 设计系统 CSS 单一来源、双语文案语言包、显示层术语映射;
  8. * `builders/` —— 门户与静态页装配器(CLI 入口仍在 `scripts/`,为兼容壳)。
  9. 旧路径(`src/windscada/ui/*`、`src/windscada/{design,lang,terms}.py`、`scripts/{portal_build,guanlan_portal_*}.py`)
  10. 一律留兼容壳,行为与迁移前逐字节一致。公开名 → 本模块内的实现模块(PEP 562 惰性转发,import 本文件不连带重依赖)。
  11. """
  12. from __future__ import annotations
  13. import importlib
  14. _TARGETS: dict[str, str] = {
  15. 'ui_build': 'app_frontEnd.app_frontEnd_guanlan.pages.build',
  16. 'ui_snapshot': 'app_frontEnd.app_frontEnd_guanlan.pages.snapshot',
  17. 'classic_pages': 'app_frontEnd.app_frontEnd_guanlan.pages.classic',
  18. 'design': 'app_frontEnd.app_frontEnd_guanlan.design',
  19. 'lang': 'app_frontEnd.app_frontEnd_guanlan.lang',
  20. 'terms': 'app_frontEnd.app_frontEnd_guanlan.terms',
  21. 'portal_build': 'app_frontEnd.app_frontEnd_guanlan.builders.portal_build',
  22. 'portal_anchor_fix': 'app_frontEnd.app_frontEnd_guanlan.builders.portal_fix_anchors',
  23. 'portal_claims': 'app_frontEnd.app_frontEnd_guanlan.builders.portal_inject_claims',
  24. # 英文投影层仍在既有路径(数据层投影,归口待裁;P5 未迁)
  25. 'ui_en': 'src.windscada.ui_en',
  26. 'i18n_en': 'src.windscada.i18n_en',
  27. 'cms_ui': 'src.windcms.ui',
  28. }
  29. __all__ = list(_TARGETS)
  30. def __getattr__(name: str):
  31. target = _TARGETS.get(name)
  32. if target is None:
  33. raise AttributeError(
  34. f'{__name__} 未公开 {name!r};公开面见 __all__ —— 模块间调用只许走 api.py'
  35. )
  36. mod = importlib.import_module(target)
  37. globals()[name] = mod
  38. return mod