Files
niumalll/backend/models/index.js
ylweng 5b6b50b60b feat(backend): 开发订单管理和供应商管理功能
- 新增订单管理页面,实现订单列表展示、搜索、分页等功能
- 新增供应商管理页面,实现供应商列表展示、搜索、分页等功能- 添加订单和供应商相关模型及数据库迁移
- 实现订单状态更新和供应商信息编辑功能
- 优化后端路由结构,移除不必要的代码
2025-09-18 23:51:25 +08:00

221 lines
4.7 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 数据库连接和模型定义
const { Sequelize } = require('sequelize');
const config = require('../config/database.js');
// 根据环境变量选择配置
const env = process.env.NODE_ENV || 'development';
const dbConfig = config[env];
// 创建Sequelize实例
const sequelize = new Sequelize(
dbConfig.database,
dbConfig.username,
dbConfig.password,
{
host: dbConfig.host,
port: dbConfig.port,
dialect: dbConfig.dialect,
dialectOptions: dbConfig.dialectOptions,
timezone: dbConfig.timezone,
logging: dbConfig.logging,
pool: dbConfig.pool
}
);
// 导入模型定义
const defineOrder = require('./order.js');
// 测试数据库连接
const testConnection = async () => {
try {
await sequelize.authenticate();
console.log('✅ 数据库连接成功');
return true;
} catch (error) {
console.error('❌ 数据库连接失败:', error);
return false;
}
};
// 定义模型
const models = {
sequelize,
Sequelize,
// 用户模型(匹配实际数据库结构)
User: sequelize.define('User', {
id: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true
},
openid: {
type: Sequelize.STRING(64),
allowNull: false,
unique: true
},
nickname: {
type: Sequelize.STRING(50),
allowNull: false
},
avatar: {
type: Sequelize.STRING(255)
},
gender: {
type: Sequelize.ENUM('male', 'female', 'other')
},
birthday: {
type: Sequelize.DATE
},
phone: {
type: Sequelize.STRING(20),
unique: true
},
email: {
type: Sequelize.STRING(100),
unique: true
},
uuid: {
type: Sequelize.STRING(36),
unique: true
}
}, {
tableName: 'users',
timestamps: true,
createdAt: 'created_at',
updatedAt: 'updated_at'
}),
// 为了兼容现有API创建一个简化版的用户模型
ApiUser: sequelize.define('ApiUser', {
id: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true
},
username: {
type: Sequelize.STRING(50),
allowNull: false,
unique: true
},
password_hash: {
type: Sequelize.STRING(255),
allowNull: false
},
phone: {
type: Sequelize.STRING(20),
allowNull: false,
unique: true
},
email: {
type: Sequelize.STRING(100)
},
user_type: {
type: Sequelize.ENUM('client', 'supplier', 'driver', 'staff', 'admin'),
allowNull: false
},
status: {
type: Sequelize.ENUM('active', 'inactive', 'locked'),
defaultValue: 'active'
}
}, {
tableName: 'api_users',
timestamps: true
}),
// 订单模型
Order: defineOrder(sequelize),
// 供应商模型
Supplier: sequelize.define('Supplier', {
id: {
type: Sequelize.BIGINT,
primaryKey: true,
autoIncrement: true
},
name: {
type: Sequelize.STRING(100),
allowNull: false
},
code: {
type: Sequelize.STRING(20),
allowNull: false,
unique: true
},
contact: {
type: Sequelize.STRING(50),
allowNull: false
},
phone: {
type: Sequelize.STRING(20),
allowNull: false,
unique: true
},
address: {
type: Sequelize.STRING(200),
allowNull: false
},
businessLicense: {
type: Sequelize.STRING(255)
},
qualificationLevel: {
type: Sequelize.STRING(10),
allowNull: false
},
certifications: {
type: Sequelize.JSON
},
cattleTypes: {
type: Sequelize.JSON
},
capacity: {
type: Sequelize.INTEGER
},
rating: {
type: Sequelize.DECIMAL(3, 2)
},
cooperationStartDate: {
type: Sequelize.DATE
},
status: {
type: Sequelize.ENUM('active', 'inactive', 'suspended'),
defaultValue: 'active'
},
region: {
type: Sequelize.STRING(20),
allowNull: false
}
}, {
tableName: 'suppliers',
timestamps: true,
createdAt: 'created_at',
updatedAt: 'updated_at'
})
};
// 同步数据库模型
const syncModels = async () => {
try {
// 同步API用户表如果不存在则创建
await models.ApiUser.sync({ alter: true });
console.log('✅ API用户表同步成功');
// 同步订单表(如果不存在则创建)
await models.Order.sync({ alter: true });
console.log('✅ 订单表同步成功');
// 同步供应商表(如果不存在则创建)
await models.Supplier.sync({ alter: true });
console.log('✅ 供应商表同步成功');
console.log('✅ 数据库模型同步完成');
} catch (error) {
console.error('❌ 数据库模型同步失败:', error);
}
};
module.exports = {
...models,
testConnection,
syncModels
};