当前位置: 首页 > news >正文

TypeORM——订单管理实例

以下是用 TypeORM 实现订单管理 CRUD 的完整示例,包含实体定义、仓库操作、服务层和基础 API 实现:

1. 环境准备

npminstalltypeorm @nestjs/typeorm mysql2 reflect-metadata# 或npminstalltypeorm pg reflect-metadata# PostgreSQL

2. 实体定义 (order.entity.ts)

import{Entity,PrimaryGeneratedColumn,Column,CreateDateColumn,UpdateDateColumn,ManyToOne,OneToMany,JoinColumn}from"typeorm";import{User}from"./user.entity";import{OrderItem}from"./order-item.entity";exportenumOrderStatus{PENDING="PENDING",PAID="PAID",SHIPPED="SHIPPED",COMPLETED="COMPLETED",CANCELLED="CANCELLED"}@Entity()exportclassOrder{@PrimaryGeneratedColumn("uuid")id:string;@Column({unique:true})orderNumber:string;@Column("decimal",{precision:10,scale:2})totalAmount:number;@Column({type:"enum",enum:OrderStatus,default:OrderStatus.PENDING})status:OrderStatus;@ManyToOne(()=>User,user=>user.orders)@JoinColumn({name:"userId"})user:User;@Column()userId:string;@OneToMany(()=>OrderItem,item=>item.order,{cascade:true})items:OrderItem[];@CreateDateColumn()createdAt:Date;@UpdateDateColumn()updatedAt:Date;}

3. 关联实体 (order-item.entity.ts)

import{Entity,PrimaryGeneratedColumn,Column,ManyToOne}from"typeorm";import{Order}from"./order.entity";import{Product}from"./product.entity";@Entity()exportclassOrderItem{@PrimaryGeneratedColumn("uuid")id:string;@Column()productName:string;@Column("int")quantity:number;@Column("decimal",{precision:10,scale:2})price:number;@ManyToOne(()=>Order,order=>order.items,{onDelete:"CASCADE"})order:Order;}

4. 仓库接口 (order.repository.ts)

import{EntityRepository,Repository}from"typeorm";import{Order}from"./order.entity";import{CreateOrderDto}from"../dto/create-order.dto";@EntityRepository(Order)exportclassOrderRepositoryextendsRepository<Order>{asynccreateOrder(dto:CreateOrderDto):Promise<Order>{constorder=newOrder();order.orderNumber=this.generateOrderNumber();order.totalAmount=dto.items.reduce((sum,item)=>sum+item.price*item.quantity,0);order.status=OrderStatus.PENDING;order.userId=dto.userId;// 添加订单项order.items=dto.items.map(item=>{constorderItem=newOrderItem();orderItem.productName=item.productName;orderItem.quantity=item.quantity;orderItem.price=item.price;returnorderItem;});returnthis.save(order);}privategenerateOrderNumber():string{return`ORD-${Date.now()}-${Math.random().toString(36).substr(2,9)}`;}}

5. 服务层 (order.service.ts)

import{Injectable}from"@nestjs/common";import{InjectRepository}from"@nestjs/typeorm";import{OrderRepository}from"./order.repository";import{Order}from"./order.entity";import{UpdateOrderStatusDto}from"../dto/update-order-status.dto";@Injectable()exportclassOrderService{constructor(@InjectRepository(OrderRepository)privatereadonlyorderRepo:OrderRepository){}asynccreateOrder(createDto:CreateOrderDto):Promise<Order>{returnthis.orderRepo.createOrder(createDto);}asyncfindAll():Promise<Order[]>{returnthis.orderRepo.find({relations:["items"]});}asyncfindById(id:string):Promise<Order>{returnthis.orderRepo.findOne(id,{relations:["items"]});}asyncfindByUser(userId:string):Promise<Order[]>{returnthis.orderRepo.find({where:{userId},relations:["items"]});}asyncupdateStatus(id:string,updateDto:UpdateOrderStatusDto):Promise<Order>{awaitthis.orderRepo.update(id,{status:updateDto.status});returnthis.findById(id);}asyncdeleteOrder(id:string):Promise<void>{awaitthis.orderRepo.delete(id);}}

6. DTO 对象

create-order.dto.ts

import{IsString,IsArray,ValidateNested,IsNumber,Min}from"class-validator";import{Type}from"class-transformer";exportclassOrderItemDto{@IsString()productName:string;@IsNumber()@Min(1)quantity:number;@IsNumber()@Min(0)price:number;}exportclassCreateOrderDto{@IsString()userId:string;@IsArray()@ValidateNested({each:true})@Type(()=>OrderItemDto)items:OrderItemDto[];}

update-order-status.dto.ts

import{IsEnum}from"class-validator";import{OrderStatus}from"../entities/order.entity";exportclassUpdateOrderStatusDto{@IsEnum(OrderStatus)status:OrderStatus;}

7. 控制器 (order.controller.ts)

import{Controller,Get,Post,Body,Param,Patch,Delete}from'@nestjs/common';import{OrderService}from'./order.service';import{CreateOrderDto}from'./dto/create-order.dto';import{UpdateOrderStatusDto}from'./dto/update-order-status.dto';@Controller('orders')exportclassOrderController{constructor(privatereadonlyorderService:OrderService){}@Post()create(@Body()createOrderDto:CreateOrderDto){returnthis.orderService.createOrder(createOrderDto);}@Get()findAll(){returnthis.orderService.findAll();}@Get(':id')findOne(@Param('id')id:string){returnthis.orderService.findById(id);}@Patch(':id/status')updateStatus(@Param('id')id:string,@Body()updateDto:UpdateOrderStatusDto){returnthis.orderService.updateStatus(id,updateDto);}@Delete(':id')remove(@Param('id')id:string){returnthis.orderService.deleteOrder(id);}}

8. 模块配置 (order.module.ts)

import{Module}from'@nestjs/common';import{TypeOrmModule}from'@nestjs/typeorm';import{Order}from'./order.entity';import{OrderItem}from'./order-item.entity';import{OrderService}from'./order.service';import{OrderController}from'./order.controller';import{OrderRepository}from'./order.repository';@Module({imports:[TypeOrmModule.forFeature([Order,OrderItem])],providers:[OrderService,OrderRepository],controllers:[OrderController]})exportclassOrderModule{}

9. 数据库配置 (ormconfig.json)

{"type":"mysql","host":"localhost","port":3306,"username":"test","password":"test","database":"order_db","entities":["dist/**/*.entity{.ts,.js}"],"synchronize":true,"logging":true}

关键功能说明

  1. 自动生成订单号

    privategenerateOrderNumber():string{return`ORD-${Date.now()}-${Math.random().toString(36).substr(2,9)}`;}
  2. 级联保存订单项

    @OneToMany(()=>OrderItem,item=>item.order,{cascade:true})items:OrderItem[];
  3. 事务处理建议

    asynccreateOrder(dto:CreateOrderDto){returnthis.manager.transaction(asynctransactionalEntityManager=>{// 创建订单逻辑});}
  4. 高级查询示例

    // 查找待发货订单asyncfindPendingOrders(){returnthis.find({where:{status:OrderStatus.PAID},relations:["items","user"]});}

使用示例

创建订单

POST /orders{"userId":"user-123","items":[{"productName":"Laptop","quantity":1,"price":1200},{"productName":"Mouse","quantity":2,"price":25}]}

更新状态

PATCH /orders/ord-123/status{"status":"SHIPPED"}

查询结果

{"id":"a1b2c3d4...","orderNumber":"ORD-1689876543210-abc123def","totalAmount":1250,"status":"PENDING","items":[{"id":"e5f6g7h8...","productName":"Laptop","quantity":1,"price":1200},{"id":"i9j0k1l2...","productName":"Mouse","quantity":2,"price":25}],"createdAt":"2023-07-20T08:15:30.000Z"}

最佳实践建议

  1. 软删除:添加isDeleted字段替代物理删除
  2. 审计字段:添加createdBy,updatedBy记录操作者
  3. 分页查询
    asyncfindPaginated(page:number,limit:number){returnthis.findAndCount({skip:(page-1)*limit,take:limit,relations:["items"]});}
  4. 索引优化
    @Index()@Column()orderNumber:string;@Index(["status","createdAt"])@Column()status:OrderStatus;

此实现展示了 TypeORM 的核心功能:

  • 实体关系映射(1:N)
  • 枚举类型使用
  • 级联操作
  • 自定义仓库方法
  • 事务处理
  • DTO 验证
  • 模块化组织

http://www.jsqmd.com/news/519571/

相关文章:

  • 【2025深度测评】实测7款降AI率工具,轻松把论文AI率从99%降到5%!
  • 写论文不用一直坐在电脑前:手机上有哪些能用的AI写作神器?
  • 基于庞特里亚金极小值原理PMP的燃料电池混合动力系统能量管理方法探索
  • 从微信聊天到CS对战:IP地址和端口号如何让数据精准送达?
  • DCCRN-E: Enhancing Real-Time Speech Clarity with Phase-Aware Complex Masking
  • (aaa-) snap 不走系统代理,也不走终端的代理?:ubuntu官方:snap-store-proxy 的使用方法 (***)
  • 多任务处理原理揭秘:为什么你的电脑能同时运行微信和Chrome?
  • 论文AI检测原理详解:从NLP到句法结构分析,AI怎么“识破”你的伪原创?
  • 探索Simulink中三电平逆变器并网谐振抑制的奇妙之旅
  • KEIL开发必备:3种生成bin文件的实战方法(含路径问题解决方案)
  • 2026最新!10个降AIGC平台全场景通用测评,哪款最能帮你降AI率?
  • MATLAB里给二自由度机械臂装上‘智能大脑’:手把手实现模糊PID轨迹跟踪仿真
  • 下载地址:
  • 告别‘纸片感’!用C++手撸一个带虚焦模糊的光线追踪相机(附完整代码)
  • 深入理解 synchronized:到底锁的是谁?
  • 2026冲刺用!全场景通用降AIGC平台 千笔·专业降AIGC智能体 VS 灵感ai
  • 【WebRTC】Webrtc-streamer实战:从RTSP到WebRTC的低延迟流媒体转发
  • IGMP V2
  • 随笔3
  • COMSOL锂枝晶应力模型:到手即用
  • 移远EC20模组TCP/IP通信实战:从AT指令到数据透传的完整流程(附常见错误排查)
  • 深度解析EEGNet中的可分离卷积:原理剖析与PyTorch实现技巧
  • 实测对比后 8个降AI率平台:毕业论文全流程必备测评与推荐
  • JavaWeb ——HttpServletRequest 请求对象(附代码)
  • OpenCloudOS 8实战:从零构建高性能WordPress企业官网
  • 高效SRT字幕转Word解决方案:一键批量处理doc与docx格式
  • Excel二维查表插值计算:从INCA到Excel的完整迁移指南(附工具下载)
  • 看完就会:全学科适配的降AI率网站 千笔·降AI率助手 VS Checkjie
  • DDR5内存排错指南:利用EpRC计数器定位故障内存条的物理位置
  • 这份榜单够用!10个降AIGC软件测评:开源免费必看,帮你高效降AI率