1. 前言
作为一个图形用户界面开发人员,都会被繁复的界面呈现权限逻辑困扰过,多年来,界面开发的编写方式没有太大的改变,界面程序中总是掺杂着许多条件判断语句,本文的目的就是对这种问题的分析和解决。
希望对这种类型的GUI框架有研究的网友能发表自己的看法,多多交流。
2. 切入点
本文的切入点在于根据不同的条件判断语句显示控件,这是界面逻辑的主体。
3. 阅读要求
需要阅读者基于GUI框架写过程序,诸如MFC, VCL, wxWidgets,或者struts, webwork之类,其他语言的GUI框架也行。
4. 第一阶段--现状
仍然用我的老朋友--请假单作为案例,以下人名纯属虚构,如有巧合,纯属偶然。一张请假单在普通员工填写时,请假原因一栏是可读写的。
但是当部门经理和其他角色阅读时,为只读状态。

如果是用编程语言实现权限判断,那么伪码为
if (普通员工角色.包含(当前用户)) {
(new TextArea("请假原因")).draw();
} else if (经理角色.包含(当前用户)) {
(new Text("请假原因")).draw();
}
|
如果是struts,那么标签伪码为
<c:if test="普通员工.包含(当前用户)">
<html:textarea id="请假原因"/>
</c:if>
<c:if test="经理角色.包含(当前用户)">
<html:text id="请假原因"/>
</c:if>
|
通过上面的例子,我们看到为了在两种角色下分别呈现请假原因控件,写了两段,可以联想到如果有更多的角色要查看同一个页面时会发生什么事--更多的权限判断代码+更多的同id控件输出,就算封装得再漂亮,但只要不改变这种写代码的本质,情况就不会改变。这种同一个id的控件写上多次的情况,是造成编码量急剧增加且难以维护的主要原因。
5. 第二阶段--分析和实现
要实现权限可配置,除非权限也是对象,那么干脆就假设权限是对象,定义相关规则如下。
l 将权限作为独立对象。
那么将上面的代码用对象模型用来表达,如下

同时也要解决同名id控件的重复性问题,则假设控件可以根据权限自动决定如何呈现界面,相同id的控件实际只为1个。那么对象模型就变成下面的图

很容易看出,现在的我们只是要对权限和控件两坨对象之间进行逻辑关联,以确定如何呈现界面。
再定义出如下几条规则,以方便编写代码:
l 控件使用权限对象引用来和权限对象绑定。
l 将权限引用包含到控件内。
现在,伪码变成这样
<ScriptRight id="普通员工权限" script="普通员工角色.包含(当前用户)"/>
<ScriptRight id="经理权限" script="经理角色.包含(当前用户)"/>
<Textarea id="请假原因">
<RightRef id="普通员工权限" value="读写"/>
<RightRef id="经理权限" value="只读"/>
</Textarea>
|
似曾相识吧?没错,类似Ant里Path和PathRef标签的写法。
现在代码完全的对象化了,结构清晰。控件越多这种写法的优势越明显。...
当然,上面的规则不是很完整,为了能够实现控件自决定呈现,得加上几条:
l 权限值有 读写、只读、隐藏、禁止 四种。
l 权限值为读写时调用控件的界面呈现方法。
l 权限值不为读写时由控件在内部决定类型转换,然后调用转换后对象的呈现方法--默认情况下只读转换为文本,隐藏转换为hidden标签,禁止则删除该对象。
这样的规则复杂度一般般,要想实现把呈现的变换隐藏到控件内部,则将权限值当作独特的状态值来看待,使用《设计模式》中的状态模式就可以了。
到目前为止,离实用还有点距离,灵活性还不够,因为在权限改变时,控件的属性会改变,比如,对于提交按钮来说,提交时的javascript处理函数会改变,假设需求如下:
在其他权限时,生成html代码
<input type='submit' id='提交' value='提交' onclick='doA()'/>
但在经理权限时,要生成
<input type='submit' id='提交' value='提交' onclick='doB()'/>
|
因此再订一条规则来包容属性变化:
l 允许在权限匹配时,修改控件的属性。
假设我们有如下需求
下面是示例代码
<ScriptRight id="普通员工权限" script="普通员工角色.包含(当前用户)"/>
<ScriptRight id="经理权限" script="经理角色.包含(当前用户)"/>
<SubmitButton id="提交">
<HTMLAttributes onclick="funcA()" style="color:blue"/>
<RightRef id="普通员工权限" value="读写"/>
<RightRef id="经理权限" value="读写">
<field name="HTMLAttributes.onclick" value="doB()"/>
</RightRef>
</SubmitButton >
|
现在对上面的代码说明。
HTMLAttributes是SubmitButton标签对应的处理类SubmitButton的属性,类图如下

大部分开源框架配置文件xml元素对应的处理类都是这么写的,规则为:
l 同名的标签对应同名的类。
l 同名的属性对应同名的参数或者子标签。
在这里,HTMLAttributes子标签里的所有参数,将原封不动的生成为HTML字符串(也可以考虑支持EL表达式),在权限引用(RightRef)标签里,子标签field表示,符合本权限时,将
Name参数值对应的控件对象的属性值按照反射规则重写。用java伪码表达就是
/* 本例中
* fieldName = "HTMLAttributes.field";
* fieldValue = "doB()";
*/
public void setField(Object control, String fieldName, Object fieldValue) {
if (fieldName.contains(".")) {
String[] fieldNames = fieldName.split(".");
Object field = BeanUtil.getProperty(control, fieldNames[0]);
if (field.getType() == Map) {
((Map)field).put(fieldNames[1], fieldValue);
}
}
}
|
虽然可实现本例的功能,但可以看出这段伪码是有缺陷的,完整的反射设置代码会复杂得多。
至此,我们拥有了完全对象化而且可配置的模型,这个模型完全可以不用在界面程序(这里用jsp,但可以是其他语言的界面程序文件)中硬编码权限,可以考虑两种整体解决方案:
l 方案1:仍然在Jsp中写控件代码(这样原有标签可以不改,改后台实现即可),然后把权限标签和权限引用标签独立到另一个xml文件(此时权限引用标签作为权限标签的子标签或者独立标签均可)。
l 方案2:把控件、权限、权限引用全部放到一个xml中进行,jsp退化为模板,好处是可以实现整体式GUI框架,需要跨平台GUI库的话很合适。
本概念还有很多需要强化的地方,将在下一阶段(强化)来讲解,敬请关注,如果我不偷懒的话,会尽快补充的。
文章刚发时犯了个错误,图片地址是C盘,真是囧,好朋友提醒了我,现在修正了。
分享到:
相关推荐
这个系统提供了用户友好的图形用户界面(GUI),使得用户能够方便地进行个人信息管理和通讯录的操作。以下是对该系统核心知识点的详细解释: 1. **Java GUI框架**:Java提供多种GUI库,如Swing和JavaFX,用于创建...
首先,AWT(Abstract Window Toolkit)是Java早期提供的用于构建图形用户界面的基础框架,包含了一系列基本的组件,如按钮(Button)、文本框(TextField)和标签(Label)。AWT组件是"重量级"的,它们依赖于操作...
在IT行业中,C#是一种广泛使用的编程语言,尤其在开发Windows桌面应用方面,WinForm是其重要的GUI(图形用户界面)框架。本项目名为“C# Winform 权限管理框架”,它提供了一种完善的解决方案,用于管理和控制应用...
JavaFX是一个用于构建桌面和网页应用的开放源代码Java库,它提供了丰富的图形用户界面组件和高级视觉效果。在本项目中,JavaFX被选为UI开发工具,因为其支持跨平台运行、拥有强大的图形渲染能力,以及与Java语言的...
这个项目展示了如何利用QT的图形用户界面(GUI)工具和SQLite数据库来实现这些功能。接下来,我们将深入探讨QT与VS2017的集成、权限管理、用户管理以及界面设计等相关知识点。 首先,QT是一个跨平台的C++应用程序...
- 图标和图片文件(png):96个,增强用户界面视觉体验 - 网页文件(html):48个,构建用户操作界面 - 样式文件(css):40个,定义了整体的视觉风格 - 样式预处理器文件(less):14个,用于高效样式编写 - ...
PowerBuilder是Sybase(现为SAP公司)开发的一款可视化、面向对象的编程环境,主要支持数据窗口、数据库连接、图形用户界面设计等功能。它允许开发者使用DataWindow控件进行数据库操作,使用Window和Object脚本进行...
本项目是一个基于Qt框架的权限管理系统,旨在提供一个图形用户界面(GUI)和命令行界面(CLI)的权限管理解决方案。系统支持用户登录、权限授权、对象查看、权限回收等功能,适用于需要严格权限控制的应用场景。 ##...
在这个项目中,我们关注的是一个利用C++实现的酒店管理系统,它具备图形用户界面(GUI),使得操作更加直观易用。此系统对于学习C++编程以及进行毕业设计的学生来说,无疑是一个极具价值的参考。 首先,我们要理解...
Winform则是C#中用于创建图形用户界面(GUI)的框架,提供了丰富的控件和事件处理机制,使得开发者能够轻松构建交互式的应用程序。 DevExpress是一款强大的.NET开发工具集,包含了大量的控件和组件,如GridControl...
该系统利用GUI(图形用户界面)提供友好的用户交互,同时与MySQL数据库进行高效的数据存储和检索。在深入探讨这个系统的组成部分之前,我们先来了解一下涉及的技术栈: 1. **Java**: Java是一种多平台的、面向对象...
对于学习和理解C++编程、图形用户界面设计以及内网穿透工具的实现原理,这个毕业设计提供了很好的实践案例。同时,它也展示了如何将理论知识应用于实际问题的解决,对于提升软件开发者的综合技能非常有价值。
通过深入研究这个框架的源码,开发者可以学习到如何实现权限控制机制,如何设计安全的API接口,以及如何构建可扩展的权限管理系统。这不仅有助于提升个人技能,也有助于提高团队在开发过程中处理权限问题的效率。...
而WPF(Windows Presentation Foundation)则基于.NET Framework,提供丰富的用户界面元素和强大的图形渲染能力,适用于桌面环境。这两种方式的实现都考虑到了权限控制的前后端分离,前端负责展示和交互,后端处理...
它是.NET Framework的一部分,提供了一种强大的方式来设计和构建美观、功能丰富的图形用户界面。在“WPF上位机框架-根文件.zip”中,我们看到的是一套专为构建上位机应用而设计的WPF框架,包含了一些核心组件和实用...
EasyJWeb的工具支持包括了权限管理的界面配置工具,使得非开发人员也能通过图形化界面进行权限设置,降低了系统的使用门槛。此外,框架还提供了丰富的API和扩展点,方便开发者进行二次开发。 综上所述,EasyJWeb在...
4. **界面设计**:采用用户友好的图形用户界面(GUI),使得非技术人员也能轻松上手,常用元素如图标、按钮等应清晰易懂。 5. **工作流引擎**:实现自动化的工作流程,支持自定义流程,确保任务的有序进行。 6. **...
1. **Qt框架**:Qt提供了丰富的库和API,允许开发者用C++编写GUI(图形用户界面)应用程序。它支持多种操作系统,包括Windows、Linux、macOS、Android和iOS等。Qt框架包含了事件处理、网络编程、数据库连接、XML处理...
在本文中,我们将深入探讨如何使用Qt框架和C++编程语言构建一个基于TCP协议的文件传输图形用户界面(GUI)软件。Qt是一个跨平台的开发框架,广泛用于创建桌面、移动和嵌入式应用程序,而TCP(Transmission Control ...
在Linux环境下,Qt4是一个强大的跨平台应用程序开发框架,它为开发者提供了丰富的API来构建具有图形用户界面(GUI)的应用程序。Qt4以其简洁、高效和可扩展性著称,支持多种操作系统,包括Linux、Windows和Mac OS X...