2025-09-05 01:18:40 +08:00
|
|
|
|
// 数据库连接和模型定义
|
|
|
|
|
|
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
|
|
|
|
|
|
}
|
|
|
|
|
|
);
|
|
|
|
|
|
|
2025-09-12 13:10:44 +08:00
|
|
|
|
// 导入模型定义
|
|
|
|
|
|
const defineOrder = require('./order.js');
|
|
|
|
|
|
|
2025-09-05 01:18:40 +08:00
|
|
|
|
// 测试数据库连接
|
|
|
|
|
|
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
|
2025-09-12 13:10:44 +08:00
|
|
|
|
}),
|
|
|
|
|
|
|
|
|
|
|
|
// 订单模型
|
2025-09-18 23:51:25 +08:00
|
|
|
|
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'
|
|
|
|
|
|
})
|
2025-09-05 01:18:40 +08:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// 同步数据库模型
|
|
|
|
|
|
const syncModels = async () => {
|
|
|
|
|
|
try {
|
2025-09-12 13:10:44 +08:00
|
|
|
|
// 同步API用户表(如果不存在则创建)
|
2025-09-05 01:18:40 +08:00
|
|
|
|
await models.ApiUser.sync({ alter: true });
|
|
|
|
|
|
console.log('✅ API用户表同步成功');
|
2025-09-12 13:10:44 +08:00
|
|
|
|
|
|
|
|
|
|
// 同步订单表(如果不存在则创建)
|
|
|
|
|
|
await models.Order.sync({ alter: true });
|
|
|
|
|
|
console.log('✅ 订单表同步成功');
|
|
|
|
|
|
|
2025-09-18 23:51:25 +08:00
|
|
|
|
// 同步供应商表(如果不存在则创建)
|
|
|
|
|
|
await models.Supplier.sync({ alter: true });
|
|
|
|
|
|
console.log('✅ 供应商表同步成功');
|
|
|
|
|
|
|
2025-09-05 01:18:40 +08:00
|
|
|
|
console.log('✅ 数据库模型同步完成');
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
|
console.error('❌ 数据库模型同步失败:', error);
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
module.exports = {
|
|
|
|
|
|
...models,
|
|
|
|
|
|
testConnection,
|
|
|
|
|
|
syncModels
|
|
|
|
|
|
};
|