实战案例:使用 ThinkPHP 开发博客与电商系统
本教程通过实战案例,详细讲解如何使用 ThinkPHP 开发博客与电商系统。您将学习博客系统的用户注册、文章发布、评论与点赞功能的实现,以及电商系统的商品展示、购物车、订单管理和支付功能。同时,本案例涵盖数据库设计与优化、RESTful API 开发、前后端接口对接及角色与权限管理等内容,帮助您深入理解 ThinkPHP 在实际项目中的应用。
1. 搭建一个简单的博客系统
功能需求
- 用户注册、登录、发布文章、评论、点赞等基本功能
- 实现用户权限控制和角色管理
- 文章搜索与标签功能
项目结构
├── application
│ ├── admin # 后台管理模块
│ ├── index # 前端展示模块
│ ├── common # 公共模块
├── config # 配置文件
├── public # 前端入口文件
└── runtime # 缓存和日志目录
1.1 用户注册与登录
- 数据库设计:首先设计用户表(
user表)存储用户信息。
CREATE TABLE user (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
password VARCHAR(255) NOT NULL,
email VARCHAR(100) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
- 用户注册:用户提交注册表单,系统对用户输入的信息进行验证,成功后将用户信息存入数据库。
public function register() {
$data = input('post.');
$validate = \think\facade\Validate::make([
'username' => 'require|max:25',
'password' => 'require|min:6',
'email' => 'email',
]);
if (!$validate->check($data)) {
return json(['error' => $validate->getError()]);
}
// 加密密码
$data['password'] = password_hash($data['password'], PASSWORD_BCRYPT);
$user = new \app\model\User();
$user->save($data);
return json(['message' => '注册成功']);
}
- 用户登录:用户登录时,通过输入用户名和密码进行验证。
public function login() {
$data = input('post.');
// 查找用户
$user = \app\model\User::where('username', $data['username'])->find();
if (!$user || !password_verify($data['password'], $user->password)) {
return json(['error' => '用户名或密码错误']);
}
// 登录成功,生成 Token
$token = jwt_encode($user->id); // 使用 JWT 生成令牌
return json(['token' => $token]);
}
1.2 发布文章与评论
- 文章发布:文章表(
posts)存储文章内容,用户可以通过后台发布文章。
CREATE TABLE posts (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL,
content TEXT NOT NULL,
user_id INT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
发布文章控制器:
public function publish() {
$data = input('post.');
$validate = \think\facade\Validate::make([
'title' => 'require|max:255',
'content' => 'require',
]);
if (!$validate->check($data)) {
return json(['error' => $validate->getError()]);
}
$data['user_id'] = session('user_id'); // 当前登录用户ID
$post = new \app\model\Post();
$post->save($data);
return json(['message' => '文章发布成功']);
}
- 评论功能:评论表(
comments)存储评论内容,关联用户和文章。
CREATE TABLE comments (
id INT AUTO_INCREMENT PRIMARY KEY,
post_id INT NOT NULL,
user_id INT NOT NULL,
content TEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
发布评论:
public function comment() {
$data = input('post.');
$validate = \think\facade\Validate::make([
'post_id' => 'require|integer',
'content' => 'require',
]);
if (!$validate->check($data)) {
return json(['error' => $validate->getError()]);
}
$data['user_id'] = session('user_id'); // 当前登录用户ID
$comment = new \app\model\Comment();
$comment->save($data);
return json(['message' => '评论成功']);
}
1.3 点赞功能
文章点赞表(likes)用于存储用户对文章的点赞行为。
CREATE TABLE likes (
id INT AUTO_INCREMENT PRIMARY KEY,
post_id INT NOT NULL,
user_id INT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
点赞操作:
public function like() {
$data = input('post.');
$like = \app\model\Like::where('post_id', $data['post_id'])->where('user_id', session('user_id'))->find();
if ($like) {
return json(['message' => '已经点赞过']);
}
$like = new \app\model\Like();
$like->save($data);
return json(['message' => '点赞成功']);
}
1.4 用户权限控制和角色管理
角色管理表(roles)存储不同的用户角色,权限表(permissions)存储角色对应的权限。
CREATE TABLE roles (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL
);
CREATE TABLE permissions (
id INT AUTO_INCREMENT PRIMARY KEY,
role_id INT NOT NULL,
permission VARCHAR(50) NOT NULL
);
通过权限控制实现不同角色的访问控制(如管理员可以管理所有文章,普通用户只能发布和评论文章)。
1.5 文章搜索与标签功能
为文章添加标签,通过关联表(post_tags)存储文章与标签的关系。
CREATE TABLE tags (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL
);
CREATE TABLE post_tags (
post_id INT NOT NULL,
tag_id INT NOT NULL
);
文章搜索功能:
public function search() {
$keyword = input('get.keyword');
$posts = \app\model\Post::where('title', 'like', "%$keyword%")->select();
return json(['posts' => $posts]);
}
2. 实现一个电商系统
功能需求
- 商品展示、分类、购物车、订单、支付等功能
- 数据库存储设计与优化
- API 和前端接口对接
项目结构
├── application
│ ├── admin # 后台管理模块
│ ├── index # 前端展示模块
│ ├── common # 公共模块
├── config # 配置文件
├── public # 前端入口文件
└── runtime # 缓存和日志目录
2.1 商品展示与分类
- 数据库设计:设计商品表(
products)和分类表(categories)存储商品与分类信息。
CREATE TABLE categories (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
price DECIMAL(10, 2) NOT NULL,
category_id INT NOT NULL,
description TEXT,
image VARCHAR(255)
);
- 商品展示:前端可以通过 API 获取商品列表,并按分类进行展示。
public function getProducts() {
$category_id = input('get.category_id', 0);
$products = \app\model\Product::where('category_id', $category_id)->select();
return json(['products' => $products]);
}
2.2 购物车功能
设计购物车表(cart)存储用户的购物车商品。
CREATE TABLE cart (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
product_id INT NOT NULL,
quantity INT NOT NULL
);
- 添加到购物车:
public function addToCart() {
$data = input('post.');
$cart = new \app\model\Cart();
$cart->save($data);
return json(['message' => '添加到购物车成功']);
}
2.3 订单与支付功能
设计订单表(orders)和支付表(payments)。
CREATE TABLE orders (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
total_price DECIMAL(10, 2) NOT NULL,
status ENUM('pending', 'paid', 'shipped', 'completed') NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE
payments (
id INT AUTO_INCREMENT PRIMARY KEY,
order_id INT NOT NULL,
amount DECIMAL(10, 2) NOT NULL,
payment_method VARCHAR(50) NOT NULL,
payment_status ENUM('pending', 'completed', 'failed') NOT NULL
);
- 创建订单:
public function createOrder() {
$user_id = session('user_id');
$total_price = input('post.total_price');
$order = new \app\model\Order();
$order->save(['user_id' => $user_id, 'total_price' => $total_price, 'status' => 'pending']);
return json(['message' => '订单创建成功']);
}
2.4 API 和前端接口对接
在电商系统中,前端与后端的接口对接是通过 API 来实现的。前端通过 AJAX 请求调用 API,获取商品、订单等信息。
前端示例(通过 AJAX 获取商品列表):
$.ajax({
url: '/api/products',
type: 'GET',
data: { category_id: 1 },
success: function(response) {
console.log(response.products);
}
});
通过这些实战项目,您可以全面了解 ThinkPHP 在实际应用中的使用方式,掌握从基础到高级的开发技巧,快速搭建和维护 Web 应用。