前言
在快速迭代的软件开发环境中,如何高效地开发一个功能完整、界面美观的 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技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |