具体实施方式
为使本发明的上述目的、特征和优点能够更加明显易懂,下面结合说明书附图对本发明的具体实施方式做详细的说明。
在下面的描述中阐述了很多具体细节以便于充分理解本发明,但是本发明还可以采用其他不同于在此描述的其它方式来实施,本领域技术人员可以在不违背本发明内涵的情况下做类似推广,因此本发明不受下面公开的具体实施例的限制。
其次,此处所称的“一个实施例”或“实施例”是指可包含于本发明至少一个实现方式中的特定特征、结构或特性。在本说明书中不同地方出现的“在一个实施例中”并非均指同一个实施例,也不是单独的或选择性的与其他实施例互相排斥的实施例。
本发明结合示意图进行详细描述,在详述本发明实施例时,为便于说明,表示器件结构的剖面图会不依一般比例作局部放大,而且所述示意图只是示例,其在此不应限制本发明保护的范围。此外,在实际制作中应包含长度、宽度及深度的三维空间尺寸。
同时在本发明的描述中,需要说明的是,术语中的“上、下、内和外”等指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述本发明和简化描述,而不是指示或暗示所指的装置或元件必须具有特定的方位、以特定的方位构造和操作,因此不能理解为对本发明的限制。此外,术语“第一、第二或第三”仅用于描述目的,而不能理解为指示或暗示相对重要性。
本发明中除非另有明确的规定和限定,术语“安装、相连、连接”应做广义理解,例如:可以是固定连接、可拆卸连接或一体式连接;同样可以是机械连接、电连接或直接连接,也可以通过中间媒介间接相连,也可以是两个元件内部的连通。对于本领域的普通技术人员而言,可以具体情况理解上述术语在本发明中的具体含义。
实施例1
参照图1,一种自动化搭建代码框架的方法,包括以下步骤,组件选型,在包管理工具官网对各组件下载量和维护情况的进行评估,选择组件;组件配置,将所述选择的组件配置到开发环境中;模型定义,使用可扩展标记语言定义数据模型;脚本生成,根据数据模型生成脚本;代码框架生成,基于选择的组件生成脚本的代码框架;执行代码框架脚本,快速生成整体代码结构。
在组件选型时,需要在NPM官网进行下载量和维护情况的评估。通常情况下,一些第三方机构会基于某个功能点发布一些官方组件,这些组件有一部分已经相当成熟且流行,例如Express,Sequelize等,它们都有自己的官方网站和完整的学习教程,便于开发人员学习使用,并长期处于维护中,这些组件可以说是靠谱的组件。除此以外,也不乏一些不知名组织或者团体开发的组件,例如node-schedule,这些组件有较高的知名度,下载量巨大,用户众多,可在网上找到大量的示例,也是较为靠谱的组件。所以,官方的、知名度较高的、下载量较大的且持续维护的组件,可作为选型组件。
Express是一个简洁而灵活的node.js Web应用框架,提供一系列强大特性帮助你创建各种Web应用。Express不对node.js已有的特性进行二次抽象,我们只是在它之上扩展了Web应用所需的功能。丰富的HTTP工具以及来自Connect框架的中间件随取随用,创建强健、友好的API变得快速又简单。
Sequelize是一个基于promise的关系型数据库Node.js ORM框架,当前支持MySQL、SQLite、PostgreSQL、Sql Server等数据库,它具有可靠的事务支持,关系,读取复制等功能。
Node Schedule是一个Node.js的灵活的类似cron又不类似的任务调度库.它允许你调度任务(任意函数)在特殊的日期执行,并循环执行。他只在在任何给定的时间里使用一个定时器(而不是每隔一秒/一分钟来重新判断将要执行的任务)。
在组件配置时,只需把上述评估合格的组件都添加上,即可完成组件配置,操作简单,例如代码为:
npm install express
npm install sequelize
npm install log4js
npm install node-schedule
分别将NPM中的Express,Sequelize,logjs,node-schedule组件配置到了开发环境中。
模型定义必须用可扩展标记语言定义数据模型,可扩展标记语言,标准通用标记语言的子集,简称XML,是一种用于标记电子文件使其具有结构性的标记语言。在电子计算机中,标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种的信息比如文章等。它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。它非常适合万维网传输,提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。可扩展标记语言与Access,Oracle和SQL Server等数据库不同,数据库提供了更强有力的数据存储和分析能力,例如:数据索引、排序、查找、相关一致性等,可扩展标记语言仅仅是存储数据。事实上它与其他数据表现形式最大的不同是:可扩展标记语言极其简单,这是一个看上去有点琐细的优点,但正是这点使它与众不同。
下面讲述如何进行数据模型定义:
表定义:<table name=“user”description=“用户表”>
表关联集合:<associations>
表关联:<association>
关联起始:<from>user</from>
关联结束:<to>card</to>
关联类型:<type>1</type>
外键:<foreignKey>userId</foreignKey>
在表定义时,还需要定义表的相关属性,如表的名称、表的类型,并且,表节点表示为:</table>,关联项节点表示为:</association>和</associations>。
脚本生成的逻辑或称为脚本逻辑为:
解析XML文件中的每个节点,
若节点为table,则根据attribute的name及其它属性在模型对象关系映射文件(Orm.js)中添加一个模型;
若节点为asscoiation,则根据type生成from和to的关联关系。
脚本目标为:table和asscoiation关系生成一下内容:
基本的框架文件,框架文件包括App.js,package.json,middleware等,其中,app.js作为项目的入口文件,用于创建应用程序对象;每个项目的根目录下面,一般都有一个package.json文件,定义了这个项目所需要的各种模块,以及项目的配置信息(比如名称、版本、许可证等元数据)。npm install命令根据这个配置文件,自动下载所需的模块,也就是配置项目所需的运行和开发环境。
下面是一个最简单的package.json文件,只定义两项元数据:项目名称和项目版本。
package.json文件就是一个JSON对象,该对象的每一个成员就是当前项目的一项设置。比如name就是项目名称,version是版本(遵守“大版本.次要版本.小版本”的格式)。
middleware是中间件文件,中间件是一种独立的***软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源。中间件位于客户机/服务器的操作***之上,管理计算资源和网络通讯。是连接两个独立应用程序或独立***的软件。相连接的***,即使它们具有不同的接口,但通过中间件相互之间仍能交换信息。执行中间件的一个关键途径是信息传递。通过中间件,应用程序可以工作于多平台或OS环境。
数据交互层文件,名称为Orm.js,其是基于Sequelize的代码数据交互层代码结构,该文件包含Sequelize组件需要的每个表结构的模型定义及关联关系定义;服务器端的Orm主要是对与数据库交互的接口进行封装并提供出更加友好易用的接口,让使用框架的上层应用不需要关心与数据库交互的具体细节。
模型的数据访问对象层文件,主要包括userDao.js,并包含基础的增删改查功能代码;数据访问层叫dao层,全称为data access object,属于一种比较底层,比较基础的操作,具体到对于某个表、某个实体的增删改查,也就是说某个Dao一定是和数据库的某一张表一一对应的,其中封装了增删改查基本操作。
在userDao中,就对user这个实体的增删补查各类基本的操作进行了声明,其代码如下:
1 public interface UserDao{
2
3 public List<User>findAll();
4
5 public User findById(String id);
6
7 public void update(User user);
8
9 public void add(User user);
10
11 public void delete(String id);
12
13 public User findByIdAndPassword(@Param("id")String username,@Param("password")String password);
14
15 public void updatePassword(@Param("userId")String id,@Param("password")String password);
16
17 User findByUsername(String username);
18}
以下为userdao基础的增删改查功能代码:
1<select id="findAll"resultMap="user_map">
2 SELECT*FROM user WHERE user_id!='admin'
3</select>
4
5<select id="findById"parameterType="String"resultMap="user_map">6SELECT*FROM user WHERE user_id=#{value}
7</select>
8
9<update id="update"parameterType="User">
10 UPDATE user SET password=#{password},authority=#{authority}WHEREuser_id=#{userId}
11</update>
12
13<update id="updatePassword"parameterType="map">
14 UPDATE user SET password=#{password}WHERE user_id=#{userId}
15</update>
16
17<insert id="add"parameterType="User">
18 INSERT INTO user(user_id,password,salt,role_ids,locked)VALUES(#{userId},#{password},#{salt},#{roleIdsStr},#{locked})
19</insert>
20
21<select id="findByIdAndPassword"parameterType="map"resultMap="user_map">
22 SELECT*FROM user WHERE user_id=#{id}AND password=#{password}
23</select>
模型的服务层文件,主要包括userSerivce.js,并包含对该文件的基本说明,服务层叫Service层,被称为服务,粗略的理解就是对一个或多个Dao进行的再次封装,封装成一个服务。
模型的路由层文件,主要包括userRoute.js,并包含对该文件的基本说明。
需要说明的是,上述的基本的框架文件、数据交互层文件、模型的数据访问对象层文件、模型的服务层文件、模型的路由层文件都是根据脚本逻辑自动生成的,相关的功能代码无需开发人员编写。
基于Express,Sequelize,log4js等组件生成代码基础框架,生成5个文件夹,数据对象访问文件夹(dao)、服务文件夹(service)、中间件文件夹(middleware)、路由文件夹(route)、公用文件夹(common)。
各文件夹包含的内容有:
dao文件夹包括Orm.js(模型对象关系映射文件),UserDao.js(用户数据对象访问文件)和CardDao.js(信息数据对象访问文件),和基础的增删改查代码;
service文件夹包括UserService.js(用户服务文件)和CardService.js(信息服务文件);
middleware文件夹包括Authentication.js(鉴权),ErrorHandler(统一异常处理)及Access.js(请求日志打印)等;鉴权是指验证用户是否拥有访问***的权利
route文件夹包括UserRoute.js(用户路由文件)和CardRoute.js(信息路由文件);
common文件夹包括ServiceResult.js(服务结果文件)用于service的函数输出封装函数。
进一步地,该自动化搭建代码框架框架的方法还包括步骤:二次组件配置,开发人员在开发调试过程中若发现缺少该项目所需要的相关组件,在调试时会被检测出来,这时需要进行第二次组件配置,其操作和第一次组件配置的方法相同。如再增加一种响应错误组件:npm install http-errors。
下面以某开发人员第一次搭建代码框架为例详细说明其过程:
S101:根据组件下载量和维护情况的评估,选择合乎标准的组件,作为选型组件;
S102:将所有符合标准的组件全部键入(安装)到开发环境中,进行组件配置,如Express,Sequelize,log4js,http-errors等。
S103:使用XML结构定义数据模型,例如定义了2个表,表的属性及其关联关系:
<table name=”user”description=“用户表”>//表定义
<attribute name=”id”primaryKey=”true”type=”bigint”autoIncreasment=”true”description=“主键id”/>
<attribute name=”name”type=”string”description=“名称”/>
</table>
<table name=”card”description=“用户表”>//表定义
<attribute name=”id”primaryKey=”true”type=”bigint”autoIncreasment=”true”description=“主键id”/>
<attribute name=”userId”type=”bigint”description=“用户id”/>
<attribute name=”cardNo”type=”string”description=“***”/>
</table>
<associations>//表关联集合
<association>//表关联
<from>user</from>//关联起始
<to>card</to>//关联结束
<type>1</type>//关联类型
<foreignKey>userId</foreignKey>//外键
</association>
</associations>
S104:根据数据模型和脚本逻辑生成以下内容:基本的框架文件,例如App.js,package.json,middleware等;Orm.js文件,该文件包含Sequelize组件需要的每个表结构的模型定义及关联关系定义;模型的dao层文件,例如:userDao.js,并包含基础的增删改查功能;模型的service层文件,例如:userSerivce.js,并包含基本的说明;模型的route层文件,例如:userRoute.js,并包含基本的说明。
S105:根据脚本文件,基于各组件生成代码基础框架,生成几个文件夹:dao、service、middleware、route、common。每个文件夹内包含内容有:
dao:Orm.js,UserDao.js和CardDao.js,且基于Sequelize生成基础的增删改查代码;
service:UserService.js和CardService.js,引用必要的导入函数;
middleware:路由中间件,包含Authentication.js(鉴权),ErrorHandler(统一异常处理)及Access.js(请求日志打印)等;
route:UserRoute.js和CardRoute.js,引用必要的导入函数;
common:ServiceResult.js用于service的函数输出封装函数.
S106:执行代码框架脚本,快速生成整体代码结构,开始进行开发。
实施例2
参照图2,一种自动化搭建代码框架的***,包括组件配置模块100、模型定义模块200、脚本生成模块300、框架生成模块400,组件配置模块10用于将组件配置到开发环境中,这里开发环境指Node.js;模型定义模块200用于定义数据模型,脚本生成模块300根据数据模型用于生成脚本,框架生成模块400用于生成脚本的代码框架。
本实施例中,组件配置模块100、模型定义模块200、脚本生成模块300、框架生成模块400其实质都为不同的软件或程序。模型定义模块200进行表定义、表关联集合、表关联、关联起始、关联结束、关联类型和外键,需要说明的是,定义表的数量至少为2。该***是基于Node.js开发环境,通过脚本的方式,进行代码框架的快速搭建。
组件配置模块100配置好组件后,模型定义模块200定义数据模型,并根据项目需要定义表的数量,脚本生成模块300根据数据模型和脚本逻辑自动生成脚本文件,框架生成模块400基于各组件自动生成脚本的代码框架,执行代码框架脚本,生成整体代码结构,执行完毕后,开发人员便可进行开发。
需要说明的是,开发人员在后期开发过程中,若发现还缺少相关或必要的组件,则需要在组件配置模块100中再次添加相应的或所需要的组件即可。
当开发一个新项目时,在原有的开发环境中,新建一个项目或工程,然后利用模型定义模块200重新定义数据模型,脚本生成模块300自动生成脚本,框架生成模块400生成代码框架后,执行代码框架后,开发人员即可进行新的项目开发,此过程将极大节约开发人员的时间。
将本发明提供的方案与传统的使用Jave平台搭建和使用PHP平台搭建所用的时间进行对比,在开发人员熟练度基本相同的条件下,对相同的项目用不同的方式进行代码框架的搭建,得到的结果如表1所示:其中,表的数量表示搭建一个代码框架,其***后台中所含有的表的数量。表的数量反映了项目的复杂程度和工程的大小,即表的数量越多,该项目越复杂,工程较大。
表的数量 |
2 |
4 |
8 |
16 |
25 |
30 |
40 |
50 |
60 |
本方案/min |
10 |
18 |
26 |
35 |
50 |
60 |
76 |
89 |
112 |
Jave/min |
116 |
160 |
225 |
290 |
385 |
486 |
538 |
565 |
592 |
PHP/min |
54 |
82 |
114 |
150 |
210 |
295 |
406 |
495 |
585 |
表1本发明提供的方案和Jave、PHP搭建时间的对比
从表1中可以看出,本发明所提供的方案搭建框架所节省的时间相比在Jave平台和PHP平台搭建都会节省大量的时间,且表的数量越多,所节约的时间也越多。因此,可以极大减少开发人员的工作量,减轻开发人员的工作负担。
图3为表1对应生成的折线图,横坐标表示表的数量,纵坐标表示搭建框架的时间,从图中更易看出随着表的数量增多,使用Jave和PHP搭建所用的时间相比于本方案越来越多,本方案的优势就越明显。
需要说明的是,一般来说,开发一个项目,其表的数量在30—60之间,本方案的优势较为明显,但当项目过大,表的数量达到几百甚至上千时,仍推荐使用Jave来搭建,或者将该项目进行拆分,使用本方案,但此时拆分的过程较为繁琐,且耗时。
重要的是,应注意,在多个不同示例性实施方案中示出的本申请的构造和布置仅是例示性的。尽管在此公开内容中仅详细描述了几个实施方案,但参阅此公开内容的人员应容易理解,在实质上不偏离该申请中所描述的主题的新颖教导和优点的前提下,许多改型是可能的(例如,各种元件的尺寸、尺度、结构、形状和比例、以及参数值(例如,温度、压力等)、安装布置、材料的使用、颜色、定向的变化等)。例如,示出为整体成形的元件可以由多个部分或元件构成,元件的位置可被倒置或以其它方式改变,并且分立元件的性质或数目或位置可被更改或改变。因此,所有这样的改型旨在被包含在本发明的范围内。可以根据替代的实施方案改变或重新排序任何过程或方法步骤的次序或顺序。在权利要求中,任何“装置加功能”的条款都旨在覆盖在本文中所描述的执行所述功能的结构,且不仅是结构等同而且还是等同结构。在不背离本发明的范围的前提下,可以在示例性实施方案的设计、运行状况和布置中做出其他替换、改型、改变和省略。因此,本发明不限制于特定的实施方案,而是扩展至仍落在所附的权利要求书的范围内的多种改型。
此外,为了提供示例性实施方案的简练描述,可以不描述实际实施方案的所有特征(即,与当前考虑的执行本发明的最佳模式不相关的那些特征,或于实现本发明不相关的那些特征)。
应理解的是,在任何实际实施方式的开发过程中,如在任何工程或设计项目中,可做出大量的具体实施方式决定。这样的开发努力可能是复杂的且耗时的,但对于那些得益于此公开内容的普通技术人员来说,不需要过多实验,所述开发努力将是一个设计、制造和生产的常规工作。
应说明的是,以上实施例仅用以说明本发明的技术方案而非限制,尽管参照较佳实施例对本发明进行了详细说明,本领域的普通技术人员应当理解,可以对本发明的技术方案进行修改或者等同替换,而不脱离本发明技术方案的精神和范围,其均应涵盖在本发明的权利要求范围当中。