`
cm4ever
  • 浏览: 5225 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

可配置权限的图形用户界面框架的分析和实现

阅读更多

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. 第二阶段--分析和实现

要实现权限可配置,除非权限也是对象,那么干脆就假设权限是对象,定义相关规则如下。

将权限作为独立对象。

那么将上面的代码用对象模型用来表达,如下

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

 

 

很容易看出,现在的我们只是要对权限和控件两坨对象之间进行逻辑关联,以确定如何呈现界面。

再定义出如下几条规则,以方便编写代码:

 

控件使用权限对象引用来和权限对象绑定。

将权限引用包含到控件内。

 

现在,伪码变成这样

<ScriptRight id="普通员工权限" script="普通员工角色.包含(当前用户)"/>

<ScriptRight id="经理权限" script="经理角色.包含(当前用户)"/>

 

<Textarea id="请假原因">

  <RightRef id="普通员工权限" value="读写"/>

  <RightRef id="经理权限" value="只读"/>

</Textarea>

 

似曾相识吧?没错,类似Ant里Path和PathRef标签的写法。

现在代码完全的对象化了,结构清晰。控件越多这种写法的优势越明显。...

当然,上面的规则不是很完整,为了能够实现控件自决定呈现,得加上几条:

 

权限值有 读写、只读、隐藏、禁止 四种。

权限值为读写时调用控件的界面呈现方法。

权限值不为读写时由控件在内部决定类型转换,然后调用转换后对象的呈现方法--默认情况下只读转换为文本,隐藏转换为hidden标签,禁止则删除该对象。

 

这样的规则复杂度一般般,要想实现把呈现的变换隐藏到控件内部,则将权限值当作独特的状态值来看待,使用《设计模式》中的状态模式就可以了。

 

到目前为止,离实用还有点距离,灵活性还不够,因为在权限改变时,控件的属性会改变,比如,对于提交按钮来说,提交时的javascript处理函数会改变,假设需求如下:

在其他权限时,生成html代码

<input type='submit' id='提交' value='提交' onclick='doA()'/>

但在经理权限时,要生成

<input type='submit' id='提交' value='提交' onclick='doB()'/>

 

因此再订一条规则来包容属性变化:

允许在权限匹配时,修改控件的属性。

假设我们有如下需求

下面是示例代码

<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元素对应的处理类都是这么写的,规则为:

同名的标签对应同名的类。

同名的属性对应同名的参数或者子标签。

在这里,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,但可以是其他语言的界面程序文件)中硬编码权限,可以考虑两种整体解决方案:

方案1:仍然在Jsp中写控件代码(这样原有标签可以不改,改后台实现即可),然后把权限标签和权限引用标签独立到另一个xml文件(此时权限引用标签作为权限标签的子标签或者独立标签均可)。

 

方案2:把控件、权限、权限引用全部放到一个xml中进行,jsp退化为模板,好处是可以实现整体式GUI框架,需要跨平台GUI库的话很合适。

 

本概念还有很多需要强化的地方,将在下一阶段(强化)来讲解,敬请关注,如果我不偷懒的话,会尽快补充的。

 

文章刚发时犯了个错误,图片地址是C盘,真是囧,好朋友提醒了我,现在修正了。

分享到:
评论

相关推荐

    java图形化界面实现的个人通讯录管理系统

    这个系统提供了用户友好的图形用户界面(GUI),使得用户能够方便地进行个人信息管理和通讯录的操作。以下是对该系统核心知识点的详细解释: 1. **Java GUI框架**:Java提供多种GUI库,如Swing和JavaFX,用于创建...

    JAVA图形用户界面

    首先,AWT(Abstract Window Toolkit)是Java早期提供的用于构建图形用户界面的基础框架,包含了一系列基本的组件,如按钮(Button)、文本框(TextField)和标签(Label)。AWT组件是"重量级"的,它们依赖于操作...

    c# winform 权限管理框架

    在IT行业中,C#是一种广泛使用的编程语言,尤其在开发Windows桌面应用方面,WinForm是其重要的GUI(图形用户界面)框架。本项目名为“C# Winform 权限管理框架”,它提供了一种完善的解决方案,用于管理和控制应用...

    一套权限管理系统的用户界面(UI)实现

    JavaFX是一个用于构建桌面和网页应用的开放源代码Java库,它提供了丰富的图形用户界面组件和高级视觉效果。在本项目中,JavaFX被选为UI开发工具,因为其支持跨平台运行、拥有强大的图形渲染能力,以及与Java语言的...

    QT VS2017 权限管理用户管理,单独输入界面

    这个项目展示了如何利用QT的图形用户界面(GUI)工具和SQLite数据库来实现这些功能。接下来,我们将深入探讨QT与VS2017的集成、权限管理、用户管理以及界面设计等相关知识点。 首先,QT是一个跨平台的C++应用程序...

    Flask框架实现的RBAC权限管理系统源码

    - 图标和图片文件(png):96个,增强用户界面视觉体验 - 网页文件(html):48个,构建用户操作界面 - 样式文件(css):40个,定义了整体的视觉风格 - 样式预处理器文件(less):14个,用于高效样式编写 - ...

    PB通用框架.rar_PB权限_PowerBuilder_pb 框架_pb框架_框架

    PowerBuilder是Sybase(现为SAP公司)开发的一款可视化、面向对象的编程环境,主要支持数据窗口、数据库连接、图形用户界面设计等功能。它允许开发者使用DataWindow控件进行数据库操作,使用Window和Object脚本进行...

    (源码)基于Qt框架的权限管理系统.zip

    本项目是一个基于Qt框架的权限管理系统,旨在提供一个图形用户界面(GUI)和命令行界面(CLI)的权限管理解决方案。系统支持用户登录、权限授权、对象查看、权限回收等功能,适用于需要严格权限控制的应用场景。 ##...

    C++ 酒店管理系统 实现了图形界面

    在这个项目中,我们关注的是一个利用C++实现的酒店管理系统,它具备图形用户界面(GUI),使得操作更加直观易用。此系统对于学习C++编程以及进行毕业设计的学生来说,无疑是一个极具价值的参考。 首先,我们要理解...

    C# 通用权限管理系统源码、Winform 开发框架源码 devexpress 多主题

    Winform则是C#中用于创建图形用户界面(GUI)的框架,提供了丰富的控件和事件处理机制,使得开发者能够轻松构建交互式的应用程序。 DevExpress是一款强大的.NET开发工具集,包含了大量的控件和组件,如GridControl...

    JAVA和mysql数据库学生学籍管理图形化系统

    该系统利用GUI(图形用户界面)提供友好的用户交互,同时与MySQL数据库进行高效的数据存储和检索。在深入探讨这个系统的组成部分之前,我们先来了解一下涉及的技术栈: 1. **Java**: Java是一种多平台的、面向对象...

    一个使用C++和Qt框架制作的Windows操作系统下的Frp图形界面客户端。.zip

    对于学习和理解C++编程、图形用户界面设计以及内网穿透工具的实现原理,这个毕业设计提供了很好的实践案例。同时,它也展示了如何将理论知识应用于实际问题的解决,对于提升软件开发者的综合技能非常有价值。

    abis权限框架源码

    通过深入研究这个框架的源码,开发者可以学习到如何实现权限控制机制,如何设计安全的API接口,以及如何构建可扩展的权限管理系统。这不仅有助于提升个人技能,也有助于提高团队在开发过程中处理权限问题的效率。...

    通用权限管理系统(设计文档,数据库,及Web和WPF两种实现方式)

    而WPF(Windows Presentation Foundation)则基于.NET Framework,提供丰富的用户界面元素和强大的图形渲染能力,适用于桌面环境。这两种方式的实现都考虑到了权限控制的前后端分离,前端负责展示和交互,后端处理...

    WPF上位机框架-根文件.zip

    它是.NET Framework的一部分,提供了一种强大的方式来设计和构建美观、功能丰富的图形用户界面。在“WPF上位机框架-根文件.zip”中,我们看到的是一套专为构建上位机应用而设计的WPF框架,包含了一些核心组件和实用...

    easyjweb 用户权限

    EasyJWeb的工具支持包括了权限管理的界面配置工具,使得非开发人员也能通过图形化界面进行权限设置,降低了系统的使用门槛。此外,框架还提供了丰富的API和扩展点,方便开发者进行二次开发。 综上所述,EasyJWeb在...

    小型办公自动化系统框架的设计和实现

    4. **界面设计**:采用用户友好的图形用户界面(GUI),使得非技术人员也能轻松上手,常用元素如图标、按钮等应清晰易懂。 5. **工作流引擎**:实现自动化的工作流程,支持自定义流程,确保任务的有序进行。 6. **...

    基于Qt框架使用C和C++开发的小型云盘源码.zip

    1. **Qt框架**:Qt提供了丰富的库和API,允许开发者用C++编写GUI(图形用户界面)应用程序。它支持多种操作系统,包括Windows、Linux、macOS、Android和iOS等。Qt框架包含了事件处理、网络编程、数据库连接、XML处理...

    基于Qt的TCP文件传输图形化界面软件

    在本文中,我们将深入探讨如何使用Qt框架和C++编程语言构建一个基于TCP协议的文件传输图形用户界面(GUI)软件。Qt是一个跨平台的开发框架,广泛用于创建桌面、移动和嵌入式应用程序,而TCP(Transmission Control ...

    Linux环境下Qt4图形界面与MySQL 源代码

    在Linux环境下,Qt4是一个强大的跨平台应用程序开发框架,它为开发者提供了丰富的API来构建具有图形用户界面(GUI)的应用程序。Qt4以其简洁、高效和可扩展性著称,支持多种操作系统,包括Linux、Windows和Mac OS X...

Global site tag (gtag.js) - Google Analytics