quling
2026-08-22 b37d5e642873864ec68edc2809efa1dcbafb9de6
feat0806: 实现养生科普的点击量
3个文件已修改
22 ■■■■■ 已修改文件
tcm-training-admin-backend/src/main/java/com/tcm/training/admin/app/popularization/service/AppHealthPopularizationService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
tcm-training-admin-backend/src/main/java/com/tcm/training/admin/app/popularization/vo/AppHealthPopularizationDetailVO.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
traditionalApp/pages/articleDetail/articleDetail.vue 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
tcm-training-admin-backend/src/main/java/com/tcm/training/admin/app/popularization/service/AppHealthPopularizationService.java
@@ -6,6 +6,7 @@
import com.tcm.training.admin.live.entity.HealthPopularization;
import com.tcm.training.admin.live.mapper.HealthPopularizationMapper;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Collections;
@@ -58,10 +59,14 @@
    }
    /**
     * 获取 APP 健康科普详情页数据。
     * 获取 APP 健康科普详情页数据,并在每次访问时累加点击量。
     */
    @Transactional
    public AppHealthPopularizationDetailVO detail(Long popularizationId) {
        HealthPopularization item = requireEnabledItem(popularizationId);
        // 参考项目介绍,APP 进入详情后累加点击量并回写。
        item.setClickCount(defaultNumber(item.getClickCount()) + 1);
        healthPopularizationMapper.updateById(item);
        AppHealthPopularizationDetailVO detailVO = new AppHealthPopularizationDetailVO();
        detailVO.setId(item.getId());
        detailVO.setTitle(trimToEmpty(item.getTitle()));
@@ -72,6 +77,7 @@
        detailVO.setVideoUrl(trimToEmpty(item.getVideoUrl()));
        detailVO.setVideoFileName(trimToEmpty(item.getVideoFileName()));
        detailVO.setVideoDescription(trimToEmpty(item.getVideoDescription()));
        detailVO.setClickCount(defaultNumber(item.getClickCount()));
        return detailVO;
    }
tcm-training-admin-backend/src/main/java/com/tcm/training/admin/app/popularization/vo/AppHealthPopularizationDetailVO.java
@@ -27,4 +27,6 @@
    private String videoFileName;
    private String videoDescription;
    private Integer clickCount;
}
traditionalApp/pages/articleDetail/articleDetail.vue
@@ -100,7 +100,8 @@
    const contentNodes = computed(() => buildRichTextNodes(detail.value.content, '暂无详情内容'))
    /**
     * 初始化导航栏所需的状态栏高度。
     * 初始化导航栏所需的状态栏高度;详情加载已在 onLoad 中完成,
     * 此处仅在 onLoad 未取到主键时做一次兜底,避免详情接口被请求两次。
     */
    onMounted(() => {
        uni.getSystemInfo({
@@ -108,12 +109,15 @@
                statusBarHeight.value = res.statusBarHeight || 0
            }
        })
        if (popularizationId.value) {
            return
        }
        setTimeout(() => {
            const pageOptions = getCurrentPageOptions()
            if (!popularizationId.value) {
                popularizationId.value = normalizeRouteParam(pageOptions?.id)
            popularizationId.value = normalizeRouteParam(pageOptions?.id)
            if (popularizationId.value) {
                loadDetail()
            }
            loadDetail()
        }, 0)
    })