| | |
| | | {{reviewStatus === 'COMPLETED' ? '已评审' : '待评审'}} |
| | | </view> |
| | | </view> |
| | | |
| | | |
| | | <view class="submission-detail"> |
| | | <text class="submission-title">{{submission.title}}</text> |
| | | <text class="submission-desc">{{submission.description}}</text> |
| | | |
| | | <text class="submission-desc">{{submission.description || '暂无项目描述'}}</text> |
| | | |
| | | <!-- 参赛者信息 --> |
| | | <view class="participant-info"> |
| | | <view class="participant-header"> |
| | | <text class="participant-label">参赛者:</text> |
| | | <view class="contact-btn" bindtap="onContactParticipant"> |
| | | <text class="contact-icon">💬</text> |
| | | <text class="contact-text">联系</text> |
| | | <text class="contact-icon">📞</text> |
| | | <text class="contact-text">拨打电话</text> |
| | | </view> |
| | | </view> |
| | | |
| | | |
| | | <view class="participant-detail"> |
| | | <image class="participant-avatar" src="{{submission.participant.avatar}}" mode="aspectFill"></image> |
| | | <view class="participant-text"> |
| | | <text class="participant-name">{{submission.participant.name}}</text> |
| | | <text class="participant-school">{{submission.participant.school}} - {{submission.participant.major}}</text> |
| | | <text class="participant-name">{{submission.participant.name || '匿名'}}</text> |
| | | <text class="participant-meta">性别:{{submission.participant.gender || '未填写'}},出生日期:{{submission.participant.birthday || '未填写'}}</text> |
| | | <text class="participant-field">所属区域:{{submission.participant.region || '未填写'}}</text> |
| | | <text class="participant-field">学历:{{submission.participant.education || '未填写'}}</text> |
| | | </view> |
| | | </view> |
| | | |
| | | <!-- 团队信息 --> |
| | | <view wx:if="{{submission.team}}" class="team-info"> |
| | | <text class="team-label">团队:{{submission.team.name}}</text> |
| | | |
| | | <view wx:if="{{submission.team && submission.team.members}}" class="team-info"> |
| | | <text class="team-label">团队:{{submission.team.name || '未命名团队'}}</text> |
| | | <view class="team-members"> |
| | | <view wx:for="{{submission.team.members}}" wx:key="id" class="team-member"> |
| | | <text class="member-name">{{item.name}}</text> |
| | |
| | | </view> |
| | | </view> |
| | | </view> |
| | | |
| | | <text class="submit-time">提交时间:{{formatDate(submission.submittedAt)}}</text> |
| | | |
| | | </view> |
| | | </view> |
| | | |
| | | <!-- 作品媒体 --> |
| | | <view wx:if="{{submission.images.length > 0 || submission.videos.length > 0}}" class="media-section"> |
| | | <text class="section-title">作品展示</text> |
| | | |
| | | <!-- 图片 --> |
| | | <view wx:if="{{submission.images.length > 0}}" class="media-grid"> |
| | | <view |
| | | wx:for="{{submission.images}}" |
| | | wx:key="*this" |
| | | class="media-item image-item" |
| | | data-url="{{item}}" |
| | | data-type="image" |
| | | bindtap="onMediaTap" |
| | | > |
| | | <image class="media-image" src="{{item}}" mode="aspectFill"></image> |
| | | </view> |
| | | </view> |
| | | |
| | | <!-- 视频 --> |
| | | <view wx:if="{{submission.videos.length > 0}}" class="media-grid"> |
| | | <view |
| | | wx:for="{{submission.videos}}" |
| | | wx:key="*this" |
| | | class="media-item video-item" |
| | | data-url="{{item}}" |
| | | data-type="video" |
| | | bindtap="onMediaTap" |
| | | > |
| | | <video class="media-video" src="{{item}}" poster="{{item}}" controls></video> |
| | | <view class="play-overlay"> |
| | | <text class="play-icon">▶</text> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | |
| | | <!-- 作品文件 --> |
| | | <view wx:if="{{submission.files.length > 0}}" class="files-section"> |
| | | <text class="section-title">作品文件</text> |
| | | |
| | | <view class="file-list"> |
| | | <view |
| | | wx:for="{{submission.files}}" |
| | | <!-- 作品素材 --> |
| | | <view wx:if="{{submission.mediaList && submission.mediaList.length > 0}}" class="media-section"> |
| | | <text class="section-title">参赛作品</text> |
| | | <view class="media-list"> |
| | | <view |
| | | wx:for="{{submission.mediaList}}" |
| | | wx:key="id" |
| | | class="file-item" |
| | | class="media-item" |
| | | bindtap="onMediaTap" |
| | | data-index="{{index}}" |
| | | > |
| | | <view class="file-info"> |
| | | <text class="file-icon">📄</text> |
| | | <view class="file-detail"> |
| | | <text class="file-name">{{item.name}}</text> |
| | | <text class="file-size">{{getFileSizeText(item.size)}}</text> |
| | | </view> |
| | | <view class="media-thumb-wrapper"> |
| | | <image |
| | | wx:if="{{item.mediaType === 'image' || item.mediaType === 'video'}}" |
| | | class="media-thumb" |
| | | src="{{item.thumbUrl}}" |
| | | mode="aspectFill" |
| | | /> |
| | | <view wx:elif="{{item.mediaType === 'pdf'}}" class="media-icon pdf">PDF</view> |
| | | <view wx:elif="{{item.mediaType === 'word'}}" class="media-icon doc">DOC</view> |
| | | <view wx:else class="media-icon file">FILE</view> |
| | | <view wx:if="{{item.mediaType === 'video'}}" class="media-play">▶</view> |
| | | </view> |
| | | |
| | | <view |
| | | class="download-btn {{item.isDownloading ? 'downloading' : ''}}" |
| | | data-file-id="{{item.id}}" |
| | | data-file-name="{{item.name}}" |
| | | data-file-url="{{item.url}}" |
| | | bindtap="onDownloadFile" |
| | | > |
| | | <text class="download-icon">{{item.isDownloading ? '⏳' : '⬇'}}</text> |
| | | <text class="download-text">{{item.isDownloading ? '下载中' : '下载'}}</text> |
| | | <view class="media-info"> |
| | | <text class="media-name">{{item.name}}</text> |
| | | <text class="media-size">{{getFileSizeText(item.size)}}</text> |
| | | </view> |
| | | </view> |
| | | </view> |
| | |
| | | <!-- 评审标准 --> |
| | | <view class="criteria-section"> |
| | | <text class="section-title">评审标准</text> |
| | | |
| | | |
| | | <view class="criteria-list"> |
| | | <view wx:for="{{criteria}}" wx:key="id" class="criterion-item"> |
| | | <view class="criterion-header"> |
| | | <text class="criterion-name">{{item.name}}</text> |
| | | <text class="criterion-score">{{scores[item.id] || 0}}/{{item.maxScore}}分</text> |
| | | <text class="criterion-score">{{scores[item.id] || 0}} / {{item.maxScore}} 分</text> |
| | | </view> |
| | | |
| | | <text class="criterion-desc">{{item.description}}</text> |
| | | |
| | | <!-- 评分选择器 --> |
| | | <view class="score-selector"> |
| | | <picker |
| | | range="{{scoreOptions}}" |
| | | range-key="label" |
| | | value="{{(scores[item.id] || 1) - 1}}" |
| | | |
| | | <text class="criterion-desc">{{item.description || '暂无评分说明'}}</text> |
| | | |
| | | <view class="score-control"> |
| | | <view class="score-btn" data-criterion-id="{{item.id}}" data-index="{{index}}" bindtap="decreaseScore">-</view> |
| | | <input |
| | | class="score-input" |
| | | type="digit" |
| | | value="{{scores[item.id] || 0}}" |
| | | data-criterion-id="{{item.id}}" |
| | | bindchange="onScoreChange" |
| | | disabled="{{reviewStatus === 'COMPLETED'}}" |
| | | > |
| | | <view class="score-picker {{reviewStatus === 'COMPLETED' ? 'disabled' : ''}}"> |
| | | <text class="score-text">{{getScoreLabel(scores[item.id] || 0)}}</text> |
| | | <text class="picker-arrow">{{reviewStatus === 'COMPLETED' ? '' : '▼'}}</text> |
| | | </view> |
| | | </picker> |
| | | data-index="{{index}}" |
| | | bindinput="onScoreChange" |
| | | placeholder="0" |
| | | /> |
| | | <view class="score-btn" data-criterion-id="{{item.id}}" data-index="{{index}}" bindtap="increaseScore">+</view> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | |
| | | <!-- 总分显示 --> |
| | | |
| | | <view class="total-score"> |
| | | <text class="total-label">总分:</text> |
| | | <text class="total-value">{{totalScore}}/{{maxScore}}分</text> |
| | | <text class="total-value">{{totalScore}} / {{maxScore}} 分</text> |
| | | </view> |
| | | </view> |
| | | |
| | | <!-- 评审意见 --> |
| | | <view class="comment-section"> |
| | | <text class="section-title">评审意见</text> |
| | | |
| | | <textarea |
| | | class="comment-input {{reviewStatus === 'COMPLETED' ? 'disabled' : ''}}" |
| | | placeholder="请填写详细的评审意见,包括作品的优点、不足和改进建议..." |
| | | <textarea |
| | | class="comment-input" |
| | | placeholder="请填写详细评审意见,包括作品优点、不足和改进建议..." |
| | | value="{{comment}}" |
| | | maxlength="1000" |
| | | show-confirm-bar="{{false}}" |
| | | disabled="{{reviewStatus === 'COMPLETED'}}" |
| | | bindinput="onCommentInput" |
| | | ></textarea> |
| | | |
| | | <view class="comment-counter"> |
| | | <text class="counter-text">{{comment.length}}/1000</text> |
| | | <text class="counter-text">{{comment.length}} / 1000</text> |
| | | </view> |
| | | </view> |
| | | |
| | | <!-- 已有评审记录 --> |
| | | <!-- 既有评审 --> |
| | | <view wx:if="{{existingReview}}" class="existing-review"> |
| | | <text class="section-title">评审记录</text> |
| | | |
| | | <text class="section-title">历史评审</text> |
| | | <view class="review-info"> |
| | | <text class="review-time">评审时间:{{formatDate(existingReview.reviewedAt)}}</text> |
| | | <text class="review-total">总分:{{existingReview.totalScore}}/{{maxScore}}分</text> |
| | | <text class="review-time">评审时间:{{formatDate(existingReview.reviewedAt) || '未知'}}</text> |
| | | <text class="review-total">总分:{{existingReview.totalScore}} / {{maxScore}} 分</text> |
| | | </view> |
| | | |
| | | <view class="other-reviews-btn" bindtap="onViewOtherReviews"> |
| | | <text class="other-reviews-icon">👥</text> |
| | | <text class="other-reviews-text">查看其他评审</text> |
| | | <text class="other-reviews-text">查看其他评委评分</text> |
| | | </view> |
| | | </view> |
| | | |
| | | <!-- 底部操作栏 --> |
| | | <view wx:if="{{reviewStatus !== 'COMPLETED'}}" class="bottom-actions"> |
| | | <view class="action-btn draft-btn" bindtap="onSaveDraft"> |
| | | <text class="btn-icon">💾</text> |
| | | <text class="btn-text">保存草稿</text> |
| | | </view> |
| | | |
| | | <view |
| | | <!-- 底部操作 --> |
| | | <view class="bottom-actions"> |
| | | <view |
| | | class="action-btn submit-btn {{submitting ? 'submitting' : ''}}" |
| | | bindtap="onSubmitReview" |
| | | > |
| | |
| | | </view> |
| | | </view> |
| | | </view> |
| | | |
| | | <!-- 视频预览模态框 --> |
| | | <view wx:if="{{showMediaPreview}}" class="media-preview-modal"> |
| | | <view class="modal-overlay" bindtap="onCloseMediaPreview"></view> |
| | | <view class="modal-content"> |
| | | <view class="modal-header"> |
| | | <text class="modal-title">视频预览</text> |
| | | <view class="close-btn" bindtap="onCloseMediaPreview"> |
| | | <text class="close-icon">✕</text> |
| | | </view> |
| | | </view> |
| | | |
| | | <view class="modal-body"> |
| | | <video |
| | | wx:if="{{mediaType === 'video'}}" |
| | | class="preview-video" |
| | | src="{{currentMedia}}" |
| | | controls |
| | | autoplay |
| | | ></video> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </view> |