137 lines
4.2 KiB
JavaScript
137 lines
4.2 KiB
JavaScript
import {
|
||
getAdvertList
|
||
} from '@/common/server/interface/advert'
|
||
import {
|
||
ref
|
||
} from 'vue';
|
||
import { getReservationList } from '@/common/server/interface/sq'
|
||
import { parseTimeString, formatTime, calculateTimeRange } from '@/common/system/timeUtile'
|
||
// 响应式数据定义
|
||
// 首页核心数据(banner + 通知)
|
||
export const homeData = ref(null);
|
||
|
||
// 全局加载状态
|
||
export const isLoading = ref(false);
|
||
// 错误信息
|
||
export const error = ref(null);
|
||
|
||
// 缓存控制(防重复请求)
|
||
const CACHE_TIMEOUT = 5 * 60 * 1000; // 5分钟缓存
|
||
let lastLoadTime = 0;
|
||
|
||
/**
|
||
* 预加载首页核心数据(banner + 通知+分类)
|
||
*/
|
||
export const preloadHomeData = async () => {
|
||
if (shouldUseCache()) return;
|
||
|
||
isLoading.value = true;
|
||
error.value = null;
|
||
try {
|
||
const res = await Promise.all([
|
||
getAdvertList("TplIndexBanner1").catch(() => null),
|
||
]);
|
||
|
||
let [advertList] = res;
|
||
|
||
// 删除 banner 数据源 createTime和updateTime
|
||
if (advertList) {
|
||
advertList = advertList.map(it => {
|
||
let _it = {
|
||
...it
|
||
};
|
||
delete _it.createTime;
|
||
delete _it.updateTime;
|
||
return _it;
|
||
});
|
||
}
|
||
|
||
|
||
homeData.value = {
|
||
advertList
|
||
};
|
||
console.log("首页数据源", homeData.value);
|
||
lastLoadTime = Date.now();
|
||
} catch (err) {
|
||
error.value = err;
|
||
console.error('首页数据预加载失败:', err);
|
||
} finally {
|
||
isLoading.value = false;
|
||
}
|
||
};
|
||
|
||
|
||
// 私有工具函数
|
||
const shouldUseCache = () => {
|
||
return homeData.value && Date.now() - lastLoadTime < CACHE_TIMEOUT;
|
||
};
|
||
|
||
/**
|
||
* 获取预约记录
|
||
* @param {*} index
|
||
* @returns
|
||
*/
|
||
export const getReservation = async (index = 1, size = 20) => {
|
||
const res = await getReservationList(index, size);
|
||
if (res != null && res.length > 0) {
|
||
|
||
console.log("记录", res);
|
||
var list = res.map(item => {
|
||
let start_time = parseTimeString(item.start_time);
|
||
let end_time = parseTimeString(item.end_time);
|
||
let timeStr = calculateTimeRange(start_time, end_time);
|
||
let time = formatTime(start_time, "HH:MM") + " ~ " + formatTime(end_time, "HH:MM") + " 共" + timeStr;
|
||
let requirementsList = [item.game_type, item.game_rule];
|
||
if (item.is_smoking == 1) {
|
||
requirementsList.push("禁烟");
|
||
}
|
||
if (item.gender_limit == 1) {
|
||
requirementsList.push("男性");
|
||
}
|
||
if (item.gender_limit == 2) {
|
||
requirementsList.push("女性");
|
||
}
|
||
if (item.credit_limit > 0) {
|
||
requirementsList.push("信誉分≧" + item.credit_limit);
|
||
}
|
||
if (item.min_age > 0) {
|
||
requirementsList.push("最小年龄≧" + item.min_age);
|
||
}
|
||
if (item.max_age > 0) {
|
||
requirementsList.push("最大年龄≦" + item.max_age);
|
||
}
|
||
if (item.deposit_fee > 0) {
|
||
requirementsList.push("鸽子费≧" + item.deposit_fee);
|
||
}
|
||
let requirements = requirementsList.join(",");
|
||
return {
|
||
id: item.id,
|
||
data: item,
|
||
status: item.status,
|
||
description: item.title,
|
||
dateStr: formatTime(start_time, "yyyy-MM-dd"),
|
||
time: time,
|
||
room: item.room_name,
|
||
requirements: requirements,
|
||
extra_info: item.extra_info,
|
||
personCount: item.player_count,
|
||
joinPerson: item.participants.map(participant => {
|
||
return {
|
||
id: participant.id,
|
||
name: participant.userName,
|
||
avatar: participant.avatarImage,
|
||
userBlackStatus: participant.userBlackStatus,
|
||
joinTime: participant.join_time,
|
||
role: participant.role,
|
||
};
|
||
}),
|
||
};
|
||
|
||
});
|
||
|
||
return list;
|
||
// return [];
|
||
}
|
||
return [];
|
||
}
|