成品如下图:

目前这版只有简单的输入和删除功能,仅一张,适合展示使用,极其简洁 内置管理员登录与退出,可直接在线编辑

源代码:提供两个版本

1.仅自己可见版(储存在浏览器中)

默认账户密码都是admin(自行修改username === 'admin' && password === 'admin')

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>记事本</title>
    <style>
        body {
            margin: 20px auto;
            max-width: 800px;
            padding: 20px;
            font-family: Arial, sans-serif;
            line-height: 1.6;
        }

        #login-container {
            position: fixed;
            top: 20px;
            right: 20px;
            text-align: right;
        }

        #editor {
            min-height: 400px;
            padding: 20px;
            border: 1px solid #ddd;
            margin-top: 40px;
            outline: none;
        }

        .readonly {
            background: #f9f9f9;
            color: #666;
        }

        .login-form {
            display: none;
            background: white;
            padding: 10px;
            border: 1px solid #ddd;
            box-shadow: 0 2px 5px rgba(0,0,0,0.1);
        }

        button {
            padding: 5px 10px;
            background: #f0f0f0;
            border: 1px solid #ddd;
            cursor: pointer;
        }

        input {
            margin: 5px;
            padding: 5px;
            border: 1px solid #ddd;
        }
    </style>
</head>
<body>
    <div id="login-container">
        <button onclick="toggleLogin()" id="loginBtn">登录</button>
        <div class="login-form">
            <input type="text" id="username" placeholder="账号">
            <input type="password" id="password" placeholder="密码">
            <button onclick="login()">提交</button>
        </div>
    </div>

    <div id="editor" contenteditable="false"></div>

    <script>
        // 初始化检查登录状态
        window.onload = function() {
            const isLoggedIn = localStorage.getItem('isLoggedIn') === 'true';
            const savedContent = localStorage.getItem('notepadContent') || '';
            
            document.getElementById('editor').innerHTML = savedContent;
            updateEditorState(isLoggedIn);
        };

        // 切换登录表单显示
        function toggleLogin() {
            document.querySelector('.login-form').style.display = 
                document.querySelector('.login-form').style.display === 'block' ? 'none' : 'block';
        }

        // 登录功能
        function login() {
            const username = document.getElementById('username').value;
            const password = document.getElementById('password').value;

            if (username === 'admin' && password === 'admin') {
                localStorage.setItem('isLoggedIn', 'true');
                updateEditorState(true);
                toggleLogin();
            } else {
                alert('账号或密码错误');
            }
        }

        // 更新编辑器状态
        function updateEditorState(isEditable) {
            const editor = document.getElementById('editor');
            editor.contentEditable = isEditable;
            editor.classList.toggle('readonly', !isEditable);
            document.getElementById('loginBtn').innerHTML = isEditable ? '退出' : '登录';
            document.getElementById('loginBtn').onclick = isEditable ? logout : toggleLogin;
        }

        // 退出登录
        function logout() {
            localStorage.removeItem('isLoggedIn');
            updateEditorState(false);
        }

        // 自动保存内容
        document.getElementById('editor').addEventListener('input', function() {
            localStorage.setItem('notepadContent', this.innerHTML);
        });
    </script>
</body>
</html>

2.可供其他设备查看版

默认账户密码都是admin(自行修改login.php中的$valid_credentials)

前端:index.html

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>记事本</title>
    <style>
        body {
            margin: 20px auto;
            max-width: 800px;
            padding: 20px;
            font-family: Arial, sans-serif;
            line-height: 1.6;
        }

        #login-container {
            position: fixed;
            top: 20px;
            right: 20px;
            text-align: right;
        }

        #editor {
            min-height: 400px;
            padding: 20px;
            border: 1px solid #ddd;
            margin-top: 40px;
            outline: none;
        }

        .readonly {
            background: #f9f9f9;
            color: #666;
        }

        .login-form {
            display: none;
            background: white;
            padding: 10px;
            border: 1px solid #ddd;
            box-shadow: 0 2px 5px rgba(0,0,0,0.1);
        }

        button {
            padding: 5px 10px;
            background: #f0f0f0;
            border: 1px solid #ddd;
            cursor: pointer;
        }

        input {
            margin: 5px;
            padding: 5px;
            border: 1px solid #ddd;
        }
    </style>
</head>
<body>
    <div id="login-container">
        <button onclick="toggleLogin()" id="loginBtn">登录</button>
        <div class="login-form">
            <input type="text" id="username" placeholder="账号">
            <input type="password" id="password" placeholder="密码">
            <button onclick="login()">提交</button>
        </div>
    </div>

    <div id="editor" contenteditable="false"></div>

    <script>
        // 服务器接口配置
        const API = {
            getContent: 'get_content.php',
            saveContent: 'save_content.php',
            login: 'login.php'
        }

        // 初始化加载内容
        window.onload = async function() {
            const response = await fetch(API.getContent);
            const data = await response.json();
            document.getElementById('editor').innerHTML = data.content || '';
            checkLoginStatus();
        }

        // 检查登录状态
        async function checkLoginStatus() {
            const response = await fetch(API.login);
            const data = await response.json();
            updateEditorState(data.loggedIn);
        }

        // 切换登录表单
        function toggleLogin() {
            document.querySelector('.login-form').style.display = 
                document.querySelector('.login-form').style.display === 'block' ? 'none' : 'block';
        }

        // 登录功能
        async function login() {
            const formData = new FormData();
            formData.append('username', document.getElementById('username').value);
            formData.append('password', document.getElementById('password').value);

            const response = await fetch(API.login, {
                method: 'POST',
                body: formData
            });

            const result = await response.json();
            if (result.success) {
                updateEditorState(true);
                toggleLogin();
            } else {
                alert('登录失败');
            }
        }

        // 更新编辑器状态
        function updateEditorState(isEditable) {
            const editor = document.getElementById('editor');
            editor.contentEditable = isEditable;
            editor.classList.toggle('readonly', !isEditable);
            document.getElementById('loginBtn').innerHTML = isEditable ? '退出' : '登录';
            document.getElementById('loginBtn').onclick = isEditable ? logout : toggleLogin;
        }

        // 退出登录
        async function logout() {
            await fetch(API.login + '?action=logout');
            updateEditorState(false);
        }

        // 保存内容到服务器
        let saveTimer;
        document.getElementById('editor').addEventListener('input', function() {
            clearTimeout(saveTimer);
            saveTimer = setTimeout(async () => {
                const content = this.innerHTML;
                await fetch(API.saveContent, {
                    method: 'POST',
                    body: JSON.stringify({ content }),
                    headers: {
                        'Content-Type': 'application/json'
                    }
                });
            }, 1000);
        });
    </script>
</body>
</html>

后端(文件须同名):login.php

<?php
session_start();

// 简单账号验证
$valid_credentials = ['admin' => 'admin'];

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $username = $_POST['username'] ?? '';
    $password = $_POST['password'] ?? '';
    
    if (isset($valid_credentials[$username]) && $valid_credentials[$username] === $password) {
        $_SESSION['logged_in'] = true;
        echo json_encode(['success' => true]);
    } else {
        echo json_encode(['success' => false]);
    }
    exit;
}

// 登出处理
if (isset($_GET['action']) && $_GET['action'] === 'logout') {
    session_destroy();
    echo json_encode(['loggedIn' => false]);
    exit;
}

// 检查登录状态
echo json_encode(['loggedIn' => isset($_SESSION['logged_in']) && $_SESSION['logged_in']]);
?>

save_content.php

<?php
session_start();

if (!isset($_SESSION['logged_in']) || !$_SESSION['logged_in']) {
    http_response_code(403);
    exit;
}

$data = json_decode(file_get_contents('php://input'), true);
$content = $data['content'] ?? '';

// 保存到文本文件
file_put_contents('saved_content.txt', $content);
echo json_encode(['success' => true]);
?>

get_content.php

<?php
// 读取保存的内容
$content = @file_get_contents('saved_content.txt') ?: '';
echo json_encode(['content' => $content]);
?>