import { View, Text, Image, Button, ScrollView } from '@tarojs/components' import Taro, { useLoad, useShareAppMessage, useShareTimeline, useRouter } from '@tarojs/taro' import { useState } from 'react' import { getProjectDetail, getComments } from '../../api' import MarkdownReader from '../../components/MarkdownReader' import './project-detail.scss' export default function ProjectDetail() { const [project, setProject] = useState(null) const [comments, setComments] = useState([]) const [loading, setLoading] = useState(false) const router = useRouter() useLoad((options) => { const { id } = options if (id) { fetchProject(id) fetchComments(id) } }) /** * 配置并监听分享给朋友的功能 */ useShareAppMessage(() => { const id = project?.id || router.params.id || '' return { title: project?.title || '项目详情', path: `/pages/competition/project-detail?id=${id}`, imageUrl: project?.display_cover_image || project?.cover_image_url || '' } }) /** * 配置并监听分享到朋友圈的功能 */ useShareTimeline(() => { const id = project?.id || router.params.id || '' return { title: project?.title || '项目详情', query: `id=${id}`, imageUrl: project?.display_cover_image || project?.cover_image_url || '' } }) /** * 获取项目详情 * @param id 项目ID */ const fetchProject = async (id) => { setLoading(true) try { const res = await getProjectDetail(id) setProject(res) } catch (e) { Taro.showToast({ title: '加载项目详情失败', icon: 'none' }) } finally { setLoading(false) } } /** * 获取项目评语 * @param id 项目ID */ const fetchComments = async (id) => { try { const res = await getComments({ project: id }) const list = res.results || res.data || res || [] setComments(Array.isArray(list) ? list : []) } catch (e) { console.error('获取评语失败', e) } } /** * 打开/下载附件 * @param file 文件对象 */ const handleOpenFile = (file) => { if (!file.file) return // 如果是图片,预览 if (file.file.match(/\.(jpg|jpeg|png|gif)$/i)) { Taro.previewImage({ urls: [file.file] }) return } // 其他文件尝试下载打开 Taro.showLoading({ title: '下载中...' }) Taro.downloadFile({ url: file.file, success: (res) => { const filePath = res.tempFilePath Taro.openDocument({ filePath, success: () => console.log('打开文档成功'), fail: (err) => { console.error(err) Taro.showToast({ title: '打开文件失败', icon: 'none' }) } }) }, fail: () => { Taro.showToast({ title: '下载文件失败', icon: 'none' }) }, complete: () => { Taro.hideLoading() } }) } if (loading || !project) return 加载中... return ( {project.title} {project.contestant_info?.nickname || '参赛者'} 项目介绍 {project.description ? : 暂无介绍} 团队介绍 {project.team_info || '暂无团队信息'} 项目附件 {project.files && project.files.length > 0 ? ( {project.files.map((file, index) => ( handleOpenFile(file)}> {file.name || '附件 ' + (index + 1)} 查看 ))} ) : ( 暂无附件 )} 评委评语 {comments.length > 0 ? ( {comments.map((c) => ( {c.judge_name || '评委'} {c.score && ( {c.score} )} {c.created_at?.substring(0, 16)} {c.content} ))} ) : ( 暂无评语 )} ) }