iMessenger 2.0.14.0801简述-程序员宅基地

有些梦,看似遥不可及。但并非不能实现,仅仅要你足够的强!!。人力有时而穷,所以我们可能还须要一些热心人的帮助。这个人可能就是你

四年来,我们一直在努力,从未放弃。

在我们做好一件事之前。我们永远不知道你这样做的意义。但我们一如既往的坚持。所以!

结果非常意外!

梦想和现实的距离就是心到手的距离,或许我们手中的现实和我们心中的梦想不同.

我们不知道我们所谓的坚持一開始到底意欲何为,但终于当你坚持下去后你发现心与手越来越近.

当产品本身和市场无关时,我们选择了站在产品一方.

先进的技术方案:

不管处于何种目的。此次重构我们都选择了全球最顶尖的方案。以C作为内核引擎与框架的的基础语言。而且100%国际化Unicode编码支持,这表示软件将拥有同等产品中最搞的运行力。全系统使用宽字符使其支持不论什么目标语言的系统上使用国家的语言。我们首次将宽字符加密引入到C的对称加密算法中。

这表示您能够将随意国家的语言写入到加密文档或字符串中,打破窄字符使用的僵局。除此之外我们类操作系统架构导出了纯C的接口Api,这表示用友最广泛的使用用例,即使不使用目标语言的Routing与SDK我们也支持不论什么支持DLL开发的语言调用。这样的导出方式同一时候支持隐式连接和显示链接。

GIPS与H.265的结合使视频应用带宽占用减少一半。

UDX使UDP发送快一倍。稳定一倍。

即便在极差的网络环境下也保证了数据的安全与网络的可靠性。

多维度数据系统架构。全商业智能数据结构使您能够在其它系统非常方面的读取到到登录用户。多维度数据结构使您的数据库应用开发变得异常简单。

多维度数据结构旨在应用数据与系统基础数据的无关,仅仅在应用与系统基础数据库之间建立关系索引就可以完毕。方便开发应用的同一时候减少了用户系统与用户关系的可维护性以及易用性和通用性。真正做到一个账户全网畅行,不在须要用老方案绑定用户ID来实现同步登录。

由于我们的架构仅仅有一个基础用户系统和基础用户关系系统。不管在那个应用场景中,您仅仅是创建基础用户的关系索引,而非绑定新的用户系统ID。因此非常大程度的减少了多系统用户的通用性。和信息互通性。

 

ILFramework支持使开发人员能够使用自己熟悉的语言来构建应用。NetRouting的.NETFramework路由框架同意您使用.NET下的VC.NET, VB.NET C#.NET来构建自己的功能应用。而不须要频繁的使用DllImport来导入动态库。仅仅需引用ILFramework的Library并申明命名空间就可以实现对功能的调用。对于.NET下的语言则全然使用目标语言原生语法。这大大简化了其它语言的开发难度。

后期我们将持续为Java和Php提供Expand模块和VM提供程序,这表示在后期开发人员能够全然使用PHP和Java来调用内核登录以及开发功能模块。让系统最大可能的扩展。

假设可能,下一次升级我们将会把DNN纳入我们的平台。这表示开发人员能够使用最简单的方式实现同声翻译与语音输入。DNN的语音识别精准度比IOS的Siri高7%。

比科大讯飞高9%。

而且支持全球六十多种语言同声翻译。

假设时间与財力同意,我们将提供功能强大的播放器点播支持。您能够通过自己定义浏览器链接协议直接将网络媒体装载进本地播放器。对于受保护的信息我们提供私有格式保护,这表示用户即使下载这些受保护内容也无法通过其它播放器播放。

 

是什么让我们如此坚持:

五年来我们曾多次想过放弃,开发也是断断续续。没有一个总体的方案,就在我们坚持不下去的时候我们的坚持让我们看到一丝希望。即便这些希望之火并不旺盛,可是我们还是决定孤注一掷的赌一把,不管成败都提供一个最好的方案与产品给用户和开发人员。

     每次在我们坚持不下去的时候总是有一堆的客户需求,这些需求尽管没能与我们达成协议。可是却提供了让我们继续坚持的动力。其实我们也不能与客户达成使用协议,由于就眼下而言我们还不能将产品用于商业目的,站在我们的角度它还无法达到商用级。

因此我们还在继续努力

文件夹

1、Client简述

Client=client。client是直接与单一用户接触的程序,执行与PC或移动设备上。

iMessengerclient引擎与框架使用非托管的纯C++编写,基于多态与跨语言的开发架构同意其最小化安装.对于功能应用用户能够在使用时依据需求从网络上获取。

最大的可伸缩架构使client程序拥有最强大的伸缩功能。全显式链接模式支持功能即插即用。

于此同一时候client相同提供了功能强大的ILFramework支持。这使得client功能能够用不论什么支持的语言来开发,假设开发人员想用由我们提供的功能。则还能够使用AppFramework提供的接口来调用官方功能模块与应用,假设开发人员计划基于我们的平台开发全然自主的client则通过AppILFramework与KernelBaseApi来构建全然自主的client程序,这一切空前强大而且自由。

1.1  Architecture[client开发架构]

client本地程序功能由官方开发,而且直接驱动用户适配层与AppFramework以及直接訪问与操作KernelEngine,因此本地应用绕过了AppILFramework与KernelBaseApi。可是因为本地应用我们所有使用了显式链接的方式。所以本地应用功能模块调度管理位于AppFramework中。而AppFramework是本地程序框架,则被本地应用程序与扩展模块隐式连接调用。从而形成程序初始化时从AppFramework初始化然后由本地程序模块创建用户视图,接着本地程序模块回调AppFramework中的Api来完毕界面创建与參数传递。这表示无论在程序的不论什么地方都不须要对本地功能模块做更改。所有的窗体调度与管理都由AppFramework完毕。

即便是在同一个功能模块内也无需直接内部调用,除非这些模块并不打算对外开放使用,否则都由AppFramework的WindowTask统一管理创建。因此您无论是基于何种语言和在那些地方使用,您都仅仅须要简单的一行代码完毕对来自不同模块的功能调度并传递參数。

       在Windows平台上程序提供X86和X64两个版本号。这是截至眼下位置唯一支持纯64为的通讯平台架构。

上图描写叙述了client开发模块功能结构与依赖规则。从严格意义上讲 KernelEngine是client全部功能的基础内核。

有关这些结构模块的具体提供功能请參阅1.11

1.11[client模块]

KernelEngine[client内核提供程序模块]

1.     本地用户控制器[Local User Controller]:本地用户控制器。此控制器包括全部本地用户操作以及本地用户头像载入信息读取。获取好友数据。

同一时候本地用户控制器还提供了本地用户数据创建与检索的任务,依据配置管理提供的用户配置创建用户文件夹和暂时文件夹以及创建用户本地数据。

2.     远程用户控制器[Reome User Controller]:远程用户控制器。此控制器提供用于从iMessenger远程server上同步数据和更改远程server用户信息。以及在本地用户发生更改时通知远程友好用户以刷新状态或数据。首次登录或友好用户信息数据发生更改时从远程server获取最新的用户数据并同步到本地用户控制器然后写入本地数据。

3.     配置管理[Configuration]:配置管理包括全局配置和用户配置以及功能配置三个部分

4.     加密管理[Encrypt Engine]:提供多种加密算法,包括全然自主的宽字符对称加密算法。

5.     消息控制器[Message Controller]:来自远程server的中转消息都将进入此控制器然后被会话控制器分类和传递给目标功能模块

6.     会话控制器[Session Controller]:提供本地会话管理支持,维持本地与远程的中转和点对点会话。

7.     网络控制器[Network Controller]:来自对Boost的Asio的封装,提供稳定高效的client网络自适配,这是全部client网络功能的底层控制器。

8.     Xml解析引擎[Xml Engine]:KernelEngine内部使用了Xml作为系统全局和应用配置,此引擎提供用于KernelEngine内部配置适配管理。

9.     Xmpp自己主动适配层[Xmpp Engine]:即使我们眼下没有在PC上直接使用Xmpp,可是我们依旧为此提供了功能强大的Xmpp引擎供二次开发使用。

10.  线程与网络协议栈[Thread and Protocol],提供强大的本地线程池管理和多种协议支持。Sip协议支使其轻松开发出网络呼叫应用。本地浏览器协议支持使其最大可能的将自己的应用部接口部署在Web上。

11.  本地数据訪问控制器[Local Data Controller]:提供本地数据库訪问。改动等操作。

12.  推送消息管理器[Message Push]:提供本地消息推送管理,来自第三方server的消息推送将被依照指定标识推送给目标接受程序。这些程序可能是第三方自己定义程序。

13.  本地数据库引擎[Sqlite]。此数据库引擎限于内部操作使用,即便在丢失外围组件的情况保证维持程序的稳定性和容错性,因为本地程序的数据创建与检索都由KernelEngine完毕。因此在内核引擎内部使用内置的数据库引擎。

对于外置模块可使用外部提供的Sqlite操作。假设是.NET开发人员须要额外的本地数据操作支持则表示还必须获取System.Data.Sqlite组件。

KernelUtil模块[client内核辅助模块]。

提供播放器和client一些辅助功能,比方热键管理。注冊和自己定义配置。

KernelBaseApi模块[client二次开发Api模块]。此模块仅对内核引擎的二次开发做了安全封装

KernelBaseUser模块[client用户适配层模块]。提供用于client用户信息管理的接口程序模块

KernelUiBase模块[client用户界面基础模块]。提供用于client公共界面的管理模块,KernelEngine显式调用了此模块以创建提醒界面。

AppFramework模块[client应用程序框架]。官方应用从这里初始化。官方程序功能调度管理框架,此模块同一时候隐式调用KernelEngine与KernelUitl和KernelUiBase。

与此同一时候显式调用全部官方本地功能模块,并提供这些模块的调用接口。

因此二次开发假设要调用官方功能并传递參数仅仅须要调用AppFramework提供的接口就可以,从而大大简化了程序开发。

AppNetRouting模块[clientNET平台路由模块]。将client全部本地内核接口与框架接口进行数据转换。此路由同一时候调用KernelBaseApi,AppFramework,KernelUiBase。而且这些模块本地C++数据转换为ATL支持的数据格式,这样做的目的是防止内核接收数据丢失或无法识别。

AppILFramework模块[client中间语言框架]。基于VC.NET的托管应用程序提供框架。调用AppNetRouting以完毕从托管语言到非托管语言的互通。此框架封装了全部非托管下的应用程序接口。包含对官方功能调用和数据获取以及写入。

AppPlugsFramework模块[client应用程序扩展框架]。

提供client本地语言插件服务支持的框架

AppPlugsILFramework模块[client中间语言扩展框架]。提供client中间语言插件服务支持的框架

AppResource模块[client公共资源模块]。

提供client公共资源共享与存储

 

以上是内核模块功能与介绍。

以下为应用程序介绍

iMessenger[非托管client程序实例文件]提供非托管程序的初始化工作,由AppFramework初始化

iMessengerILHost [托管client程序实例文件]提供托管程序的初始化,由AppILFramework初始化

iNews [client弹出迷你新闻程序]提供弹出迷你新闻页和广告页,不可直接双击启动,须要通过框架传递參数并启动。

iMessengerShell [client外壳程序]第一次使用必须由此启动,后期启动依据配置启动是否为托管

iUpdate [client升级程序]从互联网获取最新版本号的程序和附加组件。无论这些组件是否由官方开发,仅仅要在官方站点上提供的都会更新。

 

以上为程序文件介绍。下面是官方开发部分功能模块文件与介绍:

LoginPanel [登录模块]

client官方提供的登录程序。由AppFramework调度管理

MainFrame[主框架]client官方提供的主框架。提供用于client本地应用管理,Ui设置,联系人。群组,频道查找。用户与群,频道信息管理查看。

以及当前登录用户头像设置等功能。

部分调度内置,公共部分由AppFramework调度管理,可供不论什么第三方程序和二次开发调用。

ChatFrameApp[会话框架]client官方提供的个人会话程序模块,提供了多种会话模式,暂时会话和标准会话,当中暂时会话提供三种状态。来自群组和频道为一种。来自网页是另外一种,来自用户查找为第三种,当选择的用户不是自己的友好用户时AppFramework会自己主动调用暂时会话。此模块对外接口由AppFramework调度管理。

MettingApp[视频频道框架]client视频频道框架,提供了多人视频功能支持,此模块仅仅提供框架,支持内置应用模块的支持。同意开发人员自己定义开发功能模块,除了多人视频之外官方提供部分内置功能模块,比方协同浏览,投票,白板,讨论,部分功能可能须要付费,此框架对外接口由AppFramework调度管理。对内开放接口Api,以提供内置应用接入。

GroupApp[群会话框架]client群会话支持模块,提供讨论组与标准群会话模式。对外接口由AppFramework调度管理,内置语音朗读功能。

AvSettings[音视频设置]client音视频设置模块,由AppFramework调度管理。

ConfigCenter[设置中心]

client用户配置中心,提供全局配置以及用户配置同一时候支持第三方配置管理,全局配置更改后将影响全部用户,由AppFramework调度管理。可通过參数表示要打开的页面。

MsgHistory[历史消息管理器]client用户消息记录模块。包括全部消息记录。由AppFramework调度。

MsgBox[通知与未读消息]client未读消息管理器与通知中心,由AppFramework调度管理。

以上为官方功能模块介绍,假设安装时选择仅仅安装内核则除了Appmanage功能之外将不安装上面不论什么一个,此时可全然使用自己定义client程序。

 

说明:server使用多维度数据以提升效率和简化功能开发和提升数据通用性以及易用性。在client则不这样提供。client由内核引擎创建的数据包括用户信息数据库库,用户消息记录数据库,用户消息扩展记录[包括系统消息],用户自己定义设置数据库[眼下版本号以Xml形式提供,新版本号可能会以Db形式提供]

1.2[client框架]

client框架是client功能模块的容器。在这个容器内全部的功能模块通过框架容器提供的接口Api互相訪问和传递參数。此框架包括本地框架和托管语言框架。

当中本地框架接受不论什么支持DLL的语言调用,而托管语言框架则仅仅能被支持的语言调用。可是大大简化了托管语言的开发难度。

1.21[client框架]

client本地程序框架为AppFramework。提供程序为AppFramework.dll。其结构例如以下

1.2.2[client中间语言框架]

client中间语言程序框架为AppILFramework。提供程序为:AppILFramework。其结构例如以下

 

 

AppILFramework与本地程序不同的地方在于。本地程序的AppFramework仅仅提供调度管理,对于数据处理和管理则由程序直接调用相应的提供程序模块接口。

而且在调用后直接操作内核数据。而AppILFramework则是从底层经过多重路由后将所有的调度与数据操作所有封装在AppILFramework中。

最后开发人员引用AppILFramework从中取得AppILFramework中的命名空间与类定义。

通过定义取得内核数据与AppFramework的调度管理来操作C++的内核数据和本地应用程序框架调度。这最大程度的实现了本地程序功能与托管程序功能的互通性。一行代码就可以完毕对本地应用程序框架功能的调度,大大减少跨语言操作的复杂性。同一时候提升运行效率,并减少不可控因素。

     IL功能完毕后向上级路由一层一层返回数据或者,向上级路由请求函数响应以调用本地功能,类似操作系统工作模式,因此在ILFramework下性能要偏低与本地框架,由于中间经过多重路由。而且数据取出和函数响应时通过AppILFramework调用AppNetRouting从本地框架和内核中取出以及响应,响应之后要发送数据或写入数据再通过AppILFramework调用AppNetRouting操作本地内核与框架以写入或更新数据。在经过此类多重路由

后性能将减少。

1.2.3Functional[client功能]

client除了提供强大的开发人员框架之外。与此同一时候我们提供了功能强大的应用模块。这些功能最初的定义为下:

多类型登录,支持从第三方直接传递登录数据然后启动登录。

强大的主框架,全然显式链接的主界面框架,提供了头像更改。联系人资料更改、查看。强大的查找联系人、群组、视频频道功能。本地应用管理让您很方便的管理本地应用安装卸载。

以及各种应用的关系或联系人列表。

同一时候提供了天气支持功能。

提供联系人会话功能。包括视频通话;语音通话。视频留言;录像。语音留言。录音。窗体抖动;文件发送;表情。离线文件;网络共享;远程桌面。在非友好用户状态下部分功能无法使用。同意从Web启动会话。

提供群会话功能。包括多人视频通话;多人语音通话;视频播放;录像;语音留言。录音;群文件共享。发起暂时会话。

同意从Web启动会话。

提供多人视频会话功能,最多包括64人视频通话。多人语音通话;视频主播;录像;录音;文件协同浏览。网络协同浏览;投票;电子白板。桌面区域共享;发起暂时会话。部分功能由内置插件提供。

功能强大的配置中心。程序最大可能的同意自己定义设置。

每一个用户能够能够为自己保存相应的设置,系统设置中心模块提供了功能强大的设置配置,除了同意设置系统本身配置之外还同意通过配置读取第三方应用的配置设置。

消息管理器支持,支持历史消息记录管理。系统通知管理。未读消息管理。

有关很多其它具体功能,请在产品推出后查看SDK文档。

1.3 Security[client安全]

client使用了多种加密方式和程序验证来保证用户数据的安全。

多数敏感数据在内核中使用静态数据并加密。对于第三方开发人员开发的功能扩展要操作某些涉及隐私或高权限的函数则须要相应用签名否则无法运行这些程序。

对于用户配置和本地数据我们都使用了DES对称加密。这是一个全新的DES算法,我们针对宽字符做了优化了处理,不管是中文还是英文都能有效加密,从而保证用户数据安全。

网络传输过程中我们相同使用对称加密算法对数据加密,因此在网络中传输的消息数据即便被截获也无法取得明文数据

1.4 [client扩展]

      client扩展功能标识非自己定义的独立功能模块,而是建立在现有功能模块基础之上的扩展模块。在本地平台上该模块管理由AppPlugsFramework提供。这些模块提供了针对某个模块或功能的扩展开发。而且通过应用管理显示出来,在应用管理中启动这些扩展功能。

这些功能都是热启动。能够随时安装或卸载。安装后依据配置文件加载到应用管理器中。

     托管平台上的扩展管理模块为AppILPlugsFramework此模块依赖于AppILFramework须要.NETFramework 4.0的支持方能正常工作,因为本地应用管理器无法载入托管的应用模块。所以假设要使用基于IL的应用,则程序必须从托管的启动实例初始化,然后载入ILAppManage,这是中间语言平台的应用管理模块,可以管理IL下的全部安装功能。在ILFramework下您使用托管的应用实例,除了可以使用全部的ILFramework功能之外,还同意您调用和使用本地安装的功能模块。

但在本地平台上您将仅仅能使用非本地程序框架提供的功能和扩展功能。

     总上所述。假设要使用很多其它的功能和更方便的开发,则您必须安装.NetFramework 4.0。然后您就能够使用C# VB以最简单的方式创建应用。在托管平台上你能够使用到尽可能多的功能应用。而在非托管平台上则会受限较大。

1.5 [移动client]

因为新版本号系统的架构的多态性,在移动平台上开发也相对简单。

我们会针对IOS和Android开发相对的提供模块供Android和IOS上的用户开发和扩展自己定义功能。为了保证安全内核提供程序可能不会对外开放源码,但官方提供的功能模块在手机上将对外提供代码。

针对不同的平台我们将提供不同的SDK支持。这使得软件拥有很多其它平台的支持和扩展。

1.6 [clientWeb支持]

WebApps支持是指软件提供自己定义Web协议,同意从Web页面调用本地程序。

除上述内容之外,我们在将来还将提供基于WebService的Web通讯框架服务,这表示在将来开发人员不但能够使用基于桌面的功能开发通讯程序,同一时候方便使用WebService中的接口将通讯功能签入到网页中,直接在网页中会话。而不必安装client,但对于很多其它强大的功能则必须依赖于桌面或移动client的支持。

1.7 [client开发]

我们一再的强调iMessenger新版本号将开发人员纳为第一个目标用户群体,这表示软件有着很丰富的接口和开发人员支持。

这些支持包含跨语言的开发文档与SDK提供文件。官方演示样例代码和Demo。以及联机电子文档和本地安装的帮助集合。这些将使您开发出最适用于自己的软体功能。

眼下我们支持使用C和C++以及NET平台上的全部语言作为开发语言,而且为这些语言提供了统一的接口集和框架集。

1.7.1 Functional Expand[client功能扩展]

 client功能的扩展是我们架构之初优先考虑的因素之中的一个。这里的扩展不单单指基于现有功能模块的扩展开发,而是指在这个平台上全部支持的功能开发,包含但不限于下面部分:

1、基于AppFramework的本地client功能开发。

AppFramework封装了全部来自官方的功能调度与管理封装。开发人员通过使用本地开发语言调用KernelBaseApi和KernelUiBase以及KernelBaseUser以訪问和获取内核数据和操作,通过AppFramework与本地官方功能对接,可自由的调度官方提供的功能,并对其传递參数。此类开发仅仅针对本地框架下的功能和扩展有效,您能够使用本地框架和内核开发出高效灵活且功能强大的功能模块,或现有的功能模块扩展程序。安装时这些数据将被安装了Foundation下。

由AppFramework的AppManage管理和维护以及调度。

AppFramework下的应用无法调用托管框架中的功能模块

2、基于AppPlugsFrameWork的插件功能开发,这些插件拥有独立的功能,安装后安装在PlugsFoundation下。不同于前者的是,这些插件由PlugsManage统一管理,无法提供在主界面或者其它地方显示。插件必须提供统一的接口效验函数,而扩展功能模块则同意使用自己定义入口点。

本地插件无法调用托管插件功能

3、基于AppILFramework的托管语言功能开发。AppILFramework是针对NET平台下全部接口集和框架集封装的中间语言框架集。其上级为AppNetRouting。AppNetRouting提供了将本地语言框架与内核的数据转换作用,使其在NET平台上有着最佳的数据安全性和最低的数据损坏和不匹配保障。AppILFramework不光提供了来自AppFramework的本地功能框架的接口封装,并且封装全部本地内核与辅助模块的接口封装,比如热键。内核数据訪问,改动,操作等等的。是一个全然开放接口的NET平台框架集。使用此框架集您能够全然自己定义的开发出基于NET平台的扩展模块。假设您不打算使用我们提供的本地功能,那么此框架则同意您开发全然自主的基于NET的client。并且同意调用本地client功能

4、基于AppILPlugsFramework的托管语言插件开发。

这些插件相同拥有独立的功能,安装后在ILPlugsFoundation下。

与AppILFramework不同的是他们必须有统一的插件接口。而且有ILAppManage统一管理,这些插件功能同意调用本地的功能模块和扩展程序。

1.7.2 Custom User Interface [client自己定义Ui]

我们将用户界面与功能模块100%的分离,这表示即便您不懂不论什么开发技术,仅仅要您能看懂UI属性和会切图您就能够全然自己定义的设计软件界面。

这些界面模块仅限于官方提供的功能。第三方界面方案由第三方提供。我们以图文的形式向您说明UI自己定义的简便性

下图为提醒对话框执行效果图:

在设计视图中同意用户对其全然自己定义。包含布局,样式图标;设计视图例如以下:

仅仅需通过简单的鼠标拖拽和属性更改就可以全然颠覆Ui风格。功能-空前强大。自由-一如既往。

1.7.3 [自己定义client开发]

我们提供了client内核引擎和对外接口。这表示,假设用户不希望使用官方提供的主程序,那么您能够自己定义开发属于您的主程序或其它功能,即便如此我们还是同意您调用官方提供的功能模块。

在本地平台上您能够使用QT。MFC。Win32SDk,VB,Delphi,BCB来开发应用程序或动态库以实现自己定义功能应用。

在托管平台上您能够使用VC.NET 。VB.NET。 C#.NET来开发托管语言的功能模块。本地平台应用无法直接调用托管平台模块功能。可是托管平台能够调用本地平台功能。

以下我们给出简单的演示样例代码和执行效果图。

本地平台以MFC为例。

技术点例如以下:您在使用前必须包括下列头文件和导入库

#include<AppFramework.h>

#include<KernelEngineInc.h>

#pragma comment(lib,"KernelEngine.lib")

#pragma  comment(lib," AppFramework.lib")

然后您就能够直接写功能代码了。比方在一个button单击消息函数中写入ShowAbout();

运行结果:打开关于对话框。

或者写入下列代码:

ShowTrayTipWnd(_T("1001"),_T("来自通达OA的消息通知"),_T("你的电脑快爆炸了"),NULL,_T("查看"), 1, NULL);

仅仅需一行代码弹出通知窗体并指定显示的选项。

第一个參数为消息ID,第二个为消息标题,第三个为消息正文。第四个为消息正文Http连接地址,通过通过单击消息文本或查看button打开链接页面。

第五个參数为运行button上要显示的文字。第六个參数为显示的button选项,1表示显示两个button,2表示显示三个button,0表示显示一个button。最后一个參数标识要显示的时间,以毫秒为单位,一般为15000,假设为NULL则一直显示。

运行结果:

以上是针对本地UI功能模块的开发调用,那么假设不调用界面模块仅仅需读取数据呢,MFC中获取内核提供程序版本号和当前登录用户文档文件夹的演示样例代码例如以下:

CString strKernelEngineVersion, strKernelLoginUserPath;

strKernelEngineVersion = GetKernelEngineVersion();

strKernelLoginUserPath = GetLocalLoginUserFilePath();

之后您能够将strKernelEngineVersion用在各种地方用来显示内核版本号,和在其它须要获取当前用户工作文件夹的地方使用strKernelLoginUserPath比如。当然您也能够直接使用GetKernelEngineVersion();GetLocalLoginUserFilePath();来直接赋值以简化代码。

比方我们在弹出消息中显示版本号和文档文件夹,那么代码例如以下:

AfxMessageBox(GetKernelEngineVersion());

AfxMessageBox(GetLocalLoginUserFilePath ());

运行效果例如以下:

 

是使用上面演示样例之前部分功能须要登录后才干使用,比方获取当前用户的工作文件夹。

在本地平台上登录也异常简单,在MFC下相同是一行代码。

示比例如以下:

       int iLogin;

       //KernelEngine_UserLogin中的第三个參数为帐号类型。赋值范围为0-2。第四个參数为登录状态。赋值范围0-5.

//KernelEngine_UserLogin中的的正常返回值为123。分别标识成功,帐号不存在,password错误三种状态

       iLogin = KernelEngine_UserLogin(_T("登录名"),_T("登录password"), 1, 1);

       if (iLogin== 1) //返回值等于1登录成功

       {

              //在这里写入登录成功后的运行代码

       }

       elseif (iLogin = 2) //返回值等于2表示用户不存在

       {

              //在这里写入用户不存在时要做的操作

       }

       elseif(iLogin = 3) //返回值等于3表示password错误。

       {

              //在这里写入登录password错误时的操作

       }

       else

       {

              ShowMessageBox(_T("遇到未知错误"),_T("您的登录请求失败"),NULL, 1,MB_OK);

       }

登录成功后就能够正常调用AppFramework和内核中的接口函数以及功能调度。

 

关于本地二次开发调用接口我们仅仅是简单的举个样例,就讲到这里。以下了解一下IL平台上的开发演示样例。

 

我们同意您使用NET上的语言开发功能。以C#为例。我们首先要做例如以下的工作,为项目加入AppILFramework的引用,而且在头部申明命名空间

using AppILFramework;

全部的内核与框架接口我们都在AppNetRouting转换,所以我们须要将AppNetRouting实例化,代码例如以下:

AppNetRouting appNetrouting =newAppNetRouting();

然后我们就能够在C#中使用这空前强大的功能了。

我们以托管功能与本地功能交互为样例来实现一个功能。前提是部分功能必须登录后方能使用。那么我们用C#创建一个登录窗体并为其写入例如以下代码

string strLoginName, strPassword;

strLoginName = comboBoxLoginName.Text.Trim();

strPassword = textBoxPassword.Text.Trim();

//comboBoxLoginName是登录窗体上的username输入与选择控件的名称

//textBoxPassword是登录窗体上的password输入控件

if(appNetrouting.KernelBaseApi_UserLogin(strLoginName, strPassword,1,1)==1)

{

//AppILFramework中的appNetrouting.KernelBaseApi_UserLogin返回1时表示登录成功

      DialogResult =DialogResult.OK; //对话框返回OK

      this.Close(); //关闭登录窗体

}

这里不用操心传值和保留信息等操作。仅仅要返回值为1关掉登录就可以,全部复杂的操作我们都为您做好了。

登录窗体效果图例如以下:

注意,内核默认使用password强制策略,除非特别定制,否则password长度不能低于8个字符,假设password长度不符合这一安全策略则内核弹出警告并返回错误值。

这个错误提示由内核维护,可是为了程序更高效的运行,建议将长度约束写在功能模块中推断。

登录成功后主界面例如以下:

当中获取用户登录名和登录时间以及头像的代码例如以下:

  labelUid.Text = appNetrouting.GetKernelBaseApi_LoginUid();

  pictureBoxUserFace.Image =Image.FromFile(appNetrouting.GetLoginUserFaceBigImg());

  labelLoginTime.Text = appNetrouting.GetCurrentKernelBaseApi_LoginTimer();

从以上代码能够看出,我们将二次开发最大可能的简化。而且支持跨语言。

除此之外我们同意托管语言调用本地功能模块。比方我们设计一个窗体例如以下:

实现代码例如以下:

string strId,strTitle, strContext, strWebUrl, strBtnView,strTimer;

strId = textBoxIds.Text.Trim();

strTitle = textBoxTitle.Text.Trim();

strContext = textBoxContext.Text.Trim();

strWebUrl = textBoxUrl.Text.Trim();

strBtnView = textBoxBtnView.Text.Trim();

strTimer = textBoxTimer.Text.Trim();

int iTimer,iType;

iTimer =int.Parse(strTimer);

iType = comboBoxType.SelectedIndex;

//调用本地功能的函数仅仅须要以下这一句代码就可以完毕。

appRouting.ShowTrayTipWnd(strId, strTitle, strContext, strWebUrl, strBtnView, iType, iTimer);

然后我们单击发送button来看看运行效果

综上所述,我们的最复杂的事情变得最为简单,让小学生都能写出功能插件,这一切从未如此简单过,而今天我们正在将事实上现。我们为系统提供了数以万计的接口Api满足各种不同的需求的开发。

1.8 Details Information[client具体信息]

首先从iMessengerShell说起。为了保证我们的程序不受操作系统更改的影响我们将全部配置均写在Config中,iMessagerShell执行时会检查并更新这些文件夹配置,以及检查本地计算机是否安装了目标平台的IL框架,假设安装。则程序从iMessengerILHost.exe启动,此为托管模式,尽管启动时相同调用了本地应用模块,但事实上例为托管模块从AppILFramework初始化。否则程序从iMessenger.exe启动。这是本地程序模块,拥有最佳的执行效率和灵活性。从AppFramework初始化。

以下我们来看一些client程序的截图:

 

  

消息提醒

主面板天气

未读消息管理器

主面板资料

联系人查找

系统设置

音视频设置

群会话

注意,这里的A表示群创建者用户,M表示管理员用户,眼下此List尚未处理。后面M列表示头像列

视频频道支持

clientIL应用管理器

 

关于client的介绍就到此为止。

2、Server简述

Server=server,最新版本号仅仅能执行在Windows Xp以及以上版本号的系统上。32位的server版本号可执行在个人系统上。64位的server版本号则仅仅同意执行在Windows Server 2008或更高的64位Windowsserver系统上。

server引擎与框架使用非托管的纯C++编写,基于多态与跨语言的开发架构同意其最小化安装.对于功能应用用户能够在使用时依据需求从网络上获取。

最大的可伸缩架构使client程序拥有最强大的伸缩功能,全显式链接模式支持功能即插即用。于此同一时候server相同提供了功能强大的SeverILFramework支持,这使得server扩展功能能够用不论什么支持的语言来开发,假设开发人员想用由我们提供的功能,则还能够使用ServerFramework提供的接口来调用官方的server内核功能与本地HostServer功能,server扩展从未如此强大过。

server採用了类操作系统架构,全部的server通过HostServer启动。由ServerFramework统一维护。

server须要通过命令或我们提供的本地server配置工具安装,卸载以及更改配置。然后依据HostServer启动參数从ServerKernelEngine中获取当前服务信息之后由ServerFramework中的ServicesModule统一管理。

server程序不同于client的是,更高的稳定性要求,更好的安全系数。而且server基于分布式架构。

因此无法基于现有服务来开发载入项或扩展,因此我们为此专门提供了组件服务和托管程序。基于组件的服务的功能扩展您能够忽略掉基于HostServer的宿主服务开发的复杂性。由于在组件服务的接口中为您提供了最简单的网络推送和接收接口,仅仅须要依照规则开发出简单的DLL模块就可以被组建服务一次性载入。而且载入是基于多线程的。因此您不用操心会被堵塞。

对于需求不高的server扩展全然能够基于组件服务[ComponentService]完毕。而对于高要求的则须要开发单独的server功能模块并由HostServer启动或全然基于内核开发出自己的server程序,这一切从未如此开放-自由,因此空前强大。

于此同一时候server程序为开发人员提供了强大的打包和签名工具,而且同意备份当前server设置和数据。这一切都是如此简单且行云流水。

打包后的的server功能安装包可直接安装到本地server,我们最大可能的简化server的部署与配置。

从而最大可能的减少维护成本。

2.1 Architecture[server架构]

server程序架构较为复杂,但对于二次开发相对简单,在结构图中不在做具体的描写叙述凝视。

2.1.1 [server模块]

ServerNetworkKernel[server自适配网络引擎内核提供程序]一切与网络相关和与线程池连接池相关的适配层封装都在此提供程序模块中。

Server_Htbp[server超文本多播协议适配器]server超文本广播。多播协议栈适配层

Server_ NetRequest[server网络请求反应器]server网络应答反应器提供程序模块

Server_RMCast[server网络多播反应器]暂无简单介绍

Server_TMCast[server程序网络组播反应器]暂无简单介绍

ServerKernelEngine[server内核提供程序模块]

1.     应用程序池控制[Application Pool]:提供本地server多进程管理以及LPC和RCP功能。

2.     应用商店用户控制器[Appstore Controller]:在未来提供iDevelops上的开发人员控制支持,部分开发人员功能必须通过此控制器验证后方可继续,比如给安装包签名,获取程序签名等操作。

3.     server配置管理器[Server_Configuration]:提供本地server的全局和服务配置更改的操作支持。

4.     缓冲池[Cache Pool]

5.     连接池[Connection Pool]

6.     本地数据库引擎[Sqlite]:server数据并不依赖于Sqlite,可是本地相关配置则依赖于Sqlite,因此本地server引擎被内置在server内核引擎中。

7.     server授权控制器[License_Controller]:全部本地server首先管理。效验,更改都被封装此控制器内。包含网络效验,USB设备效验,以及本地文件key效验工作都由此控制器提供

8.     server日志控制器[Logs_Controller]:支持多种日志输出。并提供接口。

比如用户日志。管理员日志以及服务和其它日志。

9.     消息控制器[Message Controller]:提供client消息推送与接受管理

10.  网络适配控制器[Network Controller]:封装上层server自适配网络提供程序上层接口

11.  安全管理[Security Controller]提供多大六种的加密与解密方案,当中对称算法支持宽字符加密与解密。并对开发人员提供接口。

12.  会话控制器[Session Controller]:提供client与其它server消息的管理与投递控制。

13.  线程池管理[Thread ]针对server程序的多线程自己主动分配与管理,假设启用多进程,当线程达到或接近配置线程最大峰值时将自己主动通知应用程序控制器以创建新的进程。

14.  用户控制器[User Controller]:基础用户控制器。包括用户数据,状态,请求交换。

14.  Xml引擎[XmlEngine] server内核内部使用了Xml作为系统全局和应用配置。此引擎提供用于ServerKernelEngine内部配置适配管理。

ServerKernelBaseApi [server内核对外Api集]暂无简单介绍

ServerFramework [本地server框架集] ServerFramework类似于client的AppFramework,不同的是ServerFramework并不提供独立的功能模块调度,而是提供统一的HostServer接口并载入统一的模块并由指定的接口启动。因此二次开发中的基于HostServer的服务模块不可调用此框架接口。而外围的非服务模块则同意调用。每一个HostServer仅仅同意载入一个服务主模块。

ServerILFramework [托管语言server框架集] ServerILFramework类似于client的AppILFramework,与client不同之处在于,ServerILFramwork并不全然针对server内核进行跨语言路由封装,而是仅仅封装部分经常使用函数,因为server程序不同于client。

每一个服务都是跨进程訪问与操作,因此无需全然基于ILHostServer来启动。这表示在server上,本地服务能够调用ILHostServer下的服务,而ILHostServer也能够调用HostServer下的。

在client本地应用是无法调用托管应用的。

ServerNetRouting[server中间语言路由提供程序]提供用于server内核与ServerILFramwork之间的路由中间件。

ServerKernelUtil[server内核辅助模块]提供用于Windows功能辅助,注冊表操作简化功能。

ServerClusterEngine[server群集引擎] ServerClusterService的依赖项,提供用于管理本地与远程server角色匹配,信息互通的功能。

ServerAppstoreLibrary[server联机功能获取模块]暂无简单介绍

ServerDatabaseEngine [server基础数据訪问引擎提供程序]包含针对不同数据库引擎的訪问控制器和不同数据库引擎的数据訪问层。

ServerMainLibrary [server管理程序主模块]提供本地server管理工具的操作接口。

与远程管理server的服务接口。

在远程服务中此模块作为HostServer启动ServiceMain用于远程连接管理,在本地则导出接口供本地命令行管理程序调用并输出命令行。

 

以上模块为server内核与框架提供程序模块,对于其它服务或扩展模块则有官方或用户自己定义开发。当中包含下列两个持久服务模块

HostNetworkServer[本地server网络主机服务]提供本地server全部网络入站出站服务

HostDatabaseServer[本地server数据库引擎服务]提供基础数据库訪问服务

2.2 Server Shell[server外壳]

为了保证server程序的易用性和容错性我们将全部配置均写入在server安装文件夹的配置文件夹下。程序初次安装后因为这些配置为空所以必须执行ServerShell来对新的安装设置配置。

配置之后将不须要在又一次执行ServerShell。此程序仅仅对第一次安装或server安装文件夹发生更改时有效。假设您移动或更改了server安装根文件夹位置,则执行ServerShell又一次初始化安装就可以。我们将易用性发挥到极致。

2.2.1 Server Drive[server驱动]

此版本号server出于安全考虑增加两个个驱动程序以保证server程序的合法性和安全性。

ServerNetLicense是server网络授权验证驱动,随着Windows的启动而启动,随着Windows的关机而终止。不同意手动结束,从而保证server授权的安全和合法。

UshieldDriver是Usb授权设备驱动程序。配合Usb Key一起使用。对于不想使用或无法使用网络激活的用户能够通过购买UsbKey来激活server授权。

在2014年的RC版本号这些驱动会随着一起公布而且提供Windows 7和Windows8的驱动程序。

可是这些驱动程序并不会在Rc版本号中起到实际用途,由于我们可能无法按时完毕网络授权server端。

当RTM公布后这一功能可能会被实际应用。实际应用后server程序的本地授权将无法部署在Windows7下面的操作系统上。

2.3 Server Framework[server框架]

server框架不同于client框架。他并不提供server功能模块调度,仅仅是对serverHostServer做了模块调用接口。server框架接口较为简单提供了服务安装。服务打包。服务启动。服务初始化,服务卸载。部分接口可能须要提供身份验证。

2.3.1 Server Local Framework[server本地框架]

框架为ServerFramework,提供程序模块为ServerFramework.dll

2.3.2  Server Intermediate language Framework[server中间语言框架]

托管server框架为ServerILFramework,提供程序模块为ServerILFramework.dll。结构图例如以下:

 

2.3.3 Host Server[本地server托管]

HostServer是本地server托管程序。其结构很easy。开发人员能够使用ServerFramework开发自己定义server程序。HostServer有两个模式[控制台模式和服务模式],但这两个模式都是由ServerFramework自己主动适配。而且由编译器设置自己主动匹配。

编译的程序为Debug版本号时HostServer输出为控制台程序,当编译程序为Release时HostServer以Windows服务方式启动。Debug模式下会输出server具体信息。因此效率会偏低,可是能够监控全部server数据。

HostServer启动时能够传递两个状态的參数来决定是启动本地服务或者启动本地server扩展,本地server可能无需依赖其它服务项,而server扩展则表示有依赖项和较低的行为权限。

这些參数在作为服务安装时被写入到注冊表配置中,因此在debug模式下必须手动输出所有參数方可正确运行,否则程序会一闪而过。适用于本地服务的启动标识符是”-  ”,此參数作为启动參数标识时从ServerFramework的ServiceStart函数初始化服务,在ServiceModule中从ServiceModuleInit载入服务功能,參数示比例如以下:

E:\Develop\iMessenger2\Server\Build\X86\Debug\Binn\Hostserver.exe -HostNetworkServer

适用于本地服务扩展的启动标识符是”#“,此參数作为启动參数标识时从ServerFramework

的ServiceExStart函数初始化。在ServiceModule中从ServiceExModuleInit载入服务功能,參数示比例如以下:

E:\Develop\iMessenger2\Server\Build\X86\Debug\Binn\Hostserver.exe #TestServer

2.3.4 Intermediate language Host Server[中间语言server托管]

ILHostServer是本地server中间语言托管程序。因为本地server托管程序无法载入中间语言server模块,因此ILHostServer构非比較复杂。而且ILHostServer仅仅能载入一种状态的服务,即本地server扩展,而且这些server功能必须是基于ServerILFramwork的。

ILHostServer是一个使用C#编写的Windows服务程序,拥有server程序的全部特征和控制器。启动时依据传递的參数从ServerILFramwork中匹配载入的功能模块。因此他并不使用ServerFramework中提供的不论什么服务控制接口。

与本地服务同样的是。他们在使用过程中模块都要与ServerFramework验证和匹配信息。假设失败ServerFramework将终止这个服务。

这些维护与中间语言框架无关。仅仅是通过接口与本地server框架和内核互通然后效验中间语言的合法性,这种考虑是出于中间语言程序的易破解性会带来模块安全问题所致。

ILHostServer会一次性载入多个服务模块,并以多线程形式为每一个服务开辟新的地址,因此他并非多进程和多服务,假设要创建额外的服务支持则须要自己开发NET服务,开发人员能够全然使用ServerILFramwork提供的功能接口来完毕自己的服务开发。而这一切得益于NET平台的易用性。

无论是HostServer还是ILHostServer都能够在ServerFramework中的server控制中启动。删除,改动以及停止。

2.3.5 Server Functional[server功能]

server除了提供强大易用的开发人员框架和server程序托管平台之外。

与此同一时候我们提供了功能强大的server程序。

这些功能最初的定义为下:

HostNetworkServer,功能强大的本地托管网络server,一切与通讯有关的server近战和出站规则都在此提供。

多维度的服务器数据库支持。和支持多数据库的HostDatabaseServe为MySQL。SQLserver。Oracle Database提供了多种服务。在配置中我们支持数据库连接字符串统一管理。依据连接名获取连接字符串。这适用于全部的数据訪问程序调用

以上两个是作为server持久服务,不可卸载。不可安装,全部的參数与操作均被封装在内核中。这两个服务可能在其它子服务中要使用。除了上面两个服务我们还提供了下面服务:

注意:因为篇幅和时间有限,对于下面服务的描写叙述信息和功能介绍将不在提供。仅仅提供服务名和简单的描写叙述信息。

MessageService消息服务,提供用于本地server的即时通讯服务。

GroupService 群应用支持服务,提供群会话和应用服务

MeetingService支持多播的多人视频通话server,同一时候同意载入扩展模块以增强服务的可用性

FileService文件服务。提供用户文件存储。持久性共享。与各种文件发送接收的服务。

UpdateServiceclient更新服务。

ComponentService组件服务,提供server组件载入服务。

SessionHistoryService会话记录服务,提供用户消息漫游记录的服务。

2.3.6 ServerMessage Push[server消息推送]

server消息推送服务这是依据IOS上的墓碑模式引入的新概念,在不更改server结构的基础上同意用户对client通过消息推送服务发送消息通知等非持久会话的消息模式。

消息推送服务提供了简单的接口。而且支持从随意程序发送通知消息。包含但不限于Web和Desktop。

通知程序包含多种模式。包含以会话形式直接在会话窗体中显示通知或公告,以及托盘提醒。

推送消息不以用户会话模式呈现。均已系统帐号投递。

此功能的主要目的是用于其它系统外部消息发送到iMessengerclient的功能。比方企业OA,ERP以及站点和论坛系统。简单的举例假设使用此服务,而且在同一server上的论坛用户对接后,而且对该论坛程序开发了消息推送服务组件,那么当有一个用户的帖子被回复或者其它操作时,这个消息将被推送到iMessenger显示,而且支持链接。

模式一截图例如以下:

2.4 Server Security[server安全]

     因为server框架的开放性,所以安全一直都是我们最为重视的。因此我们为server程序安全提供了多重的保护。这些保护措施包含但不限于下面内容:

1、 框架与内核版本号以及Guid和Token Key效验。我们为每一个版本号的内核程序提供了唯一而且不同的Guid和Token Key,server内核与框架工作时。必须效验这些数据的匹配性,于此同一时候内核提供模块会效验当前框架与外围提供程序的MD5值,每一个版本号的以上数据都不同样,因此不可用其它版本号的内核提供程序模块或server框架模块替换以达到破解的目的。除此之外内部MD5效验也防止了内核与框架被改动。当改动DLL程序数据后MD5将发生改变,改变MD5后的程序模块将无法验证通过从而导致正常初始化失败和终止行为。

2、 操作系统内核驱动模式的网络授权效验和USB设备锁。基于内核驱动的网络授权锁提供用于24小时联机激活的方式保证server安全。

对于没有网络的用户提供USB设备锁来保证server模块安全。

3、 第三方server程序模块的签名。我们对RTM版本号程序要求使用功能签名。

而RC版本号针对开发人员不须要签名,但RC版本号非网络和USB设备授权限制,而是由内核写死授权,无法用于大量并发,而且须要使用开发人员ID登录方能正常载入功能模块,对于开发人员ID我们须要人工审核。因此这一版本号主要用于开发人员測试与调试。

RTM是对外的终于版本号,因此要求功能模块签名。对于未经签名的模块将不正常载入,从而杜绝恶意功能的载入和使用。

4、 server配置加密。我们针对server全部配置项加密。因此在server沦陷之后恶意用户也无法更改配置,在没有提供安全密钥的前提下也无法使用本地配置工具和命令。加密的配置项包含但不限于:持久服务配置数据,数据库连接字符串,宿主服务配置,宿主服务扩展配置,用户配置。

5、 数据库加密,我们针对数据库中的敏感数据相同提供了加密存储的方式以保证数据库数据安全。

2.5 [server扩展]

server扩展从广义上是指安装在ServiceExpandList下的服务。

支持本地扩展和IL扩展。

实际上他们和本地服务一样提供独立的server功能,可是他们可能有依赖于上层服务的行为。这取决与开发人员的设计。假设开发人员不使用上层依赖,则他们和本地服务并无差别。仅仅是安装位置不同,载入过程与启动时传递的參数不同。

2.6 [server集群]

     server集群由ServerCluster提供,主服务为ClusterService,部署在局域网内一台独立的server上,能够与其它服务一起部署。可是其它服务中须要设置ClusterService的相关配置。Cluster的最初架构方案是矩阵散列集群,而非线性。详细目标上在研究。

     矩阵散列集群模式下服务是依据角色分配的,每台server能够分配一个单独的角色功能,多台server能够共同分配这个单独的角色,比方登录server,能够将其分配在2台server上协同服务服务。消息server能够分配在10台server上协同服务。

结构例如以下:

 

server集群眼下属于计划阶段。详细实现可能跟文档不同

2.7 Server Management[server管理]

ServerFramework提供了功能强大的server管理接口,除此之外我们封装了ServerMainLibrary提供用于server功能的管理与设置。

ServerFramework中提供了服务控制包含但不限于:服务启动,停止,暂停,又一次启动的接口。函数原型中提供了两种模式,第一种为操作全部ServiceList和Expand中的服务。不须要传递參数。对于单独的服务控制则须要传递一个lpszServiceName[服务名]进去。

ServerFramework中提供了服务管理包括服务安装。此函数包括一个參数,即指定服务模块安装包路径。

server安装路径有内核程序自己主动维护查找顺序。默认搜索server安装根文件夹下的Service_Install文件夹,当此文件夹下无法找到须要的安装包时则从指定的文件夹查找,假设安装包文件存在于Service_Install文件夹下则不须要输入全路径,仅仅须要输入安装包文件名称就可以。

安装包内包括安装配置,这些配置都是加密的。读取安装包成功后server内核引擎的ServiceInstallConfig会自己主动读取并解密这些数据并依据配置中的属性安装到指定位置。

与此同一时候提供了服务卸载,卸载时须要提供服务名。首先从Windows服务列表中删除服务注冊。然后从本地服务安装列表中删除安装配置。

ServerMainLibrary中则提供了全部的管理功能。包含数据库操作。服务控制,服务安装与卸载。server激活。

       这些管理操作一如既往的提供了最简单易用的接口,全然能够自己定义开发出更强大的管理功能

2.8 Server Web Service[serverWeb 服务]

serverWebService是基于ILFramework下的Web接口。提供用于Webclient和web管理程序的开发,同一时候提供用于其它web服务和的对接和调度。详细内容不在此详述。

 

2.9 Server Devlop[server开发]

     server开发是我们主要努力的方向,我们提供了跨语言的开发支持,使得开发人员可以使用自己最擅长的语言开发出最适用于自己的server功能模块。

     有关server开发的我们用几句简单的代码来描写叙述

     多数server程序都是输出控制台的,我们以控制台为样例

     setlocale(LC_ALL,"chs");

        if ((argc > 1) && ((*argv[1] =='-') || (*argv[1] =='/')))

        {ServersStart(argv[1] + 1);}

        elseif ((argc > 1) && ((*argv[1] =='#') || (*argv[1] =='/')))

        {ServersExpandStart(argv[1] + 1);}

        else{}

以上代码是用来启动ServerFramework中的服务的的,分别表示了本地服务的启动和扩展服务的启动

在调试模式下我们输入-HostNetworkServer执行结果例如以下:

开发本地server时须要链接内核与框架的库文件以及使用LBIS命名空间

#include<iServerFrameworkInc.hpp>

#include<iServerKernelEngineInc.hpp>

 

usingnamespace LBIS;

#pragmacomment(lib,"iServerFramework.lib")

#pragmacomment(lib," iServerKernelEngine.lib")

然后就能够使用他们提供的API来开发功能了。

以MFC为例,我们须要开发一个server安装工具,那么我们引用上面的库文件和头文件之后设计界面例如以下

 

代码示比例如以下:

这些操作较为复杂。因此使用了导出类,而非直接使用Api.在窗体类的class中申明内核的ServiceInstallConfig,这须要包括相应的头文件

#include"ServiceInstallConfig.hpp"

 

// CServiceInstall

CServiceInstallConfig InstallConfig;

然后在浏览文件button的click消息内写入例如以下代码:

CFileDialog fileDialog =CFileDialog(TRUE,NULL,NULL,OFN_READONLY,

              L"Local Install Files (*.inx)|*.inx|Server Install Files (*.insx*)|*.insx*|Expand Install Files (*.insex*)|*.insex*||",this);

       if (fileDialog.DoModal() ==IDOK)

       {

              CString strPath = fileDialog.GetPathName();

              m_pEdtFilePath->SetWindowText(strPath); //strPath表示浏览到的安装文件路径,并将其赋值给Edit控件

              if (InstallConfig.ReadInstallFile(strPath) == 1) //==1表示服务安装配置读取成功

              {

                     SetInfoShow();//显示服务安装配置数据

              }

              else

              {

AfxMessageBox(_T("读取服务安装包失败,下面原因可能会导致此问题:可能不是有效的安装包文件,或者安装包配置丢失,请检查安装包的有效性"));

              }

       }

当中SetInfoShow();的代码例如以下:

CString strType, strILFrame;

strType = InstallConfig.strType;

strILFrame = InstallConfig.strIsILService;

if (strType==_T("Local")){strILFrame = _T("已禁用");}

else{ if (strILFrame.IsEmpty()){strILFrame =_T("未配置");}}

while (m_pLstInfo->DeleteColumn(0));

m_pLstInfo->DeleteAllItems();

m_pLstInfo->InsertColumn(0,_T("Item"),LVCFMT_LEFT, 140);

m_pLstInfo->InsertColumn(1,_T("Value"),LVCFMT_LEFT, 400);

 

int nIndex = m_pLstInfo->InsertItem(0,_T("服务类型"));

m_pLstInfo->SetItemText(nIndex, 1, strType);

nIndex = m_pLstInfo->InsertItem(2,_T("服务名称"));

m_pLstInfo->SetItemText(nIndex, 1, InstallConfig.strServiceName);

nIndex = m_pLstInfo->InsertItem(3,_T("服务显示名"));

m_pLstInfo->SetItemText(nIndex, 1, InstallConfig.strServiceShowName);

nIndex = m_pLstInfo->InsertItem(4,_T("Guid"));

m_pLstInfo->SetItemText(nIndex, 1, InstallConfig.strServiceGuid);

nIndex = m_pLstInfo->InsertItem(5,_T("TokenKey"));

m_pLstInfo->SetItemText(nIndex, 1, InstallConfig.strServiceTokenKey);

nIndex = m_pLstInfo->InsertItem(6,_T("描写叙述信息"));

m_pLstInfo->SetItemText(nIndex, 1, InstallConfig.strServiceDescription);

nIndex = m_pLstInfo->InsertItem(7,_T("提供程序主模块"));

m_pLstInfo->SetItemText(nIndex, 1, InstallConfig.strServiceModule);

nIndex = m_pLstInfo->InsertItem(8,_T("入口点"));

m_pLstInfo->SetItemText(nIndex, 1, InstallConfig.strServiceEntry);

nIndex = m_pLstInfo->InsertItem(9,_T("启动參数"));

m_pLstInfo->SetItemText(nIndex, 1, InstallConfig.strServicestrParame);

nIndex = m_pLstInfo->InsertItem(10,_T("Tcpport"));

m_pLstInfo->SetItemText(nIndex, 1, InstallConfig.strTcpport);

nIndex = m_pLstInfo->InsertItem(11,_T("Udpport"));

m_pLstInfo->SetItemText(nIndex, 1, InstallConfig.strUdpport);

nIndex = m_pLstInfo->InsertItem(12,_T("是否使用IL框架"));

m_pLstInfo->SetItemText(nIndex, 1, strILFrame);

nIndex = m_pLstInfo->InsertItem(13,_T("数据提供文件"));

m_pLstInfo->SetItemText(nIndex, 1, InstallConfig.strDatabseFile);

nIndex = m_pLstInfo->InsertItem(14,_T("版权信息"));

m_pLstInfo->SetItemText(nIndex, 1, InstallConfig.strCopyright);

nIndex = m_pLstInfo->InsertItem(14,_T("版本号"));

m_pLstInfo->SetItemText(nIndex, 1, InstallConfig.strVersion);

nIndex = m_pLstInfo->InsertItem(15,_T("签名"));

m_pLstInfo->SetItemText(nIndex, 1, InstallConfig.strDeveloperSignature);

nIndex = m_pLstInfo->InsertItem(16,_T("版本号语言"));

m_pLstInfo->SetItemText(nIndex, 1, InstallConfig.strLanguage);

最后当我们选择一个有效的安装文件并读取成功后效果执行效果例如以下:

我们将复杂的部分所有实现,界面操作不过调用接口就可以完毕功能开发。

以上是本地server开发,对于托管语言server程序开发函数基本雷同,语法遵循目标语言语法,在此不做赘述。

2.9.1 Functional Service[server功能服务]

server功能服务開始是指基于HostServer启动的宿主服务模块开发,事实上这很easy,我们提供的默认服务启动入口点仅仅有一个接口ServicesMain

您能够使用自己定义接口并将他们写入到服务配置中,我们相同能够启动它。

我们定义的默认启动接口例如以下:

#include"Service_Config.hpp"

#ifdef__cplusplus

extern"C" {

#endif

 

       // Service初始化

// 我们为server提供了内部效验。从server模块内部效验配置数据是否与模块相符,假设不符服务则无法启动

// 自己定义开发的服务能够使用我们约束的接口,当配置中入口点为空时默认使用ServicesMain

// 假设您不计划内部效验配置则不须要參数,假设您计划在模块内部效验配置则须要參数。最多为4个參数

//參数所有为LPCTSTR,分别代表GuidToken KeyVersionLanguage。请勿颠倒顺序。

       NETWORKSERVICE_APIintServicesMain(LPCTSTR lpszGuid,LPCTSTR lpszToKeny);

}

除了入口点您还必须定义开发人员Guid接口和版本以及内部的GUidTokenKey接口。这些接口是必须的,无论您是否从内部效验模块,为了安全考虑您必须提供这些数据接口,我们会从安装配置与这里的接口匹配数据。而配置中的数据是加密的,而且这些应用在第一次载入时会联机匹配开发人员ID,假设开发人员ID下无法检索我们获取的模块GuidTokenKey则意味着此server模块存在安全问题。不予载入。

接口定义例如以下[接口名称不可更改,类型不可更改]

//获取当前server模块开发人员Guid

       NETWORKSERVICE_APILPCTSTR GetServiceModuleDeveloperGuid();

 

//获取当前server模块版本

       NETWORKSERVICE_APIintGetServiceModuleVersionNumber();

 

//获取当前server模块Guid

       NETWORKSERVICE_APILPCTSTR GetServiceModuleGuid();

 

//获取当前server模块TokenKey

       NETWORKSERVICE_APILPCTSTR GetServiceModuleTokenKey();

 

对于低水准的开发人员也能够使用下列方式导出所有接口

//获取本地server开发人员Guid

extern"C"__declspec(dllexport)LPCTSTR GetServiceModuleDeveloperGuid()

{

//直接在这里写入功能

}

以上是针对本地server功能的开发演示样例。

针对托管server程序开发于此雷同。仅仅是载入与启动方式不同

2.9.2 Functional Service Expand [server功能服务扩展]

server扩展由组件server统一载入。不创建新的服务进程,IL下的扩展则由IL组件服务统一载入。

相同仅仅有一个默认接口,服务扩展接口眼下存在争议,因此不在此文档中列出。

唯一能够确定的是每一个扩展我们都会为其创建一个新的线程去启动防止堵塞,扩展内部线程由开发人员自己定义。

2.9.3 [server安装包]

server安装包包括下面几种格式

  1、insx,insx是指本地安装包,安装程序为官方或第三方提供的系统服务安装包程序

2、insex,insex是指扩展安装包。安装程序不创建服务进程,而是附加到组件服务中的功能模块

3、insc。insc不是安装包文件,而是安装配置文件,对于想手动安装的服务也必须创建此安装配置。

安装包安全管理:

   server安装包打包时必须验证iDevelops上获取开发人员账户信息,假设验证失败则不同意打包安装程序。server安装包下载安装时会验证当前登录到iDevelops上的用户信息,即便这个用户不是开发人员账户相同同意安装,可是在读取安装包信息成功后会从iDevelops上匹配此安装包配置信息以确保安全,假设配置验证通过则继续安装,假设失败则退出安装。

  安装包打包,安装。查看信息都是由ServerFramework与内核共同提供接口,因此不论什么语言都能够调用这些接口来打包和安装。

   有关于iDevelops开发人员中心在早期版本号中可能无法提供,因此早期版本号可能存在安全隐患。对于这些隐患的管理与防范主要靠管理员。

2.10 Details Information[server具体信息]

具体描写叙述受篇幅影响暂不赘述我们通过图片来介绍部分功能。

首先我们来说说强大的本地server命令行ServerMain,这是一个本地server管理强大的命令工具。启动后运行结果例如以下:

提供了强大的命令功能以方便管理员查看和管理,比方我们输入ServerInfo,将输出本地server全部信息

除了强大的server信息输出命令还包含各种操作和改动命令,有关具体请參阅server说明文档

以下我们看看本地server调试模式下的一些数据

正常模式下server启动正常,输出serverGuid,TokenKey以及相关的信息。最后模块内部效验数据

那么非正常情况下呢比方配置中有服务,可是启动时却发现缺少载入项,那么程序也不会崩溃。而是报告无法找到服务模块提供程序,稳定性是我们的第一追求。

那么假设直接输出的參数在服务安装中没有的也不会报错,返回服务不存在错误。

有关图片參考请參阅以下两图:

上图为服务不存在。

上图为服务正常初始化

除了提供命令行工具之外我们为本地服务提供了继承的图形管理工具。尽管没有命令行强大,可是对于普通用户这更为直观和方便。

效果图例如以下:

假设本地管理工具在安装时设置了安全password则必须输入password。假设password为空则直接进入管理界面

服务管理界面。双击服务可弹出改动服务配置窗体。能够使用右側的button来运行操作。

服务參数配置窗体同意改动部分參数。对于开发人员信息和ID信息则不同意改动。

获得产品序列号可在此激活server程序。但须要联网。

除此之外,我们还提供了一个用于开发人员创建TokenKey和Guid的工具。同一时候他能够生成产品序列号

由此工具生成的序列号须要提交我们方可使用。事实上这是一个内部函数。对于外部开发人员而言生成序列号可能并不适用于产品激活,当然假设开发人员须要在自己的模块内部使用此类SN则还是有不少帮助

 

我们针对server数据管理除了提供内部命令行工具之外,还提供了远程管理工具。和web管理平台。而远程和web管理则不随着标准版server安装包一起发行。这须要额外的获取。而且同意将这些功能部署在远程计算机上,而非server环境本地,当中远程管理工具的截图例如以下:

支持触控和屏幕键盘输入。个性化设计,登录前显示红色状态来。登录后为蓝色。

假设server未激活或授权失败则显示红色。而且登录后不会改变。

管理界面提供地址栏和树状导航两种模式来定位页面

与此同一时候我们提供了友好强大的Web管理功能自适应视图让您在不论什么设备上都有最佳的体验。截图例如以下:

 因为使用Html5的缘故,必须使用IE9或更高的浏览器版本号方可正常浏览。以上为登录页

上图为权限配置页面

上图为邮件与短信中心配置。这些功能尚在研发中。

关于server介绍就到此为止。

3.0 Server Database[server数据库]

我们为server使用了多维度数据。

系统持久数据库包括下面部分:

1、  BaseSystem,基础系统数据库,保存系统基础信息。持久配置,全球国家地区数据,右边电话区号,学校设置,职业话费。系统Api等等数据所有在此数据库中

2、  BaseUser,基础用户数据库。保存系统全部用户信息。和关系数据。方便用户关系挖掘

3、  BaseEnterprise,企业数据库包括企业数据信息。

 

我们为数据库訪问提供了统一的连接管理。比方获取数据库连接字符串的接口例如以下:

       //Get encrypted database connection string

       //“lpszConnName” Indicates that the connection name

       ISERVERKERNELENGINE_APILPCTSTR GetServerConnectionString(LPCTSTR lpszConnName);

您能够依据您的连接名获取当前数据库连接字符串。

同一时候同意您将您的应用连接字符串加入到我们的数据库器连接管理,这些连接都是被多重加密的,安全可靠。而且读取很方便仅仅需一行代码就搞定比方:

CString strConnection;

strConnection =GetServerConnectionString(_T("TestConnection"));

 

不管是数据库訪问还是二次开发,这一切从未如此简单过。

4.0 Media Player简述

iMediaPlayer随着iMessenger一起发行的一款内置播放器。新版本号将同意其单独安装。在旧版本号上此播放器的功能仅限于播放屏幕录像以及iMessenger的录音和录像。在新版本号上播放器有个革命性的变化,支

持全格式的音视频播放的同一时候支持iMessenger私有格式播放。

在后期我们打算将自己定义浏览器协议引入。直接在浏览器输入媒体地址从而打开本地播放器播放,提升效率的同一时候降低资源消耗。

在音频模式下此播放器支持迷你模式,在视频模式下则是禁止使用迷你模式,假设媒体列表中包括音视频混编。而且在音频模式下使用迷你模式,那么则在播放视频时自己主动切换到全模式,当视频播放完毕后自己主动切换到迷你模式。

播放器眼下已经支持启动时自己主动继续上一次播放的内容,而且记录播放进度,而不是从头開始。同一时候同意记录音量大小。支持热键和快捷键。

 

空状态

支持列表固定和自己主动伸缩

当列表固定时不管是否播放媒体列表始终显示。当列表自己主动时播放完成后列表显示。播放时列表隐藏。

迷你模式下相同支持快捷键来操作音量大小和快进和快退。

眼下暂不支持XP 系统

眼下暂不支持自己定义播放列表

眼下状态下配置设置须要手动更改,在系统设置中设置了读取,却没有编写更改代码

部分UI只实现了思路,尚未完好功能。

空状态模式下截图例如以下:

音乐播放时 迷你模式截图例如以下:

音乐播放时,全模式截图例如以下:

列表以下的button分别为:加入文件到列表,加入目录内媒体到列表。定位到当前播放。其它。显示或隐藏列表

全模式视频播放截图例如以下:

单击最列表最下方button可隐藏列表。无列表视频播放截图例如以下:

当然全屏也是支持的。

播放器已经能够提供试用。

后期针对iMessenger特殊音视频将做处理。

届时将试用独有的音视频格式

播放器设置界面例如以下:

同一时候同意使用iMessenger账号登录到个人中心。登录与关于界面截图例如以下:

  

播放器提供程序来自Ffmpeg,接口层为iAvPlayer.dll。依赖于client的KernelUtil和KernelEngine以及AppFramework,在使用过程中我们相同提供了二次开发接口供开发人员使用,将媒体开发接口做到极致。

除此之外我们针对Gips开发了很easy的接口,供开发人员开发摄像头与麦克风捕获程序时使用。这一切从未如此简单过。

5、Web Manege Framework简述

WebApps Kit是web管理后台的基础框架,开发人员要开发自己的功能模块管理程序可将自己的页面签入到WebApps Kit的Framework中,当中导航配置以Xml配置。最大可能的简化了web管理功能的开发与使用成本。

6、Client Install

   client安装程序,我们使用MFC全然开发。并没有使用第三方打包工具,所以更加人性化

client安装程序截图例如以下:

安装前必须允许安装条款,否则无法继续

安装时会要求您选择安装文件夹,普通情况下取默认

同一时候要求设置用户文档存储文件夹。此设置是全局的,在安装后更改这些配置可能导致已实用户的数据读取不正常,因此建议一次性设置。

安装过程一共分为两步骤

复制安装文件和注冊安装文件

完毕后会自己主动跳转到完毕页面,无需手动处理

完毕安装后会提示完毕安装或跳转到设置页

这些安装工具不同意二次开发,因此没有二次开发接口。

可是安装工具提供了自己主动载入配置文件。假设配置文件不存在则要求安装后手动更改,假设配置文件存在则不须要手动在设置中更改,为了方便管理员部署。我们推荐使用配置文件,配置文件由管理员工具创建client安装配置文件名必须是ClientInstall.config,内容是加密的,解密后格式例如以下:

<ClientInstall>

  <Install>

    <InstallPathValue="C:\iMessenger\Client\2.0.14.5001\"/>

    <ServerAddressValue="1111001101111010000100101111011011101100110111000111001110010111"/>

    <ServerDomainValue="01011110010100100000001011"/>

    <ServerConnectionKeyValue="000010000100000010010100100000101"/>

<ServicePortType Value="100101010100000010"/>

<ServicePortValue="1001010100111110100000010001101010"/>

  </Install>

</ ClientInstall >

除了路径其它都是加密数据。使用工具生成类似上面内容的ClientInstall.config后直接与安装程序放在同一文件夹下就可以

7、Server Install

server安装配置较为复杂,但我们相同为此提供了强大的安装工具。安装时一次设置就可以完毕全部配置,部分设置须要安装后执行本地server管理工具来更改配置或使用ServerMain命令行工具更改设置。

server安装程序部分截图例如以下:

看到上面的提示这表示当前计算机用户权限不够,必须是管理员权限方可继续安装

同一时候部分server功能可能要求必须安装在Windows server上。对于个人版系统可能会安装受阻。因此我们建议尽量的将server程序安装在server版本号的Windows上。

server安装过程中设置较为麻烦。我们不一一截图。仅仅是给出几个演示样例截图例如以下所看到的:

启动之后请单击如今開始跳转到环境监察页面

对系统最低配置有要求,过低的server配置将被阻止安装

除此之外。假设是64位server,为了提升稳定性将会被阻止在一些低版本号或个人版系统上执行。

假设系统环境检查通过则下一步button可用,假设失败则退出安装

必须允许安装许可协议,否则无法进入下一步

要求您选择要安装的选项,由于依据配置不同后面的安装项目也不同

为server的安装指定文件夹。这些文件夹包括server程序文件夹,数据库文件夹。更新文件夹和暂时文件夹以及用户资源文件夹

server详细功能安装模块。

安装程序将文件展开到暂时文件夹然后開始安装

安装完毕后要求对server进行设置。一共同拥有四步。上面仅仅列出一步。

安装最后一步单击完毕安装退出安装向导并启动服务。

单击右側的设置button则打开本地server管理器。

 

完毕安装后单击很感谢启动全部服务,单击右側的设置button手动启动要启动的服务。

server安装中心工具相同使用了MFC开发,可是这些安装工具不同意二次开发。因此没有二次开发接口。

可是安装工具提供了自己主动载入配置文件,假设配置文件不存在则要求手动填写,假设配置文件存在在不自己主动填写。

server端安装配置文件名称必须是ServerInstall.config,以明文形式存在,管理员可在安装前手动创建或通过我们提供的工具创建,创建后格式例如以下:

< ServerInstall >

  <Install>

    < ServerInstallPath Value="C:\iMessenger\Server\2.0.14.5001"/>

< ServerDatabasePathValue="C:\iMessenger\Server\2.0.14.5001\Server_Database"/>

<............................因为server配置文件较长此处省略..............................>

  </Install>

</ServerInstall>

有关server安装配置具体信息可去范文手动改动或通过工具生成。

 

关于iMessenger 2.0.14.8001和LiveBinn NetFramework Server 2.0的介绍就到此结束。之后随着时间的推移会分别给出iMessenger和iNetFramework以及具体功能服务的具体文档。

转载于:https://www.cnblogs.com/jzssuanfa/p/6730612.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30878361/article/details/99827687

智能推荐

JWT(Json Web Token)实现无状态登录_无状态token登录-程序员宅基地

文章浏览阅读685次。1.1.什么是有状态?有状态服务,即服务端需要记录每次会话的客户端信息,从而识别客户端身份,根据用户身份进行请求的处理,典型的设计如tomcat中的session。例如登录:用户登录后,我们把登录者的信息保存在服务端session中,并且给用户一个cookie值,记录对应的session。然后下次请求,用户携带cookie值来,我们就能识别到对应session,从而找到用户的信息。缺点是什么?服务端保存大量数据,增加服务端压力 服务端保存用户状态,无法进行水平扩展 客户端请求依赖服务.._无状态token登录

SDUT OJ逆置正整数-程序员宅基地

文章浏览阅读293次。SDUT OnlineJudge#include<iostream>using namespace std;int main(){int a,b,c,d;cin>>a;b=a%10;c=a/10%10;d=a/100%10;int key[3];key[0]=b;key[1]=c;key[2]=d;for(int i = 0;i<3;i++){ if(key[i]!=0) { cout<<key[i.

年终奖盲区_年终奖盲区表-程序员宅基地

文章浏览阅读2.2k次。年终奖采用的平均每月的收入来评定缴税级数的,速算扣除数也按照月份计算出来,但是最终减去的也是一个月的速算扣除数。为什么这么做呢,这样的收的税更多啊,年终也是一个月的收入,凭什么减去12*速算扣除数了?这个霸道(不要脸)的说法,我们只能合理避免的这些跨级的区域了,那具体是那些区域呢?可以参考下面的表格:年终奖一列标红的一对便是盲区的上下线,发放年终奖的数额一定一定要避免这个区域,不然公司多花了钱..._年终奖盲区表

matlab 提取struct结构体中某个字段所有变量的值_matlab读取struct类型数据中的值-程序员宅基地

文章浏览阅读7.5k次,点赞5次,收藏19次。matlab结构体struct字段变量值提取_matlab读取struct类型数据中的值

Android fragment的用法_android reader fragment-程序员宅基地

文章浏览阅读4.8k次。1,什么情况下使用fragment通常用来作为一个activity的用户界面的一部分例如, 一个新闻应用可以在屏幕左侧使用一个fragment来展示一个文章的列表,然后在屏幕右侧使用另一个fragment来展示一篇文章 – 2个fragment并排显示在相同的一个activity中,并且每一个fragment拥有它自己的一套生命周期回调方法,并且处理它们自己的用户输_android reader fragment

FFT of waveIn audio signals-程序员宅基地

文章浏览阅读2.8k次。FFT of waveIn audio signalsBy Aqiruse An article on using the Fast Fourier Transform on audio signals. IntroductionThe Fast Fourier Transform (FFT) allows users to view the spectrum content of _fft of wavein audio signals

随便推点

Awesome Mac:收集的非常全面好用的Mac应用程序、软件以及工具_awesomemac-程序员宅基地

文章浏览阅读5.9k次。https://jaywcjlove.github.io/awesome-mac/ 这个仓库主要是收集非常好用的Mac应用程序、软件以及工具,主要面向开发者和设计师。有这个想法是因为我最近发了一篇较为火爆的涨粉儿微信公众号文章《工具武装的前端开发工程师》,于是建了这么一个仓库,持续更新作为补充,搜集更多好用的软件工具。请Star、Pull Request或者使劲搓它 issu_awesomemac

java前端技术---jquery基础详解_简介java中jquery技术-程序员宅基地

文章浏览阅读616次。一.jquery简介 jQuery是一个快速的,简洁的javaScript库,使用户能更方便地处理HTML documents、events、实现动画效果,并且方便地为网站提供AJAX交互 jQuery 的功能概括1、html 的元素选取2、html的元素操作3、html dom遍历和修改4、js特效和动画效果5、css操作6、html事件操作7、ajax_简介java中jquery技术

Ant Design Table换滚动条的样式_ant design ::-webkit-scrollbar-corner-程序员宅基地

文章浏览阅读1.6w次,点赞5次,收藏19次。我修改的是表格的固定列滚动而产生的滚动条引用Table的组件的css文件中加入下面的样式:.ant-table-body{ &amp;amp;::-webkit-scrollbar { height: 5px; } &amp;amp;::-webkit-scrollbar-thumb { border-radius: 5px; -webkit-box..._ant design ::-webkit-scrollbar-corner

javaWeb毕设分享 健身俱乐部会员管理系统【源码+论文】-程序员宅基地

文章浏览阅读269次。基于JSP的健身俱乐部会员管理系统项目分享:见文末!

论文开题报告怎么写?_开题报告研究难点-程序员宅基地

文章浏览阅读1.8k次,点赞2次,收藏15次。同学们,是不是又到了一年一度写开题报告的时候呀?是不是还在为不知道论文的开题报告怎么写而苦恼?Take it easy!我带着倾尽我所有开题报告写作经验总结出来的最强保姆级开题报告解说来啦,一定让你脱胎换骨,顺利拿下开题报告这个高塔,你确定还不赶快点赞收藏学起来吗?_开题报告研究难点

原生JS 与 VUE获取父级、子级、兄弟节点的方法 及一些DOM对象的获取_获取子节点的路径 vue-程序员宅基地

文章浏览阅读6k次,点赞4次,收藏17次。原生先获取对象var a = document.getElementById("dom");vue先添加ref <div class="" ref="divBox">获取对象let a = this.$refs.divBox获取父、子、兄弟节点方法var b = a.childNodes; 获取a的全部子节点 var c = a.parentNode; 获取a的父节点var d = a.nextSbiling; 获取a的下一个兄弟节点 var e = a.previ_获取子节点的路径 vue