怎么用 这是格式与深度的参考,不是让你照抄的模板。数字全部是示例,直接抄进简历一问就穿——必须换成你自己的真实数据,而且要能说清是怎么测出来的。下面每个模块都有「数字是怎么测的」和「面试追问」两段,写不出那两段的模块就不要往简历上写

面试题库(电商 / 短视频 / 社区 / 本地生活 / 旅游 / 企业服务 多业务场景)

实习级这一档是干什么的 骑手轨迹地图、实时运力看板这些核心台面,实习生大概率碰不到。这一档收的是商家后台里实习生真的会被分派、但仍然有明确技术含量的活。下面三个模块彼此独立——只做过一个就只写一个。
怎么讲才不显得 low 「我做了个资质上传表单,选文件上传」和「商家用的是店里的电脑、网络很差,一张原图两三兆上传要半分钟还经常失败;而且他不知道失败了,以为传上去了就点下一步——所以要做前端压缩、要显示单张进度、失败要能单独重传而不是整套重来」——同一件事,后者面试官会顺着追问。这一档的破解办法是想清楚「使用者是谁」:商家不是专业用户,他填错了不会去查帮助文档,只会打电话给客服,所以引导、预览、精确定位错误都是在替客服省事。
三条自检 一、能说出不这么做会怎样(不压缩上传在门店网络下会大量失败、驳回不定位到字段商家只能整套重填、改了店名不提示要重新审核他会以为立刻生效);二、能说出你踩过的具体坑;三、能说出量级(多少个字段几步表单、图片多大、日均多少条评价要回复)。三条都有就能写。
项目背景设定 本地生活平台的商家后台(PC Web),Vue 3 + TypeScript + Element Plus + Pinia。使用者是门店老板和店长,他们的共同特点是非专业用户、在店里用较差的网络、注意力被经营占着
为什么这三块值得写 它们的技术含量来自使用者的真实处境:网络差所以要压缩和单张重传;不专业所以驳回要定位到字段、改动要预览效果;忙所以要草稿保存和快捷模板。朴素实现(一个表单、一个上传组件、一个列表)在开发的机器上完全正常,在商家的处境下大量失败。这三块共同回答的是「怎么让一个非专业用户在不好的条件下自己完成任务,而不是打电话给客服」。

模块一:资质提交分步表单与图片上传

  1. 资质提交分步表单与图片上传(前端压缩与单张进度 + 失败单张重传不整套重来 + 驳回项定位到字段 + 草稿自动保存与离开拦截)★★
    简历这样写 商家资质提交页(Vue 3 + 分步表单 + Canvas 压缩 + 本地草稿):证照图片原图数兆,商家在门店网络下上传失败率高,改为前端按长边与质量压缩后再上传并对每张图单独显示进度与状态,失败仅重传该张而非整套重新提交;表单拆成分步流程并带完成度指示,每步校验通过才能进入下一步,避免最后提交时才发现前面缺项;驳回回流时直接定位到被驳回的字段并高亮显示原因,其余已通过材料保留不需重填;填写过程自动保存本地草稿并在离开页面时拦截提示,解决商家中途被叫走后回来重填的问题;上传前做类型与尺寸校验并给出示例图对照,把明显不合格的材料挡在提交前。上线后资质提交的客服咨询量明显下降。
    展开完整拆解
    为什么要这么设计

    资质提交页第一版是一个长表单:十几个字段加五六张图片,一次填完提交。在我的开发机上完全正常,商家侧的反馈全是问题,四类。

    一是上传经常失败,而且他不知道失败了。证照都是手机直接拍的原图,一张两三兆;商家用的是店里的网络(很多是共用的无线网络,上传带宽很低)。一张图要传半分钟,中途失败的比例很高。而我的实现只有一个整体的「上传中」提示,某一张失败了他看不出来,以为都传好了就点提交,然后提交接口报「材料不完整」,他不知道是哪张缺了。

    二是失败要整套重来。五张图传了四张,第五张失败,他刷新页面重新开始,前四张也白传了。在他那个网速下,这意味着又要花好几分钟。

    三是驳回之后不知道改哪。后端返回的驳回原因是结构化的(定位到字段),但我在前端只是把原因文字显示在页面顶部。商家看到「营业执照照片模糊」,但页面上有五个上传框,他不确定哪个是营业执照(我用的标签是内部叫法),于是把五张全重拍了。

    四是中途被打断就得重填。门店老板填表时随时会被客人叫走,回来发现页面被刷新了、或者他自己点了别的地方,填的十几个字段全没了。有个商家连着重填三次,最后打电话让客服帮他填。

    所以四个改动:前端压缩加单张进度与状态失败单张重传驳回定位到字段并高亮自动保存草稿加离开拦截,另外加了上传前的类型尺寸校验与示例图对照

    这个模块最想说的一句话是:功能在我的机器上正常,不等于在使用者的处境下正常。我的开发机是有线网络、图片是我自己截的小图、我知道每个上传框对应什么材料、我填表时不会被人叫走。而商家的每一个条件都和我相反——所以我做的不是「上传功能」,是「一个只在理想条件下可用的上传功能」。

    整体链路
    分步表单(避免最后提交才发现缺项) │ ├─ 拆成几步:主体信息 → 证照材料 → 门店信息 → 确认提交 │ 每步字段控制在可一屏看完的范围 │ ├─ 步骤条显示完成度,已完成步骤可回退修改 │ ├─ 每步校验通过才能进入下一步 │ 一个长表单的问题:最后提交时才报「第 3 个字段格式错」 │ 他要滚回去找,而且可能同时有好几个错 │ └─ 最后一步汇总回显全部填写内容供核对 这一步很重要 —— 分步的副作用是他看不到全貌 图片上传(商家的网络条件是设计前提) │ ├─ 选择文件 → 前端校验:类型 · 大小上限 · 最小分辨率 │ 最小分辨率校验能挡住「截图的截图」这类不可辨认的材料 │ ├─ 前端压缩:按长边缩放 + 质量压缩 │ 数兆的手机原图压到几百 KB,上传时间大幅下降 │ 但要留出下限 —— 压得太狠会导致证照文字不可辨认被驳回 │ ├─ 压缩后本地预览(让他确认拍的是对的那张) │ ├─ 逐张上传,每张独立显示:进度 · 成功 · 失败 · 重传按钮 │ 整体一个「上传中」的问题:某张失败他看不出来 │ ├─ 失败只重传该张,已成功的保留 │ 整套重来在他的网速下意味着又要几分钟 │ └─ 全部成功才允许进入下一步(用状态控制而不是靠他自觉) 示例图对照(把不合格材料挡在提交前) ├─ 每个上传位旁边给一张示例图(正确的样子) ├─ 并列出常见驳回原因(反光 · 遮挡 · 边框缺失 · 过期) └─ 这一条的收益:驳回率下降,等于减少了审核与重提的往返 草稿保存(他随时会被打断) │ ├─ 表单变更时防抖写入本地草稿(含已上传成功的图片标识) │ 图片标识也要存 —— 不然回来还要重传 │ ├─ 再次进入时提示「有未完成的草稿,是否继续」 │ 不要静默恢复 —— 他可能想重新填 │ ├─ 离开页面时拦截提示(有未保存变更才拦) │ 无变更也拦会让他觉得烦 │ └─ 提交成功后清除草稿 驳回回流(定位到字段是关键) │ ├─ 后端返回的结构化原因映射到具体表单项 │ ├─ 该项高亮 + 就地显示原因 + 自动滚动定位到第一个问题项 │ 只在顶部显示文字的问题:他不确定对应哪个上传框 │ ├─ 其余已通过的材料保留、标记为已通过、不可误删 │ └─ 步骤条上标出哪一步有问题(跨步骤时能直接跳过去)
    分步拆解
    1. 前端压缩是这个模块收益最大的一个改动。手机原图数兆,在门店网络下上传时间很长、失败率高。压到几百 KB 之后上传时间和失败率都大幅下降。
    2. 压缩要留下限,不能压过头。压得太狠会导致证照上的文字不可辨认,结果是审核驳回,商家白折腾一次。要在真实证照图上试出一个既能显著减小体积、又能保证文字可读的参数。
    3. 压缩后要本地预览,让他确认拍的是对的那张。商家相册里有很多张,选错了在提交后才被驳回,往返成本很高。
    4. 每张图要独立显示进度与状态。整体一个「上传中」的问题是某张失败他看不出来,以为都好了就点提交——这是我踩的最具体的坑。
    5. 失败只重传该张,已成功的保留。整套重来在他的网速下意味着又要花几分钟,而这个成本会直接变成「打电话给客服」。
    6. 全部上传成功才允许进入下一步,用状态控制而不是靠提示。提示他会忽略,按钮禁用他就必须处理。
    7. 上传前要校验类型、大小上限、最小分辨率。最小分辨率这一条能挡住「截图的截图」这类不可辨认的材料,而这类材料一定会被驳回。
    8. 每个上传位要配示例图和常见驳回原因。这是从源头降低驳回率的办法——比事后驳回再让他重拍便宜得多。
    9. 表单要拆成分步,每步校验通过才能继续。长表单的问题是最后提交时才报错,而且可能同时有好几个错,他要滚上去逐个找。
    10. 分步的副作用是看不到全貌,所以最后一步必须汇总回显。让他核对一遍再提交。
    11. 草稿要自动保存,包含已上传成功的图片标识。只存文本字段的话,他回来还要重新上传图片,草稿的价值就减半了。
    12. 草稿恢复要提示不要静默。他可能想重新填,静默恢复会让他困惑「怎么有内容」。
    13. 离开拦截只在有未保存变更时触发。无变更也拦会让人觉得烦,而被烦到的用户会养成「无脑点确认」的习惯,真需要拦的时候也拦不住。
    14. 驳回原因要定位到具体表单项并自动滚动到第一个问题项。只在顶部显示文字的问题是商家不确定原因对应哪个上传框(尤其我们的字段标签用了内部叫法),于是把全部材料重拍。
    15. 已通过的材料要标记并防止误删。他可能顺手把好的也删了重传,白花时间。
    16. 字段标签要用商家能懂的叫法,不要用内部术语。这一条很小但影响很实际——他看不懂标签就对不上驳回原因。
    关键决策与取舍

    选前端压缩而不是让服务端处理大图。服务端压缩的好处是不损失原始质量、前端逻辑简单,但它解决不了核心问题——上传本身就慢、就容易失败问题出在传输环节,就必须在传输之前解决。代价是要在前端处理压缩(有兼容性和性能考虑)、并且原图不再保留。判据是「瓶颈在哪」:瓶颈是商家的上行带宽,那就只能减少要传的数据量。

    压缩参数的取舍是「体积」和「可辨认度」。压得越狠上传越快,但证照上的小字(统一社会信用代码、有效期)会模糊到审核看不清,结果被驳回——那就白优化了我的做法是拿真实的证照照片试参数,以「审核同学能看清关键字段」为验收标准,而不是拿一个通用的压缩比。这一条我觉得很关键:优化不能优化到把功能本身破坏掉。

    分步表单 vs 长表单。长表单的好处是能看到全貌、实现简单;分步的好处是每步校验、错误暴露得早、心理负担小。代价是看不到全貌(用最后一步汇总回显来补)、以及步骤间的状态管理复杂一些。判据是「字段数量和错误的暴露时机」——十几个字段加六张图,长表单会导致「提交时一次报五个错」,那种体验会直接把人劝退。

    草稿存本地而不是存服务端。存服务端能跨设备恢复,但资质材料是敏感信息,未提交的草稿存到服务端会带来额外的存储与合规责任;而且商家基本是在同一台电脑上完成的。取舍依据是「跨设备的需求很弱、而敏感数据的责任很实在」。

    踩过的坑一:整体一个「上传中」,某张失败商家看不出来。他以为都传好了点提交,接口报「材料不完整」,而这个报错没告诉他缺哪张。他打电话给客服,客服也不知道。教训是:批量操作的每一项都要有自己的状态显示,汇总状态会掩盖个别失败——这和后端「批量操作要逐条回显结果」是同一个道理,只是发生在前端。

    踩过的坑二:驳回原因只在页面顶部显示文字。后端已经给了结构化的字段定位,是我在前端没用上。商家看到「营业执照照片模糊」,但页面上五个上传框用的是内部叫法,他对不上,于是五张全重拍了教训是:后端给了结构化信息,前端要真的用它来定位,而不是把它当文案显示——这个浪费很典型。

    踩过的坑三:没做草稿,商家中途被叫走回来全部重填。有个商家连着重填三次最后让客服帮他填。这件事让我理解了「使用者的处境」有多重要:我填表时不会被人叫走,所以我完全没想到这个场景。后来我养成的习惯是先问「这个人在什么环境下、用什么设备、会被什么打断」,再决定要做哪些兜底。

    没做的部分:没做大文件的分片续传。压缩之后单张图只有几百 KB,分片续传的收益很小、复杂度不低取舍依据是「压缩已经把问题解决到了不需要续传的程度」——先用便宜的办法把问题规模缩小,往往比直接上复杂方案更划算。

    数字是怎么测的

    压缩效果要报三个数:原图体积、压缩后体积、以及关键字段是否仍可辨认。第三个是定性的但必须报——只报压缩比不报可辨认度,等于没说清这个优化有没有副作用。我的做法是让审核同学在压缩后的图上确认能看清哪些字段。

    上传成功率与耗时必须在限速环境下测。用弱网工具模拟商家的上行带宽,报「压缩前后的单张上传耗时与失败率」在办公室网络下测这个指标毫无意义——那里什么都能成功。

    失败重传要用断言型用例:让第三张上传失败,断言前两张保留成功状态、只有第三张显示失败与重传按钮、重传后不影响其他张

    驳回定位:构造一个带字段级驳回原因的回流,断言对应表单项被高亮、页面自动滚动到它、其余材料保留为已通过状态

    草稿恢复:填一半后关闭页面,重新进入,断言提示存在草稿、恢复后文本字段与已上传图片都在。第二部分容易漏。

    客服咨询量的报法要谨慎:可以报「资质提交相关的客服工单数下降」,但必须说明同期是否有其他变更(比如审核标准调整、商家培训),不能把全部功劳归给这个改动。

    驳回率的报法同理:示例图对照理论上能降低驳回率,但驳回率也受审核松紧影响。要说清这一点。

    不要报什么:不要报「上传成功率 100%」——弱网下不可能。该报的是「限速环境下压缩前后的失败率对比」「关键字段压缩后仍可辨认(经审核确认)」「单张失败只需重传该张」「驳回原因能定位到具体表单项」这几件可核对的事。

    面试追问
    Q:上传图片这么基础的功能,能踩什么坑? A:我踩的坑都不在代码里,在「我没有站在使用者的处境上想」这件事上。我的开发机是有线网络、测试用的是我自己截的小图、我知道每个上传框对应什么材料、我填表时不会被人叫走——而商家的每一个条件都和我相反。具体三个坑。一是没做压缩:证照都是手机拍的原图,一张两三兆,商家用店里共用的无线网络,一张要传半分钟、失败率很高。这个问题只能在传输之前解决——服务端压缩解决不了「传输本身慢」。二是整体只显示一个「上传中」:五张里某一张失败了他看不出来,以为都传好了就点提交,接口报「材料不完整」但没说缺哪张,他只能打电话给客服。所以改成每张独立显示进度和状态、失败只重传那一张——整套重来在他的网速下意味着又要几分钟三是没做草稿:门店老板填表时随时会被客人叫走,回来发现十几个字段全没了,有个商家连着重填三次最后让客服帮他填。这三个坑的共性是:功能在我的机器上正常,不等于在使用者的处境下正常。后来我养成的习惯是先问三个问题——这个人在什么环境下、用什么设备、会被什么打断——再决定要做哪些兜底。
    Q:前端压缩会不会把证照压得看不清?你怎么定压缩参数的? A:这正是这个优化最容易做错的地方,而且做错了是负优化。压得越狠上传越快,但证照上的小字——统一社会信用代码、有效期、许可证编号——会模糊到审核看不清,结果被驳回,商家白折腾一次还要重拍。那我优化上传速度就毫无意义了。所以我定参数的方式不是拿一个通用的压缩比,而是拿真实的证照照片试,验收标准是「审核同学能看清关键字段」——我找审核同学在压缩后的图上确认能不能读出那几个关键字段,读不出就调回去。最后是按长边缩放加质量压缩两个维度一起调,并且设了一个下限:低于某个尺寸就不再压缩(有些商家的图本来就不大)。报数字的时候我也会报三个而不是一个:原图体积、压缩后体积、以及关键字段可辨认(经审核确认)——只报压缩比不报可辨认度,等于没说清这个优化有没有副作用我从这件事得到一条更一般的教训:优化不能优化到把功能本身破坏掉。这类「优化指标改善了但业务目标反而变差」的情况,只看优化指标是发现不了的,必须找到那个真正的验收标准——这里就是「审核能不能看清」。顺带说,因为压缩已经把单张压到几百 KB,我就没做分片续传——先用便宜的办法把问题规模缩小,往往比直接上复杂方案划算。

模块二:评价管理与回复工作台

  1. 评价管理与回复工作台(待处理优先的默认视图 + 模板作为起点而非终稿 + 发布前的公开性提示 + 申诉状态可跟踪)★★
    简历这样写 商家评价管理页(Vue 3 + Pinia + 模板变量填充 + 草稿保留):默认视图改为「待回复的低分评价优先」而非按时间倒序(原默认下商家最需要处理的差评被淹在新评价里);提供分场景回复模板并把模板定位为起点而非终稿——插入后强制要求编辑(纯模板原文不允许直接发布),避免所有回复千篇一律反而伤害门店形象;回复发布前给出公开可见提示与可编辑窗口倒计时说明,并对情绪化用词做本地提示(不拦截);对疑似恶意评价提供申诉入口与状态跟踪(提交、审核中、通过、驳回及理由),解决原先申诉后无反馈的问题;回复内容本地草稿保留,切换评价或误关弹窗不丢失。上线后低分评价的回复率与回复及时性明显改善。
    展开完整拆解
    为什么要这么设计

    评价管理页第一版就是一个按时间倒序的评价列表,每条下面一个「回复」按钮。功能上什么都不缺,但商家几乎不用它,四个问题。

    一是默认视图不对,最该处理的评价被淹了。按时间倒序意味着最新的评价在最前面,而其中绝大多数是好评(不需要回复)一条三天前的差评已经翻到第二页了,而它正是最影响门店的那条。商家每天登录后台是为了处理订单,他不会有耐心翻页找差评。

    二是每条都要手写回复,商家嫌麻烦干脆不回。他一天可能有十几条评价,逐条手写没有精力。所以他的实际选择是全都不回。

    三是我做了模板之后,出现了新问题:所有回复变成一模一样的模板原文。用户在门店页面看到十条评价下面十条完全相同的「感谢您的光临,欢迎再次品尝」,观感比不回复更差——那是明显的敷衍。我做了个优化,结果制造了一个新问题。

    四是申诉提交之后没有任何反馈。商家点了申诉,然后就什么都看不到了——不知道有没有收到、审核到哪一步、结果是什么。他会反复提交同一条申诉,或者打电话问客服。

    所以四个改动:默认视图改成待回复的低分优先提供模板但强制编辑(不允许原文直接发布)回复前给公开性提示申诉状态全程可跟踪

    这个模块最想说的一句话是:默认值决定了功能会不会被用。回复功能一直都在,但因为默认视图把差评埋在了第二页,商家实际上用不到它我没有加任何新功能,只是把默认排序从「按时间」改成「待回复的低分优先」,低分评价的回复率就明显上来了。这件事让我明白:「功能有没有」和「功能会不会被用到」是两回事,而后者往往由默认值决定。

    整体链路
    默认视图(决定功能会不会被用) │ ├─ 默认排序:待回复 + 低分 优先,其次按时间 │ 按时间倒序的问题:新评价大多是好评,差评被翻到第二页 │ 而差评正是最需要处理、最影响门店的那条 │ ├─ 顶部给待处理计数(待回复的低分评价数量) │ 有明确数字他才会去清掉它 │ └─ 筛选项:星级 · 时间范围 · 是否已回复 · 是否有图 · 是否申诉中 筛选态要能被记住(他常用的组合不必每次重选) 回复编辑(模板是起点不是终稿) │ ├─ 分场景模板:口味类 · 服务类 · 环境类 · 配送类 · 通用致谢 │ 按差评的常见原因分类,比一个通用模板有用得多 │ ├─ 模板支持变量(门店名 · 菜品名),插入后自动填充 │ ├─ 插入模板后强制编辑:原文未修改不允许发布 │ 不加这个约束的后果:十条评价下十条一模一样的回复 │ 用户看到就是明显的敷衍,观感比不回复更差 │ ├─ 情绪化用词本地提示(提示不拦截) │ 商家收到差评容易情绪化,但拦截会让他觉得被管太多 │ 提示 + 让他自己决定,接受度高很多 │ └─ 编辑内容本地草稿保留 切换评价 · 误关弹窗 · 页面刷新都不丢 发布前的提示(回复是公开的) ├─ 明确提示「该回复将公开展示在门店页面」 ├─ 说明可编辑窗口(发布后多久内可修改,超时锁定) └─ 提示存在的意义:让他知道这是对外发言,减少冲动回复 申诉(原先提交后毫无反馈) │ ├─ 入口:疑似恶意评价可发起申诉 │ ├─ 表单:理由分类 + 说明 + 证据上传(订单记录 · 沟通截图) │ 理由分类能让审核更快,也能统计出常见的恶意类型 │ ├─ 状态全程可见:已提交 → 审核中 → 通过 / 驳回(带理由) │ 无反馈的后果:他反复提交同一条,或者打电话问客服 │ ├─ 已申诉的评价在列表上标记状态,不能重复提交 │ └─ 通过后评价从列表移除并提示「已下架,评分已更新」 要明确说「评分已更新」—— 否则他不知道申诉到底有没有效果 其他 ├─ 长评价折叠展开,带图评价支持预览大图 ├─ 空态区分「暂无评价」和「加载失败」 └─ 移动端适配(商家常在手机上处理)
    分步拆解
    1. 默认视图改成「待回复 + 低分优先」,这是收益最大且成本最低的改动。按时间倒序的问题是新评价大多是好评,最需要处理的差评被翻到第二页。改一个默认排序,回复率就上来了。
    2. 顶部要给待处理计数。有明确数字商家才会去清掉它,没有数字他不知道有没有事情要做。
    3. 筛选态要能被记住。商家有固定的查看习惯(比如只看差评),每次都要重新选会让他放弃使用筛选。
    4. 模板要按差评的常见原因分场景,不要只给一个通用模板。口味、服务、环境、配送的回复内容差别很大,一个通用模板等于没有针对性。
    5. 模板支持变量并自动填充。门店名、菜品名。减少手工替换的麻烦,也避免他忘记改导致回复里带着占位符。
    6. 插入模板后必须强制编辑,原文不允许直接发布。这是我做模板之后新出现问题的修法——十条评价下十条一模一样的回复,用户看到就是明显的敷衍,观感比不回复更差。
    7. 情绪化用词只提示不拦截。商家收到差评容易情绪化,但拦截会让他觉得被管太多、产生抵触;提示加让他自己决定,接受度高很多。而且判断「情绪化」本身有误差,硬拦会误伤。
    8. 回复内容要本地草稿保留。切换评价、误关弹窗、页面刷新都不该丢——他刚写了两百字被清掉,就不会再写第二遍了。
    9. 发布前要明确提示「该回复将公开展示」。让他知道这是对外发言。这一句提示对减少冲动回复很有效,成本几乎为零。
    10. 要说明可编辑窗口。他知道「发布后短时间内还能改」,心理压力小、也更愿意先发出去。
    11. 申诉必须有状态跟踪。无反馈的后果是他反复提交同一条、或者打电话问客服——两者都是我们的成本。
    12. 申诉表单要有理由分类。能让审核更快,也能统计出常见的恶意评价类型,反过来改进风控。
    13. 已申诉的评价要在列表上标记状态并禁止重复提交。防止重复申诉占用审核资源。
    14. 申诉通过后要明确提示「评分已更新」。这一句很关键——商家最在意的是分数有没有变,不说清他会觉得申诉没有效果。
    15. 空态要区分「暂无评价」和「加载失败」。新店本来就没有评价,但加载失败显示成「暂无评价」会让他以为评价丢了。
    16. 要做移动端适配。商家很多时候是在店里用手机处理这些事,PC 端做得再好他也用不上。
    关键决策与取舍

    不做批量回复,这是有意的取舍。批量回复技术上很简单,商家也提过这个需求(「能不能一键回复全部好评」)。但我认为它会直接破坏功能的目的——评价回复的价值在于「商家真的看到了并且回应了」,批量回复出来的内容必然是模板原文,用户一眼就能看出是批量的而这比不回复更伤门店形象。所以我的处理是拒绝批量,但用「分场景模板 + 变量填充 + 强制编辑」把单条回复的成本降到足够低。判据是「这个效率优化会不会破坏功能本身的目的」——会的话就不该做,而应该去降低正确做法的成本。

    模板强制编辑而不是完全自由。完全自由的结果我们实测过——商家会直接发模板原文,十条评价下十条一模一样。强制编辑的代价是多一个约束、商家可能觉得麻烦。但这个约束保护的是他自己的门店形象,而他当时意识不到。这类「用户短期觉得麻烦但长期对他有利」的约束要不要加,我的判据是:这个后果他自己能不能及时看到——看不到(用户不会告诉他「你的回复很敷衍」),那就该由系统来兜。

    情绪化用词选「提示」而不是「拦截」。拦截的问题有两个:一是判断本身有误差会误伤(有些词在特定语境下是正常的);二是商家会觉得被管太多而产生抵触,甚至绕过(换个说法表达同样的情绪)。提示的代价是有些不当回复还是会发出去。但我们有事后手段(回复也过内容检测、有可编辑窗口、平台可下架),所以前置环节不必做硬拦。这一条和敏感词分级处置是同一个思路:机器判不准的事,给人提示而不是替人决定。

    踩过的坑一:默认按时间倒序,导致回复功能形同虚设。功能一直都在,但差评被新的好评顶到第二页,商家不会翻页去找我改的只是一个默认排序,低分评价的回复率就明显上来了。这件事对我的影响很大:「功能有没有」和「功能会不会被用到」是两回事,而后者往往由默认值决定。后来我做任何列表页都会先问「用户打开这个页面最想先看到什么」,而不是默认按时间排。

    踩过的坑二:加了模板功能,结果制造了「千篇一律的回复」这个新问题。这是我第一次真切体会到「一个优化可能带来比原问题更糟的新问题」。原问题是「商家嫌麻烦不回复」,我用模板降低了成本;但我没想到成本降到零之后,他会选择完全不加工。修法是强制编辑。教训是:做效率优化时要想一步——成本降低之后,用户的行为会怎么变?

    踩过的坑三:申诉提交后没有任何状态反馈。商家反复提交同一条申诉,客服接到很多「我的申诉怎么样了」的电话。教训是:任何「提交后由别人处理」的流程,都必须给提交方一个可查询的状态——否则他唯一的办法就是反复提交或者找人问。这个成本一定会回到我们身上,只是换了个部门承担。

    没做的部分:没做回复内容的智能生成(根据评价内容自动写回复)。它能进一步降低成本,但会把「千篇一律」的问题变成「看起来不一样但同样没有诚意」,而且生成内容的质量与合规都需要额外把控。我认为在没有解决「怎么保证生成内容真的针对了用户的具体问题」之前,它的风险大于收益。

    数字是怎么测的

    回复率是这个模块的核心指标,但要按星级分开报。总体回复率会被好评稀释。报法是「低分评价的回复率从 X 提升到 Y」并说明统计区间——因为改动的目标就是让差评被处理。

    回复及时性报「从评价发布到商家回复的中位时长」。用中位数而不是平均值,因为少数几条很久之后才回复的会把平均值拉得很离谱。

    模板的效果要报两个数,不能只报一个:「使用模板的回复占比」和「模板回复中被实际编辑的比例」。第二个才说明「强制编辑」这个约束有没有起作用——只报第一个会掩盖「全是模板原文」这个问题。

    回复内容的差异度可以做一个简单的抽样检查:取同一门店的若干条回复,看是否存在大量完全相同的文本。这是「千篇一律」问题的直接回归验证。

    默认视图改动的效果验证要注意归因:回复率上升可能同时受到「运营培训商家」等因素影响。我的处理是同时报「待处理计数被清零的天数占比」——这个指标更直接对应默认视图的改动。

    申诉状态跟踪的效果用「重复申诉次数」和「申诉相关客服工单数」衡量,两者都应下降。

    草稿保留:断言写了一半切换评价再切回、或刷新页面后内容仍在。

    不要报什么:不要报「门店评分提升」——评分主要由服务质量决定,不是回复功能的功劳。该报的是「低分评价回复率与回复中位时长」「模板回复中被实际编辑的比例」「重复申诉次数下降」「草稿在切换与刷新后保留」这几件可核对的事。

    面试追问
    Q:商家嫌回复麻烦,那为什么不做批量回复?一键回复全部好评不是效率最高? A:商家真的提过这个需求,但我认为它会直接破坏这个功能的目的,所以拒绝了。评价回复的价值在于「商家真的看到了这条评价并且回应了」——批量回复出来的内容必然是模板原文,用户在门店页面看到十条评价下面十条完全相同的回复,一眼就知道是批量的,那比不回复更伤门店形象。这不是我想象的,是我真实踩过的坑:我最初做了模板功能来降低回复成本,结果商家直接发模板原文,页面上出现十条一模一样的「感谢您的光临」。所以正确的做法不是继续降低成本到零,而是把单条回复的成本降到足够低,同时保证内容有加工:分场景模板(口味/服务/环境/配送,比一个通用模板有针对性得多)、模板变量自动填充门店名菜品名、但插入模板后强制编辑——原文未修改不允许发布我的判据是:这个效率优化会不会破坏功能本身的目的?会的话就不该做,而应该去降低「正确做法」的成本。另外这个约束还有一层意思:千篇一律的回复伤害的是商家自己的门店形象,但他当时意识不到(用户不会告诉他「你的回复很敷衍」)——这类「用户看不到后果」的情况,我认为该由系统来兜。
    Q:把默认排序改一下就能提升回复率?这算你的工作成果吗? A:我认为算,而且这是我在这个页面上做的最有价值的一件事,虽然代码改动可能只有几行。原来的默认是按时间倒序——这是最"自然"的选择,我当时没多想。问题是新评价里绝大多数是好评(不需要回复),而一条三天前的差评已经被顶到第二页了,而它正是最影响门店的那条。商家每天登录后台是为了处理订单,他不会有耐心翻页去找差评。所以回复功能一直都在,但实际上用不到——「功能有没有」和「功能会不会被用到」是两回事。我把默认排序改成「待回复 + 低分优先」,并在顶部加了待处理计数,低分评价的回复率就明显上来了这件事让我形成了一个习惯:做任何列表页之前先问「用户打开这个页面最想先看到什么」,而不是默认按时间排。不过我想诚实说明两点。一是归因:回复率上升可能同时受到运营培训商家等因素影响,所以我还报了一个更直接的指标——「待处理计数被清零的天数占比」,它更能对应这个改动本身。二是这个改动之所以有效,是因为它对准了真实的使用场景——如果我没有去看商家实际怎么用这个页面(他每天只在处理订单的间隙看一眼),我不会想到默认排序是问题所在。发现问题的过程比改代码更是工作量。

模块三:门店信息编辑与效果预览

  1. 门店信息编辑与效果预览(字段按生效方式分组标注 + 顾客视角实时预览 + 营业时间多时段跨天编辑 + 改动影响面提示与未保存拦截)★★
    简历这样写 门店信息编辑页(Vue 3 + 表单分组 + 顾客视角预览 + 时间段控件):门店字段的生效方式不同(部分立即生效、部分需重新审核、部分会影响配送范围),原先混在一个表单里无任何区分,商家改完以为已生效,改为按生效方式分组并在字段上明确标注,提交前汇总说明「哪些立即生效、哪些进入审核、审核期间展示的仍是旧值」;新增顾客视角实时预览(右侧同步渲染门店卡片与详情页样式),商家能直接看到改动在用户端的呈现,减少「改完不知道对不对」的反复咨询;营业时间控件支持按周设置、单日多时段、跨天营业并做时段重叠与跨天边界校验(原实现仅支持单一时段,夜间营业门店无法正确表达);地址与品类等高影响字段改动时提示影响面(配送范围与搜索归类会变化);表单有未保存变更时离开拦截。上线后门店信息相关的客服咨询与错误改动明显减少。
    展开完整拆解
    为什么要这么设计

    门店信息编辑页第一版是一个平铺的表单:店名、地址、电话、品类、营业时间、简介、门头照,全部放在一起,一个「保存」按钮。四个问题都不是功能 bug,全是「商家不知道发生了什么」。

    一是不知道哪些改动需要审核。店名、地址、品类这些改了要重新审核(审核期间用户看到的还是旧值);营业时间、电话、简介改了立即生效。而我的表单对这两类字段没有任何区分。商家改了店名点保存,看到「保存成功」,他以为立刻生效了,去用户端一看还是旧名字,于是打电话说「你们系统有 bug」。

    二是不知道改完在用户端是什么样。他填了一段简介,不知道会不会被截断、门头照会不会被裁掉重点、店名太长会不会显示不全。他只能保存了之后自己去 App 上找自己的店看一眼——而如果需要审核,他还得等审核通过才能看到。

    三是营业时间根本表达不了他的真实情况。我做的是一个「开始时间 - 结束时间」的单时段控件。但很多门店是中午晚上两个时段、有的周末和平日不同、夜宵店是晚上十点到次日凌晨两点跨天的情况在我的控件里填不进去——结束时间比开始时间小,校验直接报错。他的处理是填一个错的时间,然后在简介里写「实际营业时间见店内告示」。

    四是改动的影响面他不知道。地址改了会影响配送范围(原来能送到的小区可能送不到了)、品类改了会影响搜索归类。他改地址只是因为「门牌号写错了想修正」,完全没想到会影响配送。

    所以四个改动:字段按生效方式分组并明确标注加顾客视角实时预览营业时间支持按周、多时段、跨天高影响字段改动时提示影响面,另外补了未保存离开拦截

    这个模块最想说的一句话是:表单的设计要把「系统内部的差异」显式呈现给用户,而不是隐藏起来。「需要审核」和「立即生效」在我们内部是很清楚的两类字段,但我把它们混在一个表单里、用同一个「保存成功」提示,就等于把这个差异藏起来了——而用户会用他自己的理解去填补这个空白,通常是错的。

    整体链路
    字段分组(把内部差异显式呈现) │ ├─ 分组一:立即生效(电话 · 简介 · 营业时间 · 部分标签) ├─ 分组二:需重新审核(店名 · 地址 · 品类 · 门头照) │ 每个字段旁标注「修改后需审核,审核期间顾客看到的是当前值」 ├─ 分组三:不可自行修改(主体名称等,需走专门流程) │ 标注清楚并给出正确的操作入口,而不是简单禁用 │ └─ 提交前汇总说明 本次改动中:X 项立即生效 · Y 项进入审核(预计时长) 不说清的后果:他以为都生效了,去顾客端一看没变,认为是 bug 顾客视角实时预览(他改的东西用户看到什么样) │ ├─ 右侧同步渲染两种呈现 │ 列表卡片样式(店名 · 门头照 · 评分 · 距离 · 标签) │ 详情页头部样式(简介 · 营业时间 · 地址 · 电话) │ ├─ 预览要复用顾客端的样式约束 │ 店名超长的截断规则 · 简介的行数限制 · 图片的裁剪比例 │ 只做个大概的样子没用 —— 关键就是让他看到「会被截断」 │ ├─ 门头照预览要显示实际裁剪框 │ 不显示的后果:他放了个居中构图的图,实际被裁掉了主体 │ └─ 预览是纯前端渲染,不依赖保存(改一个字立刻看到) 营业时间控件(原实现表达不了真实情况) │ ├─ 按周设置:可对每天单独设置,也可批量应用到多天 │ 「周一到周五相同、周末不同」是最常见的情况 │ ├─ 单日多时段:支持中午 + 晚上两段(或更多) │ 时段之间要校验不重叠 │ ├─ 跨天营业:结束时间小于开始时间时视为次日 │ 不支持的后果:夜宵店填不进去,只能填个错的 │ 要在界面上明确显示「次日」,避免他误填 │ ├─ 特殊日期:可单独设置休息日或临时调整 │ └─ 校验:时段重叠 · 时长为零 · 跨天与次日时段冲突 跨天与次日首个时段的冲突最容易漏 —— 凌晨两点关门和早上没冲突 但如果次日第一段从凌晨一点开始,就重叠了 影响面提示(高影响字段) ├─ 地址改动 → 配送范围会重新计算,部分区域可能不再可送 ├─ 品类改动 → 搜索与分类归属会变化,可能影响曝光 ├─ 营业时间 → 非营业时段不接单,注意跨天设置 └─ 提示要具体说明「会发生什么」,不要只写「请谨慎修改」 未保存拦截 ├─ 有变更时离开拦截(无变更不拦,避免烦扰) ├─ 拦截提示要说明「有未保存的修改」而不是泛泛的「确定离开」 └─ 提交成功后重置变更标记
    分步拆解
    1. 字段必须按生效方式分组并逐个标注。「需审核」和「立即生效」在我们内部很清楚,但混在一个表单里用同一个「保存成功」提示,就等于把这个差异藏起来了。
    2. 需审核字段的标注要写清「审核期间顾客看到的是当前值」。只写「需审核」不够——他会以为「审核中就是新值加个待审核标记」。
    3. 提交前要汇总说明本次改动的生效情况。「X 项立即生效、Y 项进入审核」。这一步是防止「以为都生效了」的关键。
    4. 不可自行修改的字段要给出正确的操作入口,不要简单禁用。禁用而不说明,他只会打电话问怎么改。
    5. 预览必须复用顾客端的样式约束,不能只做个大概样子。关键价值就是让他看到「店名会被截断」「简介只显示两行」「图片会被裁掉」——约束不真实,预览就没有意义。
    6. 门头照预览要显示实际的裁剪框。不显示的后果是他放了一张居中构图的图,实际展示时主体被裁掉了。
    7. 预览要在纯前端实时渲染,不依赖保存。改一个字立刻看到。如果要保存后才能预览,那需审核的字段他根本看不到效果。
    8. 营业时间要支持按周设置并能批量应用。「周一到周五相同、周末不同」是最常见的情况,逐天填七次太麻烦。
    9. 单日要支持多时段并校验不重叠。中午晚上两段是餐饮门店的常态,只支持一段是我最初对业务理解不足。
    10. 必须支持跨天营业。结束时间小于开始时间时视为次日。不支持的后果是夜宵店填不进去,他只能填一个错的时间然后在简介里写实际时间——数据就废了。
    11. 跨天要在界面上明确显示「次日」。否则他会以为自己填错了,或者误解成同一天。
    12. 跨天与次日首个时段的冲突校验最容易漏。凌晨两点关门和次日早上开门不冲突,但如果次日第一段从凌晨一点开始就重叠了。这个边界要专门测。
    13. 高影响字段改动时要具体说明「会发生什么」。「地址改动会重新计算配送范围,部分区域可能不再可送」——比「请谨慎修改」有用得多,后者等于没说。
    14. 离开拦截只在有未保存变更时触发,且提示要具体。说「有未保存的修改」而不是泛泛的「确定离开」,后者他不知道会丢什么。
    15. 提交成功后要重置变更标记。否则保存后离开还会被拦,用户会觉得功能坏了。
    关键决策与取舍

    预览选「前端复用顾客端样式约束」而不是「调顾客端接口渲染真实页面」。后者最真实,但需审核的字段在审核通过前拿不到新值,所以真实渲染只能看到旧值——那就完全达不到预览的目的。前端渲染的代价是样式约束要在两边各维护一份,顾客端改了样式预览可能不同步缓解办法是把关键约束(截断字数、行数、裁剪比例)抽成共享配置,而不是在预览里写死。判据是「预览要解决的核心问题是什么」——是让他在提交前看到效果,那就必须不依赖保存。

    营业时间控件选自己实现而不是用现成组件拼。现成的时间选择器解决不了「按周 + 多时段 + 跨天 + 特殊日期」这个组合。自己实现的代价是要处理很多边界(重叠、跨天、时长为零)但这些边界本身就是业务需求,用现成组件也躲不掉,只是把复杂度挪到了外面。我的判断是:当一个控件的核心复杂度来自业务规则而不是交互形式时,自己实现更清楚。

    影响面提示选「说明后果」而不是「要求二次确认」。二次确认会让每次改地址都多一步,而改地址是低频操作、且大多数改动是正当的(修正门牌号)。说明后果让他自己判断,成本更低。判据是「误操作的代价是否不可逆」——配送范围变化是可逆的(改回来就行),所以不需要强确认;而如果是不可逆的操作,我会加二次确认。

    踩过的坑一:需审核的字段没有任何标注,商家改完店名以为立刻生效。他看到「保存成功」,去用户端一看还是旧名字,打电话说「你们系统有 bug」根因是我把系统内部的差异(两类字段)藏起来了,用同一个提示覆盖了两种完全不同的结果。教训是:用户会用他自己的理解去填补你没说清的空白,而那个理解通常是错的——「保存成功」在他的理解里就是「已经生效了」。

    踩过的坑二:营业时间只支持单时段,夜宵店填不进去。结束时间比开始时间小,我的校验直接报错。商家的处理是填一个错的时间,然后在简介里写「实际营业时间见店内告示」——这意味着这个字段的数据完全不可信,而下游(是否接单、是否显示营业中)都依赖它。教训是:当用户开始用「变通办法」绕过你的字段时,说明这个字段的设计和真实业务不匹配,而且它已经污染了下游数据。我是从简介内容里发现这个问题的,不是从工单里。

    踩过的坑三:门头照预览没有显示裁剪框。商家上传了一张居中构图的照片,实际展示时按比例裁剪,主体被裁掉了一半。他反复换图也不明白为什么。教训是:预览如果不真实反映约束,它比没有预览更糟——因为它给了用户错误的确信。

    没做的部分:没做改动的历史版本与回滚(改错了能恢复到上一版)。它有价值,但需要存储每次变更的完整快照,而且「回滚」在有审核环节的字段上语义复杂(回滚到一个待审核的版本是什么意思)。我记录了变更日志(谁在什么时候改了什么),这已经能解决「查是谁改的」这个主要需求,回滚留给后续。

    数字是怎么测的

    「以为已生效」这类问题最好的指标是客服工单分类:报「门店信息生效相关的咨询工单数下降」。要说明工单是怎么分类的(人工标注还是关键词),以及同期有没有其他变更影响。

    预览的价值用「保存后又立即再次修改的比例」衡量。这个指标很有意思——它代表「保存后才发现效果不对」的情况。有了预览之后这个比例应该下降。要说清统计窗口(多长时间内的再次修改算)。

    营业时间控件的正确性要用断言型用例覆盖全部边界:单时段、多时段、时段重叠(应报错)、跨天、跨天与次日首段冲突、时长为零、按周批量应用。其中「跨天与次日首段冲突」最容易漏,要专门写。

    营业时间数据质量可以直接查:统计「简介里包含营业时间描述的门店数」——这个数字反映了有多少商家在用变通办法绕过营业时间字段。控件改造后这个数字应该下降。这是我发现原问题的方式,也是最直接的验证。

    预览与实际的一致性验证:取若干真实门店数据,对比预览渲染与顾客端实际渲染的截断位置、行数、裁剪区域是否一致这条必须做——预览不准比没有预览更糟。

    离开拦截:断言有变更时拦截、无变更时不拦、保存成功后不再拦。第三条最容易漏。

    不要报什么:不要报「门店信息完整度提升」——那主要靠运营催促。该报的是「简介里写营业时间的门店数下降」「保存后立即再次修改的比例下降」「营业时间边界用例全部通过」「预览与顾客端渲染一致」这几件可核对的事。

    面试追问
    Q:营业时间不就是选个开始和结束时间吗?为什么要自己做控件? A:我第一版就是「开始时间 - 结束时间」的单时段控件,而它表达不了大部分门店的真实情况。三种情况填不进去:很多餐饮店是中午晚上两个时段(中间休息)、周末和平日的时间不同夜宵店是晚上十点到次日凌晨两点——结束时间比开始时间小,我的校验直接报错而我发现这个问题的方式很有意思:不是从工单里,是我在看门店简介数据的时候,发现有很多商家在简介里写「实际营业时间见店内告示」或者直接写了时间段。说明他们填了一个错的营业时间,然后用简介来绕过。这件事的严重性在于:营业时间不只是展示字段,下游的「是否接单」「是否显示营业中」都依赖它——数据一污染,下游全错。所以这不是一个显示问题,是数据正确性问题。改造后支持按周设置(可批量应用到多天)、单日多时段、跨天营业(结束时间小于开始时间视为次日,并在界面上明确显示「次日」)、特殊日期单独调整。校验里最容易漏的一条是跨天与次日首个时段的冲突:凌晨两点关门和次日早上开门不冲突,但如果次日第一段从凌晨一点开始就重叠了——这个边界我专门写了用例。为什么不用现成组件拼?因为这个控件的核心复杂度来自业务规则(重叠、跨天、按周)而不是交互形式,用现成组件也躲不掉这些边界,只是把复杂度挪到了外面。我总结的一条更一般的经验是:当用户开始用「变通办法」绕过你的字段时,说明这个字段的设计和真实业务不匹配。
    Q:预览为什么不直接调顾客端接口渲染真实页面?自己写一套样式不是会不一致吗? A:不一致的风险确实存在,我也认为它是这个方案的主要代价,但调真实接口在这里根本达不到预览的目的。原因是门店有一部分字段(店名、地址、品类、门头照)改动后需要重新审核,审核期间顾客端拿到的仍然是旧值——所以如果我调顾客端接口渲染,商家改完店名点预览,看到的还是旧名字,那这个预览完全没有意义而预览要解决的核心问题恰恰是「让他在提交前看到效果」,必须不依赖保存、不依赖审核。所以只能前端用当前表单值实时渲染。不一致的风险我是这么控制的:把关键的样式约束抽成共享配置——店名的截断字数、简介的显示行数、门头照的裁剪比例,预览和顾客端读同一份配置,而不是在预览里写死一套这一点我认为是必须做的,因为预览如果不真实反映约束,它比没有预览更糟——它给了用户错误的确信。我真实踩过这个坑:门头照预览最初没有显示实际的裁剪框,商家上传了一张居中构图的照片,实际展示时主体被裁掉了一半,他反复换图也不明白为什么。加上裁剪框之后这类问题就没有了。另外我还在预览之外做了一件配套的事:提交前汇总说明「本次改动中 X 项立即生效、Y 项进入审核、审核期间顾客看到的仍是当前值」——因为我踩过的另一个坑就是商家改完店名看到「保存成功」,以为立刻生效了,去顾客端一看没变,打电话说系统有 bug用户会用他自己的理解去填补你没说清的空白,而「保存成功」在他的理解里就等于「已经生效」。

没有匹配的内容,换个关键词试试。

项目拆解 · 商家后台常用页(Vue · 实习级)· 共 3 个模块 · 数字均为示例,需替换成自己项目的真实数据