当前位置: 首页 > news >正文

基于之前建立的 Prism 模块化架构 用户登录 + 权限系统

基于之前建立的 Prism 模块化架构。1. 用户登录 权限系统1User 实体与服务// MaxWell.Domain/Entities/User.csnamespaceMaxWell.Domain.Entities;publicclassUser{publicstringUserId{get;set;}string.Empty;publicstringUserName{get;set;}string.Empty;publicstringDisplayName{get;set;}string.Empty;publicstringRole{get;set;}Operator;// Operator, Engineer, AdminpublicDateTimeLoginTime{get;set;}DateTime.UtcNow;publicListstringPermissions{get;set;}new();}2IUserService 接口// MaxWell.CommonBasis/Services/IUserService.csnamespaceMaxWell.CommonBasis.Services;publicinterfaceIUserService{UserCurrentUser{get;}boolIsLoggedIn{get;}eventEventHandlerUser?UserChanged;TaskLoginResultLoginAsync(stringusername,stringpassword);voidLogout();boolHasPermission(stringpermission);boolIsInRole(stringrole);}3UserService 实现// MaxWell.CommonBasis/Services/UserService.csusingMaxWell.Domain.Entities;namespaceMaxWell.CommonBasis.Services;publicclassUserService:IUserService{publicUserCurrentUser{get;privateset;}newUser{RoleGuest};publicboolIsLoggedInCurrentUser.Role!Guest;publiceventEventHandlerUser??UserChanged;privatereadonlyILog_loggerLogManager.GetLogger(UserService);publicasyncTaskLoginResultLoginAsync(stringusername,stringpassword){// 实际项目中应调用认证服务或数据库awaitTask.Delay(300);// 模拟网络延迟if(usernameadminpassword123456){CurrentUsernewUser{UserIdU001,UserNameusername,DisplayName管理员,RoleAdmin,Permissions{Experiment.Start,Vision.Control,Alarm.Manage}};}elseif(usernameengineerpassword123456){CurrentUsernewUser{UserIdU002,UserNameusername,DisplayName工程师,RoleEngineer,Permissions{Experiment.Start,Vision.View}};}else{returnLoginResult.Fail(用户名或密码错误);}UserChanged?.Invoke(this,CurrentUser);_logger.Info($用户登录成功:{CurrentUser.DisplayName}({CurrentUser.Role}));returnLoginResult.Success(CurrentUser);}publicvoidLogout(){CurrentUsernewUser{RoleGuest};UserChanged?.Invoke(this,null);_logger.Info(用户已登出);}publicboolHasPermission(stringpermission){returnCurrentUser.Permissions.Contains(permission);}publicboolIsInRole(stringrole){returnCurrentUser.Role.Equals(role,StringComparison.OrdinalIgnoreCase);}}2. 模块热更新界面Module Management ViewModuleManagementView.xaml!-- Views/ModuleManagementView.xaml --UserControlx:ClassMaxWell.Views.ModuleManagementViewxmlnshttp://schemas.microsoft.com/winfx/2006/xaml/presentationxmlns:xhttp://schemas.microsoft.com/winfx/2006/xamlGridMargin20Grid.RowDefinitionsRowDefinitionHeightAuto/RowDefinitionHeight*//Grid.RowDefinitionsStackPanelOrientationHorizontalMargin0,0,0,15ButtonContent刷新模块列表Command{Binding RefreshCommand}Margin5/ButtonContent加载选中模块Command{Binding LoadSelectedCommand}Margin5/ButtonContent卸载选中模块Command{Binding UnloadSelectedCommand}Margin5//StackPanelDataGridGrid.Row1ItemsSource{Binding Modules}SelectedItem{Binding SelectedModule}AutoGenerateColumnsFalseDataGrid.ColumnsDataGridTextColumnHeader模块名称Binding{Binding ModuleName}Width200/DataGridTextColumnHeader状态Binding{Binding Status}Width100/DataGridTextColumnHeader版本Binding{Binding Version}Width80/DataGridTextColumnHeader依赖Binding{Binding DependsOn}Width200//DataGrid.Columns/DataGrid/Grid/UserControlModuleManagementViewModel.cs// ViewModels/ModuleManagementViewModel.csusingPrism.Commands;usingPrism.Mvvm;usingMaxWell.CommonBasis.ModuleConfig;namespaceMaxWell.ViewModels;publicclassModuleManagementViewModel:ViewModelBase{privatereadonlyDynamicModuleLoader_moduleLoader;privatereadonlyModuleConfigurationManager_configManager;publicObservableCollectionModuleInfoViewModelModules{get;}new();publicModuleInfoViewModel?SelectedModule{get;set;}publicDelegateCommandRefreshCommand{get;}publicDelegateCommandLoadSelectedCommand{get;}publicDelegateCommandUnloadSelectedCommand{get;}publicModuleManagementViewModel(IEventAggregatoreventAggregator,DynamicModuleLoadermoduleLoader,ModuleConfigurationManagerconfigManager):base(eventAggregator){_moduleLoadermoduleLoader;_configManagerconfigManager;RefreshCommandnewDelegateCommand(LoadModuleList);LoadSelectedCommandnewDelegateCommand(LoadSelectedModule);UnloadSelectedCommandnewDelegateCommand(UnloadSelectedModule);LoadModuleList();}privatevoidLoadModuleList(){Modules.Clear();varconfigs_configManager.GetAllModuleConfigs();foreach(varconfiginconfigs){Modules.Add(newModuleInfoViewModel(config));}}privatevoidLoadSelectedModule(){if(SelectedModulenull)return;_moduleLoader.LoadModule(SelectedModule.AssemblyPath,SelectedModule.ModuleTypeFullName);LoadModuleList();// 刷新列表}privatevoidUnloadSelectedModule(){if(SelectedModulenull)return;_moduleLoader.UnloadModule(SelectedModule.ModuleName);LoadModuleList();}}publicclassModuleInfoViewModel:BindableBase{publicstringModuleName{get;}publicstringAssemblyPath{get;}publicstringModuleTypeFullName{get;}publicstringStatus{get;set;}未加载;publicstringVersion{get;set;}1.0;publicstringDependsOn{get;set;};publicModuleInfoViewModel(ModuleConfigconfig){ModuleNameconfig.ModuleName;AssemblyPathconfig.AssemblyName;ModuleTypeFullNameconfig.ModuleTypeFullName;}}3. 在 App.xaml.cs 中集成protectedoverridevoidRegisterTypes(IContainerRegistrycontainerRegistry){// ... 其他注册containerRegistry.RegisterSingletonModuleConfigurationManager();containerRegistry.RegisterSingletonDynamicModuleLoader();containerRegistry.RegisterSingletonIModulePermissionService,ModulePermissionService();containerRegistry.RegisterSingletonIUserService,UserService();// 注册模块管理界面containerRegistry.RegisterForNavigationModuleManagementView,ModuleManagementViewModel(ModuleManagementView);}使用方式登录后可进入“模块管理”页面支持运行时动态加载/卸载模块权限系统可控制哪些用户能操作模块
http://www.zskr.cn/news/1370097.html

相关文章:

  • 如何免费永久保存20+平台直播内容:Fideo开源工具完整指南
  • 为什么LiteIDE是Go开发者的首选:从轻量级IDE到高效开发伙伴的完整指南
  • 新手快速上手使用 Python 调用 Taotoken 聚合大模型 API
  • 如何永久解锁Cursor Pro功能:完全免费使用AI编程助手的实用指南
  • 终极指南:如何使用Legacy iOS Kit为旧款iOS设备降级与越狱
  • 2026 西安添价收黄金回收靠谱变现渠道 专业检测精准估价收获市民认可 - 薛定谔的梨花猫
  • 为团队统一开发环境,使用 TaoToken CLI 工具一键配置多模型接入
  • 量子玻尔兹曼机非凸优化:SGD收敛性与ε-平稳点分析
  • 基于历史RCT数据评估机器学习模型因果效应的边界方法
  • Loop:优雅解决Mac窗口管理难题的5个高效方案
  • 对比直接使用厂商 API,通过 Taotoken 聚合调用的便利之处
  • 利用Taotoken模型广场为你的智能客服场景选择合适的大模型
  • m4s-converter:让B站缓存视频重获新生的终极解决方案
  • 论文解读-《Temporal Graph Rewiring with Expander Graphs 》 - zhang
  • 算力战争背后:GPU到底凭什么这么贵?
  • 2026 徐州房屋漏水不用愁!雨中匠人免费上门检测,本地专业防水公司常年TOP1!卫生间免砸砖防水,快速解决您的烦恼。权威!靠谱!稳定!售后无忧!!! - 防水百科
  • 惠州工厂搬家公司推荐 专业大型精密仪器设备搬运服务排名 - 从来都是英雄出少年
  • CANN-昇腾NPU-推理服务灰度发布-怎么平滑切换版本
  • Video2X实战指南:如何用AI开源工具专业提升视频画质到4K
  • 技术不专业?2026安徽GEO优化公司推荐排行 技术过硬/全场景适配 - 行业深度观察C
  • 惠州搬厂公司哪家好?大亚湾惠阳本地大型搬厂企业口碑推荐 - 从来都是英雄出少年
  • JMeter性能压测实战:从协议模拟到生产决策的完整链路
  • 5分钟终极指南:如何用Python-for-Android将Python代码变成Android应用
  • 通达信ChanlunX缠论插件:3分钟实现专业级缠论分析
  • iOS抓包证书信任全解:突破HTTPS拦截关键一步
  • 使用Node.js和TaoToken API快速搭建一个智能客服原型系统
  • 从最大似然到变分推断:指数族模型与隐变量学习的核心算法解析
  • 初次使用 Taotoken 模型广场进行模型选型的直观过程
  • 在自动化工作流中集成 Taotoken 实现按需调用与成本优化
  • unrpa终极指南:三步搞定Ren‘Py游戏资源提取