四步快速上线ThinkPHP8内容管理系统:选勾股CMS脚手架、建fa_article表(含id/title/content等字段)、用php think build生成CRUD并配置菜单、启用Editor.md编辑器且分页保留筛选参数。

用ThinkPHP8快速搭建一个可上线的内容管理系统,核心不是从零写代码,而是选对脚手架、建好表结构、生成CRUD、配通菜单——四步内让后台能增删改查文章,不卡在环境配置和权限逻辑里。
选型与初始化:跳过重复造轮子
新手直接克隆勾股CMS或UlthonAdmin,二者均基于ThinkPHP8且开箱即用;FastAdmin虽成熟但底层是ThinkPHP5.1,与TP8存在兼容风险,【强行升级会导致模型验证失效、路由解析异常】。
以勾股CMS为例:执行 git clone https://gitee.com/gouguopen/gougucms.git → 进入目录运行 composer install --no-dev → 访问 /install.php 填写数据库信息完成初始化。
安装后立刻删除 install.php 文件,否则可能被恶意重装覆盖配置。
立即学习“PHP免费学习笔记(深入)”;
建表与字段设计:先定数据结构再写逻辑
创建 fa_article 表,必须包含以下字段:
id(主键,int 10)、title(varchar 200)、content(longtext)、category_id(int 10)、status(tinyint 1,默认1)、publish_time(int 10,时间戳)、create_time(int 10)。
category_id 不要用外键约束——ThinkPHP8 的关联查询在无外键时更稳定,且避免部署时因MySQL严格模式报错;status 字段值约定:0=草稿,1=已发布,2=审核中,后续权限流程依赖此字段流转。
一键生成后台模块:三步绑定功能
第一步:执行命令 php think build --controller Article --model Article --validate ArticleValidate --template admin
第二步:登录后台 → 系统 → 菜单管理 → 新增菜单 → 名称填“文章管理”,图标选 fa-file-text,父级选“内容中心”,URL 填 article/index,权限节点填 article.*
第三步:刷新页面,左侧菜单出现“文章管理”,点击即可进入列表页;若空白,检查 application/admin/controller/Article.php 中 initialize() 方法是否调用了 parent::initialize(),漏掉这句会导致权限拦截器未加载。
启用Markdown编辑器并保存富文本
方法一:后台 → 系统配置 → 编辑器类型 → 切换为 Editor.md → 保存。
方法二:手动修改 config/extra/editor.php,将 'type' => 'tinymce' 改为 'type' => 'editor_md',同时确保 public/assets/libs/editor.md/editormd.css 和 .js 文件存在。
注意:Editor.md 默认提交的是HTML字符串,若需存为Markdown源码,需在 ArticleModel 的 save() 前钩子中处理——但勾股CMS默认已开启自动转义与过滤,【直接存HTML更安全,避免前端XSS注入】。
分页链接保留筛选参数:归档页不丢条件
① 在 ArticleController 的 index 方法中,提取所有筛选参数:
$filter = array_filter([ 'cat' => input('cat/d'), 'status' => input('status/d', 1), 'year' => input('year/d') ])
② 构建 where 条件时,仅对非空 filter 键生效,例如 $map['category_id'] = ['eq', $filter['cat']];year 需转为时间范围:$map['publish_time'] = ['between', [$filter['year'].'-01-01 00:00:00', $filter['year'].'-12-31 23:59:59']]。
③ 调用 paginate() 时必须传 query 参数:->paginate(['list_rows'=>15, 'query'=>$filter]),否则翻页后 URL 丢失 cat/year/status,永远只显示第一页数据。



















