企业官网后台的核心几乎都是"内容管理"——文章发布、产品上架、案例维护、轮播图配置。看似简单的增删改查,做不好就会变成每加一种内容就要建一张表、改一堆代码的噩梦。本篇分享尧图建站团队沉淀的内容管理模块设计思路,核心是"用模型抽象应对内容多变"。
一、内容模型抽象与字段设计
初学者常犯的错误是为每种内容建独立的表:文章表、产品表、案例表。这样字段一旦调整就要改表结构,新增内容类型就要建新表,扩展性极差。成熟的思路是抽象出"内容模型"概念——模型定义字段结构,内容按模型实例化,字段用"元数据"方式存储。
具体做法是固定一张内容主表存通用字段(标题、摘要、封面、排序、状态、时间),再配一张字段表存扩展字段(按模型动态定义)。这样新增一种内容类型,只需在后台配置模型字段,无需改库结构。
-- 内容主表(通用字段)
CREATE TABLE cms_content (
id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
model_id INT UNSIGNED NOT NULL COMMENT '所属模型',
title VARCHAR(200) NOT NULL,
summary VARCHAR(500),
cover_img VARCHAR(255),
sort_order INT NOT NULL DEFAULT 0,
status TINYINT(1) NOT NULL DEFAULT 0 COMMENT '0草稿1发布',
create_time DATETIME NOT NULL,
KEY idx_model_status (model_id, status)
);
-- 扩展字段表(动态字段)
CREATE TABLE cms_field_value (
content_id BIGINT UNSIGNED NOT NULL,
field_key VARCHAR(50) NOT NULL,
field_value TEXT,
PRIMARY KEY (content_id, field_key)
);
这种 EAV(实体-属性-值)模型的代价是查询扩展字段需要 JOIN,但换来了极强的扩展性。对于企业官网这种内容类型多但单表数据量不大的场景,这个取舍是值得的。
二、栏目与分类的组织方式
内容需要归类组织,常见的有"栏目"和"标签"两种维度。栏目是树形结构(如"关于我们 > 企业文化"),适合做主导航;标签是扁平的多对多关系,适合做内容关联。两者配合,既能保证导航清晰,又能实现灵活的内容聚合。
栏目树用"邻接表 + 路径"设计:每条记录存 parent_id 和 path(如 ,1,5,12,),既能递归查询子树,又能用 LIKE ',1,%' 快速取某节点的所有后代,避免纯邻接表递归查询的性能问题。
-- 栏目树表
CREATE TABLE cms_category (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
parent_id INT UNSIGNED NOT NULL DEFAULT 0,
path VARCHAR(100) NOT NULL DEFAULT ',' COMMENT '如 ,1,5,',
name VARCHAR(50) NOT NULL,
sort_order INT NOT NULL DEFAULT 0,
KEY idx_path (path)
);
- 栏目:树形,一对一归属,用于导航与 URL 结构。
- 标签:扁平,多对多关联,用于内容聚合与相关推荐。
- 路径字段配合索引,解决树形查询性能瓶颈。
三、富文本与媒体管理
正文编辑离不开富文本编辑器。选型上,国内项目推荐 WangEditor(轻量易用)或 TinyMCE(功能强大)。关键是富文本内容里会嵌入图片,这些图片必须纳入媒体库统一管理,否则图片散落在正文 HTML 里,后期迁移或清理时无从下手。
尧图的做法是:上传图片时先入库到媒体表,再把媒体 URL 插入正文。这样每张图都有记录(所属内容、上传人、尺寸、引用次数),删除内容时可联动清理无用图片,节省存储。媒体表设计如下:
CREATE TABLE cms_media (
id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
original_name VARCHAR(200) NOT NULL,
storage_url VARCHAR(255) NOT NULL COMMENT '存储路径',
mime_type VARCHAR(50) NOT NULL,
file_size INT UNSIGNED NOT NULL,
uploader_id BIGINT UNSIGNED NOT NULL,
create_time DATETIME NOT NULL
);
把内容模型、栏目分类、媒体管理这三块设计好,一个可扩展的内容管理模块就成型了。后续无论客户要加"招聘信息""下载中心"还是"视频集",都只需在后台配置模型字段,无需开发改代码。这才是内容管理模块应有的样子——把变化留给配置,把稳定留给架构。