互联网数据库开发课程大作业 | Yii2 Advanced + Vue3 前后端分离架构
本项目是为纪念中国人民抗日战争暨世界反法西斯战争胜利80周年而开发的主题网站,采用 Yii2 Advanced 模板 + Vue3 前后端分离架构,旨在通过现代Web技术展示抗战历史、缅怀英烈、传承红色基因。
2025年是中国人民抗日战争暨世界反法西斯战争胜利80周年。通过构建这个纪念网站,我们希望让更多人了解那段艰苦卓绝的抗战历史,铭记民族英雄的丰功伟绩。
项目采用 Yii2 Advanced + Vue3 标准前后端分离架构:
backend-yii2/- Yii2 Advanced 后端(API 服务 + 后台管理)frontend-vue/- Vue3 前端项目data/- 数据库文件和项目文档
- 框架: Vue 3.x
- 路由: Vue Router
- 状态管理: Pinia / Vuex
- HTTP库: Axios
- UI框架: Element Plus (可选)
- 构建工具: Vite
- 框架: Yii2 Advanced Template
- 数据库: MySQL 8.0
- API: RESTful API
- 认证: JWT
前端 (Vue3) ←─── HTTP/JSON ───→ 后端 (Yii2) ←─── SQL ───→ 数据库 (MySQL)
Web-Database-Development/
│
├── backend-yii2/ # Yii2 Advanced 后端 ⭐
│ ├── frontend/ # API 服务层
│ │ ├── controllers/ # API 控制器
│ │ │ └── ApiController.php # 主 API 控制器
│ │ ├── config/ # API 配置
│ │ └── web/ # API 入口 (localhost:8080)
│ ├── backend/ # 后台管理系统
│ ├── common/ # 公共代码(前后台共享)
│ │ ├── models/ # 数据模型(10+张表)
│ │ │ ├── User.php
│ │ │ ├── HistoryEvent.php
│ │ │ ├── Hero.php
│ │ │ ├── Gallery.php
│ │ │ ├── TeamMember.php
│ │ │ ├── Comment.php
│ │ │ ├── Article.php
│ │ │ ├── Video.php
│ │ │ ├── Statistics.php
│ │ │ ├── Admin.php
│ │ │ └── Memorial.php
│ │ └── config/ # 公共配置(数据库等)
│ ├── console/ # 命令行工具
│ ├── environments/ # 环境配置(dev/prod)
│ ├── vendor/ # Composer 依赖
│ ├── composer.json # Yii2 依赖配置
│ └── README.md # 后端文档
│
├── frontend-vue/ # Vue3 前端项目 ⭐
│ ├── src/
│ │ ├── api/ # API 接口封装
│ │ ├── assets/ # 静态资源(CSS/图片/视频)
│ │ ├── components/ # 公共组件
│ │ │ ├── NavBar.vue
│ │ │ ├── WaveFoot.vue
│ │ │ └── ...
│ │ ├── views/ # 页面视图(7个主页面)
│ │ │ ├── HomeView.vue # 首页
│ │ │ ├── HistoryView.vue # 历史资料
│ │ │ ├── HeroView.vue # 英雄人物
│ │ │ ├── GalleryView.vue # 图片/视频库
│ │ │ ├── TeamView.vue # 团队展示
│ │ │ ├── CommentView.vue # 互动留言
│ │ │ ├── StatisticsView.vue # 数据统计
│ │ │ └── LoginView.vue # 登录注册
│ │ ├── router/ # 路由配置
│ │ ├── App.vue # 根组件
│ │ └── main.js # 入口文件
│ ├── public/ # 静态资源
│ ├── package.json # 前端依赖配置
│ ├── vite.config.js # Vite 构建配置
│ └── start-frontend.ps1 # 启动脚本
│
├── data/ # 项目数据 ⭐
│ ├── install/ # 数据库安装文件
│ │ └── install.sql # 数据库初始化脚本(10+张表)
│ ├── raw_data/ # 原始数据文件
│ │ ├── article.csv
│ │ ├── hero.csv
│ │ ├── hisroty_event.csv
│ │ ├── import_raw.sql
│ │ ├── photo.csv
│ │ ├── test_photo.py
│ │ ├── test.py
│ │ └── video.csv
│ └── import_data.sql # 数据导入脚本
│
├── report/ # 项目报告 ⭐
│ ├── deploy/ # 部署文档
│ ├── design/ # 设计文档
│ ├── implementation/ # 实现文档
│ ├── requirements/ # 需求文档
│ ├── slide/ # 项目演示文稿
│ ├── UserManual/ # 用户手册
│ ├── videos/ # 演示视频
│ └── individualAssignment/ # 个人作业
│ ├── 作业(2310364_柳昕彤).zip
│ ├── 作业(2310428_韩琦卓).zip
│ ├── 作业(2311605_王为).zip
│ ├── 作业(2312309_祝铭堃).zip
│ └── 作业(2312314_李政霖).zip
│
├── scripts/ # 脚本工具
│ └── import_raw_data.py # 数据导入脚本
│
├── README.md # 项目总文档(本文件)
└── INSTALL.md # 快速安装指南
使用项目根目录的 deploy-docker.sh 脚本完成全自动部署:
chmod +x deploy-docker.sh
./deploy-docker.sh注意需要修改脚本中的 MySQL 密码为你自己的密码。
DATA_COUNT=$(docker-compose exec -T mysql mysql -uroot -p<你的密码> war_memorial -se "SELECT COUNT(*) FROM hero;" 2>/dev/null | tail -1)脚本执行流程:
- ✅ 检查 Docker 和 Docker Compose 环境
- 📦 安装前端依赖 (npm install)
- 🏗️ 构建前端生产版本 (npm run build)
- 🐳 启动 Docker 容器 (docker-compose up -d)
- ⏳ 等待 MySQL 数据库就绪 (健康检查)
- 🔧 配置后端数据库连接
- 📊 导入初始数据和示例数据
部署完成后访问:
- 前端页面: http://localhost
- 后端 API: http://localhost:8080
- 健康检查: http://localhost:8080/health
数据库凭据在 docker-compose.yml 中定义:
environment:
MYSQL_ROOT_PASSWORD: zxc7777777
MYSQL_DATABASE: war_memorial
MYSQL_USER: war_user
MYSQL_PASSWORD: war_pass后端配置文件会在部署时自动生成到 backend-yii2/common/config/main-local.php:
return [
'components' => [
'db' => [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=mysql;dbname=war_memorial',
'username' => 'war_user',
'password' => 'war_pass',
'charset' => 'utf8mb4',
],
'redis' => [
'class' => 'yii\redis\Connection',
'hostname' => 'redis',
'port' => 6379,
'database' => 0,
],
],
];在 docker-compose.yml 中可自定义环境变量:
php:
environment:
- DB_HOST=mysql
- DB_NAME=war_memorial
- DB_USER=war_user
- DB_PASS=war_pass
- REDIS_HOST=redis- PHP: 8.0+ (推荐 8.4)
- MySQL: 8.0+
- Node.js: 16+ (推荐 18+)
- Composer: 最新版本
- 开发工具: VS Code / PhpStorm
git clone https://github.com/DarkMatter-Gra/Web-Database-Development.git
cd Web-Database-Developmentcd backend-yii2
composer install如果 Composer 速度慢,可配置国内镜像:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/创建/编辑 backend-yii2/common/config/main-local.php:
<?php
return [
'components' => [
'db' => [
'class' => \yii\db\Connection::class,
'dsn' => 'mysql:host=localhost;port=3306;dbname=war_memorial',
'username' => 'root',
'password' => '你的MySQL密码',
'charset' => 'utf8mb4',
],
'mailer' => [
'class' => \yii\symfonymailer\Mailer::class,
'viewPath' => '@common/mail',
'useFileTransport' => true,
],
],
];方式一:
# 创建数据库
mysql -u root -p -e "CREATE DATABASE IF NOT EXISTS war_memorial CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
# 导入基础表结构
mysql -u root -p war_memorial < data/install/install.sql
# 导入数据
cd data/raw_data
mysql -u root -p war_memorial --default-character-set=utf8mb4 < import_raw.sql方式二:使用 MySQL 命令行
-- 1. 登录 MySQL
mysql -u root -p
-- 2. 创建数据库
CREATE DATABASE war_memorial CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 3. 使用数据库
USE war_memorial;
-- 4. 导入表结构
SOURCE D:/path/to/Web-Database-Development/data/install/install.sql;
-- 5. 导入数据
SOURCE D:/path/to/Web-Database-Development/data/raw_data/import_raw.sql;
cd backend-yii2/frontend/web
php -S localhost:8080或使用启动脚本:
.\backend-yii2\start-api.ps1验证后端:访问 http://localhost:8080/api/statistics 应返回 JSON 数据。
cd frontend-vue
npm install如果 npm 速度慢,可配置淘宝镜像:
npm config set registry https://registry.npmmirror.com检查 frontend-vue/src/api/http.js 中的 API 地址:
const http = axios.create({
baseURL: 'http://localhost:8080/api', // 确保与后端地址一致
timeout: 10000,
})npm run dev或使用启动脚本:
.\start-frontend.ps1访问前端:打开浏览器访问 http://localhost:6262
采用响应式布局设计,通过抗战主题轮播图展示重要历史图片,配合纪念活动公告板实时发布相关信息,提供快速导航入口让用户便捷访问各个功能模块。
以时间轴形式展示 44 个抗战重大历史事件,支持按时期分类筛选(全面抗战、战略反攻等),点击事件卡片可弹出详情模态框查看完整信息。所有数据从后端 API 动态加载,确保内容的实时性和准确性。
展示 19 位抗战英雄人物的生平事迹,提供分类筛选和分页加载功能优化浏览体验。每位英雄都有独立的详情页面,通过 API 对接从数据库实时获取英雄信息,包括生平简介、主要战绩等内容。
采用瀑布流布局展示珍贵历史照片,集成 B站、YouTube 等平台的纪录影像资源。支持图片灯箱预览和左右切换浏览,视频可全屏播放,为用户提供沉浸式的历史影像体验。
实时展示网站统计数据,包括历史文章数量、抗战英雄数量、珍贵影像数量和互动留言数量。同时展示固定的历史数据,如抗战时期中日双方的兵力对比可视化图表,以及抗战胜利的重大意义阐述。
提供用户留言发布和浏览功能,采用分页加载方式展示历史留言。集成用户认证系统,确保留言的真实性和可追溯性,增强用户互动体验。
展示项目开发团队 5 位成员的详细信息,包括姓名、学号、角色职责和技术栈标签,并提供 GitHub 个人主页链接,便于了解团队构成和技术背景。
实现完整的用户注册和登录功能,采用 JWT Token 进行身份认证和会话管理。表单包含完善的验证机制,确保数据安全性和用户体验。
用户认证
POST /api/signup- 用户注册POST /api/login- 用户登录
历史资料
GET /api/history-events- 获取历史事件列表(支持分页)GET /api/articles- 获取文章列表(支持分页)
英雄人物
GET /api/heroes- 获取英雄列表(支持分类、分页)GET /api/heroes/{id}- 获取英雄详情
多媒体资源
GET /api/gallery- 获取图片/视频库GET /api/videos- 获取视频列表(支持分页)
互动功能
GET /api/comments- 获取留言列表(支持分页)POST /api/comments- 发布留言
数据统计
GET /api/statistics- 获取统计数据(缓存 10 分钟)
- ✅ JWT 身份认证
- ✅ CORS 跨域配置
- ✅ Redis 缓存支持
- ✅ 统一响应格式
- ✅ 错误处理机制
- ✅ 请求日志记录
- ✅ 分页功能封装
- ✅ SQL 注入防护
已创建并填充数据的表:
| 表名 | 记录数 | 说明 |
|---|---|---|
| user | - | 用户表(含密码加密) |
| admin | - | 管理员表 |
| article | 32 | 文章表(抗战资讯) |
| history_event | 44 | 历史事件表(时间轴数据) |
| hero | 19 | 英雄人物表 |
| photo | - | 照片库表 |
| video | 4 | 视频表 |
| comment | - | 评论留言表 |
| category | - | 分类表 |
| statistic | - | 统计表 |
| setting | - | 系统设置表 |
| log | - | 操作日志表 |
| memorial | - | 纪念馆表 |
| team_member | - | 团队成员表 |
本项目由 5 人团队开发,采用全栈 MVC 模式,每人负责一个完整的业务模块:
| 成员 | 学号 | 角色 | 核心职责 | 模块任务 |
|---|---|---|---|---|
| 柳昕彤 | 2310364 | 组长 / 前端架构 Owner | Vue3 搭建、路由配置、公共组件、视频录制 | 首页/资讯展示模块 |
| 祝铭堃 | 2312309 | 交互逻辑 Owner | Axios 封装、Pinia 状态管理、工具库 | 留言/评论模块 |
| 王为 | 2311605 | 后端架构 Owner | Yii2 搭建、Redis 缓存、JWT 认证 | 用户/权限模块 |
| 李政霖 | 2312314 | 数据库 Owner | ER 图设计、SQL 优化、触发器 | 核心资料/历史档案模块 |
| 韩琦卓 | 2310428 | 测试/运维 Owner | 爬虫脚本、文档编写、集成测试 | 爬虫数据管理模块 |
本项目仅供学习交流使用,请勿用于商业用途。
- 检查 PHP 版本 >= 8.0
- 使用国内镜像:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ - 删除
vendor目录重试
- 检查 MySQL 服务是否启动
- 确认
main-local.php中的用户名、密码 - 确认数据库名为
war_memorial - 检查字符集为
utf8mb4
- 检查 Node.js 版本 >= 16
- 使用淘宝镜像:
npm config set registry https://registry.npmmirror.com - 删除
node_modules和package-lock.json重试
- 确认后端在 http://localhost:8080 运行
- 检查
ApiController.php中的 CORS 配置 - 前端 API 地址应为
http://localhost:8080/api
- 检查数据库是否导入成功
- 验证 API 接口返回:访问 http://localhost:8080/api/statistics
- 查看浏览器控制台是否有错误
- 检查网络请求是否成功
- 项目仓库: GitHub
- 问题反馈: 提交 Issue
- 技术交流: 查看 Wiki
最后更新: 2025年12月14日