一、關(guān)于項目
1.1 項目特色
1.嚴(yán)格遵循設(shè)計規(guī)范,提供 6 種主題配色,自動深淺色適配;
2.20+ 原生自定義組件,純 ArkTS 打造,未使用三方庫;
3.一次開發(fā),多端部署,為大中小不同類型的屏幕單獨適配,手機(jī)平板折疊屏都有沉浸體驗;
4.分布式技術(shù),自創(chuàng) rdb 轉(zhuǎn) kv 數(shù)據(jù)傳輸,組網(wǎng)內(nèi)自發(fā)現(xiàn),數(shù)據(jù)無感同步;
5.提供不同功能不同大小的六款萬能卡片,操作一步到位;
6.本地文件存儲備份。
1.2 概述
隨著日常生活中任務(wù)和日程的增加,人們經(jīng)常會遇到遺忘一些重要事情的問題。現(xiàn)在,我們有許多待辦清單類 APP,但它們要么功能過于復(fù)雜,要么功能過于簡單,無法滿足用戶需求。此外,數(shù)據(jù)同步和安全性也是一個常見的問題。在這樣的情況下,我們決定開發(fā)一款既簡單易用,又具有豐富功能的待辦清單類 APP,能夠幫助用戶更好地管理自己的任務(wù)和日程安排,提高工作和生活的效率。
在選擇開發(fā)平臺時,我們發(fā)現(xiàn) oh 的分布式能力可以解決數(shù)據(jù)的同步和安全性問題,并且 oh 平臺上還沒有功能完善的待辦清單類 APP,這使得我們能夠填補(bǔ)市場空缺。
綜上,我們決定開發(fā)一個原生的,具有多端適配和同步備份功能的待辦清單類應(yīng)用,以達(dá)到解決市場空缺,解決用戶需求的目的。
我們的 APP 名為“便單”,是用于 oh 標(biāo)準(zhǔn)設(shè)備的待辦事項管理的工具。它采用 ArkTS 語言編寫,基于 ArkUI 的強(qiáng)大能力和原生圖標(biāo)的精確使用,我們創(chuàng)建了簡潔明了的設(shè)計風(fēng)格,讓用戶一目了然地看到自己的任務(wù)清單。同時,我們提供了多種主題色供用戶自由選擇,增加了趣味性和個性化,還適配了系統(tǒng)級的深淺配色,實現(xiàn)了系統(tǒng)級的沉浸式體驗。
“便單”不僅可以讓用戶添加、編輯、刪除、篩選、歸檔自己的任務(wù),還可以讓用戶設(shè)置任務(wù)的優(yōu)先級、截止日期、重復(fù)規(guī)則、提醒方式等多種屬性,讓用戶更靈活地管理自己的任務(wù)。我們還提供了日歷頁面、四象限頁面、多種萬能卡片等方式拓展用戶的使用場景,優(yōu)化用戶的使用體驗。
最重要的是,“便單”支持多設(shè)備,可以在不同的設(shè)備間交換和同步用戶的數(shù)據(jù),讓用戶可以隨時隨地地查看和更新自己的任務(wù)清單。這些功能全都是在本地進(jìn)行的,不必?fù)?dān)心數(shù)據(jù)泄露。
1.3 程序約束限制
1.本示例僅支持標(biāo)準(zhǔn)系統(tǒng)上運行。
2.本示例為 Stage 模型,支持 API version 9 版本 SDK。
3.本示例需要使用 DevEco Studio 3.1 Release 版本進(jìn)行編譯運行。
二、應(yīng)用設(shè)計
2.1 需求分析
基于應(yīng)用的使用場景和平臺,我們認(rèn)為一個完整的待辦清單類 APP 應(yīng)該具有以下功能:
1.創(chuàng)建事項
用戶創(chuàng)建事項時,應(yīng)該可以自定義多種屬性,包括標(biāo)題,備注,有效時間,分類文件夾,是否收藏,是否重要等。包括可以創(chuàng)建循環(huán)事件,可以自定義循環(huán)周期和循環(huán)具體規(guī)則。
2.編輯事項
創(chuàng)建完事件后,應(yīng)該可以隨時修改事件的所有內(nèi)容,包括完成標(biāo)記應(yīng)該可以撤銷,過期事項應(yīng)該可以延期。
3.刪除事項
創(chuàng)建的事件應(yīng)該可以隨時刪除,包括多端同時刪除。
4.事項整理
事項應(yīng)該可以提供分類,包括文件夾分類,事件分類(日歷視圖),是否重要是否緊急的分類(四象限視圖)等。
5.數(shù)據(jù)導(dǎo)出導(dǎo)入
所有的數(shù)據(jù)都應(yīng)該可以導(dǎo)出到本地,又可以從本地備份中恢復(fù),方便用戶重置應(yīng)用或者更換設(shè)備時可以實現(xiàn)數(shù)據(jù)不會丟。
6.多端同步
需要利用好分布式的特點,做出差異化,實現(xiàn)局域網(wǎng)內(nèi)設(shè)備的數(shù)據(jù)同步,包括自動和手動兩種方式。
7.定點提醒
事項應(yīng)該還具備定時提醒的功能,在用戶設(shè)定的時間點通過系統(tǒng)創(chuàng)建提醒,保證用戶在某個具體時間收到提醒。
8.萬能卡片
可以使用華為的服務(wù),基于系統(tǒng)特性提供萬能卡片服務(wù)功能,實現(xiàn)一級界面直接操作 APP。
并且應(yīng)該嚴(yán)格遵守設(shè)計規(guī)范,制作美觀簡潔界面,同時支持手機(jī),折疊屏,平板三端,支持淺色模式深色模式。
美術(shù)設(shè)計方面盡量使用華為原生圖標(biāo),保證軟件與系統(tǒng)的一致性,同時應(yīng)該盡量使用 SVG 格式的圖片,減輕應(yīng)用大小,矢量圖也更方便資源復(fù)用,保證多端顯示的美觀和統(tǒng)一。
2.2 項目結(jié)構(gòu)
├─entry ├─src ├─main ├─ets | ├─control //控制器 | ├─dao //數(shù)據(jù)訪問對象 | ├─entryability | | └EntryAbility.ets //卡片生命周期管理文件 | ├─entryformability | | └EntryFormAbility.ets //應(yīng)用生命周期管理文件 | ├─formview //卡片視圖 | ├─model //結(jié)構(gòu)模型 | └pages //視圖 | ├─element //其他自定義組件 | └view //界面組件 ├─resources //資源文件 | ├─base | ├─dark //深色模式資源 | ├─light //淺色模式資源 | └rawfile └module.json5 //配置文件
?
2.3 部分特色功能概要設(shè)計
2.3.1 數(shù)據(jù)導(dǎo)出

要實現(xiàn)數(shù)據(jù)導(dǎo)出導(dǎo)入,首先應(yīng)當(dāng)申請系統(tǒng)讀寫權(quán)限,數(shù)據(jù)導(dǎo)出只需要將數(shù)據(jù)庫內(nèi)容導(dǎo)出然后寫入設(shè)定的文件夾中的文件即可。
2.3.2 數(shù)據(jù)導(dǎo)入

導(dǎo)入文件類似于導(dǎo)出和添加的結(jié)合,申請到文件讀寫權(quán)限后,將需要導(dǎo)入的文件讀入程序,然后覆寫掉數(shù)據(jù)庫即可,注意提醒應(yīng)當(dāng)即時更新成當(dāng)前版本。
2.3.3 數(shù)據(jù)同步

數(shù)據(jù)同步需要申請分布式數(shù)據(jù)的訪問權(quán)限,首先監(jiān)聽組網(wǎng)中的其他設(shè)備,然后監(jiān)聽其他設(shè)備是否有發(fā)布新版本的數(shù)據(jù),監(jiān)聽到新版本數(shù)據(jù)即可執(zhí)行導(dǎo)入操作,覆寫掉本地數(shù)據(jù),實現(xiàn)數(shù)據(jù)的同步。
2.3 數(shù)據(jù)庫設(shè)計
數(shù)據(jù)庫結(jié)構(gòu) ER 圖如下:

其中 Task 是創(chuàng)建事項的實體,ShowTask 為展示事項的實體,因為在創(chuàng)建事項的時候可能會產(chǎn)生循環(huán)事項,一次性創(chuàng)建多個事項,這些事項的很多信息都是相同的。如果直接多次重復(fù)創(chuàng)建,會造成很多數(shù)據(jù)冗余,所以我們將具體信息都存在 Task 實體中,將單次事項的信息存放在 ShowTask 中。
而文件夾實體顧名思義,是歸類事項的實體,由于一個循環(huán)事項應(yīng)該也在同一個分類,所以從屬文件夾應(yīng)該是 Task 的一個屬性,為了方便編輯文件夾和避免冗余,他們應(yīng)該是一個一對多的從屬關(guān)系。
三、部分應(yīng)用特色功能實現(xiàn)
3.1 定時通知
向系統(tǒng)提交定時通知的申請,以實現(xiàn)在需要的時候即使應(yīng)用不在前后臺也能正常提醒,
實現(xiàn)代碼如下,所選的在發(fā)布時間時在系統(tǒng)通知欄顯示標(biāo)題信息和有效時間信息。
/** * 發(fā)布通知 * @param id * @param title 通知標(biāo)題 * @param StartTimeDate 有效開始日期 * @param ValidStartTime 有效結(jié)束日期 * @param EndTimeDate 有效開始時間 * @param ValidEndTime 有效結(jié)束時間 * @param publishTime 發(fā)布時間 */ async function publishNotification(eventId: number, title: string, StartTimeDate: number[], ValidStartTime: number[], EndTimeDate: number[], ValidEndTime: number[], publishTime: number[]) { let validStartTime: number[] = StartTimeDate.concat(ValidStartTime) let validEndTime: number[] = EndTimeDate.concat(ValidEndTime) let DefaultTimeFormat: number = AppStorage.Get("DefaultTimeFormat") let validTime: string = getValidTimeInfo(validStartTime, validEndTime, [publishTime[0], publishTime[1], publishTime[2]], DefaultTimeFormat == 0) let timer = await getReminderRequest(eventId, title, validTime, publishTime) if (await getPermission_PUBLISH_AGENT_REMINDER()) { let reminderId = await reminderAgent.publishReminder(timer) setStorage(eventId, reminderId) } }
?
若是因為一些原因需要撤銷通知,我們可以通過 id 撤回該申請
async function cancelNotification(eventId: number) { let id = await getStorage(eventId) reminderAgent.cancelReminder(id).then(() => { console.log("[Reminder] cancelReminder promise: " + id); }); }
?
3.2 數(shù)據(jù)導(dǎo)出和導(dǎo)入
在底部頁簽中,點擊設(shè)置即可切換到設(shè)置界面。
“本地備份”點擊后可以打開對應(yīng)界面,之后可以開啟自動備份,即在每次退出應(yīng)用時候自動備份?;蛘呖梢栽谙路近c擊立即備份以手動備份。同時可以點擊右側(cè)的刷新查看當(dāng)前所有備份情況。
首先查詢媒體讀寫權(quán)限是否獲取,若是沒有則申請權(quán)限:
export async function getPermission_WRITE_MEDIA(): Promise { let array: Array = ['ohos.permission.READ_MEDIA', 'ohos.permission.WRITE_MEDIA']; var context = featureAbility.getContext() context.requestPermissionsFromUser(array, 1); var authResults0 = await context.verifyPermission(array[0]) var authResults1 = await context.verifyPermission(array[1]) let ret: boolean = ((authResults0 == 0) && (authResults1 == 0)) if (!ret) { AppStorage.Set('BackUpSwitch', false) AppStorage.Set('AutoBackUpSwitch', false) } return ret }
?
導(dǎo)出備份的代碼實現(xiàn)如下:
export async function backupFile() {
let value = await getPermission_WRITE_MEDIA()
if (value) {
let data: object = await getBackupObject()
let str: string = JSON.stringify(data)
console.log('backup value: ' + str);
await writeFile(str)
await deleteRedundancyFile()
}
}
?
為了實現(xiàn)只保留 10 個備份上限,防止備份過多導(dǎo)致占用空間爆炸,我們在每次備份前都檢查一次備份數(shù)量,大于 10 個就刪除到只保留 10 個為止:
async function deleteRedundancyFile() {
let BackUpSwitch: boolean = AppStorage.Get('BackUpSwitch')
if (!BackUpSwitch) return []
let media = mediaLibrary.getMediaLibrary();
console.log('filesFetchOptions = ' + JSON.stringify(filesFetchOptions))
let fetchFileResult = await media.getFileAssets(filesFetchOptions)
console.log('fetchFileResult = ' + JSON.stringify(fetchFileResult) + ' ,number: ' + fetchFileResult.getCount().toString())
let count: number = 0
if (fetchFileResult.getCount() > 0)
for (let i = await fetchFileResult.getFirstObject();!fetchFileResult.isAfterLast(); i = await fetchFileResult.getNextObject()) {
if (!await i.isTrash()) {
if (count < 10) {
++count
} else {
deleteFile(i)
}
}
}
}
?
導(dǎo)入備份的代碼實現(xiàn)如下:
export async function importFile(data: mediaLibrary.FileAsset): Promise[boolean, string]?> {
let value = await getPermission_WRITE_MEDIA()
if (value) {
console.log('import: ' + JSON.stringify(data));
let obj: string = await readFile(data)
let ret = JSON.parse(obj)
console.log('import value: ' + JSON.stringify(ret));
return new Promise((resolve) => {
backUpImpl.importData(ret, (flag: boolean, reason: string) => {
resolve([flag, reason])
})
})
}
}
?
3.3 多端同步
在設(shè)置頁點擊“多端同步”后打開界面,開啟后可以下載或者上傳數(shù)據(jù)并儲存在分布式數(shù)據(jù)庫中。并且在下方可以查看已經(jīng)連接的設(shè)備情況。
首先檢查應(yīng)用是否獲取訪問分布式數(shù)據(jù)的權(quán)限,若是沒有則申請權(quán)限:
export async function getPermission_DISTRIBUTED_DATASYNC(): Promise {
let array: Array = ['ohos.permission.DISTRIBUTED_DATASYNC', 'ohos.permission.GET_DISTRIBUTED_DEVICE_INFO'];
var context = featureAbility.getContext()
context.requestPermissionsFromUser(array, 1);
var authResults0 = await context.verifyPermission(array[0])
var authResults1 = await context.verifyPermission(array[1])
console.log("====>requestData====> " + authResults0 + ' ,' + authResults1);
let ret: boolean = ((authResults0 == 0) && (authResults1 == 0))
if (!ret) {
AppStorage.Set('TerminalsSyncSwitch', false)
AppStorage.Set('AutoTerminalsSyncSwitch', false)
}
return ret
}
?
由于三方應(yīng)用并沒有權(quán)限查看組網(wǎng)內(nèi)設(shè)備列表,但是可以監(jiān)聽指定數(shù)據(jù)庫,我們通過一個算法實現(xiàn)了對組網(wǎng)內(nèi)列表的監(jiān)聽。
首先在本地生成唯一標(biāo)識碼,和本機(jī)設(shè)備名稱,打包成一個類,準(zhǔn)備上傳至分布式數(shù)據(jù)庫,再打開監(jiān)聽,若該數(shù)據(jù)庫內(nèi)容改變,則檢查其中是否有自己的信息,沒有的話加入自己的信息。在每次主動請求組網(wǎng)內(nèi)設(shè)備時,我們先清空該數(shù)據(jù)庫,然后將本機(jī)信息寫入數(shù)據(jù)庫,即可實現(xiàn)對組網(wǎng)內(nèi)設(shè)備列表的獲取。
這樣子可以保證每次打開手動獲取都會通知組網(wǎng)內(nèi)設(shè)備將自己的信息寫入,從而收集完所有的信息,最后顯示在前端即可。
缺點是會有明顯的延遲,實機(jī)運行延遲可以保證在 5s 內(nèi)。
完整代碼如下:
export async function getTerminalsList(): Promise {
let TerminalsSyncSwitch = AppStorage.Get('TerminalsSyncSwitch')
if (!TerminalsSyncSwitch)
return []
const kvStore = await getKVStore()
let thisDevice = getLocalTerminals()
return new Promise((resolve) => {
kvStore.get(Device_Key, function (err, DeviceList) {
console.log("get success Device_Key: " + DeviceList);
console.log("get error: " + err);
let deviceList: object[] = (DeviceList == undefined) ? [] : JSON.parse(DeviceList)
if (!deviceList.some(item => JSON.stringify(item) === JSON.stringify(thisDevice))) {
deviceList.push(thisDevice)
DeviceList = JSON.stringify(deviceList)
console.log("[Sync] get new Device_Key: " + DeviceList);
kvStore.put(Device_Key, DeviceList)
}
resolve(deviceList)
});
})
}
?
向所有設(shè)備發(fā)送數(shù)據(jù)和接收數(shù)據(jù),只需要將數(shù)據(jù)庫中的備份內(nèi)容發(fā)送到分布式數(shù)據(jù)庫即可,若是需要自動同步,則打開數(shù)據(jù)庫監(jiān)聽:
export async function ExportNewVersion(showPrompt: boolean = false) {
const kvStore = await getKVStore()
let data: object = await getBackupObject()
let str: string = JSON.stringify(data)
console.log('[Sync] backup value: ' + str);
let newVersion: number = AppStorage.Get('LocalVersionNumber')
console.log('[Sync] newVersion: ' + newVersion);
kvStore.get(Version_Key, function (err, SyncVersion) {
console.log("get success Version_Key: " + SyncVersion);
console.log("get error: " + err);
if (SyncVersion == undefined || SyncVersion < newVersion) {
console.log('[Sync] newVersion: ' + newVersion);
kvStore.put(Version_Key, newVersion)
let i: number = 0;
for (; i < str.length; i += MaxLength) {
kvStore.put(Data_Key + (i.toString()), str.substring(i, i + MaxLength))
}
kvStore.put(Length_Key, str.length)
if (showPrompt)
prompt.showToast({
message: '發(fā)送成功,快去看看吧!',
duration: 1000,
});
} else {
if (showPrompt)
prompt.showToast({
message: '發(fā)送失敗,發(fā)送數(shù)據(jù)不為最新',
duration: 1000,
});
}
});
}
/**
* 從數(shù)據(jù)庫導(dǎo)入數(shù)據(jù)新版本
*/
async function ImportNewVersion(): Promise[boolean, number, string]?> {
let TerminalsSyncSwitch = AppStorage.Get('TerminalsSyncSwitch')
if (!TerminalsSyncSwitch)
return [false, 0, '']
const kvStore = await getKVStore()
let newVersion: number = AppStorage.Get('LocalVersionNumber')
console.log('[Sync] newVersion: ' + newVersion);
return new Promise((resolve) => {
kvStore.get(Version_Key, async function (err, SyncVersion) {
console.log("get success Version_Key: " + SyncVersion);
console.log("get error: " + err);
if (SyncVersion != undefined && SyncVersion > newVersion) {
let end: number = await kvStore.get(Length_Key)
let obj: string = ''
for (let i = 0; i < end; i += MaxLength) {
obj += await kvStore.get(Data_Key + (i.toString()))
}
console.log("get success Data_Key: " + obj);
console.log("get error: " + err);
console.log('[Sync] import: ' + JSON.stringify(obj));
let ret = JSON.parse(obj)
console.log('[Sync] import value: ' + JSON.stringify(ret));
backUpImpl.importData(ret, (flag: boolean, reason: string) =?> {
resolve([flag, SyncVersion, reason])
})
} else {
resolve([false, SyncVersion, '未接收到新數(shù)據(jù)'])
}
});
})
}
?
由于 KV 數(shù)據(jù)庫的 Value 有長度限制,我們可以拆解同步內(nèi)容在不同的 Value 中,之后又再組合起來,每次發(fā)布版本時還應(yīng)該打上時間戳標(biāo)記進(jìn)行對比,避免老版本覆蓋新版本。
四、軟件功能和界面操作說明
4.1 歡迎界面
在用戶首次點擊進(jìn)入軟件時,會跳出該界面。會讓用戶進(jìn)行隱私政策和用戶協(xié)議的閱讀,并同意后進(jìn)行勾選,才可進(jìn)入程序。

在此處,用戶可點擊高亮字體處的鏈接,打開用戶協(xié)議和隱私政策的界面,進(jìn)行詳細(xì)的閱讀。我們希望通過隱私政策告知用戶如何處理其個人信息,并清晰地闡明了收集、存儲、使用、共享和保護(hù)用戶信息的方式,以及如何處理用戶的請求和投訴等。以及通過用戶協(xié)議規(guī)范用戶行為,其中包含軟件的使用限制、禁止的行為、用戶義務(wù)和責(zé)任、維權(quán)條款等,以防止用戶濫用軟件、違反法律法規(guī)和侵犯他人權(quán)利。
在用戶閱讀完并確認(rèn)后,可以在上一界面,在是否同意處勾選后,點擊進(jìn)入程序。
4.2 引導(dǎo)界面
在用戶首次點擊進(jìn)入并通過用戶協(xié)議和隱私政策后,會進(jìn)入引導(dǎo)界面。引導(dǎo)界面作為軟件使用過程中的一個重要組成部分,可以幫助用戶快速了解軟件的基本功能和操作方法,提高用戶的使用效率和體驗。在這里我們分別對修改,完成及添加待辦事項;收起,展開及切日歷,展開象限,快捷同步等功能進(jìn)行了詳細(xì)的操作方式的介紹,以幫助用戶快速找到需要的功能,指引其完成操作,以提高軟件使用效率和體驗。


以下為部分引導(dǎo)界面所進(jìn)行教學(xué)的操作。




若用戶在使用期間遺忘了引導(dǎo)界面介紹的操作方式,可以通過“設(shè)置-關(guān)于-打開引導(dǎo)界面”的路徑,重新喚起以上的引導(dǎo)界面,熟悉對應(yīng)操作:

4.3 清單界面
在首次進(jìn)入程序,通過歡迎界面和引導(dǎo)界面后,以及之后進(jìn)入程序,都會進(jìn)入該清單界面。即在下方頁簽欄處顯示為“清單”高亮的界面(平板橫置時該頁簽在左側(cè))。同時,也可以通過該頁簽的點擊,切換至“日歷”、“四象限”或是“設(shè)置”界面。

在該清單界面左上方,有兩個下拉選擇按鈕,上方的可以進(jìn)行日期的選擇,以查看對應(yīng)日期的待辦事項。

下方的可以進(jìn)行待辦單的選擇,即選擇查看選定日期下,對應(yīng)待辦單或是全部待辦中的具體待辦事項。

在平板端 UI 界面中,下方的待辦單選擇下拉按鈕移動到左邊的選擇欄中,如下:

在下方是數(shù)據(jù)展示區(qū)域,其左邊,通過數(shù)字的形式向用戶顯示在所選擇的日子和選擇的對應(yīng)待辦單下,已完成待辦和未完成待辦的數(shù)量。右邊則是一個百分比顯示環(huán),能夠直觀的顯示用戶目前已完成的待辦占全部待辦的比例,以便幫助用戶更好地安排時間,合理分配精力,提高完成任務(wù)的效率。同時我們希望當(dāng)用戶看到待辦百分比逐漸增加時,會感到自己取得了進(jìn)步,從而增加完成任務(wù)的動力。

再下方是我們具體顯示在所選擇的日子和選擇的對應(yīng)待辦單下,對應(yīng)的全部“待完成”、“已過期”和“已完成”的待辦。這三者都可以通過點擊其名稱邊上的三角形,以打開或折疊對應(yīng)分類中的待辦


這三者中,“待完成”指的是,在用戶設(shè)置的對應(yīng)時間內(nèi),但還未完成或未達(dá)到全部完成次數(shù)的待辦。




這兩者可以在待辦第二行中看出區(qū)別,有“n/m”的是需要多次完成,且未全部完成的待辦,否則是未完成的單次待辦。
在一條待辦中,還有其他的信息,其中最左邊的圈的顏色,對應(yīng)了用戶將該待辦存放在哪個待辦單中,即這個確認(rèn)框的顏色和該待辦所歸類的待辦單的顏色保持一致。
第二欄中的感嘆號表示用戶是否將其列為重要待辦,若為重要代辦,也會在四象限中對應(yīng)展示;五角星對應(yīng)的是該待辦是否被用戶放入“我的收藏”;鬧鐘圖標(biāo)對應(yīng)的是用戶是否為該待辦設(shè)置了鬧鐘提醒。后面的“有效時間 | 循環(huán)規(guī)則”中,前面的表示該待辦的有效時間,全天指全天有效,如果給的是某一時間段就是在這每一時間段有效。后面的次數(shù)則是代表該待辦的重復(fù)方式,如“每天”就是每天出現(xiàn),“每三天”就是每三天現(xiàn)需要完成一次。
“已過期”則是指,在當(dāng)天中,當(dāng)前時間已經(jīng)過了該待辦對應(yīng)的有效時間,故為已過期。其中已過期的待辦可以順延,點擊右側(cè)的順延即可,若要全部順延,則點擊“已過期”右邊的全部順延即可。


“已完成”則是指已經(jīng)完成了的待辦,即完全完成(即多次的任務(wù)也全部完成)。其中,已完成的任務(wù)前面的勾是填充式的,且標(biāo)題會有刪除線,并在待辦第二行中末尾會顯示完成時間。


此時長按前面的勾選部分,可以減少一次完成次數(shù),使得該待辦重新成為待完成狀態(tài)。
如果是部分完成,前面的勾是線條式的。
如果長按待辦主體部分,可以呼出如下界面:


此時可以通過待辦后方的復(fù)選框,選擇對應(yīng)待辦,進(jìn)行收藏,移動,刪除,全選等操作。其中移動,刪除點擊后,對應(yīng)界面如圖:



右下角的添加按鈕,單擊可以呼出添加待辦的添加界面,若是打開了設(shè)備同步,可以長按添加按鈕,一鍵向所有設(shè)備同步或是接收最新數(shù)據(jù)。


點擊待辦單的選擇欄最后一行,可以進(jìn)行待辦分類的選擇以及待辦單添加的操作。
若是添加待辦單,則可以在跳出界面進(jìn)行名字,顏色的選擇,如圖:

4.4 添加界面
通過清單界面右下角的添加按鈕單擊進(jìn)入,再未展開前界面如下,可以輸入待辦名稱,選擇放入的待辦單,選擇是否收藏,是否重要,并選擇其生效時間。創(chuàng)建完成后點擊保存即可。

展開后的添加界面如下,可以添加備注,設(shè)置是否提醒以及對應(yīng)提醒時間,設(shè)置重復(fù)規(guī)律,有效時間等。

4.5 日歷界面
在頁簽中,點擊日歷即可切換到日歷界面。默認(rèn)的日歷界面會顯示當(dāng)前月份中,每一天待辦的縮略,并會給出完成待辦比例的百分比環(huán)。
在左上角,有兩個下拉選擇按鈕,可以選擇月份和待辦單。選擇后,下方日歷會根據(jù)所選的情況顯示對應(yīng)的內(nèi)容。同時在當(dāng)前日歷界面左右滑動可以切換月份。

若是選擇了某一天,或是點擊了下方的上箭頭,則會在下方顯示對應(yīng)日子對應(yīng)待辦單的全部待辦情況,其顯示規(guī)則與清單界面相同,故不再贅述。

其中上方的日歷部分會保留當(dāng)前周的預(yù)覽,此時若左右滑動日歷部分,則是切換上下周情況。
4.6 四象限界面
在頁簽中,點擊四象限即可切換到四象限界面。
在四象限界面中,整個界面被分為四界面,分別是“重要且緊急”、“重要但不緊急”、“不重要但緊急”、“不重要且不緊急”。這里的重要是根據(jù)用戶在設(shè)置待辦中,是否選擇了感嘆號,即由用戶手動勾選是否重要。而緊急,則是由軟件自身根據(jù)算法,判斷當(dāng)前時間與用戶設(shè)定的待辦有效時間間隔來判斷是否緊急。判斷后,會在根據(jù)用戶上方兩個下拉選擇欄選擇的條目篩選后,將該分類中的待辦,根據(jù)是否重要和是否緊急,分別顯示在四象限中。

其中,可以根據(jù)前方判定框,了解該待辦處于什么情況。空框為未完成,線條勾為完成部分,填充勾為全部完成。
同時點擊對應(yīng)框的標(biāo)題,可以打開該象限,觀察對應(yīng)待辦的詳細(xì)細(xì)節(jié)。打開后再次點擊象限名可以收起該象限。

4.7 設(shè)置界面
在頁簽中,點擊設(shè)置即可切換到設(shè)置界面。
“本地備份”點擊后可以打開對應(yīng)界面,之后可以開啟自動備份,即在每次退出應(yīng)用時候自動備份?;蛘呖梢栽谙路近c擊立即備份以手動備份。同時可以點擊右側(cè)的刷新查看當(dāng)前所有備份情況。
點擊“多端同步”后打開界面,開啟后可以下載或者上傳數(shù)據(jù)并儲存在分布式數(shù)據(jù)庫中。并且在下方可以查看已經(jīng)連接的設(shè)備情況。
點擊“編輯待辦單”,可以對待辦單進(jìn)行編輯,進(jìn)行刪除,改名和更改顏色的操作。

點擊“主題色”,可以對軟件主題色進(jìn)行更改,更改后需要重啟軟件才能生效。


點擊“默認(rèn)重復(fù)時長”,可以更改默認(rèn)重復(fù)時長,以便于用戶在創(chuàng)建待辦時,選擇重復(fù)時長更加方便。
點擊“默認(rèn)提醒時間”,可以更改默認(rèn)提醒時間,以便于用戶在創(chuàng)建待辦時,設(shè)置提醒時間時更加快捷。
點擊“星期開始于”,可以根據(jù)用戶習(xí)慣,更改由星期一開始或者星期日開始一周。
點擊“時間制式設(shè)置”,可以根據(jù)用戶習(xí)慣,更改時間制式為 12 小時制或 24 小時制。
點擊“常見問題”,可以查看一些常見問題的解答并了解咨詢方式。


點擊“用戶協(xié)議與隱私聲明”,可以查看本軟件的用戶協(xié)議與隱私聲明。


點擊“關(guān)于”,可以了解更多關(guān)于本軟件的信息,如軟件版本,官網(wǎng)網(wǎng)址,郵箱等。
五、總結(jié)
本文主要介紹了一個 oh 原生的,具有多端適配和同步備份功能的待辦清單類應(yīng)用,不僅可以讓用戶添加、編輯、刪除、篩選、歸檔自己的任務(wù),還可以讓用戶設(shè)置任務(wù)的優(yōu)先級、截止日期、重復(fù)規(guī)則、提醒方式等多種屬性,讓用戶更靈活地管理自己的任務(wù)。我們還提供了日歷頁面、四象限頁面、多種萬能卡片等方式拓展用戶的使用場景,優(yōu)化用戶的使用體驗。解決了市面上主流待辦清單類 APP 要么功能過于復(fù)雜,要么功能過于簡單,還有云端數(shù)據(jù)同步和安全性之間矛盾的問題。
本應(yīng)用的優(yōu)勢主要在于支持多設(shè)備,可以在不同的設(shè)備間交換和同步用戶的數(shù)據(jù),讓用戶可以隨時隨地地查看和更新自己的任務(wù)清單。這些功能全都是在本地進(jìn)行的,不必?fù)?dān)心數(shù)據(jù)泄露。同時因為是原生應(yīng)用,我們的應(yīng)用流暢穩(wěn)定,占用空間小,設(shè)計也符合系統(tǒng)一致性。
還需要改進(jìn)的地方主要是本地備份暫未做加密優(yōu)化,有隱私數(shù)據(jù)泄露風(fēng)險。同時暫未完成對其他端設(shè)備的支持(比如手表),這主要是最低支持 API 版本為 8 造成的影響,期待后續(xù)軟件的更新。
為了能讓大家更好的學(xué)習(xí)鴻蒙 (OpenHarmony) 開發(fā)技術(shù),這邊特意整理了《鴻蒙 (OpenHarmony)開發(fā)學(xué)習(xí)手冊》,希望對大家有所幫助:
《鴻蒙(Harmony OS)開發(fā)學(xué)習(xí)手冊》
入門必看:https://docs.qq.com/doc/DUk51cHZJaUpmSlhH
1.應(yīng)用開發(fā)導(dǎo)讀(ArKTS)
2.……

HarmonyOS概念:https://docs.qq.com/doc/DUk51cHZJaUpmSlhH
1.系統(tǒng)定義
2.技術(shù)框架
3.技術(shù)特性
4.系統(tǒng)安全

快速入門:https://docs.qq.com/doc/DUk51cHZJaUpmSlhH
1.基本概念
2.構(gòu)建第一個ArkTS應(yīng)用
3.…

開發(fā)基礎(chǔ)知識:https://docs.qq.com/doc/DUk51cHZJaUpmSlhH
1.應(yīng)用基礎(chǔ)知識
2.配置文件
3.應(yīng)用數(shù)據(jù)管理
4.應(yīng)用安全管理
5.應(yīng)用隱私保護(hù)
6.三方應(yīng)用調(diào)用管控機(jī)制
7.資源分類與訪問
8.學(xué)習(xí)ArkTS
9…

基于ArkTS 開發(fā):https://docs.qq.com/doc/DUk51cHZJaUpmSlhH
1.Ability開發(fā)
2.UI開發(fā)
3.公共事件與通知
4.窗口管理
5.媒體
6.安全
7.網(wǎng)絡(luò)與鏈接
8.電話服務(wù)
9.數(shù)據(jù)管理
10.后臺任務(wù)(Background Task)管理
11.設(shè)備管理
12.設(shè)備使用信息統(tǒng)計
13.DFX
14.國際化開發(fā)
15.折疊屏系列
16………

審核編輯 黃宇
-
鴻蒙
+關(guān)注
關(guān)注
60文章
3039瀏覽量
46216 -
HarmonyOS
+關(guān)注
關(guān)注
80文章
2157瀏覽量
36344
發(fā)布評論請先 登錄
開通App Linking服務(wù)
想體驗鴻蒙生態(tài),該怎么獲取鴻蒙開發(fā)板?有哪些途徑?
餐飲服務(wù)與軟件創(chuàng)新的融合:解析海底撈APP的Flutter鴻蒙開發(fā)之路
【HarmonyOS 5】鴻蒙mPaaS詳解
【HarmonyOS 5】金融應(yīng)用開發(fā)鴻蒙組件實踐
【HarmonyOS 5】鴻蒙中的UIAbility詳解(二)
鴻蒙開發(fā)——便單APP-輕便小巧的待辦清單【biandangroup】
評論