263 lines
7.4 KiB
JavaScript
263 lines
7.4 KiB
JavaScript
import { ACTIVITY_STATUS, ACTIVITY_TYPE } from "../enum/activity";
|
|
|
|
/**
|
|
* 活动数据格式化工具
|
|
*/
|
|
export default {
|
|
/**
|
|
* 格式化活动列表数据
|
|
* @param {Array} apiData - API返回的活动数据
|
|
* @returns {Array} 格式化后的活动数据
|
|
*/
|
|
formatActivityList(apiData) {
|
|
if (!Array.isArray(apiData)) {
|
|
return [];
|
|
}
|
|
|
|
return apiData.map((item) => this.formatActivityItem(item));
|
|
},
|
|
|
|
/**
|
|
* 格式化单个活动数据
|
|
* @param {Object} item - API返回的单个活动数据
|
|
* @returns {Object} 格式化后的活动数据
|
|
*/
|
|
formatActivityItem(item) {
|
|
if (!item) return null;
|
|
|
|
return {
|
|
id: item.id || "",
|
|
name: item.title || "未命名活动",
|
|
theme: item.content ? `活动主题: ${item.content}` : "",
|
|
type: this.getActivityType(item.type),
|
|
status: this.getActivityStatus(
|
|
item.status,
|
|
item.actStartTime,
|
|
item.actEndTime,
|
|
),
|
|
time: this.formatActivityTime(item.actStartTime, item.actEndTime),
|
|
location: item.address || "",
|
|
// backgroundImage: item.imgUrl || this.getDefaultImageByType(item.type),
|
|
backgroundImage: item.imgUrl,
|
|
// 额外信息
|
|
templeId: item.templeId,
|
|
currentBooking: item.currentBooking || 0,
|
|
attendance: item.attendance || 0,
|
|
readNum: item.readNum || 0,
|
|
phone: item.phone,
|
|
lon: item.lon,
|
|
lat: item.lat,
|
|
};
|
|
},
|
|
|
|
/**
|
|
* 格式化活动详情数据
|
|
* @param {Object} apiData - API返回的活动详情数据
|
|
* @returns {Object} 格式化后的活动详情数据
|
|
*/
|
|
formatActivityDetail(apiData) {
|
|
if (!apiData) return null;
|
|
|
|
return {
|
|
id: apiData.id || "",
|
|
name: apiData.title || "未命名活动",
|
|
|
|
type: this.getActivityType(apiData.type),
|
|
status: this.getActivityStatus(
|
|
apiData.status,
|
|
apiData.actStartTime,
|
|
apiData.actEndTime,
|
|
),
|
|
time: this.formatActivityTime(apiData.actStartTime, apiData.actEndTime),
|
|
location: apiData.address || "",
|
|
backgroundImage: apiData.imgUrl,
|
|
//|| this.getDefaultImageByType(apiData.type),
|
|
// 详情页额外信息
|
|
templeId: apiData.templeId,
|
|
currentBooking: apiData.currentBooking || 0,
|
|
attendance: apiData.attendance || 0,
|
|
readNum: apiData.readNum || 0,
|
|
phone: apiData.phone,
|
|
lon: apiData.lon,
|
|
lat: apiData.lat,
|
|
content: apiData.content,
|
|
createTime: apiData.createTime,
|
|
updateTime: apiData.updateTime,
|
|
};
|
|
},
|
|
|
|
/**
|
|
* 从HTML内容中提取纯文本
|
|
* @param {string} htmlContent - HTML内容
|
|
* @returns {string} 纯文本内容
|
|
*/
|
|
extractTextFromHtml(htmlContent) {
|
|
if (!htmlContent) return "";
|
|
|
|
try {
|
|
// 简单的HTML标签移除
|
|
return htmlContent
|
|
.replace(/<[^>]*>/g, "") // 移除HTML标签
|
|
.replace(/ /g, " ") // 替换空格实体
|
|
.replace(/&/g, "&") // 替换&实体
|
|
.replace(/</g, "<") // 替换<实体
|
|
.replace(/>/g, ">") // 替换>实体
|
|
.replace(/"/g, '"') // 替换"实体
|
|
.trim();
|
|
} catch (error) {
|
|
console.error("提取HTML文本失败:", error);
|
|
return htmlContent;
|
|
}
|
|
},
|
|
|
|
/**
|
|
* 获取活动类型
|
|
* @param {string} type - API返回的类型
|
|
* @returns {string} 标准化的活动类型
|
|
*/
|
|
getActivityType(type) {
|
|
if (!type) return ACTIVITY_TYPE.PRAYER;
|
|
|
|
const typeMap = {
|
|
1: ACTIVITY_TYPE.PRAYER, // 祈福活动
|
|
2: ACTIVITY_TYPE.CEREMONY, // 法会活动
|
|
3: ACTIVITY_TYPE.MEDITATION, // 禅修活动
|
|
4: ACTIVITY_TYPE.DONATION, // 捐赠活动
|
|
5: ACTIVITY_TYPE.VOLUNTEER, // 义工活动
|
|
};
|
|
|
|
return typeMap[type] || ACTIVITY_TYPE.PRAYER;
|
|
},
|
|
|
|
/**
|
|
* 获取活动状态
|
|
* @param {string} status - API返回的状态
|
|
* @param {string} startTime - 开始时间
|
|
* @param {string} endTime - 结束时间
|
|
* @returns {string} 标准化的活动状态
|
|
*/
|
|
getActivityStatus(status, startTime, endTime) {
|
|
if (!status || status === "0") {
|
|
return ACTIVITY_STATUS.FINISHED;
|
|
}
|
|
|
|
// 如果有时间信息,根据时间判断状态
|
|
if (startTime && endTime) {
|
|
const now = new Date();
|
|
const start = this.parseDateForIOS(startTime);
|
|
const end = this.parseDateForIOS(endTime);
|
|
|
|
if (now < start) {
|
|
return ACTIVITY_STATUS.REGISTERING;
|
|
} else if (now >= start && now <= end) {
|
|
return ACTIVITY_STATUS.ONGOING;
|
|
} else {
|
|
return ACTIVITY_STATUS.FINISHED;
|
|
}
|
|
}
|
|
|
|
// 默认根据status判断
|
|
const statusMap = {
|
|
1: ACTIVITY_STATUS.REGISTERING,
|
|
2: ACTIVITY_STATUS.ONGOING,
|
|
3: ACTIVITY_STATUS.FINISHED,
|
|
};
|
|
|
|
return statusMap[status] || ACTIVITY_STATUS.REGISTERING;
|
|
},
|
|
|
|
/**
|
|
* 兼容iOS的日期解析函数
|
|
* @param {string} dateString - 日期字符串
|
|
* @returns {Date} 解析后的日期对象
|
|
*/
|
|
parseDateForIOS(dateString) {
|
|
if (!dateString) return new Date();
|
|
|
|
try {
|
|
// 将 "yyyy-MM-dd HH:mm:ss" 格式转换为 "yyyy-MM-ddTHH:mm:ss" 格式以兼容iOS
|
|
const iosCompatibleDate = dateString.replace(" ", "T");
|
|
return new Date(iosCompatibleDate);
|
|
} catch (error) {
|
|
console.error("解析日期失败:", error);
|
|
return new Date();
|
|
}
|
|
},
|
|
|
|
/**
|
|
* 格式化活动时间
|
|
* @param {string} startTime - 开始时间
|
|
* @param {string} endTime - 结束时间
|
|
* @returns {string} 格式化后的时间字符串
|
|
*/
|
|
formatActivityTime(startTime, endTime) {
|
|
if (!startTime) return "";
|
|
|
|
try {
|
|
const start = this.parseDateForIOS(startTime);
|
|
const end = endTime ? this.parseDateForIOS(endTime) : null;
|
|
|
|
// 格式化日期
|
|
const formatDate = (date) => {
|
|
const year = date.getFullYear();
|
|
const month = String(date.getMonth() + 1).padStart(2, "0");
|
|
const day = String(date.getDate()).padStart(2, "0");
|
|
// const weekdays = [
|
|
// "周日",
|
|
// "周一",
|
|
// "周二",
|
|
// "周三",
|
|
// "周四",
|
|
// "周五",
|
|
// "周六",
|
|
// ];
|
|
// const weekday = weekdays[date.getDay()];
|
|
// const hours = String(date.getHours()).padStart(2, "0");
|
|
// const minutes = String(date.getMinutes()).padStart(2, "0");
|
|
//${weekday} ${hours}:${minutes}
|
|
|
|
return `${year}年${month}月${day}日`;
|
|
};
|
|
|
|
let timeStr = formatDate(start);
|
|
|
|
// 如果有结束时间,添加结束时间
|
|
if (end && end.getTime() !== start.getTime()) {
|
|
timeStr += "至";
|
|
timeStr += formatDate(end);
|
|
}
|
|
|
|
return timeStr;
|
|
} catch (error) {
|
|
console.error("格式化时间失败:", error);
|
|
return startTime;
|
|
}
|
|
},
|
|
|
|
/**
|
|
* 根据类型获取默认图片
|
|
* @param {string} type - 活动类型
|
|
* @returns {string} 默认图片路径
|
|
*/
|
|
getDefaultImageByType(type) {
|
|
const typeMap = {
|
|
1: "/static/image/a1.png", // 祈福活动
|
|
2: "/static/image/a2.png", // 法会活动
|
|
3: "/static/image/a3.png", // 禅修活动
|
|
4: "/static/image/a4.png", // 捐赠活动
|
|
5: "/static/image/a5.png", // 义工活动
|
|
};
|
|
|
|
return typeMap[type] || "/static/image/a1.png";
|
|
},
|
|
|
|
/**
|
|
* 验证活动数据是否有效
|
|
* @param {Object} activity - 活动数据
|
|
* @returns {boolean} 是否有效
|
|
*/
|
|
isValidActivity(activity) {
|
|
return activity && activity.id && activity.title && activity.status !== "0";
|
|
},
|
|
};
|