Generating commit message...
This commit is contained in:
188
init-database-fixed.js
Normal file
188
init-database-fixed.js
Normal file
@@ -0,0 +1,188 @@
|
||||
const mysql = require('mysql2');
|
||||
|
||||
// 数据库配置
|
||||
const configs = [
|
||||
{
|
||||
name: '测试环境',
|
||||
host: '192.168.0.240',
|
||||
port: 3306,
|
||||
user: '极',
|
||||
password: 'aiot$Aiot123'
|
||||
},
|
||||
{
|
||||
name: '生产环境',
|
||||
host: '129.211.213.226',
|
||||
port: 9527,
|
||||
user: 'root',
|
||||
password: 'aiotAiot123!'
|
||||
}
|
||||
];
|
||||
|
||||
// 创建数据库的SQL语句
|
||||
const createDatabaseSQL = `
|
||||
CREATE DATABASE IF NOT EXISTS jiebandata
|
||||
CHARACTER SET utf8mb4
|
||||
COLLATE utf8mb4_unicode_ci;
|
||||
`;
|
||||
|
||||
// 创建用户表的SQL语句
|
||||
const createUsersTableSQL = `
|
||||
CREATE TABLE IF NOT EXISTS jiebandata.users (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
openid VARCHAR(64) UNIQUE NOT NULL,
|
||||
nickname VARCHAR(50) NOT NULL,
|
||||
avatar VARCHAR(255),
|
||||
gender ENUM('male', 'female', 'other'),
|
||||
birthday DATE,
|
||||
phone VARCHAR(20) UNIQUE,
|
||||
email VARCHAR(100) UNIQUE,
|
||||
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
INDEX idx_openid (openid),
|
||||
INDEX idx_phone (phone),
|
||||
INDEX idx_email (email)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf极4 COLLATE=utf8mb4_unicode_ci;
|
||||
`;
|
||||
|
||||
// 创建商家表的SQL语句
|
||||
const createMerchantsTableSQL = `
|
||||
CREATE TABLE IF NOT EXISTS jiebandata.merchants (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
user_id INT NOT NULL,
|
||||
merchant_type ENUM('flower_shop', 'activity_organizer', 'farm_owner') NOT NULL,
|
||||
business_name VARCHAR(100) NOT NULL,
|
||||
business_license VARCHAR(255),
|
||||
contact_person VARCHAR极50) NOT NULL,
|
||||
contact_phone VARCHAR(20) NOT NULL,
|
||||
address VARCHAR(255),
|
||||
description TEXT,
|
||||
status ENUM('pending', 'approved', 'rejected', 'suspended') NOT NULL DEFAULT 'pending',
|
||||
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
FOREIGN KEY (user_id) REFERENCES users(id),
|
||||
INDEX idx_user_id (user_id),
|
||||
INDEX idx_status (status)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
`;
|
||||
|
||||
// 创建旅行计划表的SQL语句
|
||||
const createTravelPlansTableSQL = `
|
||||
CREATE TABLE IF NOT EXISTS jiebandata.travel_plans (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
user_id INT NOT NULL,
|
||||
destination VARCHAR(100) NOT NULL,
|
||||
start_date DATE NOT NULL,
|
||||
end_date DATE NOT NULL,
|
||||
budget DECIMAL(10,2) NOT NULL,
|
||||
interests TEXT,
|
||||
visibility ENUM('public', 'friends', 'private') NOT NULL DEFAULT 'public',
|
||||
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
FOREIGN KEY (user_id) REFERENCES users(id),
|
||||
INDEX idx_user_id (user_id),
|
||||
INDEX idx_destination (destination),
|
||||
INDEX idx_dates (start_date, end_date)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
`;
|
||||
|
||||
// 所有表创建语句
|
||||
const tableCreationSQLs = [
|
||||
createUsersTableSQL,
|
||||
createMerchantsTableSQL,
|
||||
createTravelPlansTableSQL
|
||||
];
|
||||
|
||||
function executeSQL(connection, sql, description) {
|
||||
return new Promise((resolve, reject) => {
|
||||
console.log(`🛠️ ${description}...`);
|
||||
connection.query(sql, (err, results) => {
|
||||
if (err) {
|
||||
console.error(`❌ ${description}失败:`, err.message);
|
||||
reject(err);
|
||||
} else {
|
||||
console.log(`✅ ${description}成功`);
|
||||
resolve(results);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
async function initializeDatabase(config) {
|
||||
console.log(`\n🚀 开始初始化 ${config.name} 数据库...`);
|
||||
console.log('='.repeat(60));
|
||||
|
||||
const connection = mysql.createConnection({
|
||||
host: config.host,
|
||||
port: config.port,
|
||||
user: config.user,
|
||||
password: config.password,
|
||||
multipleStatements: true
|
||||
});
|
||||
|
||||
try {
|
||||
// 连接数据库
|
||||
await new Promise((resolve, reject) => {
|
||||
connection.connect((err) => {
|
||||
if (err) reject(err);
|
||||
else resolve();
|
||||
});
|
||||
});
|
||||
|
||||
// 创建数据库
|
||||
await executeSQL(connection, createDatabaseSQL, '创建数据库 jiebandata');
|
||||
|
||||
// 使用新创建的数据库
|
||||
await executeSQL(connection, 'USE jiebandata', '切换到 jiebandata 数据库');
|
||||
|
||||
// 创建所有表
|
||||
for (let i = 0; i < tableCreationSQLs.length; i++) {
|
||||
await executeSQL(connection, tableCreationSQLs[i], `创建表 ${i + 1}/${tableCreationSQLs.length}`);
|
||||
}
|
||||
|
||||
console.log('✅ 数据库初始化完成!');
|
||||
|
||||
return { success: true, message: '数据库初始化成功' };
|
||||
|
||||
} catch (error) {
|
||||
console.error('❌ 数据库初始化失败:', error.message);
|
||||
return { success: false, error: error.message };
|
||||
} finally {
|
||||
// 关闭连接
|
||||
connection.end();
|
||||
console.log('✅ 数据库连接已关闭');
|
||||
}
|
||||
}
|
||||
|
||||
async function main() {
|
||||
console.log('🎯 结伴客系统数据库初始化工具');
|
||||
console.log('='.repeat(60));
|
||||
|
||||
const results = [];
|
||||
|
||||
for (const config of configs) {
|
||||
const result = await initializeDatabase(config);
|
||||
results.push({
|
||||
environment: config.name,
|
||||
success: result.success,
|
||||
message: result.message || result.error
|
||||
});
|
||||
console.log('\n' + '='.repeat(60));
|
||||
}
|
||||
|
||||
// 输出汇总结果
|
||||
console.log('📋 初始化结果汇总:');
|
||||
results.forEach(result => {
|
||||
console.log(`${result.environment}: ${result.success ? '✅ 成功' : '❌ 失败'} - ${result.message}`);
|
||||
});
|
||||
|
||||
// 检查是否所有环境都成功
|
||||
const allSuccess = results.every(result => result.success);
|
||||
if (allSuccess) {
|
||||
console.log('\n🎉 所有环境数据库初始化成功!');
|
||||
} else {
|
||||
console.log('\n⚠️ 部分环境初始化失败,请检查网络连接和数据库权限');
|
||||
}
|
||||
}
|
||||
|
||||
// 运行初始化
|
||||
main().catch(console.error);
|
||||
Reference in New Issue
Block a user