logologo
开始
手册
开发
插件
API
English
简体中文
开始
手册
开发
插件
API
English
简体中文
logologo

快速入门

插件开发概述
编写第一个插件
项目目录结构

服务端开发

概述
Plugin 插件
Collections 数据表
Database 数据库操作
DataSourceManager 数据源管理
ResourceManager 资源管理
ACL 权限控制
Middleware 中间件
Cache 缓存
Event 事件
Context 请求上下文
Migration 升级脚本
Logger日志
I18n 国际化
Command 命令行
CronJobManager 定时任务管理
Test 测试

客户端开发

概述
Plugin 插件
Context 上下文
Router 路由
ACL 权限控制
DataSourceManager 数据源管理
Resource 资源
Request 请求
Styles & Themes 样式与主题
Logger 日志
I18n 国际化
Test 测试

其他

插件升级指南
语言列表
依赖管理
构建
Previous PageCollections 数据表
Next PageDataSourceManager 数据源管理

#Database 数据库

Database 是数据库类型数据源(DataSource)的重要组成部分。每个数据库类型的数据源都会有一个对应的 Database 实例,可以通过 dataSource.db 访问。主数据源的数据库实例还提供了便捷的 app.db 别名。熟悉 db 的常用方法,是编写服务端插件的基础。

#Database 组成部分

一个典型的 Database 由以下部分组成:

  • Collection:定义数据表结构。
  • Model:对应 ORM 的模型(通常由 Sequelize 管理)。
  • Repository:封装数据访问逻辑的仓库层,提供更高级的操作方法。
  • FieldType:字段类型。
  • FilterOperator:用于筛选的操作符。
  • Event:生命周期事件和数据库事件。

#插件中的使用时机

#在 beforeLoad 阶段适合做的事情

此阶段不可以进行数据库操作,适合静态类的注册或事件监听。

  • db.registerFieldTypes() — 自定义字段类型
  • db.registerModels() — 注册自定义模型类
  • db.registerRepositories() — 注册自定义仓库类
  • db.registerOperators() — 注册自定义筛选操作符
  • db.on() — 监听数据库相关事件

#在 load 阶段适合做的事情

此阶段所有前置的类定义和事件已经加载,再加载数据表就不会有缺失或遗漏。

  • db.defineCollection() — 定义新的数据表
  • db.extendCollection() — 扩展已有数据表配置

如果是用于定义插件的内置表,更推荐放在 ./src/server/collections 目录里,详见 Collections。

#数据操作

Database 提供两种主要方式访问和操作数据:

#通过 Repository 操作

const repo = db.getRepository('users');
const user = await repo.findOne({ filter: { id: 1 } });

Repository 层通常用于封装业务逻辑,例如分页、过滤、权限检查等。

#通过 Model 操作

const UserModel = db.getModel('users');
const user = await UserModel.findByPk(1);

Model 层直接对应 ORM 实体,适合执行较底层的数据库操作。

#哪些阶段可以进行数据库操作?

#Plugin 生命周期

阶段可进行数据库操作
staticImportNo
afterAddNo
beforeLoadNo
loadNo
installYes
beforeEnableYes
afterEnableYes
beforeDisableYes
afterDisableYes
removeYes
handleSyncMessageYes

#App 事件

阶段可进行数据库操作
beforeLoadNo
afterLoadNo
beforeStartYes
afterStartYes
beforeInstallNo
afterInstallYes
beforeStopYes
afterStopNo
beforeDestroyYes
afterDestroyNo
beforeLoadPluginNo
afterLoadPluginNo
beforeEnablePluginYes
afterEnablePluginYes
beforeDisablePluginYes
afterDisablePluginYes
afterUpgradeYes

#Database 事件/钩子

阶段可进行数据库操作
beforeSyncNo
afterSyncYes
beforeValidateYes
afterValidateYes
beforeCreateYes
afterCreateYes
beforeUpdateYes
afterUpdateYes
beforeSaveYes
afterSaveYes
beforeDestroyYes
afterDestroyYes
afterCreateWithAssociationsYes
afterUpdateWithAssociationsYes
afterSaveWithAssociationsYes
beforeDefineCollectionNo
afterDefineCollectionNo
beforeRemoveCollectionNo
afterRemoveCollectionNo