# 变更日志

## v0.1.19（2026-09-08）

### 新增

- **GitHub 更新回退**：官网更新源不可用或元数据异常时，系统自动读取 `shuyu0131/pafish-php` 最新 Release，并继续使用相同的安装包校验、纯 PHP 数据库备份与失败回滚流程

## v0.1.18（2026-09-08）

### 修复

- **插件管理**：兼容旧版或不包含页面声明的插件清单，插件列表不再显示 `pagesCount`、`templatesCount` 未定义告警
- **应用商店详情**：恢复详情抽屉样式加载，点击“查看详情”可正常显示应用信息与操作入口

## v0.1.17（2026-09-08）

### 修复

- **在线更新备份兼容性**：升级前数据库备份与恢复统一使用 PDO 纯 PHP 实现，不再依赖服务器启用 `exec()`、`mysqldump` 或 `mysql`，适配常见共享主机环境

## v0.1.16（2026-09-08）

### 变更

- **编辑器体验收敛**：取消双编辑器方案，文章与页面统一使用本地 Vditor；桌面端正文优先、右侧发布设置固定，平板与移动端按标题、正文、发布设置顺序布局，移动端工具栏支持横向滚动
- **后台交互与应用商店整理**：统一操作提示、弹窗、媒体选择和商店管理界面，补充健康检查、内容迁移及商店目录刷新能力
- **安装与升级稳定性**：完善安装失败回填、幂等迁移、官方更新包校验与 PHP 内置备份兜底，减少共享主机环境下的升级失败
- **PHP 运行时收敛**：清理 Node.js 相关默认配置、说明和遗留编辑器资源，发行包仅保留 PHP 运行所需内容


## v0.1.15（2026-09-08）

### 修复

- **应用商店内容显示**：官网目录中的 HTML 或已实体化 HTML 描述、更新日志会自动转为纯文本显示，不再在后台暴露标签代码

## v0.1.14（2026-09-08）

### 修复

- **在线更新兼容性**：当虚拟主机禁用 `exec()` 时，更新前的数据库备份会自动使用内置 PHP 导出，不再因探测 `mysqldump` 失败而中止更新

## v0.1.13（2026-09-07）

### 变更

- **官方服务地址固定**：应用商店目录、付费权益校验和系统在线更新统一使用 `https://www.pafish.cn`，不再使用旧的 `store.waikanl.cn` 地址

## v0.1.12（2026-09-07）

### 新增

- **应用商店目录刷新**：后台商店可主动刷新官方目录缓存，便于测试或审核通过后立即获取最新应用信息
- **健康检查与内容迁移**：后台新增系统健康检查和内容迁移入口，便于部署后的基础排查与站点迁移

### 变更

- **应用商店安装链路对齐官网**：免费与付费应用均由系统后台商店安装；付费应用通过官方账号令牌校验购买权益，不再使用新的授权码下载流程
- **安装与升级更稳健**：增量迁移可重复执行，已存在的全文索引会被安全跳过；安装失败与成功提示统一，并保留用户已填写的表单内容
- **后台体验整理**：后台的操作提示、弹窗与基础页面样式继续统一，移除 Node.js 相关默认配置与说明，系统完全以 PHP 运行时为准

## v0.1.11（2026-08-18）

### 新增

- **应用商店分类**：商店目录条目透传分类信息，卡片标题旁显示分类徽标；工具栏新增分类下拉，可在主题/插件页内按分类筛选，且与关键词搜索叠加生效（分类由官方商店后台配置，远程不可用时自动隐藏分类控件）

### 变更

- **商店「兼容」改为 PHP 版本门槛**：条目声明的 `requiresPhp` 按 PHP 版本校验（主版本 ≥ 5 才视为合法版本号，其余旧式兼容号自动忽略），当前 PHP 不满足时给出明确提示并阻止安装，避免装完才发现跑不起来
- **安装包预校验放宽**：不再要求包内顶层目录名与商店条目别名一致——安装目录名以包内顶层目录为准，顶层目录与别名不符的包也能正常安装

## v0.1.10（2026-08-16）

### 新增

- **Lumina 信息流互动（主题）**：时间线卡片恢复「点赞 + 评论」——点赞按钮（心形 + 计数，与详情页同一套 cookie 幂等机制，平滑分页后依然可用）、评论入口（带计数，直接锚点跳到评论区）；列表查询补齐点赞/收藏/评论计数，互动数据贯通整条信息流
- **链接卡内容类型（Lumina 主题）**：补全 emlog 原版 8 种内容形态中缺失的「链接」类型——微信风格外链卡片（缩略图 + 标题 + 描述 + 域名），编辑器新增链接四字段（地址/标题/描述/缩略图），外链地址经 http(s) 白名单校验，非法协议自动降级为普通文章

### 变更

- **修复 Lumina 侧栏泄露私密内容**：侧栏「文章数/评论数/分类计数/最近文章」四条统计直查 SQL 未做私密过滤，非作者访客能看到「仅自己可见」文章的存在与标题——已与列表查询统一同一套私密判定，私有内容不再进入任何统计
- **修复「已是最新仍显示立即更新按钮」的兜底**：更新页按钮判定再加一道前端校验，`latest` 不大于当前版本时强制隐藏，杜绝任何缓存异常导致误显示
- **修复后台样式被激活主题污染**：后台此前会内联加载当前主题的 `style.css`（令牌变量与 `.btn/.card/.badge/.input` 等组件类依赖主题提供），主题缺少这些定义时后台样式失效——已改为后台完全自包含，样式固化进 `admin.css`，任何主题启用都不影响后台

## v0.1.9（2026-08-16）

### 新增

- **积分系统（核心能力）**：全站用户积分账本——余额变动强制写流水、可追溯；带引用键的操作幂等（重复提交与并发安全）；行级锁防超扣、负余额拒绝。后台「用户管理」可为任意用户发放/扣减积分（仅管理员，保留调整原因流水）；个人中心（`/profile`）展示积分余额、积分流水与红包领取记录。未执行数据升级的站点自动隐藏积分能力，不影响任何既有功能
- **积分红包（Lumina 主题功能）**：发布文章可赠送「积分红包」——创建即冻结作者积分，读者登录后领取，随机/等额两种发放方式，一人一包、作者不能领自己的；永久删除文章时剩余积分自动退还作者。领取交互与界面由 Lumina 主题呈现，业务机制与数据表由系统承载
- **系统更新页自动检查**：打开「系统更新」页面即自动实时检查官方最新版本，结果直接刷新页面（最新版本、徽标、「立即更新」按钮、变更说明与最低版本门槛联动）；「检查更新」按钮保留为手动重试入口，升级仍需手动确认、不做自动覆盖

### 变更

- **修复 v0.1.8 编辑器资源缺失**：Vditor 按需资源 404（i18n 语言包、Lute、Emoji 表情、echarts、highlight.js 主题等）与工具栏图标不显示（ant 图标集未随包）——补齐 icons/markmap/hljs 分包等本地资源，编辑器各项能力离线可用
- **修复 v0.1.8 漏收的 Lumina 内容能力**：动态内容编辑面板（图文/实况/视频/音乐/地点等）与私密文章过滤随包发布
- **发布包清理**：移除自产调试脚本与测试残留，构建脚本排除测试文件
- **数据库结构演进方式调整**：新增表并入全量安装结构（`schema.sql` 与迁移基线同步，构建时自动校验一致性），存量库升级时由升级脚本幂等补建；不再按序号维护独立迁移文件
- **修复后台样式被激活主题污染**：后台此前会内联加载当前主题的 `style.css`（令牌变量与 `.btn/.card/.badge/.input` 等组件类依赖主题提供），主题缺少这些定义时后台样式失效——已改为后台完全自包含，样式固化进 `admin.css`，任何主题启用都不影响后台
- **修复「已是最新仍显示立即更新按钮」**：更新页按钮在 `latest` 不大于当前版本时强制隐藏，即使检查结果异常也不显示「立即更新」

## v0.1.8（2026-08-16）

### 新增

- **Markdown 编辑器升级（Vditor）**：文章/页面编辑器换装 Vditor——所见即所得 / 分屏 / 源码三种模式自由切换，完整中文写作工具栏（标题层级、粗斜体删除线、引用、代码块、表格、链接、emoji、数学公式、mermaid 图表等），拖拽/粘贴图片直接上传，一键全屏与大纲；资源全部本地化，离线可用
- **前台渲染对齐编辑器**：文章与页面支持数学公式（KaTeX，行内 `$...$` 与块级 `$$...$$`）和 mermaid / flowchart / mindmap 图表显示——编辑器里写什么，前台就呈现什么；简报、公式、图表渲染失败时保留源码可读
- **全后台统一操作提示**：分类、标签、友链、评论、媒体、导航、设置、通知等页面的操作结果统一为右上角 toast（成功绿 / 失败红），保存、删除、批量操作均有明确反馈；提交期间按钮禁用，防止重复点击造成重复操作

### 变更

- 文章内容仍以 Markdown 明文存储，旧文章无需转换直接可用（渲染规则同步升级，摘要/封面提取不受影响）
- 编辑器工具栏新增「插入媒体」按钮，整合原媒体库与本地上传弹窗；上传接口兼容多文件与编辑器协议，媒体库、封面上传行为不变
- 修复自 v0.1.7 发布后遗留的问题：日夜切换在旧浏览器（无 addEventListener 的 matchMedia）失效、静态资源未带版本号导致升级后浏览器缓存旧文件、系统更新检查接口返回结构缺 `ok` 字段
- 发布包体积管理：安装包不再包含第三方依赖自带的测试目录与自产调试脚本；旧 md-editor 编辑器资源保留在包内，可随时回退
- 修复 Vditor 编辑器按需资源 404：语言包（i18n zh_CN）、Lute、KaTeX、highlight.js 主题、emoji 表情图与 echarts 图表库的本地加载路径对齐编辑器资源约定，编辑器各项能力离线可用

## v0.1.7（2026-08-16）

### 新增

- **插件 API v2**：插件可声明 `apiVersion: 2`，通过 `$ctx->filter()` 注册可统一注销的过滤器；新增首次/定时/批量发布事件、文章保存扩展字段、SEO Meta、Markdown、上传预处理，以及评论/登录/注册前置策略；卸载回调可在持久化数据清理前完成资源回收
- **插件 UI 插槽**：新增评论表单、登录、注册和文章编辑器插槽；表单字段使用 `plugins[插件名][字段名]` 规范传递
- **SEO 主动推送插件**：文章发布与更新自动推送 IndexNow / 百度搜索资源平台，带去重、Key 文件和最近 50 条结果
- **通知中心插件**：支持评论、文章发布、注册和登录事件，推送到 Bark、Telegram、钉钉、飞书、企业微信及带 HMAC 签名的通用 Webhook
- **PHP 插件开发文档**：新增 `docs/plugins.md`，替代与 PHP 实现不一致的 Node 版说明
- **付费应用闭环**：站点设置新增「应用商店」卡片，可填写付费应用授权码（官网购买后提供，仅保存在服务器、安装时自动携带）；商店下载付费插件/主题时自动附带授权码与站点地址，安装按钮旁提供「官网购买」直达链接，未填写授权码时给出引导文案

### 变更

- **插件管理简化**：插件未启用时不再显示「设置」入口（启用后可配置，与主题列表行为一致）；移除插件列表的「数据」查看按钮与展开面板；移除主题/插件管理页的长篇技术规格副标题（「主题存放在 themes/ 目录，由 theme.json 声明设置项…」等描述）
- 插件数据/日志 API（`$ctx->getData()` / `setData()` / `log()`）保留不变，仅供插件自身读写，管理端不再展示
- **商店协议升级（runtime-store/v1）**：主程序商店切换到与 Node 版一致的运行时商店协议——安装包 SHA-256 校验在远程安装时真正生效（旧协议目录无 sha256 字段，校验此前被跳过）；目录新增付费标记、主程序版本门槛（requiresPafish）、更新日志（changelog）与截图预览
- **商店目录缓存**：目录缓存 1 小时（runtime/store_catalog_{kind}.json，对齐系统更新检查缓存），打开商店页与安装/更新不再每次实时请求官网
- **版本门槛校验**：安装/更新前检查应用要求的 pafish 最低版本，不满足则拒绝并提示先升级系统
- **商店页体验**：新增搜索框（当前 Tab 内按标题/描述过滤）、预览图缩略图、付费徽标（付费应用安装前二次确认）、更新前展示 changelog、安装成功提示去启用位置
- **官网下载错误结构化**：下载接口 404/403/429 返回 JSON 错误码（not_found / license_required / license_invalid / rate_limited），主程序透传可读文案
- **官网旧协议清理**：移除已无消费者的 `/api/catalog`（AppRepository::catalog、路由、ApiController::catalog），商店统一走 runtime-store/v1
- **冗余清理**：移除已废弃的 admin-plugin-data CSS 样式
- **弹窗提示**：后台操作提示由顶部横幅改为右上角 toast 弹窗，修复提示无样式不显眼的问题
- **弹窗重做**：toast 升级为 Bootstrap/Tailwind 风格白卡片——状态色条 + SVG 图标 + 关闭按钮，右侧滑入，悬停暂停，4 秒自动消失（前台/后台一致）

## v0.1.6（2026-08-08）

工程质量与安全加固：

### 修复

- **版本元数据同步**：`composer.json` version 与 `Version.php` 常量对齐（此前漂移到 0.1.1）；发布脚本自动把 Version.php 常量写回 composer.json，以后打版只改一处，杜绝再漂移
- **Markdown 存储型 XSS**：文章渲染默认开启 Parsedown 安全模式——原始 HTML 转义为文本、危险链接协议清洗，与官方 Node 版（react-markdown 默认转义）行为对齐；后台新增「允许文章中的原始 HTML」开关（默认关闭，仅管理员可改）
- **包完整性 SHA-256**：在线更新元数据与内置商店目录新增 `sha256` 字段，下载后哈希校验（防篡改/损坏）；主题/插件 URL 安装从 http(s) 收紧为仅 https
- **版本化数据库迁移**：新增 `migrations/` + `Migrator` 服务（`schema_migrations` 表记录已应用版本，存量库自动识别基线，幂等可重跑）；安装流程登记基线，在线更新升级脚本通道预留（见 docs/migrations.md）

### 说明

- 第三方主题/插件包本质是 PHP 代码，安装后拥有站点权限；管理员只应从可信来源（官方商店）安装
- 升级整体回滚沿用在线更新的整站备份机制（升级前备份、失败自动恢复）

## v0.1.5（2026-08-08）

界面与权限修复（对齐 Node 版体验 + 参考 emlog 权限模型）：

### 修复

- **下拉框不显示内容**：`select.input` 用 `mask-image` 画箭头会把**整个元素**裁掉（文字、背景全被裁没），下拉框只剩一个小箭头。改为双渐变三角形绘制箭头，选项文字正常显示（明暗主题均可）
- **页脚移动端不显示**：原 `.app-footer` 仅桌面（≥1024px）显示，移动端整个页脚被隐藏。改为移动端/桌面均显示
- **备案号不显示**：页脚新增 `site_icp` 显示（对齐 Node 版 public-shell），后台「站点设置 → 站点信息」填了备案号即显示
- **移动端点击灰色高亮**：全局 `-webkit-tap-highlight-color: transparent`，去掉按钮/链接点击时的灰色高亮
- **编辑权限过大**（参考 emlog）：EDITOR 收窄为仅内容/互动（文章/页面/分类/标签/媒体/评论/通知/友链）；导航菜单、侧边栏组件、主题与外观、站点设置改为仅管理员（ADMIN）可管理（页面守卫 + 导航过滤同步收紧）
- **代码高亮 JS 路径回归**：主题 footer 的 `highlight.min.js` 改为 `asset_url()`（对齐 v0.1.4 静态资源 `/public/` 前缀，修复 404）

## v0.1.4（2026-08-07）

开箱即用与主题自包含：

### 修复

- **静态资源开箱即用**：全局资源（css/js/uploads/vendor）URL 改为 `/public/` 前缀直接指向真实文件，Web 服务器（Nginx/Apache）任何配置下都能直接读盘返回，无需 try_files / PHP 兜底 / .htaccess 静态重写。彻底解决「仅安装页有样式」（Nginx 未配静态规则时 `/css/` 直接 404、PHP 兜底触发不了）的问题——装上即有样式，零服务器配置
- **主题自包含**：前台布局样式 `style.css` 从全局 `public/css/` 移入主题目录 `themes/demo-nord/`，由 `Theme::layoutCss()` 内联注入（与 `theme.css` 变量一起）。主题切换换全套样式；第三方主题未提供 `style.css` 时回退默认主题布局，保证始终有样式
- 前台样式随 HTML 内联送达，不依赖 Web 服务器任何静态配置，真正开箱即用

## v0.1.3（2026-08-06）

体验与权限修复：

### 修复

- **收藏需登录**：文章收藏改为登录后才可使用，未登录返回 401 并自动跳转登录页（带回跳地址）；点赞保持匿名
- **退出登录 404**：前台移动端「退出登录」改为 POST 表单（带 CSRF），并新增 `GET /logout` 兼容路由（302 回首页），修复旧链接直接 404
- **版本常量未同步**：v0.1.2 发布包内 `Version.php` 仍为 0.1.1，导致已安装用户在线更新误报新版，本次同步为 0.1.3

## v0.1.2（2026-08-06）

部署修复：静态资源 PHP 兜底真正落地（v0.1.1 的声明实际未实现，Nginx 未配静态规则时 CSS/JS 仍 404）：

### 修复

- **静态资源 PHP 兜底落地**：框架入口（`index.php` → `bootstrap.php`）在会话/路由启动**之前**直出 `public/` 下的 `css/ js/ uploads/ vendor/`（正确 Content-Type / Content-Length / Cache-Control，子目录部署自动剥站点前缀），不再依赖 Web 服务器静态规则
  - Nginx 只需一条伪静态 `try_files $uri $uri/ /index.php?$query_string;`，配不配静态 `location` 样式都能加载（配了则由 Nginx 直接读盘，性能更佳）
  - Apache 不变（`.htaccess` 已内置静态重写，兜底仅作保底）
  - 静态请求零框架开销：不启动 session、不触发插件钩子
- 文档同步：README / docs/install-bt.md 的 Nginx 静态规则降为「可选性能优化」

## v0.1.1（2026-08-04）

线上部署修复与加固（针对 Nginx 场景 CSS/JS 加载失败、后台登录网络错误）：

### 新增

- **内置官方应用商店（store.waikanl.cn）**：商店地址硬编码官方域名，用户零配置；直接消费官网 `/api/catalog` 目录与 `/downloads/apps/{id}` 下载；目录拉取失败自动回退内置商店，商店永不自挂
- **系统在线更新**：后台「系统更新」页检查/升级，更新包与版本信息托管在 store.waikanl.cn；升级前自动整站备份（排除 runtime/backups/public/uploads 与 config.php），失败自动回滚；支持包内 `upgrade.php` 迁移脚本；导航角标提醒新版本（24h 缓存）
- **更新/删除的 Windows 兼容加固**：删除前先清除只读属性（git 对象等只读文件在 Windows 下 rename/unlink 会被拒绝）

### 修复

- **静态资源加载失败**：静态资源统一走 `public/` 直链（`css/ js/ uploads/`），不再依赖伪静态重写；新增 Slim 静态兜底路由（`StaticFileController`），Nginx 未配置静态规则时也由 PHP 正常返回资源
- **API 请求路径错误**（后台登录/操作提示「网络错误」）：前端 API 调用改为 `pafishApi()` 统一入口，自动适配伪静态/非伪静态两种 URL 形式
- **模板缺失 Config 类别名**（全站 500）：`helpers.php` 补充 `class_alias`，模板内 `Config::get()` 恢复正常
- **Windows 下卸载/删除插件目录失败**：`Plugin/Theme/Store` 删除逻辑升级为「换名后重删」兜底，规避 PHP 进程对 include 过文件的路径级句柄占用
- 文档补充 Nginx 静态资源规则与两种部署模式说明（README / docs/install-bt.md）

## v0.1.0（2026-08-04）

pafish 博客 CMS（PHP 版）首个发布版本。功能/界面/数据层与 Node 版 v1.1.0 对齐。

### 核心功能

- Web 安装向导（环境检查 → 建库建表 → 种子数据 → 生成配置，零命令行）
- 前台：文章/分类/标签/搜索/归档/页面/RSS/sitemap/robots、评论楼中楼、密码门、点赞收藏、相关推荐、侧边栏组件、亮暗主题
- 后台 18 页：工作台（SVG 图表）、文章（Markdown 编辑器/批量导入/回收站/定时发布）、分类树、标签、媒体库（GD 压缩）、评论审核、通知、友链/导航/组件、外观（主题设置/导入导出）、站点设置（SMTP 测试/开放 API）、商店、插件、用户、备份（双模式）、个人资料
- 认证：登录/注册/忘记密码（双通道）、邮箱验证、CSRF、会话 7 天

### 扩展

- 主题系统：theme.json + 语义 CSS 变量（与 Node 版主题包兼容）+ 可选 PHP 模板覆盖
- 插件系统：11 个事件钩子、云存储管线、前台页面/页面模板、应用商店安装更新回滚
- 内置应用商店（demo-nord / hello-pafish / demo-hooks / binfen-storage）

### 运维

- 定时发布双通道：cron.php（宝塔计划任务）+ 前台请求低频兜底
- 开放 API v1（X-API-Key 鉴权）
- 缤纷云 S4 云存储插件（SigV4 签名）
- 发布包预打包 vendor，上传解压即用
