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