156 lines
5.2 KiB
JavaScript
156 lines
5.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) {
|
||
// {
|
||
// id: '',
|
||
// status: '',
|
||
// description: '',
|
||
// time: '',
|
||
// room: '',
|
||
// requirements: '',
|
||
// personCount: 4, //总人数
|
||
// joinPerson: [{
|
||
// id: 1,
|
||
// name: '张三',
|
||
// avatar: '',
|
||
// phone: '',
|
||
// }], //已加入人
|
||
// }
|
||
//[{"participants":[{"id":7,"reservation_id":3,"user_id":3796,"role":1,"join_time":"2025/09/03 04:05:40",
|
||
// "status":0,"userName":"闪光大帕鲁","avatarImage":"https://admin-1308826010.cos.ap-shanghai.myqcloud.com/
|
||
// users20250908/20250908152502_6366.png","userBlackStatus":0}],
|
||
// "id":3,"title":"测试1","room_id":3,"room_name":"306小包间",
|
||
// "start_time":"2025/09/13 21:09:43","end_time":"2025/09/13 21:34:43",
|
||
// "duration_minutes":25,"player_count":4,"game_type":"扑克","game_rule":"跑得快",
|
||
// "extra_info":"11","is_smoking":1,"gender_limit":2,"credit_limit":0.0,"min_age":0,"max_age":0,"deposit_fee":0.00,"status":0,"created_at":"2025/09/03 00:21:16","updated_at":"2025/09/03 21:10:21","remarks":""}]
|
||
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,
|
||
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 [];
|
||
}
|