六、EnterpriseFrameWork框架基础功能之权限管理
回《【开源】EnterpriseFrameWork框架系列文章索引》
从本章开始进入框架的第二块内容“EnterpriseFrameWork框架的基础功能”,包括:权限管理、字典数据管理、报表管理和消息管理四块,这些功能又包括两个版本,Web版和Winform版也就是说有两套界面。
既然开始讲基础功能,顺便说一下EnterpriseFrameWork框架的适用范围,前面也有提到过就是此框架适合中小团队这是一方面,还一方面就是此框架适合行业应用系统软件的开发,你用它做一个“超市库存管理系统”、“企业EPR”等类似系统是非常适合的;但如果觉得用它有Web开发模式,就用它来开发互联网应用的话还是很麻烦的;互联网的功能的开放性、随意性在此框架中受很大的限制,所以在这系列完成后,下一个系列中我会继续分享针对“互联网应用开发框架系列”,敬请期待!
继续本章的内容讲解框架的“权限管理”,从本章的讲解思路分成下面几个部分:
1)功能清单介绍
2)功能界面展示
3)核心业务流程图与数据库表关系图
4)关键点的技术实现代码
框架中的权限管理的思想类似于Windows操作系统中的用户和用户组的设计,用户配置角色,角色配置菜单,所以用户没必要跟菜单直接关联,通过角色进行关联。
框架中权限除了到菜单级别,还可以精确到页面内部的一个按钮、数据展示或操作内容,也就是页面子权限。
简要的说明一下页面子权限的实现方式,在每个页面定义了一组权限标识,角色配置菜单同时勾选子权限标识保存起来。打开这个页面的时候根据配置的子权限标识控制页面的操作内容。举个列子,比如查看“工作日志的页面”有员工、经理、老总三个级别,首页我们在日志页面三个定义子权限标识分别为“员工权限”、“经理权限”和“老总权限”,再在角色配置权限的界面分别对三个角色配置相应的页面子权限。
那么不同级别的用户登录后,打开此页面看到的内容就不一样了。
1.权限管理功能清单
模块名称 |
功能名称 |
功能说明 |
权限管理 |
系统登录 |
输入正确用户名和密码,点击确定登录 |
系统主界面 |
登录后进入的主界面,菜单根据用户配置的权限动态生成 |
|
机构管理 |
添加机构、启用停用机构 |
|
用户部门管理 |
用户管理,新增、修改、停用用户,用户配置部门和设置角色 |
|
系统菜单管理 |
菜单维护,新增、修改、删除菜单,设置菜单的图片等 |
|
角色权限配置 |
角色维护,新增、删除角色 |
2. 权限管理功能界面展示,包括Winform版和Web版
1)登录
2)主界面
3)机构管理
4)用户部门管理
5)系统菜单管理
6)角色权限配置
3.权限管理核心业务流程图与数据库表关系图
4.权限管理关键点技术实现
1)登录控制器LoginController
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using EFWBaseLib.Entity;
using EFWBaseLib.ObjectModel.RightManager;
using EFWBaseLib.ObjectModel.UserLogin;
using EFWBaseLib.WinController.IViewform;
using EFWCoreLib.CoreFrame.BusinessArchitecture;
using EFWCoreLib.CoreFrame.Init;
using EFWCoreLib.WinformFrame.Controller;
using EFWCoreLib.WinformFrame.Common;
using System.Management;
using EFWCoreLib.CoreFrame.Common; namespace EFWBaseLib.WinController.Ation
{
[EFWCoreLib.WinformFrame.Controller.Menu]
[View(DllName = "EFWWin.exe", ViewTypeName = "EFWWin.Viewform.FrmLogin", DefaultView = true)]
[View(DllName = "EFWWin.exe", ViewTypeName = "EFWWin.Viewform.FrmMain")]
[View(DllName = "EFWWin.exe", ViewTypeName = "EFWWin.Viewform.FrmMainRibbon")]
[View(DllName = "EFWWin.exe", ViewTypeName = "EFWWin.Viewform.FrmSetting")]
[View(DllName = "EFWWin.exe", ViewTypeName = "EFWWin.Viewform.ReDept")]
[View(DllName = "EFWWin.exe", ViewTypeName = "EFWWin.Viewform.FrmPassWord")]
[View(DllName = "EFWWin.exe", ViewTypeName = "EFWWin.Viewform.FrmWeclome")]
public class LoginController : BaseController
{
IfrmLogin frmlogin;
IfrmMain frmmain; #region 登录
private Form _frmsplash; public Form Frmsplash
{
get { return _frmsplash; }
set { _frmsplash = value; }
} public override void Init()
{
frmlogin = (IfrmLogin)iBaseView["FrmLogin"]; int mainStyle = EFWCoreLib.WinformFrame.Common.CustomConfigManager.GetMainStyle();
if (mainStyle == )
frmmain = (IfrmMain)iBaseView["FrmMain"];
else
frmmain = (IfrmMain)iBaseView["FrmMainRibbon"];
} public void UserLogin()
{
User user = NewObject<User>();
bool islogin = user.UserLogin(frmlogin.usercode, frmlogin.password); if (islogin)
{
BaseUser EbaseUser = user.GetUser(frmlogin.usercode);
SysLoginRight right = new SysLoginRight();
right.UserId = EbaseUser.UserId;
right.EmpId = EbaseUser.EmpId;
right.WorkId = EbaseUser.WorkId; Dept dept = NewObject<Dept>();
BaseDept EbaseDept = dept.GetDefaultDept(EbaseUser.EmpId);
if (EbaseDept != null)
{
right.DeptId = EbaseDept.DeptId;
right.DeptName = EbaseDept.Name;
} BaseEmployee EbaseEmp = (BaseEmployee)NewObject<BaseEmployee>().getmodel(EbaseUser.EmpId);
right.EmpName = EbaseEmp.Name; BaseWorkers EbaseWork = (BaseWorkers)NewObject<BaseWorkers>().getmodel(EbaseUser.WorkId);
right.WorkName = EbaseWork.WorkName; if (EbaseWork.DelFlag == )
{
string regkey = EbaseWork.RegKey;
DESEncryptor des = new DESEncryptor();
des.InputString = regkey;
des.DesDecrypt();
string[] ret = (des.OutString == null ? "" : des.OutString).Split(new char[] { '|' });
if (ret.Length == && ret[] == EbaseWork.WorkName && Convert.ToDateTime(ret[]) > DateTime.Now)
{
AppGlobal.cache.Add("RoleUser", right); frmmain.UserName = right.EmpName;
frmmain.DeptName = right.DeptName;
frmmain.WorkName = right.WorkName; frmmain.modules = NewObject<Module>().GetModuleList(right.UserId).OrderBy(x => x.SortId).ToList();
frmmain.menus = NewObject<EFWBaseLib.ObjectModel.RightManager.Menu>().GetMenuList(right.UserId);
frmmain.depts = NewObject<Dept>().GetHaveDept(right.EmpId); frmmain.showSysMenu();
ShowWeclomeForm();
((Form)frmmain).Icon = System.Drawing.Icon.ExtractAssociatedIcon(EFWCoreLib.CoreFrame.Init.AppGlobal.AppRootPath + @"images\msn.ico");
((Form)frmmain).Show(); //InitMessageForm();//? CustomConfigManager.xmlDoc = null;
}
else
{
throw new Exception("登录用户的当前机构注册码不正确!");
}
}
else
{
throw new Exception("登录用户的当前机构还未启用!");
}
}
else
{
throw new Exception("输入的用户名密码不正确!");
}
} public void ShowWeclomeForm()
{
frmmain.ShowForm((Form)iBaseView["FrmWeclome"], "首页", "");
} public string GetBackGroundImage()
{
return CustomConfigManager.GetBackgroundImage();
} public void ReLogin()
{
frmlogin.isReLogin = true;
((Form)frmlogin).ShowDialog();
} public void Quit()
{
_frmsplash.Dispose();
}
#endregion #region 设置
public void OpenSetting()
{
List<InputLanguage> list = new List<InputLanguage>();
foreach (InputLanguage val in InputLanguage.InstalledInputLanguages)
{
list.Add(val);
}
((IfrmSetting)iBaseView["FrmSetting"]).languageList = list;
((IfrmSetting)iBaseView["FrmSetting"]).inputMethod_CH = CustomConfigManager.GetInputMethod(EFWCoreLib.WinformFrame.CustomControl.EN_CH.CH);
((IfrmSetting)iBaseView["FrmSetting"]).inputMethod_EN = CustomConfigManager.GetInputMethod(EFWCoreLib.WinformFrame.CustomControl.EN_CH.EN); //打印机
ManagementObjectSearcher query;
ManagementObjectCollection queryCollection;
string _classname = "SELECT * FROM Win32_Printer"; query = new ManagementObjectSearcher(_classname);
queryCollection = query.Get();
((IfrmSetting)iBaseView["FrmSetting"]).loadPrinter(queryCollection, CustomConfigManager.GetPrinter(), CustomConfigManager.GetPrinter(), CustomConfigManager.GetPrinter());
//消息
((IfrmSetting)iBaseView["FrmSetting"]).runacceptMessage = CustomConfigManager.GetrunacceptMessage() == ? true : false;
((IfrmSetting)iBaseView["FrmSetting"]).displayWay = CustomConfigManager.GetDisplayWay() == ? true : false;
((IfrmSetting)iBaseView["FrmSetting"]).setbackgroundImage = CustomConfigManager.GetBackgroundImage();
((IfrmSetting)iBaseView["FrmSetting"]).mainStyle = CustomConfigManager.GetMainStyle();
((Form)iBaseView["FrmSetting"]).ShowDialog();
} public void SaveSetting()
{
((Form)iBaseView["FrmSetting"]).Close();
CustomConfigManager.SaveConfig(((IfrmSetting)iBaseView["FrmSetting"]).inputMethod_EN, ((IfrmSetting)iBaseView["FrmSetting"]).inputMethod_CH, ((IfrmSetting)iBaseView["FrmSetting"]).printfirst, ((IfrmSetting)iBaseView["FrmSetting"]).printsecond, ((IfrmSetting)iBaseView["FrmSetting"]).printthree, ((IfrmSetting)iBaseView["FrmSetting"]).runacceptMessage ? : , ((IfrmSetting)iBaseView["FrmSetting"]).displayWay ? : , ((IfrmSetting)iBaseView["FrmSetting"]).setbackgroundImage, ((IfrmSetting)iBaseView["FrmSetting"]).mainStyle);
}
#endregion #region 切换科室
public void OpenReDept()
{
((IfrmReSetDept)iBaseView["ReDept"]).UserName = base.GetSysLoginRight.EmpName;
((IfrmReSetDept)iBaseView["ReDept"]).WorkName = base.GetSysLoginRight.WorkName;
((IfrmReSetDept)iBaseView["ReDept"]).loadDepts(frmmain.depts,GetSysLoginRight.DeptId);
((Form)iBaseView["ReDept"]).ShowDialog();
} public void SaveReDept()
{
BaseDept dept = ((IfrmReSetDept)iBaseView["ReDept"]).getDept();
((SysLoginRight)EFWCoreLib.CoreFrame.Init.AppGlobal.cache.GetData("RoleUser")).DeptId = dept.DeptId;
((SysLoginRight)EFWCoreLib.CoreFrame.Init.AppGlobal.cache.GetData("RoleUser")).DeptName = dept.Name;
frmmain.DeptName = dept.Name;
}
#endregion #region 修改密码
public void OpenPass()
{
((IfrmPassWord)iBaseView["FrmPassWord"]).clearPass();
((Form)iBaseView["FrmPassWord"]).ShowDialog();
}
public void AlterPass()
{
bool b = NewObject<User>().AlterPassWrod(GetSysLoginRight.UserId, ((IfrmPassWord)iBaseView["FrmPassWord"]).oldpass, ((IfrmPassWord)iBaseView["FrmPassWord"]).newpass);
if (b == false)
throw new Exception("您输入的原始密码不正确!");
}
#endregion #region 消息提醒
/*//?
MessageTimer mstimer = null;//消息提醒触发器
public void InitMessageForm()
{
if (mstimer != null)
{
mstimer.Enabled = false;
if (TaskbarForm.instance != null)
TaskbarForm.instance.ClearMessages();
} mstimer = new MessageTimer();
mstimer.FrmMain = (Form)frmmain;
//mstimer.Interval = 20000;
mstimer.Enabled = true;
} public void ShowMessageForm()
{
TaskbarForm.ShowForm((Form)frmmain);
}
*/
#endregion
}
}
2)页面内部子权限控制
3)关于Web版与Winform版配置菜单的不同之处
Web版菜单配置人员部门管理,如:ModulePlugin/UserLogin/PageUI/DeptEmployeeManager.aspx
Winform版菜单配置人员部门管理,如:EFWBaseLib.WinController.Ation.EmpUserController
前者是配置界面文件地址,后者是配置控制器对象;后来想想这两个方式有没有办法统一,都配置控制器对象?但两者的实现方式确实思路不一样,应该说后者更超前一点吧,因为以前后者也是配置界面文件的,后来引入了控制器的概念,一个业务操作的出发点不是从菜单开始,而是又控制器来安排的,比如:点界面修改按钮会弹出另外一个修改界面,传统的实现是先Show出窗体,再在窗体Load事件加载修改数据;这种传统的方式开发起来很简单,但是有个最大的问题就是把对后台数据的操作分隔开,前后相隔到不同的文件代码或方法中;而用控制器的方式是这样,点修改按钮,向控制器发送一个方法消息,控制器先从后台加载数据,然后在赋值在界面上并Show出窗体;如果我们修改界面换掉了,或不用弹出窗了,控制器前面的数据加载代码都无需修改,只需修改展示代码;所以控制器承担了后台数据访问与前台界面的展示,所以配菜单的方式由以前的配置界面文件,转变为配置控制器;
再说一下Web版的菜单配置,web页面向后台获取数据都是通过ajax请求并返回数据;而控制器不能主动发送数据到web页面,两者不能双向通讯,这也是Http底层协议的所决定,所以Web版无法像Winform版这种方式来实现;
六、EnterpriseFrameWork框架基础功能之权限管理的更多相关文章
- 九、EnterpriseFrameWork框架基础功能之消息管理
记得阿朱在<走出软件作坊>一书中有一章讲客户提的需求太邪门了,鼠标键盘不太会用要程序员开发一个语音输入功能,还要系统中带类似QQ的功能:确实刚开始的客户的想法有点天真,但是随着信息化的越来 ...
- 七、EnterpriseFrameWork框架基础功能之字典数据配置管理
框架中的“通用字典数据配置管理”主要解决的问题是,所有的行业软件给客户实施第一步一般都是基础数据的维护,一个系统的字典是少不了的,涉及业务范围越广字典就越多,如果每一个字典数据都做一个界面来进行维护数 ...
- 八、EnterpriseFrameWork框架基础功能之自定义报表
本章写关于框架中的“自定义报表”,类似上章“字典管理”也是三部分功能组成,包括配置报表.对报表按角色授权.查看报表:其核心思想就是实现新增一个报表而不用修改程序代码.不用升级,只需要编写一个存储过程, ...
- (十三)整合 SpringSecurity 框架,实现用户权限管理
整合 SpringSecurity 框架,实现用户权限管理 1.Security简介 1.1 基础概念 1.2 核心API解读 2.SpringBoot整合SpringSecurity 2.1 流程描 ...
- (十二)整合 Shiro 框架,实现用户权限管理
整合 Shiro 框架,实现用户权限管理 1.Shiro简介 1.1 基础概念 1.2 核心角色 1.3 核心理念 2.SpringBoot整合Shiro 2.1 核心依赖 2.2 Shiro核心配置 ...
- Django基础篇--用户权限管理和组管理
Django作为一个成熟的python后台开发框架,为开发者提供了很多内置的功能,开发者只需要做一些配置就可以完成原生操作中比较复杂的代码编写.这些内置功能中其中一个比较强大的功能就是后台用户管理类. ...
- Shiro基础学习(一)—权限管理
一.基本概念 1.权限管理 只要有用户参与的系统一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源. 权限管理 ...
- Spring 框架基础(05):事务管理机制,和实现方式
本文源码:GitHub·点这里 || GitEE·点这里 一.Spring事务管理 1.基础描述 Spring事务管理的本质就是封装了数据库对事务支持的操作,使用JDBC的事务管理机制,就是利用jav ...
- [ jenkins ] 基础安装及权限管理
1. 安装 jenkins 在安装 jenkins 之前需要 java 的支持 (1)安装 jdk1.8 [root@192.168.118.17 ~]#tar xf jdk-8u77-linux-x ...
随机推荐
- 7、Web Service-IDEA-jaxws规范下的 服务端/客户端 开发
前提简介:这里之后即使基于IDEA进行开发的,风格与之前有些不同之处! 1.服务端的开发 1.创建新的项目 2.pom.xml 添加开发时所需要的依赖 <?xml version="1 ...
- [Python 多线程] 详解daemon属性值None,False,True的区别 (五)
本文以多个例子介绍Python多线程中daemon属性值的区别. 回顾: 前面的文章简单介绍了在现代操作系统中,每一个进程都认为自己独占所有的计算机资源. 或者说线程就是独立的王国,进程间是相对独立的 ...
- pytest setup和teardown初始化
用法简介: setup_method:仅作用于class用例集中的用例,置于class内,每个用例都会调用一次 setup_function:作用于独立的def用例,不可作用于class内的用例 se ...
- 【星云测试】开发者测试-采用精准测试工具对Spring Boot应用进行测试
简介:本文主要介绍把现今主流的springboot框架项目和精准测试工具进行结合和应用,通过精准测试的数据穿透.数据采集.测试用例与代码的双向追溯.数据分析等一系列精准测试的特有功能,达到对项目质量的 ...
- Caused by: java.lang.ClassNotFoundException: org.springframework.boot.bind.RelaxedPropertyResolver
Caused by: java.lang.ClassNotFoundException: org.springframework.boot.bind.RelaxedPropertyResolver 这 ...
- node多图或者单图上传
<form id="form" enctype="multipart/form-data"> <input type="text&q ...
- #leetcode刷题之路41-缺失的第一个正数
给定一个未排序的整数数组,找出其中没有出现的最小的正整数.示例 1:输入: [1,2,0]输出: 3示例 2:输入: [3,4,-1,1]输出: 2示例 3:输入: [7,8,9,11,12]输出: ...
- #leetcode刷题之路22-括号生成
给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合. 例如,给出 n = 3,生成结果为:[ "((()))", "(()())&q ...
- Android Studio 2.3.3 出现Error:(26.13) Fail to resole: com.android.support.appcompat永久解决方法
Android Studio 出现Error(26.13):Fail to resole:com.android.support.appcompat-v7.28_ Install Repository ...
- jquery实现复选框的全选、全不选、反选
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...