一种基于函数的规则引擎的建立方法和规则引擎与流程

未命名 08-14 阅读:143 评论:0


1.本技术涉及计算机安全技术领域,特别涉及一种基于函数的规则引擎的建立方法和规则引擎、计算设备和计算机可读存储介质。


背景技术:

2.目前,各种类型的互联网系统如反作弊系统为了对业务逻辑进行高效的处理,通常会使用规则引擎对业务数据进行规则判断,从而输出结果数据。其中,规则由大量的业务条件所组成,其基本思想是将业务逻辑从程序代码中抽取出来,将其转变为简单的业务规则,以结构化的业务规则语言来表示。这些业务规则语言包括dsl语言、各种动态脚本语言等,在配置复杂规则时较为繁琐,也导致了额外的学习成本。因此需要一种配置灵活方便、操作简单且易于学习且的规则引擎从而能提高业务系统的执行效率。


技术实现要素:

3.有鉴于此,本技术实施例提供了一种基于函数的规则引擎的建立方法及规则引擎、计算设备和计算机可读存储介质,以解决现有技术中存在的技术缺陷。
4.根据本技术实施例的第一方面,提供了一种基于函数的规则引擎的建立方法,包括:
5.规则引擎加载规则文件,创建多个规则实例;
6.所述规则文件中的每个逻辑执行单元均由函数直接描述;
7.所述规则引擎对规则实例中的函数进行解析,完成输入数据与规则实例的匹配。
8.根据本技术实施例的第二方面,提供了一种基于函数的规则引擎,包括:
9.加载模块,用于读取规则文件,创建多个规则实例;
10.规则文件,所述规则文件中的每个逻辑执行单元均由函数直接描述;
11.解析模块,用于对规则实例中的函数进行解析,完成输入数据与规则实例的匹配。
12.根据本技术实施例的第三方面,提供了一种计算设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机指令,所述处理器执行所述指令时实现所述基于函数的规则引擎的建立方法的步骤。
13.根据本技术实施例的第四方面,提供了一种计算机可读存储介质,其存储有计算机指令,该指令被处理器执行时实现所述基于函数的规则引擎的建立方法的步骤。
14.与现有技术相比,本技术实施例中,通过基于函数的规则引擎对输入的数据进行规则的判断,由于规则引擎加载的规则文件在任意位置使用函数描述每个逻辑执行单元,使得规则的表达能力十分强大,利用函数的组合、嵌套即可实现复杂的规则定义。由于函数的结构简单明确,即使是非开发人员也可以制定较为复杂的规则。对应的,在规则引擎中根据序列化协议定义的函数结构对规则文件中的函数进行解析和执行,并支持动态将自定义的函数或函数块注册到规则引擎中,方便了运营和产品人员根据不同的需求动态调整规则的实例。
附图说明
15.图1是本技术实施例提供的规则引擎的使用场景示意图;
16.图2是本技术实施例提供的一种基于策略中间层规则引擎的访问控制方法的时序示意图;
17.图3是本技术实施例提供的一种基于函数的规则引擎的结构示意图。
具体实施方式
18.在下面的描述中阐述了很多具体细节以便于充分理解本技术。但是本技术能够以很多不同于在此描述的其它方式来实施,本领域技术人员可以在不违背本技术内涵的情况下做类似推广,因此本技术不受下面公开的具体实施的限制。
19.在本技术一个或多个实施例中使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本技术一个或多个实施例。在本技术一个或多个实施例和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本技术一个或多个实施例中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。
20.应当理解,尽管在本技术一个或多个实施例中可能采用术语第一、第二等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本技术一个或多个实施例范围的情况下,第一也可以被称为第二,类似地,第二也可以被称为第一。取决于语境,如在此所使用的词语“如果”可以被解释成为“响应于确定”。
21.在本技术中,提供了一种基于函数的规则引擎的建立方法及装置、计算设备和计算机可读存储介质,在下面的实施例中逐一进行详细说明。
22.图1示出了根据本技术一实施例提供的规则引擎的使用场景示意图。
23.为了对各种可能出现的作弊行为进行灵活的配置和应对,业务服务器102根据用户的请求得到用户行为相关参数后将其转发给策略中间层104;在策略中间层104中,将用户行为相关参数进一步发送给缓存服务106,根据用户行为相关参数查询得到风险匹配结果,进而,根据策略中间层106的规则引擎中的多个规则实例对风险匹配结果进行判断得到对应的策略执行方式,实现了对不同用户的行为进行风险控制的功能。其中,在上述规则引擎的规则实例中,通过函数实现了每个逻辑执行单元的表达,包括但不限于逻辑判断、数学表达式、数据源等,都以函数的形式提供,并通过对不同的函数进行嵌套组合完成规则实例的定义。即在规则中的任意位置定义函数,并且可以把函数作为值传递,从而使得规则定义的过程简洁、灵活以及易于学习。
24.其中,图2示出了根据本技术一实施例的基于策略中间层规则引擎的访问控制方法的时序图,在该时序图中主要包括如下步骤。
25.步骤202:接收客户端请求,生成用户行为相关参数;
26.在该步骤中,业务服务器接收客户端发送的各类用户请求,其中不同的用户请求代表了不同的用户行为,这些用户通常具有各种不同的属性。
27.在一种可行的实施方式中,业务服务器接收用户发送的注册请求、登录请求、支付请求、获取验证码或其他请求后,进一步的,业务服务器根据用户的请求生成不同的用户行
为参数,在用户行为参数中,至少包括了能够标识用户以及与用户行为相关的多个参数字段。例如,业务服务器根据用户的注册请求,生成如下的用户行为相关参数:
[0028][0029][0030]
本领域技术人员应当知晓,上述用户行为相关参数仅为例举,并非将参数类型局限于上述列表中。
[0031]
步骤204:发送用户行为相关参数到策略中间层执行风险控制策略。
[0032]
在一种可行的实施方式中,业务服务器在执行业务流程之前,优先将用户行为相关参数发送策略中间层,再根据策略中间层返回的风险控制策略确定相应的业务流程。具体的,由策略中间层根据用户行为相关参数确认本次询问的用户行为信息是否在风险。
[0033]
其中,步骤204进一步包括:
[0034]
步骤2042:策略中间层根据用户行为相关参数在风险库中进行匹配,获取匹配结果。
[0035]
其中,风险库包括但不限于用户标识风险库、ip风险库和设备指纹风险库。策略中间层根据用户行为相关参数分别获取用户标识、ip和或设备指纹的风险匹配结果。
[0036]
可选的,在进行用户标识风险匹配时,策略中间层根据用户行为相关参数中的user_id在用户标识风险库中进行查询,根据user_id确认该用户的风险等级,例如低、中、高。
[0037]
可选的,在进行ip风险匹配时,策略中间层根据用户行为相关参数中的ip在ip风险库中进行查询,确定该ip对应的风险信息。例如,ip累计登录风险账号的数量、上次登录ip和本次登录ip所在城市等等。
[0038]
可选的,在进行设备指纹的风险匹配时,策略中间层根据用户行为相关参数中的fingerprint在设备指纹风险库中进行查询,确定该设备所对应的风险信息。例如,该设备是否为模拟设备、该设备每日注册的人数等等。
[0039]
本领域技术人员应当知晓,风险库以及风险的匹配类型并不局限于上述例子。
[0040]
步骤2044:策略中间层根据该匹配结果执行配置的策略。
[0041]
具体的,在策略中间层中包括配置管理服务,在配置管理服务中对策略中间层需要执行的各种风险控制策略进行配置。
[0042]
在一种可行的实施方式中,通过配置管理服务根据不同的用户行为为策略中间层配置不同类型的风险控制策略格式,包括但不限于:
[0043]
用户注册行为:
[0044]-如果请求来自风险设备或风险ip,禁止该用户注册;
[0045]
用户登录行为:
[0046]-如果请求的ip累计登录风险账号数量大于3,禁止该用户登录;
[0047]-如果当前请求中的user_id命中白名单,允许登录;
[0048]-禁止模拟器设备登录;
[0049]
用户请求验证码:
[0050]-如果请求来自风险设备或风险ip,禁止发验证码;
[0051]
用户支付行为:
[0052]-禁止某些风险uid的支付;
[0053]-禁止黑名单中设备的支付;
[0054]-针对不同渠道的支付设置;
[0055]
可见,策略中间层的配置管理服务需要根据不同的用户行为和响应条件配置出各种不同的策略格式,而用户行为又根据用户行为相关参数值的不同而千变万化,因此需要一种合理的策略格式配置方式,既能统一在策略中间层的配置管理服务下,又能实现不同策略的定义。
[0056]
因此,在一种可行的实施方式中,在配置管理服务中定义策略格式,其中,在策略格式定义中至少包括策略行为组、策略执行方式、筛选块以及风险条件块。
[0057]
具体的,策略行为组与用户行为相对应,每一种用户行为对应一种策略行为组,例如在一种策略格式中包括:
[0058]
策略a
[0059]
"action":"register"
[0060]
表示策略a的策略行为组为register,用于处理用户注册行为相关的策略。
[0061]
进一步,策略格式定义中的用户请求筛选块用于对用户行为相关参数进行过滤,从而确定待执行的目标策略。用户请求筛选块中定义需要筛选的一个或多个用户行为相关参数以及表达式,例如:
[0062][0063]
[0064]
在上述策略格式中,在筛选块filter中定义了多个字段,表明对于应用id为9999,客户端版本大于5.25且客户端渠道为”zhibo”和”fenxiang”的用户请求执行策略a。
[0065]
进一步的,在策略格式中还包括风险条件块,在风险条件块中利用多个风险描述字段以及表达式完成对上述来自风险库匹配结果的判断和筛选,例如:
[0066][0067]
在上述风险条件块config中,使用type字段定义了2个风险条件,device设备条件和ip条件。在device设备条件中,将设备指纹匹配结果中包括了"simulater"和"xposed"即模拟设备的请求筛选出来;在ip规则中,将ip匹配结果中ip段为171.21.3.*且该ip段累计登录风险账号数量大于20的请求筛选出来。
[0068]
进一步的,策略格式定义中的策略编码表示该策略应当如何执行,例如:
[0069]
策略a
[0070]
"rules_code":"99"
[0071]
策略编码99表示策略a的执行方式为拒绝,即符合策略a中用户请求筛选块和风险条件模块要求的所有用户请求都将被拒绝。具体到上述案例中,对于应用id为9999,客户端版本大于5.25且客户端渠道为”zhibo”和”fenxiang”的用户请求,如果该请求对应的设备指纹匹配结果中包括了"simulater"和"xposed"或者该请求的ip段为171.21.3.*且该ip段累计登录风险账号数量大于20时,策略中间层返回策略代码99,即针对当前接收的用户行为相关参数,执行的策略应该是拒绝该用户行为。
[0072]
在步骤204中,当策略中间层在初始化时,由策略中间层中的规则引擎读入配置管理服务配置的多个规则文件,创建规则的实例。
[0073]
具体的,在上述策略格式定义的需求基础上,通过一切皆函数的方式将上述策略格式定义的策略表达为规则引擎可以识别和解析的规则实例,所有的判断逻辑,数学表达式,数据源(不同的风险库)等都以函数形式提供,通过对不同的函数的组合和或嵌套完成规则的定义。
[0074]
在一种可行的实施方式中,在规则文件中通过函数定义的方式对规则中的每个逻辑执行单元进行表达,
[0075]
如:{"func":"+",input:[]}用于实现加法逻辑;其中,“func”表示该代码段为函数,“+”为该函数的名称,“input”为函数的输入参数列表。因此,对于如下函数1表达的规则:多个输入参数相加的结果,规则引擎的执行结果为20。
[0076]
函数1:
[0077][0078]
并且,函数1还可以简化表达为:"+":[5,10.0,5]。
[0079]
进一步的,除了数学运算符之外,还可以在函数中通过关系运算符来表达规则中的逻辑单元。因此,对于如下函数2表达的规则:输入的参数1是否大于大于输入的参数2,规则引擎的执行结果为true。
[0080]
函数2
[0081]
[0082][0083]
其中,在函数2中,参数1通过函数块的方式"func":"ipdaylogin"来提供,即通过函数的嵌套组合完成该规则实例的运算。其含义是参数1的值来自于函数块ipdaylogin(从ip风险库获取的某ip每天的登录次数)的运算结果,并判断函数ipdaylogin的运算结果是否比10大。
[0084]
函数的运算符还可以是逻辑运算符,如判断参数1是否在多个参数列表之中:(true|false)in(参数1,参数2,参数3,参数4,...)。因此,对于如下函数3表达的规则实例:输入第一个参数字符串“tuyoo”是否在多个后续的多个输入参数列表之中,规则引擎的执行结果为true。
[0085]
函数3:
[0086][0087][0088]
在上述实施例中,可以用函数的方式对多种逻辑需求直接进行组合,无需经过其他的转换方式,例如用dsl语言描述规则,再转换为语法树的方式解析。
[0089]
优选的,还可以通过函数块的方式来重复使用复杂函数功能。例如,通过函数块clientid所对应的字符串获取函数getargs取得当前请求的客户端标识。
[0090][0091]
因此,当在需要获取客户端标识的场景中,在规则文件中直接使用{"func":"clientid"}即可获取当前请求的客户端标识。
[0092]
同样的,在函数块中可以将其他函数块作为输入参数。如函数块mainchannel用于获取当前请求所在的主渠道信息,其中,将函数块clientid作为其输入参数,并根据clientid获取当前请求所在的主渠道信息。
[0093][0094][0095]
进一步的,可以通过函数块与前述包括逻辑操作的函数相组合,实现复杂的规则实例,如在函数块tuyoochannel中,首先通过函数块mainchannel获取当前请求的主渠道信息,然后判断获取的主渠道信息是否在字符串列表中,进而规则引擎根据判断的结果执行相关的策略。
[0096][0097]
因此,基于上述多种函数的定义,根据步骤204策略定义中的用户请求筛选块和风险条件块生成规则文件,便于规则引擎的识别和执行。
[0098]
其中,在规则文件中通过函数块"func":"tuyoochannel"完成了对用户请求的筛选,即仅针对来自官方渠道的请求进行该规则的判断;并通过if函数嵌套iprisk函数完成对风险匹配结果的判断,如果返回的结果是0,证明该用户是正常用户允许登录,若返回的结果是1则拒绝登录。
[0099][0100]
步骤206:接收策略中间层返回的策略编码,根据策略编码执行业务功能。
[0101]
在该步骤中,策略中间层的规则引擎根据规则实例以及风险匹配结果数据进行判断,得到策略编码。
[0102]
其中,规则引擎根据当前包括的规则实例对输入的数据进行判断。在规则引擎中对规则实例中的函数进行解析,完成输入数据的匹配和判断,如下代码所示:
[0103][0104]
其中,在规则引擎中实现了函数需要用到的各类默认逻辑运算,
[0105][0106]
进一步的,上述规则实例可以根据规则需求的变化动态生成,即无需重新初始化规则引擎,可动态向规则引擎注入代表新规则的函数或者函数块。
[0107]
在该实施例中将自定义的函数注册到规则引擎中,
[0108]
engine:=newengine(rfuncmap,rblockmap)
[0109]
//自定义函数注册
[0110]
engine.registerfunc("userinrisk",func(context context.context,e*engine,inputs[]*pb.struct)([]*pb.struct,error){
[0111]
a,err:=e.exec(context,inputs[0])
[0112]
...}
[0113]
在一种可行的实施方式中,可通过序列化协议对函数的结构进行定义,使得规则引擎可以对各种类型的函数进行解析,该序列化协议可以为protobuf协议,例如在proto文件中定义,
[0114]
//函数结构体定义
[0115][0116]
//函数定义schema,定义函数的输入/输出数据类型,用于后续参数校验
[0117][0118][0119]
进而,将由protobuf协议定义的函数组成的规则通过字节流的方式输入到规则引擎,即可完成规则的解析和执行。
[0120]
规则引擎中的每个规则实例都对应一个策略编码,当策略中间层根据接收的用户行为相关参数并执行相应的规则后,返回对应的策略编码到业务服务器。
[0121]
可选的,业务服务器根据该策略编码执行对应的业务;
[0122]
进一步的,业务服务器还根据用户的行为将相应的策略编码返回给客户端,由客户端根据策略编码执行相应的策略,不同的策略编码对应着不同的客户端响应方式。例如,当返回的策略代码为99时,客户端应用拒绝当前的用户行为请求,当返回的策略代码为0时,客户端正常执行业务流程。
[0123]
在本技术的实施例中,为了实现灵活的反作弊功能,对各种可能出现的作弊行为进行灵活的配置和应对,业务服务器根据用户的请求得到用户行为相关参数后将其转发给策略中间层,在执行业务功能之前利用策略中间层对用户的行为进行风险判断。在策略中间层中,通过基于函数的规则引擎对输入的风险匹配结果进行规则的判断从而得到相应的执行策略,由于规则引擎加载的规则文件在任意位置使用函数描述每个逻辑执行单元,使得规则的表达能力十分强大,利用函数的组合、嵌套即可实现复杂的规则定义。同时函数的结构简单明确,即使是非开发人员也可以制定较为复杂的规则。对应的,在规则引擎中根据序列化协议定义的函数结构对规则文件中的函数进行解析和执行,并支持动态将自定义的函数或函数块注册到规则引擎中,方便了运营或产品人员根据不同的需求动态调整规则的实例,从而较好的实现了根据不同的系统、不同的用户行为灵活制定各种反作弊的策略。
[0124]
与上述一种基于函数的规则引擎的建立方法的实施例相对应,本技术还提供了一种基于函数的规则引擎,如图3所示,该引擎包括:
[0125]
加载模块,用于读取规则文件,创建多个规则实例;
[0126]
规则文件,所述规则文件中的每个逻辑执行单元均由函数直接描述;
[0127]
解析模块,用于对规则实例中的函数进行解析,完成输入数据与规则实例的匹配。
[0128]
需要说明的是,上述基于函数的规则引擎的技术方案与上述基于函数的规则引擎
的建立方法的技术方案属于同一构思,上述基于函数的规则引擎的技术方案未详细描述的细节内容,均可以参见上述基于函数的规则引擎的建立方法的技术方案的描述。
[0129]
本技术一实施例中还提供一种计算设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机指令,所述处理器执行所述指令时实现所述基于函数的规则引擎的建立方法的步骤。
[0130]
上述为本实施例的一种计算设备的示意性方案。需要说明的是,该计算设备的技术方案与上述的基于函数的规则引擎的建立方法的技术方案属于同一构思,计算设备的技术方案未详细描述的细节内容,均可以参见上述基于函数的规则引擎的建立方法的技术方案的描述。
[0131]
本技术一实施例还提供一种计算机可读存储介质,其存储有计算机指令,该指令被处理器执行时实现如前所述基于函数的规则引擎的建立方法的步骤。
[0132]
上述为本实施例的一种计算机可读存储介质的示意性方案。需要说明的是,该存储介质的技术方案与上述的基于函数的规则引擎的建立方法的技术方案属于同一构思,存储介质的技术方案未详细描述的细节内容,均可以参见上述基于函数的规则引擎的建立方法的技术方案的描述。
[0133]
上述对本技术特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
[0134]
所述计算机指令包括计算机程序代码,所述计算机程序代码可以为源代码形式、用户代码形式、可执行文件或某些中间形式等。所述计算机可读介质可以包括:能够携带所述计算机程序代码的任何实体或装置、记录介质、u盘、移动硬盘、磁碟、光盘、计算机存储器、只读存储器(rom,read-only memory)、随机存取存储器(ram,random access memory)、电载波信号、电信信号以及软件分发介质等。需要说明的是,所述计算机可读介质包含的内容可以根据司法管辖区内立法和专利实践的要求进行适当的增减,例如在某些司法管辖区,根据立法和专利实践,计算机可读介质不包括电载波信号和电信信号。
[0135]
需要说明的是,对于前述的各方法实施例,为了简便描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本技术并不受所描述的动作顺序的限制,因为依据本技术,某些步骤可以采用其它顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定都是本技术所必须的。
[0136]
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其它实施例的相关描述。
[0137]
以上公开的本技术优选实施例只是用于帮助阐述本技术。可选实施例并没有详尽叙述所有的细节,也不限制该发明仅为所述的具体实施方式。显然,根据本技术的内容,可作很多的修改和变化。本技术选取并具体描述这些实施例,是为了更好地解释本技术的原理和实际应用,从而使所属技术领域技术人员能很好地理解和利用本技术。本技术仅受权利要求书及其全部范围和等效物的限制。

技术特征:
1.一种基于函数的规则引擎的建立方法,其特征在于,包括:规则引擎加载规则文件,创建多个规则实例;所述规则文件中的每个逻辑执行单元均由函数直接描述;所述规则引擎对规则实例中的函数进行解析,完成输入数据与规则实例的匹配。2.根据权利要求1所述的方法,其中,所述规则文件中的每个逻辑执行单元均由函数直接描述包括:基于函数的标识以及函数的输入参数完成所述逻辑执行单元的描述。3.根据权利要求2所述的方法,其中,所述基于函数的标识以及函数的输入参数完成所述逻辑执行单元的描述包括:所述函数的输入包括函数的嵌套,所述函数的嵌套为函数块的标识。4.根据权利要求3所述的方法,其中,所述规则文件中的每个逻辑执行单元均由函数直接描述还包括:将可以重复使用的函数标记为函数块,通过所述函数块的标识重复使用函数功能。5.根据权利要求1所述的方法,其中,所述规则引擎对规则实例中的函数进行解析包括:在所述规则引擎中对获取的函数字节流进行解析,并根据所述规则引擎中的默认逻辑运算对解析后的函数进行执行。6.根据权利要求5所述的方法,其中,在所述规则引擎中对获取的函数字节流进行解析包括:使用序列化协议定义函数的结构,所述规则引擎根据函数结构的序列化协议定义对函数字节流进行解析。7.根据权利要求1所述的方法,其中,所述规则引擎读取规则文件,创建多个规则实例包括:生成多个规则文件,动态向所述规则引擎注册代表了新规则实例的函数。8.一种基于函数的规则引擎,其特征在于,所述规则引擎包括:加载模块,用于读取规则文件,创建多个规则实例;规则文件,所述规则文件中的每个逻辑执行单元均由函数直接描述;解析模块,用于对规则实例中的函数进行解析,完成输入数据与规则实例的匹配。9.一种计算设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机指令,其特征在于,所述处理器执行所述指令时实现权利要求1-7任意一项所述方法的步骤。10.一种计算机可读存储介质,其存储有计算机指令,其特征在于,该指令被处理器执行时实现权利要求1-7任意一项所述方法的步骤。

技术总结
本申请提供一种基于函数的规则引擎的建立方法及规则引擎、计算设备和计算机可读存储介质,其中所述方法通过基于函数的规则引擎对输入的数据进行规则的判断,在规则文件的任意位置使用函数描述每个逻辑执行单元,利用函数的组合、嵌套即可实现复杂的规则定义。对应的,在规则引擎中根据序列化协议定义的函数结构对规则文件中的函数进行解析和执行,并支持动态将自定义的函数或函数块注册到规则引擎中,从而较好的实现了根据不同的系统、不同的用户行为灵活制定各种反作弊的策略。行为灵活制定各种反作弊的策略。行为灵活制定各种反作弊的策略。


技术研发人员:梁前武 田文 王新宇 郭子文 李建良 袁冠鹏 何雨泉 杨东 林逸
受保护的技术使用者:北京云游互动网络科技有限公司
技术研发日:2023.05.10
技术公布日:2023/8/13
版权声明

本文仅代表作者观点,不代表航空之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)

飞行汽车 https://www.autovtol.com/

分享:

扫一扫在手机阅读、分享本文

相关推荐