百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

卡片项目管理(Web)(卡片设计的流程)

zhezhongyun 2025-07-06 18:04 3 浏览

简洁的HTML文档卡片管理,简单框架个人本地离线使用。
将个人工具类的文档整理使用。


优化方向:添加图片、瀑布式布局、颜色修改、毛玻璃效果等。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>卡片项目管理</title>
    <style>
        /* CSS变量定义 */
        :root {
            /* 浅色主题变量 */
            --system-blue: #007AFF;
            --system-gray-1: #F6F6F6;
            --system-gray-2: #E5E5EA;
            --system-gray-3: #D1D1D6;
            --system-gray-4: #8E8E93;
            --system-gray-5: #333333;
            --system-red: #FF3B30;
            --system-white: #FFFFFF;
            --system-background: #FFFFFF;
            --system-card-bg: rgba(255, 255, 255, 0.85);
            --system-text-primary: #000000;
            --system-text-secondary: #8E8E93;
            --system-shadow: rgba(0, 0, 0, 0.1);
            --system-border: rgba(0, 0, 0, 0.1);
            --system-glass: rgba(255, 255, 255, 0.8);
            --system-tint: rgba(0, 122, 255, 0.1);
            --running-border: #007AFF;
        }

        /* 深色主题变量 */
        .dark-theme {
            --system-blue: #0A84FF;
            --system-gray-1: #1C1C1E;
            --system-gray-2: #2C2C2E;
            --system-gray-3: #3A3A3C;
            --system-gray-4: #8E8E93;
            --system-gray-5: #F2F2F7;
            --system-white: #000000;
            --system-background: #000000;
            --system-card-bg: rgba(28, 28, 30, 0.85);
            --system-text-primary: #F2F2F7;
            --system-text-secondary: #8E8E93;
            --system-shadow: rgba(0, 0, 0, 0.3);
            --system-border: rgba(255, 255, 255, 0.1);
            --system-glass: rgba(28, 28, 30, 0.8);
            --system-tint: rgba(10, 132, 255, 0.2);
            --running-border: #0A84FF;
        }

        /* 基础样式重置 */
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
            -webkit-tap-highlight-color: transparent;
            transition: background-color 0.3s, color 0.3s, transform 0.2s, border 0.3s;
        }

        body {
            font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
            background: var(--system-background);
            color: var(--system-text-primary);
            line-height: 1.5;
            min-height: 100vh;
            padding-top: 44px; /* 导航栏44px */
        }

        /* iOS导航栏样式 */
        .nav-bar {
            position: fixed;
            top: 0;
            left: 0;
            width: 100%;
            height: 44px;
            padding: 0 16px;
            display: flex;
            justify-content: space-between;
            align-items: center;
            background: var(--system-glass);
            backdrop-filter: blur(20px);
            -webkit-backdrop-filter: blur(20px);
            z-index: 1000;
            border-bottom: 0.5px solid var(--system-border);
        }

        .nav-title {
            font-size: 17px;
            font-weight: 600;
            position: absolute;
            left: 50%;
            transform: translateX(-50%);
        }

        .nav-btn {
            width: 44px;
            height: 44px;
            display: flex;
            align-items: center;
            justify-content: center;
            background: none;
            border: none;
            color: var(--system-blue);
            font-size: 16px;
            cursor: pointer;
            z-index: 1;
        }

        .nav-btn.add-btn {
            font-weight: bold;
            font-size: 24px;
            margin-right: -8px;
        }

        /* 内容区域样式 */
        .container {
            max-width: 800px;
            margin: 0 auto;
            padding: 20px;
        }

        .section-title {
            font-size: 34px;
            font-weight: 700;
            line-height: 1.2;
            margin-bottom: 20px;
        }

        /* 卡片网格布局 */
        .card-grid {
            display: grid;
            grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
            gap: 16px;
            margin-top: 20px;
        }

        /* iOS卡片样式 */
        .card {
            background: var(--system-card-bg);
            border-radius: 12px;
            overflow: hidden;
            box-shadow: 0 4px 12px var(--system-shadow);
            transition: transform 0.3s ease, box-shadow 0.3s ease;
            backdrop-filter: blur(12px);
            -webkit-backdrop-filter: blur(12px);
            border: 0.5px solid var(--system-border);
        }
        
        .card.running {
            border: 2px solid var(--running-border);
            box-shadow: 0 0 0 2px var(--system-tint), 0 4px 12px var(--system-shadow);
        }

        .card:hover {
            transform: translateY(-4px);
            box-shadow: 0 6px 20px var(--system-shadow);
        }

        .card-header {
            padding: 16px;
            border-bottom: 0.5px solid var(--system-border);
            display: flex;
            align-items: center;
            gap: 12px;
        }

        .card-icon {
            width: 40px;
            height: 40px;
            background: linear-gradient(135deg, var(--system-blue), #5e5ce6);
            border-radius: 10px;
            display: flex;
            align-items: center;
            justify-content: center;
            color: white;
            font-weight: bold;
            font-size: 18px;
        }

        .card-title {
            font-size: 17px;
            font-weight: 600;
            color: var(--system-text-primary);
            white-space: nowrap;
            overflow: hidden;
            text-overflow: ellipsis;
        }

        .card-content {
            padding: 16px;
            height: 120px;
            overflow: hidden;
            position: relative;
        }

        .card-content::after {
            content: '';
            position: absolute;
            bottom: 0;
            left: 0;
            right: 0;
            height: 30px;
            background: linear-gradient(to top, var(--system-card-bg), transparent);
        }

        .card-content pre {
            font-family: 'SF Mono', Menlo, monospace;
            font-size: 13px;
            margin: 0;
            white-space: pre-wrap;
            word-break: break-word;
            color: var(--system-text-secondary);
            opacity: 0.9;
            max-height: 100%;
            overflow: hidden;
        }

        .card-footer {
            padding: 12px 16px;
            display: flex;
            justify-content: space-between;
            border-top: 0.5px solid var(--system-border);
        }

        .card-date {
            font-size: 13px;
            color: var(--system-text-secondary);
        }

        .card-actions {
            display: flex;
            gap: 8px;
        }

        .card-btn {
            padding: 6px 12px;
            font-size: 14px;
            border-radius: 8px;
            background: var(--system-tint);
            color: var(--system-blue);
            border: none;
            cursor: pointer;
            font-weight: 500;
        }

        .card-btn:hover {
            background: var(--system-blue);
            color: white;
        }
        
        .delete-btn {
            background: rgba(255, 59, 48, 0.1);
            color: var(--system-red);
        }
        
        .delete-btn:hover {
            background: var(--system-red);
            color: white;
        }

        /* 空状态样式 */
        .empty-state {
            text-align: center;
            padding: 60px 20px;
            opacity: 0.6;
            grid-column: 1 / -1;
        }

        .empty-state i {
            font-size: 48px;
            margin-bottom: 16px;
            opacity: 0.5;
            color: var(--system-text-secondary);
        }

        .empty-state p {
            font-size: 17px;
            max-width: 500px;
            margin: 0 auto;
            color: var(--system-text-secondary);
        }

        /* Safari浏览器模拟窗口 */
        .safari-modal {
            position: fixed;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            background: rgba(0, 0, 0, 0.95);
            z-index: 2000;
            display: flex;
            flex-direction: column;
            opacity: 0;
            visibility: hidden;
            transition: opacity 0.3s, visibility 0.3s;
        }

        .safari-modal.active {
            opacity: 1;
            visibility: visible;
        }

        .safari-header {
            height: 44px;
            background: rgba(30, 30, 30, 0.9);
            padding: 16px;
            display: flex;
            flex-direction: column;
            gap: 12px;
            backdrop-filter: blur(20px);
            -webkit-backdrop-filter: blur(20px);
            border-bottom: 0.5px solid rgba(255, 255, 255, 0.1);
        }

        .safari-controls {
            display: flex;
            gap: 10px;
            align-items: center;
        }

        .control-btn {
            width: 14px;
            height: 14px;
            border-radius: 50%;
            cursor: pointer;
            display: flex;
            align-items: center;
            justify-content: center;
            font-size: 10px;
            color: rgba(0, 0, 0, 0.7);
            font-weight: bold;
        }

        .close-btn {
            background: #ff5f57;
        }

        .minimize-btn {
            background: #ffbd2e;
        }

        .edit-code-btn {
            background: #28c940;
        }

        .safari-url-bar {
            background: rgba(40, 40, 40, 0.6);
            padding: 8px 15px;
            border-radius: 8px;
            font-size: 14px;
            color: rgba(255, 255, 255, 0.8);
            display: flex;
            align-items: center;
            gap: 10px;
            overflow: hidden;
            text-overflow: ellipsis;
            white-space: nowrap;
        }

        .safari-url-bar::before {
            content: '';
            font-size: 16px;
        }

        .safari-content {
            flex: 1;
            padding: 20px;
            display: flex;
            justify-content: center;
            align-items: center;
        }

        .safari-iframe {
            width: 100%;
            height: 100%;
            border: none;
            border-radius: 12px;
            background: white;
            box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);
        }

        /* 编辑模态框 */
        .modal {
            position: fixed;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            background: rgba(0, 0, 0, 0.7);
            display: flex;
            align-items: center;
            justify-content: center;
            z-index: 1000;
            opacity: 0;
            visibility: hidden;
            transition: opacity 0.3s, visibility 0.3s;
            backdrop-filter: blur(5px);
        }

        .modal.active {
            opacity: 1;
            visibility: visible;
        }

        .modal-content {
            background: var(--system-card-bg);
            border-radius: 14px;
            width: 90%;
            max-width: 500px;
            max-height: 90vh;
            overflow: hidden;
            box-shadow: 0 25px 50px rgba(0, 0, 0, 0.25);
            transform: translateY(20px);
            transition: transform 0.4s;
            border: 0.5px solid var(--system-border);
        }

        .modal.active .modal-content {
            transform: translateY(0);
        }

        .modal-header {
            padding: 16px;
            border-bottom: 0.5px solid var(--system-border);
            display: flex;
            justify-content: space-between;
            align-items: center;
        }

        .modal-title {
            font-size: 17px;
            font-weight: 600;
        }

        .modal-close {
            background: none;
            border: none;
            font-size: 20px;
            cursor: pointer;
            color: var(--system-blue);
            width: 36px;
            height: 36px;
            display: flex;
            align-items: center;
            justify-content: center;
            border-radius: 50%;
        }

        .modal-close:hover {
            background: var(--system-tint);
        }

        .modal-body {
            padding: 16px;
        }

        .form-group {
            margin-bottom: 20px;
        }

        label {
            display: block;
            margin-bottom: 8px;
            font-weight: 500;
            font-size: 14px;
            color: var(--system-text-secondary);
        }

        input, textarea {
            width: 100%;
            padding: 12px 15px;
            border-radius: 10px;
            border: 0.5px solid var(--system-border);
            background: var(--system-card-bg);
            color: var(--system-text-primary);
            font-family: inherit;
            font-size: 17px;
        }

        textarea {
            min-height: 200px;
            resize: vertical;
            font-family: 'SF Mono', Menlo, monospace;
            background: rgba(0, 0, 0, 0.05);
            padding: 15px;
        }

        .dark-theme textarea {
            background: rgba(255, 255, 255, 0.05);
        }

        .modal-footer {
            padding: 16px;
            display: flex;
            justify-content: flex-end;
            gap: 10px;
            border-top: 0.5px solid var(--system-border);
        }

        .primary-btn {
            padding: 10px 24px;
            background: var(--system-blue);
            color: white;
            border: none;
            border-radius: 10px;
            font-size: 17px;
            font-weight: 500;
            cursor: pointer;
        }

        .secondary-btn {
            padding: 10px 24px;
            background: var(--system-gray-2);
            color: var(--system-text-primary);
            border: none;
            border-radius: 10px;
            font-size: 17px;
            font-weight: 500;
            cursor: pointer;
        }
        
        .import-btn {
            width: 100%;
            padding: 12px;
            background: var(--system-tint);
            color: var(--system-blue);
            border: none;
            border-radius: 10px;
            font-size: 16px;
            font-weight: 500;
            cursor: pointer;
            text-align: center;
            margin-bottom: 15px;
        }
        
        .import-btn:hover {
            background: var(--system-blue);
            color: white;
        }

        /* 最小化窗口 */
        .minimized-window {
            position: fixed;
            bottom: 20px;
            right: 20px;
            width: 50px;
            height: 50px;
            background: #ffbd2e;
            border-radius: 50%;
            display: flex;
            align-items: center;
            justify-content: center;
            color: black;
            font-weight: bold;
            cursor: pointer;
            box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);
            z-index: 999;
            opacity: 0;
            transform: translateY(20px);
            transition: opacity 0.3s, transform 0.3s;
        }

        .minimized-window.active {
            opacity: 1;
            transform: translateY(0);
        }

        /* 响应式调整 */
        @media (max-width: 768px) {
            .card-grid {
                grid-template-columns: 1fr;
            }
            
            .section-title {
                font-size: 28px;
            }
            
            .container {
                padding: 16px;
            }
        }

        @media (max-width: 480px) {
            .nav-bar {
                padding: 0 8px;
            }
            
            .section-title {
                font-size: 24px;
            }
        }
    </style>
</head>
<body>
    <!-- iOS导航栏 -->
    <div class="nav-bar">
        <button class="nav-btn theme-toggle-btn">←</button>
        <div class="nav-title">我的项目</div>
        <button class="nav-btn add-btn">+</button>
    </div>
    
    <!-- 内容区域 -->
    <div class="container">
        <h1 class="section-title">项目卡片库</h1>
        
        <div class="card-grid" id="projects-container">
            <!-- 项目卡片将通过JS动态生成 -->
            <div class="empty-state">
                <div></div>
                <p>暂无项目,点击右上角"+"按钮添加新项目</p>
            </div>
        </div>
    </div>
    
    <!-- 添加/编辑项目模态框 -->
    <div class="modal" id="edit-modal">
        <div class="modal-content">
            <div class="modal-header">
                <h2 class="modal-title">添加新项目</h2>
                <button class="modal-close">×</button>
            </div>
            <div class="modal-body">
                <div class="form-group">
                    <label for="project-title">项目名称</label>
                    <input type="text" id="project-title" placeholder="输入项目名称">
                </div>
                <div class="form-group">
                    <label for="project-code">HTML代码</label>
                    <textarea id="project-code" placeholder="粘贴您的HTML代码..."></textarea>
                </div>
                <button class="import-btn" id="import-file">
                    <span> 导入本地HTML文件</span>
                    <input type="file" id="file-input" accept=".html,.htm" style="display:none">
                </button>
            </div>
            <div class="modal-footer">
                <button class="secondary-btn" id="cancel-edit">取消</button>
                <button class="primary-btn" id="save-project">保存</button>
            </div>
        </div>
    </div>
    
    <!-- Safari浏览器模拟窗口 -->
    <div class="safari-modal" id="safari-modal">
        <div class="safari-header">
            <div class="safari-controls">
                <div class="control-btn close-btn" id="safari-close">×</div>
                <div class="control-btn minimize-btn" id="safari-minimize">-</div>
                <div class="control-btn edit-code-btn" id="safari-edit">+</div>
            </div>
            <div class="safari-url-bar" id="safari-url">localhost/project.html</div>
        </div>
        <div class="safari-content">
            <iframe class="safari-iframe" id="safari-iframe"></iframe>
        </div>
    </div>
    
    <!-- 最小化窗口 -->
    <div class="minimized-window" id="minimized-window">↗</div>

    <script>
        // DOM元素
        const projectsContainer = document.getElementById('projects-container');
        const editModal = document.getElementById('edit-modal');
        const safariModal = document.getElementById('safari-modal');
        const themeToggleBtn = document.querySelector('.theme-toggle-btn');
        const addBtn = document.querySelector('.add-btn');
        const minimizedWindow = document.getElementById('minimized-window');
        const fileInput = document.getElementById('file-input');
        const importBtn = document.getElementById('import-file');
        
        // 状态变量
        let currentEditIndex = -1;
        let currentRunningProject = null;
        let minimizedProject = null;
        let cards = []; // 存储卡片DOM元素

        // 初始化
        document.addEventListener('DOMContentLoaded', () => {
            // 加载主题设置
            loadTheme();
            
            // 加载存储的项目
            loadProjects();
            
            // 事件监听
            addBtn.addEventListener('click', () => {
                currentEditIndex = -1;
                document.getElementById('project-title').value = '';
                document.getElementById('project-code').value = '';
                document.querySelector('#edit-modal .modal-title').textContent = '添加新项目';
                openModal(editModal);
            });
            
            themeToggleBtn.addEventListener('click', toggleTheme);
            
            document.querySelector('.modal-close').addEventListener('click', () => {
                closeModal(editModal);
            });
            
            document.getElementById('cancel-edit').addEventListener('click', () => {
                closeModal(editModal);
            });
            
            document.getElementById('save-project').addEventListener('click', saveProject);
            
            // 文件导入处理
            importBtn.addEventListener('click', () => {
                fileInput.click();
            });
            
            fileInput.addEventListener('change', handleFileImport);
            
            // Safari 控制按钮
            document.getElementById('safari-close').addEventListener('click', () => {
                safariModal.classList.remove('active');
                document.getElementById('safari-iframe').src = '';
                removeRunningHighlight();
                currentRunningProject = null;
            });
            
            document.getElementById('safari-minimize').addEventListener('click', () => {
                safariModal.classList.remove('active');
                minimizedWindow.classList.add('active');
                minimizedProject = currentRunningProject;
            });
            
            document.getElementById('safari-edit').addEventListener('click', () => {
                if (currentRunningProject !== null) {
                    editProject(currentRunningProject.index);
                }
            });
            
            minimizedWindow.addEventListener('click', () => {
                minimizedWindow.classList.remove('active');
                safariModal.classList.add('active');
                minimizedProject = null;
            });
        });
        
        // 主题功能
        function toggleTheme() {
            document.body.classList.toggle('dark-theme');
            const isDarkMode = document.body.classList.contains('dark-theme');
            localStorage.setItem('theme', isDarkMode ? 'dark' : 'light');
            
            // 更新运行边框颜色
            if (currentRunningProject) {
                highlightRunningCard(currentRunningProject.index);
            }
        }
        
        function loadTheme() {
            const savedTheme = localStorage.getItem('theme') || 'light';
            if (savedTheme === 'dark') {
                document.body.classList.add('dark-theme');
            }
        }
        
        // 项目管理功能
        function loadProjects() {
            const projects = JSON.parse(localStorage.getItem('projects') || '[]');
            
            if (projects.length === 0) {
                projectsContainer.innerHTML = `
                    <div class="empty-state">
                        <div></div>
                        <p>暂无项目,点击右上角"+"按钮添加新项目</p>
                    </div>
                `;
                return;
            }
            
            projectsContainer.innerHTML = '';
            cards = [];
            
            projects.forEach((project, index) => {
                const card = createProjectCard(project, index);
                projectsContainer.appendChild(card);
                cards.push(card);
            });
        }
        
        function createProjectCard(project, index) {
            const card = document.createElement('div');
            card.className = 'card';
            card.dataset.index = index;
            card.innerHTML = `
                <div class="card-header">
                    <div class="card-icon">${project.title.charAt(0).toUpperCase()}</div>
                    <h3 class="card-title">${project.title}</h3>
                </div>
                <div class="card-content">
                    <pre>${escapeHtml(project.code.substring(0, 500))}${project.code.length > 500 ? '...' : ''}</pre>
                </div>
                <div class="card-footer">
                    <div class="card-date">${formatDate(project.date)}</div>
                    <div class="card-actions">
                        <button class="card-btn run-btn">运行</button>
                        <button class="card-btn edit-btn">编辑</button>
                        <button class="card-btn delete-btn">删除</button>
                    </div>
                </div>
            `;
            
            card.querySelector('.run-btn').addEventListener('click', () => {
                runProject(project.code, project.title, index);
            });
            
            card.querySelector('.edit-btn').addEventListener('click', () => {
                editProject(index);
            });
            
            card.querySelector('.delete-btn').addEventListener('click', () => {
                deleteProject(index);
            });
            
            return card;
        }
        
        function runProject(code, title, index) {
            // 移除之前的高亮
            removeRunningHighlight();
            
            // 设置当前运行项目
            currentRunningProject = { code, title, index };
            
            // 高亮显示当前卡片
            highlightRunningCard(index);
            
            // 更新运行窗口
            const blob = new Blob([code], {type: 'text/html'});
            const iframe = document.getElementById('safari-iframe');
            iframe.src = URL.createObjectURL(blob);
            
            document.getElementById('safari-url').textContent = `localhost/${title.replace(/\s+/g, '-').toLowerCase()}.html`;
            safariModal.classList.add('active');
            minimizedWindow.classList.remove('active');
        }
        
        function highlightRunningCard(index) {
            if (cards[index]) {
                cards[index].classList.add('running');
            }
        }
        
        function removeRunningHighlight() {
            if (currentRunningProject && cards[currentRunningProject.index]) {
                cards[currentRunningProject.index].classList.remove('running');
            }
        }
        
        function editProject(index) {
            const projects = JSON.parse(localStorage.getItem('projects') || '[]');
            const project = projects[index];
            
            if (!project) return;
            
            currentEditIndex = index;
            document.getElementById('project-title').value = project.title;
            document.getElementById('project-code').value = project.code;
            document.querySelector('#edit-modal .modal-title').textContent = '编辑项目';
            openModal(editModal);
            closeModal(safariModal);
        }
        
        function saveProject() {
            const title = document.getElementById('project-title').value.trim();
            const code = document.getElementById('project-code').value.trim();
            
            if (!title || !code) {
                alert('请填写项目名称和代码');
                return;
            }
            
            const projects = JSON.parse(localStorage.getItem('projects') || '[]');
            
            if (currentEditIndex >= 0) {
                // 编辑现有项目
                projects[currentEditIndex] = {
                    title,
                    code,
                    date: new Date().toISOString()
                };
                
                // 如果当前正在运行的是编辑的项目,更新运行内容
                if (currentRunningProject && currentRunningProject.index === currentEditIndex) {
                    currentRunningProject.code = code;
                    const iframe = document.getElementById('safari-iframe');
                    const blob = new Blob([code], {type: 'text/html'});
                    iframe.src = URL.createObjectURL(blob);
                }
            } else {
                // 添加新项目
                projects.push({
                    title,
                    code,
                    date: new Date().toISOString()
                });
            }
            
            localStorage.setItem('projects', JSON.stringify(projects));
            
            closeModal(editModal);
            loadProjects();
        }
        
        function deleteProject(index) {
            if (!confirm('确定要删除这个项目吗?')) return;
            
            const projects = JSON.parse(localStorage.getItem('projects') || '[]');
            
            // 如果删除的是当前正在运行的项目,关闭运行窗口
            if (currentRunningProject && currentRunningProject.index === index) {
                safariModal.classList.remove('active');
                document.getElementById('safari-iframe').src = '';
                currentRunningProject = null;
            }
            
            projects.splice(index, 1);
            localStorage.setItem('projects', JSON.stringify(projects));
            loadProjects();
        }
        
        function handleFileImport(e) {
            const file = e.target.files[0];
            if (!file) return;
            
            const reader = new FileReader();
            reader.onload = function(event) {
                document.getElementById('project-code').value = event.target.result;
                
                // 自动设置项目名为文件名(不含扩展名)
                const fileName = file.name.replace(/\.[^/.]+$/, "");
                document.getElementById('project-title').value = fileName;
            };
            reader.readAsText(file);
            
            // 重置input,允许再次选择相同文件
            e.target.value = '';
        }
        
        // 工具函数
        function openModal(modal) {
            modal.classList.add('active');
            document.body.style.overflow = 'hidden';
        }
        
        function closeModal(modal) {
            modal.classList.remove('active');
            document.body.style.overflow = '';
        }
        
        function escapeHtml(unsafe) {
            return unsafe
                .replace(/&/g, "&")
                .replace(/</g, "<")
                .replace(/>/g, ">")
                .replace(/"/g, """)
                .replace(/'/g, "'");
        }
        
        function formatDate(isoString) {
            const date = new Date(isoString);
            return date.toLocaleDateString() + ' ' + date.toLocaleTimeString([], {hour: '2-digit', minute:'2-digit'});
        }
    </script>
</body>
</html>

相关推荐

激光手术矫正视力对眼睛到底有没有伤害?

因为大家询问到很多关于“基质不能完全愈合”的问题,有必要在这里再详细解释一下。谢谢@珍惜年少时光提出的疑问:因为手头刚好在看组织学,其中提到:”角膜基质约占角膜的全厚度的90%,主要成分是胶原板层,...

OneCode核心概念解析——View(视图)

什么是视图?在前面的章节中介绍过,Page相关的概念,Page是用户交互的入口,具有Url唯一性。但Page还只是一个抽象的容器,而View则是一个具备了具体业务能力的特殊的Page,它可以是一个...

精品博文图文详解Xilinx ISE14.7 安装教程

在软件安装之前,得准备好软件安装包,可从Xilinx官网上下载:http://china.xilinx.com/support/download/index.html/content/xilinx/z...

卡片项目管理(Web)(卡片设计的流程)

简洁的HTML文档卡片管理,简单框架个人本地离线使用。将个人工具类的文档整理使用。优化方向:添加图片、瀑布式布局、颜色修改、毛玻璃效果等。<!DOCTYPEhtml><html...

GolangWeb框架Iris项目实战-JWT和中间件(Middleware)的使用EP07

前文再续,上一回我们完成了用户的登录逻辑,将之前用户管理模块中添加的用户账号进行账号和密码的校验,过程中使用图形验证码强制进行人机交互,防止账号的密码被暴力破解。本回我们需要为登录成功的用户生成Tok...

sitemap 网站地图是什么格式?有什么好处?

sitemap网站地图方便搜索引擎发现和爬取网页站点地图是一种xml文件,或者是txt,是将网站的所有网址列在这个文件中,为了方便搜索引擎发现并收录的。sitemap网站地图分两种:用于用户导...

如何在HarmonyOS NEXT中处理页面间的数据传递?

大家好,前两天的Mate70的发布,让人热血沸腾啊,不想错过,自学的小伙伴一起啊,今天分享的学习笔记是关于页面间数据伟递的问题,在HarmonyOSNEXT5.0中,页面间的数据传递可以有很多种...

从 Element UI 源码的构建流程来看前端 UI 库设计

作者:前端森林转发链接:https://mp.weixin.qq.com/s/ziDMLDJcvx07aM6xoEyWHQ引言由于业务需要,近期团队要搞一套自己的UI组件库,框架方面还是Vue。而业界...

jq+ajax+bootstrap改了一个动态分页的表格

最近在维护一个很古老的项目,里面是用jq的dataTable方法实现一个分页的表格,不过这些表格的分页是本地分页。现在想要的是点击分页去请求数据。经过多次的修改,以失败告终。分页的不准确,还会有这个错...

学习ES6- 入门Vue(大量源代码及笔记,带你起飞)

ES6学习网站:https://es6.ruanyifeng.com/箭头函数普通函数//普通函数this指向调用时所在的对象(可变)letfn=functionfn(a,b){...

青锋微服务架构之-Ant Design Pro 基本配置

青锋(msxy)-Gitee.com1、更换AntDesignPro的logo和名称需要修改文件所在位置:/config/defaultSetting.jsconstproSett...

大数据调度服务监控平台(大数据调度服务监控平台官网)

简介SmartKettle是针对上述企业的痛点,对kettle的使用做了一些包装、优化,使其在web端也能具备基础的kettle作业、转换的配置、调度、监控,能在很大一定程度上协助企业完成不同...

Flask博客实战 - 实现博客首页视图及样式

本套教程是一个Flask实战类教程,html/css/javascript等相关技术栈不会过多的去详细解释,那么就需要各位初学者尽可能的先去掌握这些基础知识,当然本套教程不需要你对其非常精通,但最起码...

Web自动化测试:模拟鼠标操作(ActionChains)

在日常的测试中,经常会遇到需要鼠标去操作的一些事情,比如说悬浮菜单、拖动验证码等,这一节我们来学习如何使用webdriver模拟鼠标的操作首页模拟鼠标的操作要首先引入ActionChains的包fro...

DCS F-16C 中文指南 16.9ILS仪表降落系统教程

10–ILS教程我们的ILS(仪表着陆进近)将到达Batumi巴统机场。ILS频率:110.30跑道航向:120磁航向/126真航向无线电塔频率:131.0001.设置雷达高度表开关打开(前)并...