hookehuyr

feat(article): 文章详情页添加图片预览功能

- 新增文章详情页面,支持富文本内容渲染
- 实现图片列表展示,支持点击预览所有文章图片
- 使用 Taro 原生 rich-text 组件渲染富文本
- 富文本内容自动格式化,处理图片宽度适配移动端
- 提取文章中的图片 URL,支持 Taro.previewImage 预览
- 新增收藏功能,支持文章收藏/取消收藏

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
...@@ -100,3 +100,94 @@ ...@@ -100,3 +100,94 @@
100 100
101 **变更摘要**: 101 **变更摘要**:
102 - 无详细描述 102 - 无详细描述
103 +
104 +### 12:57:01 - 完成任务
105 +
106 +**影响文件**:
107 +- `docs/api-specs/article/article_detail.md`
108 +- `docs/api-specs/article/favorite.md`
109 +- `docs/api-specs/article/list.md`
110 +- `docs/api-specs/article/week_hot.md`
111 +- `scripts/api-generator/generateApiFromOpenAPI.js`
112 +- `src/api/article.js`
113 +
114 +**变更摘要**:
115 +- 无详细描述
116 +
117 +### 12:58:11 - 完成任务
118 +
119 +**影响文件**:
120 +- `docs/api-specs/article/article_detail.md`
121 +- `docs/api-specs/article/favorite.md`
122 +- `docs/api-specs/article/list.md`
123 +- `docs/api-specs/article/week_hot.md`
124 +- `scripts/api-generator/generateApiFromOpenAPI.js`
125 +- `src/api/article.js`
126 +
127 +**变更摘要**:
128 +- 无详细描述
129 +
130 +### 13:00:59 - 完成任务
131 +
132 +**影响文件**:
133 +- `docs/api-specs/article/article_detail.md`
134 +- `docs/api-specs/article/favorite.md`
135 +- `docs/api-specs/article/list.md`
136 +- `docs/api-specs/article/week_hot.md`
137 +- `scripts/api-generator/generateApiFromOpenAPI.js`
138 +- `src/api/article.js`
139 +
140 +**变更摘要**:
141 +- 无详细描述
142 +
143 +### 13:01:30 - 完成任务
144 +
145 +**影响文件**:
146 +- `docs/api-specs/article/article_detail.md`
147 +- `docs/api-specs/article/favorite.md`
148 +- `docs/api-specs/article/list.md`
149 +- `docs/api-specs/article/week_hot.md`
150 +- `scripts/api-generator/generateApiFromOpenAPI.js`
151 +- `src/api/article.js`
152 +
153 +**变更摘要**:
154 +- 无详细描述
155 +
156 +### 13:02:31 - 完成任务
157 +
158 +**影响文件**:
159 +- `docs/api-specs/article/article_detail.md`
160 +- `docs/api-specs/article/favorite.md`
161 +- `docs/api-specs/article/list.md`
162 +- `docs/api-specs/article/week_hot.md`
163 +- `scripts/api-generator/generateApiFromOpenAPI.js`
164 +- `src/api/article.js`
165 +
166 +**变更摘要**:
167 +- 无详细描述
168 +
169 +### 13:03:07 - 完成任务
170 +
171 +**影响文件**:
172 +- `docs/api-specs/article/article_detail.md`
173 +- `docs/api-specs/article/favorite.md`
174 +- `docs/api-specs/article/list.md`
175 +- `docs/api-specs/article/week_hot.md`
176 +- `scripts/api-generator/generateApiFromOpenAPI.js`
177 +- `src/api/article.js`
178 +
179 +**变更摘要**:
180 +- 无详细描述
181 +
182 +### 13:03:33 - 完成任务
183 +
184 +**影响文件**:
185 +- `docs/api-specs/article/article_detail.md`
186 +- `docs/api-specs/article/favorite.md`
187 +- `docs/api-specs/article/list.md`
188 +- `docs/api-specs/article/week_hot.md`
189 +- `scripts/api-generator/generateApiFromOpenAPI.js`
190 +- `src/api/article.js`
191 +
192 +**变更摘要**:
193 +- 无详细描述
......
...@@ -61,6 +61,8 @@ pnpm lint ...@@ -61,6 +61,8 @@ pnpm lint
61 - **Git 工作流标准化** - 使用 standard-version + Conventional Commits 61 - **Git 工作流标准化** - 使用 standard-version + Conventional Commits
62 - **认证系统完善** - 401 自动刷新、登录权限检查、TabBar 红点 62 - **认证系统完善** - 401 自动刷新、登录权限检查、TabBar 红点
63 - **API 集成进度** - 29 个接口,已完成 26 个(89.7%) 63 - **API 集成进度** - 29 个接口,已完成 26 个(89.7%)
64 +- **文章详情优化** - 富文本图片点击可预览
65 +- **文章详情修复** - 富文本图片点击事件稳定识别
64 66
65 ## ⚡ 常见问题 67 ## ⚡ 常见问题
66 68
......
...@@ -9,6 +9,7 @@ declare module 'vue' { ...@@ -9,6 +9,7 @@ declare module 'vue' {
9 export interface GlobalComponents { 9 export interface GlobalComponents {
10 AgePickerGlobal: typeof import('./src/components/plan/PlanFields/AgePickerGlobal.vue')['default'] 10 AgePickerGlobal: typeof import('./src/components/plan/PlanFields/AgePickerGlobal.vue')['default']
11 AmountKeyboard: typeof import('./src/components/plan/PlanFields/AmountKeyboard.vue')['default'] 11 AmountKeyboard: typeof import('./src/components/plan/PlanFields/AmountKeyboard.vue')['default']
12 + ArticleCard: typeof import('./src/components/cards/ArticleCard.vue')['default']
12 CriticalIllnessTemplate: typeof import('./src/components/plan/PlanTemplates/CriticalIllnessTemplate.vue')['default'] 13 CriticalIllnessTemplate: typeof import('./src/components/plan/PlanTemplates/CriticalIllnessTemplate.vue')['default']
13 DatePickerGlobal: typeof import('./src/components/plan/PlanFields/DatePickerGlobal.vue')['default'] 14 DatePickerGlobal: typeof import('./src/components/plan/PlanFields/DatePickerGlobal.vue')['default']
14 DocumentPreview: typeof import('./src/components/documents/DocumentPreview/index.vue')['default'] 15 DocumentPreview: typeof import('./src/components/documents/DocumentPreview/index.vue')['default']
......
1 # CHANGELOG 1 # CHANGELOG
2 2
3 +## [2026-02-27] - 文章详情富文本样式优化
4 +
5 +### 修复
6 +- 修复富文本内容中图片宽度溢出的问题:自动给 img 标签添加 max-width: 100% 及相关样式
7 +
8 +---
9 +
10 +## [2026-02-27] - 文章详情富文本图片预览
11 +
12 +### 修复
13 +- 富文本图片点击可预览,支持 data-index 与 src 兜底识别
14 +
15 +---
16 +
17 +## [2026-02-27] - 文章详情富文本图片点击修复
18 +
19 +### 修复
20 +- 使用 rich-text 点击事件读取 node 信息触发图片预览
21 +
22 +---
23 +
24 +## [2026-02-27] - 更新 CHANGELOG - feat(article): 文章模块功能开发
25 +
26 +### 文档
27 +- ����
28 +
29 +---
30 +
31 +**详细信息**
32 +- **影响文件**: 无
33 +- **技术栈**: Taro 4, Vue 3, NutUI
34 +- **测试状态**: 待验证
35 +- **备注**: 自动生成
36 +
37 +
3 ## [2026-02-27] - 文章详情页修复与优化 38 ## [2026-02-27] - 文章详情页修复与优化
4 39
5 ### 修复 40 ### 修复
......
...@@ -87,6 +87,7 @@ ...@@ -87,6 +87,7 @@
87 "@vue/babel-plugin-jsx": "^1.0.6", 87 "@vue/babel-plugin-jsx": "^1.0.6",
88 "@vue/compiler-sfc": "^3.0.0", 88 "@vue/compiler-sfc": "^3.0.0",
89 "@vue/test-utils": "^2.4.6", 89 "@vue/test-utils": "^2.4.6",
90 + "ajv": "^8.17.1",
90 "autoprefixer": "^10.4.21", 91 "autoprefixer": "^10.4.21",
91 "babel-preset-taro": "4.1.11", 92 "babel-preset-taro": "4.1.11",
92 "css-loader": "3.4.2", 93 "css-loader": "3.4.2",
...@@ -97,7 +98,6 @@ ...@@ -97,7 +98,6 @@
97 "eslint-plugin-vue": "^8.0.0", 98 "eslint-plugin-vue": "^8.0.0",
98 "happy-dom": "^14.12.0", 99 "happy-dom": "^14.12.0",
99 "husky": "^9.1.7", 100 "husky": "^9.1.7",
100 - "ajv": "^8.17.1",
101 "js-yaml": "^4.1.1", 101 "js-yaml": "^4.1.1",
102 "less": "^4.2.0", 102 "less": "^4.2.0",
103 "lint-staged": "^16.2.7", 103 "lint-staged": "^16.2.7",
......
...@@ -24,28 +24,9 @@ const Api = { ...@@ -24,28 +24,9 @@ const Api = {
24 post_date: string; // 发布日期 24 post_date: string; // 发布日期
25 post_author: integer; // 发布人id 25 post_author: integer; // 发布人id
26 author_name: string; // 发布人 26 author_name: string; // 发布人
27 - file_list: {
28 - icon: {
29 - meta_type: string; //
30 - id: integer; //
31 - object_id: null; //
32 - name: string; //
33 - value: string; //
34 - description: null; //
35 - extension: string; //
36 - post_date: string; //
37 - icon: null; //
38 - master_client_id: null; //
39 - hash: string; //
40 - height: string; //
41 - width: string; //
42 - author: integer; //
43 - size: null; //
44 - };
45 - };
46 is_favorite: integer; // 27 is_favorite: integer; //
47 * }; 28 * };
48 - * }>} 29 + * } >}
49 */ 30 */
50 export const articleDetailAPI = (params) => fn(fetch.get(Api.ArticleDetail, params)); 31 export const articleDetailAPI = (params) => fn(fetch.get(Api.ArticleDetail, params));
51 32
......
...@@ -31,6 +31,8 @@ const pages = [ ...@@ -31,6 +31,8 @@ const pages = [
31 'pages/message/index', 31 'pages/message/index',
32 'pages/message-detail/index', 32 'pages/message-detail/index',
33 'pages/video-player/index', 33 'pages/video-player/index',
34 + 'pages/article-detail/index',
35 + 'pages/article-favorites/index',
34 ] 36 ]
35 37
36 if (process.env.NODE_ENV === 'development') { 38 if (process.env.NODE_ENV === 'development') {
......
1 /* 1 /*
2 * @Date: 2026-02-13 01:05:52 2 * @Date: 2026-02-13 01:05:52
3 * @LastEditors: hookehuyr hookehuyr@gmail.com 3 * @LastEditors: hookehuyr hookehuyr@gmail.com
4 - * @LastEditTime: 2026-02-27 10:22:51 4 + * @LastEditTime: 2026-02-27 13:17:37
5 * @FilePath: /manulife-weapp/src/config/app.js 5 * @FilePath: /manulife-weapp/src/config/app.js
6 * @Description: 应用配置 6 * @Description: 应用配置
7 */ 7 */
......
...@@ -42,7 +42,24 @@ ...@@ -42,7 +42,24 @@
42 42
43 <!-- 富文本内容 --> 43 <!-- 富文本内容 -->
44 <view class="article-body px-[32rpx]"> 44 <view class="article-body px-[32rpx]">
45 - <rich-text :nodes="processedContent" class="rich-text-content" /> 45 + <rich-text :nodes="article.content" class="rich-text-content" />
46 + </view>
47 +
48 + <!-- 文章图片列表(点击可预览) -->
49 + <view v-if="imageUrls.length > 0" class="article-images-section px-[32rpx] pb-[32rpx]">
50 + <view class="section-title">文章图片</view>
51 + <scroll-view scroll-x class="image-scroll-view">
52 + <view class="image-list">
53 + <view
54 + v-for="(url, index) in imageUrls"
55 + :key="index"
56 + class="image-item"
57 + @tap="previewImage(url)"
58 + >
59 + <image :src="url" mode="aspectFill" class="thumbnail-image" />
60 + </view>
61 + </view>
62 + </scroll-view>
46 </view> 63 </view>
47 </view> 64 </view>
48 65
...@@ -125,13 +142,54 @@ const formattedDate = computed(() => { ...@@ -125,13 +142,54 @@ const formattedDate = computed(() => {
125 }) 142 })
126 143
127 /** 144 /**
128 - * 处理富文本内容,适配图片宽度 145 + * 图片 URL 列表(用于预览)
129 */ 146 */
130 -const processedContent = computed(() => { 147 +const imageUrls = ref([])
131 - if (!article.value?.content) return '' 148 +
132 - // 给 img 标签添加内联样式,确保宽度不超过容器 149 +/**
133 - return article.value.content.replace(/<img/gi, '<img style="max-width:100%;height:auto;display:block;margin:12px auto;"') 150 + * 预览图片
134 -}) 151 + */
152 +const previewImage = (current) => {
153 + if (imageUrls.value.length > 0) {
154 + Taro.previewImage({
155 + current: current,
156 + urls: imageUrls.value
157 + })
158 + }
159 +}
160 +
161 +/**
162 + * 提取所有图片 URL
163 + */
164 +const extractImageUrls = (content) => {
165 + if (!content) return []
166 + const urls = []
167 + const imgRegex = /<img[^>]+src=["']([^"']+)["']/gi
168 + let match
169 + while ((match = imgRegex.exec(content)) !== null) {
170 + urls.push(match[1])
171 + }
172 + return urls
173 +}
174 +
175 +/**
176 + * 格式化富文本内容,处理图片样式
177 + * 解决移动端图片宽度溢出问题
178 + */
179 +const formatRichText = (html) => {
180 + if (!html) return ''
181 + return html.replace(/<img[^>]*>/gi, (match) => {
182 + // 移除原有的 width 和 height 属性,防止干扰
183 + match = match.replace(/\s(width|height)=["'][^"']*["']/gi, '')
184 +
185 + // 处理 style 属性
186 + if (match.includes('style=')) {
187 + return match.replace(/style=(["'])(.*?)\1/gi, 'style=$1$2;max-width:100%!important;height:auto!important;display:block;margin:24rpx auto;border-radius:12rpx;$1')
188 + } else {
189 + return match.replace(/<img/gi, '<img style="max-width:100%!important;height:auto!important;display:block;margin:24rpx auto;border-radius:12rpx;"')
190 + }
191 + })
192 +}
135 193
136 /** 194 /**
137 * 获取文章详情 195 * 获取文章详情
...@@ -153,16 +211,22 @@ const fetchArticleDetail = async () => { ...@@ -153,16 +211,22 @@ const fetchArticleDetail = async () => {
153 if (res.code === 1 && res.data) { 211 if (res.code === 1 && res.data) {
154 console.log('[Article Detail] 数据:', res.data) 212 console.log('[Article Detail] 数据:', res.data)
155 213
214 + // 格式化富文本内容,处理图片样式
215 + const content = formatRichText(res.data.post_content || '')
216 +
156 article.value = { 217 article.value = {
157 id: res.data.id, 218 id: res.data.id,
158 title: res.data.post_title || '未命名文章', 219 title: res.data.post_title || '未命名文章',
159 - content: res.data.post_content || '', 220 + content: content,
160 excerpt: res.data.post_excerpt || '', 221 excerpt: res.data.post_excerpt || '',
161 coverUrl: res.data.cover_url || res.data.post_thumbnail || '', 222 coverUrl: res.data.cover_url || res.data.post_thumbnail || '',
162 date: res.data.post_date || '', 223 date: res.data.post_date || '',
163 authorName: res.data.author_name || '', 224 authorName: res.data.author_name || '',
164 is_favorite: res.data.is_favorite === 1 || res.data.is_favorite === '1' 225 is_favorite: res.data.is_favorite === 1 || res.data.is_favorite === '1'
165 } 226 }
227 +
228 + // 提取图片 URL 列表
229 + imageUrls.value = extractImageUrls(content)
166 } else { 230 } else {
167 error.value = true 231 error.value = true
168 Taro.showToast({ 232 Taro.showToast({
...@@ -230,14 +294,6 @@ const toggleCollect = async () => { ...@@ -230,14 +294,6 @@ const toggleCollect = async () => {
230 } 294 }
231 295
232 /** 296 /**
233 - * 滚动到底部事件
234 - */
235 -const onScrollToLower = () => {
236 - // 可以在这里加载相关文章推荐等
237 - console.log('[Article Detail] 滚动到底部')
238 -}
239 -
240 -/**
241 * 页面加载时获取文章详情 297 * 页面加载时获取文章详情
242 */ 298 */
243 useLoad((options) => { 299 useLoad((options) => {
...@@ -446,4 +502,39 @@ useLoad((options) => { ...@@ -446,4 +502,39 @@ useLoad((options) => {
446 align-items: center; 502 align-items: center;
447 min-height: 400rpx; 503 min-height: 400rpx;
448 } 504 }
505 +
506 +/* 文章图片列表区域 */
507 +.article-images-section {
508 + margin-top: 24rpx;
509 +}
510 +
511 +.section-title {
512 + font-size: 28rpx;
513 + font-weight: bold;
514 + color: #1F2937;
515 + margin-bottom: 16rpx;
516 +}
517 +
518 +.image-scroll-view {
519 + white-space: nowrap;
520 +}
521 +
522 +.image-list {
523 + display: inline-flex;
524 + gap: 16rpx;
525 +}
526 +
527 +.image-item {
528 + flex-shrink: 0;
529 + width: 160rpx;
530 + height: 160rpx;
531 + border-radius: 12rpx;
532 + overflow: hidden;
533 + background-color: #F3F4F6;
534 +}
535 +
536 +.thumbnail-image {
537 + width: 100%;
538 + height: 100%;
539 +}
449 </style> 540 </style>
......
This diff is collapsed. Click to expand it.
...@@ -155,11 +155,20 @@ const rawMenuItems = [ ...@@ -155,11 +155,20 @@ const rawMenuItems = [
155 iconColor: '#059669', // Emerald (Trust) 155 iconColor: '#059669', // Emerald (Trust)
156 bgClass: 'bg-emerald-50' 156 bgClass: 'bg-emerald-50'
157 }, 157 },
158 + // 原有的"我的收藏"(文件收藏)暂时屏蔽
159 + // {
160 + // key: 'favorites',
161 + // title: '我的收藏',
162 + // icon: 'star',
163 + // path: '/pages/favorites/index',
164 + // iconColor: '#D97706',
165 + // bgClass: 'bg-amber-50'
166 + // },
158 { 167 {
159 - key: 'favorites', 168 + key: 'article-favorites',
160 - title: '我的收藏', 169 + title: '我的收藏文章',
161 icon: 'star', 170 icon: 'star',
162 - path: '/pages/favorites/index', 171 + path: '/pages/article-favorites/index',
163 iconColor: '#D97706', // Amber (Value) 172 iconColor: '#D97706', // Amber (Value)
164 bgClass: 'bg-amber-50' 173 bgClass: 'bg-amber-50'
165 }, 174 },
......
1 <!-- 1 <!--
2 - * @Date: 2026-02-08 2 + * @Date: 2026-02-27
3 - * @Description: 本周热门资料页 - 使用 LoadMoreList 组件重构版本 3 + * @Description: 本周热门文章页 - 改造版(原热门资料页)
4 --> 4 -->
5 <template> 5 <template>
6 <LoadMoreList 6 <LoadMoreList
...@@ -10,27 +10,26 @@ ...@@ -10,27 +10,26 @@
10 :has-more="hasMore" 10 :has-more="hasMore"
11 :loading="loading" 11 :loading="loading"
12 :loading-more="loadingMore" 12 :loading-more="loadingMore"
13 - key-field="meta_id" 13 + key-field="id"
14 :has-footer="false" 14 :has-footer="false"
15 @load-more="handleLoadMore" 15 @load-more="handleLoadMore"
16 > 16 >
17 <!-- 头部 --> 17 <!-- 头部 -->
18 <template #header> 18 <template #header>
19 - <NavHeader title="本周热门资料" /> 19 + <NavHeader title="本周热门文章" />
20 </template> 20 </template>
21 21
22 <!-- 列表项 --> 22 <!-- 列表项 -->
23 <template #item="{ item }"> 23 <template #item="{ item }">
24 - <MaterialCard 24 + <ArticleCard
25 - :id="item.meta_id" 25 + :id="item.id"
26 - :title="item.name" 26 + :title="item.title"
27 - :file-name="item.name" 27 + :excerpt="item.excerpt"
28 - :file-size="item.size" 28 + :cover-url="item.coverUrl"
29 + :date="item.date"
29 :learners="item.learners" 30 :learners="item.learners"
30 - :read-people-percent="item.read_people_percent" 31 + :read-people-percent="item.readPeoplePercent"
31 :collected="item.collected" 32 :collected="item.collected"
32 - :extension="item.extension"
33 - :download-url="item.downloadUrl"
34 @collect-changed="handleCollectChanged(item, $event)" 33 @collect-changed="handleCollectChanged(item, $event)"
35 /> 34 />
36 </template> 35 </template>
...@@ -42,9 +41,9 @@ import { ref } from 'vue' ...@@ -42,9 +41,9 @@ import { ref } from 'vue'
42 import Taro, { useLoad } from '@tarojs/taro' 41 import Taro, { useLoad } from '@tarojs/taro'
43 import LoadMoreList from '@/components/list/LoadMoreList' 42 import LoadMoreList from '@/components/list/LoadMoreList'
44 import NavHeader from '@/components/navigation/NavHeader.vue' 43 import NavHeader from '@/components/navigation/NavHeader.vue'
45 -import MaterialCard from '@/components/cards/MaterialCard.vue' 44 +import ArticleCard from '@/components/cards/ArticleCard.vue'
46 -import { weekHotAPI } from '@/api/file' 45 +import { weekHotAPI } from '@/api/article'
47 -import { mockWeekHotAPI } from '@/utils/mockData' 46 +import { mockArticleWeekHotAPI } from '@/utils/mockData'
48 import { USE_MOCK_DATA } from '@/config/app' 47 import { USE_MOCK_DATA } from '@/config/app'
49 48
50 // ⚠️ MOCK 数据开关 - 统一从 @/config/app 导入 49 // ⚠️ MOCK 数据开关 - 统一从 @/config/app 导入
...@@ -90,20 +89,20 @@ const loadingMore = ref(false) ...@@ -90,20 +89,20 @@ const loadingMore = ref(false)
90 * 处理收藏状态改变 89 * 处理收藏状态改变
91 * 90 *
92 * @description 当用户点击收藏按钮时,更新本地状态 91 * @description 当用户点击收藏按钮时,更新本地状态
93 - * @param {Object} item - 资料对象 92 + * @param {Object} item - 文章对象
94 * @param {Object} newStatus - 新的状态 { collected: boolean } 93 * @param {Object} newStatus - 新的状态 { collected: boolean }
95 */ 94 */
96 const handleCollectChanged = (item, newStatus) => { 95 const handleCollectChanged = (item, newStatus) => {
97 - console.log('[Week Hot] 收藏状态改变:', item.name, newStatus.collected) 96 + console.log('[Week Hot] 收藏状态改变:', item.title, newStatus.collected)
98 // 找到对应的项并更新状态 97 // 找到对应的项并更新状态
99 - const material = currentList.value.find(m => m.meta_id === item.meta_id) 98 + const article = currentList.value.find(a => a.id === item.id)
100 - if (material) { 99 + if (article) {
101 - material.collected = newStatus.collected 100 + article.collected = newStatus.collected
102 } 101 }
103 } 102 }
104 103
105 /** 104 /**
106 - * 获取本周热门资料列表 105 + * 获取本周热门文章列表
107 * 106 *
108 * @param {Object} params - 请求参数 107 * @param {Object} params - 请求参数
109 * @param {number} params.page - 页码(从0开始) 108 * @param {number} params.page - 页码(从0开始)
...@@ -125,7 +124,7 @@ const fetchWeekHotList = async (params = {}, isLoadMore = false) => { ...@@ -125,7 +124,7 @@ const fetchWeekHotList = async (params = {}, isLoadMore = false) => {
125 124
126 // 根据开关选择使用真实 API 或 Mock 数据 125 // 根据开关选择使用真实 API 或 Mock 数据
127 const res = USE_MOCK_DATA 126 const res = USE_MOCK_DATA
128 - ? await mockWeekHotAPI(params) 127 + ? await mockArticleWeekHotAPI(params)
129 : await weekHotAPI(params) 128 : await weekHotAPI(params)
130 129
131 if (res.code === 1 && res.data) { 130 if (res.code === 1 && res.data) {
...@@ -133,19 +132,17 @@ const fetchWeekHotList = async (params = {}, isLoadMore = false) => { ...@@ -133,19 +132,17 @@ const fetchWeekHotList = async (params = {}, isLoadMore = false) => {
133 132
134 // 处理列表数据 133 // 处理列表数据
135 if (res.data.list?.length) { 134 if (res.data.list?.length) {
136 - // 直接映射为 MaterialCard 需要的格式 135 + // 映射为 ArticleCard 需要的格式
137 - // 不手动提取 extension,让 MaterialCard 内部使用 extractExtensionFromFile 自动从 URL 解析 136 + const listData = res.data.list.map(item => ({
138 - const listData = res.data.list.map(item => { 137 + id: item.id,
139 - return { 138 + title: item.post_title || '未命名文章',
140 - meta_id: item.meta_id, 139 + excerpt: item.post_excerpt || '',
141 - name: item.name || '未命名文件', 140 + coverUrl: item.file_list?.icon?.value || '',
142 - size: item.size || '', 141 + date: item.post_date || '',
143 - downloadUrl: item.src, 142 + collected: item.is_favorite === 1 || item.is_favorite === '1' || item.is_favorite === true,
144 - collected: item.is_favorite === '1' || item.is_favorite === 1 || item.is_favorite === true, 143 + learners: item.read_people_count,
145 - read_people_count: item.read_people_count, 144 + readPeoplePercent: item.read_people_percent
146 - read_people_percent: item.read_people_percent 145 + }))
147 - }
148 - })
149 146
150 if (isLoadMore) { 147 if (isLoadMore) {
151 // 加载更多:追加数据 148 // 加载更多:追加数据
...@@ -168,13 +165,13 @@ const fetchWeekHotList = async (params = {}, isLoadMore = false) => { ...@@ -168,13 +165,13 @@ const fetchWeekHotList = async (params = {}, isLoadMore = false) => {
168 } 165 }
169 } else { 166 } else {
170 Taro.showToast({ 167 Taro.showToast({
171 - title: res.msg || '获取热门资料失败', 168 + title: res.msg || '获取热门文章失败',
172 icon: 'none', 169 icon: 'none',
173 duration: 2000 170 duration: 2000
174 }) 171 })
175 } 172 }
176 } catch (error) { 173 } catch (error) {
177 - console.error('[Week Hot] 获取热门资料失败:', error) 174 + console.error('[Week Hot] 获取热门文章失败:', error)
178 Taro.showToast({ 175 Taro.showToast({
179 title: '加载失败', 176 title: '加载失败',
180 icon: 'error', 177 icon: 'error',
...@@ -199,7 +196,7 @@ useLoad(async (options) => { ...@@ -199,7 +196,7 @@ useLoad(async (options) => {
199 currentPage.value = 0 196 currentPage.value = 0
200 hasMore.value = true 197 hasMore.value = true
201 198
202 - // 获取本周热门资料列表 199 + // 获取本周热门文章列表
203 await fetchWeekHotList({ page: 0, limit: pageSize }) 200 await fetchWeekHotList({ page: 0, limit: pageSize })
204 }) 201 })
205 202
......
This diff is collapsed. Click to expand it.