<!--pages/project/detail.wxml-->
|
<view class="container" wx:if="{{!loading}}">
|
<!-- 项目基本信息 -->
|
<view class="project-card">
|
<view class="card-header">
|
<text class="card-title">项目信息</text>
|
<view class="status-tag status-{{projectDetail.state}}">
|
{{statusText}}
|
</view>
|
</view>
|
|
<view class="project-info">
|
<view class="info-row">
|
<text class="label">项目名称</text>
|
<text class="value">{{projectDetail.projectName || '未填写'}}</text>
|
</view>
|
<view class="info-row">
|
<text class="label">比赛名称</text>
|
<text class="value">{{projectDetail.activityName}}</text>
|
</view>
|
<view class="info-row full-width" wx:if="{{projectDetail.description}}">
|
<text class="label">项目描述</text>
|
<view class="description">{{projectDetail.description}}</view>
|
</view>
|
</view>
|
</view>
|
|
<!-- 项目附件 -->
|
<view class="attachments-card" wx:if="{{projectDetail.submissionFiles && projectDetail.submissionFiles.length > 0}}">
|
<view class="card-header">
|
<text class="card-title">项目附件</text>
|
</view>
|
|
<view class="attachments-list">
|
<view
|
class="attachment-item"
|
wx:for="{{projectDetail.submissionFiles}}"
|
wx:key="id"
|
bindtap="previewFile"
|
data-file="{{item}}"
|
>
|
<view class="file-info">
|
<!-- 图片预览 -->
|
<view class="file-preview" wx:if="{{item.mediaType === 'IMAGE'}}">
|
<image
|
class="preview-image"
|
src="{{item.fullThumbUrl || item.fullUrl}}"
|
mode="aspectFill"
|
/>
|
<view class="media-type-badge image-badge">图片</view>
|
</view>
|
<!-- 视频预览 -->
|
<view class="file-preview" wx:elif="{{item.mediaType === 'VIDEO'}}">
|
<image
|
class="preview-image"
|
src="{{item.fullThumbUrl || item.fullUrl}}"
|
mode="aspectFill"
|
/>
|
<view class="media-type-badge video-badge">视频</view>
|
<view class="play-icon">▶</view>
|
</view>
|
<!-- 其他文件类型 -->
|
<view class="file-icon" wx:else>
|
<text class="icon-file">📄</text>
|
</view>
|
<view class="file-details">
|
<text class="file-name">{{item.name}}</text>
|
<text class="file-size">{{item.fileSizeText}}</text>
|
</view>
|
</view>
|
<view class="file-actions">
|
<text class="action-btn">{{item.mediaType === 'IMAGE' ? '预览' : item.mediaType === 'VIDEO' ? '播放' : '查看'}}</text>
|
</view>
|
</view>
|
</view>
|
</view>
|
|
<!-- 比赛阶段时间轴 -->
|
<view class="timeline-card">
|
<view class="card-header">
|
<text class="card-title">比赛阶段</text>
|
</view>
|
|
<view class="timeline-loading" wx:if="{{timelineLoading}}">
|
<view class="loading-spinner small"></view>
|
<text class="loading-text">时间轴加载中...</text>
|
</view>
|
|
<view class="timeline-error" wx:elif="{{timelineError}}">
|
{{timelineError}}
|
</view>
|
|
<view class="timeline-wrapper" wx:elif="{{timeline.length > 0}}">
|
<view
|
class="timeline-item {{item.participated ? 'timeline-item-active' : 'timeline-item-inactive'}} {{item.isClickable ? 'timeline-item-clickable' : ''}}"
|
wx:for="{{timeline}}"
|
wx:key="stageId"
|
bindtap="openStageDetail"
|
data-player-id="{{item.activityPlayerId}}"
|
data-clickable="{{item.isClickable}}"
|
data-participated="{{item.participated}}"
|
>
|
<view class="timeline-axis">
|
<view class="timeline-dot"></view>
|
<view class="timeline-line" wx:if="{{index < timeline.length - 1}}"></view>
|
</view>
|
<view class="timeline-body">
|
<view class="timeline-title">
|
<text class="stage-name">{{item.stageName}}</text>
|
<text class="stage-score">{{item.scoreText}}</text>
|
</view>
|
<view class="timeline-sub">
|
<text class="stage-time">{{item.matchTimeText || '时间待定'}}</text>
|
<text class="stage-status" wx:if="{{item.participated}}">已参赛</text>
|
<text class="stage-status stage-status-inactive" wx:else>未参赛</text>
|
</view>
|
<view class="timeline-actions" wx:if="{{item.hasRating && item.activityPlayerId}}">
|
<text class="detail-link">【详情】</text>
|
</view>
|
</view>
|
</view>
|
</view>
|
|
<view class="timeline-empty" wx:else>
|
暂无阶段信息
|
</view>
|
</view>
|
|
<!-- 参赛人信息 - 已隐藏 -->
|
<!--
|
<view class="player-card" wx:if="{{projectDetail.playerInfo}}">
|
<view class="card-header">
|
<text class="card-title">参赛人信息</text>
|
</view>
|
|
<view class="player-info">
|
<view class="player-basic">
|
<image
|
class="player-avatar"
|
src="{{projectDetail.playerInfo.userInfo.avatarUrl || '/images/default-avatar.svg'}}"
|
mode="aspectFill"
|
></image>
|
<view class="player-details">
|
<text class="player-name">{{projectDetail.playerInfo.name}}</text>
|
<text class="player-phone">{{projectDetail.playerInfo.phone}}</text>
|
</view>
|
</view>
|
|
<view class="player-extended">
|
<view class="info-row" wx:if="{{projectDetail.playerInfo.gender}}">
|
<text class="label">性别</text>
|
<text class="value">{{genderText}}</text>
|
</view>
|
<view class="info-row" wx:if="{{projectDetail.playerInfo.education}}">
|
<text class="label">学历</text>
|
<text class="value">{{educationText}}</text>
|
</view>
|
<view class="info-row" wx:if="{{projectDetail.playerInfo.birthday}}">
|
<text class="label">生日</text>
|
<text class="value">{{projectDetail.playerInfo.birthday}}</text>
|
</view>
|
<view class="info-row full-width" wx:if="{{projectDetail.playerInfo.introduction}}">
|
<text class="label">个人简介</text>
|
<view class="description">{{projectDetail.playerInfo.introduction}}</view>
|
</view>
|
</view>
|
</view>
|
</view>
|
-->
|
|
<!-- 审核反馈信息 -->
|
<view class="feedback-card" wx:if="{{projectDetail.feedback}}">
|
<view class="card-header">
|
<text class="card-title">审核反馈</text>
|
</view>
|
|
<view class="feedback-content">
|
{{projectDetail.feedback}}
|
</view>
|
</view>
|
|
</view>
|
|
<!-- 加载状态 -->
|
<view class="loading-container" wx:if="{{loading}}">
|
<view class="loading-spinner"></view>
|
<text class="loading-text">加载中...</text>
|
</view>
|
|
<!-- 错误状态 -->
|
<view class="error-container" wx:if="{{error}}">
|
<text class="error-icon">⚠️</text>
|
<text class="error-text">{{error}}</text>
|
<button class="retry-btn" bindtap="loadProjectDetail">重试</button>
|
</view>
|
|
<!-- 阶段评分详情弹窗 -->
|
<view class="rating-detail-overlay" wx:if="{{showRatingDetail}}">
|
<view class="overlay-mask" bindtap="closeStageDetail"></view>
|
<view class="overlay-panel">
|
<view class="overlay-header">
|
<text class="overlay-title">{{ratingDetail ? ratingDetail.stageName : '评分详情'}}</text>
|
<view class="overlay-close" bindtap="closeStageDetail">×</view>
|
</view>
|
<text class="overlay-subtitle">{{ratingDetail && ratingDetail.matchTimeText ? ratingDetail.matchTimeText : '时间待定'}}</text>
|
<view class="overlay-summary">
|
<text class="summary-score">平均分:{{ratingDetail ? ratingDetail.averageScoreText : '暂无评分'}}</text>
|
<text class="summary-count">评委数:{{ratingDetail ? ratingDetail.ratingCount : 0}}</text>
|
</view>
|
<view class="overlay-body">
|
<view class="panel-loading" wx:if="{{ratingDetailLoading}}">
|
<view class="loading-spinner small"></view>
|
<text class="loading-text">加载评分详情...</text>
|
</view>
|
<view class="panel-error" wx:elif="{{ratingDetailError}}">{{ratingDetailError}}</view>
|
<block wx:else>
|
<view class="judge-item" wx:for="{{(ratingDetail && ratingDetail.judgeRatings) ? ratingDetail.judgeRatings : []}}" wx:key="judgeId">
|
<view class="judge-header">
|
<text class="judge-name">{{item.judgeName}}</text>
|
<text class="judge-score">{{item.totalScoreText}}</text>
|
</view>
|
<text class="judge-time" wx:if="{{item.ratingTimeText}}">{{item.ratingTimeText}}</text>
|
<view class="judge-feedback" wx:if="{{item.feedback}}">{{item.feedback}}</view>
|
</view>
|
<view class="panel-empty" wx:if="{{ratingDetail && ratingDetail.judgeRatings && ratingDetail.judgeRatings.length === 0}}">
|
暂无评分详情
|
</view>
|
</block>
|
</view>
|
</view>
|
</view>
|