You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Firebase构建聊天框的前端实现代码(中文注释版)

嗨,这是已经完成中文本地化的Firebase Auth + Realtime Database聊天框前端实现代码,所有英文提示、注释都换成了中文,核心技术逻辑完全保留:

Firebase Auth + Realtime Database 聊天框实现(中文本地化版)

核心功能清单

  • 支持邮箱密码登录/注册、谷歌第三方登录
  • 强制要求邮箱验证,新用户需管理员审核通过才能进入聊天
  • 内置3秒防垃圾消息冷却机制
  • 管理员专属:用户列表加载功能
  • 实时消息同步、在线用户状态监听
  • 预留收音机播放控制元素(未实现完整逻辑)

完整代码实现

// DOM元素获取
const authBox = document.getElementById("auth-box");
const chatWrapper = document.getElementById("chat-wrapper");
const userEmailSpan = document.getElementById("user-email");
const userRoleSpan = document.getElementById("user-role");
const adminBox = document.getElementById("adminbox");
const userList = document.getElementById("user-list");
const messagesDiv = document.getElementById("messages");
const msgInput = document.getElementById("msg-input");
const sendBtn = document.getElementById("send-btn");
const loginBtn = document.getElementById("login-btn");
const registerBtn = document.getElementById("register-btn");
const googleBtn = document.getElementById("google-btn");
const forgotBtn = document.getElementById("forgot-btn");
const authError = document.getElementById("auth-error");
const playRadioBtn = document.getElementById("play-radio");
const radioPlayer = document.getElementById("radio-player");

// 防垃圾消息机制
let lastMessageTime = 0;
const MESSAGE_COOLDOWN_MS = 3000; // 3秒冷却时间

// -------------------------------
// 认证状态监听器
// -------------------------------
auth.onAuthStateChanged(async (user) => {
  if (!user) {
    showAuth();
    return;
  }
  // 要求邮箱已验证
  if (!user.emailVerified) {
    auth.signOut();
    alert("登录前请先验证您的邮箱。");
    return;
  }
  // 加载用户角色与审核状态
  const userRef = db.ref("users/" + user.uid);
  const snapshot = await userRef.once("value");
  const data = snapshot.val() || {};
  const role = data.role || "pending"; // 默认待审核
  const approved = data.approved || false;

  userEmailSpan.textContent = user.email;
  userRoleSpan.textContent = role;

  if (!approved) {
    auth.signOut();
    alert("您的账户正在等待审核,请等待管理员批准。");
    return;
  }

  if (role === "admin") {
    adminBox.classList.remove("hidden");
    loadUsersForAdmin();
  } else {
    adminBox.classList.add("hidden");
  }

  showChat();
  listenMessages();
  setupOnlineUsers(user);
});

// -------------------------------
// 界面显示控制
// -------------------------------
function showAuth() {
  authBox.classList.remove("hidden");
  chatWrapper.classList.add("hidden");
}
function showChat() {
  authBox.classList.add("hidden");
  chatWrapper.classList.remove("hidden");
}

// -------------------------------
// 登录/注册/谷歌登录功能
// -------------------------------
loginBtn.addEventListener("click", async () => {
  const email = document.getElementById("email").value;
  const pass = document.getElementById("password").value;
  try {
    await auth.signInWithEmailAndPassword(email, pass);
  } catch (err) {
    authError.textContent = err.message;
  }
});

registerBtn.addEventListener("click", async () => {
  const email = document.getElementById("email").value;
  const pass = document.getElementById("password").value;
  try {
    const cred = await auth.createUserWithEmailAndPassword(email, pass);
    await cred.user.sendEmailVerification();
    // 保存用户信息
    await db.ref("users/" + cred.user.uid).set({
      email: email,
      role: "pending",
      approved: false
    });
    alert("验证邮件已发送,请查收您的收件箱。");
    auth.signOut();
  } catch (err) {
    authError.textContent = err.message;
  }
});

googleBtn.addEventListener("click", async () => {
  const provider = new firebase.auth.GoogleAuthProvider();
  try {
    const cred = await auth.signInWithPopup(provider);
    // 若为新用户则创建待审核记录
    const userRef = db.ref("users/" + cred.user.uid);
    const snapshot = await userRef.once("value");
    if (!snapshot.exists()) {
      await userRef.set({
        email: cred.user.email,
        role: "pending",
        approved: false
      });
    }
  } catch (err) {
    authError.textContent = err.message;
  }
});

forgotBtn.addEventListener("click", async () => {
  const email = document.getElementById("email").value;
  if (!email) return alert("请先输入您的邮箱。");
  try {
    await auth.sendPasswordResetEmail(email);
    alert("密码重置邮件已发送。");
  } catch (err) {
    authError.textContent = err.message;
  }
});

// -------------------------------
// 发送消息功能
// -------------------------------
sendBtn.addEventListener("click", sendMessage);
function sendMessage() {
  const user = auth.currentUser;
  if (!user) return;

  const now = Date.now();
  if (now - lastMessageTime < MESSAGE_COOLDOWN_MS) {
    alert("请慢一点,禁止发送垃圾消息!");
    return;
  }

  const text = msgInput.value.trim();
  if (!text) return;

  lastMessageTime = now;
  db.ref("messages").push({
    uid: user.uid,
    email: user.email,
    text: text,
    timestamp: now
  });
  msgInput.value = "";
}

// -------------------------------
// 监听消息更新
// -------------------------------
function listenMessages() {
  db.ref("messages").off();
  db.ref("messages").on("value", (snap) => {
    const msgs = snap.val() || {};
    messagesDiv.innerHTML = "";
    Object.keys(msgs).forEach(key => {
      const m = msgs[key];
      const row = document.createElement("div");
      row.className = "msg-row";
      row.innerHTML = `
        <b>${m.email}</b>: ${m.text}
        <span class="time">${new Date(m.timestamp).toLocaleTimeString()}</span>
      `;
      // 管理员删除功能(代码片段未完成)
      const role = userRoleSpan.textContent;
      if (role === "admin") {
        const del = document.create
      }
    });
  });
}

补充说明

代码中管理员删除消息的功能片段未完成,你可以补充以下逻辑完善:

// 补充管理员删除按钮示例代码
const delBtn = document.createElement("button");
delBtn.textContent = "删除";
delBtn.className = "delete-btn";
delBtn.addEventListener("click", async () => {
  await db.ref(`messages/${key}`).remove();
});
row.appendChild(delBtn);

内容的提问来源于stack exchange,提问作者Wildstyle-Radio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 06:42:37