TypeORM——订单管理实例
以下是用 TypeORM 实现订单管理 CRUD 的完整示例包含实体定义、仓库操作、服务层和基础 API 实现1. 环境准备npminstalltypeorm nestjs/typeorm mysql2 reflect-metadata# 或npminstalltypeorm pg reflect-metadata# PostgreSQL2. 实体定义 (order.entity.ts)import{Entity,PrimaryGeneratedColumn,Column,CreateDateColumn,UpdateDateColumn,ManyToOne,OneToMany,JoinColumn}fromtypeorm;import{User}from./user.entity;import{OrderItem}from./order-item.entity;exportenumOrderStatus{PENDINGPENDING,PAIDPAID,SHIPPEDSHIPPED,COMPLETEDCOMPLETED,CANCELLEDCANCELLED}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,useruser.orders)JoinColumn({name:userId})user:User;Column()userId:string;OneToMany(()OrderItem,itemitem.order,{cascade:true})items:OrderItem[];CreateDateColumn()createdAt:Date;UpdateDateColumn()updatedAt:Date;}3. 关联实体 (order-item.entity.ts)import{Entity,PrimaryGeneratedColumn,Column,ManyToOne}fromtypeorm;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,orderorder.items,{onDelete:CASCADE})order:Order;}4. 仓库接口 (order.repository.ts)import{EntityRepository,Repository}fromtypeorm;import{Order}from./order.entity;import{CreateOrderDto}from../dto/create-order.dto;EntityRepository(Order)exportclassOrderRepositoryextendsRepositoryOrder{asynccreateOrder(dto:CreateOrderDto):PromiseOrder{constordernewOrder();order.orderNumberthis.generateOrderNumber();order.totalAmountdto.items.reduce((sum,item)sumitem.price*item.quantity,0);order.statusOrderStatus.PENDING;order.userIddto.userId;// 添加订单项order.itemsdto.items.map(item{constorderItemnewOrderItem();orderItem.productNameitem.productName;orderItem.quantityitem.quantity;orderItem.priceitem.price;returnorderItem;});returnthis.save(order);}privategenerateOrderNumber():string{returnORD-${Date.now()}-${Math.random().toString(36).substr(2,9)};}}5. 服务层 (order.service.ts)import{Injectable}fromnestjs/common;import{InjectRepository}fromnestjs/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):PromiseOrder{returnthis.orderRepo.createOrder(createDto);}asyncfindAll():PromiseOrder[]{returnthis.orderRepo.find({relations:[items]});}asyncfindById(id:string):PromiseOrder{returnthis.orderRepo.findOne(id,{relations:[items]});}asyncfindByUser(userId:string):PromiseOrder[]{returnthis.orderRepo.find({where:{userId},relations:[items]});}asyncupdateStatus(id:string,updateDto:UpdateOrderStatusDto):PromiseOrder{awaitthis.orderRepo.update(id,{status:updateDto.status});returnthis.findById(id);}asyncdeleteOrder(id:string):Promisevoid{awaitthis.orderRepo.delete(id);}}6. DTO 对象create-order.dto.tsimport{IsString,IsArray,ValidateNested,IsNumber,Min}fromclass-validator;import{Type}fromclass-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.tsimport{IsEnum}fromclass-validator;import{OrderStatus}from../entities/order.entity;exportclassUpdateOrderStatusDto{IsEnum(OrderStatus)status:OrderStatus;}7. 控制器 (order.controller.ts)import{Controller,Get,Post,Body,Param,Patch,Delete}fromnestjs/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}fromnestjs/common;import{TypeOrmModule}fromnestjs/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}关键功能说明自动生成订单号privategenerateOrderNumber():string{returnORD-${Date.now()}-${Math.random().toString(36).substr(2,9)};}级联保存订单项OneToMany(()OrderItem,itemitem.order,{cascade:true})items:OrderItem[];事务处理建议asynccreateOrder(dto:CreateOrderDto){returnthis.manager.transaction(asynctransactionalEntityManager{// 创建订单逻辑});}高级查询示例// 查找待发货订单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}最佳实践建议软删除添加isDeleted字段替代物理删除审计字段添加createdBy,updatedBy记录操作者分页查询asyncfindPaginated(page:number,limit:number){returnthis.findAndCount({skip:(page-1)*limit,take:limit,relations:[items]});}索引优化Index()Column()orderNumber:string;Index([status,createdAt])Column()status:OrderStatus;此实现展示了 TypeORM 的核心功能实体关系映射1:N枚举类型使用级联操作自定义仓库方法事务处理DTO 验证模块化组织
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2438493.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!