feat: 完成多多畅职就业服务平台核心功能开发

主要更新:
-  完成主题配色从暗色到亮蓝白配色的全面转换
-  实现高薪岗位页面及后端API集成
-  完成登录注册页面及认证系统
-  实现预招录确认功能
-  添加数据库管理和维护工具脚本
-  优化错误处理和用户体验

核心功能:
1. 首页 (index.html) - 3D地球、专业分类、过渡岗位
2. 高薪岗位页面 (high.html) - 岗位详情、预招录确认、成功案例
3. 登录注册 (auth.html) - 用户认证、专业分类选择
4. 后端API - RESTful接口,JWT认证,MySQL数据库

技术栈:
- 前端:Three.js, GSAP, 原生JavaScript
- 后端:Node.js, Express, MySQL
- 认证:JWT, bcrypt
- 样式:自定义CSS,响应式设计

数据库工具:
- kill-by-ids.js - 批量终止MySQL进程
- unlock-all-tables.js - 解锁数据库表
- init-db.js - 初始化数据库
- 其他管理脚本

🤖 Generated with Claude Code
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
KQL
2025-12-22 15:40:55 +08:00
parent 97e79e0f8c
commit 61698639ef
55 changed files with 13178 additions and 1298 deletions

209
scripts/init-db.js Normal file
View File

@@ -0,0 +1,209 @@
/**
* 数据库初始化脚本
* 创建数据库和表结构
*/
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();