[{"data":1,"prerenderedAt":404},["ShallowReactive",2],{"portfolio-\u002Fportfolio\u002Fb2b-realtor-listing-platform":3},{"id":4,"title":5,"award":6,"body":7,"cover":82,"description":370,"extension":386,"featured":387,"link":6,"meta":388,"navigation":389,"order":378,"path":390,"pinned":387,"repo":6,"role":391,"seo":392,"stack":393,"stem":400,"summary":401,"year":402,"__hash__":403},"portfolio\u002Fportfolio\u002Fb2b-realtor-listing-platform.md","B 端房仲刊登平台",null,{"type":8,"value":9,"toc":369},"minimark",[10,14,23,30,58,73,76,83,86,112,119,122,128,133,152,156,163,189,196,200,203,233,237,240,261,264,268,275,293,296,299,302,313,316,334,337],[11,12,13],"h2",{"id":13},"專案概述",[15,16,17,18,22],"p",{},"一般人在房仲網站上看到的物件，背後都要有人「刊登」上去。這個專案做的是",[19,20,21],"strong",{},"給房仲\n經紀人（B 端）使用的刊登平台","：經紀人在平台上建立物件、上架到前台，並可以付費\n購買各種曝光方案，讓自己的物件被更多人看到。",[15,24,25,26,29],{},"對公司來說，這是一個",[19,27,28],{},"直接向房仲收費的營收產品","。收費項目包括：",[31,32,33,40,46,52],"ul",{},[34,35,36,39],"li",{},[19,37,38],{},"物件刊登","：依刊登件數與天數收費，件數買得越多、單價越低",[34,41,42,45],{},[19,43,44],{},"物件排序","：刊登期間每天自動更新數次，讓物件重新回到列表前面",[34,47,48,51],{},[19,49,50],{},"物件置頂（關注焦點）","：在列表最上方的重點曝光區塊固定顯示一段時間",[34,53,54,57],{},[19,55,56],{},"刊登廣告","：售屋、租屋各自有刊登與廣告方案",[15,59,60,61,64,65,68,69,72],{},"整個系統分成 ",[19,62,63],{},"B 端物件、點數、會員"," 三大核心，再加上負責推播的",[19,66,67],{},"通知中心","，\n並且",[19,70,71],{},"全部建置在雲端","。",[11,74,75],{"id":75},"收費方案",[15,77,78],{},[79,80],"img",{"alt":81,"src":82},"B 端刊登平台的收費方案頁面：左側為售屋刊登與廣告、租屋刊登與廣告、點數加值等選單；右側列出物件刊登 90 天（每筆每天自動更新 3 次）的 1、20、50、70 件方案與對應折扣，以及關注焦點 7 天（列表最置頂）方案","\u002Fimages\u002Fportfolio\u002Fb2b-listing-pricing.png",[15,84,85],{},"上圖是平台上的收費方案頁面，可以看到幾個設計重點：",[31,87,88,94,100,106],{},[34,89,90,93],{},[19,91,92],{},"方案 = 件數 × 天數 × 權益","：例如「物件刊登 90 天，每筆每天自動更新 3 次」，\n購買 20 件、50 件、70 件分別有不同折扣，買越多日單價越低",[34,95,96,99],{},[19,97,98],{},"廣告天數與使用期限分開計算","：「關注焦點 7 天」是指置頂曝光 7 天，但購買後在\n90 天內都可以挑一個時間使用，讓經紀人自己決定要把置頂用在哪個物件、哪個時機",[34,101,102,105],{},[19,103,104],{},"方案之間有相依關係","：關注焦點要搭配物件刊登使用——物件必須先在刊登中，才能\n被置頂",[34,107,108,111],{},[19,109,110],{},"售屋與租屋分開","：售屋、租屋的方案與價格各自獨立",[15,113,114,115,118],{},"這些規則都不是寫死在畫面上，而是由後端的",[19,116,117],{},"方案設定","決定：新增一個方案、調整價\n格與折扣、改變天數，只需要調整設定，不需要改程式。",[11,120,121],{"id":121},"系統架構",[15,123,124],{},[79,125],{"alt":126,"src":127},"B 端刊登平台架構圖：房仲經紀人登入會員後，以點數購買方案取得權益；B 端物件以 CQRS + Event Sourcing 實作，寫入端刊登時檢查權益並寫入 MSSQL，讀取端 Elasticsearch 依付費權益決定排序，提供 C 端前台搜尋；新刊登與降價事件經由 RabbitMQ 送到通知中心，比對訂閱條件後推播給使用者","\u002Fimages\u002Fportfolio\u002Fb2b-listing-architecture.svg",[129,130,132],"h3",{"id":131},"會員全站統一認證","會員：全站統一認證",[31,134,135,138,145],{},[34,136,137],{},"依 RESTful API 規範建立會員 API，管理經紀人與所屬店鋪的資料",[34,139,140,141,144],{},"串接 ",[19,142,143],{},"OAuth","，B 端的所有網站共用同一套會員登入，經紀人登入一次就能在刊登後\n台、開發工具、店鋪管理之間切換",[34,146,147,148,151],{},"以 ",[19,149,150],{},"JWT"," 在各服務之間傳遞身分，每個 API 都能從 Token 中知道是哪位經紀人在操\n作，只能管理自己的物件、點數與方案",[129,153,155],{"id":154},"點數所有收費的基礎","點數：所有收費的基礎",[15,157,158,159,162],{},"經紀人先",[19,160,161],{},"儲值點數","，再用點數購買各種方案。所有收費都走點數，讓「付款」和「購\n買方案」拆成兩件事：",[31,164,165,171,177,183],{},[34,166,167,170],{},[19,168,169],{},"加值","：經紀人儲值後，點數進入自己的點數帳戶",[34,172,173,176],{},[19,174,175],{},"扣點","：購買方案時扣除對應點數，並取得方案的權益（件數、天數、使用期限）",[34,178,179,182],{},[19,180,181],{},"退點","：方案取消或異常時，依規則退回點數",[34,184,185,188],{},[19,186,187],{},"交易紀錄","：每一筆加值、扣點、退點都留下紀錄，帳戶餘額隨時可以由紀錄重新算\n出來、對得起來",[15,190,191,192,195],{},"點數牽涉到錢，所以每一次異動都",[19,193,194],{},"不直接修改餘額","，而是新增一筆交易紀錄，再由紀\n錄計算出目前的餘額；同一筆購買重複送出時，也只會扣一次點數。",[129,197,199],{"id":198},"b-端物件cqrs-event-sourcing","B 端物件：CQRS + Event Sourcing",[15,201,202],{},"物件是整個平台最核心的資料，寫入和讀取的需求差異很大：",[31,204,205,219],{},[34,206,207,210,211,214,215,218],{},[19,208,209],{},"寫入端","：經紀人刊登、修改、下架物件時，先檢查這位經紀人",[19,212,213],{},"目前的權益","——\n還有沒有剩餘的刊登件數、方案是否還在使用期限內——通過後才寫入。每一次變更都\n以",[19,216,217],{},"事件","的形式記錄下來（刊登、改價、下架、套用置頂……），物件的歷史可以完整\n追溯",[34,220,221,224,225,228,229,232],{},[19,222,223],{},"讀取端","：物件資料同步到 ",[19,226,227],{},"Elasticsearch","，提供前台的搜尋與列表。物件的",[19,230,231],{},"付\n費權益","也一起寫進索引，前台查詢時直接依權益決定排序",[129,234,236],{"id":235},"排序與置頂付費權益如何變成曝光","排序與置頂：付費權益如何變成曝光",[15,238,239],{},"前台的物件列表，排序規則大致是：",[241,242,243,249,255],"ol",{},[34,244,245,248],{},[19,246,247],{},"關注焦點","：購買置頂且仍在曝光期間的物件，固定顯示在列表最上方的重點區塊",[34,250,251,254],{},[19,252,253],{},"自動更新","：刊登方案中「每天自動更新 N 次」的物件，系統會在一天中定時更新它\n的排序時間，讓物件重新回到列表前段",[34,256,257,260],{},[19,258,259],{},"其他條件","：再依使用者選擇的條件（最新、價格、坪數等）排序",[15,262,263],{},"方案到期時，排程會把對應的權益從物件上移除，物件就回到一般排序。整個曝光邏輯都\n建立在 Elasticsearch 的索引欄位上，前台查詢不需要再回頭查方案與點數的資料。",[129,265,267],{"id":266},"通知中心訂閱與推播","通知中心：訂閱與推播",[15,269,270,271,274],{},"物件刊登之後，還要讓",[19,272,273],{},"有興趣的人知道","。通知中心負責物件的訂閱與推播：",[31,276,277,280,290],{},[34,278,279],{},"使用者可以訂閱特定條件（區域、價格帶、社區）或特定物件",[34,281,282,283,286,287],{},"物件",[19,284,285],{},"新刊登、降價","時，寫入端發布事件到 ",[19,288,289],{},"RabbitMQ",[34,291,292],{},"通知中心訂閱這些事件，比對有哪些使用者的訂閱條件符合，再把通知推播出去",[15,294,295],{},"刊登服務只負責發布事件，不需要知道誰訂閱了什麼；之後要新增其他通知方式或通知類\n型，也只需要在通知中心擴充。",[11,297,298],{"id":298},"全面雲端化",[15,300,301],{},"整個平台——會員、點數、B 端物件、通知中心，以及背後的資料庫、Elasticsearch、\nRabbitMQ——全部建置在雲端上，不依賴公司機房：",[31,303,304,307,310],{},[34,305,306],{},"各服務各自部署、各自擴展，刊登尖峰時只需要擴充物件相關的服務",[34,308,309],{},"不需要自行維護實體主機，環境可以快速建立與複製",[34,311,312],{},"對外服務的可用性不再受限於單一機房",[11,314,315],{"id":315},"成果",[31,317,318,325,328,331],{},[34,319,320,321,324],{},"公司得以依靠",[19,322,323],{},"物件刊登、物件排序、關注焦點","等方案，直接向房仲收取費用，成為穩\n定的營收來源",[34,326,327],{},"方案、價格、折扣都由設定決定，業務單位推出新方案不需要等工程排程",[34,329,330],{},"點數交易全部留有紀錄，帳務可以完整追溯",[34,332,333],{},"會員以 OAuth 統一認證，B 端所有網站共用同一套登入",[11,335,336],{"id":336},"使用技術",[31,338,339,345,351,357,363],{},[34,340,341,344],{},[19,342,343],{},"後端","：C#、ASP.NET Core Web API、CQRS、Event Sourcing",[34,346,347,350],{},[19,348,349],{},"資料","：MSSQL、Elasticsearch",[34,352,353,356],{},[19,354,355],{},"訊息","：RabbitMQ",[34,358,359,362],{},[19,360,361],{},"認證","：OAuth、JWT",[34,364,365,368],{},[19,366,367],{},"部署","：雲端",{"title":370,"searchDepth":371,"depth":371,"links":372},"",2,[373,374,375,383,384,385],{"id":13,"depth":371,"text":13},{"id":75,"depth":371,"text":75},{"id":121,"depth":371,"text":121,"children":376},[377,379,380,381,382],{"id":131,"depth":378,"text":132},3,{"id":154,"depth":378,"text":155},{"id":198,"depth":378,"text":199},{"id":235,"depth":378,"text":236},{"id":266,"depth":378,"text":267},{"id":298,"depth":371,"text":298},{"id":315,"depth":371,"text":315},{"id":336,"depth":371,"text":336},"md",false,{},true,"\u002Fportfolio\u002Fb2b-realtor-listing-platform","後端開發 ‧ 房仲業",{"title":5,"description":370},[394,395,396,397,289,227,398,143,150,399],"C#","ASP.NET Core","CQRS","Event Sourcing","MSSQL","Cloud","portfolio\u002Fb2b-realtor-listing-platform","給房仲經紀人使用的 B 端物件刊登平台，涵蓋 B 端物件、點數、會員與通知中心。經紀人以點數購買刊登、排序、物件置頂（關注焦點）等廣告方案，平台依付費權益決定物件在前台的曝光位置，讓公司能直接向房仲收取刊登與廣告費用；整個系統全部建置在雲端。",2022,"DILqVxX1prwoKW-h-lIzEkul_b-EmdiCtRjMhvT8994",1792959149969]