[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"knowledge-\u002Fapi\u002Fknowledge\u002Fteam-documents\u002F22":3,"knowledge-related-\u002Fknowledge\u002Fteam-documents\u002F22":1452,"knowledge-series-\u002Fknowledge\u002Fteam-documents\u002F22":1478},{"source":4,"connector":5,"page":6},"sqlite","better-sqlite3",{"path":7,"title":8,"description":9,"category":10,"tags":11,"date":17,"pinned":18,"draft":18,"body":19,"seo":1448,"stem":1449,"id":1450,"extension":1451},"\u002Fknowledge\u002Fteam-documents\u002F22","企业微信 uni-app H5：OAuth 回退白屏与列表缓存","第三方 BI 报表项目，企业微信内嵌 H5，uni-app 编译，history 模式。主页面 BiLink 同时承担静默授权和列表展示，上线后碰到两个问题：授权完清掉 URL 参数，iOS 侧滑返回还是白屏；列表加了缓存以后，刷新行…","团队文档",[12,13,14,15,16],"team","vue","mobile","wecom","performance","2023-08-17",false,{"type":20,"value":21,"toc":1441},"minimark",[22,26,35,39,76,79,132,135,143,150,460,494,497,500,506,523,528,538,580,582,585,588,595,601,618,627,632,657,670,672,675,680,686,713,724,729,738,925,932,937,942,1214,1219,1321,1381,1386,1407,1409,1412,1437],[23,24,8],"h1",{"id":25},"企业微信-uni-app-h5oauth-回退白屏与列表缓存",[27,28,29,30,34],"p",{},"第三方 BI 报表项目，企业微信内嵌 H5，uni-app 编译，history 模式。主页面 ",[31,32,33],"code",{},"BiLink"," 同时承担静默授权和列表展示，上线后碰到两个问题：授权完清掉 URL 参数，iOS 侧滑返回还是白屏；列表加了缓存以后，刷新行为又不对。",[36,37,38],"h2",{"id":38},"场景说明",[27,40,41,42,45,46,49,50,53,54,57,58,61,62,65,66,68,69,71,72,75],{},"从企业微信工作台点进来，走 ",[31,43,44],{},"snsapi_base"," 静默授权。",[31,47,48],{},"getUserInfo"," 拿到数据后按权限分组出 Grid（集团 \u002F 销售 \u002F 事业部），点击 ",[31,51,52],{},"navigateTo"," 到 ",[31,55,56],{},"pages-sub\u002Fbi-links\u002Fdetails","，",[31,59,60],{},"web-view"," 打开 ",[31,63,64],{},"extLink","。没有单独的授权页，OAuth 回调直接落在 ",[31,67,33],{},"，URL 带 ",[31,70,31],{},"，换票后 ",[31,73,74],{},"replaceState"," 清参。",[27,77,78],{},"页面配置：",[80,81,86],"pre",{"className":82,"code":83,"language":84,"meta":85,"style":85},"language-json5 shiki shiki-themes material-theme-lighter github-light github-dark","{\n  layout: 'default',\n  style: {\n    navigationBarTitleText: 'BI报表',\n    navigationStyle: 'custom',\n  },\n}\n","json5","",[31,87,88,96,102,108,114,120,126],{"__ignoreMap":85},[89,90,93],"span",{"class":91,"line":92},"line",1,[89,94,95],{},"{\n",[89,97,99],{"class":91,"line":98},2,[89,100,101],{},"  layout: 'default',\n",[89,103,105],{"class":91,"line":104},3,[89,106,107],{},"  style: {\n",[89,109,111],{"class":91,"line":110},4,[89,112,113],{},"    navigationBarTitleText: 'BI报表',\n",[89,115,117],{"class":91,"line":116},5,[89,118,119],{},"    navigationStyle: 'custom',\n",[89,121,123],{"class":91,"line":122},6,[89,124,125],{},"  },\n",[89,127,129],{"class":91,"line":128},7,[89,130,131],{},"}\n",[27,133,134],{},"整体流程：",[80,136,141],{"className":137,"code":139,"language":140,"meta":85},[138],"language-text","打开 BiLink（无 code）\n  → redirectToOAuth()\n  → 带 code 回到 BiLink\n  → initPage()：getUserInfo → 写 bi-cache → replaceState\n  → 出列表；只有一个报表则 reLaunch 进 details\n","text",[31,142,139],{"__ignoreMap":85},[27,144,145,146,149],{},"进报表时带 ",[31,147,148],{},"autoRefresh=false","，列表留在页面栈里，回来读缓存：",[80,151,155],{"className":152,"code":153,"language":154,"meta":85,"style":85},"language-ts shiki shiki-themes material-theme-lighter github-light github-dark","const url =\n  `\u002Fpages-sub\u002Fbi-links\u002Fdetails?title=...` +\n  `&autoRefresh=false` +\n  `&extLink=...`\nuni.navigateTo({ url })\n\n\u002F\u002F onLoad\nconst autoRefresh = getUrlParam('autoRefresh')\nif (autoRefresh !== 'false') {\n  state.initPage()\n} else {\n  const cached = getBiReportGroupsCache()\n  if (cached?.length) {\n    state.reportGroups = cached\n    state.isLoading = false\n    window.history.replaceState({}, '', getCleanPageUrl())\n  } else {\n    state.initPage()\n  }\n}\n","ts",[31,156,157,171,187,198,208,236,242,248,274,300,315,326,342,364,380,396,428,438,449,455],{"__ignoreMap":85},[89,158,159,163,167],{"class":91,"line":92},[89,160,162],{"class":161},"sbsja","const",[89,164,166],{"class":165},"s_hVV"," url",[89,168,170],{"class":169},"smGrS"," =\n",[89,172,173,177,181,184],{"class":91,"line":98},[89,174,176],{"class":175},"sjJ54","  `",[89,178,180],{"class":179},"s_sjI","\u002Fpages-sub\u002Fbi-links\u002Fdetails?title=...",[89,182,183],{"class":175},"`",[89,185,186],{"class":169}," +\n",[89,188,189,191,194,196],{"class":91,"line":104},[89,190,176],{"class":175},[89,192,193],{"class":179},"&autoRefresh=false",[89,195,183],{"class":175},[89,197,186],{"class":169},[89,199,200,202,205],{"class":91,"line":110},[89,201,176],{"class":175},[89,203,204],{"class":179},"&extLink=...",[89,206,207],{"class":175},"`\n",[89,209,210,214,218,221,224,227,230,233],{"class":91,"line":116},[89,211,213],{"class":212},"su5hD","uni",[89,215,217],{"class":216},"sP7_E",".",[89,219,52],{"class":220},"sGLFI",[89,222,223],{"class":212},"(",[89,225,226],{"class":216},"{",[89,228,229],{"class":212}," url ",[89,231,232],{"class":216},"}",[89,234,235],{"class":212},")\n",[89,237,238],{"class":91,"line":122},[89,239,241],{"emptyLinePlaceholder":240},true,"\n",[89,243,244],{"class":91,"line":128},[89,245,247],{"class":246},"sutJx","\u002F\u002F onLoad\n",[89,249,251,253,256,259,262,264,267,270,272],{"class":91,"line":250},8,[89,252,162],{"class":161},[89,254,255],{"class":165}," autoRefresh",[89,257,258],{"class":169}," =",[89,260,261],{"class":220}," getUrlParam",[89,263,223],{"class":212},[89,265,266],{"class":175},"'",[89,268,269],{"class":179},"autoRefresh",[89,271,266],{"class":175},[89,273,235],{"class":212},[89,275,277,281,284,287,290,293,295,298],{"class":91,"line":276},9,[89,278,280],{"class":279},"sVHd0","if",[89,282,283],{"class":212}," (autoRefresh ",[89,285,286],{"class":169},"!==",[89,288,289],{"class":175}," '",[89,291,292],{"class":179},"false",[89,294,266],{"class":175},[89,296,297],{"class":212},") ",[89,299,95],{"class":216},[89,301,303,306,308,311],{"class":91,"line":302},10,[89,304,305],{"class":212},"  state",[89,307,217],{"class":216},[89,309,310],{"class":220},"initPage",[89,312,314],{"class":313},"skxfh","()\n",[89,316,318,320,323],{"class":91,"line":317},11,[89,319,232],{"class":216},[89,321,322],{"class":279}," else",[89,324,325],{"class":216}," {\n",[89,327,329,332,335,337,340],{"class":91,"line":328},12,[89,330,331],{"class":161},"  const",[89,333,334],{"class":165}," cached",[89,336,258],{"class":169},[89,338,339],{"class":220}," getBiReportGroupsCache",[89,341,314],{"class":313},[89,343,345,348,351,354,357,360,362],{"class":91,"line":344},13,[89,346,347],{"class":279},"  if",[89,349,350],{"class":313}," (",[89,352,353],{"class":212},"cached",[89,355,356],{"class":216},"?.",[89,358,359],{"class":165},"length",[89,361,297],{"class":313},[89,363,95],{"class":216},[89,365,367,370,372,375,377],{"class":91,"line":366},14,[89,368,369],{"class":212},"    state",[89,371,217],{"class":216},[89,373,374],{"class":212},"reportGroups",[89,376,258],{"class":169},[89,378,379],{"class":212}," cached\n",[89,381,383,385,387,390,392],{"class":91,"line":382},15,[89,384,369],{"class":212},[89,386,217],{"class":216},[89,388,389],{"class":212},"isLoading",[89,391,258],{"class":169},[89,393,395],{"class":394},"syTEX"," false\n",[89,397,399,402,404,407,409,411,413,416,419,422,425],{"class":91,"line":398},16,[89,400,401],{"class":212},"    window",[89,403,217],{"class":216},[89,405,406],{"class":212},"history",[89,408,217],{"class":216},[89,410,74],{"class":220},[89,412,223],{"class":313},[89,414,415],{"class":216},"{},",[89,417,418],{"class":175}," ''",[89,420,421],{"class":216},",",[89,423,424],{"class":220}," getCleanPageUrl",[89,426,427],{"class":313},"())\n",[89,429,431,434,436],{"class":91,"line":430},17,[89,432,433],{"class":216},"  }",[89,435,322],{"class":279},[89,437,325],{"class":216},[89,439,441,443,445,447],{"class":91,"line":440},18,[89,442,369],{"class":212},[89,444,217],{"class":216},[89,446,310],{"class":220},[89,448,314],{"class":313},[89,450,452],{"class":91,"line":451},19,[89,453,454],{"class":216},"  }\n",[89,456,458],{"class":91,"line":457},20,[89,459,131],{"class":216},[27,461,462,464,465,468,469,472,473,53,475,478,479,482,483,485,486,489,490,493],{},[31,463,310],{}," 的 ",[31,466,467],{},"finally"," 里会 ",[31,470,471],{},"clearOAuthState()","，再 ",[31,474,74],{},[31,476,477],{},"getCleanPageUrl()","。授权封装在 ",[31,480,481],{},"useAuth"," 里，",[31,484,31],{}," 也会存一份到 ",[31,487,488],{},"sessionStorage","（",[31,491,492],{},"bi_auth_code","）。",[495,496],"hr",{},[36,498,499],{"id":499},"问题现象",[27,501,502],{},[503,504,505],"strong",{},"侧滑返回白屏",[27,507,508,509,512,513,515,516,519,520,522],{},"列表正常出来后，企业微信 iOS 里左滑返回，页面空白。再 ",[31,510,511],{},"redirectToOAuth"," 或 ",[31,514,74],{}," 没用，有时得关掉重进。这里没用 ",[31,517,518],{},"uni.redirectTo","，就是原页 ",[31,521,74],{},"，一样中招。",[27,524,525],{},[503,526,527],{},"缓存和刷新",[27,529,530,531,533,534,537],{},"报表跳转带 ",[31,532,148],{},"，列表数据走 ",[31,535,536],{},"bi-cache","：",[539,540,541,555,574],"ul",{},[542,543,544,545,547,548,550,551,554],"li",{},"列表 F5：URL 上没有 ",[31,546,31],{}," 也没有 ",[31,549,148],{},"，重新 ",[31,552,553],{},"initPage()","，没 code 又去 OAuth，像刷新坏了；",[542,556,557,558,561,562,565,566,569,570,573],{},"报表 ",[31,559,560],{},"navigateBack"," 回来：",[31,563,564],{},"onLoad"," 不重跑，",[31,567,568],{},"onShow"," 里只调了 ",[31,571,572],{},"hideShareMenu()","，实例没了或缓存空了列表出不来；",[542,575,576,577,579],{},"报表页刷新：",[31,578,60],{}," token 过期，白屏或 403。",[495,581],{},[36,583,584],{"id":584},"原因",[27,586,587],{},"OAuth 走的是浏览器历史，不只是 uni-app 页面栈。",[27,589,590,591,594],{},"history 模式，回调地址类似 ",[31,592,593],{},"https:\u002F\u002Fdomain.com\u002Fpages\u002Fbi-links\u002Findex?code=xxx","。整页跳转下来，浏览器历史大致是：",[80,596,599],{"className":597,"code":598,"language":140,"meta":85},[138],"BiLink（无 code）\n  → 企业微信 OAuth（302）\n  → BiLink（带 code）\n  → replaceState 清参    ← 只改栈顶，下面几条还在\n",[31,600,598],{"__ignoreMap":85},[27,602,603,605,606,608,609,611,612,614,615,617],{},[31,604,511],{}," 整页跳，历史会叠；",[31,607,74],{}," 只动当前这一条。iOS 侧滑回的是浏览器栈，不一定走 ",[31,610,560],{},"，容易回到还带 ",[31,613,31],{}," 的地址——",[31,616,31],{}," 只能用一次，页面起不来就白了。",[27,619,620,621,623,624,626],{},"单页接回调的好处是链路短，坏处是 OAuth 前后同一个页面，",[31,622,74],{}," 删不掉 302 产生的下层历史。用户已经滑回旧 URL，你再 ",[31,625,74],{},"，改的不一定是他眼前那一层，所以会觉得 replace「又不生效」。",[27,628,629,631],{},[31,630,148],{}," 本来是想解决「从报表返回别重新鉴权」，不是给 F5 用的：",[539,633,634,640,648,654],{},[542,635,636,637,639],{},"首次 \u002F 带 code：",[31,638,553],{},"，正常；",[542,641,642,644,645,647],{},[31,643,560],{},"：不触发 ",[31,646,564],{},"，靠内存 state 和 bi-cache；",[542,649,650,651,653],{},"F5 刷列表：又进 ",[31,652,553],{},"，没 code 就 OAuth；",[542,655,656],{},"F5 刷报表：details 自己一套，跟列表缓存没接上。",[27,658,659,661,662,665,666,669],{},[31,660,568],{}," 目前没管缓存恢复。另外 history 部署记得配 ",[31,663,664],{},"try_files"," 回 ",[31,667,668],{},"index.html","，不然回退到某些路径直接 404，也是白屏。",[495,671],{},[36,673,674],{"id":674},"处理方向",[27,676,677],{},[503,678,679],{},"换票后别只 replaceState",[27,681,682,683,685],{},"地址栏好看用 ",[31,684,74],{}," 够了；想少踩回退，换票成功后可以直接：",[80,687,689],{"className":152,"code":688,"language":154,"meta":85,"style":85},"window.location.replace(getCleanPageUrl())\n",[31,690,691],{"__ignoreMap":85},[89,692,693,696,698,701,703,706,708,711],{"class":91,"line":92},[89,694,695],{"class":212},"window",[89,697,217],{"class":216},[89,699,700],{"class":212},"location",[89,702,217],{"class":216},[89,704,705],{"class":220},"replace",[89,707,223],{"class":212},[89,709,710],{"class":220},"getCleanPageUrl",[89,712,427],{"class":212},[27,714,715,716,719,720,723],{},"或者缓存写完后 ",[31,717,718],{},"uni.reLaunch({ url: '\u002Fpages\u002Fbi-links\u002Findex?autoRefresh=false' })","。单报表那条已经 ",[31,721,722],{},"reLaunch"," 了，多报表列表授权完也该硬跳一次。",[27,725,726],{},[503,727,728],{},"popstate 兜底",[27,730,731,734,735,737],{},[31,732,733],{},"#ifdef H5","，滑回带 ",[31,736,31],{}," 的 URL 时纠正一下：",[80,739,741],{"className":152,"code":740,"language":154,"meta":85,"style":85},"window.addEventListener('popstate', () => {\n  const code = getUrlParam('code')\n  const hasCache = getBiReportGroupsCache()?.length\n\n  if (code) {\n    hasCache ? window.location.replace(getCleanPageUrl()) : redirectToOAuth()\n    return\n  }\n  if (!hasCache && !sessionStorage.getItem('bi_auth_code')) {\n    redirectToOAuth()\n  }\n})\n",[31,742,743,771,792,811,815,827,861,866,870,908,915,919],{"__ignoreMap":85},[89,744,745,747,749,752,754,756,759,761,763,766,769],{"class":91,"line":92},[89,746,695],{"class":212},[89,748,217],{"class":216},[89,750,751],{"class":220},"addEventListener",[89,753,223],{"class":212},[89,755,266],{"class":175},[89,757,758],{"class":179},"popstate",[89,760,266],{"class":175},[89,762,421],{"class":216},[89,764,765],{"class":216}," ()",[89,767,768],{"class":161}," =>",[89,770,325],{"class":216},[89,772,773,775,778,780,782,784,786,788,790],{"class":91,"line":98},[89,774,331],{"class":161},[89,776,777],{"class":165}," code",[89,779,258],{"class":169},[89,781,261],{"class":220},[89,783,223],{"class":313},[89,785,266],{"class":175},[89,787,31],{"class":179},[89,789,266],{"class":175},[89,791,235],{"class":313},[89,793,794,796,799,801,803,806,808],{"class":91,"line":104},[89,795,331],{"class":161},[89,797,798],{"class":165}," hasCache",[89,800,258],{"class":169},[89,802,339],{"class":220},[89,804,805],{"class":313},"()",[89,807,356],{"class":216},[89,809,810],{"class":165},"length\n",[89,812,813],{"class":91,"line":110},[89,814,241],{"emptyLinePlaceholder":240},[89,816,817,819,821,823,825],{"class":91,"line":116},[89,818,347],{"class":279},[89,820,350],{"class":313},[89,822,31],{"class":212},[89,824,297],{"class":313},[89,826,95],{"class":216},[89,828,829,832,835,838,840,842,844,846,848,850,853,856,859],{"class":91,"line":122},[89,830,831],{"class":212},"    hasCache",[89,833,834],{"class":169}," ?",[89,836,837],{"class":212}," window",[89,839,217],{"class":216},[89,841,700],{"class":212},[89,843,217],{"class":216},[89,845,705],{"class":220},[89,847,223],{"class":313},[89,849,710],{"class":220},[89,851,852],{"class":313},"()) ",[89,854,855],{"class":169},":",[89,857,858],{"class":220}," redirectToOAuth",[89,860,314],{"class":313},[89,862,863],{"class":91,"line":128},[89,864,865],{"class":279},"    return\n",[89,867,868],{"class":91,"line":250},[89,869,454],{"class":216},[89,871,872,874,876,879,882,885,888,890,892,895,897,899,901,903,906],{"class":91,"line":276},[89,873,347],{"class":279},[89,875,350],{"class":313},[89,877,878],{"class":169},"!",[89,880,881],{"class":212},"hasCache",[89,883,884],{"class":169}," &&",[89,886,887],{"class":169}," !",[89,889,488],{"class":212},[89,891,217],{"class":216},[89,893,894],{"class":220},"getItem",[89,896,223],{"class":313},[89,898,266],{"class":175},[89,900,492],{"class":179},[89,902,266],{"class":175},[89,904,905],{"class":313},")) ",[89,907,95],{"class":216},[89,909,910,913],{"class":91,"line":302},[89,911,912],{"class":220},"    redirectToOAuth",[89,914,314],{"class":313},[89,916,917],{"class":91,"line":317},[89,918,454],{"class":216},[89,920,921,923],{"class":91,"line":328},[89,922,232],{"class":216},[89,924,235],{"class":212},[27,926,927,928,931],{},"列表页可以加 ",[31,929,930],{},"\"disableSwipeBack\": true","。",[27,933,934],{},[503,935,936],{},"分开处理「回调落地」和「从报表回来」",[27,938,939,941],{},[31,940,148],{}," 只留给子页返回读缓存。F5 先看有没有有效 session，有的话只拉 permissions，别一见没 code 就 OAuth：",[80,943,945],{"className":152,"code":944,"language":154,"meta":85,"style":85},"onLoad(() => {\n  hideShareMenu()\n  const code = getUrlParam('code')\n  const fromBack = getUrlParam('autoRefresh') === 'false'\n\n  if (code) {\n    state.initPage()\n    return\n  }\n  if (fromBack) {\n    const cached = getBiReportGroupsCache()\n    if (cached?.length) {\n      state.reportGroups = cached\n      state.isLoading = false\n      window.history.replaceState({}, '', getCleanPageUrl())\n      return\n    }\n  }\n  if (hasValidSession()) {\n    state.initPageFromSession()\n  } else {\n    state.initPage()\n  }\n})\n",[31,946,947,959,966,986,1017,1021,1033,1043,1047,1051,1064,1077,1094,1107,1119,1144,1149,1154,1158,1171,1182,1191,1202,1207],{"__ignoreMap":85},[89,948,949,951,953,955,957],{"class":91,"line":92},[89,950,564],{"class":220},[89,952,223],{"class":212},[89,954,805],{"class":216},[89,956,768],{"class":161},[89,958,325],{"class":216},[89,960,961,964],{"class":91,"line":98},[89,962,963],{"class":220},"  hideShareMenu",[89,965,314],{"class":313},[89,967,968,970,972,974,976,978,980,982,984],{"class":91,"line":104},[89,969,331],{"class":161},[89,971,777],{"class":165},[89,973,258],{"class":169},[89,975,261],{"class":220},[89,977,223],{"class":313},[89,979,266],{"class":175},[89,981,31],{"class":179},[89,983,266],{"class":175},[89,985,235],{"class":313},[89,987,988,990,993,995,997,999,1001,1003,1005,1007,1010,1012,1014],{"class":91,"line":110},[89,989,331],{"class":161},[89,991,992],{"class":165}," fromBack",[89,994,258],{"class":169},[89,996,261],{"class":220},[89,998,223],{"class":313},[89,1000,266],{"class":175},[89,1002,269],{"class":179},[89,1004,266],{"class":175},[89,1006,297],{"class":313},[89,1008,1009],{"class":169},"===",[89,1011,289],{"class":175},[89,1013,292],{"class":179},[89,1015,1016],{"class":175},"'\n",[89,1018,1019],{"class":91,"line":116},[89,1020,241],{"emptyLinePlaceholder":240},[89,1022,1023,1025,1027,1029,1031],{"class":91,"line":122},[89,1024,347],{"class":279},[89,1026,350],{"class":313},[89,1028,31],{"class":212},[89,1030,297],{"class":313},[89,1032,95],{"class":216},[89,1034,1035,1037,1039,1041],{"class":91,"line":128},[89,1036,369],{"class":212},[89,1038,217],{"class":216},[89,1040,310],{"class":220},[89,1042,314],{"class":313},[89,1044,1045],{"class":91,"line":250},[89,1046,865],{"class":279},[89,1048,1049],{"class":91,"line":276},[89,1050,454],{"class":216},[89,1052,1053,1055,1057,1060,1062],{"class":91,"line":302},[89,1054,347],{"class":279},[89,1056,350],{"class":313},[89,1058,1059],{"class":212},"fromBack",[89,1061,297],{"class":313},[89,1063,95],{"class":216},[89,1065,1066,1069,1071,1073,1075],{"class":91,"line":317},[89,1067,1068],{"class":161},"    const",[89,1070,334],{"class":165},[89,1072,258],{"class":169},[89,1074,339],{"class":220},[89,1076,314],{"class":313},[89,1078,1079,1082,1084,1086,1088,1090,1092],{"class":91,"line":328},[89,1080,1081],{"class":279},"    if",[89,1083,350],{"class":313},[89,1085,353],{"class":212},[89,1087,356],{"class":216},[89,1089,359],{"class":165},[89,1091,297],{"class":313},[89,1093,95],{"class":216},[89,1095,1096,1099,1101,1103,1105],{"class":91,"line":344},[89,1097,1098],{"class":212},"      state",[89,1100,217],{"class":216},[89,1102,374],{"class":212},[89,1104,258],{"class":169},[89,1106,379],{"class":212},[89,1108,1109,1111,1113,1115,1117],{"class":91,"line":366},[89,1110,1098],{"class":212},[89,1112,217],{"class":216},[89,1114,389],{"class":212},[89,1116,258],{"class":169},[89,1118,395],{"class":394},[89,1120,1121,1124,1126,1128,1130,1132,1134,1136,1138,1140,1142],{"class":91,"line":382},[89,1122,1123],{"class":212},"      window",[89,1125,217],{"class":216},[89,1127,406],{"class":212},[89,1129,217],{"class":216},[89,1131,74],{"class":220},[89,1133,223],{"class":313},[89,1135,415],{"class":216},[89,1137,418],{"class":175},[89,1139,421],{"class":216},[89,1141,424],{"class":220},[89,1143,427],{"class":313},[89,1145,1146],{"class":91,"line":398},[89,1147,1148],{"class":279},"      return\n",[89,1150,1151],{"class":91,"line":430},[89,1152,1153],{"class":216},"    }\n",[89,1155,1156],{"class":91,"line":440},[89,1157,454],{"class":216},[89,1159,1160,1162,1164,1167,1169],{"class":91,"line":451},[89,1161,347],{"class":279},[89,1163,350],{"class":313},[89,1165,1166],{"class":220},"hasValidSession",[89,1168,852],{"class":313},[89,1170,95],{"class":216},[89,1172,1173,1175,1177,1180],{"class":91,"line":457},[89,1174,369],{"class":212},[89,1176,217],{"class":216},[89,1178,1179],{"class":220},"initPageFromSession",[89,1181,314],{"class":313},[89,1183,1185,1187,1189],{"class":91,"line":1184},21,[89,1186,433],{"class":216},[89,1188,322],{"class":279},[89,1190,325],{"class":216},[89,1192,1194,1196,1198,1200],{"class":91,"line":1193},22,[89,1195,369],{"class":212},[89,1197,217],{"class":216},[89,1199,310],{"class":220},[89,1201,314],{"class":313},[89,1203,1205],{"class":91,"line":1204},23,[89,1206,454],{"class":216},[89,1208,1210,1212],{"class":91,"line":1209},24,[89,1211,232],{"class":216},[89,1213,235],{"class":212},[27,1215,1216],{},[503,1217,1218],{},"onShow 补缓存，报表 web-view 加 key",[80,1220,1222],{"className":152,"code":1221,"language":154,"meta":85,"style":85},"onShow(() => {\n  hideShareMenu()\n  if (!state.reportGroups.length && !state.isLoading) {\n    const cached = getBiReportGroupsCache()\n    if (cached?.length) state.reportGroups = cached\n  }\n})\n",[31,1223,1224,1236,1242,1275,1287,1311,1315],{"__ignoreMap":85},[89,1225,1226,1228,1230,1232,1234],{"class":91,"line":92},[89,1227,568],{"class":220},[89,1229,223],{"class":212},[89,1231,805],{"class":216},[89,1233,768],{"class":161},[89,1235,325],{"class":216},[89,1237,1238,1240],{"class":91,"line":98},[89,1239,963],{"class":220},[89,1241,314],{"class":313},[89,1243,1244,1246,1248,1250,1253,1255,1257,1259,1261,1263,1265,1267,1269,1271,1273],{"class":91,"line":104},[89,1245,347],{"class":279},[89,1247,350],{"class":313},[89,1249,878],{"class":169},[89,1251,1252],{"class":212},"state",[89,1254,217],{"class":216},[89,1256,374],{"class":212},[89,1258,217],{"class":216},[89,1260,359],{"class":165},[89,1262,884],{"class":169},[89,1264,887],{"class":169},[89,1266,1252],{"class":212},[89,1268,217],{"class":216},[89,1270,389],{"class":212},[89,1272,297],{"class":313},[89,1274,95],{"class":216},[89,1276,1277,1279,1281,1283,1285],{"class":91,"line":110},[89,1278,1068],{"class":161},[89,1280,334],{"class":165},[89,1282,258],{"class":169},[89,1284,339],{"class":220},[89,1286,314],{"class":313},[89,1288,1289,1291,1293,1295,1297,1299,1301,1303,1305,1307,1309],{"class":91,"line":116},[89,1290,1081],{"class":279},[89,1292,350],{"class":313},[89,1294,353],{"class":212},[89,1296,356],{"class":216},[89,1298,359],{"class":165},[89,1300,297],{"class":313},[89,1302,1252],{"class":212},[89,1304,217],{"class":216},[89,1306,374],{"class":212},[89,1308,258],{"class":169},[89,1310,379],{"class":212},[89,1312,1313],{"class":91,"line":122},[89,1314,454],{"class":216},[89,1316,1317,1319],{"class":91,"line":128},[89,1318,232],{"class":216},[89,1320,235],{"class":212},[80,1322,1325],{"className":1323,"code":1324,"language":13,"meta":85,"style":85},"language-vue shiki shiki-themes material-theme-lighter github-light github-dark","\u003Cweb-view v-if=\"reportUrl\" :key=\"reportKey\" :src=\"reportUrl\" \u002F>\n",[31,1326,1327],{"__ignoreMap":85},[89,1328,1329,1332,1335,1338,1341,1344,1347,1349,1352,1356,1358,1360,1363,1365,1367,1370,1372,1374,1376,1378],{"class":91,"line":92},[89,1330,1331],{"class":216},"\u003C",[89,1333,60],{"class":1334},"sQzsp",[89,1336,1337],{"class":279}," v-if",[89,1339,1340],{"class":216},"=",[89,1342,1343],{"class":175},"\"",[89,1345,1346],{"class":212},"reportUrl",[89,1348,1343],{"class":175},[89,1350,1351],{"class":216}," :",[89,1353,1355],{"class":1354},"s9AJx","key",[89,1357,1340],{"class":216},[89,1359,1343],{"class":175},[89,1361,1362],{"class":212},"reportKey",[89,1364,1343],{"class":175},[89,1366,1351],{"class":216},[89,1368,1369],{"class":1354},"src",[89,1371,1340],{"class":216},[89,1373,1343],{"class":175},[89,1375,1346],{"class":212},[89,1377,1343],{"class":175},[89,1379,1380],{"class":216}," \u002F>\n",[27,1382,1383],{},[503,1384,1385],{},"Nginx",[80,1387,1391],{"className":1388,"code":1389,"language":1390,"meta":85,"style":85},"language-nginx shiki shiki-themes material-theme-lighter github-light github-dark","location \u002F {\n  try_files $uri $uri\u002F \u002Findex.html;\n}\n","nginx",[31,1392,1393,1398,1403],{"__ignoreMap":85},[89,1394,1395],{"class":91,"line":92},[89,1396,1397],{},"location \u002F {\n",[89,1399,1400],{"class":91,"line":98},[89,1401,1402],{},"  try_files $uri $uri\u002F \u002Findex.html;\n",[89,1404,1405],{"class":91,"line":104},[89,1406,131],{},[495,1408],{},[36,1410,1411],{"id":1411},"参考",[539,1413,1414,1423,1430],{},[542,1415,1416],{},[1417,1418,1422],"a",{"href":1419,"rel":1420},"https:\u002F\u002Fdeveloper.work.weixin.qq.com\u002Fdocument\u002Fpath\u002F91120",[1421],"nofollow","企业微信 OAuth 网页授权",[542,1424,1425],{},[1417,1426,1429],{"href":1427,"rel":1428},"https:\u002F\u002Funiapp.dcloud.net.cn\u002Ftutorial\u002Fhistory.html",[1421],"uni-app history 模式部署",[542,1431,1432],{},[1417,1433,1436],{"href":1434,"rel":1435},"https:\u002F\u002Funiapp.dcloud.net.cn\u002Ftutorial\u002Fpage.html#lifecycle",[1421],"uni-app 页面生命周期",[1438,1439,1440],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .skxfh, html code.shiki .skxfh{--shiki-light:#E53935;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .syTEX, html code.shiki .syTEX{--shiki-light:#FF5370;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sQzsp, html code.shiki .sQzsp{--shiki-light:#E53935;--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .s9AJx, html code.shiki .s9AJx{--shiki-light:#9C3EDA;--shiki-default:#6F42C1;--shiki-dark:#B392F0}",{"title":85,"searchDepth":98,"depth":98,"links":1442},[1443,1444,1445,1446,1447],{"id":38,"depth":98,"text":38},{"id":499,"depth":98,"text":499},{"id":584,"depth":98,"text":584},{"id":674,"depth":98,"text":674},{"id":1411,"depth":98,"text":1411},{"title":8,"description":9},"knowledge\u002Fteam-documents\u002F22","knowledge\u002Fknowledge\u002Fteam-documents\u002F22.md","md",{"items":1453},[1454,1458,1462,1466,1470,1474],{"path":1455,"title":1456,"description":1457,"category":10,"score":382},"\u002Fknowledge\u002Fteam-documents\u002F06","企业微信与小程序工单问题","企微师傅端与商家小程序端长期共用一套代码，页面与组件嵌套边界不清晰、引入规范缺失、公共代码与端侧代码耦合度高，导致维护成本持续上升。本文给出拆分为两套独立项目的架构建议，并说明边界划分、迁移注意事项与性能优化方向。",{"path":1459,"title":1460,"description":1461,"category":10,"score":328},"\u002Fknowledge\u002Fteam-documents\u002F19","GridView 宫格加载渲染优化","系统首页 GridView 宫格模块接口耗时不高，但首次进入总耗时接近 22s。复盘耗时分层定位过程、代码层面的瓶颈（约 2000 行、100 个 tab 重复节点）、优化手段与最终指标对比。",{"path":1463,"title":1464,"description":1465,"category":10,"score":328},"\u002Fknowledge\u002Fteam-documents\u002F13","新商家系统性能优化实践","商家系统新版本上线后，团队持续针对构建效率与用户体验做了一轮系统性优化。本文记录核心方案与落地结果，供后续版本复用。",{"path":1467,"title":1468,"description":1469,"category":10,"score":328},"\u002Fknowledge\u002Fteam-documents\u002F04","老系统升级与兼容改造实践","公司原有业务系统采用 Node + jQuery 架构，长期运行后暴露出典型遗留系统问题：",{"path":1471,"title":1472,"description":1473,"category":10,"score":328},"\u002Fknowledge\u002Fteam-documents\u002F03","键盘弹起导致底部被顶起问题（H5 适配）","在移动端 H5 页面中，当用户聚焦 input、textarea 等可编辑元素、软键盘弹出时，常见表现包括：",{"path":1475,"title":1476,"description":1477,"category":10,"score":328},"\u002Fknowledge\u002Fteam-documents\u002F02","防篡改水印","在各类管理后台、SaaS 平台或内部系统中，页面水印已经是非常常见的能力：一方面在截图时携带账号、姓名、时间等信息，降低截图外传的风险；另一方面在上传图片或文档预览时，通过水印标记上传者与时间，满足审计和合规需求。",{"series":1479,"title":1480,"items":1481,"index":1184,"prev":1555,"next":1556},"team-documents","team documents",[1482,1486,1488,1490,1492,1496,1498,1502,1506,1510,1514,1518,1522,1524,1528,1532,1536,1540,1544,1546,1550,1554],{"path":1483,"title":1484,"date":1485,"pinned":18},"\u002Fknowledge\u002Fteam-documents\u002F01","执行价格弹窗：表头 \u002F 表体合并与可配置表格","2024-07-27",{"path":1475,"title":1476,"date":1487,"pinned":18},"2024-01-09",{"path":1471,"title":1472,"date":1489,"pinned":18},"2024-09-17",{"path":1467,"title":1468,"date":1491,"pinned":18},"2024-12-12",{"path":1493,"title":1494,"date":1495,"pinned":18},"\u002Fknowledge\u002Fteam-documents\u002F05","内部插件 \u002F 工具库开发实践","2021-08-19",{"path":1455,"title":1456,"date":1497,"pinned":18},"2025-10-01",{"path":1499,"title":1500,"date":1501,"pinned":18},"\u002Fknowledge\u002Fteam-documents\u002F07","企业微信群工具打开缓慢原因分析","2020-04-12",{"path":1503,"title":1504,"date":1505,"pinned":18},"\u002Fknowledge\u002Fteam-documents\u002F08","属性排序需求","2024-06-16",{"path":1507,"title":1508,"date":1509,"pinned":18},"\u002Fknowledge\u002Fteam-documents\u002F09","同业主重复单提醒规则","2020-06-07",{"path":1511,"title":1512,"date":1513,"pinned":18},"\u002Fknowledge\u002Fteam-documents\u002F10","图片上传前的自定义水印实践","2021-06-10",{"path":1515,"title":1516,"date":1517,"pinned":18},"\u002Fknowledge\u002Fteam-documents\u002F11","系统下单（重复单提示框）异常复盘","2023-11-21",{"path":1519,"title":1520,"date":1521,"pinned":18},"\u002Fknowledge\u002Fteam-documents\u002F12","系统自动更新说明","2025-05-26",{"path":1463,"title":1464,"date":1523,"pinned":18},"2025-04-08",{"path":1525,"title":1526,"date":1527,"pinned":18},"\u002Fknowledge\u002Fteam-documents\u002F14","选项卡切换与 Loading 状态封装","2019-11-03",{"path":1529,"title":1530,"date":1531,"pinned":18},"\u002Fknowledge\u002Fteam-documents\u002F15","移动端返回事件触发两次问题复盘","2021-03-09",{"path":1533,"title":1534,"date":1535,"pinned":18},"\u002Fknowledge\u002Fteam-documents\u002F16","在线协作表格接入实践","2023-10-27",{"path":1537,"title":1538,"date":1539,"pinned":18},"\u002Fknowledge\u002Fteam-documents\u002F17","支付中转页面升级实践","2022-10-15",{"path":1541,"title":1542,"date":1543,"pinned":18},"\u002Fknowledge\u002Fteam-documents\u002F18","中英文输入法下搜索触发冲突复盘","2024-09-01",{"path":1459,"title":1460,"date":1545,"pinned":18},"2026-03-17",{"path":1547,"title":1548,"date":1549,"pinned":18},"\u002Fknowledge\u002Fteam-documents\u002F20","H5 GPS 定位问题说明","2023-08-31",{"path":1551,"title":1552,"date":1553,"pinned":18},"\u002Fknowledge\u002Fteam-documents\u002F21","vxe-table 行 Hover 联动高亮","2024-08-31",{"path":7,"title":8,"date":17,"pinned":18},{"path":1551,"title":1552,"date":1553,"pinned":18},null]