今天在无聊的时候偶然发现了 Strapi 这个框架,能够帮助你不写一行代码实现基本的增删改查接口。这正是我一直在寻找的东西。Spring Boot 即使使用 Mybatis Generator 也还是比较笨重,对于一些简单的个人项目,仅仅是两三张表,关系也比较简单,操作也不外乎 CRUD,这正是 Strapi 的最佳应用场景。

以前我的做法是从一个模板项目克隆一个,包含基础的项目骨架,再设计和创建数据库表,然后使用 Mybatis Generator 生成基础的 CRUD 代码,再发布到 Gitlab 服务器,在 Jenkins 上创建任务,最终将项目部署在 Docker 容器中运行。不可不谓之繁琐。

Strapi 的安装坑还是挺多的,我按照官方文档安装的过程中就遇到了 Node 和 npm 版本、镜像下载网络问题、Webpack 打包问题等等,最后放弃了 CLI 安装的形式,使用 Docker 安装,但是 Docker 安装也会有依赖下不下来的问题,因为是服务器,也懒得去搭梯子了,索性直接使用香港主机做测试。最后的最后,终于安装成功了。

首先是通过域名访问。在 Docker 容器中执行的指令是 npm run start 默认监听在服务器的 1337 端口,我们需要配置 Nginx 代理到该端口实现域名访问,配置如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
upstream strapi {
server 127.0.0.1:1337;
}

server {
server_name api.omgxy.com;
#charset koi8-r;

location / {
proxy_pass http://strapi;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_pass_request_headers on;
}

# ...
}

通过 certbot 创建好 https 证书后,浏览器中输入 https://api.omgxy.com/admin 打开管理面板,创建初始的管理员用户。

在 Strapi 中,可以通过创建 Content Type 来定义表的结构,包含哪些字段,字段的类型,和其它表的参照关系等等。基本上稍微画一下 ER 图就能直接操作了。

如下图我定义了两张表,一张 Category 存储分类,一张 Favorite 存储收藏的网站。

每个网站有多个分类,每个分类也可能包含多个网站,用 N-N 定义这两张表的关联关系。

这样我就可以在页面上对 Favorite 表进行新增、修改、删除、查看列表等操作。

还可以安装 Swagger 插件方便地查看自动生成的 Restful API

这个小项目之前使用 Spring Boot 写的服务端,通过 Strapi 简单操作生成的 API 完全满足之前项目的需求,于是我在 Vue 项目中将几个接口进行了替换,包括登录(需要先创建用户,再给对应 API 赋予权限)、查询分类列表、查询某分类下的项目列表等,完美切换。

总结下来,Strapi 在个人或小型项目中确实是一件解放生产力的工具,可以有效降低开发成本。而对于大型工程或者复杂的业务场景来说,Strapi 显然就不是一个选择了,其无法应对复杂性,我认为复杂性也不是它需要做的事情。