演示

How to

面向 Quark ERP 插件开发的任务配方:脚手架插件、公开页、移动端 UI、FAB、自定义数据库、缓存、迁移与插件资源。每页是带代码的清单;完整 API 见 Documentation。

从哪里开始

已知目标、需要最短正确路径时用 How to。首次搭建项目用 Getting started。需要完整 API、选项与边界情况时用 Documentation。

  • 结果明确、需要步骤与代码时优先用这些配方
  • Getting started — 新项目、CLI、目录结构、第一个插件
  • Documentation — 后端 / 前端完整 API 参考
  • Troubleshooting — 启动、DI、热更新、Tailwind、403 / UI 缺失

创建插件

用 @quan-erp/cli 脚手架(或复制 sample-es),对齐目录 / metadata / 包名与 @quan-erp/* 版本,加入第一个功能,运行 quan-erp watch,再在 Modules UI 中 Install。

  • 何时 — 在 plugins/ 下新建插件
  • 结果 — Install 后 shell 中出现菜单/路由

如何创建公开页

用 AppRegistry.rootRoute.add() 注册无 ERP 外壳的空白布局页面——不要用 route.add()。用于客户门户、厨房看板、二维码菜单等。

  • 何时 — UI 不能显示侧栏 / 管理外壳
  • 关键 API — rootRoute.add,路径以 /${metadata.name} 为前缀

如何做移动端适配

桌面表格搭配移动端卡片列表,使用 useMediaQuery / SCREENS,并用共享 UI 辅助保持底栏与 FAB 间距一致。

  • 何时 — 页面需同时适配手机与桌面
  • 要点 — isMobile 门控、卡片列表 vs 密集表格

添加浮动操作按钮

使用 @quan-erp/shared-ui 的 FloatingActionButton 添加仅移动端的主操作。用 isMobile 控制显示,并在底栏可见时调整位置。

  • 何时 — 移动端列表上的创建 / 主操作
  • 关键 API — FloatingActionButton、useIsContainInBottomNavBar

添加新的数据库源

优先使用共享默认 DataSource(plugin: "default")。仅在需要单独主机、库、报表库或副本时,在根 @Module 上用 @Database 打开自定义连接。

  • 何时 — 需要超出共享 Postgres 的隔离
  • 关键 API — @Database、匹配的 plugin + name 实体、@InjectDatabaseSource

添加缓存

在根模块上用 @Cache 声明缓存(内存或从环境变量读取的 Redis),用 @CacheClient 注入,并可选用 @CacheRoute / @CacheFn 缓存 HTTP 路由或方法结果。

  • 何时 — 重复读取、会话/令牌存储、昂贵计算
  • 关键 API — @Cache、@CacheClient、路由/方法辅助、跨插件复用

如何为插件创建数据库迁移

通过 IPlugin.getMigrations() 返回实现 getName、getSource、up、down 的 IDatabaseMigration 类交付 schema 变更。生产升级不要依赖 synchronize。

  • 何时 — 增删改 schema 或一次性回填
  • 关键 API — IDatabaseMigration、getMigrations()、可选 onMigrate()

插件前端与后端资源

随插件打包静态文件:后端放在 backend/assets/ 并用 AppFolder;前端 URL 用 PluginAssets.network。不要硬编码 APP_DATA_FOLDER;不要在运行时写入 asset 目录。

  • 何时 — 模板、种子 JSON、Logo 等打包静态文件
  • 关键 API — AppFolder.getPluginAssetFolder / getPluginDataFolder、PluginAssets.network