1. 介绍
- directus是一个基于node.js,包含后端与前端的低代码+无代码平台。
- 前端底层使用的是vue3
- 后台底层服务使用的express
网址
2. 特点
- 可以快速数据库建模,并自带字段展示组件,并提供API的REST的接口
- 源码开源 directus/directus
- 完善的工具链命令工具
- 支持各种数据库连接
- 支持docker部署
3. 搭建
- 创建项目
npm init directus-project example-project - 选择对应的数据库版本
- 输入对应的数据库和管理员账号 (数据库记得提前创建好)
- 数据库名 directus_db
- 账号 test@qq.com
- 密码 123456
- 生成的内容
extension文件夹是 项目所有扩展的文件
- displays: 前端vue页面二次开发展示
- interfaces: 用于某个字段显示的二次定制开发
- layouts: 整体的排版布局
.env 项目配置
- 记录所有环境变量,包括第三方js库引入,数据库配置信息等
directus开头的表都是系统自带的内置表
- 运行启动
cd /test_directus
npx directus start
输入账号和密码
- test@qq.com
- 123456
congratulation~ 成功登陆
- 汉化设置
在菜单 设置 -> setting 选择 chinese
环境变量.env
下面是关键的环境变量
### General
# IP or host the API listens on ["0.0.0.0"] 默认本地启动
HOST="0.0.0.0"
# The port Directus will run on [8055] 默认端口
PORT=8055
# 本地服务外部访问的url
# The URL where your API can be reached on the web. It is also used for things like OAuth redirects,
# forgot-password emails, and logos that needs to be publicly available on the internet. ["/"]
PUBLIC_URL="/"
# PUBLIC_URL="http://localhost:8055"
# 控制台样式显示
# Render the logs human readable (pretty) or as JSON (raw), [pretty]
# "pretty", "raw"
# LOG_STYLE="pretty"
### Database 数据库配置
# All DB_* environment variables are passed to the connection configuration of a Knex instance.
# Based on your project's needs, you can extend the DB_* environment variables with any config
# you need to pass to the database instance.
DB_CLIENT="mysql"
DB_HOST="127.0.0.1"
DB_PORT="3306"
DB_DATABASE="directus_db"
DB_USER="xxxx"
DB_PASSWORD="xxxx"
### Extensions 系统扩展配置
# Path to your local extensions folder ["./extensions"]
EXTENSIONS_PATH="./extensions"
# Automatically reload extensions when they have changed [false]
EXTENSIONS_AUTO_RELOAD=false
# 指定允许自定义或第三方的js库,便于flow运行脚本使用
FLOWS_EXEC_ALLOWED_MODULES="ioredis,http,cache,joi,decimal.js,moment,lodash"
# 导出允许被访问的环境变量 便于flow运行脚本使用
FLOWS_ENV_ALLOW_LIST="PUBLIC_URL"
4. 实战 CRUD
我们以省份和城市演示一下
4.1 创建省份表
在菜单 设置 -> 数据模型 -> 新建模型 (就是创建表的意思)
输入表名
选择系统自带字段,点击右上角勾勾即可
此时系统已生成好表
点击创建字段 ,创建多name名称和desc描述字段
在数据查看到新增的表
4.1.1 系统自带字段说明
注意:系统status是枚举 包含 published发布,draft草稿,garchived归档 可以创建后,在字段点击编辑-> 接口里查看,目前使用的是json描述 key+ 国际化输出
[
{
"text": "$t:published",
"value": "published"
},
{
"text": "$t:draft",
"value": "draft"
},
{
"text": "$t:archived",
"value": "archived"
}
]
4.2 录入数据
创建一条广东省数据
4.3 创建城市表
新增name字段
4.4 创建关联关系
省份与城市是 一对多的关系 ,在directus 只需要在
4.5 录入城市数据
4.6 更新城市
点击具体的一行
在文本框修改,点击右上角保存即可(默认位草稿,可以修改为发布)
4.7 删除城市
选择勾勾具体行,点击右上角删除按钮即可
4.8 优化排版
directus 后台app默认使用整行布局,可以通过半宽优化排版
优化调整后
5.原生的REST接口
5.1 通过f12 查看网络请求 ,看到新建的表已经自带接口
是一个get请求 http://127.0.0.1:8055/items/city
每个请求都自带登陆的头信息
Authorization:Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6ImZkOGY5MmEwLThkYTAtNDQ4Yy05MWFjLTlmYjE4MTlhMThkZCIsInJvbGUiOiI1N2FjNTJhZS0xYzYwLTQxMjItODQwNi1jMjdmMWEzN2NkOWIiLCJhcHBfYWNjZXNzIjoxLCJhZG1pbl9hY2Nlc3MiOjEsImlhdCI6MTY5OTYwNDQ0MiwiZXhwIjoxNjk5NjA1MzQyLCJpc3MiOiJkaXJlY3R1cyJ9.mKCDcvCzXlB3_VOCmR87yh8kjfYanRzcAd_dPa2KsJE
5.2 模拟用户登陆
使用系统自带的用户登陆,通过apifox模拟post请求登陆
http://127.0.0.1:8055/auth/login
{
"email": "test@qq.com",
"password": "123456"
}
返回
{
"data": {
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6ImZkOGY5MmEwLThkYTAtNDQ4Yy05MWFjLTlmYjE4MTlhMThkZCIsInJvbGUiOiI1N2FjNTJhZS0xYzYwLTQxMjItODQwNi1jMjdmMWEzN2NkOWIiLCJhcHBfYWNjZXNzIjoxLCJhZG1pbl9hY2Nlc3MiOjEsImlhdCI6MTY5OTYwNDc2NywiZXhwIjoxNjk5NjA1NjY3LCJpc3MiOiJkaXJlY3R1cyJ9.OEENgNhZMby-w0773u4rkAaIu2yoIGDWO5qw8HjoPFE",
"expires": 900000,
"refresh_token": "pNgyUJUMFmEvlPljnT3CwO3TWALFQbINvpi27957NzMNr47F_GSDrp_RmD-aFesj"
}
}
5.3省份查询接口
把上面添加 access_token 添加到Authorization 里面输入 Bearer token
get请求
http://127.0.0.1:8055/items/province
{
"data": [
{
"id": 1,
"status": "published",
"user_created": "fd8f92a0-8da0-448c-91ac-9fb1819a18dd",
"date_created": "2023-11-10T07:46:43.000Z",
"desc": "南部地区",
"name": "广东",
"city": [
1
]
}
]
}
5.3.1 高级查询
fields关键字
精准获取内容搜索。
如我需要查询 省份表的 id,name
请求url,添加get参数 http://127.0.0.1:8055/items/province?fields=id,name
关联所有查询
关联集合city的所有字段信息
请求url,get参数 http://127.0.0.1:8055/items/province?fields=id,name,city
directus 默认只会把city集合的id放在数组返回
通过.*关键子可以查询所有信息或局部信息
http://127.0.0.1:8055/items/province?fields=id,name,city.*
关联精准查询
可以把集合的具体字段也按需提取,city.id,city.name
http://127.0.0.1:8055/items/province?fields=id,name,city.id,city.name
filter关键字
filter 类似于sql的where 条件
先查询所有city数据,这里我提前把广州改成草稿状态
{
"data": [
{
"id": 1,
"status": "published",
"user_created": "fd8f92a0-8da0-448c-91ac-9fb1819a18dd",
"date_created": "2023-11-10T08:00:20.000Z",
"province": 1,
"name": "深圳2"
},
{
"id": 3,
"status": "draft",
"user_created": "fd8f92a0-8da0-448c-91ac-9fb1819a18dd",
"date_created": "2023-11-10T09:03:26.000Z",
"province": 1,
"name": "广州"
},
{
"id": 4,
"status": "published",
"user_created": "fd8f92a0-8da0-448c-91ac-9fb1819a18dd",
"date_created": "2023-11-10T09:12:21.000Z",
"province": 1,
"name": "韶关"
}
]
}
需求,把草稿的广州的数据过滤掉
http://127.0.0.1:8055/items/city?filter[status][_eq]=published
5.4省份更新接口
patch 请求
http://127.0.0.1:8055/items/province/1
更新内容
{
"name":"广东2"
}
5.5城市新增 通过关联表新增
directus 支持关联表新增,json描述关系即可
先在省份打开id显示
{
"name": "广州",
"province": 1
}
5.6省份更新同时添加城市
{
"name":"广东3" ,
"city" : {
"create" : [
{
"name" : "韶关"
}
]
}
}
5.7更详细的CRUD文档描述
Accessing Items | Directus Docs
6. 权限控制
directus 自带两个角色
- public 公开
- administrator 超级管理员
公开默认是没有所有表的访问权限
超级管理员有所有表权限,并且有另外一个维护的页面
我们新增一个test角色
app访问:指的是directus 自带的后台管理页面权限
创建后,自定义的表都是没有权限访问,系统表 有两个默认推荐的方案
- 最小权限:只给最基本的权限(默认自动设置这个)
- 推荐权限:适合后台管理使用
测试一把
新建用户 json2,邮箱:test2@qq.com , 密码123456
角色选择 test
在apifox重新用test2@qq.com登陆 测试查询省份接口
提示当前权限不足
新增读权限
再次请求apifox ,请求成功
高级权限设置
directus 支持通过当前登陆用户信息过滤数据。
比如我希望只有我自己创建的数据,才能被查询到
- 设置+ :为允许所有
- 设置查询 : 自定义
$CURRENT_USER 是directus自带的系统变量,访问的就是当前登陆用户的id,我们通过匹配创建用户的id是否刚好等于当前登陆用户id ,实现数据的隔离。
更详细的变量 Filter Rules | Directus Docs
测试第二把
再次请求发现没有数据
我们新增多一条福建省
再再次请求发现有福建数据
同理在directus自带的后台,登陆test2@qq.com 我们也看到数据也被过滤了
我们切换为test@qq.com 试试看,由于test@qq.com是管理员所以所有数据都能查看到。
扩展docker部署
1. 创建文件夹
mkdir -p ./data
chmod -R 777 ./data
2. docker-copose.yml
version: '3.8'
services:
directus:
image: directus/directus:latest
ports:
- 8055:8055
environment:
DIRECTUS_SECRET: 'mysecret'
DB_CLIENT: 'sqlite3'
DB_FILENAME: '/data/database.db' # 使用绝对路径 如果无法访问请设置 权限 chmod -R 777 ./data
volumes:
- ./data:/data
3. 启动
- 直接
docker-compose up -d - 控制台会输出对应的管理员账号和密码
- 直接访问http://127.0.0.1:8055
- 进入docker 容器一样可以执行 npx directus start 等命令
如果启动异常,数据库文件需要调整 权限 chmod -R 777 ./data
源码地址
mjsong07/directus_demo: directus测试代码 (github.com)