首页 > web前端 > js教程 > 正文

我是如何构建 PeerSplit:一款免费的点对点费用分摊应用程序 — 从创意到发布仅需数周时间

DDD
发布: 2024-10-22 16:44:59
原创
270 人浏览过

我构建了 PeerSplit——一个免费的、点对点的 Splitwise 替代品——从想法到发布,仅用了两周时间!

PeerSplit 是一款本地优先的应用程序,用于分配团体费用。它可以离线工作,100% 免费且私密,不需要注册或任何个人数据。

以下是我如何构建它以及我在此过程中学到的一切。

为何选择 PeerSplit?

多年来我一直依靠 Splitwise 来管理与朋友和室友的开支。但由于最近的每日交易限制和侵入性广告,它的使用变得令人沮丧。

我想要一个免费的、隐私优先的替代方案,不需要服务器来存储或同步数据。我不会信任第三方服务器来支付我的费用。

在完成了点对点、本地优先的项目(例如锻炼追踪器和无干扰写作应用程序)后,我意识到我可以应用相同的方法来分配费用。

PeerSplit 就这样诞生了。我开始设计应用程序。


使用 Nuxt 构建 UI Nuxt UI

我不擅长设计 UI。

几个月前,我不会想到我可以构建一个像 PeerSplit 一样精美的 UI(有些人甚至说它比 Splitwise 具有更好的用户体验)。

那么,我是如何做到的呢? Nuxt UI。

Nuxt UI 非常华丽,并且具有令人惊叹的开发者体验 (DX)。

它还附带其他有用的 Nuxt 模块,如 @nuxt/icon、@nuxtjs/tailwindcss 和 @nuxtjs/colormode。

我所要做的就是选择一种主色,并且我拥有了将 PeerSplit 的 UI 整合在一起所需的所有组件(图标、深色模式和其他所有内容)。


cr-sqlite 用于本地同步?

对于本地数据存储和同步,我选择了 cr-sqlite,它基于 wa-sqlite 构建并使用 CRDT(无冲突复制数据类型)。

CRDT 非常适合点对点系统,因为它们会自动处理冲突,因此用户可以离线工作,并且当他们重新连接时,更改会无缝合并。

但是,cr-sqlite 本身不会通过网络同步更改。它仅提供用于导出和合并更改的 API。您需要在设备之间手动发送这些更改。


Gun.js 用于点对点同步?

为了处理安全的点对点同步,我使用了 Gun.js,它提供了点对点分布式图形数据库。

Gun 的gun.user API 让我可以为每个组创建加密节点。群组的所有更改都存储在该节点上,并且仅与群组成员同步,从而保持所有内容的私密性。

当用户执行操作时,我将从 cr-sqlite 导出的更改并将它们推送到节点。当用户重新上线时,Gun 会同步新的更改,让每个人都了解最新情况。

以高性能的方式实现这一点很棘手。欲了解更多详情,您可以在这里查看源代码。


简化债务?

Splitwise(现在是 PeerSplit)的一个很酷的功能是“简化债务”。

具体原理是这样的:如果A欠B,B欠C,A可以直接向C付款,以减少还款次数。

在PeerSplit中,我首先计算每个人的净余额。然后我对这些余额进行排序,并建议一项一项付款,每次至少使一个人的余额为零。

这种排序可确保每个人在其设备上看到相同的还款。

这不是 100% 最优(某些群体可能仍然有最多 n-1 笔付款),但在大多数情况下效果很好。

最佳解决方案的计算量是指数级的,并且只能节省少量费用。所以这是简单性和速度的最佳权衡!

export const groupGetPayments = (group) => {
  const payments = [];
  const balances = Object.entries(groupGetBalances(group)).map(([a, b]) => [
    b,
    a,
  ]);
  balances.sort();
  let i = 0,
    j = balances.length - 1;
  while (i < j) {
    if (balances[i][0] === 0) {
      i++;
    } else if (balances[j][0] === 0) {
      j--;
    } else if (-balances[i][0] > balances[j][0]) {
      payments.push({
        from: balances[i][1],
        to: balances[j][1],
        value: round(balances[j][0]),
      });
      balances[i][0] += balances[j][0];
      balances[j][0] = 0;
    } else {
      payments.push({
        from: balances[i][1],
        to: balances[j][1],
        value: round(-balances[i][0]),
      });
      balances[j][0] += balances[i][0];
      balances[i][0] = 0;
    }
  }
  return payments;
};
登录后复制

渐进式网页应用

我希望 PeerSplit 能够作为离线应用程序运行,但我不想经历构建多个本机应用程序或处理在应用程序商店上发布它们的漫长过程的麻烦。因此,选择渐进式 Web 应用程序 (PWA) 是明智的选择。

PWA 结合了网络和移动应用程序的优点,允许用户将其安装在自己的设备上,同时仍然享受离线功能。

为了将我的 Nuxt 应用程序转换为 PWA,我使用了 vite-pwa。
我在 Figma 中设计了一个 SVG 徽标,并使用它通过 vite-pwa 的资产生成器生成所有必需的 PWA 资产。

之后,我配置了 PWA 清单,vite-pwa 会自动为我设置 Service Worker。

我将 Nuxt 配置为预渲染所有路线,以便我的应用程序可以完全离线运行。


这就结束了。感谢您的阅读!

产品搜索发布

PeerSplit 刚刚在 Product Hunt 上推出!这是我的第一次发布,希望得到您的支持和反馈。

查看 Product Hunt 上的 PeerSplit

PeerSplit 是公平来源的,因此请随时在 GitHub 上贡献或提交功能请求。

How I built PeerSplit: A free, peer-to-peer expense-splitting app—from idea to launch in just eeks 塔奈维克 / 同行分裂

PeerSplit 是一款免费、本地优先的点对点应用程序,可帮助您轻松、私密地分配和跟踪团体费用。

对等分裂

PeerSplit 是一款免费、本地优先的点对点应用程序,可帮助您轻松、私密地分配和跟踪团体费用。

特点

  • 100% 免费 — 无需注册
  • 本地优先 — 完全离线工作
  • 跨平台 PWA — 在移动设备、台式机或笔记本电脑上使用它
  • 点对点 — 与朋友协作,同时保持数据私密性
  • 简单的用户体验 — 流畅且简约的界面,不会妨碍您
  • 深色和浅色模式 — 在主题之间切换以符合您的喜好
  • 导入/导出 — 从 Splitwise 导入并将数据导出到 CSV

计划的功能

  • 高级账单拆分 — 将明细账单添加为单一费用。
  • 账单扫描 — 通过拍照自动扫描和拆分账单。
  • 多币种支持 — 通过实时汇率处理不同币种的费用。
  • 交易注释和评论 — 为每笔交易添加注释和评论以保留...


在 GitHub 上查看


以上是我是如何构建 PeerSplit:一款免费的点对点费用分摊应用程序 — 从创意到发布仅需数周时间的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!