210 lines
10 KiB
JavaScript
210 lines
10 KiB
JavaScript
|
|
/**
|
|||
|
|
* 数据库初始化脚本
|
|||
|
|
* 创建数据库和表结构
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
require('dotenv').config();
|
|||
|
|
const mysql = require('mysql2/promise');
|
|||
|
|
|
|||
|
|
// 数据库配置
|
|||
|
|
const dbConfig = {
|
|||
|
|
host: process.env.DB_HOST,
|
|||
|
|
port: process.env.DB_PORT,
|
|||
|
|
user: process.env.DB_USER,
|
|||
|
|
password: process.env.DB_PASSWORD
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// 数据库名称
|
|||
|
|
const DATABASE_NAME = process.env.DB_DATABASE || 'ddcz_platform';
|
|||
|
|
|
|||
|
|
async function initDatabase() {
|
|||
|
|
let connection;
|
|||
|
|
|
|||
|
|
try {
|
|||
|
|
console.log('🔌 正在连接到MySQL服务器...');
|
|||
|
|
console.log(` 主机: ${dbConfig.host}:${dbConfig.port}`);
|
|||
|
|
console.log(` 用户: ${dbConfig.user}`);
|
|||
|
|
|
|||
|
|
// 连接到MySQL服务器(不指定数据库)
|
|||
|
|
connection = await mysql.createConnection(dbConfig);
|
|||
|
|
console.log('✅ MySQL连接成功!\n');
|
|||
|
|
|
|||
|
|
// 创建数据库(如果不存在)
|
|||
|
|
console.log(`📦 创建数据库: ${DATABASE_NAME}...`);
|
|||
|
|
await connection.query(`CREATE DATABASE IF NOT EXISTS \`${DATABASE_NAME}\` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci`);
|
|||
|
|
console.log('✅ 数据库创建成功!\n');
|
|||
|
|
|
|||
|
|
// 切换到目标数据库
|
|||
|
|
await connection.query(`USE \`${DATABASE_NAME}\``);
|
|||
|
|
|
|||
|
|
// ========================================
|
|||
|
|
// 清理旧表(如果存在)
|
|||
|
|
// ========================================
|
|||
|
|
console.log('🧹 清理可能存在的旧表...');
|
|||
|
|
await connection.query('DROP TABLE IF EXISTS `ddcz_platform`');
|
|||
|
|
await connection.query('DROP TABLE IF EXISTS `favorites`');
|
|||
|
|
await connection.query('DROP TABLE IF EXISTS `job_applications`');
|
|||
|
|
await connection.query('DROP TABLE IF EXISTS `user_profiles`');
|
|||
|
|
await connection.query('DROP TABLE IF EXISTS `users`');
|
|||
|
|
console.log('✅ 旧表清理完成!\n');
|
|||
|
|
|
|||
|
|
// ========================================
|
|||
|
|
// 创建 users 表 - 用户基本信息
|
|||
|
|
// ========================================
|
|||
|
|
console.log('📋 创建 users 表...');
|
|||
|
|
await connection.query(`
|
|||
|
|
CREATE TABLE IF NOT EXISTS users (
|
|||
|
|
id INT AUTO_INCREMENT PRIMARY KEY COMMENT '用户ID',
|
|||
|
|
username VARCHAR(50) NOT NULL UNIQUE COMMENT '用户名',
|
|||
|
|
password_hash VARCHAR(255) NOT NULL COMMENT '密码哈希',
|
|||
|
|
email VARCHAR(100) UNIQUE COMMENT '邮箱',
|
|||
|
|
phone VARCHAR(20) UNIQUE COMMENT '手机号',
|
|||
|
|
role ENUM('user', 'admin') DEFAULT 'user' COMMENT '用户角色',
|
|||
|
|
status ENUM('active', 'inactive', 'banned') DEFAULT 'active' COMMENT '账号状态',
|
|||
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
|||
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
|||
|
|
last_login TIMESTAMP NULL COMMENT '最后登录时间',
|
|||
|
|
INDEX idx_username (username),
|
|||
|
|
INDEX idx_email (email),
|
|||
|
|
INDEX idx_role (role)
|
|||
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户表'
|
|||
|
|
`);
|
|||
|
|
console.log('✅ users 表创建成功!');
|
|||
|
|
|
|||
|
|
// ========================================
|
|||
|
|
// 创建 user_profiles 表 - 用户详细资料
|
|||
|
|
// ========================================
|
|||
|
|
console.log('📋 创建 user_profiles 表...');
|
|||
|
|
await connection.query(`
|
|||
|
|
CREATE TABLE IF NOT EXISTS user_profiles (
|
|||
|
|
id INT AUTO_INCREMENT PRIMARY KEY COMMENT '资料ID',
|
|||
|
|
user_id INT NOT NULL UNIQUE COMMENT '用户ID',
|
|||
|
|
real_name VARCHAR(50) COMMENT '真实姓名',
|
|||
|
|
gender ENUM('male', 'female', 'other') COMMENT '性别',
|
|||
|
|
birth_date DATE COMMENT '出生日期',
|
|||
|
|
id_card VARCHAR(18) COMMENT '身份证号',
|
|||
|
|
education VARCHAR(50) COMMENT '学历',
|
|||
|
|
major VARCHAR(100) COMMENT '专业',
|
|||
|
|
school VARCHAR(100) COMMENT '学校',
|
|||
|
|
graduation_year YEAR COMMENT '毕业年份',
|
|||
|
|
city VARCHAR(50) COMMENT '所在城市',
|
|||
|
|
address TEXT COMMENT '详细地址',
|
|||
|
|
avatar_url VARCHAR(255) COMMENT '头像URL',
|
|||
|
|
resume_url VARCHAR(255) COMMENT '简历URL',
|
|||
|
|
self_intro TEXT COMMENT '自我介绍',
|
|||
|
|
skills TEXT COMMENT '技能标签(JSON数组)',
|
|||
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
|||
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
|||
|
|
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
|
|||
|
|
INDEX idx_user_id (user_id)
|
|||
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户资料表'
|
|||
|
|
`);
|
|||
|
|
console.log('✅ user_profiles 表创建成功!');
|
|||
|
|
|
|||
|
|
// ========================================
|
|||
|
|
// 创建 job_applications 表 - 投递记录
|
|||
|
|
// ========================================
|
|||
|
|
console.log('📋 创建 job_applications 表...');
|
|||
|
|
await connection.query(`
|
|||
|
|
CREATE TABLE IF NOT EXISTS job_applications (
|
|||
|
|
id INT AUTO_INCREMENT PRIMARY KEY COMMENT '投递记录ID',
|
|||
|
|
user_id INT NOT NULL COMMENT '用户ID',
|
|||
|
|
job_type ENUM('transition', 'referral') NOT NULL COMMENT '岗位类型:transition-过渡岗位, referral-内推岗位',
|
|||
|
|
job_name VARCHAR(100) NOT NULL COMMENT '岗位名称',
|
|||
|
|
company_name VARCHAR(100) NOT NULL COMMENT '企业名称',
|
|||
|
|
company_short_name VARCHAR(50) COMMENT '企业简称',
|
|||
|
|
city VARCHAR(50) COMMENT '城市',
|
|||
|
|
province VARCHAR(50) COMMENT '省份',
|
|||
|
|
segment_name VARCHAR(100) COMMENT '业务板块名称',
|
|||
|
|
status ENUM('pending', 'reviewing', 'interviewed', 'offered', 'rejected', 'withdrawn') DEFAULT 'pending' COMMENT '投递状态',
|
|||
|
|
application_data JSON COMMENT '投递详细数据(岗位详情JSON)',
|
|||
|
|
applied_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '投递时间',
|
|||
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
|||
|
|
notes TEXT COMMENT '备注',
|
|||
|
|
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
|
|||
|
|
INDEX idx_user_id (user_id),
|
|||
|
|
INDEX idx_job_type (job_type),
|
|||
|
|
INDEX idx_status (status),
|
|||
|
|
INDEX idx_applied_at (applied_at)
|
|||
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='投递记录表'
|
|||
|
|
`);
|
|||
|
|
console.log('✅ job_applications 表创建成功!');
|
|||
|
|
|
|||
|
|
// ========================================
|
|||
|
|
// 创建 favorites 表 - 收藏夹
|
|||
|
|
// ========================================
|
|||
|
|
console.log('📋 创建 favorites 表...');
|
|||
|
|
await connection.query(`
|
|||
|
|
CREATE TABLE IF NOT EXISTS favorites (
|
|||
|
|
id INT AUTO_INCREMENT PRIMARY KEY COMMENT '收藏ID',
|
|||
|
|
user_id INT NOT NULL COMMENT '用户ID',
|
|||
|
|
favorite_type ENUM('company', 'job') NOT NULL COMMENT '收藏类型',
|
|||
|
|
company_name VARCHAR(100) COMMENT '企业名称',
|
|||
|
|
job_name VARCHAR(100) COMMENT '岗位名称',
|
|||
|
|
favorite_data JSON COMMENT '收藏详细数据',
|
|||
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '收藏时间',
|
|||
|
|
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
|
|||
|
|
INDEX idx_user_id (user_id),
|
|||
|
|
INDEX idx_type (favorite_type),
|
|||
|
|
UNIQUE KEY unique_favorite (user_id, favorite_type, company_name, job_name)
|
|||
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='收藏表'
|
|||
|
|
`);
|
|||
|
|
console.log('✅ favorites 表创建成功!');
|
|||
|
|
|
|||
|
|
// ========================================
|
|||
|
|
// 创建默认管理员账号
|
|||
|
|
// ========================================
|
|||
|
|
console.log('\n👤 创建默认管理员账号...');
|
|||
|
|
const bcrypt = require('bcryptjs');
|
|||
|
|
const defaultPassword = 'admin123456';
|
|||
|
|
const passwordHash = await bcrypt.hash(defaultPassword, 10);
|
|||
|
|
|
|||
|
|
await connection.query(`
|
|||
|
|
INSERT INTO users (username, password_hash, email, role, status)
|
|||
|
|
VALUES ('admin', ?, 'admin@ddcz.com', 'admin', 'active')
|
|||
|
|
ON DUPLICATE KEY UPDATE username=username
|
|||
|
|
`, [passwordHash]);
|
|||
|
|
|
|||
|
|
console.log('✅ 默认管理员账号创建成功!');
|
|||
|
|
console.log(' 用户名: admin');
|
|||
|
|
console.log(' 密码: admin123456');
|
|||
|
|
console.log(' ⚠️ 请在首次登录后立即修改密码!\n');
|
|||
|
|
|
|||
|
|
// ========================================
|
|||
|
|
// 显示表结构信息
|
|||
|
|
// ========================================
|
|||
|
|
console.log('📊 数据库表统计:');
|
|||
|
|
const [tables] = await connection.query('SHOW TABLES');
|
|||
|
|
console.log(` 共创建 ${tables.length} 个表:`);
|
|||
|
|
tables.forEach(table => {
|
|||
|
|
const tableName = Object.values(table)[0];
|
|||
|
|
console.log(` - ${tableName}`);
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
console.log('\n🎉 数据库初始化完成!');
|
|||
|
|
|
|||
|
|
} catch (error) {
|
|||
|
|
console.error('\n❌ 数据库初始化失败:');
|
|||
|
|
console.error(error.message);
|
|||
|
|
|
|||
|
|
if (error.code === 'ECONNREFUSED') {
|
|||
|
|
console.error('\n💡 提示:无法连接到MySQL服务器,请检查:');
|
|||
|
|
console.error(' 1. MySQL服务器是否正在运行');
|
|||
|
|
console.error(' 2. 主机地址和端口是否正确');
|
|||
|
|
console.error(' 3. 防火墙是否允许连接');
|
|||
|
|
} else if (error.code === 'ER_ACCESS_DENIED_ERROR') {
|
|||
|
|
console.error('\n💡 提示:用户名或密码错误,请检查.env文件中的配置');
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
process.exit(1);
|
|||
|
|
} finally {
|
|||
|
|
if (connection) {
|
|||
|
|
await connection.end();
|
|||
|
|
console.log('🔌 数据库连接已关闭');
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 执行初始化
|
|||
|
|
initDatabase();
|