[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"knowledge-\u002Fapi\u002Fknowledge\u002Fteam-documents\u002F11":3,"knowledge-related-\u002Fknowledge\u002Fteam-documents\u002F11":517,"knowledge-series-\u002Fknowledge\u002Fteam-documents\u002F11":543},{"source":4,"connector":5,"page":6},"sqlite","better-sqlite3",{"path":7,"title":8,"description":9,"category":10,"tags":11,"date":14,"pinned":15,"draft":15,"body":16,"seo":513,"stem":514,"id":515,"extension":516},"\u002Fknowledge\u002Fteam-documents\u002F11","系统下单（重复单提示框）异常复盘","下单流程中重复单提示弹窗出现「闪烁后消失」或「未正常展示」的异常。复盘时间线、影响范围、根因（弹层无差别 closeAll）、修复方案与回归检查项，避免风控提示被误关闭。","团队文档",[12,13],"team","upload","2023-11-21",false,{"type":17,"value":18,"toc":498},"minimark",[19,23,27,31,34,37,46,49,78,81,104,107,113,120,127,152,155,233,236,239,261,264,275,278,284,287,336,339,360,363,366,430,433,477,480],[20,21,8],"h1",{"id":22},"系统下单重复单提示框异常复盘",[24,25,26],"h2",{"id":26},"问题现象",[28,29,30],"p",{},"下单流程中，重复单提示弹窗会出现「闪烁后消失」或「未正常展示」的情况。虽然页面无明显报错，但属于典型的功能异常：用户几乎无法感知到系统本应给出的风险提示。",[28,32,33],{},"由于现象没有明确的报错堆栈，前端首次接手时容易误判为「样式问题」或「组件本身渐隐动画」，实际复盘后发现根因与展示动画完全无关，这也是本文单独记录复盘过程的原因之一——类似「看起来像 UI 小问题」的现象，背后可能是逻辑层面的竞态缺陷。",[24,35,36],{"id":36},"场景与影响",[28,38,39,40,45],{},"该问题发生在类似电商下单页面：用户填写基础信息、计算费用后提交下单，系统应在检测到「短时间内重复下单」（参见 ",[41,42,44],"a",{"href":43},"\u002Fknowledge\u002Fteam-documents\u002F09","同业主重复单提醒规则","）时给出提醒弹窗。此类风控提示与普通表单校验不同——它不是阻断式的强制拦截，而是需要在给用户「继续操作空间」的同时，确保提示本身足够稳定地展示出来，一旦提示本身不可靠，风控规则设计得再完善也失去了实际意义。",[28,47,48],{},"异常影响主要包括：",[50,51,52,60,66,72],"ul",{},[53,54,55,59],"li",{},[56,57,58],"strong",{},"误触下单风险上升","：尤其是自动扣款场景下，用户没有看到提醒即可能重复扣款，属于本次问题中优先级最高的风险点；",[53,61,62,65],{},[56,63,64],{},"客服成本增加","：客服需要额外处理撤单、退款、解释等售后工作；",[53,67,68,71],{},[56,69,70],{},"信任度下降","：用户对系统稳定性与风控能力产生疑问，间接影响产品口碑；",[53,73,74,77],{},[56,75,76],{},"数据统计失真","：若依赖前端弹窗展示次数来统计规则命中率，弹窗异常消失会导致统计数据比实际命中次数偏低，影响后续对规则效果的评估。",[24,79,80],{"id":80},"排查时间线",[82,83,84,87,90,98,101],"ol",{},[53,85,86],{},"客服反馈「用户投诉重复下单被扣款两次，但没有看到任何提示」；",[53,88,89],{},"前端复现时发现，部分网络环境下提示框确实闪现了一下又消失，怀疑是弹层被主动关闭；",[53,91,92,93,97],{},"通过日志与代码排查，定位到关闭弹层的调用链路，确认是 ",[94,95,96],"code",{},"dialog.closeAll()"," 在特定时序下被触发；",[53,99,100],{},"复现条件锁定为「并发或连续请求」场景，与加载态弹层的关闭时机重叠；",[53,102,103],{},"与后端确认接口本身返回内容正常（重复单判定结果确实已返回），排除掉「后端未触发判定」这一可能性，进一步锁定问题在前端弹层展示环节。",[24,105,106],{"id":106},"问题分析",[108,109,110],"blockquote",{},[28,111,112],{},"如果图片显示较小，可点击放大查看。",[28,114,115],{},[116,117],"img",{"alt":118,"src":119},"下单提示异常","https:\u002F\u002Fcdn.wangxiaoze.cn\u002Fstatic\u002Fimages\u002F5b6b128e-c621-4d39-a879-d70d82a53528.png",[28,121,122,123,126],{},"根因是",[56,124,125],{},"弹层关闭逻辑过于粗粒度","：",[50,128,129,135,146,149],{},[53,130,131,132,134],{},"在并发请求或连续请求场景下，执行了 ",[94,133,96],{},"；",[53,136,137,138,141,142,145],{},"当未传入目标参数时，",[94,139,140],{},"closeAll()"," 会关闭",[56,143,144],{},"所有","弹层，而不区分「加载态弹层」与「业务提示弹层」；",[53,147,148],{},"请求返回时机与重复单提示弹窗的展示时机存在竞态：加载层关闭动作发生在业务弹窗刚展示之后，导致业务弹窗被一并误关闭；",[53,150,151],{},"表现为「弹窗一闪而过」或「完全没有出现」，取决于两者时序的先后关系。",[24,153,154],{"id":154},"修复前后对比",[156,157,158,174],"table",{},[159,160,161],"thead",{},[162,163,164,168,171],"tr",{},[165,166,167],"th",{},"维度",[165,169,170],{},"修复前",[165,172,173],{},"修复后",[175,176,177,200,211,222],"tbody",{},[162,178,179,183,189],{},[180,181,182],"td",{},"关闭方式",[180,184,185,186,188],{},"无参 ",[94,187,96],{},"，无差别关闭所有弹层",[180,190,191,192,195,196,199],{},"加载层维护独立 ",[94,193,194],{},"id","，仅 ",[94,197,198],{},"closeAll(id)"," 关闭对应加载层",[162,201,202,205,208],{},[180,203,204],{},"业务提示弹窗",[180,206,207],{},"可能被并发请求的加载层关闭动作误关闭",[180,209,210],{},"与加载层关闭逻辑解耦，不受影响",[162,212,213,216,219],{},[180,214,215],{},"复现概率",[180,217,218],{},"与请求时序强相关，弱网\u002F连续点击下概率更高",[180,220,221],{},"消除时序竞争，稳定展示",[162,223,224,227,230],{},[180,225,226],{},"排查难度",[180,228,229],{},"无明显报错，只能靠现象复现和日志定位",[180,231,232],{},"加载层与业务弹层分别打标记，日后类似问题更易定位",[24,234,235],{"id":235},"修复方案与结果",[28,237,238],{},"修复思路是「只关闭加载层，不影响业务弹窗」：",[82,240,241,246,252,258],{},[53,242,243,244,134],{},"为加载层维护独立且递增的 ",[94,245,194],{},[53,247,248,249,251],{},"请求完成后使用 ",[94,250,198],{}," 或指定关闭 API，仅销毁对应加载层；",[53,253,254,255,257],{},"避免无参 ",[94,256,140],{}," 清空全部弹层；",[53,259,260],{},"对「业务风险提示类弹窗」（如重复单提醒）单独打上标记，即便未来仍有类似批量关闭调用，也不会被无差别清除。",[28,262,263],{},"修复后效果：",[50,265,266,269,272],{},[53,267,268],{},"重复单提示弹窗可稳定展示；",[53,270,271],{},"加载层关闭不再影响业务弹窗；",[53,273,274],{},"下单流程风险提示恢复正常。",[28,276,277],{},"由于代码涉及公司内部业务，本文不展示源码，仅保留效果示意图：",[28,279,280],{},[116,281],{"alt":282,"src":283},"最终效果","https:\u002F\u002Fcdn.wangxiaoze.cn\u002Fstatic\u002Fimages\u002F8489bf69-efc9-435e-b938-3c4436e69241.svg",[24,285,286],{"id":286},"回归检查清单",[50,288,291,301,307,321,330],{"className":289},[290],"contains-task-list",[53,292,295,300],{"className":293},[294],"task-list-item",[296,297],"input",{"disabled":298,"type":299},true,"checkbox"," 单次请求场景下，重复单提示弹窗正常展示且不闪烁；",[53,302,304,306],{"className":303},[294],[296,305],{"disabled":298,"type":299}," 并发\u002F连续请求场景下（如快速多次点击下单），提示弹窗不会被加载层关闭动作误关闭；",[53,308,310,312,313,316,317,320],{"className":309},[294],[296,311],{"disabled":298,"type":299}," 页面内其他使用 ",[94,314,315],{},"dialog","\u002F",[94,318,319],{},"loading"," 的模块，确认未因本次修复而出现「加载层无法正常关闭」的回归问题；",[53,322,324,326,327,329],{"className":323},[294],[296,325],{"disabled":298,"type":299}," 覆盖所有会触发重复单检测的入口（见 ",[41,328,44],{"href":43}," 中的场景表），逐一验证提示弹窗展示正常；",[53,331,333,335],{"className":332},[294],[296,334],{"disabled":298,"type":299}," 弱网\u002F延迟环境下手动多次提交，确认提示弹窗展示时序稳定。",[24,337,338],{"id":338},"经验总结",[50,340,341,350,353],{},[53,342,343,344,346,347,349],{},"使用「无差别批量关闭」类 API（如 ",[94,345,140],{},"）时，务必确认是否会影响到其他业务无关的弹层；优先使用带 ",[94,348,194],{},"\u002F引用的定向关闭方式；",[53,351,352],{},"涉及风控\u002F安全提示类弹窗，建议在设计上与普通加载态弹层做隔离，避免被通用清理逻辑误伤；",[53,354,355,356,359],{},"类似的「异常无报错、但功能表现不正常」问题，排查时应重点关注",[56,357,358],{},"竞态时序","，而非仅看单次请求的日志。",[24,361,362],{"id":362},"类似风险点排查建议",[28,364,365],{},"本次问题的本质是「批量操作 API 的作用范围被想当然地扩大」，团队后续排查类似隐患时，可参考以下检查方向：",[156,367,368,378],{},[159,369,370],{},[162,371,372,375],{},[165,373,374],{},"检查方向",[165,376,377],{},"具体做法",[175,379,380,398,406,414,422],{},[162,381,382,385],{},[180,383,384],{},"全局搜索批量 API 调用",[180,386,387,388,390,391,390,394,397],{},"搜索项目内 ",[94,389,140],{},"、",[94,392,393],{},"clearAll()",[94,395,396],{},"removeAll()"," 等无参批量调用，逐一确认调用场景是否会影响非预期目标",[162,399,400,403],{},[180,401,402],{},"弹层\u002F浮层分级",[180,404,405],{},"按「加载态」「普通提示」「风控\u002F安全提示」三级管理弹层，不同级别使用不同关闭策略",[162,407,408,411],{},[180,409,410],{},"并发场景补充测试",[180,412,413],{},"对涉及多个异步请求的页面，专门补充「快速连续操作」「多个请求几乎同时返回」的测试用例",[162,415,416,419],{},[180,417,418],{},"组件库封装规范",[180,420,421],{},"若二次封装了弹层组件，建议默认不提供无参「关闭所有」方法，或在文档中明确注明该方法的影响范围",[162,423,424,427],{},[180,425,426],{},"Code Review 关注点",[180,428,429],{},"涉及弹层关闭的改动，Review 时应额外确认是否可能影响其他并发场景下的弹层展示",[24,431,432],{"id":432},"常见疑问",[82,434,435,444,452,469],{},[53,436,437,440,443],{},[56,438,439],{},"为什么浏览器多次测试没有复现，只有部分用户反馈？",[441,442],"br",{},"\n竞态问题往往依赖请求返回的时序，本地测试环境网络延迟低、请求几乎同步返回，容易掩盖问题；线上用户网络环境更复杂，多个请求的返回时间差更容易触发竞态窗口，因此更常见于生产环境反馈。",[53,445,446,449,451],{},[56,447,448],{},"除了本次涉及的重复单提示，是否还有其他弹窗存在类似风险？",[441,450],{},"\n建议按上文「类似风险点排查建议」表格对全站弹层调用做一次专项排查，而不是仅修复本次报告的具体场景。",[53,453,454,460,462,463,465,466,468],{},[56,455,456,457,459],{},"加载层的 ",[94,458,194],{}," 应该如何生成？",[441,461],{},"\n建议使用自增计数器或时间戳 + 随机数组合，保证同一页面内并发请求产生的加载层 ",[94,464,194],{}," 不重复，避免 ",[94,467,198],{}," 误关闭到另一个并发请求对应的加载层。",[53,470,471,474,476],{},[56,472,473],{},"本次修复是否需要补充自动化测试？",[441,475],{},"\n建议补充：对下单接口 mock 出「并发触发加载态 + 重复单提示」的场景，断言提示弹窗最终仍处于展示状态；纯手工回归容易在下次迭代中被无意间引入的新调用重新破坏。",[24,478,479],{"id":479},"相关链接",[50,481,482,486,492],{},[53,483,484],{},[41,485,44],{"href":43},[53,487,488],{},[41,489,491],{"href":490},"\u002Fknowledge\u002Fteam-documents\u002F18","中英文输入法下搜索触发冲突复盘",[53,493,494],{},[41,495,497],{"href":496},"\u002Fknowledge\u002Fteam-documents\u002F12","系统自动更新说明",{"title":499,"searchDepth":500,"depth":500,"links":501},"",2,[502,503,504,505,506,507,508,509,510,511,512],{"id":26,"depth":500,"text":26},{"id":36,"depth":500,"text":36},{"id":80,"depth":500,"text":80},{"id":106,"depth":500,"text":106},{"id":154,"depth":500,"text":154},{"id":235,"depth":500,"text":235},{"id":286,"depth":500,"text":286},{"id":338,"depth":500,"text":338},{"id":362,"depth":500,"text":362},{"id":432,"depth":500,"text":432},{"id":479,"depth":500,"text":479},{"title":8,"description":9},"knowledge\u002Fteam-documents\u002F11","knowledge\u002Fknowledge\u002Fteam-documents\u002F11.md","md",{"items":518},[519,524,528,532,537,541],{"path":520,"title":521,"description":522,"category":10,"score":523},"\u002Fknowledge\u002Fteam-documents\u002F13","新商家系统性能优化实践","商家系统新版本上线后，团队持续针对构建效率与用户体验做了一轮系统性优化。本文记录核心方案与落地结果，供后续版本复用。",9,{"path":525,"title":526,"description":527,"category":10,"score":523},"\u002Fknowledge\u002Fteam-documents\u002F04","老系统升级与兼容改造实践","公司原有业务系统采用 Node + jQuery 架构，长期运行后暴露出典型遗留系统问题：",{"path":529,"title":530,"description":531,"category":10,"score":523},"\u002Fknowledge\u002Fteam-documents\u002F16","在线协作表格接入实践","业务场景是“测量数据在线协作编辑”：",{"path":533,"title":534,"description":535,"category":10,"score":536},"\u002Fknowledge\u002Fteam-documents\u002F19","GridView 宫格加载渲染优化","系统首页 GridView 宫格模块接口耗时不高，但首次进入总耗时接近 22s。复盘耗时分层定位过程、代码层面的瓶颈（约 2000 行、100 个 tab 重复节点）、优化手段与最终指标对比。",6,{"path":538,"title":539,"description":540,"category":10,"score":536},"\u002Fknowledge\u002Fteam-documents\u002F06","企业微信与小程序工单问题","企微师傅端与商家小程序端长期共用一套代码，页面与组件嵌套边界不清晰、引入规范缺失、公共代码与端侧代码耦合度高，导致维护成本持续上升。本文给出拆分为两套独立项目的架构建议，并说明边界划分、迁移注意事项与性能优化方向。",{"path":496,"title":497,"description":542,"category":10,"score":536},"对比商家系统与 BOSS 系统在发版后的更新体验差异，说明两者共用的离线缓存\u002FPWA 插件的自动更新与手动提示更新两种模式，并结合知识库《网站更新（一）（二）》给出统一策略建议。",{"series":544,"title":545,"items":546,"index":616,"prev":617,"next":618},"team-documents","team documents",[547,551,555,559,561,565,567,571,575,577,581,582,584,586,590,594,596,600,602,604,608,612],{"path":548,"title":549,"date":550,"pinned":15},"\u002Fknowledge\u002Fteam-documents\u002F01","执行价格弹窗：表头 \u002F 表体合并与可配置表格","2024-07-27",{"path":552,"title":553,"date":554,"pinned":15},"\u002Fknowledge\u002Fteam-documents\u002F02","防篡改水印","2024-01-09",{"path":556,"title":557,"date":558,"pinned":15},"\u002Fknowledge\u002Fteam-documents\u002F03","键盘弹起导致底部被顶起问题（H5 适配）","2024-09-17",{"path":525,"title":526,"date":560,"pinned":15},"2024-12-12",{"path":562,"title":563,"date":564,"pinned":15},"\u002Fknowledge\u002Fteam-documents\u002F05","内部插件 \u002F 工具库开发实践","2021-08-19",{"path":538,"title":539,"date":566,"pinned":15},"2025-10-01",{"path":568,"title":569,"date":570,"pinned":15},"\u002Fknowledge\u002Fteam-documents\u002F07","企业微信群工具打开缓慢原因分析","2020-04-12",{"path":572,"title":573,"date":574,"pinned":15},"\u002Fknowledge\u002Fteam-documents\u002F08","属性排序需求","2024-06-16",{"path":43,"title":44,"date":576,"pinned":15},"2020-06-07",{"path":578,"title":579,"date":580,"pinned":15},"\u002Fknowledge\u002Fteam-documents\u002F10","图片上传前的自定义水印实践","2021-06-10",{"path":7,"title":8,"date":14,"pinned":15},{"path":496,"title":497,"date":583,"pinned":15},"2025-05-26",{"path":520,"title":521,"date":585,"pinned":15},"2025-04-08",{"path":587,"title":588,"date":589,"pinned":15},"\u002Fknowledge\u002Fteam-documents\u002F14","选项卡切换与 Loading 状态封装","2019-11-03",{"path":591,"title":592,"date":593,"pinned":15},"\u002Fknowledge\u002Fteam-documents\u002F15","移动端返回事件触发两次问题复盘","2021-03-09",{"path":529,"title":530,"date":595,"pinned":15},"2023-10-27",{"path":597,"title":598,"date":599,"pinned":15},"\u002Fknowledge\u002Fteam-documents\u002F17","支付中转页面升级实践","2022-10-15",{"path":490,"title":491,"date":601,"pinned":15},"2024-09-01",{"path":533,"title":534,"date":603,"pinned":15},"2026-03-17",{"path":605,"title":606,"date":607,"pinned":15},"\u002Fknowledge\u002Fteam-documents\u002F20","H5 GPS 定位问题说明","2023-08-31",{"path":609,"title":610,"date":611,"pinned":15},"\u002Fknowledge\u002Fteam-documents\u002F21","vxe-table 行 Hover 联动高亮","2024-08-31",{"path":613,"title":614,"date":615,"pinned":15},"\u002Fknowledge\u002Fteam-documents\u002F22","企业微信 uni-app H5：OAuth 回退白屏与列表缓存","2023-08-17",10,{"path":578,"title":579,"date":580,"pinned":15},{"path":496,"title":497,"date":583,"pinned":15}]