打造 Eskinita:为一家我真心喜爱的亚洲外卖店开发全栈网站
← Back to Home

Essay

打造 Eskinita:为一家我真心喜爱的亚洲外卖店开发全栈网站

我如何用 React 打造 Eskinita 外卖网站——菜单、Uber Eats 与 Hungry Panda 点餐、Tyro 支付,以及幕后的定制 CMS、员工排班、优惠券、促销和轻量会计系统。

先聊聊食物

在谈技术之前先说一句:Eskinita 是真的好吃。这是一家亚洲外卖店,菜单简短有力,口味浓郁,团队显然很享受自己的工作。每次我过去做开发评审,厨房总是忙得热火朝天,前厅员工热情友好,临走前总有人悄悄往我手里塞一盒美味的东西。正是这种待客之道,让我接下了这个项目。

我受母公司董事委托,设计并开发新网站,但UX 设计师的支持有限——这意味着大部分日常决策都得我一人身兼两职,只有在真正需要第二双眼睛的时候才请设计师帮忙。

网站表面上需要做到什么

从顾客的角度来看,需求很简单。网站需要:

  • 展示完整的菜单,让人在周五晚上 6 点、需要二十秒内做出决定时,能在手机上快速浏览。
  • 让顾客通过 Uber Eats 和 Hungry Panda 下单外送,且不打断使用流程。
  • 通过 Tyro 直接在网站上收取银行卡付款,让自取和预付订单完全不必经过第三方平台。
  • 让人一眼看出当前有哪些优惠,又不会把首页变成优惠券丛林。
  • 要有 Eskinita 的感觉——那份温暖、那些食物、菜单上的小幽默——而不是一个千篇一律的模板餐厅网站。

顾客端看到的一切都基于 React 构建,以移动端优先进行优化,并刻意保持克制:高对比度的产品摄影、紧凑的排版,顾客和下单按钮之间没有任何多余的动画。

底层实际运行的是什么

这个项目真正有意思的部分从来不是营销页面,而是后台。Eskinita 是一家真实、小而忙碌的企业,我不希望老板每周都要在六个 SaaS 工具之间来回切换。因此,同一个 React 应用还支撑着一个完整的运营控制台,由以下模块组合而成:

定制内容管理系统

一个专为这家店量身打造的 CMS,而不是改造过的 WordPress 插件。员工可以:

  • 在任何设备上编辑菜单——菜品、价格、过敏原、照片、供应状态。
  • 无需重新部署,即可将修改即时推送到线上网站。
  • 在同一个地方管理首页各版块、“关于我们”故事以及法律条款页面。

这个 CMS 刻意做得很小。它只做 Eskinita 需要的事,别无其他。

员工排班系统

一个内置于同一管理后台的轻量排班模块:

  • 经理发布每周排班。
  • 员工在手机上查看即将到来的班次,并确认或申请换班。
  • 系统记录每个人的工作时间,这些数据直接汇入会计模块。

支付系统(网站使用 Tyro,外送使用 Uber Eats 和 Hungry Panda)

三条集成流程,一个简洁的结账体验:

  • 直接自取 / 预付订单:在网站上通过 Tyro 支付。
  • 外送:通过 Uber Eats 和 Hungry Panda 完成,从同一份菜单深度链接跳转。
  • 每一笔完成的交易——无论是 Tyro、Uber Eats 还是 Hungry Panda——都会被统一整合进一个订单流,经理可以实时查看。

优惠券系统

把折扣做得规范:

  • 一次性、可多次使用以及限时的优惠码。
  • 百分比折扣、金额立减或赠送菜品的促销。
  • 可选规则:最低消费、指定菜品以及渠道(堂食、自取或外送)。
  • 每次核销都有记录,账上不会有任何东西“凭空消失”。

基础会计系统

不是完整的总账——只是足以让老板心里有数、让会计满意:

  • 每日销售额,按渠道和支付方式拆分。
  • 退款、作废以及优惠券影响单独列出。
  • 月末可为外部记账员简单导出数据。

美食促销系统

这是营销思维最喜欢的部分:

  • 提前安排促销(“辣椒馄饨,半价,周三下午 5 点到晚上 9 点”),到时会自动出现在网站上。
  • 促销可以置顶在首页、穿插在菜单中,或仅向回头客展示。
  • 每个促销都有到期时间——不会有被遗忘的横幅三个月后还挂在网站上。

所有这些都在同一个管理员登录之后,与顾客网站共用同一套 React 代码库。

与有限的 UX 设计资源合作

说点实在的。在这个项目中,我身边并没有一位全职 UX 设计师。我能用到 UX 设计师的时间有限,这意味着我必须严格把握何时动用这份资源。

行之有效的模式是:

  1. 由我来设计枯燥的 80%。 凡是有成熟模式的部分——菜单网格、结账、后台表格、表单布局——我都直接开发,借鉴我信得过的餐厅网站的结构和节奏。
  2. UX 时间留给真正重要的 20%。 顾客点击“下单”的那一刻、经理撰写促销的那一刻、员工在闷热厨房里用小屏手机查看下一个班次的那一刻。这些环节都得到了认真的关注、草图和反复迭代。
  3. 老板是最终裁决者。 出现分歧时,由真正经营这家店的人拍板,而不是我。这省去了很多争论,也带来了更好的决策。

最终的网站看起来不像是一个人独自设计的,因为需要精心打磨的部分得到了应有的帮助,而只需好用的部分也没有浪费任何人的时间。

为什么选择 React,以及如何保持清晰

整个项目——顾客网站和管理控制台——都选用 React,在关键方面让项目保持简单:

  • 一套代码库。 一套组件、一条构建流水线、一次部署。
  • 共享基础组件。 菜单页和排班编辑器里用的是同一个按钮、同一个弹窗、同一个表单字段。一致性无需额外成本。
  • 快速迭代。 当 Eskinita 想要新的促销类型或调整结账流程时,只需在我早已熟悉的地方做个小改动,而不必在三家供应商之间来回寻找。

这次开发的收获

有三点值得记下来:

  • 小企业不需要企业级软件。 它们需要的是几个集成良好的模块,彼此互通,也能与经营店铺的人顺畅沟通。
  • 外卖平台是合作伙伴,而不是业务的全部。 Uber Eats 和 Hungry Panda 带来覆盖面;直接的 Tyro 结账则让利润率保持合理。好的网站会两者兼用,且不刻意隐藏任何一方。
  • 最好的需求来自团队。 厨房员工、前厅员工和董事都发现了我自己注意不到的问题。贴近软件的真实使用者进行开发,并不是锦上添花,而是必不可少。

如果你饿了,又刚好在 Eskinita 附近——去吧。点些辣的。如果你以开发小企业软件为生,不妨在网站上逛逛;底层发生的事情远比菜单所呈现的要多得多。