CN108733353A - 一种界面构造方法和装置 - Google Patents

一种界面构造方法和装置 Download PDF

Info

Publication number
CN108733353A
CN108733353A CN201710266662.7A CN201710266662A CN108733353A CN 108733353 A CN108733353 A CN 108733353A CN 201710266662 A CN201710266662 A CN 201710266662A CN 108733353 A CN108733353 A CN 108733353A
Authority
CN
China
Prior art keywords
component
packet
currently used
module
references
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN201710266662.7A
Other languages
English (en)
Other versions
CN108733353B (zh
Inventor
曹玮玮
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
ZTE Corp
Original Assignee
ZTE Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by ZTE Corp filed Critical ZTE Corp
Priority to CN201710266662.7A priority Critical patent/CN108733353B/zh
Publication of CN108733353A publication Critical patent/CN108733353A/zh
Application granted granted Critical
Publication of CN108733353B publication Critical patent/CN108733353B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/10Requirements analysis; Specification techniques
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/20Software design
    • G06F8/24Object-oriented
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/38Creation or generation of source code for implementing user interfaces
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Human Computer Interaction (AREA)
  • Stored Programmes (AREA)

Abstract

本发明公开了一种界面构造方法,包括:预设界面中各个功能需求分别对应的组件,并预设组件间的引用关系;根据当前使用组件确定所述当前使用组件对应的各引用组件;采用协程对所述各引用组件进行并发编译,并将对各引用组件的编译结果合并为当前使用组件的编译结果,将所述当前使用组件编译结果确定为所述当前使用组件对应的界面。本发明还公开了一种界面构造装置。

Description

一种界面构造方法和装置
技术领域
本发明涉及应用界面技术,尤其涉及一种界面构造方法和装置。
背景技术
随着互联网(Internet)的快速发展,全球广域网(Web,World Wide Web)已经对商业、工业、银行、财政、教育、政府、娱乐及人们的工作和生活等产生了深远的影响,许多传统的信息和数据库系统正在被移植到互联网上,Web应用呈现爆炸性增长。其中,Web界面的构造是Web应用开发技术中的重要组成部分。
目前,主流的Web界面的构造技术有:Java服务器页面(JSP,Java Server Pages)、AngularJS和ReactJS等。但是,基于JSP开发Web界面,难以做到良好的组件化,通常只能将通用部分抽取到单独的JSP文件中,通过文件包含的方法进行导入,不便于对子文件管理;并且,Java对于JSP的处理是单线程,不能做到高效并发处理。AngularJS和ReactJS是新兴的前端框架,使用JavaScript进行开发,框架较复杂,学习门槛高。
另外,针对Web界面的构造,主要是在浏览器端通过JavaScript操作文档对象模型(DOM,Document Object Model)实现,对于交互少的动态页面容易损失效率。
因此,如何实现Web界面的组件化,并使Web界面组件的构造能并发处理,提升Web界面构造过程的效率,是亟待解决的问题。
发明内容
有鉴于此,本发明实施例期望提供一种界面构造方法和装置,能实现Web界面的组件化,并使Web界面组件的构造能并发处理,进而提升Web界面构造过程的效率。
为达到上述目的,本发明的技术方案是这样实现的:
本发明实施例提供了一种界面构造方法,预设界面中各个功能需求分别对应的组件,并预设组件间的引用关系;所述方法还包括:
根据当前使用组件确定所述当前使用组件对应的各引用组件;
采用协程对所述各引用组件进行并发编译,并将对各引用组件的编译结果合并为当前使用组件的编译结果,将所述当前使用组件的编译结果确定为所述当前使用组件对应的界面。
上述方案中,所述预设界面中各个功能需求对应的组件,包括:
预设模板组件、和/或处理器组件;其中,
所述模板组件采用超文本标记语言(HTML,Hyper Text Markup Language)设置,并采用基于组件包的组件复用方式;所述模板组件包括:页面组件;
所述处理器组件采用Go语言设置,并实现各引用组件语法的接口及基础结构。
上述方案中,所述根据当前使用组件确定所述当前使用对应的各引用组件,包括:
确定预设的当前使用组件所属的组件包和引用的组件包;
根据预设的所述各引用组件的标签,在当前使用组件所属的组件包和引用的组件包中,确定所述各引用组件的标签对应的组件。
上述方案中,所述对所述各引用组件进行并发编译包括:
采用第一处理方法编译所述模板组件,采用第二处理方法编译所述处理器组件;
所述第一处理方法包括:
获取所述模板组件标签预设的数据(data)属性;
将所述预设的data属性合并到所述模板组件对应的各引用组件的data属性中;
采用协程对所述模板组件对应的各引用组件进行并发编译;
将所述模板组件对应的各引用组件的编译结果,确定为所述模板组件的编译结果;
所述第二处理方法包括:
采用反射创建所述处理器组件的对象模组;
获取所述处理器组件标签预设的data属性;
将所述模板组件标签预设的data属性、和/或父标签、和/或各子标签分别写入到所述对象模组的Data属性、和/或父属性、和/或子属性中;
根据预设子标签选择处理规则确定是否处理所述各子标签,如果处理子标签,则将所述对象模组的Data属性合并入子标签data属性;
采用协程对各所述子标签进行并发编译,并将所述子标签处理结果写入到所述对象模组的子属性中;
分别采用预设模组开始处理方法和结束处理方法处理所述对象模组,获取开始内容和结束内容;
将所述开始内容、和/或子属性、和/或结束内容确定为所述处理器组件的处理结果。
上述方案中,所述采用协程对所述各引用组件进行并发编译,包括:采用Go协程对所述各引用组件进行并发编译。
上述方案中,所述方法还包括对各组件进行语法检查;
所述语法检查包括:确定当前使用组件的引用组件的标签是否包括在当前使用组件所属的组件包和引用的组件包中,未包括在当前使用组件所属的组件包和引用的组件包中时,提供报错信息。
本发明实施例还提供了一种界面构造装置,所述装置包括:组件设置模块、组件确定模块和组件处理模块;其中,
所述组件设置模块,用于预设界面中各个功能需求分别对应的组件,并预设组件间的应用关系;
所述组件确定模块,用于根据当前使用组件,确定所述当前使用组件对应的各引用组件;
所述组件处理模块,用于采用协程对所述各引用组件进行并发编译,并将各编译结果合并为当前使用组件的编译结果,将所述当前使用组件的编译结果确定为所述当前使用组件对应的界面。
上述方案中,所述组件设置模块,具体用于:
预设模板组件、和/或处理器组件;其中,
所述模板组件采用HTML设置,并采用基于组件包的组件复用方式;所述模板组件包括:页面组件。
所述处理器组件采用Go语言设置,并实现提供各引用组件的语法接口及基础结构;
上述方案中,所述组件确定模块,具体用于:
确定预设的当前使用组件所属的组件包和引用的组件包;
根据预设的所述各引用组件的标签,在当前使用组件所属的组件包和引用的组件包中,确定所述各引用组件的标签对应的组件。
上述方案中,所述组件处理模块,具体用于:
采用第一处理方法编译模板组件,采用第二处理方法编译处理器组件;
所述第一处理方法包括:
获取所述模板组件标签预设的data属性;
将所述预设的data属性合并到所述模板组件对应的各引用组件的data属性中;
采用协程对所述模板组件对应的各引用组件进行并发编译;
将所述模板组件对应的各引用组的编译结果,确定为所述模板组件的编译结果;
所述第二处理方法包括:
采用反射创建所述处理器组件的对象模组;
获取所述处理器组件标签预设的data属性;
将所述模板组件标签预设的data属性、和/或父标签、和/或各子标签分别写入到所述对象模组的Data属性、和/或父属性、和/或子属性中;
根据预设子标签选择处理规则确定是否处理所述各子标签,如果处理子标签,则将所述对象模组的Data属性合并入子标签data属性;
采用协程对所述各子标签进行并发编译,并将所述子标签编译结果写入到所述对象模组的子属性中;
分别采用预设模组开始处理方法和结束处理方法处理所述对象模组,获取开始内容和结束内容;
将所述开始内容、和/或子属性、和/或结束内容确定为所述处理器组件的编译结果。
上述方案中,所述组件处理模块,具体用于:采用Go协程并发对所述各引用的组件进行编译。
上述方案中,所述装置还包括组件校验装置,用于对各组件进行语法检查;
所述语法检查包括:确定当前使用组件的引用组件的标签是否包括在当前使用组件所属的组件包和引用的组件包中,未包括在当前使用组件所属的组件包和引用的组件包中时,提供报错信息
本发明实施例所提供的界面构造方法和装置,预设界面中各个功能需求分别对应的组件,并预设组件间的引用关系;根据当前使用组件确定所述当前使用组件对应的各引用组件;采用协程对所述各引用组件进行并发编译,并将对各引用组件的编译结果合并为当前使用组件的编译结果,将所述当前使用组件编译结果确定为所述当前使用组件对应的界面;如此,如何在构造Web界面过程中实现Web界面的组件化,在构造Web界面时采用协程并发编译各组件,进而提升Web界面构造过程的效率。
附图说明
图1为本发明实施例界面构造方法的流程示意图;
图2为本发明实施例组件语法检查流程示意图;
图3为本发明实施例确定页面组件对应的各引用组件流程示意图;
图4为本发明实施例行引用组件的处理流程示意图;
图5为本发明实施例处理器组件的处理流程示意图;
图6为本发明实施例模板组件的处理流程示意图;
图7为本发明实施例界面构造装置的组成结构示意图。
具体实施方式
本发明实施例中,预设界面中各个功能需求分别对应的组件,并预设组件间的引用关系;根据当前使用组件确定所述当前使用组件对应的各引用组件;采用协程对所述各引用组件进行并发编译,并将对各引用组件的编译结果合并为当前使用组件的编译结果,将所述当前使用组件编译结果确定为所述当前使用组件对应的界面。
下面结合实施例对本发明再作进一步详细的说明。
本发明实施例提供的界面构造方法,如图1所示,所述方法包括:
步骤101:预设界面中各个功能需求分别对应的组件,并预设组件间的引用关系;
Go语言是Google开发的一种编译型,可并行化,并具有垃圾回收功能的编程语言;Go拥有优秀的并发性,内建对多核与并行计算的支持。协程(Goroutine)和协程间通信的通道(channel)使得编写高并发的服务端软件变得相当容易,很多情况下完全不需要考虑锁机制以及由此带来的各种问题。单个Go应用也能有效的利用多个中央处理器(CPU)核,并行执行的性能好。
这里,可以由电脑或移动终端的处理器等来构造所述组件,所述组件可以根据界面的功能需求来设定,如界面中包含登录功能时,可以预设一个登录组件等;组件之间可以实现引用,可以通过在组件中设置引用组件的标签来实现;从而确定组件对应的各引用组件。
进一步的,可以根据语法预设两种类型的组件,包括:模板组件、和/或处理器组件;其中,模板组件(Template),可以基于HTML语言,并增加了基于组件包的组件复用方式;这里,基于组件包的组件复用方式可以是,建立由一个以上组件组成的组件包,或称为包,并且不同组件包中的不同组件的标签可以相同;其中,所述组件的标签可以是组件名。所述处理器组件(Handler),可以使用Go语言编写,实现引用组件语法的接口及基础结构。处理器组件可以在模板组件中使用,组件之间支持嵌套。所述模板组件还可以包括页面组件;所述页面组件可以是构造Web界面时第一个启动的组件;所述页面组件是一种特殊的模板组件,其包名可以固定为app,并且不会被其他组件包含。
实际应用中,组件名的命名规则可以采用大写字母开头,后面为大写字母、小写字母或数字,组件文件扩展名为gml;
其中,所述模板组件的具体定义如下;模板组件文件文件名命名规则可以是:组件名.gml;
模板组件文件开头是组件包声明,如:
Package组件包名
后面的行是引用的组件包,如:
import"组件包路径"
import组件包别名"组件包路径"
这里,所述组件所属的组件包可以称为本组件包或本包,引用的组件包可以是除了本组件包以外的组件包,可以称为引用组件包或引用包。
组件包具体实例如下所示:
package app
import"mycomponents/table"
import fg"mycomponents/formgroup"
模板组件中可以进行数据填充,语法如下:
{字段名}
完整的模板组件示例如下所示,组件文件名Login.gml:
在模板组件文件中可以引用其他组件,引用的组件可以称为依赖组件;可以在引用组件名后预设data属性,用于指定返回的数据或形式等;
引用本组件包内组件的语法定义可以是:
<this.组件名data={JSON格式数据}/>
引用的组件包内组件的语法定义可以是:
<包名.组件名data={JSON格式数据}/>
引用组件具体实例如下所示:
例如:
其中,table为引用的组件包的包名,Normal为table中的组件名;所述处理器组件的具体定义如下;处理器组件的接口可以是:
其中,ModuleHandler接口可以是预先设定的定义了处理器组件必须实现的方法:ModuleStart方法为预设的处理标签的开始方法,;ModuleEnd方法为预设的处理标签的结束方法;SkipChildren方法表示是否要处理嵌套子标签,可以预设预设子标签选择处理规则确定是否要处理当前的子标签,如可以设定在当前处理器组件不处理所有子标签等。这里,所述ModuleStart可以根据实际求仅仅输出一些预设的内容等;所述ModuleEnd可以根据当前处理的标签对应的引用组件返回一个HTML语言写的一个页面等;
BaseModule结构存储了处理器组件的基础信息:Data是组件的数据;Children是直接子标签的名字,如果没有子标签,则指示为nil;Parent是父标签的名字,如果没有父标签,则指示为nil;
自定义处理器模块需要实现ModuleHandler接口,继承BaseModule结构,并且需要使用RegisterModuleHandler方法注册。这里,所述处理器组件可以预先注册,使其成为合法的组件组成,使用过程中可以才注册清单中检查当前处理器组件是否已经注册,并可以用来区分处理器组件或模块组件;
一个完整的处理器组件可以为如下所示:
进一步的,所述组件建立后,可以对所示组件进行检查,也可以在后续组件使用过程中对使用的组件进行检查;所述检查包括:确定当前使用组件的引用组件的标签是否包括在当前使用组件所属的组件包和引用的组件包中,确定未包括在当前使用组件所属的组件包和引用的组件包中时,提供报错信息。所述检查还可以包括:语法检查等;可以根据组件的定义,对编写的组件进行语法检查,标示出语法有误的地方;对于处理器组件,可以借助Go语言自身的语法检查功能,对组件代码合法性进行检查。
实际应用中,模板组件的语法检查过程可以如图2所示:
步骤201:读取模板组件文件内容,按行依次存储在字符串切片moduleContent里;
步骤202:从moduleContent中依次读取当前使用组件所属的组件包package和引用的组件包import部分,根据语法或接口等规则检查是否出现错误;如果通过检查,继续步骤203;否则,转到步骤207;
步骤203:根据package和import的定义,可以得到当前使用组件文件内可能依赖的所有组件,将组件名存入名为dependentModules的map结构中。本包的组件名记为“this.组件名”,引用的组件包的为“包名.组件名”;
步骤204:依次读取剩余的行,依次读取引用组件的标签名,到dependentModules中匹配组件,如果匹配到,存入名为needCheckModules的map结构中;
步骤205:依次检查needCheckModules中的组件语法是否正确;如果发现错误,记录下行号和内容,继续将所有组件检查完毕。如果全部检查通过,继续步骤206;否则转到步骤207;
步骤206:提示模板组件文件检查通过,没有错误;
步骤207:列出所有出现错误的行;
至此,语法检查过程结束。
步骤102:根据当前使用组件,确定所述当前使用组件对应的各引用组件;
这里,构成Web界面的组件通常包括了模板组件、页面组件和处理器组件;可以由电脑或移动终端的处理器等来对构造所述Web界面的各组件进行处理,编译为最终的HTML文件。组件之间可以互相嵌套;嵌套在其他组件中的组件可以称为引用组件,也可以称为依赖组件。这里,构造Web界面时,所述当前使用组件可以是页面组件,由页面组件来引导页面组件中的模板组件和处理器组件等。可以首先确定所述当前文件中引用的各组件;可以根据引用的标签名,在当前组件所属包和引用的包中确定出引用的组件;所述当前组件所属包和引用的包可以根据组件包的引用方式确定,如步骤101中由package和import分别定义的当前组件所属包和引用的包。
进一步的,在处理所述当前页面时可以首先进行步骤101中所示的组件合法性检查,检查语法错误、组件及其依赖的组件包之间的引用关系是否合法等。
具体的,以页面组件作为构造Web界面时的第一组件为例,详细解释确定组件对应的各引用组件的方法。针对页面组件的处理流程可以如图3所示:
步骤301:读取页面组件文件内容,按行依次存储在字符串切片moduleContent里;
步骤302:检查页面组件文件是否有错误,步骤参见图2。如果发现了错误,转到步骤305;如果通过检查,继续步骤303;
步骤303:从moduleContent中依次读取页面组件所属组件包和引用的组件包,得到当前使用组件文件内可能依赖的所有组件,将组件名存入名为dependentModules的map结构中。本组件包的组件名记为“this.组件名”,引用的组件包的为“包名.组件名”;
步骤304:依次读取剩余的行,用引用的标签名到dependentModules中匹配组件,将匹配的组件存入名为needProcessModules的map结构中;
步骤305:提示页面组件文件检查错误,给出详细错误信息。
如此,确定了所述当前使用组件引用的各组件。
步骤103:采用协程对所述各引用组件进行并发编译,并将对各引用组件的编译结果合并为当前使用组件的编译结果,将所述当前使用组件编译结果确定为所述当前使用组件对应的界面;
这里,可以根据步骤304依次处理needProcessModules中的组件;所述协程可以是是Go协程;针对每个组件,可以启动一个Go协程进行编译,得到各个组件的编译结果HTML。这里,可以通过Go具有的并发处理能力,并行处理各组件,从而提高整体效率。页面组件中的各个依赖组件,用各自的编译结果HTML替换,得到页面组件最终的HTML。在所述页面组件以及所述页面组件引用组件处理过程中均可以采用如图2的组件检查方法,进行组件检查,并提示组件检查错误,给出详细错误信息。
进一步的,可以采用第一处理方法编译所述模板组件,采用第二处理方法编译所述处理器组件。
其中,对于引用组件的编译流程可以如图4所示:
步骤401:由组件标签,得知组件的组件包名和组件名;
步骤402:由组件包名和组件名,到已经注册的处理器组件中查询组件。如果找到组件,则转到步骤403,否则,转到步骤404;
步骤403:启动一个Go协程,对处理器组件进行编译,获得编译结果,完成后转到步骤406;
对处理器组件进行编译的步骤可以包括:采用反射创建所述处理器组件的对象模组;获取所述处理器组件标签预设的data属性;将所述模板组件标签预设的data属性、和/或父标签、和/或各子标签分别写入到所述对象模组的Data属性、和/或父属性、和/或子属性中;根据预设子标签选择处理规则确定是否处理所述各子标签,如果处理子标签,则将所述对象模组的Data属性合并入子标签data属性;采用协程对所述各子标签进行并发编译,并将所述子标签编译结果写入到所述对象模组的子属性中;分别采用预设模组开始处理方法和结束处理方法处理所述对象模组,获取开始内容和结束内容;将所述开始内容、和/或子属性、和/或结束内容确定为所述处理器组件的编译结果;
具体的,依赖的处理器组件的编译流程可以如图5所示,包括:
步骤4031:从已经注册的处理器组件registeredModuleHandler中查询到组件;
步骤4032:通过反射创建组件对象模组(module);
步骤4033:从引用所述处理器组件时的组件标签上读取预设的data属性,将其转换为map结构,写入到module的Data属性。检查组件的其他属性,从Data属性中匹配字段,匹配到则用对应字段写入该值;
步骤4034:获取组件的父标签,将其写入到module的父(Parent)属性;
步骤4035:获取组件包含的所有子标签,将其写入到module的子(Children)属性;
步骤4036:调用组件实现的ModuleHandler接口中的ModuleStart方法,得到字符串类型的结果startContent;
步骤4037:调用组件实现的ModuleHandler接口中的SkipChildren方法;如果方法返回真(true),则不处理子标签,转到步骤4039;如果方法返回假(false),则处理子标签,转到步骤4038;
步骤4038:将module的Data属性合并入子标签的data属性,data中已经存在的字段不做合并,继续执行步骤4039;
步骤4039:采用Go协程处理子标签,将得到的结果写入到module的Children属性,覆盖之前的值;转到步骤40310;
步骤40310:调用组件实现的ModuleHandler接口中的ModuleEnd方法,得到字符串类型的结果endContent;
步骤40311:合并startContent、Children、endContent三者,作为当前处理器组件的编译结果返回;
如此,处理器组件处理完毕。
步骤404:根据组件包名获得完整组件包路径,查找组件包路径下是否存在名为“组件名.gml”的模板组件文件。如果找到,转到步骤405;否则执行步骤407;
步骤405:启动一个Go协程,编译模板组件文件,获得处理结果,该步骤后面详细说明。完成后转到步骤406;
这里,模板组件的处理步骤可以包括:
获取所述模板组件标签预设的数据(data)属性;将所述预设的data属性合并到所述模板组件对应的的各引用组件的data属性中;采用协程对所述模板组件对应的各引用组件进行并发编译;将所述模板组件对应的各引用组件的编译结果,确定为所述模板组件的编译结果;
具体的,引用的模板组件的编译流程可以如图6所示:
步骤4051:读取模板组件文件内容,按行依次存储在字符串切片moduleContent里;
步骤4052:检查模板组件文件是否有错误,步骤参见图2。如果发现了错误,转到步骤40510;如果通过检查,继续步骤4053;
步骤4053:从组件标签上读取data属性,将其转换为map结构,存入变量defaultData;
步骤4054:遍历组件内数据填充标记,用defaultData里的字段进行替换,若找不到对应字段,则填空值;
步骤4055:从moduleContent中依次读取页面组件所属组件包和引用的组件包,得到当前使用组件文件内可能依赖的所有组件,将组件名存入名为dependentModules的map结构中。本包的组件名记为“this.组件名”,引用的组件包的为“包名.组件名”;
步骤4056:依次读取剩余的行,用标签名到dependentModules中匹配组件,如果匹配到,存入名为needProcessModules的map结构中;
步骤4057:将defaultData合并入needProcessModules中的每个组件标签的data属性,data中已经存在的字段不做合并;
步骤4058:依次处理needProcessModules中的组件,针对每个组件,启动一个Go协程进行编译,得到各个组件的编译结果HTML;
步骤4059:汇总各个依赖组件的编译结果HTML,即得到模板组件最终的HTML;
步骤40510:提示模板组件文件检查错误,给出详细错误信息;
如此,模板组件的编译流程完成。
步骤406:记录处理日志,返回处理结果;
步骤407:提示没有找到组件的错误;
最后,页面组件对应的各个引用组件,用各自的编译结果HTML替换,得到页面组件最终的HTML文件,即完成的页面组件对应的Web界面的构造。
本发明实施例提供的界面构造装置,如图7所示,所述装置包括:组件设置模块71、组件确定模块72和组件处理模块73;其中,
所述组件设置模块71,用于预设界面中各个功能需求分别对应的组件,并预设组件间的引用关系;
Go语言是Google开发的一种编译型,可并行化,并具有垃圾回收功能的编程语言;Go拥有优秀的并发性,内建对多核与并行计算的支持。Goroutine和channel使得编写高并发的服务端软件变得相当容易,很多情况下完全不需要考虑锁机制以及由此带来的各种问题。单个Go应用也能有效的利用多个CPU核,并行执行的性能好。
这里,可以由电脑或移动终端的处理器等来构造所述组件,所述组件可以根据界面的功能需求来设定,如界面中包含登录功能时,可以预设一个登录组件等;组件之间可以实现引用,可以通过在组件中设置引用组件的标签来实现;从而确定组件对应的各引用组件。
进一步的,可以根据语法预设两种类型的组件,包括:模板组件、和/或处理器组件;其中,模板组件,可以基于HTML语言,并增加了基于组件包的组件复用方式;这里,基于组件包的组件复用方式可以是,建立由一个以上组件组成的组件包,或称为包,并且不同组件包中的不同组件的标签可以相同;其中,所述组件的标签可以是组件名。所述处理器组件,可以使用Go语言编写,实现引用组件语法的接口及基础结构。处理器组件可以在模板组件中使用,组件之间支持嵌套。所述模板组件还可以包括页面组件;所述页面组件可以是构造Web界面时第一个启动的组件;所述页面组件是一种特殊的模板组件,其包名可以固定为app,并且不会被其他组件包含。
实际应用中,组件名的命名规则可以采用大写字母开头,后面为大写字母、小写字母或数字,组件文件扩展名为gml;
其中,所述模板组件的具体定义如下;模板组件文件文件名命名规则可以是:组件名.gml;
模板组件文件开头是组件包声明,如:
Package组件包名
后面的行是引用的组件包,如:
import"组件包路径"
import组件包别名"组件包路径"
这里,所述组件所属的组件包可以称为本组件包或本包,引用的组件包可以是除了本组件包以外的组件包,可以称为引用组件包或引用包。
组件包具体实例如下所示:
package app
import"mycomponents/table"
import fg"mycomponents/formgroup"
模板组件中可以进行数据填充,语法如下:
{字段名}
完整的模板组件示例如下所示,组件文件名Login.gml:
在模板组件文件中可以引用其他组件,引用的组件可以称为;可以在引用组件名后预设data属性,用于指定返回的数据或形式等;
引用本组件包内组件的语法定义可以是:
<this.组件名data={JSON格式数据}/>
引用的组件包内组件的语法定义可以是:
<包名.组件名data={JSON格式数据}/>
引用组件具体实例如下所示:
例如:
其中,table为引用的组件包的包名,Normal为table中的组件名;所述处理器组件的具体定义如下;处理器组件的接口可以是:
其中,ModuleHandler接口可以是预先设定的定义了处理器组件必须实现的方法:ModuleStart方法为预设的处理标签的开始方法,;ModuleEnd方法为预设的处理标签的结束方法;SkipChildren方法表示是否要处理嵌套子标签,可以预设预设子标签选择处理规则确定是否要处理当前的子标签,如可以设定在当前处理器组件不处理所有子标签等。这里,所述ModuleStart可以根据实际求仅仅输出一些预设的内容等;所述ModuleEnd可以根据当前处理的标签对应的引用组件返回一个HTML语言写的一个页面等;
BaseModule结构存储了处理器组件的基础信息:Data是组件的数据;Children是直接子标签的名字,如果没有子标签,则指示为nil;Parent是父标签的名字,如果没有父标签,则指示为nil;
自定义处理器模块需要实现ModuleHandler接口,继承BaseModule结构,并且需要使用RegisterModuleHandler方法注册。这里,所述处理器组件可以预先注册,使其成为合法的组件组成,使用过程中可以才注册清单中检查当前处理器组件是否已经注册,并可以用来区分处理器组件或模块组件;
一个完整的处理器组件可以为如下所示:
进一步的,本发明实施例的界面构造装置还包括组件校验模块74;所述组件校验模块74可以在所述组件建立后,可以对所示组件进行检查,也可以在后续组件使用过程中对使用的组件进行检查;所述检查包括:确定当前使用组件的引用组件的标签是否包括在当前使用组件所属的组件包和引用的组件包中,确定未包括在当前使用组件所属的组件包和引用的组件包中时,提供报错信息。所述检查还可以包括:语法检查等;可以根据组件的定义,对编写的组件进行语法检查,标示出语法有误的地方;对于处理器组件,可以借助Go语言自身的语法检查功能,对组件代码合法性进行检查。
实际应用中,模板组件的语法检查过程可以如图2所示:
步骤201:读取模板组件文件内容,按行依次存储在字符串切片moduleContent里;
步骤202:从moduleContent中依次读取当前使用组件所属的组件包package和引用的组件包import部分,根据语法或接口等规则检查是否出现错误;如果通过检查,继续步骤203;否则,记录下行号和内容,转到步骤207;
步骤203:根据package和import的定义,可以得到当前使用组件文件内可能依赖的所有组件,将组件名存入名为dependentModules的map结构中。本包的组件名记为“this.组件名”,引用的组件包的为“包名.组件名”;
步骤204:依次读取剩余的行,依次读取引用组件的标签名,到dependentModules中匹配组件,如果匹配到,存入名为needCheckModules的map结构中;
步骤205:依次检查needCheckModules中的组件语法是否正确;如果发现错误,记录下行号和内容,继续将所有组件检查完毕。如果全部检查通过,继续步骤206;否则转到步骤207;
步骤206:提示模板组件文件检查通过,没有错误;
步骤207:列出所有出现错误的行;
至此,语法检查过程结束。
所述组件确定模块72,用于根据当前使用组件确定所述当前使用组件对应的各引用组件;
这里,构成Web界面的组件通常包括了模板组件、页面组件和处理器组件;可以由电脑或移动终端的处理器等来对构造所述Web界面的各组件进行处理,转换编译为最终的HTML文件。组件之间可以互相嵌套;嵌套在其他组件中的组件可以称为引用组件,也可以称为依赖组件。这里,构造Web界面时,所述当前使用组件可以是页面组件,由页面组件来引导页面组件中的模板组件和处理器组件等。可以首先确定所述当前文件中引用的各组件;可以根据引用的标签名,在当前组件所属包和引用的包中确定出引用的组件;所述当前组件所属包和引用的包可以根据组件包的引用方式确定,如组件设置模块71设置的由package和import分别定义的当前组件所属包和引用的包。
进一步的,在处理所述当前页面时可以首先进行步骤101中所示的组件合法性检查,检查语法错误、组件及其依赖的组件包之间的引用关系是否合法等。
具体的,以页面组件作为构造Web界面时的第一组件为例,详细解释确定组件对应的各引用组件的方法。针对页面组件的处理流程可以如图3所示:
步骤301:读取页面组件文件内容,按行依次存储在字符串切片moduleContent里;
步骤302:检查页面组件文件是否有错误,步骤参见图2。如果发现了错误,转到步骤305;如果通过检查,继续步骤303;
步骤303:从moduleContent中依次读取页面组件所属组件包和引用的组件包,得到当前使用组件文件内可能依赖的所有组件,将组件名存入名为dependentModules的map结构中。本组件包的组件名记为“this.组件名”,引用的组件包的为“包名.组件名”;
步骤304:依次读取剩余的行,用引用的标签名到dependentModules中匹配组件,将匹配的组件存入名为needProcessModules的map结构中;
步骤305:提示页面组件文件检查错误,给出详细错误信息。
如此,确定了所述当前使用组件引用的各组件。
所述组件处理模块73,用于采用协程对所述各引用组件进行并发编译,并将对各引用组件的编译结果合并为当前使用组件的编译结果,将所述当前使用组件编译结果确定为所述当前使用组件对应的界面;
这里,可以根据步骤304依次处理needProcessModules中的组件;所述协程可以是是Go协程;针对每个组件,可以启动一个Go协程进行编译,得到各个组件的编译结果HTML。这里,可以通过Go具有的并发处理能力,并行处理各组件,从而提高整体效率。页面组件中的各个依赖组件,用各自的编译结果HTML替换,得到页面组件最终的HTML。在所述页面组件以及所述页面组件引用组件处理过程中均可以采用如图2的组件检查方法,进行组件检查,并提示组件检查错误,给出详细错误信息。
进一步的,可以采用第一处理方法编译所述模板组件,采用第二处理方法编译所述处理器组件。
其中,对于引用组件的编译流程可以如图4所示:
步骤401:由组件标签,得知组件的组件包名和组件名;
步骤402:由组件包名和组件名,到已经注册的处理器组件中查询组件。如果找到组件,则转到步骤403,否则,转到步骤404;
步骤403:启动一个Go协程,对处理器组件进行编译,获得编译结果,完成后转到步骤406;
对处理器组件进行编译的步骤可以包括:采用反射创建所述处理器组件的对象模组;获取所述处理器组件标签预设的data属性;将所述模板组件标签预设的data属性、和/或父标签、和/或各子标签分别写入到所述对象模组的Data属性、和/或父属性、和/或子属性中;根据预设子标签选择处理规则确定是否处理所述各子标签,如果处理子标签,则将所述对象模组的Data属性合并入子标签data属性;采用协程对所述各子标签进行并发编译,并将所述子标签编译结果写入到所述对象模组的子属性中;分别采用预设模组开始处理方法和结束处理方法处理所述对象模组,获取开始内容和结束内容;将所述开始内容、和/或子属性、和/或结束内容确定为所述处理器组件的编译结果;
具体的,依赖的处理器组件的编译流程可以如图5所示,包括:
步骤4031:从已经注册的处理器组件registeredModuleHandler中查询到组件;
步骤4032:通过反射创建组件对象module;
步骤4033:从引用所述处理器组件时的组件标签上读取预设的data属性,将其转换为map结构,写入到module的Data属性。检查组件的其他属性,从Data属性中匹配字段,匹配到则用对应字段写入该值;
步骤4034:获取组件的父标签,将其写入到module的Parent属性;
步骤4035:获取组件包含的所有子标签,将其写入到module的Children属性;
步骤4036:调用组件实现的ModuleHandler接口中的ModuleStart方法,得到字符串类型的结果startContent;
步骤4037:调用组件实现的ModuleHandler接口中的SkipChildren方法;如果方法返回true,则不处理子标签,转到步骤4039;如果方法返回false,则处理子标签,转到步骤4038;
步骤4038:将module的Data属性合并入子标签的data属性,data中已经存在的字段不做合并,继续执行步骤4039;
步骤4039:采用Go协程处理子标签,将得到的结果写入到module的Children属性,覆盖之前的值;转到步骤40310;
步骤40310:调用组件实现的ModuleHandler接口中的ModuleEnd方法,得到字符串类型的结果endContent;
步骤40311:合并startContent、Children、endContent三者,作为当前处理器组件的编译结果返回;
如此,处理器组件处理完毕。
步骤404:根据组件包名获得完整组件包路径,查找组件包路径下是否存在名为“组件名.gml”的模板组件文件。如果找到,转到步骤405;否则执行步骤407;
步骤405:启动一个Go协程,编译模板组件文件,获得处理结果,该步骤后面详细说明。完成后转到步骤406;
这里,模板组件的处理步骤可以包括:
获取所述模板组件标签预设的data属性;将所述预设的data属性合并到所述模板组件对应的的各引用组件的data属性中;采用协程对所述模板组件对应的各引用组件进行并发编译;将所述模板组件对应的各引用组件的编译结果,确定为所述模板组件的编译结果;
具体的,引用的模板组件的编译流程可以如图6所示:
步骤4051:读取模板组件文件内容,按行依次存储在字符串切片moduleContent里;
步骤4052:检查模板组件文件是否有错误,步骤参见图2。如果发现了错误,转到步骤40510;如果通过检查,继续步骤4053;
步骤4053:从组件标签上读取data属性,将其转换为map结构,存入变量defaultData;
步骤4054:遍历组件内数据填充标记,用defaultData里的字段进行替换,若找不到对应字段,则填空值;
步骤4055:从moduleContent中依次读取页面组件所属组件包和引用的组件包,得到当前使用组件文件内可能依赖的所有组件,将组件名存入名为dependentModules的map结构中。本包的组件名记为“this.组件名”,引用的组件包的为“包名.组件名”;
步骤4056:依次读取剩余的行,用标签名到dependentModules中匹配组件,如果匹配到,存入名为needProcessModules的map结构中;
步骤4057:将defaultData合并入needProcessModules中的每个组件标签的data属性,data中已经存在的字段不做合并;
步骤4058:依次处理needProcessModules中的组件,针对每个组件,启动一个Go协程进行编译,得到各个组件的编译结果HTML;
步骤4059:汇总各个依赖组件的编译结果HTML,即得到模板组件最终的HTML;
步骤40510:提示模板组件文件检查错误,给出详细错误信息;
如此,模板组件的编译流程完成。
步骤406:记录处理日志,返回处理结果;
步骤407:提示没有找到组件的错误;
最后,页面组件对应的各个引用组件,用各自的编译结果HTML替换,得到页面组件最终的HTML文件,即完成的页面组件对应的Web界面的构造。
在实际应用中,组件设置模块71、组件确定模块72、组件处理模块73和组件校验模块74均可以由电脑或移动终端等设备中的中央处理器(CPU)、微处理器(MPU)、数字信号处理器(DSP)、或现场可编程门阵列(FPGA)等实现。
以上所述,仅为本发明的最佳实施例而已,并非用于限定本发明的保护范围,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。

Claims (12)

1.一种界面构造方法,其特征在于,预设界面中各个功能需求分别对应的组件,并预设组件间的引用关系;所述方法还包括:
根据当前使用组件确定所述当前使用组件对应的各引用组件;
采用协程对所述各引用组件进行并发编译,并将对各引用组件的编译结果合并为当前使用组件的编译结果,将所述当前使用组件的编译结果确定为所述当前使用组件对应的界面。
2.根据权利要求1所述的方法,其特征在于,所述预设界面中各个功能需求对应的组件,包括:
预设模板组件、和/或处理器组件;其中,
所述模板组件采用超文本标记语言HTML设置,并采用基于组件包的组件复用方式;所述模板组件包括:页面组件;
所述处理器组件采用Go语言设置,并实现各引用组件语法的接口及基础结构。
3.根据权利要求2所述的方法,其特征在于,所述根据当前使用组件确定所述当前使用对应的各引用组件,包括:
确定预设的当前使用组件所属的组件包和引用的组件包;
根据预设的所述各引用组件的标签,在当前使用组件所属的组件包和引用的组件包中,确定所述各引用组件的标签对应的组件。
4.根据权利要求3所述的方法,其特征在于,所述对所述各引用组件进行并发编译包括:
采用第一处理方法编译所述模板组件,采用第二处理方法编译所述处理器组件;
所述第一处理方法包括:
获取所述模板组件标签预设的数据data属性;
将所述预设的data属性合并到所述模板组件对应的各引用组件的data属性中;
采用协程对所述模板组件对应的各引用组件进行并发编译;
将所述模板组件对应的各引用组件的编译结果,确定为所述模板组件的编译结果;
所述第二处理方法包括:
采用反射创建所述处理器组件的对象模组;
获取所述处理器组件标签预设的data属性;
将所述模板组件标签预设的data属性、和/或父标签、和/或各子标签分别写入到所述对象模组的Data属性、和/或父属性、和/或子属性中;
根据预设子标签选择处理规则确定是否处理所述各子标签,如果处理子标签,则将所述对象模组的Data属性合并入子标签data属性;
采用协程对各所述子标签进行并发编译,并将所述子标签处理结果写入到所述对象模组的子属性中;
分别采用预设模组开始处理方法和结束处理方法处理所述对象模组,获取开始内容和结束内容;
将所述开始内容、和/或子属性、和/或结束内容确定为所述处理器组件的处理结果。
5.根据权利要求1至4任一项所述的方法,其特征在于,所述采用协程对所述各引用组件进行并发编译,包括:采用Go协程对所述各引用组件进行并发编译。
6.根据权利要求1至4任一项所述的方法,其特征在于,所述方法还包括对各组件进行语法检查;
所述语法检查包括:确定当前使用组件的引用组件的标签是否包括在当前使用组件所属的组件包和引用的组件包中,未包括在当前使用组件所属的组件包和引用的组件包中时,提供报错信息。
7.一种界面构造装置,其特征在于,所述装置包括:组件设置模块、组件确定模块和组件处理模块;其中,
所述组件设置模块,用于预设界面中各个功能需求分别对应的组件,并预设组件间的应用关系;
所述组件确定模块,用于根据当前使用组件,确定所述当前使用组件对应的各引用组件;
所述组件处理模块,用于采用协程对所述各引用组件进行并发编译,并将各编译结果合并为当前使用组件的编译结果,将所述当前使用组件的编译结果确定为所述当前使用组件对应的界面。
8.根据权利要求7所述的装置,其特征在于,所述组件设置模块,具体用于:
预设模板组件、和/或处理器组件;其中,
所述模板组件采用HTML设置,并采用基于组件包的组件复用方式;所述模板组件包括:页面组件。
所述处理器组件采用Go语言设置,并实现提供各引用组件的语法接口及基础结构。
9.根据权利要求8所述的装置,其特征在于,所述组件确定模块,具体用于:
确定预设的当前使用组件所属的组件包和引用的组件包;
根据预设的所述各引用组件的标签,在当前使用组件所属的组件包和引用的组件包中,确定所述各引用组件的标签对应的组件。
10.根据权利要求9所述的装置,其特征在于,所述组件处理模块,具体用于:
采用第一处理方法编译模板组件,采用第二处理方法编译处理器组件;
所述第一处理方法包括:
获取所述模板组件标签预设的data属性;
将所述预设的data属性合并到所述模板组件对应的各引用组件的data属性中;
采用协程对所述模板组件对应的各引用组件进行并发编译;
将所述模板组件对应的各引用组的编译结果,确定为所述模板组件的编译结果;
所述第二处理方法包括:
采用反射创建所述处理器组件的对象模组;
获取所述处理器组件标签预设的data属性;
将所述模板组件标签预设的data属性、和/或父标签、和/或各子标签分别写入到所述对象模组的Data属性、和/或父属性、和/或子属性中;
根据预设子标签选择处理规则确定是否处理所述各子标签,如果处理子标签,则将所述对象模组的Data属性合并入子标签data属性;
采用协程对所述各子标签进行并发编译,并将所述子标签编译结果写入到所述对象模组的子属性中;
分别采用预设模组开始处理方法和结束处理方法处理所述对象模组,获取开始内容和结束内容;
将所述开始内容、和/或子属性、和/或结束内容确定为所述处理器组件的编译结果。
11.根据权利要求7至10任一项所述的装置,其特征在于,所述组件处理模块,具体用于:采用Go协程并发对所述各引用的组件进行编译。
12.根据权利要求7至10任一项所述的装置,其特征在于,所述装置还包括组件校验装置,用于对各组件进行语法检查;
所述语法检查包括:确定当前使用组件的引用组件的标签是否包括在当前使用组件所属的组件包和引用的组件包中,未包括在当前使用组件所属的组件包和引用的组件包中时,提供报错信息。
CN201710266662.7A 2017-04-21 2017-04-21 一种界面构造方法和装置 Active CN108733353B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201710266662.7A CN108733353B (zh) 2017-04-21 2017-04-21 一种界面构造方法和装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201710266662.7A CN108733353B (zh) 2017-04-21 2017-04-21 一种界面构造方法和装置

Publications (2)

Publication Number Publication Date
CN108733353A true CN108733353A (zh) 2018-11-02
CN108733353B CN108733353B (zh) 2023-08-08

Family

ID=63933547

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201710266662.7A Active CN108733353B (zh) 2017-04-21 2017-04-21 一种界面构造方法和装置

Country Status (1)

Country Link
CN (1) CN108733353B (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110221824A (zh) * 2019-06-03 2019-09-10 精硕科技(北京)股份有限公司 组件的生成方法和装置

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102158516A (zh) * 2010-08-19 2011-08-17 华为技术有限公司 服务组合实现方法及系统、服务组合编译方法及编译器
KR20140000373A (ko) * 2012-06-22 2014-01-03 에스코어 주식회사 컴파일된 자바스크립트 코드를 이용한 웹 페이지 표시 방법 및 장치
CN104750476A (zh) * 2013-12-31 2015-07-01 达索系统美洲公司 用于解决分层引用的数据中的冲突的方法和系统
CN106569835A (zh) * 2016-11-14 2017-04-19 济南浪潮高新科技投资发展有限公司 一种基于go语言控制反转组件的实现方法

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102158516A (zh) * 2010-08-19 2011-08-17 华为技术有限公司 服务组合实现方法及系统、服务组合编译方法及编译器
KR20140000373A (ko) * 2012-06-22 2014-01-03 에스코어 주식회사 컴파일된 자바스크립트 코드를 이용한 웹 페이지 표시 방법 및 장치
CN104750476A (zh) * 2013-12-31 2015-07-01 达索系统美洲公司 用于解决分层引用的数据中的冲突的方法和系统
CN106569835A (zh) * 2016-11-14 2017-04-19 济南浪潮高新科技投资发展有限公司 一种基于go语言控制反转组件的实现方法

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
JUNJIE: "Go语言并发技术详解", 《脚本之家,HTTPS://WWW.JB51.NET/ARTICLE/56814.HTM》 *
思月行云: "Go在谷歌:以软件工程为目的的语言设计", 《CSDN博客,HTTPS://BLOG.CSDN.NET/KENKAO/ARTICLE/DETAILS/52468695》 *

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110221824A (zh) * 2019-06-03 2019-09-10 精硕科技(北京)股份有限公司 组件的生成方法和装置
CN110221824B (zh) * 2019-06-03 2024-03-22 北京秒针人工智能科技有限公司 组件的生成方法和装置

Also Published As

Publication number Publication date
CN108733353B (zh) 2023-08-08

Similar Documents

Publication Publication Date Title
EP3433732B1 (en) Converting visual diagrams into code
Marrs JSON at work: practical data integration for the web
CN104156307B (zh) 一种浏览器兼容性检测方法和系统
US20020162093A1 (en) Internationalization compiler and process for localizing server applications
CN108228166A (zh) 一种基于模板的后端代码生成方法及系统
US20080109780A1 (en) Method of and apparatus for optimal placement and validation of i/o blocks within an asic
US20100223214A1 (en) Automatic extraction using machine learning based robust structural extractors
CN105095067A (zh) 用户界面元素对象识别及自动化测试的方法和装置
CN107025676A (zh) 一种图片模板以及图片的生成方法及相关装置
CN106843878B (zh) 一种模型生成方法和系统
CN113051285A (zh) Sql语句的转换方法、系统、设备及存储介质
CN107506190A (zh) 基于Spring框架的XML文件修改方法及装置
CN113312108B (zh) Swift报文的校验方法、装置、电子设备及存储介质
CN112420145A (zh) 电子病历文书数据处理方法、装置及计算机可读存储介质
CN110109681A (zh) 不同平台间代码的转换方法及系统
CN111159016A (zh) 一种规范检测方法及装置
CN107179983A (zh) 用户界面测试结果的校验方法及装置
US20190147104A1 (en) Method and apparatus for constructing artificial intelligence application
CN115113927A (zh) 寄存器模型处理方法、装置、计算机设备和存储介质
CN107368500A (zh) 数据抽取方法及系统
US8862976B1 (en) Methods and systems for diagnosing document formatting errors
CN108733353A (zh) 一种界面构造方法和装置
US9984051B2 (en) Hierarchical identifiers for HTML elements
CN106775914B (zh) 一种自动生成键值的代码国际化方法及装置
CN109636619A (zh) 量化平台的回测方法、装置、电子设备和可读介质

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant