轻量化md笔记

0# 创建 Markdown 笔记系统首页

我将为您创建一个轻量级的 Markdown 笔记系统首页,支持增删改查功能。

“`html:cursor/markdown-note/index.html





Markdown 笔记系统


Markdown 笔记系统

    <div class="row">
        <!-- 左侧笔记列表 -->
        <div class="col-md-3">
            <div class="d-flex justify-content-between align-items-center mb-3">
                <h4>笔记列表</h4>
                <button id="newNoteBtn" class="btn btn-primary btn-sm">新建笔记</button>
            </div>
            <div class="note-list" id="noteList">
                <!-- 笔记列表将通过 JavaScript 动态生成 -->
            </div>
        </div>

        <!-- 右侧编辑区 -->
        <div class="col-md-9">
            <div id="welcomeMessage">
                <h3 class="text-center mt-5">欢迎使用 Markdown 笔记系统</h3>
                <p class="text-center">请从左侧选择一个笔记进行编辑,或创建一个新笔记</p>
            </div>

            <div id="editorArea" class="editor-container">
                <div class="btn-toolbar">
                    <div class="input-group mb-3">
                        <span class="input-group-text">标题</span>
                        <input type="text" id="noteTitle" class="form-control" placeholder="输入笔记标题">
                    </div>
                    <div class="btn-group ms-auto">
                        <button id="saveNoteBtn" class="btn btn-success">保存</button>
                        <button id="deleteNoteBtn" class="btn btn-danger">删除</button>
                    </div>
                </div>

                <textarea id="editor"></textarea>

                <div class="preview-container mt-3" id="previewContainer">
                    <h4>预览</h4>
                    <div id="preview"></div>
                </div>
            </div>
        </div>
    </div>
</div>

<!-- 引入必要的 JavaScript 库 -->
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/easymde/dist/easymde.min.js"></script>
<script>
    // 初始化变量
    let notes = [];
    let currentNoteId = null;
    let editor = null;

    // DOM 元素
    const noteList = document.getElementById('noteList');
    const editorArea = document.getElementById('editorArea');
    const welcomeMessage = document.getElementById('welcomeMessage');
    const noteTitle = document.getElementById('noteTitle');
    const preview = document.getElementById('preview');
    const newNoteBtn = document.getElementById('newNoteBtn');
    const saveNoteBtn = document.getElementById('saveNoteBtn');
    const deleteNoteBtn = document.getElementById('deleteNoteBtn');

    // 初始化编辑器
    function initEditor() {
        editor = new EasyMDE({
            element: document.getElementById('editor'),
            spellChecker: false,
            autofocus: true,
            placeholder: '在此输入 Markdown 内容...',
            status: ['lines', 'words'],
            renderingConfig: {
                codeSyntaxHighlighting: true,
            },
            toolbar: [
                'bold', 'italic', 'heading', '|',
                'quote', 'unordered-list', 'ordered-list', '|',
                'link', 'image', 'table', '|',
                'preview', 'side-by-side', 'fullscreen'
            ],
            previewRender: function(plainText) {
                const result = marked.parse(plainText);
                preview.innerHTML = result;
                return result;
            }
        });

        // 监听编辑器内容变化,更新预览
        editor.codemirror.on("change", () => {
            preview.innerHTML = marked.parse(editor.value());
        });
    }

    // 加载笔记列表
    function loadNotes() {
        const savedNotes = localStorage.getItem('markdown-notes');
        if (savedNotes) {
            notes = JSON.parse(savedNotes);
            renderNoteList();
        } else {
            // 如果没有保存的笔记,创建一些示例笔记
            notes = [
                { id: 1, title: '欢迎使用', content: '# 欢迎使用 Markdown 笔记系统\n\n这是一个简单的 Markdown 笔记应用,您可以:\n\n- 创建新笔记\n- 编辑现有笔记\n- 删除笔记\n- 使用 Markdown 格式化您的内容\n\n开始使用吧!', createdAt: new Date().toISOString() },
                { id: 2, title: 'Markdown 语法示例', content: '# Markdown 语法示例\n\n## 标题\n\n# 一级标题\n## 二级标题\n### 三级标题\n\n## 格式化\n\n**粗体** 或 __粗体__\n\n*斜体* 或 _斜体_\n\n~~删除线~~\n\n## 列表\n\n- 无序列表项\n- 另一个项目\n  - 子项目\n\n1. 有序列表\n2. 第二项\n\n## 链接和图片\n\n[链接文本](https://example.com)\n\n![图片描述](https://example.com/image.jpg)\n\n## 代码\n\n行内代码 `const example = "hello";`\n\n```javascript\n// 代码块\nfunction hello() {\n  console.log("Hello, world!");\n}\n```\n\n## 表格\n\n| 表头 1 | 表头 2 |\n|--------|--------|\n| 单元格 1 | 单元格 2 |\n| 单元格 3 | 单元格 4 |', createdAt: new Date().toISOString() }
            ];
            saveNotes();
            renderNoteList();
        }
    }

    // 渲染笔记列表
    function renderNoteList() {
        noteList.innerHTML = '';

        // 按创建时间排序,最新的在前面
        const sortedNotes = [...notes].sort((a, b) => 
            new Date(b.createdAt) - new Date(a.createdAt)
        );

        sortedNotes.forEach(note => {
            const noteItem = document.createElement('div');
            noteItem.className = 'note-item';
            if (note.id === currentNoteId) {
                noteItem.classList.add('active');
            }
            noteItem.innerHTML = `
                <div class="d-flex justify-content-between">
                    <strong>{note.title}</strong>
                    <small>{formatDate(note.createdAt)}</small>
                </div>
                <div class="text-muted small">${truncateText(note.content, 50)}</div>
            `;
            noteItem.addEventListener('click', () => openNote(note.id));
            noteList.appendChild(noteItem);
        });
    }

    // 打开笔记
    function openNote(id) {
        const note = notes.find(n => n.id === id);
        if (note) {
            currentNoteId = id;
            noteTitle.value = note.title;

            // 显示编辑区域,隐藏欢迎信息
            welcomeMessage.style.display = 'none';
            editorArea.style.display = 'block';

            // 如果编辑器尚未初始化,则初始化它
            if (!editor) {
                initEditor();
            }

            // 设置编辑器内容
            editor.value(note.content);

            // 更新预览
            preview.innerHTML = marked.parse(note.content);

            // 更新笔记列表中的活动项
            renderNoteList();
        }
    }

    // 创建新笔记
    function createNewNote() {
        const newId = notes.length > 0 ? Math.max(...notes.map(n => n.id)) + 1 : 1;
        const newNote = {
            id: newId,
            title: '新笔记',
            content: '# 新笔记\n\n在这里开始编写...',
            createdAt: new Date().toISOString()
        };

        notes.push(newNote);
        saveNotes();
        openNote(newId);
    }

    // 保存笔记
    function saveNote() {
        if (currentNoteId) {
            const noteIndex = notes.findIndex(n => n.id === currentNoteId);
            if (noteIndex !== -1) {
                notes[noteIndex].title = noteTitle.value || '无标题';
                notes[noteIndex].content = editor.value();
                notes[noteIndex].updatedAt = new Date().toISOString();

                saveNotes();
                renderNoteList();

                // 显示保存成功提示
                alert('笔记已保存');
            }
        }
    }

    // 删除笔记
    function deleteNote() {
        if (currentNoteId && confirm('确定要删除这个笔记吗?此操作不可撤销。')) {
            notes = notes.filter(n => n.id !== currentNoteId);
            saveNotes();

            // 重置当前状态
            currentNoteId = null;
            editorArea.style.display = 'none';
            welcomeMessage.style.display = 'block';

            renderNoteList();
        }
    }

    // 保存笔记到 localStorage
    function saveNotes() {
        localStorage.setItem('markdown-notes', JSON.stringify(notes));
    }

    // 辅助函数:格式化日期
    function formatDate(dateString) {
        const date = new Date(dateString);
        return date.toLocaleDateString();
    }

    // 辅助函数:截断文本
    function truncateText(text, maxLength) {
        // 移除 Markdown 标记
        const plainText = text.replace(/[#*_~`\[\]]/g, '');
        if (plainText.length <= maxLength) return plainText;
        return plainText.substring(0, maxLength) + '...';
    }

    // 事件监听
    newNoteBtn.addEventListener('click', createNewNote);
    saveNoteBtn.addEventListener('click', saveNote);
    deleteNoteBtn.addEventListener('click', deleteNote);

    // 初始化应用
    document.addEventListener('DOMContentLoaded', () => {
        loadNotes();
    });
</script>


“`

这个 Markdown 笔记系统具有以下功能:

  1. 增加功能:用户可以点击”新建笔记”按钮创建新的笔记。

  2. 删除功能:打开笔记后,可以点击”删除”按钮删除当前笔记。

  3. 修改功能:用户可以编辑笔记标题和内容,然后点击”保存”按钮保存更改。

  4. 查询功能:左侧显示所有笔记的列表,点击任意笔记可以查看和编辑。

  5. 其他特性

    • 使用 EasyMDE 作为 Markdown 编辑器,提供丰富的编辑工具
    • 实时预览 Markdown 渲染效果
    • 数据保存在浏览器的 localStorage 中
    • 响应式设计,适配不同屏幕尺寸
    • 初次使用时提供示例笔记,包含 Markdown 语法指南

您可以直接使用这个 HTML 文件,无需额外的后端支持,所有数据都存储在浏览器本地。如果需要更多功能,如数据导出/导入、标签分类等,可以进一步扩展。