400-888-0545
五大平台全开源 /
FIVE PLATFORMS
流程管理平台
全功能流程引擎。基于任务驱动,开放式服务驱动,高灵活性、扩展性...
了解更多
内容管理平台
门户管理平台
数据中心
服务管理平台
移动办公全开源 /
MOBILE OFFICE
全终端| 原生APP| 钉钉集成| 微信集成| WeLink集成
内置应用全开源 /
BUILT IN APPLICATIONS
考勤管理
工作中心
日程管理
企业网盘
个人便签
-
收起
会议管理
网络会议
全文检索
企业AI
热点信息
-
收起
客户管理
云笔记
资产管理
企业社区
公文管理
-
收起
工作管理
系统日志
脑图设计
-
收起
高达50%的合作伙伴续费折扣
身为O2OA合作伙伴,您在续费时可以获得高达50%的价格折扣
折扣规则
· 在合同到期前续费,可以获得官方价格50%的价格折扣。
· 在合同到期后3个月内续费,可以获得官方价格30%的价格折扣。
商业许可费用
技术支持费用
靓号系统 中海信创新产业园 宝泰大厦 杭州拍摄公司 瑞丽中裁商事调解中心 沈阳房产抵押 东莞朗盈包装材料 线控底盘 菜市场规划 杭州油水分离器 薄膜蒸发器 CS评估 玻璃钢管夹 水泥速凝剂 rohs检测仪 上海冷库建设 杭州大金空调售后维修 宁波纪念礼品 快乐学 杭州离婚律师 花想居拌粉 不锈钢管件 三星空调售后 杭州竞价推广 性能测试 杭州LG空调维修 杭州搬家价格 模具3D打印 淘宝托管 网店代运营 富阳人才网 天猫店铺代运营 电商仓库 近视手术治疗医院 杭州海尔空调维修 少儿口才加盟 上海婚介公司 防水涂层材料 GFK抗菌板 黑龙江刑事律师 浙江辐照灭菌 GFK墙板 GFK天花板 益生元 杭州奥克斯空调维修 钙果苗 桐庐农家乐 万能支撑器 水景支撑器 杭州信息推广 丙二醇 杭州格力空调维修 杭州三菱空调维修 杭州日立空调维修 电子政务系统 功率放大器 红梅苗木价格 GFK抗菌吊顶 杭州人才网 杭州代理记账 陶氏二丙二醇 传感器实验箱 智慧党建 沙雕艺术
产品特色 /
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有何不同?合理认识企业需求 - O2OA国产信息系统低代码开发平台
来说我们的OA系统之前,我们先来了解一下“钉钉”,它是阿里巴巴集团专为中国企业打造的免费沟通和协同的多端平台。现在很多的中小企业都选择使用“钉钉”这款软件,最大的原因就是“免费”和“协同”这两点,也正是因为钉钉的市场定位在“沟通平台”,所以与传统的OA平台相比,功能还是不够齐全,因此,有许多的企业更倾向于选择OA系统。下面来大致了解一下钉钉和传统的OA平台的区别吧!一、开发公司不同钉钉:是阿里巴巴集团专为中国企业打造的免费沟通和协同的多端平台。OA系统:OA是将现代化办公和计算机技术结合起来的一种新型办公方式,开发公司大大小小有许多家,且每一家都可能有各自特点。二、功能广泛性不同钉钉:类似于企业内部通讯工具,功能较为单一。OA系统:功能非常多样,包含工作任务等企业办公管理的各个方面,不管是大型企业、中小型企业还是政府部门,都推荐使用。三、功能侧重点不同钉钉:侧重于考勤管理。OA系统:侧重于流程管理、审批管理等办公管理,让企业内部工作更为便捷,提高工作效率。看完了上面的对比,可能屏幕前的你还是不太了解OA的具体功能,接下来,我将会以一款“开源免费使用”的O2OA平台作为例子,来浅谈OA系统的丰富功能。作为一款OA平台,他首先拥有着以下的主要功能:流程管理全功能流程引擎。基于任务驱动,开放式服务驱动,高灵活性、扩展性,事件定义丰富。包含人工、自动、拆分、合并、并行、定时、服务调用、子流程等功能。应用场景丰富,可轻松实现公文、合同、项目管理等复杂工作流应用。信息管理具有权限控制能力的内容管理平台。支持自定义栏目、分类,表格,表单,多级权限系统,能轻松实现知识管理、通知公司、规章制度、文件管理等内容发布系统。门户管理具体可视化表单编辑的,支持HTML直接导入的,支持各类数据源,外部应用集成能力的,所见即所得的门户管理平台。适用于实现企业信息化门户系统,可以轻松结合O2OA提供的认证设置与其他系统进行单点认证集成。服务管理可以在前端脚本的形式,开发和自定义web服务,实现与后端服务数据交互的能力。数据中心可以通过配置轻松实现数据透视图展示,数据统计、数据可视化图表开发等等功能。智能办公拥有语音办公、人脸识别、指纹认证、智能文档纠错、智能填表推荐等智能办公特色移动办公支持安卓\IOS手机APP办公,支持与企业微信和钉钉集成,支持企业私有化微信部署开箱即用O2OA还提供如考勤管理、日程管理、会议管理、脑图管理、便签、云文件、企业社区、执行力管理等开箱即用的应用供企业选择 O2OA平台作为一个企业可自维护、自实现的全功能业务平台,它提供了快速流程制作到自主应用开发的完整解决方案,以及众多具有业务深度的企业应用系统。它是一个开箱即用、可定制化的办公业务平台,支持多终端、轻量化分布,并且还是一个开源免费、免费使用、支持二次开发的平台。全功能全平台化办公平台解决方案 功能全:O2OA内置数十种开箱即用的应用以及开发组件,您可以免费获取全功能的O2OA平台来搭建符合企业要求的各种应用   终端全:O2OA覆盖了几乎全部终端。您可以使用IE10+、Chrome、Firefox、Safari、Opera等主流浏览器(包括使用相同内核的其他浏览器如:360浏览器、百度浏览器、猎豹浏览器等等)。除此之外,您还可以使用安卓、IOS移动APP进行流程处理等办公,也可以将O2OA与企业钉钉、微信集成,实现真正的随时随地办公。   平台全:O2OA支持在windows,linux(redhat\centos\ubantu)、aix、solaris、Kylin(国产)等主流操作系统上进行安装部署,平台适应性强 数据库全:O2OA支持几乎市面上所有的数据为软件,如:Oracle, SQLServer, Mysql, DB2, Infomix, PostgreSQL等主流数据库,并且还支持达梦等国产数据库系统。  部署简单、使用方便、二次开发成本超低 O2OA部署非常简单,只需要下载 → 解压 → 运行三步即可完成服务器部署  O2OA默认采用桌面式办公系统形式,给您更新颖的办公体验。 在O2OA,流程,表单,门户等开发均采用所见即所得的可视化开发模式,开发方便,成本更低。让您可以更快速地响应业务需求变更。O2OA使用组件级负载均衡技术,让您可以根据系统实际的运行情况来按需分配具体的功能组件的负载设置。 智能流程服务平台,通过拖拉拽实现业务过程 流程服务平台拥有基于任务、自维护、动态流程建模,您可以使用100多种业务模型,30多种表单元素在Web可视化设计界面轻松实现微流程、长流程。除此之外,流程平台智能监控也可以让您时刻了解平台的健康状况和业务运行情况。 多级门户管理平台在O2OA中您可以在系统中轻松画出企业门户,灵活、方便、个性的进行企业内外部信息聚合。 可以对不同的组织,不同的业务定制不同的门户页面,实现真正的多级门户系统强大的数据中心平台在O2OA数据中心,您可以根据实际需求使用系统中的流程,信息数据设置统计图表,支持使用饼图、柱状图、折线图、仪表盘、网格等形式进行展示,不需要其他插件(如HighChart.js、iCharts.js、ECharts.js)的支持。您可以将统计数据嵌入到流程或者信息表单里使用,也可以直接拖拽到桌面直接形成动态报表应用。  系统支持将制定好的数据视图直接放在桌面上更方便查看。 移动考勤管理O2OA考勤系统能适应内勤与外勤考勤签到,也能根据节假日排班调休与员工请假信息进行更加智能地数据分析。考勤系统能对打卡机数据进行统计分析,也能对在不同办公地点手机打卡的员工签到签退信息进行统计处理。 视频会议O2OA网络视频会议系让您更加方便地与异地的同事完成沟通交流,文件共享,方案讨论等工作。 企业社区O2OA企业社区系统让您快速完成企业开放、扁平、个性化的社交平台搭建。  工作和目标管理工作和目标管理真正将企业工作的制定、分解、进展汇报痕迹化,让企业的任务管理更为有效,有力支持企业运营目标的实现。1)将公司战略目标分解发布,明晰岗位职责,保证岗位职责与公司目标的对接2)确定执行的方法,将目标强化到执行层面,周期性滚动的目标执行方法3)将目标、计划落实为具体事项,强化任务意识,形成组织协作4)强化结果导向,以做的结果作为考核依据 脑图(思维导图)O2OA思维导图是一种广受欢迎的全脑式学习方法。它总是从一些中心概念和问题入手,将各种想法以及之间的关联性,用图像的方式呈现。它有助于我们更好的管理自己的目标,使自己的目标点呈现清晰状。 政务钉钉集成O2OA可轻松适配政务钉钉,实现各级政府部门高效沟通和管理,为政府智慧办公添砖加瓦。  公文正文控件集成O2OA集成文档控件,能够在IE、Chrome、Firefox等浏览器中直接编辑MS Office、WPS、金山电子表、永中Office等文档并保存到WEB服务器,实现文档和电子表格的统一管理。  OAuth2.0认证集成O2OA办公系统对OAuth2.0认证授权的支持使您可以添加丰富的外部网站、内部系统作为自己的“办公应用”,并且可以轻松进行网站登录。 平台二次开发 - 流程开发 O2OA提供丰富的易于使用的开发组件,您可以在办公平台上轻松实现企业业务流程,经过10多年锤炼的强大的流程引擎可以轻松实现各种复杂的业务需求。  平台二次开发 - 表单开发O2OA丰富的表单组件可以让您在系统中轻松地完成对业务表单的制作以及修改,可视化设计,所见即所得,无需复杂的代码开发。  平台二次开发 - 信息平台开发在O2OA中,您可以在系统内快速创建企业新闻,通知公告以及需要流程审批的公司制度,产品信息等应用。 移动办公O2OA自动适配移动办公,信息自动同步,无须重复开发,节省开发本。所以,与“钉钉”以及同类的软件相比,这款支持钉钉和企业微信接入、免费使用、免费开源、功能丰富、支持二次开发的O2OA平台,更适合于企业内部使用。关键词:OA办公软件/OA系统/办公系统OA/OA办公系统/OA/协同办公系统/免费OA/OA管理系统
23
2021-07
23
2021-07
利用OA系统进行办公,有何好处? - O2OA国产信息系统低代码开发平台
OA即办公自动化,主要是帮助管理者进行组织人员的管理运作。OA办公系统可以实现企事业单位内部的协同办公,多部门、跨地域办公的问题都将不再是问题。日常工作中,需要手动进行统计、采集、记录的事情,使用OA办公系统都可以代替完成。除了这些简单的事务,OA办公对于企事业单位,还有以下作用:一、推行“无纸化绿色办公”推行OA办公系统,支持无纸化办公保护环境的同时降低企业运营成本。在企业日常工作中,一纸一笔都是公司的资产,日积月累,也是一笔巨大的消耗,使用OA办公系统后,电子文件可以完美替代纸质文件,节约成本的同时,也解决了文件存放的问题。二、推进企业信息化管理进程近几年,企事业单位越来越追求整体的信息化进程。拥有OA办公系统后,所有的工作流程变成电子化处理,设置多条工作流后,领导审批、签章都会根据工作流程自动移交到下一步,打破时间空间上的限制,更有自动提醒功能,防止工作的错漏。三、时间不限、空间不限每次想找领导审批,被告知领导出差了;临时来了个紧急工作任务,没有办法及时应对等等这些问题都是传统办公模式下的固有弊端。但是在OA办公下,不限时间不限空间,PC和手机、PAD都可以随时随地办公,实现整体资源有效共享,即使你不在工位前,也能处理组织内部所有事宜。四、企业资源安全性加强传统的办公模式下,纸质文件容易丢失、企业人才离职后也会带走大量客户资源,导致企业的文件机密泄露。OA办公系统下,每位员工对应职位权限不同,文件查阅的范围也不同;在OA办公系统下,也有客户资源统计的功能,方便办公的同时,也避免了客户资源的流失。五、资源有效共享传统办公模式下,企业各部门之间,有资源共享的滞后性,但是通过OA办公系统,企业部门之间的信息资源都趋于透明化、共享化。(当然信息的共享透明都是在员工权限的前提下进行提供的)这样就打破了信息孤岛、资源孤岛的现象,根据不同的工作任务,有效实现信息数据共享。综上所述,对于企事业单位而言,日常工作中的流程审批,通知公告,企业资产,财务结算等等任务都可以通过OA办公系统进行扁平化的简单管理,提升企事业单位整体的管理运营水平。O2OA作为一款开源免费的OA办公开发平台,基于J2EE架构,集成移动办公、智能办公,支持私有化部署,自适应负载能力的企业信息化系统建设平台,基于AGPL协议开放源代码的企业信息化系统需求定制开发解决方案,让企业最低“零成本”进行OA办公系统的开发,为企事业单位信息化推波助澜。
23
2021-07
企业文档太多?信息太繁杂?是需要内容管理系统了 - O2OA国产信息系统低代码开发平台
随着互联网技术的发展,各种各样的信息都可以在一个网页里呈现,但是网页的信息衍生的非常快速繁多,整理这些大量的“内容”,需要耗费大量的人力物力和财力,为了减少成本、提高效率,OA系统的内容管理的功能就应运而生了。当内容管理和OA管理系统相结合时,又会碰撞出什么样的火花呢?在办公时,公司内部总会有最新动态的推送、各种通知、考勤数据、各类文件更新等等,有时候找这些信息所在的位置,会浪费不少的时间。但是在办公OA系统中嵌入内容管理平台,就可以将这些零散的信息进行新的整合,使得文档数据更易储存,更易搜索,让企业中的“业务数据孤岛、知识数据孤岛、桌面数据孤岛”这三大孤岛不复存在。以O2OA举例,让我们一起来看OA管理系统中的内容管理平台是什么样的。在O2OA中,选择内容管理平台,最终可呈现如下图所示。(图中栏目有最新动态、信息报送、最新文件、通知公告、值班系统、资产管理、学习园地、短信回复、领导日程安排、信息发布,其他的栏目也可以根据企业需要来新建)(*点击可查看大图)在OA系统中创建以上界面之前,可以选择“新建栏目”,可以填写栏目名称、栏目别名、栏目描述、栏目排序、栏目类型,其中栏目图标可以自由选择。(*点击可查看大图)设置完我们的栏目后,点开它,就可以开始配置栏目。就以“信息报送”这个栏目为例,可以看到栏目配置中有分类配置、表单配置、列表配置、数据配置、脚本配置、资源文件的添加以及栏目属性的修改。(*点击可查看大图)在这里,你可以利用OA管理系统发布公司的通知、公告等等信息,满足政府与企业内部员工与管理阶层,以及外部合作厂商、客户与企业投资者对内容的需求。以发布公司公告为例,只需要点击“+”号,即可添加新分类。同时,内容管理中的表单配置也是一大特色。在表单配置中,可以选择空白表单、编辑类表单、阅读类表单、数据录入类表单。系统提供的表单模板,可以帮助用户减少配置的工作量,点击自己需要的表单模板后,可以看到快捷工具栏、控件工具栏、表单编辑区、属性编辑区四个部分,设置好表单后,点击保存即可。(具体的控件以及快捷工具栏的操作指导可以在官网的使用手册中查看)(*点击可查看大图)O2OA系统中的表单可以分类设置,编辑类表单还是阅读类表单,可以根据需求自由选择。(*点击可查看大图)下面来讲讲O2OA办公系统上,内容管理功能中的“列表配置”。列表配置主要是用来表述数据,不同的列表能够展现不同的数据内容,新增列表也只需点击“+”号。(*点击可查看大图)提前配置好表单,再点击新建列表后,系统将弹出列表关联表单的对话框,选择展现的数据所在的表单即可。(*点击可查看大图)在数据配置中点击“+”号可以新建数据字典,数据字典属性编辑内容有:“名称”、“别名”和“描述”,同时可以查看数据字典属性“JSON”和“TEXT”格式的脚本。(*点击可查看大图)在脚本配置中,点击“+”号即可在栏目中新建一个脚本,脚本属性编辑内容有:“名称”、“别名”和“描述”。选择脚本样式,可以将脚本编辑区调整为你喜欢的格局,包括背景颜色、字体颜色、高亮颜色等。(*点击可查看大图)最后的栏目属性中,点击右侧编辑即可重新修改应用属性。当然,栏目图标也可以重新修改上传、可见范围、发布者和管理者也可以修改。(*点击可查看大图)更改可见范围包括“设置可用身份”、“设置可用部门”和“设置可用公司”,分别对应可以使用这个流程应用的个人、部门和公司。(*点击可查看大图)以上就是对开源免费O2OA开发平台中内容管理平台的简单介绍。使用O2OA中的内容管理平台,不管是政府还是企业都可以把正确、实时的内容传递给适当的人,并进行最有效率的管理,能够大幅降低工作中花费在数据管理、查询与检索上的时间与成本。将OA与内容管理结合起来,更能够确保信息的正确性,为政企事业单位提供一款高扩展性、低成本的文档、程序代码等信息相结合内容平台。
22
2021-07
在职场办公时,使用思维导图有什么用处? - O2OA国产信息系统低代码开发平台
思维导图,一般在各类培训班中都可以看到所谓思维导图的课程,尤其是近几年来尤为火爆。原因其一,是因为它在表达散发性思维的时候,作为思维工具简单并且有效;其二是因为,作为思维工具,能够充分运用左右脑的机能,开启大脑的潜能,协助逻辑与想象之间的平衡发展。当思维导图与工作相结合之后,在哪一些工作环境中能够显出其优势呢?一、会议中的记录传统的会议记录中,需要专门的记录人员进行详细文字的录入,大到开会的主题,小到同事们不同的意见讨论,这样的会议记录不仅阅读困难,也很难找到会议的重点。但是用思维导图进行会议记录后,虽然言简意赅,但是容易抓住会议重点,条理清晰。二、工作总结每过一段时间,工作总是需要进行总结,展示过往一段时间内的工作成果。一份优秀的工作总结,并不是简单的流水账,而是逻辑条理和重点总结。利用思维导图后,可以简单的表达出工作的重点,让通篇工作总结更有“含金量”。三、职场演说职场中,少不了各种工作报告和总结,所以进行职场演说和PPT展示都是职场打工人必备的“硬核技能”,用思维导图进行内容的梳理后,能够更加利落的进行一场职场工作演说,不管是领导还是客户,都会因为此次演说为你加分。除了以上几种场景,还有为新产品进行定位说明、工作时间管理、活动策划、年度目标、项目计划等等工作中,都可以利用思维导图进行逻辑和重点的整理,力求更高的工作效率。O2OA开源办公开发平台中,就拥有这样的思维导图(脑图)功能,让用户在办公的时候,即取即用。首先,在创建一个脑图时,你可以选择分类创建新的文件夹其次,你可以利用快捷栏,方便快速的整理制作一个脑图。不熟悉脑图的搭建格式?没有关系,快捷侧栏为你提供各式各样的基础格式。想要更多的颜色,可以!侧边快捷栏依旧为你实现。脑图的展示节点也可以利用侧边快捷栏简单的展开。在你的脑图中,你还会看到+号和-号,也要善于利用它们进行脑图的展开和收起。最后你制作完一份脑图,想要分享给同事、领导一起看看的时候,就请点击“分享”,自由选择分享对象!O2OA作为一个开源免费的OA开发平台,在办公系统中插入了“脑图”的小功能。这款简单便利的脑图(思维导图),相信能给许多的工作环境注入新的活力,拉动工作效率。
22
2021-07
全开源高灵活的企业协同办公OA:O2OA和它的客户管理 - O2OA国产信息系统低代码开发平台
销售,并非只是一件商品的买卖,销售之中最大的难点是“维持和建立客户关系”,当今社会依然注重人情味,销售也重在和客户建立一定的情感联系,能够让客户感受到“我是被重视的”,才能在销售中占得先机。为了实现这样的销售,很多的企业都选择的CRM客户管理系统,通过信息化的联结,从线索到签单进行全周期的管理,直接推进客户成交。客户管理系统通过收集客户数据,进行数据分析,针对不同的客户需求,进行不同的销售模式,并且还支持自动化销售、进销存一体化,让销售这端占据更多的主动权。O2OA企业开源办公开发平台,是基于J2EE分布式架构,集成移动办公、智能办公、支持私有化部署,并自适应负载能力的基于AGPL协议开放源代码的企业信息化系统需求定制开发平台解决方案,它能够极大程度上节约企业软件开发成本。其中的客户管理系统是一款简单实用的客户关系管理系统(CRM),在设计上力求简单、实用。可以永久保存客户资料,保证相关信息不丢失,有效积累客户信息,提高销售线索转化率,进行客户沟通并推动业务增长。接下来我们具体看看O2OA平台下的客户管理系统,是什么样的,是否适合企业引入。客户管理系统首页客户管理系统首页提供左导航切换各种二级页面,提供新建入口、地图、柱状图、饼状图的方式的客户统计。提供自主切换统计的条件,条件包含时间和人员。记录客户线索记录下隐藏的客户线索,未来都是有发展成为客户的可能性的。销售线索的导入现有的线索可以通过excel导入到系统中去。点击右侧“更多”-“导入”进入导入界面,先下载导入模板,根据模板组织数据后导入到系统中去。新建客户线索线索也可以通过新建方式一条一条增加。点击左侧列表“快速新建”按钮,选择“线索”,进入新建线索界面。或者点击右上角“”按钮填写相应的详细信息,必填信息有红色提示。具体的线索操作点击线索名称,进入线索详情界面,这里可以对线索进行编辑、转移、转化为客户、删除、跟进记录等操作。线索转移:变更线索负责人。编辑:修改线索基本信息。变更为客户:将线索转化为客户。跟进记录:记录每一次的跟进详情说明,可以包含图片和附件。删除:删除线索。线索视图有多种统计维度:我负责的线索、下属负责的线索、已转化的线索、全部线索。其中全部线索只有管理员(CRMManager、Manager)可见,下属负责的线索,下属关系是组织库个人中配置的汇报对象。客户记录新建客户点击左侧列表“快速新建”按钮,选择“客户”,进入新建线索界面。或者点击右上角“”按钮填写相应的详细信息,必填信息有红色提示。客户记录操作点击客户名称,进入客户详情界面,这里可以对客户进行编辑、转移、放入公海、更改成交状态、锁定、解锁、删除、跟进记录等操作转移:变更客户负责人、联系人。编辑:修改客户基本信息。放入公海:放入公海后该客户就没有负责人,任何人都可以去认领。更改成交状态:更改客户的成交状态已成交或者未成交。锁定:一个客户如果20天内没有发布过跟进记录并且20天内成交记录是未成交状态,系统会自动将该客户放入公海,但是如果该客户锁定了,系统就不会再放入公海。解锁:取消客户的锁定状态。删除:删除客户。客户视图有多种统计维度:我负责的客户、下属负责的客户、我参与的客户、全部客户。其中全部客户只有管理员(CRMManager、Manager)可见,下属负责的客户,下属关系是组织库个人中配置的汇报对象。公海公海是指所有无人负责的客户,每个销售人员可以自行去领取。打开公海内的客户,可以查看该客户的详细信息,对客户进行领取、分配的操作。分配操作只有管理员有权限。联系人点击左侧列表“快速新建”按钮,选择“联系人”,进入新建线索界面。或者点击右上角“”按钮填写相应的详细信息,必填信息有红色提示。(注意:联系人必须关联到客户)信息面板信息提供了四种不同的统计维度今日需联系客户:我负责的跟进记录联系时间是今天的客户分配给我的线索:我负责的线索分配给我的客户:我负责的客户待进入公海的客户:我负责的且15天内没有发布过跟进记录并且15天内成交记录是未成交状态的客户。20天后系统会自动将该客户放入公海。以上就是O2OA开源企业开发平台下,客户管理系统的详情。O2OA开源企业开发办公平台,只需要简单的几步技术搭建,就可以创建一款属于自己企业单位的OA办公系统,最低“0元”就可以实现企业工作协同、资源共享,提高企业工作效率、完善企业流转机制,便利跨地域的工作沟通,助力企业的信息化建设落地。
16
2021-07
开源OA项目中的日程管理,可以是什么样的? - O2OA国产信息系统低代码开发平台
提起日程管理,在生活中,大家一般都喜欢用日历或者手账本来记录自己的行程,但是在办公时,OA系统中的日程管理给予了我们新的选择。OA系统中的日程管理功能,可以将每一天的工作事务安排记录在日期中,简洁方便的管理自己的日常工作,在工作中避免任务的错漏和遗忘。当然,如果只有以上的功能,日程管理也不必特意放入OA系统中,人手一本笔记本加一支笔就可以搞定。OA中的日程管理,最大特点在于能够设置日程查看权限(即除了自己的日程之外,还可以查看指定人/企业内部日程),更加合理的帮助彼此安排、沟通工作。如果不用OA系统参与日程管理的话,很可能会出现……▶ 在大家都很繁忙的时间段内召开了会议,最后导致人员不足会议延迟、会议效率低下。▶ 领导无法了解下属最近的工作安排,不能对下属进行有效的指导监督。▶ 每周、每月的工作报告总是会忘记,等发现的时候已经错过了提交时间。而O2OA管理系统的日程安排功能,在最简洁的基础上,提供了企事业单位所需要的大部分基础功能,下面就从使用者的角度给大家来介绍一下它:①利用OA办公软件建立新日历。可以选择创建“我的日历”、“组织日历”,更清晰的区分个人任务和集体任务。②利用OA办公软件建立日程。支持建立周期性日程、全天型日程、指定时间段的日程安排。比如5月24日会议2小时的时间安排、阶段性项目指定时间段的时间安排等,效果如下图所示:编辑日程时可以便捷的选择任务的开始时间和结束时间。周期性日程添加简单快捷,只需选择“重复”选项下的标签即可。③日程可以通过多种查看方式进行查阅。例如:按月查看、按周查看、按日查看、日程日历查看等等。查看方式可以选择个人最适应的视图,提高自己的工作效率。④任务标签颜色更换。选择任务颜色,将不同类型的任务设置成不同的颜色,更加直观的区分自己的任务和日程安排。例如:尚未完成的任务设置为蓝色、已经完成的任务设置为红色、紧急任务设置为黄色等等。⑤设置任务提醒时间。可以在任务开始前选择任务提醒,有开始时/提前5分钟/提前10分钟/提前15分钟/提前30分钟/提前1小时/提前2小时以及不提醒的选项。看自己的工作和生活习惯,为自己定一个“任务闹钟”吧!⑥在日历广场中关注其他的日程安排,即可看到其他权限下的日程日历。同样,自己的个人日程也可以选择是否对外可见。在日程管理上,做到“个人”与“集体”相统一。综上所述,O2OA作为一个开源免费的OA开发平台(OA系统),在日程安排这个小功能上,做到了简洁与功能共存,实现了工作中的个人与集体相结合,做到了“所见即所得”。这样更方便公司的员工高效、无遗漏的完成工作,对于提高企业整体的工作效率也有重要的作用。
标杆案例 /
BENCHMARKING CASES
更多案例 /
MORE CASES
合作伙伴说O2OA /
WHAT PARTNERS SAY ABOUT O2OA
CEO 王维航
定制化的平台可以让我们的企业管理理念最终体现到流程,数据管理中。
中台事业群副总裁 墙辉(玄难)
世界是平的,企业也应该是平的
CEO 王伟力
O2OA是国内少有的信息化快速开发平台,让企业技术人员更关心业务,加速企业需求的落地。
总经理 陈栋
很高兴能在众多流程产品中选择了O2OA,希望能一如既往的提供高效和创新的管理产品。
技术文摘 /
TECHNICAL ABSTRACTS
在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在安装过程中会提示选择需要 安装的应用组件,可以根据自己的需要进行选择。建议安装openssh在安装过程中,设置用户kms,密码:123456。root密码可以在安装完成后进行修改。3)修改root密码安装完成后,重启服务器,进入登录界面:使用kms用户登录系统:kms/123456修改root密码为123456sudo passwd root先输入kms用户密码 123456,再设置root密码(UNIX密码)。root密码修改成功。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 disable如果仍然连接不上,可能是没有安装openssh服务,可以参考以下文档安装openssh服务:https://blog.csdn.net/gymaisyl/article/details/865704262、安装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
07月
09
办公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: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开源办公开发平台,今天想要为大家来解决一些常问的问题: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
OA办公:如何使用Tomcat搭建WebDav文件存储服务器
O2OA服务器支持使用webdav协议来存储二进制文件.Tomcat默认是支持WebDAV的,且默认为禁用状态.可以开启Tomcat的webdav作为文件存储服务器.开启步骤如下:1.在tomcat的webapp是目录下创建一个webdav目录作为项目.2.在webdav目录下创建WEB-INF/web.xmlweb.xml内容如下:<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>webdav</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <servlet> <servlet-name>webdav</servlet-name> <servlet-class>org.apache.catalina.servlets.WebdavServlet</servlet-class> <init-param> <param-name>debug</param-name> <param-value>0</param-value> </init-param> <init-param> <param-name>listings</param-name> <param-value>true</param-value> </init-param> <!-- Read-Write Access Settings --> <init-param> <param-name>readonly</param-name> <param-value>false</param-value> </init-param> </servlet> <!-- URL Mapping --> <servlet-mapping> <servlet-name>webdav</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> <security-constraint> <web-resource-collection> <web-resource-name>webdav</web-resource-name> <!-- Detect WebDAV Methods in URL For Whole Application --> <url-pattern>/*</url-pattern> <http-method>PROPFIND</http-method> <http-method>PROPPATCH</http-method> <http-method>COPY</http-method> <http-method>MOVE</http-method> <http-method>LOCK</http-method> <http-method>UNLOCK</http-method> </web-resource-collection> <!-- Restrict access by role --> <auth-constraint> <role-name>*</role-name> </auth-constraint> </security-constraint> <login-config> <auth-method>BASIC</auth-method> <realm-name>webdav</realm-name> </login-config> <security-role> <description>WebDAV User</description> <role-name>webdav</role-name> </security-role> </web-app>3.在tomcat/conf目录下的tomcat-users.xml文件中添加webdav访问用户4.启动Tomcat<?xml version="1.0" encoding="UTF-8"?> <tomcat-users xmlns="http://tomcat.apache.org/xml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd" version="1.0"> <role rolename="webdav"/> <user username="admin" password="admin" roles="webdav"/> </tomcat-users>5.在o2server/configSample目录下拷贝externalStorageSources.json到o2server/config目录修改配置指向webdav{ "file": [ { "protocol": "webdav", "username": "admin", "password": "admin", "host": "127.0.0.1", "port": 8080.0, "prefix": "/repository/default/file/", "enable": true, "weight": 100.0, "name": "251", "deepPath": false, "###protocol": "协议,可选值ftp,webdav###", "###username": "登录用户名.###", "###password": "登录密码.###", "###host": "主机地址.###", "###port": "端口.###", "###prefix": "前缀路径.###", "###enable": "是否启用###", "###weight": "设置权重.###", "###name": "存储节点名,对应存储名称,谨慎修改.###", "###deepPath": "是否使用更深的路径.###" } ], "processPlatform": [ { "protocol": "webdav", "username": "admin", "password": "admin", "host": "127.0.0.1", "port": 8080.0, "prefix": "/repository/default/processPlatform/", "enable": true, "weight": 100.0, "name": "251", "deepPath": false, "###protocol": "协议,可选值ftp,webdav###", "###username": "登录用户名.###", "###password": "登录密码.###", "###host": "主机地址.###", "###port": "端口.###", "###prefix": "前缀路径.###", "###enable": "是否启用###", "###weight": "设置权重.###", "###name": "存储节点名,对应存储名称,谨慎修改.###", "###deepPath": "是否使用更深的路径.###" } ], "mind": [ { "protocol": "webdav", "username": "admin", "password": "admin", "host": "127.0.0.1", "port": 8080.0, "prefix": "/repository/default/mind/", "enable": true, "weight": 100.0, "name": "251", "deepPath": false, "###protocol": "协议,可选值ftp,webdav###", "###username": "登录用户名.###", "###password": "登录密码.###", "###host": "主机地址.###", "###port": "端口.###", "###prefix": "前缀路径.###", "###enable": "是否启用###", "###weight": "设置权重.###", "###name": "存储节点名,对应存储名称,谨慎修改.###", "###deepPath": "是否使用更深的路径.###" } ], "meeting": [ { "protocol": "webdav", "username": "admin", "password": "admin", "host": "127.0.0.1", "port": 8080.0, "prefix": "/repository/default/meeting/", "enable": true, "weight": 100.0, "name": "251", "deepPath": false, "###protocol": "协议,可选值ftp,webdav###", "###username": "登录用户名.###", "###password": "登录密码.###", "###host": "主机地址.###", "###port": "端口.###", "###prefix": "前缀路径.###", "###enable": "是否启用###", "###weight": "设置权重.###", "###name": "存储节点名,对应存储名称,谨慎修改.###", "###deepPath": "是否使用更深的路径.###" } ], "calendar": [ { "protocol": "webdav", "username": "admin", "password": "admin", "host": "127.0.0.1", "port": 8080.0, "prefix": "/repository/default/calendar/", "enable": true, "weight": 100.0, "name": "251", "deepPath": false, "###protocol": "协议,可选值ftp,webdav###", "###username": "登录用户名.###", "###password": "登录密码.###", "###host": "主机地址.###", "###port": "端口.###", "###prefix": "前缀路径.###", "###enable": "是否启用###", "###weight": "设置权重.###", "###name": "存储节点名,对应存储名称,谨慎修改.###", "###deepPath": "是否使用更深的路径.###" } ], "okr": [ { "protocol": "webdav", "username": "admin", "password": "admin", "host": "127.0.0.1", "port": 8080.0, "prefix": "/repository/default/okr/", "enable": true, "weight": 100.0, "name": "251", "deepPath": false, "###protocol": "协议,可选值ftp,webdav###", "###username": "登录用户名.###", "###password": "登录密码.###", "###host": "主机地址.###", "###port": "端口.###", "###prefix": "前缀路径.###", "###enable": "是否启用###", "###weight": "设置权重.###", "###name": "存储节点名,对应存储名称,谨慎修改.###", "###deepPath": "是否使用更深的路径.###" } ], "cms": [ { "protocol": "webdav", "username": "admin", "password": "admin", "host": "127.0.0.1", "port": 8080.0, "prefix": "/repository/default/cms/", "enable": true, "weight": 100.0, "name": "251", "deepPath": false, "###protocol": "协议,可选值ftp,webdav###", "###username": "登录用户名.###", "###password": "登录密码.###", "###host": "主机地址.###", "###port": "端口.###", "###prefix": "前缀路径.###", "###enable": "是否启用###", "###weight": "设置权重.###", "###name": "存储节点名,对应存储名称,谨慎修改.###", "###deepPath": "是否使用更深的路径.###" } ], "bbs": [ { "protocol": "webdav", "username": "admin", "password": "admin", "host": "127.0.0.1", "port": 8080.0, "prefix": "/repository/default/bbs/", "enable": true, "weight": 100.0, "name": "251", "deepPath": false, "###protocol": "协议,可选值ftp,webdav###", "###username": "登录用户名.###", "###password": "登录密码.###", "###host": "主机地址.###", "###port": "端口.###", "###prefix": "前缀路径.###", "###enable": "是否启用###", "###weight": "设置权重.###", "###name": "存储节点名,对应存储名称,谨慎修改.###", "###deepPath": "是否使用更深的路径.###" } ], "report": [ { "protocol": "webdav", "username": "admin", "password": "admin", "host": "127.0.0.1", "port": 8080.0, "prefix": "/repository/default/report/", "enable": true, "weight": 100.0, "name": "251", "deepPath": false, "###protocol": "协议,可选值ftp,webdav###", "###username": "登录用户名.###", "###password": "登录密码.###", "###host": "主机地址.###", "###port": "端口.###", "###prefix": "前缀路径.###", "###enable": "是否启用###", "###weight": "设置权重.###", "###name": "存储节点名,对应存储名称,谨慎修改.###", "###deepPath": "是否使用更深的路径.###" } ], "strategyDeploy": [ { "protocol": "webdav", "username": "admin", "password": "admin", "host": "127.0.0.1", "port": 8080.0, "prefix": "/repository/default/strategyDeploy/", "enable": true, "weight": 100.0, "name": "251", "deepPath": false, "###protocol": "协议,可选值ftp,webdav###", "###username": "登录用户名.###", "###password": "登录密码.###", "###host": "主机地址.###", "###port": "端口.###", "###prefix": "前缀路径.###", "###enable": "是否启用###", "###weight": "设置权重.###", "###name": "存储节点名,对应存储名称,谨慎修改.###", "###deepPath": "是否使用更深的路径.###" } ], "teamwork": [ { "protocol": "webdav", "username": "admin", "password": "admin", "host": "127.0.0.1", "port": 8080.0, "prefix": "/repository/default/teamwork/", "enable": true, "weight": 100.0, "name": "251", "deepPath": false, "###protocol": "协议,可选值ftp,webdav###", "###username": "登录用户名.###", "###password": "登录密码.###", "###host": "主机地址.###", "###port": "端口.###", "###prefix": "前缀路径.###", "###enable": "是否启用###", "###weight": "设置权重.###", "###name": "存储节点名,对应存储名称,谨慎修改.###", "###deepPath": "是否使用更深的路径.###" } ], "structure": [ { "protocol": "webdav", "username": "admin", "password": "admin", "host": "127.0.0.1", "port": 8080.0, "prefix": "/repository/default/structure/", "enable": true, "weight": 100.0, "name": "251", "deepPath": false, "###protocol": "协议,可选值ftp,webdav###", "###username": "登录用户名.###", "###password": "登录密码.###", "###host": "主机地址.###", "###port": "端口.###", "###prefix": "前缀路径.###", "###enable": "是否启用###", "###weight": "设置权重.###", "###name": "存储节点名,对应存储名称,谨慎修改.###", "###deepPath": "是否使用更深的路径.###" } ] }6.在o2server/config目录下将node_xxx.xxx.xxx.xxx.json中的storage服务器设置为禁用. "storage": { "enable": false, "port": 20040.0, "sslEnable": false, "name": "251", "accounts": [], "prefix": "", "deepPath": false, "###enable": "是否启用,对于二进制流文件,比如附件,图片等存储在单独的文件服务器中,可以支持多种文件服务器,默认情况下使用ftp服务器作为文件服务器,每个节点可以启动一个文件服务器以提供高性能.###", "###port": "ftp服务器端口,此端口可以不对外开放,仅有ApplicationServer进行访问,并不直接对用户提供服务.###", "###sslEnable": "是否启用ssl传输加密,如果启用将使用config/keystore文件作为密钥文件.使用config/token.json文件中的sslKeyStorePassword字段为密钥密码,sslKeyManagerPassword为管理密码.###", "###name": "名称,多个节点中不能重名,默认为251.###", "###accounts": "二进制流文件是分多个账号分段存储的,可以单独设置每个分类的存储配置,一般不需要设置.###", "###passivePorts": "ftp传输有主动和被动之分,如果使用了被动传输,设置被动端口范围,默认为29000-30000.###", "###prefix": "路径前缀.###", "###deepPath": "使用更深的路径###" }7.启动服务器o2server服务已经将存储转向tomcat服务器所提供的webdav服务.📎tomcat-users.xml📎webdav.zip
2020
11月
19
在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
我们的客户 /
OUR CUSTOMERS
产品资讯: 400-888-0545 0571-88480535
媒体资讯: 13810474084
邮件地址:
O2OA开发平台官网:
官方微博
官方微信
Copyright © 2020 Zoneland All Rights Reserved. 浙ICP备10211689号 浙公网安备 33010602002582号
首页