400-888-0545
五大平台全开源 /
FIVE PLATFORMS
流程管理平台
全功能流程引擎。基于任务驱动,开放式服务驱动,高灵活性、扩展性...
了解更多
内容管理平台
门户管理平台
数据中心
服务管理平台
移动办公全开源 /
MOBILE OFFICE
全终端| 原生APP| 钉钉集成| 微信集成| WeLink集成
内置应用全开源 /
BUILT IN APPLICATIONS
考勤管理
工作中心
日程管理
企业网盘
个人便签
-
收起
-
详细介绍
会议管理
网络会议
全文检索
企业AI
热点信息
-
收起
-
详细介绍
客户管理
云笔记
资产管理
企业社区
公文管理
-
收起
-
详细介绍
工作管理
系统日志
脑图设计
-
收起
-
详细介绍
高达50%的合作伙伴续费折扣
身为O2OA合作伙伴,您在续费时可以获得高达50%的价格折扣
折扣规则
· 在合同到期前续费,可以获得官方价格50%的价格折扣。
· 在合同到期后3个月内续费,可以获得官方价格30%的价格折扣。
商业许可费用
技术支持费用
产品特色 /
PRODUCT FEATURES
全平台
支持Windows、Linux、AIX、MacOS及国产操作系统,支持x86、ARM、MIPS、POWER等芯片。
了解更多
全终端
支持Chrome、Firefox、IE、Safari、Opera,支持钉钉、微信、WeLink及第三方APP接入。
了解更多
国产化
支持全国产化芯片、操作系统、数据库,浏览器,并符合信创协同平台环境体系,生成安全的OA办公系统。
了解更多
低代码开发
提供高效率的OA办公开发平台的同时,通过可视化的工具快速构建项目流程、信息、门户、报表以及服务。
了解更多
开放源代码
开源OA:确保全代码开源,安全可控,可在Github、Gitee上下载代码编译并进行OA系统二次开发。
了解更多
国标版式公文
拥有GB/T 9704-2012(党政机关公文格式)标准版式公文模板,无需加载任何插件和控件,支持OA移动端编辑。
了解更多
智能化办公
支持语音办公,人脸识别,内置企业AI分析推荐引擎,可通过机器学习自定义OA办公使用场景。
了解更多
应用市场
基于O2OA系统丰富的项目经验,提供各类插件、组件、模板以及专业应用,客户可免费下载安装,进行OA系统二次开发。
了解更多
数据交互
提供多种数据访问方式,可自定义数据访问接口,实现多系统间数据交互,使OA系统数据协同功能更强大。
了解更多
集群扩展
采用微服务架构,支持横向和纵向集群扩展,提供高可用OA系统能力,支持公有云和私有云的PaaS部署。
了解更多
业务实现 /
BUSINESS IMPLEMENTATION
所见即所得的门户管理平台,可以轻松结合O2OA提供的认证设置与其他系统进行单点认证集成。
降低企业人力资源成本,提高人均产值。规范化、数据化的管理,为企业未来的发展奠定基础。
将企业工作的制定、分解、进展汇报痕迹化,数据更新动态化,带来更直观的责任考核,支持企业运营目标的实现。
便利清晰的日报周报管理界面,帮助员工自我管理和自我提升,实现团队管理和分享。
项目管理系统中,包含工作项目的进度、人员、时间等信息以实现多维度的管控,充分满足企业需求。
执行力管理平台能够将任务细化,让员工按质按量完成自己的任务,全面提高企业的无纸化办公效率。
企业网站和门户|人力资源管理系统|战略工作管理系统| 企业日报周报管理|项目管理系统|执行力管理平台
新闻资讯 /
NEWS
企业协同办公软件中,也可以拥有简易的应用市场…… - O2OA国产信息系统低代码开发平台
在我们的日常生活中,应用市场这个词,总是与智能手机划上等号,不管使用的是iPhone还是安卓,总会接触到手机上的APP应用市场,我们可以在应用市场中,选择自己所需要的APP应用软件,下载使用后,可以让自己的手机拥有所有需要的功能,在保证信息安全性的同时,还可以打造成属于自己的“独一无二”的手机。O2OA办公平台的应用市场与此亦是有异曲同工之妙,只需要在应用市场中选择自己所需的应用进行安装使用,就可以拥有一款简洁干净的OA办公系统。O2OA应用市场中比较常用的应用有:工作管理、客户管理、公文管理、云笔记等等。传统的OA办公系统中,总是让人感觉“笨重”、“不灵活”,功能虽然齐全,但是显得一整个系统非常木讷,有些不需要的功能也无法移除,但是O2OA应用市场的出现,让OA系统也可以走向“轻量”、“有活力”,同时又能满足客户各种办公需求。上图是O2OA应用市场界面,整体设计上简约干净,以商务风格为主,没有任何的多余项目。其中办公所需的各类应用都有涉及,并且还在持续更新中。今天我们就以工作管理应用为例,谈谈O2OA办公系统应用市场的详细操作和功能作用。点进其中的应用(工作管理),可以在右上方选择安装,如果有任何疑问可以直接进入藕粉社区进行交流,在应用下方还有评分功能,可先从用户的评论中看出此应用是否值得安装。在功能下方,还带有功能介绍、应用特点、安装使用方法等栏,让用户能够最短时间里,理解这款办公应用的使用方法和使用价值。比如工作管理是一套适用于协作型组织及个人,全面实施任务过程化、规范化、信息化的管理软件应用产品。主要以扁平化管理思想为理论基础,以任务过程化管理为核心,通过领导者、管理者对日常任务的管理与分配,实现企事业单位的内部协同办公,任务过程追踪和经验知识的积累。在视图面板中,能够新建管理项目,项目分组,进行项目权限控制,项目任务统计。缩略图版面让工作页面更加清爽,用户可以更清晰的看到工作项目、星标项目等不同类别的任务。在工作管理的任务面板,可以如便签条一样清晰看到任务详情、任务优先级、任务提醒等信息,并分为今天的任务、任务多时、我执行多任务、其他任务等栏。这样一款工作管理应用能够让企业领导轻松管理工作项目,监督和促进团队协作,适用于多行业模板管理,提高工作效率。综合来说,一款OA办公系统,对于用户来说,并不是越复杂越好,个头大并不代表着营养足,“精简”之后,才能够带来效益的最大化。而O2OA的开源办公系统,就是这样一款小巧、美观、实用三合一的OA办公系统。同时,因为O2OA平台是开源的办公平台,仅需要几步简单的技术搭建,就可以“变”为一款属于企业专属的OA办公系统,如果您的企业正在步入信息化建设,O2OA将助您最低零成本搭建OA协同办公平台。
22
2021-06
22
2021-06
如何进行一场高效会议?先从第一步做起——会议申请 - O2OA国产信息系统低代码开发平台
开会,是很多职场人都烦恼的一个问题,毕竟会议过程,可以全是干货,也可以全是唾沫。但是不管是有效会议还是无效会议,都无法逃避。那为什么,企业中的领导人如此看重会议呢?安迪格鲁夫,即前英特尔CEO,也是大家公认的管理学大师,他认为会议能够提高管理杠杆率,有效提升企业的运转效率。所以,“如何开好一个会议”是一个意义深远的话题。而开好会议的第一步,就是进行会议号召和申请。O2OA会议申请是使用平台流程管理能力开发的一个申请流程。员工的会议申请通过审批之后,可以同步到会议管理系统,由会议管理系统进行展现,提醒和跟踪。可以清晰地在会议日程上展现员工需要参加的会议情况,并且可以进行多途径的会议提醒。功能介绍:会议申请流程申请会议表单信息自动同步设置系统内置的会议管理应用关联会议申请流程,打开系统自带的会议管理应用,点击“设置”,在会议申请流程上绑定会议申请流程,保存即可。如下图所示:启动流程在系统内置的会议管理界面点击“新建会议”,或者在办公中心发起流程,如下图所示:表单界面注:“会议室”字段可自动带出会议管理里的未占用的空闲会议室供选择,如下图:会议信息同步到系统自带会议管理会议申请流程流转结束后会自动在本系统自带的会议管理应用中生成对应的会议信息,如下图所示:
22
2021-06
搭建系统企业内部bbs,更好实现企业内部交流 - O2OA国产信息系统低代码开发平台
论坛又名网络论坛,BBS(Bulletin Board System),从互联网发展伊始,就逐渐开始壮大,论坛的用户可以发布不同的信息、提出自己独特的看法,还可以收到其他用户的回复和评论,信息的即时性、用户之间的互动性极强。现在的企业在也有许多是选择QQ群、微信群进行员工之间的信息交流,虽然保证了实时性,但是消息遗漏、人数上限等也是固有的弊端;相比之下,企业论坛更适合有庞大的组织架构和员工众多(尤其是员工分布在不同地区)的公司企业使用。目前越来越多的企业为企业内部员工搭建了企业自己的社区论坛,主要作用就是:■加强企业和员工、员工和员工之间的交流互动,完善企业资讯和员工信息的即时传递■完善公司的规章制度,实现企业的知识共享■营建更好的工作氛围,让企业和员工同心一体,■发现工作中隐藏的问题,及时解决,提高工作效率 而O2OA开源办公平台,能够让企业轻轻松松搭建一个企业中的网络论坛。设置在设置中,可以进行系统设置、分区设置、版块设置,根据企业对于论坛的需求,设置出不同的特色。系统设置▼分区设置▼板块设置▼导航在导航中,可以查看论坛、选择发帖和发起投票。查看论坛▼发帖▼投票▼个人中心在个人中心里,可以查阅我的发帖和我的回复。我的发帖▼我的回复▼O2OA开源办公开发平台,仅需简单的几步技术搭建,就可以生成一款“小而美”的OA办公系统,其中的论坛模块也是亮点之一。如果您正在寻找一款开源、支持二次开发、支持全国产化平台、并且有论坛模块的OA办公系统,那赶紧来试用一下O2OA吧!
21
2021-06
多行业都适合的工作管理,加强工作协同 - O2OA国产信息系统低代码开发平台
在我们的日常工作中,一般都是将一整堆工作排在一段指定时间之内完成,但是这样一来,许多人的“拖延症”会对工作效率产生负面影响,一些临时调度的任务也无法很好完成。工作管理功能,是一款能够将工作任务全面结构化、过程化,将个人与企业融合起来,加强工作协同,确保信息化和规范化的管理软件产品。以下我们来看看O2OA平台中的工作管理系统包含的5个主要的产品特点:▼看板式工作管理:拥有看板式工作管理视图后,上班打开电脑即可清楚看到需要进行的任务或是已经完成的任务。也能用不同的代表色对自己的任务进行规划,把握好工作的节奏感,将“拖延症”抛至脑后,保证工作效率。▼加强团队协作:现在企业发展大趋势下,工作不再是“一个人”等于全部,优秀的团队协作才能够带动长远发展。工作管理系统能够让工作任务动态得到展现,让所有的工作参与者都看到工作进度,及时进行追踪和跟进,加强整体的团队协作,保证“不掉队”。▼自由创建项目任务:根据自己的安排,可以自由创建项目任务,并且设定完成时间、紧急情况等。举例来说,设定的一天计划就是执行日常任务和活动的基础,按照周期性来进行分配每日的工作项目相关任务。▼轻松管理工作项目:工作项目可以分类成不同的类型,比如已完成/未完成、星标项目/收藏项目、市场组项目/管理组项目……遇到此类不同的情况,个人项目比较多且繁杂时,就可以利用工作管理,将任务进行整理分组,让工作更加井井有条。▼适用于多行业模板管理:目前行业姿态百花齐放,故不管是金融、电信、政务、科研等等,此工作管理系统都可以做出相关行业的工作管理模板。O2OA办公平台中的工作管理系统,主要是以扁平化管理思想为理论基础,以任务过程化管理为核心,通过领导者、管理者对日常任务的管理和分配,上线企事业单位的内部协同办公,任务过程追踪和经验知识的积累。O2OA作为一款开源免费的OA办公开发平台,仅需几步简单的技术搭建,就可以打造出一款功能齐全,几乎“零成本”的OA办公系统,不管是PC端还是移动端,都可以进行同步。如果您正在寻找一款“小而美”的OA办公系统,不如来尝试一下O2OA吧!
21
2021-06
考勤管理很重要!用开源OA办公平台来搞定! - O2OA国产信息系统低代码开发平台
企业中的考勤问题一般有以下几点:考勤申请复杂:请假单、加班单、出差单等申请都是纸质流通,难以保存,程序麻烦。考勤数据繁琐:考勤需要人力采集大量的数据,然后进行计算、汇总、审批上报。考勤流于形式:人情考勤、异地考勤导致考勤数据弄虚作假、滞后。考勤报表制作:因为缺少多维度数据分析与展现的数据平台,人力制作考勤报表尤为费劲。考勤排班复杂:因为员工们的上班时间、工作性质都有所不同,所以排班管理非常耗费人力,还容易滋生各种矛盾。这些考勤问题频繁出现,原因最终还是要归咎到不完善的考勤系统之上,毕竟光凭“人力”出现的漏洞实在是太多了,而且“人力贵”的大趋势也是大家有目共睹的。有一款实用的考勤系统,不仅可以解放人工资源、减轻人工统计的各类负担,还可以简化工作流程、提升工作效率。O2OA开源办公开发平台就是这样一款OA办公系统,可以帮助企业进行轻松的考勤管理。1.考勤管理功能清爽的界面截图:2.如何查询出勤明细:3.系统自动生成出勤率统计:4.个人考勤统计也可以简单查询:5.公司出勤明细:6.支持数据导入,更加灵活:7.根据部门等不同,进行考勤人员配置:8.个性排班设置:9.法定假期也可以简单设置,让放假不再是考勤难题:10.工作考勤场所设置,设置考勤范围,避免“排队打卡”:11.考勤管理中布置了申诉功能,领导可以进行一键审批:
18
2021-06
还在到处找“合适”的OA系统?不如自己开发一款OA办公系统吧! - O2OA国产信息系统低代码开发平台
快速开发、复用技术、组件、构件为特点的快速二次开发平台近年来一直都是热门需求中的热门,可以说已经成为了软件产业的的总体发展趋势。国家、政府的高度重视和国内开发市场需求量增加,让众多开发商们都加大了技术投入,国内快速开发平台的发展可以说是如火如荼。缩短软件开发周期,降低开发成本,改善软件质量,最好的办法就是复用,这是许多的IT项目所验证的一点。而二次开发平台正是利用了这样的理念,内置了许多成熟组件,不管是软件开发还是软件部署,都能被大大简化,做到最大程度上的降本增效。O2OA开发平台是一个基于J2EE分布式架构,集成移动办公、智能办公、支持私有化部署、自适应负载能力的,节约企业软件开发成本企业信息化系统需求定制开发平台解决方案。O2OA平台基于AGPL协议开放源代码,提供有偿的商用服务和高质量的技术支持一条龙服务,灵活的合作模式下,能有效协助用户完成信息化项目建设。O2OA作为一个全开源的二次开发办公OA平台,保证无任何隐藏闭源组件,平台开源开放,透明度高;同时保证安全稳定,无后门,无漏洞,拥有可靠的高可用,容灾方案。O2OA平台包含许多的功能:一、流程管理全功能流程引擎。基于任务驱动,开放式服务驱动,高灵活性、扩展性,事件定义丰富。包含人工处理、自动处理、拆分、合并、并行、定时任务、服务调用、子流程等功能。应用场景丰富,可轻松实现公文、合同、项目管理等复杂工作流应用场景。二、信息管理具有权限控制能力的内容管理平台。支持自定义栏目、分类,表格,表单,多级权限系统,能轻松实现知识管理、公司新闻、规章制度、文件管理等内容发布系统。三、门户管理所见即所得的门户管理平台,以拖拽的方式搭建方式搭建企业门户。门户管理平台,支持HTML直接导入,支持各类数据源,具备外部应用集成能力。适用于实现企业信息化门户系统,企业单位多级门户,可以轻松结合O2OA提供的认证设置与其他系统进行单点认证集成。四、服务管理在页面中以前端脚本的形式,开发和自定义web服务,实现与后端服务数据交互的能力。五、数据中心通过配置轻松实现数据透视图展示,数据统计、数据可视化图表开发等等功能。六、智能办公语音办公、人脸识别、指纹认证、智能文档纠错、智能填表推荐等智能办公特色。七、移动办公支持Android\IOS手机APP办公,支持与企业微信和钉钉集成,支持企业私有化微信部署。八、开箱即用O2OA还提供如考勤管理、日程管理、会议管理、脑图管理、便签、云文件、企业社区、执行力管理等开箱即用的应用供企业选择。除了以上的功能之外,O2OA平台的二次开发简易、部署简单,所见即所得的可视化开发方式,能够更快速地响应需求变更。  
标杆案例 /
BENCHMARKING CASES
更多案例 /
MORE CASES
合作伙伴说O2OA /
WHAT PARTNERS SAY ABOUT O2OA
CEO 王维航
定制化的平台可以让我们的企业管理理念最终体现到流程,数据管理中。
中台事业群副总裁 墙辉(玄难)
世界是平的,企业也应该是平的
CEO 王伟力
O2OA是国内少有的信息化快速开发平台,让企业技术人员更关心业务,加速企业需求的落地。
总经理 陈栋
很高兴能在众多流程产品中选择了O2OA,希望能一如既往的提供高效和创新的管理产品。
技术文摘 /
TECHNICAL ABSTRACTS
在O2OA中使用网络会议(二):Openmeetings与O2OA认证配置
@O2OA @Openmeetings @单点认证 @网络会议O2OA支持将o2server本身作为OAUTH服务器,也支持将o2server作为客户端接入到其他的OAUTH服务器中。此例中,我们以O2Server本身作为OAUTH服务器,这也是通常的配置方案,O2Server中有完整的组织人员信息,并且投入协同办公使用。一、O2OA相关配置以管理员身份登录O2OA:并且打开系统设置:在OAUTH客户端配置区域添加一个oauth配置:填写内容如下:配置内容:客户号(ClientId):openmeetings客户密钥:openmeetings映射(Maaping){ login:(return person.getMobile() + '_ys';) firstname:(return person.getName();) lastname:(return '';) email:(return person.getMobile() + '_ys@o2oa.net';) country:(return 'CN';) salutation:(return person.getGenderType().toString() == 'm' ? '1':'2';) }注意,在配置中,O2OA与openmeetings的登录用户关联信息为mobile,也就是手机号,系统会自动在openmeetings系统内注册手机号加"_ys"的用户名,此处可以根据需求修改。填写完成后保存,如下图所示。二、Openmeetings相关配置以管理员身份登录Openmeetings:点击ADMINISTRATOR - OAUTH:如下图所示界面:在右侧OAUTH2 config中填入相应的配置,如下图所示:重定向URL:https://localhost:5443/openmeetings/oauth/1   这里的1是指配置的编号,这一行不能编辑,在保存时自动生成,需要修改为正确的IP或者域名信息。修改application.base.url信息修改方法如下:点击ADMINISTRATOR - 配置信息,查询系统配置查找配置信息:修改配置信息后保存。修改完成之后继续完成单点认证内容配置。配置内容如下:名称:O2OA 链接图标:http://172.16.1.48/favicon.ico _客户id:openmeetings _客户密码:openmeetings 重定向URL:https://172.16.93.9:5443/openmeetings/oauth/1 请求密钥:http://172.16.1.48/x_desktop/oauth2.html?redirect_uri={$redirect_uri}&response_type=code&client_id={$client_id} Request token method:POST 请求令牌网址:http://172.16.1.48:20020/x_organization_assemble_authentication/jaxrs/oauth/token 请求令牌属性:code={$code}&client_id={$client_id}&client_sceret={$client_secret}&redirect_uri={$redirect_uri}&grant_type=authorization_code Request info method:GET 请求信息网址:http://172.16.1.48:20020/x_organization_assemble_authentication/jaxrs/oauth/info?access_token={$access_token}User mapping:映射说明:OM User attributeOAuth User attribute说明firstnamefirstnameaddress.emailemailloginlogin登录账号,对应O2OA配置里的Login,在Openmeetings用户里登录名要能对得上lastnamelastnameaddress.countrycountry验证配置结果打开Openmeetings,我们发现在登录界面多了一个O2OA的认证组件,如下图所示:点击之后,会跳转到O2OA登录页面:使用O2OA内注册的人员登录后,会再次跳转回到openmeetings系统内,并且完成用户的注册(请不要使用xadmin用户登录 ,没有手机号码,单点不会成功。)至此,单点认证配置完成。
2021
03月
15
开源OA:O2OA开源办公平台,为何开源?
大家好,我们是O2OA开源办公开发平台,今天想要为大家来解决一些常问的问题:O2OA为什么要开源?其实一开始有人提出说要“开源”的时候,大家都是一愣。我们一个通过售卖软件“养家糊口”的IT公司要是把软件“开源”了,软件不就难卖了?又有什么发展前景呢...... 一个个的问题萦绕在大家的脑子里。经过几番争论,大家还是决定执行“开源”。说到“开源”,那应该从开源软件这些年的发展说起!开源软件的发展开源软件最早的思想起源于黑客文化,真正的开源思想形成,要以 GNU 的诞生说起。 1984年,美国国家工程院院士 Richard Stallman 建立起操作系统 GNU,标志着基于“自由软件”思想的操作系统落成。后来随着Linux的出世,开源软件得到了更多人的支持,并逐步走向了正轨。时间来到2000年左右,随着Apache基金会等大型非盈利组织的出现,越来越多的开发爱好者因为“开源”聚集到了一起,开源软件进入到了第二个阶段。在软件行业,“自由”的思想越来越盛行。而今Google、Facebook、Oracle、阿里巴巴、腾讯等大型互联网和IT企业已经开始倡导开源软件,开源的思想形成了空前的盛况。近几年,开源产业有了前所未有的发展。特别是在2018年,互联网上最大的开源仓库 Github 宣布自家平台上开源软件仓库数量突破了1亿个,已汇集了来自全球的3100多万开发者。最新的2020年报告,Github上的开发者达更是到达了5600万,仅仅2020年一年开源软件仓库就增加了6000万个。由此可见,开源的思潮到现在已经产生了空前的发展。时至今日大到全球性的非盈利组织、大型企业、教育机构拥抱开源,小到个人、中小企业也闻风而动。从另一个维度来看,开源思想从原来的IT软件行业,发展到了如今的教育、管理、设计等等各行各业。可以预见在未来的几年、几十年,开源的思想将大行其道。传统IT企业的选择在开源盛行的当下,很多传统IT企业遇到了这些思想的冲击,也面临着“抉择”。如果接受了开源,企业如何盈利,不接受是否会被社会淘汰?传统的IT企业都是通过售卖软件为生的。在过去很长一段时间内,企业只要开发一个软件就能够产生很大的经济效益,通过这些软件就可以获得一张来自甲方的合同。因为有很多需求类似的甲方,所以企业通过售卖这些软件给甲方能够获取丰厚的利润,并且还能通过维护软件收取大量的维护费用,这个软件是他们的聚宝盆。如果软件开源了,其他人就可以学习他们的思路,甚至是拿他们的源码进行修改转卖等,直接导致企业的利润受损。另外一方面企业觉得投入了开源的人力,资源投入却没有产生对应的回报,浪费了企业的资源。确实,开源不是把软件公开就行了的,需要花费很多人力、精力去维护软件,去维护社区,去分享演讲。企业觉得发工资给员工就应该让员工对企业产生价值,而不是浪费在暂时得不到回报的工作中。这些都是实实在在摆在大家面前的问题,需要大家去思考!理解“开源”经过大家多轮的激烈讨论,我们对开源有了更深的理解,思想也得到了统一。首先,“开源”和共享有助于提高自己项目的质量。软件从来都不是静止的,随着市场和竞争环境的变化,竞争优势也会发生变化,只有一直迭代,高速迭代才能屹立不倒。一个软件项目也好,一个企业也罢只有持续的进步才能立于不败之地。关起门来做出来的软件是有天花板的,无论你觉得自己有多牛,你是技术专家,但是并不一定是业务或者场景的专家,软件进化的速度受限于开发团队和产品经理自己的认知和见识的进化速度,除非开发商强大到能够持续引领整个行业的进化方向。“开源”你的项目就等于允许让整个开发社区都在为这个项目做贡献,可以免费分享利用了大家的智慧和劳动。其次,“开源”也不是做无用功,它能够让参与的员工更加娴熟的掌握相关的知识。一个人要把技术学精湛最好的方式就是去把它教授给其他人。因为你要将一种知识教授给别人的时候,你需要对种知识有更加深刻的理解和认识。对于公司让员工去做“开源”项目,去写开源文章、去公开演讲,员工本身就得精心准备,理清思路,自然也就得到了提升。再次,“开源”和共享也是推销自己最好的方式之一。“开源”能够提升公司的品牌形象,提高社会认知度。为“开源”社区做贡献,既是回馈社区,也展示了公司的影响力和品质,也就为吸引更多的人才做了铺垫。企业参与“开源”,不仅贡献自己的力量,回馈社区,让整个社会互利互惠,让知识传播到世界的各个角落,同时也能整合整个社会的力量,让企业能够站到更高的位置。进而提升自己的品牌影响力。让我们拥抱开源吧!
2021
03月
15
在O2OA中使用网络会议(一):Openmeetings-5.1.0亲手安装整理
@O2OA @Openmeetings @网络会议 @安装 @Openmeetings-5.1.0本文主要讲解Openmeetings-5.1.0安装的过程,O2OA服务器的相关配置教程将随后发布。教程比较详细,可以按照步骤一步一步安装服务器的安装,如果您在安装过程中有遇到其他的问题,请及时联系我们,我们会进一步更新安装手册。O2OA实际上是集成Openmeeting来实现网络会议的,Apache-Openmeeting是一个开源的网络会议系统,我们可以在Openmeeting官方网站上得到更多的信息。介于Openmeetings的安装比较复杂,所以在这里,我们也把我们安装的过程共享出来,希望对大家有所帮助:Openmeetings官网:https://openmeetings.apache.org/Openmeetings官网下载:https://openmeetings.apache.org/downlOpenmeetings官方手册:https://openmeetings.apache.org/installation.html从Openmeeting官方发布的安装手册中可以看到,服务器的安装需要如下几个步骤:本文后续就按照Openmeeting官方安装手册的要求逐步完成目前最新版本5.1.0的安装:Version 5.1.0 released!Release 5.1.0, provides following improvements:This release provides WebRTC audio/video/screen-sharing in the Room Stability:● Room Audio/Video should be more stable● OM should work as expected after KMS server restart● Backup is further improved● Audio/Video connection established faster● Most recent versions of dependencies are usedUI:● User display name is used almost everywhere● Browser notifications are used to notify about new chat messages and moderator actions● Interview room was broken● Mute and "Mic status" were brokenOther fixes and improvements52 issues are fixed please checkCHANGELOG and Detailed list See Downloads page.一、安装KMS(Kurento Media Server)(含操作系统准备)KMS官方文档:https://doc-kurento.readthedocs.io/en/stable/index.htmlKMS安装手册:https://doc-kurento.readthedocs.io/en/stable/user/installation.html我们可以从Local Installation里看到,KMS支持长期支持版Ubuntu16.04和Ubuntu18.04(64位版本),这里我们打算使用Ubuntu18.04(64位),下文先讲述操作系统准备的过程,已经准备好的朋友,请看后续章节《安装Kurento Media Server》。1、安装Ubuntu18.04配置网络1)准备镜像文件下载链接:http://releases.ubuntu.com/18.04/ubuntu-18.04.5-live-server-amd64.iso2)安装操作系统Ubuntu18.04在安装过程中,设置用户kms,密码:123456。root密码可以在安装完成后进行修改。操作系统Ubuntu18.04安装完成,正在下载更新:3)修改root密码安装完成后,重启服务器,进入登录界面:使用kms用户登录系统:kms/123456修改root密码为123456sudo passwd root先输入kms用户密码 123456,再设置root密码(UNIX密码)。4)配置网络在安装操作系统时就可以根据要求配置网络,也可以在安装完成后进行配置。Ubuntu从17.10开始,已放弃在/etc/network/interfaces里配置IP地址,即使配置也不会生效,而是改成netplan方式,配置写在/etc/netplan/01-netcfg.yaml或者类似名称的yaml文件里,每台主机略有不同:编辑yaml文件:vi /etc/netplan/00-installer-config.yaml# Let NetworkManager manage all devices on this system network: ethernets: enp129s0f0: #dhcp4: true #dhcp4: true addresses: [172.16.93.9/18] gateway4: 172.16.64.1 nameservers: addresses:[172.16.2.43] version: 2 #renderer: NetworkManager关于子网掩码的表示,可以百度查一下:172.16.93.9/24 :255.255.255.0172.16.93.9/18 :255.255.192.0设置完成后执行命令让配置生效:sudo netplan apply设置完成后,可以使用SSH工具连接服务器即可。5)设置或者关闭防火墙sudo ufw disable2、安装KMS1)确认GnuPG 是否已经安装Make sure that GnuPG is installed.sudo apt-get update && sudo apt-get install --no-install-recommends --yes \ gnupg执行命令过程如下图所示:2)在系统配置中添加Kurento仓库配置Add the Kurento repository to your system configuration.Run these commands(执行如下命令):# Import the Kurento repository signing key sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 5AFA7A83 # Get Ubuntu version definitions source /etc/upstream-release/lsb-release 2>/dev/null || source /etc/lsb-release # Add the repository to Apt sudo tee "/etc/apt/sources.list.d/kurento.list" >/dev/null <<EOF # Kurento Media Server - Release packages deb [arch=amd64] http://ubuntu.openvidu.io/6.15.0 $DISTRIB_CODENAME kms6 EOF# Import the Kurento repository signing key(导入Kurento仓库的签名)sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 5AFA7A83此命令执行需要一点时间:# Get Ubuntu version definitions(获取Ubuntu版本信息定义)source /etc/upstream-release/lsb-release 2>/dev/null || source /etc/lsb-release# Add the repository to Apt(将Kurento仓库添加到apt) sudo tee "/etc/apt/sources.list.d/kurento.list" >/dev/null <<EOF # Kurento Media Server - Release packages deb [arch=amd64] http://ubuntu.openvidu.io/6.15.0 $DISTRIB_CODENAME kms6 EOF3)Install KMS(安装KMS)提醒:此步骤仅适用于第一次安装。如果您已经安装了Kurento并想升级它,请按照下面描述的步骤进行:本地升级(Local Upgrade)。sudo apt-get update && sudo apt-get install --no-install-recommends --yes \ kurento-media-server执行命令后等待,直到安装完成(需要一点时间):4)启动KMSThe server includes service files which integrate with the Ubuntu init system, so you can use the following commands to start and stop it:服务器包含与Ubuntu初始化系统集成的服务文件,因此您可以使用以下命令来启动和停止它:sudo service kurento-media-server start sudo service kurento-media-server stop日志目录:/var/log/kurento-media-server/二、前提条件准备1、数据库准备,本文中我们直接使用默认的H2数据库Recommendation for production environmentBy default OpenMeetings uses the integrated H2 database. For production environment you should consider using MySQL , Postgres , or for example IBM DB2 , or Oracle , or MSSQL生产环境建议默认情况下,OpenMeetings使用集成的H2数据库。对于生产环境,您应该考虑使用MySQL、Postgres,或者例如ibmdb2、Oracle或MSSQL2、下载并安装JRE(JDK)Note: Openmeetings requires JRE 11, JRE 6/7/8 are NOT compatible!提醒:Openmeetings需要JRE11,JRE 6/7/8 都无法兼容!先卸载Ubuntu自带的OpenJDK:sudo apt-get remove openjdk*安装JDK的方法有很多,在这里我们可以直接通过apt安装:apt install openjdk-11-jre-headless执行命令后等待一会儿即可:当前JDK版本:11.0.9.13、安装ImageMagick Enabling Image Upload and import to whiteboardInstall ImageMagick on the server, you can get more information on http://www.imagemagick.org  regarding installation. The instructions for installation can be found there http://www.imagemagick.org/script/binary-releases.php  , however on most Linux systems you can get it via your favorite package managers (apt-get it)启用图像上载和导入到白板前提条件:在服务器上安装ImageMagick,您可以获得有关http://www.imagemagick.org关于安装。安装说明可以在那里找到http://www.imagemagick.org/script/binary-releases.php,但是在大多数Linux系统上,您可以通过您最喜欢的包管理器(apt-get-it)获得它sudo apt-get install imagemagick查询安装的目录:dpkg -L imagemagick4、安装GhostScript Enabling import of PDFs into whiteboard● Install GhostScript on the server, you can get more information on http://www.ghostscript.com/download/gsdnld.html  regarding installation. The instructions for installation can be found there, however on most Linux systems you can get it via your favorite package managers (apt-get it).启用将PDF导入白板前提条件:在服务器上安装GhostScript,您可以获得有关http://www.ghostscript.com/download/gsdnld.html关于安装。安装说明可以在那里找到,但是在大多数Linux系统上,您可以通过您最喜欢的包管理器(apt-get-it)获得它。sudo apt-get install ghostscript一般在Ubuntu18操作系统里,GhostScript已经安装过了。查询安装的目录:dpkg -L ghostscript查询ghostscript版本ghostscript5、安装OpenOffice或者Libre Office(略) Enabling import of .doc, .docx, .ppt, .pptx, ... all Office Documents into whitebaord● OpenOffice or Libre Office InstalledSince Version 2.x of OpenMeetings it is no more required to start OpenOffice (or Libreoffice) service, see OpenOfficeConverter for details启用将导入.doc、.docx、.ppt、.pptx.....所有Office文件都放在白板中前提条件:已安装OpenOffice或Libre Office由于OpenMeetings的2.x版不再需要启动OpenOffice(或Libreoffice)服务,有关详细信息,请参阅OpenOfficeConverter6、安装FFMpeg和 SoX1. Enabling Recording and import of .avi, .flv, .mov and .mp4 into whiteboard ○ Install FFMpeg (with -enabled libmp3lame and libx264 options) . You should get FFMPEG in an up to date copy! OpenMeetings is tested with FFMPEG Version 10.3 and latest build from GIT For Windows you can download a Build for example from http://ffmpeg.zeranoe.com/builds/  Linux or OSx Users should be able to use one of the various Installation Instructions on the Web. You need to enable libmp3lame and libx264! ○ Install SoX http://sox.sourceforge.net/  . You should install SoX in a up to date copy! SoX 12.xx will NOT work!启用录制并将.avi、.flv、.mov和.mp4导入白板前提条件:安装FFMpeg(使用启用的libmp3lame和libx264选项)。你应该得到一份最新的FFMPEG!OpenMeetings使用FFMPEG 10.3版和GIT For Windows的最新版本进行了测试,您可以从下载一个版本,例如http://ffmpeg.zeranoe.com/builds/Linux或OSx用户应该能够使用Web上的各种安装说明之一。您需要启用libmp3lame和libx264!前提条件:安装SoXhttp://sox.sourceforge.net/. 你应该在最新版本中安装SoX!SoX 12.xx将不起作用!1)安装FFMpegsudo apt-get install ffmpeg查询安装的目录:dpkg -L ffmpeg查询ffmpeg版本:ffmpeg2)安装SoXapt-get install sox查询安装的目录:dpkg -L sox查询sox版本sox --version三、下载和启动Openmeetings1、下载Openmeetings-5.1.0并上传下载链接:https://downloads.apache.org/openmeetings/5.1.0/bin/apache-openmeetings-5.1.0.zip或者通过命令直接从服器下载:wget https://downloads.apache.org/openmeetings/5.1.0/bin/apache-openmeetings-5.1.0.zip创建/data目录root@kms:/# mkdir /data将下载好的apache-openmeetings-5.1.0.zip放到/data目录下:2、解压apache-openmeetings-5.1.0.zip如果没有unzip命令,则需要先需要安装一下unzip再进行解压:apt install unzip将文件解压到/data目录unzip apache-openmeetings-5.1.0.zip3、启动openmeetings服务./data/apache-openmeetings-5.1.0/bin/startup.sh四、安装和配置Openmeetings使用浏览器访问openmeetings提供的安装服务:URL: https://localhost:5443/openmeetings/install点击下一步进行数据库配置:在这里我们不使用其他的数据库,直接使用默认的H2数据库进行演示,但是在正式环境,我们建议您使用Mysql等商用数据库服务器,并且做好数据备份等工作。下图是Mysql服务器配置:设置好数据库后,点击下一步进行管理员用户信息设置:这里我们填写用户名,密码,邮件等信息,并且填写一个组织名称,然后点击下一步进行邮件相关配置:这里我们不作任何改动直接点击下一步,进行文档转换相关设置:这里我们仍不然任何改变动,直接点击下一步进行信息安全相关设置:这里我们仍不然任何改变动,直接点击下一步准备开始安装。在此界面并没有“完成”按钮,点击结束按钮我们可以开始安装(实际上就是完成配置动作),完成安装之后,您可以直接访问https://localhost:5443/openmeetings来使用openmeetings服务器提供的服务:输入用户名密码登录到openmeetings服务器:这里是用户主页,一个看板,上面有需要进行的所有工作有交流信息。下图是进入会议后的界面:点击右上角的分享屏幕,我们可以将自己的计算机屏幕分享给参所有参会者:关于Openmeeting的使用,您可以百度,或者到官方网站看到更多的文档和演示,我们以安装步骤为主,就不过多赘述,下一篇我们将指导大家如何将openmeetings与O2OA打通认证机制。
2021
03月
15
办公OA:O2OA表单中的事件
1. 概述我们设计表单的时候经常会有这样的需求:在表单或者组件加载前/加载后,能够执行一些脚本来改变表单或组件的样式和行为。或者用户在点击组件的时候能够执行脚本。表单的事件就是为这样的场景而设计。在表单中有两类事件:组件事件和Element事件。当我们打开表单设计器,在表单属性或组件属性中的“事件”附签中可以看到一组事件,这组事件即包含了两种事件。表单事件见下图。开发人员可以在事件编辑器中编写脚本,也可以添加或删除事件。添加的组件事件需要在API的列表中才有效。2 Element 事件2.1 简介Element 是经过Mootools框架封装后的HTML DOM对象,参考 http://www.chinamootools.com/element.html。Element 的事件类型和 HTML DOM 对象一致,比如"focus、click、blur"等。本平台的Element事件,是基于Mootools的 Element.Event 类进行封装的。Element.Event类参考http://www.chinamootools.com/element_event.html。2.2 表单设计器中的使用表单设计器中的事件,this对象指向平台的MWF.xScript.Environment对象,这是平台脚本的上下文,可以执行类似于"this.form"的脚本,上下文API请查看:链接。平台在每次运行事件的时候,都会为 this 对象添加一个属性"target"。我们可以通过 this.target 来获取当前组件。//获取当前组件对象 this.target; //等价于 this.form.get("fieldName");当我们在表单设计器的各种组件中添加了事件,在表单加载的时候,平台会把事件添加到相应的Element对象。下表是各种组件对应的Element事件对象。组件类型Element事件对象获取Element脚本Checkbox多选按钮input[type='checkbox']this.form.get("fieldName").node.getElements("input['type='checkbox']")Radio单选按钮input[type='radio']this.form.get("fieldName").node.getElements("input['type='radio']")Textarea多行文本textareathis.form.get("fieldName").node.getFirst() || this.form.get("fieldName").node; Textfield单行文本inputthis.form.get("fieldName").node.getFirst() || this.form.get("fieldName").node; Org人员第一个子divthis.form.get("fieldName").node.getFirst() || this.form.get("fieldName").node; Calendar日期inputthis.form.get("fieldName").node.getFirst() || this.form.get("fieldName").node; Combox组合框第一个子divthis.form.get("fieldName").node.getFirst() || this.form.get("fieldName").node; Opinion意见框第一个子对象this.form.get("fieldName").node.getFirst() || this.form.get("fieldName").node; Address地址选择第一个子对象this.form.get("fieldName").node.getFirst() || this.form.get("fieldName").node; Number数字inputthis.form.get("fieldName").node.getFirst() || this.form.get("fieldName").node; 其他nodethis.form.get("fieldName").node; 样例:在一个标识为"subject"的文本组件的 focus 事件中增加了脚本。对于上面的脚本,当光标进入输入框的时候被执行。如果希望由其他条件来触发这个事件,也可以通过下面的脚本来执行:var node = this.form.get("subject").node; //获取组件节点 ( node.getFirst() || node ).fireEvent("focus"); //触发focus事件2.3 在脚本中的使用在上面的例子中,我们都是通过组件属性中的事件区域来添加事件。除了这种方法,还可以在脚本中增加事件。使用 addEvent 对元素设置一个侦听器。myElement.addEvent(type, fn);参数:type - (string) 事件名,没有'on'。fn - (function) 事件函数。返回:(element)当前元素。样例:下面的脚本可以实现上一个样例的功能,在一个标识为"subject"的文本组件的 focus 事件中增加脚本var node = this.form.get("subject").node; node.getElement("input").addEvent("focus", function(ev){ //ev 是Mootools Element的Event对象,参考http://www.chinamootools.com/event.html //这里的this指向input this.setStyle("border","1px solid blue"); })使用 addEvents 对元素设置多个侦听器。myElement.addEvents(events);参数:events - (object) 包含多个事件的对象(对象的key为事件名,value为事件函数)。返回:(element)当前元素。样例:var node = this.form.get("subject").node; node.getElement("input").addEvents({ "focus" : function(ev){ //ev 是Mootools Element的Event对象,参考http://www.chinamootools.com/event.html //这里的this指向input this.setStyle("border","1px solid blue"); }, "blur": function(ev){ //ev 是Mootools Element的Event对象,参考http://www.chinamootools.com/event.html //这里的this指向input this.setStyle("border","1px solid gray"); } })使用fireEvent 触发一个或多个事件myElement.fireEvent(type[, args[, delay]]);参数:type - (string) 事件名称(例如"click" )args - (mixed, optional) 事件函数的参数,数组或单个对象,如果超过一个参数,必须是一个数组。delay - (number, optional) 延迟(ms)执行时间。返回:(element)当前元素。样例:var node = this.form.get("subject").node; //获取组件节点 ( node.getFirst() || node ).fireEvent("focus"); //触发focus事件3 组件事件3.1 简介平台中的组件是一组基于Mootools Class生成的对象。Mootools Class是MooTools框架的基类,参考http://www.chinamootools.com/class.html。在Mootools Class中有一系列的特性,其中就包括了 Class:Event,参考http://www.chinamootools.com/class_extras.html 中的 Event章节。当我们在表单设计器的各种组件中添加了事件脚本,在表单加载的时候,代码运行到相应的位置,这些脚本就会被触发。比如平台在加载组件(包括生成Html Dom,赋值等等)之前,会去执行queryLoad事件中的脚本;加载组件以后,会去执行postLoad中的事件。3.2 表单设计器中的使用表单设计器中的事件,this对象指向平台的MWF.xScript.Environment对象,这是平台脚本的上下文,可以执行类似于"this.form"的脚本,上下文API请查看:链接。平台在每次运行事件的时候,都会为 this 对象添加一个属性"target"。我们可以通过 this.target 来获取当前组件。//获取当前组件对象 this.target; //等价于 this.form.get("fieldName");某些需要参数的事件,平台在每次运行的时候,会为 this 对象添加一个属性"event "。我们可以通过 this.event 来获取参数。//有时候可以通过this.event获取参数 this.event;样例:在queryLoad脚本中根据流程活动名称把当前组件设置为只读。系统在加载组件的时候,会根据json的isReadonly判断生成输入框还是div节点。如果希望由其他条件来触发这个事件,也可以通过下面的脚本来执行:var field = this.form.get("subject"); //获取组件 field.fireEvent("queryLoad"); //触发queryLoad事件3.3 在脚本中的使用在上面的例子中,我们都是通过组件属性中的事件区域来添加事件。除了这种方法,还可以在脚本中增加事件。使用 addEvent 对组件设置一个事件。myClass.addEvent(type, fn[, internal]);参数:type - (string)事件的类型(例如'queryLoad') ,包含在表单设计器里组件的事件。fn - (function)事件函数。internal - (boolean, optional)设置函数属性:internal为true。internal属性通常用来防止删除。返回:(object)这个类的实例。样例:在表单的保存的时候加一个事件,将临时字段置空。var form = this.form.getApp().appForm; //获取表单组件 form.addEvent("beforeSave", function(){ //添加保存前事件 this.form.get("tmpField").setData(''); //给临时字段置空 }.bind(this)) //通过 bind(this), 把上下文传到事件方法里使用 addEvents 对组件设置多个侦听器。myClass.addEvents(events);参数:events - (object)一个key:value对象,key事件名称(如"queryLoad" ) ,和值,当事件发生时要调用的函数。返回:(object)这个类的实例。注: 通过这种方式添加事件,this.target 和 this.event 均为空。样例:var form = this.form.getApp().appForm; //获取表单组件; form.addEvents({ "beforeSave" : function(){ //添加保存前事件 this.form.get("tmpField").setData(''); //给临时字段置空 }.bind(this), // "beforeDelete": function(){ //增加删除前事件 //do something } })使用fireEvent 触发一个或多个事件myClass.fireEvent(type[, args[, delay]]);参数:type - (string)事件的类型(例如'beforeSave') 。args - (mixed,optional)传递给函数的参数。要传递多个参数,该参数必须是一个数组。delay - ( number,optional)等待时间,单位毫秒。返回:(object)这个类的实例。注: 通过这种方式添加事件,this.target 和 this.event 均为空。样例一:var form = this.form.getApp().appForm; //获取表单组件; form.fireEvent("beforeSave"); //触发beforeSave事件样例二:假如临时字段是触发时传入的,可以这样写var form = this.form.getApp().appForm; //获取表单组件; form.fireEvent("beforeSave",["tmpFieldName1"]); //触发beforeSave事件则添加的事件需要改成如下:var form = this.form.getApp().appForm; //获取表单组件 form.addEvent("beforeSave", function( fieldName ){ //添加保存前事件 this.form.get(fieldName").setData(''); //给临时字段置空 }.bind(this)) //通过 bind(this), 把上下文传到事件方法里3.4 表单和组件的加载顺序整个表单加载时的顺序遵循以下规则(a-f也是有顺序的):a、执行主表单事件 queryLoad -> beforeLoad -> beforeModulesLoad;b、根据组件在主表单的位置从上到下,从里到外执行组件的queryLoad->postLoad->load事件;c、执行主表单事件 postLoad;c、子表单、子页面、部件上的直接事件不会被执行,但子表单里组件的事件也是根据 规则b 执行;d、由于子表单、子页面、部件是异步加载,这些组件内的组件事件在异步加载后分别执行;e、执行主表单事件 afterModulesLoad -> afterLoad;f、当 Tab 组件、子表单、公文管理器等组件被设置为延迟加载的时候,主表单加载的时候,这些组件内的子组件在不会加载。当这些组件被激活的时候,根据 规则b 执行事件。表单加载时触发的直接事件说明:表单的直接事件说明queryLoad 表单加载前触发。数据(businessData)、预加载脚本和表单html已经就位。beforeLoad表单加载前触发。已提示抢办锁定。beforeModulesLoad表单的所有组件加载前触发,此时表单的样式和js head已经加载。postLoad 表单加载后触发。主表单的组件加载完成,但不保证子表单、子页面、部件加载完成。afterModulesLoad表单的所有组件加载后触发。表单包含有子表单、子页面、部件时,此事件会在这些组件加载后触发。afterLoad表单加载后触发。表单包含有子表单、子页面、部件时,此事件会在这些组件加载后触发。
2021
01月
05
办公OA:O2OA前端性能优化
O2OA是一个基于J2EE分布式架构,集成移动办公、智能办公,支持私有化部署,自适应负载能力的,能够很大程度上节约企业软件开发成本的基于AGPL协议开放源代码的企业信息化系统需求定制开发平台解决方案。O2OA对外提供专业的开发运维等技术服务。开源O2OA官网:http://www.o2oa.net/下文是O2OA前端性能优化的教程干货:O2OA是一个SPA应用,相对与传统的多页应用,前端的代码量比较大,用户进行二次开发也主要是前端的脚本,本文中,我们来讨论一下与页面展现性能相关的一些内容。(数据库和服务器的优化不在本文讨论范围内)。本文中的内容需要O2OA 5.3 及以上版本支持。缓存客户端的缓存设置一般情况下,现代浏览器都默认支持http协议的缓存策略,我们需要注意IE10和IE11,在“网站数据设置”中推荐使用“自动”。如果您将O2OA通过webview嵌入到自己的移动端APP中时,注意使用webview的默认缓存策略。(IOS:NSURLRequestUseProtocolCachePolicy;Android:LOAD_DEFAULT)Max-Age为了浏览器可以直接从缓存中获取静态文件,可以设置静态资源响应头的Cache-Control的Max-Age值。在服务器config/node_xxx.xxx.xxx.xxx.json文件中,配置web中的cacheControlMaxAge字段,以秒为单位,配置静态资源本地缓存的时间。如:{ ... "web": { ... "cacheControlMaxAge": 86400, ... }, }配置后需要重启服务器生效。Etag一些服务请求,在响应头中会有Etag,客户端收到带有Etag响应头的响应后,会把内容和Etag值缓存下来,下次发起同一个请求时,会带上请求头If-None-Match,值为上一次收到的Etag值,服务器收到请求后,会计算出Etag值,并与请求的If-None-Match值比较,如果相同,则不需要返回内容,返回304,告诉浏览器从本地缓存获取内容即可。如果两值不匹配,说明要请求的内容已经修改过,需要重新下载。所以,我们系统在经过一系列网络设备,如负载设备和Web应用防火墙(WAF)等,请确保这些设备不对请求的Etag响应头进行修改。静态资源缓存服务器我们可以把web服务器部署到其他静态资源的web服务器,也可以通过nginx等配置静态资源缓存。服务器目录下servers/webServer/下的所有文件,拷贝到其他web服务器的web目录,修改x_desktop/res/config/config.json文件中的配置即可:{ "center": [ { "port": "20030", //O2服务器中心服务器端口 "host": "develop.o2oa.net" //O2服务器中心服务器Host } ], "applicationServer": { "host": "develop.o2oa.net" //O2应用服务器Host }, "initManagerChanged": true, "initManagerName": "", ... }此文件主要修改两部分内容:1、center部分,修改为要访问的O2中心服务器地址和端口;2、applicationServer部分,修改为要访问的O2应用服务器地址,如果没有applicationServer,就添加一个。集群环境下,可配置应用服务器负载地址;不发起option请求 默认情况下O2OA服务器启用三个端口80、20020和20030,分别对应web服务、应用服务和center服务。由于使用不同端口,在浏览器请求时,会先发送option请求来判断跨域访问策略。见下图:方法一我们可以按以下配置,使请求同源,就不再需要发送option请求。在服务器config/node_xxx.xxx.xxx.xxx.json文件中,配置web中的proxyApplicationEnable字段为true,将application和center中的proxyPort配置为和web端口一致(默认为80),将proxyHost配置为用户访问的域名。{ ... "center": { ... "proxyHost": "develop.o2oa.net", "proxyPort": 80, ... }, "application": { ... "proxyHost": "develop.o2oa.net", "proxyPort": 80,", ... }, "web": { ... proxyApplicationEnable: true, ... }, ... }配置后重启服务器后,就不会有option请求发起。方法二我们也可以通过负载设备的http代理配置来避免发送option请求,以nginx为例,我们可以进行如下配置:在nginx配置中,通过配置不同路径来映射到O2OA服务器的web、application和center。 listen 80; server_name develop.o2oa.net; location /web/ { proxy_pass http://xxx.xxx.xxx.xxx:80/; } location /app/ { proxy_pass http://xxx.xxx.xxx.xxx:20020/; } location /center/ { proxy_pass http://xxx.xxx.xxx.xxx:20030/; }然后在O2OA服务器config/portal.json文件中配置urlMapping,如下:(如果在config目录下没有portal.json文件,可以从configSample目录下拷贝一个过来){ ... "urlMapping": { "develop.o2oa.net:20020": "develop.o2oa.net/app", "develop.o2oa.net:20030": "develop.o2oa.net/center" }, ... }重启nginx和O2OA服务器后,我们可以用 http://develop.o2oa.net/web 访问系统。此方法通过nginx将不同路径的请求代理到O2OA服务器的不同端口,浏览器只使用80端口访问,避免的跨域请求,也不会发起option请求。获取服务地址请求  默认情况下,访问系统页面时,会发起若干个获取服务器地址的请求,地址如:http://develop.o2oa.net:20030/x_program_center/jaxrs/distribute/assemble/source/develop.o2oa.net。此服务会返回一组服务列表,后续的请求都会使用此列表中的host和port。这样我们就可以在集群环境下,根据服务器策略,给不同的用户分配不同的服务地址。  假设我们有两台服务器:server1和server2,端口配置都为默认,组成了O2OA的集群,我们可以查看/x_desktop/res/config/config.json文件,服务器自动生成了center服务器地址配置:{ ... "center": [ { "port": "20030", "host": "" }, { "port": "20030", "host": "server1" }, { "port": "20030", "host": "server2" } ], ... }此时,浏览器会同时发起三个获取服务地址的请求:1、http://(用户访问系统的域名):20030/x_program_center/jaxrs/distribute/assemble/source/(用户访问系统的域名);2、http://server1:20030/x_program_center/jaxrs/distribute/assemble/source/server13、http://server2:20030/x_program_center/jaxrs/distribute/assemble/source/server2其中只要有一个服务成功返回数据,其他服务就会取消,系统就会使用返回的服务地址列表进行后续访问,返回的数据格式如下:{ "type": "success", "data": { "x_portal_assemble_designer": { "name": "门户设计", "host": "server1", "port": 20020, "context": "/x_portal_assemble_designer" }, "x_portal_assemble_surface": { "name": "门户", "host": "server1", "port": 20020, "context": "/x_portal_assemble_surface" }, "x_query_assemble_surface": { "name": "数据查询", "host": "server1", "port": 20020, "context": "/x_query_assemble_surface" }, "x_file_assemble_control": { "name": "云文件", "host": "server1", "port": 80, "context": "/x_file_assemble_control" }, ... }, "message": "", "date": "2020-11-25 16:14:58", "spent": 0, "size": -1, "count": 0, "position": 0 }其中每一个服务的host是服务器根据策略分配的。所以不同用户或这个每次访问会分配到不同的服务地址,以此平衡服务器压力。  但大多数情况下,我们通过都会nginx配置来搭建负载均衡集群,那此时,我们的获取到的服务地址列表始终是指向nginx服务器的。此时再去动态获取服务地址列表,就显得没有必要了。  所以我们可以手工配置所有服务地址,这样浏览器就不需要发起获取服务地址的请求了。在服务器config/web.json文件中,添加以下配置(如果在config目录下没有web.json文件,可以从configSample目录下拷贝一个过来):{ "configMapping": { //此处的server1是用户访问系统时所用的域名。 "server1": { "center": { "host": "center服务器域名", "port": "20030" }, //servers下配置所有系统服务的地址, //可以通过http://center服务器:20030/x_program_center/jaxrs/distribute/assemble/source/server1 //这个请求来获取,返回的data中的内容 "servers": { "x_portal_assemble_designer": { "name": "门户设计", "host": "app.cqmc.com", "port": 8085, "context": "/x_portal_assemble_designer" }, ...... } }, //如果有多个域名可以访问本系统,可以配置多组。 "server2": { ... } } }配置完成后重启服务器,再次访问系统,就不会发起获取服务地址的请求了。脚本预加载  在设计表单和页面时,我们经常会引用脚本库中的设计,在以前的版本中,我们会使用this.include方法引用脚本,这样会向服务器发起请求,在请求完成后再执行其他脚本。如果在页面载入的时候,需要引入的脚本过多时,必然会拖慢页面加载速度。  举例说明:在以前的代码中,我们很多时候都是include一个脚本,运行一部分代码,再include一部分脚本,再运行一部分代码,这样就要求include的脚本同步加载,阻塞页面载入,如以下代码://在表单的queryLoad事件中的代码 this.include("script1"); this.script1Function(); this.include("script2"); this.script2Function(); this.include("script3"); this.script3Function();在表单的queryLoad事件中有以上代码,并有三个脚本库script1、script2和script3,分别定义三个方法://script1 this.define("script1Function", function(txt){ console.log("script1 function is run"); });//script2 this.define("script2Function", function(txt){ console.log("script2 function is run"); });//script3 this.define("script3Function", function(txt){ console.log("script3 function is run"); });当我们展现这个表单时,通过浏览器开发工具的网络监控可以看到:三个引入脚本是顺序加载的,阻塞了页面载入,导致页面展现速度变慢,我们可以通过以下两种方法来解决此问题。页面配置预加载脚本  在5.3版本开始,我们在设计表单和页面时,可以配置需要预加载的脚本,只要选择在页面载入时需要加载的脚本即可,不需要再使用this.include方法加载了。但要注意的是,如果脚本有依赖关系,必须按照一定的顺序选择脚本。  在上面的例子中,我们只需要将要引入的脚本,选择到表单属性的“预加载脚本”中。然后修改queryLoad代码://在表单的queryLoad事件中的代码 //脚本已经预加载,不需要通过this.include载入了 this.script1Function(); this.script2Function(); this.script3Function();  再次展显此表单时,方法正常运行,但没有了引入脚本的http请求了。异步加载  我们也可以通过异步加载脚本,来加快页面展现速度,我们将上例中的queryLoad事件代码做如下改动://在表单的queryLoad事件中的代码 this.include(["script1","script2","script3"], function(){ this.script1Function(); this.script2Function(); this.script3Function(); }.bind(this), true);  通过设置this.include方法的第二个个参数为回调函数,这样第一个参数中的数组所指向的脚本会进行异步加载,加载完成后,运行回调函数。  再次展显此表单时,我们会看到方法正常运行,通过浏览器开发工具的网络监控可以看到:  三个请求同时运行,完成后运行脚本中的方法,不阻塞页面展现。  但上面的方法存在一个问题,就是在queryLoad事件中异步加载脚本,不会使页面展现阻塞,此时页面加载继续执行,如果我们在页面的其他事件或组件默认值等脚本中,使用了要加载的脚本中定义的方法时,就会出现错误,所以如果有这样的情况,我们需要在queryLoad事件中异步加载脚本时,暂停页面载入,等脚本加载完成后,再继续载入页面。我们修改上面的queryLoad事件代码如下://在表单的queryLoad事件中的代码 //暂停页面加载,并获取要恢复页面加载的回调方法 var resolve = this.wait(); this.include(["script1","script2","script3"], function(){ this.script1Function(); this.script2Function(); this.script3Function(); //异步加载完成,获取回调方法 resolve.cb(); //回调方法继续展现页面 }.bind(this), true);异步加载的方法不但适用脚本加载,也同样适用数据字典或其他异步请求的数据获取,可以通过异步方式获取所有需要的数据后,再加载表单,这样可以有效避免同步请求阻塞页面。请看下面的例子://假设在表单加载时,我们会使用到若干脚本、几个数据字典、以及通过服务获取的数据 //可以让这些请求异步执行,所有数据准备好以后,再继续展现表单 //在表单的queryLoad事件中的代码 //暂停页面加载,并获取要恢复页面加载的回调方法 var resolve = this.wait(); //加载脚本的Promise var scriptPromise = new Promise(function(resolve, reject){ this.include(["script1","script2","script3"], function(){ resolve(); }.bind(this), true); }.bind(this)); //加载通过服务器请求的数据 //此处以获取当前用户最新10条待办为例 //Actions的方法返回Promise对象 var dataPromise = this.Actions.load("x_processplatform_assemble_surface").TaskAction.V2ListPaging(1,10); //加载第一个数据字典 //get方法第二个参数表示异步,也可以是一个回调函数,返回Promise对象 var dict1Promise = (new this.Dict("dict1")).get("path", true); //加载第二个数据字典 var dict2Promise = (new this.Dict("dict2")).get("path",true); //通过Promise.all方法确保所有资源加载 Promise.all([scriptPromise, dict1Promise, dict2Promise, dataPromise]).then(function(values){ //获取到的数据赋值,以备后续使用 this.dict1Data = values[1]; this.dict2Data = values[2]; this.taskData = values[3].data; resolve.cb(); //继续加载表单 }.bind(this)).catch(function(){ //即使资源加载有错,也继续加载表单 resolve.cb(); });再次展显此表单时,通过浏览器开发工具的网络监控可以看到:所有请求同时发起,减少了页面阻塞时间。组件延时加载表单和页面的Tab页组件和子表单组件,具有“延时加载”选项。Tab页组件建议“延时加载”选项始终选“是”。对于子表单,首先建议尽可能不用计算子表单。然后“延时加载”选项选:“是”,然后在需要子表单展现时,使用以下代码激活:this.form.get("subform").active(function(){ //子表单加载完成后的回调方法 });组件默认值异步处理5.3版本开始支持表单组件默认值通过Promise进行异步处理,有关详细内容可查看文档:此处为语雀文档,点击链接查看:https://www.yuque.com/go/doc/14754201https://www.yuque.com/o2oa/rf2zrv/ws07m0想要了解更多开源O2OA办公开发平台,欢迎随时访问官网。官网:http://www.o2oa.net/
2020
12月
30
OA办公系统:Centos7.5 安装Rabbitmq笔记
一、erlang编译安装rabbitmq是erlang语言编写的,安装rabbitmq之前,需要先安装erlang,这里用erlang的源码进行安装,erlang安装包官网下载地址:http://erlang.org/download/$ wget http://erlang.org/download/otp_src_23.1.tar.gz $ tar -zxvf otp_src_23.1.tar.gz $ cd otp_src_23.1 # 这里要新建一个erlang文件夹,因为erlang编译安装默认是装在/usr/local下的bin和lib中,这里我们将他统一装到/usr/local/erlang中,方便查找和使用。 $ mkdir -p /usr/local/erlang # 在编译之前,必须安装以下依赖包 $ yum install -y make gcc gcc-c++ m4 openssl openssl-devel ncurses-devel unixODBC unixODBC-devel java java-devel $ ./configure --prefix=/usr/local/erlang编译之前需要安装依赖的软件环境:1、安装配置Java环境如果不安装编译最后会提示:[1]."no java compile found"#创建/usr/java/目录 $ mkdir -p /usr/java/ $ cd /usr/java #上传jdk-8u172-linux-x64.tar.gz到服务器,可以使用rz命令,上传本地文件 $ yum install lrzsz $ rz #解压 java安装包 $ tar -zxvf jdk-8u172-linux-x64.tar.gz #配置环境变量 $ vim /etc/profile #java environment export JAVA_HOME=/usr/java/jdk1.8.0_172 export CLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar export PATH=$PATH:${JAVA_HOME}/bin #使配置文件生效 $ source /etc/profile #检查是否安装成功 $ java --version2、安装UnixODBC如果不安装编译最后会提示:"odbc: ODBC library - link check failed"$ yum install unixODBC.x86_64 unixODBC-devel.x86_643、安装wx driver如果不安装编译最后会提示:"wx: Can not link the wx driver, wx will NOT be useable"此提示其实可以忽略,不影响编译。4、安装wxWidgetserlang依赖wxWidgets,如果不安装编译最后会提示:“wx not found”#安装wxWidgets的依赖gtk,>2.0版本或者>3.0版本都可以 $ yum install gtk2-devel.x86_64 #或者 $ yum install gtk3-devel.x86_645、安装fop.noarch如果不安装编译最后会提示:"documentation : fop is missing. Using fakefop to generate placeholder PDF files."$ yum install fop.noarch编译过程报错提示内容如下:成功编译之后,可以进行安装。6、执行make && makeinstall 进行编译安装$ make && make install编译安装完成:二、erlang环境变量配置erlang安装完成之后,在/usr/local/erlang会增加lib和bin目录,如下图所示:然后编辑/etc/profile,将/usr/local/erlang/bin这个文件夹加入到环境变量中:$ vim /etc/profile在profile文件最后添加,export PATH=$PATH:/usr/local/erlang/bin######### 添加如下内容 ############### export PATH=$PATH:/usr/local/erlang/bin ########################################执行source /etc/profile命令,使环境变量生效:$ source /etc/profile到此,既安装完成,直接输入erl,验证安装是否成功:三、安装RabbitMQ1、版本选择安装之前,需要去官网查看一下rabbitmq版本对erlang版本的一个支持情况,官网地址:http://www.rabbitmq.com/which-erlang.html我们安装的erlang是最新的23.1版本,所以,rabbitmq也要安装最新的3.8.8,3.8.9官方文档:http://www.rabbitmq.com/install-generic-unix.html2、下载安装过程下载并解压安装程序# 下载源码包 $ wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.9/rabbitmq-server-generic-unix-3.8.9.tar.xz # 解压 $ tar -xvf rabbitmq-server-generic-unix-3.8.9.tar.xz -C /usr/local/修改环境变量使用VIM编辑器打开/etc/profile文件:$ vim /etc/profile在文件的最后添加环境变量内容:export PATH=$PATH:/usr/local/rabbitmq_server-3.8.9/sbin执行source /etc/profile使环境变量的修改生效:$ source /etc/profile添加web管理插件$ rabbitmq-plugins enable rabbitmq_managementRabbit配置文件默认rabbitmq是没有配置文件的,需要去官方github上,复制一个配置文件模版过来,最新的3.7.0以上的版本可以使用新的key-value形式的配置文件rabbitmq.conf,和原来erlang格式的advanced.config相结合,解决一下key-value形式不好定义的配置。github地址:https://github.com/rabbitmq/rabbitmq-server/tree/master/docshttps://github.com/rabbitmq/rabbitmq-server/blob/v3.8.x/docs/advanced.config.examplehttps://github.com/rabbitmq/rabbitmq-server/blob/v3.8.x/docs/rabbitmq.conf.example将配置文件advanced.config.example和rabbitmq.conf.example两个文件的内容保存到文件并且改名后复制到 /usr/local/rabbitmq_server-3.8.9/etc/rabbitmq/ 下成为advanced.config和rabbitmq.conf。如:启动RabbitMQ配置完成后就可以启动rabbitmq服务了,其实没有配置文件也是可以启动服务的。# 后台启动rabbitmq服务 $ /usr/local/rabbitmq_server-3.8.9/sbin/rabbitmq-server -detachedrabbitmq运行日志目录:/usr/local/rabbitmq_server-3.8.9/var/log停止RabbitMQ$ /usr/local/rabbitmq_server-3.8.9/sbin/rabbitmqctl stopRabbitMQ管理控制台启用了rabbitmq的管理插件,会有一个web管理界面,默认监听端口15672,将此端口在防火墙上打开,则可以访问web界面:guest 无法登录的问题使用默认的用户 guest / guest (此也为管理员用户)登陆,会发现无法登陆,报错:User can only log in via localhost那是因为默认是限制了guest用户只能在本机登陆,也就是只能登陆localhost:15672我们可以通过修改配置文件rabbitmq.conf,取消这个限制: loopback_users这个项就是控制访问的,如果只是取消guest用户的话,只需要loopback_users.guest = false 即可。loopback_users.guest = false修改配置文件/usr/local/rabbitmq_server-3.8.9/etc/rabbitmq/rabbitmq.conf的内容:登录完成后进入控制台:OK,到此rabbitmq就算是装好了,rabbitmq的webui功能比较齐全,可以做到很多东西,包括常见的用户管理,权限管理,vhost管理等等。四、RabbitMQ常用命令总的来说,使用WebUI已经非常方便了,可以实现基本常用的管理操作。当然除了用WebUI,还有用命令行:下面列举一下常用的一些命令行操作:服务启动停止:启动: rabbitmq-server -detached停止: rabbitmqctl stop插件管理:插件列表: rabbitmq-plugins list 启动插件: rabbitmq-plugins enable XXX   (XXX为插件名)停用插件: rabbitmq-plugins disable XXX用户管理:添加用户: rabbitmqctl add_user username password删除用户: rabbitmqctl delete_user username修改密码: rabbitmqctl change_password username newpassword设置用户角色: rabbitmqctl set_user_tags username tag列出用户: rabbitmqctl list_users权限管理:列出所有用户权限: rabbitmqctl list_permissions查看制定用户权限: rabbitmqctl list_user_permissions username清除用户权限: rabbitmqctl clear_permissions [-p vhostpath] username设置用户权限: rabbitmqctl set_permissions [-p vhostpath] username conf write read                          conf: 一个正则匹配哪些资源能被该用户访问                          write:一个正则匹配哪些资源能被该用户写入                          read:一个正则匹配哪些资源能被该用户读取 OK,就介绍到这里。这只是单机安装rabbitmq的单节点,且是使用了比较麻烦的源码安装。
2020
11月
19
我们的客户 /
OUR CUSTOMERS
产品资讯: 400-888-0545 0571-88480535
媒体资讯: 13810474084
邮件地址:
O2OA开发平台官网:
官方微博
官方微信
Copyright © 2020 Zoneland All Rights Reserved. 浙ICP备10211689号 浙公网安备 33010602002582号
首页