Files
djangoadmin-wiki/DjangoAdmin_Django_AntdVue/zh/volume5/demo.md
T
2026-09-12 23:12:15 +08:00

322 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
:::tip 本章概要
以 `django_example` 演示表为完整案例,演示从建表到生成到使用的全流程。
:::
# 实战案例
以 `django_example` 演示表为完整案例,演示从建表到生成到使用的全流程。该表对应项目中的 `application/example/` 模块。
## 第 1 步:创建数据表
在数据库中执行建表语句:
```sql
CREATE TABLE `django_example` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL COMMENT '案例名称',
`avatar` varchar(255) DEFAULT NULL COMMENT '案例图片',
`type` int DEFAULT 1 COMMENT '案例类型:1-类型1 2-类型2 3-类型3 4-类型4',
`status` int DEFAULT 1 COMMENT '案例状态:1-正常 2-禁用',
`sort` int DEFAULT 0 COMMENT '排序',
`create_user` varchar(50) DEFAULT NULL,
`create_time` datetime DEFAULT NULL,
`update_user` varchar(50) DEFAULT NULL,
`update_time` datetime DEFAULT NULL,
`is_delete` int DEFAULT 0,
PRIMARY KEY (`id`),
KEY `idx_name` (`name`)
) COMMENT='案例表';
```
## 第 2 步:预览配置
```bash
python generator.py django_example --dry-run
```
输出:
```
==============================================================
数据库表结构解析和代码生成工具
==============================================================
正在解析表: django_example
表结构解析成功
------------------------------------------------------------
生成配置摘要:
------------------------------------------------------------
应用名称: example
模块名称: 案例
模型类名: Example
字段数量: 5
是否有排序: True
是否有状态: True
是否有图片: True
是否有富文本: False
字段列表:
- name: 案例名称 (CharField)
- avatar: 案例图片 (CharField)
- type: 案例类型:1-类型1 2-类型2 3-类型3 4-类型4 (IntegerField)
选项: [(1, '类型1'), (2, '类型2'), (3, '类型3'), (4, '类型4')]
- status: 案例状态:1-正常 2-禁用 (IntegerField)
选项: [(1, '正常'), (2, '禁用')]
- sort: 排序 (IntegerField)
==============================================================
预览模式 - 不执行代码生成
==============================================================
```
## 第 3 步:生成代码
```bash
python generator.py django_example
```
输出:
```
==============================================================
数据库表结构解析和代码生成工具
==============================================================
正在解析表: django_example
表结构解析成功
...
创建输出目录: application/example
生成文件: application/example/models.py
生成文件: application/example/forms.py
生成文件: application/example/services.py
生成文件: application/example/views.py
生成文件: application/example/urls.py
生成文件: application/example/apps.py
生成文件: application/example/admin.py
生成文件: ui/src/views/tool/example/index.vue
生成文件: ui/src/views/tool/example/edit.vue
生成文件: ui/src/views/tool/example/detail.vue
生成文件: ui/src/views/tool/example/querySchemas.ts
生成文件: ui/src/views/tool/example/columns.ts
生成文件: ui/src/api/tool/example.ts
已添加应用: application.example
已添加路由: path('example/', include('application.example.urls'))
主菜单创建成功,ID: xxx
创建权限节点: 查询案例分页
创建权限节点: 查询案例列表
...
菜单权限节点创建完成!共创建 8 个权限节点
代码生成完成!
```
## 第 4 步:验证生成结果
### 检查后端文件
```bash
ls application/example/
# __init__.py models.py forms.py services.py views.py urls.py apps.py admin.py migrations/
```
### 检查前端文件
```bash
ls ui/src/views/tool/example/
# index.vue edit.vue detail.vue columns.ts querySchemas.ts
ls ui/src/api/tool/example.ts
# example.ts
```
### 检查路由注册
在 `application/urls.py` 中应新增:
```python
# 案例模块路由
path('example/', include('application.example.urls')),
```
### 检查应用注册
在 `application/settings.py` 的 `INSTALLED_APPS` 中应新增:
```python
'application.example', # 案例管理
```
## 第 5 步:重启后端
```bash
python manage.py runserver
```
## 第 6 步:访问页面
1. 登录管理后台
2. 左侧菜单找到「开发工具 -> 案例」
3. 进入案例管理页面,测试增删改查功能
## 生成代码逐文件解析
### models.py
```python
class Example(BaseModel):
name = models.CharField(
null=False, max_length=100, db_index=True,
verbose_name="案例名称", db_comment='案例名称'
)
avatar = models.CharField(
null=True, blank=True, max_length=255,
verbose_name="案例图片", db_comment='案例图片'
)
TYPE_CHOICES = ((1, "类型1"), (2, "类型2"), (3, "类型3"), (4, "类型4"))
type = models.IntegerField(
null=False, choices=TYPE_CHOICES,
verbose_name="案例类型:1-类型1 2-类型2 3-类型3 4-类型4",
db_comment='案例类型:1-类型1 2-类型2 3-类型3 4-类型4'
)
STATUS_CHOICES = ((1, "正常"), (2, "禁用"))
status = models.IntegerField(
null=False, choices=STATUS_CHOICES,
verbose_name="案例状态:1-正常 2-禁用",
db_comment='案例状态:1-正常 2-禁用'
)
sort = models.IntegerField(null=False, verbose_name="排序", db_comment='排序')
class Meta:
db_table = get_table_name('example')
db_table_comment = "案例表"
ordering = ("sort",)
```
- 继承 `BaseModel`,自动拥有 id/create_user/create_time/update_user/update_time/is_delete 字段
- 自动映射字段类型(varchar->CharField, int->IntegerField)
- 自动识别 `avatar` 为图片字段
- 自动解析注释中的选项生成 `TYPE_CHOICES` 和 `STATUS_CHOICES`
- `db_comment` 参数用于 Django 4.1+ 自动添加数据库字段注释
### forms.py
```python
class ExampleForm(forms.ModelForm):
name = forms.CharField(
required=True, max_length=100,
error_messages={'required': '案例名称不能为空', 'max_length': '案例名称长度不得超过100个字符'}
)
avatar = forms.CharField(required=False, max_length=255)
type = forms.IntegerField(
required=True, min_value=1, max_value=4,
error_messages={'required': '案例类型不能为空'}
)
status = forms.IntegerField(
required=True, min_value=1, max_value=2,
error_messages={'required': '案例状态不能为空'}
)
sort = forms.IntegerField(required=True)
class Meta:
model = models.Example
fields = ['name', 'avatar', 'type', 'status', 'sort']
```
- 继承 `forms.ModelForm`,自动绑定模型
- 中文 `error_messages` 提供友好的验证提示
- `min_value`/`max_value` 限制取值范围
### services.py
```python
def get_example_page(request):
page_no = int(request.GET.get('pageNo', 1))
page_size = int(request.GET.get('pageSize', PAGE_SIZE))
query = Example.objects.filter(is_delete=False)
query = _apply_filters(query, request)
query = query.order_by("sort")
paginator = Paginator(query, page_size)
page_list = paginator.page(page_no)
return R.ok(data=_build_page_data(page_list, paginator, page_no, page_size))
def add_example(request):
data, error = parse_request_body(request)
form = forms.ExampleForm(data)
if not form.is_valid():
return R.failed(msg=regular.get_err(form))
Example.objects.create(...)
return R.ok(msg="创建成功")
```
- 所有查询过滤 `is_delete=False`
- 使用 Django `Paginator` 分页
- `parse_request_body` 解析请求体
- 表单验证在 ORM 操作之前
### views.py
```python
@method_decorator(check_login, name="get")
class ExamplePageView(PermissionRequired, View):
permission_required = ("sys:example:page",)
@operation_log(title="案例管理-查询分页列表", log_type=LogType.QUERY)
def get(self, request):
return services.get_example_page(request)
@method_decorator(check_login, name="post")
class ExampleAddView(PermissionRequired, View):
permission_required = ("sys:example:add",)
@operation_log(title="案例管理-添加记录", log_type=LogType.ADD)
def post(self, request):
if DJANGO_DEMO:
return R.failed("演示环境,暂无操作权限")
return services.add_example(request)
```
- `@method_decorator(check_login)` 验证 JWT 登录
- `PermissionRequired` 检查权限节点
- `@operation_log` 记录操作日志
- 写操作检查 `DJANGO_DEMO` 演示模式
## 树状表示例
当表中包含 `parent_id` 或 `pid` 字段时,生成器自动切换为树状模板。
```sql
CREATE TABLE `django_category` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL COMMENT '分类名称',
`parent_id` int DEFAULT 0 COMMENT '父级ID(0为顶级)',
`sort` int DEFAULT 0 COMMENT '排序',
`status` int DEFAULT 1 COMMENT '状态:1-正常 2-禁用',
`create_user` varchar(50) DEFAULT NULL,
`create_time` datetime DEFAULT NULL,
`update_user` varchar(50) DEFAULT NULL,
`update_time` datetime DEFAULT NULL,
`is_delete` int DEFAULT 0,
PRIMARY KEY (`id`)
) COMMENT='分类表';
```
生成器自动:
1. **前端模板切换**:使用 `ui2/` 树形模板替代 `ui/` 普通列表模板
2. **数据加载方式**:全量加载 + 前端 `buildTree` 构建树形结构
## 生成后的自定义
代码生成后,通常需要根据业务需求进行微调:
| 自定义项 | 涉及文件 | 说明 |
|:----|:----|:----|
| 添加业务校验 | `forms.py` | 添加自定义验证方法 `clean_xxx` |
| 添加删除前检查 | `services.py` | 在 `delete_xxx` 中检查关联数据 |
| 添加创建前处理 | `services.py` | 在 `add_xxx` 中处理特殊字段(如密码哈希) |
| 修改序列化 | `services.py` | 修改 `_build_page_data` 中的字段映射 |
| 添加自定义接口 | `views.py` + `urls.py` | 新增视图类和路由 |
| 调整前端布局 | `index.vue` | 修改表格列宽、操作按钮等 |
| 调整表单校验 | `edit.vue` | 修改表单规则、默认值等 |
## 总结
通过以上 6 步即可完成一个完整业务模块的生成:建表 -> 预览 -> 生成 -> 验证 -> 重启 -> 使用。整个过程约 1 分钟,生成约 12 个文件,涵盖后端 MVC + 前端页面 + 路由注册 + 菜单权限。生成后根据业务需求进行微调即可投入使用。