Skip to content

體育賽事列表

最後更新:2026-04-09


功能說明

體育賽事列表是 App 的核心功能(預設 Tab),讓使用者瀏覽各類體育賽事並進行下注。支援三個體育數據平台(FB 極速體育、DB OB體育、UP 雷速體育),提供滾球(InPlay)、今日賽事、早盤、收藏賽事、冠軍賽五種賽事類型切換。

使用者流程

  1. 進入「體育」Tab → 預設顯示 FB 極速體育的滾球賽事
  2. 頂部 Banner 區域顯示公告/廣告
  3. 球類切換欄(SportIconScrollBar)可左右滑動選擇:足球/籃球/網球/棒球等
  4. 賽事列表依聯賽分組顯示(MatchListHeaderCell + MatchListBodyCell
  5. 每場賽事顯示:隊名、即時比分(滾球)、主要賠率
  6. 點擊賠率 → 加入投注購物車,彈出 BetViewController 投注面板
  7. 長按賠率 → 依平台展開更多玩法
  8. 點擊賽事行 → 進入 STEventDetailViewController 賽事詳情頁
  9. 右上角篩選按鈕 → DropDownMenuViewControllerLeagueChooseCell 聯賽篩選
  10. 支援下拉刷新、上拉載入更多(分頁)
  11. 依球類切換時自動輪詢最新賠率

頁面跳轉

  • 點擊「體育」Tab → SportSegmentedController(賽事列表主頁)
  • 點擊賽事行 → STEventDetailViewController(賽事詳情)
  • 點擊賠率 → BetViewController(投注面板,底部彈出)
  • 篩選按鈕 → DropDownMenuViewController(聯賽篩選)

技術視角(開發看這裡)

相關檔案

類型檔案路徑
ViewController/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/SportSegmentedController.swift
ViewModel/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/SportSegmentedViewModel.swift
UseCase(球類選單)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/UseCase/Menu/SportMenusUseCase.swift
UseCase(賽事請求)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/UseCase/Match/SportMatchUseCase.swift
UseCase(玩法切換)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/UseCase/PlayMethod/SportPlayMethodUseCase.swift
UseCase(熱門聯賽)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/UseCase/LeagueFilter/SportMatchLeagueFilterUseCase.swift
UseCase(日期篩選)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/UseCase/Calendar/SportCalendarUseCase.swift
UseCase(完賽篩選)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/UseCase/FinishMatch/SportFinishMatchUseCase.swift
Service(FB 滾球)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/Service/Match/FB/FBSportInPlayMatchService.swift
Service(FB 今日)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/Service/Match/FB/FBSportTodayMatchService.swift
Service(FB 早盤)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/Service/Match/FB/FBSportEarlyMatchService.swift
Service(FB 收藏)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/Service/Match/FB/FBSportFavoriteMatchService.swift
Service(DB 滾球)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/Service/Match/DB/DBSportInPlayMatchService.swift
Service(DB 今日)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/Service/Match/DB/DBSportTodayMatchService.swift
Service(DB 早盤)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/Service/Match/DB/DBSportEarlyMatchService.swift
Service(DB 冠軍)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/Service/Match/DB/DBSportChampionMatchService.swift
Service(UP 滾球)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/Service/Match/UP/UPSportInPlayMatchService.swift
Service(UP 今日)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/Service/Match/UP/UPSportTodayMatchService.swift
Service(UP 早盤)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/Service/Match/UP/UPSportEarlyMatchService.swift
Service(UP 收藏)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/Service/Match/UP/UPSportFavoriteMatchService.swift
Service(UP 冠軍)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/Service/Match/UP/UPSportChampionMatchService.swift
Service(UP 賽果)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/Service/Match/UP/UPSportMatchResultService.swift
Service(UP 串關賠率)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/Service/Match/UP/UPSportSeriesOddsService.swift
Repository(FB 收藏)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/Repository/Favorite/FBSportFavoriteRepository.swift
Repository(DB 收藏)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/Repository/Favorite/DBSportFavoriteRepository.swift
Cell(賽事列表)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/Base/V/Cell/List/Body/MatchListBodyCell.swift
Cell(賽事 Header)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/Base/V/Cell/List/Head/MatchListHeaderCell.swift
Cell(冠軍)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/Base/V/Cell/Champion/ChampionListBodyDetailCell.swift
Adapter(列表)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/Adapter/
View(球類圖示列)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/Base/V/TitleView/SportIconScrollBar.swift
View(時間軸)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/Base/V/TitleView/SportTimeScrollBar.swift
View(得分區域)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/Base/V/SectionView/MatchSectionScoreView.swift
Protocol(登入提示)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/Base/Protocol/BBSportLoginAlertViewProtocol.swift
View(投注選擇)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/Base/V/BetView/SportSelectBetView.swift
Cell(冠軍 Header)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/Base/V/Cell/Champion/ChampionListBodyHeadCell.swift
View(冠軍 Header 其他)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/Base/V/Cell/Champion/ChampionListHeadOtherView.swift
Cell(聯賽選擇)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/Base/V/Cell/LeagueChoose/LeagueChooseCell.swift
Cell(索引)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/Base/V/Cell/LeagueChoose/SectionIndexViewCell.swift
Cell Extension(ColorCard)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/Base/V/Cell/List/Body/MatchListBodyCell+ColorCard.swift
Cell Extension(DB)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/Base/V/Cell/List/Body/MatchListBodyCell+DB.swift
Cell Extension(FB)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/Base/V/Cell/List/Body/MatchListBodyCell+FB.swift
Cell Extension(完賽)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/Base/V/Cell/List/Body/MatchListBodyCell+FinishGame.swift
Cell Extension(賠率)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/Base/V/Cell/List/Body/MatchListBodyCell+Odd.swift
Cell Extension(隊伍資訊)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/Base/V/Cell/List/Body/MatchListBodyCell+TeamInfo.swift
Cell Extension(UP)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/Base/V/Cell/List/Body/MatchListBodyCell+UP.swift
View(籃球列表)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/Base/V/Cell/List/Body/View/MatchListBasketBallView.swift
View(電競底部)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/Base/V/Cell/List/Body/View/MatchListBottomESportsView.swift
View(賽事底部)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/Base/V/Cell/List/Body/View/MatchListBottomEventView.swift
View(冠軍盤口 Header)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/Base/V/Champion/ChampionBetListSectionHeaderView.swift
View(冠軍盤口固定 Header)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/Base/V/Champion/FixedChampionBetListSectionHeader.swift
ViewController(下拉選單)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/Base/V/DropView/DropDownMenuViewController.swift
Manager(玩法類型)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/Base/V/DropView/STSportPlayTypeManager.swift
View(無網路佔位)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/Base/V/NetWorkView/NoNetworkPlaceholderView.swift
View(列表 Footer 刷新)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/Base/V/RefreshView/EventListFooterRefresh.swift
View(列表 Header 刷新)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/Base/V/RefreshView/EventListHeaderRefreshView.swift
View(得分-美式足球)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/Base/V/SectionView/MatchSectionScoreView+AmericanFootball.swift
View(得分-羽毛球)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/Base/V/SectionView/MatchSectionScoreView+Badmintion.swift
View(得分-籃球)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/Base/V/SectionView/MatchSectionScoreView+BasketBall.swift
View(得分-電競籃球)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/Base/V/SectionView/MatchSectionScoreView+EBasketball.swift
View(得分-電競)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/Base/V/SectionView/MatchSectionScoreView+ESports.swift
View(得分-冰球)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/Base/V/SectionView/MatchSectionScoreView+IceHockey.swift
View(得分-乒乓球)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/Base/V/SectionView/MatchSectionScoreView+TableTennis.swift
View(得分-網球)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/Base/V/SectionView/MatchSectionScoreView+Tennis.swift
View(得分-排球)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/Base/V/SectionView/MatchSectionScoreView+VolleyBall.swift
View(日曆覆蓋層)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/Base/V/TitleView/CalendarCoverView.swift
View(首頁標題樣式)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/Base/V/TitleView/HomePageTitleStyle.swift
View(首頁標題)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/Base/V/TitleView/HomePageTitleView.swift
View(玩法按鈕)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/Base/V/TitleView/PlayMethodButton.swift
View(玩法切換)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/Base/V/TitleView/PlayMethodSwitch.swift
View(時間/聯賽排序)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/Base/V/TitleView/SortByTimeOrLeagueComponent.swift
Cell(球類圖示)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/Base/V/TitleView/SportIconScrollBarCell.swift
Cell(時間軸)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/Base/V/TitleView/SportTimeScrollBarCell.swift
View(主播語言提示)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/Base/V/Video/AnchorLanguageTipView.swift
CellConfig(完賽賽程)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/Adapter/CellConfiguration/Fixture/FinishedFixtureEventListCellConfiguration.swift
CellConfig(賽程)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/Adapter/CellConfiguration/Fixture/FixtureEventListCellConfiguration.swift
CellConfig(可折疊)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/Adapter/CellConfiguration/FoldableSportEventListCellConfiguration.swift
CellConfig(冠軍)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/Adapter/CellConfiguration/Outright/OutrightEventListCellConfiguration.swift
CellConfig(基底)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/Adapter/CellConfiguration/SportEventListCellConfiguration.swift
Delegator(賽程)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/Adapter/Delegator/FixtureEventListDelegator.swift
Delegator(冠軍)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/Adapter/Delegator/OutrightEventListDelegator.swift
Delegator(基底)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/Adapter/Delegator/SportEventListDelegator.swift
Adapter(玩法處理)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/Adapter/PlayMethod/SportEventPlayMethodHandler.swift
Adapter(列表主)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/Adapter/SportEventListAdapter.swift
Repository(收藏 Protocol)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/Repository/Favorite/SportFavoriteRepository.swift
Repository(UP 收藏)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/Repository/Favorite/UPSportFavoriteRepository.swift
Service(BB 滾球排名)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/Service/Match/BB/InPlayRankMatchService.swift
Service(DB 收藏)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/Service/Match/DB/DBSportFavoriteMatchService.swift
Service(DB 賽果)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/Service/Match/DB/DBSportMatchResultService.swift
Service(FB 冠軍)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/Service/Match/FB/FBSportChampionMatchService.swift
Service(FB 賽果)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/Service/Match/FB/FBSportMatchResultService.swift
Service(FB 串關賠率)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/Service/Match/FB/FBSportSeriesOddsService.swift
Service(輪詢基底)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/Service/Match/PollingSportMatchService.swift
Model(賽事請求參數)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/Service/Match/SportMatchRequestParameter.swift
Model(賽事回應)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/Service/Match/SportMatchResponse.swift
Service(賽事 Protocol)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/Service/Match/SportMatchService.swift
Service(DB 選單)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/Service/Menu/DB/DBSportMenusService.swift
Service(DB 選單s)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/Service/Menu/DB/DBSportMenusServices.swift
Service(FB 選單)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/Service/Menu/FB/FBSportMenusService.swift
Service(FB 選單s)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/Service/Menu/FB/FBSportMenusServices.swift
Service(收藏選單)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/Service/Menu/SportFavoriteMenusService.swift
Service(選單 Protocol)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/Service/Menu/SportMenusService.swift
Service(UP 選單)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/Service/Menu/UP/UPSportMenusService.swift
Service(UP 選單s)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/Service/Menu/UP/UPSportMenusServices.swift
UseCase(日曆格式 DB)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/UseCase/Calendar/Formatter/DB/DBSportCalendarFormatter.swift
UseCase(日曆格式 FB)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/UseCase/Calendar/Formatter/FB/FBSportCalendarFormatter.swift
UseCase(日曆格式 Protocol)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/UseCase/Calendar/Formatter/SportCalendarFormatter.swift
UseCase(日曆格式 UP)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/UseCase/Calendar/Formatter/UP/UPSportCalendarFormatter.swift
UseCase(完賽篩選建構器)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/UseCase/FinishMatch/SportFinishMatchFilterControllerBuilder.swift
UseCase(折疊)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/UseCase/Fold/SportMatchFoldUseCase.swift
UseCase(熱門聯賽 Protocol)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/UseCase/HotLeague/HotLeagueUseCase.swift
UseCase(熱門聯賽實作)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/UseCase/HotLeague/SportHotLeagueUseCase.swift
UseCase(聯賽首字母)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/EventList/SportSegmented/UseCase/LeagueFilter/SportLeagueFirstLetterUseCase.swift
ViewController(體育首頁)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/HomePage/SportHomeViewController.swift
Adapter(Banner)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/HomePage/Adapter/SportBannerAdapter.swift
Adapter(投注購物車)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/HomePage/Adapter/SportBetCartAdapter.swift
Adapter(浮球)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/HomePage/Adapter/SportFloatingBallViewAdapter.swift
Adapter(維護)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/HomePage/Adapter/SportMaintenanceAdapter.swift
Adapter(導航列)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/HomePage/Adapter/SportNavViewAdapter.swift
Adapter(分段控制)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/HomePage/Adapter/SportSegmentAdapter.swift
Adapter(滑動)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/HomePage/Adapter/SportSlideAdapter.swift
Extension(GameType+SportPage)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/HomePage/Shared/GameType+SportPage.swift
View(滑動視圖)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/HomePage/Shared/SlideView/SlideView.swift
Protocol(滑動 DataSource)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/HomePage/Shared/SlideView/SlideViewDataSource.swift
Protocol(滑動 Delegate)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/HomePage/Shared/SlideView/SlideViewDelegate.swift
View(滾動包裝)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/HomePage/Shared/SportScrollWrapper/SportScrollWrapper.swift
Model(首頁聊天)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Banner/Model/BBHomeChatModel.swift
Model(首頁 Banner)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Banner/Model/SportHomeBannerModel.swift
Service(Banner)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Banner/SportHomeBannerService.swift
View(公告)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Banner/V/AnnouncementView.swift
View(複合視圖)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Banner/V/BBComplexView.swift
Cell(自訂 Banner)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Banner/V/BBCustomBannerCell.swift
View(賽事資訊)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Banner/V/BBMatchInfoView.swift
View(首頁導航)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Banner/V/HomeNavView.swift
View(Banner 輪播)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Banner/V/IFBannerView.swift
View(FSPageViewLayout)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Banner/V/Sources/FSPageViewLayout.swift
View(FSPageViewTransformer)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Banner/V/Sources/FSPageViewTransformer.swift
View(FSPagerCollectionView)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Banner/V/Sources/FSPagerCollectionView.swift
View(FSPagerView)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Banner/V/Sources/FSPagerView.swift
Cell(FSPagerViewCell)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Banner/V/Sources/FSPagerViewCell.swift
Model(FSPagerViewLayoutAttributes)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Banner/V/Sources/FSPagerViewLayoutAttributes.swift
ObjC Header(FSPagerView)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Banner/V/Sources/FSPagerViewObjcCompat.h
ObjC Impl(FSPagerView)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Banner/V/Sources/FSPagerViewObjcCompat.m
View(分段控制)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Banner/V/SportHomeSegmentedControl/SportHomeSegmentedControl.swift
ViewModel(分段控制)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Banner/V/SportHomeSegmentedControl/SportHomeSegmentedControlViewModel.swift
Model(聯賽選擇 VO)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/LeagueScreening_Search/Features/General/Models/LeagueChooseVO.swift
ViewModel(聯賽比較)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/LeagueScreening_Search/Features/General/ViewModels/CompsLeagueViewModel.swift
ViewController Extension(聯賽篩選 Action)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/LeagueScreening_Search/Features/STLeagueFiltering/C/STLeagueChooseViewController+Action.swift
ViewController Extension(聯賽篩選 Data)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/LeagueScreening_Search/Features/STLeagueFiltering/C/STLeagueChooseViewController+Data.swift
ViewController(聯賽篩選)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/LeagueScreening_Search/Features/STLeagueFiltering/C/STLeagueChooseViewController.swift
ViewController(聯賽過濾)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/LeagueScreening_Search/Features/STLeagueFiltering/C/STLeagueFilteringController.swift
Model(聯賽篩選)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/LeagueScreening_Search/Features/STLeagueFiltering/Models/STLeagueFilterModel.swift
Model Extension(聯賽 VM)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/LeagueScreening_Search/Features/STLeagueFiltering/Models/STLeagueModel+VM.swift
View(聯賽選擇底部)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/LeagueScreening_Search/Features/STLeagueFiltering/V/STLeagueChooseBottomView.swift
Cell(聯賽選擇)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/LeagueScreening_Search/Features/STLeagueFiltering/V/STLeagueChooseCell.swift
View(聯賽選擇列表)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/LeagueScreening_Search/Features/STLeagueFiltering/V/STLeagueChooseListView.swift
Model(聯賽選擇快取)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/LeagueScreening_Search/Features/SearchAndLeagueFiltering/M/LeagueChooseCache.swift
View(自訂搜尋列)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/LeagueScreening_Search/Features/SearchAndLeagueFiltering/V/CustomBar.swift
View(聯賽選擇 Header)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/LeagueScreening_Search/Features/SearchAndLeagueFiltering/V/LeagueChooseHeadView.swift
View(聯賽索引)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/LeagueScreening_Search/Features/SearchAndLeagueFiltering/V/LeagueSectionIndexView.swift
Cell(新聯賽選擇)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/LeagueScreening_Search/Features/SearchAndLeagueFiltering/V/NewLeagueChooseCell.swift
View(搜尋聯賽內容)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/LeagueScreening_Search/Features/SearchAndLeagueFiltering/V/SearchLeagueContentView.swift
View(搜尋聯賽標題樣式)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/LeagueScreening_Search/Features/SearchAndLeagueFiltering/V/SearchLeagueTitleStyle.swift
View(搜尋聯賽標題)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/LeagueScreening_Search/Features/SearchAndLeagueFiltering/V/SearchLeagueTitleView.swift
Service(選單資料邏輯)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/GetMenu/MenuDataLogic.swift
Service(平台服務)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/GetMenu/PlatformService.swift
Model(投注項)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Model/BetItemModel.swift
Enum(投注結果類型)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Model/Enum/BetResultType.swift
Enum(賠率變動狀態)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Model/Enum/OddChangeStatus.swift
Handler(賠率變動)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Model/OddChangeHandler.swift
Protocol(聯賽 Model)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Model/Protocol/ILeagueModel.swift
Protocol(體育 Model)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Model/Protocol/ISportModel.swift
Protocol(轉換)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Model/Protocol/ITransformable.swift
View(浮球輪播)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/View/AssistiveTouch/AssistiveCarouselView/AssistiveCarouselView.swift
View(單一浮球)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/View/AssistiveTouch/AssistiveCarouselView/AssistiveTouchForOne.swift
View(輪播視圖)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/View/AssistiveTouch/AssistiveCarouselView/CarouselView.swift
View(堆疊浮球)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/View/AssistiveTouch/AssistiveTouchForStack.swift
Model(浮球)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/View/AssistiveTouch/AssistiveTouchModel.swift
ViewModel(浮球)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/View/AssistiveTouch/AssistiveTouchViewModel.swift
View(金額標籤)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/View/BBMonyLabel.swift
API(FB 統計)/Users/user/Work/bbsport-new/BBSport/API/FBSportAPI/Sport/FBSportAPI+StatisticalRequest.swift
API(FB 賽事列表)/Users/user/Work/bbsport-new/BBSport/API/FBSportAPI/FBSportAPI+MatchListRequest.swift
API(FB 在售聯賽)/Users/user/Work/bbsport-new/BBSport/API/FBSportAPI/FBSportAPI+OnSaleLeaguesRequest.swift
API(FB 公告列表)/Users/user/Work/bbsport-new/BBSport/API/FBSportAPI/FBSportAPI+BulletinListPageRequest.swift
API(FB 語言)/Users/user/Work/bbsport-new/BBSport/API/FBSportAPI/FBSportAPI+FetchLanguageRequest.swift
API(FB 基底)/Users/user/Work/bbsport-new/BBSport/API/FBSportAPI/FBSportAPI.swift
API(FB Domain 檢測)/Users/user/Work/bbsport-new/BBSport/API/FBSportAPI/Domain/FBSportAPI+DomainCheckRequest.swift
API(FB 最快域名)/Users/user/Work/bbsport-new/BBSport/API/FBSportAPI/Repository/FBSportFastestDomainRepository.swift
API(FB Request 基底)/Users/user/Work/bbsport-new/BBSport/API/FBSportAPI/FBSportAPIRequest/FBSportAPIRequest.swift
API(FB Auth Adapter)/Users/user/Work/bbsport-new/BBSport/API/FBSportAPI/FBSportAPIRequest/Adapter/FBSportRequestAuthorizationAdapter.swift
API(FB Error Decision)/Users/user/Work/bbsport-new/BBSport/API/FBSportAPI/FBSportAPIRequest/Decision/FBSportErrorDecision.swift
API(FB JSON Decision)/Users/user/Work/bbsport-new/BBSport/API/FBSportAPI/FBSportAPIRequest/Decision/FBSportParseJSONStringDecision.swift
API(FB Result Decision)/Users/user/Work/bbsport-new/BBSport/API/FBSportAPI/FBSportAPIRequest/Decision/FBSportParseResultDecision.swift
API(UP 統計)/Users/user/Work/bbsport-new/BBSport/API/UPSportAPI/Sport/UPSportAPI+StatisticalRequest.swift
API(UP 賽事列表)/Users/user/Work/bbsport-new/BBSport/API/UPSportAPI/UPSportAPI+MatchListRequest.swift
API(UP 在售聯賽)/Users/user/Work/bbsport-new/BBSport/API/UPSportAPI/UPSportAPI+OnSaleLeaguesRequest.swift
API(UP 公告列表)/Users/user/Work/bbsport-new/BBSport/API/UPSportAPI/UPSportAPI+BulletinListPageRequest.swift
API(UP 語言)/Users/user/Work/bbsport-new/BBSport/API/UPSportAPI/UPSportAPI+FetchLanguageRequest.swift
API(UP 基底)/Users/user/Work/bbsport-new/BBSport/API/UPSportAPI/UPSportAPI.swift
API(UP Domain 檢測)/Users/user/Work/bbsport-new/BBSport/API/UPSportAPI/Domain/UPSportAPI+DomainCheckRequest.swift
API(UP 最快域名)/Users/user/Work/bbsport-new/BBSport/API/UPSportAPI/Repository/UPSportFastestDomainRepository.swift
API(UP Request 基底)/Users/user/Work/bbsport-new/BBSport/API/UPSportAPI/UPSportAPIRequest/UPSportAPIRequest.swift
API(UP Auth Adapter)/Users/user/Work/bbsport-new/BBSport/API/UPSportAPI/UPSportAPIRequest/Adapter/UPSportRequestAuthorizationAdapter.swift
API(UP Error Decision)/Users/user/Work/bbsport-new/BBSport/API/UPSportAPI/UPSportAPIRequest/Decision/UPSportErrorDecision.swift
API(UP JSON Decision)/Users/user/Work/bbsport-new/BBSport/API/UPSportAPI/UPSportAPIRequest/Decision/UPSportParseJSONStringDecision.swift
API(UP Result Decision)/Users/user/Work/bbsport-new/BBSport/API/UPSportAPI/UPSportAPIRequest/Decision/UPSportParseResultDecision.swift
API(DB 基底)/Users/user/Work/bbsport-new/BBSport/API/DBSportAPI/DBSportAPI.swift
API(DB Host)/Users/user/Work/bbsport-new/BBSport/API/DBSportAPI/DBSportAPI+Host.swift
API(DB 分類列表)/Users/user/Work/bbsport-new/BBSport/API/DBSportAPI/Sport/DBSportAPI+CategoryListRequest.swift
API(DB 冠軍聯賽列表)/Users/user/Work/bbsport-new/BBSport/API/DBSportAPI/Sport/DBSportAPI+ChampionLeagueListRequest.swift
API(DB 冠軍賽果)/Users/user/Work/bbsport-new/BBSport/API/DBSportAPI/Sport/DBSportAPI+ChampionMatchResultRequest.swift
API(DB 賽事資訊)/Users/user/Work/bbsport-new/BBSport/API/DBSportAPI/Sport/DBSportAPI+DBEventInfoRequest.swift
API(DB 賽事詳情)/Users/user/Work/bbsport-new/BBSport/API/DBSportAPI/Sport/DBSportAPI+EventDetailRequest.swift
API(DB 收藏賽事)/Users/user/Work/bbsport-new/BBSport/API/DBSportAPI/Sport/DBSportAPI+FavoriteEventsRequest.swift
API(DB 聯賽數量)/Users/user/Work/bbsport-new/BBSport/API/DBSportAPI/Sport/DBSportAPI+LeagueCountRequest.swift
API(DB 盤口賠率)/Users/user/Work/bbsport-new/BBSport/API/DBSportAPI/Sport/DBSportAPI+MatchOddsInfoRequest.swift
API(DB 賽果)/Users/user/Work/bbsport-new/BBSport/API/DBSportAPI/Sport/DBSportAPI+MatcheResultRequest.swift
API(DB 體育選單)/Users/user/Work/bbsport-new/BBSport/API/DBSportAPI/Sport/DBSportAPI+SportMenuRequest.swift
API(DB 公告列表)/Users/user/Work/bbsport-new/BBSport/API/DBSportAPI/Notice/DBSportAPI+BulletinListPageRequest.swift
API(DB 使用者資訊)/Users/user/Work/bbsport-new/BBSport/API/DBSportAPI/User/DBSportAPI+UserInfoRequest.swift
API(DB Request 基底)/Users/user/Work/bbsport-new/BBSport/API/DBSportAPI/DBSportAPIRequest/DBSportAPIRequest.swift
API(DB 語言 Adapter)/Users/user/Work/bbsport-new/BBSport/API/DBSportAPI/DBSportAPIRequest/Adapter/DBSportLangueAdapter.swift
API(DB RequestID Adapter)/Users/user/Work/bbsport-new/BBSport/API/DBSportAPI/DBSportAPIRequest/Adapter/DBSportRequestIDAdapter.swift
API(DB Decode Decision)/Users/user/Work/bbsport-new/BBSport/API/DBSportAPI/DBSportAPIRequest/Decision/DBSportDecodeDecision.swift
API(DB Error Decision)/Users/user/Work/bbsport-new/BBSport/API/DBSportAPI/DBSportAPIRequest/Decision/DBSportErrorDecision.swift
API(DB JSON Decision)/Users/user/Work/bbsport-new/BBSport/API/DBSportAPI/DBSportAPIRequest/Decision/DBSportParseJSONStringDecision.swift
API(DB Result Decision)/Users/user/Work/bbsport-new/BBSport/API/DBSportAPI/DBSportAPIRequest/Decision/DBSportParseResultDecision.swift
Enum(共用球類類型)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Common/CommonSportType.swift
Config(體育常數)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Common/SportComponentConst.swift
Config(OB 體育設定)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Common/SportConfiguration/OBSportsConfig.swift
Config(ST 體育設定)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Common/SportConfiguration/STSportsConfig.swift
Config(體育設定 Protocol)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Common/SportConfiguration/SportConfig.swift
Utility(WeakDelegate)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Common/WeakDelegate.swift
API(首頁 Banner)/Users/user/Work/bbsport-new/BBSport/API/STAPI/Sport/HomeBanner/STAPI+HomeBannerRequest.swift
API(方案列表)/Users/user/Work/bbsport-new/BBSport/API/STAPI/Sport/STAPI+AllPlanListsRequest.swift
API(滾球排名)/Users/user/Work/bbsport-new/BBSport/API/STAPI/Sport/STAPI+InPlayMatchRank.swift
API(賽事是否有陣容)/Users/user/Work/bbsport-new/BBSport/API/STAPI/Sport/STAPI+IsMatchHasSquadRequest.swift
API(聯賽權重)/Users/user/Work/bbsport-new/BBSport/API/STAPI/Sport/STAPI+LeagueWeightsRequest.swift
API(球類選單順序)/Users/user/Work/bbsport-new/BBSport/API/STAPI/Sport/STAPI+MenuSequenceRequest.swift
API(方案購買數)/Users/user/Work/bbsport-new/BBSport/API/STAPI/Sport/STAPI+PlanBuyCountRequest.swift
API(方案列表查詢)/Users/user/Work/bbsport-new/BBSport/API/STAPI/Sport/STAPI+PlanListRequest.swift

API

功能說明NamespaceEndpointMethod主要參數
賽事列表(滾球/今日/早盤)FBSportAPIv1/match/getListPOST jsonsportId, currentPage, leagueIds, beginTime, endTime
賽事列表(滾球/今日/早盤)UPSportAPIv1/match/getListPOST jsonsportId, currentPage, leagueIds, beginTime, endTime
賽事列表(DB 滾球/今日/早盤)DBSportAPIapi/forehead/gamebetob/getEventInfoPOST urlFormsportIds, sort, market(1=滾球/2=即將/3=今日/4=早盤), pageNumber, pageSize, competitionIds, language
冠軍聯賽列表DBSportAPIyewu11/v1/m/matchesPBPOST jsoneuid(menuId), cuid(userId), type=100, sort
收藏賽事DBSportAPIyewu11/v1/m/getMatchBaseInfoByMidsPBPOST jsonmids(賽事 ID 陣列)
聯賽數量DBSportAPIapi/forehead/gamebetob/getLeagueCountPOST urlFormsportId, type, eventBeginTime, eventEndTime, language
熱門球類排行STAPIapi/forehead/data/betting/inPlayMatchRankPOST urlFormisInPlay=true, sportIds, marketTypes
球類選單順序STAPIapi/forehead/gamebet/config/gameHomeTabSortPOST json
全局熱搜STAPIapi/forehead/data/user/global/search/hotLeaguePOST urlForm

資料模型

STLeagueModel(聯賽)

欄位類型說明
idInt聯賽 ID
naString聯賽名稱
lurlString聯賽 Logo URL
sportIdInt球類 ID
events[STEventModel]賽事列表

STEventModel(賽事)

欄位類型說明
idInt賽事 ID
sidInt球類 ID
lgSTLeagueModel聯賽資料
ts[STLeagueModel]球隊陣列(ts[0]=主隊、ts[1]=客隊,取 .na 為隊名)
mg[STMarketGroupModel]盤口(賠率)集合
mgs[STMarketGroupModel]賽果 API 盤口
nmg[STMarketGroupModel]列表過濾後的盤口
tmsInt盤口統計數量
sg[STEventResultModel]比分資訊(含時段 pe、事件 tyg、分數 sc
nsg[STEventResultModel]比分資訊(備用)
resultEventScoreboardModel比分看板
mcSTTimeModel比賽時鐘(s=秒數、pe=時段 ID、r=是否跑表)
btDouble開賽時間(時間戳)
beginTimeString開賽時間(字串)
nmString冠軍賽事名稱
msMatchStatus賽事狀態(0=已結束、1=推遲、2=中斷、3=取消、4=未開賽、5=進行中)
fidInt賽制
neInt中立場(1=中立場、0=非中立場)
vsVsParameterModel?動畫/直播串流資訊(flvSD、m3u8SD、web、have)
ssiInt發球方
isInplayBool是否滾球(由 ms 推導:live 或 interrupted)
isFinishBool賽事是否結束(由 ms 推導:ended 或 cancelled)
ptSTPlayType賽事類型(1=今日、2=早盤、4=滾球)
lsdataFootBallTechnicModel?雷速數據(足球技術統計)

OBEventModel(DB 體育賽事)

欄位說明
mid賽事 ID
mhn / man主隊/客隊名稱
csid / csna球類 ID/名稱
tid / tn聯賽 ID/名稱
mcg欄目類型(1=滾球, 2=即將, 3=今日, 4=早盤)
hps玩法集合([OBOddInfoModel])
msc比分集合(格式:S1|1:0)
mhs盤口狀態(0=開, 1=封, 2=關, 11=鎖)

實作重點

  1. UseCase 依賴注入SportSegmentedViewModel 透過建構子注入各 UseCase,不同平台/玩法對應不同組合,ViewModel 本身不判斷平台

  2. 輪詢機制:滾球每 5 秒、今日每 30 秒、早盤每 60 秒,透過 STStartPolling 啟動;切換球類或賽事類型時停止舊輪詢、啟動新輪詢

  3. Fold 展開/收合STDataManager.dealFold() 處理賽事列表展開狀態,保持重新請求後 UI 收合狀態一致

  4. 熱門聯賽過濾:FB InPlay 足球/籃球有熱門聯賽標記(SportHotLeagueUseCase),影響列表排序與 Header 展示

  5. 聯賽篩選SportMatchLeagueFilterUseCase 管理已選篩選聯賽 ID 列表,適用 InPlay/Today/Early

  6. 日期篩選(Early)SportCalendarUseCase + SportCalendarFormatter(各平台格式不同),傳給 API 的 beginTime/endTime 格式需依平台轉換

  7. 多平台 Cell 差異MatchListBodyCell+FB.swiftMatchListBodyCell+DB.swiftMatchListBodyCell+UP.swift 各自處理不同平台的賠率格式與 UI 差異

  8. 已知限制:DB 冠軍賽(Champion)不支援串關,且 DB/UP 的早盤預約投注功能與 FB 不同


API 呼叫流程

進入體育 Tab

SportHomeViewController.viewWillAppear
  ├─ [並行] 載入選單 (Sport Menu)
  │  ├─ FB: POST v1/match/statistical {languageType:"CMN"}
  │  │  → 回傳各球種的滾球/今日/早盤數量
  │  ├─ DB: POST api/forehead/gamebetob/getObSportMenu {language:"chs"}
  │  │  → menuId: 200=滾球, 202=今日, 203=早盤
  │  └─ UP: POST v1/match/statistical (同 FB 結構)

  └─ [接續] 載入賽事列表 (Event List)
     ├─ FB/UP: POST v1/match/getList
     │  {sportId:"1", type:1, languageType:"CMN", current:1, orderBy:0}
     │  type: 1=滾球, 3=今日, 4=早盤

     └─ DB: POST api/forehead/gamebetob/getEventInfo
        {sportIds:"1", market:1, pageNumber:1, pageSize:50, sort:1}
        market: 1=滾球, 3=今日, 4=早盤

切換球種 / 時間篩選

用戶點擊球種或滾球/今日/早盤
  └─ SportSegmentedViewModel.fetchSportMatches(at:)
     ├─ 重置 currentPage = 1
     └─ matchUseCase.requestMatch(force: true)
        └─ [API] 同上 MatchListRequest / DBEventInfoRequest
           └─ 更新 eventListAdapter.datasource → tableView.reloadData

聯賽篩選

用戶點擊「選擇聯賽」
  ├─ [API] FB/UP: POST v1/match/getOnSaleLeagues
  │  {languageType:"CMN", sportId:1, type:1}

  └─ [API] DB: 從 getEventInfo 回應中取得聯賽
  
選擇聯賽後 → 帶入 leagueIds 參數重新請求列表

下拉刷新 / 上拉載入更多

下拉刷新 → currentPage = 1 → 重新請求
上拉載入 → currentPage += 1 → 追加資料
  └─ isLastPage → endRefreshingWithNoMoreData()