Appearance
每日任務與簽到
最後更新:2026-04-09
功能說明
提供使用者每日簽到(連續簽到獎勵)與每日任務完成系統。完成任務可獲得金幣、券(現金券/流水券/存送券)或稱號等獎勵。入口位於「我的」Tab 首頁。
使用者流程
每日簽到
- 進入「我的」→ 點擊任務/簽到入口 →
BBTasksDetailViewController(isSingMy = true) - 頁面顯示本月簽到日曆,已簽到日期標記
- 顯示當前連續簽到天數與下一次獎勵預覽
- 點擊「立即簽到」→ 呼叫簽到 API
- 簽到成功 → 顯示
SignInSuccessViewController動畫頁 - 顯示本次獎勵(金幣/券/稱號)
每日任務
- 進入「我的」→ 點擊任務入口 →
BBTasksDetailViewController(isSingMy = false) - 列表顯示今日任務(
BBDailyTaskCellViewModel):任務名稱、獎勵類型、完成進度;已完成 ✓、可領取、未完成三種狀態 - 點擊「領取」→ 呼叫領取 API
- 領取成功 → 更新任務狀態
頁面跳轉
- 「我的」首頁 →
BBTasksDetailViewController(簽到,isSingMy = true) - 「我的」首頁 →
BBTasksDetailViewController(任務,isSingMy = false) - 簽到成功 →
SignInSuccessViewController(動畫獎勵展示頁)
技術視角(開發看這裡)
相關檔案
| 類型 | 檔案路徑 |
|---|---|
| ViewController(任務主頁) | /Users/user/Work/bbsport-new/BBSport/Tab/我的/Mine/Tasks/C/BBTasksDetailViewController.swift |
| ViewController(簽到成功) | /Users/user/Work/bbsport-new/BBSport/Tab/我的/Mine/Tasks/C/SignInSuccessViewController.swift |
| ViewModel(任務詳情) | /Users/user/Work/bbsport-new/BBSport/Tab/我的/Mine/Tasks/VM/BBTasksDetailViewModel.swift |
| ViewModel(每日任務 Cell) | /Users/user/Work/bbsport-new/BBSport/Tab/我的/Mine/Tasks/M/BBDailyTaskCellViewModel.swift |
| View(每日任務主視圖) | /Users/user/Work/bbsport-new/BBSport/Tab/我的/Mine/Tasks/V/BBDailyTaskView.swift |
| View(簽到日曆 Cell) | /Users/user/Work/bbsport-new/BBSport/Tab/我的/Mine/Tasks/V/MyDailyMySignCell.swift |
| View(簽到資訊 Cell) | /Users/user/Work/bbsport-new/BBSport/Tab/我的/Mine/Tasks/V/MyDailyMySignInfoCell.swift |
| View(簽到獎勵 Cell) | /Users/user/Work/bbsport-new/BBSport/Tab/我的/Mine/Tasks/V/MyDailyMySignRewardCell.swift |
| View(任務進度條) | /Users/user/Work/bbsport-new/BBSport/Tab/我的/Mine/Tasks/V/MyDailyTaskProgressBarView.swift |
| View(任務進度條 Wrapper) | /Users/user/Work/bbsport-new/BBSport/Tab/我的/Mine/Tasks/V/MyDailyTaskProgressBarWrapper.swift |
| View(任務副標題) | /Users/user/Work/bbsport-new/BBSport/Tab/我的/Mine/Tasks/V/MyDailyTaskSubtitleView.swift |
| View(任務摘要 Cell) | /Users/user/Work/bbsport-new/BBSport/Tab/我的/Mine/Tasks/V/MyDailyTaskSummaryCell.swift |
| View(任務標題) | /Users/user/Work/bbsport-new/BBSport/Tab/我的/Mine/Tasks/V/MyDailyTaskTitleView.swift |
| View(簽到規則彈窗) | /Users/user/Work/bbsport-new/BBSport/Tab/我的/Mine/Tasks/V/SignRuleAlertView.swift |
| 任務管理器(核心) | /Users/user/Work/bbsport-new/BBSport/Tools/TaskManager/STTaskManager.swift |
| 任務管理器(通用) | /Users/user/Work/bbsport-new/BBSport/Tools/TaskManager/GeneralTaskManager.swift |
| 任務管理器(FB 體育) | /Users/user/Work/bbsport-new/BBSport/Tools/TaskManager/FBSportTaskManager.swift |
| 任務管理器(UP 體育) | /Users/user/Work/bbsport-new/BBSport/Tools/TaskManager/UPSportTaskManager.swift |
| 任務管理器(DB 體育) | /Users/user/Work/bbsport-new/BBSport/Tools/TaskManager/DBSportTaskManager.swift |
| ViewModel(簽到主頁) | /Users/user/Work/bbsport-new/BBSport/Tab/我的/Home/M/MyTask/STCheckInViewModel.swift |
| Model(簽到) | /Users/user/Work/bbsport-new/BBSport/Tab/我的/Home/M/MyTask/STTaskCheckInModel.swift |
| Model(任務首頁) | /Users/user/Work/bbsport-new/BBSport/Tab/我的/Home/M/MyTask/STTaskHomeModel.swift |
| API(每日任務進度) | /Users/user/Work/bbsport-new/BBSport/API/STAPI/Task/STAPI+TaskDailyMissionRequest.swift |
| API(任務領取獎勵) | /Users/user/Work/bbsport-new/BBSport/API/STAPI/Task/STAPI+DailyMissionGetRewardRequest.swift |
| API(簽到百分比) | /Users/user/Work/bbsport-new/BBSport/API/STAPI/Task/STAPI+TaskSignPercentageRequest.swift |
| API(活動設定) | /Users/user/Work/bbsport-new/BBSport/API/STAPI/Task/STAPI+TaskActivityInfoRequest.swift |
| API(簽到/領獎) | /Users/user/Work/bbsport-new/BBSport/API/STAPI/Task/STAPI+TaskGetRewardRequest.swift |
| API(可領取狀態) | /Users/user/Work/bbsport-new/BBSport/API/STAPI/STAPI+ActivityActReceiveInfoRequest.swift |
| API(活動 ID 查詢) | /Users/user/Work/bbsport-new/BBSport/API/STAPI/Task/STAPI+OperatePicRequest.swift |
API
| 功能說明 | Namespace | Endpoint | Method | 主要參數 |
|---|---|---|---|---|
| 每日任務進度 | STAPI | api/forehead/activity/dailyMission/get | POST urlForm | 無 |
| 每日任務領取獎勵 | STAPI | api/forehead/activity/dailyMission/award/get | POST urlForm | missionId |
| 簽到百分比 | STAPI | api/forehead/activity/act/userInfo | POST urlForm | actId, template=signPercentage |
| 活動設定(簽到日曆) | STAPI | api/forehead/activity/act/info | POST urlForm | actId, template=signPercentage |
| 簽到/簽到進度領獎 | STAPI | api/forehead/activity/act/get | POST urlForm | actId, actionType(0=簽到、1=領獎), subId, template=signPercentage |
| 可領取狀態檢查 | STAPI | api/forehead/activity/act/receive/info | POST urlForm | 無 |
| 活動 ID 查詢 | STAPI | api/forehead/system/config/images/query | POST urlForm | categoryId(任務用 "40201") |
資料模型
AwardType(獎勵類型枚舉)
| rawValue | 類型 | 圖示 |
|---|---|---|
| -9, 0, 15 | .coin(金幣/現金合併顯示) | sign_coin_not / sign_coin_ed |
| 8, 12, 13 | .roll(券) | sign_roll_not / sign_roll_ed |
| 17 | .title(稱號) | sign_title_not / sign_title_ed |
後端獎勵類型對照:
| 值 | 說明 |
|---|---|
-9 | 現金 |
0 | 金幣 |
3 | 實物 |
8 | 現金券 |
11 | VIP 經驗值 |
12 | 存送券 |
13 | 流水券 |
15 | 金幣 |
16 | 禮品券(未使用) |
17 | 稱號 |
前端
.coin類型合併了現金(-9)、金幣(0)、金幣(15),僅影響圖示顯示,不區分這三種獎勵。
TaskDailyMissionDataModel
包含今日任務列表,各任務含:任務名稱、獎勵類型、完成條件、當前進度、是否可領取。
STTaskCheckInModel
包含:本月簽到日曆數據、連續簽到天數、待簽到狀態。
實作重點
任務/簽到共用 VC:
BBTasksDetailViewController透過isSingMy屬性決定顯示「簽到」或「任務」Section;TaskSection枚舉:.singInMy(簽到)/.taskMy(任務)簽到獎勵類型判斷:
AwardType(rawValue:)依後端回傳的awardType數字映射到前端顯示類型;同一獎勵數字可能在前端顯示相同類型(如 -9, 0, 15 都是.coin)簽到百分比請求:需要傳入
actId(活動 ID)+template: "signPercentage",用於顯示本月簽到完成百分比進度條已知限制:活動領取 API(
ActivityActReceiveInfoRequest)為通用接口,不同活動類型需傳不同參數
API 呼叫流程
載入簽到與任務 (BBMineViewController → MyTaskViewModel)
setMySighAndTesk()
├─ fetchSigns() (循序):
│ ├─ [API 1] POST api/forehead/system/config/images/query {categoryId:"40201"}
│ │ → 取得簽到活動 actId
│ │
│ ├─ [API 2] POST api/forehead/activity/act/info {actId, template:"signPercentage"}
│ │ → 簽到獎勵設定、百分比里程碑
│ │
│ └─ [API 3] POST api/forehead/activity/act/userInfo {actId, template:"signPercentage"}
│ → 已簽到天數、簽到紀錄、累計獎勵
│
└─ fetchTasks():
└─ [API 4] POST api/forehead/activity/dailyMission/get
→ 任務列表、進度、活躍度獎勵用戶操作
簽到: POST api/forehead/activity/act/get
{actId, actionType:0, subId:0, template:"signPercentage"}
領取累計獎勵: POST api/forehead/activity/act/get
{actId, actionType:1, subId:<獎勵ID>, template:"signPercentage"}
領取任務獎勵: POST api/forehead/activity/dailyMission/award/get
{missionId}