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

View File

@@ -0,0 +1,251 @@
/**
* 高薪岗位控制器
* 基于high.html的最新数据结构
*/
const db = require('../../config/database');
/**
* 获取岗位列表
* GET /api/high-salary-jobs
* 支持分页、筛选、搜索
*/
exports.getList = async (req, res) => {
try {
const page = parseInt(req.query.page) || 1;
const limit = parseInt(req.query.limit) || 20;
const offset = (page - 1) * limit;
const location = req.query.location;
const keyword = req.query.keyword;
// 构建查询条件
let whereClause = 'WHERE is_active = 1';
const params = [];
if (location) {
whereClause += ' AND location = ?';
params.push(location);
}
if (keyword) {
whereClause += ' AND (title LIKE ? OR company LIKE ?)';
params.push(`%${keyword}%`, `%${keyword}%`);
}
// 查询总数
const [countResult] = await db.query(
`SELECT COUNT(*) as total FROM high_salary_jobs ${whereClause}`,
params
);
const total = countResult[0].total;
// 查询岗位列表
const [jobs] = await db.query(
`SELECT * FROM high_salary_jobs ${whereClause} ORDER BY display_order ASC, id DESC LIMIT ? OFFSET ?`,
[...params, limit, offset]
);
return res.json({
success: true,
data: {
jobs,
total,
page,
limit,
totalPages: Math.ceil(total / limit)
}
});
} catch (error) {
console.error('获取岗位列表失败:', error);
return res.status(500).json({
success: false,
message: '获取岗位列表失败',
error: error.message
});
}
};
/**
* 获取岗位详情
* GET /api/high-salary-jobs/:id
*/
exports.getById = async (req, res) => {
try {
const { id } = req.params;
const [jobs] = await db.query(
'SELECT * FROM high_salary_jobs WHERE id = ? AND is_active = 1',
[id]
);
if (jobs.length === 0) {
return res.status(404).json({
success: false,
message: '岗位不存在'
});
}
return res.json({
success: true,
data: jobs[0]
});
} catch (error) {
console.error('获取岗位详情失败:', error);
return res.status(500).json({
success: false,
message: '获取岗位详情失败',
error: error.message
});
}
};
/**
* 创建岗位(管理员)
* POST /api/high-salary-jobs
*/
exports.create = async (req, res) => {
try {
const {
title,
salary,
company,
location,
quota,
tags,
requirements,
description,
icon,
display_order
} = req.body;
// 验证必填字段
if (!title || !salary || !company || !location || quota === undefined) {
return res.status(400).json({
success: false,
message: '缺少必填字段'
});
}
const [result] = await db.query(
`INSERT INTO high_salary_jobs
(title, salary, company, location, quota, tags, requirements, description, icon, display_order)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
[
title,
salary,
company,
location,
quota,
JSON.stringify(tags || []),
requirements,
description,
icon || 'fa-microchip',
display_order || 0
]
);
res.status(201).json({
success: true,
message: '岗位创建成功',
data: { id: result.insertId }
});
} catch (error) {
console.error('创建岗位失败:', error);
res.status(500).json({
success: false,
message: '创建岗位失败',
error: error.message
});
}
};
/**
* 更新岗位(管理员)
* PUT /api/high-salary-jobs/:id
*/
exports.update = async (req, res) => {
try {
const { id } = req.params;
const updateData = req.body;
// 检查岗位是否存在
const [existing] = await db.query('SELECT id FROM high_salary_jobs WHERE id = ?', [id]);
if (existing.length === 0) {
return res.status(404).json({
success: false,
message: '岗位不存在'
});
}
const updates = [];
const params = [];
const allowedFields = ['title', 'salary', 'company', 'location', 'quota', 'tags', 'requirements', 'description', 'icon', 'display_order', 'is_active'];
for (const field of allowedFields) {
if (updateData[field] !== undefined) {
updates.push(`${field} = ?`);
params.push(field === 'tags' ? JSON.stringify(updateData[field]) : updateData[field]);
}
}
if (updates.length === 0) {
return res.status(400).json({
success: false,
message: '没有要更新的字段'
});
}
params.push(id);
await db.query(
`UPDATE high_salary_jobs SET ${updates.join(', ')} WHERE id = ?`,
params
);
res.json({
success: true,
message: '岗位更新成功'
});
} catch (error) {
console.error('更新岗位失败:', error);
res.status(500).json({
success: false,
message: '更新岗位失败',
error: error.message
});
}
};
/**
* 删除岗位(软删除)
* DELETE /api/high-salary-jobs/:id
*/
exports.delete = async (req, res) => {
try {
const { id } = req.params;
const [result] = await db.query(
'UPDATE high_salary_jobs SET is_active = 0 WHERE id = ?',
[id]
);
if (result.affectedRows === 0) {
return res.status(404).json({
success: false,
message: '岗位不存在'
});
}
res.json({
success: true,
message: '岗位删除成功'
});
} catch (error) {
console.error('删除岗位失败:', error);
res.status(500).json({
success: false,
message: '删除岗位失败',
error: error.message
});
}
};