先聊聊食物
在谈技术之前先说一句: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 设计师的时间有限,这意味着我必须严格把握何时动用这份资源。
行之有效的模式是:
- 由我来设计枯燥的 80%。 凡是有成熟模式的部分——菜单网格、结账、后台表格、表单布局——我都直接开发,借鉴我信得过的餐厅网站的结构和节奏。
- UX 时间留给真正重要的 20%。 顾客点击“下单”的那一刻、经理撰写促销的那一刻、员工在闷热厨房里用小屏手机查看下一个班次的那一刻。这些环节都得到了认真的关注、草图和反复迭代。
- 老板是最终裁决者。 出现分歧时,由真正经营这家店的人拍板,而不是我。这省去了很多争论,也带来了更好的决策。
最终的网站看起来不像是一个人独自设计的,因为需要精心打磨的部分得到了应有的帮助,而只需好用的部分也没有浪费任何人的时间。
为什么选择 React,以及如何保持清晰
整个项目——顾客网站和管理控制台——都选用 React,在关键方面让项目保持简单:
- 一套代码库。 一套组件、一条构建流水线、一次部署。
- 共享基础组件。 菜单页和排班编辑器里用的是同一个按钮、同一个弹窗、同一个表单字段。一致性无需额外成本。
- 快速迭代。 当 Eskinita 想要新的促销类型或调整结账流程时,只需在我早已熟悉的地方做个小改动,而不必在三家供应商之间来回寻找。
这次开发的收获
有三点值得记下来:
- 小企业不需要企业级软件。 它们需要的是几个集成良好的模块,彼此互通,也能与经营店铺的人顺畅沟通。
- 外卖平台是合作伙伴,而不是业务的全部。 Uber Eats 和 Hungry Panda 带来覆盖面;直接的 Tyro 结账则让利润率保持合理。好的网站会两者兼用,且不刻意隐藏任何一方。
- 最好的需求来自团队。 厨房员工、前厅员工和董事都发现了我自己注意不到的问题。贴近软件的真实使用者进行开发,并不是锦上添花,而是必不可少。
如果你饿了,又刚好在 Eskinita 附近——去吧。点些辣的。如果你以开发小企业软件为生,不妨在网站上逛逛;底层发生的事情远比菜单所呈现的要多得多。
XIA LEI