功能

本页说明当前版本已经实现的功能,并在末尾单独列出尚未完成的规划项目。

部署与运行

运行环境需要 PHP、数据库驱动、必要扩展和正确的 Web 根目录配置。

  • 无需 Composer:框架内核以完整源码放在 flight/,业务代码用一个简单的自动加载器映射 App\app/。仓库里没有 composer.json,也没有 vendor/
  • 无需构建步骤:前台主题是纯 PHP 模板加手写 CSS;后台使用本地 Tailwind、htmx、SunEditor 和严格 CSP 兼容的原生交互脚本,由 Web 服务器直接返回,不经过任何打包器。
  • PDO 双驱动:MySQL 5.7 / 8.0 与 SQLite 共用同一套代码,方言差异只在主键定义和建表尾巴上分叉。
  • 两种安装方式:浏览器向导 public/install.php,或命令行 bin/install.php(可全参数化,适合自动化部署)。
  • 运行目录自动准备:安装器主动创建并检查缓存、日志、备份、更新、临时和上传目录,不依赖压缩包保留空文件夹。
  • 编号迁移:迁移文件按编号执行并写入历史表,可以查看已执行和待执行版本;迁移失败时命令以非零状态退出并记录错误。
  • 目录边界清晰config/storage/ 在 Web 根之外,公开目录只有 public/

内容与多语言

结构与译文分开建模,而不是把每种语言各复制一棵栏目树。

  • 栏目语言无关:一套栏目树,译名存在栏目自身的多语言字段里,菜单项同理;只有内容是按语言逐行存放的。
  • 翻译组关联:同一篇内容的各语言版本用翻译组串起来,语言切换器因此能直接跳到对应译文而不是跳回首页。
  • URL 规则:默认语言无前缀,其它语言带语言前缀;查不到译文时回退默认语言渲染,并自动标记为不索引,避免 canonical 与 hreflang 自相矛盾。
  • 站点设置按语言覆盖:非默认语言下若存在对应语言的设置项且非空,就替换掉默认值(版权、地址、描述、关键词等)。
  • 内容模型:单页、文章、产品、案例、相册和赛事;单页型栏目只有一篇正文,列表型栏目包含列表页和详情页。
  • 回收站与修订历史:删除是移入回收站可恢复;内容保存留修订版本,可回滚到任意历史版本。
  • 媒体引用保护:删除媒体前会检查内容封面、正文、图集、扩展字段、栏目横幅和站点设置;文件仍在使用时会明确阻止单个或批量删除。
  • 自定义完整路径:内容可以指定一条与栏目结构无关的完整 URL;伪静态后缀(留空或 .html)由站点设置统一控制。

主题与扩展

主题由独立目录中的 PHP 模板、字段声明和静态资源组成。

  • 纯 PHP 零编译主题:主题是 public/themes/{slug}/ 下的一组 PHP 文件,静态资源由 Web 服务器直接返回。
  • 字段化单页模板:主题的 pages.php 声明模板与字段,后台按声明自动生成表单。支持 text、textarea、richtext、image、number、video、select,以及可增删排序的 repeater。
  • 栏目模板校验:栏目配置的模板不存在时,系统使用对应的通用模板并记录日志;主题的必需模板缺失时会直接报错。
  • 静态资源版本:主题资源 URL 带有文件修改时间,文件更新后浏览器会请求新的资源地址。
  • 响应式图片辅助:模板函数输出 <picture>、WebP srcset、懒加载和宽高属性;没有图片变体时输出原图。
  • 插件钩子:动作 theme.headtheme.footercontent.createdcontent.updateduser.loginmessage.receivedcache.flushed;过滤器 content.renderadmin.menusecurity.csp。插件在配置里显式启用才加载。

安全

输入校验、权限检查和安全响应头由服务端执行。

  • 服务端富文本白名单清洗:编辑器提交的 HTML 在入库前按标签、属性、内联 CSS 属性与链接协议的白名单过滤,不信任客户端。
  • 安全响应头由应用层下发:CSP、HSTS、X-Content-Type-Options、X-Frame-Options、Referrer-Policy 由 PHP 统一输出,Apache 与 Nginx 部署都生效;CSP 还可以通过配置项和钩子进一步收紧。
  • 上传内容嗅探:不只看扩展名,还检查文件头,拦截伪装成图片的脚本、HTML 与可执行文件;不依赖 fileinfo 扩展。
  • 基于能力的 RBAC:角色对应一份能力清单,控制器声明所需能力后由基类在请求进入时统一校验;admin 角色始终保留全部能力。
  • CSRF 校验:后台所有 POST 与前台留言提交都要过令牌校验,留言另有蜜罐字段和算术验证码。
  • 登录与会话加固:密码哈希自动升级、按账号维度的登录失败限流、空闲与绝对超时、会话 ID 周期轮换、跳转目标协议白名单。
  • 审计日志:后台的写操作留有可查的操作记录。

SEO 与 GEO

SEO 元数据由核心通过主题钩子统一输出。

  • head 元数据自动注入:canonical、hreflang、Open Graph、Twitter Card、JSON-LD 通过 theme.head 钩子注入任意主题。
  • canonical 由内容生成:系统不直接使用请求路径;重复斜杠和多余尾斜杠会 301 跳转到标准地址,无效的更深路径返回 404。
  • sitemap.xml:包含 hreflang 与图片信息,按语言与可见性生成。
  • llms.txt:给大模型读的站点导航,同样受发布状态与定时发布门控——未上线的稿件不会提前泄露标题和链接。
  • robots.txt 与 RSS:动态生成,robots 内含 sitemap 地址。
  • 动态分享图/og/{id}.png 用 GD 生成并缓存;内容下线后旧图失效,回退通用卡片。

性能与运维

整页缓存默认关闭,可按站点内容更新频率配置。

  • 整页缓存:文件级,仅对匿名访客的前台 GET 生效;缓存键含语言与域名、查询参数白名单化,写入是原子替换,过期即删。默认关闭(TTL 为 0),后台任何写操作都会清空,内容不会因缓存延迟上线。
  • 图片处理管线:上传即生成 WebP 与 480/800/1200/1600 四档变体(不放大),按 EXIF 方向转正,超大像素图有上限保护。
  • 数据库索引:内容、栏目、媒体和访问日志按查询条件建立索引,列表与首页使用可命中索引的排序字段。
  • 发行清单与离线升级:核心发行包带 SHA-256 清单;bin/cms.php upgrade 会执行预检、备份、staging 校验、维护模式、迁移和独立进程健康检查。
  • 运维命令行bin/cms.php 提供 healthversionmigrate:statuscache:clearbackuprestorelog:prune
  • 备份与恢复:流式导出到文件,内存占用与库大小无关;SQLite 的索引定义一并导出。MySQL 的结构变更会隐式提交,恢复不是原子的,脚本会明确提示需要外部回滚点。
  • 自建访问统计:访问记录自行落库,不依赖第三方统计脚本;日志与统计数据的清理支持分块执行。
  • 全局异常处理:生产环境返回通用错误页并写入结构化日志,不向访客输出堆栈;调试模式显示详细错误。

规划中

以下项目尚未在当前版本中实现。

  • 任务队列与计划任务:邮件发送、分享图生成、备份与日志归档目前都是同步执行的。
  • 对象缓存接入更多热点:缓存抽象层已就位(APCu 优先、自动回退文件驱动),但目前只用于语言配置的请求级缓存。
  • 后台全局搜索、自定义角色与后台界面多语言:后台文案目前是中文硬编码,角色为内置固定集合。
  • 无障碍完善:后台与默认主题的表单标签、aria 属性和键盘可达性仍在补齐。
  • 公开 JSON API:现阶段是服务端渲染系统,后台路由属内部接口,不适合当第三方 API 使用。