• Office Anywhere 网络智能办公系统二次开发手册

    前 言

    Office Anywhere网络智能办公系统(以下简称通达OA),不仅是一套成熟的网络办公系统,同时也是一个完整、精巧的软件开发平台,不仅集成了Web开发的全套环境,并提供了管理架构、系统资源的开放性支持,是开发中小型管理应用系统的理想平台。

    本文将从不同的技术层面向您揭示通达OA的二次开发细节,是主要针对专职程序设计人员、编程爱好者、软件产品技术支持人员编写的OA二次开发入门教程。

    通过阅读本文,您将不仅可以了解通达OA的设计奥秘,也将能够运用本文所介绍的知识和技巧,轻松构建属于自己的应用系统或模块,文中将结合具体实例加以说明。

    第一章 软件开发环境简介

    1.1 编程环境

    通达OA主要采用PHP语言开发,系统使用MySQL数据库。

    在Windows平台下,通达OA主要注册了9个系统服务,可以通过控制面板-〉管理工具-〉服务,查看这9项服务,服务名分别是Office_Web、MySQL5_OA、Office_Redis、OfficeDaemon、OfficeIm、OfficeIndex、OfficeMail、OfficePOP3、OfficeTask,Office_Web是管理ngnix进程的服务,Office_Web是通达OA所使用的Web Server,通达OA也可以支持IIS作为Web Server,具体配置方法参见通达网站OA知识库相关文档。

    关于PHP语言的使用,可参阅http://www.php.net,下载PHP手册,作为开发指导,PHP版本已升级至7.2,该版本中许多函数或方法有调整,使用时需要注意;关于MySQL数据库的管理与使用,将在第二章进行详细介绍。

    1.2目录层次结构

    通达OA的目录层次结构清晰,体现出对服务程序、应用程序、WEB页面的巧妙整合与组织,便于理解和扩充,下面对目录结构加以说明:

    MYOA

    ├─attach OA附件文件存放目录

    ├─bak 数据库默认备份目录

    ├─bin PHP、Zend等主程序及配置文件,服务配置程序等

    ├─data5 MySQL数据库文件目录

    │ ├─BUS 公交线路查询数据库

    │ ├─TD_OA 通达OA主数据库

    │ ├─crscell 报表数据库

    │ ├─MySQL MySQL系统数据库

    │ ├─TD_OA_ARCHIVE 通达OA归档数据库

    │ ├─ib_logfile0 InnoDB引擎使用的日志文件

    │ ├─ib_logfile1 InnoDB引擎使用的日志文件

    │ └─ibdata1 InnoDB引擎存储数据与索引的数据文件

    ├─logs OA服务等的日志文件目录

    ├─MyAdmin 通达OA的MySQL管理工具

    ├─mysql5 MySQL主程序文件

    ├─nginx 高性能的通达Nginx Web应用服务

    ├─tmp 临时文件目录

    └─webroot 通达OA的WEB根目录(PHP程序目录)

    ├─attachment 部分OA头像、各模块配置文件存放目录

      ├─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文件及其引用的图片文件

    ├─webservice webservice接口,不建议使用

    注:上表中加粗标示的目录是备份数据时需要备份的,是OA的所有数据所存放的目录。

    1.3参数配置

    1.3.1 OfficeFPM配置(MYOA\bin\service.ini)

    1.3.2 OfficWeb配置(MYOA\bin\service.ini)

    1.3.3 MySQL参数(MYOA\bin\service.ini)

    1.3.4 OfficeIm配置(MYOA\bin\service.ini)

    1.3.5 Redis配置(MYOA\bin\service.ini)

    1.3.6 PHP配置(MYOA\bin\php.ini)

    1.3.7 MySQL配置(MYOA\mysql5\my.ini)

    注:以上所有的配置选项修改后都需要重启相应服务才会生效。

    1.3.8 OfficWeb、OfficeFPM和PHP的关系

    img

    OfficeWeb服务守护OfficeFPM进程和OfficeNginx。OfficeFPM进程启动多个(ProcessNumber)FastCGI进程。OfficeWeb根据配置参数(MemoryWarning和MemoryMax)定时检测OfficeNginx的内存占用情况,保证OfficeNginx时刻处于正常响应状态。

    1.4核心文件

    1.4.1 auth.inc.php (MYOA\webroot\inc)

    通达OA为满足用户数据安全,原则上所有的php页面执行都将包含auth.inc.php权限验证程序,其中包含session合法性验证、访问路径授权验证等;

    例:

    1.4.2 header.inc.php (MYOA\webroot\inc)

    为保证通达OA功能显示标准统一,需要使用标准统一的HTML解析模式对页面进行解析和渲染,在所有包含HTML代码输出的页面都需要包含header.inc.php程序,其中包括采用的HTML标准、页面字符集、页面标题、标准界面样式表(style.css)等;

    例:

    1.4.3 common.inc.php (MYOA\webroot\inc)

    为了防止用户输入不安全数据等,通达OA为您提供了用户输入数据($GET、$POST、$_COOKIE)过滤和校验程序,原则上所有php页面文件都需要包含,但如果页面已经包含过auth.inc.php、header.inc.php或conn.php,则无需再单独包含。

    例:

    1.4.4 td.class.php (MYOA\webroot\inc)

    为方便用户快速连接操作数据库,且对SQL语句安全验证,原则上在进行数据库操作的所有php页面都需要包含td.class.php程序,但如果页面已经包含auth.inc.php程序,则无需再单独包含;

    例:

    1.5国际化(i18n)

    通达OA采用php通用i18n方案gettext扩展。php文件中所有中文字符串需要用“_()”函数包裹。

    例:

    第二章 数据库管理

    2.1 phpMyAdmin的安装

    MySQL的数据库管理工具很多,phpMyAdmin是使用PHP编写的免费MySQL数据库管理工具。由于OA的MySQL数据库出于安全考虑,被配置为仅能从本机访问,所以使用phpMyAdmin这样的B/S结构的管理工具,可实现数据库的远程管理。

    第一步、下载程序包

    phpMyAdmin程序可以从其官方网站https://www.phpmyadmin.net/files/4.2.13.3/下载,建议下载all-language版本。注意:只支持4.2及更低版本,更高的版本和我们OA的设置并不兼容。低版本有可能因为停止维护等原因存在安全性隐患,请使用后删除或使用诸如navicat、mysql workbench其他mysql管理工具。

    第二步、解压缩

    在MYOA\webroot目录下新建一个目录,如mysql369(为了防止他人利用该工具侵入数据库系统,可把目录名设为比较复杂的,如MySQL2345,避免目录名被猜测到。),将下载的程序包解压后拷贝至mysql369目录下。

    第三步、修改配置文件

    用文本编辑器,如记事本,打开MySQL管理工具目录,复制config.sample.inc.php文件并改名为confing.inc.php,打开后修改以下配置信息:

    第四步、使用phpMyAdmin

    MySQL管理工具地址:http://OA地址/mysql369,注意,进入后先选择中文界面(中文-Chinese simplified )。该管理工具的使用需具有一定数据库基础,请勿进行危险操作,以免导致数据丢失。

    如果出现如下报错情况,请下载phpmyadmin4.2以下版本,更高的版本和我们OA的设置并不兼容。

    img

    2.2 phpMyAdmin的使用

    phpMyAdmin主界面如下

    img

    在左侧选择TD数据库,可查看OA所有的数据表,如下图

    img

    点击左侧的表名,则右侧列出该表的数据,如下图

    img

    phpMyAdmin的具体使用教程方法可以参考 通达网站/OA知识库/Office Anywhere 高级应用技巧/OA数据库管理工具/mysql网页方式管理工具/phpMyAdmin的安装和使用.wmv 。

    第三章 如何创建一个模块

    创建一个模块一般需要经过以下几个步骤:根据功能建立程序存放目录、创建菜单、分配菜单权限、编码、测试等。

    3.1建立模块目录

    在MYOA\webroot\general下建议一个目录new_module,作为自己开发模块的目录,将程序放置于该目录下,默认页面是index.php或index.html或index.htm

    3.2 创建菜单

    用管理员帐号进入OA,打开 系统管理->菜单设置,在相应的一级菜单后点击“下一级”链接,在右侧的界面上点击“增加子菜单项”按钮,如下图所示:

    img

    详细阅读上图界面中的说明信息,按界面上说明的要求定义好菜单:

    3.3 分配菜单权限

    用系统管理员账号,在菜单创建完成后跳转界面直接可以给指定菜单分配权限(首次分配菜单权限时需要验证超级密码,与系统管理->组织机构设置->角色与权限管理中超级密码一致),如下图所示:

    img

    img

    也可以使用传统方式给新建菜单分配权限,用管理员帐号进入OA,打开 系统管理->组织机构设置->角色与权限管理,给相关的角色分配刚创建的菜单的使用权限,则相关角色的人员就可以在OA界面左侧的菜单中看到并访问该菜单。

    img

    3.4 编码和测试

    为便于用户开发自己的模块,通达科技在用户服务区提供了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系统变量和数据库的使用。

    3.4.1 调试

    使用PHP自带方法调试

    在程序开发过程中,会遇到各种各样的问题,大多数的问题可以通过查看变量的值来确定,PHP提供了几个输出变量值的方法,在开发过程中可以灵活运用。

    使用TD::log方法进行调试

    OA提供了一个记录日志的方法TD:: log($data, $namespace = 'common'),使用此方法,可以方便的将多个变量记录为一组日志。此日志的存储地址默认为D:\MYOA\logs\oa\月份$namespace.log。使用方法如下:

    debug.log文件内容如下:

    img

    3.4.2 会话变量

    OA系统提供了多个通过SESSION保存的当前用户的会话变量,分别是:

    如需使用这些会话变量,程序需要包含auth.inc.php,如下代码:

    也可以注册新的会话变量,可以看到,此变量是一个数组形式,直接按照数组的语法添加即可,如下代码:

    3.4.3 PHP代码样例

    以下是一段样例代码index.php,可放置于new_module目录下,可作为开发OA应用程序的模版。

    程序运行结果如下:

    img

    3.4.4 数据库操作

    OA目前支持MySQL、达梦、人大金仓、神舟通用等数据库(目前其他数据库正在陆续兼容中,具体可咨询销售人员),为保持各数据库的查询统一,各模块均采用medoo框架读取数据库,为便于以后调整,我们在medoo的基础上另外封装了一层调用方法,其他的使用方法不变,具体可以参考medoo中文文档。

    以下程序代码为读取admin用户所属部门的示例:

    执行效果如下图:

    img

    另外,如果查询语句比较复杂,系统还保留了原生SQL语句的执行能力,以下程序的执行效果和之前的是一样的,但如无特殊需求,不推荐使用。

    从这段程序可以看出,使用OA系统提供的系统头文件和函数,访问数据库将是一件很轻松的事,不用操心数据库的连接参数等问题,只需简单的写下SQL语句,执行它。

    更多数据库操作,如下:

    Insert

    img

    Update

    img

    Delete

    img

    Count

    img

    prepareQuery

    img

    debug

    img

    MySQL数据库的连接参数在 MYOA\webroot\inc\db_config.php文件中配置,如果自己安装MySQL数据库,可自行修改连接参数。

    3.4.5 缓存操作

    OA封装了写入缓存和读取缓存两个方法,在OA内可以直接通过这两个方法进行缓存操作。

    在OA中也封装了一套操作redis的方法,使用方法如下:

    第四章 内置类库参考

    4.1 TD类

    4.1.1 成员方法

    4.2 ExcelReader类

    4.2.1 构造方法

    4.2.2 成员方法

    4.3 业务流程平台

    4.3.1 TflowEngine

    第五章 内置函数参考

    5.1 utility.php 通用基础接口

    5.1.1 Message

    5.1.2 Button_Back

    5.1.3 find_id

    5.1.4 remove_id

    5.1.5 get_client_ip

    5.2 utility_all.php 通用功能接口

    5.2.1 csubstr

    5.2.2 is_ip

    5.2.3 add_log

    5.2.4 get_code_name

    5.2.5 dept_long_name

    5.2.6 get_sys_para

    5.2.7 set_sys_para

    5.2.8 send_mail

    5.3 utility_org.php 组织机构相关接口

    5.3.1 is_dept_parent

    5.3.2 top_dept

    5.3.3 GetDeptNameById

    5.3.4 GetPrivNameById

    5.3.5 GetUserNameById

    5.3.6 GetUserNameByUid

    5.3.7 my_exclude_uid

    5.3.8 GetUnionSetOfChildDeptId

    5.3.9 GetfunmenuByuserID

    5.3.10 is_module_manager

    5.3.11 set_priv_menu_priv

    5.3.12 set_uid_menu_priv

    5.3.12 del_user_menu_priv

    5.3.13 GetUidByOther

    5.3.14 is_dept_priv

    5.4 utility_sms1.php

    5.4.1 send_sms

    5.4.2 delete_sms

    5.5 utility_sms2.php

    5.5.1 send_mobile_sms_user

    5.5.2 send_mobile_sms

    5.6 utility_file.php

    5.6.1 upload

    5.6.2 delete_attach

    5.6.3 attach_size

    5.6.4 copy_attach

    5.6.5 is_uploadable

    5.6.6 is_text

    5.6.7 is_office

    5.6.8 is_image

    5.6.9 is_viewable

    5.6.10 is_media

    5.6.11 dir_size

    5.6.12 delete_dir

    5.6.13 attach_sub_dir

    5.6.14 attach_real_path

    5.6.15 attach_id_encode

    5.6.16 attach_id_decode

    5.6.17 td_copy

    5.6.18 td_rename

    5.6.19 td_move_uploaded_file

    5.6.20 td_file_put_contents

    5.6.21 add_attach_module

    5.6.22 attach_module_id

    5.6.23 attach_sign_key

    5.6.24 attach_sign_key_netdisk

    5.6.25 attach_real_path_netdisk

    5.6.26 cache_attach_para

    5.6.27 attach_url

    5.6.28 attach_url_pda

    5.6.30 attach_link_pda

    5.6.31 attach_url_old

    5.6.32 upload_old

    5.6.33 add_attach_old

    5.6.34 delete_attach_old

    5.6.35 add_attach

    5.6.36 copy_attach_netdisk

    5.6.37 copy_sel_attach

    5.6.38 office_attach

    5.6.39 create_attach

    5.6.40 is_editable

    5.6.41 is_wps

    5.6.42 is_ppt_xls

    5.6.43 is_thumbable

    5.6.44 image_mimetype

    5.6.45 Is_SysFile

    5.6.46 file_type

    5.6.47 mime_type

    5.6.48 trim_office_attach

    5.6.49 dir_file_nums

    5.6.50 CreateThumb

    5.6.51 ReplaceImageSrc

    5.6.52 trim_inserted_image

    5.6.53 backup_file

    5.6.54 oc_log

    5.6.55 attach_id_explode

    5.6.56 attach_id_implode

    5.7 utility_email.php

    5.7.1 GetWebMailNumByUid

    5.7.2 GetSentMailNum

    5.7.3 trim_notlogin

    5.7.4 insert_to_address

    5.7.5 get_email_data

    5.7.6 remove_email

    5.7.7 get_sentbox_data

    5.7.8 delete_email

    5.7.9 destroy_email

    5.7.10 get_time

    5.7.11 email_count

    5.7.12 get_outbox_data

    5.7.13 delete_outbox_email

    5.8 utility_calendar.php

    5.8.1 insert_taskcenter

    5.8.2 add_calendar

    5.8.3 update_calendar

    5.8.4 get_list_data

    5.8.5 delete_calendar

    第六章 公用组件参考

    公用组件为JavaScript脚本的前台代码,目的是为了简化前端程序的二次开发,开发出和OA结合更紧密、更一致的功能。

    6.1 人员多选

    示例代码:

    6.2 人员单选

    示例代码:

    6.3 部门多选

    示例代码:

    6.4 部门单选

    示例代码:

    6.5 角色多选

    示例代码:

    6.6 角色单选

    示例代码:

    第七章 典型功能简析

    7.1 用户名相关

    由于之前版本中用户名(USER_ID)字段在新建用户时赋值,可以为任意类型的数据,包括汉字等,且绝大部分模块中直接与用户名(USER_ID)直接关联,直接影响各个模块的效率及可能出现的编码问题。为解决此问题,我们将之前使用比较冷门的别名(BYNAME)在新建/编辑用户时替代之前用户名成为新一代的用户名(BYNAME),在新建/编辑用户及控制面板中均可以进行修改,也可以在系统管理->系统参数设置中设置不允许修改,且作为唯一登陆OA的用户名;之前的USER_ID,我们在新建用户时自动赋值为数字型数据,从而在各个模块的使用过程中效率提升且不存在编码问题。

    建议开发人员在新增模块/数据库表结构时直接考虑使用UID字段进行关联。

    7.2 登录密码加密

    为进一步保证OA登录时账号及密码安全,在PC端、精灵、移动版等登录OA时,均提供了对密码base64加密措施。

    调用js文件:

    调用文件后即可使用方法对密码加密,如:

    登录页面提交后,再使用php自带base64解密方法处理即可,如:

    为兼容用户历史数据,可以新增字段encode_type进行判断,只有当encode_type=1时才进行解密,如:

    7.3 系统缓存机制

    为避免每次访问页面或用户经常用的数据等,在OA系统中采用了缓存机制,很好的解决了由于每次访问都需要重新操作数据库或计算导致系统访问速度慢的问题。比如在新建模块实例中,获取部门信息时,就可以直接从缓存中获取,获取方式如下(以部门C_DEPT为例):

    获取部门缓存内容:

    更新缓存内容

    删除缓存条目