開源無程式碼 / 低程式碼平臺 NocoBase 0.20:支援多資料來源

NocoBase發表於2024-03-11

NocoBase 是一個極易擴充套件的開源無程式碼開發平臺。完全掌控,無限擴充套件,助力你的開發團隊快速響應變化,顯著降低成本,不必投入幾年時間和數百萬資金研發,只需要花幾分鐘部署 NocoBase。

NocoBase 中文官網

官方文件

新特性

支援多資料來源

新增「資料來源管理」外掛,用於管理所有資料來源的資料表和欄位,資料來源管理外掛只是提供中心化的資料來源管理介面,並不提供接入資料來源的能力,需要和各種資料來源外掛搭配使用,目前支援的資料來源包括:

  • 主資料庫 Main:NocoBase 主資料庫,支援 MySQL、PostgreSQL、SQLite 等關係型資料庫。
  • 外部 MySQL 資料來源:接入已有的 MySQL 資料庫作為資料來源。
  • 外部 MariaDB 資料來源:接入已有的 MariaDB 資料庫作為資料來源。
  • 外部 PostgreSQL 資料來源:接入已有的 PostgreSQL 資料庫作為資料來源。

除此之外,也可以擴充套件更多資料來源,可以是常見的各類資料庫,也可以是提供 API(SDK)的平臺。

調整資料表的管理方式

將原來的「資料表管理」移至「資料來源 > 主資料庫 > 配置」

支援非 ID 欄位作為主鍵和關係約束

建表時,可以不選擇建立 ID 欄位

整數字段可以作為主鍵

單行文字欄位也可以作為主鍵

關係約束支援選擇其他設定了 Unique 索引的非主鍵欄位

調整拖拽排序

新增「排序」型別欄位,建表時不再自動生成排序欄位,需要自己手動建立

當選了某個欄位作為分組時,將先分組再排序

表格拖拽排序時,需要選擇排序欄位

建立看板區塊時,需要選擇排序欄位

調整使用者和許可權介面

新增使用者管理介面,並將使用者、角色的管理統一到一個選單內

調整角色管理的介面,便於管理角色關聯的使用者、許可權、部門等資料

將原來的「操作許可權」移至「資料來源」標籤頁

部門外掛

以部門來組織使用者,設定上下級關係,繫結角色控制許可權,並支援作為變數用於工作流和表示式。

工作流:審批

審批外掛提供了專用的工作流型別(觸發器)“發起審批”和專用於該流程的“審批”節點,結合 NocoBase 特有的自定義資料表和自定義區塊,可以快速且靈活地建立與管理各類審批場景。

審批配置

審批處理

進一步可透過文件瞭解:工作流:審批

工作流:結束流程節點

該節點執行時將立即結束當前執行的工作流,並以節點配置的狀態結束。通常用於特定邏輯的流程控制,在滿足某些邏輯條件後,跳出當前工作流,不再繼續執行後續流程的處理。可類比程式語言中的 return 指令,用於退出當前執行的函式。

進一步可透過文件瞭解:工作流:結束流程節點

工作流:自定義變數節點

可在流程中宣告變數,或為已宣告的變數賦值,通常用於在流程中儲存一些臨時資料。適用於一些需要在分支內將計算結果儲存到分支外使用的場景(如迴圈、並行等)。

進一步可透過文件瞭解:工作流:自定義變數節點

工作流:請求攔截器

請求攔截器外掛提供了一種可以對錶單的操作請求進行攔截的機制,攔截事件會在對應的表單操作提交後且被處理之前觸發。如果在觸發後的流程中有“結束流程”節點被執行,或者其他節點執行失敗(出錯或其他未能執行完成的情況),則該表單操作將被攔截,否則預定操作將被正常執行。搭配使用“響應訊息”節點可以為該流程配置返回客戶端的響應訊息,以對客戶端給出相應的提示資訊。請求攔截器可用於進行業務驗證或邏輯檢查,以透過或攔截客戶端提交的建立、更新和刪除等操作請求。

進一步可透過文件瞭解:工作流:請求攔截器

工作流:響應訊息節點

響應訊息節點用於在特定型別的流程中(如請求攔截和表單事件)向提交操作的客戶端反饋流程中自定義的訊息。

節點配置

提示資訊

進一步可透過文件瞭解:工作流:響應訊息節點

不相容的變化

命名相同但有衝突的 API

這一次的核心變更,有些新版 API 與舊版命名存在衝突,這些有衝突的舊版 API 在這一版裡還會保留,但是會統一加上 _deprecated 字尾。

原來的 API 廢棄的 API 新 API
CollectionProvider CollectionProvider_deprecated CollectionProvider
useCollection useCollection_deprecated useCollection
useCollectionField useCollectionField_deprecated useCollectionField
useCollectionManager useCollectionManager_deprecated useCollectionManager
useContext(CollectionManagerContext) useCollectionManager_deprecated useCollectionManager

如果用到以上相關 API,你可以有兩種更改方式:

  • 簡單替換:將原來的 API 替換為帶 _deprecated,例如將 useCollection() 替換為 useRecord_deprecated()
  • 按照新文件使用新 API:雖然新 API 的名稱和老 API 相同,但是引數和返回值存在差異,需要參考新文件調整相應程式碼

其他需要調整的 API

  • registerTemplate() 變更為 app.dataSourceManager.addCollectionTemplates()
  • registerField() 變更為 app.dataSourceManager.addFeildInterfaces()
  • registerGroup() 變更為 app.dataSourceManager.addFieldInterfaceGroups()
  • useContext(CollectionManagerContext) 變更為 useCollectionManager_deprecated()
  • 使用 ExtendCollectionsProvider 擴充套件 collections
  • RecordProvider 需要 parent 引數時,必須顯式傳入

變更示例說明

Collection Template 擴充套件

定義

之前是物件定義的方式,現在需要改為類的方式。 例如:

之前

import { ICollectionTemplate } from '@nocobase/client';

const calendar: ICollectionTemplate = {
  name: 'calendar',
  title: 'Calendar collection',
  order: 2,
  color: 'orange',
  // ...
}

現在

import { CollectionTemplate } from '@nocobase/client';

class CalendarCollectionTemplate extends CollectionTemplate {
  name = 'calendar';
  title = 'Calendar collection';
  order = 2;
  color = 'orange';
}

原來的物件屬性變為類的成員。

註冊

之前是透過 registerTemplate 註冊的,現在需要透過外掛的 dataSourceManager.addCollectionTemplates 註冊。例如:

之前

import { registerTemplate } from '@nocobase/client';
import { calendar } from './calendar'

registerTemplate('calendar', calendar);

現在

import { Plugin } from '@nocobase/client';
import { CalendarCollectionTemplate } from './calendar'

export class CalendarPluginClient extends Plugin {
  async load() {
    this.app.dataSourceManager.addCollectionTemplates([CalendarCollectionTemplate]);
  }
}

Field Interface 擴充套件

定義

之前是物件定義的方式,現在需要改為類的方式。 例如:

之前

import { IField } from '@nocobase/client';

const attachment: IField = {
  name: 'attachment',
  type: 'object',
  group: 'media',
  title: 'Attachment',
  // ...
}

現在

import { CollectionFieldInterface } from '@nocobase/client';

class AttachmentFieldInterface extends CollectionFieldInterface {
  name = 'attachment';
  type = 'object';
  group = 'media';
  title = 'Attachment';
  // ...
}

原來的物件屬性變為類的成員。

註冊

之前是透過 registerField 註冊的,現在需要透過外掛的 dataSourceManager.addFieldInterfaces 註冊,並且不需要 CollectionManagerProvider 再次傳遞。例如:

之前

import { registerField } from '@nocobase/client';
import { attachment } from './attachment'

- registerField(attachment.group, 'attachment', attachment);

export const FileManagerProvider: FC = (props) => {
  return (
-   <CollectionManagerProvider interfaces={{ attachment }}>
      <SchemaComponentOptions scope={hooks} components={{ UploadActionInitializer }}>
        {props.children}
      </SchemaComponentOptions>
-   </CollectionManagerProvider>
  );
};

現在

import { Plugin } from '@nocobase/client';
import { AttachmentFieldInterface } from './attachment'

export class FilPlugin extends Plugin {
  async load() {
    this.app.dataSourceManager.addFeildInterfaces([AttachmentFieldInterface]);
  }
}

Field Interface Group 擴充套件

之前是透過 registerGroup 註冊的,現在需要透過外掛的 dataSourceManager.addFieldInterfaceGroups 註冊。例如:

- import { registerGroup, Plugin } from '@nocobase/client';
+ import { Plugin } from '@nocobase/client';

- registerGroup('map', {
-        label: 'Map-based geometry',
-        order: 10
- })

export class MapPlugin extends Plugin {
  async load() {
+    this.app.dataSourceManager.addFieldInterfaceGroups({
+      map: {
+        label: generateNTemplate('Map-based geometry'),
+        order: 51,
+      },
+    });
  }
}

useContext(CollectionManagerContext) 改為 useCollectionManager_deprecated()

- const ctx = useContext(CollectionManagerContext);
+ const ctx = useCollectionManager_deprecated();

擴充套件 collections,使用 ExtendCollectionsProvider 代替 CollectionManagerProvider

const Demo = () => {
-  <CollectionManagerProvider collections={[apiKeysCollection]}>
+  <ExtendCollectionsProvider collections={[apiKeysCollection]}>
...
-  </CollectionManagerProvider>
+  </ExtendCollectionsProvider>
}

RecordProvider 的變更

之前在不傳入 parent 屬性的時候,會自動獲取上一級的 RecordProvider 的值作為 parent。現在則需要顯式的傳入 parent,當不傳 parent 的時候,parent 的值將是 undefined。

- <RecordProvider record={recordData}>
+ <RecordProvider record={recordData} parent={parentRecordData}> 
...
</RecordProvider>

如果沒有歷史包袱,也可以直接使用 CollectionRecordProvider 替換

- <RecordProvider record={recordData}>
+ <CollectionRecordProvider record={recordData} parent={parentRecordData}> 
...
- </RecordProvider>
+ </CollectionRecordProvider>

⚠️RecordProvider 和 CollectionRecordProvider 的區別

  • RecordProvider 已廢棄,未來會被移除
  • RecordProvider 帶了舊的 RecordContext,CollectionRecordProvider 沒有

訪問 NocoBase 官網

您可以在官網申請 Demo 演示,體檢站點將在 1 分鐘內建立完畢自動傳送到您的郵箱。

NocoBase Gitee

NocoBase 獲得了 Gitee 的最有價值開源專案。

訪問 NocoBase GitHub

也可以直接訪問 GitHub ,下載 NocoBase 原始碼並安裝。支援Docker 安裝、create-nocobase-app 安裝和 Git原始碼安裝。

相關文章