官方的描述是
无头的CMS
,听起来很吓人对不对,说的通俗一些,他可以十分简便的进行内容管理,并且暴露对应的接口,让外部调用,文件上传,接口权限,token全部都已经内置了,相比于json-server
或者mock.js
功能上更加强大
自己学习并使用
strapi
的记录,旨在帮助小伙伴们少走弯路
官网永远是你的好伙伴,请收藏!
-
本文并不能代替官方文档,所有的内容也都是基于官方文档+自己尝试的记录。
-
基本所有章节基本都会附上对应的文档链接,强烈建议你点看看看
-
所有结合代码操作的部分,建议自己动手尝试一下
-
如果英文水平和我一样不是很好,善用谷歌的翻译功能:
英文教程:https://www.youtube.com/watch?v=6FnwAbd2SDY
B站链接:https://www.bilibili.com/video/BV1g54y1R7WY?from=search&seid=3286226291596019120
两个视频是相同的,感谢搬运工
官网提供了很多种安装的方式,本文选用了官网提供的第一种方式
CLI
脚手架的方式
确保安装了Node.js,版本不得低于下图
Software | Minimum version |
---|---|
Node.js | 12.x |
npm | 6.x |
用yarn
也可以,如果你还不知道如何使用,可以看看这里,可以理解为第三方的node
包管理工具,facebook
推出,命令和npm
略有不同,但是功能上差别不大。
在你希望创建项目的位置打开终端,执行如下命令,其中my-project
是项目名称,可以根据需求修改:
不要用中文名!
不要用中文名!
不要用中文名!
使用npm
创建
npx create-strapi-app my-project --quickstart
使用yarn
创建
yarn create strapi-app my-project --quickstart
安装需要的时间挺长的,需要下载将近300M的东西,所以这里耐心等待一会
npx
是npm>=5.2
版本之后自动安装的一个全局模块:一个很厉害的模块运行工具,通过它运行模块时:
- 当前目录
node_modules
中有就运行 - 1找不到,就去
PATH
环境变量中找 - 2找不到,就去帮你下载,然后执行
所以有了它之后,我们可以不用安装CLI
,通过npx
直接运行即可:比如
# 创建 react项目
npx create-react-app my-react-app
# 创建 vue项目
npx vue create my-vue-app
创建完毕之后,默认会直接运行项目,自动打开浏览器
除非出现了一些意外情况:
1337
端口被占用- 一般来说这个端口很难被用到,尝试重启一下
- 装包失败
- 如果是这个问题,可以尝试
cd
到创建的目录下my-project
(这里使用了默认的目录),如果你换了项目名用你自己的目录即可 - 装包:
- npm安装:
npm i
- yarn安装:
yarn
- cnpm安装:
cnpm i
- npm安装:
- 如果是这个问题,可以尝试
- 运行项目:
- 保证包安装完毕之后可以通过
npm run develop
运行
- 保证包安装完毕之后可以通过
无论是运行项目,还是手动装包自己运行项目,最终都会打开一个网页:
上一步打开的页面是让你注册一个管理员账号,这个账号拥有最高级的管理权限,不过开发阶段保存的是本地,所以可以根据喜好自行选择用户名
和密码
,邮箱
保证格式正确即可,底部的勾选也不是必须的。
填写好资料之后点击准备开始
,可能要稍微等一会,如果没反应可以尝试多点几次。
我每次新建项目都要点好几次。。。。o(╯□╰)o
看到了如下界面,说明成功了
到目前为止我们好像没有准备任何的数据库对不对,使用--quickstart
模式时,内部会使用SQLite
,我们什么都不用配。
当然,如果想要自己选用其他的数据库就不能不使用--quickstart
这个命令了
因为笔者都是基于sqlite
的来使用的,还没有尝试连接其他的数据库 😢,不过这里附上链接
Strapi 目前支持如下数据库
Database | Minimum version |
---|---|
SQLite | 3 |
PostgreSQL | 10 |
MySQL | 5.6 |
MariaDB | 10.1 |
MongoDB | 3.6 |
本章我们来一起创建数据表,添加字段,在图形化界面管理数据,并且开放接口的访问权限
官网的快速指南和教程操作的表格有两张,并且涉及到关联,略微复杂一些,这里我们先以一张表为例
选择左侧的Content-Type Builder
然后点击中间区域的Create new collection type
在弹出的窗口中输入集合名称
,或者可以称之为表名
右侧的UID
是唯一标记,不需要设置会自动生成
我们这里创建表名article
点击继续
上一步点击继续之后,会弹出如下窗口
如果无意之中关掉了,可以先点击对应的数据表,然后点击右侧的Add another field
新增字段的选项中含义都比较好懂,我们来新建2个字段:
-
标题:
-
内容:
标题和内容添加完毕之后,我们应该会有了2个字段title
和content
确认没问题之后,点击储存
会自动重启,如果没有异常提示,说明创建成功啦
点击左侧的Articles
,然后点击右侧的建立新的Article
在弹出的界面是输入标题和内容,然后点击储存
可以多添加几个,
点击进去之后可以修改数据
注意:
-
测试时,内容区域中文无法添加,但是英文可以
-
一会我们通过接口的方式来操纵,这里不用纠结
strapi
默认会根据数据表帮我们生成一套RESTAPI
我们来测试一下获取数据
在浏览器中新开一个窗口,输入http://localhost:1337/articles
如果你没有修改过端口,那么看到的应该是下图
或者没有换行和缩进的如下文本:
{"statusCode":403,"error":"Forbidden","message":"Forbidden"}
What? 并不是404
,而是403
,接口是存在的,但是我们不允许访问咋办呢?
strapi
默认的内容是受权限限制的,咱们接下来开放访问的权限:
- 点击
身份与权限
- 点击
public
右侧的编辑图标
- 确保选择的是
Article
- 勾选下方的
find
- 点击右上角的
储存
- 再次回到之前的页面
http://localhost:1337/articles
- 刷新应该就可以看到如下的内容了
- 这里是我的内容,你的内容应该和我的不太一样
- 当然,这不是问题
[
{
"id": 1,
"title": "这是一个寂寞的天",
"content": "this is a loneliness ",
"created_at": "2020-04-18T08:55:40.664Z",
"updated_at": "2020-04-18T08:55:40.664Z"
}
]
更多的接口地址我们一会来看 ^_^
上一步开放了查询接口,然后就可以获取到添加的所有数据了,其他的接口呢,数据的操纵应该是增删改查对不对
来到接口权限设置界面,还是选择public
,我们这一次把Article
的所有接口权限都放通
基础的接口地址格式是有规律的,我们以上文创建的Article
为例
创建时输入的名字是article
,生成的数据表叫做articles
左侧省略了基地址:http://localhost:1337
请求方法 | 接口地址 | 接口描述 | 参数 |
---|---|---|---|
GET | /articles |
获取文章列表 | 无 |
GET | /articles/:id |
根据id获取某篇文章 | id,直接放在url中即可 |
GET | /articles/count |
获取文章的数量 | 无 |
POST | /articles |
创建新文章 | {title:"标题",content:"内容"} |
DELETE | /articles/:id |
根据id删除指定文章 | id,直接放在url中即可 |
PUT | /articles/:id |
根据id修改文章 | id,直接放在url中即可,data中传递{title:"标题",content:"内容"} |
其他的数据表只需要把上表中的articles
替换了即可
可以写代码测试接口,不过这么做比较麻烦,所以这里推荐2个测试工具:
界面略有不同,但是用法大同小异,本文中使用postman
作为 测试工具
接下来我们就使用postman
来测试一下接口
请求方法 | 接口地址 | 接口描述 | 参数 |
---|---|---|---|
GET | /articles |
获取文章列表 | 无 |
- 点击加号创建新分栏
- 输入地址:
基地址
+接口地址
- 点击右侧的发送
- 底部返回数据
- 大伙的数据应该和我的不一样,当然,这并不重要
请求方法 | 接口地址 | 接口描述 | 参数 |
---|---|---|---|
GET | /articles/:id |
Get a specific {content-type} entry | id,直接放在url中即可 |
做法和上一步一样:
- 点击+号新建分栏
- 这一步不是必须的,也可以在上一个页面修改地址
- 输入地址,依旧是
基地址
+接口地址
,在最后用/
的方式分隔一个id出来 - 点击发送
- 如果没有问题即可看到对应的数据返回
请求方法 | 接口地址 | 接口描述 | 参数 |
---|---|---|---|
GET | /articles/count |
获取文章的数量 | 无 |
记得修改地址即可,之后的步骤完全一致
请求方法 | 接口地址 | 接口描述 | 参数 |
---|---|---|---|
POST | /articles |
创建新文章 | {title:"标题",content:"内容"} |
步骤:
- 在新建或者原有的分栏中输入地址
- 修改请求方法为
post
- 参数的提交格式为
json
这里需要注意 - 点击提交
- 然后获取返回值即可
请求方法 | 接口地址 | 接口描述 | 参数 |
---|---|---|---|
DELETE | /articles/:id |
根据id删除指定文章 | id,直接放在url中即可 |
步骤:
- 修改请求方法为
delete
- 在地址的后面拼接上文章的
id
- 点击发送
- 删除成功之后,可以在返回的结果中看到删除的数据
- 再次调用查询接口会发现这条数据已经被删除了
请求方法 | 接口地址 | 接口描述 | 参数 |
---|---|---|---|
PUT | /articles/:id |
根据id修改文章 | id,直接放在url中即可,data中传递{title:"标题",content:"内容"} |
步骤:
- 修改地址和请求方法,注意url中需要拼接id
- 选择body,然后选择raw,选择json
- 把需要修改的字段通过
json
格式写到body
中 - 点击发送
- 如果没有问题,就能接收到修改之后的数据了
文件上传
strapi
默认也帮助我们整合了哦,如何使用呢?我们分别来演示一下,网页端上传和接口中上传
我们首先来看看如何在网页端上传:
- 左侧选择
Media Library
- 点击中间的
Upload assets
- 在弹出的页面中选择要上传的文件
- 根据需求继续选择文件
- 或者点击绿色按钮完成上传
- 上传完成之后可以看到该文件
- 点击可以进入详情,进行更为精细的设置
官方文档中对于文件的上传接口有很多个,除了基础的上传接口以外,还有统计,删除,根据id获取等等。。
本文中重点演示上传接口:
步骤:
- 左侧点击身份与权限
- 选择
public
- 底部选择
upload
- 在展开的菜单中勾选
upload
放通该接口的权限
- 在展开的菜单中勾选
- 点击左上角的
储存
依旧选用postman
来进行接口的测试
请求方法 | 接口地址 | 接口描述 | 参数 |
---|---|---|---|
POST | /upload |
文件上传 | files ,类型选择文件即可 |
步骤:
- 修改地址和请求方法
- 选择body然后选择form-data
- key是
files
,鼠标在后面稍微悬停一会,选择file
- 点击后面的
select files
选择上传的文件 - 点击send即可提交
- 如果没有问题就可以看到类似于如下的响应信息
- 同时在网页中
Media library
中可以看到刚刚上传的文件,如果没有可以刷新一下页面
- 数据表中可以选择
Media
类型,但是这样就需要通过form-data
将数据和媒体文件一起上传,这部分操作可以参考官方文档 - 现在更加流行的方式是,文件上传为单独的接口,数据中保存文件的地址即可,所以本文这部分内容就不再演示了
基础的增删改查接口已经演示完毕了,文件上传也演示完毕了,如果数据的获取需要加上各种条件呢,比如排序,比如搜索,这个时候我们就可以使用查询参数了
这部分的内容直接摘录于官网,并稍作调整
可用的运算符主要有如下四类
筛选条件直接作为查询字段的后缀使用
- 无后缀或
eq
:等于 ne
:不等于lt
: 少于gt
: 比...更棒lte
:小于或等于gte
:大于或等于in
:包含在值数组中nin
:不包含在值数组中contains
:包含ncontains
:不包含containss
:包含区分大小写ncontainss
:不包含区分大小写null
:为空/不为空_q
:全文模糊搜索,这部分内容是阅读自定义控制器发现的
例子
查询标题title
是西兰花
的文章
GET /articles?title=西兰花 或者 GET /articles?title_eq=西兰花
查找年龄age
大于或等于18的用户
GET /user?age_gte=3
查找id
是1,5,7的文章
GET /articles?id_in=1&id_in=5&id_in=7
全文模糊搜索,任意字段中有西
的文章
GET /articles?_q=西
根据特定字段排序。
- asc:升序排列
- desc:倒序排列
示例
通过年龄对用户排序,升序和倒序
- 升序:
GET /users?_sort=age:ASC
- 倒序:
GET /users?_sort=age:DESC
多个字段上排序,年龄和身高
GET /users?_sort=age:asc,height:desc
GET /users?_sort=age:DESC,height:ASC
限制返回结果的大小。
默认限制是 100
示例:
将结果长度限制为30。
GET /users?_limit=30
跳过特定数量的条目(尤其对于分页很有用)。
示例
每页10条,获取第二页
GET /users?_start=10&_limit=10
默认的用户是我们在网页中添加的,也可以自行注册,然后登陆哦,这部分官网很简单,大伙可以自行阅读,或者查看我截取的内容
这2个接口默认都是开放的,我们不需要人为开启,直接即可使用哦,可以根据下图进行查看
- 点击左侧的
身份与权限
- 选择
Public
- 选择最下面的选项
USERS-PERMISSIONS
- 可以看到接口相关接口都是开放的
注册接口的参数如下
请求方法 | 接口地址 | 接口描述 | 参数 |
---|---|---|---|
POST | /auth/local/register |
用户注册 | username 用户名,email 邮箱,password 密码 |
postman请求示例:
请求方法 | 接口地址 | 接口描述 | 参数 |
---|---|---|---|
POST | /auth/local |
用户登录 | identifier 用户名或邮箱,password 密码 |
postman请求示例:
- 地址和请求方法不要弄错
- JSON格式需要注意
- 登录成功之后会返回用户的信息哦
默认的所有接口都是开放为
public
直接即可访问,这并不合理,接下来我们一起来看看如何进行校验
步骤:
public
中禁用所有的articles
的接口访问
authenticated
中放通articles
中的接口访问
- 可以尝试通过
postman
访问之前的接口,应该可以看到如下提示
步骤:
- 先使用注册的用户进行登录,比如上一步的
jack
- 获取到登录之后的
token
- token在响应的
jwt
字段后
-
调用接口,并在
Headers
中携带token-
key为:
Authorization
-
值为:
Bearer
空格token
拼接起来 -
比如:
- token为:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpX
- 提交的就是 中间用空格分隔
Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpX
- 这里为了版面把token的值稍微缩短了一些,实际已接口返回的为准
- token为:
-
postman调用:
基本的使用已经演示完毕了,一些我还用到的功能这里附上官网的传送门,结合谷歌翻译相信大伙应该可以弄懂。
官网是个好东西!
官网是个好东西!
官网是个好东西!
重要的事情说三遍
-
- 如果想要在控制器中添加自定义逻辑,可以看看这个
-
- 默认返回的数据中字段很多,可以通过自定义响应内容移除多余部分
-
- 默认的接口如果无法满足你,或者你想要添加自定义的接口(路由),可以看看这里
-
- 如果希望在控制器中自己写更为复杂的数据库操纵逻辑可以看看这篇文章
.....
(待补充)最近会用这个东西模拟2个项目的接口,弄完之后有什么新收获会更新上来