|
...
|
...
|
@@ -6,7 +6,7 @@ |
|
|
|
<view class="banner-section">
|
|
|
|
<image :src="plandetail.urlCover" class="banner-img">
|
|
|
|
<!-- 收藏 -->
|
|
|
|
<uni-icons :type="isPlanAdded ? 'heart-filled' : 'heart'" size="24" color="#fff" class="collect-btn"
|
|
|
|
<uni-icons :type="isFavorite ? 'heart-filled' : 'heart'" size="24" color="#fff" class="collect-btn"
|
|
|
|
@click="toggleAddPlan">
|
|
|
|
</uni-icons>
|
|
|
|
<!-- 分享按钮 -->
|
|
...
|
...
|
@@ -126,8 +126,9 @@ |
|
|
|
|
|
|
|
<!-- 按钮区域 -->
|
|
|
|
<view class="button-group">
|
|
|
|
<template v-if="!plandetail.isAdded && !isMyPlan">
|
|
|
|
<button type="default" @click="showPlanPopup = true" class="btn" size="large"
|
|
|
|
<template v-if="!isPlanAdded && !isMyPlan">
|
|
|
|
<!-- 官方计划的底部按钮(未添加) -->
|
|
|
|
<button type="default" @click="openTrainingPopup" class="btn" size="large"
|
|
|
|
style="background-color: white; flex: 1">
|
|
|
|
单节课程训练
|
|
|
|
</button>
|
|
...
|
...
|
@@ -136,18 +137,20 @@ |
|
|
|
加入计划
|
|
|
|
</button>
|
|
|
|
</template>
|
|
|
|
<template v-else-if="plandetail.isAdded && !isMyPlan">
|
|
|
|
<!-- 官方计划已添加 -->
|
|
|
|
<template v-else-if="isPlanAdded && !isMyPlan">
|
|
|
|
<button type="default" @click.stop="confirmDelete(plandetail.id)" class="btn end" size="large"
|
|
|
|
style="background-color: white; flex: 1">
|
|
|
|
结束计划
|
|
|
|
</button>
|
|
|
|
<button type="default" @click="showPlanPopup = true" class="btn ones" size="large"
|
|
|
|
<button type="default" @click="openTrainingPopup" class="btn ones" size="large"
|
|
|
|
style="background-color: #ffd700; flex: 1.5">
|
|
|
|
马上开练
|
|
|
|
</button>
|
|
|
|
</template>
|
|
|
|
<!-- 个人计划 -->
|
|
|
|
<template v-else>
|
|
|
|
<button type="default" class="btn end" @click="showPlanPopup = true" size="large"
|
|
|
|
<button type="default" class="btn end" @click="openTrainingPopup" size="large"
|
|
|
|
style="background-color: white; flex: 1">
|
|
|
|
马上开练
|
|
|
|
</button>
|
|
...
|
...
|
@@ -176,18 +179,18 @@ |
|
|
|
</view>
|
|
|
|
</template>
|
|
|
|
</view>
|
|
|
|
<!-- 加入计划的弹窗 -->
|
|
|
|
<!-- 加入计划/重新开始计划的弹窗 -->
|
|
|
|
<WeekSelectPopup v-model:visible="showWeekPopup" :max-count="plandetail.frequencyPerWeek" :plan-detail="plandetail"
|
|
|
|
@success="loadDetail" :is-update="isUpdate" />
|
|
|
|
@success="loadDetailUpdate" :is-update="isUpdate" />
|
|
|
|
|
|
|
|
<!-- 添加到日历弹窗子组件 -->
|
|
|
|
<AddToCalendarPopup ref="calendarPopupRef" :plan-id="plandetail.id" :template-id="currentTemplateId"
|
|
|
|
@success="handleCalendarSuccess" />
|
|
|
|
|
|
|
|
<!-- 去训练弹窗,显示当前计划的所有模板,可以直接跳转到训练页面 -->
|
|
|
|
<!-- 去训练弹窗,显示当前计划的所有模板,可以直接跳转到训练页面,区分个人计划和官方计划(传递的是官方的计划id) -->
|
|
|
|
<template v-if="plandetail?.id">
|
|
|
|
<WodeJihuaTianjiaTancuang v-if="showPlanPopup" v-model:visible="showPlanPopup" :isAdd="false"
|
|
|
|
:plan-title="'选择课程立即开始训练'" :plan-id="plandetail.id" :is-my-plan="false"/>
|
|
|
|
:plan-title="'选择课程立即开始训练'" :plan-id="trainingPlanId" :is-my-plan="false" />
|
|
|
|
</template>
|
|
|
|
|
|
|
|
</view>
|
|
...
|
...
|
@@ -211,8 +214,7 @@ const route = defineProps(['planid']); // Vue 3 + uni-app 支持 |
|
|
|
const pages = getCurrentPages();
|
|
|
|
const currentPage = pages[pages.length - 1];
|
|
|
|
const planIdFromUrl = currentPage.options?.planid;
|
|
|
|
// 计划是否已添加(收藏)
|
|
|
|
const isPlanAdded = ref(false);
|
|
|
|
|
|
|
|
// const plandetail = ref([]);
|
|
|
|
const plandetail = ref({});
|
|
|
|
//传参
|
|
...
|
...
|
@@ -248,23 +250,6 @@ const showPlanPopup = ref(false) |
|
|
|
// 更多弹窗显隐
|
|
|
|
const showMorePopup = ref(false)
|
|
|
|
|
|
|
|
|
|
|
|
// 接口weeklySchedule转日历渲染数据
|
|
|
|
// const formatWeekData = (weekArr) => {
|
|
|
|
// const weekMap = { 1: '一', 2: '二', 3: '三', 4: '四', 5: '五', 6: '六', 7: '日' }
|
|
|
|
// return weekArr.map((item, index) => {
|
|
|
|
// const dayNum = item.date[2]
|
|
|
|
// let topStr = index === 0 ? '今' : weekMap[item.dayIndex]
|
|
|
|
// const trainStr = item.scheduled ? item.templateName : ''
|
|
|
|
// return {
|
|
|
|
// topText: topStr,
|
|
|
|
// num: String(dayNum),
|
|
|
|
// trainName: trainStr,
|
|
|
|
// templateId: item.templateId,
|
|
|
|
// dailytemplateId: item.dailytemplateId,
|
|
|
|
// }
|
|
|
|
// })
|
|
|
|
// }
|
|
|
|
// 接口weeklySchedule转日历渲染数据(修复版:星期根据真实日期计算,100%对齐num)
|
|
|
|
const formatWeekData = (weekArr) => {
|
|
|
|
// JS星期:0=日,1=一,2=二,3=三,4=四,5=五,6=六
|
|
...
|
...
|
@@ -304,6 +289,17 @@ const restartPlan = () => { |
|
|
|
console.log('重新开始计划,planId:', plandetail.value.id)
|
|
|
|
uni.showToast({ title: '已重新开始计划', icon: 'success' })
|
|
|
|
}
|
|
|
|
const trainingPlanId = ref(0)
|
|
|
|
const openTrainingPopup = () => {
|
|
|
|
showPlanPopup.value = true;
|
|
|
|
if (isMyPlan.value) {
|
|
|
|
trainingPlanId.value = plandetail.value.planId
|
|
|
|
|
|
|
|
} else {
|
|
|
|
trainingPlanId.value = plandetail.value.id
|
|
|
|
}
|
|
|
|
console.log('trainingPlanId=', trainingPlanId.value);
|
|
|
|
}
|
|
|
|
|
|
|
|
// 跳转到排课页面
|
|
|
|
const openArrageClass = () => {
|
|
...
|
...
|
@@ -365,10 +361,11 @@ const confirmDelete = async (id) => { |
|
|
|
|
|
|
|
if (res.code === 0 && res.data) {
|
|
|
|
uni.showToast({ title: '计划已结束', icon: 'success' });
|
|
|
|
|
|
|
|
setTimeout(() => {
|
|
|
|
uni.navigateBack()
|
|
|
|
}, 1500)
|
|
|
|
if (isMyPlan.value) {
|
|
|
|
setTimeout(() => {
|
|
|
|
uni.navigateBack()
|
|
|
|
}, 1500)
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
uni.showToast({ title: res.msg || '操作失败', icon: 'none' });
|
|
|
|
}
|
|
...
|
...
|
@@ -376,7 +373,10 @@ const confirmDelete = async (id) => { |
|
|
|
console.error('删除计划失败:', err);
|
|
|
|
uni.showToast({ title: '网络请求失败', icon: 'none' });
|
|
|
|
} finally {
|
|
|
|
loadDetail();
|
|
|
|
if (!isMyPlan.value) {
|
|
|
|
loadDetail();
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// 用户点取消 → 什么都不做
|
|
...
|
...
|
@@ -433,37 +433,55 @@ const loadDetail = async () => { |
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
// ====================== 计划收藏/添加功能 ======================
|
|
|
|
const loadDetailUpdate = () => {
|
|
|
|
loadDetail();
|
|
|
|
isAddToMyPlanList();
|
|
|
|
}
|
|
|
|
|
|
|
|
// 检查当前计划是否已经添加
|
|
|
|
const checkPlanAddedStatus = async () => {
|
|
|
|
// // 检查当前计划是否已经添加到我的计划列表
|
|
|
|
// 计划是否已添加
|
|
|
|
const isPlanAdded = ref(false);
|
|
|
|
const isAddToMyPlanList = async () => {
|
|
|
|
if (!id.value) return;
|
|
|
|
try {
|
|
|
|
const res = await QueryPlanApi.isAddPlan(id.value);
|
|
|
|
// 接口返回 true = 已添加
|
|
|
|
const res = await QueryPlanApi.isAddPlan(Number(id.value));
|
|
|
|
// 后端返回布尔值,赋值状态
|
|
|
|
isPlanAdded.value = res.data === true;
|
|
|
|
console.log("计划是否已添加:", isPlanAdded.value);
|
|
|
|
console.log("当前计划是否已加入我的计划:", isPlanAdded.value);
|
|
|
|
} catch (err) {
|
|
|
|
console.error("检查计划添加状态失败:", err);
|
|
|
|
console.error("查询是否加入计划失败:", err);
|
|
|
|
isPlanAdded.value = false;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
const isFavorite = ref(false)
|
|
|
|
// 检查当前计划是否已经收藏
|
|
|
|
const checkPlanAddedStatus = async () => {
|
|
|
|
if (!id.value) return;
|
|
|
|
try {
|
|
|
|
const res = await QueryPlanApi.checkFavorite(id.value);
|
|
|
|
console.log('计划是否已经收藏:', res);
|
|
|
|
isFavorite.value = res.data === true;
|
|
|
|
console.log("计划是否已经收藏:", isFavorite.value);
|
|
|
|
} catch (err) {
|
|
|
|
console.error("检查计划收藏状态失败:", err);
|
|
|
|
isFavorite.value = false;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
// 切换添加/取消收藏计划
|
|
|
|
const toggleAddPlan = async () => {
|
|
|
|
if (!id.value) {
|
|
|
|
uni.showToast({ title: "计划ID不存在", icon: "none" });
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
const originalStatus = isPlanAdded.value;
|
|
|
|
// 乐观更新UI(点了立刻变爱心)
|
|
|
|
isPlanAdded.value = !originalStatus;
|
|
|
|
|
|
|
|
const originalStatus = isFavorite.value;
|
|
|
|
// 点了立刻变爱心)
|
|
|
|
isFavorite.value = !originalStatus;
|
|
|
|
try {
|
|
|
|
// 调用添加计划接口
|
|
|
|
await QueryPlanApi.addPlan(id.value);
|
|
|
|
|
|
|
|
const params = isFavorite.value ? 1 : 0;
|
|
|
|
await QueryPlanApi.toggleFavorite(Number(id.value), params);
|
|
|
|
if (!originalStatus) {
|
|
|
|
uni.showToast({ title: "收藏计划成功" });
|
|
|
|
} else {
|
|
...
|
...
|
@@ -471,7 +489,7 @@ const toggleAddPlan = async () => { |
|
|
|
}
|
|
|
|
} catch (err) {
|
|
|
|
// 失败回滚
|
|
|
|
isPlanAdded.value = originalStatus;
|
|
|
|
isFavorite.value = originalStatus;
|
|
|
|
console.error("操作失败:", err);
|
|
|
|
uni.showToast({ title: "操作失败", icon: "none" });
|
|
|
|
}
|
|
...
|
...
|
@@ -491,6 +509,7 @@ const openCalendarPopup = (planId, templateId) => { |
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// 日历添加成功的回调(可选,可做刷新/提示)
|
|
|
|
const handleCalendarSuccess = () => {
|
|
|
|
console.log('课程已成功添加到日历');
|
|
...
|
...
|
@@ -512,7 +531,8 @@ onLoad((options) => { |
|
|
|
console.log("计划详情接收的参数:", options);
|
|
|
|
id.value = options.planid;
|
|
|
|
isMyPlan.value = options.isMyPlan === "true";
|
|
|
|
checkPlanAddedStatus(); // 检查计划是否已添加
|
|
|
|
checkPlanAddedStatus(); // 检查计划是否已收藏
|
|
|
|
isAddToMyPlanList(); // 新增:查询是否加入我的计划
|
|
|
|
// #ifdef MP-WEIXIN
|
|
|
|
wx.showShareMenu({
|
|
|
|
withShareTicket: true,
|
...
|
...
|
|