系统框架说明
整体框架结构
系统采用B/S三层架构模式,分为web表示层,EnterpriseOpration业务逻辑层和数据访问层(DataBase和DAL),整体结构如图1所示。
图1系统层次结构
在框架中已经实现了DAL数据数据访问层,具体项目开发时不需要编写此层代码;另外开发了DataBaseCreator,自动实现从数据库中生成Database类库,因此,具体项目开发时也不需要编写此层代码。框架还实现了系统的用户组管理、用户管理、组织机构管理、日志管理、用户权限控制和导航等每个项目都必须具备的基础功能。此外,还封装了Gridview和翻页控件,使常用的表格显示功能的开发大大简化。系统的详细结构如图2所示。
图2 系统详细结构
由图2可看出,具体项目开发时,只需要实现功能模块页面和对应的业务处理类即可。
数据访问层
2.1DataAccess
DataAccess是数据访问层的抽象类,定义了每个访问类必须具有的属性和方法,其类结构如图3所示。
图3DataAccess类结构
其属性如表1所示
表1DataAccess属性列表
属性名 | 中文说明 | 可访问性 |
_connectionStr | 数据库连接字符串 | protected |
_tablename | 表名 | protected |
_viewname | 视图名 | protected |
_columnNames | 要查询的列名,默认*表示全部列 | protected |
_timeOut | 连接超时时间,单位秒 | protected |
_insertSQL | 添加行所对应的SQL语句 | protected |
_updateSQL | 更新行所对应的SQL语句,以TableID为标识 | protected |
其方法如表2所示
表2DataAccess方法列表
操作名 | 中文说明 | 可访问性 |
SetConnection | 使用数据库连接字符串connectionStr,强制设置数据库连接 | protected |
GetDataBySql | 使用sql语句查询数据,返回DataTable | protected |
GetDataSet | 使用sql语句查询数据,返回DataSet | protected |
ExecSql | 执行sql语句,成功返回0,失败返回-1 | protected |
ExecSqlWithTrans | 使用事务执行sql语句,成功返回0,失败返回-1 | protected |
GetDataByPage | 采用分页方式读取数据,返回DataTable表,一般在GridView显示时调用 | public |
Insert | 添加记录 | public |
Update | 更新记录 | public |
GetRecordCount | 获取符合条件的记录数 | public |
GetDataFromTable | 从表里查询数据 | public |
GetDataFromView | 从视图里查询记录 | public |
Delete | 删除记录 | public |
2.2SQLDataAccess
继承于DataAccess,实现每个具体函数,添加的熟悉和方法见表3和表4
表3SQLDataAccess属性列表
属性名 | 中文说明 | 可访问性 |
ConnectionString | 静态连接字符串,所有对象共用一个,第一次创建对象时初始化内容 | Static,protected |
_sqlParameter | 更新或插入记录时的Parameter参数,与表字段对应,由DBCreator自动生成 | protected |
表4SQLDataAccess操作列表
操作名 | 中文说明 | 可访问性 |
GetConnetionString() | 获取数据库连接字符串 静态函数,ConnectionString为空时从文件读取,否则直接返回 | private |
2.3DataBase和DataBaseCreator
DataBase类库中的每一个类与某一个数据库表对应,继承于SQLDataAccess,是具体的数据层类,供业务逻辑层调用。目前主要实现构造函数和GetBlankOriginDataTable方法。构造函数对各个属性进行初始化,GetBlankOriginDataTable方法生成空表结构。
DataBaseCreator项目是一个辅助工具,可以自动根据数据库生成DataBase类库中的类,因此DataBase类库中的类不需要人工编写,只要定义好表结构就可以通过自动生成。
逻辑层
3.1EnterpriseBase
主要包含EnterpriseBase类、Screen类,UserRolesEntity类,ModuleRole类
(1)EnterpriseBase类
EnterpriseBase类是逻辑层的抽象类,定义了所有业务逻辑类必须具有的属性和方法,逻辑层的所有类(CommonClasses中的类除外)必须继承于EnterpriseBase类。
目前主要有排序属性OrderString,分页属性pagesize(每页记录数)、currentPage(当前页号)和Total(总记录数)。有一个方法GetGridViewTable(),供Grideview控件调用,要求所有业务类实现本方法。
(2)Screen类
屏幕分辨率类,有宽带和高度2个属性。主要用于页面自动调整大小,系统登录时建立Session[“Screen”]=screen,各个页面通过获取Session可得到客户端屏幕分辨率,并且调整相应控件的宽带、高度和位置。
(3)UserRolesEntity类
UserRolesEntity是用户权限实体类,其中包括了用户组名groupName(以逗号分隔多个用户组,暂时无作用),用户名Username,真实姓名Truename,用户单位编码UnitCode,用户权限列表Modulekeys(以逗号分割),按钮权限列表ButtonFlags(以逗号分割)及用户类型userType(根据需要可以使用,暂时未启用)。具体使用方式看Mypage类和UserRose类。
(4)ModuleRole类
按钮权限集具体使用方式看Mypage类和UserRose类。
3.2CommonClasses
主要包含页面基础类Mypage,权限控制类UserRose,通用方法类CommonMethod。
- Mypage类
Mypage类是Web表示层所有需要进行权限控制的页面的父类,主要封装了OnInit,OnLoad,OnPreRender,SetButtonRight和GetIsHasRight等5个方法。其中前3个方法是自动执行,与UserRoles类一起完成页面的权限控制;后2个方法需要开发人员调用执行,完成按钮的权限控制。
OnInit方法负责接收登录时的Session[“ure”],并根据ure初始化_user对象。OnLoad方法负责判断,如果Session[“ure”]为空,自动跳转到出错页面。OnPreRender取页面的_moduleKey,然后判断_user的ModulekeyList中是否包含该编号,若没有则转到出错页面。
前3个方法在页面载入时的执行过程如下
在点击页面按钮回调时的执行过程如下:
(2)UserRose类
UserRose类是实现权限控制的核心类,主要有username、unitcode、ModuleRoleList和ModuleKeyList4个属性。
表5 UserRose类的主要属性
属性名 | 中文说明 |
username | 用户的登录账号 |
unitcode | 用户所属的单位编码 |
ModuleRoleList | 用户具有的页面权限集合 |
ModuleKeyList | 用户对某个页面具有的按钮权限集合,长度和属性与ModuleRoleList对应 |
UserRose类主要具有的方法如表6所示:
表6 UserRose类的主要方法
属性名 | 中文说明 |
UserRoles(stringuserName) | 构造函数,根据用户名初始化 |
UserRoles(stringuserName,string | 构造函数,根据用户名和密码初始化 |
UserRoles(UserRolesEntityure) | 构造函数,根据URE初始化UserRose对象,一般用于Mypage中根据Session[“ure”]初始化_user |
GetURE | 根据UserRose对象获取URE,用于登录时初始化URE |
SetURE | 根据URE初始化UserRose对象 |
getTableByUserName | 根据用户名读取数据库中的用户记录 |
getTableByUP | 根据用户名和密码读取数据库中的用户记录 |
TableConvertToMR | 将Table转换成权限集,放到ModulekeyList和ModuleRoleList 一般在构造函数中初始化UserRose对象时调用 |
MRConvertToTable | 将权限集转换成ZC_Roles表Table 本方法在权限控制时不调用,应是在用户组管理保存数据时使用。 |
(3)CommonMethod类
CommonMethod是规划的一些公共方法的封装,目前里面的方法都是旧的,作用不大。在项目开发过程中,可以根据需要逐步添加公共方法。
3.3SystemEO
这是表示层SystemWeb所对应的逻辑处理类,主要包含Groups类、UnitInfo类、Users类和Logs类,每个类对应一个主题页面(包括列表显示、添加修改页面等)。
4、表示层
4.1MyGrideView和CommonControl
(1)WebControl_GridView是一个自定义的用户控件,它是在微软GridView控件的基础上继续封装而成。添加的最新功能包括选中单条记录、分页、导出数据、按照特定列排序、纵向滚动条(解决当数据量很大时页面被拖得很长,看到数据时无法看到数据标题问题),横向滚动条解决数据列很多时页面无法正常显示所有列的问题。而且在做以上处理的时候,采用Ajax技术,GridView是局部刷新。
使用选中单条记录功能时,应注意在开发的页面里添加一个HiddenField控件用于存储每次选中行数的tableID,其他功能只需订阅相应的事件就可使用。导出、翻页、排序利用同一个事件实现。
选择单条记录后,当前记录变色。使用时需要在页面
(2)CommonControl类继承于.netITemplate,是WebControl_GridView的模版类,和GridView配合使用。Gridview是以表格的形式展现数据,而每一列可以提供不同的功能,可以是纯文本的显示,也可以是具有超链接的文本、按钮、带脚本事件的文本等。CommonControl类就提供了各种不同的列展现方式。
NoramlTemplate纯文本模版类,表格显示绑定列的纯文本。
HrefTemplate超链接模版,表格显示绑定列的文本的超链接的形式。
JSFunctionTemplate也是超链接模版与上面HrefTemplate不同的是JSFunctionTemplate点击后触发的是js函数,而HrefTemplate是一个url。
ValueToTextTemplate状态模版当数据表内每条数据都有一个状态值需要显示时,需要此模板。
JSButtonTemplate在列中以按钮的形式显示,触发的是一个js函数
JSDButtonTemplate
JSTextBoxTemplate在列中以Textbox的形式显示
CheckTemplate一般用于列表的批量选择功能,显示与表格的第一列。
开发中还会需要其他显示格式,待具体开发中实现。