自动发帖软件
标题:
数据库MySQL用户在线状态管理心跳程序
[打印本页]
作者:
发帖软件
时间:
4 小时前
标题:
数据库MySQL用户在线状态管理心跳程序
数据库MySQL用户在线状态管理心跳程序
3.png
(684.91 KB, 下载次数: 0)
4 小时前
上传
4.png
(875.02 KB, 下载次数: 0)
4 小时前
上传
// 用户在线状态管理心跳程序
// 用于跟踪和管理用户在线状态的示例程序
//🍎交流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("正在关闭心跳服务...");
// 如果有用户登录,执行登出操作
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("===== 用户在线状态管理心跳程序结束 =====");
复制代码
欢迎光临 自动发帖软件 (http://www.fatiegongju.com/)
Powered by Discuz! X3.2