Files
niumalll/backend/models/index.js

229 lines
4.9 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创建一个简化版的管理员模型
Admin: sequelize.define('Admin', {
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: 'admins',
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 {
// 同步管理员用户表(如果不存在则创建)
await models.Admin.sync({ alter: true });
console.log('✅ 管理员用户表同步成功');
// 同步订单表(如果不存在则创建)
await models.Order.sync({ alter: true });
console.log('✅ 订单表同步成功');
// 同步供应商表(如果不存在则创建)
await models.Supplier.sync({ alter: true });
console.log('✅ 供应商表同步成功');
console.log('✅ 数据库模型同步完成');
} catch (error) {
console.error('❌ 数据库模型同步失败:', error);
}
};
// 更新模型引用名称
const exportedModels = {
...models
};
// 确保Admin模型正确导出
exportedModels.Admin = exportedModels.Admin;
module.exports = {
...exportedModels,
testConnection,
syncModels
};