一种构造软件模拟数据的方法及装置与流程

文档序号:17089491发布日期:2019-03-13 23:16阅读:254来源:国知局
一种构造软件模拟数据的方法及装置与流程

本发明涉及软件数据模拟技术领域,尤其涉及一种构造软件模拟数据的方法及装置。



背景技术:

在软件开发过程中,通常定义好软件接口即可着手开发。但软件在开发过程中,无法提供足够的软件数据响应调用者,而调用者又需要大量的软件数据来填充视图,使得视图饱满美观。在现有的软件开发过程中,通常直接将软件数据写死在了软件代码中,以此响应用户或者开发人员。这种做法效率低下,且不易维护,无法提供批量的软件数据,不易做接口测试。

随着软件行业的快速发展,微服务成了当下最流行的软件架构,这种架构就是把一个庞大复杂的软件拆分成多个功能单一的服务,这些服务提供统一的软件接口供相互之间访问数据。在项目开发过程中,往往都是多个服务同时进行,而服务之间需要提供数据。

在现有技术中,常规的技术手段是人为的在数据库插入测试数据或者在代码中写一堆固定的数据用来返回,以对微服务的配置及性能进行模拟测试。上述现有技术导致了人力成本和时间成本的增加;同时由于在数据库插入测试数据或者在代码中写一堆固定的数据对软件代码有一定的侵入性,因此对软件代码审查造成很多的困扰;同时,在完成对微服务等软件的模拟测试后,还需要进行定期的代码审查与清理残留数据的工作。

有鉴于此,有必要对现有技术中的构造软件模拟数据的构造方法及基于该构造方法的软件模拟数据构造装置予以改进,以解决上述问题。



技术实现要素:

本发明的目的在于揭示一种构造软件模拟数据的方法及基于该方法的一种构造软件模拟数据的装置,以简化软件开发流程,避免开发人员人工编写静态模拟数据,避免对软件代码产生入侵,降低软件模拟数据的残留。

为实现上述第一个目的,本发明提供了一种构造软件模拟数据的方法,所述方法包括以下步骤:

s1、在接口配置模块中预先配置软件接口设置;

s2、通过提取模块接收用户发起的请求,并发送至检索模块;

s3、通过检索模块对自用户发起的请求进行解析,以解析出与用户请求所对应的接口地址;

s4、将接口地址所对应的响应参数及参数值导入数据构造模块,所述数据构造模块对参数值执行是否为规则函数的判断,并当参数值是规则函数时,调用预先配置的软件接口设置并生成与用户请求所对应的模拟数据;

s5、将模拟数据写入数据容器,并通过响应模块自数据容器中调用模拟数据,以响应用户。

作为本发明的进一步改进,步骤s5执行完毕之后还包括:调用清理进程,以对数据容器中留存的模拟数据进行清理。

作为本发明的进一步改进,所述调用清理进程受控于响应模块执行清理。

作为本发明的进一步改进,所述数据构造模块内置由多个规则函数所组成的规则函数库,并配置手动添加或者批量导入规则函数的导入接口,所述导入接口为restfulapi或者soap。

作为本发明的进一步改进,所述数据容器为数据库、键-值存储系统、计算内存、jvm或者文件系统;

所述用户请求的类型为get请求、post请求、update请求或者delete请求,并以http方式发起请求或者接收模拟数据。

作为本发明的进一步改进,所述步骤s3还包括:

对解析出的与用户请求所对应的接口地址与接口配置模块中所预先配置软件接口设置进行检索的步骤,

若存在相同配置的软件接口设置时,直接从接口配置模块中调用相同的配置软件接口所对应的模拟数据,并发送至响应模块,以通过响应模块向用户进行响应;

若不存在相同配置的软件接口设置时,执行步骤s4。

为实现上述另一个发明目的,本发明还提供了一种构造软件模拟数据的装置,包括:

用于预构造软件接口的接口配置模块,

用于响应用户请求的提取模块,并通过检索模块对用户发起的请求进行解析,以解析出与用户请求所对应的接口地址,

数据构造模块,接收自检索模块录入的接口地址所对应的响应参数及参数值,所述数据构造模块对参数值执行是否为规则函数的判断,并当参数值是规则函数时,调用预先配置的软件接口设置并生成模拟数据,

用于接收并保存模拟数据的数据容器,以及

自数据容器获取模拟数据的响应模块,以通过所述响应模块向用户进行响应。

作为本发明的进一步改进,所述数据构造模块内置由多个规则函数所组成的规则函数库,并配置手动添加或者批量导入规则函数的导入接口,所述导入接口为restfulapi或者soap。

作为本发明的进一步改进,所述装置还包括:受控于响应模块的清理模块,所述清理模块运行有清理进程,并在响应模块向用户进行响应之后,向清理模块发送数据清除指令,从而通过清理模块将数据容器中的模拟数据执行清理操作。

作为本发明的进一步改进,所述用户发起的请求由接口地址、请求类型、响应参数及响应参数值共同描述;所述数据容器为数据库、键-值存储系统、计算内存、jvm或者文件系统;所述用户发起的请求类型为get请求、post请求、update请求或者delete请求。

作为本发明的进一步改进,所述装置还包括:与接口配置模块相互访问的软件接口库;所述装置支持并发响应模型。

作为本发明的进一步改进,所述构造软件模拟数据的装置部署于web服务器或者云计算管理平台中。

作为本发明的进一步改进,所述云计算管理平台openstack、cloudstack、vmwarevcloud、microsoftazurepack、opennebula或eucalyptus。

与现有技术相比,本发明的有益效果是:通过本申请所揭示的一种构造软件模拟数据的方法及基于该方法的一种装置,简化了软件开发流程,且不需要开发人员人工编写静态模拟数据,避免了对软件代码产生入侵,降低了软件模拟数据的残留。

附图说明

图1为本发明一种构造软件模拟数据的装置在具体实施过程中的场景图,其中,构造软件模拟数据的装置右侧的服务2至服务4指代用户向构造软件模拟数据的装置所发起的构造请求,构造软件模拟数据的装置左侧服务1指代服务2至服务4通过构造软件模拟数据的装置所构造出的服务。

图2为本发明一种构造软件模拟数据的方法的过程示意图;

图3为本发明一种构造软件模拟数据的方法的逻辑图;

图4为本发明一种构造软件模拟数据的装置在第一种具体实施方式中的模块图;

图5为本发明一种构造软件模拟数据的装置在第二种具体实施方式中的模块图;

图6为本发明一种构造软件模拟数据的装置在第三种具体实施方式中的模块图;

图7为本发明一种构造软件模拟数据的装置在第四种具体实施方式中的模块图。

具体实施方式

下面结合附图所示的各实施方式对本发明进行详细说明,但应当说明的是,这些实施方式并非对本发明的限制,本领域普通技术人员根据这些实施方式所作的功能、方法、或者结构上的等效变换或替代,均属于本发明的保护范围之内。

在详细阐述本申请各个实施例之前,对本申请中的术语进行必要的限定与解释。在本申请中,术语“构造请求”与“用户发起的请求”作等同解释。“参数值”与“响应参数值”作等同解释。

参图1所示,说明书及其说明书附图所揭示的构造软件模拟数据的方法或者基于运行该方法的构造软件模拟数据的装置100,通常运行在web服务器或者云计算管理平台中,并基于服务2至服务4所示出的一个或者多个服务(于图1的场景中该服务2至服务4可以是微服务,也可以实现软件或者计算系统的某个插件或者基本配置),从而通过图1中的一种构造软件模拟数据的装置100执行对特定功能的软件接口的配置进行模拟,以形成一个或者多个如服务1所示出的通过构造软件模拟数据的装置所构造出的服务。

当然,构造出来的服务也可以是一种微服务,也可以是云平台中的一种应用或者程序或者组件。服务1本质上可被定义为或者理解为服务消费者。

实施例一

请参图2、图3及图5所示出的一种构造软件模拟数据的方法的一种具体实施方式。

在本实施例中,一种构造软件模拟数据的方法,所述方法包括以下步骤:

首先,执行步骤s1、在接口配置模块11中预先配置软件接口设置。在本步骤中,该预先配置的软件接口设置可配置为一种或者几种用于测试软件接口常用的模拟数据。软件接口设置在本实施例中可包括:服务名称、接口名称、接口地址、接口说明、请求类型、请求参数、响应参数(例如,id、name)及响应参数值。响应参数值是对应响应参数所设定的规则函数(例如,@name)。

请求类型,即用户30发起的构造软件模拟数据的构造请求,该请求类型包括get请求、post请求、update请求或者delete请求。

服务名称通常根据服务功能进行定义,并在软件开发前进行提前定义。例如,订单服务可命名为“order”。接口名称是指某个操作的名称,其通常与软件提供的软件接口保持一致。例如,当服务名称为“order”时,当接口名称为“listorder”时,则体现为“列出所有订单”的含义。接口地址自动生成,其默认地址是“url+服务名称+接口名称”,例如“http://127.0.0.1:8800/order/listorder”。软件接口设置的步骤可在可视化的用户操作界面(ui)中以自定义的方式进行编辑、复制、删除或者查看。

用户30执行步骤111向提取模块12发起构造请求,该构造请求的发起方式为http请求。

然后,执行步骤s2、通过提取模块12接收用户30发起的请求(即构造请求),提取模块12跳转执行步骤113,以将用户30发起的请求发送至检索模块13。然后,执行步骤s3、通过检索模块13对自用户30发起的请求进行解析,以解析出与用户请求所对应的接口地址。

检索模块13跳转执行步骤115以运行逻辑一,从而通过运行逻辑一,以通过检索模块13对用户30发起的请求判断该请求中是否存在匹配的接口,若是在跳转执行步骤117,若否,则跳转执行步骤118,并终止(edn)。当存在用户30发起的请求中包含存在匹配的接口时,同时执行步骤116,以从接口配置模块11中提取上述与用户30发起的请求所对应的接口,并一并传入数据构造模块14进行软件模拟数据的构造。具体的,用户30通常基于http方式向提取模块12发送构造软件模拟数据的请求,并根据用户30发起的请求中所包含的url地址。

然后,执行步骤s4、将接口地址所对应的响应参数及参数值导入数据构造模块14。

于此,申请人对响应参数、响应参数值(即参数值)等技术术语展开解释说明。在本申请中,响应参数可提前在接口配置模块11进行预定义,以下示出了几种响应参数。

@guid:生成唯一id;

@"number|1-100":从1-100中取一个随机数;

@increment:生成递增id;

@title:生成随机标题;

@date('yyyy-mm-ddahh:mm:ss'):生成日期年月日时分秒;

@id:生成随机id;

@name:生成用户名;

@boolean:生成true/false。

数据构造模块14对参数值执行是否为规则函数的判断(参图2中的逻辑二所示),并当参数值是规则函数时,调用预先配置的软件接口设置并生成与用户请求所对应的模拟数据。该步骤s4对应图2中虚线框b所指定待的逻辑步骤。其中,“参数值”特指“响应参数”的参数值,例如,{name:“@name”}作为一个响应参数,其中的“name”是响应参数,“@name”则是与响应参数所对应的响应参数值。

响应参数是指,根据接口定义好的返回参数来设置响应参数。需要遵循一定的规则,本发明方案会根据规则动态生成软件模拟数据,且无需提前准备软件模拟数据,只需根据函数规则设置需要返回的参数类型、格式即可,因此,其区别于现有的需要代码提前生成模拟数据插入到数据库,特别提醒,此处的“数据库”与数据容器16采用的数据库的实例在逻辑架构上是不同的,即本申请中数据容器16中的技术方案,本实施例所揭示的方法不会导致入侵软件代码(该软件泛指图1中的服务1或者其他需要进行模拟测试的软件)的有益效果。

在本实施例中,通过数据构造模块14所构造出模拟数据,比如@guid会生成唯一的请求id(6e78941e-ffb0-1fd3-fa49-d3cfc972d8be)、orders|3会生成3条orders数据,这些规则数据(即本申请中的“规则函数”)的生成,可采用nodejs语言技术实现,并将生成的软件模拟数据驻存于计算内存中,因此不会将生成的软件模拟数据存放于构造软件模拟数据的装置100中,,所以不会产生残留的垃圾数据。

具体的,数据构造模块14跳转执行步骤120,以通过一个或者多个归规则函数库15对参数值执行是否为规则函数进行判断。规则函数库15跳转执行步骤121,通过逻辑二对传入的参数值是否为规则函数进行判断;

若是,则跳转执行步骤124并从接口配置模块11中调用与参数值相匹配的且已经在步骤s1中已经形成的规则函数返回软件模拟数据(参步骤124所示);若否,即,如果数据构造模块14中的逻辑二将参数值判定为非规则函数时,则执行步骤119:对当前参数值不作处理,并继续保持遍历,直至能够通过规则函数库15从接口配置模块11中调用到与用户发起的请求匹配的软件模拟数据,并最终跳转执行步骤123。其中,规则函数是开发人员预设置的函数,它们以规则命名,比如预设置一个返回时间的规则函数,则开发人员需要在规则函数库15中命名一个@datetime(函数名称是约定的,并不是指定格式,可以是date、date$或者其他函数表达形式均可,只要在设置接口参数值时与函数名称一致即可)的函数,并在函数体内设置返回一个时间值。

最后,执行步骤s5、将模拟数据写入数据容器16(参步骤123所示),并通过响应模块17自数据容器16中调用模拟数据(参步骤125所示),以响应用户30(参步骤126所示)。

优选的,在本实施例中,在步骤s5执行完毕之后还包括:调用清理进程,以对数据容器16中留存的模拟数据进行清理。调用清理进程受控于响应模块18执行清理。具体的,当步骤126执行完毕后,响应模块17跳转执行步骤127,将已经向用户30成功反馈模拟数据的消息通知清理模块18。清理模块18跳转执行步骤128,以对数据容器16中驻存的软件模拟数据执行清理,从而降低了软件模拟数据在数据容器16中的残留。

申请人尤其注意到,在现有技术中,为了对微服务的配置及性能进行模拟测试,通常没有也无法对残留数据进行清除,即使存在清除模拟数据的操作,也是在整个软件或者微服务的开发完毕之后,通过目录检索的方式寻找到废弃的软件模拟数据。

因此,在清除操作的过程中,必须全局性记录所有的软件模拟数据的栈地址、数据卷名称,如果构成一个服务的微服务众多时,就会导致误删或者清除软件模拟数据的时间过长,甚至导致待开发的软件发生文件丢失或者组件丢失的问题。然而,在本实施例所揭示的一种构造软件模拟数据的方法中的具体实施方式中,可对数据容器16中所残留的软件模拟数据“即时”清除,从而避免了上述问题。

配合参图6所示,该数据构造模块14内置由多个规则函数所组成的规则函数库15,并配置手动添加或者批量导入规则函数的导入接口141,导入接口为restfulapi或者soap。管理员40可在导入接口141中导入新的规则函数,该新的规则函数可包括响应参数及响应参数值。

数据容器16为数据库(database)、键-值存储系统(例如,redis)、计算内存(例如,shmop)、jvm(javavirtualmachine)或者文件系统(filesystem,fs)。用户30发起的请求的请求类型为get请求、post请求、update请求或者delete请求,并以http方式发起请求或者接收模拟数据。其中,该数据库可配置为关系型数据库(eg:mysql)或者非关系型数据库(eg:nosql)。在本实施例中,该数据容器16具体选用关系型数据库。

在本实施方式中,请求参数和响应参数可统一为json格式或者其他类型的轻量级数据交换格式文件(例如,xml格式文件、txt文件或者日志文件)或者数组形式。从而满足了后续的调用过程与处理过程。

通过本实施例所揭示的构造软件模拟数据的方法,简化了软件开发流程,且不需要开发人员人工编写静态模拟数据;更重要的是,在本实施中,不需要将软件数据“写死”在了软件代码(即正在开发的软件)中,由此大大提高了用户或者开发人员的软件开发效率以及对软件接口进行性能模拟测试的效率。

实施例二

配合参照7所示,本实施例所示出的一种构造软件模拟数据的方法的一种变形例,其与实施例一所揭示的构造软件模拟数据的方法相比,其主要区别在于,在本实施例中,该步骤s3还包括:

检索模块13中的逻辑一对解析出的与用户请求所对应的接口地址与接口配置模块11中所预先配置软件接口设置进行检索的步骤,若存在相同配置的软件接口设置时,直接从接口配置模块11中调用相同的配置软件接口所对应的模拟数据,并发送至响应模块17,以通过响应模块17向用户30进行响应;若不存在相同配置的软件接口设置时,至向下顺序执行步骤s4。

在本实施例中,由于在步骤s3中加入了是否在接口配置模块11中保存有基于用户30发起的构造请求的所形成的历史软件模拟数据的判断的步骤,使得用户30发起的构造请求通过双向箭头d的方向通过检索模块13直接从接口配置模块11中调用相同的配置软件接口所对应的模拟数据;若不存在合适的与用户30发起的构造请求的所形成的历史软件模拟数据,则发送至响应模块17(参箭头e所示),以通过响应模块17直接向用户30进行响应。在本实施例中,进一步简化了构造软件模拟数据的简便性。

本实施例所示出的一种构造软件模拟数据的方法与实施例一中相同部分的技术方案请参实施例一所述,在此不再赘述。

实施例三

请参图3及图4所示出的本发明一种构造软件模拟数据的装置100的一种具体实施方式。

在本实施例中,该构造软件模拟数据的装置100,包括:提取模块12、接口配置模块11、检索模块13,其内部运行逻辑一、数据构造模块14,该数据构造模块14内部运行一个或者多个规则函数库15,规则函数库15中运行逻辑二、响应模块17以及数据容器16。逻辑一与逻辑二所执行的逻辑判断过程参实施例一所述,在此不再赘述。

当检索模块13通过其内置的逻辑一判断存在匹配的接口时,以箭头c的方向通知数据构造模块14根据规则函数生成响应的软件模拟数据。

具体的,在本实施例中,接口配置模块11用于预构造软件接口。提取模块12用于响应用户请求(即用户30通过http方式向提取模块12所发起的构造请求),并通过检索模块13对用户30发起的请求进行解析,以解析出与用户30请求所对应的接口地址。

数据构造模块14,接收自检索模块13录入的接口地址所对应的响应参数及参数值,所述数据构造模块14对参数值执行是否为规则函数的判断,并当参数值是规则函数时,调用预先配置的软件接口设置并生成模拟数据。数据容器16用于接收并保存模拟数据。响应模块17自数据容器15获取模拟数据,以通过所述响应模块17向用户30进行响应。

数据构造模块14内置由多个规则函数所组成的规则函数库15,并配置手动添加或者批量导入规则函数的导入接口141。具体的,该导入接口141为restfulapi或者soap。在本实施例中,导入接口141选用restfulapi。

用户30发起的请求由接口地址、请求类型、响应参数及响应参数值共同描述。数据容器16为数据库、键-值存储系统、计算内存、jvm或者文件系统。用户30发起的请求类型为get请求、post请求、update请求或者delete请求。同时,该构造软件模拟数据的装置100部署于web服务器或者云计算管理平台中。

具体的,该云计算管理平台openstack、cloudstack、vmwarevcloud、microsoftazurepack、opennebula或eucalyptus。同时,web服务器可以是运行windows2003、windows2008或者windows2012的windows操作系统的web服务器;当然,也可以是运行centos或者ubuntu等linux操作系统的web服务器。

实施例四

请参图5所示出的本发明一种构造软件模拟数据的装置100(以下简称“装置100”)的第一种变形例。在本实施例与实施例三所出的装置100相比,其主要区别在于,在本实施例中,该装置100还包括:受控于响应模块17的清理模块18,清理模块18运行有清理进程,并在响应模块向用户30进行响应之后,向清理模块18发送数据清除指令,从而通过清理模块18将数据容器16中的模拟数据执行清理操作。

同时,该数据构造模块14内置由多个规则函数所组成的规则函数库15,并配置手动添加或者批量导入规则函数的导入接口141,导入接口为restfulapi或者soap。数据容器16为数据库、键-值存储系统、计算内存、jvm或者文件系统。用户发起请求类型为get请求、post请求、update请求或者delete请求,并以http方式发起请求或者接收模拟数据。

需要说明的是,本实施例所中的数据容器16选用数据库的实例时,作为数据容器16一种展现形式的数据库并非传统的运行在数据中心或者与proxy服务器挂载的数据库。本实施例中中的数据容器16选用数据库的实例仅仅是指运行在web服务器或者云计算管理平台中的数据库。

本实施例所示出的构造软件模拟数据的装置100与实施例三中相同部分的技术方案请参实施例三所述,在此不再赘述。

实施例五

请参图3及图6所示出的本发明一种构造软件模拟数据的装置100的第二种变形例。在本实施例与实施例二和/或实施例三所出的装置100相比,其主要区别在于,在本实施例中,该装置100还包括:与接口配置模块11相互访问的软件接口库10。软件接口库10通过双向箭头129相互访问。

更优选的,在本实施例中,该软件接口库10不仅支持管理员40或者用户30通过restfulapi进行预定义,还可作为接口配置模块11根据用户30发起的构造请求所构造的接口配置的临时存储空间或者存储介质。此处的存储介质可以是物理层面的存储介质,也可以虚拟层面的存储介质(例如数组、集合等)。

同时,本实施例所示出的装置100还支持并发响应模型,从而满足udp循环服务器模型的需求。软件接口库10中保存有不同用户30基于该构造软件模拟数据的装置100所发起的对各种不同类型的软件或者服务所执行的软件接口测试所对应的软件接口。基于本实施例所揭示的上述变形的技术方案,能够同时支持相同用户30发出的不同的构造请求,或者同时支持不同用户30发出的具有父子进程关系的构造请求。

本实施例所示出的构造软件模拟数据的装置100与实施例二和/或实施例三中相同部分的技术方案请参实施例二和/或实施例三所述,在此不再赘述。

实施例六

请参图7所示出的本发明一种构造软件模拟数据的装置100的第二种变形例,同时,结合实施例二所示出的一种构造软件模拟数据的方法所示。

在本实施例与实施例三至实施例五中任一个实施例所出的装置100相比,其主要区别在于,在本实施例中,该检索模块13中运行的逻辑一(参实施例一中的步骤s3所示),对解析出的与用户请求所对应的接口地址与接口配置模块11中所预先配置软件接口设置进行检索(参双向箭头d所示指向接口配置模块11的方向),若存在相同配置的软件接口设置时,直接从接口配置模块11中调用相同的配置软件接口所对应的模拟数据(参双向箭头d所示指向逻辑一的方向),并发送至响应模块17(参箭头e所示),以通过响应模块向用户30进行响应;若不存在相同配置的软件接口设置时,执行实施例一中的步骤s4。

本实施例所示出的构造软件模拟数据的装置100与实施例三和/或实施例四中相同部分的技术方案请参实施例三至实施例五所述,在此不再赘述。

在本申请所提供的几个实施例中,本领域的普通技术人员应该理解到,所揭露的系统,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述模块或单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。

所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。

另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。

上文所列出的一系列的详细说明仅仅是针对本发明的可行性实施方式的具体说明,它们并非用以限制本发明的保护范围,凡未脱离本发明技艺精神所作的等效实施方式或变更均应包含在本发明的保护范围之内。

对于本领域技术人员而言,显然本发明不限于上述示范性实施例的细节,而且在不背离本发明的精神或基本特征的情况下,能够以其他的具体形式实现本发明。因此,无论从哪一点来看,均应将实施例看作是示范性的,而且是非限制性的,本发明的范围由所附权利要求而不是上述说明限定,因此旨在将落在权利要求的等同要件的含义和范围内的所有变化囊括在本发明内。不应将权利要求中的任何附图标记视为限制所涉及的权利要求。

此外,应当理解,虽然本说明书按照实施方式加以描述,但并非每个实施方式仅包含一个独立的技术方案,说明书的这种叙述方式仅仅是为清楚起见,本领域技术人员应当将说明书作为一个整体,各实施例中的技术方案也可以经适当组合,形成本领域技术人员可以理解的其他实施方式。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1