一种程序更新方法及终端设备
技术领域
本发明属于计算机技术领域,尤其涉及一种程序更新方法及终端设备。
背景技术
随着软件程序不断地向着复杂化的方向发展,一般的程序的代码量也越来越大,为了便于程序的开发和维护,现有技术中一般会采用模块化的方法,将程序划分为多个实现不同功能的模块,在需要程序实现某个特定功能时,则在该程序中加入对应的功能模块进行更新即可。但由于这些功能模块往往是由多名开发人员分别编写的,各个模块之间往往存在运行环境冲突的问题,这样更新出来的程序运行时会有较高的异常概率。
发明内容
有鉴于此,本发明实施例提供了一种程序更新方法及终端设备,以解决现有的程序更新方法存在的程序运行时会有较高的异常概率的问题。
本发明实施例的第一方面提供了一种程序更新方法,可以包括:
获取待更新入目标程序的目标功能模块;
获取所述目标程序当前的各个功能模块;
根据预设的第一对应关系判断在所述目标程序当前的各个功能模块中是否存在与所述目标功能模块存在运行环境冲突的冲突功能模块,所述第一对应关系记录了存在运行环境冲突的功能模块之间的对应关系;
若在所述目标程序当前的各个功能模块中不存在所述冲突功能模块,则从预设的代码库中读取所述目标功能模块的代码;
使用信息摘要算法5或者安全哈希算法判断所述目标功能模块的代码是否完整;
若所述目标功能模块的代码是完整的,则将所述目标功能模块的代码添加入所述目标程序的代码中,以完成对所述目标程序的更新。
本发明实施例的第二方面提供了一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现如下步骤:
获取待更新入目标程序的目标功能模块;
获取所述目标程序当前的各个功能模块;
根据预设的第一对应关系判断在所述目标程序当前的各个功能模块中是否存在与所述目标功能模块存在运行环境冲突的冲突功能模块,所述第一对应关系记录了存在运行环境冲突的功能模块之间的对应关系;
若在所述目标程序当前的各个功能模块中不存在所述冲突功能模块,则从预设的代码库中读取所述目标功能模块的代码;
使用信息摘要算法5或者安全哈希算法判断所述目标功能模块的代码是否完整;
若所述目标功能模块的代码是完整的,则将所述目标功能模块的代码添加入所述目标程序的代码中,以完成对所述目标程序的更新。
本发明实施例的第三方面提供了一种程序更新终端设备,包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现如下步骤:
获取待更新入目标程序的目标功能模块;
获取所述目标程序当前的各个功能模块;
根据预设的第一对应关系判断在所述目标程序当前的各个功能模块中是否存在与所述目标功能模块存在运行环境冲突的冲突功能模块,所述第一对应关系记录了存在运行环境冲突的功能模块之间的对应关系;
若在所述目标程序当前的各个功能模块中不存在所述冲突功能模块,则从预设的代码库中读取所述目标功能模块的代码;
使用信息摘要算法5或者安全哈希算法判断所述目标功能模块的代码是否完整;
若所述目标功能模块的代码是完整的,则将所述目标功能模块的代码添加入所述目标程序的代码中,以完成对所述目标程序的更新。
本发明实施例与现有技术相比存在的有益效果是:本发明实施例首先获取新增的功能模块和当前程序所包含的功能模块,然后根据预设的第一对应关系判断两者是否存在运行环境冲突,若不存在冲突,则读取新增的功能模块的代码并对其完整性进行校验,若其是完整的,则将其添加入原有代码中,以完成对程序的更新。由于预先构造出了存在运行环境冲突的功能模块的之间的对应关系,在将新增的功能模块的代码添加入当前程序之前,首先要根据该对应关系对模块间是否存在运行环境冲突进行判断,只有在不存在冲突时,才可以将新增的功能模块的代码添加入当前程序中,而且在添加代码之前,还对新增代码的完整性进行了校验,从而有效降低了更新出来的程序运行时的异常概率。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其它的附图。
图1为本发明实施例中一种程序更新方法的一个实施例流程图;
图2为本发明实施例中添加依赖功能模块的示意流程图;
图3为本发明实施例中验证目标程序是否正常运行的示意流程图;
图4为本发明实施例提供的程序更新终端设备的示意框图;
图5为本发明实施例提供的程序更新程序的功能模块图。
具体实施方式
为使得本发明的发明目的、特征、优点能够更加的明显和易懂,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,下面所描述的实施例仅仅是本发明一部分实施例,而非全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。
在本发明实施例中,会预先构建出一个完整的代码库,该代码库包括了目标程序可能会使用到的各个功能模块,一般而言,该代码库中功能模块的数目极多,若将其全部都应用于目标程序中,则会使目标程序变得十分庞大,占用掉用户的终端设备中的大量内存空间,因此,目标程序中一般只包含当前版本所需功能的功能模块即可,而不包含其它的功能模块,但是为了后续的可拓展性,为其它模块仍预留了模块接口,当进行版本更新,需要在目标程序中加入新的功能时,只需从代码库中读取对应的功能模块添加到目标程序为其预留的模块接口位置即可。
请参阅图1,本发明实施例中一种程序更新方法的一个实施例可以包括:
步骤S101,获取待更新入目标程序的目标功能模块。
所述目标程序为一可正常运行的程序,优选地,在步骤S101之前,可以先运行一次所述目标程序,保证其无任何运行异常的发生。
所述目标功能模块用来实现所述目标程序中尚未实现的新功能,例如,目标程序当前可以实现功能A和功能B,而目标功能模块可以实现新的功能C。
步骤S102,获取所述目标程序当前的各个功能模块。
步骤S103,根据预设的第一对应关系判断在所述目标程序当前的各个功能模块中是否存在与所述目标功能模块存在运行环境冲突的冲突功能模块。
所述第一对应关系记录了存在运行环境冲突的功能模块之间的对应关系。优选地,在构建代码库的过程中,需要对各个功能模块之间的兼容性进行测试,例如,若功能模块A在运行时会影响功能模块B的正常运行,或者功能模块B在运行时会影响功能模块A的正常运行,则说明两者是不兼容的,也即两者存在运行环境冲突。在对各个功能模块进行遍历测试后,将存在运行环境冲突的功能模块之间的对应关系记录到所述第一对应关系中,以避免在后续的程序更新过程中因功能模块间的运行环境冲突而导致目标程序无法正常运行。
若在所述目标程序当前的各个功能模块中不存在所述冲突功能模块,则执行步骤S104至步骤S105,若在所述目标程序当前的各个功能模块中存在所述冲突功能模块,则执行步骤S107至步骤S108。
步骤S104,从预设的代码库中读取所述目标功能模块的代码。
步骤S105,使用信息摘要算法5或者安全哈希算法判断所述目标功能模块的代码是否完整。
为了保证在读取的过程中所述目标功能模块的代码没有受到损坏,在读取之后,还需要对其完整性进行校验,在本实施中,可以使用信息摘要算法5(Message-DigestAlgorithm 5,MD5)或者安全哈希算法(Secure Hash Algorithm,SHA)等对代码的完整性进行校验。
下面以MD5算法为例进行说明:
若使用MD5算法,则需要首先将所述目标功能模块的代码转化为二进制形式,然后对其进行填充,使其位长对512求余的结果等于448,并在这个结果后面附加一个以64位二进制表示的填充前的信息长度,最后将其划分为16个分组。
每一分组的算法流程如下:第一分组需要初始化四个变量,即A=0x01234567,B=0x89ABCDEF,C=0xFEDCBA98,D=0x76543210,并将这四个变量复制到另外四个变量中:A到a,B到b,C到c,D到d。从第二分组开始的变量为上一分组的运算结果,即A=a,B=b,C=c,D=d。主循环有四轮,每轮循环都类似。以第一轮为例,进行16次操作,每次操作对a、b、c和d中的其中三个作一次非线性函数运算,然后将所得结果加上第四个变量,文本的一个子分组和一个常数,再将所得结果向左环移一个不定的数,并加上a、b、c或d中之一,最后用该结果取代a、b、c或d中之一。
在各轮循环完成之后,将a、b、c和d的最后取值级联输出,得到一个128比特的值,即为所述目标功能模块的代码的MD5值。
SHA算法与MD5算法类似,但其中使用到了不同的信息分组方法,以及不同的变量值及计算函数,最终得到160比特的SHA值。
本实施例中,在所述代码库中可以预先存储各个功能模块代码的MD5值或SHA值,当需要判断所述目标功能模块的代码是否完整时,可以重新计算其MD5值或SHA值,然后将计算得到的MD5值或SHA值与代码库中存储的所述目标功能模块的代码的MD5值或SHA值进行比对,若两者一致,说明所述目标功能模块的代码是完整的,则执行步骤S106,若两者不一致,说明所述目标功能模块的代码已被损坏,则执行步骤S110。
步骤S106,将所述目标功能模块的代码添加入所述目标程序的代码中,以完成对所述目标程序的更新。
在本实施例中,为了保证目标程序的可拓展性,在目标程序中为不同的功能模块预留了对应的模块接口,在添加代码的过程中,需要保证所述目标功能模块的代码添加到正确的位置上,也即添加到与其对应的模块接口位置。
步骤S107,从预设的优先级列表中分别获取所述目标功能模块所对应的第一优先级及所述冲突功能模块所对应的第二优先级。
优选地,在构建代码库的过程中,需要对各个功能模块按照功能的重要程度进行优先级排序,并记录到所述优先级列表中,当两个功能模块之间存在运行环境冲突时,优先保证优先级较高的功能模块的功能实现。
步骤S108,判断所述第一优先级是否高于所述第二优先级;
若所述第一优先级高于所述第二优先级,则执行步骤S109,若所述第一优先级小于或等于所述第二优先级,则执行步骤S110。
步骤S109,从所述目标程序中删除所述冲突功能模块的代码,并执行步骤S104中从预设的代码库中读取所述目标功能模块的代码,以及步骤S105中使用信息摘要算法5或者安全哈希算法判断所述目标功能模块的代码是否完整的过程。
步骤S110,确定程序更新出现异常。
在程序更新出现异常时,可以向指定开发人员发送更新异常的通知消息,以使其及时对异常进行处理。
通过以上步骤S107至步骤S110,当目标功能模块与原有功能模块之间存在运行环境冲突时,根据其优先级的高低,在目标程序中只保留高优先级的功能模块,而不保留低优先级的功能模块,从而使得更新后的所述目标程序可以在正常运行的前提下最大程度地保证主要功能的实现。
在构建代码库的过程中,由于其中功能模块的数目极多,往往会出现多个不同的功能模块实现相同功能的情况,因此,可选地,当目标功能模块与原有功能模块之间存在运行环境冲突时,可以使用与其功能相同的功能模块来代替目标功能模块。
具体地,首先从预设的第三对应关系中获取与所述目标功能模块的功能相同的替代功能模块。
所述第三对应关系记录了功能相同的功能模块之间的对应关系。优选地,在构建代码库的过程中,需要记录下各个功能相同的功能模块之间的对应关系,例如,若功能模块A和功能模块B所实现的功能相同,则将其关系记录到所述第三对应关系中。
然后根据所述第一对应关系判断在所述目标程序当前的各个功能模块中是否存在与所述替代功能模块存在运行环境冲突的功能模块;
若在所述目标程序当前的各个功能模块中不存在与所述替代功能模块存在运行环境冲突的功能模块,则从所述代码库中读取所述替代功能模块的代码,然后使用信息摘要算法5或者安全哈希算法判断所述替代功能模块的代码是否完整,若所述替代功能模块的代码是完整的,则将所述替代功能模块的代码添加入所述目标程序的代码中,以完成对所述目标程序的更新。
若在所述目标程序当前的各个功能模块中存在与所述替代功能模块存在运行环境冲突的功能模块,则继续从预设的第三对应关系中获取其它的功能相同的功能模块并重复以上过程,若所有与目标功能模块的功能相同的功能模块均已被遍历后仍然存在运行环境冲突,则执行步骤S107至步骤S110中的过程。
由于功能模块之间往往存在着相互依赖的关系,因此为了保证更新后的所述目标程序可以正常运行,还需要将目标功能模块运行时所依赖的功能模块也加入到目标程序中。优选地,在步骤S106之后,所述程序更新方法还可以包括如图2所示的步骤:
步骤S201,在预设的第二对应关系中查找所述目标功能模块运行时所依赖的前置功能模块。
所述第二对应关系记录了前置功能模块与后置功能模块之间的对应关系,所述后置功能模块的运行依赖于所述前置功能模块。优选地,在构建代码库的过程中,需要记录下各个功能模块之间的依赖关系,例如,若功能模块A的正常运行需要依赖于功能模块B的正常运行,则将其关系记录到所述第二对应关系中。
步骤S202,从所述代码库中读取所述前置功能模块的代码。
步骤S203,使用信息摘要算法5或者安全哈希算法判断所述前置功能模块的代码是否完整。
步骤S203与步骤S105类似,具体可参照步骤S105中的描述,本实施例对此不再赘述。
若所述前置功能模块的代码是完整的,则执行步骤S204,否则,则执行步骤S205。
步骤S204,将所述前置功能模块的代码添加入所述目标程序的代码中。
与步骤S106类似,在添加代码的过程中,需要保证所述前置功能模块的代码添加到正确的位置上,也即添加到与其对应的模块接口位置。
步骤S205,确定程序更新出现异常。
在程序更新出现异常时,可以向指定开发人员发送更新异常的通知消息,以使其及时对异常进行处理。
通过如图2所示的步骤,将目标功能模块运行时所依赖的功能模块也加入到目标程序中,有效保证了更新后的所述目标程序可以正常运行。
在完成对所述目标程序的更新之后,为了验证所述目标程序是否可以正常运行,优选地,在步骤S106之后,所述程序更新方法还可以包括如图3所示的步骤:
步骤S301,运行所述目标程序,并获取运行结果报告。
在所述目标程序的运行过程中,对其运行过程进行实时记录,生成所述运行结果报告,若新添加的功能模块与原有功能模块之间不存在运行环境冲突,则该目标程序可以顺利运行,并得到预期的结果。若新添加的功能模块与原有功能模块之间存在运行环境冲突,则该目标程序在运行过程中会出现异常,无法继续运行下去,也无法得到预期的结果。
步骤S302,根据所述运行结果报告判断所述目标程序是否运行异常。
若所述目标程序运行异常,则执行步骤S303至步骤S305,若所述目标程序运行正常,则执行步骤S306。
步骤S303,从所述运行结果报告中查找出现异常时正在执行的功能模块。
由于在加入新功能模块之前,该功能模块在执行时并未出现异常,而在加入新功能模块之后,该功能模块在执行时却会出现异常,据此可以判定两者之间存在运行环境冲突。
步骤S304,将所述出现异常时正在执行的功能模块与所述目标功能模块之间存在的运行环境冲突的关系添加入所述第一对应关系中。
在代码库的构建过程中,在所述第一对应关系中可能会遗漏掉某些模块间的运行环境冲突,因此,在实际的程序更新过程中,当出现了新的运行环境冲突时,需要及时将其添加到所述第一对应关系中,以保证该对应关系的完整性。
步骤S305,从所述目标程序的代码中删除所述目标功能模块的代码。
此时程序更新出现异常,即目标功能模块无法顺利添加入所述目标程序中,可以向指定开发人员发送更新异常的通知消息,以使其及时对异常进行处理。
步骤S306,结束对所述目标程序的更新。
通过以上步骤S301至步骤S306,在完成对所述目标程序的更新之后,进一步对其正常运行与否进行了验证。
综上所述,本发明实施例首先获取新增的功能模块和当前程序所包含的功能模块,然后根据预设的第一对应关系判断两者是否存在运行环境冲突,若不存在冲突,则读取新增的功能模块的代码并对其完整性进行校验,若其是完整的,则将其添加入原有代码中,以完成对程序的更新。由于预先构造出了存在运行环境冲突的功能模块的之间的对应关系,在将新增的功能模块的代码添加入当前程序之前,首先要根据该对应关系对模块间是否存在运行环境冲突进行判断,只有在不存在冲突时,才可以将新增的功能模块的代码添加入当前程序中,而且在添加代码之前,还对新增代码的完整性进行了校验,从而有效降低了更新出来的程序运行时的异常概率。
应理解,上述实施例中各步骤的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本发明实施例的实施过程构成任何限定。
对应于上文实施例所述的程序更新方法,图4示出了本发明实施例提供的程序更新终端设备的示意框图,为了便于说明,仅示出了与本发明实施例相关的部分。
在本实施例中,所述程序更新终端设备可以是桌上型计算机、笔记本、掌上电脑及云端服务器等计算设备。该程序更新终端设备可包括:处理器40、存储器41以及存储在所述存储器41中并可在所述处理器40上运行的计算机程序42。
所述处理器40可以是中央处理单元(Central Processing Unit,CPU),还可以是其它通用处理器、数字信号处理器(Digital Signal Processor,DSP)、专用集成电路(Application Specific Integrated Circuit,ASIC)、现场可编程门阵列(Field-Programmable Gate Array,FPGA)或者其它可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。
所述存储器41可以是所述程序更新终端设备4的内部存储单元,例如程序更新终端设备4的硬盘或内存。所述存储器41也可以是所述程序更新终端设备4的外部存储设备,例如所述程序更新终端设备4上配备的插接式硬盘,智能存储卡(Smart Media Card,SMC),安全数字(Secure Digital,SD)卡,闪存卡(Flash Card)等。进一步地,所述存储器41还可以既包括所述程序更新终端设备4的内部存储单元也包括外部存储设备。所述存储器41用于存储所述计算机程序以及所述程序更新终端设备4所需的其它程序和数据。所述存储器41还可以用于暂时地存储已经输出或者将要输出的数据。
请参阅图5,是本发明实施例提供的计算机程序42的功能模块图。在本实施例中,所述的计算机程序42可以被分割成一个或多个模块,所述一个或者多个模块被存储于所述存储器41中,并由所述处理器40所执行,以完成本发明。例如,在图5中,所述的计算机程序42,也即程序更新程序可以被分割成目标功能模块获取模块501、当前功能模块获取模块502、第一判断模块503、目标功能模块代码读取模块504、目标功能模块代码完整性判断模块505、目标功能模块代码添加模块506。以下描述将具体介绍所述模块501-506的功能。
目标功能模块获取模块501,用于获取待更新入目标程序的目标功能模块;
当前功能模块获取模块502,用于获取所述目标程序当前的各个功能模块;
第一判断模块503,用于根据预设的第一对应关系判断在所述目标程序当前的各个功能模块中是否存在与所述目标功能模块存在运行环境冲突的冲突功能模块,所述第一对应关系记录了存在运行环境冲突的功能模块之间的对应关系;
目标功能模块代码读取模块504,用于若在所述目标程序当前的各个功能模块中不存在所述冲突功能模块,则从预设的代码库中读取所述目标功能模块的代码;
目标功能模块代码完整性判断模块505,用于使用信息摘要算法5或者安全哈希算法判断所述目标功能模块的代码是否完整;
目标功能模块代码添加模块506,用于若所述目标功能模块的代码是完整的,则将所述目标功能模块的代码添加入所述目标程序的代码中,以完成对所述目标程序的更新。
进一步地,所述计算机程序42中还可以包括:
前置功能模块查找模块,用于在预设的第二对应关系中查找所述目标功能模块运行时所依赖的前置功能模块,所述第二对应关系记录了前置功能模块与后置功能模块之间的对应关系,所述后置功能模块的运行依赖于所述前置功能模块;
前置功能模块代码读取模块,用于从所述代码库中读取所述前置功能模块的代码;
前置功能模块代码完整性判断模块,用于使用信息摘要算法5或者安全哈希算法判断所述前置功能模块的代码是否完整;
前置功能模块代码添加模块,用于若所述前置功能模块的代码是完整的,则将所述前置功能模块的代码添加入所述目标程序的代码中。
进一步地,所述计算机程序42中还可以包括:
替代功能模块获取模块,用于若在所述目标程序当前的各个功能模块中存在所述冲突功能模块,则从预设的第三对应关系中获取与所述目标功能模块的功能相同的替代功能模块,所述第三对应关系记录了功能相同的功能模块之间的对应关系;
第二判断模块,用于根据所述第一对应关系判断在所述目标程序当前的各个功能模块中是否存在与所述替代功能模块存在运行环境冲突的功能模块;
替代功能模块代码读取模块,用于在所述目标程序当前的各个功能模块中不存在与所述替代功能模块存在运行环境冲突的功能模块,则从所述代码库中读取所述替代功能模块的代码;
替代功能模块代码完整性判断模块,用于使用信息摘要算法5或者安全哈希算法判断所述替代功能模块的代码是否完整;
替代功能模块代码添加模块,用于若所述替代功能模块的代码是完整的,则将所述替代功能模块的代码添加入所述目标程序的代码中,以完成对所述目标程序的更新。
进一步地,所述计算机程序42中还可以包括:
优先级获取模块,用于若在所述目标程序当前的各个功能模块中存在所述冲突功能模块,则从预设的优先级列表中分别获取所述目标功能模块所对应的第一优先级及所述冲突功能模块所对应的第二优先级;
第一删除模块,用于若所述第一优先级高于所述第二优先级,则从所述目标程序中删除所述冲突功能模块的代码。
进一步地,所述计算机程序42中还可以包括:
运行模块,用于运行所述目标程序,并获取运行结果报告;
运行判断模块,用于根据所述运行结果报告判断所述目标程序是否运行异常;
异常模块获取模块,用于若所述目标程序运行异常,则从所述运行结果报告中查找出现异常时正在执行的功能模块;
关系添加模块,用于将所述出现异常时正在执行的功能模块与所述目标功能模块之间存在的运行环境冲突的关系添加入所述第一对应关系中;
第二删除模块,用于从所述目标程序的代码中删除所述目标功能模块的代码。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述或记载的部分,可以参见其它实施例的相关描述。
本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各实施例的模块、单元和/或方法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。
在本申请所提供的几个实施例中,应该理解到,所揭露的系统,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-OnlyMemory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述,以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。