说明:因图片较多,带图片的完整文档请从http://code.google.com/p/openjweb/downloads/list
中下载openjweb18.rar
OpenJWeb(1.8) Java Web应用快速开发平台
用户操作手册
编者:OpenJWeb技术团队
编写时间:2009-10-06
Email:baozhengw@163.com
QQ:29803446
联系人:王先生
手机:13651070328
目 录
第一章 公用功能
公用功能包括登录、注销、修改个人口令、基本信息、电子邮件、在线交流、电子论坛等功能,这些功能所有登录用户都可以使用,不需要授权。
1.1 登录系统
按照本产品的安装手册部署完成后,启动tomcat成功后,可访问http://localhost:8088/crm
默认的登录用户名和口令:
(1) 系统管理员为 admin 123456
(2) 档案管理员为 dms dms
(3) 进销存用户为 erp erp
下面是登录页面:
图1-1 用户登录页面
页面中输入用户名和口令,支持回车切换用户名、口令、登录。如果输入的用户名或口令错误,页面会出现提示信息,见下图:
图1-2 登录页面错误提示
页面上的取消按钮用于重置用户名和口令。
1.2 后台首页说明
图1-3 OpenJWeb平台后台首页样式
(1) 单位的logo图标
单位的logo图标目前蓝色空白图片,用户可用自己的图标替换D:/project/openjweb/webapps/apps/images/name.jpg。
(2) 后台首页中最上面一排按钮为所有用户都需要使用的公用功能。
首页按钮:点击后回到上面的页面。
电子邮箱:点击后打开邮件管理,邮件管理具有邮件群发和邮件接收功能。
员工交流:与本单位内部的任一用户在线沟通。
内部论坛:与jforum开源论坛产品集成,点击后可跳转到论坛首页。
修改密码:修改当前登录用户的口令。
个人信息:修改当前用户的基本信息。
注销:注销当前登录,安全返回到登录页面。
(3)页面左侧为功能菜单树,点击标签后会展开具体功能菜单。点击功能菜单右侧的黑色箭头可用于隐藏/取消隐藏左侧的功能菜单树。
(4)页面内容区用于展示具体的功能页面。后台首页中的几个内容窗口包括:
最新档案—用于档案系统中显示最新归档的档案。
待办事项—目前用于档案系统中展示哪些档案需要归档、审批以及档案到期提醒。
最新新闻—当后台发布最新新闻时,可在这里展示。
最新邮件—展示用户接收的没有阅读的最新邮件。
公告栏—当后台发布公告时,在这里展示最新公告。
员工交流—显示其他用户向登录用户发送的,且当前用户没有阅读的消息。
1.3 电子邮箱
1.3.1 个人邮箱参数配置
在本平台中,可为一个用户设置多个邮箱。用户在使用邮件收发功能前,需要先设置自己的有效的电子邮箱帐号。设置电子邮箱帐号的功能在功能菜单树的邮件管理功能下的”个人邮箱设置”,见下图:
图1-4 个人邮箱配置(列表页面)
图1-5 个人邮箱配置(编辑页面)
1.3.2 写邮件
说明:在上图1-5个人邮箱配置编辑页面中,优先级和自动收取暂不使用,可不填写。配置好个人邮箱参数后,点击页面上方首页按钮右侧的“电子邮箱”,显示下面的页面:
图1-6 点电子邮箱后显示的页面
上图中,下拉框中显示的是图1-5中配置的邮箱,如果配置多个邮箱,则显示多个邮箱列表,用户可选择其中一个邮箱收发邮件。我们现在点“写邮件”,会显示写邮件列表页面,见下图:
图1-7 写邮件的列表页面
上图中点“新邮件”,打开邮件编写页面:
图1-8 写邮件页面
说明:
(1) 发件人和邮件标题可随便填写。
(2) 收件人邮箱之间用半角单引号分隔。
(3) 是否使用系统发件箱:选择是,则使用系统邮箱定时发送,当邮件接收人太多时可选择系统发件箱。如果选择否,则可直接发送,不需要使用系统发件箱。
(4) 发送状态:不需要填写。
(5) 邮件状态:分草稿和已发送状态,不需要录入。当邮件保存时为草稿状态,当发送邮件时为已发送状态。
(6) 邮件群组:目前邮件群组只可从系统中已注册的用户列表中选取。
(7) 附件:页面提供了5个附件上传选择框。
(8) 正文编辑:支持html格式的正文编辑。
(9) 功能按钮:包括保存、收件人、发送、关闭窗口。收件人目前只可选择当前注册的帐号,且选择收件人之前需要保存邮件。
1.3.3 收邮件
下图是收邮件页面:
图1-9 收邮件页面
说明:
(1) 删除按钮用于将邮件删除放到回收站中。
(2) 永久删除:永久性地删除邮件,不可恢复。
(3) 收邮件:收取当前邮箱的邮件。邮件收取后,邮件服务器中的邮件会被删除,收取后邮件会存在本地服务器中。邮件收取到本地后,邮件状态为未读状态。打开邮件后变为已读状态。未读状态的邮件会在后台首页的最新邮件中显示,见下图:
图1-10 后台首页的最新邮件
点最新邮件的标题,显示邮件查看页面,见下图:
图1-11 查看接收的邮件页面
1.3.4 垃圾箱
当收件箱中的邮件被删除后会放到垃圾箱中,在垃圾箱中可执行邮件的永久删除和取消删除。取消删除就是将邮件从回收站中恢复到收件箱。下图是垃圾箱页面:
图1-12 邮件管理-垃圾箱
1.3.5 系统邮箱设置
此功能位于邮件管理—系统邮箱设置。如果邮件发送选择了队列发送的方式,则使用系统邮箱发送邮件。
1.3.6 邮件发送队列
当使用队列发送方式发送邮件,在发送时不直接向邮件接收人发送邮件,而是将收件人列表拆分成对应的多封邮件,放到邮件发送队列中由邮件发送定时器定时发送,如果发送失败,可以将邮件的发送状态改为队列状态便可在下次定时到达后尝试再次发送。下面是邮件发送队列列表页面:
图1-13 邮件发送队列
1.4 在线交流
本平台提供了登录用户之间在Web页面中实时沟通的功能。此在线交流工具的特点:基于纯Web页面实现的即时通讯,不需要安装任何其他协议和插件,聊天时页面不需要刷新。如果对方离线,对方在下次登录系统会从后台首页的员工交流中看到离线信息。下面是后台首页中显示的离线信息:
图1-14 后台首页中显示的离线信息
上图是dms用户对admin用户发出的聊天消息,因为聊天时admin没有登录,所以显示了一条离线信息,admin点击此查看了此消息后,未读消息变成已读,下次不再显示。下面是实时沟通页面:
图1-15 实时沟通页面
1.5 内部论坛
内部论坛使用开源Jforum论坛产品,本平台实现了与Jforum的单点登录集成。下面是电子论坛页面:
图1-16 电子论坛页面
1.6 修改密码
下图是当前用户修改密码页面:
图1-17 修改密码页面
1.7 个人信息
用户点后台首页的个人信息,可自己维护个人基本信息。见下图:
图1-18 个人基本信息维护页面
1.8 注销
在后台首页中点注销实现安全退出,返回到用户登录页面。
第二章 快速开发
本章介绍Openjweb1.8快速开发平台的具体功能。下面将按照开发步骤进行介绍。
2.1 子系统定义
在开发新的子系统之前,需要先配置这个子系统的struts2配置文件。例如现在我们要开发一个erp子系统,需要按照以下步骤进行:
(1) 在D:/project/openjweb/src/java目录下找到struts-template.xml文件,复制这个文件,并将复制后的文件命名为struts-erp.xml。
(2)打开这个struts-erp.xml,内容如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="subsystem" extends="struts-default" namespace="/subsystem">
<!-- insert new action -->
</package>
</struts>
将两个subsystem更名为erp,然后保存。注意<!-- insert new action -->不要删除。
(3)打开此目录下的struts.xml,添加struts-erp.xml声明,见下面struts.xml文件的部分内容:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<include file="struts-default.xml"/>
…
<include file="struts-mem.xml"/>
<include file="struts-erp.xml"/>
<!-- <include file="struts-groovy.xml"/> -->
</struts>
(4)打开系统管理下的子系统管理页面,见下图:
图2-1 子系统定义
需要说明的是,系统编码的命名规则为大写英文字母,例如erp系统的子系统编码为ERP;另外上图2-1中的Java Package名指的是子系统存放平台生成的java代码的路径,如果java package为空,则默认为org.openjweb.core,如果不为空,例如erp子系统的java package名字为com.openjweb.erp,则系统自动创建D:/project/openjweb/src/java/com/openjweb/erp路径,当在这个子系统下生成代码时,此目录下还会生成service、entity、action子目录。分别用于存放业务逻辑接口及实现类源代码、java实体类源代码和hibernate映射文件、struts2控制层代码。
平台生成的jsp文件的路径位于D:/project/openjweb/webapps/WEB-INF/jsp目录下,erp系统的jsp目录则位于jsp/erp。
2.2 数据字典
在系统开发的过程中需要经常设置编码表以便统一数据编码,例如学历编码用01代表大本学历,02代表高中学历,则开发前需要将学历编码的设置录入到系统中,在这里,学历代表数据字典类型,01(大本),02(高中)代表学历数据字典类型下的数据字典项。
2.2.1 数据字典类型
数据字典类型的菜单位于系统设置—数据字典类型。下面是数据字典类型的定义页面:
图2-2 数据字典类型定义页面
在上图中,如果不设置查询字典项sql,则系统默认为从comm_dict表读取数据字典项,对于学历数据字典类型,平台预先定义了学历的数据字典类型编码为HR_XUELI,对应的数据字典项的SQL为: SELECT DICT_CODE,DICT_NAME FROM COMM_DICT WHERE DICT_TYPE_CODE='HR_XUELI'。也可以指定其他的表作为数据字典项的代码/名称列表,例如省份数据字典类型(PROVINCE)指定了从ncme_district中查询城市编码和名称:
select district_id,district_name from ncme_district where parent_id='ncme'
2.2.2 数据字典
此功能位于系统设置—数据字典。页面见下图:
图2-3 数据字典
2.3 表结构定义
当数据库表结构确定后,可以在本平台上直接定义表和表字段,并生成表结构及对应的java实体类文件、hibernate映射文件。下面是表结构声明的页面:
图2-4 表结构声明
表结构声明指的是定义数据库表名、对应的实体类名、此表隶属的子系统、是否针对此表生成业务逻辑层代码和实现类、是否树形的表结构等信息。表字段的定义在下面的表字段定义功能中说明。注意表名必须全部为小写。
下面是表字段定义页面(功能菜单为系统管理—表字段定义):
图2-5 表字段定义页面
图2-6 表字段定义的数据库属性标签
图2-7 表字段定义的页面属性标签
当在表结构定义功能中声明了数据库表以后,需要使用表字段定义功能来定义表的字段,例如在表结构定义中声明了医生基本信息表(crm_doctor),则需要在表字段定义中定义医生基本信息表的字段。下面介绍表字段定义中数据库属性:
数据库属性 |
说明 |
示例 |
备注 |
表名 |
数据库表名 |
医生基本信息 |
|
表字段名 |
表字段名 |
city_id |
字段名必须全部为小写 |
表字段中文名 |
表字段中文名 |
所在城市 |
同时用作页面中的列标签文字 |
表字段说明 |
|
|
|
类字段名 |
表字段对应的类属性 |
cityId |
根据表字段名自动生成类字段名 |
字段类型 |
目前定义了Clob,小数,整数,字符串,日期类型 |
|
目前不支持日期类型,这里选择日期类型实际也生成字符串类型字段,只是生成页面是会生成日期选择组件。 |
字段长度 |
|
|
对于字符串,数字类型都要填写长度。 |
小数位数 |
|
|
|
是否必填 |
|
|
如果选择为“是”,则绑定字段校验器后,保存时如果没输入值,则提示字段不能为空。 |
默认值规则 |
可以选择多种默认值规则 |
|
选择不同的默认值规则,则此字段在新增记录时会自动按规则生成初始值 |
是否导出EXCEL |
如果不填或者选择为是,则导出EXCEL时此列在EXCEL中显示 |
|
如果选择“否”则不显示 |
获取显示值SQL |
用于导出EXCEL时,将编码值转换为名称值的SQL |
|
|
获取编码值SQL |
用于EXCEL导入数据库时,将名称值转换为编码值。 |
|
|
是否EXCEL主键 |
相当于业务主键,导入时根据EXCEL主键是否重复来标志为新记录还是已存在记录,如果是已存在记录,则导入时可选择是否覆盖。 |
|
一个表可标记多个EXCEL主键。 |
是否编码字段 |
许多表都有编码字段和名称字段,如果生成树结构表必须有唯一一个编码字段 |
|
例如单位编码、单位名称 |
是否为名称字段 |
如果为树结构表必须至少有唯一一个名称字段 |
|
|
是否树分类字段 |
树分类字段是在树列表页面中的下拉选择框,选择不同下拉项显示不同的树 |
|
|
正则表达式 |
用于页面校验 |
|
当字段被绑定正则表达式校验器时,使用这里的正则表达式进行校验,例如医生姓名的正则表达式要求只能输入中文。医生姓名正则表达式:^[/u4e00-/u9fa5]+$ |
页面属性说明:
页面属性用于创建此表对应的增删改查页面的时候使用。
页面属性 |
说明 |
示例 |
备注 |
页面输入方式 |
如为空,则默认生成文本输入框 |
|
复选框和单选按钮暂时不能使用。 |
数据字典类型 |
为字段绑定数据字典类型。如选择了数据字典类型,则生成的编辑页面,此列为下拉列表。 |
|
例如为HR的简历表的学历字段绑定一个学历数据字典类型,则生成的录入页面中,学历字段自动显示数据字典中定义的学历列表 |
列表页显示 |
是否在列表页面中显示 |
|
|
编辑面显示 |
是否在编辑页面中显示 |
|
|
列表页显示顺序 |
暂不使用,统一使用编辑页显示顺序 |
|
|
编辑页是否显示 |
设置字段是否在编辑页面中显示 |
|
如果不显示,则生成隐藏字段 |
弹出窗口 |
如果页面输入方式中选择了弹出窗口,则这里指定使用哪个弹出窗口 |
|
例如入库单中商品编码输入需要参照商品基本信息,这时需要使用弹出窗口,不能使用下拉列表,因为数据量很大。 |
是否查询条件列 |
如果是查询条件列,则生成页面时在列表页中显示一个查询条件列 |
|
查询条件列的输入方式会根据设置自动生成输入框或日期、下拉、弹出。 |
定制查询列 |
如果设置为定制查询列,则在定制查询时显示此字段 |
|
|
韩文列标签 |
不同语种的标签文字 |
|
这里输入了多语种标签文字,在生成页面的同时会自动生成对应的资源文件,这样对于国际化不需要手工编写和编译国际化资源文件。 |
英文列标签 |
|
||
日文列标签 |
|
以上字段信息定义完成并保存后,再打开表结构定义页面,勾选一个数据库表,点“建表”,则平台会执行以下操作:
(1)创建了数据库表结构。
(2)生成了java实体类源代码文件。实体类源代码位于对应子系统的entity目录下。
(3)生成了hibernate映射文件(.hbm.xml)。hibernate映射文件也位于对应子系统的entity目录下。
(4)在core-service-demo.xml中添加了此hibernate映射文件的声明。具体见D:/project/openjweb/src/java/core-service-demo.xml。
如果在生成表结构定义中,设置了“是否创建业务逻辑类”为“是”,则建表时除了生成实体类和hibernate映射类文件,还生成业务逻辑接口和实现类,并自动在core-service-demo.xml中配置了带事务支持的spring bean。例如会员表为mem_person,建表时由于设置了创建业务逻辑类,则在D:/project/openjweb/src/java/com/openjweb/mem/service目录下创建了接口文件IMemPersonService.java,并在D:/project/openjweb/src/java/com/openjweb/mem/service/impl目录下生成了ImemPersonService的实现类MemPersonServiceImpl.java,并且core-service-demo.xml中自动添加对应的spring bean的配置,增加的配置设置了声明式事务拦截器,在ImemPersonService中声明的所有方法将都支持事务处理。core-service-demo.xml中生成的配置如下:
<bean id="IMemPersonService" parent="txProxyTemplate1">
<property name="target">
<bean class="com.openjweb.mem.service.impl.MemPersonServiceImpl">
<property name="dbService" value="IDBSupportService3"/>
</bean>
</property>
</bean>
表字段定义中不需要指定主键、日期时间戳、创建人等字段。系统会默认生成pk_id(主键)、唯一行号(row_id)、创建时间create_dt,修改时间update_dt,创建人create_uid,修改人update_uid等字段,对于树结构表还生成tree_code字段。表结构创建时,系统自动创建这些字段的定义信息。
新增表字段:
在表字段定义列表页面的数据行中有一个“生成字段”的连接,这个功能的作用是当数据库表已经建立以后,如果还需要增加新字段,则录入新的字段定以后,点“生成字段”,可在数据库表中增加新的字段,另外还会在java实体类文件中新增类属性的声明及set和get方法,同时hibernate映射文件中会增加此字段的配置。
表字段校验器:
在表字段定义列表页面的数据行中有一个“字段校验器”的连接,用于为录入或修改数据时的字段校验,在本平台中,大部分字段校验可通过为字段配置字段校验器的方式实现,不需要修改jsp文件,下面是字段校验器配置页面:
图2-8 字段校验器
下面分别介绍各字段校验器的作用:
序号 |
字段校验器名称 |
作用 |
1 |
数据格式校验器 |
校验字段长度(与数据库字段长度匹配)、是否必填等,应为每个页面上录入的字段勾选数据格式校验器。 |
2 |
唯一值校验器 |
当前字段不允许重复,目前只支持单列的唯一值判断。 |
3 |
邮箱格式校验器 |
判断输入内容是否为邮箱格式 |
4 |
自定义正则表达式校验器 |
在表字段定义中有一个正则表达式,当勾选此校验器,则保存时校验字段录入内容是否符合正则表达式 |
5 |
居民身份证格式校验器 |
判断录入内容是否符合15或18位的居民身份证格式 |
6 |
手机格式校验器 |
判断录入内容是否符合手机格式 |
|
字段首尾禁止空格校验器 |
如果字段首尾含空格,则提示错误 |
2.4 功能定义
2.4.1 定义功能页面
使用本平台的功能定义可为创建的表结构生成对应的增删改查页面。本平台支持单表、主明细表、树形结构增删改查页面的生成。此功能对应的菜单为:系统管理—功能定义。
下面是功能定义的列表页面:
图2-9 功能定义列表页面
图2-10功能定义编辑页面
上一节讲到表结构创建,在功能定义中可以选择新建的表创建增删改查页面,具体操作是:
(1) 新建一条记录,输入功能名称、列表页面、编辑页面标题、实体类名中选择创建的数据库表。
(2)DB Service Bean不用修改,按系统默认的IDBSupportService3即可。
(3)URL地址也不需要手工维护,保存后系统会自动根据所属系统、表名生成url地址。
(4)表单类型:表单类型包括树形结构、单表、主从-主表、主从-明细表。大多数情况下是使用单表模式创建。如果选择树形结构,则上一节中创建表的时候需要勾选“是否树形结构”为“是”,而且需要在表字段信息中指定表的代码列和名称列。对于主从-主表,主从-明细表的生成稍微复杂一点。例如会员表(mem_person)是主从-主表,会员参加活动情况、会员购物情况、会员客服联系情况是针对会员表的子表。创建主从表样式的页面需要按照以下步骤:
a)首先使用功能定义新增一条记录,对应数据库表为会员表,表单样式为主从-主表。
b)其次分别新建会员活动情况、会员购物情况、会员客服联系情况三个功能,表单样式都是主从-子表。
c)打开系统管理-主明细表关系功能页面,建立三个主明细关系,分别是会员活动、购物、客服,主表都是会员表(mem_person),子表是会员活动、购物、客服三个表,主表关联字段为row_id,子表关联字段为master_row_id(系统生成数据库表时自动生成row_id和master_row_id字段)。下面是主明细关系列表页面:
图2-11 主明细关系列表页面
图2-12 主明细关系编辑页面
URL相对地址即功能定义中生成的URL地址,复制过来即可,页面Tab文字是生成的主明细页面中的tab页的标签文字,row_id和master_row_id是系统默认,不要修改。
2.4.2 生成代码
以上功能定义完成后,回到列表页面,点对应行记录的“生成代码”即可生成此功能的控制层源代码文件和列表页、编辑页、弹出窗口页JSP文件以及struts2的action配置。对于主明细表,主表和子表页面都要分别生成,例如上面说的会员主表和活动、购物、客服三个子表都要逐个生成(生成顺序不限)。
生成代码执行完毕后,这时可关闭tomcat,使用D:/project/build/userbuild.bat文件编译工程。当然也可以刷新eclipse工程将最新生成的文件自动加到工程中由eclipse编译。不过推荐使用ant编译,因为ant的编译速度比较快。平台原先是使用的在线编译模式,不需要关闭tomcat,但编译多次后会出现Permgen space溢出的问题,所以改为关闭tomcat后编译的方式。在生成代码的过程中会有两次js脚本提示代码创建完成等信息,点确定继续即可。
此步骤具体生成的代码包括:
(1)在对应子系统的action目录下创建了struts2的控制层java源代码。
(2) 在对应子系统的jsp目录下分别创建了list开头的列表页面和edit开头的编辑页面以及popup开头的弹出窗口jsp页面文件。
(3) 自动配置struts2的action,例如struts-mem.xml中生成的会员管理的配置:
<action name="listMemPerson" class="com.openjweb.mem.action.MemPersonAction" >
<result>/WEB-INF/jsp/mem/listMemPerson.jsp</result>
<result name="edit">/WEB-INF/jsp/mem/editMemPerson.jsp</result>
<result name="login">/login.jsp</result>
<result name="reject">/accessDenied.jsp</result>
<result name="wait">/wait.jsp</result>
<result name="error">/WEB-INF/jsp/comm/error.jsp</result>
<result name="input">/WEB-INF/jsp/mem/editMemPerson.jsp</result>
<result name="edit2">/WEB-INF/jsp/mem/editMemPersonRuhui.jsp</result>
<result name="view">/WEB-INF/jsp/mem/viewMemPerson.jsp</result>
</action>
注意要在对应子系统的struts2配置文件中查找新增加的内容。下节介绍平台生成的单表、主明细表、树形结构三种页面。
2.4.3 平台生成的各种页面
1)平台生成的单表增删改查页面
图2-13 平台生成的单表增删改查列表页面
图2-14 平台生成的单表增删改查编辑页面
图2-15 定制查询
图2-16 导出EXCEL
平台生成的增删改查列表页面,包括了查询条件、定制查询条件、增加记录、删除记录、编辑修改记录、分页器、excel导入导出、附件上传功能。
可以看出,生成上面功能页面不需要手工编写java和jsp代码。附件上传是针对每条记录的,也就是说,可以为任何行记录上传附件,excel导出导出也是生成的通用功能。分页器是跨数据库的,因为分页器是用hibernate实现的,分页器支持首页、末页、上页、下页、总页数、记录数显示、指定跳转,每页行数设置等功能。
在编辑页面和查询条件列中,如果在表字段中定义的字段输入方式为日期、下拉、弹出窗口,则相应的字段录入时分别显示为日期选择器、下拉列表框、弹出窗口。
2)平台生成的主明细列表页面
图2-17 平台生成的主明细列表页面
3)平台生成的树形结构维护页面
图2-18 平台生成的树形结构维护页面
图2-18是平台生成的树形结构维护页面,可以看出,生成此类的树形结构维护页面不需要编写任何代码。
2.5 权限与功能菜单定义
当功能定义完成后,需要为此功能定义功能菜单项及权限。本平台中权限基本信息定义和功能菜单定义是同一个功能。权限使用的是spring security安全框架,只要在权限基本信息中定义了某权限对应的URL,则此URL会受到spring security安全框架的保护,如果访问者没有获得授权,则不能访问权限定义中定义的url。
后台首页的左侧的功能树实际是从权限定义中取得CRM_MENU开头的菜单树,目前支持两层功能菜单。权限维护页面中,所有功能菜单都需要归属于“当前Web应用”下拉列表,也就是说,在权限维护页面中,选择“当前Web应用”的下拉列表,在此列表对应的功能树供录入菜单。如果定义的权限不是功能菜单,则权限编码前缀不要使用CRM_MENU开头。下面是权限及功能菜单定义的页面(功能位于:系统管理-权限管理):
图2-19 权限及功能菜单定义页面
当上一节生成了功能定义页面后,粘贴生成功能的url,然后在权限管理中,选择对应的菜单树,在此树下建立子菜单,例如会员基本信息功能是在会员管理功能下建的子节点,系统自动创建功能菜单编号。将上节功能定义生成的url添加到图2-19的URL资源中,然后保存。
此页面也可以定义非菜单的权限编码,例如为会员管理页面的定义了删除权限,如果没有删除权限,则删除按钮不可见。会员删除权限的权限编码定义为AUTH_BTN_MEM001,在页面中是这样使用spring security的权限标签的:
<sec:authorize ifAllGranted="AUTH_BTN_MEM001">
<input type="button" name="" title="删除会员" value='<s:text name="button.del"/>' style=" color:#000000; font-size:12px; width:61px; height:20px; padding:3px; border:0px;background-image:url(<%=request.getContextPath() %>/images/bt.gif)" onclick="doDelete()"/>
</sec:authorize>
JSP中如果使用Spring security的权限标签,则需要在jsp页面中增加:
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
关于Spring Security安全框架的权限标签的使用方法这里就不介绍了,可到网上查找具体的使用方法。
定义好的功能菜单权限或其他权限如何授予给用户,下面首先介绍组织结构、用户、角色后再介绍授权的操作。
2.6 组织结构、角色、用户管理
2.6.1 单位基本信息维护
此功能位于系统管理—单位基本信息。下面是单位基本信息的列表页面:
图2-20 单位基本信息维护
在定义组织结构树之前需要录入单位基本信息,如果用户只需要使用一个单位,则可保留C0001本单位,将其他单位删除。
2.6.2 系统角色管理
此功能位于系统管理—系统角色管理。
此功能维护系统级角色,系统角色是开发时由开发人员预定义的角色,这种角色不具有树形结构,一般也不由用户来维护,可预先为系统角色分配相关权限,然后在人员授权时,为指定用户关联角色,则用户会间接得到权限。系统角色的编码不要修改,否则会影响到授权结果。
系统角色还可以用于标识不同子系统的管理员,例如档案系统管理员的系统角色为dmsAdminRole,在档案管理数据授权的SQL中,可直接引用这个角色编码作为sql的条件。
下面是系统角色管理的列表页面:
图2-21 系统角色管理
在此页面中,勾选一个角色,点页面上的授权,可为此角色关联功能权限。下面是为角色授权的页面:
图2-22 角色授权页面
2.6.3 组织结构维护及授权
组织结构维护功能位于:系统管理—组织结构维护。
图2-23 组织结构维护页面
首先介绍一下页面上按钮的作用:
(1) 添加子节点:选中一个组织结构节点,然后点添加子节点,可为此组织结构节点增加子节点,行政部门、角色、子公司都可以有子节点,目前系统没有做任何限制。
(2) 添加同级节点:增加所选节点的同级节点。
(3) 人员:当组织结构类型为行政部门时,为所选择的行政部门添加人员。人员对应登录帐号。
(4) 角色/组成员:当所选节点为“角色”类型,可为此角色关联人员(登录帐号),一个帐号可与多个角色关联。
(5) 授权:为当前所选节点分配权限。权限规则:当为行政部门授权时,部门直接下属人员可获得部门的权限,当为角色授予权限,则此角色关联的人员可获得角色的权限。
(6)保存:保存组织结构信息。
(7)删除:删除组织结构节点,如果有下级组织结构节点,则当前节点不可以删除。删除时,数据库提交和左侧树的刷新是异步的。添加和修改节点左侧组织结构树都可以同步刷新。
组织结构类型可以在数据字典中定义,但已经存在的组织结构类型请不要修改。因为数据字典编码已经使用。
组织结构的授权页面和角色授权页面类似,这里不再介绍。下面介绍人员和角色/组成员两个按钮的功能:
人员:
选择一个部门,点人员按钮,显示此部门下当前的人员,见下图:
图2-24 部门人员
图2-24的增加和删除功能就不介绍了。系统角色是为指定用户关联上节中介绍的系统角色,见下图:
图2-25 用户-系统角色授权
为用户分配系统角色后,此用户可获得系统角色拥有的权限。
权限按钮用于直接为用户授权,见下图:
图2-26 用户授权
用户最终获得的权限包括:直接给用户分配的权限、用户关联系统角色获得的权限、用户所属部门分配的权限、用户关联角色获得的权限,在组织结构树中的角色支持功能权限继承,如果某部门下建立了角色树(业务角色,组织结构类型为角色),则下级角色获得权限,上级角色也可以获得。
角色/组成员:
选择组织结构树中的角色节点(其他类型节点授予角色/组成员无授权效果),然后点“角色/组成员”,显示下面页面(可选择本单位-档案管理室-档案管理员):
图2-27 角色关联人员页面
点上图的人员,弹出人员选择页面,勾选点“确定”后,可将未关联此角色的人员添加到此角色关联的人员列表中。上图的删除是勾选删除角色关联的人员,不是删除人员的基本信息。
2.7 数据权限
上面介绍了功能授权,本节介绍数据权限。数据权限的典型例子:在本平台中,用户接收和发送的邮件正文都存在邮件接收表和发送表中,但不同用户登录系统只能看到自己发送或接收的邮件,不可以看到其他人的邮件。
数据权限分两种情形:
(1)指定一个SQL在定义某表的数据权限规则,例如邮件发件箱定义了${user.loginId}=createUid,${user.loginId}在运行时会转换称当前登录帐号’amdin’,这样sql的规则为createUid=’admin’,及创建人为当前登录帐号’admin’。数据权限的SQL表达式采用hibernate的HQL语法。在表达式中可以使用的一些变量:
${user.loginId} 在运行时用当前登录用户帐号替换,例如’admin’
${user.comId}用当前用户所属公司替换,如’C0001’
${user.deptId}用当前用户所属部门替换,如’91152’,用户所属部门对应comm_dept表的pk_id。
${user.userId}替换为整型,不带引号,对应comm_user的user_id。
(2)精确将每一行数据的查询权限、下载权限等权限授予给指定的角色或人员。
下面是档案基本信息的查询数据权限定义页面,不具有权限的用户看不到对应的记录,档案管理员可看到所有记录。此权限定义sql包含了角色数据权限和用户数据权限的授权规则,见下图:
图2-28 数据权限列表页面
图2-29 数据权限编辑页面
说明:条件规则设置为1=1即可,表示所有用户都适用的权限规则。过滤语句是过滤语句1-7合并起来的hibernate HQL语句,因为考虑到有的关系数据库不支持超过255的变长字符串,所以使用了7个过滤语句。当打开列表页面时,系统会自动查找对应功能的数据权限设置,找到数据权限规则后则将数据权限SQL附件到原有的查询语句中,最终查出的结构为当前用户有权限查看的数据。用户和角色的授权可参考图2-28的档案基本信息(操作类型为查询)。
上面的数据权限设置是要求用户配置角色数据权限和用户数据权限,平台用户可用dms/dms登录,打开权限管理的收集整编,见下图:
图2-30 档案基本信息列表
我们可以看到上图中每个档案都有角色授权和用户授权连接,我们看一下角色授权连接打开的页面:
图2-31 角色授权列表页面
图2-31是选择某行档案后,为档案的浏览查询权限设置的角色,从列表中可以看出,授权可以精确设置给不同用户,并且为不同用户指定是否使用权限有效期控制,如果设置了权限有效期控制则过期权限时效,另外还可以启动访问次数控制。所以说本平台中对于数据权限的控制是很细致的。
用户数据权限控制和角色数据权限类似,只是授权对象为用户而不是角色,在这里定义了角色数据权限后,上面配置的档案管理数据权限SQL是读取此功能配置的数据。
在这里顺便说明一下,角色数据权限对应comm_data_auth_role表,用户数据权限对应comm_data_auth_user表。
用户除了查询权限外,还可以自定义附件下载、借阅等与具体业务相关的针对行记录的操作,并针对这些操作设置数据权限,例如档案管理中可以控制为具体的档案配置可借阅的角色或用户。参考工作流—数据权限码定义:
图2-32 为具体的表定义数据权限码
图2-32中定义了档案基本信息的浏览、下载 、借阅数据权限编码,其实如果业务有需要,还可以定义删除、编辑或其他数据权限码,并可参考档案的查询权限实现其他数据权限控制逻辑。
2.8 字段校验器二次开发
除了本平台预置的校验器外,用户还可以开发自己的字段校验器,开发新的字段校验器都需要继承Ivalidator接口,并录入到字段校验器表中,见下图(系统管理-字段校验器):
图2-33 字段校验器定义页面
2.9 日志管理
由于不同的项目对日志需要记录的内容不同,所以本平台大部门操作没有记录日志,目前档案管理系统的部分操作增加了写日志的代码。见下图:
图2-34 日志管理列表页面
图2-35 日志管理查看页面
图2-35 日志管理编辑页面
2.10 脏数据管理
平台提供了脏数据清理功能,用户可以自己定义脏数据清理的SQL。由于在开发或使用过程中,经常出现基本信息已经删除,但还有关联基本信息的记录存在,由于相关表没有增加物理主外键导致脏数据产生。例如删除了权限基本信息但权限-用户关系没有删除。有时候数据库表之间不方便加主外键,所以可使用脏数据管理功能手工清理脏数据。下面是脏数据管理的列表页面(功能位于:系统管理—脏数据管理):
图2-36 脏数据管理列表页面
2.11 表字段约束关系设置
在数据库设计时,虽然理论上我们需要为具有数据约束关系的表字段间建立主外键关系,但实际上不可能所有的有数据引用关系的表字段都方便建立主外键约束,所以平台提供了一个逻辑主外键定义功能,在删除时可以检查表字段值是否被其他表字段引用,如果被引用,则不允许删除基本表的记录。(这种情况下,相关字段的值的修改在程序上也需要控制,一般作为逻辑约束的字段值是不做修改的,例如数据字典编码),下面是表字段约束关系设置表(功能位于:系统管理:表字段约束关系设置):
图2-37 表字段约束关系设置
图2-37定义了主表字段和子表字段的约束关系,附加where条件是关联的附件条件,例如上图的第一行的意思是主表数据字典的dictCode字段与子表(档案分类)的docType建立了关联,基本关联条件为a.dictCode=b.docType and a.dictTypeCode='DMS_DOC_TYPE'。(红字部分是Where条件。A表示主表,b表示子表)。如果数据字典中删除某个记录,则系统会检查此记录的dictCode字段的值有没有被子表的某记录的对应字段引用,如果被引用,则删除失败。
说明:约束方式选择禁止删除,其他约束方式平台暂未实现。
第三章 内容管理
内容管理包括栏目管理、信息管理、搜索引擎全文检索等内容。
3.1 栏目管理
此功能位于新闻管理—新闻类别管理。下面是栏目管理的维护页面。
图3-1 栏目管理维护页面
因后台首页中只有两个小窗口是用作最新新闻和最新公告,所以这里暂时只定义了两个栏目。
3.2 信息管理
信息管理的后台列表页面:
图3-2 信息管理的后台列表页面
说明:点击栏目树会切换对应栏目下的信息列表,点信息列表的编辑显示信息编辑页面,见下图:
图3-3 信息管理的编辑页面
在列表页面中,如果勾选信后点“信息发布”,则信息则会改为已发布的状态。后台首页对应栏目可以看到发布的信息。另外信息发布时,会同时生成静态页面,生成的静态页面会存放到指定的目录下由搜索引擎定时构造全文检索索引。
3.3 全文检索引擎
当信息发布后,生成html静态页面,静态页面默认生成位置为D:/project/openjweb/webapps/pubinfo。平台默认为每半小时对pubinfo下面的文件重新构造索引。目前支持word,text,html格式全文检索.(pdf格式也支持,由于pdf格式的全文检索会产生大量临时文件,所以平台暂时屏蔽了对pdf的全文检索)。全文检索的url地址为http://localhost:8088/crm/search/search.jsp,目前暂未对search.jsp搜索页面进行美工处理。下面是core-service-demo.xml中配置的定时全文搜索引擎:
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<!--作业调度器,list下可加入其他的调度器-->
<ref bean="defaultTrigger"/>
<ref bean="luceneTrigger"/> <!—全文检索引擎-->
<ref bean="mailTrigger"/>
<ref bean="DMSTrigger"/> <!--档案管理系统定时器-->
<!-- <ref bean="smsTrigger"/> -->
</list>
</property>
</bean>
下面定义了每半小时重构一次索引:
<bean id="luceneTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="luceneTimerMethod" />
<property name="cronExpression" value="0 1/30 * * * ?" />
</bean>
第四章 手机短信
本平台提供手机短信群发队列管理功能。手机短信发送有两种方式:
(1)编写短信后,由安装在服务器的手机短信发送设备发送短信。这种情况需要在平台中集成短信发送驱动程序。
(2)使用短信服务运营商提供的URL地址,本平台负责将手机号、短信内容发送到指定的URL地址即可。
第五章 工作流
本平台目前提供了简单的工作流配置。具体文档见http://code.google.com/p/openjweb/downloads/list 地址中的workflow.rar (简易审批工作流)。图形化的工作流定义工具和工作流引擎将在2.0版本中推出。
第六章 在线考试/在线问卷
本平台提供了问(试)卷定义、问题及选项、标准答案、分数定义等功能。用户可在线答题,答题后除问答题外,系统可自动匹配标准答案进行评分。本章只大致介绍功能,不做具体操作的讲解。具体功能见CRM下的各菜单。
图6-1 问题定义(试题题干)
图6-2 定义问题的选项
图6-3 定义问卷
图6-4 为问卷选择试题
图6-5 问卷预览
第七章 档案管理子系统
档案管理子系统的操作说明将另文叙述。