|
|
@@ -70,24 +70,10 @@ Page({
|
|
|
|
|
|
statusList: [] as AnyArray,
|
|
|
|
|
|
+ carouselLoading: {} as Record<string | number, boolean>, // 用于跟踪每个轮播图的加载状态
|
|
|
+
|
|
|
// 轮播媒体列表
|
|
|
- carouselMediaList: [
|
|
|
- // {
|
|
|
- // type: 'image',
|
|
|
- // src: "https://wx.hzliuzhi.com:4433/manager/file/statics/2025/08/07/222_20250807164536A813.jpg",
|
|
|
- // title: '操作图片'
|
|
|
- // },
|
|
|
- // {
|
|
|
- // type: 'image',
|
|
|
- // src: "https://wx.hzliuzhi.com:4433/manager/file/statics/2025/08/07/111_20250807164533A812.jpg",
|
|
|
- // title: '商品图片'
|
|
|
- // },
|
|
|
- // {
|
|
|
- // type: 'video',
|
|
|
- // src: 'https://wx.hzliuzhi.com:4433/manager/file/statics/2025/08/07/song_20250807164546A814.mp4',
|
|
|
- // title: '操作视频'
|
|
|
- // },
|
|
|
- ] as Array<{
|
|
|
+ carouselMediaList: [] as Array<{
|
|
|
type: "image" | "video";
|
|
|
src: string;
|
|
|
poster?: string;
|
|
|
@@ -101,11 +87,10 @@ Page({
|
|
|
|
|
|
// 获取调养计划
|
|
|
async getCareLists() {
|
|
|
- // 保存当前的展开状态和媒体加载状态
|
|
|
+ // 保存当前的展开状态
|
|
|
const currentExpandedStates = this.data.displayList.map((item: any) => ({
|
|
|
id: item.id,
|
|
|
expanded: item.expanded,
|
|
|
- _mediaLoaded: item._mediaLoaded,
|
|
|
}));
|
|
|
|
|
|
const res = await getCareList();
|
|
|
@@ -113,12 +98,6 @@ Page({
|
|
|
res.forEach((item: any, index: number) => {
|
|
|
item.carouselMediaList = [];
|
|
|
|
|
|
- // 检查是否已经加载过媒体内容
|
|
|
- const existingItem = currentExpandedStates.find(
|
|
|
- (state) => state.id === item.id
|
|
|
- );
|
|
|
- item._mediaLoaded = existingItem ? existingItem._mediaLoaded : false;
|
|
|
-
|
|
|
// 确保 item.id 存在且为数字类型
|
|
|
if (!item.id && item.id !== 0) {
|
|
|
item.id = index;
|
|
|
@@ -126,13 +105,11 @@ Page({
|
|
|
|
|
|
// 确保 id 是数字类型
|
|
|
item.id = Number(item.id);
|
|
|
-
|
|
|
// 添加photo
|
|
|
if (item.photo) {
|
|
|
item.carouselMediaList.push({
|
|
|
type: "image",
|
|
|
src: item.photo,
|
|
|
- // title: "商品图片",
|
|
|
});
|
|
|
}
|
|
|
|
|
|
@@ -141,7 +118,6 @@ Page({
|
|
|
item.carouselMediaList.push({
|
|
|
type: "image",
|
|
|
src: item.itemImgFirst,
|
|
|
- // title: "操作图片",
|
|
|
});
|
|
|
}
|
|
|
|
|
|
@@ -150,30 +126,30 @@ Page({
|
|
|
item.carouselMediaList.push({
|
|
|
type: "video",
|
|
|
src: item.itemVideoFirst,
|
|
|
- poster: item.photo || item.itemImgFirst,
|
|
|
- // title: "操作视频",
|
|
|
});
|
|
|
}
|
|
|
|
|
|
- // 如果没有媒体内容,直接标记为已加载,避免一直显示加载状态
|
|
|
- if (item.carouselMediaList.length === 0) {
|
|
|
- item._mediaLoaded = true;
|
|
|
- } else {
|
|
|
+ // 如果有轮播图内容,设置加载状态
|
|
|
+ if (item.carouselMediaList.length > 0) {
|
|
|
+ this.setData({
|
|
|
+ [`carouselLoading.${item.id}`]: true,
|
|
|
+ });
|
|
|
+
|
|
|
+ // 设置超时,防止一直显示加载中
|
|
|
setTimeout(() => {
|
|
|
- if (!item._mediaLoaded) {
|
|
|
+ // 检查是否还在加载状态,如果是则自动隐藏
|
|
|
+ const currentLoading = this.data.carouselLoading;
|
|
|
+ if (currentLoading && currentLoading[item.id]) {
|
|
|
this.setData({
|
|
|
- [`careList[${index}]._mediaLoaded`]: true,
|
|
|
+ [`carouselLoading.${item.id}`]: false,
|
|
|
});
|
|
|
- const displayIndex = this.data.displayList.findIndex(
|
|
|
- (displayItem: any) => displayItem.id === item.id
|
|
|
- );
|
|
|
- if (displayIndex !== -1) {
|
|
|
- this.setData({
|
|
|
- [`displayList[${displayIndex}]._mediaLoaded`]: true,
|
|
|
- });
|
|
|
- }
|
|
|
}
|
|
|
- }, 3000);
|
|
|
+ }, 10000); // 10秒后自动隐藏加载状态
|
|
|
+ } else {
|
|
|
+ // 如果没有轮播图内容,确保不显示加载状态
|
|
|
+ this.setData({
|
|
|
+ [`carouselLoading.${item.id}`]: false,
|
|
|
+ });
|
|
|
}
|
|
|
});
|
|
|
|
|
|
@@ -219,11 +195,9 @@ Page({
|
|
|
async onShow() {
|
|
|
wx.showShareMenu({ withShareTicket: true, menus }).then();
|
|
|
await this.load();
|
|
|
- console.log(this.data.patient, "获取用户信息patient");
|
|
|
- // console.log(this.data.patient, "获取用户信息patient");
|
|
|
// 如果用户没有手机号每次进入页面都提示 点击跳到注册页补充
|
|
|
// todo 要先判断用户有没有手机号 isPerfectInfo是true 就出来弹窗提示用户
|
|
|
- if (this.data.patient?.isPerfectInfo ?? true) {
|
|
|
+ if ((this.data.patient as any)?.isPerfectInfo ?? true) {
|
|
|
wx.showModal({
|
|
|
title: "提示",
|
|
|
content: "手机号为空,请补充",
|
|
|
@@ -247,7 +221,7 @@ Page({
|
|
|
}
|
|
|
);
|
|
|
},
|
|
|
- onShareAppMessage(opts): WechatMiniprogram.Page.ICustomShareContent {
|
|
|
+ onShareAppMessage(_opts): WechatMiniprogram.Page.ICustomShareContent {
|
|
|
return {
|
|
|
title: `健康为基,从容赏生活之美`,
|
|
|
imageUrl: `https://wx.hzliuzhi.com/media/healthManager/wx/share.jpg`,
|
|
|
@@ -264,14 +238,13 @@ Page({
|
|
|
preserveExpandedStates?: Array<{
|
|
|
id: number;
|
|
|
expanded: boolean;
|
|
|
- _mediaLoaded?: boolean;
|
|
|
}>
|
|
|
) {
|
|
|
const { careList, allExpanded } = this.data;
|
|
|
let newDisplayList: any[] =
|
|
|
allExpanded || careList.length <= 4 ? careList : careList.slice(0, 4);
|
|
|
|
|
|
- // 如果有保存的展开状态和媒体加载状态,则恢复它们
|
|
|
+ // 如果有保存的展开状态,则恢复它们
|
|
|
if (preserveExpandedStates && preserveExpandedStates.length > 0) {
|
|
|
newDisplayList = newDisplayList.map((item: any) => {
|
|
|
const savedState = preserveExpandedStates.find(
|
|
|
@@ -281,10 +254,6 @@ Page({
|
|
|
return {
|
|
|
...item,
|
|
|
expanded: savedState.expanded,
|
|
|
- _mediaLoaded:
|
|
|
- savedState._mediaLoaded !== undefined
|
|
|
- ? savedState._mediaLoaded
|
|
|
- : item._mediaLoaded,
|
|
|
};
|
|
|
}
|
|
|
return item;
|
|
|
@@ -301,7 +270,7 @@ Page({
|
|
|
this.updateDisplayList
|
|
|
);
|
|
|
},
|
|
|
- toggleItem(e) {
|
|
|
+ toggleItem(e: any) {
|
|
|
const index = e.currentTarget.dataset.index;
|
|
|
const key = `displayList[${index}].expanded`;
|
|
|
this.setData({ [key]: !this.data.displayList[index].expanded });
|
|
|
@@ -419,7 +388,7 @@ Page({
|
|
|
this.observerPatient(patient);
|
|
|
}
|
|
|
wx.hideLoading();
|
|
|
- } catch (error) {
|
|
|
+ } catch (error: any) {
|
|
|
await wx
|
|
|
.showModal({
|
|
|
title: `加载失败`,
|
|
|
@@ -428,7 +397,7 @@ Page({
|
|
|
confirmText: `重新加载`,
|
|
|
})
|
|
|
.catch(() => {});
|
|
|
- this.load(true);
|
|
|
+ await this.load(true);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
@@ -454,11 +423,11 @@ Page({
|
|
|
try {
|
|
|
const data = await healthReportMethod();
|
|
|
|
|
|
- if (!data ) {
|
|
|
+ if (!data) {
|
|
|
this.setData({
|
|
|
isShowComplete: true,
|
|
|
});
|
|
|
- }else{
|
|
|
+ } else {
|
|
|
this.setData({
|
|
|
isShowComplete: false,
|
|
|
});
|
|
|
@@ -533,7 +502,7 @@ Page({
|
|
|
.filter(Boolean),
|
|
|
"healthIndex.loading": false,
|
|
|
});
|
|
|
- } catch (error) {
|
|
|
+ } catch (error: any) {
|
|
|
this.setData({
|
|
|
"healthIndex.data": [],
|
|
|
"healthIndex.loading": false,
|
|
|
@@ -660,7 +629,7 @@ Page({
|
|
|
if (!this.data.patient?.patientId) {
|
|
|
try {
|
|
|
await this.load();
|
|
|
- } catch (error) {
|
|
|
+ } catch (error: any) {
|
|
|
wx.showModal({
|
|
|
title: "出错了",
|
|
|
content: error?.errMsg ?? error?.message ?? "错误,请重试",
|
|
|
@@ -707,7 +676,7 @@ Page({
|
|
|
else wx.showToast({ title: "暂无分析报告", icon: "none" });
|
|
|
}
|
|
|
},
|
|
|
- onDraggableSizeUpdate(e) {
|
|
|
+ onDraggableSizeUpdate(e: any) {
|
|
|
"worklet";
|
|
|
if (e.pixels < 1) {
|
|
|
wx.worklet.runOnJS(this.hideDraggableSheet.bind(this))();
|
|
|
@@ -761,98 +730,34 @@ Page({
|
|
|
// 获取调养计划
|
|
|
this.getCareLists();
|
|
|
},
|
|
|
- // 图片加载成功
|
|
|
- onImageLoad(e: any) {
|
|
|
- const { item, itemId } = e.detail;
|
|
|
- // 如果有itemId,直接更新对应项的状态
|
|
|
+ // 轮播图加载完成
|
|
|
+ onCarouselLoaded(e: any) {
|
|
|
+ const { itemId } = e.detail;
|
|
|
if (itemId) {
|
|
|
- this.updateMediaLoadedStateById(itemId);
|
|
|
- } else {
|
|
|
- // 兼容旧版本,通过查找来匹配
|
|
|
- this.updateMediaLoadedState(item);
|
|
|
+ this.setData({
|
|
|
+ [`carouselLoading.${itemId}`]: false,
|
|
|
+ });
|
|
|
}
|
|
|
},
|
|
|
// 图片加载失败
|
|
|
onImageError(e: any) {
|
|
|
- const { item, itemId } = e.detail;
|
|
|
- wx.showToast({
|
|
|
- title: "图片加载失败",
|
|
|
- icon: "none",
|
|
|
- });
|
|
|
- // 即使加载失败也要标记为已加载,避免一直显示加载状态
|
|
|
+ const { itemId } = e.detail;
|
|
|
+ // 图片加载失败时也要隐藏加载状态
|
|
|
if (itemId) {
|
|
|
- this.updateMediaLoadedStateById(itemId);
|
|
|
- } else {
|
|
|
- this.updateMediaLoadedState(item);
|
|
|
- }
|
|
|
- },
|
|
|
-
|
|
|
- // 通过ID更新媒体加载状态的辅助方法
|
|
|
- updateMediaLoadedStateById(itemId: string | number) {
|
|
|
- const { careList, displayList } = this.data;
|
|
|
-
|
|
|
- // 查找对应的 careList 项
|
|
|
- const careListIndex = careList.findIndex((item: any) => item.id == itemId);
|
|
|
-
|
|
|
- // 查找对应的 displayList 项
|
|
|
- const displayListIndex = displayList.findIndex(
|
|
|
- (item: any) => item.id == itemId
|
|
|
- );
|
|
|
-
|
|
|
- if (careListIndex !== -1) {
|
|
|
this.setData({
|
|
|
- [`careList[${careListIndex}]._mediaLoaded`]: true,
|
|
|
- });
|
|
|
- }
|
|
|
-
|
|
|
- if (displayListIndex !== -1) {
|
|
|
- this.setData({
|
|
|
- [`displayList[${displayListIndex}]._mediaLoaded`]: true,
|
|
|
+ [`carouselLoading.${itemId}`]: false,
|
|
|
});
|
|
|
}
|
|
|
},
|
|
|
|
|
|
- // 更新媒体加载状态的辅助方法(兼容旧版本)
|
|
|
- updateMediaLoadedState(mediaItem: any) {
|
|
|
- const { careList, displayList } = this.data;
|
|
|
- // 查找对应的 careList 项
|
|
|
- const careListIndex = careList.findIndex(
|
|
|
- (item: any) =>
|
|
|
- item.carouselMediaList &&
|
|
|
- item.carouselMediaList.some((media: any) => media.src === mediaItem.src)
|
|
|
- );
|
|
|
- // 查找对应的 displayList 项
|
|
|
- const displayListIndex = displayList.findIndex(
|
|
|
- (item: any) =>
|
|
|
- item.carouselMediaList &&
|
|
|
- item.carouselMediaList.some((media: any) => media.src === mediaItem.src)
|
|
|
- );
|
|
|
-
|
|
|
- if (careListIndex !== -1) {
|
|
|
- this.setData({
|
|
|
- [`careList[${careListIndex}]._mediaLoaded`]: true,
|
|
|
- });
|
|
|
- }
|
|
|
-
|
|
|
- if (displayListIndex !== -1) {
|
|
|
- this.setData({
|
|
|
- [`displayList[${displayListIndex}]._mediaLoaded`]: true,
|
|
|
- });
|
|
|
- }
|
|
|
- },
|
|
|
-
|
|
|
- // 视频播放失败
|
|
|
+ // 视频播放错误
|
|
|
onVideoError(e: any) {
|
|
|
- const { item, itemId } = e.detail;
|
|
|
- wx.showToast({
|
|
|
- title: "视频播放失败",
|
|
|
- icon: "none",
|
|
|
- });
|
|
|
- // 视频播放错误时也要标记为已加载,避免一直显示加载状态
|
|
|
+ const { itemId } = e.detail;
|
|
|
+ // 视频播放错误时也要隐藏加载状态
|
|
|
if (itemId) {
|
|
|
- this.updateMediaLoadedStateById(itemId);
|
|
|
- } else {
|
|
|
- this.updateMediaLoadedState(item);
|
|
|
+ this.setData({
|
|
|
+ [`carouselLoading.${itemId}`]: false,
|
|
|
+ });
|
|
|
}
|
|
|
},
|
|
|
// 没有健康分析去做健康分析
|
|
|
@@ -887,11 +792,10 @@ Page({
|
|
|
|
|
|
// 无感刷新调养计划,保持展开状态和媒体加载状态
|
|
|
async refreshCareListsWithState() {
|
|
|
- // 保存当前的展开状态和媒体加载状态
|
|
|
+ // 保存当前的展开状态
|
|
|
const currentExpandedStates = this.data.displayList.map((item: any) => ({
|
|
|
id: item.id,
|
|
|
expanded: item.expanded,
|
|
|
- _mediaLoaded: item._mediaLoaded,
|
|
|
carouselMediaList: item.carouselMediaList, // 保存媒体列表,避免重新加载
|
|
|
}));
|
|
|
|
|
|
@@ -906,21 +810,18 @@ Page({
|
|
|
);
|
|
|
|
|
|
// 如果找到旧数据且媒体已加载,保持媒体状态
|
|
|
- if (oldItem && oldItem._mediaLoaded && oldItem.carouselMediaList) {
|
|
|
+ if (oldItem && oldItem.carouselMediaList) {
|
|
|
// 保持原有的媒体列表,避免重新加载
|
|
|
item.carouselMediaList = oldItem.carouselMediaList;
|
|
|
- item._mediaLoaded = true;
|
|
|
} else {
|
|
|
// 否则重新构建媒体列表
|
|
|
item.carouselMediaList = [];
|
|
|
- item._mediaLoaded = false;
|
|
|
|
|
|
// 添加photo
|
|
|
if (item.photo) {
|
|
|
item.carouselMediaList.push({
|
|
|
type: "image",
|
|
|
src: item.photo,
|
|
|
- cacheKey: `photo_${item.id}_${item.photo}`, // 添加缓存键
|
|
|
});
|
|
|
}
|
|
|
|
|
|
@@ -929,23 +830,37 @@ Page({
|
|
|
item.carouselMediaList.push({
|
|
|
type: "image",
|
|
|
src: item.itemImgFirst,
|
|
|
- cacheKey: `img_${item.id}_${item.itemImgFirst}`, // 添加缓存键
|
|
|
});
|
|
|
}
|
|
|
-
|
|
|
// 添加itemVideoFirst
|
|
|
if (item?.itemVideoFirst) {
|
|
|
item.carouselMediaList.push({
|
|
|
type: "video",
|
|
|
src: item.itemVideoFirst,
|
|
|
- poster: item.photo || item.itemImgFirst,
|
|
|
- cacheKey: `video_${item.id}_${item.itemVideoFirst}`, // 添加缓存键
|
|
|
});
|
|
|
}
|
|
|
|
|
|
- // 如果没有媒体内容,直接标记为已加载
|
|
|
- if (item.carouselMediaList.length === 0) {
|
|
|
- item._mediaLoaded = true;
|
|
|
+ // 如果有轮播图内容,设置加载状态
|
|
|
+ if (item.carouselMediaList.length > 0) {
|
|
|
+ this.setData({
|
|
|
+ [`carouselLoading.${item.id}`]: true,
|
|
|
+ });
|
|
|
+
|
|
|
+ // 设置超时,防止一直显示加载中
|
|
|
+ setTimeout(() => {
|
|
|
+ // 检查是否还在加载状态,如果是则自动隐藏
|
|
|
+ const currentLoading = this.data.carouselLoading;
|
|
|
+ if (currentLoading && currentLoading[item.id]) {
|
|
|
+ this.setData({
|
|
|
+ [`carouselLoading.${item.id}`]: false,
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }, 10000); // 10秒后自动隐藏加载状态
|
|
|
+ } else {
|
|
|
+ // 如果没有轮播图内容,确保不显示加载状态
|
|
|
+ this.setData({
|
|
|
+ [`carouselLoading.${item.id}`]: false,
|
|
|
+ });
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -972,7 +887,6 @@ Page({
|
|
|
return {
|
|
|
...item,
|
|
|
expanded: savedState.expanded,
|
|
|
- _mediaLoaded: savedState._mediaLoaded,
|
|
|
carouselMediaList:
|
|
|
savedState.carouselMediaList || item.carouselMediaList,
|
|
|
};
|