Office Anywhere网络智能办公系统(以下简称通达OA),不仅是一套成熟的网络办公系统,同时也是一个完整、精巧的软件开发平台,不仅集成了Web开发的全套环境,并提供了管理架构、系统资源的开放性支持,是开发中小型管理应用系统的理想平台。
本文将从不同的技术层面向您揭示通达OA的二次开发细节,是主要针对专职程序设计人员、编程爱好者、软件产品技术支持人员编写的OA二次开发入门教程。
通过阅读本文,您将不仅可以了解通达OA的设计奥秘,也将能够运用本文所介绍的知识和技巧,轻松构建属于自己的应用系统或模块,文中将结合具体实例加以说明。
通达OA主要采用PHP语言开发,系统使用MySQL数据库。
在Windows平台下,通达OA主要注册了9个系统服务,可以通过控制面板-〉管理工具-〉服务,查看这9项服务,服务名分别是Office_Anywhere、MySQL5_OA、memcached Server、OfficeDaemon、OfficeIm、OfficeIndex、OfficeMail、OfficePOP3、OfficeTask,Office_Anywhere服务实际是集成了PHP模块的Apache服务,Apache是通达OA所使用的Web Server,通达OA也可以支持IIS作为Web Server,具体配置方法参见通达网站OA知识库相关文档。
关于PHP语言的使用,可参阅,下载PHP手册,作为开发指导;关于MySQL数据库的管理与使用,将在第二章进行详细介绍。
1.2目录层次结构
通达OA的目录层次结构清晰,体现出对服务程序、应用程序、WEB页面的巧妙整合与组织,便于理解和扩充,下面对目录结构加以说明:
MYOA
├─attach OA附件文件存放目录
├─bin Apache、PHP、Zend等主程序及配置文件,服务配置程序等
├─conf Apache配置文件
├─data5 MySQL数据库文件目录
│ ├─BUS 公交线路查询数据库
│ ├─TD_OA 通达OA主数据库
│ ├─MySQL MySQL系统数据库
│ ├─TD_OA_ARCHIVE 通达OA归档数据库
│ ├─ib_logfile0 InnoDB引擎使用的日志文件
│ ├─ib_logfile1 InnoDB引擎使用的日志文件
│ └─ibdata1 InnoDB引擎存储数据与索引的数据文件
├─logs Apache等日志文件目录
├─modules Apache的模块文件
├─MyAdmin 通达OA的MySQL管理工具
├─mysql5 MySQL主程序文件
├─nginx 高性能的通达Nginx Web应用服务
├─tmp 临时文件目录
└─webroot 通达OA的WEB根目录(PHP程序目录)
├─attachment 部分OA附件文件存放目录
│ ├─hrms_pic 人事档案照片目录
│ ├─product_pic 销售管理产品照片存放目录
│ ├─new_sms 新短消息提醒状态文件
│ ├─…… 部分附件目录(略)
│ ├─rss 今日资讯信息缓存文件
│ ├─update 系统升级,该文件夹下如存在1.php会被自动执行并删除
│ ├─weather 天气预报缓存文件
│ └─wm 外部邮件存储目录
├─general 主要模块目录
│ ├─ …… 一般模块目录(略)
│ ├─ipanel 主控面板,集成了菜单、短信箱等应用控制界面
│ ├─mytable 桌面模块程序
│ └─system 系统功能模块,下级目录略
├─inc 系统通用程序及函数目录
├─ispirit OA精灵页面
├─mobile OA移动界面
├─module 系统组件
│ ├─dept_select 部门选择组件
│ ├─editor 简易HTML编辑器组件
│ ├─OC Office 文档在线编辑与阅读
│ ├─OC_NETDISK 文档在线编辑与阅读-仅适用于网络硬盘
│ ├─save_file 文件转存组件
│ ├─user_select 用户多选组件
│ └─user_select_single 用户单选组件
├─portal 门户界面
└─static 系统通用程序及静态文件目录
├─common 通用css文件及其引用的图片文件
├─images 所有代码中的标签src引用的图片文件
├─templates 登录界面模版
├─theme 界面主题
├─wav 微讯提醒声音
├─js 界面主题
├─templates 登录界面模版
└─modules 所有模块非通用的css文件及其引用的图片文件等的目录
├─address 通讯簿非通用css文件及其引用的图片文件
├─ …… 部分模块目录(略)
└─workflow 工作流非通用css文件及其引用的图片文件
注:上表中红色颜色标示的目录是备份数据时需要备份的,是OA的所有数据所存放的目录。
Timeout 300 //连接超时,单位秒
ServerTokens Prod //Apache信息,Full,OS,Minor,Minimal,Major,Prod
ErrorDocument //错误文档
ErrorLog logs/error.log //错误日志
CustomLog logs/access.log combined //访问日志
display_errors = Off //是否显示PHP程序错误
log_errors = Off //是否记录错误日志
error_log = filename //错误日志记录文件
max_execution_time = 1200 //程序最大执行时间,单位秒
memory_limit = 256M //单个程序占用内存上限
post_max_size = 1000M //表单提交最大数据量,单位MB
upload_max_filesize = 200M //上传单个附件大小,单位MB
basedir=D:/MYOA/mysql5/ //MySQL主程序路径
datadir=D:/MYOA/data5/ //MySQL数据库路径
tmpdir=D:/MYOA/tmp/ //缓存路径
character-set-server=gbk //MySQL数据库字编码
port=3336 //端口
wait_timeout=30 //SQL语句执行结束后自动断开时间
interactive_timeout=30 //运行SQL语句时段开时间
skip-name-resolve //避免外部锁定(默认是ON)
bind-address=0.0.0.0 //允许远程连接
innodb_file_per_table=1 //启用独立表空间模式
innodb_file_format=Barracuda //InnoDB数据压缩
注:以上所有的配置选项修改后都需要重启服务才会生效。
MySQL的数据库管理工具很多,phpMyAdmin是使用PHP编写的免费MySQL数据库管理工具。由于OA的MySQL数据库出于安全考虑,被配置为仅能从本机访问,所以使用phpMyAdmin这样的B/S结构的管理工具,可实现数据库的远程管理。
第一步、下载程序包
phpMyAdmin程序可以从其官方网站http://www.phpmyadmin.net下载,建议下载最新的all-language版本。
第二步、解压缩
在MYOA\webroot目录下新建一个目录,如mysql369(为了防止他人利用该工具侵入数据库系统,可把目录名设为比较复杂的,如MySQL2345,避免目录名被猜测到。),将下载的程序包解压后拷贝至mysql369目录下。
第三步、修改配置文件
用文本编辑器,如记事本,打开MySQL管理工具目录,复制config.sample.inc.php文件并改名为confing.inc.php,打开后修改以下配置信息:
$cfg['blowfish_secret'] = ''; //随便输入一个字符串,加密Cookie等信息
$cfg['Servers'][$i]['auth_type'] = 'http'; //http,config,cookie,建议使用http
$cfg['Servers'][$i]['host'] = 'localhost'; //数据库地址,默认为localhost
$cfg['Servers'][$i]['port'] = '3336'; //数据库端口,默认为3336
$cfg['Servers'][$i]['user'] = 'root'; //数据库用户名,默认为root
$cfg['Servers'][$i]['password'] = ''; //数据库密码,默认为myoa888
第四步、使用phpMyAdmin
MySQL管理工具地址:http://OA地址/mysql,注意,进入后先选择中文界面(中文-Chinese simplified )。该管理工具的使用需具有一定数据库基础,请勿进行危险操作,以免导致数据丢失。
phpMyAdmin主界面如下
在左侧选择TD数据库,可查看OA所有的数据表,如下图
点击左侧的表名,则右侧列出该表的结构和字段、索引、记录数等信息,如下图
phpMyAdmin的具体使用教程方法可以参考 通达网站/OA知识库/Office Anywhere 高级应用技巧/OA数据库管理工具/mysql网页方式管理工具/phpMyAdmin的安装和使用.wmv 。
创建一个模块一般需要经过以下几个步骤:根据功能建立程序存放目录、创建菜单、分配菜单权限、编码、测试等。
在MYOA\webroot\general下建议一个目录abc,作为自己开发模块的目录,将程序放置于该目录下,默认页面是index.php或index.html或index.htm
用管理员帐号进入OA,打开 系统管理->菜单设置,在相应的一级菜单后点击"下一级"链接,在右侧的界面上点击"增加子菜单项"按钮,如下图所示:
详细阅读上图界面中的说明信息,按界面上说明的要求定义好菜单:
子菜单项ID:系统自动生成,无须调整
上级菜单:根据自己的实际应用情况调整
子菜单项代码:两位的数字或字母,作为排序之用
子菜单项名称:根据自己的实际应用自行填写
子菜单模块路径:该菜单对应的程序目录,应为上一个步骤创建的目录名称。如果为abc,则该菜单对应的菜单图片名称为MYOA\webroot\static\images\menu\abc.gif,需要自己创建或拷贝abc.gif拷贝至MYOA\webroot\static\images\menu下.
用管理员帐号进入OA,打开 系统管理->组织机构设置->角色与权限管理,给相关的角色分配刚创建的菜单的使用权限,则相关角色的人员就可以在OA界面左侧的菜单中看到并访问该菜单。
为便于用户开发自己的模块,通达科技在用户服务区提供了Office Anywhere部份模块源码的下载,供开发人员参考。
用户自行开发OA的功能模块,需要根据OA的相关规范进行开发,这样既可以使自行开发的模块和OA的界面效果一致,又可以保证自行开发的程序在OA安全框架的保护之下,这样不仅可以保证新模块数据的安全,又可以使开发人员集中精力投入到模块功能的开发上。
OA的各功能模块下的每个程序都需要包含OA的安全验证程序:inc/auth.inc.php。该程序包含了对用户登录信息、是否有权限访问该路径等的检查等。具体的语法为:include_once("inc/auth.inc.php");为更好兼容更多版本的浏览器,需要使用标准统一的HTML解析模式对页面进行解析和渲染,在所有包含HTML代码输出的页面,都需要包含:inc/header.inc.php,输出统一的HTML头信息,包括采用的HTML标准、页面字符集、页面标题、标准界面样式表(style.css)等。在没有HTML代码输出的页面,不需要包含该文件。OA数据库的所有表名全部使用小写字母,字段名称全部使用大写字母,新模块中字段名也建议与表名统一使用小写字母,开发过程请注意。
在开发自己的功能模块时可以参考现有OA模块,把功能相似的OA模块代码复制一份,然后在OA 代码的基础上修改。以下几个小节介绍OA系统变量和数据库的使用。
OA系统提供了16个通过SESSION保存的当前用户的系统变量,分别是
$_SESSION["LOGIN_UID"] //用户数字ID
$_SESSION["LOGIN_USER_ID"] //用户名,登录使用
$_SESSION["LOGIN_BYNAME"] //用户别名
$_SESSION["LOGIN_USER_NAME"] //用户真实姓名
$_SESSION["LOGIN_USER_PRIV"] //用户角色ID
$_SESSION["LOGIN_USER_PRIV_OTHER"] //用户辅助角色ID
$_SESSION["LOGIN_SYS_ADMIN"] //用户是否有系统管理员权限
$_SESSION["LOGIN_DEPT_ID"] //用户部门ID
$_SESSION["LOGIN_DEPT_ID_OTHER"] //用户辅助部门ID
$_SESSION["LOGIN_AVATAR"] //用户头像
$_SESSION["LOGIN_THEME"] //用户界面主题
$_SESSION["LOGIN_FUNC_STR"] //用户模块权限
$_SESSION["LOGIN_NOT_VIEW_USER"] //用户禁止查看用户列表
$_SESSION["LOGIN_DEPT_ID_JUNIOR"] //用户所在部门和所属部门合集字符串
$_SESSION["LOGIN_CLIENT"] //用户登录OA的设备类型
$_SESSION["LOGIN_USER_SEX"] //用户性别
如需使用这些系统变量,程序需要包含auth.inc.php,如下代码:
include_once("inc/auth.inc.php");
echo "我的登录用户ID是".$_SESSION["LOGIN_USER_ID"]; //本句中的.表示字符串连接
?>
以下是一段样例代码index.php,可放置于abc目录下,可作为开发OA应用程序的模版。//或/*…*/是PHP的注释语句。
include_once("inc/auth.inc.php"); // 如需登录验证则包含,未登录将退出
//include_once("inc/conn.php"); // 如需要连接数据库则包含
//include_once("inc/utility_all.php"); // 如需要使用公用函数则包含
//include_once("inc/check_type.php"); // 如需要使用类型检验函数则包含
$HTML_PAGE_TITLE = _("功能模块名称");
include_once("inc/header.inc.php"); // 如有HTML代码输出则包含
//如已包含auth.inc.php,则无须包含conn.php
?>
echo "当前登录的用户为:".$_SESSION["LOGIN_USER_NAME"].",用户名为:".$_SESSION["LOGIN_USER_ID"];
?>