如何用一行代码快速构建AntdUI风格的WinForm后台框架?

摘要:前言 在快速迭代的软件开发环境中,如何高效地开发一个功能完整、界面美观的 WinForm 管理系统,是许多开发者面临的现实问题。今天推荐一款基于 Ant Design 设计语言的 WinForm UI 框架,它通过深度封装和现代化设计,彻底
前言 在快速迭代的软件开发环境中,如何高效地开发一个功能完整、界面美观的 WinForm 管理系统,是许多开发者面临的现实问题。今天推荐一款基于 Ant Design 设计语言的 WinForm UI 框架,它通过深度封装和现代化设计,彻底改变了传统 WinForm 应用的开发模式。大家无需再为繁琐的基础设施代码所困扰,只需聚焦核心业务逻辑,能够用极简的方式快速搭建企业级桌面应用。 项目介绍 WenAntdUI 项目的主要模块及其对应的功能说明,涵盖了从示例测试到核心应用的各个组成部分,便于大家了解项目结构和功能分布。 项目结构具体如表所示: 内部运行集成:一行代码搞定一个完整的管理系统基础功能 项目功能 AOT发布:支持AOT(Ahead-of-Time)编译发布,提升应用性能。 字典管理:提供增删改查功能,方便管理系统中的各类字典数据。 用户管理:支持用户的增删改查、角色分配和密码重置。 菜单管理:实现菜单的增删改查,支持自定义页面控件和样式。 权限管理:精细的权限控制,确保系统的安全性。 用户设置:允许用户更改密码和修改图像,图像存储在SQL中。 项目说明 初次运行与登录 首次运行WenAntdUI时,它会自动初始化一个Sqlite数据库,并在运行目录下创建data.db文件。可以使用默认的登录账户admin和密码admin快速进入系统,开始体验各项功能。 集成启动方式 应用WenAntdUI,可以使用顶级语句: App.Run(); // 只需要此代码即可启动一个项目 // services 主要是注入服务,将项目控件注入到服务中。 App.Run(services => { services.AddControlServices(Assembly.GetExecutingAssembly()); }); // AddControlServices 内部封装了Control注入功能,只需要传递程序集即可 // 很多开发项目,需要使用注册机功能,也只需要在 App.Run修改,即可拥有一个完整的注册机功能,硬件信息生成唯一注册码 App.Run(services => { services.AddControlServices(Assembly.GetExecutingAssembly()); }, true); // 此处增加参数 加密解密 加密解密KEY请自行生成替换 Wen.Core.Helps AesRsaHelp 中的内容: public static string RsaFromPem { get; set; } = @"-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxot7LoZAVHZDhlGE8e6/ WqTmgmGZhVepofQhhynB/jTA69lMXoKfcXJMr/8Zyfdug97re7NkJX8Jei4cJlEv nyzNRrY1tz1+dkrISYi0nBkwaDMTd2Wsw63QjcqZl1yCTVT6jboNR/0a7hyb2gwt 5cXW2ylgVZ6PttOUPXb3ZF8oWLe1BVWfcQXFIlErqVjsY3iFgcNxCucvYhiDzcbm qHFIbUj9760E666Ws3Io32OQK1EkkdufqNuL1gm9/9qYXE0KChGzetnFfhtOGmvK cPp3os07zdeeFOdKbwCbZjUxSy2a/6IKvEWilONNPNSMBxcc70oci565CtrIdyah IQIDAQAB -----END PUBLIC KEY-----"; public static string AesKey = "u4GP+xHwd3slNDYCVeOvDpbe0eLJz7XpaEj46SA9EtM="; public static string AesIv = "8Daxh29YSAjUBulFYoMhdw=="; 功能集成 内部集成了枚举、字典等样式识别,全局采用注入方式。Page控件可以使用注入方式,直接调用: [Description("角色管理")] // 此处为菜单选择注释 public partial class SysRolePage : UserControl { private readonly IFreeSql fsql; private readonly MenuService menuService; public SysRolePage(IFreeSql fsql, MenuService menuService) { this.fsql = fsql; this.menuService = menuService; InitializeComponent(); this.adminTable1.SetColumns<SysRole>(); this.adminTable1.Query(); InitMenuItem(); this.adminTable1.CellClick += AdminTable1_CellClick; } } AdminTable 封装控件 AdminTable 只需要一行代码即可实现一个表的增删改查。 this.adminTable1.SetColumns<SysRole>(); [Index($"index_{nameof(SysRole)}_{nameof(RoleName)}", nameof(RoleName), true)] public class SysRole { /// <summary> /// 获得/设置 角色名称 /// </summary> [DisplayName("角色名称")] [Col] // 自动编辑功能,需要在属性上面加上 Col 特性 [Key] public string? RoleName { get; set; } /// <summary> /// 获得/设置 角色描述 /// </summary> [DisplayName("角色描述")] [Col] public string? Description { get; set; } } 1、自定义构建列 this.adminTable1.SetColumn<SysMenuDto>() .Add(a => a.Name, 288, c => c.SetTree(nameof(SysMenuDto.Childs))) .Add(a => a.Code) .Add(a => a.ParentCode) .Add(a => a.OrderNo) .Add(a => a.IconImage) .Add(a => a.MenuType) .Add(a => a.Description) .Add(a => a.ControlType); 2、查询数据 this.adminTable1.QueryData = async e => { e.IsExpand = true; return await fsql.Select<SysMenuDto>() .WhereIf(!string.IsNullOrWhiteSpace(e.QueryText), a => a.Name.Contains(e.QueryText)) .ToTreeList(); }; this.adminTable1.Query(); // 手动执行查询 字典管理 支持增删改查操作。 菜单管理 支持增删改查、页面控件、自定义样式。开发中无需考虑 new,可以使用注入方式,在构造函数中使用: public partial class UserControlTestTable : UserControl { public UserControlTestTable(IFreeSql fsq1) { InitializeComponent(); adminTable1.SetColumns<SysDict>(); } } // 需要提前注入,若是采用插件方式开发,此处可以调用外部插件直接注入dll文件 App.Run(services => { services.AddControlServices(Assembly.GetExecutingAssembly()); }, true); 完成注入后即可在菜单中选中使用。 角色管理 支持增删改查及权限分配。 用户管理 支持增删改查、角色分配、密码重置。 用户信息设置 支持更改密码、修改图像,图像存储在SQL中。 封装组件演示 1、前后端分离增删改查 2、图像选择组件 3、字典选择组件 4、上传功能集成组件 5、下载功能集成组件 6、Model编辑组件 7、双向绑定 8、Auth组件(按钮权限) 注意:前后分离通用查询方式虽然方便,但出于安全考虑,不集成在 AdminTable。若需要使用,只要替换增删改查代码即可。 1、查询数据 需要提供类型、搜索内容、页码、单页数: var client = new ApiClient(); var res = await client.GetListAsync(typeof(SysDict), "", true, 1, 5); this.table1.DataSource = res.Data; 2、更新数据 var client = new ApiClient(); var res = client.UpdateObject(item); await RefreshDataAsync(); 3、删除数据 var client = new ApiClient(); var res = client.DeleteObject(item); await RefreshDataAsync(); 4、插入数据 var client = new ApiClient(); var res = client.InsertObject(item); await RefreshDataAsync(); Model编辑组件 使用方式: this.modelEditControl1.GetItemBuilder(value) .Add(a => a.Color) .Add(a => a.Name) .Add(a => a.CreateTime) .Add(a => a.Image) .Add(a => a.KK) .Add(a => a.Dict) .Add(a => a.KKd) .Add(a => a.Typ) .Add(a => a.TestEditControlTest, content: new TestEditControl()) .Add(a => a.Check); 更新数据: this.modelEditControl1.Model = obj; Auth组件(按钮权限) 在设计页面拖入 Auth 控件,然后点击按钮,按钮上就会多一个权限属性。 AdminTable 增删改权限设置方法: this.auth1.SetAuth(this.adminTable1, "useradmin"); // 菜单中请设置权限 useradmin:edit,useradmin:delete,useradmin:add 项目源码 Gitee:https://gitee.com/AntdUI/wen-antd-ui 总结 WenAntdUI框架基于AntdUI,集成了多种实用功能,通过简洁的集成方式和丰富的组件库,为开发者提供了一站式的管理后台开发解决方案。不管是初始化与登录、项目结构与启动、数据演示与配置,还是功能集成与组件使用,WenAntdUI都表现出了极高的易用性和灵活性。对于希望快速开发管理后台系统的团队来说,WenAntdUI无疑是一个值得尝试的选择。 最后 如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。 也可以加入微信公众号[DotNet技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!