当前位置: 首页 > news >正文

几十行代码搞定CRUD:建好实体和菜单,页面自动生成

前面两篇我们讲了怎么3分钟搭一个Blazor后台,以及项目的目录结构。今天讲点更爽的——怎么在写少量代码或不写代码的情况下,把一个新模块的后台页面搞出来。


一、传统方式:写一个模块要多久?

假设你要加一个「产品管理」模块,传统开发流程:

  1. 建数据库表(写SQL)
  2. 写实体类(映射字段)
  3. 写Repository(数据访问)
  4. 写Service(业务逻辑)
  5. 写Controller(API接口)
  6. 写DTO(数据传输对象)
  7. 写前端页面(表格、表单、弹窗)
  8. 写前端API调用(axios、fetch)
  9. 联调、改bug

一套下来,半天过去了。

如果用EasyAdminBlazor呢?


二、EasyAdminBlazor方式:四步搞定

第1步:创建实体类 这一步也可以交给AI生成

Entities/文件夹下新建一个类,继承EntityFull

using EasyAdminBlazor.Attributes;
using FreeSql.DataAnnotations;namespace EasyAdminBlazorDemo.Entities
{/// <summary>/// 产品实体/// </summary>[AutoGenerateClass(Filterable = true)]  // 详细注解可参考:https://www.blazor.zone/table/attribute[Table(Name = "product")]public class Product : EntityFull{/// <summary>/// 产品名称/// </summary>[Column(StringLength = 100)]public string Name { get; set; } = string.Empty;/// <summary>/// 产品价格/// </summary>[Column(Precision = 10, Scale = 2)]public decimal Price { get; set; }/// <summary>/// 产品描述/// </summary>[Column(StringLength = 500)]public string Description { get; set; } = string.Empty;/// <summary>/// 是否上架/// </summary>public bool IsActive { get; set; } = true;/// <summary>/// 排序/// </summary>public int SortCode { get; set; } = 99;}
}

这就完了? 对,数据库表都不用你建,FreeSql会自动同步。

第2步:添加菜单

运行项目,进入后台

找到「系统管理」→「菜单管理」

点击「添加菜单」

填写:

  • 菜单名称:产品管理
  • 菜单类型:选择「增删改查」

点击保存

第3步:一键生成页面

在菜单列表里找到刚加的「产品管理」

点击该行右侧的「配置」按钮

在弹出的窗口里,选择刚才创建的Product实体类

点击「生成 Blazor 代码」

系统会自动在 Components/Admin/ 目录下生成 Product.razor 文件,页面代码已经有了。

第4步:刷新页面

刷新后台,左侧菜单会出现「产品管理」,点进去,一个完整的 CRUD 页面就在眼前了。


三、生成的页面长什么样?

生成的 Product.razor 文件内容大概是这样的:

@page "/Admin/Product"
@attribute [TabItemOption(Text = "产品管理")]<AdminTable TItem="Product" TKey="long"ShowAdvancedSearch="true"ShowImportButton="false" ShowExportButton="true" ShowExtendButtons="true"IsPagination="true" ShowSearch="true" IsMultipleSelect="true"><TableColumns><TableColumn @bind-Field="context.Name" Text="产品名称" Filterable="true" Searchable="true" /><TableColumn @bind-Field="context.Price" Text="价格" /><TableColumn @bind-Field="context.Description" Text="描述" /><TableColumn @bind-Field="context.IsActive" Text="是否上架" /><TableColumn @bind-Field="context.SortCode" Text="排序" /><TableColumn @bind-Field="context.CreatedTime" Text="创建时间" /></TableColumns></AdminTable>

你一行代码都没写,增删改查、分页、排序、筛选、导入、导出,全有了。


四、如果要自定义列怎么办?

两种方式:

方式一:用 [AutoGenerateClass] 注解自动生成

直接在实体类上加 [AutoGenerateClass(Filterable = true)],页面里可以什么都不写:

<AdminTable TItem="Product" TKey="long"ShowImportButton="true"ShowExportButton="true"><!-- 不需要写TableColumn,会自动根据实体属性生成 -->
</AdminTable>

方式二:手动控制列

如果你只想显示部分列,或者自定义列的显示方式,就在 <TableColumns> 里写:

<TableColumns><TableColumn @bind-Field="context.Name" Text="产品名称" /><TableColumn @bind-Field="context.Price" Text="价格"><Template>¥@context.Price.ToString("0.00")</Template></TableColumn><!-- 不想显示的列就不写 -->
</TableColumns>

两种方式混着用也行,灵活性很高。


五、功能清单

一个 AdminTable 组件,自带以下功能:

功能 说明 启用方式
增删改查 自动 默认启用
分页 自动 默认启用
排序 点击表头 默认启用
搜索 全局搜索 ShowSearch="true"
筛选 列筛选 Filterable="true"
导入Excel 批量导入 ShowImportButton="true"
导出Excel 导出当前数据 ShowExportButton="true"
多选 批量操作 IsMultipleSelect="true"

六、效果对比

开发方式 代码量 耗时 需要写API?
传统前后端分离 几百行 半天 ✅ 需要
EasyAdminBlazor 0行 3分钟 ❌ 不需要

你没看错,0行代码,3分钟,一个完整的产品管理模块就上线了。


七、注意事项

  • 实体类须继承 EntityFull:它已经包含了 IdCreatedTimeUpdatedTime 等通用字段
  • [AutoGenerateClass] 注解是可选的:加了这个注解,页面里可以不用写 TableColumn
  • 导入文件大小限制5MB:默认限制,可以在配置里调整
  • 权限自动控制:按钮的显示/隐藏会根据用户的权限自动处理

下一篇预告

《博客后台实战:用AdminBlazor管理文章和专栏》

实体关联怎么做?列表显示关联表的名称怎么配置?筛选器怎么变成下拉框?下一篇统统告诉你。


🔗 文档:https://easyadmim.wang-zhan.com.cn/doc
🔗 源码:https://gitee.com/gudufy/EasyAdminBlazor


EasyAdminBlazor —— 我自己接单的屠龙刀,现在也给你用。

http://www.gsyq.cn/news/1413385.html

相关文章:

  • AI搜索问题求解:从状态空间到A*与博弈搜索的实践指南
  • 从仿真到上板:FPGA频率测量实战避坑指南(含低频信号处理技巧)
  • 从零开始电路设计:核心思路、PCB实战与调试全流程解析
  • Arduino NeoPixel灯带与LED阵列动态彩虹灯效系统全解析
  • 重庆黄金上门回收怎么选?福运来黄金回收免费上门透明公道 - 黄金回收
  • 【独家首发】Gemini多模态输入支持的14种文件类型兼容矩阵(含MIME类型、最大尺寸、OCR预处理要求等11项硬指标)
  • AI Agent支付自动化:从资金执行到凭证生成的一体化架构设计
  • League Akari:5个智能功能让英雄联盟游戏体验更流畅
  • 2026年多场景重型货架厂家top5:聚焦各行业个性化仓储设备适配需求 - 深度智识库
  • 解决Switch手柄问题的实用工具箱:Joy-Con Toolkit使用指南
  • 基于Makey Makey的DIY辅助开关:为运动障碍者打造低成本电脑控制方案
  • 从GitHub到ArcMap工具箱:一次搞懂ArcGIS Editor for OSM插件的完整配置流程
  • AI生成专著新体验!20万字专著一键生成,专业干货轻松掌握!
  • 2026年黄山地区工业氧气供应品牌排行及选型指南:杭州工业气体、杭州工业氧气、杭州氧气、湖州丙烷、湖州二氧化碳选择指南 - 优质品牌商家
  • 基于前景理论的蜜罐防御APT攻击博弈模型与电力CPS安全策略
  • 镇江黄金上门回收哪家强,福运来黄金回收稳居口碑榜首 - 黄金回收
  • 基于Hetzner、Ollama与Tailscale搭建私有云端AI编程助手
  • 硬件工程师效率提升:利用Allegro脚本与Capture CIS实现PCB位号自动重排与批量反标
  • 大连翡翠回收怎么选?2026 年 5 月五大平台实测,帮你远离套路 - 奢侈品回收测评
  • STM32H743的ADC还能这么玩?定时器触发+DMA搬运,构建低CPU占用的数据流
  • Loong密码:对合型轻量级分组密码在物联网安全中的硬件优化设计
  • 从SPI模式0/3到Quad SPI:手把手教你玩转W25Q128JV的几种通信模式
  • 暗黑破坏神2重制版Botty:智能自动化刷宝工具完全指南
  • Gemini赋能安全工程师,自动写PoC脚本,探索Gemini在网络安全领域辅助漏洞验证与POC生成的实战路径
  • Veo广告视频制作避坑指南:92%新手踩过的7个致命错误及实时修复方案
  • 跨境电商从选品到售后全流程自动化可能吗?基于实在Agent与LLM+RPA的端到端落地实战指南
  • 第一次送修劳力士,南京表主可以看看这份 2026 年官方售后检修流程说明 - 亨得利官方维修中心
  • 留样3d打印代加工技术要点与靠谱服务商选型逻辑:食堂3d打印代加工/食堂验收3d打印代加工/优选指南 - 优质品牌商家
  • TCRT5000红外循迹传感器:从光电原理到Arduino机器人实战
  • SSH客户端选型与实践