ThinkPHP6 项目实战案例:构建一个简单的博客系统
ThinkPHP6 是一个高效、简洁的 PHP 框架,适合快速开发 Web 应用。以下是一个基于 ThinkPHP6 的简单博客系统实战案例,涵盖项目结构、核心功能实现及关键代码示例。
一、项目需求分析
- 核心功能:
- 用户注册/登录(基于 Token 验证)。
- 发布、编辑、删除。
- 列表展示与详情页。
- 评论功能。
- 技术栈:
- 后端:ThinkPHP6 + MySQL。
- 前端:Bootstrap + jQuery(简化实现)。
- 其他:JWT(JSON Web Token)用于认证。
二、项目环境搭建
- 安装 ThinkPHP6:
composer create-project topthink/think tp6-blog
-
配置数据库:
修改config/database.php
,设置数据库连接信息:return [ 'default' => 'mysql', 'connections' => [ 'mysql' => [ 'host' => '127.0.0.1', 'database' => 'blog', 'username' => 'root', 'password' => '', 'charset' => 'utf8', 'prefix' => 'tp_', ], ], ];
-
创建数据库表:
- 用户表(
tp_users
):存储用户信息。 - 表(
tp_posts
):存储数据。 - 评论表(
tp_comments
):存储评论数据。
- 用户表(
三、核心功能实现
1. 用户认证(JWT 实现)
- 安装 JWT 扩展:
composer require firebase/php-jwt
-
生成 Token:
在用户登录成功后生成 Token:use Firebase\JWT\JWT; use Firebase\JWT\Key; $key = "your_secret_key"; $payload = [ 'iss' => 'blog.test', // 签发者 'iat' => time(), // 签发时间 'exp' => time() + 3600, // 过期时间 'uid' => $user->id, // 用户 ID ]; $token = JWT::encode($payload, $key, 'HS256'); return json(['token' => $token]);
-
验证 Token:
在需要认证的接口中验证 Token:use Firebase\JWT\JWT; use Firebase\JWT\Key; try { $decoded = JWT::decode($token, new Key($key, 'HS256')); $uid = $decoded->uid; } catch (\Exception $e) { return json(['error' => 'Token 无效'], 401); }
2. 管理
-
创建:
路由:POST /posts
public function create(Request $request) { $data = $request->post(); $validate = validate(PostValidate::class); if (!$validate->check($data)) { return json(['error' => $validate->getError()], 400); } $post = PostModel::create([ 'title' => $data['title'], 'content' => $data['content'], 'user_id' => $this->authUserId, // 从 Token 中获取的用户 ID ]); return json(['message' => '创建成功', 'post_id' => $post->id]); }
-
列表:
路由:GET /posts
public function index() { $posts = PostModel::with('user')->order('created_at', 'desc')->select(); return json($posts); }
3. 评论功能
-
添加评论:
路由:POST /comments
public function create(Request $request) { $data = $request->post(); $comment = CommentModel::create([ 'post_id' => $data['post_id'], 'user_id' => $this->authUserId, 'content' => $data['content'], ]); return json(['message' => '评论成功', 'comment_id' => $comment->id]); }
-
获取评论:
路由:GET /posts/:id/comments
public function comments($id) { $comments = CommentModel::where('post_id', $id)->with('user')->select(); return json($comments); }
四、项目目录结构
tp6-blog/
├── app/
│ ├── controller/ # 控制器
│ ├── model/ # 模型
│ ├── validate/ # 验证器
├── config/ # 配置文件
├── route/ # 路由定义
├── public/ # Web 根目录
└── vendor/ # Composer 依赖
五、关键代码示例
1. 路由定义(route/app.php
)
use think\facade\Route;
// 用户相关
Route::post('login', 'UserController@login');
Route::post('register', 'UserController@register');
// 相关
Route::post('posts', 'PostController@create');
Route::get('posts', 'PostController@index');
// 评论相关
Route::post('comments', 'CommentController@create');
Route::get('posts/:id/comments', 'CommentController@comments');
2. 模型示例(app/model/Post.php
)
namespace app\model;
use think\Model;
class Post extends Model
{
protected $autoWriteTimestamp = true;
public function user()
{
return $this->belongsTo(User::class, 'user_id', 'id');
}
public function comments()
{
return $this->hasMany(Comment::class, 'post_id', 'id');
}
}
六、与优化建议
- 功能扩展:
- 添加分页功能(如列表分页)。
- 实现标签或分类功能。
- 性能优化:
- 使用 Redis 缓存热门或评论。
- 数据库索引优化(如
user_id
、post_id
字段添加索引)。
- 安全加固:
- 防止 SQL 注入(ThinkPHP ORM 已默认防护)。
- 对用户输入进行更严格的验证。
通过以上步骤,你可以快速搭建一个基于 ThinkPHP6 的博客系统,并根据需求进一步扩展功能。