BuildingAI 帮助文档
BuildingAI 官网
  1. 插件与框架开发
  • 欢迎使用 BuildingAI
  • 演示环境
  • 用户社群
  • 企业版咨询
  • 产品线路图
  • 更新日志
  • API 赞助商
  • 积分获取方式
  • 应用安装教程「必看」
  • 使用教程
    • 功能使用教程
      • 对话
      • 智能体
      • 知识库
      • 工作流
      • MCP 服务
      • 登录配置
      • 密钥配置
      • 模型计费
      • 积分充值
      • 会员订阅
      • 卡密兑换
      • DIY装修
    • 常见配置教程
      • 微信支付配置
      • 支付宝支付配置
      • 微信公众号配置
      • OSS存储配置
      • 短信配置
      • 谷歌登录配置
      • Ollama配置
    • 应用插件配置教程
      • 香蕉绘画Pro版-Nano banana
      • Wan漫剧 | 角色+多镜头叙事
      • GEO优化排名工具
      • 小红薯热门内容创作助手
      • 即梦AI绘画&视频
      • AI 证件照 | 自定义背景色
      • 电商试衣换装-AI模特
      • 爆款文章自动配图
      • 一键生成像素动画
      • 反推提示词助手
    • 大模型申请教程
      • 即梦AI密钥-申请教程
      • 豆包大模型-申请教程
      • 通义千问-申请教程
  • 部署教程
    • 宝塔面板部署
    • Windows 环境下 Docker 部署
    • Docker方式安装
  • 开发文档
    • 网络接口
      • 登录注册
        • 账号密码登录
        • 账号密码注册
      • 前台
        • 文件上传/下载
          • 单个上传
          • 多个上传
          • 列表
          • 详情
          • 下载
          • 删除
        • 用户
          • 算力明细
          • 登录配置
        • AI聊天
          • 对话(非流式)
          • 流式对话
          • 对话记录
          • 对话详情
          • 修改记录
          • 删除记录
          • 获取记录对话
        • MCP
          • 列表
          • 所有记录
          • 详情:id
          • 创建
          • 修改
          • 可见状态
          • 添加
          • 关联详情
          • 系统MCP
          • json导入
          • 移除
          • 删除
          • 获取快捷菜单
          • 系统MCP详情:id
          • 连通性
          • 批量连通性
        • 充值中心
          • 充值中心
          • 充值提交订单
          • 充值记录
          • 预支付
          • 获取支付结果
        • 模型厂商
          • 列表
          • 详情:id
          • 详情:code
        • AI模型
          • 列表
          • 详情:id
          • 默认模型
        • 数据分析
          • 数据记录
        • 会员中心
          • 会员中心信息
          • 获取套餐列表
          • 预支付
          • 订阅提交订单
      • 后台
        • 工作空间
          • MCP
            • 列表
            • 详情
            • 创建
            • 修改
            • 删除
            • 批量删除
            • 启用状态
            • json导入
            • 连通性
            • 批量连通性
            • 获取快捷菜单
            • 设置快捷菜单
          • AI模型
            • 厂商管理
              • 列表
              • 新增
              • 详情:id
              • 详情:provider
              • 修改
              • 删除
              • 状态
            • 模型管理
              • 列表
              • 新增
              • 详情:id
              • 修改
              • 删除:id
              • 批量删除
              • 设为默认
              • 模型类型
              • 模型支持能力
              • 父级模型类型
          • AI知识库
            • 知识库列表
            • 知识库详情
            • 转移知识库
            • 知识库删除
            • 知识库文档列表
            • 知识库文档详情
            • 知识库文档删除
            • 知识库分段列表
            • 知识库分段详情
            • 知识库分段删除
            • 数据列表接口
          • AI智能体
            • 智能体创建
            • 智能体列表
            • 智能体详情
            • 智能体对话记录列表
            • 智能体对话记录详情
            • 智能体对话
            • 智能体发布API接口对话
            • 智能体发布API获取对话列表
            • 智能体发布API获取对话消息
            • 智能体发布API更新对话
            • 智能体发布API删除对话
          • 密钥管理
            • 密钥模板
              • 列表
              • 全部列表
              • 详情
              • 创建
              • 修改
              • 删除
              • 批量删除
              • 修改状态
              • json导入
            • 密钥配置
              • 列表
              • 列表:templateId
              • 创建
              • 统计
              • 详情
              • 完整详情
              • 修改
              • 修改状态
              • 删除
              • 批量删除
        • 用户管理
          • 列表
          • 创建
          • 详情:id
          • 删除
          • 批量删除
          • 重置密码
          • 更新状态
          • 重置随机密码
          • 登录设置
          • 登录设置
        • 角色管理
          • 创建
          • 详情:id
          • 修改
          • 删除
          • 列表
        • 菜单管理
          • 创建
          • 详情:id
          • 修改
          • 删除
          • 列表
        • 插件管理
          • 我的插件
            • 列表
            • 修改
            • 详情:id
            • 创建
            • 启用列表
            • 批量删除
            • 删除:id
            • 批量状态
            • 禁用:id
            • 启用:id
            • 是否存在:identifier
            • 详情:identifier
            • 入库插件详情:identifier
            • 本地列表
            • 类型列表
            • 版本列表:identifier
            • 安装
            • 卸载
          • 插件操作
            • 下载
            • 安装
          • 平台密钥
            • 获取开发者密钥
            • 设置开发者密钥
        • 权限管理
          • 列表
          • 扫描权限
          • 同步到库
          • 扫描接口
          • 清理废弃权限
          • 详情:code
        • 字典配置
          • 列表
        • 系统操作
          • 支付配置
            • 列表
            • 详情:id
            • 状态
            • 更新
          • 系统信息
            • 安装状态
            • 安装状态
          • pm2
            • 进程列表
            • 日志
            • 重启
            • 重载
            • 停止进程
            • 进程详情
            • 进程状态
            • 清空日志
            • 保存进程
            • 健康检查
            • 删除进程
        • 套餐充值
          • 获取套餐充值配置
          • 获取套餐充值配置 Copy
        • 财务
          • 财务中心
          • 用户余额明细
        • 订单管理
          • 充值订单列表
          • 充值订单详情
          • 充值订单退款
          • 会员订单列表
        • 渠道管理
          • 公众号配置
            • 详情
            • 修改
        • 数据分析
          • 数据看板
        • VIP 会员
          • 会员等级
            • 新增会员等级
            • 会员等级列表
            • 修改会员等级
            • 会员等级详情
            • 删除会员等级
          • 订阅计划
            • 新增订阅计划
            • 订阅计划设置
            • 设置会员功能状态
            • 更改订阅计划状态
            • 订阅计划详情
            • 修改订阅计划
            • 删除订阅计划
            • 更新订阅计划排序
      • 插件
        • 文章插件
          • 前台
            • 列表
          • 后台
            • 文章
              • 列表
              • 创建
            • 分类
              • 列表
              • 创建
        • 智能体-企业微信插件
          • 对话接口
        • 配图大师
          • 后台
            • 配图记录
            • 获取配图插件
            • 插件设置
    • 插件与框架开发
      • 技术规范
      • 前置准备
      • 本地部署与开发
      • 目录结构
      • 项目配置
      • 主程序启动链路
      • 请求处理链路
      • 后端开发约定
      • BaseController 与 BaseService
      • DTO、工具与通用服务
      • 前端开发
      • 主程序计费接入
      • 数据库与实体建议
      • AI SDK 开发文档
      • BuildingAI 升级开发文档
      • 前端组件与工具开发文档
      • 后端工具与封装开发文档
      • 应用开发
        • 介绍
        • 创建应用
        • 模板结构
        • 应用开发
        • 打包发布
        • 插件更新
        • 插件清单文件
        • 插件后端开发
        • 插件前端开发
        • Extension SDK 怎么用
        • 插件计费接入
        • 插件 AI 能力接入建议
        • Seeds、Upgrade 与存储
        • 插件升级开发文档
        • 构建与发布
        • 插件前端组件与工具文档
        • 插件后端工具与封装文档
      • PC 客户端
        • 开发文档
        • 构建文档
  • 设计资源
    • 官方素材库
  • 政策
    • 开源许可
    • 服务条款
    • 隐私政策
  1. 插件与框架开发

后端工具与封装开发文档

本文档整理 BuildingAI 后端中已经封装好的基础类、装饰器、模块和工具函数。目标是让开发者新增业务模块、扩展 API、数据库操作、上传/队列/缓存逻辑时,优先复用现有封装。

范围与导入规则#

类型位置导入方式用途
基础 Controller/Servicepackages/@buildingai/base/src@buildingai/base标准 CRUD、分页、事务、日志
DTO/Pipepackages/@buildingai/dto/src、packages/@buildingai/pipe/src@buildingai/dto、@buildingai/pipe/...分页 DTO、UUID 校验
错误封装packages/@buildingai/errors/src@buildingai/errors统一业务错误
主应用 Controller 装饰器packages/api/src/common/decorators@common/decoratorsWeb/Console/OpenAPI/权限/会员/API Key
通用后端装饰器packages/@buildingai/decorators/src@buildingai/decoratorsPublic、Playground、BuildFileUrl、SkipTransform、SuperAdminOnly
扩展后端装饰器packages/core/src/decorators@buildingai/core/decoratorsExtension Controller、Extension Entity、MemberOnly
TypeORM/实体packages/@buildingai/db/src@buildingai/db/...TypeORM、实体、Seeder、文件 URL
后端核心模块packages/core/src/modules@buildingai/core/modules 或 @buildingai/core上传、云存储、队列、计费、密钥、扩展
缓存/Redispackages/@buildingai/cache/src@buildingai/cacheCacheModule、RedisModule
通用工具packages/@buildingai/utils/src@buildingai/utilswhere、路径、状态、类型转换、文件、安全、版本
扩展 SDKpackages/@buildingai/extension-sdk/src@buildingai/extension-sdk扩展调用平台用户/AI/计费能力、tsup 配置
建议:
Service 优先继承 BaseService<Entity>。
Controller 优先继承 BaseController。
Controller 路由优先使用项目封装装饰器,不直接裸写 @Controller("xxx")。
查询 DTO 优先继承 PaginationDto。
路径 id 优先用 UUIDValidationPipe。
业务错误优先用 HttpErrorFactory。
文件路径响应优先用 BuildFileUrl。

BaseController#

位置:packages/@buildingai/base/src/controllers/base.controller.ts
封装内容:
自动创建 Nest Logger,logger context 为子类名。
提供 paginationResult(data, total, paginationDto)。
import { BaseController } from "@buildingai/base";

export class ArticleController extends BaseController {
    async list(dto: QueryArticleDto) {
        this.logger.log("query article list");
        return this.articleService.list(dto);
    }
}
paginationResult 返回格式:
{
    items: T[];
    total: number;
    page: number;
    pageSize: number;
    totalPages: number;
}
通常不需要在 Controller 手动调用它,因为 BaseService.paginate()
已经返回同样格式。只有 Controller 自己组合数据时再用。

BaseService#

位置:packages/@buildingai/base/src/services/base.service.ts
适用条件:
实体有 id: string 字段。
使用 TypeORM Repository。
业务是常见 CRUD、分页、字段过滤、事务、软删除/恢复。

基本写法#

import { BaseService } from "@buildingai/base";
import { InjectRepository } from "@buildingai/db/@nestjs/typeorm";
import { Repository } from "@buildingai/db/typeorm";
import { Injectable } from "@nestjs/common";

@Injectable()
export class ArticleService extends BaseService<Article> {
    constructor(@InjectRepository(Article) repo: Repository<Article>) {
        super(repo);
    }
}

方法总览#

类型方法说明
分页paginate(dto, options)基于 findAndCount 的标准分页
高级分页paginateQueryBuilder(qb, dto, excludeFields?, includeFields?, lock?)复杂 SQL/关联查询分页
创建create(dto, options?)创建单条
批量创建createMany(dtos, options?)事务批量创建
更新updateById(id, dto, options?)根据 id 更新
条件更新update(where, dto, options?)按 where 更新
查询findOneById(id, options?)id 查询
条件查询findOne(options?)TypeORM options 查询
全量查询findAll(options?)返回数组
删除delete(id, options?)删除单条
批量删除deleteMany(idsOrWhere, options?)批量删除
恢复restore(id, options?)软删除恢复
计数count(options?)统计
事务withTransaction(callback, isolationLevel?)开启事务
重试withRetry(operation, lockOptions?)可重试操作

标准分页#

import { Like } from "@buildingai/db/typeorm";
import { buildWhere } from "@buildingai/utils";

async list(dto: QueryArticleDto) {
    const where = buildWhere<Article>({
        title: dto.title ? Like(`%${dto.title}%`) : undefined,
        status: dto.status,
        categoryId: dto.categoryId,
    });

    return this.paginate(dto, {
        where,
        relations: ["category", "author"],
        order: { sort: "DESC", createdAt: "DESC" },
        select: {
            author: {
                id: true,
                avatar: true,
                nickname: true,
            },
        },
    });
}

字段过滤#

excludeFields 和 includeFields 支持嵌套路径,例如 author.password、items.*.avatar。
return this.findOneById(id, {
    relations: ["author"],
    excludeFields: ["author.password", "author.salt"] as const,
});
或只包含指定字段:
return this.findAll({
    includeFields: ["id", "title", "author.nickname"] as const,
});
注意:
includeFields 与 excludeFields 不建议同时使用。
字段过滤发生在查询返回后,不等同于 SQL select;敏感字段最好同时在 TypeORM select 层规避。

QueryBuilder 分页#

适合复杂关联、聚合、手写条件:
const qb = this.repository
    .createQueryBuilder("article")
    .leftJoinAndSelect("article.category", "category")
    .where("article.title ILIKE :keyword", { keyword: `%${dto.keyword}%` })
    .orderBy("article.createdAt", "DESC");

return this.paginateQueryBuilder(qb, dto, ["author.password"]);

事务#

await this.withTransaction(async (manager) => {
    await this.updateById(id, dto, { entityManager: manager });

    const repo = manager.getRepository(ArticleLog);
    await repo.save(repo.create({ articleId: id, action: "update" }));
});
注意:
在事务中调用 BaseService 方法时传 entityManager,避免不同 repository 不在同一个事务。
多个 Service 协作时,尽量让最外层 Service 负责开启事务并传递 entityManager。

锁和重试#

BaseService 提供 LockType 和 LockOptions:
import { LockType } from "@buildingai/base/services/base.service";

await this.updateById(id, dto, {
    lock: {
        type: LockType.PESSIMISTIC_WRITE,
        retryCount: 3,
        retryDelay: 100,
    },
});
适用:
余额、算力、库存这类并发写。
防止同一记录被多个请求同时修改。

条件辅助#

BaseService 内置:
方法说明
ilike(field, value)PostgreSQL ILIKE 模糊查询
textSearch(field, value)PostgreSQL 全文搜索
jsonQuery(jsonField, path, value)JSON 字段查询
arrayContains(field, value)数组包含查询
这些是 protected 方法,只能在子类里用。

DTO 与 Pipe#

PaginationDto#

位置:packages/@buildingai/dto/src/pagination.dto.ts
字段:
字段默认值校验
page1number,最小 1
pageSize15number,最小 1
import { PaginationDto } from "@buildingai/dto";
import { IsOptional, IsString } from "class-validator";

export class QueryArticleDto extends PaginationDto {
    @IsOptional()
    @IsString()
    title?: string;
}

UUIDValidationPipe#

位置:packages/@buildingai/pipe/src/param-validate.pipe.ts
import { UUIDValidationPipe } from "@buildingai/pipe/param-validate.pipe";

@Get(":id")
findOne(@Param("id", UUIDValidationPipe) id: string) {
    return this.service.findOneById(id);
}
如果 id 不是 UUID,会抛 BadRequestException("Invalid UUID format")。

错误封装#

位置:packages/@buildingai/errors/src
核心:
ApplicationError
HttpError
HttpErrorFactory
HttpStatus
业务层推荐使用 HttpErrorFactory:
import { HttpErrorFactory } from "@buildingai/errors";

if (!entity) {
    throw HttpErrorFactory.notFound("记录不存在");
}

if (!canUpdate) {
    throw HttpErrorFactory.forbidden("无权操作");
}

if (!dto.name) {
    throw HttpErrorFactory.badRequest("名称不能为空");
}
使用建议:
Service 中抛业务错误用 HttpErrorFactory。
Controller 中不要吞掉错误后返回 { success: false },除非这是已约定的接口格式。
第三方回调需要原样返回时,配合 SkipTransform()。

主应用 Controller 装饰器#

位置:packages/api/src/common/decorators

WebController#

用于前台用户侧 API。
import { WebController } from "@common/decorators";

@WebController("article")
export class ArticleWebController {
    @Get()
    list() {}
}
路由:
如果配置 VITE_APP_WEB_API_PREFIX,使用该前缀。
否则默认 api/{path}。
公开接口:
@WebController({ path: "public", skipAuth: true })
export class PublicController {}

ConsoleController#

用于后台控制台 API,会自动记录权限组 metadata。
import { ConsoleController, Permissions } from "@common/decorators";

@ConsoleController("role", "角色管理")
export class RoleController extends BaseController {
    @Get()
    @Permissions({ code: "role:list", name: "角色列表", action: "查看" })
    findAll() {
        return this.roleService.findAll();
    }
}
选项:
@ConsoleController(
    {
        path: "settings",
        skipAuth: false,
        skipPermissionCheck: true,
    },
    "系统设置",
)
export class SettingsController {}

OpenApiController#

用于开放 API,路由前缀为 v1,由 API Key guard 鉴权。
@OpenApiController("chat-messages")
export class OpenChatController {
    @Post()
    chat() {}
}

Permissions#

@Permissions({
    code: "user:create",
    name: "创建用户",
    action: "创建",
    group: "user",
    groupName: "用户管理",
})
@Post()
create() {}
说明:
主应用权限会被标记为系统权限。
权限扫描和后台权限配置依赖这些 metadata。
不需要展示在权限列表但仍要控制访问时,可设置 hidden: true。

AgentPublicAccess 与 AgentApiKey#

适合智能体公开访问或 API Key 访问场景。
@AgentPublicAccess({
    route: "/public/agents/:id/chat",
    targetPath: "/api/agents/:id/chat",
    method: "POST",
})
@Post(":id/chat")
chat() {}

@AgentApiKey()
@Post(":id/messages")
messages() {}

通用后端装饰器#

位置:packages/@buildingai/decorators/src

Public#

跳过登录认证。
import { Public } from "@buildingai/decorators";

@Public()
@Get("config")
getPublicConfig() {}

Playground#

获取当前用户上下文。
import { Playground } from "@buildingai/decorators/playground.decorator";
import type { UserPlayground } from "@buildingai/db";

@Post()
create(@Body() dto: CreateDto, @Playground() user: UserPlayground) {
    return this.service.create(dto, user.id);
}
注意:Playground() 不允许在公共路由中使用;公共路由没有登录上下文。

BuildFileUrl#

用于响应返回前拼接文件访问域名。
import { BuildFileUrl } from "@buildingai/decorators";

@BuildFileUrl(["avatar", "cover", "author.avatar", "items.*.thumbnail"])
@Get()
list() {}
支持:
简单字段:avatar
嵌套字段:author.avatar
数组字段:items.*.image
配置对象:{ field: "images", isArray: true }

SkipTransform#

跳过统一响应包装,适合支付回调、第三方 webhook、下载响应。
import { SkipTransform } from "@buildingai/decorators";

@SkipTransform()
@Post("webhook")
webhook() {
    return "success";
}

SuperAdminOnly#

import { SuperAdminOnly } from "@buildingai/decorators";

@SuperAdminOnly()
@Delete(":id")
removeSystemResource() {}

扩展后端装饰器#

位置:packages/core/src/decorators

ExtensionWebController#

扩展前台 API。
import { ExtensionWebController } from "@buildingai/core/decorators";

@ExtensionWebController("article")
export class ArticleWebController {
    @Get()
    list() {}
}
路由格式:
/{extensionIdentifier}/api/{path}

ExtensionConsoleController#

扩展后台 API,会注册扩展权限组。
import { ExtensionConsoleController } from "@buildingai/core/decorators";

@ExtensionConsoleController("article", "文章管理")
export class ArticleController extends BaseController {}
路由格式:
/{extensionIdentifier}/console/{path}
权限组 code:
{extensionIdentifier}@{path}

ExtensionEntity#

扩展实体自动进入扩展独立 schema。
import { ExtensionEntity } from "@buildingai/core/decorators";
import { Column, PrimaryGeneratedColumn } from "@buildingai/db/typeorm";

@ExtensionEntity("article")
export class Article {
    @PrimaryGeneratedColumn("uuid")
    id: string;

    @Column()
    title: string;
}
使用注意:
只在扩展实体中使用。
构建后的调用栈会用于识别扩展目录。
表名可以传字符串,也可以传 EntityOptions。

MemberOnly#

用于会员等级限制,主应用和扩展都存在类似装饰器。扩展里优先使用 @buildingai/core/decorators。
@MemberOnly({
    code: "simple-blog:advanced-export",
    name: "高级导出",
    description: "导出完整文章数据",
})
@Post("export")
exportAll() {}

TypeORM 与数据库封装#

常用导入:
import { TypeOrmModule } from "@buildingai/db/@nestjs/typeorm";
import { User } from "@buildingai/db/entities";
import { DataSource, Repository } from "@buildingai/db/typeorm";
模块注册:
@Module({
    imports: [TypeOrmModule.forFeature([Article, Category])],
    providers: [ArticleService, CategoryService],
    controllers: [ArticleController],
})
export class ArticleModule {}
Seeder:
import { BaseSeeder } from "@buildingai/db";

export class ArticleSeeder extends BaseSeeder {
    async run() {
        // seed data
    }
}
文件 URL:
实体字段可通过 DB 层装饰器标记归一化。
Controller 响应字段可用 BuildFileUrl 做域名拼接。

后端核心模块#

位置:packages/core/src/modules

UploadModule / FileUploadService#

适用:
后端处理上传记录。
保存文件元数据。
结合云存储服务返回访问 URL。
import { UploadModule, FileUploadService } from "@buildingai/core/modules";

@Module({
    imports: [UploadModule],
    providers: [MyService],
})
export class MyModule {}

CloudStorageModule / CloudStorageService#

适用:统一云存储访问,当前主要包含 OSS 实现。
import { CloudStorageModule, CloudStorageService } from "@buildingai/core/modules";

QueueModule / QueueService#

适用:异步任务、邮件、文件处理、向量化等。
import { QueueModule, QueueService } from "@buildingai/core/modules";

@Module({
    imports: [QueueModule],
})
export class WorkerModule {
    constructor(private readonly queueService: QueueService) {}
}

BillingModule / AppBillingService#

适用:平台级算力/余额扣费、充值、会员权益扣减。
import { AppBillingService, BillingModule } from "@buildingai/core/modules";

SecretModule / SecretService#

适用:密钥模板、用户/系统密钥管理,避免业务模块直接处理敏感信息。
import { SecretModule, SecretService } from "@buildingai/core/modules";

ExtensionsService#

适用:扩展安装、启停、配置、schema、版本管理相关逻辑。
import { ExtensionsService } from "@buildingai/core/modules";

ScheduleService#

位置:packages/core/src/services/schedule.service.ts
适用:运行时注册和管理 cron、interval、timeout。
import { ScheduleService } from "@buildingai/core";
如果只是普通 Nest 定时任务,优先使用 @buildingai/core/@nestjs/schedule 中 re-export 的 Nest
schedule 能力,保持版本一致。

Cache 与 Redis#

位置:packages/@buildingai/cache/src
导入:
import { CacheModule, CacheService, RedisModule, RedisService } from "@buildingai/cache";
模块使用:
@Module({
    imports: [RedisModule, CacheModule],
})
export class MyModule {}
建议:
需要直接操作 Redis 时注入 RedisService。
普通业务缓存优先注入 CacheService。
缓存 key 应包含业务模块前缀,避免冲突。

通用工具函数#

位置:packages/@buildingai/utils/src

类型转换#

import {
    asArray,
    asBoolean,
    asDate,
    asDefined,
    asError,
    asJson,
    asNumber,
    asObject,
    asOneOf,
    asString,
} from "@buildingai/utils";

const page = asNumber(query.page, 1);
const enabled = asBoolean(dto.enabled);
const tags = asArray(dto.tags);
const payload = asObject(dto.payload);
const type = asOneOf(input.type, ["web", "console"] as const, "web");

条件对象与 where#

import { buildConditionalObject, buildWhere } from "@buildingai/utils";
import { Like } from "@buildingai/db/typeorm";

const where = buildWhere({
    title: keyword ? Like(`%${keyword}%`) : undefined,
    status,
});

const updatePayload = buildConditionalObject({
    nickname: dto.nickname,
    avatar: dto.avatar || undefined,
});

路径工具#

import { joinPaths, joinRouterPaths, validatePath } from "@buildingai/utils";

validatePath(pathSegment);
const route = joinRouterPaths("simple-blog", "console", "article");
const filePath = joinPaths(root, "storage", "uploads");
validatePath 常用于 Controller path,防止路径片段里包含 /、: 等非法字符。

状态与环境#

import { isDevelopment, isDisabled, isEnabled, isProduction } from "@buildingai/utils";

if (isEnabled(user.status)) {
}
if (isDisabled(config.status)) {
}
isDevelopment(() => this.logger.debug("debug only"));

装饰器 metadata 工具#

import { getOverrideMetadata } from "@buildingai/utils";

const permissions = getOverrideMetadata(reflector, DECORATOR_KEYS.PERMISSIONS_KEY, context);
适用:Guard、Interceptor、Filter 中读取 Controller/Handler metadata。

文件、安全、版本#

工具作用
FileDownloader下载文件
ExtensionFileManager扩展文件管理
FileUrlProcessorUtil处理响应中的文件 URL
parseExtensionIdentifier从 URL 路径解析扩展标识
parsePackageName解析 npm 包名
maskSensitiveValue敏感值脱敏
decryptValue解密敏感值
checkVersionCompatibility检查扩展/引擎版本兼容
BdVersionBuildingAI 版本工具
createResolvablePromise可外部 resolve/reject 的 Promise
DelayedPromise延迟 Promise
StreamUtils流处理工具

扩展后端 SDK#

位置:packages/@buildingai/extension-sdk/src
导入:
import {
    AiPublicModule,
    ExtensionBillingModule,
    ExtensionBillingService,
    PublicAiModelService,
    PublicUserService,
    defineBuildingAITsupConfig,
} from "@buildingai/extension-sdk";

PublicUserService#

扩展里查询平台用户信息。
@Injectable()
export class ArticleService extends BaseService<Article> {
    constructor(
        @InjectRepository(Article) repo: Repository<Article>,
        private readonly userService: PublicUserService,
    ) {
        super(repo);
    }

    async createArticle(dto: CreateArticleDto, authorId: string) {
        const author = await this.userService.findUserById(authorId);
        if (!author) throw HttpErrorFactory.notFound("作者不存在");
        return this.create({ ...dto, author } as Partial<Article>);
    }
}

PublicAiModelService#

扩展调用平台 AI 模型能力时使用。模块中导入 AiPublicModule。
@Module({
    imports: [AiPublicModule],
    providers: [MyAiService],
})
export class MyModule {}

ExtensionBillingService#

扩展功能扣费/扣算力时使用。模块中导入 ExtensionBillingModule。
@Module({
    imports: [ExtensionBillingModule],
    providers: [ExportService],
})
export class ExportModule {}

defineBuildingAITsupConfig#

扩展后端构建配置。
import { defineBuildingAITsupConfig } from "@buildingai/extension-sdk";

export default defineBuildingAITsupConfig({
    assets: ["db/seeds/data", "assets/**/*"],
});
默认:
入口:src/api/**/*.ts
输出:build
格式:CommonJS
target:es2023
tsconfig:tsconfig.api.json
构建成功后复制静态资源

新增后端业务模块流程#

主应用模块#

1.
在 packages/api/src/modules/{module} 下建 dto、services、controllers、module.ts。
2.
Entity 使用 @buildingai/db/entities 中已有实体,或新增到 DB 包。
3.
查询 DTO 继承 PaginationDto。
4.
Service 继承 BaseService<Entity>。
5.
Controller 继承 BaseController。
6.
前台接口用 WebController,后台接口用 ConsoleController。
7.
权限接口补 Permissions。
8.
id 参数用 UUIDValidationPipe。
9.
当前用户用 Playground()。
10.
业务错误用 HttpErrorFactory。
11.
返回文件字段用 BuildFileUrl()。

扩展模块#

1.
以 templates/extension-starter/src/api 为结构参考。
2.
Entity 使用 ExtensionEntity。
3.
Controller 使用 ExtensionWebController / ExtensionConsoleController。
4.
Service 继承 BaseService<Entity>。
5.
需要平台用户时注入 PublicUserService。
6.
需要 AI 能力时导入 AiPublicModule。
7.
需要扣费时导入 ExtensionBillingModule。
8.
构建使用 defineBuildingAITsupConfig。

常见反模式#

在 Controller 里直接写复杂业务逻辑。应放到 Service。
Service 不继承 BaseService,重复写 CRUD 和分页。
分页接口不继承 PaginationDto,导致 page/pageSize 类型不稳定。
业务错误直接 throw new Error(),前端无法得到统一业务码。
扩展实体使用普通 @Entity,导致没有进入扩展 schema。
扩展 Controller 裸写 @Controller,导致路由前缀、权限组和扩展标识丢失。
文件 URL 在业务里手动拼接域名。应使用 BuildFileUrl 或 DB 文件 URL 处理封装。
多表写入不传 entityManager,导致事务不完整。
修改于 2026-04-21 08:13:21
上一页
前端组件与工具开发文档
下一页
介绍
Built with