跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C#

WPF + .NET6 WebAPI + SqlSugar 权限管理系统架构与实现

一套基于 WPF、.NET6 WebAPI 和 SqlSugar ORM 的权限管理系统。系统采用 MVVM 模式构建客户端,服务端使用 JWT 鉴权与流量控制。核心功能包括动态菜单生成、多级审批流程及混合部署支持(局域网直连数据库或互联网通过 Nginx 代理)。技术亮点涵盖 SqlSugar 链式查询优化、自定义权限过滤器、事务处理及异常捕获机制。此外,系统支持 SignalR 实时权限同步,并针对工控场景进行了设备权限绑定优化。

热情发布于 2026/4/6更新于 2026/10/18110 浏览
WPF + .NET6 WebAPI + SqlSugar 权限管理系统架构与实现

本系统基于 WPF、.NET6 WebAPI 和 SqlSugar ORM 构建,专注于权限管理模块。支持互联网与局域网部署,适用于智能制造及工控系统研发场景。

文章配图

工控系统开发圈近期存在一种现象:使用 WPF 开发上位机的团队常需自行实现权限管理系统。虽然看似基础,但涉及权限树形结构拖拽、动态菜单生成及多级审批流程,实施难度较大。以下拆解一套实战级的 WPF+.NET6+SqlSugar 权限系统方案。

整体架构分为三个核心模块:

  1. WPF 客户端采用 DevExpress 全家桶,MVVM 模式分离界面逻辑
  2. .NET6 WebApi 服务端使用 JWT 鉴权,自带流量控制
  3. 数据层使用 SqlSugar ORM,简化查询编写

权限系统架构图

文章配图

用户管理模块的 Service 层代码示例如下:

public UserPagedList GetUserList(QueryUserDto dto) { return _userRepository.AsQueryable() .WhereIF(!string.IsNullOrEmpty(dto.Account), u => u.Account.Contains(dto.Account)) .WhereIF(!string.IsNullOrEmpty(dto.RealName), u => u.RealName.Contains(dto.RealName)) .WhereIF(dto.Status != null, u => u.Status == dto.Status) .OrderBy(u => u.CreateTime, OrderByType.Desc) .ToPagedList(dto.Page, dto.PageSize); }

这段代码展示了 SqlSugar 的链式查询用法,WhereIF 方法根据条件动态拼接查询,比直接写 if 判断更简洁。ToPagedList 扩展方法封装了分页逻辑,语义更符合业务需求。

文章配图

前端 WPF 绑定用户数据时,MVVM 模式的优势体现明显:

<dxg:GridControl ItemsSource="{Binding Users}" AutoGenerateColumns="None">
 <dxg:GridControl.Columns>
  <dxg:GridColumn FieldName="Account" Header="账号"/>
  <dxg:GridColumn FieldName="RealName" Header="姓名"/>
  <dxg:GridColumn FieldName="Status" Header="状态">
   <dxg:GridColumn.CellTemplate>
    <DataTemplate>
     <TextBlock Text="{Binding Status, Converter={StaticResource StatusConverter}}"/>
    </DataTemplate>
   </dxg:GridColumn.CellTemplate>
  </dxg:GridColumn>
 </dxg:GridControl.Columns>
</dxg:GridControl>

DevExpress 的 GridControl 绑定 ObservableCollection 集合时,增删改查能自动刷新界面。状态转换器将枚举值转为'启用/禁用'文字,实现了视图与逻辑的解耦。

文章配图

权限校验的核心位于 WebApi 的鉴权过滤器:

public override void OnAuthorization(AuthorizationFilterContext context) {
 var endpoint = context.HttpContext.GetEndpoint();
 if (endpoint?.Metadata.GetMetadata<AllowAnonymousAttribute>() != null) return;
 var token = context.HttpContext.Request.Headers["Authorization"].ToString();
 if (string.IsNullOrEmpty(token) || !_jwtService.ValidateToken(token)) {
  context.Result = new ObjectResult(new { code = 401 }) { StatusCode = 401 };
  return;
 }
 // 权限码校验
 var permissionCode = endpoint?.Metadata.GetMetadata<PermissionAttribute>()?.Code;
 if (!_permissionService.CheckPermission(token, permissionCode)) {
  context.Result = new ObjectResult(new { code = 403 }) { StatusCode = 403 };
 }
}

该过滤器执行三项操作:放行匿名访问、校验 JWT 有效性、检查接口权限码。权限码通过自定义的 PermissionAttribute 获取,相比硬编码方式更灵活。

文章配图

系统支持混合部署模式:

  1. 局域网部署时直连数据库,响应速度<100ms
  2. 互联网部署切换至 WebApi 模式,通过 Nginx 反向代理处理 HTTPS
  3. 权限数据同步采用 SignalR,修改权限后所有在线客户端实时生效

该系统的核心亮点在于异常处理机制。例如删除用户时遇到外键约束:

public async Task DeleteUser(Guid userId) {
 try {
  await _db.TransactionAsync(async () => {
   await _db.Deleteable<User>().Where(u => u.Id == userId).ExecuteCommandAsync();
   await _db.Deleteable<UserRole>().Where(ur => ur.UserId == userId).ExecuteCommandAsync();
  });
 } catch (SqlSugarException ex) {
  if (ex.Message.Contains("FK_")) {
   throw new BusinessException("该用户存在关联数据,请先解除关联");
  }
  throw;
 }
}

使用 SqlSugar 的事务包裹删除操作,捕获外键异常后转换为业务提示,提升了用户体验。这种细节处理在工控系统中尤为重要。

文章配图

建议开发者重点研究权限树形结构的实现:

public List<PermissionTree> BuildPermissionTree(List<Permission> permissions) {
 var rootNodes = permissions.Where(p => p.ParentId == Guid.Empty).ToList();
 var tree = new List<PermissionTree>();
 foreach (var node in rootNodes) {
  tree.Add(new PermissionTree { Id = node.Id, Label = node.Name, Children = GetChildren(node.Id, permissions) });
 }
 return tree;
}
private List<PermissionTree> GetChildren(Guid parentId, List<Permission> permissions) {
 return permissions.Where(p => p.ParentId == parentId)
  .Select(p => new PermissionTree { Id = p.Id, Label = p.Name, Children = GetChildren(p.Id, permissions) }).ToList();
}

递归构建权限树结构,配合前端 DevExpress 的 TreeListControl,可实现可视化拖拽权限层级。实际项目中建议增加缓存,避免每次请求都递归查询。

文章配图

该系统曾在 MES 系统中验证过 200+ 并发,使用 MemoryCache 做权限缓存,Redis 做 Session 共享,稳定性可靠。代码中还包含性能优化技巧,如批处理操作提升效率。

文章配图

对工控开发者来说,设备权限绑定模块较为实用——将 PLC 操作权限和设备管理账号打通,现场工程师扫码登录时自动匹配权限,比传统密码登录更适合制造业场景。

建议开发者先跑通基础权限模块,再尝试扩展:

  1. 增加 AD 域认证集成
  2. 实现权限变更审批流
  3. 接入 OPC UA 服务端权限控制

这些扩展方向是制造企业真实需要的功能,也是系统从'能用'到'好用'的关键跃迁。

更多推荐文章

查看全部
  • Vivado 生成 MCS 文件并烧录 Flash 实现掉电保存
  • Edge 边栏 Copilot 图标消失的解决方法
  • 普元 Mobile SlidePage 子页面数据刷新方案
  • 前端 PDF 导出实战:JSPDF 与 HTML2Canvas 深度解析
  • LocalAI:在本地高效部署与运行 AI 大模型
  • 近端策略优化算法 (PPO) 详解与 PyTorch 实现
  • Python pip 包管理工具使用指南
  • Python 字节码逆向工具 pycdc:从.pyc 文件恢复源代码
  • AI 领域为何全面转向 AI Agent 方向?
  • UI UX Pro Max:AI 辅助专业级 UI 设计工具
  • VS Code 集成 GitHub Copilot 实战指南
  • Java 字符处理:char、String 与 StringBuilder 详解
  • 使用 Gitee AI Serverless API 与 Cursor 搭建 DeepSeek 对话应用
  • 哈希算法原理与实战:从 SHA-0 到应用场景详解
  • Python 环境安装与配置 Gurobi 求解器指南
  • FPGA 实时图像处理指南:流水线架构与系统优化
  • Trae AI 编辑器安装与核心功能使用指南
  • C++23 常用特性详解
  • GCC 编译系列:静态库工具 AR 详解
  • MATLAB 智能代码生成工具 Copilot_AI 功能解析

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online