180 lines
5.3 KiB
JavaScript
180 lines
5.3 KiB
JavaScript
const express = require('express');
|
|
const router = express.Router();
|
|
const { getDB } = require('../database');
|
|
const { auth } = require('../middleware/auth');
|
|
|
|
// 获取地址标签列表(包含系统默认和用户自定义)
|
|
router.get('/', auth, async (req, res) => {
|
|
try {
|
|
const userId = req.user.id;
|
|
|
|
const [labels] = await getDB().execute(
|
|
`SELECT * FROM address_labels
|
|
WHERE user_id IS NULL OR user_id = ?
|
|
ORDER BY is_system DESC, created_at ASC`,
|
|
[userId]
|
|
);
|
|
|
|
res.json({
|
|
success: true,
|
|
data: labels
|
|
});
|
|
} catch (error) {
|
|
console.error('获取地址标签列表错误:', error);
|
|
res.status(500).json({ message: '获取地址标签列表失败' });
|
|
}
|
|
});
|
|
|
|
// 创建自定义地址标签
|
|
router.post('/', auth, async (req, res) => {
|
|
try {
|
|
const userId = req.user.id;
|
|
const { name, color = '#1890ff' } = req.body;
|
|
|
|
if (!name || name.trim() === '') {
|
|
return res.status(400).json({ message: '标签名称不能为空' });
|
|
}
|
|
|
|
// 检查标签名称是否已存在(系统标签或用户自定义标签)
|
|
const [existing] = await getDB().execute(
|
|
`SELECT id FROM address_labels
|
|
WHERE name = ? AND (user_id IS NULL OR user_id = ?)`,
|
|
[name.trim(), userId]
|
|
);
|
|
|
|
if (existing.length > 0) {
|
|
return res.status(400).json({ message: '标签名称已存在' });
|
|
}
|
|
|
|
const [result] = await getDB().execute(
|
|
`INSERT INTO address_labels (name, color, user_id, is_system, created_at, updated_at)
|
|
VALUES (?, ?, ?, false, NOW(), NOW())`,
|
|
[name.trim(), color, userId]
|
|
);
|
|
|
|
res.status(201).json({
|
|
success: true,
|
|
message: '地址标签创建成功',
|
|
data: { labelId: result.insertId }
|
|
});
|
|
} catch (error) {
|
|
console.error('创建地址标签错误:', error);
|
|
res.status(500).json({ message: '创建地址标签失败' });
|
|
}
|
|
});
|
|
|
|
// 更新自定义地址标签
|
|
router.put('/:id', auth, async (req, res) => {
|
|
try {
|
|
const labelId = req.params.id;
|
|
const userId = req.user.id;
|
|
const { name, color } = req.body;
|
|
|
|
// 检查标签是否存在且属于当前用户(不能修改系统标签)
|
|
const [existing] = await getDB().execute(
|
|
'SELECT id, is_system FROM address_labels WHERE id = ? AND user_id = ?',
|
|
[labelId, userId]
|
|
);
|
|
|
|
if (existing.length === 0) {
|
|
return res.status(404).json({ message: '地址标签不存在或无权限修改' });
|
|
}
|
|
|
|
if (existing[0].is_system) {
|
|
return res.status(403).json({ message: '系统标签不能修改' });
|
|
}
|
|
|
|
if (name && name.trim() !== '') {
|
|
// 检查新名称是否已存在
|
|
const [nameExists] = await getDB().execute(
|
|
`SELECT id FROM address_labels
|
|
WHERE name = ? AND id != ? AND (user_id IS NULL OR user_id = ?)`,
|
|
[name.trim(), labelId, userId]
|
|
);
|
|
|
|
if (nameExists.length > 0) {
|
|
return res.status(400).json({ message: '标签名称已存在' });
|
|
}
|
|
}
|
|
|
|
const updateFields = [];
|
|
const updateValues = [];
|
|
|
|
if (name && name.trim() !== '') {
|
|
updateFields.push('name = ?');
|
|
updateValues.push(name.trim());
|
|
}
|
|
|
|
if (color) {
|
|
updateFields.push('color = ?');
|
|
updateValues.push(color);
|
|
}
|
|
|
|
if (updateFields.length === 0) {
|
|
return res.status(400).json({ message: '没有需要更新的字段' });
|
|
}
|
|
|
|
updateFields.push('updated_at = NOW()');
|
|
updateValues.push(labelId, userId);
|
|
|
|
await getDB().execute(
|
|
`UPDATE address_labels SET ${updateFields.join(', ')} WHERE id = ? AND user_id = ?`,
|
|
updateValues
|
|
);
|
|
|
|
res.json({
|
|
success: true,
|
|
message: '地址标签更新成功'
|
|
});
|
|
} catch (error) {
|
|
console.error('更新地址标签错误:', error);
|
|
res.status(500).json({ message: '更新地址标签失败' });
|
|
}
|
|
});
|
|
|
|
// 删除自定义地址标签
|
|
router.delete('/:id', auth, async (req, res) => {
|
|
try {
|
|
const labelId = req.params.id;
|
|
const userId = req.user.id;
|
|
|
|
// 检查标签是否存在且属于当前用户(不能删除系统标签)
|
|
const [existing] = await getDB().execute(
|
|
'SELECT id, is_system FROM address_labels WHERE id = ? AND user_id = ?',
|
|
[labelId, userId]
|
|
);
|
|
|
|
if (existing.length === 0) {
|
|
return res.status(404).json({ message: '地址标签不存在或无权限删除' });
|
|
}
|
|
|
|
if (existing[0].is_system) {
|
|
return res.status(403).json({ message: '系统标签不能删除' });
|
|
}
|
|
|
|
// 检查是否有地址正在使用该标签
|
|
const [addressesUsingLabel] = await getDB().execute(
|
|
'SELECT COUNT(*) as count FROM user_addresses WHERE label_id = ? AND deleted_at IS NULL',
|
|
[labelId]
|
|
);
|
|
|
|
if (addressesUsingLabel[0].count > 0) {
|
|
return res.status(400).json({ message: '该标签正在被使用,无法删除' });
|
|
}
|
|
|
|
await getDB().execute(
|
|
'DELETE FROM address_labels WHERE id = ? AND user_id = ?',
|
|
[labelId, userId]
|
|
);
|
|
|
|
res.json({
|
|
success: true,
|
|
message: '地址标签删除成功'
|
|
});
|
|
} catch (error) {
|
|
console.error('删除地址标签错误:', error);
|
|
res.status(500).json({ message: '删除地址标签失败' });
|
|
}
|
|
});
|
|
|
|
module.exports = router; |