1. 项目概述:基于WPF+.NET6+SqlSugar的全栈权限管理平台
这套源码实现了一个典型的权限管理系统(RBAC),采用WPF作为客户端框架,.NET 6 WebAPI作为服务端,SqlSugar作为ORM工具。这种技术栈组合在当前企业级开发中非常流行,特别适合需要高交互性前端和稳定后端服务的桌面应用场景。
从架构设计来看,项目采用了经典的三层架构:
- 表现层:WPF客户端(MVVM模式)
- 业务逻辑层:.NET 6 WebAPI
- 数据访问层:SqlSugar ORM
这种架构既保证了前后端分离的灵活性,又通过ORM简化了数据库操作。权限管理作为系统的核心功能,通常会包含用户管理、角色管理、菜单权限、操作权限等基础模块,以及更细粒度的数据权限控制。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心技术栈解析
2.1 WPF客户端技术要点
WPF(Windows Presentation Foundation)作为.NET平台的UI框架,在这个项目中主要承担以下职责:
-
MVVM架构实现:
- 使用
INotifyPropertyChanged接口实现数据绑定 ICommand接口处理用户交互- 通过
ObservableCollection实现集合数据绑定 - 典型代码结构:
csharp复制public class UserViewModel : INotifyPropertyChanged { private string _userName; public string UserName { get => _userName; set { _userName = value; OnPropertyChanged(); } } public ICommand SaveCommand { get; } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }
- 使用
-
常用控件与布局:
DataGrid:用于展示用户/角色列表TreeView:实现菜单权限树形结构StackPanel/Grid/DockPanel:基础布局容器Style和Template:自定义控件外观
-
界面美化技巧:
- 使用
MaterialDesignInXAML等第三方库提升UI质感 - 自定义控件模板实现科技感界面
- 动画效果增强用户体验
- 使用
2.2 .NET 6 WebAPI服务端
服务端采用.NET 6 WebAPI,主要特点包括:
-
JWT认证实现:
csharp复制services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = Configuration["Jwt:Issuer"], ValidAudience = Configuration["Jwt:Audience"], IssuerSigningKey = new SymmetricSecurityKey( Encoding.UTF8.GetBytes(Configuration["Jwt:Key"])) }; }); -
Swagger集成:
csharp复制builder.Services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "Auth API", Version = "v1" }); // 添加JWT支持 var securityScheme = new OpenApiSecurityScheme { Name = "JWT Authentication", Description = "Enter JWT Bearer token", In = ParameterLocation.Header, Type = SecuritySchemeType.Http, Scheme = "bearer", BearerFormat = "JWT", Reference = new OpenApiReference { Id = JwtBearerDefaults.AuthenticationScheme, Type = ReferenceType.SecurityScheme } }; c.AddSecurityDefinition(securityScheme.Reference.Id, securityScheme); c.AddSecurityRequirement(new OpenApiSecurityRequirement { {securityScheme, new string[] { }} }); }); -
依赖注入与分层架构:
- 控制器层:处理HTTP请求
- 服务层:业务逻辑实现
- 仓储层:数据访问封装
2.3 SqlSugar ORM实践
SqlSugar是一个轻量级的ORM框架,在这个项目中主要实现:
-
基础配置:
csharp复制public class SqlSugarHelper { public static SqlSugarScope Db = new SqlSugarScope(new ConnectionConfig() { ConnectionString = "Server=.;Database=AuthDB;Trusted_Connection=True;", DbType = DbType.SqlServer, IsAutoCloseConnection = true }, db => { // 配置AOP db.Aop.OnLogExecuting = (sql, pars) => { Console.WriteLine(sql); }; }); } -
实体关系映射:
csharp复制[SugarTable("Sys_User")] public class User { [SugarColumn(IsPrimaryKey = true, IsIdentity = true)] public int Id { get; set; } [SugarColumn(Length = 50)] public string UserName { get; set; } [SugarColumn(Length = 100)] public string Password { get; set; } [Navigate(typeof(UserRole), nameof(UserRole.UserId), nameof(UserRole.RoleId))] public List<Role> Roles { get; set; } } -
高级查询:
csharp复制var userList = Db.Queryable<User>() .Where(u => u.UserName.Contains("admin")) .OrderBy(u => u.Id, OrderByType.Desc) .ToList();
3. 权限系统核心实现
3.1 RBAC模型设计
基于角色的访问控制(RBAC)是本系统的核心,主要包含以下实体:
-
数据库表设计:
sql复制CREATE TABLE Sys_User ( Id INT PRIMARY KEY IDENTITY, UserName NVARCHAR(50) NOT NULL, Password NVARCHAR(100) NOT NULL, Status INT DEFAULT 1 ); CREATE TABLE Sys_Role ( Id INT PRIMARY KEY IDENTITY, RoleName NVARCHAR(50) NOT NULL, Description NVARCHAR(200) ); CREATE TABLE Sys_UserRole ( Id INT PRIMARY KEY IDENTITY, UserId INT NOT NULL, RoleId INT NOT NULL ); CREATE TABLE Sys_Menu ( Id INT PRIMARY KEY IDENTITY, ParentId INT, MenuName NVARCHAR(50) NOT NULL, MenuUrl NVARCHAR(100), Icon NVARCHAR(50), OrderNum INT ); CREATE TABLE Sys_RoleMenu ( Id INT PRIMARY KEY IDENTITY, RoleId INT NOT NULL, MenuId INT NOT NULL ); CREATE TABLE Sys_Operation ( Id INT PRIMARY KEY IDENTITY, OperationName NVARCHAR(50) NOT NULL, OperationCode NVARCHAR(50) NOT NULL, MenuId INT ); CREATE TABLE Sys_RoleOperation ( Id INT PRIMARY KEY IDENTITY, RoleId INT NOT NULL, OperationId INT NOT NULL ); -
权限验证流程:
- 用户登录获取Token
- 前端存储Token并在后续请求中携带
- 后端验证Token并检查权限
- 返回授权数据或拒绝请求
3.2 动态菜单实现
-
后端菜单树构建:
csharp复制public List<MenuTreeDto> GetUserMenuTree(int userId) { var menuIds = Db.Queryable<User>() .Where(u => u.Id == userId) .Select(u => u.Roles.Select(r => r.Menus.Select(m => m.Id))) .ToList(); return Db.Queryable<Menu>() .Where(m => menuIds.Contains(m.Id)) .OrderBy(m => m.OrderNum) .ToTree(m => m.Children, m => m.ParentId, 0); } -
前端菜单渲染:
xml复制<TreeView ItemsSource="{Binding MenuTree}"> <TreeView.ItemTemplate> <HierarchicalDataTemplate ItemsSource="{Binding Children}"> <StackPanel Orientation="Horizontal"> <Image Source="{Binding Icon}" Width="16" Height="16"/> <TextBlock Text="{Binding MenuName}" Margin="5,0"/> </StackPanel> </HierarchicalDataTemplate> </TreeView.ItemTemplate> </TreeView>
3.3 按钮级权限控制
-
权限指令实现:
csharp复制public class PermissionExtension : MarkupExtension { public string Code { get; set; } public override object ProvideValue(IServiceProvider serviceProvider) { var provider = serviceProvider.GetService(typeof(IProvideValueTarget)) as IProvideValueTarget; if (provider.TargetObject is FrameworkElement element) { var vm = element.DataContext as BaseViewModel; return vm?.CheckPermission(Code) ?? false; } return false; } } -
前端使用示例:
xml复制<Button Content="删除" Command="{Binding DeleteCommand}" IsEnabled="{ext:Permission Code='user_delete'}"/>
4. 项目实战技巧与优化
4.1 WPF性能优化
-
虚拟化列表:
xml复制<DataGrid VirtualizingStackPanel.IsVirtualizing="True" VirtualizingStackPanel.VirtualizationMode="Recycling" EnableRowVirtualization="True"> -
异步加载:
csharp复制private async Task LoadDataAsync() { IsLoading = true; try { Users = await _userService.GetUsersAsync(); } finally { IsLoading = false; } } -
数据绑定优化:
- 使用
x:Shared="false"减少资源重复创建 - 对静态数据使用
x:Static绑定 - 复杂属性使用
Binding.Delay延迟更新
- 使用
4.2 安全增强措施
-
密码加密存储:
csharp复制public string EncryptPassword(string password) { using var sha256 = SHA256.Create(); var bytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(password + Salt)); return Convert.ToBase64String(bytes); } -
API防攻击:
csharp复制services.AddRateLimiter(options => { options.AddPolicy<string>("api", context => RateLimitPartition.GetFixedWindowLimiter( partitionKey: context.Request.Headers["X-Client-Id"].ToString(), factory: partition => new FixedWindowRateLimiterOptions { PermitLimit = 100, Window = TimeSpan.FromMinutes(1) })); }); -
输入验证:
csharp复制public class UserDto { [Required(ErrorMessage = "用户名不能为空")] [StringLength(50, MinimumLength = 3, ErrorMessage = "用户名长度3-50")] public string UserName { get; set; } [RegularExpression(@"^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$", ErrorMessage = "密码必须包含大小写字母和数字,至少8位")] public string Password { get; set; } }
4.3 部署与维护
-
客户端自动更新:
csharp复制public async Task CheckUpdateAsync() { var latestVersion = await _apiService.GetLatestVersionAsync(); if (latestVersion > CurrentVersion) { var result = MessageBox.Show("发现新版本,是否更新?", "提示", MessageBoxButton.YesNo); if (result == MessageBoxResult.Yes) { await DownloadAndInstallUpdateAsync(); } } } -
数据库迁移:
csharp复制Db.CodeFirst.InitTables<User, Role, Menu, Operation>(); Db.DbMaintenance.CreateDatabase(); // 自动创建数据库 -
日志记录:
csharp复制services.AddLogging(builder => { builder.AddFile("logs/auth-{Date}.txt", outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level}] {Message}{NewLine}{Exception}"); });
5. 常见问题与解决方案
5.1 WPF数据绑定失效
问题现象:
- UI不随数据变化更新
- 绑定表达式不生效
解决方案:
- 确保实现了
INotifyPropertyChanged接口 - 检查属性名称拼写是否正确
- 使用
Debug.WriteLine输出绑定错误信息:xml复制<Window ... xmlns:diag="clr-namespace:System.Diagnostics;assembly=WindowsBase" TextBlock.Text="{Binding UserName, diag:PresentationTraceSources.TraceLevel=High}">
5.2 SqlSugar连接问题
常见错误:
- 连接字符串配置错误
- 数据库版本不兼容
- 表结构变更导致映射失败
排查步骤:
- 检查连接字符串:
csharp复制var connStr = Db.Ado.Connection.ConnectionString; Console.WriteLine(connStr); - 启用SQL日志:
csharp复制
Db.Aop.OnLogExecuting = (sql, pars) => { Console.WriteLine(sql); }; - 验证实体映射:
csharp复制var tableName = Db.EntityMaintenance.GetTableName(typeof(User));
5.3 跨域问题(CORS)
解决方案:
csharp复制builder.Services.AddCors(options =>
{
options.AddPolicy("AllowAll", policy =>
{
policy.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader();
});
});
app.UseCors("AllowAll");
5.4 性能瓶颈优化
常见场景与优化:
| 场景 | 优化方案 |
|---|---|
| 大数据量查询 | 分页查询、延迟加载 |
| 复杂权限验证 | 缓存权限数据、预计算 |
| 频繁UI更新 | 使用Dispatcher、批量更新 |
| 高并发API | 响应缓存、请求限流 |
示例代码:
csharp复制// 分页查询
var pageList = Db.Queryable<User>()
.Where(u => u.Status == 1)
.ToPageList(pageIndex, pageSize, ref total);
// 缓存权限
MemoryCache.Default.Add(userId, permissions, TimeSpan.FromMinutes(30));
6. 项目扩展与二次开发
6.1 多租户支持
-
数据库设计:
sql复制ALTER TABLE Sys_User ADD TenantId INT NOT NULL DEFAULT 0; ALTER TABLE Sys_Role ADD TenantId INT NOT NULL DEFAULT 0; -
查询过滤:
csharp复制
Db.Queryable<User>().Where(u => u.TenantId == currentTenantId); -
动态连接字符串:
csharp复制var tenantDb = new SqlSugarScope(new ConnectionConfig() { ConnectionString = GetTenantConnectionString(tenantId), DbType = DbType.SqlServer });
6.2 工作流集成
-
Activiti.NET集成:
csharp复制services.AddActiviti() .AddDbContext<ActivitiDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("Activiti"))); -
审批流程示例:
csharp复制var processInstance = await _runtimeService.StartProcessInstanceByKeyAsync( "approval-process", new Dictionary<string, object> { ["applicant"] = currentUser, ["amount"] = request.Amount });
6.3 微服务改造
-
服务拆分:
- 认证服务(Auth Service)
- 用户服务(User Service)
- 权限服务(Permission Service)
-
Ocelot网关配置:
json复制{ "Routes": [ { "DownstreamPathTemplate": "/api/users/{everything}", "DownstreamScheme": "http", "DownstreamHostAndPorts": [ { "Host": "localhost", "Port": 5001 } ], "UpstreamPathTemplate": "/users/{everything}", "UpstreamHttpMethod": [ "GET", "POST", "PUT", "DELETE" ] } ] } -
gRPC通信:
protobuf复制service UserService { rpc GetUser (UserRequest) returns (UserResponse); } message UserRequest { int32 id = 1; } message UserResponse { int32 id = 1; string name = 2; }
这套权限管理系统源码提供了完整的RBAC实现,采用现代化的技术栈组合,既适合作为学习参考,也可以作为实际项目的基础框架。通过理解其核心设计思想和实现细节,开发者可以快速构建出符合企业需求的权限管理系统。
