六、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 ...
随机推荐
- 【idea】配置node
参考: http://blog.csdn.net/stubbornaccepted/article/details/71374673 http://www.cnblogs.com/duhuo/p/42 ...
- istringstream和ostringstream的实现
ostringstream是将数据写入string里边的,istringstream是将从string里边读出数据的: #include <sstream> int main() { st ...
- CTreeCtrl::HitTest
CTreeCtrl::HitTest 调用此函数确定指定的位置点相对树视图控件的工作区的. HTREEITEM HitTest( CPoint pt, UINT* pFlags = NULL ...
- DBA手记-BBED 的说明
在10g中连接生成bbed:cd $ORACLE_HOME/rdbms/libmake -f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed 11g中缺省未提供BBE ...
- XML的序列化用法 vs平台开发
protected void Page_Load(object sender, EventArgs e) { if(!IsPostBack) { NewMethod(); } } #region 读取 ...
- centos7 安装mysql5.7以及一些细节问题
突然发现我的新服务器上没有mysql,所以想安装一个,上次在我的window电脑上安装MySQL8.0我真的要气死了,和5.7修改密码的方式不一样,弄了很久,所以我决定还是不用安装8.0了,5.7就可 ...
- 搭建kafka高级消费 (high-consumer)php7
说明:有很多同学在服务器上搭建好,kafka,在应用端使用kafka时候出现很多问题,这里提供下我的kafka生产和消费的php函数 环境说明: 1:首先php要有kafka扩展,在命令行中输入 ph ...
- java通过get或post方式传到PHP的某控制器的某方法下
[java]package test4;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStr ...
- TF-IDF介绍
TF-IDF是什么 TF-IDF是一种统计方法,用以评估一个词对于一篇文章或语料库中一篇文章的重要性.字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降. T ...
- Altera三速以太网IP核快速仿真与使用(上篇)
对于比较高级的ip核,altera一般都会提供仿真案例,网上有关于这个IP核的各种仿真方法,但都比较繁琐,前几日,朋友跟我分享了一个比较快速高效的仿真方法,这个方法也是他摸索折腾了一段时间才总结出来的 ...