Files
onion-dmp/scripts/fix-duplicate-category.js
2026-04-08 14:52:09 +08:00

95 lines
3.7 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env node
/**
* 修复分类重复问题
* 1. 删除"用户身份标签"分类及其所有标签和关系
* 2. 把"家庭角色"移到第一个位置
* 3. 调整其他分类的sort_order
*/
const Database = require('better-sqlite3');
const path = require('path');
const dbPath = path.join(__dirname, '../dmp_onion.db');
const db = new Database(dbPath);
console.log('\n╔════════════════════════════════════════════════════════════════╗');
console.log('║ 🔧 修复分类重复问题 ║');
console.log('╚════════════════════════════════════════════════════════════════╝\n');
try {
// 1. 获取用户身份标签的所有标签ID
console.log('1⃣ 获取\"用户身份标签\"的所有标签...');
const tagIds = db.prepare('SELECT id FROM tags WHERE category_id = 33').all();
console.log(` 找到 ${tagIds.length} 个标签`);
// 2. 删除相关的user_tags关系
console.log('\n2⃣ 删除user_tags关系...');
const stmt = db.prepare('DELETE FROM user_tags WHERE tag_id = ?');
let relDeleted = 0;
for (const tag of tagIds) {
const result = stmt.run(tag.id);
relDeleted += result.changes;
}
console.log(` 删除了 ${relDeleted} 条关系`);
// 3. 删除tags
console.log('\n3⃣ 删除标签...');
const tagDeleteResult = db.prepare('DELETE FROM tags WHERE category_id = 33').run();
console.log(` 删除了 ${tagDeleteResult.changes} 个标签`);
// 4. 删除分类
console.log('\n4⃣ 删除分类...');
const catDeleteResult = db.prepare('DELETE FROM tag_categories WHERE id = 33').run();
console.log(` 删除了 ${catDeleteResult.changes} 个分类`);
// 5. 更新家庭角色的sort_order到0
console.log('\n5⃣ 更新\"家庭角色\"的位置...');
db.prepare('UPDATE tag_categories SET sort_order = 0 WHERE id = 46').run();
console.log(' ✓ 家庭角色现在排在第一位');
// 6. 重新调整其他分类的sort_order
console.log('\n6⃣ 重新调整其他分类的顺序...');
const categories = db.prepare('SELECT id, key, name, sort_order FROM tag_categories ORDER BY sort_order').all();
let newOrder = 0;
for (const cat of categories) {
if (cat.id === 46) continue; // 家庭角色已经是0
if (cat.sort_order !== newOrder) {
db.prepare('UPDATE tag_categories SET sort_order = ? WHERE id = ?').run(newOrder, cat.id);
}
newOrder++;
}
console.log(` ✓ 调整了 ${newOrder} 个分类`);
// 7. 显示最终结果
console.log('\n7⃣ 最终分类列表:');
const finalCats = db.prepare('SELECT id, key, name, sort_order FROM tag_categories ORDER BY sort_order').all();
for (const cat of finalCats) {
console.log(` ${cat.sort_order + 1}. ${cat.name} (ID:${cat.id})`);
}
// 8. 统计数据
console.log('\n📊 数据统计:');
const stats = db.prepare(`
SELECT
(SELECT COUNT(*) FROM users) as 总用户,
(SELECT COUNT(*) FROM tags) as 总标签,
(SELECT COUNT(*) FROM tag_categories) as 分类数,
(SELECT COUNT(*) FROM user_tags) as 总关系
`).get();
console.log(` • 总用户: ${stats.总用户}`);
console.log(` • 总标签: ${stats.总标签}`);
console.log(` • 分类数: ${stats.分类数} (从16减少到15)`);
console.log(` • 总关系: ${stats.总关系}`);
console.log('\n✅ 修复完成!\n');
} catch (e) {
console.error('❌ 错误:', e.message);
process.exit(1);
} finally {
db.close();
}