订单管理设计( node ORM)

数据库设计与订单接口实现

1. 数据库字典

用户购买大会员,需设计订单表记录相关信息。

字段 类型 说明
id integer 主键
outTradeNo string 订单号,避免使用id作为订单号,防止竞争对手推算销量,可通过算法生成(如当前时间+随机数),本文使用uuid
tradeNo varchar 支付宝/微信流水号(第三方生成)
userId integer 关联用户表ID
subject varchar 订单备注信息(记录会员类型)
totalAmount decimal(10,2) 订单金额(精确到分)
membershipMonths Integer 会员时长
paymentMethod tinyint 支付方式(0:支付宝,1:微信)
status tinyint 订单状态(0:未支付,1:已支付,2:已取消)
paidAt datetime 支付时间(支付成功时记录)

关键设计说明

  • 订单号使用uuid生成(避免暴露业务数据)
  • 流水号与订单号严格区分(第三方生成 vs 商户生成)
  • 金额字段使用decimal类型保证精度
  • 状态字段采用数字编码提升查询效率

2. 创建模型与迁移

2.1 生成模型和迁移

sequelize model:generate --name Order --attributes outTradeNo:string,tradeNo:string,userId:integer,subject:string,totalAmount:decimal,membershipMonths:integer,paymentMethod:tinyint,status:tinyint,paidAt:date

2.2 修改迁移文件

'use strict';
/** @type {import('sequelize-cli').Migration} */
module.exports = {
   
   
    async up(queryInterface, Sequelize) {
   
   
        await queryInterface.createTable('Orders', {
   
   
            id: {
   
   
                allowNull: false,
                autoIncrement: true,
                primaryKey: true,
                type: Sequelize.INTEGER.UNSIGNED
            },
            outTradeNo: {
   
   
                allowNull: false,
                type: Sequelize.STRING
            },
            tradeNo: {
   
   
                type: Sequelize.STRING
            },
            userId: {
   
   
                allowNull: false,
                type: Sequelize.INTEGER.UNSIGNED
            },
            subject: {
   
   
                allowNull: false,
                type: Sequelize.STRING
            },
            totalAmount: {
   
   
                allowNull: false,
                type: Sequelize.DECIMAL(10, 2).UNSIGNED
            },
            membershipMonths:{
   
   
			    allowNull: false,
    		    defaultValue: 1,
   			    type: Sequelize.INTEGER.UNSIGNED
			},
            paymentMethod: {
   
   
                type: Sequelize.TINYINT.UNSIGNED
            },
            status: {
   
   
                allowNull: false,
                defaultValue: 0,
                type: Sequelize.INTEGER(1).UNSIGNED
            },
            paidAt: {
   
   
                type: Sequelize.DATE
            },
            createdAt: {
   
   
                allowNull: false,
                type: Sequelize.DATE
            },
            updatedAt: {
   
   
                allowNull: false,
                type: Sequelize.DATE
            }
        });

        // 添加唯一索引
        await queryInterface.addIndex('Orders', {
   
    fields: ['outTradeNo'], unique: true });
        await queryInterface.addIndex('Orders', {
   
    fields: ['tradeNo'], unique: true });
        
        // 添加普通索引
        await queryInterface.addIndex('Orders', {
   
    fields: ['userId'] });
    },

    async down(queryInterface, Sequelize) {
   
   
        await queryInterface.dropTable('Orders');
    }
};

2.3 执行迁移

sequelize db:migrate

3. 模型关联与格式化

3.1 修改 Order 模型

// models/order.js
'use strict';
const {
   
    Model 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值