|
|
Êý¾Ý¿âMySQLÓû§ÔÚÏß״̬¹ÜÀíÐÄÌø³ÌÐò
- // Óû§ÔÚÏß״̬¹ÜÀíÐÄÌø³ÌÐò
- // ÓÃÓÚ¸ú×ٺ͹ÜÀíÓû§ÔÚÏß״̬µÄʾÀý³ÌÐò
- //🍎½»Á÷QQȺ711841924Ⱥһ£¬Æ»¹ûÄÚ²âȺ£¬528816639
- print.log("===== Óû§ÔÚÏß״̬¹ÜÀíÐÄÌø³ÌÐòÆô¶¯ =====");
- // È«¾Ö±äÁ¿
- var conn = null;
- var heartbeatInterval = null;
- var isRunning = false;
- var currentUser = null;
- /**
- * Á¬½ÓÊý¾Ý¿â
- */
- function connectDatabase() {
- try {
- var url = "jdbc:mysql://mysql2.sqlpub.com:3307/chaook";
- var user = "chaook";
- var password = "JAVsRUMHkoJ123xJ";
- var params = "?useSSL=false&characterEncoding=utf8";
-
- print.log("ÕýÔÚÁ¬½ÓÊý¾Ý¿â...");
- conn = mysql.getConnection(url, user, password);
- print.log("✅ Êý¾Ý¿âÁ¬½Ó³É¹¦");
- return true;
- } catch (e) {
- print.log("❌ Êý¾Ý¿âÁ¬½Óʧ°Ü: " + e.message);
- return false;
- }
- }
- /**
- * ³õʼ»¯Êý¾Ý¿â±í½á¹¹
- */
- function initializeDatabase() {
- try {
- // ´´½¨Óû§ÔÚÏß״̬±í
- var userTableSql = "CREATE TABLE IF NOT EXISTS Óû§ÔÚÏß״̬±í (" +
- "Óû§ID VARCHAR(50) PRIMARY KEY," +
- "Óû§Ãû VARCHAR(100)," +
- "ÔÚÏß״̬ TINYINT DEFAULT 0," + // 0-ÀëÏß, 1-ÔÚÏß
- "×îºó»îԾʱ¼ä DATETIME," +
- "»á»°¿ªÊ¼Ê±¼ä DATETIME," +
- "ÔÚÏßʱ³¤ INT DEFAULT 0" + // µ¥Î»£ºÃë
- ") ENGINE=InnoDB DEFAULT CHARSET=utf8";
-
- var stmt = conn.createStatement();
- stmt.executeUpdate(userTableSql);
- stmt.close();
-
- // ´´½¨Óû§»î¶¯ÈÕÖ¾±í
- var logTableSql = "CREATE TABLE IF NOT EXISTS Óû§»î¶¯ÈÕÖ¾±í (" +
- "ÈÕÖ¾ID INT AUTO_INCREMENT PRIMARY KEY," +
- "Óû§ID VARCHAR(50)," +
- "»î¶¯ÀàÐÍ VARCHAR(50)," +
- "»î¶¯ÏêÇé TEXT," +
- "»î¶¯Ê±¼ä DATETIME DEFAULT CURRENT_TIMESTAMP," +
- "FOREIGN KEY (Óû§ID) REFERENCES Óû§ÔÚÏß״̬±í(Óû§ID) ON DELETE CASCADE" +
- ") ENGINE=InnoDB DEFAULT CHARSET=utf8";
-
- stmt = conn.createStatement();
- stmt.executeUpdate(logTableSql);
- stmt.close();
-
- print.log("✅ Êý¾Ý¿â±í½á¹¹³õʼ»¯Íê³É");
- return true;
- } catch (e) {
- print.log("❌ Êý¾Ý¿â±í½á¹¹³õʼ»¯Ê§°Ü: " + e.message);
- return false;
- }
- }
- /**
- * Óû§µÇ¼
- */
- function userLogin(userId, username) {
- try {
- var sql = "INSERT INTO Óû§ÔÚÏß״̬±í (Óû§ID, Óû§Ãû, ÔÚÏß״̬, ×îºó»îԾʱ¼ä, »á»°¿ªÊ¼Ê±¼ä) " +
- "VALUES (?, ?, 1, NOW(), NOW()) " +
- "ON DUPLICATE KEY UPDATE Óû§Ãû = VALUES(Óû§Ãû), ÔÚÏß״̬ = 1, ×îºó»îԾʱ¼ä = NOW(), »á»°¿ªÊ¼Ê±¼ä = NOW()";
-
- var pstmt = conn.prepareStatement(sql);
- pstmt.setString(1, userId);
- pstmt.setString(2, username);
- pstmt.executeUpdate();
- pstmt.close();
-
- logUserActivity(userId, "Óû§µÇ¼", "Óû§ " + username + " µÇ¼ϵͳ");
- currentUser = {id: userId, name: username};
- print.log("✅ Óû§ " + username + " µÇ¼³É¹¦");
- return true;
- } catch (e) {
- print.log("❌ Óû§µÇ¼ʧ°Ü: " + e.message);
- return false;
- }
- }
- /**
- * ·¢ËÍÓû§ÐÄÌø°ü
- */
- function sendUserHeartbeat(userId) {
- try {
- var sql = "UPDATE Óû§ÔÚÏß״̬±í SET ÔÚÏß״̬ = 1, ×îºó»îԾʱ¼ä = NOW() WHERE Óû§ID = ?";
-
- var pstmt = conn.prepareStatement(sql);
- pstmt.setString(1, userId);
- pstmt.executeUpdate();
- pstmt.close();
-
- logUserActivity(userId, "ÐÄÌø°ü", "·¢ËÍÐÄÌø°ü£¬¸üÐÂÓû§»îԾʱ¼ä");
- print.log("✅ Óû§ " + userId + " ÐÄÌø°ü·¢Ëͳɹ¦");
- return true;
- } catch (e) {
- print.log("❌ ÐÄÌø°ü·¢ËÍʧ°Ü: " + e.message);
- return false;
- }
- }
- /**
- * ¼Ç¼Óû§»î¶¯ÈÕÖ¾
- */
- function logUserActivity(userId, activityType, details) {
- try {
- var sql = "INSERT INTO Óû§»î¶¯ÈÕÖ¾±í (Óû§ID, »î¶¯ÀàÐÍ, »î¶¯ÏêÇé) VALUES (?, ?, ?)";
- var pstmt = conn.prepareStatement(sql);
- pstmt.setString(1, userId);
- pstmt.setString(2, activityType);
- pstmt.setString(3, details);
- pstmt.executeUpdate();
- pstmt.close();
- return true;
- } catch (e) {
- // ÈÕÖ¾¼Ç¼ʧ°Ü²»Ó°ÏìÖ÷Á÷³Ì
- print.log("⚠️ Óû§»î¶¯ÈÕÖ¾¼Ç¼ʧ°Ü: " + e.message);
- return false;
- }
- }
- /**
- * ¼ì²éÓû§ÔÚÏß״̬
- */
- function checkUserStatus() {
- try {
- var sql = "SELECT Óû§ID, Óû§Ãû, ÔÚÏß״̬, ×îºó»îԾʱ¼ä, »á»°¿ªÊ¼Ê±¼ä FROM Óû§ÔÚÏß״̬±í";
- var stmt = conn.createStatement();
- var rs = stmt.executeQuery(sql);
-
- print.log("\n=== Óû§ÔÚÏß״̬¼à¿Ø ===");
- print.log("Óû§ID\t\tÓû§Ãû\t\tÔÚÏß״̬\t×îºó»îԾʱ¼ä\t\t\t»á»°¿ªÊ¼Ê±¼ä");
- print.log("-----------------------------------------------------------------------------------------------");
-
- var offlineUsers = [];
- var onlineUsers = [];
-
- while (rs.next()) {
- var userId = rs.getString("Óû§ID");
- var username = rs.getString("Óû§Ãû");
- var onlineStatus = rs.getInt("ÔÚÏß״̬");
- var lastActive = rs.getTimestamp("×îºó»îԾʱ¼ä");
- var sessionStart = rs.getTimestamp("»á»°¿ªÊ¼Ê±¼ä");
-
- // ¸ñʽ»¯Êä³ö
- var nameStr = username + "\t\t";
- if (username.length >= 4) nameStr = username + "\t";
-
- var statusStr = onlineStatus === 1 ? "ÔÚÏß" : "ÀëÏß";
-
- print.log(userId + "\t" + nameStr + statusStr + "\t\t" + lastActive + "\t" + sessionStart);
-
- // ·ÖÀàÓû§
- if (onlineStatus === 1) {
- onlineUsers.push({id: userId, name: username, lastActive: lastActive});
- } else {
- offlineUsers.push({id: userId, name: username});
- }
- }
-
- rs.close();
- stmt.close();
-
- // ±¨¸æÍ³¼ÆÐÅÏ¢
- print.log("\n📊 ͳ¼ÆÐÅÏ¢:");
- print.log(" ÔÚÏßÓû§Êý: " + onlineUsers.length);
- print.log(" ÀëÏßÓû§Êý: " + offlineUsers.length);
-
- if (onlineUsers.length > 0) {
- print.log("\n🟢 ÔÚÏßÓû§Áбí:");
- for (var i = 0; i < onlineUsers.length; i++) {
- var user = onlineUsers[i];
- print.log(" - " + user.name + " (" + user.id + ") ×îºó»îÔ¾: " + user.lastActive);
- }
- }
-
- if (offlineUsers.length > 0) {
- print.log("\n🔴 ÀëÏßÓû§Áбí:");
- for (var i = 0; i < offlineUsers.length; i++) {
- var user = offlineUsers[i];
- print.log(" - " + user.name + " (" + user.id + ")");
- }
- }
-
- print.log("");
- return true;
- } catch (e) {
- print.log("❌ Óû§×´Ì¬¼ì²éʧ°Ü: " + e.message);
- return false;
- }
- }
- /**
- * Óû§µÇ³ö
- */
- function userLogout(userId) {
- try {
- // ¸üÐÂÔÚÏßʱ³¤
- var durationSql = "UPDATE Óû§ÔÚÏß״̬±í SET ÔÚÏßʱ³¤ = TIMESTAMPDIFF(SECOND, »á»°¿ªÊ¼Ê±¼ä, NOW()) WHERE Óû§ID = ?";
- var pstmt = conn.prepareStatement(durationSql);
- pstmt.setString(1, userId);
- pstmt.executeUpdate();
- pstmt.close();
-
- // ÉèÖÃΪÀëÏß״̬
- var sql = "UPDATE Óû§ÔÚÏß״̬±í SET ÔÚÏß״̬ = 0 WHERE Óû§ID = ?";
- pstmt = conn.prepareStatement(sql);
- pstmt.setString(1, userId);
- pstmt.executeUpdate();
- pstmt.close();
-
- logUserActivity(userId, "Óû§µÇ³ö", "Óû§µÇ³öϵͳ");
- print.log("✅ Óû§ " + userId + " µÇ³ö³É¹¦");
- return true;
- } catch (e) {
- print.log("❌ Óû§µÇ³öʧ°Ü: " + e.message);
- return false;
- }
- }
- /**
- * ÐÄÌøÈÎÎñÖ´Ðк¯Êý
- */
- function executeHeartbeatTask() {
- print.log("\n⏰ Ö´ÐÐÓû§ÐÄÌøÈÎÎñ - " + new Date());
-
- try {
- // ¼ì²éÊý¾Ý¿âÁ¬½Ó
- if (!conn || conn.isClosed()) {
- print.log("⚠️ Êý¾Ý¿âÁ¬½ÓÒѶϿª£¬³¢ÊÔÖØÐÂÁ¬½Ó...");
- if (!connectDatabase()) {
- print.log("❌ ÎÞ·¨ÖØÐÂÁ¬½ÓÊý¾Ý¿â£¬Ìø¹ý±¾´ÎÐÄÌøÈÎÎñ");
- return;
- }
- }
-
- // Èç¹ûÓе±Ç°Óû§£¬·¢ËÍÐÄÌø°ü
- if (currentUser) {
- sendUserHeartbeat(currentUser.id);
- }
-
- // ¼ì²éËùÓÐÓû§×´Ì¬
- checkUserStatus();
-
- print.log("✅ Óû§ÐÄÌøÈÎÎñÖ´ÐÐÍê³É\n");
- } catch (e) {
- print.log("❌ Óû§ÐÄÌøÈÎÎñÖ´ÐÐʧ°Ü: " + e.message);
- }
- }
- /**
- * Æô¶¯ÐÄÌø·þÎñ
- */
- function startHeartbeatService(intervalSeconds) {
- if (isRunning) {
- print.log("⚠️ ÐÄÌø·þÎñÒѾÔÚÔËÐÐÖÐ");
- return false;
- }
-
- // Á¬½ÓÊý¾Ý¿â
- if (!connectDatabase()) {
- print.log("❌ ÎÞ·¨Æô¶¯ÐÄÌø·þÎñ£ºÊý¾Ý¿âÁ¬½Óʧ°Ü");
- return false;
- }
-
- // ³õʼ»¯Êý¾Ý¿â
- if (!initializeDatabase()) {
- print.log("❌ ÎÞ·¨Æô¶¯ÐÄÌø·þÎñ£ºÊý¾Ý¿â³õʼ»¯Ê§°Ü");
- return false;
- }
-
- isRunning = true;
- print.log("✅ ÐÄÌø·þÎñÆô¶¯³É¹¦£¬¼ä¸ô: " + intervalSeconds + "Ãë");
-
- // Á¢¼´Ö´ÐÐÒ»´Î
- executeHeartbeatTask();
-
- // ÉèÖö¨Ê±ÈÎÎñ
- heartbeatInterval = setInterval(function() {
- executeHeartbeatTask();
- }, intervalSeconds * 1000);
-
- return true;
- }
- /**
- * Í£Ö¹ÐÄÌø·þÎñ
- */
- function stopHeartbeatService() {
- if (!isRunning) {
- print.log("⚠️ ÐÄÌø·þÎñδÔÚÔËÐÐ");
- return false;
- }
-
- if (heartbeatInterval) {
- clearInterval(heartbeatInterval);
- heartbeatInterval = null;
- }
-
- isRunning = false;
- print.log("✅ ÐÄÌø·þÎñÒÑÍ£Ö¹");
- return true;
- }
- /**
- * ¹Ø±ÕÊý¾Ý¿âÁ¬½Ó
- */
- function closeConnection() {
- try {
- if (conn != null) {
- conn.close();
- }
- print.log("✅ Êý¾Ý¿âÁ¬½ÓÒѹرÕ");
- } catch (e) {
- print.log("❌ ¹Ø±ÕÁ¬½Óʱ³ö´í: " + e.message);
- }
- }
- /**
- * ³ÌÐòÍ˳ö´¦Àí
- */
- function exitHandler() {
- print.log("ÕýÔڹرÕÐÄÌø·þÎñ...");
- // Èç¹ûÓÐÓû§µÇ¼£¬Ö´Ðеdzö²Ù×÷
- if (currentUser) {
- userLogout(currentUser.id);
- }
- stopHeartbeatService();
- closeConnection();
- print.log("👋 Óû§ÔÚÏß״̬¹ÜÀíÐÄÌø³ÌÐòÒÑÍ˳ö");
- }
- // Ö÷³ÌÐò
- try {
- print.log("🚀 Æô¶¯Óû§ÔÚÏß״̬¹ÜÀíÐÄÌø³ÌÐò");
-
- // ×¢²áÍ˳ö´¦Àíº¯Êý
- java.lang.Runtime.getRuntime().addShutdownHook(new java.lang.Thread({
- run: function() {
- exitHandler();
- }
- }));
-
- // Æô¶¯ÐÄÌø·þÎñ (ÿ30ÃëÖ´ÐÐÒ»´Î)
- if (startHeartbeatService(30)) {
- print.log("✅ Óû§ÔÚÏß״̬¹ÜÀíÐÄÌø³ÌÐòÒÑÆô¶¯");
- print.log("💡 °´ Ctrl+C Í£Ö¹³ÌÐò");
-
- // Ä£ÄâÓû§µÇ¼
- print.log("📝 Ä£ÄâÓû§µÇ¼...");
- userLogin("USER_001", "ÕÅÈý");
-
- // ±£³Ö³ÌÐòÔËÐÐ
- while (isRunning) {
- java.lang.Thread.sleep(1000);
- }
- } else {
- print.log("❌ Óû§ÔÚÏß״̬¹ÜÀíÐÄÌø³ÌÐòÆô¶¯Ê§°Ü");
- }
-
- } catch (e) {
- print.log("❌ ³ÌÐòÖ´Ðйý³ÌÖз¢Éú´íÎó: " + e.message);
- exitHandler();
- }
- print.log("===== Óû§ÔÚÏß״̬¹ÜÀíÐÄÌø³ÌÐò½áÊø =====");
¸´ÖÆ´úÂë
|
|