回《【开源】EnterpriseFrameWork框架系列文章索引

从本章开始进入框架的第二块内容“EnterpriseFrameWork框架的基础功能”,包括:权限管理、字典数据管理、报表管理和消息管理四块,这些功能又包括两个版本,Web版和Winform版也就是说有两套界面。

既然开始讲基础功能,顺便说一下EnterpriseFrameWork框架的适用范围,前面也有提到过就是此框架适合中小团队这是一方面,还一方面就是此框架适合行业应用系统软件的开发,你用它做一个“超市库存管理系统”、“企业EPR”等类似系统是非常适合的;但如果觉得用它有Web开发模式,就用它来开发互联网应用的话还是很麻烦的;互联网的功能的开放性、随意性在此框架中受很大的限制,所以在这系列完成后,下一个系列中我会继续分享针对“互联网应用开发框架系列”,敬请期待!

继续本章的内容讲解框架的“权限管理”,从本章的讲解思路分成下面几个部分:

        1)功能清单介绍

        2)功能界面展示

        3)核心业务流程图与数据库表关系图

        4)关键点的技术实现代码

框架中的权限管理的思想类似于Windows操作系统中的用户和用户组的设计,用户配置角色,角色配置菜单,所以用户没必要跟菜单直接关联,通过角色进行关联。

        框架中权限除了到菜单级别,还可以精确到页面内部的一个按钮、数据展示或操作内容,也就是页面子权限。

        简要的说明一下页面子权限的实现方式,在每个页面定义了一组权限标识,角色配置菜单同时勾选子权限标识保存起来。打开这个页面的时候根据配置的子权限标识控制页面的操作内容。举个列子,比如查看“工作日志的页面”有员工、经理、老总三个级别,首页我们在日志页面三个定义子权限标识分别为“员工权限”、“经理权限”和“老总权限”,再在角色配置权限的界面分别对三个角色配置相应的页面子权限。

        那么不同级别的用户登录后,打开此页面看到的内容就不一样了

1.权限管理功能清单

模块名称

功能名称

功能说明

权限管理

系统登录

输入正确用户名和密码,点击确定登录
登录界面的背景图片和系统名称可以自定义

系统主界面

登录后进入的主界面,菜单根据用户配置的权限动态生成
支持登录后切换部门
内嵌消息提醒面板(类似QQ通知)

机构管理

添加机构、启用停用机构
添加机构会默认添加一个超级用户用来管理此机构的所有业务

用户部门管理

用户管理,新增、修改、停用用户,用户配置部门和设置角色
部门分类,新增、修改、删除
部门管理,新增、修改、停用部门

系统菜单管理

菜单维护,新增、修改、删除菜单,设置菜单的图片等

角色权限配置

角色维护,新增、删除角色
角色配置对应的菜单

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框架基础功能之权限管理的更多相关文章

  1. 九、EnterpriseFrameWork框架基础功能之消息管理

    记得阿朱在<走出软件作坊>一书中有一章讲客户提的需求太邪门了,鼠标键盘不太会用要程序员开发一个语音输入功能,还要系统中带类似QQ的功能:确实刚开始的客户的想法有点天真,但是随着信息化的越来 ...

  2. 七、EnterpriseFrameWork框架基础功能之字典数据配置管理

    框架中的“通用字典数据配置管理”主要解决的问题是,所有的行业软件给客户实施第一步一般都是基础数据的维护,一个系统的字典是少不了的,涉及业务范围越广字典就越多,如果每一个字典数据都做一个界面来进行维护数 ...

  3. 八、EnterpriseFrameWork框架基础功能之自定义报表

    本章写关于框架中的“自定义报表”,类似上章“字典管理”也是三部分功能组成,包括配置报表.对报表按角色授权.查看报表:其核心思想就是实现新增一个报表而不用修改程序代码.不用升级,只需要编写一个存储过程, ...

  4. (十三)整合 SpringSecurity 框架,实现用户权限管理

    整合 SpringSecurity 框架,实现用户权限管理 1.Security简介 1.1 基础概念 1.2 核心API解读 2.SpringBoot整合SpringSecurity 2.1 流程描 ...

  5. (十二)整合 Shiro 框架,实现用户权限管理

    整合 Shiro 框架,实现用户权限管理 1.Shiro简介 1.1 基础概念 1.2 核心角色 1.3 核心理念 2.SpringBoot整合Shiro 2.1 核心依赖 2.2 Shiro核心配置 ...

  6. Django基础篇--用户权限管理和组管理

    Django作为一个成熟的python后台开发框架,为开发者提供了很多内置的功能,开发者只需要做一些配置就可以完成原生操作中比较复杂的代码编写.这些内置功能中其中一个比较强大的功能就是后台用户管理类. ...

  7. Shiro基础学习(一)—权限管理

    一.基本概念 1.权限管理      只要有用户参与的系统一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源.     权限管理 ...

  8. Spring 框架基础(05):事务管理机制,和实现方式

    本文源码:GitHub·点这里 || GitEE·点这里 一.Spring事务管理 1.基础描述 Spring事务管理的本质就是封装了数据库对事务支持的操作,使用JDBC的事务管理机制,就是利用jav ...

  9. [ jenkins ] 基础安装及权限管理

    1. 安装 jenkins 在安装 jenkins 之前需要 java 的支持 (1)安装 jdk1.8 [root@192.168.118.17 ~]#tar xf jdk-8u77-linux-x ...

随机推荐

  1. 2019.3.6 Github学习 &Git学习

    Github学习 1.使用Github 1.1 目的 借助github托管项目代码 1.2 基本概念 仓库(Repository) 仓库的意思是:即你的项目,你想在Github上开源一个项目,那就必须 ...

  2. js apply的用法

    问题: 1.apply和call的区别在哪里 2.什么情况下用apply,什么情况下用call 3.apply的其他巧妙用法(一般在什么情况下可以使用apply) 我首先从网上查到关于apply和ca ...

  3. PAT——1072. 开学寄语(20)

    下图是上海某校的新学期开学寄语:天将降大任于斯人也,必先删其微博,卸其QQ,封其电脑,夺其手机,收其ipad,断其wifi,使其百无聊赖,然后,净面.理发.整衣,然后思过.读书.锻炼.明智.开悟.精进 ...

  4. iOS-Cordova集成开发,已有项目集成cordova

    iOS-Cordova集成开发,已有项目集成cordova 项目组准备开发一个APP,要求Android和iOS端页面完全一致,除了一个页面跟业务相关的不同,其他界面基本一致,因此,萌生一个想法,关于 ...

  5. python-基础小游戏,人在 江湖飘,哪能不挨刀,我几刀砍死你

    #人在 江湖飘,哪能不挨刀,我几刀砍死你 #规则:5赢4. 4赢3 .3赢2. 2赢1 . 1赢5 #提示:绝对值函数abs #假设:老王和老李 import random import time p ...

  6. LR分析-demo2

    0.LR分析 用一个栈来保存文法符号和状态的信息,一个字符串保存输入信息. 使用栈顶的状态符号和当前的输入符号来检索分析表,来决定移进-归约分析的动作. 1.样例文法 "E>E+T&q ...

  7. Windows环境下写Linux sh脚本的一次挖坑和填坑

    最近在研究Docker集群和安装的时候,需要准备若干台机器.所以我为节约时间,打算批量复制VM机器,然后用sh脚本命令执行机器名称和IP等基础配置信息的修改. 具体操作:我在windows环境下,用N ...

  8. 帝国CMS站点迁移

    1.重新安装xmapp环境 安装包地址 链接:https://pan.baidu.com/s/1OSwlP90G9VMAZYVXMG245Q 提取码:gnfr 2.安装后启动 3.复制数据库信息 将旧 ...

  9. python迭代器生成器

    1.生成器和迭代器.含有yield的特殊函数为生成器.可以被for循环的称之为可以迭代的.而可以通过_next()_调用,并且可以不断返回值的称之为迭代器 2.yield简单的生成器 #迭代器简单的使 ...

  10. 在客户端模拟调用srv和topic

    rostopic pub -r 10 /toipic_name Tab+Tab rosservice call /service_name  Tab+Tab rostopic pub -r 10 /c ...