吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1809|回复: 38
收起左侧

[其他原创] 离线极简WEB--乱记(Luan-ji)极简版便签工具

  [复制链接]
peter5258 发表于 2024-11-24 11:27
本帖最后由 peter5258 于 2024-11-24 11:31 编辑



乱记(Luan-ji)极简版便签工具.png
乱记(Luan-ji)极简版便签工具.zip (3.82 KB, 下载次数: 125, 售价: 2 CB吾爱币)

🌟 软件简介

📝 乱记(Luan-ji)极简版便签工具

在忙碌的日常生活中,我们总是需要快速记录那些灵光一现的想法:💡会议要点、🚀待办事项、或是突如其来的灵感。市面上的笔记应用功能繁多,让人眼花缭乱。而乱记(Luan-ji)则以其极致的简洁设计,帮助你像捉蝴蝶一样轻松捕捉每一个想法,无需担心复杂的功能干扰你的思路。

乱记(Luan-ji) 是一款专为追求高效率的你打造的轻量级便签工具,它摒弃了一切不必要的复杂性,专注于提供最基础却最实用的功能——添加、编辑、删除和搜索便签。同时,它还引入了独特的标签系统,让你可以轻松管理和分类自己的笔记,让知识不再散落一地鸡毛。

无论你是🎓学生、💼上班族还是🏄自由职业者,“乱记(Luan-ji)”都能成为你不可或缺的小助手,助你在信息爆炸的时代保持头脑清晰,从容应对每一天的任务挑战。

🎯 核心痛点与解决方案

1. 信息过载

  • 核心功能:智能搜索 🔍
  • 说明:只需输入关键词,乱记(Luan-ji) 就能迅速帮你找到相关笔记,告别繁琐的翻页查找。

2. 管理混乱

  • 核心功能:标签系统 🏷️
  • 说明:通过自定义标签对笔记进行分类整理,每个标签代表一类主题或项目,让你能快速定位到特定的内容。

3. 操作繁琐

  • 核心功能:快捷键支持 ⌨️
  • 说明:使用键盘组合快捷键来执行常用操作,如添加新笔记(Ctrl+Enter)、打开搜索栏(Ctrl+F),极大提升工作效率。

4. 夜间模式疲劳

  • 核心功能:夜间模式切换 🌙
  • 说明:根据环境光线自动切换至夜间模式,减少屏幕蓝光对眼睛的刺激,保护视力的同时也能享受舒适的阅读体验。

5. 数据安全

  • 核心功能:本地存储 💾
  • 说明:所有数据均保存在本地浏览器中,无需联网即可访问,既保证了隐私安全,又避免了网络不稳定带来的困扰。

📚 使用说明书

添加便签

  • 点击页面下方的“添加便签”按钮 📎。
  • 在弹出的文本框中输入你的笔记内容。
  • 按下回车键 ⏎ 完成添加。

编辑便签

  • 双击已有的便签内容,进入编辑模式 ✍️。
  • 修改完成后按回车键确认更改。

删除便签

  • 点击便签右上角的“删除”按钮 🗑️。
  • 将不需要的笔记从列表中移除。

搜索便签

  • 在顶部的搜索栏中输入关键字 🔎。
  • 实时筛选出匹配的笔记项,方便查找重要信息。

创建标签

  • 在底部的标签管理区域输入标签名称。
  • 点击“创建标签”按钮 📌,为笔记添加分类标识。

希望这份简介和使用说明能让你的乱记(Luan-ji)体验更加愉快!如果你有任何建议或遇到问题,欢迎随时反馈 📢!

免费评分

参与人数 11吾爱币 +17 热心值 +10 收起 理由
gqdsc + 1 + 1 谢谢@Thanks!
PINGSHUN574 + 1 + 1 我很赞同!
moonalong8 + 1 + 1 谢谢@Thanks!
xiuyang6620 + 1 + 1 谢谢@Thanks!
lcg2014 + 1 + 1 非常好,麻烦给个安装说明
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
cux666 + 1 谢谢@Thanks!
jh95wxg + 2 + 1 谢谢@Thanks!
qqpoly + 1 我很赞同!
100511750 + 1 + 1 谢谢@Thanks!
xxxlsy + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| peter5258 发表于 2024-12-5 21:41
代码在这!
[HTML] 纯文本查看 复制代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>乱记(Luan-ji)</title>
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css">
    <style>
        body {
            font-family: 'Arial', sans-serif;
            background-color: #f4f4f9;
            color: #333;
            margin: 0;
            padding: 20px;
            transition: background-color 0.3s, color 0.3s;
        }
        .night-mode {
            background-color: #2c3e50;
            color: #ecf0f1;
        }
        .container {
            max-width: 800px;
            margin: auto;
        }
        [url=home.php?mod=space&uid=945662]@media[/url] (max-width: 768px) {
            .container {
                max-width: 100%;
                padding: 10px;
            }
        }
        @media (min-width: 1200px) {
            .container {
                padding: 40px;
            }
        }
        .header {
            display: flex;
            justify-content: space-between;
            align-items: center;
            margin-bottom: 20px;
        }
        h1 {
            font-size: 2.5em;
            font-weight: bold;
            color: #007bff;
        }
        .theme-toggle button {
            padding: 10px 20px;
            border: none;
            background-color: #99ccff;
            color: white;
            border-radius: 5px;
            cursor: pointer;
            transition: background-color 0.3s;
        }
        .theme-toggle button:hover {
            background-color: #007bff;
        }
        .search-bar {
            position: relative;
            margin-bottom: 20px;
        }
        .search-bar i {
            position: absolute;
            top: 50%;
            left: 15px;
            transform: translateY(-50%);
            color: #aaa;
        }
        .search-bar input {
            width: calc(100% - 50px);
            padding: 10px 40px 10px 40px;
            border: 1px solid #ccc;
            border-radius: 5px;
            outline: none;
            transition: border-color 0.5s;
        }
        .search-bar input:focus {
            border-color: #007bff;
            border-width: 2px;
        }
        .note-input textarea {
            width: 100%;
            height: 150px;
            padding: 10px;
            border: 1px solid #ccc;
            border-radius: 5px;
            resize: vertical;
            outline: none;
            transition: border-color 0.5s;
        }
        .note-input textarea::placeholder {
            opacity: 0.5;
            color: #999;
        }
        .note-input textarea:focus {
            border-color: #007bff;
            border-width: 2px;
        }
        .notes-container {
            margin-top: 20px;
        }
        .note {
            background-color: #ffffff;
            border: 1px solid #ddd;
            border-radius: 10px;
            padding: 15px;
            margin-bottom: 15px;
            position: relative;
            display: flex;
            align-items: flex-start;
            box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
            transition: box-shadow 0.3s;
        }
        .note:hover {
            box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
        }
        .note:nth-child(even) {
            background-color: #f2f2f2;
        }
        .note.locked::after {
            content: '&#128274;';
            position: absolute;
            right: 15px;
            top: 15px;
            color: red;
        }
        .note-tools {
            display: flex;
            align-items: center;
            margin-right: 15px;
        }
        .note-tools button {
            padding: 8px 15px;
            border: none;
            background-color: #007bff;
            color: white;
            border-radius: 5px;
            cursor: pointer;
            margin-left: 10px;
            transition: background-color 0.3s;
        }
        .note-tools button:hover {
            background-color: #0056b3;
        }
        .note-tools .copy-count {
            color: #555;
            text-align: right;
            margin-right: 15px;
        }
        .note-content {
            flex-grow: 1;
        }
        .tag-manager {
            margin-top: 20px;
            display: flex;
            flex-direction: column;
        }
        .tag-manager input {
            width: 100%;
            padding: 10px;
            border: 1px solid #ccc;
            border-radius: 5px;
            outline: none;
            transition: border-color 0.5s;
        }
        .tag-manager input:focus {
            border-color: #007bff;
            border-width: 2px;
        }
        .tag-manager button {
            padding: 10px 20px;
            border: none;
            background-color: #007bff;
            color: white;
            border-radius: 5px;
            cursor: pointer;
            margin-top: 10px;
            transition: background-color 0.3s;
        }
        .tag-manager button:hover {
            background-color: #0056b3;
        }
        .tags-container {
            margin-top: 20px;
            max-height: 200px;
            overflow-y: auto;
        }
        .tag-item {
            background-color: #e9ecef;
            border: 1px solid #ddd;
            border-radius: 10px;
            padding: 15px;
            margin-bottom: 15px;
            position: relative;
            display: flex;
            align-items: center;
            justify-content: space-between;
            box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
            transition: background-color 0.3s;
        }
        .tag-item:hover {
            background-color: #dcdcdc;
        }
        .tag-item button {
            padding: 8px 15px;
            border: none;
            background-color: #007bff;
            color: white;
            border-radius: 5px;
            cursor: pointer;
            margin-left: 5px;
            transition: background-color 0.3s;
        }
        .tag-item button:hover {
            background-color: #0056b3;
        }
        .tag-date {
            color: #555;
            font-size: 0.9em;
        }
        .toast {
            position: fixed;
            top: 20px;
            left: 50%;
            transform: translateX(-50%);
            background-color: #333;
            color: white;
            padding: 10px 20px;
            border-radius: 5px;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.5);
            z-index: 1000;
            opacity: 0;
            transition: opacity 0.3s ease-in-out, transform 0.3s ease-in-out;
        }
        .toast.show {
            opacity: 1;
            transform: translateX(-50%) translateY(20px);
        }
        .note-number {
            margin-right: 15px;
            font-weight: bold;
            color: #007bff;
        }
        .footer {
            margin-top: 40px;
            text-align: center;
            font-size: 0.9em;
            color: #777;
        }
        .footer a {
            color: #007bff;
            text-decoration: none;
            transition: color 0.3s;
        }
        .footer a:hover {
            color: #0056b3;
        }
        /* Prevent text selection */
        * {
            user-select: none; /* Standard syntax */
            -webkit-user-select: none; /* Safari */
            -moz-user-select: none; /* Firefox */
            -ms-user-select: none; /* Internet Explorer/Edge */
        }
    </style>
</head>
<body>
<div class="container">
    <div class="header">
        <h1>乱记(Luan-ji)</h1>
        <div class="theme-toggle">
            <button>夜间模式</button>
        </div>
    </div>
    <div class="search-bar">
        <i class="fas fa-search"></i>
        <input type="text" id="searchInput" placeholder="搜索便签...">
    </div>
    <div class="note-input">
        <textarea id="noteInput" placeholder="请在这里写下你的便签..."></textarea>
        <button>添加便签</button>
    </div>
    <div class="tag-manager">
        <input type="text" id="tagInput" placeholder="创建标签...">
        <button>创建标签</button>
    </div>
    <div class="tags-container" id="tagsContainer">
        <!-- Tags will be added here -->
    </div>
    <div class="notes-container" id="notesContainer">
        <!-- Notes will be added here -->
    </div>
    <div class="toast" id="toast"></div>
    <div class="footer">
        Designed by <a href="#" target="_blank">Nong Wenlong</a>
    </div>
</div>

<script>
    // Disable right-click context menu
    document.addEventListener('contextmenu', function(event) {
        event.preventDefault();
    });

    let notes = JSON.parse(localStorage.getItem('notes')) || [];
    let tags = JSON.parse(localStorage.getItem('tags')) || [];

    function saveData() {
        localStorage.setItem('notes', JSON.stringify(notes));
        localStorage.setItem('tags', JSON.stringify(tags));
    }

    function renderNotes() {
        const container = document.getElementById('notesContainer');
        container.innerHTML = '';
        const searchQuery = document.getElementById('searchInput').value.toLowerCase();
        const sortedNotes = [...notes].sort((a, b) => b.copyCount - a.copyCount);

        sortedNotes.forEach((note, index) => {
            if (note.content.toLowerCase().includes(searchQuery)) {
                const noteElement = document.createElement('div');
                noteElement.className = `note ${note.locked ? 'locked' : ''}`;
                noteElement.innerHTML = `
                    <div class="note-tools">
                        <span class="copy-count">复制次数: ${note.copyCount}</span>
                        <button>编辑</button>
                        <button>删除</button>
                        <button>${note.locked ? '解锁' : '锁定'}</button>
                        <button>一键复制</button>
                    </div>
                    <div class="note-content">
                        <p contenteditable="${note.editing}">${note.content}</p>
                    </div>
                `;
                // Add note number
                const noteNumber = document.createElement('div');
                noteNumber.className = 'note-number';
                noteNumber.textContent = `${index + 1}.`;
                noteElement.prepend(noteNumber);
                container.appendChild(noteElement);
            }
        });
    }

    function addNote() {
        const content = document.getElementById('noteInput').value.trim();
        if (content) {
            const newNote = {
                id: Date.now(),
                content,
                copyCount: 0,
                locked: false,
                editing: false,
                history: [content]
            };
            notes.push(newNote);
            document.getElementById('noteInput').value = '';
            saveData();
            renderNotes();
        }
    }

    function editNote(id) {
        const note = notes.find(note => note.id === id);
        if (note && !note.locked) {
            note.editing = true;
            saveData();
            renderNotes();
        }
    }

    function saveEdit(id, newContent) {
        const note = notes.find(note => note.id === id);
        if (note) {
            note.content = newContent;
            note.history.push(newContent);
            note.editing = false;
            saveData();
            renderNotes();
        }
    }

    function deleteNote(id) {
        const noteIndex = notes.findIndex(note => note.id === id);
        if (noteIndex !== -1 && !notes[noteIndex].locked) {
            notes.splice(noteIndex, 1);
            saveData();
            renderNotes();
        }
    }

    function lockNote(id) {
        const note = notes.find(note => note.id === id);
        if (note) {
            note.locked = !note.locked;
            saveData();
            renderNotes();
        }
    }

    function createTag() {
        const tagName = document.getElementById('tagInput').value.trim();
        if (tagName && !tags.some(tag => tag.name === tagName)) {
            const newTag = {
                id: Date.now(),
                name: tagName,
                createdAt: new Date().toLocaleString()
            };
            tags.push(newTag);
            document.getElementById('tagInput').value = '';
            saveData();
            renderTags();
        }
    }

    function editTag(id) {
        const tag = tags.find(tag => tag.id === id);
        if (tag) {
            document.getElementById('tagInput').value = tag.name;
            document.getElementById('tagInput').focus();
            // Remove the tag after editing
            tags = tags.filter(tag => tag.id !== id);
            saveData();
            renderTags();
        }
    }

    function renderTags() {
        const container = document.getElementById('tagsContainer');
        container.innerHTML = '';

        tags.forEach(tag => {
            const tagElement = document.createElement('div');
            tagElement.className = 'tag-item';
            tagElement.innerHTML = `
                <span>${tag.name}</span>
                <span class="tag-date">${tag.createdAt}</span>
                <button>复制</button>
                <button>编辑</button>
            `;
            container.appendChild(tagElement);
        });
    }

    function copyTag(tagName) {
        navigator.clipboard.writeText(tagName)
            .then(() => showTooltip(`标签 "${tagName}" 已复制到剪贴板`))
            .catch(err => console.error('无法复制文本: ', err));
    }

    function copyNoteContent(id) {
        const note = notes.find(note => note.id === id);
        if (note) {
            navigator.clipboard.writeText(note.content)
                .then(() => {
                    note.copyCount++;
                    saveData();
                    renderNotes();
                    showTooltip('便签内容已复制到剪贴板');
                })
                .catch(err => console.error('无法复制文本: ', err));
        }
    }

    function toggleNightMode() {
        document.body.classList.toggle('night-mode');
        updateToastStyle();
    }

    function updateToastStyle() {
        const toast = document.getElementById('toast');
        if (document.body.classList.contains('night-mode')) {
            toast.style.backgroundColor = '#ecf0f1';
            toast.style.color = '#2c3e50';
        } else {
            toast.style.backgroundColor = '#333';
            toast.style.color = 'white';
        }
    }

    function showTooltip(message) {
        const toast = document.getElementById('toast');
        toast.textContent = message;
        toast.classList.add('show');
        setTimeout(() => toast.classList.remove('show'), 2000);
    }

    document.getElementById('searchInput').addEventListener('input', renderNotes);

    window.onload = () => {
        renderNotes();
        renderTags();
        updateToastStyle();
    };

    // 快捷键支持
    document.addEventListener('keydown', (event) => {
        if (event.ctrlKey && event.key === 'Enter') {
            addNote();
        }
        if (event.ctrlKey && event.key === 'F') {
            document.getElementById('searchInput').focus();
        }
    });
</script>
</body>
</html>

xinanxiaodong 发表于 2025-1-4 12:27
我以为是个迷你的软件工具,原来是个html文件,这就要依托于浏览器了。。。话说,这个随手记的文本,存在哪里了?
开创者 发表于 2024-11-24 11:54
标签功能没有弄明白。只是一个标签并没有与便签联系在一起
nywthy 发表于 2024-11-24 12:43
不知怎么样?下来看看。
xiaoshan1818 发表于 2024-11-24 12:46
平时喜欢记录工作,这个不知道如何,基本分类有没有的,下来试试看
一场荒唐半生梦 发表于 2024-11-24 12:52
这是pc端还是?
nywthy 发表于 2024-11-24 12:53
占用空间较小,界面简洁,用于记录一些备忘的信息。
xiaomosen 发表于 2024-11-24 13:08
这个感觉可以啊
Johnnny 发表于 2024-11-24 13:20
下载试试
leechjia 发表于 2024-11-24 13:20
谢谢楼主分享。
jh95wxg 发表于 2024-11-24 13:33
用一下看看怎么样
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-1-6 03:13

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表