Skip to content

Fireboom is a visualization API cloud platform designed for developers with the goal of rapidly delivering production-ready APIs.

License

Notifications You must be signed in to change notification settings

fireboomio/fireboom

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Fireboom V2.0

前后端都喜欢的可视化 API 开发平台

wechat

Quickstart   •   Website   •   Docs   •   Bilibili

Fireboom 介绍

Fireboom 是一个可视化的WEB API开发平台,前后端开发者都能使用。

Fireboom 核心操作

查看 快速上手视频教程

Open in Gitpod

gitpod 介绍:Gitpod是一个在线IDE,可以从任何GitHub页面启动。在几秒钟之内,Gitpod就可以为您提供一个完整的开发环境,包括一个VS Code驱动的IDE和一个可以由项目定制化配置的云Linux容器。

启动成功后,在 gitpod 底部切换到PORTS面板,选择 9123 端口打开即可

前往-> Fireboom 官网

👀 Fireboom 是什么?

  • 是可视化 API 开发平台,可以快速开发 API;
  • 是一个可视化的 BaaS 开发平台(Backend as a Service);
  • 是一个集「API 开发」、「身份验证」、「对象存储」等于一身的一站式开发平台;
  • 可以是中国版的 Hasura 和 Supabase,支持 PostgreSQLMySQLMongoDB 等数据库。

Note

产品愿景:极致开发体验,飞速布署应用!

如果你喜欢如下产品,那你大概率也会喜欢 Fireboom 。

🎉 Fireboom 有什么?

  • 多数据源:数据库(PgSQLMySQLMongoDB...)、REST APIGraphQL 以及消息队列等;
  • 数据管理:简化版 Navicat,主要包含数据库建模和数据预览功能;
  • 可视化构建 API:基于 GraphQL 可视化构建 API,支持 API 授权、跨源关联、数据缓存、N+1 查询等高阶能力;
  • 实时推送:将 GET 请求转换为实时查询接口,同时具备实时推送能力,业务无死角;
  • SDK 生成:根据 API 实时生成客户端 SDK,当前已支持 TS SDK、 Flutter SDK;
  • 文件存储:集成 S3 规范,实现文件管理,后续将支持钩子进行文件上传的后置处理;
  • 钩子机制:提供了灵活的钩子机制,具备 PRO CODE 能力 (Go、Node、Java、Python...),无惧复杂业务。
  • ...

👨谁适合使用 Fireboom ?

前端开发者 + Fireboom(Node.js) = 全栈开发者

  • 可视化开发:可视化构建 API,前端也能驾驭
  • PRO CODE:会写 Node TS 函数,就能定制业务逻辑
  • SDK 生成:实时生成客户端 SDK,接口对接从未如此丝滑

后端开发者 + Fireboom(Golang/Java/Python)= 无限可能

  • 声明式开发:声明式语言开发 API,BUG 更少
  • 多语言支持:用任意后端语言编写钩子,Golang、Java、Python...
  • 文档生成:实时生成 Swagger 文档,无需手工编写

独立开发者 + Fireboom= 一支团队

  • 分钟级交付:将传统模式下 2 天才能完成的接口开发时间缩短至 2 分钟
  • 一键部署:一键发布应用到 Sealos 平台,自动化运维无惧“三高”

Hasura、Supabase 用户,获得更强大、快速的开发体验

  • 更适用于本土开发者,中文学习资料及配套组件
  • 支持多种数据库,包括国内常用的 MySQL 数据库
  • 不引入额外学习成本,对外暴露 REST 端点,前端更友好
  • 权限系统更灵活,不仅支持数据库还支持 REST 和 GraphQL 数据源

💥 Fireboom 能用来做什么?

Note

Fireboom 是 BaaS 平台,理论上可以开发任意应用的 API!

移动和 WEB 应用程序:

Fireboom 擅长 API 构建,尤其擅长聚合不同库表或三方 API 的数据在一个请求中,能够节省网络请求的成本,提高应用性能。而大部分移动或 WEB 应用程序都是从数据库查询数据,这是 Fireboom 的强项。例如:英语口语练习 APP

中后台应用:

Fireboom 能够与前端低代码平台结合,实现复杂业务逻辑。为了解决中后台开发的需求,Fireboom 生态集成了一套中后台管理界面,并与 Fireboom 深度打通。基于此,快速完成中后台应用,覆盖前端低代码无法实现的用例!例如:Fireboom Admin

数据大屏应用:

Fireboom 擅长数据聚合和复杂 SQL 查询,能够在一次查询中获得页面所需的全部数据,同时,Fireboom 支持服务端订阅,无需客户端轮询,即可实现大屏数据的实时更新。

BFF 层:

Fireboom 本身也是一个可编程网关,可作为各数据源的中央访问点,聚合不同数据,为不同客户端按需提供数据,同时提供鉴权等功能。

物联网应用:

Fireboom 支持消息队列,非常适合处理来自物联网设备的数据。Fireboom 将实时消息映射为 GraphQL 订阅,并以 REST API 的推送方式暴露给客户端。同时,Fireboom 支持开发者自定义脚本处理订阅事件,实现事件数据落库等功能。

❓ 为什么用 Fireboom?

首先,业务型 Web 应用 80% 由样板代码组成,例如增删改查,权限管理,用户管理,消息或者通知。一次又一次的建立这些功能,不仅乏味,而且减少了我们集中在软件与竞争对手不同之处的时间。

其次,除了重复性工作,后端开发者往往还要实现非功能需求,这些需求不仅消耗大量精力,而且有一定的技术门槛。

最后,当前市场上存在诸多 API 开发框架,但这些框架大都基于某种特定编程语言实现,开发者掌握特定编程语言才能上手使用。

使用 Fireboom,

  • 对于简单需求,无需掌握任何开发语言,只需了解数据库知识和 GraphQL 协议就能胜任
  • 对于复杂需求,可编写钩子扩展逻辑,钩子基于 HTTP 协议,原则上兼容任意后端语言,此外 我们还实现了 Golang、Nodejs 的钩子 SDK

Fireboom 的核心架构?

API 作为数据源和客户端的桥梁,目的是提供数据,而数据源往往有严苛的 schema ,API 本质上是 schema 的子集。 Fireboom 将数据源的 schema 以可视化的方式呈现,开发者通过界面勾选所需函数,构建客户端需要的 API 。

Fireboom 架构图

Fireboom 采用声明式开发方式,它以 API 为中心,将所有数据源抽象为 API,包括 REST API、GraphQL API、数据库甚至消息队列等。通过统一协议 GraphQL 把他们聚合为“超图”,同时通过可视化界面,从“超图”中选择子集 Operation 作为函数签名,并将其编译为 REST-API。

开发者通过界面配置,即可开启某 API 的缓存或实时推送功能。

此外,Fireboom 基于 HTTP 协议实现了 HOOKS 机制,方便开发者采用任何喜欢的语言实现自定义逻辑。

快速上手

Fireboom 服务

推荐使用 Github Codespace 快速体验下述流程!

安装 Fireboom

# 用 init-todo 模板初始化项目 project-name
curl -fsSL fireboom.io/install | bash -s project-name -t init-todo --cn

更新Fireboom

# 更新本地二进制命令
curl -fsSL https://www.fireboom.io/update | bash

启动 Fireboom 服务

./fireboom dev

启动成功日志:

Web server started on http://localhost:9123

打开控制面板

http://localhost:9123

可视化开发接口

在[API管理] TAB,查看 Todo 目录,内置了5个接口。

Note

继续下述章节,最好具备基本的 GraphQL 知识,前往学习

1.创建待做事项:Todo/CreateOneTodo

# store/operation/Todo/CreateOneTodo.graphql
mutation TodoCreateOneTodo($title: String!) {
  data: todo_createOneTodo(data: {title: $title}) {
    id
    title
    completed
    createdAt
  }
}

Note

上述 OPERATION,基于 Prisma 语法构建,详情参考 Fireboom 文档

访问接口:

curl 'http://127.0.0.1:9991/operations/Todo/CreateOneTodo' \
  -X POST  \
  -H 'Content-Type: application/json' \
  --data-raw '{"title":"learn fireboom"}' \
  --compressed

响应结果:

{"data":{"data":{"id":11,"title":"learn fireboom","completed":false,"createdAt":"2024-01-12T16:06:46.871Z"}}}

2.查询待做事项:Todo/GetManyTodo

# store/operation/Todo/GetManyTodo.graphql
query TodoGetManyTodo {
  data: todo_findManyTodo {
    id
    title
    completed
    createdAt
  }
}

访问接口:

curl 'http://127.0.0.1:9991/operations/Todo/GetManyTodo' 

响应结果:

{
  "data": {
    "data": [
      {
        "id": 1,
        "title": "Hello world",
        "completed": true,
        "createdAt": "2022-12-31T16:00:01.000Z"
      },
      {
        "id": 2,
        "title": "This is Fireboom",
        "completed": false,
        "createdAt": "2022-12-31T16:00:01.000Z"
      }
    ]
  }
}

3.其他接口,动手试一试吧~

Note

除了增删改查(包括关联表),OPERATION 还支持事务跨源关联权限控制响应转换等特性,更多用例参见 Fireboom 文档

钩子服务

Fireboom 的GraphQL OPERATION 可以构建绝大多数增删改查的需求(包括关联表查询或更新)。但若遇到 OPERATION 无法胜任的场景时,可使用钩子机制扩展逻辑。

Fireboom 钩子架构图

Note

目前已支持 NodeJSGolangJava 的SDK,其他未提供SDK 的语言,可基于 HTTP 规范自行开发。

安装钩子

安装钩子

  1. 点击<状态栏>的<钩子模版:未选择>,进入模板页
  2. 点击右上角<浏览模板市场>,打开模板市场
  3. 在<钩子模板>分组下载对应SDK(根据你的语言选择),目录 template 下新建对应文件夹

Warning

不建议钩子开发过程中切换钩子的语言! 否则,已开启钩子需要用新语言重新编写。

Golang 钩子

  1. 开启 Golang server 钩子

根目录下新建custom-go文件夹

2.安装 golang 依赖

# 进入 custom-go 目录
cd custom-go/
# 安装依赖
go mod tidy
  1. 编写局部钩子

在[API管理] TAB,选择 Todo/CreateOneTodo 接口,打开 postResolve 钩子。

系统创建文件: custom-go/operation/Todo/CreateOneTodo/postResolve.go

将其修改为:

package CreateOneTodo

import (
	"custom-go/generated"
	"custom-go/pkg/base"
	"fmt"
)

func PostResolve(hook *base.HookRequest, body generated.Todo__CreateOneTodoBody) (res generated.Todo__CreateOneTodoBody, err error) {
	// body 挂载了对象,如 入参 input、响应 resopnse
	fmt.Println("Input", body.Input)
	fmt.Println("Response", body.Response)
	// hook 挂载了其他对象,如 登录用户 user
	fmt.Println("User", hook.User)
	return body, nil
}
  1. 编写 Funtion 钩子

在[数据源] TAB,点击 <脚本->Function> ,新建 Function 钩子,命名为 hello

系统创建文件: custom-go/function/hello.go

// 预设模板是一个账户密码登录的示例 ~
package function
import (
	"custom-go/pkg/base"
	"custom-go/pkg/plugins"
	"custom-go/pkg/wgpb"
)

func init() {
	plugins.RegisterFunction[hello_loginReq, hello_loginRes](hello, wgpb.OperationType_MUTATION)
}

type hello_loginReq struct {
	Username string    `json:"username"`
	Password string    `json:"password"`
	Info     hello_loginInfo `json:"info,omitempty"`
}

type hello_loginInfo struct {
	Code    string `json:"code,omitempty"`
	Captcha string `json:"captcha,omitempty"`
}

type hello_loginRes struct {
	Msg  string `json:"msg"`
	Data string `json:"data"`
}

func hello(hook *base.HookRequest, body *base.OperationBody[hello_loginReq, hello_loginRes]) (*base.OperationBody[hello_loginReq, hello_loginRes], error) {
	if body.Input.Username != "John" || body.Input.Password != "123456" {
		body.Response = &base.OperationBodyResponse[hello_loginRes]{
			Errors: []base.GraphQLError{{Message: "username or password wrong"}},
		}
		return body, nil
	}

	body.Response = &base.OperationBodyResponse[hello_loginRes]{Data: hello_loginRes{Msg: "login success"}}
	return body, nil
}

打开 custom-go/main.go 文件,取消第6行注释,引入上述包

package main

import (
	// 根据需求,开启注释
	//_ "custom-go/customize"
	_ "custom-go/function" // 开启后function 才生效
	//_ "custom-go/proxy"
	"custom-go/server"
)

func main() {
	server.Execute()
}
  1. 启动钩子
go run main.go
  1. 测试钩子

局部钩子

执行请求:

curl 'http://127.0.0.1:9991/operations/Todo/CreateOneTodo' \
  -X POST  \
  -H 'Content-Type: application/json' \
  --data-raw '{"title":"learn fireboom"}' \
  --compressed

输出响应:

{"data":{"data":{"id":9,"title":"learn fireboom","completed":false,"createdAt":"2024-01-11T16:04:55.286Z"}}}

钩子控制台:

Input {learn fireboom}
Response &{<nil> {{false 2024-01-11T16:04:55.286Z 9 learn fireboom}} []}
User <nil>

Function 钩子

执行请求:

curl http://127.0.0.1:9991/operations/function/hello \
  -X POST \
  -H 'Content-Type: application/json' \
  --data-raw '{"info":{"captcha":"string","code":"string"},"password":"string","username":"string"}' \
  --compressed

响应结果:

{"data":{"data":"","msg":""},"errors":[{"message":"username or password wrong","path":null}]}

NodeJS 钩子

  1. 开启 node-server 钩子

根目录下新建custom-ts文件夹

  1. 安装 nodejs 依赖
# 进入 custom-ts 目录
cd custom-ts/
# 安装依赖
npm i
  1. 编写局部钩子

在[API管理] TAB,选择 Todo/CreateOneTodo 接口,打开 postResolve 钩子。

系统创建文件: custom-ts/operation/Todo/CreateOneTodo/postResolve.ts

将其修改为:

import { registerPostResolve } from '@fireboom/server'
import { type FireboomOperationsDefinition } from '@/operations'
import { Todo__CreateOneTodoInput, Todo__CreateOneTodoResponseData } from '@/models'

registerPostResolve<Todo__CreateOneTodoInput, Todo__CreateOneTodoResponseData, FireboomOperationsDefinition>('Todo/CreateOneTodo', async ctx => {
	// ctx 挂载了对象,如 入参 input、响应 resopnse、登录用户 user
    console.log("input:",ctx.input)
    console.log("response:",ctx.response)
    console.log("user:",ctx.user)
  return ctx.response
})
  1. 编写 Funtion 钩子

在[数据源] TAB,点击 <脚本->Function> 新建 Function 钩子,命名为 hello。

系统创建文件: custom-ts/function/hello.ts

// 预设模板是 实时推流 函数,从0-9计数输出
import { OperationType, registerFunctionHandler } from '@fireboom/server'
import { type FireboomRequestContext } from '@/operations'
registerFunctionHandler('hello', {
  input: {
    type: 'object',
    properties: {
      "name": {
        type: 'string'
      }
    },
    additionalProperties: false
  },
  response: {
    // only support object as root
    type: 'object',
    properties: {
      "msg": {
        type: 'string'
      }
    }
  },
  operationType: OperationType.SUBSCRIPTION, // 订阅类型
  handler: async function* (input, ctx: FireboomRequestContext) {
    for (let i = 0; i < 10; i++) {
      yield { msg: `Hello ${i}` }
      await new Promise((resolve) => setTimeout(resolve, 1000))
    }
  }
})
  1. 启动钩子
npm run dev
  1. 测试钩子

局部钩子

执行请求:

curl 'http://127.0.0.1:9991/operations/Todo/CreateOneTodo' \
  -X POST  \
  -H 'Content-Type: application/json' \
  --data-raw '{"title":"learn fireboom"}' \
  --compressed

输出响应:

{"data":{"data":{"id":5,"title":"learn fireboom","completed":false,"createdAt":"2024-01-10T16:17:08.883Z"}}}

钩子控制台:

input: { title: 'learn fireboom' }
response: {
  data: {
    data: {
      id: 8,
      title: 'learn fireboom',
      completed: false,
      createdAt: '2024-01-10T16:22:53.272Z'
    }
  }
}
user: undefined

Function 钩子

在网页访问:

GET http://127.0.0.1:9991/operations/function/hello?wg_variables={%22name%22:%22string%22}&wg_sse=true

结果:

data: {"data":{"msg":"Hello 0"}}
data: {"data":{"msg":"Hello 1"}}
data: {"data":{"msg":"Hello 2"}}
...
data: {"data":{"msg":"Hello 8"}}
data: {"data":{"msg":"Hello 9"}}
data: done

参考