BLOG

个人网站从静态页升级到CMS的步骤

从静态页升级到 CMS,要先梳理数据模型,再迁移页面内容。

分类:PHP 全栈开发 阅读:187
个人网站从静态页升级到CMS的步骤示意图
个人网站从静态页升级到CMS的步骤示意图

静态页维护成本从哪里开始变高

静态页面的问题不是打开速度,而是每次新增内容都要改 HTML、传文件、清缓存。作品集从十个涨到三十个,文章每月更新两三篇,资源下载链接散落在不同页面里,这时候每改一次都要全局搜索相关入口,漏掉一个就出现死链。真正触发升级的节点,是“内容更新频率”超过了“页面修改效率”,而不是页面数量本身。

升级到 CMS 之前,先明确一个边界:哪些内容需要后台管理,哪些内容仍然写死在模板里。站点底部的备案号、公司地址、导航菜单这类极少变动的信息,不必强行做成后台配置项。需要进入后台的是作品条目、文章正文、下载资源、简历经历这些持续增长的数据。边界划清楚,数据表设计才不会过度膨胀。

先梳理数据模型,再写任何代码

静态页面里的每一条内容,对应到 CMS 中都是一条记录。手工整理一份字段清单,比直接建表更可靠。把现有页面逐个打开,记录每个内容块包含哪些信息。一篇博客文章通常有标题、发布日期、正文、分类、标签、封面图;一个作品条目可能有名称、完成时间、所用技术、项目链接、展示图多张、文字描述。把这些字段列出来,标出哪些是必填、哪些可空、哪些需要重复出现。

字段清单完成后,再设计数据表。常见做法是每类内容一张表,字段对应清单中的项目。多图字段不要用逗号分隔存在一个文本列里,单独建一张图片表,用外键关联内容 ID,后续做排序和筛选都方便。分类和标签用独立的表存储,内容表只存分类 ID,避免修改分类名称时还要批量更新内容记录。

PHP 处理逻辑上,后台提交表单后先做数据校验,再写入数据库。校验包括必填项是否为空、日期格式是否正确、URL 是否合法。写入操作用预处理语句绑定参数,防止 SQL 注入。下面是一个简化示例,展示新增一篇博客文章时的处理顺序:

```php
// 假设表单通过 POST 提交,字段包括 title、content、category_id
$title = trim($_POST['title'] ?? '');
$content = trim($_POST['content'] ?? '');
$categoryId = (int)($_POST['category_id'] ?? 0);

$errors = [];
if ($title === '') {
$errors[] = '标题不能为空';
}
if ($content === '') {
$errors[] = '正文不能为空';
}
if ($categoryId <= 0) {
$errors[] = '请选择分类';
}

if (!empty($errors)) {
// 将错误信息返回给表单页面显示
foreach ($errors as $error) {
echo '<p>' . htmlspecialchars($error, ENT_QUOTES, 'UTF-8') . '</p>';
}
exit;
}

$pdo = new PDO('mysql:host=localhost;dbname=your_db;charset=utf8mb4', 'user', 'pass');
$stmt = $pdo->prepare('INSERT INTO articles (title, content, category_id, created_at) VALUES (?, ?, ?, NOW())');
$stmt->execute([$title, $content, $categoryId]);
```

这段代码的核心是:先收集错误、再执行写入。实际项目中错误信息应集中显示在表单顶部,而不是逐条 echo。写入成功后用 header 跳转到文章列表页,避免刷新页面重复提交。

后台增删改查的检查顺序

数据表建好之后,先做后台的文章列表页和管理表单,再做前台展示。列表页要支持按分类筛选、按标题搜索、分页显示。管理表单的编辑操作要回填已有数据,下拉框选中当前分类。删除操作建议用软删除,即在表中增加 deleted_at 字段,列表查询默认过滤掉已删除记录。硬删除一旦误操作,内容无法恢复。

每完成一个模块,要实际走一遍完整流程:新增一条记录,去前台确认能显示;编辑这条记录,确认前台内容同步变化;删除这条记录,确认前台不再出现。三个操作都通过,这个模块才算完成。

前台读取数据的逻辑比后台简单,但容易出错的地方在 URL 参数处理。文章详情页通常通过 article.php?id=3 这样的地址访问,PHP 端要先验证 id 参数是否存在且为整数,再查询数据库。查不到记录时要返回 404 状态码,而不是显示一个空白页面。代码逻辑如下:

```php
$id = (int)($_GET['id'] ?? 0);
if ($id <= 0) {
http_response_code(404);
exit('文章不存在');
}

$stmt = $pdo->prepare('SELECT * FROM articles WHERE id = ? AND deleted_at IS NULL');
$stmt->execute([$id]);
$article = $stmt->fetch();

if (!$article) {
http_response_code(404);
exit('文章不存在');
}
```

迁移时容易遗漏的三类问题

第一类是图片和附件路径。静态页面中图片引用的是相对路径如 images/xxx.jpg,迁移到 CMS 后,图片可能由后台上传并存储在 uploads 目录中。如果前台模板仍然写死旧路径,新内容无法显示,旧内容路径又可能因为目录结构调整而失效。处理办法是上传图片时把实际存储路径写入数据库,前台通过数据读取路径,不在模板中拼写固定目录。

第二类是 SEO 信息没有跟着内容走。静态页面的 title 和 meta description 写死在 HTML 头部,CMS 化之后需要从数据库读取。文章表应增加 seo_title 和 seo_description 字段,前台模板动态输出。如果省略这一步,所有页面共用同一个站点标题,搜索引擎看到的每个页面都是重复信息。

第三类是权限控制。后台管理页面不能只靠隐藏入口来保护,要在 PHP 端判断登录状态。每个管理操作都要检查当前用户是否有权限执行。常见的做法是用户表存角色字段,管理端入口先验证 session 中的登录状态,再根据角色判断是否允许访问。写一个简单的检查函数,在管理页面的开头调用:

```php
session_start();

function require_login(): void {
if (empty($_SESSION['user_id'])) {
header('Location: /admin/login.php');
exit;
}
}

function require_admin(): void {
require_login();
if (($_SESSION['role'] ?? '') !== 'admin') {
http_response_code(403);
exit('没有权限执行此操作');
}
}
```

每个管理页面的 PHP 文件顶部调用 require_admin(),确保未登录用户和普通用户都无法进入。

升级完成后的验收方式

CMS 化改造是否成功,不看后台界面是否漂亮,看三条链路是否完整。第一条是内容发布链路:在后台新增一篇带图片的文章,前台能正确显示标题、正文和图片。第二条是内容修改链路:编辑文章标题后,前台页面标题同步变化,旧地址仍然能访问。第三条是异常处理链路:删除一篇文章后,前台访问该文章地址返回 404 或跳转到列表页,而不是出现数据库报错信息。

另外要检查后台操作是否留下记录。日志表记录谁在什么时间新增、修改、删除了哪条内容,出问题时能定位操作来源。日志不需要记录每一次页面浏览,只记录写操作即可。

升级过程中保留一份静态页面的完整备份,CMS 上线后先在一台测试环境跑通全部流程,再切换正式域名。切换后保留旧静态页面一段时间,确认没有访问异常再清理。后续如果要继续扩展,可以把首页的轮播图、公告栏、友情链接也拆成后台可配置项,但每次只拆一个模块,测试通过后再拆下一个。

评论

登录后可发表评论。