From 45f5884119d46d2772358011e9f6ba23d6dbae43 Mon Sep 17 00:00:00 2001 From: minimaxagent1 Date: Mon, 4 Aug 2025 11:47:19 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B4=BB=E5=8A=A8=E8=AF=A6=E7=BB=86=E5=8A=A8?= =?UTF-8?q?=E6=80=81=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/activity/activity.js | 7 +- components/activity-card/activity-card.vue | 41 +- pages.json | 9 + pages/activity/activity.vue | 7 +- pages/activity/activityDetail.vue | 464 +++++++++++++++++++++ utils/activity-data-formatter.js | 81 +++- 6 files changed, 574 insertions(+), 35 deletions(-) create mode 100644 pages/activity/activityDetail.vue diff --git a/api/activity/activity.js b/api/activity/activity.js index d72af2e..0938186 100644 --- a/api/activity/activity.js +++ b/api/activity/activity.js @@ -30,8 +30,11 @@ export default { */ getActivityDetail(id) { return request({ - url: `/app/activitie/detail/${id}`, - method: 'GET' + url: '/app/activitie', + method: 'GET', + params: { + actId: id + } }) }, diff --git a/components/activity-card/activity-card.vue b/components/activity-card/activity-card.vue index 235b423..9fdf294 100644 --- a/components/activity-card/activity-card.vue +++ b/components/activity-card/activity-card.vue @@ -14,8 +14,8 @@ - - {{ activity.theme }} + + 活动主题:{{ activity.name }} @@ -114,7 +114,7 @@ export default { // 处理报名 handleRegister() { this.$emit('register', this.activity) - } + }, } } @@ -180,42 +180,33 @@ export default { .activity-theme { .theme-text { + font-weight: 400; font-size: 28rpx; - color: #fff; - line-height: 1.4; + color: #FFFFFF; + line-height: 38rpx; } } .activity-name { .name-text { - font-size: 36rpx; - font-weight: bold; - color: #fff; - margin: 10rpx 0; + font-weight: 500; + font-size: 32rpx; + color: #FFFFFF; + line-height: 44rpx; } } .activity-status { .status-text { - font-size: 24rpx; - padding: 8rpx 16rpx; + padding: 8rpx 0rpx; border-radius: 20rpx; display: inline-block; + font-weight: 500; + font-size: 32rpx; + color: #FFFFFF; + line-height: 44rpx; - &.status-registering { - color: #FFD700; - background: rgba(255, 215, 0, 0.2); - } - - &.status-ongoing { - color: #4CAF50; - background: rgba(76, 175, 80, 0.2); - } - - &.status-finished { - color: #9E9E9E; - background: rgba(158, 158, 158, 0.2); - } + } } diff --git a/pages.json b/pages.json index ffecedd..a002ecd 100644 --- a/pages.json +++ b/pages.json @@ -127,6 +127,15 @@ "enablePullDownRefresh": false, "navigationStyle": "custom" } + }, + { + "path" : "pages/activity/activityDetail", + "style" : + { + "navigationBarTitleText": "", + "enablePullDownRefresh": false, + "navigationStyle": "custom" + } } ], diff --git a/pages/activity/activity.vue b/pages/activity/activity.vue index 3ecee8a..775e851 100644 --- a/pages/activity/activity.vue +++ b/pages/activity/activity.vue @@ -147,10 +147,9 @@ export default { // 处理卡片点击 handleCardClick(activity) { console.log('点击活动卡片:', activity) - // TODO: 跳转到活动详情页 - uni.showToast({ - title: '活动详情功能开发中', - icon: 'none' + // 跳转到活动详情页 + uni.navigateTo({ + url: `/pages/activity/activityDetail?actId=${activity.id}` }) }, diff --git a/pages/activity/activityDetail.vue b/pages/activity/activityDetail.vue new file mode 100644 index 0000000..b1673a5 --- /dev/null +++ b/pages/activity/activityDetail.vue @@ -0,0 +1,464 @@ + + + + + \ No newline at end of file diff --git a/utils/activity-data-formatter.js b/utils/activity-data-formatter.js index 25ca456..0c720bf 100644 --- a/utils/activity-data-formatter.js +++ b/utils/activity-data-formatter.js @@ -45,6 +45,61 @@ export default { } }, + /** + * 格式化活动详情数据 + * @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返回的类型 @@ -79,8 +134,8 @@ export default { // 如果有时间信息,根据时间判断状态 if (startTime && endTime) { const now = new Date() - const start = new Date(startTime) - const end = new Date(endTime) + const start = this.parseDateForIOS(startTime) + const end = this.parseDateForIOS(endTime) if (now < start) { return ACTIVITY_STATUS.REGISTERING @@ -101,6 +156,24 @@ export default { 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 - 开始时间 @@ -111,8 +184,8 @@ export default { if (!startTime) return '' try { - const start = new Date(startTime) - const end = endTime ? new Date(endTime) : null + const start = this.parseDateForIOS(startTime) + const end = endTime ? this.parseDateForIOS(endTime) : null // 格式化日期 const formatDate = (date) => {