You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
2.9 KiB
2.9 KiB
模块协议
模块用于业务项目内的代码边界。
模块运行在同一个 Flask 进程内。 它不是独立服务。
适用范围
适合做模块的能力:
- 某个业务项目内部的业务域。
- 需要独立路由、service 和 model 目录的功能。
- 多人并行开发,但共享同一个部署单元和数据库。
不适合做模块的能力:
- 需要被多个项目跨进程复用。
- 有独立数据源。
- 有独立发布节奏。
- 业务项目不应该理解其内部细节。
这类能力应拆成 HTTP JSON 服务。 ERP Gateway 属于服务候选。
注册方式
业务项目在 app.py 传入模块实例:
from iti.applications import create_app
from my_project.modules.example import ExampleModule
app = create_app(modules=[ExampleModule()])
模块可以声明这些阶段:
class ExampleModule:
name = "example"
def init_app(self, app):
...
def register_commands(self, app):
...
def register_routes(self, app):
...
def register_permissions(self, app):
...
def register_menu_seed(self, app):
...
执行顺序固定:
init_appregister_commandsregister_routesregister_permissionsregister_menu_seed
权限声明
模块通过注册表声明权限码:
from iti.modules import ModulePermission, get_module_registry
def register_permissions(self, app):
registry = get_module_registry(app)
registry.register_permission(
ModulePermission(
code="example:item:list",
name="示例列表",
description="查看示例模块数据",
)
)
权限码本身不单独落表。
实际授权仍然来自菜单 auth_code。
菜单 Seed
模块可以声明菜单 seed:
from iti.applications.common.enums import MenuTypeEnum
from iti.modules import ModuleMenuSeed, get_module_registry
def register_menu_seed(self, app):
registry = get_module_registry(app)
registry.register_menu_seed(
ModuleMenuSeed(
id="example-menu-root",
name="Example",
type=MenuTypeEnum.MENU.value,
path="/example",
component="/example/list",
auth_code="example:item:list",
meta={"title": "示例模块", "icon": "carbon:application"},
sort=100,
)
)
执行命令:
flask iti seed system
命令会把模块菜单写入 sys_menu。
默认只绑定到 ADMIN。
边界
模块可以:
- 注册蓝图。
- 注册 CLI 命令。
- 声明权限。
- 声明菜单 seed。
- 使用业务项目自己的 model。
模块不应该:
- 修改框架内部实现。
- 直接导入其它模块内部 model 或 service。
- 自建独立 migration 流。
- 在框架 seed 中写业务数据。
业务 model 仍然集中在业务项目 models/ 下。
整个业务项目只保留一条 migration 流。