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

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

实习级这一档是干什么的 权限模型的可视化配置、工作流编排画布、多租户数据看板这些核心台面,实习生大概率碰不到。这一档收的是企业管理后台里实习生真的会被分派、但仍然有明确技术含量的活。下面三个模块彼此独立——只做过一个就只写一个。
怎么讲才不显得 low 「我做了个成员管理页,能加人删人」和「管理员点移除的时候看不到这个人手上还有多少待处理的审批、他创建的数据会归谁;而且如果他把最后一个管理员也移除了,整个企业就没人能管了——这些都得在点下去之前告诉他」——同一件事,后者面试官会顺着追问。这一档的破解办法是认清「管理员的一次操作会影响他团队里的所有人,而他看不到那些人的处境」:移除成员、改通知模板、改登录策略,都是一个人操作、一群人受影响。
三条自检 一、能说出不这么做会怎样(不提示影响面会造成待办无人处理、不做防自锁管理员会把自己关在门外、模板不给预览客户改完不敢保存);二、能说出你踩过的具体坑;三、能说出量级(多少成员、多少席位、几个通知类型几个渠道)。三条都有就能写。
项目背景设定 面向企业的 SaaS 产品管理后台(PC Web),Vue 3 + TypeScript + Element Plus + Pinia。使用者是客户公司的系统管理员——通常是行政、人事或者兼职做这件事的技术负责人,不是我们的运营。
为什么这三块值得写 它们的技术含量来自「一个人操作、一群人受影响」这个特点:管理员移除一个成员、改一份通知模板、调一次登录策略,影响的是整个企业的所有成员,而他在操作界面上看不到那些人的处境。所以这三块共同要解决的是「把不可见的影响面变成可见的、把不可逆的操作变成可挽回的」——而不是把功能做出来。

模块一:成员与席位管理

  1. 成员与席位管理(席位三项账目可视化并对齐 + 成员状态与可用操作的显式对应 + 移除前的影响面清单 + 最后一名管理员的自锁防护)★★
    简历这样写 成员与席位管理页(Vue 3 + TypeScript + Pinia + 影响面预检接口):席位原仅显示「已用 / 总数」,管理员无法解释数字对不上(待激活邀请也占预期),改为已生效、待激活、剩余三项账目并列展示且相加等于配额,并在邀请入口就提示可能超出;成员状态从单一「正常」拆为待激活、正常、已停用显式对应各自可执行的操作(原先所有状态显示同一组按钮,点了才报错);移除或停用成员前调用影响面预检,展示其名下待处理审批、负责的流程节点、创建的数据并要求指定接手人,避免操作后出现无人处理的待办;对最后一名管理员加自锁防护(不可移除自己的管理员角色、不可停用最后一名管理员)并说明原因;角色变更后提示该成员需重新登录才完全生效,消除「改了权限但对方说没变化」的困惑。上线后成员管理类客户咨询明显减少。
    展开完整拆解
    为什么要这么设计

    成员管理页第一版就是一个表格加几个按钮:成员列表、邀请、移除、改角色。功能齐全,但客户的管理员用起来处处困惑,四个问题。

    一是席位数字对不上,管理员不理解。我显示的是「已用 8 / 共 10」。但他发了 5 份邀请还没人激活,所以他以为还能再邀请 2 个人——实际上如果那 5 个人都激活就超了他的反馈是「你们的席位数是不是算错了」,而实际是我少展示了一项。

    二是所有状态显示同一组按钮,点了才报错。成员有「待激活」「正常」「已停用」几种状态,但我给每一行都渲染了全部按钮。他对一个「待激活」的成员点「改角色」,点下去才报「该成员尚未激活」。这类无效点击每天发生很多次。

    三是移除成员之后出现一堆无人处理的待办。这是最严重的问题。一个成员手上可能有十几个待他审批的单、还是几个流程节点的负责人我的移除操作只是删了成员记录,那些待办就卡在那里没人能处理——客户过了一周才发现流程全堵了,来投诉。

    四是管理员把自己锁在了外面。有个客户的管理员为了「规范权限」,把自己的管理员角色改成了普通成员,而当时企业里只有他一个管理员结果整个企业没有人能进管理后台了,只能我们从后台介入处理。

    所以四个改动:席位改成「已生效 + 待激活 + 剩余」三项并列且相加等于配额成员状态与可执行操作显式对应移除前调影响面预检并要求指定接手人最后一名管理员加自锁防护,另外补了角色变更后的生效说明

    这个模块最想说的一句话是:管理后台的操作是「一个人点、一群人受影响」,而操作者在界面上看不到那群人的处境。管理员点「移除」的时候,他看到的只是一行数据;而实际发生的是十几个待办失去了处理人所以这类界面的核心工作不是把功能做出来,而是把不可见的影响面变成可见的——他不是想搞乱系统,他只是不知道。

    整体链路
    席位账目(三项必须相加等于配额) │ ├─ 已生效席位 已激活且未停用的成员数 ├─ 待激活占用 已发出未激活的邀请数(会占用预期席位) ├─ 剩余可用 配额 - 已生效 - 待激活 │ ├─ 三项并列展示且明确写出「三项相加等于配额」 │ 只显示「已用 / 总数」的后果 │ 管理员看不到待激活占用 → 以为还能邀请 → 激活时才超 │ 他的反馈会是「你们的席位数算错了」 │ ├─ 邀请入口处实时提示:本次邀请 N 人,剩余可用 M │ N 大于 M 时就提示,不要等激活失败 │ └─ 已停用成员是否占席位要明确标注 规则本身由业务定,但界面上必须说清 —— 否则数字又对不上 成员状态与操作的显式对应 │ ├─ 状态:待激活 · 正常 · 已停用 │ ├─ 每个状态只渲染它真正可用的操作 │ 待激活 → 重发邀请 · 撤回邀请 │ 正常 → 改角色 · 停用 · 移除 · 重置密码 │ 已停用 → 恢复 · 移除 │ ├─ 不可用的操作要隐藏或禁用并给出原因提示(悬浮说明) │ 全部渲染出来的后果:点了才报错,无效点击很多 │ └─ 状态要有明确的视觉区分,不只靠一个文字标签 移除与停用前的影响面预检(最重要的一环) │ ├─ 调预检接口,返回该成员名下的 │ 待处理的审批与任务数 │ 作为负责人的流程节点 │ 创建或拥有的数据(文档 · 项目 · 客户记录) │ 正在进行中的协作 │ ├─ 界面上逐项列出并要求指定接手人(可批量指定同一人) │ 不要求接手人的后果:待办卡住无人能处理,流程全堵 │ 客户可能一周后才发现 │ ├─ 无影响面时也要明确显示「无待处理事项」 │ 让管理员确信自己看到的是完整信息,而不是没查 │ └─ 区分「停用」与「移除」的语义并在界面上写清 停用:保留数据与归属,可恢复(人休假 · 待离职) 移除:解除归属关系,通常不可恢复 混为一谈的后果:他想临时禁用却做了不可逆的操作 自锁防护(真实发生过的事故) │ ├─ 不允许移除自己的管理员角色(若自己是最后一名管理员) ├─ 不允许停用或移除最后一名管理员 ├─ 拦下时要说明原因与正确做法(先指定另一名管理员) │ 只说「操作失败」的后果:他不知道为什么,会反复尝试 └─ 同理:不允许把自己从企业中移除 一个客户的管理员把自己改成普通成员,整个企业无人可管 角色变更的生效说明 ├─ 变更后提示「该成员需重新登录后完全生效」 ├─ 不提示的后果:管理员说改了、对方说没变化,双方都困惑 └─ 可提供「强制该成员重新登录」的操作(配合会话管理) 其他 ├─ 列表支持按状态 · 角色 · 部门筛选,筛选态可记住 ├─ 危险操作(移除 · 停用)要二次确认并回显成员姓名 └─ 操作结果要明确,失败要说明原因而非笼统报错
    分步拆解
    1. 席位要拆成「已生效 + 待激活 + 剩余」三项并列展示。只显示「已用 / 总数」的后果是管理员看不到待激活占用,以为还能邀请,激活时才超——而他的反馈会是「你们的席位数算错了」。
    2. 要在界面上明确写出「三项相加等于配额」。让管理员能自己验算,数字能对上他才会信。
    3. 邀请入口要实时提示「本次邀请 N 人、剩余可用 M」。N 大于 M 时就提示,不要等激活失败才让他知道。
    4. 已停用成员是否占席位必须在界面上标注清楚。规则由业务定,但不说清的话数字又对不上了。
    5. 每个成员状态只渲染它真正可用的操作。全部渲染的后果是点了才报错,无效点击每天发生很多次。
    6. 不可用的操作要隐藏或禁用并给出原因提示。只是禁用不说原因,管理员会以为是系统坏了。
    7. 移除与停用前必须调影响面预检。这是这个模块最重要的一环——成员手上可能有十几个待审批的单、还是几个流程节点的负责人。
    8. 影响面要逐项列出并要求指定接手人。不要求接手人的后果是待办卡住无人能处理、流程全堵,而客户可能一周后才发现。
    9. 无影响面时也要明确显示「无待处理事项」。让管理员确信自己看到的是完整信息,而不是系统没查。
    10. 「停用」和「移除」的语义要在界面上写清并做区分。停用保留数据可恢复(休假、待离职),移除解除归属通常不可逆。混为一谈的后果是他想临时禁用却做了不可逆的操作。
    11. 要有自锁防护:不允许移除或停用最后一名管理员、不允许自己降级为普通成员(当自己是最后一名管理员时)。这是真实发生过的事故——一个客户的管理员把自己改成普通成员,整个企业无人可管,只能我们从后台介入。
    12. 拦下时要说明原因与正确做法(先指定另一名管理员)。只说「操作失败」的话他不知道为什么,会反复尝试。
    13. 角色变更后要提示「该成员需重新登录后完全生效」。不提示的后果是管理员说改了、对方说没变化,双方都困惑,最后来问客服。
    14. 可以提供「强制该成员重新登录」的操作。配合会话管理,让权限变更能立刻生效。
    15. 危险操作要二次确认并回显成员姓名。回显姓名很重要——防的是他在列表里点错了行。
    16. 列表筛选态要能记住。管理员常用的视图(比如只看待激活)不该每次重选。
    17. 操作失败要说明具体原因。「席位不足」「该成员有未交接事项」比「操作失败」有用得多。
    关键决策与取舍

    影响面预检做成「必须指定接手人才能移除」而不是「只提示不强制」。只提示的话管理员会直接跳过(他急着处理离职交接,不会仔细看)。强制指定的代价是移除操作变慢、多了一步判据是「跳过这一步的后果是否可挽回」:待办无人处理会导致流程堵塞、而且发现得很晚(客户一周后才知道),补救时还要一个个手工转派——所以值得强制。但我留了一个出口:如果影响面为空就不需要指定接手人,让没有交接负担的情况保持顺畅。

    自锁防护选「事前拦截」而不是「事后由我们从后台修复」。后台修复的路径是存在的(我们能改数据),但它意味着客户在一段时间内完全无法管理自己的企业,而且要走客服工单、等我们响应事前拦截的代价是极少数合法场景也被挡住(比如企业真的要把管理员权限全部交出去)——但那个场景的正确做法本来就是「先加新管理员、再移除自己」,拦截提示里也是这么写的。

    停用与移除保持为两个操作,而不是合并成一个「禁用」。合并能简化界面,但它们的可逆性完全不同:停用是可恢复的临时状态,移除通常不可逆。合并的后果是管理员想临时禁用却做了不可逆的操作判据是「这两个操作的后果是否有本质差异」:有,那就不能为了界面简洁而合并。

    席位三项账目并列,而不是只显示一个「剩余可用」。只显示剩余最简洁,但管理员会问「为什么剩这么少」,而他没法自己核对三项并列且相加等于配额,让他能自己验算——能验算的数字才可信。代价是界面上多了两个数字。

    踩过的坑一:移除成员只删了成员记录,待办全部卡住。客户过了一周发现流程全堵了才来投诉,而那时要一个个手工转派教训是:删除一个「参与者」之前,必须先问清楚「有什么东西依赖他」——这和「删除数据前要检查引用」是同一类思维,只是这里的引用是待办、流程节点和数据归属。我当时的思路完全停留在「移除就是删一条成员记录」上。

    踩过的坑二:管理员把自己降成普通成员,整个企业无人可管。只能我们从后台介入。教训是:涉及权限的操作,要专门检查「操作之后系统是否还处于一个可管理的状态」——这类「把自己锁在门外」的场景在权限系统里很典型(删掉最后一个管理员、删掉自己的唯一角色、把唯一的登录方式关掉),它们的共同点是每一步单独看都合法,组合起来才出问题。

    踩过的坑三:所有状态渲染同一组按钮,点了才报错。客户的反馈不是「有 bug」,而是「你们这个后台怎么点什么都失败」——他对整个产品的印象受损了。教训是:能在渲染时就确定不可用的操作,不要留到点击时才拒绝;而且禁用要给原因,否则他会以为是系统故障。

    没做的部分:没做批量成员导入(粘贴或上传通讯录批量邀请)。客户提过,尤其是初次开通时要加几十人但它需要处理逐行校验、部分失败、席位批量占用的冲突,而当前客户的规模下逐个邀请还能接受。我把它作为后续需求提出,并给了「初次开通场景的邀请次数」作为优先级依据。

    数字是怎么测的

    核心指标是「成员管理类客户咨询工单数」,并按原因分类。「席位数字对不上」「操作点了报错」「移除后待办没人处理」「改了权限没生效」各占多少。分类之后才能说明每个改动解决了什么,只报总数说明不了。

    席位账目一致性是断言型用例:构造有待激活邀请的场景,断言三项数字相加等于配额;邀请数超过剩余时断言给出提示。

    状态与操作对应:三种状态各准备一条数据,断言渲染出的可用操作集合正确、不可用操作被隐藏或禁用且有原因提示。

    影响面预检:构造一个有待办和数据归属的成员,断言预检返回的各项数量正确、界面逐项展示、未指定接手人时不允许提交;再构造一个无影响面的成员,断言显示「无待处理事项」且可直接移除。

    自锁防护:企业内只有一名管理员时,断言不能移除他、不能停用他、不能把他降级,且拦下时给出了正确做法的说明这条要用真实的单管理员数据测。

    无效点击的减少可以用埋点衡量:报「操作失败次数」的下降。这个数字直接对应「按钮该不该渲染」这个改动,比问卷更客观。

    二次确认回显:断言确认弹层里显示的是被点击那一行的成员姓名。这条防的是点错行,很容易在重构时被破坏。

    不要报什么:不要报「管理效率提升」——没有明确的度量方式。该报的是「按原因分类的咨询工单下降」「席位三项相加等于配额」「三种状态的可用操作集合正确」「无接手人时不允许移除」「单管理员时自锁防护生效」这几件可核对的事。

    面试追问
    Q:成员管理页就是个增删改查表格,你觉得难点在哪? A:难点在于「管理员点一下、一群人受影响,而他在界面上看不到那群人的处境」。我踩的两个坑都是这个原因。第一个:移除成员时我只删了成员记录——但那个人手上可能有十几个待他审批的单,还是几个流程节点的负责人,移除之后这些待办就卡在那里没人能处理。客户过了一周发现流程全堵了才来投诉,那时要一个个手工转派。修法是移除前调影响面预检,把他名下的待处理审批、负责的流程节点、创建的数据逐项列出来,并要求指定接手人。而且我做成了强制指定而不是只提示——因为只提示的话管理员会直接跳过(他急着处理离职交接,不会仔细看),而跳过的后果发现得很晚、补救成本很高第二个坑更典型:一个客户的管理员为了「规范权限」把自己的管理员角色改成了普通成员,而当时企业里只有他一个管理员——整个企业没有人能进管理后台了,只能我们从后台介入。教训是:涉及权限的操作,要专门检查「操作之后系统是否还处于一个可管理的状态」。这类「把自己锁在门外」的场景在权限系统里很典型(删掉最后一个管理员、关掉唯一的登录方式),它们的共同点是每一步单独看都合法,组合起来才出问题——所以不能靠逐个操作的合法性校验,要专门做终态检查。所以我认为这类界面的核心工作不是把功能做出来,而是把不可见的影响面变成可见的——管理员不是想搞乱系统,他只是不知道。
    Q:席位就显示「已用 8 / 共 10」不够清楚吗?为什么要拆成三个数? A:因为「已用 8 / 共 10」这个显示会让管理员算错,而且他没法自己核对。具体的困惑是:他发了 5 份邀请还没人激活,看到「已用 8 / 共 10」就以为还能再邀请 2 个人——但如果那 5 个人都激活就超了。他的反馈是「你们的席位数是不是算错了」,而实际是我少展示了一项:待激活邀请也会占用预期席位。所以我改成三项并列:已生效席位、待激活占用、剩余可用,并且在界面上明确写出「三项相加等于配额」——能让他自己验算的数字才可信。另外在邀请入口处也实时提示「本次邀请 N 人,剩余可用 M」,N 大于 M 时立刻提示,不要等激活失败才让他知道还有一个容易被忽略的细节:已停用的成员是否占席位,规则本身由业务定,但界面上必须标注清楚——不说清的话数字又对不上了。代价是界面上多了两个数字,看起来不如一个「已用 / 总数」简洁。但我的判断是管理后台的首要目标是「让操作者理解系统状态」而不是界面简洁——他理解不了就会来问客服,那个成本更高。我在报效果时也是按原因分类统计咨询工单的,「席位数字对不上」这一类的下降才能归因到这个改动,只报总数说明不了什么。

模块二:通知模板编辑器

  1. 通知模板编辑器(变量以选择器插入不靠手打 + 按渠道的实时预览与长度计数 + 与默认模板的差异对比和一键恢复 + 测试发送形成验证闭环)★★
    简历这样写 通知模板编辑器(Vue 3 + 变量选择器 + 实时预览 + 差异对比):模板变量原为手工输入(拼错要到发送时才发现),改为从当前通知类型的可用变量列表点击插入并对已插入变量做标记化展示与整体删除,避免手改导致残缺;编辑区右侧提供按渠道的实时预览(用样例数据渲染,短信渠道同步展示按实际字符计数的长度与分条提示,邮件展示标题与正文,站内展示卡片形态),解决管理员改完不知道效果的问题;提供与系统默认模板的差异对比与一键恢复默认,让客户敢于修改(原先改坏了只能凭记忆改回去);支持测试发送到操作人自己,因为预览无法反映渠道本身的呈现差异;保存前就地校验并定位到具体位置(未知变量、超长、缺少必需项),不再由后端返回一条笼统错误;离开时对未保存内容做拦截。上线后模板配置的客户咨询与配错后求助明显减少。
    展开完整拆解
    为什么要这么设计

    后端把通知模板做成可配置之后,我负责前端的编辑界面。第一版就是一个文本域加一个保存按钮,旁边列出可用的变量名让客户自己抄。四个问题。

    一是变量手打必然拼错。我把可用变量列在旁边,客户照着敲进文本域大小写错、少一个字符、把中间的分隔符打错——这些都会导致变量取不到值。而且他自己看不出错在哪(看起来是对的)。

    二是改完不知道效果,客户不敢保存。模板里是变量占位符,他看到的是一堆标记,想象不出真实发出去是什么样尤其是短信——他不知道会不会超长被分成两条(那要多收一条的钱)。所以他改完之后的做法是:找我们的客服,问「我这样改对不对」。

    三是改坏了回不去。没有默认模板的参照,他把原来的文案删掉之后就找不回来了。有个客户把整段正文清空保存了,然后来问「你们原来的文案是什么,我想改回去」。

    四是校验错误只有一条笼统提示。后端返回「模板校验失败」,我原样弹出来。客户不知道是哪个变量不对、不知道是哪一行超长了。

    所以四个改动:变量改成从列表点击插入并做标记化展示加按渠道的实时预览与短信长度计数加与默认模板的差异对比和一键恢复默认保存前就地校验并定位到位置,另外补了测试发送未保存离开拦截

    这个模块最想说的一句话是:模板编辑器的特殊之处在于「编辑的人看不到最终结果」——他改的是带占位符的模板,而收到的人看到的是渲染后的文案。这个错位是所有困惑的来源:他不知道会不会超长、不知道变量取不到值、不知道排版成什么样。所以这类编辑器的核心不是编辑能力,是「把最终结果尽早呈现给他」——预览解决大部分,测试发送补上预览覆盖不到的渠道差异。

    整体链路
    变量插入(不让他手打) │ ├─ 右侧列出当前通知类型的可用变量(带中文说明与示例值) │ 变量清单按通知类型来 —— 审批类和登录提醒类的变量不同 │ ├─ 点击即插入到光标位置,不需要手工输入 │ 手打的后果:大小写错 · 少字符 · 分隔符错 → 取不到值 │ 而他自己看不出错在哪(看起来是对的) │ ├─ 已插入的变量做标记化展示(视觉上是一个整体) │ 并支持整体删除,避免手改改出残缺的占位符 │ └─ 搜索变量(清单长时逐个找很慢) 按渠道的实时预览(解决「看不到最终结果」) │ ├─ 渠道切换:邮件 · 短信 · 站内 · 企业办公平台 │ 同一通知类型在不同渠道是不同的模板,要分别编辑 │ ├─ 预览用样例数据渲染(每个变量都有预置示例值) │ 样例值要贴近真实(长度接近真实数据,否则看不出超长) │ ├─ 邮件预览:标题 + 正文,按邮件容器宽度呈现 │ ├─ 短信预览:渲染后的完整文本 + 实际字符计数 + 分条提示 │ 短信按字符计数且中英文规则不同,要按实际规则算 │ 他最关心的是「会不会分成两条」(要多花钱) │ ├─ 站内预览:按通知卡片的真实样式与截断规则 │ └─ 预览要复用真实的渲染约束(截断位置 · 行数 · 容器宽度) 做个大概样子没用 —— 关键正是让他看到「会被截断」 与默认模板的差异对比(让他敢改) │ ├─ 并排展示:系统默认模板 │ 当前编辑内容 │ ├─ 标出差异段落,让他知道自己改了什么 │ ├─ 一键恢复默认(恢复前二次确认) │ 没有这个的后果:改坏了找不回来 │ 有客户把正文清空保存后来问「你们原来的文案是什么」 │ └─ 保留最近若干个历史版本可回退(比只能恢复默认更实用) 保存前的就地校验 │ ├─ 前端先校验:未知变量 · 长度超限 · 缺少必需项(签名 · 退订说明) │ 定位到具体位置并高亮,而不是弹一条笼统错误 │ ├─ 提交后端再做一次权威校验(前端校验不可替代) │ └─ 后端返回的错误也要映射到编辑器里的位置 原样弹出「模板校验失败」的后果:客户不知道改哪 测试发送(预览覆盖不到的部分) │ ├─ 发给操作人自己,真实走渠道 │ 预览无法反映:邮件客户端的渲染差异 · 短信实际分条 · 推送折叠 │ ├─ 测试发送标记为测试,不计入配额与统计 │ └─ 发送后给出结果与失败原因(渠道未配置 · 地址无效) 其他 ├─ 未保存内容离开拦截(有变更才拦) ├─ 编辑中自动保存草稿(客户可能被打断) └─ 启用与停用状态明确,停用时说明「将使用默认模板」
    分步拆解
    1. 变量必须从列表点击插入,不能让客户手打。手打的后果是大小写错、少字符、分隔符错,导致变量取不到值,而他自己看不出错在哪。
    2. 变量清单要按通知类型来,并带中文说明与示例值。审批类和登录提醒类的可用变量不同,列出全部变量会让他用上取不到值的那些。
    3. 已插入的变量要标记化展示并支持整体删除。否则他手改会改出残缺的占位符,而残缺的占位符会直接渲染成字面量出现在通知里。
    4. 变量清单长时要能搜索。逐个找很慢,而他通常知道自己要什么。
    5. 预览必须按渠道分别呈现。同一通知类型在邮件、短信、站内是不同的模板,格式要求差别很大。
    6. 预览的样例值长度要贴近真实数据。用「张三」这种短值预览,看不出真实姓名或标题会不会导致超长。
    7. 短信预览必须显示实际字符计数与分条提示。这是客户最关心的——分成两条要多花一条的钱,而他在模板里看不出来。
    8. 字符计数要按短信的实际规则算,中英文规则不同。按字符串长度简单算会算错。
    9. 预览要复用真实的渲染约束(截断位置、行数、容器宽度)。做个大概样子没用——关键正是让他看到「会被截断」。
    10. 要提供与系统默认模板的并排差异对比。让他知道自己改了什么,也让他有一个参照。
    11. 要有一键恢复默认(带二次确认)。没有这个的后果是改坏了找不回来——有客户把正文清空保存后来问「你们原来的文案是什么」。
    12. 保留最近若干个历史版本可回退,这比只能恢复默认更实用。因为他往往想回到「上一版我自己的模板」而不是系统默认。
    13. 前端要先做就地校验并定位到位置高亮。未知变量、超长、缺少必需项。弹一条笼统错误的后果是客户不知道改哪。
    14. 前端校验不能替代后端校验。后端是权威,而且长度规则、必需项要求可能变化。
    15. 后端返回的错误也要映射到编辑器里的位置。原样弹出后端文案是最省事但最没用的做法。
    16. 要提供测试发送,因为预览覆盖不到渠道本身的呈现差异。邮件客户端的渲染差异、短信实际分条、推送折叠——这些只有真发一次才看得出来。
    17. 测试发送要标记为测试且不计入配额与统计。否则他多试几次配额就被吃掉了。
    18. 未保存内容离开要拦截(有变更才拦),并自动保存草稿。客户在编辑时可能被打断。
    19. 停用模板时要说明「将使用默认模板」。不说的话他不知道停用之后通知是不发了还是发默认的。
    关键决策与取舍

    变量做成「点击插入 + 标记化展示」而不是纯文本输入。纯文本最简单、也最灵活(他可以随意编辑)。但灵活带来的是拼错——而拼错的后果只有在真实发送时才暴露,那时通知可能已经发不出去或者渲染出字面量标记化的代价是实现复杂(要处理光标位置、整体删除、复制粘贴)判据是「这个自由度带来的错误能不能被及时发现」:不能,那就该限制自由度、用交互替代输入。

    预览用「前端复用真实渲染约束」而不是「调后端渲染接口」。调后端最真实,但预览需要在编辑过程中实时更新(每敲一个字都要看效果),频繁请求不现实;而且未保存的模板后端还没有。前端渲染的代价是约束要在两边保持一致——缓解办法是把关键约束(截断字数、行数、短信计数规则)抽成共享配置,而不是在预览里写死。这一条必须做,因为预览不准比没有预览更糟——它给了客户错误的确信。

    同时提供预览和测试发送,而不是只做一个。预览快、可实时,但覆盖不到渠道本身的呈现差异(不同邮件客户端渲染不同、短信实际分条、推送在锁屏上的折叠)。测试发送真实,但慢、且要占用发送能力两者是互补关系:预览覆盖高频的即时反馈,测试发送覆盖最后一次确认只做预览的问题是客户在真实发送后才发现渠道层面的问题;只做测试发送的问题是每改一个字都要发一条,用不起来。

    历史版本回退比「只能恢复默认」更值得做。恢复默认实现简单,但客户的真实需求往往是「回到我上一版自己写的」而不是「回到系统默认」——他改了几次之后想撤销最后一次。代价是要存历史版本。判据是「用户真正想回到哪个状态」,而不是「哪个状态最容易提供」。

    踩过的坑一:变量让客户手打,大量配错。而且错误只在真实发送时暴露——他配完保存成功,以为没问题,几天后某个通知发出去带着字面量的占位符教训是:当一个输入的正确性无法被用户自己验证时,就不该让他输入,而应该让他选择。这个原则我后来用在了很多地方(选日期不手填、选枚举不输入编码)。

    踩过的坑二:只给了模板编辑框没给预览,客户改完来问客服「我这样改对不对」。客服也不确定,只能转给我,我手工渲染一遍告诉他这个来回发生了很多次之后我才意识到:模板编辑器的特殊之处是「编辑的人看不到最终结果」——他改的是带占位符的模板,收到的人看到的是渲染后的文案,这个错位是所有困惑的来源。加了预览之后这类咨询几乎消失。

    踩过的坑三:客户把正文清空保存了,然后来问「你们原来的文案是什么」。我当时只能去代码里翻默认文案发给他。教训是:任何允许用户覆盖系统默认值的地方,都必须提供「看到默认值」和「恢复默认值」两件事——否则覆盖就是一个单向操作,而用户不知道自己在做单向操作。

    没做的部分:没做富文本编辑(邮件正文的排版、插入图片)。客户提过想让邮件更好看但富文本会带来标记安全问题(要过滤)、以及不同邮件客户端的兼容性问题,而且和后端「受限渲染」的设计冲突。我做的是提供有限的格式(分段、加粗、链接),并说明原因——把能力边界讲清楚,比默默做一个半成品要好。

    数字是怎么测的

    核心指标是「模板配置相关的咨询与求助工单数」。其中「我这样改对不对」和「帮我恢复原文案」这两类是最直接对应本模块改动的,要单独拆出来报。

    配错率可以用后端的保存校验拒绝数来衡量:变量插入器上线后,「未知变量」类的拒绝应显著下降。这个数字比工单更客观。

    预览准确性必须验证:取若干真实模板与真实数据,对比预览渲染与实际发送内容的一致性(截断位置、行数、短信分条数)这条是必须做的——预览不准比没有预览更糟。

    短信字符计数的正确性用断言型用例:纯中文、纯英文、中英混排、含特殊字符,断言计数与分条提示与实际发送一致这条要和渠道的实际规则核对,不能自己算。

    变量插入与标记化:断言点击插入的位置正确、整体删除不留残缺、复制粘贴后仍能被识别。最后一条容易漏。

    就地校验:提交含未知变量的模板,断言前端拦下并高亮到具体位置;后端返回的错误也能映射到位置。

    恢复与回退:断言一键恢复默认可用且有二次确认;断言历史版本可回退到指定版本。

    测试发送:断言真实走渠道、发给操作人、标记为测试、不计入配额。

    不要报什么:不要报「模板配置成功率」——没有明确分母。该报的是「『我这样改对不对』类咨询工单的下降」「后端未知变量拒绝数的下降」「预览与实际发送内容一致(含短信分条数)」「字符计数在四类文本上与渠道规则一致」这几件可核对的事。

    面试追问
    Q:模板编辑器就是一个文本框加保存,为什么要做变量选择器和预览? A:因为模板编辑器有一个特殊之处:编辑的人看不到最终结果。他改的是带占位符的模板,而收到通知的人看到的是渲染后的文案——这个错位是所有困惑的来源。我第一版就是一个文本域加旁边列出可用变量让客户自己抄,踩了三个坑。第一,变量手打必然拼错:大小写错、少一个字符、分隔符打错——这些都导致变量取不到值,而他自己看不出错在哪(看起来是对的),错误只在真实发送时才暴露。所以改成从列表点击插入,并把已插入的变量做标记化展示、支持整体删除(避免手改改出残缺占位符)。我总结的原则是:当一个输入的正确性无法被用户自己验证时,就不该让他输入,而应该让他选择。第二,改完不知道效果,客户不敢保存——他的实际做法是找客服问「我这样改对不对」,客服也不确定,只能转给我,我手工渲染一遍告诉他。这个来回发生了很多次。尤其是短信,他最关心「会不会超长分成两条」(要多花钱),而在模板里根本看不出来——所以短信预览要显示按实际规则计算的字符数和分条提示。第三,改坏了回不去:有客户把正文清空保存了,然后来问「你们原来的文案是什么」。教训是:任何允许用户覆盖系统默认值的地方,都必须同时提供「看到默认值」和「恢复默认值」——否则覆盖就是一个单向操作,而用户不知道自己在做单向操作。
    Q:有了实时预览,为什么还要做测试发送? A:因为预览覆盖不到渠道本身的呈现差异,而这些差异恰恰是客户最后会被坑到的地方。具体有三类:邮件在不同客户端的渲染不一致(同一份内容在不同邮箱里排版可能不同)、短信的实际分条(我按规则计算,但运营商的实际处理可能有差别)、推送在锁屏上的折叠位置(前多少个字可见)。这些只有真发一次才看得出来。所以预览和测试发送是互补的,不是替代关系:预览快、可实时更新,覆盖高频的即时反馈(他每敲一个字都能看效果);测试发送真实,覆盖最后一次确认只做预览的问题是客户在真实发送后才发现渠道层面的问题;只做测试发送的问题是每改一个字都要发一条,用不起来。关于预览我还想说一个必须做的细节:预览必须复用真实的渲染约束——截断字数、行数限制、容器宽度、短信计数规则,而且这些约束要抽成前后端共享的配置而不是在预览里写死。因为预览不准比没有预览更糟——它给了客户错误的确信。我在验证时专门做了一条:取真实模板和真实数据,对比预览渲染与实际发送内容的一致性(截断位置、行数、短信分条数)另外测试发送有两个容易漏的细节:要标记为测试并且不计入配额与统计(否则客户多试几次配额就被吃掉),以及发送失败要给出具体原因(渠道未配置、地址无效)而不是笼统报错。

模块三:登录安全设置

  1. 登录安全设置(策略变更对现有成员的影响预告 + 访问限制的自锁防护与试运行回滚 + 在线会话列表与强制下线 + 高危变更的二次验证与留档)★★★
    简历这样写 企业登录安全设置页(Vue 3 + 影响面预检 + 试运行机制 + 会话管理):密码策略、二次验证、访问限制原为保存即全员生效且无任何预告,改为保存前展示影响面预告(多少现有成员的密码不满足新策略、多少人尚未绑定二次验证、启用后他们下次登录会发生什么)并可选择宽限期而非立即阻断;访问 IP 限制加自锁防护——校验当前操作者 IP 是否在新规则内、不在则明确拦下,并提供试运行模式(先只记录不拦截,确认命中情况正确后再正式启用)与定时自动回滚(启用后若管理员在窗口内未确认则自动恢复原规则),避免规则填错导致全员无法登录;新增在线会话列表(设备、位置、最近活跃)支持单条或全部强制下线,配合成员离职与权限变更;对安全设置这类高危变更要求二次验证并留档(操作人、时间、变更前后值),同时通知全部管理员。上线后未再出现因安全设置误配导致的无法登录工单。
    展开完整拆解
    为什么要这么设计

    登录安全设置页第一版就是几个开关和输入框:密码最小长度、是否要求复杂度、是否强制二次验证、允许登录的 IP 段。保存即生效。四个问题,其中两个造成了真实事故。

    一是 IP 限制填错,全公司登不进来。有个客户的管理员想限制只有公司网络能登录,他填了一个 IP 段,但填错了(写成了内网地址,而实际出口 IP 是另一个)。保存生效后包括他自己在内所有人都被拦在外面——他连管理后台都进不去,没法把这个规则改回来。最后是走客服工单、我们从后台改数据恢复的,期间客户停工了一段时间。

    二是密码策略变更立即阻断,成员集体登不进。管理员把密码最小长度调高了,保存后所有密码不满足新策略的成员在下次登录时被要求强制改密码。这本身是合理的,但问题是管理员完全不知道会影响多少人——他以为是「以后新设的密码要更长」,结果第二天一早几十个人同时被要求改密码,前台被投诉淹没。

    三是强制二次验证一开就把人挡在外面。大部分成员还没绑定二次验证方式,开关一开他们就登不进来了。而绑定过程需要引导,没有宽限期的话所有人都卡在登录页。

    四是没有会话管理,权限变更不能立刻生效。成员离职、角色降级之后,他已经登录的会话还在,还能继续操作。管理员问「怎么让他立刻退出」,我答不上来。

    所以四个改动:策略变更前展示影响面预告并可选宽限期IP 限制加自锁防护、试运行模式与定时自动回滚加在线会话列表与强制下线高危变更要求二次验证并留档通知

    这个模块最想说的一句话是:安全设置这类功能的最大风险不是「配得不够严」,而是「配错了把自己人挡在外面」——而后者恰恰是最容易发生的。管理员开这些开关是出于好意(想更安全),但他不知道现状(多少人不满足新策略)、也不知道自己填的规则对不对所以这类界面必须提供三件事:告诉他现状、让他能先试不生效、以及万一错了能自动恢复。

    整体链路
    影响面预告(保存前告诉他现状) │ ├─ 密码策略变更 → 预检返回 │ 不满足新策略的成员数 │ 他们下次登录会发生什么(强制改密 / 提示但可继续) │ ├─ 强制二次验证 → 预检返回尚未绑定的成员数 │ 直接启用的后果:这些人立刻登不进来,全部卡在登录页 │ ├─ 访问限制 → 预检返回按近期登录记录估算的受影响人数 │ 「按新规则,近 N 天有 M 人的登录会被拒绝」 │ 这个估算比任何文字说明都有说服力 │ └─ 提供宽限期选项而不是只能立即生效 宽限期内:提示但不阻断,到期后才强制 没有宽限期的后果:第二天一早几十人同时被要求改密码 访问限制的自锁防护(真实事故的修法) │ ├─ 校验当前操作者的出口 IP 是否在新规则内 │ 不在 → 明确拦下并显示「你当前的 IP 是 X,不在新规则内」 │ 显示当前 IP 很关键 —— 管理员通常不知道自己的出口 IP │ ├─ 试运行模式:先只记录不拦截 │ 观察一段时间的命中情况(谁会被拒绝) │ 确认无误后再正式启用 │ ├─ 定时自动回滚:正式启用后进入确认窗口 │ 窗口内管理员需再次确认「我仍能正常访问」 │ 未确认则自动恢复原规则 │ 这一条是最后的兜底 —— 即使前两道都被绕过也不会锁死 │ └─ 永久放行一条应急通道或保留一个不受限的超级管理员入口 具体方案由安全侧定,但界面上要让管理员知道有救 在线会话管理 │ ├─ 列表展示:成员 · 设备与浏览器 · 大致位置 · 登录时间 · 最近活跃 │ ├─ 支持单条下线与该成员全部下线 │ 配合成员离职、角色降级 —— 让权限变更立刻生效 │ ├─ 位置信息只做粗粒度展示并说明是估算 │ 写得太精确会造成误解(也涉及隐私) │ └─ 异常会话提示(异地 · 新设备),但不要误报太多 误报多了管理员就不看了 高危变更的处理 │ ├─ 保存前二次确认,并回显「变更前 → 变更后」 │ ├─ 要求操作者完成一次二次验证(证明是本人) │ 安全设置本身被篡改的危害最大 │ ├─ 变更留档:操作人 · 时间 · 变更项 · 前后值 · 来源 IP │ └─ 通知全部管理员(而不只是操作者) 让其他管理员知道有人改了安全设置 —— 互相监督 界面上的其他要点 ├─ 每项设置旁写清「开启后会发生什么」,不要只写设置名 ├─ 危险度高的项在视觉上区分,不要和普通设置混排 └─ 未保存变更离开拦截
    分步拆解
    1. 策略变更前必须展示影响面预告。管理员以为「以后新设的密码要更长」,实际是第二天一早几十个人同时被要求改密码——他不知道现状,我们知道,就该告诉他。
    2. 预告要说清「他们下次登录会发生什么」。强制改密还是提示但可继续,这两种后果完全不同。
    3. 强制二次验证的预告要给「尚未绑定的成员数」。直接启用的后果是这些人立刻登不进来、全部卡在登录页。
    4. 访问限制的预告要按近期登录记录估算受影响人数。「按新规则,近 N 天有 M 人的登录会被拒绝」——这个估算比任何文字说明都有说服力。
    5. 要提供宽限期选项,不能只有立即生效。宽限期内提示但不阻断,到期后才强制,让成员有时间自己处理。
    6. 访问限制要校验当前操作者的出口 IP 是否在新规则内。不在就明确拦下——这是防自锁的第一道。
    7. 拦下时要显示「你当前的 IP 是 X,不在新规则内」。显示当前 IP 很关键——管理员通常不知道自己的出口 IP 是什么,我们踩的坑就是他填了内网地址而实际出口是另一个。
    8. 要提供试运行模式:先只记录不拦截。观察一段时间谁会被拒绝,确认无误后再正式启用——这是第二道防护。
    9. 正式启用后要有确认窗口与定时自动回滚。窗口内管理员需再次确认「我仍能正常访问」,未确认则自动恢复原规则。这是最后的兜底——即使前两道都被绕过也不会锁死。
    10. 要让管理员知道「万一锁死了有救」。应急通道或不受限的入口,具体方案由安全侧定,但界面上要说明,否则他不敢开这个功能。
    11. 要有在线会话列表并支持强制下线。成员离职、角色降级后他已登录的会话还在、还能继续操作——没有这个功能管理员束手无策。
    12. 支持「该成员全部下线」而不只是单条。离职场景要一次清干净。
    13. 位置信息只做粗粒度展示并说明是估算。写得太精确会造成误解,也涉及成员隐私。
    14. 异常会话提示要控制误报。误报多了管理员就不看了,这个功能就等于没有。
    15. 高危变更保存前要二次确认并回显「变更前 → 变更后」。让他看清自己改了什么。
    16. 要求操作者完成一次二次验证。安全设置本身被篡改的危害最大,所以改它需要更强的身份证明。
    17. 变更要留档(操作人、时间、变更项、前后值、来源 IP)并通知全部管理员。通知其他管理员而不只是操作者,形成互相监督。
    18. 每项设置旁要写清「开启后会发生什么」,不要只写设置名。管理员不是安全专家,「强制二次验证」这个名字他懂,但后果他不一定想得到。
    19. 危险度高的项要在视觉上区分,不要和普通设置混排。让他知道哪些是要谨慎的。
    关键决策与取舍

    访问限制做三道防护(当前 IP 校验 + 试运行 + 定时回滚)而不是只做一道。看起来重复,但三道防的是不同情况:当前 IP 校验防「管理员填错自己的 IP」;试运行防「规则本身写得不对、会拦到其他成员」;定时回滚防「前两道都通过了但仍然出了意外」(比如他确认时用的是公司网络,回家后发现自己也进不来了,而那时已经没有别人能改)判据是「这个操作错了的后果有多严重、恢复有多难」:全员无法登录、且连管理后台都进不去,恢复只能靠我们从后台改数据——这个代价足够高,值得叠三道。

    定时自动回滚而不是「永久生效直到人工修改」。自动回滚有一个副作用:管理员如果只是忘了确认,规则就被撤销了,他会疑惑「我明明开了怎么没生效」缓解办法是回滚时明确通知他并说明原因、以及在启用时就把确认要求讲清楚。我认为这个副作用可以接受,因为「设置没生效」是可发现可重试的,而「全员锁死」是不可自救的——两类错误的代价完全不对称。

    影响面预告用「按近期登录记录估算」而不是精确计算。精确计算不可能(未来谁在哪登录不确定)。估算的价值是给管理员一个量级感——「有 M 人会被拒绝」和「可能有人会被拒绝」的说服力完全不同关键是把「这是按近 N 天记录的估算」说清楚,不要让他以为是精确的。

    宽限期做成可选而不是强制。有些客户确实需要立即生效(安全事件应急),强制宽限期会挡住这个正当场景做成可选并把宽限期设为默认选项——默认安全,例外可控。这一条和「新词默认灰度但留紧急启用」是同一个模式。

    踩过的坑一:客户管理员填错 IP 段,全公司包括他自己都登不进来。他填的是内网地址,而实际出口 IP 是另一个最严重的是他连管理后台都进不去,没法把规则改回来——只能走客服工单、我们从后台改数据恢复,期间客户停工。教训是:任何「限制访问」的设置,都必须先检查「设置者自己还能不能访问」。而且我发现一个很实际的点:管理员通常不知道自己的出口 IP 是什么,所以拦下时要把当前 IP 显示给他——这个信息比任何错误提示都有用。

    踩过的坑二:密码策略变更立即全员生效,第二天一早几十人同时被要求改密码。客户的前台被投诉淹没,管理员来投诉我们「为什么不提前说」而他自己就是操作者——问题在于他以为改的是「以后新密码的规则」。教训是:设置项的名字描述的是「规则」,但用户需要知道的是「对现有数据和现有人的影响」——这两者之间的落差必须由界面来填补,不能指望他自己推导。

    踩过的坑三:没有会话管理,成员降权后旧会话还能继续操作。管理员问「怎么让他立刻退出」,我答不上来教训是:权限变更的「立刻生效」需要会话层面的配合——改了角色不等于改了他当前的登录态。这也是我在成员管理页加「角色变更后需重新登录」提示的原因,两个模块是同一个问题的两个面。

    没做的部分:没做单点登录与企业身份源对接。它是很多中大型客户的硬需求,但涉及协议对接、身份映射、账号生命周期同步,是一个独立的项目而不是这个页面的一个开关。我在这个页面上预留了入口位置并标注「规划中」,避免客户以为我们不支持而直接放弃。

    数字是怎么测的

    核心指标是「因安全设置误配导致的无法登录工单数」。这是最直接的对应。报法要说明统计区间与工单分类方式,并诚实说明这类事故本身低频——低频但影响大的问题,报「上线后未再发生」比报百分比更合适。

    自锁防护要用断言型用例逐道验证:用不在新规则内的 IP 提交,断言被拦下且显示了当前 IP;试运行模式下断言只记录不拦截;启用后不确认,断言到期自动恢复原规则并通知了管理员第三条要用可控时间点测。

    影响面预告的准确性:构造已知的成员密码状况,断言预告的「不满足新策略人数」与实际一致;访问限制的估算要说明是基于近 N 天记录,断言统计口径正确。

    宽限期:断言宽限期内提示但不阻断登录、到期后强制。要用可控时间测两个阶段。

    会话管理:断言强制下线后该会话的后续请求被拒绝、需重新登录;断言「该成员全部下线」清掉了他的多个设备会话。

    高危变更:断言保存前要求二次验证、回显了变更前后值、产生了留档记录、通知了全部管理员(不只是操作者)。最后一条容易漏。

    留档完整性:断言记录包含操作人、时间、变更项、前后值、来源 IP 五项。

    不要报什么:不要说「安全性提升了」——安全性不是这个页面能单独度量的。该报的是「上线后未再发生安全设置误配导致的无法登录工单」「三道自锁防护逐一验证通过(含定时回滚)」「影响面预告人数与实际一致」「强制下线后旧会话立即失效」这几件可核对的事。

    面试追问
    Q:IP 白名单防自锁,做一道当前 IP 校验就够了吧?为什么要三道? A:因为三道防的是不同的情况,而这个操作出错的代价特别高——全员无法登录,且连管理后台都进不去,恢复只能靠我们从后台改数据。我们真实发生过:客户的管理员想限制只有公司网络能登录,他填了一个 IP 段但填错了(写成内网地址,而实际出口 IP 是另一个),保存生效后包括他自己在内所有人都被拦在外面,期间客户停工。第一道「校验当前操作者出口 IP 是否在新规则内」防的是这个——而且我发现一个很实际的点:管理员通常不知道自己的出口 IP 是什么,所以拦下时要把当前 IP 显示给他,这个信息比任何错误提示都有用。第二道「试运行模式」防的是另一种情况:他自己的 IP 在规则内,但规则写得不对会拦到其他成员——试运行先只记录不拦截,让他看清「按这个规则谁会被拒绝」。第三道「定时自动回滚」防的是前两道都通过了但仍出意外:比如他确认时用的是公司网络,回家后发现自己也进不来了,而那时已经没有别人能改。所以正式启用后进入一个确认窗口,窗口内他需要再次确认「我仍能正常访问」,未确认则自动恢复原规则。自动回滚有个副作用:如果他只是忘了确认,规则就被撤销了,他会疑惑「我明明开了怎么没生效」——缓解办法是回滚时明确通知并说明原因。我认为这个副作用可以接受,因为「设置没生效」是可发现可重试的,而「全员锁死」是不可自救的,两类错误的代价完全不对称。
    Q:管理员自己改的设置,出问题不是他的责任吗?为什么要我们做这么多兜底? A:从责任划分上说是他改的,但从结果上说损失是双方的——客户停工,我们要走工单、从后台改数据、还要承担关系损失。而且我认为把它归为「他的责任」会让我们错失一个重要的观察:他不是想搞乱系统,他是出于好意(想让公司更安全),但他缺三样信息第一,他不知道现状——把密码最小长度调高时,他以为改的是「以后新密码的规则」,实际是第二天一早几十个人同时被要求改密码,客户前台被投诉淹没设置项的名字描述的是「规则」,但用户需要知道的是「对现有数据和现有人的影响」,这两者之间的落差必须由界面来填补,不能指望他自己推导。第二,他不知道自己填的规则对不对——他不知道自己的出口 IP,也无法预判规则会拦到谁,所以需要试运行和影响面估算(「按新规则,近 N 天有 M 人的登录会被拒绝」,这个具体数字比任何文字说明都有说服力)。第三,他不知道错了怎么救——所以要有定时自动回滚,而且要在界面上告诉他有这个兜底,否则他不敢开这个功能(结果是安全能力闲置)。我总结的是:管理后台这类「一个人操作、一群人受影响」的界面,设计目标不是「阻止用户犯错」,而是「让用户在犯错前看到后果、在犯错后能自己恢复」。前者做不到(他有权限就一定能操作),后者才是我们能提供的价值。

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

项目拆解 · 企业管理后台(Vue · 实习级)· 共 3 个模块 · 数字均为示例,需替换成自己项目的真实数据