duidui_mini_program/config/camp_api.js
2026-03-27 10:41:46 +08:00

545 lines
14 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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',
});
},
};