{
    "changelog": {
        "title": "站点更新日志",
        "badge": "v2.0.0",
        "sort": "manual",
        "items": [
            {
                "date": "2022.11.23",
                "title": "Xdir v1.3.9 版本发布，正式版上线；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2022.11.23",
                "title": "优化更新，优化文本查看器代码高亮区域实现左右滑动块，方便看全内容；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2022.11.27",
                "title": "优化更新，调整并支持jquery-jtoast样式的消息提醒；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2022.12.01",
                "title": "优化更新，调整文本查看器代码复制随屏滚动、消息提醒由jquery-mac-message-tips提供支持；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2022.12.01",
                "title": "优化更新，调整文本查看器代码区域块锁定窗口预览大小；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2022.12.03",
                "title": "版本更新，调整站点更新日志页面，去除旧日志页面，减轻站点程序体积；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2022.12.05",
                "title": "版本发布，发布站点日志v1.0.0版本，帮助站点展示更新进度；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2022.12.05",
                "title": "Xdir v1.3.9 赞助正式版，文件哈希阈值查验最大支持1024M；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2022.12.05",
                "title": "版本发布，发布 Xdir v1.3.9 正式版，本次更新共计三款，赞助版、标准版、清爽版，用户可根据不同需要所取不同版本；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2022.12.06",
                "title": "版本更新，Xdir v1.3.9 清爽正式版，界面简约清爽、功能与赞助版标准一样、无广告、公告、简介展示；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2023.03.08",
                "title": "功能更新，新增复制按钮获取文件后缀自动增加标签SRC属性；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2023.04.24",
                "title": "版本发布，站点更新日志更新至v1.0.1版本；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2023.04.24",
                "title": "功能更新、优化，复制功能增加SRC属性类别复制提醒、增加遍历目录列表Loading加载等待效果、新增鼠标样式、鼠标点击效果、HTML5“DPlayer”视频播放器升级至v1.27.1，播放器功能参数优化更新，功能区按钮细节优化、fileTypes遍历目录文件后缀个别图标样式更新、部分UI细节优化更新；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2023.05.10",
                "title": "优化更新，部分UI细节优化更新、暗黑模式UI样式更新；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2023.05.17",
                "title": "功能、优化更新，简介功能优化升级，新增Readme文档解析模式配置（支持html、md文档解析并支持自定义切换简介说明文档的预览方式）、支持Markdown解析添加锚点，官网站点界面UI样式优化调整；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2023.05.19",
                "title": "版本发布，Xdir v1.4.0.20230519 赞助正式版本上线运行；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.10.29",
                "title": "Xdir v2.0.2 旗舰版发布：彻底修复 /index.php?c=cache 索引页空白（PHP8 下 DirectoryLister.php:877 类型错误致命，已补配置默认键并加防御）；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.10.29",
                "title": "优化更新：F12 控制台改为双色标签（版本深色块+浅色字 / 官网黄块+蓝下划线），配色与系统一致；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.10.29",
                "title": "优化更新：页脚改为 sticky 锁定视口底部、回退 v2.0.1 的 body flex 布局，修复主页列表断层与左侧蓝带；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.10.29",
                "title": "修复更新：全局超链光标 Link.cur 路径修正生效、MD 锚点跳转 scroll-margin-top 由 70px 收紧至 16px；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.10.29",
                "title": "功能新增：数据安全·加密保险箱（PHP 内置 PDO_SQLite + AES-256 加密，后台可视化增删改查，单目录可迁移）；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.10.29",
                "title": "Xdir v2.0.3 旗舰版发布：修复歌词链路——functions/lyrics.php 以 include 载入全局 $config 并合并后台 data/settings.json，仅填基础地址时自动补全 title/artist 参数；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.10.29",
                "title": "优化更新：站点更新日志页重构为后端页面管理（data/pages.json），首次访问自动迁移历史日志，后台「单页管理」可视化增删改排序；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.10.29",
                "title": "优化更新：全站统一一套 default_header.php / default_footer.php，更新日志页移除自带顶部导航与尾部调用，与首页共用同一页头页脚；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.10.29",
                "title": "重要修复：PHP 8 下 config 缺失 username / download-url 键产生 Warning，输出在 DOCTYPE 之前导致浏览器进入怪异模式、整站样式失效；已补全默认键并在模板层统一兜底；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.10.29",
                "title": "Xdir v2.0.4 旗舰版发布：后台数据统一纳入 PDO_SQLite 管理，站点配置 / 存储挂载 / 单页内容 / 分享记录四类数据双写 JSON 镜像，支持可视化迁移、由库恢复与一致性校验；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.10.29",
                "title": "功能新增：私有分享支持密码明文回显、复制带密码链接、单独复制密码，并内置二维码供手机扫码直达；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.10.29",
                "title": "优化改进：站点更新日志页 UI 完整重构，采用卡片式时间轴 + 类型标签 + 概览统计 + 类型筛选，版本发布、功能新增、问题修复等记录一目了然；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.10.29",
                "title": "修复更新：音乐播放弹窗左右两块等高对齐、间隔统一，折叠目录含音乐时的悬浮播放器上抬避开页脚；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.10.29",
                "title": "修复更新：切换目录后页脚未贴合浏览器底部（内容不足一屏时悬空）已修正；Readme Markdown 锚点点击跳回顶端的问题改用精确滚动定位；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.10.29",
                "title": "重要修复：文件索引页（?c=cache）与搜索页（?c=search）此前各自 include 只有几行 <link> 的旧页头，缺 DOCTYPE 与 html/head/body，浏览器进入怪异模式导致样式全丢、且没有页头页脚；已新增统一页面外壳 functions/XdirPage.php，全站前台页共用同一套 header/footer；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.10.29",
                "title": "功能新增：加载动画改为只在目录列表卡片内显示，移除覆盖整站的全屏加载遮罩；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.10.29",
                "title": "优化改进：运行环境兼容提升至 PHP 8.4 并向下兼容 5.6，新增 functions/XdirCompat.php 提供函数垫片与统一错误策略，后台系统信息页显示兼容状态；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.10.29",
                "title": "修复更新：Readme 简介说明中的 MD 锚点点击后跳回顶端的问题彻底修正（折叠面板自动展开 + 顶栏偏移精确滚动 + 目标高亮）；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.10.29",
                "title": "修复更新：音乐播放弹窗歌词高亮不跟随节奏的根本原因（歌词行集合误存 jQuery 对象导致 classList 报错），并新增歌词区显式滚动条、悬停可滚、手动滚动自动暂停跟随；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.10.29",
                "title": "重要修复：私有分享复用同路径 token 时未同步更新密码，导致带密码链接与二维码扫码访问提示「密码不正确」；已修复并可自动填充密码到密码栏；分享结果窗口支持自适应滚动，内容不再看不全；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.10.29",
                "title": "功能新增：站点更新日志页增加返回顶部按钮，复用首页同一套交互；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.10.29",
                "title": "重要修复：歌词调用在线 API 时把歌名当成歌手传入，导致匹配到完全另一首歌（实测 api.lrc.cx 传错 artist 会主动带偏结果）；现从文件名解析「歌手 - 歌名」，并按多候选回退与 12 小时缓存取词；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.10.29",
                "title": "安全加固：后台管理员密码 / 访客密码改为 AES-256 加密存入 data/settings.json（形如 enc:…），密钥独立存放 data/.xdir_key；旧明文数据无需迁移，下次保存自动升级；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.10.29",
                "title": "重要修复：文件索引页与搜索页页脚未贴合浏览器底部（内容不足一屏时悬空、内容末行被页脚遮挡）；改为独立页弹性布局精确贴底；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.10.29",
                "title": "安全加固：文件索引页按操作系统自适应屏蔽敏感文件（.user.ini / .htaccess / web.config / Thumbs.db / .env / .git 等）与本程序自身配置入口，避免部署目录泄漏；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.10.29",
                "title": "体验优化：后台确认弹窗按钮文案随操作类型变化（迁移 / 恢复 / 清空 / 删除各自对应），常规操作改用蓝色系以区别危险操作；文件索引页移除标题图标并强化条目悬停样式；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.10.29",
                "title": "体验优化：私有分享弹窗创建阶段恢复自然高度，创建成功后按结果内容自适应调高，密码区与二维码完整可见；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.10.29",
                "title": "重要修复：搜索「文件明明存在却搜不到」—— 索引缓存只有人工访问索引页才重建、有效期长达 24 小时，长期无人访问就停留在旧快照；新增统一索引引擎，缺失或超过 5 分钟自动重建，并改用结构化清单检索（不再解析 HTML 文本）；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.10.29",
                "title": "功能新增：音乐播放器支持跨页面续播 —— 标签页不关闭时，站内浏览目录、切换页面音乐不中断，自动恢复曲目与进度；被浏览器自动播放策略拦截时降级为「点击继续播放」；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.10.29",
                "title": "优化改进：F12 控制台改分层输出（内核信息 / 发行版本 / 使用说明 / 反馈通道），并新增页面加载性能（首字节、DNS、DOM、完整加载、资源数与传输量、均速）；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.10.29",
                "title": "安全加固：数据管理「立即迁移到 SQLite」「由库恢复文件」统一对密码字段做 AES 加密，导出的备份也不再含明文；索引页与搜索页按操作系统并集屏蔽 .user.ini / .htaccess / web.config / Thumbs.db 等敏感文件；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.10.29",
                "title": "体验优化：全站搜索无结果时图标居中；搜索页「复制」改为完整下载链接并新增新窗口打开；文件索引页显示收录条目数与「立即重建」；后台「单页管理」更名为「更新日志」并补充实际功能说明；分享弹窗二维码与文本不再被裁切；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.10.29",
                "title": "重要安全修复：全局搜索只跳过点文件，导致 data/、functions/、resources/ 目录与程序生成的哈希命名缓存（如 35b8….json 歌词缓存）被搜出来返回前端；现完全复用索引引擎的可见性规则，并在进入目录前剪枝；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.10.29",
                "title": "优化改进：搜索页「复制」链接改为最小转义，中文保留可读（不再是一串 %E9%9F%B3%E4%B9%90），仅转义空格、#、?、&、%、+ 等会破坏 URL 的字符；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.10.29",
                "title": "功能新增：音乐播放器支持收起 / 展开，收起后缩为左下角小圆盘（播放时外圈脉冲），站内浏览不再被遮挡；折叠状态跨页面保持；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.10.29",
                "title": "重要修复：分享已创建弹窗内容被裁切（本版 layer 无 layer.style()，旧实现被 try/catch 静默吞掉，内容区高度仍停在创建表单时的值）；改为显式设置内容区与外层高度并重新居中，矮屏自动切换为滚动；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.10.29",
                "title": "重要修复：左上角 logo / 站标名 / 徽章 鼠标悬停时整组发糊 —— 悬停高亮原用绝对定位伪元素铺白色蒙版，而伪元素绘制顺序晚于普通流内容，白膜盖在了图标与文字之上；改为给品牌元素自身加半透明背景，背景永远画在内容之下；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.10.29",
                "title": "UI 重构：版本徽章改到 logo + 站标名 的右上角作为上标标签，尺寸由 24px/14px 收至 17px/11px，新增红色渐变底、1px 半透明白描边、投影与文字投影，白字对比度 4.83:1 达 WCAG AA；同时移除 JS 里写死的 12 项内联样式，徽章外观回归样式表单一出处；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.10.29",
                "title": "体验优化：项目部署后主体初始默认「明亮」—— 原逻辑首次访问取 auto 并跟随系统 prefers-color-scheme，导致系统为深色的访客第一次打开就进了暗黑；现无 cookie 一律默认明亮，只有用户主动切到「自动」才跟随系统，同时同步 color-scheme 让浏览器原生控件与页面明暗一致；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.10.29",
                "title": "UI 调整：版本徽章从「右上角上标」改回与 logo + 站标名 同一水平线垂直居中，并加 1px 光学补偿（中文字形视觉重心比行盒低），配合 10px 横向间距；徽章保持 17px 紧凑尺寸，不再高过站标名；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.10.29",
                "title": "行为还原：主题切换循环恢复为 自动 → 黑暗 → 明亮 → 自动，首次访问（无 cookie）回到默认「自动」，跟随浏览器 / 系统配色 —— 即系统设为深色时首屏就是深色，属预期行为；同时保留 color-scheme 同步，让滚动条与表单控件随页面明暗一致；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.10.29",
                "title": "重要修复：页面刷新时左上角 logo、站标名、徽章\"抖一下\" —— 样式表里 `#page-navbar .shiyu a{display:inline-block}` 的特异性(1,1,1)压过了品牌链接的 inline-flex(1,1,0)，首帧品牌链接是 inline-block，align-items:center 完全失效，三者退回基线对齐；等脚本写入内联 display:inline-flex 后才跳到正确位置，实测徽章纵向跳动 4px、横向 3.3px；现用高特异性选择器 + :not(.xdir-brand) 排除，CSS 首帧即终态，脚本不再写任何品牌区内联样式；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.10.29",
                "title": "UI 调整：徽章垂直位置改为显式 margin-top: 10px、margin-bottom: 10px（上下等值使 flex 居中净位移为 0，中心仍严格对齐 logo 与站标名），光学补偿由 position/top 改为 transform，不再参与布局；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.10.29",
                "title": "体验优化：后台「LOGO 实时预览」按前台顶栏 1:1 复刻 —— 图标由白色改为品牌蓝 #58b4ff 并补 1px 投影勾边、站名改为 #f2f6fa 并补文字投影、徽章由 21px 胶囊形改为 17px 圆角矩形（竖向红渐变 + 白描边 + 双层投影，与原前台完全同款）、站名与徽章间距由 7px 修正为 10px（gap 7 + margin 3）、预览底色由渐变改为 #444 纯色、高度对齐 65px，并补齐 -webkit-font-smoothing 使字形栅格化一致；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.10.29",
                "title": "UI 统一：后台侧栏站标图标色由菜单蓝 #1E9FFF 改为前台品牌蓝 #58b4ff 并加投影，侧栏版本标签同步为前台红渐变样式，避免「后台蓝、前台亮蓝」两套观感；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.11.18",
                "title": "版本发布：Xdir v2.0.18 旗舰版（Build 20261118）正式发布 —— 版本号由 v2.0.14 迭代至 v2.0.18，构建号更新为 20261118，静态资源戳同步自增，覆盖升级后强刷一次即可拉取全部新资源；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.11.18",
                "title": "UI 细化：顶栏版本徽章字距放宽至 0.8px、高度定为 18px、上下外边距各 30px，小字号下更透气，红块更醒目且不压过站标名（flex 居中会居中 margin box，上下 margin 必须等值，只改一边会偏 5px）；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.11.18",
                "title": "体验优化：顶栏品牌区悬停高亮背景向左扩展 6px 内边距（配 margin-left:-6px 抵消，logo 版面位置不变），鼠标滑上时 logo 不再紧贴高亮框左缘，整组呼吸感更自然；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.11.18",
                "title": "架构改进：后台「LOGO 实时预览」不再手抄一套数值，改为与前台共用独立的 xdir-brand.css（选择器 :is(#page-navbar, .xdir-brand-scope)），预览容器加同名作用域 class、HTML 与前台完全同构 —— 改一次样式两边同时生效，从机制上消除不同步；同时把图标盒的字号/字重/颜色显式固定，避免纯文本 LOGO 在前后台呈现两种样子；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.11.18",
                "title": "文档重写：部署与功能说明补充 Windows Server / Linux / 宝塔面板 / 虚拟主机等多环境安装流程、PHP 与扩展运行环境要求、以及完整功能模块说明，文本重新润色；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.11.18",
                "title": "重要修复：目录切换的加载动画仍显得在列表外、靠近页脚 —— 遮罩虽已覆盖卡片，但它是「对整张卡片垂直居中」，列表一长（30 行≈785px、60 行≈1487px）卡片几何中心就落到视口之外或贴在视口底部；现改为两层结构，遮罩仍严格等于卡片（overflow:hidden 兜底），内层 .xdir-loading-box 由脚本定位到「卡片 ∩ 视口」的可见区域中心，短列表即卡片中心、长列表即当前可视区中心，自动适配文件与文件夹数量，并随滚动缩放实时重算；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.11.18",
                "title": "修复：文件索引页悬停超链出现「双重下划线」 —— 该条目同时写了 border-bottom-color 与 text-decoration:underline，两条线一条在文字基线下方、一条在盒子底部，垂直错开约 3px，看起来就是重复下划线；现统一由 border-bottom 一条承担，text-decoration 在链接常态/悬停/焦点/访问过等所有状态强制 none，同时挡住 bootstrap 的 a,a:visited 与 a:focus,a:hover 规则；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.11.18",
                "title": "优化：文件列表中的文件名主链接（a.preview）也取消悬停下划线 —— 此前无任何 text-decoration 规则接管，悬停时 bootstrap 的下划线会从图标一直贯穿到文件名；悬停反馈改由变色与整行高亮承担；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.11.18",
                "title": "重要优化：页面底部留白统一 —— 简介说明下方到页脚之间曾有一条约 119px 的空白带，成因是两处留白重复叠加：① .jianjie-container 写死 margin-bottom:80px，② #page-content 仍按页脚 position:fixed 时代预留了整份页脚高度（页脚早已改为 sticky，自身就在文档流里占位，再补一次等于重复预留）。现统一为单一变量 --xdir-gap-bottom:16px，简介/列表收尾到页脚顶边恒为 16px；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.11.18",
                "title": "优化：页脚高度与「返回顶部」按钮共用同一基准线 —— 新增 --xdir-foot-pad-y 控制页脚上下内边距（5px→7px，页脚略增高更沉稳）；返回顶部按钮与底部信息按钮的 bottom 均改为 foot-h + gap，按钮底边正好落在内容结束线上，与列表/简介收尾水平对齐，不再是各处各写 16/14px 的散值；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.11.18",
                "title": "新增「简介说明」管理模块：后台可统一开关该模块、单选简介文件类型（Markdown .md / HTML .html），并按所选类型提供在线编辑器与实时预览，支持选择站点根目录下两层子目录分别维护各自的简介；预览走后端同一套渲染器，与前台展示逐字一致；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.11.18",
                "title": "简介说明展示逻辑优化：目录下既无 README.md 也无 README.html（或后台关闭开关）时，整个「简介说明」容器不再输出 —— 此前容器仍会渲染，带着 1rem 上边距，表现为「模块已隐藏但位置还占着」；同时读取规则改为「所选类型优先、缺失自动回退另一种」，避免切换类型后原有简介突然消失；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.11.18",
                "title": "重要修复：切换目录后简介说明显示错误 —— 「首次进子目录仍显示上一个目录的简介、按 F5 刷新才正确/或直接消失」。根因是 AJAX 切换目录时只替换了文件列表与面包屑，简介区块原地不动；现已把简介一并纳入 AJAX 片段同步，新目录无简介时移除旧容器，并补给手风琴点击事件与样式表；顺带把简介版权行的年份由 document.write 改为服务端输出，避免 AJAX 插入时丢年份；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.11.18",
                "title": "体验优化：图片预览支持鼠标左键长按 + 上下滑动手势 —— 按住左键约 0.26 秒后上下拖动即可切换上一张 / 下一张（跟手位移、超阈值滑出换图、不足阈值弹回），长按瞬间底部浮出提示并高亮目标方向箭头；手势按「图片是否超出可视区」自动分工：整张看全时用于翻图，放大 / 长图时仍是平移查看，互不打架；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.11.18",
                "title": "修复：图片预览拖拽越拖越偏、可把图拖出可视区 —— 原实现用 offset() 取起点再写 left，而相对定位元素的 offset 已包含上次位移，第二次拖动会把上次位移再叠一次；且没有边界约束。现改为记录起始 left/top 累加 + 按溢出量一半夹紧，缩小到无余量时自动锁中线，光标同步变回默认（不再暗示可拖）；触屏平移也接入同一套夹紧；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.11.18",
                "title": "体验优化：txt / 代码文件 / Markdown 预览同样支持「鼠标左键长按 + 上下拖动滚动」—— 按住约 0.22 秒后拖动即可上下滚动正文（内容跟手、松手带衰减惯性），长代码行还可左右拖动横向查看；短按拖动仍保持浏览器原生选文字，复制代码与选中引用不受影响；无法滚动的小文件不会触发手势，也不会弹提示；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.11.18",
                "title": "管理后台列表统一升级：分享管理、加密保险箱、日志系统、网络存储、挂载管理、更新日志六处列表全部加入分页栏（默认 10 条/页，可切 10/20/50/100）与防抖搜索（输入停止 0.24 秒即筛选，回车立即生效，带一键清空）；搜索框与分页控件全站共用同一份实现，不各写一套；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.11.18",
                "title": "更新日志（单页管理）增强：更新记录列表列头右侧新增防抖搜索与「导出日志」按钮，可把全部更新记录（含未显示的页）一键导出为 Markdown 文件；分页采用「行仍保留在 DOM、仅切换显隐」的方式，因此分页 / 搜索状态下点「保存并生效」也不会丢记录，拖动排序、新增、删除与全局序号照常工作；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.11.18",
                "title": "顺手修掉一处翻页后失效的问题：列表行内按钮（编辑 / 测试 / 删除 / 显示隐藏）改用事件委托绑定，翻页重渲染后依然可用；此前若直接绑在按钮上，翻到第二页按钮就点不动了；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.11.18",
                "title": "在线预览格式大扩充：视频新增 MOV / WMV / M4V / MPG / 3GP，音频补上此前\"判定为音频却没有播放按钮\"的 AAC / M4A / OGG，图片新增 TIF / TIFF，文档新增 RTF / ODT / ODS / ODP，代码新增 CMD / BAT（REG 原有）；共覆盖 112 种扩展名，全部由一张格式表统一驱动；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.11.18",
                "title": "兼容性关键修复：音视频改由 PHP 按格式表显式发送 Content-Type 并支持 Range 分段 —— 此前 .mkv / .flac / .mov / .3gp 等扩展名多数 Web 服务器未收录，会以 application/octet-stream 发出，浏览器一律不播（黑屏转圈），换台服务器又正常；现在换成 Windows / Linux / macOS 任意环境行为一致，进度条拖动也正常；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.11.18",
                "title": "TIFF 图片可直接查看：无 Imagick 时用纯 PHP 解码并自行编码 PNG（支持 LZW / Deflate / PackBits / 无压缩、灰度 / RGB / RGBA / 调色板、大端小端），已与专业库逐像素比对 8 种变体完全一致；超出尺寸上限或遇到不支持的变体时明确提示下载，不输出破图；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.11.18",
                "title": "RTF / ODT / ODS / ODP 改为本地解析预览（服务端提取标题、段落、列表与表格），不再依赖微软在线预览 —— 该服务不认这些格式，且要求文件能被公网抓取，内网部署根本用不了；现纯 PHP 解析、无需外网、无需装办公软件；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.11.18",
                "title": "修复文本预览两处老问题：① 内容被转义了两次，代码里的 < > 会显示成 &lt; &gt;（cmd / bat / reg 里到处都是重定向符，一眼就看出）；② 中文 Windows 的 .bat / .reg 常是 GBK 或 UTF-16 编码，原实现用 GB2312 转码，遇到生僻字会整篇变空白，且 UTF-16 文件被误判为二进制只显示\"不支持预览\"；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.11.18",
                "title": "简介说明再优化：目录内的 README.md / README.html 不再作为普通文件出现在文件列表中 —— 这两个文件的内容已经由列表尾端的「简介说明」整块呈现，再列一份等于同一份内容出现两次，点开还只是源码文本页；其它 .md / .html 文件（笔记、说明页等）不受任何影响，照常列出；目录内没有简介文件时该模块仍整块隐藏；站点索引页与全局搜索同步过滤，索引缓存结构版本升级后会自动重建，无需手动清缓存；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.11.18",
                "title": "简介说明文件识别改为大小写不敏感并统一到一处：先前「读哪个文件」与「列表里要不要藏」各写一套判断，容易错位（出现列表藏着、简介却是空的）；现在由 findReadmeFile() 统一裁决——先按后台所选类型找，找不到再回退另一种，readme.md / ReadMe.MD 同样识别；后台关闭「简介说明」开关时两个 README 文件恢复显示，避免文档被藏得无处可看；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.11.18",
                "title": "后台 UI 修复：加密保险箱那一行的防抖搜索框，放大镜图标与占位文字叠在一起 —— 根因是 CSS 特异性打架，与保险箱本身无关：工具栏通用规则 `.log-bar input{padding:0 12px}` 的特异性(0,1,1)压过了搜索框的 `.xd-search-inp{padding:0 34px 0 32px}`(0,1,0)，而保险箱的搜索栏正好嵌在工具栏里（与「迁移旧数据 / 刷新 / 新增条目」同一行），左内边距被打回 12px，图标绝对定位也在 left:12px，文字便从同一位置起排；日志页的搜索框是工具栏直接子元素，所以此前看不出来；改法两步：工具栏规则收窄为直接子元素选择器（.log-bar > input），搜索框提到 .xd-search .xd-search-inp 提升特异性，实测左内边距恢复 32px、图标右缘 24.08 与文字起点 33 之间留白 8.92px，日志页样式不受影响；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.11.18",
                "title": "后台 UI 优化：列表「搜索不到结果」不再是甩一行灰字，统一改用图标 + 主文案 + 辅助说明的空状态（放大镜图标、回显搜索关键词、提示换词或点清空）；更新记录的占位块插进记录列表容器内而非分页栏，落在记录原本的位置上，并与内容水平居中；挂载管理新增防抖搜索（按挂载名 / 类型 / 标签 / 来源筛选，敏感字段不进前端），搜不到时同样显示居中图标与文字说明；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.11.18",
                "title": "简介说明定版调整：README.md / README.html 改为「无论开关状态都隐藏」—— 上一版让开关关闭时这两个文件恢复显示，理由是怕文档看不到，实测后确认这个判断不对：开关关掉的语义本就是「这份文档不在前台展示」，否则开着藏、关着露，关掉开关反而多出两个文件条目，用户会以为开关把文档「变出来」了；现在文件名判断与开关完全解耦，仅认 README.md / README.html（大小写不敏感），README（无后缀）/ README.txt / my-readme.md / notes.html / 说明.html 等相似名一律不受影响照常列出；索引页与全局搜索同步，索引缓存结构版本升级后自动重建；需要看原文仍可经文件管理器或 FTP 取得；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.11.18",
                "title": "修复旧索引页 index.php?c=indexes 白屏（Fatal）：该页是早期自写的一套递归扫描，`include_once(\"../config.php\")` 按当前工作目录解析 —— 而它是被 index.php 用 include_once(\"functions/\".$c.'.php') 引入的，此时 CWD 是站点根，于是路径指到站点上一级、配置没载入，全局 $ignore 为 null，array_search($file, null) 在 PHP 8 直接抛 TypeError；同时 `tree(\"..\")` 扫的也是站点上一级目录（共享主机上会列出别人的站点），且 config.php 的 $ignore 里没有 data，修好路径也会漏出 data/ 与 README.md，文件名与 URL 还未转义、不套统一页面外壳；现已改为直接委托 functions/cache.php（唯一实现），URL 不变、输出与 ?c=cache 逐字节一致，一并解决越界读取、目录泄漏、无外壳三个问题；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.11.18",
                "title": "修复子目录 / 全新部署必定白屏「Missing application config file at .../resources/config.php」：完整部署包的排除规则写的是「排除 config.php」，实际把根目录与 resources 下的两份都命中了，导致 resources/config.php 从来没进过任何一个完整包；原地覆盖升级不受影响（老站点这份文件还在），所以整整十几个版本都没暴露，直到全新部署 / 子目录部署才炸；现新增 resources/config.simple.php 出厂模板，并在配置缺失时自动复制生成，目录不可写则直接读模板照常运行，同时把 require_once 改为 include（同一请求内第二次包含会返回 true 而非数组，会让全站配置失效）；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.11.18",
                "title": "部署错误提示重做：原先配置缺失只会 die 出一行英文「ERROR: Missing application config file at 路径」，既不知错在哪也不知怎么办；现改为统一的图标 + 文字说明页 —— 语义化配色图标、主标题、一句话原因、等宽字体显示出错路径并支持一键复制、编号修复步骤、以及说明「两个 config.php 有何不同」的小字提示；支持明暗双色与移动端，按场景给出 503 / 500 状态码，并区分「文件缺失」与「文件存在但格式有误（含语法错误）」两种病因；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.11.18",
                "title": "顺带加固子目录部署：程序内部大量使用相对路径（./config.php、functions/xxx.php、resources/...），全部按当前工作目录解析，多数 FPM 环境 CWD 恰为脚本目录所以没暴露，子目录部署或某些 CGI / 反代配置下就会一路找不到文件；现 index.php 开头即 chdir 到自身所在目录，把基准钉死在站点根；控制器加载也改为绝对路径 + 白名单校验（原写法 ?c=../admin 可穿越到后台入口），空控制器时不再去包含 functions/.php 而先抛一条 Warning；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.11.18",
                "title": "建站时间改为首次部署自动写入：此前页脚「已运载」在 install_date.txt 不存在时，会拿 config 里 $siteinfo[Date] 当种子，而该字段出厂值硬编码为 05/19/2023，导致全新部署一打开就显示「已运载 3 年」；现在初始化时若仍为出厂占位值，即以当前安装时刻为起点，并把同一时刻回写进 config 的 Date，让配置文件记录的建站日与页脚算的起点始终一致；若用户手工设过真实建站日则尊重原值不作改动，config.php 不可写时静默跳过，由 install_date.txt 作为唯一权威；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.11.18",
                "title": "顺带修掉一处「初始化永远不跑」的旧缺陷：这段建站时间初始化原先写在页脚模板里，站点一旦在后台设置自定义尾部信息，自带页脚整块不输出，初始化便再也不会执行，install_date.txt 永远不生成；现已前移到 index.php 配置就绪之后，页脚只做兜底读取，无论用不用自带页脚都能正常起算；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.11.18",
                "title": "写 config 时的两处细节：① 不能用简单正则替换 —— config.php 头部注释里本就有同一行示例（尾部建站运载时间：Date => 12/03/2022），正则会先命中注释，把时间写进注释而真实值丝毫未动，且返回「成功」极难发现；现改用 PHP 词法分析器定位，注释天然被跳过，tokenizer 不可用时退化为逐行跳过注释行。② 只改值不动其余字节，临时文件 + rename 原子替换并继承原权限，引号风格跟随原值；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.11.18",
                "title": "部署提示页（配置文件已自动生成 / 站点配置文件缺失 / 配置文件格式有误）补全浏览器标签页图标：此前这几页的 head 里只写了 title 与 meta，唯独漏了 link rel=icon，标签页上显示成默认的空白/地球图标，而全站其他页面都有；现优先复用站点自己的 folder.png（与全站完全一致），该文件不存在时（配置缺失、resources 上传不完整的典型场景）退到内联 SVG data URI 并按状态配色，保证任何情况下都有图标且不产生额外请求；路径改为从 SCRIPT_NAME 推算站点根，子目录部署与「从 functions/ 下脚本触发」两种情形都能算对；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.11.18",
                "title": "首次部署动作写入日志系统：安装时系统会自动复制 config.php、复制 resources/config.php、初始化建站时间，但这些动作过去完全不落日志，事后想确认「哪个文件是自动生成的、生成在哪、用的什么版本、是不是子目录部署」只能靠猜；现逐条记入「日志系统」的操作日志，另加一条总览（动作清单 + 安装路径 + 访问入口 + 部署形态 + 时区 + 站点根 / data / resources 三处目录可写性），每条记录都自动附带版本、构建号、PHP 版本、SAPI 与操作系统，单条即可还原现场；另在 resources/ 不可写、只能以模板运行时记一条警告，提醒修正目录权限；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.11.18",
                "title": "简介说明新增「移动端显示」开关：此前 style.css 在 ≤828px 断点里写死了 .jianjie-container{display:none}，等于手机上永远看不到简介，后台也没有任何开关可以改变；现在后台可单独启停，关闭时只给容器加 xdir-rm-mobile-off 类由 CSS 在窄屏隐藏，桌面端不受影响。该开关刻意只控制「窄屏渲不渲染这个模块」，不改变文件可见性 —— 否则同一目录在手机上会凭空多出 README.md，用户会以为文件被动过；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.11.18",
                "title": "后台简介说明编辑器移动端适配：编辑与实时预览双栏在手机上各压 260px 上下堆叠，须滚到页面底部才能保存，实际不可用 —— 现 ≤828px 改为「编辑 / 预览」页签切换，一次只显示一个面板；编辑框字号提到 16px（iOS Safari 对小于 16px 的输入框会聚焦放大，输一个字跳一次）；操作按钮整行 44px 高，达 iOS 建议的最小触控尺寸；两个开关改用拨动开关组件（原 checkbox 方框仅 14px，手机上点不中），全局开关关闭时「移动端也显示」自动灰化并禁用；另新增「插入模板」按钮，手机上不必从空白开始敲；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.11.18",
                "title": "前台简介正文在窄屏的排版收口：桌面端为锚点定位留的 h1 22px / h2 30px / h3 37px 下内边距在手机上变成一截莫名其妙的空白，首行缩进 30px 也让每行只剩十来个字 —— 窄屏统一收紧字号与间距、去掉首行缩进，并让表格与代码块内部横滑，避免超宽内容把卡片撑出横向滚动条；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.11.18",
                "title": "修复移动端简介说明尾部被页脚遮挡、页面像被拉长：根因是 html,body 同时写了 height:100%（body 高度锁死在一屏），而 ≤767px 的 overflow-x:hidden 按 CSS 规范会把 overflow-y 从 visible 提升成 auto —— body 因此变成滚动容器，与 window 形成两套滚动坐标系；页脚 position:sticky 的包含块也跟着变成那个固定高的 body，长页面里恒定浮在视口底部盖住正文，简介尾部被挡、要继续下滑，看起来就是页面被拉长。现改为只给 html 留 height:100%、body 用 min-height:100% 随内容增高，overflow-x 改用 clip（不参与 overflow-y 提升），页脚回到文档流 static，短内容贴底交给 #page-content 的 min-height，并追加 100dvh 版本以适配手机地址栏伸缩；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.11.18",
                "title": "修复桌面端返回顶部按钮不该出现时却出现：原判定是滚动超过 30px 就显示，而页面只要比视口高一点点（简介展开、公告栏出现、body 被撑高几十像素）轻微一滚就会触发；现在先判断文档是否真的能滚动（scrollHeight 需明显大于视口），再要求滚过 max(320px, 视口高×0.4) 才淡入，与移动端按钮的 320px 阈值对齐；同时窄屏（≤768px）不再启用这套桌面按钮，避免与专门的移动端返回顶部按钮叠在右下角互相遮挡；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.11.18",
                "title": "修复移动端同时出现两个返回顶部按钮：原先有两套 —— HTML 里写死的 .cd-top（桌面红色方块，样式在 zzsc.css）与 xdir-enhance.js 在窄屏动态 append 的 #xdirBackTop（蓝色圆形）。前者判 ≤828、后者判 ≤768，而全站「移动端」统一断点是 828（列表视图、简介说明开关都用它），于是 769~828 这个夹缝里两边同时满足显示条件。现不再让两套互斥，而是只保留一个 .cd-top 节点：>828px 为红色方块、≤828px 由 CSS 换成蓝色圆形 44×44 并与页脚保持距离，显隐统一由 zzsc.js 负责 —— 只有一个 DOM 节点，结构上不可能再重复；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.11.18",
                "title": "窄屏圆形按钮的两个视觉细节：① 箭头改用 mask 伪元素绘制，颜色由 background-color 决定 —— 原先靠 background-image 直接贴 SVG、箭头颜色写死在图里，暗色模式下只能给整个元素套 filter:invert()，但那会把底色与边框一起反掉，深底反而变白；② 窄屏必须清掉原 background-image，否则两份箭头叠出「深色箭头 + 蓝色轮廓」的重影，实测按钮中心取到深灰 rgb(51,51,57) 正是这个原因。现浅色为白底蓝箭头、深色为深底淡蓝箭头，两种主题均无残留；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.11.18",
                "title": "修掉「改了没生效」的老毛病：三个页面引用 resources/Top/css/zzsc.css 与 zzsc.js 时都是不带任何 query 的裸路径，浏览器会强缓存，改完样式在用户那边可能压根没加载 —— 现在统一补上 ?v=版本&t=文件时间&av=资源戳，与全站其它静态资源一致；同时把该 CSS 里从 demo 页带过来的 header{background:#5c4751;height:100px} 与 main p{...} 规则删掉，它们会命中建站史页的 <header class=\"xd-cl-head\">，给它糊上深紫底色并撑到 100px 高，文件本身混合的 GBK 与非法字节也一并统一为 UTF-8；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.11.18",
                "title": "修复页脚不再锁定底部、跟随页面滚走：上一版为修「固定页脚遮挡简介尾部」把页脚从 sticky 改成了 static，遮挡是好了、锁定也没了。同一个位置前后试过三种方案 —— fixed 锁定正确但脱流不占位、正文末行被压住；sticky 在流里占位但元素位于视口下方时会一直黏底，等于长页面里恒定浮层；static 不遮挡但会滚走。正确解法是 fixed 锁定 + 内容区 padding-bottom 预留页脚高度，两者必须成对出现，只做一半就会退回上面某一版的毛病；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.11.18",
                "title": "站点更新日志徽章改为独立版本 v2.0.0，与程序版本号解耦：原先徽章种子取自模板里写死的 v2.0.18，等于每发一版程序、日志页徽章就跟着跳，看不出「日志本身攒了几轮」；现默认值独立为 v2.0.0，后台「更新日志 → 页头信息」明确标注两者无关。存量站点的徽章存在 data/pages.json 属用户内容、不会被默认值覆盖，因此后台加了提醒：当徽章与程序版本相同时出现「改为独立版本 v2.0.0」按钮，点一下填入再保存即可；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.11.18",
                "title": "新增站点更新日志「前端默认排序」预设：可设为手动顺序（按后台列表自上而下，默认）、日期倒序（新的在前）或日期正序（早的在前），解决「日志一多、想按时间读却得手工拖」的问题。日期解析支持 2026.10.29 / 2026-10-29 / 2026/10/29 / 2026.9.3 等写法；无法解析日期的记录恒排最后而不当作 1970 扔到最前，同日记录保持原有相对顺序；排序在服务端完成，前台按类型筛选只做显隐、不会打乱已排好的顺序，后台下拉改动还会即时回显「保存后会变成什么」；",
                "achievement": "",
                "type": ""
            },
            {
                "date": "2026.11.18",
                "title": "撤掉更新日志徽章的「改为独立版本 v2.0.0」提醒：上一版为照顾存量站点，在徽章与程序版本相同时弹黄条并给一键改回按钮。这个设计多余且方向不对 —— 徽章的规则只有一句「首次部署默认 v2.0.0，之后想填什么由用户自己决定」，它本来就不与程序版本联动，不存在「需要从系统版本改回来」这种状态；而徽章恰好等于程序版本是完全合法的，每次却弹黄条，看着像出错。现该提醒与按钮、以及仅为它而加的后端字段一并移除，徽章回归为普通输入框，填 v2.1.0 / 2026.11 第 3 轮 / 留空都可以；",
                "achievement": "",
                "type": ""
            }
        ],
        "migrated": 1,
        "updated": 1794383510
    }
}