Nocobase快速上手 - 开发第一个插件

在前面的几篇博文中,记录了在Nocobase中配置collection和界面,这篇文章开始插件的开发。插件可以扩展Nocobase的业务能力,解锁更强大的功能。

环境搭建

创建插件需要配置nocobase的开发环境,笔者采用的是clone 官方代码repo的方式。

git clone https://github.com/nocobase/nocobase.git

代码clone到本地后,进入代码目录,安装依赖.
要注意项目要求的node版本是v18+,并且需要Yarn 1.22.x

推荐使用nvm来管理node版本随时切换,很多前端项目都有对node版本的要求

nvm

nvm安装非常简单,仅仅需要一个命令即可

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash

然后就可以用nvm安装最新版本的node

nvm install 22

nocobase

在nocobase目录下安装依赖前,最好先配置yarn mirror,否则很可能因为网络问题造成失败

yarn config set registry https://registry.npmmirror.com/
yarn config set sqlite3_binary_host_mirror https://npmmirror.com/mirrors/sqlite3/

安装依赖

yarn install --fronzen-lockfile

依赖安装后,需要初始化一下应用

yarn nocobase install

然后启动应用

yarn dev

如果没有报错信息正常启动,并且在http://localhost:13000地址上能访问,那么开发环境就搭建成功了。

创建插件

创建插件使用yarn pm命令,pm是Nocobase的插件管理器。

yarn pm create @my-project/plugin-hello

创建完成后,可以在界面上看到创建的后的插件,如果没有显示,可以尝试用如下命令进行一次add操作:

yarn pm add @my-project/plugin-hello

可以在界面上看到新添加的插件
Nocobase plugin

第一行插件代码

新增的插件还没有任何功能,我们根据官方文档来编写第一行插件代码.

首先是新建. /src/server/collections/hello.ts文件

import { defineCollection } '@nocobase/database';export default defineCollection({name: 'hello',fields: [{ type: 'string', name: 'name' }],
});

然后修改. /src/server/plugin.ts文件

import { Plugin } from '@nocobase/server';export class PluginHelloServer extends Plugin {async afterAdd() {}async beforeLoad() {}async load() {// This is just an example. Expose all actions of the hello collection to the publicthis.app.acl.allow('hello', '*', 'public');}async install() {}async afterEnable() {}async afterDisable() {}async remove() {}
}export default PluginHelloServer;

这两个文件分别定义了插件所使用的collection和这个collection的使用权限.
修改文件后,需要对插件进行激活来进行测试。

yarn pm enable @my-project/plugin-hello

测试插件

插件创建成功后,我们用curl进行简单的测试确认其可以正常工作

curl --location --request POST 'http://localhost:13000/api/hello:create' \
--header 'Content-Type: application/json' \
--data-raw '{"name": "Hello world"
}'

这段命令是向插件中定义的hello collection中插入数据。数据新增成功后,查询验证:

curl --location --request GET 'http://localhost:13000/api/hello:list'

小结

本文记录了Nocobase开发插件的简单步骤,通过新建插件,修改代码,初步熟悉插件开发的过程。虽然这个插件还没有什么具体的业务功能,但不失为一个好的开端。
更多功能正在探索中,欢迎交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/21059.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用python下载股票数据至sqlite数据库

代码下载地址: https://download.csdn.net/download/weixin_44600457/89389489

2024四川三支一扶“考生信息表”照着填❗

2024四川三支一扶“考生信息表”照着填❗ ☑️四川三支一扶开始报名,大家要按照提示如实、准确、完整填写《高校毕业生“三支一扶”计划招募考生信息表》哦~ ☑️不知道怎么填写的宝子们,可以参考图1。 ☑️毕业证书编号如实填写,若是应届生&…

【JavaEE进阶】——MyBatis操作数据库 (#{}与${} 以及 动态SQL)

目录 🚩#{}和${} 🎈#{} 和 ${}区别 🎈${}使用场景 📝排序功能 📝like 查询 🚩数据库连接池 🎈数据库连接池使⽤ 🚩MySQL开发企业规范 🚩动态sql &#x1f388…

JetBrains的Ai assistant 直接激活一年的来用用

ai assistant激活成功后,如图 ai assistant渠道:https://web.52shizhan.cn/activity/ai-assistant 在去年五月份的 Google I/O 2023 上,Google 为 Android Studio 推出了 Studio Bot 功能,使用了谷歌编码基础模型 Codey,Codey 是…

[C#]使用C#部署yolov8的obb旋转框检测tensorrt模型

【测试通过环境】 win10 x64 vs2019 cuda11.7cudnn8.8.0 TensorRT-8.6.1.6 opencvsharp4.9.0 .NET Framework4.7.2 NVIDIA GeForce RTX 2070 Super 版本和上述环境版本不一样的需要重新编译TensorRtExtern.dll,TensorRtExtern源码地址:TensorRT-CShar…

mysql中基于规则的优化

大家好。我们在平时开发的过程中可能会写一些执行起来十分耗费性能的语句。当MySQL遇到这种sql时会依据一些规则,竭尽全力的把这个很糟糕的语句转换成某种可以比较高效执行的形式,这个过程被称作查询重写,今天我们就来聊一下mysql在查询重写时…

【UML用户指南】-05-对基本结构建模-类

在UML中,所有的事物都被建模为类。类是对词汇表中一些事物的抽象。类不是个体对象,而是描述一些对象的一个完整集合。 强调抽象的最重要的部分:名称、属性和操作 类 (class)是对一组具有相同属性、操作、关系和语义的对…

【transformers】pytorch基础

传送门:https://transformers.run/c2/2021-12-14-transformers-note-3/ pytorch基础知识 tensor : 张量。 需要知道的内容: 张量构建张量计算自动微分形状调整广播机制索引与切片升降维度 Tensor 张量:理解成高纬度的向量就完…

短视频毫无营养:四川京之华锦信息技术公司

短视频毫无营养:现象背后的深度剖析 在数字时代,短视频以其短小精悍、易于传播的特点迅速崛起,成为社交媒体上的热门内容。然而,随着短视频的泛滥,关于其内容质量参差不齐、缺乏营养价值的争议也日益加剧。四川京之华…

SELF-RAG: Learning to Retrieve, Generate, and Critique Through Self-reflection

更多文章,请关注微信公众号:NLP分享汇 原文链接:ICLR2024:能够自我反思的SELF-RAG 下面介绍的这篇论文是最近被ICLR 2024 accepted oral,作者来自University of Washington & Allen Institute for AI & IBM R…

leetcode:最近的请求次数

class RecentCounter { public:RecentCounter() {cou 0;}int ping(int t) {q.push(t);while(!q.empty()){auto Front q.front();if(t-Front>3000)q.pop();else break;}return q.size();} private:int cou;queue<int> q; }; 仅个人做法&#xff0c;非最优解

postgressql——事务提交会通过delayChkpt阻塞checkpoint(9)

事务提交会通过delayChkpt阻塞checkpoint Postgresql事务在事务提交时&#xff08;执行commit的最后阶段&#xff09;会通过加锁阻塞checkpoint的执行&#xff0c;尽管时间非常短&#xff0c;分析为什么需要这样做&#xff1a; 首先看提交堆栈 #1 0x0000000000539175 in Co…

Django表单革命:打造安全、高效、用户友好的Web应用

Django表单处理&#xff0c;听起来是不是有点枯燥&#xff1f;别急&#xff0c;阿佑将带你领略Django表单的艺术之美。我们将以轻松幽默的语言&#xff0c;一步步引导你从表单的创建到管理&#xff0c;再到验证和自定义&#xff0c;让你在不知不觉中掌握Django表单的精髓。文章…

支付宝支付(沙盒支付)

后端页面代码 Controller RequestMapping("/pay") public class PayController {private String orderId;Autowiredprivate OrdersService ordersService;Value("${appId}")private String appId;Value("${privateKey}")private String private…

奇安信 网神SecGate 3600防火墙 (相关问题整理)

本文所有问题&#xff0c;基于实际项目中出的问题&#xff0c;设备&#xff1a;网神SecGate 3600防火墙 会话记录 数据中心>会话>会话监控&#xff0c;终端发起SYN请求&#xff0c;就能看到记录&#xff0c;无需完全建立TCP连接 默认安全策略 防火墙的安全策略中&…

CAD二次开发(7)- 实现Ribbon选项卡,面板,功能按钮的添加

1. 创建工程 2. 需要引入的依赖 如图&#xff0c;去掉依赖复制到本地 3. 代码实现 RibbonTool.cs 实现添加Ribbon选项卡&#xff0c;添加面板&#xff0c;以及给面板添加下拉组合按钮。 using Autodesk.Windows; using System; using System.Collections.Generic; using S…

Ubuntu18.04安装pwntools报错解决方案

报错1&#xff1a;ModuleNotFoundError: No module named ‘setuptools_rust’ 报错信息显示ModuleNotFoundError: No module named setuptools_rust&#xff0c;如下图所示 解决方案&#xff1a;pip install setuptools_rust 报错2&#xff1a;pip版本低 解决方案&#xff…

天气数据集-Jena Climate dataset

天气数据集-Jena Climate dataset 1.数据集基本信息 Dataset Name: mpi_saale_2021b.csv Size: 26495 rows; 1 year (2021), 10 min 气象学、农业、环境科学 开源机构: Max Planck Institute for Biogeochemistry 2.数据特征 2.1 特征简介 数据共有31个特征&#xff0c;…

LabVIEW与欧陆温控表通讯的实现与应用:厂商软件与自主开发的优缺点

本文探讨了LabVIEW与欧陆温控表通讯的具体实现方法&#xff0c;并对比了使用厂商提供的软件与自行开发LabVIEW程序的优缺点。通过综合分析&#xff0c;帮助用户在实际应用中选择最适合的方案&#xff0c;实现高效、灵活的温控系统。 LabVIEW与欧陆温控表通讯的实现与应用&#…

派生类中调用基类的__init__()方法

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在派生类中定义__init__()方法时&#xff0c;不会自动调用基类的__init__()方法。例如&#xff0c;定义一个Fruit类&#xff0c;在__init__()方法中创…