# WenAntdUI-Admin
**Repository Path**: onlycheat/wen-antd-ui
## Basic Information
- **Project Name**: WenAntdUI-Admin
- **Description**: 基于AntdUI的管理系统,内部封装了很多常用组件,包含AdminTable等通用组件。
- **Primary Language**: C#
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 10
- **Created**: 2025-05-09
- **Last Updated**: 2025-05-09
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# WenAntdUI
控件使用了AntdUI https://gitee.com/AntdUI/AntdUI
| 功能 | 状态 |
| :------: | :---: |
| AOT发布 | ✅ |
| 字典管理 | ✅ |
| 用户管理 | ✅ |
| 菜单管理 | ✅ |
| 权限管理 | ✅ |
| 用户设置 | ✅ |
### 启动项目
| 文件 | 项目 | 说明 | 进度 |
| :---: | :--------------------------- | :---------------------------------------- | :---: |
| gRPC | gRPC测试项目(演示示例项目) | | |
| | Wen.GrpcClient | 客户端项目示例代码 | ✅ |
| | Wen.GrpcService | 服务端项目示例代码 | ✅ |
| Test | 项目测试功能测试代码 | | |
| | ConsoleAppAotTest | 控制台AOT测试代码(SqlSugarCore) | ✅ |
| | WinFormsAppAotTest | winform Aot(SqlSugarCore)测试 | ✅ |
| | WinFormsAppFreeSqlAotTest | winform Aot (FreeSql) | ✅ |
| | WinFormsAppTestHub | SignalR 客户端测试 | ✅ |
| 项目 | 主要应用项目功能 | | |
| | WebServer | 前后分离服务器项目(内含WebApi和SignalR) | ✅ |
| | Wen.Models | Model层,主要声明实体 | ✅ |
| | Wen.Core | 中间层,后续基础引用功能基本迁移到此处 | ✅ |
| | WenAntdUI | 应用功能层,插件,封装组件等 | ✅ |
| | WenAntdUI.Demo | 项目引用示例 | ✅ |
## 内部运行集成 一行代码搞定一个完整的管理系统基础功能

### 数据演示
需要体验最新测试功能可以设置启动数据库 DataSource=..\\..\\..\\..\\data.db

~~~
internal static class Program
{
///
/// The main entry point for the application.
///
[STAThread]
static void Main()
{
App.Run(services =>
{
services.AddControlServices(Assembly.GetExecutingAssembly());
});
}
}
~~~
### 集成启动方式
应用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();
this.adminTable1.Query();
InitMenuItem();
this.adminTable1.CellClick += AdminTable1_CellClick;
}
}
~~~
### AdminTable
封装控件 AdminTable 只需要一行代码即可实现一个表增删改查

~~~
this.adminTable1.SetColumns();
[Index($"index_{nameof(SysRole)}_{nameof(RoleName)}", nameof(RoleName), true)]
public class SysRole
{
///
/// 获得/设置 角色名称
///
[DisplayName("角色名称")]
[Col] //自动编辑功能,需要在属性上面 加上 Col 特性
[Key]
public string? RoleName { get; set; }
///
/// 获得/设置 角色描述
///
[DisplayName("角色描述")]
[Col]
public string? Description { get; set; }
}
~~~
自定义构建列
~~~
this.adminTable1.SetColumn()
.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);
~~~
查询数据
~~~
this.adminTable1.QueryData = async e =>
{
e.IsExpand = true;
return fsql.Select()
.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();
}
}
//需要提前注入,若是采用插件方式开发,此处可以调用外部插件直接注入dll文件
App.Run(services =>
{
services.AddControlServices(Assembly.GetExecutingAssembly());
}, true);
~~~
### 完成注入后即可在菜单选中使用


## 角色管理
| 功能 | 状态 |
| :------: | :---: |
| 增删改查 | ✅ |
| 分配权限 | ✅ |

## 用户管理
| 功能 | 状态 |
| :------: | :---: |
| 增删改查 | ✅ |
| 分配角色 | ✅ |
| 重置密码 | ✅ |

## 用户信息设置
| 功能 | 状态 |
| :------: | :---: |
| 更改密码 | ✅ |
| 修改图像 | ✅ |
图像存储在SQL中。

## 封装组件演示
| 功能 | 状态 |
| :------------------- | :---: |
| 前后端分离增删改查 | ✅ |
| 图像选择组件 | ✅ |
| 字典选择组件 | ✅ |
| 上传功能集成组件 | ✅ |
| 下载功能集成组件 | ✅ |
| Model编辑组件 | ✅ |
| 双向绑定 | ✅ |
| Auth组件(按钮权限) | ✅ |
### 前后分离通用查询方式虽然方便,慎用慎用!!!
### 出于安全考虑,不集成在 AdminTable,若需要使用,只要替换增删改查代码即可
### 查询数据
需要需要提供类型 搜索内容 页码 单页数
~~~
var client = new ApiClient();
var res = await client.GetListAsync(typeof(SysDict), "", true, 1, 5);
this.table1.DataSource = res.Data;
~~~
### 更新数据
~~~
var client = new ApiClient();
var res = client.UpdateObject(item);
await RefreshDataAsync();
~~~
### 删除数据
~~~
var client = new ApiClient();
var res = client.DeleteObject(item);
await RefreshDataAsync();
~~~
### 插入数据
~~~
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.Aa)
//.Add(a => a.Name, content: new DictSelect("1"))
.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 ,然后点击按钮,按钮上就会多一个属性


![alt text][def]
AdminTable 增删改 权限设置方法
~~~
this.auth1.SetAuth(this.adminTable1, "useradmin");
//菜单中请设置权限 useradmin:edit, useradmin:delete, useradmin:add
~~~

[def]: Image/PixPin_2025-04-17_14-59-28.png