<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
創作中心

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

3天內不再提示

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

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

實現打卡功能

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

開發前請熟悉鴻蒙開發指導文檔:[qr23.cn/FBD4cY]。

任務列表

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

// HomeComponent.ets
// 任務列表
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的事件回調方法 ,當通過emit觸發此事件時即觸發回調方法執行。代碼如下:

// 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
  });

  // 任務時鐘對話框
  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();
    });

    // 任務時鐘對話框
    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() {
  }
}

點擊任務卡片

點擊任務卡片會emit觸發 “SHOW_TASK_DETAIL_DIALOG” 事件,同時把當前任務,以及確認打卡回調方法傳遞下去。代碼如下:

// HomeComponent.ets
// 任務卡片事件
taskItemAction(item: TaskInfo, isClick: boolean): void {
  ...
  if (isClick) {
    // 點擊任務打卡
     let callback: CustomDialogCallback = { confirmCallback: (taskTemp: TaskInfo) = > {
        this.onConfirm(taskTemp)
     }, cancelCallback: () = > {
     } };
    // 觸發彈出打卡彈窗事件  并透傳當前任務參數(item) 以及確認打卡回調
     this.broadCast.emit(BroadCastType.SHOW_TASK_DETAIL_DIALOG, [item, callback]);
  } else {
    // 長按編輯任務
    ...
  }
}
// 確認打卡
onConfirm(task) {
  this.homeStore.taskClock(task).then((res: AchievementInfo) = > {
    // 打卡成功后 根據連續打卡情況判斷是否 彈出成就勛章  以及成就勛章級別
    if (res.showAchievement) {
      // 觸發彈出成就勛章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

打卡彈窗組件根據當前任務的ID獲取任務名稱以及彈窗背景圖片資源。

打卡彈窗組件由兩個小組件構成,代碼如下:

// TaskDetailDialog.ets
Column() {
  // 展示任務的基本信息
  TaskBaseInfo({
    taskName: TaskMapById[this.currentTask?.taskID - 1].taskName  // 根據當前任務ID獲取任務名稱
  });
  // 打卡功能組件 (任務打卡、關閉彈窗)
  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();
        })
    }
  }
}

打卡接口調用

// HomeViewModel.ets
public async taskClock(taskInfo: TaskInfo) {
  let taskItem = await this.updateTask(taskInfo);
  let dateStr = this.selectedDayInfo?.dateStr;
  // 更新任務失敗
  if (!taskItem) {
    return {
      achievementLevel: 0,
      showAchievement: false
    } as AchievementInfo;
  }
  // 更新當前時間的任務列表
  this.selectedDayInfo.taskList = this.selectedDayInfo.taskList.map((item) = > {
    return item.taskID === taskItem?.taskID ? taskItem : item;
  });
  let achievementLevel: number = 0;
  if(taskItem.isDone) {
    // 更新每日任務完成情況數據
    let dayInfo = await this.updateDayInfo();
    ... 
    // 當日任務完成數量等于總任務數量時 累計連續打卡一天
    // 更新成就勛章數據 判斷是否彈出獲得勛章彈出及勛章類型
    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
// 更新當天任務列表
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; // 任務步長
    let hasExceed = updateTask.isDone;
    if (step === 0) { // 任務步長為0 打卡一次即完成該任務
      updateTask.isDone = true; // 打卡一次即完成該任務
      updateTask.finValue = targetValue;
    } else {
      let value = Number(finValue) + step; // 任務步長非0 打卡一次 步長與上次打卡進度累加
      updateTask.isDone = updateTask.isDone || value >= Number(targetValue); // 判斷任務是否完成
      updateTask.finValue = updateTask.isDone ? targetValue : `${value}`;
    }
    TaskInfoTableApi.updateDataByDate(updateTask, (res: number) = > { // 更新數據庫
      if (!res || hasExceed) {
        Logger.error('taskClock-updateTask', JSON.stringify(res));
        reject(res);
      }
      resolve(updateTask);
    })
  })
}

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • HarmonyOS
    +關注

    關注

    79

    文章

    1872

    瀏覽量

    29300
  • OpenHarmony
    +關注

    關注

    23

    文章

    3353

    瀏覽量

    15184
  • 鴻蒙OS
    +關注

    關注

    0

    文章

    146

    瀏覽量

    4289
收藏 人收藏

    評論

    相關推薦

    AppCube低代碼快速開發健康打卡應用

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

    HarmonyOS HiSpark Wi-Fi IoT HarmonyOS 智能家居套件試用 】基于3861,從harmonyos出發,建立場景聯動,無感配網,實現更加智能家居生活

    項目名稱:基于3861,從harmonyos出發,建立場景聯動,無感配網,實現更加智能家居生活試用計劃:1.基于harmonyos實現基本的
    發表于 09-25 10:06

    HarmonyOS開發跨設備的鴻蒙(HarmonyOSApp

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

    HarmonyOS開發跨設備的鴻蒙(HarmonyOSApp

    手表),這就給開發App帶來了麻煩?,F在幾乎每一個智能設備廠商,如Apple、華為都面臨這個問題。這就要求我們開發App盡可能適合更多的智能設備。當然,最簡單,最直接的方式是為每一類
    發表于 11-03 16:54

    如何優雅地開發HarmonyOS APP應用

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

    絕對干貨!HarmonyOS開發者日資料全公開,鴻蒙開發者都在看

    、HarmonyOS Codelabs 開發樣例概覽:該主題講解HarmonyOS核心技術能力,圍繞智慧生活的7大場景,介紹Codelabs開發案
    發表于 08-04 14:36

    【鄭州輕工業大學】HarmonyOS寵物健康系統的開發分享

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

    harmonyOS開發APP如何訪問Webservice?

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

    鴻蒙智聯生態產品《接入智慧生活App開發指導》(官方更新版)

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

    4天帶你上手HarmonyOS ArkUI開發

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

    4天帶你上手HarmonyOS ArkUI開發——《HarmonyOS ArkUI入門訓練營之健康生活實戰》

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

    App開發案例教程PDF電子書免費下載

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

    STM8學習之實現定時器TIM4功能

    STM8學習之實現定時器TIM4功能
    發表于 03-16 15:43 ?58次下載
    STM8學習<b class='flag-5'>之實現</b>定時器TIM4<b class='flag-5'>功能</b>

    華為開發者分論壇HarmonyOS學生公開課-OpenHarmony Codelabs開發案

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

    如何接入智慧生活App

     在HarmonyOS Connect生態產品應用開發過程中,很多開發者對于如何接入智慧生活App還存在一些疑問,如:如何選擇合適的
    的頭像 發表于 04-25 10:42 ?3111次閱讀
    如何接入智慧<b class='flag-5'>生活</b><b class='flag-5'>App</b>
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>