我正在使用Flutter和Firebase Firestore创建一个活动预订应用程序。有时,如果活动很受欢迎,用户可能会因为有人跑得更快而买票却没有座位,因此我想在购买前创建一个5分钟的预订,如果用户在该时间范围内没有购买,机票预订将自动删除。有人能给我一个如何做的建议吗?
在不了解数据结构和业务需求的情况下很难给出答案,因此这里有一种方法可以做到这一点,几乎不需要假设:
- 假设每个座位都有一个文档,我们称之为
SeatDocument
SeatDocument
有一个名为status的字段,可以设置为available
、blocked
或sold
- 每当用户在会话中购买机票时,其他人都不能为该座位购买相同的机票
在这种情况下,每当用户进入会话预订机票时,您都应该使用交易:
- 检索
SeatDocument
- 确保其状态为
available
- 将其标记为CCD_ 8
在此处使用事务可以防止两个用户进入同一票证的会话,并允许您在确保拥有正确数据的同时执行多个操作。
如果用户最终购买了机票,您可以将其标记为sold
。如果五分钟过去了,您可以从客户端结束用户会话,并将票证标记为available
。
您必须根据业务需求来确定流程,但这只是一个如何实现的粗略想法。
如果您不熟悉交易,这里有一个有用的参考资料和一段视频来解释它:https://firebase.google.com/docs/firestore/manage-data/transactions
=====根据注释更新===
您可以创建一个云函数,该函数在票证状态发生更改时触发。在触发器函数中,您将获得SeatDocument
,在那里您可以检查状态是否更改为blocked
。如果是,那么您可以创建一个将在5分钟后运行的Scheduled function
,并检查状态是否已更改为sold
。如果没有,则可以将票证状态更新回available
。
简而言之,您可以从Cloud Functions中使用Triggers
和Schedule Functions
做很多事情。您还可以查看callableFunctions
,可以使用它从云功能的服务器端启动会话和销售票证。
- 调度函数
- 触发器
- 可调用函数
老实说,在这种情况下,我怀疑云函数是否会削减它。理想情况下,您将在后端服务器上处理这些事情(例如在Google Cloud Run中)。设备上的应用程序仅作为客户端,后端处理票证逻辑、与Firestore通信等等。这比基于5分钟唤醒或任何事情做出假设更安全。
假设你的用户启动了应用程序,应用程序可以在后端初始化,这将提取特定用户的数据(也可以存储只有后端服务器才能访问的预订机票、一些历史记录等的所有数据)。
此外,如果你计划在你的应用程序中进行销售,那么通过谷歌API检查购买情况的后端几乎是必须的。
关于一般逻辑:
- 应用程序(客户端)向后端发送用户想要购买机票的请求
- 后端检查剩余的票证数量
- 后端从总计数中移除一个票据;文书工作";(处理细节、付款等)完成
- 如果一切正常-用户得到确认,后端将对数据库进行必要的工作(Firestore)
如果出现问题-例如,付款没有通过(经常发生)-用户会收到一条消息,后端会将票证添加回池中。
您想要什么类型的数据结构取决于您自己。也许你会把票卖给那些没有"门票"的地方;座位";,也许你卖的是带数字的歌剧票,那么你可能需要一种方法让用户看到座位的位置,这意味着你需要在剧院选座位时向他们展示他们展示的东西。。谁知道呢?我只是讲一些基本的事情。这样的应用程序可能非常复杂。
还有一件事:如果用户失去连接或发生任何其他会阻止正确购买票证的事件,会发生什么:这取决于您为后端服务器选择的语言,但一般来说,您需要(在服务器代码中)实现一个合理的超时,使操作结束,然后将票证返回到池中。
例如,在我用Firsetore和Python后端制作的一个真实应用程序中,我有一个机制来检查用户是否在过去24小时内登录——这是其他一些事情所需要的。我将上次登录时间存储在Firestore的用户文档中(通过firestore.SERVER_TIMESTAMP
),并通过将其与当前时间(在后端)进行比较来检查时间间隔。当然,我确保没有时区问题等,因此Firestore时间与我的后端相匹配。这样做是为了避免任何类型的客户端数据操作,你知道,有些用户喜欢尝试。。