这个方案不仅仅是一堆代码文件,更是一个完整的项目结构、技术选型、核心功能模块和代码示例,您可以基于此进行二次开发,快速搭建一个专业的传媒公司网站。

项目概述与技术选型
一个现代化的传媒公司网站,需要展示案例、服务团队、新闻动态,并具备良好的用户体验和SEO优化。
- 项目名称: MediaCorp CMS (传媒公司内容管理系统)
- 核心理念: 模块化、易于扩展、SEO友好、响应式设计。
- 技术栈:
- 后端: PHP 8.0+
- 前端: HTML5, CSS3, JavaScript (原生 + jQuery)
- CSS框架: Bootstrap 5 - 快速构建响应式布局。
- 数据库: MySQL 8.0+
- 核心依赖:
- PDO: 用于数据库操作,安全且高效。
- Composer: 用于管理第三方PHP库(如图片处理、邮件发送等)。
- Twig: 模板引擎,实现前后端分离,代码更安全、更易维护。
项目目录结构
一个清晰的项目结构是良好开发习惯的开始。
mediacorp-cms/
├── app/ # 应用核心代码
│ ├── Controllers/ # 控制器 - 处理业务逻辑
│ │ ├── HomeController.php
│ │ ├── AboutController.php
│ │ ├── ServiceController.php
│ │ ├── PortfolioController.php
│ │ ├── NewsController.php
│ │ └── ContactController.php
│ ├── Models/ # 模型 - 处理数据库交互
│ │ ├── BaseModel.php
│ │ ├── NewsModel.php
│ │ ├── PortfolioModel.php
│ │ └── ContactModel.php
│ └── Core/ # 核心类库
│ ├── Database.php # 数据库连接与查询封装
│ ├── Router.php # 简单的路由分发器
│ └── Config.php # 配置文件加载
│
├── public/ # Web服务器根目录
│ ├── index.php # 单一入口文件
│ ├── assets/ # 静态资源
│ │ ├── css/
│ │ │ └── style.css # 自定义样式
│ │ ├── js/
│ │ │ └── main.js # 自定义JS
│ │ └── images/ # 上传的图片、Logo等
│ │
├── templates/ # Twig模板文件
│ ├── layouts/ # 布局模板
│ │ └── base.html.twig
│ ├── partials/ # 公共组件
│ │ ├── header.html.twig
│ │ ├── footer.html.twig
│ │ └── navigation.html.twig
│ ├── index.html.twig # 首页
│ ├── about.html.twig # 关于我们
│ ├── services.html.twig # 服务
│ ├── portfolio.html.twig # 案例
│ ├── news.html.twig # 新闻
│ ├── news_detail.html.twig # 新闻详情
│ └── contact.html.twig # 联系我们
│
├── vendor/ # Composer依赖
├── uploads/ # 文件上传目录 (需设置777权限)
│ ├── portfolio/
│ └── news/
├── .env # 环境变量配置 (数据库信息等)
├── composer.json # Composer依赖管理文件
└── README.md # 项目说明文档
核心代码示例
数据库配置与连接 (app/Core/Database.php)
使用PDO进行安全的数据库连接。
<?php
// app/Core/Database.php
namespace App\Core;
use PDO;
use PDOException;
class Database {
private static $instance = null;
private $pdo;
private function __construct() {
// 从环境变量读取配置
$host = $_ENV['DB_HOST'];
$db = $_ENV['DB_NAME'];
$user = $_ENV['DB_USER'];
$pass = $_ENV['DB_PASS'];
$charset = 'utf8mb4';
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
];
try {
$this->pdo = new PDO($dsn, $user, $pass, $options);
} catch (PDOException $e) {
throw new PDOException($e->getMessage(), (int)$e->getCode());
}
}
public static function getInstance() {
if (self::$instance === null) {
self::$instance = new self();
}
return self::$instance;
}
public function getConnection() {
return $this->pdo;
}
}
模型示例 (app/Models/PortfolioModel.php)
模型负责与数据库交互,获取数据。

<?php
// app/Models/PortfolioModel.php
namespace App\Models;
use App\Core\Database;
class PortfolioModel {
public function getAll() {
$db = Database::getInstance()->getConnection();
$stmt = $db->query("SELECT id, title, description, image_url FROM portfolios ORDER BY created_at DESC");
return $stmt->fetchAll();
}
public function getById($id) {
$db = Database::getInstance()->getConnection();
$stmt = $db->prepare("SELECT * FROM portfolios WHERE id = ?");
$stmt->execute([$id]);
return $stmt->fetch();
}
}
控制器示例 (app/Controllers/PortfolioController.php)
控制器调用模型获取数据,并加载相应的模板进行渲染。
<?php
// app/Controllers/PortfolioController.php
namespace App\Controllers;
use App\Models\PortfolioModel;
use App\Core\Router;
class PortfolioController {
public function index() {
$portfolioModel = new PortfolioModel();
$portfolios = $portfolioModel->getAll();
// 加载模板并传递数据
echo Router::getTwig()->render('portfolio.html.twig', [
'portfolios' => $portfolios,
'page_title' => '成功案例'
]);
}
public function detail($id) {
$portfolioModel = new PortfolioModel();
$portfolio = $portfolioModel->getById($id);
if (!$portfolio) {
// 处理404错误
http_response_code(404);
echo "案例未找到";
return;
}
echo Router::getTwig()->render('portfolio_detail.html.twig', [
'portfolio' => $portfolio,
'page_title' => $portfolio['title']
]);
}
}
路由分发 (app/Core/Router.php)
一个简单的路由器,根据URL调用不同的控制器和方法。
<?php
// app/Core/Router.php
namespace App\Core;
class Router {
private static $twig;
public static function init() {
// 初始化Twig
$loader = new \Twig\Loader\FilesystemLoader(__DIR__ . '/../templates');
self::$twig = new \Twig\Environment($loader, [
'cache' => false, // 生产环境应设置为 'path/to/cache'
'debug' => true,
]);
// 加载.env文件
$dotenv = \Dotenv\Dotenv::createImmutable(__DIR__ . '/../');
$dotenv->load();
}
public static function getTwig() {
return self::$twig;
}
public static function dispatch() {
self::init();
// 获取当前路径
$uri = trim(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH), '/');
// 定义路由规则
$routes = [
'/' => ['App\Controllers\HomeController', 'index'],
'about' => ['App\Controllers\AboutController', 'index'],
'services' => ['App\Controllers\ServiceController', 'index'],
'portfolio' => ['App\Controllers\PortfolioController', 'index'],
'portfolio/(\d+)' => ['App\Controllers\PortfolioController', 'detail'], // 捕获ID
'news' => ['App\Controllers\NewsController', 'index'],
'news/(\d+)' => ['App\Controllers\NewsController', 'detail'], // 捕获ID
'contact' => ['App\Controllers\ContactController', 'index'],
];
foreach ($routes as $route => $action) {
// 将路由规则转换为正则表达式
$pattern = preg_replace('/\((\w+)\)/', '(\d+)', $route);
$pattern = "#^{$pattern}$#";
if (preg_match($pattern, $uri, $matches)) {
// 获取控制器和方法
list($controllerName, $methodName) = $action;
// 实例化控制器
$controller = new $controllerName();
// 如果有捕获的参数,传递给方法
if (isset($matches[1])) {
$controller->$methodName($matches[1]);
} else {
$controller->$methodName();
}
return;
}
}
// 未找到路由,返回404
http_response_code(404);
echo self::$twig->render('404.html.twig');
}
}
单一入口文件 (public/index.php)
所有请求都指向这个文件,由它来启动应用。
<?php
// public/index.php
// 设置根目录
define('ROOT_PATH', dirname(__DIR__));
// 自动加载类
require_once ROOT_PATH . '/vendor/autoload.php';
// 启动应用并分发路由
App\Core\Router::dispatch();
模板示例 (templates/portfolio.html.twig)
使用Twig模板引擎,语法清晰,安全。

<!-- templates/portfolio.html.twig -->
{% extends "layouts/base.html.twig" %}
{% block content %}
<section class="page-section portfolio" id="portfolio">
<div class="container">
<div class="text-center">
<h2 class="section-heading text-uppercase">{{ page_title }}</h2>
<h3 class="section-subheading text-muted">我们引以为傲的成果</h3>
</div>
<div class="row">
{% for portfolio in portfolios %}
<div class="col-lg-4 col-sm-6 mb-4">
<div class="portfolio-item">
<a class="portfolio-link" href="/portfolio/{{ portfolio.id }}">
<div class="portfolio-hover">
<div class="portfolio-hover-content"><i class="fas fa-plus fa-3x"></i></div>
</div>
<img class="img-fluid" src="{{ portfolio.image_url }}" alt="{{ portfolio.title }}">
</a>
<div class="portfolio-caption">
<div class="portfolio-caption-heading">{{ portfolio.title }}</div>
<div class="portfolio-caption-subheading text-muted">{{ portfolio.description }}</div>
</div>
</div>
</div>
{% else %}
<p>暂无案例。</p>
{% endfor %}
</div>
</div>
</section>
{% endblock %}
核心功能模块说明
-
首页模块
- 功能: 公司Slogan、核心服务概览、精选案例轮播、团队风采、新闻动态摘要。
- 实现:
HomeController从PortfolioModel和NewsModel获取数据,渲染到首页模板。
-
关于我们模块
- 功能: 公司简介、发展历程、企业文化、组织架构。
- 实现: 一个静态页面,内容可在数据库或模板中直接配置。
-
服务模块
- 功能: 分类展示公司的核心业务,如品牌策划、视频制作、数字营销等,每个服务配有详细描述和图标。
- 实现:
ServiceController从数据库读取服务列表,前端以卡片或网格形式展示。
-
案例展示模块
- 功能: 以网格或瀑布流形式展示公司完成的项目,点击可进入详情页,查看项目介绍、图片、视频和客户评价。
- 实现:
PortfolioController和PortfolioModel是核心,详情页通过URL中的ID查询特定案例。
-
新闻/博客模块
- 功能: 展示公司新闻、行业洞察或博客文章,支持列表页和详情页。
- 实现:
NewsController和NewsModel,后台可添加文章,系统自动生成URL,利于SEO。
-
联系我们模块
- 功能: 显示公司地址、电话、邮箱、地图,提供在线表单,方便潜在客户留言。
- 实现:
ContactController处理表单提交,表单数据应进行验证和过滤,防止垃圾信息,可集成邮件库(如PHPMailer)发送邮件通知。
部署与扩展建议
-
部署:
- 将
public目录作为Web服务器的根目录。 - 配置Web服务器(如Apache/Nginx)的URL重写,所有请求都指向
public/index.php。 - 创建
.env文件,填入您的数据库信息。 - 确保服务器安装了PHP 8.0+ 和MySQL 8.0+。
- 运行
composer install安装依赖。
- 将
-
扩展:
- 后台管理系统: 这是最大的扩展点,可以使用成熟的PHP后台框架如Laravel、Symfony或ThinkPHP来快速构建一个功能强大的后台,用于管理网站内容、案例、新闻等。
- 多语言支持: 在数据库和模板层面增加语言字段,实现国际化。
- SEO优化: 为每个页面设置唯一的
<title>、<meta description>和<meta keywords>,生成sitemap.xml。 - 性能优化: 启用OPcache,对Twig模板进行缓存,使用CDN加速静态资源。
这份源码方案为您提供了一个坚实的基础,您可以根据公司的具体需求,选择性地实现或修改这些模块,打造一个专业、高效且易于维护的传媒公司网站。
