You need to enable JavaScript to run this app. 如何使用ReactJS和Firebase创建医生、患者、药师三类不同角色的用户
优惠活动
大模型
产品
解决方案
定价
更多

如何使用ReactJS和Firebase创建医生、患者、药师三类不同角色的用户

多角色注册功能调整方案

第一步:新增角色选择入口

在注册表单中添加角色选择组件,例如下拉选择框,可选值对应三类角色:doctor(医生)、patient(患者)、pharmacist(药师),获取用户选择的角色值,假设存储在role.value变量中。

第二步:按角色配置对应集合与字段

提前定义不同角色对应的集合名和需要存储的专属字段,避免硬编码逻辑:

  • 医生角色对应集合doctor,保留现有字段即可
  • 患者角色对应集合patient,按需删除医生专属字段(如执业证号regno、执业年限regyear、专长speciality等),补充患者需要的专属字段
  • 药师角色对应集合pharmacist,按需调整专属字段即可

第三步:修改注册逻辑代码

调整后的代码如下,所有硬编码的角色相关逻辑都改为动态读取:

if (pass.value != cpass.value) {
  alert("密码不匹配")
}
else {
  try {
    const userEmail = email.value
    const selectedRole = role.value // 从表单获取的用户选择的角色
    // 动态匹配对应集合
    const roleCollectionMap = {
      "doctor": "doctor",
      "patient": "patient",
      "pharmacist": "pharmacist"
    }
    const ref = db.collection(roleCollectionMap[selectedRole])
    setLoading(true)
    // 先创建Auth用户
    const userCredential = await app
      .auth()
      .createUserWithEmailAndPassword(userEmail, pass.value);
    // 按角色生成对应要存储的公共字段
    let roleUserData = {
      "name": uname.value,
      "dob": dob.value,
      "email": userEmail,
      "phno": phno.value,
      "gender": gender.value,
      "addr": addr.value,
      "pincode": pin.value,
      "city": city.value,
      "state": state.value,
      "bloodtype": bloodtype.value,
    }
    // 补充不同角色的专属字段
    if(selectedRole === "doctor") {
      roleUserData.regno = regno.value
      roleUserData.regyear = regyear.value
      roleUserData.speciality = speciality.value
    } else if(selectedRole === "pharmacist") {
      // 按需补充药师专属字段,例如执业药师证号、所属药房等
      roleUserData.pharmacistRegNo = pharmacistRegNo.value
      roleUserData.pharmacy = pharmacy.value
    }
    // 写入角色专属集合
    await ref.doc(userEmail).set(roleUserData)
    console.log("角色数据写入成功")
    // 写入公共用户表标记角色
    await db.collection("users").doc(userEmail).set({
      "email": userEmail,
      "userType": selectedRole
    })
    // 后续成功跳转逻辑可自行补充
  } catch (err) {
    console.error("注册失败:", err)
    alert(`注册失败:${err.message}`)
    // 注册失败要删除已经创建的Auth用户,避免产生脏数据
    if(app.auth().currentUser) {
      await app.auth().currentUser.delete()
    }
  } finally {
    setLoading(false)
  }
}

注意事项

  • 不同角色的表单字段可以做联动显示,比如选择医生角色时才显示执业证号输入框,选择患者时隐藏这类专业字段,提升使用体验
  • 后续角色权限校验可以直接读取users集合的userType字段判断,无需查询不同角色的集合
  • 建议配套修改Firebase安全规则,限制不同角色只能修改自己对应集合的内容,避免权限越权

内容的提问来源于stack exchange,提问作者fury

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 03:36:05