成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

今天不聊中間層,我們來聊聊中間頁

開發 架構
平常代碼編程中我們會碰到一些交互問題 or 團隊間的合作問題,需要處理鏈接跳轉之間的問題,假如我們作為提供方,需求方來自不同的業務團隊,甚至有時來自第三方。當然不僅限于此,還有很多令人腦殼疼的場景,這時候我們可以提供一個中間頁作為對接橋梁,在此頁面去攬下所有對接的活。

[[438007]]

本文轉載自微信公眾號「微醫大前端技術」,作者黃琴。轉載本文請聯系微醫大前端技術公眾號。

背景

平常代碼編程中我們會碰到一些交互問題 or 團隊間的合作問題,需要處理鏈接跳轉之間的問題,假如我們作為提供方,需求方來自不同的業務團隊,甚至有時來自第三方。當然不僅限于此,還有很多令人腦殼疼的場景,這時候我們可以提供一個中間頁作為對接橋梁,在此頁面去攬下所有對接的活。但針對過渡頁的合理使用和一些注意事項,我這里想單獨拎一篇小文章出來說說,繼續看看吧。

使用場景

1: 不確定的多方業務方或者不同渠道業務方

假如我們作為提供方,會面對不同的業務方,一部分來自于不同的協作團隊,一部分來自不同的渠道(微信、小程序、app),這時候中間頁就該上場了,由它來負責,主要根據 query 參數去做跳轉邏輯處理,負責跳到具體的目標頁 A、B、C 等等。目標頁理應來說只負責該頁面具體的邏輯,不該外攬下其他的臟活,下圖為簡易版場景圖。

![1901638101967_.pic](/Users/huangqin/Library/Containers/com.tencent.xinWeChat/Data/Library/Application Support/com.tencent.xinWeChat/2.0b4.0.9/a301252f4cfd6c12512699071071e4d7/Message/MessageTemp/9e20f478899dc29eb19741386f9343c8/Image/1901638101967_.pic.jpg)

思路:在中間頁你可以針對不同的 query 去做處理,目標頁放在 targetUrl,在處理對應的邏輯結束之后,跳轉到目標頁。這時候用戶其實是無感知的,如下是簡易版 code。

注意:我們作為提供方,最好能能提供一個標準模版,例如 appid 專門用來區分來源,來源的定義盡可能標準化,targetUrl 用來存在跳轉 url,跳轉到中間頁 token 處理,都是需要提前定義好的,這些 query 參數基本是統一的。so 最好是能對外提供一份對接文檔,注釋盡可能詳細(包括 code 中), 這樣避免自己踩坑(排查問題 or 撕逼。。。我太難了)

  1. // 這里例舉一個數組,假如針對 query 需要處理的邏輯 
  2. const fnList = [ 
  3.   ['appid''handleAppid'], 
  4.   ['token''handleToken'], 
  5.   ['payUrl''handlePayUrl'], 
  6.   ['sourceId''handleSourceId'], 
  7.   ... 
  8. ]; 
  9.  
  10. mounted() { 
  11.     this.handleQuery(); 
  12.   // 處理完跳轉到目標頁志華,跳轉到目標頁 target 
  13.     if (this.query.target) { 
  14.       location.replace(this.query.target); 
  15.     } 
  16. }, 
  17.  
  18. // 具體的 handleQuery 操作 
  19. handleQuery() { 
  20.     // 這里你可能有一些前置處理 
  21.      ...... 
  22.      // 對 query 進行處理 
  23.       fnList.forEach(([key, fn]) => { 
  24.         if (this.query[key] && this[fn]) { 
  25.           this[fn](); 
  26.         } 
  27.       }); 
  28. }, 

2: 同一業務方但有定制化需求的場景

聽起來和第一種場景很像,但是有差啦。假如作為提供方,都是同一個對接方,但走的模式不同,導致后續業務流程不一樣。拿圖片中的例子來說,目標頁是根據類型前置不同的目標頁面,這里 query 的參數會根據 type 的不同,會攜帶和其 type 對應的業務參數,這種提供的目標頁是一樣的,但參數會依賴業務自身需求而定。

![1941638105158_.pic](/Users/huangqin/Library/Containers/com.tencent.xinWeChat/Data/Library/Application Support/com.tencent.xinWeChat/2.0b4.0.9/a301252f4cfd6c12512699071071e4d7/Message/MessageTemp/9e20f478899dc29eb19741386f9343c8/Image/1941638105158_.pic.jpg)

簡易版 code 如下:

  1. // 根據 type 類型區別業務來源 
  2. checkType(type) { 
  3.  return this.query.type === type; 
  4. }, 
  5.      
  6. mounted() { 
  7.   // 可能有一些前置操作 
  8.   ...... 
  9.     this.handleQuery(); 
  10. }, 
  11.  
  12. // 具體的 handleQuery 操作 
  13. handleQuery() { 
  14.     // 這里你可能有一些前置處理 
  15.      ...... 
  16.       
  17.      // 來自服務包,需要帶上 sourceId 參數 
  18.       if (this.checkType('serverPack')) { 
  19.         const newQuery = { 
  20.           sourceId: query.sourceId, 
  21.           ... 
  22.         }; 
  23.         this.$router.replace({ 
  24.           name'orderServerPackConfirm'
  25.           query: newQuery, 
  26.         }); 
  27.         return
  28.       } 
  29.        
  30.      // 來自 XXX 的信息,需要將 osTokenId 帶到確認頁 
  31.      if (this.checkType('pcDetail')) { 
  32.         confirmQuery.osTokenId = this.query.osTokenId; 
  33.      } 
  34.       
  35.      // 其他 
  36.      ..... 
  37.  
  38.       this.$router.replace({ 
  39.         name'orderConfirm'
  40.         query: confirmQuery, 
  41.       }); 
  42. }, 

3: 處理跨域請求或參數需要由接口提供的情況

前面兩種情況不論是 1or2,基本上我們說的是由 query 顯性傳遞,但是也會有部分場景我們可能不再適用,如下

1:參數過多 or 或者對應的某個參數值過大不適用 query 的方式傳遞,采用接口調用方式,由中間頁自行獲取其中必要的參數即可。

2: A 應用跳到 B 應用,此時兩個應用存在跨域問題,A 需要調用某接口,內容值存在 cookie/storage 中,需要將其內容傳送到 B 應用中使用。應對這種情況,可以在跳轉到 B 應用的過程中加一個前置跳轉中間頁,這時 A 只負責跳轉到中間頁,將其調用的接口入參傳入到中間頁,在中間頁去請求接口,這是內容值就可以穩定存儲在 B 應用中了。

簡易版 code 如下:

  1. // 校驗 query 需要 
  2. checkQuery(keys = []) { 
  3.       return keys.every((key) => !!this.query[key]); 
  4.  }, 
  5.  
  6. // 根據 type 類型區別業務來源 
  7. checkType(type) { 
  8.  return this.query.type === type; 
  9. }, 
  10.  
  11. mounted() { 
  12.   // 可能有一些前置操作 
  13.   ...... 
  14.     this.handleQuery(); 
  15. }, 
  16.  
  17. // 具體的 handleQuery 操作 
  18. handleQuery() { 
  19.     // 這里你可能有一些前置處理 
  20.      ...... 
  21.       
  22.      // 商詳 
  23.       if (this.checkType('detail') && this.checkQuery(['skuId''quantity'])) { 
  24.        // 接口在中間頁去請求 
  25.         data = await this.directBuy({ 
  26.           skuId: +query.skuId, 
  27.           quantity: +query.quantity, 
  28.         }); 
  29.       } 
  30.  
  31.       // 購物車 
  32.       if (this.checkType('cart') && this.checkQuery(['shopcartId'])) { 
  33.       // 接口在中間頁去請求 
  34.         data = await this.submitCart({ shopcartids: JSON.parse(query.shopcartId) }); 
  35.       } 
  36.       
  37.      // 其他 
  38.      ..... 
  39.  
  40.       this.$router.replace({ 
  41.         name'orderConfirm'
  42.         query: confirmQuery, 
  43.       }); 
  44. }, 

使用中間頁的一些注意點

1: 不要濫用中間頁

中間頁在某些業務場景下確實能幫我們解決一部分的邏輯抽離問題,至少面對以上幾種場景不用再去擔心某些情況下給哪個業務方爸爸去提供不同的目標頁,但是我們還是要根據項目中實際情況去評估使用一個中間頁的必要性,至少我們應該保持著:必要性、業務耦合度、可擴展性的角度去理性編碼,濫用中間頁后期可能就會出現中間頁到中間頁的跳轉(不同開發可能寫了跳轉頁邏輯,已經是個公共的頁面),由于文檔不清晰或者更新不及時等原因,反而可能后期維護性成本更大,這是我們需要注意的一個問題。

2: 對于必要性的中間頁盡量往標準化處理

對于 query 上的公有參數例如來源 appid,統一好格式 h5 環境下 : p_h5_XXX, app 渠道下:p_app_XXX, 小程序環境下:p_miniPorgram_XXX,其他參數也類似,定義好統一標準

對于 query 上的必要參數例如目標 targetUrl,若提供的 url 不存在,提供標準化的報錯處理

對于豐富多樣化的參數來源,有必要的情況下,可放在服務端去處理,對外提供一個可配置化接口

3: 要有安全意識,針對 targetUrl 做好防漏洞處理,避免不可預期的 XSS 攻擊等

中間頁要考慮到 targetUrl 的安全漏洞,尤其是不需要登錄的中間頁,假如黑客發送某個鏈接,欺騙用戶點擊看起來是公司的福利界面鏈接,誘騙用戶點擊,用戶會毫無防范的點擊跳轉至虛假界面,則容易騙取用戶的相關信息,這是我們需要在加中間頁額外考慮的事情,可以對 targetUrl 加上白名單限制。

總結

 

以上就是我在我們項目中使用過的一些中間頁的一些總結吧,希望碰到有類似業務的小伙伴一點收獲,當然這只是我目前遇到的一些情況,還有我沒想到和沒涉及到的,歡迎提出你們寶貴的建議,就醬紫吧~

黃琴:一枚前端妹子,愛笑、愛運動、愛音樂、愛旅行

 

責任編輯:武曉燕 來源: 微醫大前端技術
相關推薦

2021-04-01 10:05:28

nodejs前端服務器

2019-01-30 08:14:28

協議區塊鏈堆棧

2024-08-08 14:50:00

模型數據

2024-02-21 08:19:54

2021-02-11 08:21:02

中間件開發CRUD

2009-07-30 13:07:49

ASP.NET中的三層

2022-09-19 08:01:13

美團Leaf發號

2023-10-24 07:50:18

消息中間件MQ

2017-11-27 06:01:37

數據庫中間件中間層

2019-01-28 09:32:30

跳槽員工程序員

2024-11-25 07:00:00

RedisMySQL數據庫

2023-03-03 12:37:50

JavaJVM內存溢出

2016-11-01 20:26:47

前端模板underscoreWeb

2020-06-11 11:36:49

線程池Java場景

2018-02-07 10:24:01

Nginx服務器架構

2022-01-04 20:34:00

數據安全Relay

2015-01-12 09:33:27

WAN

2025-04-29 09:10:00

2025-02-27 09:49:32

2021-07-21 05:22:12

Webpack 前端 JavaScript
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品综合久久久 | 蜜桃毛片 | 国产精品99精品久久免费 | 国产欧美精品一区二区三区 | 国产福利91精品一区二区三区 | 亚洲综合二区 | 国产精品99精品久久免费 | 久久www免费视频 | jizz在线看片 | 九九九视频精品 | 成人av网站在线观看 | 成人av激情 | 国产精品99久久久久久久vr | 久久久国产精品入口麻豆 | 一级在线免费观看 | 99精品欧美一区二区蜜桃免费 | 色偷偷888欧美精品久久久 | 欧美日韩视频在线 | 免费人成在线观看网站 | 2022精品国偷自产免费观看 | 国产a区| 成人免费在线播放 | 亚洲欧美视频 | 欧美成年视频 | 国产精品久久一区二区三区 | 国产片侵犯亲女视频播放 | 日韩精品一区二区三区四区视频 | 综合精品久久久 | 国产一区二区三区在线免费 | 夜色www国产精品资源站 | 国产资源在线观看 | 久久久久久久一区二区三区 | 日韩日韩日韩日韩日韩日韩日韩 | 五月激情六月婷婷 | 久久久久久久一区 | 日本免费黄色 | 久久久久国产一区二区三区四区 | 97伊人| 一区二区国产精品 | 中国大陆高清aⅴ毛片 | 在线观看日韩av |