From 58d9f460b2f8c34430285115e2557d18333c5cab Mon Sep 17 00:00:00 2001 From: Codex Assistant <codex@example.com> Date: 星期三, 08 十月 2025 14:16:55 +0800 Subject: [PATCH] feat: 修复Player实体phone字段数据冗余问题并优化小程序报名逻辑 --- wx/pages/judge/review.wxml | 211 ++++++++++++++-------------------------------------- 1 files changed, 57 insertions(+), 154 deletions(-) diff --git a/wx/pages/judge/review.wxml b/wx/pages/judge/review.wxml index 1ed466d..0a2cae6 100644 --- a/wx/pages/judge/review.wxml +++ b/wx/pages/judge/review.wxml @@ -16,32 +16,37 @@ {{reviewStatus === 'COMPLETED' ? '宸茶瘎瀹�' : '寰呰瘎瀹�'}} </view> </view> - + <view class="submission-detail"> - <text class="submission-title">{{submission.title}}</text> - <text class="submission-desc">{{submission.description}}</text> - + <view style="display: flex; flex-direction: column;"> + <text class="submission-title">{{submission.title}}</text> + <text class="submission-desc">{{submission.description || '鏆傛棤椤圭洰鎻忚堪'}}</text> + </view> + + <!-- 鍙傝禌鑰呬俊鎭� --> <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-field">鎬у埆锛歿{submission.participant.gender || '鏈~鍐�'}}</text> + <text class="participant-field">鍑虹敓鏃ユ湡锛歿{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> @@ -50,74 +55,25 @@ </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 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="media-item" bindtap="onMediaTap" data-index="{{index}}"> + <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> - </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}}" - wx:key="id" - class="file-item" - > - <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> - - <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> @@ -126,113 +82,60 @@ <!-- 璇勫鏍囧噯 --> <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}}" - 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> + + <!-- 璇勫垎璇存槑宸茬Щ闄わ紝涓嶹eb绔繚鎸佷竴鑷� --> + + <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}}" 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="璇峰~鍐欒缁嗙殑璇勫鎰忚锛屽寘鎷綔鍝佺殑浼樼偣銆佷笉瓒冲拰鏀硅繘寤鸿..." - value="{{comment}}" - maxlength="1000" - show-confirm-bar="{{false}}" - disabled="{{reviewStatus === 'COMPLETED'}}" - bindinput="onCommentInput" - ></textarea> - + <textarea class="comment-input" placeholder="璇峰~鍐欒缁嗚瘎瀹℃剰瑙侊紝鍖呮嫭浣滃搧浼樼偣銆佷笉瓒冲拰鏀硅繘寤鸿..." value="{{comment}}" show-confirm-bar="{{false}}" bindinput="onCommentInput"></textarea> <view class="comment-counter"> - <text class="counter-text">{{comment.length}}/1000</text> + <text class="counter-text">{{comment.length}} 瀛�</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 - class="action-btn submit-btn {{submitting ? 'submitting' : ''}}" - bindtap="onSubmitReview" - > + <!-- 搴曢儴鎿嶄綔 --> + <view class="bottom-actions"> + <view class="action-btn submit-btn {{submitting ? 'submitting' : ''}}" bindtap="onSubmitReview"> <text class="btn-icon">{{submitting ? '鈴�' : '鉁�'}}</text> <text class="btn-text">{{submitting ? '鎻愪氦涓�...' : '鎻愪氦璇勫'}}</text> </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> \ No newline at end of file +</view> -- Gitblit v1.8.0