功能
本页说明当前版本已经实现的功能,并在末尾单独列出尚未完成的规划项目。
部署与运行
运行环境需要 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.head、theme.footer、content.created、content.updated、user.login、message.received、cache.flushed;过滤器content.render、admin.menu、security.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提供health、version、migrate:status、cache:clear、backup、restore、log:prune。 - 备份与恢复:流式导出到文件,内存占用与库大小无关;SQLite 的索引定义一并导出。MySQL 的结构变更会隐式提交,恢复不是原子的,脚本会明确提示需要外部回滚点。
- 自建访问统计:访问记录自行落库,不依赖第三方统计脚本;日志与统计数据的清理支持分块执行。
- 全局异常处理:生产环境返回通用错误页并写入结构化日志,不向访客输出堆栈;调试模式显示详细错误。
规划中
以下项目尚未在当前版本中实现。
- 任务队列与计划任务:邮件发送、分享图生成、备份与日志归档目前都是同步执行的。
- 对象缓存接入更多热点:缓存抽象层已就位(APCu 优先、自动回退文件驱动),但目前只用于语言配置的请求级缓存。
- 后台全局搜索、自定义角色与后台界面多语言:后台文案目前是中文硬编码,角色为内置固定集合。
- 无障碍完善:后台与默认主题的表单标签、aria 属性和键盘可达性仍在补齐。
- 公开 JSON API:现阶段是服务端渲染系统,后台路由属内部接口,不适合当第三方 API 使用。