drop-lobster-model-route-menu.js 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. /**
  2. * 删除租户库「多模型路由配置」菜单(sys_menu + company_menu)
  3. * Usage: node scripts/drop-lobster-model-route-menu.js [dbName|all]
  4. */
  5. const mysql = require('mysql2/promise')
  6. const DB_CFG = {
  7. host: 'cq-cdb-8fjmemkb.sql.tencentcdb.com',
  8. port: 27220,
  9. user: 'root',
  10. password: 'Ylrz_1q2w3e4r5t6y',
  11. multipleStatements: true,
  12. charset: 'utf8mb4'
  13. }
  14. const MENU_IDS = [29946, 3005]
  15. async function dropMenus(conn) {
  16. const [sysBefore] = await conn.query(
  17. `SELECT menu_id, menu_name, path, component FROM sys_menu
  18. WHERE menu_id IN (?) OR component = 'lobster/model-route/index'
  19. OR path IN ('model-route', 'lobster-model-route')`,
  20. [MENU_IDS]
  21. )
  22. const [cmBefore] = await conn.query(
  23. `SELECT menu_id, menu_name, path, component FROM company_menu
  24. WHERE menu_id IN (?) OR component = 'lobster/model-route/index'
  25. OR path IN ('model-route', 'lobster-model-route')`,
  26. [MENU_IDS]
  27. )
  28. console.log('sys_menu before:', sysBefore.length, sysBefore.map(r => `${r.menu_id}:${r.menu_name}`).join(', ') || '-')
  29. console.log('company_menu before:', cmBefore.length, cmBefore.map(r => `${r.menu_id}:${r.menu_name}`).join(', ') || '-')
  30. await conn.query('DELETE FROM sys_role_menu WHERE menu_id IN (?)', [MENU_IDS])
  31. await conn.query('DELETE FROM company_role_menu WHERE menu_id IN (?)', [MENU_IDS])
  32. await conn.query(
  33. `DELETE FROM company_menu
  34. WHERE menu_id IN (?)
  35. OR path IN ('model-route', 'lobster-model-route')
  36. OR component = 'lobster/model-route/index'`,
  37. [MENU_IDS]
  38. )
  39. await conn.query(
  40. `DELETE FROM sys_menu
  41. WHERE menu_id IN (?)
  42. OR path IN ('model-route', 'lobster-model-route')
  43. OR component = 'lobster/model-route/index'`,
  44. [MENU_IDS]
  45. )
  46. const [sysAfter] = await conn.query(
  47. `SELECT COUNT(*) AS c FROM sys_menu WHERE component = 'lobster/model-route/index'`
  48. )
  49. const [cmAfter] = await conn.query(
  50. `SELECT COUNT(*) AS c FROM company_menu WHERE component = 'lobster/model-route/index'`
  51. )
  52. console.log('sys_menu model-route left:', sysAfter[0].c)
  53. console.log('company_menu model-route left:', cmAfter[0].c)
  54. }
  55. async function listTenantDbs(conn) {
  56. const [rows] = await conn.query(
  57. "SELECT SCHEMA_NAME AS dbName FROM information_schema.SCHEMATA WHERE SCHEMA_NAME LIKE 'fs\\_tenant\\_%' ESCAPE '\\\\' ORDER BY SCHEMA_NAME"
  58. )
  59. return rows.map(r => r.dbName)
  60. }
  61. async function main() {
  62. const target = process.argv[2] || 'fs_tenant_cs1'
  63. const root = await mysql.createConnection({ ...DB_CFG, database: 'mysql' })
  64. const dbs = target === 'all' ? await listTenantDbs(root) : [target]
  65. await root.end()
  66. for (const db of dbs) {
  67. console.log('\n===', db, '===')
  68. const conn = await mysql.createConnection({ ...DB_CFG, database: db })
  69. try {
  70. await dropMenus(conn)
  71. } catch (e) {
  72. console.error('failed:', db, e.message)
  73. }
  74. await conn.end()
  75. }
  76. }
  77. main().catch(e => { console.error(e); process.exit(1) })