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原始碼安裝。