import java.io.IOException; import java.nio.file.*; import java.sql.*; import java.util.*; /** Fix admin sys_menu icons and tenant upgrade menu route metadata. */ public class ApplyAdminMenuIcons { private static final String MASTER_HOST = getenv("DB_HOST", "cq-cdb-8fjmemkb.sql.tencentcdb.com"); private static final int MASTER_PORT = Integer.parseInt(getenv("DB_PORT", "27220")); private static final String MASTER_USER = getenv("DB_USER", "root"); private static final String MASTER_PASSWORD = getenv("DB_PASSWORD", "Ylrz_1q2w3e4r5t6y"); private static final String MASTER_DB = getenv("DB_NAME", "ylrz_saas"); private static final String SVG_DIR = "d:/ylrz_saas_new/adminui/src/assets/icons/svg"; private static final Map ICON_ALIAS = new LinkedHashMap<>(); static { ICON_ALIAS.put("system", "build"); ICON_ALIAS.put("form", "edit"); ICON_ALIAS.put("phone", "message"); ICON_ALIAS.put("job", "time"); ICON_ALIAS.put("log", "documentation"); ICON_ALIAS.put("dashboard", "chart"); ICON_ALIAS.put("validCode", "lock"); ICON_ALIAS.put("tool", "build"); ICON_ALIAS.put("bug", "education"); ICON_ALIAS.put("wechat", "message"); ICON_ALIAS.put("upload", "documentation"); ICON_ALIAS.put("shopping", "money"); ICON_ALIAS.put("share", "guide"); ICON_ALIAS.put("warning", "education"); ICON_ALIAS.put("tree", "tree-table"); } private static final String MENU_FIX_SQL = "UPDATE sys_menu SET menu_name='\u79df\u6237\u5e93\u7ed3\u6784\u5347\u7ea7', " + "parent_id=2820, path='tenantUpgrade', component='saas/tenant/upgrade/index', " + "menu_type='C', visible='0', status='0', icon='el-icon-upload2' " + "WHERE menu_id=32850;" + "UPDATE sys_menu SET menu_type='F', visible='1', path='#', component=NULL " + "WHERE menu_id IN (32851,32852);" + "UPDATE sys_menu SET icon='build' WHERE icon='system' AND menu_type IN ('C','M');" + "UPDATE sys_menu SET icon='edit' WHERE icon='form' AND menu_type IN ('C','M');" + "UPDATE sys_menu SET icon='message' WHERE icon IN ('phone','wechat') AND menu_type IN ('C','M');" + "UPDATE sys_menu SET icon='time' WHERE icon='job' AND menu_type IN ('C','M');" + "UPDATE sys_menu SET icon='documentation' WHERE icon IN ('log','upload') AND menu_type IN ('C','M');" + "UPDATE sys_menu SET icon='chart' WHERE icon='dashboard' AND menu_type IN ('C','M');" + "UPDATE sys_menu SET icon='lock' WHERE icon='validCode' AND menu_type IN ('C','M');" + "UPDATE sys_menu SET icon='build' WHERE icon='tool' AND menu_type IN ('C','M');" + "UPDATE sys_menu SET icon='education' WHERE icon IN ('bug','warning') AND menu_type IN ('C','M');" + "UPDATE sys_menu SET icon='money' WHERE icon='shopping' AND menu_type IN ('C','M');" + "UPDATE sys_menu SET icon='tree-table' WHERE icon='tree' AND menu_type IN ('C','M');" + "UPDATE sys_menu SET icon='guide' WHERE icon='share' AND menu_type IN ('C','M');"; public static void main(String[] args) throws Exception { Set svgs = loadSvgs(); int updated = 0; try (Connection c = open(MASTER_HOST, MASTER_PORT, MASTER_DB, MASTER_USER, MASTER_PASSWORD)) { execBatch(c, MENU_FIX_SQL); System.out.println("[OK] tenant upgrade menu metadata fixed"); try (Statement st = c.createStatement(); ResultSet rs = st.executeQuery( "SELECT menu_id, menu_name, icon FROM sys_menu " + "WHERE menu_type IN ('C','M') AND visible='0' AND status='0'")) { try (PreparedStatement ps = c.prepareStatement("UPDATE sys_menu SET icon=? WHERE menu_id=?")) { while (rs.next()) { long menuId = rs.getLong(1); String name = rs.getString(2); String icon = rs.getString(3); String fixed = resolveIcon(name, icon, svgs); if (fixed == null || Objects.equals(fixed, icon)) continue; ps.setString(1, fixed); ps.setLong(2, menuId); ps.executeUpdate(); updated++; System.out.printf("[UPDATE] %s | %s | %s -> %s%n", menuId, name, icon, fixed); } } } } System.out.println("[OK] updated " + updated + " menu icons"); } private static String resolveIcon(String menuName, String icon, Set svgs) { if (icon != null && icon.startsWith("el-icon-")) return icon; if (icon != null && !icon.isEmpty() && !icon.equals("#") && svgs.contains(icon)) return icon; if (icon != null && ICON_ALIAS.containsKey(icon)) { String alias = ICON_ALIAS.get(icon); if (svgs.contains(alias)) return alias; } return pickByName(menuName, svgs); } private static String pickByName(String name, Set svgs) { if (name == null || name.isEmpty()) return pick("documentation", svgs); if (name.contains("\u5347\u7ea7")) return "el-icon-upload2"; if (name.contains("\u6a21\u677f")) return pick("documentation", svgs); if (name.contains("\u5de5\u4f5c\u6d41")) return pick("guide", svgs); if (name.contains("\u5b9e\u4f8b") || name.contains("\u76d1\u63a7")) return pick("monitor", svgs); if (name.contains("\u654f\u611f") || name.contains("\u8fdd\u7981") || name.contains("\u6613\u9519") || name.contains("\u8fdd\u89c4") || name.contains("\u5173\u952e\u8bcd")) return pick("education", svgs); if (name.contains("\u79df\u6237")) return pick("peoples", svgs); if (name.contains("\u914d\u7f6e") || name.contains("\u8bbe\u7f6e") || name.contains("\u53c2\u6570")) return pick("build", svgs); if (name.contains("\u65e5\u5fd7")) return pick("documentation", svgs); if (name.contains("\u4efb\u52a1") || name.contains("\u5b9a\u65f6")) return pick("time", svgs); if (name.contains("CID") || name.contains("\u8bbe\u5907") || name.contains("\u670d\u52a1")) return pick("server", svgs); if (name.contains("\u5fae\u4fe1") || name.contains("\u4f01\u5fae")) return pick("message", svgs); if (name.contains("\u5b57\u5178")) return pick("documentation", svgs); if (name.contains("\u8ba2\u5355") || name.contains("\u6536\u8d39") || name.contains("\u8d44\u91d1")) return pick("money", svgs); if (name.contains("\u7edf\u8ba1") || name.contains("\u62a5\u8868") || name.contains("\u770b\u677f")) return pick("chart", svgs); if (name.contains("\u7528\u6237")) return pick("user", svgs); if (name.contains("\u89d2\u8272")) return pick("peoples", svgs); if (name.contains("\u90e8\u95e8") || name.contains("\u83dc\u5355")) return pick("tree-table", svgs); if (name.contains("\u901a\u77e5") || name.contains("\u516c\u544a")) return pick("message", svgs); if (name.contains("\u7cfb\u7edf")) return pick("build", svgs); return pick("documentation", svgs); } private static String pick(String icon, Set svgs) { return svgs.contains(icon) ? icon : "documentation"; } private static Set loadSvgs() throws IOException { Set svgs = new HashSet<>(); try (DirectoryStream ds = Files.newDirectoryStream(Paths.get(SVG_DIR), "*.svg")) { for (Path p : ds) { String fn = p.getFileName().toString(); svgs.add(fn.substring(0, fn.length() - 4)); } } return svgs; } private static void execBatch(Connection conn, String sql) throws SQLException { try (Statement st = conn.createStatement()) { for (String part : sql.split(";")) { String s = part.trim(); if (!s.isEmpty()) st.execute(s); } } } private static Connection open(String host, int port, String database, String user, String password) throws SQLException { return DriverManager.getConnection( "jdbc:mysql://" + host + ":" + port + "/" + database + "?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&allowMultiQueries=true", user, password); } private static String getenv(String key, String defaultValue) { String v = System.getenv(key); return v != null && !v.isEmpty() ? v : defaultValue; } }