用 Vue 做一个轻量离线的“待办清单 + 情绪打卡”小工具

article/2025/6/15 17:34:36

网罗开发 (小红书、快手、视频号同名)

  大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源等领域有深厚造诣。

图书作者:《ESP32-C3 物联网工程开发实战》
图书作者:《SwiftUI 入门,进阶与实战》
超级个体:COC上海社区主理人
特约讲师:大学讲师,谷歌亚马逊分享嘉宾
科技博主:华为HDE/HDG

我的博客内容涵盖广泛,主要分享技术教程、Bug解决方案、开发工具使用、前沿科技资讯、产品评测与使用体验。我特别关注云服务产品评测、AI 产品对比、开发板性能测试以及技术报告,同时也会提供产品优缺点分析、横向对比,并分享技术沙龙与行业大会的参会体验。我的目标是为读者提供有深度、有实用价值的技术洞察与分析。

展菲:您的前沿技术领航员
👋 大家好,我是展菲!
📱 全网搜索“展菲”,即可纵览我在各大平台的知识足迹。
📣 公众号“Swift社区”,每周定时推送干货满满的技术长文,从新兴框架的剖析到运维实战的复盘,助您技术进阶之路畅通无阻。
💬 微信端添加好友“fzhanfei”,与我直接交流,不管是项目瓶颈的求助,还是行业趋势的探讨,随时畅所欲言。
📅 最新动态:2025 年 3 月 17 日
快来加入技术社区,一起挖掘技术的无限潜能,携手迈向数字化新征程!


文章目录

    • 摘要
    • 引言
    • 整体功能设计
      • 模块划分
      • 技术选型
    • 界面原型设计
      • 首页结构
      • 情绪色彩体系(EmoColor)
    • 关键代码模块
      • IndexedDB 数据结构定义
      • 添加任务和情绪
      • 拖拽排序 + 实时保存
    • 情境场景与实际应用
      • 上班族早晨启动仪式
      • 晚上导出小结
    • QA 环节
      • Q: IndexedDB 的数据安全吗?
      • Q: 可否用这个工具做多人协同?
      • Q: 有必要用 Vue 吗?原生写更轻吧?
    • 总结

摘要

本文将带你一步步用 Vue 和 IndexedDB 构建一个融合「任务管理」与「情绪记录」的轻量小工具。它支持拖拽管理每日任务、记录情绪状态、图标标记、情绪色彩化展示,还能导出每日小结报告——更重要的是,它完全离线可用,适合放在你的浏览器书签里,随时点开就能用。

引言

我们在日常生活中常常被“待办清单”工具和“情绪日记”工具分别困扰。前者功能过重、界面复杂,后者又和任务管理脱节,无法形成完整闭环。那有没有可能,我们用一个超轻的小工具,把这两件事一次搞定?

我们来动手做一个吧——不需要注册、不依赖云端,开浏览器就能用,能做情绪打卡、任务安排,还能回顾一天的情绪波动和完成情况。

整体功能设计

模块划分

  • 任务管理:可添加、修改、删除、拖拽任务

  • 情绪记录:支持 5 种情绪打卡(开心、平静、焦虑、难过、生气)

  • 日历面板:显示每日任务 + 情绪状态(颜色小圆点)

  • 离线存储:使用 IndexedDB 保存所有数据

  • 每日小结导出:自动生成报告,支持导出 Markdown

技术选型

  • 框架:Vue 3 + Composition API

  • 状态管理:组合式响应式变量

  • 本地存储:IndexedDB(使用 idb 库简化操作)

  • 拖拽交互:SortableJS

  • 导出功能:使用 Blob 下载 Markdown 文件

界面原型设计

首页结构

  • 顶部:今天日期 + 情绪选择(图标按钮)

  • 中间:待办任务列表(支持添加、删除、拖拽排序)

  • 底部:导出今日总结按钮 + 任务完成情况统计

情绪色彩体系(EmoColor)

情绪图标背景色
开心😄#FFD700
平静😌#87CEFA
焦虑😰#FF8C00
难过😢#778899
生气😡#DC143C

关键代码模块

IndexedDB 数据结构定义

// db.js
import { openDB } from 'idb'export const dbPromise = openDB('todoMoodDB', 1, {upgrade(db) {db.createObjectStore('tasks', { keyPath: 'id', autoIncrement: true })db.createObjectStore('moods', { keyPath: 'date' })}
})

添加任务和情绪

// addTask.vue
async function addTask(content) {await dbPromise.then(db => db.add('tasks', {content,done: false,date: today()}))
}// moodSelect.vue
async function setMood(type) {await dbPromise.then(db => db.put('moods', {date: today(),type}))
}

拖拽排序 + 实时保存

// 使用 Sortable.js 实现任务拖拽并保存新顺序
import Sortable from 'sortablejs'onMounted(() => {Sortable.create(document.getElementById('taskList'), {onEnd(evt) {const updatedOrder = reorder(tasks.value, evt.oldIndex, evt.newIndex)tasks.value = updatedOrdersaveOrderToIndexedDB(updatedOrder)}})
})

情境场景与实际应用

上班族早晨启动仪式

上班前打开浏览器:

  • 一键记录今天的情绪状态

  • 添加3件今天必须完成的任务

  • 拖拽安排优先级

晚上导出小结

晚上临睡前点击「导出今日总结」按钮,系统自动导出 Markdown 文件,内容包括今日任务完成率、情绪波动记录,方便写日记、复盘。

QA 环节

Q: IndexedDB 的数据安全吗?

A: 在同一台设备上是安全的,除非用户清除浏览器缓存。不过你可以设置自动导出本地文件的功能做备份。

Q: 可否用这个工具做多人协同?

A: 当前定位是轻量离线使用。如果你想支持多人共享,可用 Service Worker + PWA 或 Firebase Firestore 做轻量云同步。

Q: 有必要用 Vue 吗?原生写更轻吧?

A: 原生也可以实现。但使用 Vue 更有利于后续扩展,比如加组件、支持周视图、多用户等。

总结

这个项目虽然小,但可以作为练习很多技术的 playground:

  • 熟悉 Vue 的组合式 API

  • 理解 IndexedDB 数据存储模型

  • 掌握拖拽交互设计

  • 探索如何把“无聊工具”做得有趣、亲切、易用

它也提醒我们:不一定非要做个大而全的 App,有时候一个“小而美”的实用页面,就能给人生活带来很大帮助。


http://www.hkcw.cn/article/SgLOTDahon.shtml

相关文章

6-2 MySQL 数据结构选择的合理性

6-2 MySQL 数据结构选择的合理性 文章目录 6-2 MySQL 数据结构选择的合理性1. 全表查询2. Hash 查询3. 二叉搜索树4. AVL 树5. B-Tree6.B Tree7. R树8. 小结附录:算法的时间复杂度9. 最后: 这篇文章是我蹲在《尚硅谷》-康师傅博主家的 WiFi 上(不是)&am…

红黑树与红黑树的插入——用C++实现

一、红黑树简介 红黑树是二叉搜索树的一种,区别于二叉平衡树,红黑树的平衡并不以平衡因子为依据进行平衡的调整而是以五条规则对红黑树进行定义,从而达成树的最长路径最多是树的最短路径的两倍长。以下是红黑树的五条规则: 节点非…

线程相关面试题

提示:线程相关面试题,持续更新中 文章目录 一、Java线程池1、Java线程池有哪些核心参数,分别有什么的作用?2、线程池有哪些拒绝策略?3、说一说线程池的执行流程?4、线程池核心线程数怎么设置呢?4、Java线程…

Axure设计案例:滑动拼图解锁

设计以直观易懂的操作方式为核心,只需通过简单的滑动动作,将拼图块精准移动至指定位置,即可完成解锁。这种操作模式既符合用户的日常操作习惯,在视觉呈现上,我们精心设计拼图图案,融入生动有趣的元素&#…

报表/报告组件(二)-实例与实现解释

上篇《报表/报告组件(一)-指标/属性组件设计》介绍了组件核心指标/属性设计,本文以实例介绍各个特性的实现和效果,实例是多个报告融合,显示所有的特性。 设计 指标/属性组件是报告/报表关键部分,上篇已介绍过,本节回顾…

django入门-orm数据库操作

一:下载数据库依赖项mysqlclient pip install mysqlclient 二:django配置文件配置数据库链接 路径:mysite2\mysite2\settings.py DATABASES {default: {ENGINE: django.db.backends.mysql,NAME: data, # 数据库名称USER: root, …

开疆智能Profinet转Profibus网关连接CMDF5-8ADe分布式IO配置案例

本案例是客户通过开疆智能研发的Profinet转Profibus网关将PLC的Profinet协议数据转换成IO使用的Profibus协议,操作步骤如下。 配置过程: Profinet一侧设置 1. 打开西门子组态软件进行组态,导入网关在Profinet一侧的GSD文件。 2. 新建项目并…

【RabbitMQ】- Channel和Delivery Tag机制

在 RabbitMQ 的消费者代码中,Channel 和 tag 参数的存在是为了实现消息确认机制(Acknowledgment)和精细化的消息控制。 Channel 参数 作用 Channel 是 AMQP 协议的核心操作接口,通过它可以直接与 RabbitMQ 交互: 手…

详解代理型RAG与MCP服务器集成

检索增强型生成(RAG)将语言模型与外部知识检索相结合,让模型的回答基于最新的事实,而不仅仅是其训练数据呢。 RAG(高级别) 在 RAG 流程中,用户查询用于搜索知识库(通常通过向量数据库中的嵌入来实现),并将检索到的最相关文档“增强”到模型的提示中,以帮助生成事实…

Keil 中因未引入源文件导致的函数调用与索引失败:从找不到定义到全局搜索无效

我在头文件中声明函数,源文件有定义,在有引入头文件的情况下调用的时候却找不到函数,头文件点击函数跳转不到源文件,全局搜索函数时找不到源文件的这个函数,最后是因为没有引入这个源文件 一、我在MQTT_Client_Task中使…

vue3学习

p3 创建vue3工程 1.创建命令 npm create vuelatest p4 编写APP组件 入口文件是index.html Vite 项目中, index.htm 是项目的入口文件,在项目最外层 加载index.html后,Vite解析 script typemoduleSrCXXX 指向的javascript Vue 中是通过 cr…

Vue3 + Vite:我的 Qiankun 微前端主子应用实践指南

前言 实践文章指南 vue微前端qiankun框架学习到项目实战,基座登录动态菜单及权限控制>>>>实战指南:Vue 2基座 Vue 3 Vite TypeScript微前端架构实现动态菜单与登录共享>>>>构建安全的Vue前后端分离架构:利用长Token与短Tok…

CloudFront 加速详解:AWS CDN 怎么用?

让全球访问更快速稳定,深入解读 AWS 的内容分发网络 在上一篇中,我们介绍了 Amazon S3 对象存储,它非常适合托管静态资源,比如图片、视频、网页等。但你可能遇到过这样的问题: “我把网站静态文件部署到了 S3&#xf…

嵌入式SDK技术EasyRTC音视频实时通话助力即时通信社交/教育等多场景创新应用

一、引言​ 在数字化时代,即时通信已成为人们生活和工作中不可或缺的部分。音视频功能作为即时通信的核心,能实现更加直观、高效的信息传递。EasyRTC作为一款强大的实时通信框架,具备诸多优势,为即时通信的音视频应用提供了优质解…

Rust 学习笔记:关于 Cargo 的练习题

Rust 学习笔记:关于 Cargo 的练习题 Rust 学习笔记:关于 Cargo 的练习题问题一问题二问题三问题四问题五问题六问题七 Rust 学习笔记:关于 Cargo 的练习题 参考视频: https://www.bilibili.com/video/BV1xjAaeAEUzhttps://www.b…

【时时三省】(C语言基础)数组作为函数参数

山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 调用有参函数时,需要提供实参。例如sin ( x ),sqrt ( 2,0 ),max ( a,b )等。实参可以是常量、变量或表达式。数组元素的作用与变量…

基于Android的一周穿搭APP的设计与实现 _springboot+vue

开发语言:Java框架:springboot AndroidJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7数据库工具:Navicat12开发软件:eclipse/myeclipse/ideaMaven包:Maven3.6 系统展示 APP登录 A…

【开源工具】超全Emoji工具箱开发实战:Python+PyQt5打造跨平台表情管理神器

🌟 超全Emoji工具箱开发实战:PythonPyQt5打造跨平台表情管理神器 🌈 个人主页:创客白泽 - CSDN博客 🔥 系列专栏:🐍《Python开源项目实战》 💡 热爱不止于代码,热情源自每…

当 “欧洲版 Cursor” 遇上安全危机

在 AI 编程助手蓬勃发展的当下,安全问题正成为行业不容忽视的隐忧。近期,AI 编程助手公司 Replit 与号称 “欧洲版 Cursor” 的 Lovable 之间,因安全漏洞问题掀起了一场风波,引发了业界的广泛关注。​ Replit 的员工 Matt Palmer…