From c4938f6f4e839890b032c75c7a57333a6a9157a9 Mon Sep 17 00:00:00 2001
From: peng <peng.com>
Date: 星期四, 06 十一月 2025 17:06:10 +0800
Subject: [PATCH] 添加新闻功能
---
wx/pages/project/detail.js | 360 +++++++++++++++++++++++++++++++-----------------------------
1 files changed, 186 insertions(+), 174 deletions(-)
diff --git a/wx/pages/project/detail.js b/wx/pages/project/detail.js
index 49a5ed8..779d642 100644
--- a/wx/pages/project/detail.js
+++ b/wx/pages/project/detail.js
@@ -5,18 +5,18 @@
data: {
projectId: '',
projectDetail: null,
- timeline: [],
+ ratingStats: null,
loading: true,
error: '',
statusText: '',
genderText: '',
educationText: '',
+ // 鏃堕棿杞寸浉鍏虫暟鎹�
+ timeline: [],
timelineLoading: false,
timelineError: '',
showRatingDetail: false,
- ratingDetail: null,
- ratingDetailLoading: false,
- ratingDetailError: ''
+ ratingDetail: null
},
onLoad(options) {
@@ -36,48 +36,70 @@
// 鍔犺浇椤圭洰璇︽儏
async loadProjectDetail() {
try {
- this.setData({
- loading: true,
- error: ''
+ this.setData({
+ loading: true,
+ error: ''
})
+ // 璋冪敤API鑾峰彇椤圭洰璇︽儏
const projectDetail = await this.getProjectDetailFromAPI(this.data.projectId)
+
+ if (projectDetail) {
+ // 澶勭悊鏂囦欢澶у皬鏄剧ず
+ if (projectDetail.submissionFiles) {
+ projectDetail.submissionFiles.forEach(file => {
+ file.fileSizeText = this.formatFileSize(file.fileSize)
+ })
+ }
- if (!projectDetail) {
+ // 鑾峰彇璇勫垎缁熻
+ const ratingStats = await this.getRatingStatsFromAPI(this.data.projectId)
+
+ // 澶勭悊璇勫垎鏃堕棿鏄剧ず
+ if (ratingStats && ratingStats.judgeRatings) {
+ ratingStats.judgeRatings.forEach(rating => {
+ if (rating.ratingTime) {
+ rating.ratingTimeText = this.formatDateTime(rating.ratingTime)
+ }
+ })
+ }
+
+ this.setData({
+ projectDetail,
+ ratingStats,
+ statusText: this.getStatusText(projectDetail.state),
+ genderText: this.getGenderText(projectDetail.playerInfo?.gender),
+ educationText: this.getEducationText(projectDetail.playerInfo?.education),
+ loading: false
+ })
+
+ // 鍔犺浇鏃堕棿杞存暟鎹�
+ this.loadProjectTimeline()
+ } else {
throw new Error('椤圭洰璇︽儏鑾峰彇澶辫触')
}
-
- if (projectDetail.submissionFiles) {
- projectDetail.submissionFiles.forEach(file => {
- file.fileSizeText = this.formatFileSize(file.fileSize)
- })
- }
-
- this.setData({
- projectDetail,
- statusText: this.getStatusText(projectDetail.state),
- genderText: this.getGenderText(projectDetail.playerInfo?.gender),
- educationText: this.getEducationText(projectDetail.playerInfo?.education)
- })
-
- await this.loadProjectTimeline(this.data.projectId)
} catch (error) {
console.error('鍔犺浇椤圭洰璇︽儏澶辫触:', error)
this.setData({
- error: error.message || '鍔犺浇澶辫触锛岃閲嶈瘯'
+ error: error.message || '鍔犺浇澶辫触锛岃閲嶈瘯',
+ loading: false
})
- } finally {
- this.setData({ loading: false })
}
},
// 浠嶢PI鑾峰彇椤圭洰璇︽儏
async getProjectDetailFromAPI(projectId) {
- // 鏋勫缓GraphQL鏌ヨ
+ // 鏋勫缓GraphQL鏌ヨ - 涓庡悗绔痵chema鍖归厤
const query = `
query GetProjectDetail($id: ID!) {
activityPlayerDetail(id: $id) {
id
+ activityName
+ projectName
+ description
+ feedback
+ state
+ stageId
playerInfo {
id
name
@@ -90,17 +112,19 @@
avatarUrl
avatar {
id
- fullUrl
- fullThumbUrl
name
- fileSize
- fileExt
+ path
}
userInfo {
userId
name
phone
avatarUrl
+ avatar {
+ id
+ name
+ path
+ }
}
}
regionInfo {
@@ -108,31 +132,27 @@
name
fullPath
}
- activityName
- projectName
- description
- feedback
- state
- stageId
submissionFiles {
id
+ name
+ path
+ url
fullUrl
fullThumbUrl
- name
- fileSize
fileExt
- mediaType
+ fileSize
+ thumbUrl
}
ratingForm {
schemeId
schemeName
+ totalMaxScore
items {
id
name
maxScore
- orderNo
+ weight
}
- totalMaxScore
}
}
}
@@ -146,23 +166,108 @@
}
},
- async loadProjectTimeline(activityPlayerId) {
- if (!activityPlayerId) {
- return
- }
-
- const idNumber = Number(activityPlayerId)
- const variables = {
- activityPlayerId: Number.isNaN(idNumber) ? activityPlayerId : idNumber
- }
-
- this.setData({
- timelineLoading: true,
- timelineError: ''
- })
-
+ // 鑾峰彇璇勫垎缁熻
+ async getRatingStatsFromAPI(projectId) {
const query = `
- query ProjectStageTimeline($activityPlayerId: ID!) {
+ query GetRatingStats($activityPlayerId: ID!) {
+ judgeRatingsForPlayer(activityPlayerId: $activityPlayerId) {
+ judgeId
+ judgeName
+ hasRated
+ totalScore
+ ratingTime
+ }
+ averageScoreForPlayer(activityPlayerId: $activityPlayerId)
+ }
+ `
+
+ try {
+ const result = await app.graphqlRequest(query, { activityPlayerId: projectId })
+ const ratings = result.judgeRatingsForPlayer || []
+ const averageScore = result.averageScoreForPlayer || 0
+
+ // 鍙绠楀凡璇勫垎鐨勮瘎濮�
+ const ratedJudges = ratings.filter(rating => rating.hasRated)
+
+ return {
+ averageScore: averageScore,
+ totalRatings: ratedJudges.length,
+ ratings: ratings
+ }
+ } catch (error) {
+ throw error
+ }
+ },
+
+ // 鑾峰彇璇勫璇勫垎璇︽儏
+ async getJudgeRatingDetail(activityPlayerId, judgeId) {
+ const query = `
+ query GetJudgeRatingDetail($activityPlayerId: ID!, $judgeId: ID!) {
+ judgeRatingDetail(activityPlayerId: $activityPlayerId, judgeId: $judgeId) {
+ remark
+ }
+ }
+ `
+
+ try {
+ const result = await app.graphqlRequest(query, { activityPlayerId, judgeId })
+ return result.judgeRatingDetail
+ } catch (error) {
+ throw error
+ }
+ },
+
+ // 鍔犺浇椤圭洰鏃堕棿杞�
+ async loadProjectTimeline() {
+ try {
+ this.setData({
+ timelineLoading: true,
+ timelineError: ''
+ })
+
+ const timeline = await this.getProjectTimelineFromAPI(this.data.projectId)
+
+ if (timeline && timeline.stages) {
+ // 澶勭悊鏃堕棿杞存暟鎹�
+ const processedTimeline = timeline.stages.map(stage => {
+ return {
+ stageId: stage.stageId,
+ stageName: stage.stageName,
+ matchTime: stage.matchTime,
+ matchTimeText: stage.matchTime ? this.formatDateTime(stage.matchTime) : '鏃堕棿寰呭畾',
+ participated: stage.participated,
+ activityPlayerId: stage.activityPlayerId,
+ averageScore: stage.averageScore,
+ ratingCount: stage.ratingCount,
+ hasRating: stage.hasRating,
+ scoreText: stage.averageScore ? `${stage.averageScore.toFixed(1)}鍒哷 : '',
+ isClickable: stage.hasRating && stage.activityPlayerId
+ }
+ })
+
+ this.setData({
+ timeline: processedTimeline,
+ timelineLoading: false
+ })
+ } else {
+ this.setData({
+ timeline: [],
+ timelineLoading: false
+ })
+ }
+ } catch (error) {
+ console.error('鍔犺浇鏃堕棿杞村け璐�:', error)
+ this.setData({
+ timelineError: error.message || '鏃堕棿杞村姞杞藉け璐�',
+ timelineLoading: false
+ })
+ }
+ },
+
+ // 浠嶢PI鑾峰彇椤圭洰鏃堕棿杞�
+ async getProjectTimelineFromAPI(activityPlayerId) {
+ const query = `
+ query GetProjectTimeline($activityPlayerId: ID!) {
projectStageTimeline(activityPlayerId: $activityPlayerId) {
activityId
activityName
@@ -183,136 +288,36 @@
`
try {
- const result = await app.graphqlRequest(query, variables)
- const projectStageTimeline = result && result.projectStageTimeline ? result.projectStageTimeline : null
- const stages = projectStageTimeline && projectStageTimeline.stages ? projectStageTimeline.stages : []
-
- const timeline = stages.map(stage => {
- const hasScore = stage.hasRating && stage.averageScore !== null && stage.averageScore !== undefined
- let scoreText = '鏈弬璧�'
- if (stage.participated) {
- scoreText = hasScore ? `骞冲潎鍒嗭細${Number(stage.averageScore).toFixed(2)}` : '鏈瘎鍒�'
- }
-
- return {
- ...stage,
- matchTimeText: stage.matchTime ? this.formatDateTime(stage.matchTime) : '',
- scoreText,
- displayAverageScore: hasScore ? Number(stage.averageScore).toFixed(2) : null,
- isClickable: stage.participated && hasScore && !!stage.activityPlayerId
- }
- })
-
- this.setData({
- timeline,
- timelineLoading: false
- })
+ const result = await app.graphqlRequest(query, { activityPlayerId })
+ return result.projectStageTimeline
} catch (error) {
- console.error('鍔犺浇闃舵鏃堕棿杞村け璐�:', error)
- this.setData({
- timelineError: error.message || '鏃堕棿杞村姞杞藉け璐�',
- timelineLoading: false
- })
+ throw error
}
},
- async fetchStageRatingDetail(activityPlayerId) {
- const idNumber = Number(activityPlayerId)
- const variables = {
- activityPlayerId: Number.isNaN(idNumber) ? activityPlayerId : idNumber
- }
-
- const query = `
- query StageJudgeRatings($activityPlayerId: ID!) {
- stageJudgeRatings(activityPlayerId: $activityPlayerId) {
- activityPlayerId
- stageId
- stageName
- matchTime
- ratingCount
- averageScore
- judgeRatings {
- judgeId
- judgeName
- totalScore
- feedback
- ratingTime
- }
- }
- }
- `
-
- const result = await app.graphqlRequest(query, variables)
- const detail = result && result.stageJudgeRatings ? result.stageJudgeRatings : null
-
- const sourceJudgeRatings = detail && detail.judgeRatings ? detail.judgeRatings : []
- const judgeRatings = sourceJudgeRatings.map(item => ({
- ...item,
- totalScoreText: item.totalScore !== null && item.totalScore !== undefined ? `${Number(item.totalScore).toFixed(2)}鍒哷 : '鏈瘎鍒�',
- ratingTimeText: item.ratingTime ? this.formatDateTime(item.ratingTime) : ''
- }))
-
- const averageScoreValue = detail && detail.averageScore !== undefined && detail.averageScore !== null
- ? detail.averageScore
- : null
-
- return {
- activityPlayerId: detail && detail.activityPlayerId ? detail.activityPlayerId : variables.activityPlayerId,
- stageId: detail && detail.stageId ? detail.stageId : null,
- stageName: detail && detail.stageName ? detail.stageName : '闃舵淇℃伅',
- matchTime: detail && detail.matchTime ? detail.matchTime : null,
- matchTimeText: detail && detail.matchTime ? this.formatDateTime(detail.matchTime) : '',
- ratingCount: detail && detail.ratingCount ? detail.ratingCount : 0,
- averageScore: averageScoreValue,
- averageScoreText: averageScoreValue !== null ? Number(averageScoreValue).toFixed(2) : '鏆傛棤璇勫垎',
- judgeRatings
- }
- },
-
- async openStageDetail(e) {
- const { playerId } = e.currentTarget.dataset
- const clickable = e.currentTarget.dataset.clickable === true || e.currentTarget.dataset.clickable === 'true'
- const participated = e.currentTarget.dataset.participated === true || e.currentTarget.dataset.participated === 'true'
-
- if (!playerId || !participated) {
- return
- }
-
- if (!clickable) {
+ // 鎵撳紑闃舵璇︽儏
+ openStageDetail(e) {
+ const { playerId, clickable, participated } = e.currentTarget.dataset
+
+ if (!clickable || !participated || !playerId) {
wx.showToast({
- title: '鏆傛棤璇勫垎',
+ title: '鏆傛棤璇勫垎璇︽儏',
icon: 'none'
})
return
}
- this.setData({
- showRatingDetail: true,
- ratingDetailLoading: true,
- ratingDetailError: '',
- ratingDetail: { judgeRatings: [] }
+ // 璺宠浆鍒拌瘎鍒嗚鎯呴〉闈㈡垨鏄剧ず璇︽儏寮圭獥
+ wx.navigateTo({
+ url: `/pages/review/stage-detail?playerId=${playerId}`
})
-
- try {
- const detail = await this.fetchStageRatingDetail(playerId)
- this.setData({
- ratingDetail: detail,
- ratingDetailLoading: false
- })
- } catch (error) {
- console.error('鍔犺浇闃舵璇勫垎璇︽儏澶辫触:', error)
- this.setData({
- ratingDetailError: error.message || '鍔犺浇澶辫触',
- ratingDetailLoading: false
- })
- }
},
+ // 鍏抽棴闃舵璇︽儏
closeStageDetail() {
this.setData({
showRatingDetail: false,
- ratingDetail: null,
- ratingDetailError: ''
+ ratingDetail: null
})
},
@@ -572,6 +577,8 @@
// 鑾峰彇鎬у埆鏂囨湰
getGenderText(gender) {
const genderMap = {
+ 1: '鐢�',
+ 2: '濂�',
'MALE': '鐢�',
'FEMALE': '濂�'
}
@@ -585,9 +592,14 @@
'COLLEGE': '澶т笓',
'BACHELOR': '鏈',
'MASTER': '纭曞+',
- 'DOCTOR': '鍗氬+'
+ 'DOCTOR': '鍗氬+',
+ '楂樹腑鍙婁互涓�': '楂樹腑鍙婁互涓�',
+ '澶т笓': '澶т笓',
+ '鏈': '鏈',
+ '纭曞+': '纭曞+',
+ '鍗氬+': '鍗氬+'
}
- return educationMap[education] || ''
+ return educationMap[education] || education || ''
},
// 鍒嗕韩鍔熻兘
--
Gitblit v1.8.0