同一Firebase项目下开发两款Android应用的可行性与最优方案咨询
客户端-管理端审批系统实现方案及Firebase项目复用问题解答
一、客户端提交申请、管理端审批/驳回的最优实现方案
如果基于Firebase生态搭建,推荐以下务实的落地方案:
1. Firestore数据结构设计
用applications集合统一存储所有申请数据,单文档字段建议如下:
userId:提交申请的客户端用户ID(关联Firebase Auth的UID)content:申请具体内容(比如JSON格式或字符串)status:申请状态(pending待审批 /approved已通过 /rejected已驳回)createTime:申请提交时间(用serverTimestamp()自动生成)reviewerId:审批人ID(审批完成后填充)reviewTime:审批完成时间(审批完成后填充)reviewNote:审批备注(可选,比如驳回理由)
2. 核心业务逻辑
- 客户端:调用Firestore的
add()方法提交申请,默认将status设为pending,userId设为当前登录用户的UID - 管理端:
- 监听
applications集合中status = 'pending'的文档,实时获取待审批列表 - 审批时调用
update()方法,修改对应文档的status,同时填充reviewerId、reviewTime等字段
- 监听
- 后端兜底(可选):用Firebase Cloud Functions触发自动化逻辑,比如申请提交后给管理员发通知,审批完成后给申请人发结果通知
3. 权限控制(Firebase Security Rules)
必须通过规则严格隔离客户端和管理端的操作权限,示例规则如下:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /applications/{docId} { // 客户端用户:仅能创建自己的申请,仅能读取自己的所有申请 allow create: if request.auth != null && request.resource.data.userId == request.auth.uid; allow read: if request.auth != null && resource.data.userId == request.auth.uid; // 管理端用户:需通过自定义Claims标记为管理员,仅能读取待审批申请,仅能更新审批相关字段 allow read: if request.auth != null && request.auth.token.isAdmin == true && resource.data.status == 'pending'; allow update: if request.auth != null && request.auth.token.isAdmin == true && request.resource.data.keys().hasOnly(['status', 'reviewerId', 'reviewTime', 'reviewNote']); } } }
管理端用户的isAdmin标记可以通过Firebase Admin SDK在后台设置,示例代码:
// Node.js示例 admin.auth().setCustomUserClaims(adminUid, { isAdmin: true });
4. 实时通知(FCM)
用Firebase Cloud Messaging实现双向通知:
- 客户端提交申请后,Cloud Functions触发FCM推送,通知管理端有新申请待处理
- 管理端完成审批后,同样通过Cloud Functions触发FCM,通知对应客户端用户审批结果
二、同一Firebase项目下创建两款应用的问题
完全可以在同一个Firebase项目下创建客户端和管理端应用,不存在核心问题,反而有不少优势:
- 共享同一套用户系统:用Firebase Auth统一管理两类用户,通过自定义Claims快速区分角色
- 共享数据资源:无需跨项目同步申请数据,管理端直接操作同一份Firestore数据
- 统一运维:在同一个Firebase控制台监控两款应用的流量、错误日志、资源使用情况
需要注意几个细节:
- 应用标识区分:添加应用时,分别设置不同的包名(Android)或Bundle ID(iOS/Flutter),获取各自的配置文件(
google-services.json或GoogleService-Info.plist) - 权限严格隔离:必须通过Security Rules和自定义Claims确保客户端用户无法访问管理端的操作权限,反之亦然
- 资源配额共享:同一项目下的所有应用共享Firebase的资源配额(比如Firestore读写次数、FCM推送额度),如果两款应用流量都很大,需要提前关注配额是否满足需求
内容的提问来源于stack exchange,提问作者Rokey Z
相关产品推荐
相关产品推荐

