0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

HarmonyOS開發(fā)案例:【生活健康app之實現(xiàn)打卡功能】(2)

jf_46214456 ? 來源:jf_46214456 ? 作者:jf_46214456 ? 2024-05-10 15:29 ? 次閱讀

實現(xiàn)打卡功能

首頁會展示當(dāng)前用戶已經(jīng)開啟的任務(wù)列表,每條任務(wù)會顯示對應(yīng)的任務(wù)名稱以及任務(wù)目標(biāo)、當(dāng)前任務(wù)完成情況。用戶只可對當(dāng)天任務(wù)進行打卡操作,用戶可以根據(jù)需要對任務(wù)列表中相應(yīng)的任務(wù)進行點擊打卡。如果任務(wù)列表中的每個任務(wù)都在當(dāng)天完成則為連續(xù)打卡一天,連續(xù)打卡多天會獲得成就徽章。打卡效果如下圖所示:

開發(fā)前請熟悉鴻蒙開發(fā)指導(dǎo)文檔:[qr23.cn/FBD4cY]。

任務(wù)列表

使用List組件展示用戶當(dāng)前已經(jīng)開啟的任務(wù),每條任務(wù)對應(yīng)一個TaskCard組件,clickAction包裝了點擊和長按事件,用戶點擊任務(wù)卡時會觸發(fā)彈起打卡彈窗,從而進行打卡操作;長按任務(wù)卡時會跳轉(zhuǎn)至任務(wù)編輯界面,對相應(yīng)的任務(wù)進行編輯處理。代碼如下:

// HomeComponent.ets
// 任務(wù)列表
ForEach(this.homeStore.getTaskListOfDay(), (item: TaskInfo) = > {
  TaskCard({
    taskInfoStr: JSON.stringify(item),
    clickAction: (isClick: boolean) = > this.taskItemAction(item, isClick)
  })
  .margin({ bottom: Const.DEFAULT_12 })
  .height($r('app.float.default_64'))
}, (item: TaskInfo) = > JSON.stringify(item))
...
CustomDialogView() // 自定義彈窗中間件

自定義彈窗中間件CustomDialogView

在組件CustomDialogView的aboutToAppear生命周期中注冊SHOW_TASK_DETAIL_DIALOG的事件回調(diào)方法 ,當(dāng)通過emit觸發(fā)此事件時即觸發(fā)回調(diào)方法執(zhí)行。代碼如下:

// CustomDialogView.ets
export class CustomDialogCallback {
  confirmCallback: Function = () = > {};
  cancelCallback: Function = () = > {};
}

@Component
export struct CustomDialogView {
  @State isShow: boolean = false;
  @Provide achievementLevel: number = 0;
  @Consume broadCast: BroadCast;
  @Provide currentTask: TaskInfo = TaskItem;
  @Provide dialogCallBack: CustomDialogCallback = new CustomDialogCallback();

  // 成就對話框
  achievementDialog: CustomDialogController = new CustomDialogController({
    builder: AchievementDialog(),
    autoCancel: true,
    customStyle: true
  });

  // 任務(wù)時鐘對話框
  taskDialog: CustomDialogController = new CustomDialogController({
    builder: TaskDetailDialog(),
    autoCancel: true,
    customStyle: true
  });

  aboutToAppear() {
    Logger.debug('CustomDialogView', 'aboutToAppear');
    // 成就對話框
    this.broadCast.on(BroadCastType.SHOW_ACHIEVEMENT_DIALOG, (achievementLevel: number) = > {
      Logger.debug('CustomDialogView', 'SHOW_ACHIEVEMENT_DIALOG');
      this.achievementLevel = achievementLevel;
      this.achievementDialog.open();
    });

    // 任務(wù)時鐘對話框
    this.broadCast.on(BroadCastType.SHOW_TASK_DETAIL_DIALOG,
      (currentTask: TaskInfo, dialogCallBack: CustomDialogCallback) = > {
        Logger.debug('CustomDialogView', 'SHOW_TASK_DETAIL_DIALOG');
        this.currentTask = currentTask || TaskItem;
        this.dialogCallBack = dialogCallBack;
        this.taskDialog.open();
    });
  }

  aboutToDisappear() {
    Logger.debug('CustomDialogView', 'aboutToDisappear');
  }

  build() {
  }
}

點擊任務(wù)卡片

點擊任務(wù)卡片會emit觸發(fā) “SHOW_TASK_DETAIL_DIALOG” 事件,同時把當(dāng)前任務(wù),以及確認打卡回調(diào)方法傳遞下去。代碼如下:

// HomeComponent.ets
// 任務(wù)卡片事件
taskItemAction(item: TaskInfo, isClick: boolean): void {
  ...
  if (isClick) {
    // 點擊任務(wù)打卡
     let callback: CustomDialogCallback = { confirmCallback: (taskTemp: TaskInfo) = > {
        this.onConfirm(taskTemp)
     }, cancelCallback: () = > {
     } };
    // 觸發(fā)彈出打卡彈窗事件  并透傳當(dāng)前任務(wù)參數(shù)(item) 以及確認打卡回調(diào)
     this.broadCast.emit(BroadCastType.SHOW_TASK_DETAIL_DIALOG, [item, callback]);
  } else {
    // 長按編輯任務(wù)
    ...
  }
}
// 確認打卡
onConfirm(task) {
  this.homeStore.taskClock(task).then((res: AchievementInfo) = > {
    // 打卡成功后 根據(jù)連續(xù)打卡情況判斷是否 彈出成就勛章  以及成就勛章級別
    if (res.showAchievement) {
      // 觸發(fā)彈出成就勛章SHOW_ACHIEVEMENT_DIALOG 事件, 并透傳勛章類型級別
      let achievementLevel = res.achievementLevel;
      if (achievementLevel) {
        this.broadCast.emit(BroadCastType.SHOW_ACHIEVEMENT_DIALOG, achievementLevel);
      } else {
        this.broadCast.emit(BroadCastType.SHOW_ACHIEVEMENT_DIALOG);
      }
    }
  })
}

打卡彈窗組件TaskDetailDialog

打卡彈窗組件根據(jù)當(dāng)前任務(wù)的ID獲取任務(wù)名稱以及彈窗背景圖片資源。

打卡彈窗組件由兩個小組件構(gòu)成,代碼如下:

// TaskDetailDialog.ets
Column() {
  // 展示任務(wù)的基本信息
  TaskBaseInfo({
    taskName: TaskMapById[this.currentTask?.taskID - 1].taskName  // 根據(jù)當(dāng)前任務(wù)ID獲取任務(wù)名稱
  });
  // 打卡功能組件 (任務(wù)打卡、關(guān)閉彈窗)
  TaskClock({
    confirm: () = > {
      this.dialogCallBack.confirmCallback(this.currentTask);
      this.controller.close();
    },
    cancel: () = > {
      this.controller.close();
    },
    showButton: this.showButton
  })
}
...

TaskBaseInfo組件代碼如下:

// TaskDetailDialog.ets
@Component
struct TaskBaseInfo {
  taskName: string | Resource = '';

  build() {
    Column({ space: Const.DEFAULT_8 }) {
      Text(this.taskName)
        .fontSize($r('app.float.default_22'))
        .fontWeight(FontWeight.Bold)
        .fontFamily($r('app.string.HarmonyHeiTi_Bold'))
        .taskTextStyle()
        .margin({left: $r('app.float.default_12')})
    }
    .position({ y: $r('app.float.default_267') })
  }
}

TaskClock組件代碼如下:

// TaskDetailDialog.ets
@Component
struct TaskClock {
  confirm: Function = () = > {};
  cancel: Function = () = > {};
  showButton: boolean = false;

  build() {
    Column({ space: Const.DEFAULT_12 }) {
      Button() {
        Text($r('app.string.clock_in'))
          .height($r('app.float.default_42'))
          .fontSize($r('app.float.default_20'))
          .fontWeight(FontWeight.Normal)
          .textStyle()
      }
      .width($r('app.float.default_220'))
      .borderRadius($r('app.float.default_24'))
      .backgroundColor('rgba(255,255,255,0.40)')
      .onClick(() = > {
        GlobalContext.getContext().setObject('taskListChange', true);
        this.confirm();
      })
      .visibility(!this.showButton ? Visibility.None : Visibility.Visible)
      Text($r('app.string.got_it'))
        .fontSize($r('app.float.default_14'))
        .fontWeight(FontWeight.Regular)
        .textStyle()
        .onClick(() = > {
          this.cancel();
        })
    }
  }
}

打卡接口調(diào)用

// HomeViewModel.ets
public async taskClock(taskInfo: TaskInfo) {
  let taskItem = await this.updateTask(taskInfo);
  let dateStr = this.selectedDayInfo?.dateStr;
  // 更新任務(wù)失敗
  if (!taskItem) {
    return {
      achievementLevel: 0,
      showAchievement: false
    } as AchievementInfo;
  }
  // 更新當(dāng)前時間的任務(wù)列表
  this.selectedDayInfo.taskList = this.selectedDayInfo.taskList.map((item) = > {
    return item.taskID === taskItem?.taskID ? taskItem : item;
  });
  let achievementLevel: number = 0;
  if(taskItem.isDone) {
    // 更新每日任務(wù)完成情況數(shù)據(jù)
    let dayInfo = await this.updateDayInfo();
    ... 
    // 當(dāng)日任務(wù)完成數(shù)量等于總?cè)蝿?wù)數(shù)量時 累計連續(xù)打卡一天
    // 更新成就勛章數(shù)據(jù) 判斷是否彈出獲得勛章彈出及勛章類型
    if (dayInfo && dayInfo?.finTaskNum === dayInfo?.targetTaskNum) {
      achievementLevel = await this.updateAchievement(this.selectedDayInfo.dayInfo);
    }
  }
  ...
  return {
    achievementLevel: achievementLevel,
    showAchievement: ACHIEVEMENT_LEVEL_LIST.includes(achievementLevel)
  } as AchievementInfo;
}

`HarmonyOSOpenHarmony鴻蒙文檔籽料:mau123789是v直接拿`

搜狗高速瀏覽器截圖20240326151450.png

// HomeViewModel.ets
// 更新當(dāng)天任務(wù)列表
updateTask(task: TaskInfo): Promise< TaskInfo > {
  return new Promise((resolve, reject) = > {
    let taskID = task.taskID;
    let targetValue = task.targetValue;
    let finValue = task.finValue;
    let updateTask = new TaskInfo(task.id, task.date, taskID, targetValue, task.isAlarm, task.startTime,
      task.endTime, task.frequency, task.isDone, finValue, task.isOpen);
    let step = TaskMapById[taskID - 1].step; // 任務(wù)步長
    let hasExceed = updateTask.isDone;
    if (step === 0) { // 任務(wù)步長為0 打卡一次即完成該任務(wù)
      updateTask.isDone = true; // 打卡一次即完成該任務(wù)
      updateTask.finValue = targetValue;
    } else {
      let value = Number(finValue) + step; // 任務(wù)步長非0 打卡一次 步長與上次打卡進度累加
      updateTask.isDone = updateTask.isDone || value >= Number(targetValue); // 判斷任務(wù)是否完成
      updateTask.finValue = updateTask.isDone ? targetValue : `${value}`;
    }
    TaskInfoTableApi.updateDataByDate(updateTask, (res: number) = > { // 更新數(shù)據(jù)庫
      if (!res || hasExceed) {
        Logger.error('taskClock-updateTask', JSON.stringify(res));
        reject(res);
      }
      resolve(updateTask);
    })
  })
}

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • HarmonyOS
    +關(guān)注

    關(guān)注

    79

    文章

    1946

    瀏覽量

    29739
  • OpenHarmony
    +關(guān)注

    關(guān)注

    25

    文章

    3548

    瀏覽量

    15741
  • 鴻蒙OS
    +關(guān)注

    關(guān)注

    0

    文章

    188

    瀏覽量

    4336
收藏 人收藏

    評論

    相關(guān)推薦

    AppCube低代碼快速開發(fā)健康打卡應(yīng)用

    本篇文章采用輕應(yīng)用項目類型里的`健康打卡`應(yīng)用,來介紹AppCube的使用流程。現(xiàn)在疫情還沒有褪去,全國各地都還在持續(xù)抵抗疫情,健康打卡應(yīng)用可以自助上報個人
    的頭像 發(fā)表于 07-13 09:10 ?1951次閱讀
    AppCube低代碼快速<b class='flag-5'>開發(fā)</b><b class='flag-5'>健康</b><b class='flag-5'>打卡</b>應(yīng)用

    HarmonyOS開發(fā)案例:【購物車app

    OpenHarmony ArkUI框架提供了豐富的動畫組件和接口,開發(fā)者可以根據(jù)實際場景和開發(fā)需求,選用豐富的動畫組件和接口來實現(xiàn)不同的動畫效果。
    的頭像 發(fā)表于 05-14 18:19 ?898次閱讀
    <b class='flag-5'>HarmonyOS</b><b class='flag-5'>開發(fā)案</b>例:【購物車<b class='flag-5'>app</b>】

    HarmonyOS開發(fā)案例:【生活健康app之首頁啟動】(1)

    用戶可以創(chuàng)建最多6個健康生活任務(wù)(早起,喝水,吃蘋果,每日微笑,刷牙,早睡),并設(shè)置任務(wù)目標(biāo)、是否開啟提醒、提醒時間、每周任務(wù)頻率。
    的頭像 發(fā)表于 05-10 11:49 ?755次閱讀
    <b class='flag-5'>HarmonyOS</b><b class='flag-5'>開發(fā)案</b>例:【<b class='flag-5'>生活</b><b class='flag-5'>健康</b><b class='flag-5'>app</b>之首頁啟動】(1)

    HarmonyOS HiSpark Wi-Fi IoT HarmonyOS 智能家居套件試用 】基于3861,從harmonyos出發(fā),建立場景聯(lián)動,無感配網(wǎng),實現(xiàn)更加智能家居生活

    項目名稱:基于3861,從harmonyos出發(fā),建立場景聯(lián)動,無感配網(wǎng),實現(xiàn)更加智能家居生活試用計劃:1.基于harmonyos實現(xiàn)基本的
    發(fā)表于 09-25 10:06

    HarmonyOS開發(fā)跨設(shè)備的鴻蒙(HarmonyOSApp

    是圓形(如智能手表),這就給開發(fā)App帶來了麻煩。現(xiàn)在幾乎每一個智能設(shè)備廠商,如Apple、華為都面臨這個問題。這就要求我們開發(fā)App盡可能適合更多的智能設(shè)備。當(dāng)然,最簡單,最直接的
    發(fā)表于 11-02 15:18

    如何優(yōu)雅地開發(fā)HarmonyOS APP應(yīng)用

    ` 本帖最后由 軟通動力HOS 于 2021-3-10 15:29 編輯 研究HarmonyOS有一段時間了,今天主要結(jié)合自己多年的項目開發(fā)經(jīng)驗和各種技術(shù)棧結(jié)合HarmonyOS APP
    發(fā)表于 03-10 15:13

    【鄭州輕工業(yè)大學(xué)】HarmonyOS寵物健康系統(tǒng)的開發(fā)分享

    查看自己愛寵的生命體征、生活狀態(tài)以及病情預(yù)測等信息,從而監(jiān)控寵物的身體狀況。 圖1 手機展示效果圖 圖2 智能手表展示效果圖 02 HarmonyOS學(xué)習(xí)和項目開發(fā) 在回憶和復(fù)盤整
    發(fā)表于 03-01 14:54

    harmonyOS開發(fā)APP如何訪問Webservice?

    我接到一個項目,需要用到HarmonyOS開發(fā)APP做為移動手機查詢和收到報警數(shù)據(jù),具體是這樣的,在C/S加B/S的系統(tǒng)框架下我們有數(shù)據(jù)庫服務(wù)器和Web服務(wù)器,有widows桌面應(yīng)用和Web瀏覽器
    發(fā)表于 03-28 10:14

    鴻蒙智聯(lián)生態(tài)產(chǎn)品《接入智慧生活App開發(fā)指導(dǎo)》(官方更新版)

    HarmonyOS Connect云。 ② 消費者通過智慧生活App調(diào)用云端的H5開發(fā)包,從而實現(xiàn)對設(shè)備的管理和控制。 圖
    發(fā)表于 04-26 15:00

    4天帶你上手HarmonyOS ArkUI開發(fā)

    本次HarmonyOS ArkUI入門訓(xùn)練營課程--健康生活實戰(zhàn)篇,手把手教大家如何制作一個合理膳食的APP前端Demo!課程實戰(zhàn)樣例通過ArkUI聲明式UI開發(fā)框架
    發(fā)表于 09-09 14:44

    4天帶你上手HarmonyOS ArkUI開發(fā)——《HarmonyOS ArkUI入門訓(xùn)練營之健康生活實戰(zhàn)》

    框架實現(xiàn)。ArkUI采用極簡的聲明式UI描述界面語法,只需用幾行簡單直觀的聲明式代碼,即可完成界面功能,內(nèi)置了豐富而精美HarmonyOS Design的UI組件和API,可滿足大部分跨端應(yīng)用界面
    發(fā)表于 01-05 11:49

    App開發(fā)案例教程PDF電子書免費下載

    App開發(fā)案例教程》通過一個實例,介紹App設(shè)計、開發(fā)直至上線的全過程,引導(dǎo)讀者在較短時間內(nèi)熟悉一個較大規(guī)模的App應(yīng)用系統(tǒng)的
    發(fā)表于 08-05 08:00 ?38次下載
    <b class='flag-5'>App</b><b class='flag-5'>開發(fā)案</b>例教程PDF電子書免費下載

    華為開發(fā)者分論壇HarmonyOS學(xué)生公開課-OpenHarmony Codelabs開發(fā)案

    2021華為開發(fā)者分論壇HarmonyOS學(xué)生公開課-OpenHarmony Codelabs開發(fā)案
    的頭像 發(fā)表于 10-24 11:25 ?1810次閱讀
    華為<b class='flag-5'>開發(fā)</b>者分論壇<b class='flag-5'>HarmonyOS</b>學(xué)生公開課-OpenHarmony Codelabs<b class='flag-5'>開發(fā)案</b>例

    如何接入智慧生活App

     在HarmonyOS Connect生態(tài)產(chǎn)品應(yīng)用開發(fā)過程中,很多開發(fā)者對于如何接入智慧生活App還存在一些疑問,如:如何選擇合適的
    的頭像 發(fā)表于 04-25 10:42 ?3454次閱讀
    如何接入智慧<b class='flag-5'>生活</b><b class='flag-5'>App</b>

    HarmonyOS開發(fā)案例:【生活健康app之獲取成就】(3)

    成就頁面展示用戶可以獲取的所有勛章,當(dāng)用戶滿足一定的條件時,將點亮本頁面對應(yīng)的勛章,沒有得到的成就勛章處于熄滅狀態(tài)。共有六種勛章,當(dāng)用戶連續(xù)完成任務(wù)打卡3天、7天、30天、50天、73天、99天時,可以獲得對應(yīng)的“連續(xù)xx天達成”勛章。
    的頭像 發(fā)表于 05-10 17:18 ?259次閱讀
    <b class='flag-5'>HarmonyOS</b><b class='flag-5'>開發(fā)案</b>例:【<b class='flag-5'>生活</b><b class='flag-5'>健康</b><b class='flag-5'>app</b>之獲取成就】(3)