首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >万能工具大全——待办事项应用

万能工具大全——待办事项应用

作者头像
红目香薰
发布2025-12-16 15:13:15
发布2025-12-16 15:13:15
2260
举报
文章被收录于专栏:CSDNToQQCodeCSDNToQQCode
在这里插入图片描述
在这里插入图片描述

前言

我们可以通过算法来完成很多很多的功能,所以就有了一个想法,将各类工具都写出来,当然是尽可能的,毕竟未来无限可期,很多功能是我们当前还想不到的,为了最为靠谱的方法来完成,这里选择的语言为 HTML 来完成,别看只是简单的页面操作,但是里面都是各类算法来完成的,并且有很多的js库,做起来会很方便,能节约很多的时间,本系列文章会很多,有些标题命名可能不太合适,如果你用到了,感觉不好找可以在文章下面留言,我看到了后会进行对应的修改,希望本系列文章能给大家提供到各种各样的遍历。

功能说明

基本功能 添加任务:用户可以输入任务内容,设置优先级和截止日期,然后点击"添加"按钮或按回车键添加新任务。 查看任务:所有添加的任务会显示在任务列表中,包括任务内容、优先级标记和截止日期。 完成任务:点击任务前的圆形复选框可以标记任务为已完成状态,已完成的任务会有删除线标记。 删除任务:点击任务右侧的垃圾桶图标可以删除该任务。 清除已完成任务:点击底部的"清除已完成"按钮可以一次性删除所有已完成的任务。 高级功能 任务优先级:

高优先级:红色标记 中优先级:橙色标记 低优先级:绿色标记 任务过滤:

全部:显示所有任务 未完成:只显示未完成的任务 已完成:只显示已完成的任务 任务排序:

按优先级排序:高优先级任务排在前面 按截止日期排序:截止日期近的任务排在前面 按添加时间排序:最近添加的任务排在前面 截止日期显示:

今天到期的显示为"今天" 明天到期的显示为"明天" 其他日期显示为"月份+日期" 已过期的任务日期会以红色显示并带有警告图标 数据持久化:

使用浏览器的localStorage保存任务数据,关闭页面后再次打开仍能看到之前的任务 任务统计:

底部显示当前未完成任务的数量 响应式设计:

适配不同屏幕尺寸,在手机等小屏设备上也能良好显示 这个应用采用了现代化的界面设计,操作简单直观,可以帮助用户有效地管理和跟踪日常任务。

核心代码

以HTML代码为主,只有index.html

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>待办事项应用</title>
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css">
    <style>
:root {
    --primary-color: #ff7a7a;
    --secondary-color: #ffb6b6;
    --bg-color: #fff9f9;
    --text-color: #333;
    --border-color: #f0e0e0;
    --shadow-color: rgba(255, 122, 122, 0.1);
    --completed-color: #a8a8a8;
    --high-priority: #ff7a7a;
    --medium-priority: #ffb347;
    --low-priority: #90ee90;
}

* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
    font-family: 'PingFang SC', 'Microsoft YaHei', sans-serif;
}

body {
    background-color: var(--bg-color);
    color: var(--text-color);
    line-height: 1.6;
}

.container {
    max-width: 800px;
    margin: 0 auto;
    padding: 20px;
}

header {
    margin-bottom: 30px;
}

.profile {
    display: flex;
    align-items: center;
    gap: 15px;
}

.avatar img {
    width: 60px;
    height: 60px;
    border-radius: 50%;
    object-fit: cover;
    border: 3px solid var(--primary-color);
}

.info h3 {
    font-size: 1.2rem;
    margin-bottom: 5px;
}

.info p {
    font-size: 0.9rem;
    color: #666;
}

.blog-post {
    background-color: white;
    border-radius: 15px;
    padding: 30px;
    box-shadow: 0 5px 15px var(--shadow-color);
    margin-bottom: 30px;
}

.blog-post h1 {
    font-size: 1.8rem;
    margin-bottom: 15px;
    color: var(--primary-color);
}

.post-meta {
    display: flex;
    gap: 15px;
    font-size: 0.85rem;
    color: #888;
    margin-bottom: 25px;
    flex-wrap: wrap;
}

.post-meta span {
    display: flex;
    align-items: center;
    gap: 5px;
}

.post-content h2 {
    font-size: 1.5rem;
    margin: 30px 0 15px;
    padding-bottom: 10px;
    border-bottom: 2px solid var(--secondary-color);
    color: var(--primary-color);
}

.post-content p, .post-content ul, .post-content ol {
    margin-bottom: 20px;
}

.post-content ul, .post-content ol {
    padding-left: 20px;
}

.post-content li {
    margin-bottom: 10px;
}

.tool-demo {
    background-color: #fafafa;
    border-radius: 10px;
    padding: 20px;
    margin: 30px 0;
    border: 1px solid var(--border-color);
}

.tool-demo h3 {
    text-align: center;
    margin-bottom: 20px;
    color: var(--primary-color);
}

.todo-app {
    background-color: white;
    border-radius: 10px;
    box-shadow: 0 3px 10px var(--shadow-color);
    overflow: hidden;
}

.todo-header {
    background-color: var(--primary-color);
    color: white;
    padding: 15px 20px;
}

.todo-header h2 {
    font-size: 1.3rem;
    margin-bottom: 15px;
    display: flex;
    align-items: center;
    gap: 10px;
}

.todo-form {
    display: flex;
    flex-direction: column;
    gap: 10px;
}

.todo-form input[type="text"] {
    padding: 10px 15px;
    border: none;
    border-radius: 5px;
    font-size: 1rem;
    width: 100%;
}

.task-details {
    display: flex;
    gap: 10px;
    flex-wrap: wrap;
}

.task-details select, .task-details input[type="date"] {
    padding: 8px;
    border: none;
    border-radius: 5px;
    flex: 1;
    min-width: 100px;
}

#addTaskBtn {
    background-color: white;
    color: var(--primary-color);
    border: none;
    border-radius: 5px;
    padding: 8px 15px;
    cursor: pointer;
    font-weight: bold;
    display: flex;
    align-items: center;
    gap: 5px;
    transition: all 0.3s;
}

#addTaskBtn:hover {
    background-color: #f0f0f0;
}

.filter-options {
    display: flex;
    justify-content: space-between;
    padding: 15px 20px;
    background-color: #f9f9f9;
    border-bottom: 1px solid var(--border-color);
    flex-wrap: wrap;
    gap: 10px;
}

.filter-btn {
    background: none;
    border: none;
    padding: 5px 10px;
    cursor: pointer;
    border-radius: 15px;
    transition: all 0.3s;
}

.filter-btn.active {
    background-color: var(--primary-color);
    color: white;
}

.sort-options {
    display: flex;
    align-items: center;
    gap: 10px;
}

.sort-options select {
    padding: 5px;
    border: 1px solid var(--border-color);
    border-radius: 5px;
}

.todo-list {
    list-style: none;
    max-height: 300px;
    overflow-y: auto;
}

.todo-list li {
    padding: 15px 20px;
    border-bottom: 1px solid var(--border-color);
    display: flex;
    justify-content: space-between;
    align-items: center;
    transition: all 0.3s;
}

.todo-list li:hover {
    background-color: #f9f9f9;
}

.task-content {
    display: flex;
    align-items: center;
    gap: 10px;
    flex: 1;
}

.task-checkbox {
    width: 20px;
    height: 20px;
    border-radius: 50%;
    border: 2px solid var(--primary-color);
    display: flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;
}

.task-checkbox.completed {
    background-color: var(--primary-color);
    color: white;
}

.task-text {
    flex: 1;
}

.task-text.completed {
    text-decoration: line-through;
    color: var(--completed-color);
}

.task-priority {
    width: 10px;
    height: 10px;
    border-radius: 50%;
    margin-right: 10px;
}

.priority-3 {
    background-color: var(--high-priority);
}

.priority-2 {
    background-color: var(--medium-priority);
}

.priority-1 {
    background-color: var(--low-priority);
}

.task-date {
    font-size: 0.8rem;
    color: #888;
}

.task-actions {
    display: flex;
    gap: 10px;
}

.task-actions button {
    background: none;
    border: none;
    cursor: pointer;
    color: #888;
    transition: all 0.3s;
}

.task-actions button:hover {
    color: var(--primary-color);
}

.todo-stats {
    display: flex;
    justify-content: space-between;
    padding: 15px 20px;
    background-color: #f9f9f9;
    color: #888;
    font-size: 0.9rem;
}

#clearCompletedBtn {
    background: none;
    border: none;
    color: var(--primary-color);
    cursor: pointer;
}

.code-section {
    background-color: #f8f8f8;
    border-radius: 10px;
    padding: 20px;
    margin: 20px 0;
    border: 1px solid #eee;
}

.code-section h3 {
    margin-top: 20px;
    margin-bottom: 10px;
    color: var(--primary-color);
}

.post-footer {
    margin-top: 40px;
    border-top: 1px solid var(--border-color);
    padding-top: 20px;
}

.tags {
    display: flex;
    flex-wrap: wrap;
    gap: 10px;
    margin-bottom: 20px;
}

.tag {
    background-color: var(--secondary-color);
    color: white;
    padding: 5px 10px;
    border-radius: 15px;
    font-size: 0.8rem;
}

.social-share {
    display: flex;
    gap: 15px;
}

.social-share button {
    background: none;
    border: 1px solid var(--border-color);
    padding: 8px 15px;
    border-radius: 20px;
    cursor: pointer;
    display: flex;
    align-items: center;
    gap: 5px;
    transition: all 0.3s;
}

.social-share button:hover {
    background-color: var(--primary-color);
    color: white;
    border-color: var(--primary-color);
}

footer {
    text-align: center;
    padding: 20px 0;
    color: #888;
    font-size: 0.9rem;
}

@media (max-width: 600px) {
    .container {
        padding: 10px;
    }
    
    .blog-post {
        padding: 20px;
    }
    
    .post-meta {
        flex-direction: column;
        gap: 5px;
    }
    
    .task-details {
        flex-direction: column;
    }
    
    .filter-options {
        flex-direction: column;
        align-items: flex-start;
    }
    
    .social-share {
        flex-wrap: wrap;
    }
}
    </style>
</head>
<body>
    <div class="container">
        <div class="blog-post">
            <h1>待办事项应用</h1>
            
            <div class="tool-demo">
                <h3>我的待办事项</h3>
                <div class="todo-app">
                    <div class="todo-header">
                        <h2><i class="fas fa-tasks"></i> 待办事项</h2>
                        <div class="todo-form">
                            <input type="text" id="taskInput" placeholder="添加新任务...">
                            <div class="task-details">
                                <select id="prioritySelect">
                                    <option value="3">高优先级</option>
                                    <option value="2" selected>中优先级</option>
                                    <option value="1">低优先级</option>
                                </select>
                                <input type="date" id="dueDateInput">
                                <button id="addTaskBtn"><i class="fas fa-plus"></i> 添加</button>
                            </div>
                        </div>
                    </div>
                    
                    <div class="filter-options">
                        <div class="filter-buttons">
                            <button class="filter-btn active" data-filter="all">全部</button>
                            <button class="filter-btn" data-filter="active">未完成</button>
                            <button class="filter-btn" data-filter="completed">已完成</button>
                        </div>
                        <div class="sort-options">
                            <span>排序:</span>
                            <select id="sortSelect">
                                <option value="priority">优先级</option>
                                <option value="date">截止日期</option>
                                <option value="added">添加时间</option>
                            </select>
                        </div>
                    </div>
                    
                    <ul id="taskList" class="todo-list">
                        <!-- 任务将通过JavaScript动态添加 -->
                    </ul>
                    
                    <div class="todo-stats">
                        <span id="taskCount">0 个待办任务</span>
                        <button id="clearCompletedBtn">清除已完成</button>
                    </div>
                </div>
            </div>
        </div>
    </div>

    <script>
document.addEventListener('DOMContentLoaded', function() {
    // DOM元素
    const taskInput = document.getElementById('taskInput');
    const prioritySelect = document.getElementById('prioritySelect');
    const dueDateInput = document.getElementById('dueDateInput');
    const addTaskBtn = document.getElementById('addTaskBtn');
    const taskList = document.getElementById('taskList');
    const taskCount = document.getElementById('taskCount');
    const clearCompletedBtn = document.getElementById('clearCompletedBtn');
    const filterBtns = document.querySelectorAll('.filter-btn');
    const sortSelect = document.getElementById('sortSelect');
    
    // 设置今天的日期为默认日期
    const today = new Date();
    const formattedDate = today.toISOString().split('T')[0];
    dueDateInput.value = formattedDate;
    
    // 任务数组
    let tasks = JSON.parse(localStorage.getItem('tasks')) || [];
    
    // 当前过滤器
    let currentFilter = 'all';
    
    // 初始化
    renderTasks();
    updateTaskCount();
    
    // 添加任务
    addTaskBtn.addEventListener('click', addTask);
    taskInput.addEventListener('keypress', function(e) {
        if (e.key === 'Enter') {
            addTask();
        }
    });
    
    // 清除已完成任务
    clearCompletedBtn.addEventListener('click', clearCompleted);
    
    // 过滤器点击事件
    filterBtns.forEach(btn => {
        btn.addEventListener('click', function() {
            filterBtns.forEach(b => b.classList.remove('active'));
            this.classList.add('active');
            currentFilter = this.dataset.filter;
            renderTasks();
        });
    });
    
    // 排序选择事件
    sortSelect.addEventListener('change', renderTasks);
    
    // 添加任务函数
    function addTask() {
        const text = taskInput.value.trim();
        if (text) {
            const priority = parseInt(prioritySelect.value);
            const dueDate = dueDateInput.value || formattedDate;
            
            const task = {
                id: Date.now(),
                text,
                priority,
                dueDate,
                completed: false,
                createdAt: Date.now()
            };
            
            tasks.push(task);
            saveTasks();
            renderTasks();
            updateTaskCount();
            
            // 清空输入
            taskInput.value = '';
            prioritySelect.value = '2';
            dueDateInput.value = formattedDate;
            taskInput.focus();
        }
    }
    
    // 渲染任务列表
    function renderTasks() {
        // 过滤任务
        let filteredTasks = tasks;
        if (currentFilter === 'active') {
            filteredTasks = tasks.filter(task => !task.completed);
        } else if (currentFilter === 'completed') {
            filteredTasks = tasks.filter(task => task.completed);
        }
        
        // 排序任务
        const sortBy = sortSelect.value;
        filteredTasks = sortTasks(filteredTasks, sortBy);
        
        // 清空列表
        taskList.innerHTML = '';
        
        // 添加任务到列表
        filteredTasks.forEach(task => {
            const li = document.createElement('li');
            
            // 任务内容
            const taskContent = document.createElement('div');
            taskContent.className = 'task-content';
            
            // 复选框
            const checkbox = document.createElement('div');
            checkbox.className = `task-checkbox ${task.completed ? 'completed' : ''}`;
            checkbox.innerHTML = task.completed ? '<i class="fas fa-check"></i>' : '';
            checkbox.addEventListener('click', () => toggleTask(task.id));
            
            // 优先级标记
            const priorityMark = document.createElement('div');
            priorityMark.className = `task-priority priority-${task.priority}`;
            
            // 任务文本
            const taskText = document.createElement('div');
            taskText.className = `task-text ${task.completed ? 'completed' : ''}`;
            taskText.textContent = task.text;
            
            // 截止日期
            const taskDate = document.createElement('div');
            taskDate.className = 'task-date';
            const dueDate = new Date(task.dueDate);
            const now = new Date();
            const isOverdue = !task.completed && dueDate < now && dueDate.toDateString() !== now.toDateString();
            
            taskDate.textContent = formatDate(task.dueDate);
            if (isOverdue) {
                taskDate.style.color = 'red';
                taskDate.innerHTML += ' <i class="fas fa-exclamation-circle"></i>';
            }
            
            // 组装任务内容
            taskContent.appendChild(checkbox);
            taskContent.appendChild(priorityMark);
            taskContent.appendChild(taskText);
            taskContent.appendChild(taskDate);
            
            // 任务操作
            const taskActions = document.createElement('div');
            taskActions.className = 'task-actions';
            
            // 删除按钮
            const deleteBtn = document.createElement('button');
            deleteBtn.innerHTML = '<i class="fas fa-trash"></i>';
            deleteBtn.addEventListener('click', () => deleteTask(task.id));
            
            // 组装任务操作
            taskActions.appendChild(deleteBtn);
            
            // 组装任务项
            li.appendChild(taskContent);
            li.appendChild(taskActions);
            
            taskList.appendChild(li);
        });
    }
    
    // 切换任务完成状态
    function toggleTask(id) {
        tasks = tasks.map(task => {
            if (task.id === id) {
                return { ...task, completed: !task.completed };
            }
            return task;
        });
        
        saveTasks();
        renderTasks();
        updateTaskCount();
    }
    
    // 删除任务
    function deleteTask(id) {
        tasks = tasks.filter(task => task.id !== id);
        saveTasks();
        renderTasks();
        updateTaskCount();
    }
    
    // 清除已完成任务
    function clearCompleted() {
        tasks = tasks.filter(task => !task.completed);
        saveTasks();
        renderTasks();
        updateTaskCount();
    }
    
    // 更新任务计数
    function updateTaskCount() {
        const activeCount = tasks.filter(task => !task.completed).length;
        taskCount.textContent = `${activeCount} 个待办任务`;
    }
    
    // 保存任务到本地存储
    function saveTasks() {
        localStorage.setItem('tasks', JSON.stringify(tasks));
    }
    
    // 排序任务
    function sortTasks(tasks, sortBy) {
        return [...tasks].sort((a, b) => {
            if (sortBy === 'priority') {
                // 按优先级排序(高到低)
                return b.priority - a.priority;
            } else if (sortBy === 'date') {
                // 按截止日期排序(近到远)
                return new Date(a.dueDate) - new Date(b.dueDate);
            } else {
                // 按添加时间排序(新到旧)
                return b.createdAt - a.createdAt;
            }
        });
    }
    
    // 格式化日期
    function formatDate(dateString) {
        const date = new Date(dateString);
        const today = new Date();
        const tomorrow = new Date(today);
        tomorrow.setDate(tomorrow.getDate() + 1);
        
        if (date.toDateString() === today.toDateString()) {
            return '今天';
        } else if (date.toDateString() === tomorrow.toDateString()) {
            return '明天';
        } else {
            return `${date.getMonth() + 1}月${date.getDate()}日`;
        }
    }
});
    </script>
</body>
</html>

效果截图

操作很简单,一目了然。

在这里插入图片描述
在这里插入图片描述

价值与意义

这款待办事项应用为用户提供了一个简洁高效的任务管理工具,具有以下价值:

提高工作效率:通过清晰的任务可视化和优先级管理,帮助用户合理安排时间,提高工作和生活效率。

减轻心理负担:将任务从脑海中转移到应用中,减少记忆负担,降低遗忘重要事项的风险。

培养时间管理能力:通过截止日期设置和任务排序功能,帮助用户建立良好的时间管理习惯。

成就感提升:完成任务后的可视化反馈(划线、标记)给用户带来成就感,增强持续使用的动力。

简单易用:无需注册账号,打开网页即可使用,操作简单直观,适合各年龄段用户。

这个应用体现了"化繁为简"的设计理念,帮助用户在信息爆炸的时代专注于真正重要的事项。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-12-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 功能说明
  • 核心代码
  • 效果截图
  • 价值与意义
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档