签入版本
This commit is contained in:
@@ -0,0 +1,187 @@
|
||||
# 示例模块(Example)
|
||||
|
||||
:::tip 说明
|
||||
`src/modules/example/` 是一个完整的示例模块,演示了标准 CRUD 模块的六文件结构和开发模式。开发者可以此为模板快速创建新业务模块。
|
||||
:::
|
||||
|
||||
## 文件结构
|
||||
|
||||
```
|
||||
src/modules/example/
|
||||
├── __init__.py # 模块声明
|
||||
├── models.py # 数据模型
|
||||
├── schemas.py # 参数验证
|
||||
├── repository.py # 数据访问层
|
||||
├── service.py # 业务逻辑层
|
||||
└── handlers.py # 请求处理器
|
||||
```
|
||||
|
||||
## 各文件说明
|
||||
|
||||
### models.py — 数据模型
|
||||
|
||||
```python
|
||||
from sqlalchemy import Column, String, Integer, text
|
||||
from core.base_model import BaseModel
|
||||
|
||||
class Example(BaseModel):
|
||||
"""示例模型"""
|
||||
__tablename__ = "example"
|
||||
__table_args__ = {"comment": "示例表"}
|
||||
|
||||
name = Column(String(255), nullable=False, comment="名称")
|
||||
status = Column(Integer, default=0, server_default=text("0"), comment="状态")
|
||||
sort = Column(Integer, default=0, server_default=text("0"), comment="排序")
|
||||
```
|
||||
|
||||
### schemas.py — 参数验证
|
||||
|
||||
```python
|
||||
from pydantic import Field
|
||||
from core.base_schema import BaseSchema, BaseStatusSchema
|
||||
|
||||
class ExampleSchema(BaseSchema):
|
||||
"""示例表单"""
|
||||
name: str = Field(..., min_length=1, max_length=150, description="名称")
|
||||
status: int = Field(default=0, ge=0, le=1, description="状态")
|
||||
sort: int = Field(default=0, ge=0, le=99999, description="排序")
|
||||
|
||||
class ExampleStatusSchema(BaseStatusSchema):
|
||||
"""状态更新表单"""
|
||||
pass
|
||||
```
|
||||
|
||||
### repository.py — 数据访问层
|
||||
|
||||
```python
|
||||
from core.base_repository import BaseRepository
|
||||
from modules.example.models import Example
|
||||
|
||||
class ExampleRepository(BaseRepository):
|
||||
"""示例数据仓库"""
|
||||
model = Example
|
||||
```
|
||||
|
||||
### service.py — 业务逻辑层
|
||||
|
||||
```python
|
||||
from core.base_service import BaseService
|
||||
from modules.example.models import Example
|
||||
from modules.example.repository import ExampleRepository
|
||||
from modules.example.schemas import ExampleSchema, ExampleStatusSchema
|
||||
|
||||
class ExampleService(BaseService):
|
||||
"""示例服务"""
|
||||
model = Example
|
||||
repo_cls = ExampleRepository
|
||||
create_schema = ExampleSchema
|
||||
update_schema = ExampleSchema
|
||||
status_schema = ExampleStatusSchema
|
||||
page_like_fields = ("name",)
|
||||
page_eq_fields = ("status",)
|
||||
page_order_by = (("sort", "asc"),)
|
||||
|
||||
example_service = ExampleService()
|
||||
```
|
||||
|
||||
### handlers.py — 请求处理器
|
||||
|
||||
```python
|
||||
from common.middleware.access_decorators import check_demo, permission_required
|
||||
from common.middleware.operation_log import operation_log
|
||||
from core import response as R
|
||||
from core.base_handler import BaseHandler
|
||||
from modules.example.service import example_service
|
||||
|
||||
class ExamplePageHandler(BaseHandler):
|
||||
@permission_required("sys:example:list")
|
||||
async def get(self):
|
||||
return await example_service.get_page(self)
|
||||
|
||||
class ExampleDetailHandler(BaseHandler):
|
||||
@permission_required("sys:example:detail")
|
||||
async def get(self, id):
|
||||
return R.ok(self, data=example_service.get_detail(id))
|
||||
|
||||
class ExampleAddHandler(BaseHandler):
|
||||
@permission_required("sys:example:add")
|
||||
@check_demo
|
||||
@operation_log("示例管理", "添加")
|
||||
async def post(self):
|
||||
return await example_service.add(self)
|
||||
|
||||
class ExampleUpdateHandler(BaseHandler):
|
||||
@permission_required("sys:example:update")
|
||||
@check_demo
|
||||
@operation_log("示例管理", "更新")
|
||||
async def put(self):
|
||||
return await example_service.update(self)
|
||||
|
||||
class ExampleDeleteHandler(BaseHandler):
|
||||
@permission_required("sys:example:delete")
|
||||
@check_demo
|
||||
@operation_log("示例管理", "删除")
|
||||
async def delete(self, id):
|
||||
return await example_service.delete(self, id)
|
||||
|
||||
class ExampleStatusHandler(BaseHandler):
|
||||
@permission_required("sys:example:status")
|
||||
@check_demo
|
||||
@operation_log("示例管理", "设置状态")
|
||||
async def put(self):
|
||||
return await example_service.update_status(self)
|
||||
|
||||
class ExampleBatchDeleteHandler(BaseHandler):
|
||||
@permission_required("sys:example:delete")
|
||||
@check_demo
|
||||
@operation_log("示例管理", "批量删除")
|
||||
async def post(self):
|
||||
return await example_service.batch_delete(self)
|
||||
```
|
||||
|
||||
## 路由注册
|
||||
|
||||
```python
|
||||
# src/api/v1/example.py
|
||||
from modules.example.handlers import (
|
||||
ExamplePageHandler, ExampleDetailHandler, ExampleAddHandler,
|
||||
ExampleUpdateHandler, ExampleDeleteHandler, ExampleStatusHandler,
|
||||
ExampleBatchDeleteHandler,
|
||||
)
|
||||
|
||||
routes = [
|
||||
(r"/example/page", ExamplePageHandler),
|
||||
(r"/example/detail/(\d+)", ExampleDetailHandler),
|
||||
(r"/example/add", ExampleAddHandler),
|
||||
(r"/example/update", ExampleUpdateHandler),
|
||||
(r"/example/delete/(\d+)", ExampleDeleteHandler),
|
||||
(r"/example/status", ExampleStatusHandler),
|
||||
(r"/example/batchDelete", ExampleBatchDeleteHandler),
|
||||
]
|
||||
```
|
||||
|
||||
```python
|
||||
# src/api/v1/router.py — 在 _RESOURCE_MODULES 中追加
|
||||
from api.v1 import example
|
||||
_RESOURCE_MODULES = [..., example]
|
||||
```
|
||||
|
||||
## 开发新模块的步骤
|
||||
|
||||
基于 Example 模块创建新模块的流程:
|
||||
|
||||
```
|
||||
1. 复制 src/modules/example/ 为新目录
|
||||
2. 修改 models.py 中的表名和字段
|
||||
3. 修改 schemas.py 中的表单验证
|
||||
4. 修改 repository.py 中的 model 引用
|
||||
5. 修改 service.py 中的配置项
|
||||
6. 修改 handlers.py 中的权限字符串和日志描述
|
||||
7. 复制 src/api/v1/example.py 为新路由文件
|
||||
8. 在 router.py 中注册新路由
|
||||
9. 在菜单管理中配置权限节点
|
||||
```
|
||||
|
||||
## 总结
|
||||
|
||||
Example 模块是标准 CRUD 模块的参考实现,包含 models → schemas → repository → service → handlers → 路由六层结构。开发新模块时以此为模板,修改差异点即可快速完成。
|
||||
Reference in New Issue
Block a user