基于 Firebase 的定制化电子商务系统

我从零开始构建了一个定制化的电子商务网站。我没有使用现成的平台,而是使用了 Firebase Realtime Database 和 Netlify。

目标是为一家 POS 终端转售商提供服务。他们需要产品目录、价格变体和管理面板。销售团队需要直接从网站下单。

以下是我的构建过程以及我学到的经验。

技术栈

• 原生 HTML、CSS 和 JS。 • 使用 Firebase Realtime Database 存储数据。 • 使用 Firebase Storage 存储文件。 • 使用 Netlify 进行托管和函数处理。

关键决策

  1. 数据库分离 我将电子商务数据库与内部管理数据库分开。这可以防止商业数据与薪资或预算等敏感的管理数据混淆。

  2. 全局价格存档 我没有将价格方案放入每个产品中,而是创建了一个全局资费文件夹。产品仅包含一个 ID 数组。这避免了数据冗余。如果方案发生变化,我只需更新一次。

  3. 原子化订单 当多人同时下单时,会面临竞态条件(race conditions)。如果两个人读取了同一个订单号,一个订单可能会消失。我使用了 Firebase 的 runTransaction() 来确保每个订单都能获得一个唯一的、连续的编号。

  4. 安全的管理访问 我没有在源代码中存储密码。我通过 Web Crypto API 使用了 PBKDF2。这使得暴力破解攻击变得非常困难。代码中仅包含盐值(salt)和哈希值(hash)。

经验教训

• 注意虚值(falsy values)。在 JavaScript 中,0 是虚值。如果产品价格为 0,像 "price || null" 这样的简单检查会删除该价格。请始终使用 "price != null" 以包含零。

• 在 HTTP 标头中配置 CSP。用于内容安全策略(Content Security Policy)的 Meta 标签不支持子域名的通配符。Firebase 使用动态子域名。我将 CSP 移到了 netlify.toml 中以使其生效。

• 使用安全规则(Security Rules)进行真正的保护。永远不要依赖在 UI 中隐藏按钮。使用 Firebase 规则来限制谁可以读取和写入数据。

构建定制化解决方案需要谨慎的架构选择。事务处理和标头配置等细节可以防止生产环境中的重大故障。

来源:https://dev.to/androve2k/custom-e-commerce-on-firebase-catalog-atomic-orders-and-admin-panel-42ec