本文正在参与技术专题征文Node.js进阶之路,点击查看详情
概要
我的本系列第一篇文章 表单配置 实现了在低代码平台上配置简单表单(目前支持文本输入、文本域、数字输入、日期输入、下拉选择组件),并提供了把数据传输到指定接口的能力
我的本系列第二篇文章列表页配置及预览 实现了在低代码平台配置列表页的能力,可以调用指定接口把数据拉取到前端并展示
本文作为系列的第三篇文章,理所当然要实现数据的落库和查找功能,从而把前面的功能串联起来。本文会从两个方面来讲述如何实现一个服务器,提供数据落库和数据查找能力。
在我的设计中,每个使用低代码平台实现的业务都需要后端对应实现接口,建对应的业务数据表实现落地。为每个业务单独开发接口和数据表的目的是提供更高的逻辑自由度,并且优化数据库性能时可以有更强的针对性
服务器开发
服务器框架选型
我是一个前端,那么后端的语言很容易就确定使用nodejs了。nodejs的服务器框架的选项很多,一番调研后我决定在egg和nest中选一个
- egg与express koa一脉相承,支持es6和es7的新语法,具有丰富的中文文档
- nest
最后决定使用egg,因为nest涉及注解,我写过spring我知道使用注解需要理解成本,而我开发服务器仅仅是为了辅助低代码平台的呈现,因此选择了入门成本更低的egg。
数据库
说到服务器,那么一定需要考虑数据库,我使用的是mysql,并且使用docker的方式部署,好处是免去了非常多的数据库安装部署工作,但是不能直接操作数据库,需要进入docker容器内操作mysql,用到命令docker exec -it 数据库镜像实例名 bash
我一共建了三张表
由于接下来打算开放低代码平台给大家体验,并且初步准备使用github作为第三方登录渠道,developer表用于存储访问低代码平台的用户信息
低代码平台用户信息表 rango-low-code-server/scripts/sql/developer.sql
create table developer (
developer_id varchar(32) not null,
display_name varchar(32),
name varchar(32),
photo varchar(512),
provider char(4),
updated_time timestamp default CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
created_time timestamp default current_timestamp,
primary key (developer_id)
);
在构思中,后面会提供DSL复用的功能,因此计划提供DSL的保存功能
DSL存储表,用于保存DSL rango-low-code-server/scripts/sql/config.sql
create table page_cfg (
id MEDIUMINT NOT NULL AUTO_INCREMENT,
dsl text not null,
usr_tkn char(32) not null,
template_name varchar(64) not null,
updated_time timestamp default CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
created_time timestamp default current_timestamp,
primary key (id)
)
此外还建了一张表,也就是低代码平台的业务数据表,仅作为功能展示用
业务数据表,用于存储表单提交的数据rango-low-code-server/scripts/sql/business/user.sql
create table user_tab (
id MEDIUMINT NOT NULL AUTO_INCREMENT,
name text not null,
age int not null,
sex char(1) not null,
birthdate date not null,
remarks text not null,
updated_time timestamp default CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
created_time timestamp default current_timestamp,
primary key (id)
);
业务代码
目前提供了对业务数据表user的新增和列表查询,使用的是egg中mysql功能
构建配置
由于服务器的源码会开源,因此数据库密码等配置不可以写在源码之中,而是在构建时通过命令行输入,这里用到了开源库 yargs
目前提供了几个启动选项
dbHost 数据库的服务器ip或域名,对应egg配置中的mysql.client.host
dbPort 数据库端口,对应egg配置中的mysql.client.port
dbUser: 数据库用户,对应egg配置中的mysql.client.user
dbName: 数据库名,对应egg配置中的mysql.client.database
dbPassword: 数据库密码,对应egg配置中的mysql.client.password
githubKey: github oauth应用的key,对应egg配置中的passportGithub.key,
githubSecret: github oauth应用的秘钥,对应egg配置中的passportGithub.secret,
服务器具体的启动命令如下,本地启动时可以自行替换
npx egg-scripts start --daemon --title=egg-server-rango-low-code-server --dbHost=数据库服务器ip --dbPort=数据库端口 --dbUser=数据库用户名 --dbName=数据库名 --dbPassword=数据库密码 --githubKey=github oauth的key --githubSecret=github oauth的秘钥
服务器部署
既然前后端工程是分开的,为了避免跨域的问题,我这里采用的是nginx反向代理的方式来部署服务器。如下图所示,所有的请求都先发到nginx,再由nginx转发到egg服务器或者
服务器构建
目前服务器上的构建我简单为前后端工程各写了一个shell脚本来完成构建
前端的构建脚本
rm -rf ./rango-low-code
git clone git@github.com:Rangocold/rango-low-code.git
cd ./rango-low-code
npm install
npm run build
后端的构建脚本
rm -rf ./rango-low-code-server
git clone git@github.com:Rangocold/rango-low-code-server.git
cd rango-low-code-server
npm install
npx egg-scripts start --daemon --title=egg-server-rango-low-code-server --dbHost=数据库服务器ip --dbPort=数据库端口 --dbUser=数据库用户名 --dbName=数据库名 --dbPassword=数据库密码 --githubKey=github oauth的key --githubSecret=github oauth的秘钥
目前没有联动github实现更智能化的持续构建,只能每次推送代码后,到服务器去自己跑一下构建的脚本,后面可以考虑做成自动化发布
nginx
nginx对前端工程的代理为文件代理,所有没有命中其他规则的请求nginx都会去目标文件夹下寻找
location / {root /文件绝对路径/rango-low-code/dist/;}
nginx对后端工程的代理为借口代理
location /rango-low-code-server/ {
proxy_pass http://localhost:7001/rango-low-code-server/;
}
值得一提的是,使用nginx代理的时候,要注意nginx.conf中的user配置,一定要配置有权限访问前端文件夹的用户,否则请求时会报403