数据库设计与订单接口实现
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

最低0.47元/天 解锁文章
3722

被折叠的 条评论
为什么被折叠?



