本文目录导读:

我来帮你详细说明如何用PHP搭建一个任务管理系统,我会从架构设计到具体实现给你一个完整的方案。
系统架构设计
技术栈选择
// 推荐技术栈 - PHP 8.0+ (面向对象编程) - MySQL 8.0 (数据库) - Laravel 10 (框架,推荐) 或 原生PHP - Bootstrap 5 (前端框架) - jQuery/Ajax (异步请求) - Composer (依赖管理)
核心功能模块
graph TD
A[用户模块] --> B[任务管理]
B --> C[任务创建]
B --> D[任务分配]
B --> E[任务状态]
B --> F[时间管理]
A --> G[权限控制]
G --> H[管理员]
G --> I[普通用户]
数据库设计
核心表结构
-- 用户表
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) UNIQUE NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
password VARCHAR(255) NOT NULL,
role ENUM('admin', 'manager', 'user') DEFAULT 'user',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 任务表
CREATE TABLE tasks (
id INT PRIMARY KEY AUTO_INCREMENT,VARCHAR(200) NOT NULL,
description TEXT,
priority ENUM('low', 'medium', 'high', 'urgent') DEFAULT 'medium',
status ENUM('todo', 'in_progress', 'review', 'done') DEFAULT 'todo',
created_by INT,
assigned_to INT,
due_date DATE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (created_by) REFERENCES users(id),
FOREIGN KEY (assigned_to) REFERENCES users(id)
);
-- 评论表
CREATE TABLE comments (
id INT PRIMARY KEY AUTO_INCREMENT,
task_id INT,
user_id INT,
content TEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (task_id) REFERENCES tasks(id) ON DELETE CASCADE,
FOREIGN KEY (user_id) REFERENCES users(id)
);
核心代码实现(以Laravel为例)
用户认证系统
// app/Http/Controllers/AuthController.php
<?php
namespace App\Http\Controllers;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
class AuthController extends Controller
{
public function register(Request $request)
{
$validated = $request->validate([
'username' => 'required|unique:users|max:50',
'email' => 'required|email|unique:users',
'password' => 'required|min:6|confirmed'
]);
$user = User::create([
'username' => $validated['username'],
'email' => $validated['email'],
'password' => Hash::make($validated['password'])
]);
Auth::login($user);
return redirect()->route('dashboard');
}
public function login(Request $request)
{
$credentials = $request->validate([
'email' => 'required|email',
'password' => 'required'
]);
if (Auth::attempt($credentials)) {
$request->session()->regenerate();
return redirect()->intended('dashboard');
}
return back()->withErrors([
'email' => '提供的凭据不匹配。',
]);
}
}
任务管理系统
// app/Http/Controllers/TaskController.php
<?php
namespace App\Http\Controllers;
use App\Models\Task;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class TaskController extends Controller
{
public function __construct()
{
$this->middleware('auth');
}
// 创建任务
public function store(Request $request)
{
$validated = $request->validate([
'title' => 'required|max:200',
'description' => 'required',
'priority' => 'required|in:low,medium,high,urgent',
'assigned_to' => 'required|exists:users,id',
'due_date' => 'required|date|after:today'
]);
$task = Task::create([
'title' => $validated['title'],
'description' => $validated['description'],
'priority' => $validated['priority'],
'assigned_to' => $validated['assigned_to'],
'due_date' => $validated['due_date'],
'created_by' => Auth::id(),
'status' => 'todo'
]);
return redirect()->route('tasks.show', $task->id)
->with('success', '任务创建成功!');
}
// 更新任务状态
public function updateStatus(Request $request, Task $task)
{
$validated = $request->validate([
'status' => 'required|in:todo,in_progress,review,done'
]);
$task->update(['status' => $validated['status']]);
// 如果是完成任务,记录完成时间
if ($validated['status'] === 'done') {
$task->update(['completed_at' => now()]);
}
return response()->json([
'success' => true,
'message' => '任务状态已更新'
]);
}
// 获取用户的任务列表
public function userTasks()
{
$tasks = Task::where('assigned_to', Auth::id())
->orWhere('created_by', Auth::id())
->with(['assignedUser', 'creator'])
->orderBy('created_at', 'desc')
->paginate(10);
return view('tasks.index', compact('tasks'));
}
// 任务统计
public function statistics()
{
$stats = [
'total' => Task::count(),
'todo' => Task::where('status', 'todo')->count(),
'in_progress' => Task::where('status', 'in_progress')->count(),
'done' => Task::where('status', 'done')->count(),
'overdue' => Task::where('due_date', '<', now())
->where('status', '!=', 'done')
->count()
];
return view('dashboard', compact('stats'));
}
}
任务管理中间件
// app/Http/Middleware/CheckTaskPermission.php
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Auth;
class CheckTaskPermission
{
public function handle($request, Closure $next)
{
$task = $request->route('task');
// 只有任务创建者、分配者或管理员可以操作
if ($task->created_by !== Auth::id() &&
$task->assigned_to !== Auth::id() &&
Auth::user()->role !== 'admin') {
abort(403, '无权操作此任务');
}
return $next($request);
}
}
前端实现示例
任务卡片组件
<!-- resources/views/tasks/card.blade.php -->
<div class="task-card card mb-3" data-task-id="{{ $task->id }}">
<div class="card-body">
<div class="d-flex justify-content-between align-items-start">
<div>
<h5 class="card-title">{{ $task->title }}</h5>
<p class="card-text text-muted">
{{ Str::limit($task->description, 100) }}
</p>
</div>
<span class="badge bg-{{ $task->priority_color }}">
{{ $task->priority }}
</span>
</div>
<div class="task-meta mt-2">
<small class="text-muted">
<i class="bi bi-person"></i>
分配给: {{ $task->assignedUser->username }}
</small>
<br>
<small class="text-muted">
<i class="bi bi-calendar"></i>
截止: {{ $task->due_date->format('Y-m-d') }}
</small>
</div>
<div class="task-actions mt-3">
<select class="form-select form-select-sm status-select"
onchange="updateTaskStatus({{ $task->id }}, this.value)">
<option value="todo" {{ $task->status == 'todo' ? 'selected' : '' }}>待办</option>
<option value="in_progress" {{ $task->status == 'in_progress' ? 'selected' : '' }}>进行中</option>
<option value="review" {{ $task->status == 'review' ? 'selected' : '' }}>审核中</option>
<option value="done" {{ $task->status == 'done' ? 'selected' : '' }}>已完成</option>
</select>
</div>
</div>
</div>
<script>
function updateTaskStatus(taskId, status) {
$.ajax({
url: `/tasks/${taskId}/status`,
method: 'PATCH',
data: {
status: status,
_token: '{{ csrf_token() }}'
},
success: function(response) {
if(response.success) {
toastr.success(response.message);
}
},
error: function(xhr) {
toastr.error('更新失败,请重试');
}
});
}
</script>
部署与优化建议
项目部署
# 1. 克隆项目 git clone https://github.com/your/task-manager.git # 2. 安装依赖 composer install npm install # 3. 环境配置 cp .env.example .env php artisan key:generate # 4. 数据库迁移 php artisan migrate php artisan db:seed # 5. 优化性能 php artisan optimize php artisan route:cache php artisan config:cache
性能优化
// 使用Redis缓存
'cache' => [
'default' => env('CACHE_DRIVER', 'redis'),
'prefix' => 'task_manager_'
],
// 数据库索引优化
$table->index(['assigned_to', 'status']);
$table->index(['created_by', 'created_at']);
安全措施
// XSS防护
{{ $task->description }} // 使用Blade自动转义
// CSRF保护
@csrf // 在表单中添加
// SQL注入防护
DB::table('tasks')->where('id', $id)->first(); // 使用Eloquent
// 输入验证
request()->validate([ => 'required|max:200|string'
]);
扩展功能建议
高级功能
- 任务标签系统:添加标签分类
- 文件附件:支持上传相关文件
- 邮件通知:任务更新时发送邮件
- 甘特图视图:直观展示项目进度
- API接口:支持移动端访问
第三方集成
// 集成通知服务 use App\Notifications\TaskAssigned; $user->notify(new TaskAssigned($task)); // 集成日历同步 Google_Service_Calendar::class
测试示例
// 测试任务创建
public function test_task_creation()
{
$user = User::factory()->create();
$this->actingAs($user);
$response = $this->post('/tasks', [
'title' => '测试任务',
'description' => '任务描述',
'priority' => 'high',
'assigned_to' => $user->id,
'due_date' => now()->addDays(7)
]);
$response->assertRedirect();
$this->assertDatabaseHas('tasks', ['title' => '测试任务']);
}
这个方案可以搭建一个完整的任务管理系统,根据你的具体需求,可以选择使用Laravel框架或纯PHP实现,建议先从核心功能开始,逐步添加更多高级特性。