545 lines
14 KiB
JavaScript
545 lines
14 KiB
JavaScript
import request from '../utils/request';
|
||
|
||
/**
|
||
* 打卡营相关 API 接口
|
||
* 整合了打卡营、任务、订单、支付等所有相关接口
|
||
*/
|
||
export const campApi = {
|
||
// ==================== 打卡营基础信息 ====================
|
||
|
||
/**
|
||
* 获取打卡营分类列表
|
||
*/
|
||
getCampCategories: () => {
|
||
const url = `/camp/categories?keyword=&page=1&page_size=10`;
|
||
return request({
|
||
url,
|
||
method: 'GET'
|
||
});
|
||
},
|
||
|
||
/**
|
||
* 获取打卡营列表
|
||
* @param {String} categoryId - 分类ID,如果为 undefined/null/-1 则返回推荐打卡营
|
||
* @param {String} userId - 用户ID(可选,如果不传则从本地存储获取)
|
||
*/
|
||
getCamps: (categoryId, userId) => {
|
||
const user_id = String(userId || wx.getStorageSync('wxuserid') || '');
|
||
// 已加入打卡营:只返回当前用户已加入的营
|
||
if (categoryId === 'joined') {
|
||
return request({
|
||
url: `/camp/camps?joined_only=1&page=1&page_size=50&user_id=${encodeURIComponent(user_id)}`,
|
||
method: 'GET'
|
||
});
|
||
}
|
||
// 推荐打卡营(与后端 RecommendFilter 约定:only_true = 只返回推荐的)
|
||
if (!categoryId || categoryId === 'undefined' || categoryId === '-1') {
|
||
return request({
|
||
url: `/camp/camps?recommend_filter=only_true&page=1&page_size=20&user_id=${encodeURIComponent(user_id)}`,
|
||
method: 'GET'
|
||
});
|
||
}
|
||
// 按分类筛选
|
||
const url = `/camp/camps?category_id=${categoryId}&page=1&page_size=20&user_id=${encodeURIComponent(user_id)}`;
|
||
return request({
|
||
url,
|
||
method: 'GET'
|
||
});
|
||
},
|
||
|
||
/**
|
||
* 获取打卡营详情
|
||
* @param {String} campId - 打卡营ID
|
||
* @param {String} userId - 用户ID(可选,如果不传则从本地存储获取)
|
||
*/
|
||
getCampDetail: (campId, userId) => {
|
||
const user_id = String(userId || wx.getStorageSync('wxuserid') || '');
|
||
// 根据 proto 定义,使用查询参数 id
|
||
return request({
|
||
url: `/camp/camps/detail?id=${campId}&user_id=${encodeURIComponent(user_id)}`,
|
||
method: 'GET'
|
||
});
|
||
},
|
||
|
||
/**
|
||
* 获取打卡营详情及状态(聚合接口,包含用户状态、小节、任务等完整信息)
|
||
* @param {String} campId - 打卡营ID
|
||
* @param {String} userId - 用户ID
|
||
*/
|
||
getCampDetailWithUserStatus: (campId, userId) => {
|
||
return request({
|
||
url: `/camp/camp_detail_with_user_status`,
|
||
method: 'POST',
|
||
data: {
|
||
camp_id: String(campId),
|
||
user_id: String(userId || wx.getStorageSync('wxuserid') || '')
|
||
}
|
||
});
|
||
},
|
||
|
||
// ==================== 用户打卡营操作 ====================
|
||
|
||
/**
|
||
* 加入打卡营
|
||
* @param {String} campId - 打卡营ID
|
||
*/
|
||
joinCamp: (campId) => {
|
||
return request({
|
||
url: `/camp/user_camp/join`,
|
||
method: 'POST',
|
||
data: {
|
||
user_id: String(wx.getStorageSync('wxuserid') || ''), // 从本地存储获取用户ID
|
||
camp_id: campId
|
||
}
|
||
});
|
||
},
|
||
|
||
/**
|
||
* 检查用户是否加入打卡营
|
||
* @param {String} campId - 打卡营ID
|
||
*/
|
||
checkUserCampStatus: (campId) => {
|
||
return request({
|
||
url: `/camp/check_user_camp_status`,
|
||
method: 'POST',
|
||
data: {
|
||
user_id: String(wx.getStorageSync('wxuserid') || ''), // 从本地存储获取用户ID
|
||
camp_id: campId
|
||
}
|
||
});
|
||
},
|
||
|
||
/**
|
||
* 重置打卡营进度(新接口)
|
||
* @param {String} campId - 打卡营ID
|
||
* @param {String} userId - 用户ID
|
||
* @param {Boolean} confirm - 是否确认
|
||
*/
|
||
resetCampProgress: (campId, userId, confirm = true) => {
|
||
return request({
|
||
url: `/camp/user_camp/reset_progress`,
|
||
method: 'POST',
|
||
data: {
|
||
user_id: String(userId || wx.getStorageSync('wxuserid') || ''),
|
||
camp_id: String(campId),
|
||
confirm: confirm
|
||
}
|
||
});
|
||
},
|
||
|
||
/**
|
||
* 重启打卡营(旧接口,已废弃)
|
||
* @deprecated 请使用 resetCampProgress
|
||
*/
|
||
restartCamp: (campId) => {
|
||
return request({
|
||
url: `/camp/${campId}/restart`,
|
||
method: 'POST'
|
||
});
|
||
},
|
||
|
||
// ==================== 小节相关 ====================
|
||
|
||
/**
|
||
* 获取打卡营的小节列表(课程列表)
|
||
* @param {String} campId - 打卡营ID
|
||
* @param {String} userId - 用户ID(可选,如果不传则从本地存储获取)
|
||
*/
|
||
getCampCourses: (campId, userId) => {
|
||
const user_id = String(userId || wx.getStorageSync('wxuserid') || '');
|
||
// 根据 proto 定义,使用 /camp/sections 接口,通过 camp_id 查询参数
|
||
return request({
|
||
url: `/camp/sections?camp_id=${campId}&page=1&page_size=10&user_id=${encodeURIComponent(user_id)}`,
|
||
method: 'GET'
|
||
});
|
||
},
|
||
|
||
/**
|
||
* 检查是否可开启小节(后端查库:上一小节是否完成等)
|
||
* @param {String} campId - 打卡营ID
|
||
* @param {String} sectionId - 小节ID
|
||
* @returns {Promise<{ success: boolean, can_unlock: boolean, message: string }>}
|
||
*/
|
||
canUnlockSection: (campId, sectionId) => {
|
||
return request({
|
||
url: `/camp/can_unlock_section`,
|
||
method: 'POST',
|
||
data: {
|
||
user_id: String(wx.getStorageSync('wxuserid') || ''),
|
||
camp_id: campId,
|
||
section_id: sectionId
|
||
}
|
||
});
|
||
},
|
||
|
||
/**
|
||
* 检查任务是否可以开始(前置任务是否已完成)
|
||
* @param {String} taskId - 任务ID
|
||
* @returns {Promise<{ success: boolean, can_start: boolean, reason: string }>}
|
||
*/
|
||
canStartTask: (taskId) => {
|
||
return request({
|
||
url: `/camp/can_start_task`,
|
||
method: 'POST',
|
||
data: {
|
||
user_id: String(wx.getStorageSync('wxuserid') || ''),
|
||
task_id: taskId
|
||
}
|
||
});
|
||
},
|
||
|
||
/**
|
||
* 购买小节(开启第一小节)
|
||
* @param {String} campId - 打卡营ID
|
||
* @param {String} sectionId - 小节ID
|
||
*/
|
||
purchaseSection: (campId, sectionId) => {
|
||
return request({
|
||
url: `/camp/purchase_section`,
|
||
method: 'POST',
|
||
data: {
|
||
user_id: String(wx.getStorageSync('wxuserid') || ''),
|
||
camp_id: campId,
|
||
section_id: sectionId
|
||
}
|
||
});
|
||
},
|
||
|
||
/**
|
||
* 获取用户在某营的小节可访问/已购列表
|
||
* @param {String} campId - 打卡营ID
|
||
* @param {Number} page - 页码
|
||
* @param {Number} page_size - 每页数量
|
||
*/
|
||
listUserSectionAccess: (campId, page = 1, page_size = 1000) => {
|
||
return request({
|
||
url: `/camp/list_user_section_access`,
|
||
method: 'POST',
|
||
data: {
|
||
user_id: String(wx.getStorageSync('wxuserid') || ''),
|
||
camp_id: campId,
|
||
page,
|
||
page_size
|
||
}
|
||
});
|
||
},
|
||
|
||
/**
|
||
* 获取每个小节的完成状态
|
||
* @param {String} campId - 打卡营ID
|
||
* @param {String} userId - 用户ID
|
||
*/
|
||
getSectionUserStatus: (campId, userId) => {
|
||
return request({
|
||
url: `/camp/section/user-status`,
|
||
method: 'POST',
|
||
data: {
|
||
camp_id: String(campId),
|
||
user_id: String(userId || wx.getStorageSync('wxuserid') || '')
|
||
}
|
||
});
|
||
},
|
||
|
||
/**
|
||
* 根据课程小节ID获取用户与课程小节的关联关系
|
||
* @param {String} courseIds - 课程ID列表(逗号分隔)
|
||
* @param {String} userId - 用户ID(可选,如果不传则从本地存储获取)
|
||
*/
|
||
getCourseUserRelations: (courseIds, userId) => {
|
||
const user_id = String(userId || wx.getStorageSync('wxuserid') || '');
|
||
return request({
|
||
url: `/camp/course/user-course-relations?course_ids=${courseIds}&user_id=${encodeURIComponent(user_id)}`,
|
||
method: 'GET',
|
||
});
|
||
},
|
||
|
||
/**
|
||
* 获取课程完成状态
|
||
* @param {String} campId - 打卡营ID
|
||
* @param {String} courseId - 课程ID
|
||
*/
|
||
getCourseCompleted: (campId, courseId) => {
|
||
return request({
|
||
url: `/camp/${campId}/course/${courseId}/completed`,
|
||
method: 'GET'
|
||
});
|
||
},
|
||
|
||
// ==================== 任务相关 ====================
|
||
|
||
/**
|
||
* 获取任务详情(需要 campId 和 courseId)
|
||
* @param {String} campId - 打卡营ID
|
||
* @param {String} courseId - 课程ID
|
||
* @param {String} taskId - 任务ID
|
||
* @param {String} taskType - 任务类型
|
||
*/
|
||
getTaskDetail: (campId, courseId, taskId, taskType) => {
|
||
return request({
|
||
url: `/camp/${campId}/course/${courseId}/tasks/${taskId}?task_type=${taskType.toUpperCase()}`,
|
||
method: 'GET',
|
||
});
|
||
},
|
||
|
||
/**
|
||
* 按任务ID直接获取任务详情(无需 campId/courseId)
|
||
* @param {String} taskId - 任务ID
|
||
* @param {String} userId - 用户ID(可选,如果不传则从本地存储获取)
|
||
*/
|
||
getTaskDetailById: (taskId, userId) => {
|
||
const user_id = String(userId || wx.getStorageSync('wxuserid') || '');
|
||
return request({
|
||
url: `/camp/tasks/detail?id=${taskId}&user_id=${encodeURIComponent(user_id)}`,
|
||
method: 'GET',
|
||
});
|
||
},
|
||
|
||
/**
|
||
* 根据任务ID获取任务与用户的关联关系
|
||
* @param {String} taskIds - 任务ID列表(逗号分隔)
|
||
* @param {String} userId - 用户ID(可选,如果不传则从本地存储获取)
|
||
*/
|
||
getCampTaskUserRelations: (taskIds, userId) => {
|
||
const user_id = String(userId || wx.getStorageSync('wxuserid') || '');
|
||
return request({
|
||
url: `/camp/task/user_task?task_ids=${taskIds}&user_id=${encodeURIComponent(user_id)}`,
|
||
method: 'GET',
|
||
});
|
||
},
|
||
|
||
// ==================== 任务进度相关 ====================
|
||
|
||
/**
|
||
* 获取用户任务进度详情
|
||
* @param {String} userId - 用户ID
|
||
* @param {String} taskId - 任务ID
|
||
*/
|
||
getProgressDetail: (userId, taskId) => {
|
||
// GET 请求的参数作为 query 参数传递(兼容微信小程序,不使用 URLSearchParams)
|
||
const user_id = encodeURIComponent(String(userId));
|
||
const task_id = encodeURIComponent(String(taskId));
|
||
return request({
|
||
url: `/camp/progress/info?user_id=${user_id}&task_id=${task_id}`,
|
||
method: 'GET'
|
||
});
|
||
// 注意:request.js 已处理,当 success=false 时不会显示错误提示(没有进度是正常情况)
|
||
},
|
||
|
||
/**
|
||
* 更新任务通用进度
|
||
* @param {Object} data - 进度数据
|
||
*/
|
||
updateCampProgress: (data) => {
|
||
return request({
|
||
url: `/camp/progress/update`,
|
||
method: 'POST',
|
||
data: data
|
||
});
|
||
},
|
||
|
||
/**
|
||
* 重置任务进度(用户重新答题)
|
||
* @param {Object} data - 重置数据
|
||
*/
|
||
resetTaskProgress: (data) => {
|
||
return request({
|
||
url: `/camp/reset_task_progress`,
|
||
method: 'POST',
|
||
data: data
|
||
});
|
||
},
|
||
|
||
// ==================== 任务类型特定接口 ====================
|
||
|
||
/**
|
||
* 更新视频任务进度
|
||
* @param {String} campId - 打卡营ID
|
||
* @param {String} courseId - 课程ID
|
||
* @param {String} taskId - 任务ID
|
||
* @param {Object} data - 进度数据
|
||
*/
|
||
updateVideoProgress: (campId, courseId, taskId, data) => {
|
||
return request({
|
||
url: `/camp/${campId}/course/${courseId}/tasks/${taskId}/video`,
|
||
method: 'POST',
|
||
data: data
|
||
});
|
||
},
|
||
|
||
/**
|
||
* 更新文本图片任务进度
|
||
* @param {String} campId - 打卡营ID
|
||
* @param {String} courseId - 课程ID
|
||
* @param {String} taskId - 任务ID
|
||
* @param {Object} data - 进度数据
|
||
*/
|
||
updateTextImageProgress: (campId, courseId, taskId, data) => {
|
||
return request({
|
||
url: `/camp/${campId}/course/${courseId}/tasks/${taskId}/text-image`,
|
||
method: 'POST',
|
||
data: data
|
||
});
|
||
},
|
||
|
||
/**
|
||
* 更新主观题任务进度
|
||
* @param {String} campId - 打卡营ID
|
||
* @param {String} courseId - 课程ID
|
||
* @param {String} taskId - 任务ID
|
||
* @param {Object} data - 进度数据
|
||
*/
|
||
updateSubjectiveQuestionProgress: (campId, courseId, taskId, data) => {
|
||
return request({
|
||
url: `/camp/${campId}/course/${courseId}/tasks/${taskId}/subjective`,
|
||
method: 'POST',
|
||
data: data
|
||
});
|
||
},
|
||
|
||
/**
|
||
* 更新申论任务进度
|
||
* @param {String} campId - 打卡营ID
|
||
* @param {String} courseId - 课程ID
|
||
* @param {String} taskId - 任务ID
|
||
* @param {Object} data - 进度数据
|
||
*/
|
||
updateEssayProgress: (campId, courseId, taskId, data) => {
|
||
return request({
|
||
url: `/camp/${campId}/course/${courseId}/tasks/${taskId}/essay-question/essay`,
|
||
method: 'POST',
|
||
data: data
|
||
});
|
||
},
|
||
|
||
/**
|
||
* 更新客观题任务进度
|
||
* @param {String} campId - 打卡营ID
|
||
* @param {String} courseId - 课程ID
|
||
* @param {String} taskId - 任务ID
|
||
* @param {Object} data - 进度数据
|
||
*/
|
||
updateObjectiveQuestionProgress: (campId, courseId, taskId, data) => {
|
||
return request({
|
||
url: `/camp/${campId}/course/${courseId}/tasks/${taskId}/objective`,
|
||
method: 'POST',
|
||
data: data
|
||
});
|
||
},
|
||
|
||
// ==================== 任务答案相关 ====================
|
||
|
||
/**
|
||
* 获取主观题任务的用户答案
|
||
* @param {String} campId - 打卡营ID
|
||
* @param {String} courseId - 课程ID
|
||
* @param {String} taskId - 任务ID
|
||
*/
|
||
getSubjectiveTaskUserAnswer: (campId, courseId, taskId) => {
|
||
return request({
|
||
url: `/camp/${campId}/course/${courseId}/tasks/${taskId}/subjective/user-answer`,
|
||
method: 'GET',
|
||
});
|
||
},
|
||
|
||
/**
|
||
* 获取申论题任务所有问题的用户答案
|
||
* @param {String} campId - 打卡营ID
|
||
* @param {String} courseId - 课程ID
|
||
* @param {String} taskId - 任务ID
|
||
*/
|
||
getEssayQuestionUserAnswer: (campId, courseId, taskId) => {
|
||
return request({
|
||
url: `/camp/${campId}/course/${courseId}/tasks/${taskId}/essay-question/user-answer`,
|
||
method: 'GET',
|
||
});
|
||
},
|
||
|
||
/**
|
||
* 获取申论题任务是否需要审核
|
||
* @param {String} campId - 打卡营ID
|
||
* @param {String} courseId - 课程ID
|
||
* @param {String} taskId - 任务ID
|
||
*/
|
||
getEssayTaskReviewStatus: (campId, courseId, taskId) => {
|
||
return request({
|
||
url: `/camp/${campId}/course/${courseId}/tasks/${taskId}/essay-question/need-audit`,
|
||
method: 'GET',
|
||
});
|
||
},
|
||
|
||
/**
|
||
* 获取客观题答题结算结果
|
||
* @param {String} campId - 打卡营ID
|
||
* @param {String} courseId - 课程ID
|
||
* @param {String} taskId - 任务ID
|
||
*/
|
||
getObjectiveQuestionSettlementResult: (campId, courseId, taskId) => {
|
||
return request({
|
||
url: `/camp/${campId}/course/${courseId}/tasks/${taskId}/objective/settlement-result`,
|
||
method: 'GET',
|
||
});
|
||
},
|
||
|
||
// ==================== 订单相关 ====================
|
||
|
||
/**
|
||
* 创建订单(打卡营小节)
|
||
* @param {Object} orderData - 订单数据
|
||
*/
|
||
createOrder: (orderData) => {
|
||
return request({
|
||
url: `/order/create`,
|
||
method: 'POST',
|
||
data: orderData
|
||
});
|
||
},
|
||
|
||
/**
|
||
* 取消订单
|
||
* @param {Object} orderData - 订单数据
|
||
*/
|
||
cancelOrder: (orderData) => {
|
||
return request({
|
||
url: `/order/cancel`,
|
||
method: 'POST',
|
||
data: orderData
|
||
});
|
||
},
|
||
|
||
// ==================== 支付相关 ====================
|
||
|
||
/**
|
||
* 创建支付(获取预支付ID)
|
||
* @param {Object} paymentData - 支付数据
|
||
*/
|
||
createPayment: (paymentData) => {
|
||
return request({
|
||
url: `/pay/create`,
|
||
method: 'POST',
|
||
data: paymentData
|
||
});
|
||
},
|
||
|
||
/**
|
||
* 创建打卡营小节支付请求订单(已废弃,使用 createOrder + createPayment)
|
||
* @deprecated 请使用 createOrder + createPayment
|
||
*/
|
||
createCampPayment: (campId, courseId) => {
|
||
return request({
|
||
url: `/camp/${campId}/course/${courseId}/order`,
|
||
method: 'POST',
|
||
});
|
||
},
|
||
|
||
/**
|
||
* 取消支付
|
||
* @deprecated 请使用 cancelOrder
|
||
*/
|
||
cancelCampPayment: (campId, orderId) => {
|
||
return request({
|
||
url: `/camp/${campId}/order/${orderId}/cancel`,
|
||
method: 'POST',
|
||
});
|
||
},
|
||
};
|