1

99 阅读2分钟

我理解您需要一个项目流程追踪系统。我建议我们可以创建一个简单的 React 应用来实现这个功能。下面是一个基础实现方案:

首先创建必要的文件结构:

project-tracker/
  ├── src/
  │   ├── components/
  │   │   ├── ProjectTracker.js
  │   │   ├── StageCard.js
  │   │   └── StageForm.js
  │   ├── App.js
  │   └── index.js

让我们先创建主要的项目追踪组件:

import React, { useState } from 'react';
import StageCard from './StageCard';
import StageForm from './StageForm';

const ProjectTracker = () => {
  const [stages, setStages] = useState([
    {
      id: 1,
      name: '需求分析',
      responsible: '张三',
      status: 'pending', // pending, in-progress, completed
      email: 'zhangsan@example.com',
      deadline: '2024-03-20',
      dependsOn: null
    },
    {
      id: 2,
      name: '设计阶段',
      responsible: '李四',
      status: 'pending',
      email: 'lisi@example.com',
      deadline: '2024-03-25',
      dependsOn: 1
    }
  ]);

  const updateStageStatus = (stageId, newStatus) => {
    const updatedStages = stages.map(stage => {
      if (stage.id === stageId) {
        return { ...stage, status: newStatus };
      }
      return stage;
    });
    
    setStages(updatedStages);
    
    // 如果当前阶段完成,通知下一个依赖阶段的负责人
    if (newStatus === 'completed') {
      const nextStages = stages.filter(stage => stage.dependsOn === stageId);
      nextStages.forEach(stage => {
        notifyResponsible(stage);
      });
    }
  };

  const notifyResponsible = (stage) => {
    // 这里可以集成邮件通知服务
    console.log(`通知 ${stage.responsible} (${stage.email}): 前置任务已完成,可以开始 ${stage.name} 阶段了`);
  };

  return (
    <div className="project-tracker">
      <h1>项目进度追踪</h1>
      <div className="stages-container">
        {stages.map(stage => (
          <StageCard
            key={stage.id}
            stage={stage}
            onStatusUpdate={updateStageStatus}
            canStart={!stage.dependsOn || 
              stages.find(s => s.id === stage.dependsOn)?.status === 'completed'}
          />
        ))}
      </div>
      <StageForm onAddStage={(newStage) => setStages([...stages, newStage])} />
    </div>
  );
};

export default ProjectTracker;

创建阶段卡片组件:

import React from 'react';

const StageCard = ({ stage, onStatusUpdate, canStart }) => {
  const statusColors = {
    'pending': '#ffd700',
    'in-progress': '#87ceeb',
    'completed': '#90ee90'
  };

  return (
    <div className="stage-card" style={{ borderColor: statusColors[stage.status] }}>
      <h3>{stage.name}</h3>
      <p>负责人: {stage.responsible}</p>
      <p>截止日期: {stage.deadline}</p>
      <p>状态: {stage.status}</p>
      <div className="stage-actions">
        {canStart && stage.status === 'pending' && (
          <button onClick={() => onStatusUpdate(stage.id, 'in-progress')}>
            开始任务
          </button>
        )}
        {stage.status === 'in-progress' && (
          <button onClick={() => onStatusUpdate(stage.id, 'completed')}>
            完成任务
          </button>
        )}
      </div>
    </div>
  );
};

export default StageCard;

添加新阶段的表单组件:

import React, { useState } from 'react';

const StageForm = ({ onAddStage }) => {
  const [newStage, setNewStage] = useState({
    name: '',
    responsible: '',
    email: '',
    deadline: '',
    dependsOn: ''
  });

  const handleSubmit = (e) => {
    e.preventDefault();
    onAddStage({
      ...newStage,
      id: Date.now(),
      status: 'pending'
    });
    setNewStage({
      name: '',
      responsible: '',
      email: '',
      deadline: '',
      dependsOn: ''
    });
  };

  return (
    <form onSubmit={handleSubmit} className="stage-form">
      <h3>添加新阶段</h3>
      <input
        type="text"
        placeholder="阶段名称"
        value={newStage.name}
        onChange={(e) => setNewStage({...newStage, name: e.target.value})}
      />
      <input
        type="text"
        placeholder="负责人"
        value={newStage.responsible}
        onChange={(e) => setNewStage({...newStage, responsible: e.target.value})}
      />
      <input
        type="email"
        placeholder="邮箱"
        value={newStage.email}
        onChange={(e) => setNewStage({...newStage, email: e.target.value})}
      />
      <input
        type="date"
        value={newStage.deadline}
        onChange={(e) => setNewStage({...newStage, deadline: e.target.value})}
      />
      <input
        type="number"
        placeholder="依赖阶段ID"
        value={newStage.dependsOn}
        onChange={(e) => setNewStage({...newStage, dependsOn: e.target.value ? parseInt(e.target.value) : null})}
      />
      <button type="submit">添加阶段</button>
    </form>
  );
};

export default StageForm;

这个实现包含以下功能:

  1. 显示项目各个阶段的状态
  2. 每个阶段显示负责人、截止日期和当前状态
  3. 可以添加新的项目阶段
  4. 支持阶段间的依赖关系
  5. 当一个阶段完成时,系统会通知下一个依赖阶段的负责人
  6. 使用不同的颜色标识不同的状态

要完善这个系统,您还可以:

  1. 添加后端API来持久化数据
  2. 集成真实的邮件通知服务
  3. 添加用户认证
  4. 添加更详细的进度报告功能
  5. 添加评论或反馈功能
  6. 添加文件上传功能

需要添加任何这些功能,我都可以为您提供具体的实现代码。您觉得这个实现怎么样?需要我对某些部分做调整吗?