CrudGenerator 代码生成器

crud

💡 偷懒技巧:用 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)配置

  • 外键属性自动检测关联实体
  • 可选择在列表中显示关联实体名称
  • 编辑方式可选:下拉框 / 弹框选择

关系配置

配置项 说明
导航属性 集合导航属性名(如 AlbumsMenus
类型 一对多(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/ 目录下,子目录由路由路径决定。