OneManager的影视库模板分享 - Hello World

OneManager的影视库模板分享

<!DOCTYPE html>
<html lang="zh-cn">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title><!--Title--> - <!--Sitename--></title>
    <link rel="shortcut icon" href="<!--base_path-->favicon.ico" type="image/x-icon">
    <script src="https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/jquery/2.2.4/jquery.min.js"></script>

    <!--MdRequireStart-->
    <link rel="stylesheet" href="https://unpkg.com/github-markdown-css@3.0.1/github-markdown.css">
    <script type="text/javascript" src="?jsFile=marked.js"></script>
    <!--MdRequireEnd-->

    <!--IsFileStart-->
    <!--IsvideoFileStart-->
    <script src="https://cdn.jsdelivr.net/npm/artplayer/dist/artplayer.js"></script>
    <!--IsvideoFileEnd-->
    <!--IspdfFileStart-->
    <script src="https://npm.onmicrosoft.cn/pdfjs-dist@2.4.456/build/pdf.min.js"></script>
    <!--IspdfFileEnd-->
    <!--IstxtFileStart-->
    <script src="https://lf6-cdn-tos.bytecdntp.com/cdn/expire-1-M/monaco-editor/0.31.1/min/vs/loader.min.js"></script>
    <script>
        require.config({ paths: { 'vs': 'https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/monaco-editor/0.31.1/min/vs' } });
        require(['vs/editor/editor.main'], function () { editor_init() });
    </script>
    <!--IstxtFileEnd-->
    <!--IsFileEnd-->

    <style>
        /* 全局样式 */
        :root {
            --primary: #1e3c72;
            --primary-light: #2a4a8a;
            --bg: #f8fafc;
            --card: #ffffff;
            --text: #1e293b;
            --text-light: #64748b;
            --border: #e2e8f0;
            --shadow: 0 4px 12px rgba(0,0,0,0.03);
            --radius: 16px;
            --radius-sm: 12px;
        }

        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }

        body {
            font-family: -apple-system, 'PingFang SC', 'Microsoft YaHei', 'Segoe UI', sans-serif;
            background: var(--bg);
            color: var(--text);
            line-height: 1.5;
            min-height: 100vh;
        }

        a {
            text-decoration: none;
            color: inherit;
        }

        /* 头部 */
        .header {
            max-width: 1000px;
            margin: 0 auto;
            padding: 24px 24px 0;
            display: flex;
            align-items: center;
            justify-content: space-between;
        }

        .site-title {
            font-size: 1.6rem;
            font-weight: 500;
            color: var(--primary);
            letter-spacing: -0.3px;
        }

        .login-icon {
            width: 24px;
            height: 24px;
            fill: var(--text-light);
            cursor: pointer;
            transition: fill 0.2s;
        }

        .login-icon:hover {
            fill: var(--primary);
        }

        /* 主容器 */
        .main {
            max-width: 1000px;
            margin: 0 auto;
            padding: 24px 24px 60px;
        }

        /* 面包屑 - 可点击返回 */
        .breadcrumb {
            margin-bottom: 28px;
            font-size: 1.1rem;
            color: var(--text-light);
            background: var(--card);
            padding: 14px 20px;
            border-radius: var(--radius-sm);
            border: 1px solid var(--border);
            box-shadow: var(--shadow);
            cursor: pointer;
            transition: background 0.2s;
        }

        .breadcrumb:hover {
            background: #f1f5f9;
        }

        .breadcrumb a {
            color: var(--text-light);
            transition: color 0.2s;
            pointer-events: none;
        }

        .breadcrumb span {
            color: var(--primary);
            font-weight: 500;
        }

        .breadcrumb .separator {
            margin: 0 8px;
            color: var(--border);
        }

        /* 卡片 */
        .card {
            background: var(--card);
            border: 1px solid var(--border);
            border-radius: var(--radius);
            margin-bottom: 24px;
            overflow: hidden;
            box-shadow: var(--shadow);
            transition: box-shadow 0.2s;
        }

        .card:hover {
            box-shadow: 0 8px 20px rgba(0,0,0,0.06);
        }

        .card-header {
            padding: 16px 24px;
            background: #fafcfc;
            border-bottom: 1px solid var(--border);
            font-weight: 600;
            color: var(--primary);
            font-size: 1.1rem;
            letter-spacing: 0.3px;
        }

        /* 文件列表表格 */
        .file-table {
            width: 100%;
            border-collapse: collapse;
        }

        .file-table th {
            text-align: left;
            padding: 16px 20px;
            background: #fafcfc;
            border-bottom: 2px solid var(--primary);
            font-weight: 600;
            color: var(--text-light);
            font-size: 0.9rem;
            text-transform: uppercase;
            letter-spacing: 0.5px;
        }

        .file-table td {
            padding: 16px 20px;
            border-bottom: 1px solid var(--border);
            color: var(--text);
            vertical-align: middle;
        }

        .file-table tr:last-child td {
            border-bottom: none;
        }

        .file-table tbody tr {
            transition: background 0.2s;
            cursor: pointer;
        }

        .file-table tbody tr:hover {
            background: #f1f5f9;
        }

        .file-table .file-cell {
            display: flex;
            align-items: center;
            gap: 12px;
        }

        .file-table .file-icon {
            width: 28px;
            height: 28px;
            display: flex;
            align-items: center;
            justify-content: center;
            color: var(--primary);
            flex-shrink: 0;
        }

        .file-table .file-icon svg {
            width: 22px;
            height: 22px;
            fill: currentColor;
        }

        .file-table .file-name {
            font-weight: 500;
            color: var(--text);
            word-break: break-word;
        }

        .file-table .file-meta {
            color: var(--text-light);
            font-size: 0.95rem;
        }

        .file-table .file-size {
            color: var(--text-light);
            font-family: monospace;
            font-size: 0.95rem;
            text-align: right;
        }

        .file-table .file-download {
            text-align: center;
            width: 60px;
        }

        .download-icon-btn {
            display: inline-flex;
            align-items: center;
            justify-content: center;
            width: 36px;
            height: 36px;
            border-radius: 50%;
            background: var(--primary);
            color: white;
            transition: all 0.2s;
            cursor: pointer;
            border: none;
        }

        .download-icon-btn:hover {
            background: var(--primary-light);
            transform: translateY(-2px);
            box-shadow: 0 4px 10px rgba(30,60,114,0.3);
        }

        .download-icon-btn svg {
            width: 18px;
            height: 18px;
            fill: white;
        }

        .folder-row .file-icon {
            color: #f59e0b;
        }

        .video-row .file-icon {
            color: var(--primary);
        }

        .video-row td:first-child {
            border-left: 3px solid var(--primary);
        }

        .back-row td {
            background: #f8fafc;
            color: var(--text-light);
        }

        .back-row .file-name {
            color: var(--text-light);
            font-weight: normal;
        }

        /* 分页 */
        .pagination {
            display: flex;
            justify-content: center;
            align-items: center;
            gap: 8px;
            margin-top: 32px;
            flex-wrap: wrap;
        }

        .page-btn {
            min-width: 80px;
            padding: 10px 18px;
            background: var(--card);
            border: 1px solid var(--border);
            border-radius: 40px;
            text-align: center;
            cursor: pointer;
            font-size: 0.95rem;
            color: var(--text);
            transition: all 0.2s;
            box-shadow: var(--shadow);
        }

        .page-btn:hover {
            background: var(--primary);
            color: white;
            border-color: var(--primary);
            transform: translateY(-1px);
        }

        .page-btn.active {
            background: var(--primary);
            color: white;
            border-color: var(--primary);
        }

        /* 预览区域 */
        .preview-image {
            width: 100%;
            border-radius: var(--radius-sm);
        }

        .video-container {
            aspect-ratio: 16/9;
            background: #000;
        }

        .video-container artplayer {
            border-radius: 0 !important;
        }

        .pdf-container canvas {
            width: 100%;
            margin-bottom: 16px;
            border: 1px solid var(--border);
            border-radius: var(--radius-sm);
        }

        audio {
            width: 100%;
        }

        .txt-editor {
            height: 500px;
            border: 1px solid var(--border);
            border-radius: var(--radius-sm);
        }

        /* 下载区域 */
        .download-area {
            padding: 24px;
        }

        .download-title {
            font-size: 1.2rem;
            font-weight: 500;
            margin-bottom: 8px;
            color: var(--text);
        }

        .download-desc {
            color: var(--text-light);
            font-size: 0.95rem;
            margin-bottom: 20px;
        }

        .url-box {
            display: flex;
            background: #f8fafc;
            border: 1px solid var(--border);
            border-radius: 60px;
            margin-bottom: 20px;
            overflow: hidden;
        }

        .url-box textarea {
            flex: 1;
            padding: 14px 20px;
            border: none;
            background: transparent;
            font-family: monospace;
            font-size: 0.95rem;
            resize: none;
            outline: none;
            color: var(--text);
            word-break: break-all;
            white-space: normal;
            min-height: 60px;
            max-height: 120px;
        }

        .copy-btn {
            padding: 0 28px;
            background: var(--primary);
            color: white;
            border: none;
            font-size: 0.95rem;
            font-weight: 500;
            cursor: pointer;
            transition: background 0.2s;
            white-space: nowrap;
        }

        .copy-btn:hover {
            background: var(--primary-light);
        }

        .action-btns {
            display: flex;
            gap: 16px;
            margin-top: 20px;
        }

        .action-btn {
            flex: 1;
            padding: 14px 24px;
            border: none;
            border-radius: 60px;
            font-size: 1rem;
            font-weight: 500;
            cursor: pointer;
            text-align: center;
            transition: all 0.2s;
            display: inline-block;
        }

        .action-btn.primary {
            background: var(--primary);
            color: white;
        }

        .action-btn.primary:hover {
            background: var(--primary-light);
            transform: translateY(-1px);
            box-shadow: 0 8px 16px rgba(30,60,114,0.15);
        }

        .action-btn.secondary {
            background: #e9ecef;
            color: var(--text);
        }

        .action-btn.secondary:hover {
            background: #dee2e6;
            transform: translateY(-1px);
        }

        /* Toast提示 */
        .toast {
            position: fixed;
            top: 24px;
            left: 50%;
            transform: translateX(-50%) translateY(-20px);
            background: var(--primary);
            color: white;
            padding: 12px 36px;
            border-radius: 60px;
            font-size: 0.95rem;
            box-shadow: 0 10px 25px rgba(30,60,114,0.3);
            opacity: 0;
            transition: all 0.3s;
            z-index: 9999;
            pointer-events: none;
            font-weight: 500;
        }

        .toast.show {
            opacity: 1;
            transform: translateX(-50%) translateY(0);
        }

        /* 加密文件夹 */
        .password-form {
            max-width: 360px;
            margin: 0 auto;
            text-align: center;
            padding: 20px;
        }

        .password-input {
            width: 100%;
            padding: 14px 18px;
            border: 1px solid var(--border);
            border-radius: 60px;
            font-size: 0.95rem;
            margin-bottom: 16px;
            transition: all 0.2s;
        }

        .password-input:focus {
            outline: none;
            border-color: var(--primary);
            box-shadow: 0 0 0 3px rgba(30,60,114,0.1);
        }

        .submit-btn {
            width: 100%;
            padding: 14px 24px;
            background: var(--primary);
            color: white;
            border: none;
            border-radius: 60px;
            font-size: 1rem;
            font-weight: 500;
            cursor: pointer;
            transition: all 0.2s;
        }

        .submit-btn:hover {
            background: var(--primary-light);
            transform: translateY(-1px);
        }

        /* 页脚 */
        .footer {
            text-align: center;
            padding: 48px 20px 20px;
            color: var(--text-light);
            font-size: 0.9rem;
        }

        /* 移动端 */
        @media (max-width: 640px) {
            .header {
                padding: 20px 20px 0;
            }

            .site-title {
                font-size: 1.4rem;
            }

            .main {
                padding: 20px 20px 40px;
            }

            .breadcrumb {
                padding: 12px 16px;
                font-size: 1rem;
                margin-bottom: 16px;
            }

            .card-header {
                padding: 14px 20px;
            }

            .file-table th {
                padding: 14px 12px;
            }

            .file-table td {
                padding: 14px 12px;
            }

            .file-table th:nth-child(2),
            .file-table td:nth-child(2) {
                display: none;
            }

            .file-table .file-size {
                text-align: left;
                font-size: 0.9rem;
            }

            .file-table .file-download {
                width: 50px;
            }

            .download-icon-btn {
                width: 32px;
                height: 32px;
            }

            .download-icon-btn svg {
                width: 16px;
                height: 16px;
            }

            .action-btns {
                flex-direction: column;
                gap: 12px;
            }

            .url-box {
                flex-direction: column;
                border-radius: 30px;
            }

            .url-box textarea {
                padding: 16px;
                min-height: 80px;
                max-height: 150px;
                font-size: 0.9rem;
            }

            .copy-btn {
                padding: 14px;
                width: 100%;
            }

            .page-btn {
                min-width: 70px;
                padding: 8px 14px;
                font-size: 0.9rem;
            }

            .toast {
                width: 90%;
                text-align: center;
                padding: 12px 20px;
                white-space: normal;
            }
        }
    </style>
</head>

<body>
    <!-- 头部 -->
    <div class="header">
        <a href="<!--base_path-->" class="site-title"><!--Sitename--></a>
        <!--LoginStart-->
        <div onclick="window.location.href = '/?login=admin'">
            <svg class="login-icon" viewBox="0 0 16 16">
                <path d="M6.22176 13.9567C3.55468 13.653 2 11.8026 2 10V9.5C2 8.67157 2.67157 8 3.5 8H5.59971C5.43777 8.31679 5.30564 8.65136 5.20703 9H3.5C3.22386 9 3 9.22386 3 9.5V10C3 11.1281 3.88187 12.333 5.50235 12.7996C5.69426 13.216 5.93668 13.6043 6.22176 13.9567ZM9.62596 5.06907C9.70657 4.81036 9.75 4.53525 9.75 4.25C9.75 2.73122 8.51878 1.5 7 1.5C5.48122 1.5 4.25 2.73122 4.25 4.25C4.25 5.53662 5.13357 6.61687 6.32704 6.91706C6.64202 6.55055 7.00446 6.226 7.40482 5.95294C7.27488 5.98371 7.13934 6 7 6C6.0335 6 5.25 5.2165 5.25 4.25C5.25 3.2835 6.0335 2.5 7 2.5C7.9665 2.5 8.75 3.2835 8.75 4.25C8.75 4.73141 8.55561 5.16743 8.24104 5.48382C8.67558 5.28783 9.14016 5.14664 9.62596 5.06907Z"/>
            </svg>
        </div>
        <!--LoginEnd-->
    </div>

    <!-- 主内容 -->
    <div class="main">
        <!-- 面包屑 - 可点击返回上级目录 -->
        <div class="breadcrumb" onclick="goToParentDir()">
            <a href="<!--base_path-->"><!--Sitename--></a>
            <!--DiskPathArrayStart-->
            <span class="separator">/</span>
            <a href="<!--PathArrayLink-->"><!--PathArrayName--></a>
            <!--DiskPathArrayEnd-->
        </div>

        <!--ListStart-->

        <!--HeadomfStart-->
        <div class="card">
            <div class="card-body markdown-body"><!--HeadomfContent--></div>
        </div>
        <!--HeadomfEnd-->

        <!--HeadmdStart-->
        <div class="card">
            <div class="card-body markdown-body" id="head">
                <textarea id="head-md" style="display:none;"><!--HeadmdContent--></textarea>
            </div>
        </div>
        <!--HeadmdEnd-->

        <!--EncryptedStart-->
        <div class="card">
            <div class="card-header">🔒 加密文件夹</div>
            <div class="card-body">
                <div class="password-form">
                    <form action="" method="post">
                        <input id="password1" name="password1" type="password" class="password-input" placeholder="请输入文件夹密码">
                        <input type="submit" value="确认" class="submit-btn">
                    </form>
                </div>
            </div>
        </div>
        <!--EncryptedEnd-->

        <!--IsFileStart-->
        <!-- 文件预览区域 - 只有在文件页面才显示 -->
        <!--IsimgFileStart-->
        <div class="card">
            <div class="card-header">🖼️ 图片预览</div>
            <div class="card-body">
                <img src="<!--FileDownUrl-->" alt="<!--FileName-->" class="preview-image">
            </div>
        </div>
        <!--IsimgFileEnd-->

        <!--IsvideoFileStart-->
        <div class="card">
            <div class="card-header">🎬 视频预览</div>
            <div class="card-body" style="padding:0;">
                <div id="video-a0" class="video-container"></div>
            </div>
        </div>
        <!--IsvideoFileEnd-->

        <!--IspdfFileStart-->
        <div class="card">
            <div class="card-header">📄 文档预览</div>
            <div class="card-body">
                <div id="pdf-d" class="pdf-container">加载中...</div>
            </div>
        </div>
        <!--IspdfFileEnd-->

        <!--IsmusicFileStart-->
        <div class="card">
            <div class="card-header">🎵 音频预览</div>
            <div class="card-body">
                <audio src="<!--FileDownUrl-->" controls></audio>
            </div>
        </div>
        <!--IsmusicFileEnd-->

        <!--IstxtFileStart-->
        <div class="card">
            <div class="card-header">📝 文本预览</div>
            <div class="card-body" style="padding:0;">
                <div id="txt-a" class="txt-editor"></div>
            </div>
        </div>
        <!--IstxtFileEnd-->

        <!-- 下载区域 - 只有在文件页面才显示 -->
        <div class="card">
            <div class="card-header">📥 下载</div>
            <div class="download-area">
                <div class="download-title"><!--FileEncodeReplaceName--></div>
                <div class="download-desc">分享链接,永久有效</div>
                <div class="url-box">
                    <textarea id="fileUrl" rows="2" readonly></textarea>
                    <button class="copy-btn" onclick="copyFileUrl()">复制</button>
                </div>
                <div class="action-btns">
                    <a href="<!--FileEncodeUrl-->" class="action-btn primary" target="_blank" rel="noopener noreferrer">直接下载</a>
                    <!-- 返回按钮使用面包屑相同的返回上级功能 -->
                    <a href="javascript:void(0);" class="action-btn secondary" onclick="goToParentDir()">返回上级</a>
                </div>
            </div>
        </div>
        <!--IsFileEnd-->

        <!--IsFolderStart-->
        <!-- 文件列表 - 文件夹页面 -->
        <div class="card">
            <div class="card-header">📁 文件列表</div>
            <table class="file-table">
                <thead>
                    <tr>
                        <th>文件名</th>
                        <th>修改时间</th>
                        <th class="file-size">大小</th>
                        <!-- 下载列标题 - 只在有文件时才显示,由JS控制 -->
                    </tr>
                </thead>
                <tbody>
                    <!--BackArrowStart-->
                    <tr class="back-row" onclick="goToParentDirWithUrl('<!--BackArrowUrl-->')">
                        <td colspan="4">
                            <div class="file-cell">
                                <span class="file-icon">
                                    <svg viewBox="0 0 24 24">
                                        <path d="M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z"/>
                                    </svg>
                                </span>
                                <span class="file-name">← 返回上级</span>
                            </div>
                        </td>
                    </tr>
                    <!--BackArrowEnd-->

                    <!--FolderListStart-->
                    <tr class="folder-row" onclick="window.location.href='<!--FileEncodeReplaceUrl-->/'">
                        <td>
                            <div class="file-cell">
                                <span class="file-icon">
                                    <svg viewBox="0 0 24 24">
                                        <path d="M10 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2h-8l-2-2z"/>
                                    </svg>
                                </span>
                                <span class="file-name"><!--FileEncodeReplaceName--></span>
                            </div>
                        </td>
                        <td class="file-meta"><!--lastModifiedDateTime--></td>
                        <td class="file-size"><!--size--></td>
                        <!-- 文件夹没有下载列,由JS动态添加 -->
                    </tr>
                    <!--FolderListEnd-->

                    <!--FileListStart-->
                    <tr class="video-row has-download" onclick="window.location.href='<!--FileEncodeReplaceUrl-->?preview'">
                        <td>
                            <div class="file-cell">
                                <span class="file-icon">
                                    <svg viewBox="0 0 24 24">
                                        <path d="M18 4v16H6V4h12zM4 2v20h16V2H4zm7 6h2v8h-2V8zm4 0h2v8h-2V8zm-8 0h2v8H7V8z"/>
                                    </svg>
                                </span>
                                <span class="file-name"><!--FileEncodeReplaceName--></span>
                            </div>
                        </td>
                        <td class="file-meta"><!--lastModifiedDateTime--></td>
                        <td class="file-size"><!--size--></td>
                        <!-- 文件下载列,由JS动态添加 -->
                    </tr>
                    <!--FileListEnd-->
                </tbody>
            </table>
        </div>

        <!-- 动态添加下载列的脚本 - 只在有文件时显示 -->
        <script>
            (function() {
                // 检查是否有文件行
                var hasFiles = document.querySelectorAll('.video-row').length > 0;
                var table = document.querySelector('.file-table');
                
                if (table && hasFiles) {
                    // 添加下载列表头
                    var headerRow = table.querySelector('thead tr');
                    if (headerRow && !headerRow.querySelector('.download-header')) {
                        var downloadTh = document.createElement('th');
                        downloadTh.className = 'file-download download-header';
                        downloadTh.textContent = '下载';
                        headerRow.appendChild(downloadTh);
                    }
                    
                    // 为所有文件行添加下载列
                    document.querySelectorAll('.video-row').forEach(function(row) {
                        if (!row.querySelector('.file-download')) {
                            // 获取下载URL
                            var fileName = row.querySelector('.file-name')?.textContent || '';
                            var downloadUrl = window.location.pathname.replace(/\/$/, '') + '/' + encodeURIComponent(fileName);
                            
                            var downloadTd = document.createElement('td');
                            downloadTd.className = 'file-download';
                            downloadTd.innerHTML = '<a href="' + downloadUrl + '" class="download-icon-btn" onclick="event.stopPropagation()" target="_blank" rel="noopener noreferrer" title="下载"><svg viewBox="0 0 24 24"><path d="M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z"/></svg></a>';
                            row.appendChild(downloadTd);
                        }
                    });
                    
                    // 为文件夹行和返回行添加空列
                    document.querySelectorAll('.folder-row, .back-row').forEach(function(row) {
                        if (row.children.length === 3) {
                            var emptyTd = document.createElement('td');
                            emptyTd.className = 'file-download';
                            row.appendChild(emptyTd);
                        }
                    });
                }
            })();
        </script>

        <!--MorePageStart-->
        <form action="" method="POST" id="pageForm">
            <input type="hidden" id="pageNum" name="pagenum" value="">
            <div class="pagination">
                <!--PrePageStart-->
                <div class="page-btn" onclick="nextPage('<!--PrePageNum-->');">上一页</div>
                <!--PrePageEnd-->
                <!--MorePageListStart-->
                <div class="page-btn" onclick="nextPage('<!--PageNum-->');"><!--PageNum--></div>
                <!--MorePageListEnd-->
                <!--MorePageListNowStart-->
                <div class="page-btn active"><!--PageNum--></div>
                <!--MorePageListNowEnd-->
                <!--NextPageStart-->
                <div class="page-btn" onclick="nextPage('<!--NextPageNum-->');">下一页</div>
                <!--NextPageEnd-->
            </div>
        </form>
        <script>
            function nextPage(num) {
                document.getElementById('pageNum').value = num;
                document.getElementById('pageForm').submit();
            }
        </script>
        <!--MorePageEnd-->
        <!--IsFolderEnd-->

        <!--ReadmemdStart-->
        <div class="card">
            <div class="card-body markdown-body" id="readme">
                <textarea id="readme-md" style="display:none;"><!--ReadmemdContent--></textarea>
            </div>
        </div>
        <!--ReadmemdEnd-->

        <!--FootomfStart-->
        <div class="card">
            <div class="card-body markdown-body"><!--FootomfContent--></div>
        </div>
        <!--FootomfEnd-->

        <!-- 页脚 - 移除多余的返回按钮 -->
        <div class="footer">
            © <span id="currentYear"></span> <!--Sitename-->
        </div>

        <!--ListEnd-->
    </div>

    <!-- Toast提示 -->
    <div id="toast" class="toast"></div>

    <script>
        // 当前年份
        document.getElementById('currentYear').textContent = new Date().getFullYear();

        // Toast提示函数
        function showToast(msg) {
            var toast = document.getElementById('toast');
            toast.textContent = msg;
            toast.classList.add('show');
            clearTimeout(window.toastTimer);
            window.toastTimer = setTimeout(() => toast.classList.remove('show'), 2000);
        }

        // 获取上级目录路径
        function getParentDirPath() {
            var path = window.location.pathname;
            // 去掉末尾的 /
            if (path.endsWith('/')) {
                path = path.slice(0, -1);
            }
            // 获取最后一个 / 之前的部分
            var lastSlashIndex = path.lastIndexOf('/');
            if (lastSlashIndex > 0) {
                return path.substring(0, lastSlashIndex + 1);
            } else {
                return '/';
            }
        }

        // 返回上级目录 - 通用函数
        function goToParentDir() {
            var parentPath = getParentDirPath();
            window.location.href = parentPath;
        }

        // 返回上级目录 - 带备用URL
        function goToParentDirWithUrl(url) {
            if (url && url !== '' && url !== 'javascript:void(0);') {
                window.location.href = url;
            } else {
                goToParentDir();
            }
        }

        <!--IsFileStart-->
        // 设置下载链接 - 只在文件页面执行
        (function() {
            var urlEl = document.getElementById('fileUrl');
            if (urlEl) {
                var url = decodeURIComponent(window.location.href.replace('?preview', ''));
                urlEl.value = url;
                // 自动调整高度
                urlEl.style.height = 'auto';
                urlEl.style.height = urlEl.scrollHeight + 'px';
            }
        })();

        // 复制链接
        function copyFileUrl() {
            var url = document.getElementById('fileUrl').value;
            if (!url) return;
            
            if (navigator.clipboard && navigator.clipboard.writeText) {
                navigator.clipboard.writeText(url).then(
                    () => showToast('✅ 复制成功'),
                    () => fallbackCopy(url)
                );
            } else {
                fallbackCopy(url);
            }
        }

        function fallbackCopy(text) {
            var ta = document.createElement('textarea');
            ta.value = text;
            ta.style.position = 'fixed';
            ta.style.opacity = '0';
            document.body.appendChild(ta);
            ta.select();
            ta.setSelectionRange(0, 99999);
            var success = document.execCommand('copy');
            showToast(success ? '✅ 复制成功' : '❌ 复制失败');
            document.body.removeChild(ta);
        }
        <!--IsFileEnd-->
    </script>

    <!-- 视频播放器 -->
    <!--IsvideoFileStart-->
    <script>
        new Artplayer({
            container: '#video-a0',
            url: '<!--FileDownUrl-->',
            theme: '#1e3c72',
            autoplay: false,
            playbackRate: true,
            fullscreen: true
        });
    </script>
    <!--IsvideoFileEnd-->

    <!-- PDF预览 -->
    <!--IspdfFileStart-->
    <script>
        pdfjsLib.GlobalWorkerOptions.workerSrc = 'https://unpkg.com/pdfjs-dist@2.4.456/build/pdf.worker.min.js';
        pdfjsLib.getDocument({ url: "<!--FileDownUrl-->" }).promise.then(function(pdf) {
            var container = document.getElementById('pdf-d');
            container.innerHTML = '';
            for (var i = 1; i <= pdf.numPages; i++) {
                (function(p) {
                    pdf.getPage(p).then(function(page) {
                        var canvas = document.createElement('canvas');
                        var ctx = canvas.getContext('2d');
                        var viewport = page.getViewport({ scale: 1.5 });
                        canvas.height = viewport.height;
                        canvas.width = viewport.width;
                        canvas.style.width = '100%';
                        canvas.style.height = 'auto';
                        page.render({ canvasContext: ctx, viewport: viewport });
                        container.appendChild(canvas);
                    });
                })(i);
            }
        });
    </script>
    <!--IspdfFileEnd-->

    <!-- 文本编辑器 -->
    <!--IstxtFileStart-->
    <script>
        function editor_init() {
            window.monaco.editor.create(document.getElementById("txt-a"), {
                value: `<!--TxtContent-->`,
                readOnly: true,
                theme: 'vs',
                fontSize: 14,
                minimap: { enabled: false }
            });
        }
    </script>
    <!--IstxtFileEnd-->
    <!--IsFileEnd-->

    <!-- Markdown渲染 -->
    <!--HeadmdStart-->
    <script>
        var head = document.getElementById('head');
        var headMd = document.getElementById('head-md');
        if (head && headMd) head.innerHTML = marked(headMd.value);
    </script>
    <!--HeadmdEnd-->

    <!--ReadmemdStart-->
    <script>
        var readme = document.getElementById('readme');
        var readmeMd = document.getElementById('readme-md');
        if (readme && readmeMd) readme.innerHTML = marked(readmeMd.value);
    </script>
    <!--ReadmemdEnd-->
</body>

</html>


文件备份boss.zip