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), // 额外信息 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"; }, };