Skip to content

项目管理 API

项目管理模块提供了学习项目的完整生命周期管理,包括创建、查询、更新和删除项目。

📋 接口概览

方法路径描述权限
GET/api/projects获取项目列表所有用户
GET/api/projects/:id获取单个项目详情所有用户
POST/api/projects创建新项目所有用户
PUT/api/projects/:id更新项目信息项目所有者/管理员
DELETE/api/projects/:id删除项目项目所有者/管理员
POST/api/projects/:id/image上传项目图片项目所有者/管理员
POST/api/projects/batch-assign批量指派项目管理员

🔍 获取项目列表

获取当前用户的所有项目列表,支持分页和筛选。

请求

http
GET /api/projects?page=1&limit=10&status=active&search=关键词
Authorization: Bearer <token>

查询参数

参数类型必填默认值描述
pagenumber1页码
limitnumber10每页数量
statusstringall项目状态 (active, completed, paused, all)
searchstring-搜索关键词
sortstringcreated_at排序字段
orderstringdesc排序方向 (asc, desc)

响应

json
{
  "success": true,
  "data": {
    "projects": [
      {
        "id": 1,
        "name": "数学学习",
        "description": "高等数学课程学习",
        "status": "active",
        "category": "academic",
        "target_hours": 120,
        "current_hours": 45.5,
        "progress": 37.9,
        "rating_standard": "excellent",
        "image": "/uploads/projects/math-project.jpg",
        "created_at": "2024-01-01T00:00:00Z",
        "updated_at": "2024-01-15T10:30:00Z",
        "user_id": 1
      }
    ],
    "pagination": {
      "page": 1,
      "limit": 10,
      "total": 25,
      "pages": 3
    }
  },
  "message": "获取项目列表成功"
}

🔍 获取单个项目

获取指定项目的详细信息。

请求

http
GET /api/projects/1
Authorization: Bearer <token>

响应

json
{
  "success": true,
  "data": {
    "id": 1,
    "name": "数学学习",
    "description": "高等数学课程学习",
    "status": "active",
    "category": "academic",
    "target_hours": 120,
    "current_hours": 45.5,
    "progress": 37.9,
    "rating_standard": "excellent",
    "image": "/uploads/projects/math-project.jpg",
    "created_at": "2024-01-01T00:00:00Z",
    "updated_at": "2024-01-15T10:30:00Z",
    "user_id": 1,
    "sessions_count": 15,
    "last_session": "2024-01-15T10:30:00Z",
    "achievements": [
      {
        "id": 1,
        "name": "学习新手",
        "description": "完成第一个学习项目",
        "icon": "/assets/ico/achievements/first-study.svg"
      }
    ]
  },
  "message": "获取项目详情成功"
}

➕ 创建项目

创建新的学习项目。

请求

http
POST /api/projects
Content-Type: application/json
Authorization: Bearer <token>

{
  "name": "新项目名称",
  "description": "项目描述",
  "category": "academic",
  "target_hours": 100,
  "rating_standard": "good"
}

请求参数

参数类型必填描述
namestring项目名称 (2-50字符)
descriptionstring项目描述 (最大500字符)
categorystring项目分类 (academic, skill, hobby, other)
target_hoursnumber目标学习时长(小时)
rating_standardstring评级标准 (excellent, good, normal)

响应

json
{
  "success": true,
  "data": {
    "id": 2,
    "name": "新项目名称",
    "description": "项目描述",
    "status": "active",
    "category": "academic",
    "target_hours": 100,
    "current_hours": 0,
    "progress": 0,
    "rating_standard": "good",
    "created_at": "2024-01-16T12:00:00Z",
    "updated_at": "2024-01-16T12:00:00Z",
    "user_id": 1
  },
  "message": "项目创建成功"
}

✏️ 更新项目

更新指定项目的信息。

请求

http
PUT /api/projects/1
Content-Type: application/json
Authorization: Bearer <token>

{
  "name": "更新后的项目名称",
  "description": "更新后的描述",
  "status": "completed",
  "target_hours": 150
}

请求参数

参数类型必填描述
namestring项目名称 (2-50字符)
descriptionstring项目描述 (最大500字符)
statusstring项目状态 (active, completed, paused)
categorystring项目分类
target_hoursnumber目标学习时长(小时)
rating_standardstring评级标准
assigned_user_idnumber指派给单个用户ID
assigned_user_idsarray指派给多个用户ID数组

响应

json
{
  "success": true,
  "data": {
    "id": 1,
    "name": "更新后的项目名称",
    "description": "更新后的描述",
    "status": "completed",
    "category": "academic",
    "target_hours": 150,
    "current_hours": 45.5,
    "progress": 30.3,
    "rating_standard": "excellent",
    "updated_at": "2024-01-16T12:30:00Z"
  },
  "message": "项目更新成功"
}

🗑️ 删除项目

删除指定的项目。

请求

http
DELETE /api/projects/1
Authorization: Bearer <token>

响应

json
{
  "success": true,
  "message": "项目删除成功"
}

📸 上传项目图片

为项目上传封面图片。

请求

http
POST /api/projects/1/image
Content-Type: multipart/form-data
Authorization: Bearer <token>

# Form Data:
# image: [文件]

请求参数

参数类型必填描述
imagefile图片文件 (jpg, png, gif, webp)

响应

json
{
  "success": true,
  "data": {
    "image_url": "/uploads/projects/abc123-def456.jpg",
    "filename": "abc123-def456.jpg"
  },
  "message": "项目图片上传成功"
}

👥 批量指派项目

管理员可以批量指派项目给多个用户。

请求

http
POST /api/projects/batch-assign
Content-Type: application/json
Authorization: Bearer <token>

{
  "project_ids": [1, 2, 3],
  "user_ids": [10, 11, 12],
  "assign_type": "add"
}

请求参数

参数类型必填描述
project_idsarray项目ID数组
user_idsarray用户ID数组
assign_typestring指派类型 (add, remove, replace)

响应

json
{
  "success": true,
  "data": {
    "assigned_count": 9,
    "failed_count": 0,
    "details": [
      {
        "project_id": 1,
        "project_name": "数学学习",
        "assigned_users": [
          {
            "user_id": 10,
            "username": "user1",
            "status": "success"
          }
        ]
      }
    ]
  },
  "message": "批量指派完成"
}

📊 项目统计

获取项目的学习统计数据。

请求

http
GET /api/projects/1/stats
Authorization: Bearer <token>

响应

json
{
  "success": true,
  "data": {
    "total_sessions": 15,
    "total_hours": 45.5,
    "average_session_length": 3.03,
    "longest_session": 8.5,
    "shortest_session": 0.5,
    "study_days": 12,
    "current_streak": 3,
    "longest_streak": 7,
    "completion_rate": 37.9,
    "weekly_progress": [
      {
        "week": "2024-W01",
        "hours": 12.5
      },
      {
        "week": "2024-W02",
        "hours": 18.2
      }
    ]
  },
  "message": "获取项目统计成功"
}

🏷️ 项目分类

获取系统支持的项目分类。

请求

http
GET /api/projects/categories
Authorization: Bearer <token>

响应

json
{
  "success": true,
  "data": [
    {
      "id": "academic",
      "name": "学术学习",
      "description": "学校课程、考试准备等",
      "icon": "graduation-cap"
    },
    {
      "id": "skill",
      "name": "技能提升",
      "description": "职业技能、兴趣爱好等",
      "icon": "tools"
    },
    {
      "id": "hobby",
      "name": "兴趣爱好",
      "description": "个人爱好、娱乐学习等",
      "icon": "heart"
    },
    {
      "id": "other",
      "name": "其他",
      "description": "其他类型的学习项目",
      "icon": "ellipsis-h"
    }
  ],
  "message": "获取项目分类成功"
}

⚠️ 错误响应

验证错误

json
{
  "success": false,
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "参数验证失败",
    "details": [
      {
        "field": "name",
        "message": "项目名称不能为空"
      }
    ]
  }
}

权限错误

json
{
  "success": false,
  "error": {
    "code": "PERMISSION_DENIED",
    "message": "您没有权限操作此项目"
  }
}

资源不存在

json
{
  "success": false,
  "error": {
    "code": "RESOURCE_NOT_FOUND",
    "message": "项目不存在"
  }
}

🚀 使用示例

JavaScript 示例

javascript
// 获取项目列表
async function getProjects(token, params = {}) {
  const queryString = new URLSearchParams(params).toString();
  const response = await fetch(`/api/projects?${queryString}`, {
    headers: {
      'Authorization': `Bearer ${token}`
    }
  });
  return await response.json();
}

// 创建项目
async function createProject(token, projectData) {
  const response = await fetch('/api/projects', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': `Bearer ${token}`
    },
    body: JSON.stringify(projectData)
  });
  return await response.json();
}

// 上传项目图片
async function uploadProjectImage(token, projectId, imageFile) {
  const formData = new FormData();
  formData.append('image', imageFile);
  
  const response = await fetch(`/api/projects/${projectId}/image`, {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${token}`
    },
    body: formData
  });
  return await response.json();
}

cURL 示例

bash
# 获取项目列表
curl -k -X GET "https://localhost:3001/api/projects?page=1&limit=10" \
  -H "Authorization: Bearer YOUR_TOKEN"

# 创建项目
curl -k -X POST https://localhost:3001/api/projects \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -d '{
    "name": "Python编程",
    "description": "学习Python编程语言",
    "category": "skill",
    "target_hours": 80
  }'

# 上传项目图片
curl -k -X POST https://localhost:3001/api/projects/1/image \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -F "image=@/path/to/image.jpg"

📝 注意事项

  1. 权限控制: 用户只能操作自己创建的项目,管理员可以操作所有项目
  2. 图片上传: 支持 jpg、png、gif、webp 格式,最大 5MB
  3. 状态管理: 项目状态会影响学习记录的统计
  4. 软删除: 删除项目时会保留相关的学习记录
  5. 缓存策略: 项目列表支持缓存,提高响应速度

💡 提示

项目是学习追踪的核心,建议为每个学习目标创建独立的项目,便于管理和统计。

Released under the MIT License.