# from pathlib import Path
# from importlib import import_module
#
# # 存储所有控制器名称，用于对外暴露
# __all__ = []
# _controller_cache = {}  # 缓存已导入的控制器
#
# # 获取当前包的根目录（controllers/）
# current_dir = Path(__file__).parent
#
# # 递归查找所有非下划线开头的Python文件（排除__init__.py）
# for py_file in current_dir.rglob("*.py"):
#     # 跳过以下划线开头的文件（如__init__.py、_private.py）
#     if py_file.name.startswith("_"):
#         continue
#
#     # 1. 计算模块的相对路径（处理子目录）
#     # 例如：admin/role.py -> 相对路径为 admin/role
#     relative_path = py_file.relative_to(current_dir)
#     # 转换为模块格式（路径分隔符替换为.）：admin.role
#     module_path = ".".join(relative_path.with_suffix("").parts)
#
#     try:
#         # 2. 动态导入模块
#         module = import_module(f".{module_path}", package=__name__)
#
#         # 3. 拼接控制器名称（模块名 + _controller）
#         # 例如：模块admin.role -> 控制器名 role_controller
#         # 取最后一级模块名作为前缀（role.py -> role）
#         module_basename = relative_path.stem  # stem 是不带后缀的文件名
#         controller_name = f"{module_basename}_controller"
#
#         # 4. 检查模块中是否存在该控制器
#         if hasattr(module, controller_name):
#             # 将控制器绑定到当前包的命名空间
#             globals()[controller_name] = getattr(module, controller_name)
#             # 添加到__all__，允许外部通过from ... import *导入
#             _controller_cache[controller_name] = getattr(module, controller_name)
#             __all__.append(controller_name)
#
#     except ImportError as e:
#         print(f"Failed to import module {module_path}: {e}")
#     except Exception as e:
#         print(f"Error processing {py_file}: {e}")
#
#
# # 定义__getattr__，让编辑器知道可以通过名称获取控制器
# def __getattr__(name: str):
#     if name in _controller_cache:
#         return _controller_cache[name]
#     raise AttributeError(f"Module {__name__!r} has no attribute {name!r}")
