/** * 删除租户库「多模型路由配置」菜单(sys_menu + company_menu) * Usage: node scripts/drop-lobster-model-route-menu.js [dbName|all] */ const mysql = require('mysql2/promise') const DB_CFG = { host: 'cq-cdb-8fjmemkb.sql.tencentcdb.com', port: 27220, user: 'root', password: 'Ylrz_1q2w3e4r5t6y', multipleStatements: true, charset: 'utf8mb4' } const MENU_IDS = [29946, 3005] async function dropMenus(conn) { const [sysBefore] = await conn.query( `SELECT menu_id, menu_name, path, component FROM sys_menu WHERE menu_id IN (?) OR component = 'lobster/model-route/index' OR path IN ('model-route', 'lobster-model-route')`, [MENU_IDS] ) const [cmBefore] = await conn.query( `SELECT menu_id, menu_name, path, component FROM company_menu WHERE menu_id IN (?) OR component = 'lobster/model-route/index' OR path IN ('model-route', 'lobster-model-route')`, [MENU_IDS] ) console.log('sys_menu before:', sysBefore.length, sysBefore.map(r => `${r.menu_id}:${r.menu_name}`).join(', ') || '-') console.log('company_menu before:', cmBefore.length, cmBefore.map(r => `${r.menu_id}:${r.menu_name}`).join(', ') || '-') await conn.query('DELETE FROM sys_role_menu WHERE menu_id IN (?)', [MENU_IDS]) await conn.query('DELETE FROM company_role_menu WHERE menu_id IN (?)', [MENU_IDS]) await conn.query( `DELETE FROM company_menu WHERE menu_id IN (?) OR path IN ('model-route', 'lobster-model-route') OR component = 'lobster/model-route/index'`, [MENU_IDS] ) await conn.query( `DELETE FROM sys_menu WHERE menu_id IN (?) OR path IN ('model-route', 'lobster-model-route') OR component = 'lobster/model-route/index'`, [MENU_IDS] ) const [sysAfter] = await conn.query( `SELECT COUNT(*) AS c FROM sys_menu WHERE component = 'lobster/model-route/index'` ) const [cmAfter] = await conn.query( `SELECT COUNT(*) AS c FROM company_menu WHERE component = 'lobster/model-route/index'` ) console.log('sys_menu model-route left:', sysAfter[0].c) console.log('company_menu model-route left:', cmAfter[0].c) } async function listTenantDbs(conn) { const [rows] = await conn.query( "SELECT SCHEMA_NAME AS dbName FROM information_schema.SCHEMATA WHERE SCHEMA_NAME LIKE 'fs\\_tenant\\_%' ESCAPE '\\\\' ORDER BY SCHEMA_NAME" ) return rows.map(r => r.dbName) } async function main() { const target = process.argv[2] || 'fs_tenant_cs1' const root = await mysql.createConnection({ ...DB_CFG, database: 'mysql' }) const dbs = target === 'all' ? await listTenantDbs(root) : [target] await root.end() for (const db of dbs) { console.log('\n===', db, '===') const conn = await mysql.createConnection({ ...DB_CFG, database: db }) try { await dropMenus(conn) } catch (e) { console.error('failed:', db, e.message) } await conn.end() } } main().catch(e => { console.error(e); process.exit(1) })