如何用PHP项目搭建任务管理系统?

wen PHP项目 3

本文目录导读:

如何用PHP项目搭建任务管理系统?

  1. 系统架构设计
  2. 数据库设计
  3. 核心代码实现(以Laravel为例)
  4. 前端实现示例
  5. 部署与优化建议
  6. 扩展功能建议
  7. 测试示例

我来帮你详细说明如何用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实现,建议先从核心功能开始,逐步添加更多高级特性。

抱歉,评论功能暂时关闭!