时间规划程序设计
时间规划程序深度解析:构建高效任务管理系统的完整指南

一、引言
在当今快节奏的数字化时代,时间管理已成为提升个人效率和生产力的关键技能。随着移动互联网的普及,人们越来越依赖手机应用来管理日常任务和日程安排。本文将详细介绍一个基于鸿蒙(HarmonyOS)ArkTS框架构建的时间规划应用,深入剖析其技术架构、核心功能实现和设计理念。
二、项目概述
2.1 应用定位
本时间规划程序是一款面向个人用户的轻量级任务管理应用,旨在帮助用户高效管理日常任务,提升时间利用效率。应用采用直观的卡片式设计,支持任务的创建、编辑、删除、状态跟踪和优先级管理。
2.2 核心价值主张
| 价值维度 | 具体体现 |
|---|---|
| 高效管理 | 通过清晰的任务状态流转,实现从待办到完成的无缝衔接 |
| 优先级排序 | 支持高、中、低三级优先级,帮助用户聚焦重要任务 |
| 可视化进度 | 通过统计面板直观展示任务完成情况 |
| 数据持久化 | 本地存储确保数据安全,无需网络也可使用 |
| 智能筛选 | 支持按状态、优先级和关键词快速定位任务 |
2.3 功能矩阵
┌─────────────────────────────────────────────────────────────┐
│ 时间规划程序功能矩阵 │
├──────────────┬──────────────┬──────────────┬──────────────┤
│ 任务管理 │ 状态管理 │ 筛选搜索 │ 数据统计 │
├──────────────┼──────────────┼──────────────┼──────────────┤
│ 添加任务 │ 待办状态 │ 状态筛选 │ 总任务数 │
│ 编辑任务 │ 进行中状态 │ 优先级筛选 │ 待办数 │
│ 删除任务 │ 完成状态 │ 关键词搜索 │ 进行中数 │
│ 设置截止日期 │ 状态切换 │ 组合筛选 │ 完成数 │
└──────────────┴──────────────┴──────────────┴──────────────┘
三、技术架构设计
3.1 整体架构
┌─────────────────────────────────────────────────────────────┐
│ UI层 (Presentation) │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Index页面 │ │ TaskCard │ │ TaskModal │ │
│ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │
└─────────┼─────────────────┼─────────────────┼──────────────┘
│ │ │
┌─────────▼─────────────────▼─────────────────▼──────────────┐
│ 业务层 (Service) │
│ ┌──────────────────────────────┐ │
│ │ TaskService │ │
│ │ - CRUD操作 │ │
│ │ - 数据筛选 │ │
│ │ - 统计计算 │ │
│ └──────────────────────────────┘ │
└────────────────────────────┬───────────────────────────────┘
│
┌────────────────────────────▼───────────────────────────────┐
│ 数据层 (Model) │
│ ┌──────────────────────────────┐ │
│ │ Task类型定义 │ │
│ │ - Task接口 │ │
│ │ - TaskStatus枚举 │ │
│ │ - TaskPriority枚举 │ │
│ └──────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
3.2 模块职责划分
| 模块 | 职责 | 文件位置 |
|---|---|---|
| EntryAbility | 应用入口,生命周期管理 | entry/src/main/ets/EntryAbility.ts |
| Index页面 | 主界面,整合所有组件 | entry/src/main/ets/pages/Index.ets |
| TaskCard | 任务卡片组件,展示单个任务 | entry/src/main/ets/components/TaskCard.ets |
| TaskModal | 弹窗组件,添加/编辑任务 | entry/src/main/ets/components/TaskModal.ets |
| TaskService | 业务服务,数据管理 | entry/src/main/ets/service/TaskService.ts |
| Task模型 | 类型定义 | entry/src/main/ets/model/Task.ts |
| Constants | 常量配置 | entry/src/main/ets/common/Constants.ets |
3.3 数据流向
用户操作
│
▼
UI组件触发事件
│
▼
TaskService处理
│
├── 添加任务 → 生成ID → 保存到localStorage
├── 编辑任务 → 更新记录 → 保存到localStorage
├── 删除任务 → 移除记录 → 保存到localStorage
├── 状态切换 → 更新状态 → 保存到localStorage
└── 筛选搜索 → 过滤数据 → 返回结果
│
▼
状态更新通知UI
│
▼
UI重新渲染
四、核心功能详解
4.1 任务管理功能
4.1.1 添加任务
添加任务是应用的核心功能之一,用户可以通过点击右下角的浮动按钮打开添加弹窗:
// 触发添加任务弹窗
handleAddTask() {
this.editingTask = null;
this.showModal = true;
}
弹窗包含以下字段:
- 任务标题(必填):任务的核心描述
- 任务描述(可选):任务的详细说明
- 优先级:高、中、低三档
- 状态:待办、进行中、完成
- 截止日期:任务截止时间
4.1.2 编辑任务
编辑任务功能允许用户修改已有任务的所有属性:
handleEditTask(task: Task) {
this.editingTask = task;
this.showModal = true;
}
编辑弹窗会预先填充选中任务的所有信息,用户可以修改任意字段后保存。
4.1.3 删除任务
删除任务采用二次确认机制,防止误操作:
handleDeleteTask(id: string) {
this.taskToDelete = id;
this.showDeleteConfirm = true;
}
confirmDelete() {
taskService.deleteTask(this.taskToDelete);
this.loadTasks();
this.showDeleteConfirm = false;
}
4.2 状态管理功能
4.2.1 状态流转
任务支持三种状态,用户可以通过点击状态按钮快速切换:
handleStatusChange(id: string, status: string) {
taskService.updateTask(id, { status: status as TaskStatus });
this.loadTasks();
}
状态流转规则:
- 待办 → 进行中 → 完成(正向流转)
- 支持任意状态之间的直接切换
- 完成状态会自动记录完成时间
4.2.2 状态视觉标识
不同状态使用不同颜色标识:
- 待办:灰色(#9E9E9E)
- 进行中:蓝色(#2196F3)
- 完成:绿色(#4CAF50)
4.3 优先级管理功能
4.3.1 优先级设置
任务支持三级优先级:
export type TaskPriority = 'high' | 'medium' | 'low';
4.3.2 优先级视觉标识
优先级通过颜色徽章展示:
- 高优先级:红色(#F44336)- 需要立即处理
- 中优先级:橙色(#FF9800)- 中等重要
- 低优先级:绿色(#4CAF50)- 可稍后处理
4.4 截止日期功能
4.4.1 日期选择
用户可以通过日期选择器设置任务截止日期:
DatePicker({
start: new Date().toISOString(),
end: new Date(Date.now() + 365 * 24 * 60 * 60 * 1000).toISOString(),
selected: new Date(this.deadline).toISOString()
})
.onChange((date: DatePickerResult) => {
const year = date.year;
const month = String(date.month).padStart(2, '0');
const day = String(date.day).padStart(2, '0');
this.deadline = `${year}-${month}-${day}`;
});
4.4.2 过期提醒
当任务超过截止日期但未完成时,截止日期会以红色高亮显示:
const isOverdue = task.deadline < today && task.status !== 'done';
4.5 筛选搜索功能
4.5.1 状态筛选
用户可以按任务状态筛选:
filterTasksByStatus(status: TaskStatus): Task[] {
return this.tasks.filter(task => task.status === status);
}
4.5.2 优先级筛选
用户可以按优先级筛选:
filterTasksByPriority(priority: TaskPriority): Task[] {
return this.tasks.filter(task => task.priority === priority);
}
4.5.3 关键词搜索
支持按任务标题和描述搜索:
filterTasksByKeyword(keyword: string): Task[] {
const kw = keyword.toLowerCase();
return this.tasks.filter(task =>
task.title.toLowerCase().includes(kw) ||
task.description.toLowerCase().includes(kw)
);
}
4.5.4 组合筛选
支持同时按状态、优先级和关键词筛选:
getTasksByFilter(filter: TaskFilter): Task[] {
return this.tasks.filter(task => {
if (filter.status && task.status !== filter.status) return false;
if (filter.priority && task.priority !== filter.priority) return false;
if (filter.keyword) {
const keyword = filter.keyword.toLowerCase();
return task.title.toLowerCase().includes(keyword) ||
task.description.toLowerCase().includes(keyword);
}
return true;
});
}
4.6 统计功能
4.6.1 统计面板
首页顶部展示任务统计卡片:
getStats(): { total: number; todo: number; inProgress: number; done: number } {
return {
total: this.tasks.length,
todo: this.tasks.filter(t => t.status === 'todo').length,
inProgress: this.tasks.filter(t => t.status === 'inProgress').length,
done: this.tasks.filter(t => t.status === 'done').length
};
}
4.6.2 可视化展示
统计数据以卡片形式展示,每个卡片包含数字和标签:
@Builder
statsCard() {
const stats = taskService.getStats();
Row({ space: AppDimensions.spacingSmall }) {
Column({ space: 4 }) {
Text(`${stats.total}`)
.fontSize(AppDimensions.textSizeXLarge)
.fontWeight(FontWeight.Bold)
.color(AppColors.text);
Text('总任务')
.fontSize(AppDimensions.textSizeSmall)
.color(AppColors.textLight);
}
// ... 其他统计卡片
}
}
五、代码实现解析
5.1 类型定义
5.1.1 Task接口
export interface Task {
id: string; // 任务唯一标识
title: string; // 任务标题
description: string; // 任务描述
status: TaskStatus; // 任务状态
priority: TaskPriority; // 任务优先级
deadline: string; // 截止日期
createdAt: string; // 创建时间
completedAt?: string; // 完成时间(可选)
}
5.1.2 类型别名
export type TaskStatus = 'todo' | 'inProgress' | 'done';
export type TaskPriority = 'high' | 'medium' | 'low';
5.1.3 筛选接口
export interface TaskFilter {
status?: TaskStatus;
priority?: TaskPriority;
keyword?: string;
}
5.2 业务服务实现
5.2.1 TaskService类
export class TaskService {
private tasks: Task[] = [];
private STORAGE_KEY = 'time_planner_tasks';
constructor() {
this.loadTasks();
}
private loadTasks(): void {
try {
const stored = localStorage.getItem(this.STORAGE_KEY);
if (stored) {
this.tasks = JSON.parse(stored);
} else {
this.tasks = this.getDefaultTasks();
this.saveTasks();
}
} catch {
this.tasks = this.getDefaultTasks();
}
}
private saveTasks(): void {
localStorage.setItem(this.STORAGE_KEY, JSON.stringify(this.tasks));
}
}
5.2.2 CRUD操作
// 添加任务
addTask(task: Omit<Task, 'id' | 'createdAt'>): Task {
const now = new Date().toISOString().split('T')[0];
const newTask: Task = {
...task,
id: this.generateId(),
createdAt: now
};
this.tasks.unshift(newTask);
this.saveTasks();
return newTask;
}
// 更新任务
updateTask(id: string, updates: Partial<Omit<Task, 'id' | 'createdAt'>>): Task | undefined {
const index = this.tasks.findIndex(task => task.id === id);
if (index === -1) return undefined;
this.tasks[index] = { ...this.tasks[index], ...updates };
if (updates.status === 'done' && !this.tasks[index].completedAt) {
this.tasks[index].completedAt = new Date().toISOString().split('T')[0];
}
this.saveTasks();
return this.tasks[index];
}
// 删除任务
deleteTask(id: string): boolean {
const index = this.tasks.findIndex(task => task.id === id);
if (index === -1) return false;
this.tasks.splice(index, 1);
this.saveTasks();
return true;
}
5.3 UI组件实现
5.3.1 TaskCard组件
@Component
struct TaskCard {
@Prop task: Task;
onStatusChange: (id: string, status: string) => void;
onEdit: (task: Task) => void;
onDelete: (id: string) => void;
@Builder
priorityBadge(priority: string) {
const color = priority === 'high' ? AppColors.high :
priority === 'medium' ? AppColors.medium : AppColors.low;
Text(TaskPriorityMap[priority])
.fontSize(AppDimensions.textSizeSmall)
.color('#FFFFFF')
.backgroundColor(color)
.padding({ left: 8, right: 8, top: 2, bottom: 2 })
.borderRadius(12);
}
build() {
Column({ space: AppDimensions.spacingSmall }) {
// 任务头部
Row({ space: AppDimensions.spacingNormal }) {
this.priorityBadge(this.task.priority);
// ... 其他内容
}
// 任务状态按钮
Row({ space: AppDimensions.spacingSmall }) {
// 待办、进行中、完成按钮
}
}
.width('100%')
.padding(AppDimensions.cardPadding)
.backgroundColor(AppColors.cardBackground)
.borderRadius(AppDimensions.cardRadius);
}
}
5.3.2 TaskModal组件
@Component
struct TaskModal {
@Prop visible: boolean;
@Prop task: Task | null;
onConfirm: (task: Omit<Task, 'id' | 'createdAt'>) => void;
onCancel: () => void;
@State title: string = '';
@State description: string = '';
@State priority: TaskPriority = 'medium';
@State deadline: string = '';
@State status: TaskStatus = 'todo';
aboutToAppear() {
if (this.task) {
// 编辑模式:填充已有数据
this.title = this.task.title;
this.description = this.task.description;
this.priority = this.task.priority;
this.deadline = this.task.deadline;
this.status = this.task.status;
} else {
// 添加模式:初始化默认值
const today = new Date().toISOString().split('T')[0];
this.title = '';
this.description = '';
this.priority = 'medium';
this.deadline = today;
this.status = 'todo';
}
}
build() {
// 弹窗内容
Column({ space: AppDimensions.spacingNormal }) {
Text(this.task ? '编辑任务' : '添加任务')
.fontSize(AppDimensions.textSizeXLarge)
.fontWeight(FontWeight.Medium);
// 表单字段
this.inputField('任务标题', '请输入任务标题', this.title, (value) => this.title = value);
this.inputField('任务描述', '请输入任务描述', this.description, (value) => this.description = value);
// 优先级选择
this.selectField('优先级', [
{ value: 'high', label: '高' },
{ value: 'medium', label: '中' },
{ value: 'low', label: '低' }
], this.priority, (value) => this.priority = value as TaskPriority);
// 状态选择
this.selectField('状态', [
{ value: 'todo', label: '待办' },
{ value: 'inProgress', label: '进行中' },
{ value: 'done', label: '完成' }
], this.status, (value) => this.status = value as TaskStatus);
// 日期选择器
this.datePicker();
// 操作按钮
Row({ space: AppDimensions.spacingNormal }) {
Button('取消').onClick(this.onCancel);
Button('确定')
.enabled(this.title.trim().length > 0)
.onClick(() => {
if (this.title.trim()) {
this.onConfirm({
title: this.title,
description: this.description,
priority: this.priority,
status: this.status,
deadline: this.deadline
});
}
});
}
}
}
}
5.4 主页面实现
5.4.1 Index页面结构
@Entry
@Component
struct Index {
@State tasks: Task[] = [];
@State showModal: boolean = false;
@State editingTask: Task | null = null;
@State searchKeyword: string = '';
@State filterStatus: TaskStatus | 'all' = 'all';
@State filterPriority: TaskPriority | 'all' = 'all';
@State showDeleteConfirm: boolean = false;
@State taskToDelete: string = '';
aboutToAppear() {
this.loadTasks();
}
loadTasks() {
this.tasks = taskService.getTasksByFilter({
status: this.filterStatus !== 'all' ? this.filterStatus : undefined,
priority: this.filterPriority !== 'all' ? this.filterPriority : undefined,
keyword: this.searchKeyword || undefined
});
}
build() {
Column({ space: AppDimensions.spacingLarge }) {
this.header();
this.statsCard();
this.searchBar();
this.filterBar();
this.taskList();
}
.width('100%')
.height('100%')
.padding(AppDimensions.pagePadding)
.backgroundColor(AppColors.background);
}
}
六、设计模式与最佳实践
6.1 组件化设计
6.1.1 单一职责原则
每个组件只负责一个特定功能:
- TaskCard:只负责展示单个任务
- TaskModal:只负责添加/编辑任务的弹窗
- Index:整合所有组件,管理页面状态
6.1.2 可复用性
通过props传递数据和回调函数,使组件具有良好的复用性:
@Component
struct TaskCard {
@Prop task: Task; // 输入属性
onStatusChange: (id: string, status: string) => void; // 回调函数
onEdit: (task: Task) => void;
onDelete: (id: string) => void;
}
6.2 状态管理
6.2.1 响应式状态
使用@State装饰器实现响应式状态管理:
@State tasks: Task[] = [];
@State showModal: boolean = false;
@State editingTask: Task | null = null;
状态变化会自动触发UI重新渲染。
6.2.2 状态隔离
将状态分为页面状态和组件状态:
- 页面状态:由Index页面管理(任务列表、筛选条件等)
- 组件状态:由各组件内部管理(表单输入等)
6.3 数据持久化
6.3.1 localStorage存储
使用localStorage实现数据持久化:
private saveTasks(): void {
localStorage.setItem(STORAGE_KEY, JSON.stringify(this.tasks));
}
private loadTasks(): void {
const stored = localStorage.getItem(STORAGE_KEY);
if (stored) {
this.tasks = JSON.parse(stored);
}
}
6.3.2 错误处理
添加异常处理确保数据加载安全:
private loadTasks(): void {
try {
const stored = localStorage.getItem(STORAGE_KEY);
if (stored) {
this.tasks = JSON.parse(stored);
} else {
this.tasks = this.getDefaultTasks();
this.saveTasks();
}
} catch {
this.tasks = this.getDefaultTasks();
}
}
6.4 代码组织
6.4.1 目录结构
entry/src/main/ets/
├── EntryAbility.ts # 入口能力
├── common/
│ └── Constants.ets # 常量配置
├── components/
│ ├── TaskCard.ets # 任务卡片组件
│ └── TaskModal.ets # 弹窗组件
├── model/
│ └── Task.ts # 类型定义
├── pages/
│ └── Index.ets # 主页面
└── service/
└── TaskService.ts # 业务服务
6.4.2 常量集中管理
将颜色、尺寸、字符串等常量集中管理:
export const AppColors = {
primary: '#6200EE',
primaryDark: '#3700B3',
accent: '#03DAC6',
// ...
};
export const AppDimensions = {
pagePadding: 20,
cardPadding: 16,
// ...
};
export const AppStrings = {
appName: '时间规划',
addTask: '添加任务',
// ...
};
七、性能优化策略
7.1 渲染优化
7.1.1 虚拟列表
对于大量任务,使用List组件实现虚拟滚动:
List({ space: AppDimensions.spacingNormal }) {
ForEach(this.tasks, (task) => {
ListItem() {
TaskCard({ task: task });
}
});
}
7.1.2 条件渲染
避免不必要的渲染:
if (this.showModal) {
Column() {
TaskModal({ visible: this.showModal });
}
}
7.2 数据优化
7.2.1 延迟加载
只在需要时加载数据:
aboutToAppear() {
this.loadTasks();
}
7.2.2 缓存策略
使用localStorage缓存数据,减少重复计算。
7.3 内存管理
7.3.1 及时清理
在组件销毁时清理资源:
aboutToDisappear() {
// 清理资源
}
7.3.2 避免内存泄漏
确保事件监听器正确移除。
八、部署与发布
8.1 构建配置
8.1.1 build-profile.json5
{
"app": {
"signingConfigs": [],
"products": [
{
"name": "default",
"signingConfig": "default",
"compatibleSdkVersion": "5.0.0(12)",
"runtimeOS": "HarmonyOS"
}
]
},
"modules": [
{
"name": "entry",
"srcPath": "./entry",
"targets": [
{
"name": "default",
"applyToProducts": ["default"]
}
]
}
]
}
8.1.2 签名配置
在DevEco Studio中配置签名证书:
- 生成签名证书
- 配置签名信息
- 构建HAP包
8.2 测试验证
8.2.1 功能测试
| 测试场景 | 测试用例 | 预期结果 |
|---|---|---|
| 添加任务 | 输入标题后点击确定 | 任务成功添加到列表 |
| 编辑任务 | 修改任务标题后保存 | 任务信息更新 |
| 删除任务 | 点击删除按钮并确认 | 任务从列表移除 |
| 状态切换 | 点击状态按钮 | 任务状态更新 |
| 筛选功能 | 选择状态筛选 | 列表显示对应任务 |
| 搜索功能 | 输入关键词 | 列表显示匹配任务 |
8.2.2 兼容性测试
- 鸿蒙系统版本兼容性
- 不同屏幕尺寸适配
- 横竖屏切换
8.3 发布准备
| 检查项 | 说明 |
|---|---|
| 应用图标 | 准备不同尺寸的图标资源 |
| 版本信息 | 确认versionCode和versionName |
| 权限声明 | 检查module.json5中的权限配置 |
| 用户协议 | 添加隐私政策和用户协议 |
九、未来规划
9.1 功能扩展
9.1.1 分类管理
支持任务分类和标签:
export interface TaskCategory {
id: string;
name: string;
color: string;
}
9.1.2 提醒功能
支持设置任务提醒时间:
export interface Task {
// ... 现有字段
reminderTime?: string; // 提醒时间
reminderEnabled: boolean; // 是否启用提醒
}
9.1.3 数据导出
支持将任务导出为JSON或CSV格式。
9.1.4 协作功能
支持任务分享和协作编辑。
9.2 技术升级
9.2.1 数据库迁移
从localStorage迁移到更强大的数据库方案,如SQLite。
9.2.2 云同步
支持多设备数据同步。
9.2.3 AI智能推荐
基于用户习惯提供智能任务推荐。
9.3 用户体验优化
9.3.1 主题切换
支持深色/浅色主题切换。
9.3.2 手势操作
支持滑动删除、拖拽排序等手势操作。
9.3.3 动画效果
添加流畅的过渡动画和微交互。
十、总结
10.1 项目成果
本时间规划程序已完成以下功能:
- 任务管理:添加、编辑、删除任务
- 状态管理:待办、进行中、完成三态切换
- 优先级管理:高、中、低三级优先级
- 截止日期:日期选择和过期提醒
- 筛选搜索:多维度筛选和关键词搜索
- 数据统计:实时统计任务完成情况
- 数据持久化:localStorage本地存储
- Mock数据:预置示例任务便于体验
10.2 技术亮点
- 组件化设计:高内聚低耦合的组件架构
- 响应式状态:使用ArkTS状态装饰器实现自动UI更新
- 类型安全:TypeScript提供完整的类型支持
- 模块化架构:清晰的目录结构和职责划分
- 用户体验:流畅的交互和直观的视觉设计
10.3 应用价值
该时间规划程序为用户提供了一个简洁高效的任务管理工具,帮助用户:
- 系统化管理日常任务
- 合理分配时间和精力
- 提高工作和学习效率
- 实现目标追踪和进度管理
通过持续迭代和功能扩展,该应用有望成为用户日常时间管理的得力助手。
项目地址:c:\Users\31744\Desktop\sia
技术栈:HarmonyOS ArkTS + TypeScript
核心特性:任务管理、状态流转、优先级排序、数据持久化、智能筛选
更多推荐


所有评论(0)