CrudGenerator 代码生成器

💡 偷懒技巧:用 AI 生成实体类
开始之前如果还没有实体类,可以让 AI 代劳:
我需要一个产品表,有名称、价格、库存、分类ID(关联分类表),分类ID是外键。使用 Freesql 实体特性,实体类继承 EntityFull,加上必要的特性(Table、Column、DisplayName、Navigate)。
AI 会给你完整的实体类代码,直接复制到项目里就行。详细示例可以看《开始一个新模块》文档。
概述
CrudGenerator 是一个可视化的代码生成器,选个实体类型,配置下列和关系,就能自动生成基于 AdminTable 组件的 CRUD 页面,少写好多重复代码。
访问路径:/Admin/CrudGenerator
功能特性
- 自动扫描项目中的
IEntity<>实体,选了就能用 - 可视化配置列表列(显示、筛选、搜索、编辑列宽)
- 自动识别 ManyToOne 导航属性(外键→关联实体),支持下拉框或弹框选择
- 自动识别 OneToMany / ManyToMany 集合导航属性,支持 IncludeMany 加载或子表编辑
- 枚举类型自动区分
[Flags](用 MultiSelect)和普通枚举(用 Select) bool/bool?自动对应 Switch / NullSwitch- 支持草稿保存 (
EnableDraft)、保存不关闭 (EnableSaveWithoutClose) 等特性 - 可以单独生成编辑模板组件文件
- 生成菜单并自动创建增删改按钮
- 代码预览,所见即所得
- 配置自动存浏览器 localStorage,下次进来不用重新设
参数配置
基础设置
| 配置项 | 说明 |
|---|---|
| 实体类型 | 选择要生成 CRUD 的实体,自动扫描 IEntity<> 及有 [Table] 特性的类 |
| 分页大小 | 每页显示记录数 |
| 编辑弹框 | 编辑弹框的尺寸(Large / ExtraLarge / 全屏等) |
| 路由路径 | 生成页面的路由,如 /Admin/MyEntity |
| 搜索 | 是否显示简单搜索框 |
| 高级搜索 | 是否显示高级搜索按钮 |
| 扩展按钮 | 是否显示扩展按钮区域 |
| 导入 | 是否显示导入按钮 |
| 导出 | 是否显示导出按钮 |
| 多选 | 是否启用表格多选 |
| 草稿保存 | 是否启用草稿自动保存功能 |
| 保存不关闭 | 是否启用保存后不关闭弹框 |
| 允许新增/编辑/删除 | 控制增删改按钮的显隐 |
| 生成菜单 | 保存代码时自动在菜单表创建菜单项(含添加/编辑/删除按钮) |
| 单独生成编辑组件 | 勾选后主页面引用独立编辑组件文件,否则内联编辑模板 |
列配置
| 配置项 | 说明 |
|---|---|
| 属性 | 实体属性名 |
| 类型 | 属性的 C# 类型 |
| 显示名称 | 列表和编辑模板中显示的文本 |
| 显示 | 是否在表格列表中显示该列 |
| 筛选 | 是否启用列头筛选 |
| 搜索 | 是否启用文本搜索(仅 string 类型可用) |
| 编辑列宽 | 编辑弹框中该字段的列宽(单行/2列/3列/4列) |
多对一(ManyToOne)配置:
- 外键属性自动检测关联实体
- 可选择在列表中显示关联实体名称
- 编辑方式可选:下拉框 / 弹框选择
关系配置
| 配置项 | 说明 |
|---|---|
| 导航属性 | 集合导航属性名(如 Albums、Menus) |
| 类型 | 一对多(OneToMany)或多对多(ManyToMany) |
| 关联实体 | 关联的实体类型 |
| 显示名称 | 在编辑 Tab 中显示的标题 |
| 编辑方式 | 不开启 / IncludeMany 加载 / 子表编辑 |
子表编辑:勾选后在编辑弹框中添加 Tab,以可编辑表格展示子集合数据,支持增删行。可自定义每列的显示文本。
生成代码
合并模式(默认)
所有代码生成在一个 Entity.razor 文件里,EditTemplate 内嵌:
@page "/Admin/MyEntity"
<AdminTable TItem="MyEntity" TKey="long" ...>
<TableColumns>
...
</TableColumns>
<EditTemplate>
<!-- 内联编辑模板 -->
</EditTemplate>
</AdminTable>
@code { ... }
分离模式(勾选"单独生成编辑组件")
会生成两个文件:
Entity.razor:主页面,引用编辑组件EntityEditTemplate.razor:编辑模板组件
@* Entity.razor *@
<AdminTable ...>
...
<EditTemplate>
<EntityEditTemplate Model="context" />
</EditTemplate>
</AdminTable>
@* EntityEditTemplate.razor *@
@inject CommonLocalizer CommonLocalizer
...
@code {
[Parameter]
[NotNull]
public MyEntity? Model { get; set; }
}
子表编辑生成的代码
对于配置为"子表编辑"的集合导航属性,生成可编辑表格:
<TabItem Text="ExternalLinks">
<table class="table table-sm">
<tr>
<th><button @onclick="e => Model.ExternalLinks.Add(new())">+</button></th>
<th>Text</th>
<th>Link</th>
</tr>
@foreach (var item in Model.ExternalLinks)
{
<tr>
<th><button @onclick="e => Model.ExternalLinks.Remove(item)">🗑</button></th>
<td><input @bind="item.Text" /></td>
<td><input @bind="item.Link" /></td>
</tr>
}
</table>
</TabItem>
类型映射规则
| 实体属性类型 | 表格列 | 编辑模板组件 |
|---|---|---|
string |
<TableColumn Filterable Searchable> |
<BootstrapInput> |
int / long / decimal |
<TableColumn Filterable> |
<BootstrapInput type="number"> |
bool |
<TableColumn Filterable> |
<Switch> |
bool? |
<TableColumn Filterable> |
<NullSwitch> |
DateTime |
<TableColumn Filterable> |
<DateTimePicker> |
[Flags] 枚举 |
<MultiSelect> 列筛选 |
<MultiSelect> |
| 普通枚举 | <TableColumn Filterable Searchable> |
<Select> |
| ManyToOne 外键 | 显示关联实体名称 + 筛选 | <AdminSelectEntity> |
| OneToMany/ManyToMany 集合 | — | 子表编辑 / IncludeMany |
配置持久化
每次切换实体时,当前列配置、关系配置、基础设置自动保存到浏览器 localStorage(key 为 CrudGen_{实体全名})。下次选择同一实体时自动恢复全部配置,无需重复设置。
保存位置
生成的文件保存在当前运行项目的 Components/ 目录下,子目录由路由路径决定。