138 lines
4.8 KiB
JavaScript
138 lines
4.8 KiB
JavaScript
const express = require('express');
|
|
const db = require('../db-sqlite');
|
|
const { authenticate } = require('../middleware/auth');
|
|
|
|
module.exports = function(app) {
|
|
const router = express.Router();
|
|
|
|
router.get('/', authenticate, async (req, res) => {
|
|
try {
|
|
const categoriesResult = await db.query('SELECT id, name, parent_id, created_at, updated_at FROM categories ORDER BY parent_id, name');
|
|
const categories = categoriesResult.rows;
|
|
res.json({ success: true, data: categories, count: categories.length });
|
|
} catch (error) {
|
|
console.error('获取分类列表失败:', error);
|
|
res.status(500).json({ success: false, message: '获取分类列表失败' });
|
|
}
|
|
});
|
|
|
|
router.get('/tree', authenticate, async (req, res) => {
|
|
try {
|
|
const categoriesResult = await db.query('SELECT id, name, parent_id, created_at, updated_at FROM categories ORDER BY parent_id, name');
|
|
const categories = categoriesResult.rows;
|
|
|
|
const categoryTree = buildCategoryTree(categories);
|
|
res.json({ success: true, data: categoryTree });
|
|
} catch (error) {
|
|
console.error('获取分类树失败:', error);
|
|
res.status(500).json({ success: false, message: '获取分类树失败' });
|
|
}
|
|
});
|
|
|
|
router.get('/:id', authenticate, async (req, res) => {
|
|
try {
|
|
const { id } = req.params;
|
|
const categoryResult = await db.query('SELECT id, name, parent_id, created_at, updated_at FROM categories WHERE id = ?', [id]);
|
|
|
|
if (categoryResult.rows.length === 0) {
|
|
return res.status(404).json({ success: false, message: '分类不存在' });
|
|
}
|
|
|
|
const category = categoryResult.rows[0];
|
|
res.json({ success: true, data: category });
|
|
} catch (error) {
|
|
console.error('获取分类详情失败:', error);
|
|
res.status(500).json({ success: false, message: '获取分类详情失败' });
|
|
}
|
|
});
|
|
|
|
router.post('/', authenticate, async (req, res) => {
|
|
try {
|
|
const { name, parent_id } = req.body;
|
|
|
|
if (!name) {
|
|
return res.status(400).json({ success: false, message: '分类名称为必填项' });
|
|
}
|
|
|
|
const result = await db.query(
|
|
'INSERT INTO categories (name, parent_id, created_at, updated_at) VALUES (?, ?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)',
|
|
[name, parent_id || null]
|
|
);
|
|
|
|
const newCategoryResult = await db.query('SELECT id, name, parent_id, created_at, updated_at FROM categories WHERE id = ?', [result.lastID]);
|
|
const newCategory = newCategoryResult.rows[0];
|
|
|
|
console.log(`分类 ${name} 创建成功,由 ${req.user.username} 操作`);
|
|
res.json({ success: true, data: newCategory });
|
|
} catch (error) {
|
|
console.error('创建分类失败:', error);
|
|
res.status(500).json({ success: false, message: '创建分类失败' });
|
|
}
|
|
});
|
|
|
|
router.put('/:id', authenticate, async (req, res) => {
|
|
try {
|
|
const { id } = req.params;
|
|
const { name, parent_id } = req.body;
|
|
|
|
await db.query(
|
|
'UPDATE categories SET name = ?, parent_id = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ?',
|
|
[name, parent_id, id]
|
|
);
|
|
|
|
const updatedCategoryResult = await db.query('SELECT id, name, parent_id, created_at, updated_at FROM categories WHERE id = ?', [id]);
|
|
const updatedCategory = updatedCategoryResult.rows[0];
|
|
|
|
res.json({ success: true, data: updatedCategory });
|
|
} catch (error) {
|
|
console.error('更新分类信息失败:', error);
|
|
res.status(500).json({ success: false, message: '更新分类信息失败' });
|
|
}
|
|
});
|
|
|
|
router.delete('/:id', authenticate, async (req, res) => {
|
|
try {
|
|
const { id } = req.params;
|
|
|
|
const existingCategory = await db.query('SELECT id FROM categories WHERE id = ?', [id]);
|
|
if (existingCategory.rows.length === 0) {
|
|
return res.status(404).json({ success: false, message: '分类不存在' });
|
|
}
|
|
|
|
await db.query('DELETE FROM categories WHERE id = ?', [id]);
|
|
|
|
res.json({ success: true, message: '分类删除成功' });
|
|
} catch (error) {
|
|
console.error('删除分类失败:', error);
|
|
res.status(500).json({ success: false, message: '删除分类失败' });
|
|
}
|
|
});
|
|
|
|
function buildCategoryTree(categories, parentId = null) {
|
|
const tree = [];
|
|
|
|
categories.forEach(category => {
|
|
if (category.parent_id === parentId) {
|
|
tree.push({
|
|
id: category.id,
|
|
name: category.name,
|
|
children: []
|
|
});
|
|
}
|
|
});
|
|
|
|
const rootCategories = categories.filter(cat => !cat.parent_id);
|
|
rootCategories.forEach(category => {
|
|
tree.push({
|
|
id: category.id,
|
|
name: category.name,
|
|
children: buildCategoryTree(categories, category.id)
|
|
});
|
|
});
|
|
|
|
return tree;
|
|
}
|
|
|
|
app.use('/api/categories', router);
|
|
};
|