225 lines
6.1 KiB
JavaScript
225 lines
6.1 KiB
JavaScript
|
|
/**
|
||
|
|
* 成功案例控制器
|
||
|
|
* 基于high.html的最新数据结构 (三轨道弹幕系统)
|
||
|
|
*/
|
||
|
|
|
||
|
|
const db = require('../../config/database');
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 获取成功案例列表 (按轨道分组)
|
||
|
|
* GET /api/success-stories
|
||
|
|
* 支持可选的track_type筛选
|
||
|
|
*/
|
||
|
|
exports.getList = async (req, res) => {
|
||
|
|
try {
|
||
|
|
const trackType = req.query.track_type;
|
||
|
|
|
||
|
|
// 构建查询条件
|
||
|
|
let whereClause = 'WHERE is_active = 1';
|
||
|
|
const params = [];
|
||
|
|
|
||
|
|
if (trackType && ['fast', 'slow', 'medium'].includes(trackType)) {
|
||
|
|
whereClause += ' AND track_type = ?';
|
||
|
|
params.push(trackType);
|
||
|
|
}
|
||
|
|
|
||
|
|
const [stories] = await db.query(
|
||
|
|
`SELECT
|
||
|
|
id,
|
||
|
|
name,
|
||
|
|
job,
|
||
|
|
company,
|
||
|
|
salary,
|
||
|
|
avatar_color,
|
||
|
|
track_type
|
||
|
|
FROM success_stories
|
||
|
|
${whereClause}
|
||
|
|
ORDER BY display_order ASC, id ASC`,
|
||
|
|
params
|
||
|
|
);
|
||
|
|
|
||
|
|
// 按轨道分组
|
||
|
|
const grouped = {
|
||
|
|
fast: stories.filter(s => s.track_type === 'fast'),
|
||
|
|
slow: stories.filter(s => s.track_type === 'slow'),
|
||
|
|
medium: stories.filter(s => s.track_type === 'medium')
|
||
|
|
};
|
||
|
|
|
||
|
|
return res.json({
|
||
|
|
success: true,
|
||
|
|
data: grouped
|
||
|
|
});
|
||
|
|
} catch (error) {
|
||
|
|
console.error('获取成功案例失败:', error);
|
||
|
|
return res.status(500).json({
|
||
|
|
success: false,
|
||
|
|
message: '获取成功案例失败',
|
||
|
|
error: error.message
|
||
|
|
});
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 创建成功案例 (管理员)
|
||
|
|
* POST /api/success-stories
|
||
|
|
*/
|
||
|
|
exports.create = async (req, res) => {
|
||
|
|
try {
|
||
|
|
const {
|
||
|
|
name,
|
||
|
|
job,
|
||
|
|
company,
|
||
|
|
salary,
|
||
|
|
avatar_color,
|
||
|
|
track_type,
|
||
|
|
display_order
|
||
|
|
} = req.body;
|
||
|
|
|
||
|
|
// 验证必填字段
|
||
|
|
if (!name || !job || !company || !salary) {
|
||
|
|
return res.status(400).json({
|
||
|
|
success: false,
|
||
|
|
message: '缺少必填字段 (name, job, company, salary)'
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
// 验证track_type
|
||
|
|
if (track_type && !['fast', 'slow', 'medium'].includes(track_type)) {
|
||
|
|
return res.status(400).json({
|
||
|
|
success: false,
|
||
|
|
message: 'track_type 必须是 fast, slow 或 medium'
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
const [result] = await db.query(
|
||
|
|
`INSERT INTO success_stories
|
||
|
|
(name, job, company, salary, avatar_color, track_type, display_order)
|
||
|
|
VALUES (?, ?, ?, ?, ?, ?, ?)`,
|
||
|
|
[
|
||
|
|
name,
|
||
|
|
job,
|
||
|
|
company,
|
||
|
|
salary,
|
||
|
|
avatar_color || '#2563eb',
|
||
|
|
track_type || 'fast',
|
||
|
|
display_order || 0
|
||
|
|
]
|
||
|
|
);
|
||
|
|
|
||
|
|
return res.status(201).json({
|
||
|
|
success: true,
|
||
|
|
message: '成功案例创建成功',
|
||
|
|
data: { id: result.insertId }
|
||
|
|
});
|
||
|
|
} catch (error) {
|
||
|
|
console.error('创建成功案例失败:', error);
|
||
|
|
return res.status(500).json({
|
||
|
|
success: false,
|
||
|
|
message: '创建成功案例失败',
|
||
|
|
error: error.message
|
||
|
|
});
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 更新成功案例 (管理员)
|
||
|
|
* PUT /api/success-stories/:id
|
||
|
|
*/
|
||
|
|
exports.update = async (req, res) => {
|
||
|
|
try {
|
||
|
|
const { id } = req.params;
|
||
|
|
const updateData = req.body;
|
||
|
|
|
||
|
|
// 检查案例是否存在
|
||
|
|
const [existing] = await db.query(
|
||
|
|
'SELECT id FROM success_stories WHERE id = ?',
|
||
|
|
[id]
|
||
|
|
);
|
||
|
|
|
||
|
|
if (existing.length === 0) {
|
||
|
|
return res.status(404).json({
|
||
|
|
success: false,
|
||
|
|
message: '成功案例不存在'
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
const updates = [];
|
||
|
|
const params = [];
|
||
|
|
|
||
|
|
const allowedFields = ['name', 'job', 'company', 'salary', 'avatar_color', 'track_type', 'display_order', 'is_active'];
|
||
|
|
|
||
|
|
for (const field of allowedFields) {
|
||
|
|
if (updateData[field] !== undefined) {
|
||
|
|
// 验证track_type
|
||
|
|
if (field === 'track_type' && !['fast', 'slow', 'medium'].includes(updateData[field])) {
|
||
|
|
return res.status(400).json({
|
||
|
|
success: false,
|
||
|
|
message: 'track_type 必须是 fast, slow 或 medium'
|
||
|
|
});
|
||
|
|
}
|
||
|
|
updates.push(`${field} = ?`);
|
||
|
|
params.push(updateData[field]);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if (updates.length === 0) {
|
||
|
|
return res.status(400).json({
|
||
|
|
success: false,
|
||
|
|
message: '没有要更新的字段'
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
params.push(id);
|
||
|
|
await db.query(
|
||
|
|
`UPDATE success_stories SET ${updates.join(', ')} WHERE id = ?`,
|
||
|
|
params
|
||
|
|
);
|
||
|
|
|
||
|
|
return res.json({
|
||
|
|
success: true,
|
||
|
|
message: '成功案例更新成功'
|
||
|
|
});
|
||
|
|
} catch (error) {
|
||
|
|
console.error('更新成功案例失败:', error);
|
||
|
|
return res.status(500).json({
|
||
|
|
success: false,
|
||
|
|
message: '更新成功案例失败',
|
||
|
|
error: error.message
|
||
|
|
});
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 删除成功案例 (软删除)
|
||
|
|
* DELETE /api/success-stories/:id
|
||
|
|
*/
|
||
|
|
exports.delete = async (req, res) => {
|
||
|
|
try {
|
||
|
|
const { id } = req.params;
|
||
|
|
|
||
|
|
const [result] = await db.query(
|
||
|
|
'UPDATE success_stories SET is_active = 0 WHERE id = ?',
|
||
|
|
[id]
|
||
|
|
);
|
||
|
|
|
||
|
|
if (result.affectedRows === 0) {
|
||
|
|
return res.status(404).json({
|
||
|
|
success: false,
|
||
|
|
message: '成功案例不存在'
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
return res.json({
|
||
|
|
success: true,
|
||
|
|
message: '成功案例删除成功'
|
||
|
|
});
|
||
|
|
} catch (error) {
|
||
|
|
console.error('删除成功案例失败:', error);
|
||
|
|
return res.status(500).json({
|
||
|
|
success: false,
|
||
|
|
message: '删除成功案例失败',
|
||
|
|
error: error.message
|
||
|
|
});
|
||
|
|
}
|
||
|
|
};
|