演示

控制器 / 路由

通过 @Controller、路由/方法装饰器、参数装饰器与 @APIInfo 编写 HTTP API。始终返回 ResponseDto 形状的响应。

@Controller

@Controller(path) 设置基础路由。插件名会自动作为前缀(例如 /reward-point → /<plugin>/reward-point)。

TSXcontroller
1import { 2 AuthenticatedUserOnly, 3 CheckAPIPermission, 4 Controller, 5 Get, 6 ResponseDto, 7} from "@quan-erp/shared-backend-core"; 8 9@Controller("/reward-point") 10export class RewardPointController { 11 @Get("/") 12 @AuthenticatedUserOnly() 13 @CheckAPIPermission() 14 async list() { 15 return ResponseDto.ok(/* … */); 16 } 17}

HTTP 方法

  • @Get / @Post / @Put / @Delete — path 必须以 "/" 开头
  • 可按需组合安全、@APIInfo、缓存与工作流装饰器

路由参数

  • @Param(name) — 路径参数
  • @Query(name) — 查询参数
  • @Body() — 通常为 RequestDto<T>
  • @User() — RequestedUser
TSXparams
1import { 2 Body, 3 Controller, 4 Param, 5 Put, 6 RequestDto, 7 RequestedUser, 8 User, 9} from "@quan-erp/shared-backend-core"; 10import type { UpdateDto } from "./update.dto.js"; 11 12@Controller("/order") 13export class OrderController { 14 @Put("/:id") 15 async update( 16 @Param("id") id: number, 17 @Body() body: RequestDto<UpdateDto>, 18 @User() user: RequestedUser, 19 ) { /* … */ } 20}

@APIInfo

用于 Doc 与系统集成的元数据:shortDescription、description、isPublic、contentType、requestDto、responseDto、queryParams、pathParams、headers。

TSXapi-info
1import { 2 APIInfo, 3 Controller, 4 Get, 5 JsonContentType, 6 JWTAuthorizationHeader, 7 ResponseDto, 8 SkipLimitQueryParam, 9} from "@quan-erp/shared-backend-core"; 10 11@Controller("/branch") 12export class BranchController { 13 @Get("/") 14 @APIInfo({ 15 shortDescription: "Get all branches", 16 contentType: JsonContentType, 17 responseDto: ResponseDto, 18 queryParams: SkipLimitQueryParam, 19 headers: JWTAuthorizationHeader, 20 }) 21 async list() { /* … */ } 22}

请求与响应 DTO

用 RequestDto / ResponseDto 包装载荷,使前端始终收到一致形状(payload、errors、meta)。

Service CRUD 模式

  • 创建:repo.insert(...) → 从 identifiers 返回 { id }(不要插入后再 findOne)
  • 更新:repo.update({ id }, { ...data, updateDate }) 并检查 affected
  • 删除:repo.softDelete + 检查 affected