当前位置: 首页 > news >正文

工作事项管理小工具——HTML版

#工作日志与时间管理#

背景

       很多人有时候日常工具繁杂,但又每件事情都要及时完成,不能出错,面对这种情况,需要一个人有良好的记忆力和良好的计划做事习惯。但往往事情多起来,光凭脑子很难记住,有些人会借助贴一些记事贴的方法来帮助自己解决问题。昨天写了一篇《工作事项管理小工具》的文章,分享了一个可在电脑上本地运行的小程序,采用Python和PyQt5编程实现。今天再来分享一个HTML版本的小程序,做的比较简单,没有Python版的编辑修改等功能,目前只实现可以对事项是否完成进行跟踪标记。

一、功能介绍

整个程序就是一个html文件,双击打开index.html文件,即可运行这个小工具。

1.1 程序界面

1.2 添加事项

直接在事项文本框中心输入,然后单击添加按钮即可完成工作事项添加。

1.3 完成事项

只要单击事项前面的复选框,事项将变成完成状态。

1.4 事项列表查看

程序默认显示全部事项列表,可通过单击“未完成”和“已完成”按钮来切换事项列表。

二、程序代码分享


<!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 href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet"><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css"><style>body { width: 600px; height: 400px;margin: 0;}.task-item { transition: all 0.3s ease; }.completed-task { opacity: 0.7; text-decoration: line-through; }</style>
</head>
<body class="bg-gray-50 min-h-screen p-4"><div class="max-w-2xl mx-auto bg-white rounded-lg shadow-lg p-6"><h1 class="text-2xl font-bold text-center mb-6">本地待办清单</h1><div class="flex mb-4"><input id="taskInput" type="text" placeholder="输入新任务..." class="flex-grow p-2 border rounded-l focus:outline-none focus:ring-2 focus:ring-purple-500"><button id="addBtn" class="bg-purple-600 text-white px-4 py-2 rounded-r hover:bg-purple-700 transition"><i class="fas fa-plus mr-1"></i>添加</button></div><div class="flex space-x-2 mb-4"><button data-filter="all" class="filter-btn active bg-purple-600 text-white px-3 py-1 rounded">全部</button><button data-filter="active" class="filter-btn bg-gray-200 px-3 py-1 rounded">未完成</button><button data-filter="completed" class="filter-btn bg-gray-200 px-3 py-1 rounded">已完成</button></div><ul id="taskList" class="space-y-2 max-h-96 overflow-y-auto"></ul><div id="emptyState" class="text-center py-8 text-gray-500"><i class="fas fa-tasks text-4xl mb-2"></i><p>暂无任务,添加您的第一个任务吧!</p></div><div class="mt-4 flex justify-between items-center text-sm"><button id="clearBtn" class="text-red-500 hover:text-red-700"><i class="fas fa-trash-alt mr-1"></i>清除已完成</button><span id="taskCount" class="text-gray-500">0 项任务</span></div></div><script>document.addEventListener('DOMContentLoaded', function() {// 初始化数据let tasks = JSON.parse(localStorage.getItem('todo_tasks')) || [];let currentFilter = 'all';// 获取DOM元素const elements = {taskInput: document.getElementById('taskInput'),addBtn: document.getElementById('addBtn'),taskList: document.getElementById('taskList'),emptyState: document.getElementById('emptyState'),filterBtns: document.querySelectorAll('.filter-btn'),clearBtn: document.getElementById('clearBtn'),taskCount: document.getElementById('taskCount')};// 初始化应用function init() {loadTasks();setupEventListeners();}// 加载任务function loadTasks() {let filteredTasks = [];switch(currentFilter) {case 'active': filteredTasks = tasks.filter(task => !task.completed); break;case 'completed': filteredTasks = tasks.filter(task => task.completed); break;default: filteredTasks = [...tasks];}renderTasks(filteredTasks);updateTaskCount();}// 渲染任务列表function renderTasks(tasksToRender) {elements.taskList.innerHTML = '';if (tasksToRender.length === 0) {elements.emptyState.classList.remove('hidden');return;}elements.emptyState.classList.add('hidden');tasksToRender.forEach(task => {const li = document.createElement('li');li.className = `task-item p-3 border rounded flex items-center ${task.completed ? 'completed-task bg-gray-50' : ''}`;li.dataset.id = task.id;li.innerHTML = `<input type="checkbox" class="h-5 w-5 text-purple-600 rounded mr-3" ${task.completed ? 'checked' : ''}><div class="flex-grow"><div class="task-text ${task.completed ? 'line-through' : ''}">${task.text}</div><div class="text-xs text-gray-500 mt-1"><i class="far fa-clock mr-1"></i>${new Date(task.createdAt).toLocaleString()}${task.completed ? `<br><i class="fas fa-check mr-1"></i>完成于: ${new Date(task.completedAt).toLocaleString()}` : ''}</div></div><button class="delete-btn ml-2 text-gray-400 hover:text-red-500 transition"><i class="fas fa-times"></i></button>`;elements.taskList.appendChild(li);});// 添加事件监听document.querySelectorAll('.task-item input[type="checkbox"]').forEach(checkbox => {checkbox.addEventListener('change', function() {const taskId = this.closest('.task-item').dataset.id;toggleTask(taskId);});});document.querySelectorAll('.delete-btn').forEach(btn => {btn.addEventListener('click', function() {const taskId = this.closest('.task-item').dataset.id;if (confirm('确定要删除这个任务吗?')) {deleteTask(taskId);}});});}// 添加任务function addTask() {const text = elements.taskInput.value.trim();if (text) {const newTask = {id: Date.now().toString(),text: text,completed: false,createdAt: new Date().toISOString(),completedAt: null};tasks.unshift(newTask);saveTasks();elements.taskInput.value = '';loadTasks();}}// 切换任务状态function toggleTask(id) {const task = tasks.find(t => t.id === id);if (task) {task.completed = !task.completed;task.completedAt = task.completed ? new Date().toISOString() : null;saveTasks();loadTasks();}}// 删除任务function deleteTask(id) {tasks = tasks.filter(task => task.id !== id);saveTasks();loadTasks();}// 清除已完成任务function clearCompleted() {if (confirm('确定要清除所有已完成任务吗?此操作不可撤销!')) {tasks = tasks.filter(task => !task.completed);saveTasks();loadTasks();}}// 设置筛选条件function setFilter(filter) {currentFilter = filter;elements.filterBtns.forEach(btn => {btn.classList.toggle('active', btn.dataset.filter === filter);btn.classList.toggle('bg-purple-600', btn.dataset.filter === filter);btn.classList.toggle('text-white', btn.dataset.filter === filter);btn.classList.toggle('bg-gray-200', btn.dataset.filter !== filter);});loadTasks();}// 更新任务计数function updateTaskCount() {const total = tasks.length;const completed = tasks.filter(t => t.completed).length;elements.taskCount.textContent = `${completed}/${total} 已完成`;}// 保存任务到本地存储function saveTasks() {localStorage.setItem('todo_tasks', JSON.stringify(tasks));}// 设置事件监听function setupEventListeners() {elements.addBtn.addEventListener('click', addTask);elements.taskInput.addEventListener('keypress', function(e) {if (e.key === 'Enter') addTask();});elements.filterBtns.forEach(btn => {btn.addEventListener('click', function() {setFilter(this.dataset.filter);});});elements.clearBtn.addEventListener('click', clearCompleted);}// 启动应用init();});</script>
</body>
</html>

以上就是这个小工具的全部分享,希望能够对大家有所帮助。

http://www.dtcms.com/a/494309.html

相关文章:

  • 快速上手 Tailwind CSS:一份现代化的样式解决方案
  • 【文档】部署开源项目 mayfly-go
  • asp.net网站很快吗界面设计与制作主要学什么
  • 告别云盘依赖:ZFile+cpolar构建你的私有文件管理中心
  • 【软考备考】软考 数据总线、地址总线、控制总线详解
  • python+uniapp基于微信小程序的旅游信息系统
  • 基于偏振相机---太阳子午线计算技术
  • 专题:2025年游戏科技的AI革新研究报告:全球市场趋势研究报告|附130+份报告PDF、数据仪表盘汇总下载
  • 珠海市企业网站制作品牌做电影网站技术
  • 宽依赖的代价:Spark 与 MapReduce Shuffle 的数据重分布对比
  • CSC格式:稀疏矩阵的列式压缩存储指南
  • 12.docker swarm
  • C/C++内存管理详解:从基础原理到自定义内存池原理
  • 品质好物推荐怎么上大淘客网站如何做seo
  • Linux是怎么工作的--第二章
  • Web爬虫指南
  • AI越狱攻防战:揭秘大模型安全威胁
  • 《简易制作 Linux Shell:详细分析原理、设计与实践》
  • 网站 营销方案怎么在网站上添加广告代码
  • 前端面试题+算法题(三)
  • 吕口*音乐多销*-程序系统方案
  • 分享一个基于Java和Spring Boot的产品售后服务跟踪平台设计与实现,源码、调试、答疑、lw、开题报告、ppt
  • 上海AiLab扩散策略赋能具身导航!NavDP:基于特权信息的仿真到现实导航扩散策略
  • iOS 发布全流程详解,从开发到上架的流程与跨平台使用 开心上架 发布实战
  • 无线充电的工作原理是什么样子的呢?
  • led高端网站建设seo外链技巧
  • Cross Product / Vector Product / 向量外积 / 叉积 / 矢量外积 可理解为一个意思
  • 如何在 Mac 上恢复已删除的文件(包括清空了垃圾箱方法)
  • JavaScript学习第二天:常量与数据类型
  • perf 子系统宏观认知