ShowAllMenus.java 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. import java.sql.*;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. /**
  5. * Set all hidden menus to visible (visible='0') for review/cleanup.
  6. * - tenant DB: sys_menu
  7. * - master DB: tenant_sys_menu (+ sys_menu if present)
  8. */
  9. public class ShowAllMenus {
  10. private static final String MASTER_HOST = getenv("DB_HOST", "cq-cdb-8fjmemkb.sql.tencentcdb.com");
  11. private static final int MASTER_PORT = Integer.parseInt(getenv("DB_PORT", "27220"));
  12. private static final String MASTER_USER = getenv("DB_USER", "root");
  13. private static final String MASTER_PASSWORD = getenv("DB_PASSWORD", "Ylrz_1q2w3e4r5t6y");
  14. private static final String MASTER_DB = getenv("DB_NAME", "ylrz_saas");
  15. public static void main(String[] args) throws Exception {
  16. Class.forName("com.mysql.cj.jdbc.Driver");
  17. boolean dryRun = args.length > 0 && "dry-run".equalsIgnoreCase(args[0]);
  18. System.out.println("=== Show all menus (visible 1 -> 0) === dryRun=" + dryRun);
  19. try (Connection master = open(MASTER_HOST, MASTER_PORT, MASTER_DB, MASTER_USER, MASTER_PASSWORD)) {
  20. if (dryRun) {
  21. preview(master, "tenant_sys_menu");
  22. if (tableExists(master, "sys_menu")) {
  23. preview(master, "sys_menu");
  24. }
  25. } else {
  26. int n = unhide(master, "tenant_sys_menu");
  27. System.out.println("[MASTER] tenant_sys_menu unhidden=" + n);
  28. if (tableExists(master, "sys_menu")) {
  29. n = unhide(master, "sys_menu");
  30. System.out.println("[MASTER] sys_menu unhidden=" + n);
  31. }
  32. }
  33. }
  34. List<Long> tenantIds;
  35. try (Connection master = open(MASTER_HOST, MASTER_PORT, MASTER_DB, MASTER_USER, MASTER_PASSWORD)) {
  36. tenantIds = loadActiveTenantIds(master);
  37. }
  38. int ok = 0;
  39. for (Long tenantId : tenantIds) {
  40. TenantDb tenant;
  41. try (Connection master = open(MASTER_HOST, MASTER_PORT, MASTER_DB, MASTER_USER, MASTER_PASSWORD)) {
  42. tenant = loadTenant(master, tenantId);
  43. }
  44. if (tenant == null) {
  45. continue;
  46. }
  47. try (Connection conn = open(tenant.host, tenant.port, tenant.database, tenant.user, tenant.password)) {
  48. if (!tableExists(conn, "sys_menu")) {
  49. continue;
  50. }
  51. if (dryRun) {
  52. int hidden = countHidden(conn, "sys_menu");
  53. System.out.println("[TENANT " + tenantId + "] " + tenant.database + " hidden=" + hidden);
  54. } else {
  55. int n = unhide(conn, "sys_menu");
  56. System.out.println("[TENANT " + tenantId + "] " + tenant.database + " unhidden=" + n);
  57. }
  58. ok++;
  59. }
  60. }
  61. System.out.println("\nDone. tenants processed=" + ok);
  62. }
  63. private static int unhide(Connection conn, String table) throws SQLException {
  64. String sql = "UPDATE " + table + " SET visible = '0', update_time = NOW() "
  65. + "WHERE visible = '1' AND status = '0'";
  66. try (Statement st = conn.createStatement()) {
  67. return st.executeUpdate(sql);
  68. }
  69. }
  70. private static int countHidden(Connection conn, String table) throws SQLException {
  71. try (Statement st = conn.createStatement();
  72. ResultSet rs = st.executeQuery(
  73. "SELECT COUNT(*) FROM " + table + " WHERE visible = '1' AND status = '0'")) {
  74. rs.next();
  75. return rs.getInt(1);
  76. }
  77. }
  78. private static void preview(Connection conn, String table) throws SQLException {
  79. System.out.println("\n--- " + table + " hidden menus ---");
  80. try (Statement st = conn.createStatement();
  81. ResultSet rs = st.executeQuery(
  82. "SELECT menu_id, parent_id, menu_name, path FROM " + table
  83. + " WHERE visible = '1' AND status = '0' ORDER BY parent_id, menu_id LIMIT 80")) {
  84. int n = 0;
  85. while (rs.next()) {
  86. n++;
  87. System.out.printf(" id=%d parent=%d path=%s name=%s%n",
  88. rs.getLong(1), rs.getLong(2), rs.getString(4), rs.getString(3));
  89. }
  90. int total = countHidden(conn, table);
  91. System.out.println(" shown=" + n + " total hidden=" + total);
  92. }
  93. }
  94. private static boolean tableExists(Connection conn, String table) throws SQLException {
  95. try (ResultSet rs = conn.getMetaData().getTables(null, null, table, null)) {
  96. return rs.next();
  97. }
  98. }
  99. private static List<Long> loadActiveTenantIds(Connection master) throws SQLException {
  100. List<Long> ids = new ArrayList<>();
  101. try (Statement st = master.createStatement();
  102. ResultSet rs = st.executeQuery("SELECT id FROM tenant_info WHERE status = 1 ORDER BY id")) {
  103. while (rs.next()) {
  104. ids.add(rs.getLong(1));
  105. }
  106. }
  107. return ids;
  108. }
  109. private static TenantDb loadTenant(Connection master, long tenantId) throws SQLException {
  110. try (PreparedStatement ps = master.prepareStatement(
  111. "SELECT db_url, db_account, db_pwd FROM tenant_info WHERE id = ? AND status = 1 LIMIT 1")) {
  112. ps.setLong(1, tenantId);
  113. try (ResultSet rs = ps.executeQuery()) {
  114. if (!rs.next()) {
  115. return null;
  116. }
  117. return parseJdbcUrl(rs.getString("db_url"), rs.getString("db_account"), rs.getString("db_pwd"));
  118. }
  119. }
  120. }
  121. private static TenantDb parseJdbcUrl(String jdbcUrl, String user, String password) {
  122. String body = jdbcUrl.substring("jdbc:mysql://".length());
  123. int slash = body.indexOf('/');
  124. String hostPort = body.substring(0, slash);
  125. String rest = body.substring(slash + 1);
  126. int q = rest.indexOf('?');
  127. String database = q >= 0 ? rest.substring(0, q) : rest;
  128. int colon = hostPort.indexOf(':');
  129. TenantDb t = new TenantDb();
  130. t.host = colon >= 0 ? hostPort.substring(0, colon) : hostPort;
  131. t.port = colon >= 0 ? Integer.parseInt(hostPort.substring(colon + 1)) : 3306;
  132. t.database = database;
  133. t.user = user != null ? user : MASTER_USER;
  134. t.password = password != null ? password : MASTER_PASSWORD;
  135. return t;
  136. }
  137. private static Connection open(String host, int port, String database, String user, String password)
  138. throws SQLException {
  139. return DriverManager.getConnection(
  140. "jdbc:mysql://" + host + ":" + port + "/" + database
  141. + "?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&allowMultiQueries=true",
  142. user, password);
  143. }
  144. private static String getenv(String key, String defaultValue) {
  145. String v = System.getenv(key);
  146. return v != null && !v.isEmpty() ? v : defaultValue;
  147. }
  148. private static final class TenantDb {
  149. String host;
  150. int port;
  151. String database;
  152. String user;
  153. String password;
  154. }
  155. }